]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Fix GridIn::read_vtk().
authorWolfgang Bangerth <bangerth@colostate.edu>
Thu, 20 Oct 2016 22:53:56 +0000 (17:53 -0500)
committerWolfgang Bangerth <bangerth@colostate.edu>
Thu, 20 Oct 2016 22:53:56 +0000 (17:53 -0500)
The function reads a section of VTK files of the form

CELL_DATA 4
SCALARS MaterialID double 1
LOOKUP_TABLE default
1.000000
2.000000
3.000000
4.000000

but internally (despite the fact that the field is declared
as 'double' above) reads them as integers. This leads to
wrong results if they are given as floating point numbers,
as in the case above.

While there also add an assertion an clean things up
slightly.

source/grid/grid_in.cc
tests/grid/grid_in_vtk_3d_03.output

index 97de9881ddb36cba0cf784f5c128761ca9633d60..b101d3274220bea24af2129d81be08caaad65421 100644 (file)
@@ -307,8 +307,27 @@ void GridIn<dim, spacedim>::read_vtk(std::istream &in)
 
       if (keyword == "CELL_DATA")
         {
-          int no_ids;
-          in>>no_ids;
+          unsigned int no_ids;
+          in >> no_ids;
+
+          AssertThrow (no_ids == no_cells + (dim == 3 ?
+                                             no_quads :
+                                             (dim == 2 ?
+                                              no_lines
+                                              :
+                                              0)),
+                       ExcMessage ("The VTK reader found a CELL_DATA statement "
+                                   "that lists a total of "
+                                   + Utilities::int_to_string (no_ids) +
+                                   " cell data objects, but this needs to "
+                                   "equal the number of cells (which is "
+                                   + Utilities::int_to_string (no_cells) +
+                                   ") plus the number of quads ("
+                                   + Utilities::int_to_string (no_quads) +
+                                   " in 3d or the number of lines ("
+                                   + Utilities::int_to_string (no_lines) +
+                                   ") in 2d."));
+
 
           std::string linenew;
           std::string textnew[2];
@@ -331,7 +350,7 @@ void GridIn<dim, spacedim>::read_vtk(std::istream &in)
 
           for (unsigned int i = 0; i < no_cells; i++) //assigning IDs to cells.
             {
-              int id;
+              double id;
               in>>id;
               cells[cell_indices[i]].material_id = id;
             }
@@ -340,8 +359,8 @@ void GridIn<dim, spacedim>::read_vtk(std::istream &in)
             {
               for (unsigned int i = 0; i < no_quads; i++) //assigning IDs to bounds.
                 {
-                  int id;
-                  in>>id;
+                  double id;
+                  in >> id;
                   subcelldata.boundary_quads[quad_indices[i]].material_id = id;
                 }
             }
@@ -349,8 +368,8 @@ void GridIn<dim, spacedim>::read_vtk(std::istream &in)
             {
               for (unsigned int i = 0; i < no_lines; i++) //assigning IDs to bounds.
                 {
-                  int id;
-                  in>>id;
+                  double id;
+                  in >> id;
                   subcelldata.boundary_lines[line_indices[i]].material_id = id;
                 }
             }
index 2293dc9500e076ab34b25452fa8f0cd5ee1ac8e8..80c3135d2d7edc7eb036df1bb312cb83e654024c 100644 (file)
@@ -24,75 +24,75 @@ DEAL::      20      4
 0.0 10. 10. 0 1
 0.0 10. 0.0 0 1
 
-10. 0.0 10. 0 0
-20. 0.0 10. 0 0
-20. 10. 10. 0 0
-10. 10. 10. 0 0
-10. 0.0 10. 0 0
+10. 0.0 10. 0 2
+20. 0.0 10. 0 2
+20. 10. 10. 0 2
+10. 10. 10. 0 2
+10. 0.0 10. 0 2
 
-10. 0.0 0.0 0 0
-20. 0.0 0.0 0 0
-20. 10. 0.0 0 0
-10. 10. 0.0 0 0
-10. 0.0 0.0 0 0
+10. 0.0 0.0 0 2
+20. 0.0 0.0 0 2
+20. 10. 0.0 0 2
+10. 10. 0.0 0 2
+10. 0.0 0.0 0 2
 
-10. 0.0 10. 0 0
-10. 0.0 0.0 0 0
+10. 0.0 10. 0 2
+10. 0.0 0.0 0 2
 
-20. 0.0 10. 0 0
-20. 0.0 0.0 0 0
+20. 0.0 10. 0 2
+20. 0.0 0.0 0 2
 
-20. 10. 10. 0 0
-20. 10. 0.0 0 0
+20. 10. 10. 0 2
+20. 10. 0.0 0 2
 
-10. 10. 10. 0 0
-10. 10. 0.0 0 0
+10. 10. 10. 0 2
+10. 10. 0.0 0 2
 
-10. 10. 10. 0 0
-20. 10. 10. 0 0
-20. 20. 10. 0 0
-10. 20. 10. 0 0
-10. 10. 10. 0 0
+10. 10. 10. 0 3
+20. 10. 10. 0 3
+20. 20. 10. 0 3
+10. 20. 10. 0 3
+10. 10. 10. 0 3
 
-10. 10. 0.0 0 0
-20. 10. 0.0 0 0
-20. 20. 0.0 0 0
-10. 20. 0.0 0 0
-10. 10. 0.0 0 0
+10. 10. 0.0 0 3
+20. 10. 0.0 0 3
+20. 20. 0.0 0 3
+10. 20. 0.0 0 3
+10. 10. 0.0 0 3
 
-10. 10. 10. 0 0
-10. 10. 0.0 0 0
+10. 10. 10. 0 3
+10. 10. 0.0 0 3
 
-20. 10. 10. 0 0
-20. 10. 0.0 0 0
+20. 10. 10. 0 3
+20. 10. 0.0 0 3
 
-20. 20. 10. 0 0
-20. 20. 0.0 0 0
+20. 20. 10. 0 3
+20. 20. 0.0 0 3
 
-10. 20. 10. 0 0
-10. 20. 0.0 0 0
+10. 20. 10. 0 3
+10. 20. 0.0 0 3
 
-20. 10. 10. 0 0
-30. 10. 10. 0 0
-30. 20. 10. 0 0
-20. 20. 10. 0 0
-20. 10. 10. 0 0
+20. 10. 10. 0 4
+30. 10. 10. 0 4
+30. 20. 10. 0 4
+20. 20. 10. 0 4
+20. 10. 10. 0 4
 
-20. 10. 0.0 0 0
-30. 10. 0.0 0 0
-30. 20. 0.0 0 0
-20. 20. 0.0 0 0
-20. 10. 0.0 0 0
+20. 10. 0.0 0 4
+30. 10. 0.0 0 4
+30. 20. 0.0 0 4
+20. 20. 0.0 0 4
+20. 10. 0.0 0 4
 
-20. 10. 10. 0 0
-20. 10. 0.0 0 0
+20. 10. 10. 0 4
+20. 10. 0.0 0 4
 
-30. 10. 10. 0 0
-30. 10. 0.0 0 0
+30. 10. 10. 0 4
+30. 10. 0.0 0 4
 
-30. 20. 10. 0 0
-30. 20. 0.0 0 0
+30. 20. 10. 0 4
+30. 20. 0.0 0 4
 
-20. 20. 10. 0 0
-20. 20. 0.0 0 0
+20. 20. 10. 0 4
+20. 20. 0.0 0 4
 

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.