getfem-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Getfem-commits] r5324 - in /trunk/getfem: interface/tests/matlab/check_


From: Yves . Renard
Subject: [Getfem-commits] r5324 - in /trunk/getfem: interface/tests/matlab/check_mesh_fem.m src/getfem/bgeot_kdtree.h src/getfem_mesh_fem.cc
Date: Sat, 07 May 2016 12:33:15 -0000

Author: renard
Date: Sat May  7 14:33:14 2016
New Revision: 5324

URL: http://svn.gna.org/viewcvs/getfem?rev=5324&view=rev
Log:
optimization of enumerate_dof()

Modified:
    trunk/getfem/interface/tests/matlab/check_mesh_fem.m
    trunk/getfem/src/getfem/bgeot_kdtree.h
    trunk/getfem/src/getfem_mesh_fem.cc

Modified: trunk/getfem/interface/tests/matlab/check_mesh_fem.m
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/interface/tests/matlab/check_mesh_fem.m?rev=5324&r1=5323&r2=5324&view=diff
==============================================================================
--- trunk/getfem/interface/tests/matlab/check_mesh_fem.m        (original)
+++ trunk/getfem/interface/tests/matlab/check_mesh_fem.m        Sat May  7 
14:33:14 2016
@@ -165,13 +165,13 @@
   gfassert('length(s2)>500');
   m2=gf_mesh('from string',s);
 
-  gf_mesh_fem_get(mf,'nbdof');
+  gf_mesh_fem_get(mf,'nbdof') % should be 99 or 100 (element 0 and 1 are not 
really neigbhor but can be viewed as such)
   d=gf_mesh_fem_get(mf,'basic dof from cv',[1 5])
-  gfassert(['d==[1 2 3 4 5 6 37 40 42 43 44 45 46 47 48 49 50 51 52 53 54 55 
56 57]']);
+  gfassert(['d==[1 2 3 4 5 6 38 41 43 44 45 46 47 48 49 50 51 52 53 54 55 56 
57 58]']);
   d=gf_mesh_fem_get(mf,'basic dof from cv',[1 5;1 2])
-  gfassert('d==[3 5 6 37 40 42 45 47 50 52 55 57]');
+  gfassert('d==[3 5 6 38 41 43 46 48 51 53 56 58]');
   d=gf_mesh_fem_get(mf,'basic dof from cvid',5)
-  gfassert('d==[37 43 44 45 46 47 40 48 49 50 51 52 42 53 54 55 56 57]');
+  gfassert('d==[38 44 45 46 47 48 41 49 50 51 52 53 43 54 55 56 57 58]');
   
   s2=gf_mesh_get(mf,'char');
   gfassert('length(s2)>500');

Modified: trunk/getfem/src/getfem/bgeot_kdtree.h
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/bgeot_kdtree.h?rev=5324&r1=5323&r2=5324&view=diff
==============================================================================
--- trunk/getfem/src/getfem/bgeot_kdtree.h      (original)
+++ trunk/getfem/src/getfem/bgeot_kdtree.h      Sat May  7 14:33:14 2016
@@ -107,7 +107,7 @@
   public:
     kdtree() : N(0) {}
     /// reset the tree, remove all points
-    void clear() { clear_tree(); pts.clear(); N = 0; }
+    void clear() { clear_tree(); pts = kdtree_tab_type(); N = 0; }
     void reserve(size_type n) { pts.reserve(n); }
     /// insert a new point
     size_type add_point(const base_node& n) { 

Modified: trunk/getfem/src/getfem_mesh_fem.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_mesh_fem.cc?rev=5324&r1=5323&r2=5324&view=diff
==============================================================================
--- trunk/getfem/src/getfem_mesh_fem.cc (original)
+++ trunk/getfem/src/getfem_mesh_fem.cc Sat May  7 14:33:14 2016
@@ -305,11 +305,9 @@
 
     // Information stored per element
     size_type nb_max_cv = linked_mesh().convex_index().last_true()+1;
-    // std::vector<bgeot::node_tab> dof_nodes2(nb_max_cv, 
bgeot::node_tab(1.e5));
     std::vector<bgeot::kdtree> dof_nodes(nb_max_cv);
     std::vector<scalar_type> elt_car_sizes(nb_max_cv);
-    std::vector< std::map<fem_dof, size_type, dof_comp_> >
-      dof_sorts(nb_max_cv);
+    std::vector<std::map<fem_dof, size_type, dof_comp_>> dof_sorts(nb_max_cv);
 
     // Information for global dof
     dal::bit_vector encountered_global_dof, processed_elt;
@@ -327,18 +325,25 @@
     bgeot::pgeometric_trans pgt_old = 0;
     bgeot::pgeotrans_precomp pgp = 0;
 
+    for (size_type cv : cmk) {
+      if (fe_convex.is_in(cv)) {
+       gmm::copy(linked_mesh().points_of_convex(cv)[0], bmin);
+       gmm::copy(bmin, bmax);
+       for (size_type i = 0; i <  linked_mesh().nb_points_of_convex(cv); ++i) {
+         const base_node &pt = linked_mesh().points_of_convex(cv)[i];
+         for (size_type d = 1; d < bmin.size(); ++d) {
+           bmin[d] = std::min(bmin[d], pt[d]);
+           bmax[d] = std::max(bmax[d], pt[d]);
+         }
+       }       
+       elt_car_sizes[cv] = gmm::vect_dist2(bmin, bmax);
+      }
+    }
+
+    dal::bit_vector cv_done;
+
     for (size_type cv : cmk) { // Loop on elements
       if (!fe_convex.is_in(cv)) continue;
-      gmm::copy(linked_mesh().points_of_convex(cv)[0], bmin);
-      gmm::copy(bmin, bmax);
-      for (size_type i = 0; i <  linked_mesh().nb_points_of_convex(cv); ++i) {
-               const base_node &pt = linked_mesh().points_of_convex(cv)[i];
-               for (size_type d = 1; d < bmin.size(); ++d) {
-                 bmin[d] = std::min(bmin[d], pt[d]);
-                 bmax[d] = std::max(bmax[d], pt[d]);
-               }
-      }        
-      elt_car_sizes[cv] = gmm::vect_dist2(bmin, bmax);
       pfem pf = fem_of_element(cv);
       bgeot::pgeometric_trans pgt = linked_mesh().trans_of_convex(cv);
       bgeot::pstored_point_tab pspt = pf->node_tab(cv);
@@ -367,31 +372,40 @@
         } else {                            // For a standard linkable dof
           pgp->transform(linked_mesh().points_of_convex(cv), i, P);
           size_type idof = nbdof;
-          linked_mesh().neighbours_of_convex(cv, pf->faces_of_dof(cv, i), s);
-          for (size_type ncv : s) { // For each neighbour
-                                    // control if the dof already exists.
-           fd.ind_node = size_type(-1);
-            // size_type ii = fd.ind_node = dof_nodes2[ncv].search_node(P);
-           if (dof_nodes[ncv].nb_points() > 0) {
-              scalar_type dist = dof_nodes[ncv].nearest_neighbor(ipt, P);
-              if (gmm::abs(dist) <= 1e-6*elt_car_sizes[ncv]) fd.ind_node=ipt.i;
+
+         if (dof_nodes[cv].nb_points() > 0) {
+           scalar_type dist = dof_nodes[cv].nearest_neighbor(ipt, P);
+           if (gmm::abs(dist) <= 1e-6*elt_car_sizes[cv]) {
+             fd.ind_node=ipt.i;
+             auto it = dof_sorts[cv].find(fd);
+             if (it != dof_sorts[cv].end()) idof = it->second;
            }
-            if (fd.ind_node != size_type(-1)) {
-              auto it = dof_sorts[ncv].find(fd);
-              if (it != dof_sorts[ncv].end()) { idof = it->second; break; }
-            }
-          }
-          if (idof == nbdof) nbdof += Qdim / pf->target_dim();
+         }
+         
+          if (idof == nbdof) {
+           nbdof += Qdim / pf->target_dim();
+
+           linked_mesh().neighbours_of_convex(cv, pf->faces_of_dof(cv, i), s);
+           for (size_type ncv : s) { // For each unscanned neighbour
+             if (!cv_done[ncv] && fe_convex.is_in(ncv)) { // add the dof
+
+               fd.ind_node = size_type(-1);
+               if (dof_nodes[ncv].nb_points() > 0) {
+                 scalar_type dist = dof_nodes[ncv].nearest_neighbor(ipt, P);
+                 if (gmm::abs(dist) <= 1e-6*elt_car_sizes[ncv])
+                   fd.ind_node=ipt.i;
+               }
+               if (fd.ind_node == size_type(-1))
+                 fd.ind_node = dof_nodes[ncv].add_point(P);
+               dof_sorts[ncv][fd] = idof;
+             }
+           }
+         }
           itab[i] = idof;
-          // fd.ind_node = dof_nodes2[cv].add_node(P);
-         scalar_type dist = dof_nodes[cv].nearest_neighbor(ipt, P);
-         if (gmm::abs(dist) <= 1e-6*elt_car_sizes[cv])
-           fd.ind_node = ipt.i;
-         else
-           fd.ind_node = dof_nodes[cv].add_point(P);
-          dof_sorts[cv][fd] = idof;
         }
       }
+      cv_done.add(cv);
+      dof_sorts[cv].clear(); dof_nodes[cv].clear();
       dof_structure.add_convex_noverif(pf->structure(cv), itab.begin(), cv);
     }
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]