getfem-commits
[Top][All Lists]
Advanced

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

[Getfem-commits] r5112 - in /trunk/getfem/src: getfem/getfem_mesh.h getf


From: Yves . Renard
Subject: [Getfem-commits] r5112 - in /trunk/getfem/src: getfem/getfem_mesh.h getfem_mesh.cc
Date: Thu, 29 Oct 2015 16:25:23 -0000

Author: renard
Date: Thu Oct 29 17:25:22 2015
New Revision: 5112

URL: http://svn.gna.org/viewcvs/getfem?rev=5112&view=rev
Log:
adding a function to select the inner faces of elements in a mesh

Modified:
    trunk/getfem/src/getfem/getfem_mesh.h
    trunk/getfem/src/getfem_mesh.cc

Modified: trunk/getfem/src/getfem/getfem_mesh.h
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem/getfem_mesh.h?rev=5112&r1=5111&r2=5112&view=diff
==============================================================================
--- trunk/getfem/src/getfem/getfem_mesh.h       (original)
+++ trunk/getfem/src/getfem/getfem_mesh.h       Thu Oct 29 17:25:22 2015
@@ -674,6 +674,13 @@
   inline mesh_region APIDECL outer_faces_of_mesh(const mesh &m)
   { mesh_region fl; outer_faces_of_mesh(m,m.convex_index(),fl); return fl; }
 
+  /** Select all the faces sharing at least two element of the given mesh
+      region. Each face is represented only once and is arbitrary chosen
+      between the two neighbour elements.
+   */
+  mesh_region APIDECL inner_faces_of_mesh(const mesh &m,
+                                         const mesh_region &mr);
+  
   /** Select in the region mr the faces of the mesh m with their unit
       outward vector having a maximal angle "angle" with the vector V.
    */

Modified: trunk/getfem/src/getfem_mesh.cc
URL: 
http://svn.gna.org/viewcvs/getfem/trunk/getfem/src/getfem_mesh.cc?rev=5112&r1=5111&r2=5112&view=diff
==============================================================================
--- trunk/getfem/src/getfem_mesh.cc     (original)
+++ trunk/getfem/src/getfem_mesh.cc     Thu Oct 29 17:25:22 2015
@@ -772,6 +772,52 @@
     }
   }
 
+  /* Select all the faces sharing at least two element of the given mesh
+      region. Each face is represented only once and is arbitrary chosen
+      between the two neighbour elements. Try to minimize the number of
+      elements.
+  */
+  mesh_region inner_faces_of_mesh(const mesh &m,
+                                 const mesh_region &mr) {
+    mr.error_if_not_convexes();
+    mesh_region mrr;
+    dal::bit_vector visited;
+    
+    for (mr_visitor i(mr); !i.finished(); ++i) {
+      size_type cv1 = i.cv();
+      short_type nbf = m.structure_of_convex(i.cv())->nb_faces();
+      bool neighbour_visited = false;
+      for (short_type f = 0; f < nbf; f++) {
+       size_type cv2 = m.neighbour_of_convex(cv1, f);
+       if (cv2 == size_type(-1) && visited.is_in(cv2))
+         { neighbour_visited = true; break; }
+      }
+      if (!neighbour_visited) {
+       for (short_type f = 0; f < nbf; f++) {
+         size_type cv2 = m.neighbour_of_convex(cv1, f);
+         if (cv2 == size_type(-1) && mr.is_in(cv2) && !(visited.is_in(cv2)))
+           mrr.add(cv1,f);
+       }
+       visited.add(cv1);
+      }
+    }
+
+    for (mr_visitor i(mr); !i.finished(); ++i) {
+      size_type cv1 = i.cv();
+      short_type nbf = m.structure_of_convex(i.cv())->nb_faces();
+      if (!(visited.is_in(cv1))) {
+       for (short_type f = 0; f < nbf; f++) {
+         size_type cv2 = m.neighbour_of_convex(i.cv(), f);
+         if (cv2 == size_type(-1) && mr.is_in(cv2) && !(visited.is_in(cv2)))
+           mrr.add(cv1,f);
+       }
+       visited.add(cv1);
+      }
+    }
+    return mrr;
+  }
+
+
   mesh_region select_faces_of_normal(const mesh &m, const mesh_region &mr,
                                      const base_small_vector &V,
                                      scalar_type angle) {




reply via email to

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