getfem-commits
[Top][All Lists]
Advanced

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

[Getfem-commits] (no subject)


From: Tetsuo Koyama
Subject: [Getfem-commits] (no subject)
Date: Wed, 6 May 2020 19:59:33 -0400 (EDT)

branch: devel-tetsuo-xml
commit 82022783d16eabdccbb00b8f23d1292513f2bf5e
Author: Tetsuo Koyama <address@hidden>
AuthorDate: Wed Apr 29 22:08:04 2020 +0000

    :recycle: select_vtk_mapping_type
---
 src/getfem_export.cc | 116 ++++++++++++++++++++++++++-------------------------
 1 file changed, 60 insertions(+), 56 deletions(-)

diff --git a/src/getfem_export.cc b/src/getfem_export.cc
index fe9cd6c..8915a8e 100644
--- a/src/getfem_export.cc
+++ b/src/getfem_export.cc
@@ -124,6 +124,63 @@ namespace getfem
     return vtktypes[t];
   }
 
+
+  /* try to check if a quad or hexahedric cell is "rectangular" and oriented
+     along the axes */
+  template<typename C> static bool check_voxel(const C& c) {
+    scalar_type h[3];
+    unsigned N = c[0].size();
+    if (c.size() != (1U << N)) return false;
+    const base_node P0 = c[0];
+    h[0] = c[1][0] - P0[0];
+    h[1] = c[2][0] - P0[0];
+    if (c.size() != 4) h[2] = c[4][0] - P0[0];
+    for (unsigned i=1; i < c.size(); ++i) {
+      const base_node d = c[i] - P0;
+      for (unsigned j=0; j < N; ++j)
+        if (gmm::abs(d[j]) > 1e-7*h[j] && gmm::abs(d[j] - h[j]) > 1e-7*h[j])
+          return false;
+    }
+    return true;
+  }
+
+
+  vtk_mapping_type select_vtk_mapping_type(mesh m, size_type cv, size_type 
dim, size_type nbd) {
+    vtk_mapping_type t = NO_VTK_MAPPING;
+    switch (dim) {
+    case 0: t = N1_TO_VTK_VERTEX; break;
+    case 1:
+      if (nbd == 2) t = N2_TO_VTK_LINE;
+      else if (nbd == 3) t = N3_TO_VTK_QUADRATIC_EDGE;
+      break;
+    case 2:
+      if (nbd == 3) t = N3_TO_VTK_TRIANGLE;
+      else if (nbd == 4)
+        t = check_voxel(m.points_of_convex(cv)) ? N4_TO_VTK_PIXEL
+                                                : N4_TO_VTK_QUAD;
+      else if (nbd == 6) t = N6_TO_VTK_QUADRATIC_TRIANGLE;
+      else if (nbd == 8) t = N8_TO_VTK_QUADRATIC_QUAD;
+      else if (nbd == 9) t = N9_TO_VTK_BIQUADRATIC_QUAD;
+      break;
+    case 3:
+      if (nbd == 4) t = N4_TO_VTK_TETRA;
+      else if (nbd == 10) t = N10_TO_VTK_QUADRATIC_TETRA;
+      else if (nbd == 8)
+        t = check_voxel(m.points_of_convex(cv)) ? N8_TO_VTK_VOXEL
+                                                : N8_TO_VTK_HEXAHEDRON;
+      else if (nbd == 20) t = N20_TO_VTK_QUADRATIC_HEXAHEDRON;
+      else if (nbd == 27) t = N27_TO_VTK_TRIQUADRATIC_HEXAHEDRON;
+      else if (nbd == 5) t = N5_TO_VTK_PYRAMID;
+      else if (nbd == 13) t = N13_TO_VTK_QUADRATIC_PYRAMID;
+      else if (nbd == 14) t = N14_TO_VTK_QUADRATIC_PYRAMID;
+      else if (nbd == 6) t = N6_TO_VTK_WEDGE;
+      else if (nbd == 15) t = N15_TO_VTK_QUADRATIC_WEDGE;
+      else if (nbd == 18) t = N18_TO_VTK_BIQUADRATIC_QUADRATIC_WEDGE;
+      break;
+    }
+    return t;
+  }
+
   vtk_export::vtk_export(std::ostream &os_, bool ascii_)
     : os(os_), ascii(ascii_) { init(); }
 
@@ -173,26 +230,6 @@ namespace getfem
   }
 
 
-  /* try to check if a quad or hexahedric cell is "rectangular" and oriented
-     along the axes */
-  template<typename C> static bool check_voxel(const C& c) {
-    scalar_type h[3];
-    unsigned N = c[0].size();
-    if (c.size() != (1U << N)) return false;
-    const base_node P0 = c[0];
-    h[0] = c[1][0] - P0[0];
-    h[1] = c[2][0] - P0[0];
-    if (c.size() != 4) h[2] = c[4][0] - P0[0];
-    for (unsigned i=1; i < c.size(); ++i) {
-      const base_node d = c[i] - P0;
-      for (unsigned j=0; j < N; ++j)
-        if (gmm::abs(d[j]) > 1e-7*h[j] && gmm::abs(d[j] - h[j]) > 1e-7*h[j])
-          return false;
-    }
-    return true;
-  }
-
-
   void vtk_export::exporting(const stored_mesh_slice& sl) {
     psl = &sl; dim_ = dim_type(sl.dim());
     GMM_ASSERT1(psl->dim() <= 3, "attempt to export a " << int(dim_)
@@ -517,59 +554,26 @@ namespace getfem
                                 classical_fem(pgt, degree, true));
       }
     }
-    /* find out which dof will be exported to VTK */
+    /* find out which dof will be exported to VTU */
 
     const mesh &m = pmf->linked_mesh();
     pmf_mapping_type.resize(pmf->convex_index().last_true() + 1, unsigned(-1));
     pmf_dof_used.sup(0, pmf->nb_basic_dof());
     for (dal::bv_visitor cv(pmf->convex_index()); !cv.finished(); ++cv) {
-      vtk_mapping_type t = NO_VTK_MAPPING;
+      size_type dim = pmf->fem_of_element(cv)->dim();
       size_type nbd = pmf->fem_of_element(cv)->nb_dof(cv);
-      switch (pmf->fem_of_element(cv)->dim()) {
-      case 0: t = N1_TO_VTK_VERTEX; break;
-      case 1:
-        if (nbd == 2) t = N2_TO_VTK_LINE;
-        else if (nbd == 3) t = N3_TO_VTK_QUADRATIC_EDGE;
-        break;
-      case 2:
-        if (nbd == 3) t = N3_TO_VTK_TRIANGLE;
-        else if (nbd == 4)
-          t = check_voxel(m.points_of_convex(cv)) ? N4_TO_VTK_PIXEL
-                                                  : N4_TO_VTK_QUAD;
-        else if (nbd == 6) t = N6_TO_VTK_QUADRATIC_TRIANGLE;
-        else if (nbd == 8) t = N8_TO_VTK_QUADRATIC_QUAD;
-        else if (nbd == 9) t = N9_TO_VTK_BIQUADRATIC_QUAD;
-        break;
-      case 3:
-        if (nbd == 4) t = N4_TO_VTK_TETRA;
-        else if (nbd == 10) t = N10_TO_VTK_QUADRATIC_TETRA;
-        else if (nbd == 8)
-          t = check_voxel(m.points_of_convex(cv)) ? N8_TO_VTK_VOXEL
-                                                  : N8_TO_VTK_HEXAHEDRON;
-        else if (nbd == 20) t = N20_TO_VTK_QUADRATIC_HEXAHEDRON;
-        else if (nbd == 27) t = N27_TO_VTK_TRIQUADRATIC_HEXAHEDRON;
-        else if (nbd == 5) t = N5_TO_VTK_PYRAMID;
-        else if (nbd == 13) t = N13_TO_VTK_QUADRATIC_PYRAMID;
-        else if (nbd == 14) t = N14_TO_VTK_QUADRATIC_PYRAMID;
-        else if (nbd == 6) t = N6_TO_VTK_WEDGE;
-        else if (nbd == 15) t = N15_TO_VTK_QUADRATIC_WEDGE;
-        else if (nbd == 18) t = N18_TO_VTK_BIQUADRATIC_QUADRATIC_WEDGE;
-        break;
-      }
+      vtk_mapping_type t = select_vtk_mapping_type(m, cv, dim, nbd);
       GMM_ASSERT1(t != -1, "semi internal error. Could not map " <<
                   name_of_fem(pmf->fem_of_element(cv))
                 << " to a VTK cell type");
       pmf_mapping_type[cv] = t;
 
       const std::vector<unsigned> &dmap = select_vtk_dof_mapping(t);
-      //cout << "nbd = " << nbd << ", t = " << t << ", dmap = "<<dmap << "\n";
       GMM_ASSERT1(dmap.size() <= pmf->nb_basic_dof_of_element(cv),
                 "inconsistency in vtk_dof_mapping");
       for (unsigned i=0; i < dmap.size(); ++i)
         pmf_dof_used.add(pmf->ind_basic_dof_of_element(cv)[dmap[i]]);
     }
-    // cout << "mf.nb_dof = " << mf.nb_dof() << ", pmf->nb_dof="
-    //      << pmf->nb_dof() << ", dof_used = " << pmf_dof_used.card() << "\n";
   }
 
   void vtu_export::check_header() {



reply via email to

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