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:35 -0400 (EDT)

branch: devel-tetsuo-xml
commit fb1c6b3e6909571c8725ffb78f0bbbff4a16e2f2
Author: Tetsuo Koyama <address@hidden>
AuthorDate: Tue May 5 23:19:29 2020 +0000

    :heavy_plus_sign: VTU export
---
 src/getfem/getfem_export.h | 13 ++++---------
 src/getfem_export.cc       | 20 ++++++++++++++------
 2 files changed, 18 insertions(+), 15 deletions(-)

diff --git a/src/getfem/getfem_export.h b/src/getfem/getfem_export.h
index fd8c967..cbe97ae 100644
--- a/src/getfem/getfem_export.h
+++ b/src/getfem/getfem_export.h
@@ -324,6 +324,8 @@ namespace getfem {
   public:
     vtu_export(const std::string& fname, bool ascii_= false);
     vtu_export(std::ostream &os_, bool ascii_ = false);
+    ~vtu_export(); /* the file is not complete until the destructor
+                      has been executed */
     void exporting(const mesh& m);
     void exporting(const mesh_fem& mf);
     void write_mesh(bool only_mesh = true);
@@ -419,17 +421,14 @@ namespace getfem {
     GMM_ASSERT1(gmm::vect_size(U) == nb_val*Q,
                 "inconsistency in the size of the dataset: "
                 << gmm::vect_size(U) << " != " << nb_val << "*" << Q);
-    os << "<Piece NumberOfPoints=\"" << pmf_dof_used.card() << "\" 
NumberOfCells=\"" << pmf->convex_index().card() << "\">\n";
     if (Q == 1) {
-      os << "<PointData Scalars=\"" << remove_spaces(name) << "\">\n";
-      os << "<DataArray Name=\"" << remove_spaces(name) << "\" 
type=\"Float32\" format=\"ascii\">\n";
+      os << "<DataArray type=\"Float32\" Name=\"" << remove_spaces(name) << 
"\" format=\"ascii\">\n";
       for (size_type i=0; i < nb_val; ++i) {
         write_val(float(U[i]));
       }
     } else if (Q <= 3) {
-      os << "<PointData Vectors=\"" << remove_spaces(name) << "\">\n";
       os << "<DataArray type=\"Float32\" Name=\"" << remove_spaces(name);
-      os << "\" NumberOfComponents=\"" << Q << "\" format=\"ascii\">";
+      os << "\" NumberOfComponents=\"3\" format=\"ascii\">\n";
       for (size_type i=0; i < nb_val; ++i) {
         write_vec(U.begin() + i*Q, Q);
       }
@@ -437,7 +436,6 @@ namespace getfem {
       /* tensors : coef are supposed to be stored in FORTRAN order
          in the VTU file, they are written with C (row major) order
        */
-      os << "<PointData Tensors=\"" << remove_spaces(name) << "\">\n";
       os << "<DataArray type=\"Float32\" Name=\"" << remove_spaces(name);
       os << "\" NumberOfComponents=\"" << Q*Q << "\" format=\"ascii\">";
       for (size_type i=0; i < nb_val; ++i) {
@@ -446,9 +444,6 @@ namespace getfem {
     } else GMM_ASSERT1(false, "vtu does not accept vectors of dimension > 3");
     write_separ();
     os << "</DataArray>\n";
-    os << "</PointData>\n";
-    os << "</Piece>\n";
-    check_footer();
   }
 
   /** @brief A (quite large) class for exportation of data to IBM OpenDX.
diff --git a/src/getfem_export.cc b/src/getfem_export.cc
index 801d062..c92a1f1 100644
--- a/src/getfem_export.cc
+++ b/src/getfem_export.cc
@@ -464,6 +464,10 @@ namespace getfem
     init();
   }
 
+  vtu_export::~vtu_export(){
+    check_footer();
+  }
+
   void vtu_export::init() {
     strcpy(header, "Exported by getfem++");
     state = EMPTY;
@@ -472,8 +476,9 @@ namespace getfem
 
   void vtu_export::switch_to_point_data() {
     if (state != IN_POINT_DATA) {
+      os << "<PointData>\n";
       state = IN_POINT_DATA;
-    }
+    };
   }
 
   void vtu_export::switch_to_cell_data() {
@@ -558,12 +563,16 @@ namespace getfem
 
   void vtu_export::check_header() {
     if (state >= HEADER_WRITTEN) return;
+    os << "<?xml version=\"1.0\"?>\n";
     os << "<VTKFile type=\"UnstructuredGrid\" version=\"0.1\" 
byte_order=\"BigEndian\">\n";
+    os << "<!--" << header << "-->\n";
     state = HEADER_WRITTEN;
   }
 
   void vtu_export::check_footer() {
     if (state >= FOOTER_WRITTEN) return;
+    if (state == IN_POINT_DATA) os << "</PointData>\n";
+    os << "</Piece>\n";
     os << "</UnstructuredGrid>\n";
     os << "</VTKFile>\n";
     state = FOOTER_WRITTEN;
@@ -583,7 +592,7 @@ namespace getfem
     os << "<UnstructuredGrid>\n";
     os << "<Piece NumberOfPoints=\"" << pmf_dof_used.card() << "\" 
NumberOfCells=\"" << pmf->convex_index().card() << "\">\n";
     os << "<Points>\n";
-    os << "<DataArray type=\"Float32\" NumberOfComponents=\"3\" 
Format=\"ascii\">\n";
+    os << "<DataArray type=\"Float32\" Name=\"Points\" 
NumberOfComponents=\"3\" format=\"ascii\">\n";
     std::vector<int> dofmap(pmf->nb_dof());
     int cnt = 0;
     for (dal::bv_visitor d(pmf_dof_used); !d.finished(); ++d) {
@@ -598,7 +607,7 @@ namespace getfem
     os << "</DataArray>\n";
     os << "</Points>\n";
     os << "<Cells>\n";
-    os << "<DataArray type=\"Int32\" Name=\"connectivity\" 
Format=\"ascii\">\n";
+    os << "<DataArray type=\"Int64\" Name=\"connectivity\" 
format=\"ascii\">\n";
     for (dal::bv_visitor cv(pmf->convex_index()); !cv.finished(); ++cv) {
       const std::vector<unsigned> &dmap = 
select_vtk_dof_mapping(pmf_mapping_type[cv]);
       for (size_type i=0; i < dmap.size(); ++i)
@@ -606,7 +615,7 @@ namespace getfem
       write_separ();
     }
     os << "</DataArray>\n";
-    os << "<DataArray type=\"Int32\" Name=\"offsets\" Format=\"ascii\">\n";
+    os << "<DataArray type=\"Int64\" Name=\"offsets\" format=\"ascii\">\n";
     cnt = 0;
     for (dal::bv_visitor cv(pmf->convex_index()); !cv.finished(); ++cv) {
       const std::vector<unsigned> &dmap = 
select_vtk_dof_mapping(pmf_mapping_type[cv]);
@@ -615,14 +624,13 @@ namespace getfem
       write_separ();
     }
     os << "</DataArray>\n";
-    os << "<DataArray type=\"Int32\" Name=\"types\" Format=\"ascii\">\n";
+    os << "<DataArray type=\"Int64\" Name=\"types\" format=\"ascii\">\n";
     for (dal::bv_visitor cv(pmf->convex_index()); !cv.finished(); ++cv) {
       write_val(select_vtk_type(pmf_mapping_type[cv]));
       write_separ();
     }
     os << "</DataArray>\n";
     os << "</Cells>\n";
-    os << "</Piece>\n";
 
     state = STRUCTURE_WRITTEN;
   }



reply via email to

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