Commit f72bf0f7 authored by Jakub Klinkovský's avatar Jakub Klinkovský
Browse files

Updated VTKWriter to produce DataFile version 5.1 instead of 2.0

parent d984e2e5
Loading
Loading
Loading
Loading
+24 −18
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@
#include <limits>

#include <TNL/Meshes/Writers/VTKWriter.h>
#include <TNL/Meshes/Writers/detail/VTKEntitiesListSize.h>
#include <TNL/Meshes/Writers/detail/VTKOffsetsCountGetter.h>
#include <TNL/Meshes/Writers/detail/VTKMeshEntitiesWriter.h>
#include <TNL/Meshes/Grid.h>

@@ -37,12 +37,12 @@ VTKWriter< Mesh >::writeMetadata( int cycle, double time )
      str << "FIELD FieldData " << n_metadata << "\n";
   if( cycle >= 0 ) {
      str << "CYCLE 1 1 int\n";
      detail::writeInt( format, str, cycle );
      detail::writeValue( format, str, cycle );
      str << "\n";
   }
   if( time >= 0 ) {
      str << "TIME 1 1 double\n";
      detail::writeReal( format, str, time );
      detail::writeValue( format, str, time );
      str << "\n";
   }
}
@@ -58,10 +58,16 @@ VTKWriter< Mesh >::writeEntities( const Mesh& mesh )

   using EntityType = typename Mesh::template EntityType< EntityDimension >;
   cellsCount = mesh.template getEntitiesCount< EntityType >();
   const std::uint64_t cellsListSize = detail::VTKEntitiesListSize< Mesh, EntityDimension >::getSize( mesh );
   const std::uint64_t offsetsCount = detail::VTKOffsetsCountGetter< Mesh, EntityDimension >::getOffsetsCount( mesh );

   str << std::endl << "CELLS " << cellsCount << " " << cellsListSize << std::endl;
   detail::VTKMeshEntitiesWriter< Mesh, EntityDimension >::exec( mesh, str, format );
   // legacy VTK files always have fixed integer width, even in the BINARY format
   // - DataFormat version 2.0: 32-bit
   // - DataFormat version 5.1: 64-bit (vtktypeint64)
   str << std::endl << "CELLS " << cellsCount + 1 << " " << offsetsCount << std::endl;
   str << "OFFSETS vtktypeint64" << std::endl;
   detail::VTKMeshEntitiesWriter< Mesh, EntityDimension >::template writeOffsets< std::int64_t >( mesh, str, format );
   str << "CONNECTIVITY vtktypeint64" << std::endl;
   detail::VTKMeshEntitiesWriter< Mesh, EntityDimension >::template writeConnectivity< std::int64_t >( mesh, str, format );

   str << std::endl << "CELL_TYPES " << cellsCount << std::endl;
   detail::VTKMeshEntityTypesWriter< Mesh, EntityDimension >::exec( mesh, str, format );
@@ -137,16 +143,16 @@ VTKWriter< Mesh >::writeDataArray( const Array& array,

   // write DataArray header
   if( numberOfComponents == 1 ) {
      str << "SCALARS " << name << " " << getType< typename Array::ValueType >() << " 1" << std::endl;
      str << "SCALARS " << name << " " << getType< typename Array::ValueType >() << std::endl;
      str << "LOOKUP_TABLE default" << std::endl;
   }
   else {
      str << "VECTORS " << name << " " << getType< typename Array::ValueType >() << " 1" << std::endl;
      str << "VECTORS " << name << " " << getType< typename Array::ValueType >() << std::endl;
   }

   using detail::writeReal;
   using detail::writeValue;
   for( typename Array::IndexType i = 0; i < array.getSize(); i++ ) {
      writeReal( format, str, array[i] );
      writeValue( format, str, array[i] );
      if( format == VTK::FileFormat::ascii )
         str << "\n";
   }
@@ -156,17 +162,17 @@ template< typename Mesh >
void
VTKWriter< Mesh >::writePoints( const Mesh& mesh )
{
   using detail::writeReal;
   using detail::writeValue;
   pointsCount = mesh.template getEntitiesCount< typename Mesh::Vertex >();
   str << "POINTS " << pointsCount << " " << getType< typename Mesh::RealType >() << std::endl;
   for( std::uint64_t i = 0; i < pointsCount; i++ ) {
      const auto& vertex = mesh.template getEntity< typename Mesh::Vertex >( i );
      const auto& point = vertex.getPoint();
      for( int j = 0; j < point.getSize(); j++ )
         writeReal( format, str, point[ j ] );
         writeValue( format, str, point[ j ] );
      // VTK needs zeros for unused dimensions
      for( int j = point.getSize(); j < 3; j++ )
         writeReal( format, str, (typename Mesh::PointType::RealType) 0 );
         writeValue( format, str, (typename Mesh::PointType::RealType) 0 );
      if( format == VTK::FileFormat::ascii )
         str << "\n";
   }
@@ -176,7 +182,7 @@ template< typename Mesh >
void
VTKWriter< Mesh >::writeHeader()
{
    str << "# vtk DataFile Version 2.0\n"
   str << "# vtk DataFile Version 5.1\n"
       << "TNL DATA\n"
       << ((format == VTK::FileFormat::ascii) ? "ASCII\n" : "BINARY\n")
       << "DATASET UNSTRUCTURED_GRID\n";
+282 −96

File changed.

Preview size limit exceeded, changes collapsed.

+8 −8
Original line number Diff line number Diff line
@@ -10,15 +10,15 @@ namespace detail {
template< typename Mesh,
          int EntityDimension,
          typename EntityType = typename Mesh::template EntityType< EntityDimension > >
struct VTKEntitiesListSize
struct VTKOffsetsCountGetter
{
   using IndexType = typename Mesh::GlobalIndexType;

   static IndexType getSize( const Mesh& mesh )
   static IndexType getOffsetsCount( const Mesh& mesh )
   {
      const IndexType entitiesCount = mesh.template getEntitiesCount< EntityType >();
      const IndexType verticesPerEntity = VerticesPerEntity< EntityType >::count;
      return entitiesCount * ( verticesPerEntity + 1 );
      return entitiesCount * verticesPerEntity;
   }
};

@@ -26,17 +26,17 @@ template< typename Mesh,
          int EntityDimension,
          typename MeshConfig,
          typename Device >
struct VTKEntitiesListSize< Mesh, EntityDimension, MeshEntity< MeshConfig, Device, Topologies::Polygon > >
struct VTKOffsetsCountGetter< Mesh, EntityDimension, MeshEntity< MeshConfig, Device, Topologies::Polygon > >
{
   using IndexType = typename Mesh::GlobalIndexType;

   static IndexType getSize( const Mesh& mesh )
   static IndexType getOffsetsCount( const Mesh& mesh )
   {
      const IndexType entitiesCount = mesh.template getEntitiesCount< EntityDimension >();
      IndexType entitiesListSize = entitiesCount;
      IndexType offsetsCount = 0;
      for(IndexType index = 0; index < entitiesCount; index++)
         entitiesListSize += mesh.template getSubentitiesCount< EntityDimension, 0 >( index );
      return entitiesListSize;
         offsetsCount += mesh.template getSubentitiesCount< EntityDimension, 0 >( index );
      return offsetsCount;
   }
};

+2 −2
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ void test_reader( const MeshType& mesh, std::string outputFileName )
// 1. resolveMeshType resolves the mesh type correctly
// 2. resolveAndLoadMesh loads the mesh
template< template<typename> class WriterType, typename ConfigTag, typename MeshType >
void test_resolveAndLoadMesh( const MeshType& mesh, std::string outputFileName )
void test_resolveAndLoadMesh( const MeshType& mesh, std::string outputFileName, std::string globalIndexType = "auto" )
{
   // write the mesh into the file (new scope is needed to properly close the file)
   {
@@ -57,7 +57,7 @@ void test_resolveAndLoadMesh( const MeshType& mesh, std::string outputFileName )
      return true;
   };

   const bool status = TNL::Meshes::resolveAndLoadMesh< ConfigTag, TNL::Devices::Host >( wrapper, outputFileName );
   const bool status = TNL::Meshes::resolveAndLoadMesh< ConfigTag, TNL::Devices::Host >( wrapper, outputFileName, "auto", "auto", globalIndexType );
   EXPECT_TRUE( status );

   EXPECT_EQ( std::remove( outputFileName.c_str() ), 0 );
+10 −10
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ TEST( VTKReaderTest, mrizka_1 )
   EXPECT_EQ( cells, 242 );

   test_reader< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME );
   test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME );
   test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME, "int" );  // force GlobalIndex to int (VTK DataFormat 2.0 uses int32, but 5.1 uses int64)
   test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "PointData" );
   test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "CellData" );
}
@@ -67,7 +67,7 @@ TEST( VTKReaderTest, tetrahedrons )
   EXPECT_EQ( cells, 1312 );

   test_reader< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME );
   test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME );
   test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME, "int" );  // force GlobalIndex to int (VTK DataFormat 2.0 uses int32, but 5.1 uses int64)
   test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "PointData" );
   test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "CellData" );
}
@@ -85,7 +85,7 @@ TEST( VTKReaderTest, triangles_2x2x2_original_with_metadata_and_cell_data )
   EXPECT_EQ( cells, 8 );

   test_reader< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME );
   test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME );
   test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME, "int" );  // force GlobalIndex to int (VTK DataFormat 2.0 uses int32, but 5.1 uses int64)
   test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "PointData" );
   test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "CellData" );
}
@@ -103,7 +103,7 @@ TEST( VTKReaderTest, triangles_2x2x2_minimized_ascii )
   EXPECT_EQ( cells, 8 );

   test_reader< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME );
   test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME );
   test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME, "int" );  // force GlobalIndex to int (VTK DataFormat 2.0 uses int32, but 5.1 uses int64)
   test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "PointData" );
   test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "CellData" );
}
@@ -121,7 +121,7 @@ TEST( VTKReaderTest, triangles_2x2x2_minimized_binary )
   EXPECT_EQ( cells, 8 );

   test_reader< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME );
   test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME );
   test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME, "int" );  // force GlobalIndex to int (VTK DataFormat 2.0 uses int32, but 5.1 uses int64)
   test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "PointData" );
   test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "CellData" );
}
@@ -139,7 +139,7 @@ TEST( VTKReaderTest, triangles_2x2x2_ascii_51 )
   EXPECT_EQ( cells, 8 );

   test_reader< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME );
   test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME );
   test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME, "int" );  // force GlobalIndex to int (VTK DataFormat 2.0 uses int32, but 5.1 uses int64)
   test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "PointData" );
   test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "CellData" );
}
@@ -157,7 +157,7 @@ TEST( VTKReaderTest, triangles_2x2x2_binary_51 )
   EXPECT_EQ( cells, 8 );

   test_reader< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME );
   test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME );
   test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME, "int" );  // force GlobalIndex to int (VTK DataFormat 2.0 uses int32, but 5.1 uses int64)
   test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "PointData" );
   test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "CellData" );
}
@@ -176,7 +176,7 @@ TEST( VTKReaderTest, quadrangles )
   EXPECT_EQ( cells, 6 );

   test_reader< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME );
   test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME );
   test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME, "int" );  // force GlobalIndex to int (VTK DataFormat 2.0 uses int32, but 5.1 uses int64)
   test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "PointData" );
   test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "CellData" );
}
@@ -194,7 +194,7 @@ TEST( VTKReaderTest, hexahedrons )
   EXPECT_EQ( cells, 24 );

   test_reader< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME );
   test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME );
   test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME, "int" );  // force GlobalIndex to int (VTK DataFormat 2.0 uses int32, but 5.1 uses int64)
   test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "PointData" );
   test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "CellData" );
}
@@ -212,7 +212,7 @@ TEST( VTKReaderTest, polygons )
   EXPECT_EQ( cells, 90 );

   test_reader< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME );
   test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME );
   test_resolveAndLoadMesh< Writers::VTKWriter, MyConfigTag >( mesh, TEST_FILE_NAME, "int" );  // force GlobalIndex to int (VTK DataFormat 2.0 uses int32, but 5.1 uses int64)
   test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "PointData" );
   test_meshfunction< Readers::VTKReader, Writers::VTKWriter >( mesh, TEST_FILE_NAME, "CellData" );
}