Skip to content
Snippets Groups Projects
MeshReaderTest.cpp 5.41 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jakub Klinkovský's avatar
    Jakub Klinkovský committed
    #include <TNL/Meshes/Mesh.h>
    #include <TNL/Meshes/MeshConfigBase.h>
    #include <TNL/Meshes/BuildConfigTags.h>
    #include <TNL/Meshes/TypeResolver/TypeResolver.h>
    
    #include <TNL/Debugging/MemoryUsage.h>
    
    using namespace TNL;
    using namespace TNL::Meshes;
    
    
    template< typename Cell,
              int WorldDimension = Cell::dimension,
              typename Real = double,
              typename GlobalIndex = int,
              typename LocalIndex = GlobalIndex,
              typename Id = void >
    struct MyMeshConfig
       : public MeshConfigBase< Cell, WorldDimension, Real, GlobalIndex, LocalIndex, Id >
    {
       static constexpr bool entityStorage( int dimension )
       {
          return true;
    //      return dimension == 0 || dimension == Cell::dimension;
       }
    
       template< typename EntityTopology >
       static constexpr bool subentityStorage( EntityTopology, int SubentityDimension )
       {
    //      return entityStorage( EntityTopology::dimension );
          return entityStorage( EntityTopology::dimension ) &&
                 SubentityDimension == 0;
       }
    
       template< typename EntityTopology >
       static constexpr bool subentityOrientationStorage( EntityTopology, int SubentityDimension ) 
       {
          return false;
       }
    
       template< typename EntityTopology >
       static constexpr bool superentityStorage( EntityTopology, int SuperentityDimension )
       {
    //      return entityStorage( EntityTopology::dimension );
          return entityStorage( EntityTopology::dimension ) &&
                 SuperentityDimension == Cell::dimension;
       }
    
       template< typename EntityTopology >
       static constexpr bool boundaryTagsStorage( EntityTopology )
       {
          using BaseType = MeshConfigBase< Cell, WorldDimension, Real, GlobalIndex, LocalIndex, Id >;
          using FaceTopology = typename MeshSubtopology< Cell, BaseType::meshDimension - 1 >::Topology;
          return entityStorage( BaseType::meshDimension - 1 ) &&
                 superentityStorage( FaceTopology(), BaseType::meshDimension ) &&
                 ( EntityTopology::dimension >= BaseType::meshDimension - 1 || subentityStorage( FaceTopology(), EntityTopology::dimension ) );
          //return false;
       }
    };
    
    
    // specialization of BuildConfigTags
    struct MyBuildConfigTag {};
    
    namespace TNL {
    namespace Meshes {
    namespace BuildConfigTags {
    
    // disable grids
    template< int Dimension, typename Real, typename Device, typename Index >
    struct GridTag< MyBuildConfigTag, Grid< Dimension, Real, Device, Index > >
    { enum { enabled = false }; };
    
    // enable all cell topologies
    template<> struct MeshCellTopologyTag< MyBuildConfigTag, MeshEdgeTopology > { enum { enabled = true }; };
    template<> struct MeshCellTopologyTag< MyBuildConfigTag, MeshTriangleTopology > { enum { enabled = true }; };
    template<> struct MeshCellTopologyTag< MyBuildConfigTag, MeshQuadrilateralTopology > { enum { enabled = true }; };
    template<> struct MeshCellTopologyTag< MyBuildConfigTag, MeshTetrahedronTopology > { enum { enabled = true }; };
    template<> struct MeshCellTopologyTag< MyBuildConfigTag, MeshHexahedronTopology > { enum { enabled = true }; };
    
    template< typename CellTopology, int WorldDimension >
    struct MeshWorldDimensionTag< MyBuildConfigTag, CellTopology, WorldDimension >
    { enum { enabled = ( WorldDimension == CellTopology::dimension ) }; };
    
    template< typename Real > struct MeshRealTag< MyBuildConfigTag, Real > { enum { enabled = false }; };
    template<> struct MeshRealTag< MyBuildConfigTag, float > { enum { enabled = true }; };
    template<> struct MeshRealTag< MyBuildConfigTag, double > { enum { enabled = true }; };
    
    template< typename GlobalIndex > struct MeshGlobalIndexTag< MyBuildConfigTag, GlobalIndex > { enum { enabled = false }; };
    template<> struct MeshGlobalIndexTag< MyBuildConfigTag, int > { enum { enabled = true }; };
    
    template< typename LocalIndex > struct MeshLocalIndexTag< MyBuildConfigTag, LocalIndex > { enum { enabled = false }; };
    template<> struct MeshLocalIndexTag< MyBuildConfigTag, short int > { enum { enabled = true }; };
    
    template<>
    struct MeshConfigTemplateTag< MyBuildConfigTag >
    {
       template< typename Cell, int WorldDimension, typename Real, typename GlobalIndex, typename LocalIndex, typename Id >
       using MeshConfig = MyMeshConfig< Cell, WorldDimension, Real, GlobalIndex, LocalIndex, Id >;
    };
    
    } // namespace BuildConfigTags
    } // namespace Meshes
    } // namespace TNL
    
    
    template< typename MeshType >
    class MeshTester
    {
    public:
       static bool run( const String& fileName )
       {
          MeshType mesh;
    
          std::cout << "pre-init\t";
          Debugging::printMemoryUsage();
    
          if( ! loadMesh( fileName, mesh ) )
             return false;
    
          // TODO: add tests
          std::cout << "NOTE: there is no real test, but the file was loaded fine..." << std::endl;
    
          std::cout << "vertices: " << mesh.template getEntitiesCount< 0 >() << std::endl;
          std::cout << "cells: " << mesh.getCellsCount() << std::endl;
    
          std::cout << "post-init\t";
          Debugging::printMemoryUsage();
    
          mesh.save( "mesh-test.tnl" );
    
          return true;
       }
    };
    
    int main( int argc, char* argv[] )
    {
       if( argc < 2 ) {
          std::cerr << "Usage: " << argv[ 0 ] << " filename.[tnl|ng|vtk] ..." << std::endl;
          return EXIT_FAILURE;
       }
    
       bool result = true;
    
       for( int i = 1; i < argc; i++ ) {
          String fileName = argv[ i ];
          
          result &= resolveMeshType< MyBuildConfigTag, Devices::Host, MeshTester >
                      ( fileName,
                        fileName  // passed to MeshTester::run
                      );
       }
    
       std::cout << "final\t";
       Debugging::printMemoryUsage();
    
       return ! result;
    }