From e77c8bf5dd7c17cfe6e187321d917101606b2c32 Mon Sep 17 00:00:00 2001 From: Tomas Oberhuber <tomas.oberhuber@fjfi.cvut.cz> Date: Sat, 15 Aug 2015 11:48:49 +0200 Subject: [PATCH] Mesh config and config validator were added. --- TODO | 7 +- src/core/arrays/tnlStaticArray.h | 8 ++ src/core/arrays/tnlStaticArray1D_impl.h | 7 + src/core/arrays/tnlStaticArray2D_impl.h | 7 + src/core/arrays/tnlStaticArray3D_impl.h | 8 ++ src/core/arrays/tnlStaticArray_impl.h | 14 +- src/mesh/CMakeLists.txt | 1 + src/mesh/config/CMakeLists.txt | 3 +- src/mesh/config/tnlMeshConfigBase.h | 51 ++++++- src/mesh/config/tnlMeshConfigValidator.h | 105 ++++++++++++++ src/mesh/layers/tnlMeshStorageLayer.h | 86 ++++++------ .../layers/tnlMeshSubentityStorageLayer.h | 62 ++++---- .../layers/tnlMeshSuperentityStorageLayer.h | 80 +++++------ ...lDimensionsTraits.h => tnlDimensionsTag.h} | 21 +-- src/mesh/tnlMesh.h | 50 +++---- src/mesh/tnlMeshEntity.h | 73 ++++++---- src/mesh/tnlMeshEntityInitializer.h | 68 ++++----- src/mesh/tnlMeshEntityKey.h | 4 +- src/mesh/tnlMeshInitializer.h | 92 ++++++------ src/mesh/tnlMeshIntegrityChecker.h | 6 +- src/mesh/tnlMeshIntegrityCheckerLayer.h | 26 ++-- src/mesh/tnlMeshReaderNetgen.h | 74 +++++++++- src/mesh/tnlMeshSuperentityInitializerLayer.h | 12 +- src/mesh/tnlMeshWriterVTKLegacy.h | 65 ++++++++- src/mesh/traits/CMakeLists.txt | 3 +- src/mesh/traits/tnlMeshConfigTraits.h | 63 +++++++++ src/mesh/traits/tnlMeshEntitiesTag.h | 10 +- src/mesh/traits/tnlMeshEntitiesTraits.h | 11 +- src/mesh/traits/tnlMeshSubentitiesTraits.h | 9 +- src/mesh/traits/tnlMeshSuperentitiesTraits.h | 11 +- src/mesh/traits/tnlMeshTraits.h | 8 +- tests/unit-tests/mesh/tnlMeshEntityTester.h | 53 +++++-- tests/unit-tests/mesh/tnlMeshTester.h | 76 ++++------ tools/src/tnl-mesh-convert.h | 132 +++++++++--------- tools/src/tnl-view.cpp | 2 +- 35 files changed, 853 insertions(+), 455 deletions(-) create mode 100644 src/mesh/config/tnlMeshConfigValidator.h rename src/mesh/{traits/tnlDimensionsTraits.h => tnlDimensionsTag.h} (71%) create mode 100644 src/mesh/traits/tnlMeshConfigTraits.h diff --git a/TODO b/TODO index c8ed457124..d885b32df7 100644 --- a/TODO +++ b/TODO @@ -1,8 +1,13 @@ +TODO: Mesh + * vsechny traits zkusit presunout do jednotneho MeshTraits, tj. temer MeshConfigTraits ale pojmenovat jako MeshTraits + * zrusit tnlDimesnionsTag + * prejmenovat Tagy v topologies na Topology zrejme + * zrusit tnlStorageTraits + TODO: v tnlMeshResolver se provadi preklad pro vsechny mozne sablonove parametry => prorezat TODO: napsat FunctionDiscretizer pro jednotne rozhrani RightHandSide -TODO: doplnit mesh travelsals pro jine mesh entity nez cell TODO: implementace maticovych resicu * Gaussova eliminace * SOR metoda diff --git a/src/core/arrays/tnlStaticArray.h b/src/core/arrays/tnlStaticArray.h index 6ac9811433..c83d809d36 100644 --- a/src/core/arrays/tnlStaticArray.h +++ b/src/core/arrays/tnlStaticArray.h @@ -100,6 +100,8 @@ class tnlStaticArray bool load( tnlFile& file); void sort(); + + ostream& write( ostream& str, const char* separator = " " ) const; protected: Element data[ Size ]; @@ -192,6 +194,8 @@ class tnlStaticArray< 1, Element > bool load( tnlFile& file); void sort(); + + ostream& write( ostream& str, const char* separator = " " ) const; protected: Element data[ size ]; @@ -301,6 +305,8 @@ class tnlStaticArray< 2, Element > bool load( tnlFile& file); void sort(); + + ostream& write( ostream& str, const char* separator = " " ) const; protected: Element data[ size ]; @@ -422,6 +428,8 @@ class tnlStaticArray< 3, Element > bool load( tnlFile& file); void sort(); + + ostream& write( ostream& str, const char* separator = " " ) const; protected: Element data[ size ]; diff --git a/src/core/arrays/tnlStaticArray1D_impl.h b/src/core/arrays/tnlStaticArray1D_impl.h index 170488b655..e7779e9eae 100644 --- a/src/core/arrays/tnlStaticArray1D_impl.h +++ b/src/core/arrays/tnlStaticArray1D_impl.h @@ -202,6 +202,13 @@ void tnlStaticArray< 1, Element >::sort() { } +template< typename Element > +ostream& tnlStaticArray< 1, Element >::write( ostream& str, const char* separator ) const +{ + str << data[ 0 ]; + return str; +} + #ifdef TEMPLATE_EXPLICIT_INSTANTIATION // TODO: it does not work with CUDA diff --git a/src/core/arrays/tnlStaticArray2D_impl.h b/src/core/arrays/tnlStaticArray2D_impl.h index 3e3cd35820..dcbe0cfce8 100644 --- a/src/core/arrays/tnlStaticArray2D_impl.h +++ b/src/core/arrays/tnlStaticArray2D_impl.h @@ -239,6 +239,13 @@ void tnlStaticArray< 2, Element >::sort() Swap( data[ 0 ], data[ 1 ] ); } +template< typename Element > +ostream& tnlStaticArray< 2, Element >::write( ostream& str, const char* separator ) const +{ + str << data[ 0 ] << separator << data[ 1 ]; + return str; +} + #ifdef TEMPLATE_EXPLICIT_INSTANTIATION // TODO: it does not work with CUDA diff --git a/src/core/arrays/tnlStaticArray3D_impl.h b/src/core/arrays/tnlStaticArray3D_impl.h index 5b9755f028..95740a73de 100644 --- a/src/core/arrays/tnlStaticArray3D_impl.h +++ b/src/core/arrays/tnlStaticArray3D_impl.h @@ -270,6 +270,14 @@ void tnlStaticArray< 3, Element >::sort() Swap( data[ 0 ], data[ 1 ] ); } +template< typename Element > +ostream& tnlStaticArray< 3, Element >::write( ostream& str, const char* separator ) const +{ + str << data[ 0 ] << separator << data[ 1 ] << separator << data[ 2 ]; + return str; +} + + #ifdef TEMPLATE_EXPLICIT_INSTANTIATION // TODO: it does not work with CUDA diff --git a/src/core/arrays/tnlStaticArray_impl.h b/src/core/arrays/tnlStaticArray_impl.h index 08c5606e4f..e2abac44e2 100644 --- a/src/core/arrays/tnlStaticArray_impl.h +++ b/src/core/arrays/tnlStaticArray_impl.h @@ -203,15 +203,25 @@ void tnlStaticArray< Size, Element >::sort() Swap( data[ i ], data[ i+1 ] ); } +template< int Size, typename Element > +ostream& tnlStaticArray< Size, Element >::write( ostream& str, const char* separator ) const +{ + for( int i = 0; i < Size - 1; i++ ) + str << data[ i ] << separator; + str << data[ Size - 1 ]; + return str; +} + template< int Size, typename Element > ostream& operator << ( ostream& str, const tnlStaticArray< Size, Element >& a ) { - for( int i = 0; i < Size - 1; i ++ ) + a.write( str, "," ); + /*for( int i = 0; i < Size - 1; i ++ ) { str << a[ i ] << ", "; } - str << a[ Size - 1 ]; + str << a[ Size - 1 ];*/ return str; }; diff --git a/src/mesh/CMakeLists.txt b/src/mesh/CMakeLists.txt index e8ce9f1ba6..5c0ebc1e85 100755 --- a/src/mesh/CMakeLists.txt +++ b/src/mesh/CMakeLists.txt @@ -11,6 +11,7 @@ SET( headers tnlGrid.h tnlGrid3D.h tnlGrid3D_impl.h tnlDummyMesh.h + tnlDimensionsTag.h tnlGnuplotWriter.h tnlMesh.h tnlMeshEntity.h diff --git a/src/mesh/config/CMakeLists.txt b/src/mesh/config/CMakeLists.txt index 5da9330921..db2417314f 100755 --- a/src/mesh/config/CMakeLists.txt +++ b/src/mesh/config/CMakeLists.txt @@ -1,3 +1,4 @@ -SET( headers tnlMeshConfigBase.h ) +SET( headers tnlMeshConfigBase.h + tnlMeshConfigValidator.h ) INSTALL( FILES ${headers} DESTINATION include/tnl-${tnlVersion}/mesh/config ) \ No newline at end of file diff --git a/src/mesh/config/tnlMeshConfigBase.h b/src/mesh/config/tnlMeshConfigBase.h index 0bbe28780d..d27d5183fb 100644 --- a/src/mesh/config/tnlMeshConfigBase.h +++ b/src/mesh/config/tnlMeshConfigBase.h @@ -32,22 +32,65 @@ template< typename Cell, typename Id = void > struct tnlMeshConfigBase { - typedef Cell CellTag; + typedef Cell CellType; typedef Real RealType; typedef GlobalIndex GlobalIndexType; typedef LocalIndex LocalIndexType; typedef Id IdType; - enum { worldDimensions = WorldDimensions }; + static const int worldDimensions = WorldDimensions; + static const int cellDimensions = Cell::dimensions; static tnlString getType() { return tnlString( "tnlMeshConfigBase< >"); }; + + /**** + * Storage of mesh entities. + */ + static constexpr bool entityStorage( int dimensions ) + { + /**** + * Vertices and cells must always be stored + */ + return ( dimensions == 0 || dimensions == cellDimensions ); + } + + /**** + * Storage of subentities of mesh entities + */ + template< typename MeshEntity > + static constexpr bool subentityStorage( MeshEntity, int SubentityDimensions ) + { + /**** + * Vertices must always be stored + */ + return ( SubentityDimensions == 0 ); + } - tnlStaticAssert( WorldDimensions >= Cell::dimensions, "The number of the cell dimensions cannot be larger than the world dimension." ); + /**** + * Storage of subentity orientations of mesh entities + */ + template< typename MeshEntity > + static constexpr bool subentityOrientationStorage( MeshEntity, int SubentityDimensions ) + { + return false; + } + + /**** + * Storage of superentities of mesh entities + */ + template< typename MeshEntity > + static constexpr bool superentityStorage( MeshEntity, int SuperentityDimensions ) + { + return false; + } + + static_assert( WorldDimensions >= Cell::dimensions, "The number of the cell dimensions cannot be larger than the world dimension." ); }; +#ifdef UNDEF /**** * Explicit storage of all mesh entities by default. * To disable it, write your own specialization with given @@ -85,4 +128,6 @@ struct tnlMeshSuperentityStorage enum { enabled = false }; }; +#endif + #endif /* TNLMESHCONFIGBASE_H_ */ diff --git a/src/mesh/config/tnlMeshConfigValidator.h b/src/mesh/config/tnlMeshConfigValidator.h new file mode 100644 index 0000000000..29606e2225 --- /dev/null +++ b/src/mesh/config/tnlMeshConfigValidator.h @@ -0,0 +1,105 @@ +/*************************************************************************** + tnlMeshConfigValidator.h - description + ------------------- + begin : Aug 14, 2015 + copyright : (C) 2015 by Tomas Oberhuber et al. + email : tomas.oberhuber@fjfi.cvut.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef TNLMESHCONFIGVALIDATOR_H +#define TNLMESHCONFIGVALIDATOR_H + +#include <core/tnlAssert.h> + +/* +template< typename MeshConfig, + typename MeshEntity, + int dimensions > +class tnlMeshConfigValidatorSubtopologyLayer : + public tnlMeshConfigValidatorSubtopologyLayer< MeshConfig, MeshEntity, dimensions - 1 > +{ + static_assert( ! MeshConfig::subentityStorage( MeshEntity(), dimensions ) || + MeshConfig::entityStorage( MeshEntity::dimensions ), "entities of which subentities are stored must be stored" ); + static_assert( ! MeshConfig::subentityStorage( MeshEntity(), dimensions ) || + MeshConfig::entityStorage( dimensions ), "entities that are stored as subentities must be stored"); + // TODO: fix this + //static_assert( ! MeshConfig::subentityOrientationStorage(TTopology(), TDim()) || TConfig::subentityStorage(TTopology(), TDim()), "orientation can be stored only for subentities that are stored"); +}; + +template< typename MeshConfig, + typename MeshEntity > +class tnlMeshConfigValidatorSubtopologyLayer< MeshConfig, MeshEntity, 0 > +{ + static_assert( ! MeshConfig::subentityStorage( MeshEntity(), 0 ) || + MeshConfig::entityStorage( 0 ), "entities that are stored as subentities must be stored" ); + static_assert( ! MeshConfig::subentityOrientationStorage( MeshEntity(), 0 ), "storage of vertex orientation does not make sense" ); +}; + + +template< typename MeshConfig, + typename MeshEntity, + int dimensions > +class tnlMeshConfigValidatorSupertopologyLayer : + public tnlMeshConfigValidatorSupertopologyLayer< MeshConfig, MeshEntity, dimensions - 1 > +{ + static_assert( ! MeshConfig::superentityStorage( MeshEntity(), 0 ) || MeshConfig::entityStorage( MeshEntity::dimensions ), "entities of which superentities are stored must be stored"); + static_assert( ! MeshConfig::superentityStorage( MeshEntity(), 0 ) || MeshConfig::entityStorage( dimensions ), "entities that are stored as superentities must be stored"); +}; + +template< typename MeshConfig, + typename MeshEntity > +class tnlMeshConfigValidatorSupertopologyLayer< MeshConfig, MeshEntity, MeshEntity::dimensions > +{}; +*/ + +template< typename MeshConfig, int dimensions > +class tnlMeshConfigValidatorLayer : + public tnlMeshConfigValidatorLayer< MeshConfig, dimensions - 1 >//, + //public ConfigValidatorSubtopologyLayer< MeshConfig, typename Subtopology<typename TConfig::TCellTopology, TDim::VALUE>::TTopology, typename TDim::Decrement>, + //public ConfigValidatorSupertopologyLayer< MeshConfig, typename Subtopology<typename TConfig::TCellTopology, TDim::VALUE>::TTopology, Dim<TConfig::TCellTopology::DIMENSION>> +{ + //typedef typename Subtopology<typename TConfig::TCellTopology, TDim::VALUE>::TTopology TTopology; + +// static_assert( ! MeshConfig::entityStorage( dimensions ) || MeshConfig::subentityStorage( TTopology(), Dim<0>()), "subvertices of all stored entities must be stored"); +}; + +template< typename MeshConfig > +class tnlMeshConfigValidatorLayer< MeshConfig, 0 > +{ +}; + +template< typename MeshConfig > +class tnlMeshConfigValidatorLayerCell : + public tnlMeshConfigValidatorLayer< MeshConfig, MeshConfig::CellType::dimensions - 1 >//, +// public tnlMeshConfigValidatorSubtopologyLayer< MeshConfig, typename MeshConfig::CellType, MeshConfig::CellType::dimensions - 1 > +{ + typedef typename MeshConfig::CellType CellType; + static const int dimensions = CellType::dimensions; + + static_assert( !MeshConfig::entityStorage( dimensions ) || MeshConfig::subentityStorage( CellType(), 0 ), "subvertices of all stored entities must be stored"); +}; + +template<typename MeshConfig > +class tnlMeshConfigValidator : public tnlMeshConfigValidatorLayerCell< MeshConfig > +{ + static const int meshDimensions = MeshConfig::CellType::dimensions; + + static_assert(1 <= meshDimensions, "zero dimensional meshes are not supported"); + static_assert( meshDimensions <= MeshConfig::worldDimensions, "world dimension must not be less than mesh dimension"); + + static_assert( MeshConfig::entityStorage( 0 ), "mesh vertices must be stored"); + static_assert( MeshConfig::entityStorage( meshDimensions ), "mesh cells must be stored"); +}; + + +#endif /* TNLMESHCONFIGVALIDATOR_H */ + diff --git a/src/mesh/layers/tnlMeshStorageLayer.h b/src/mesh/layers/tnlMeshStorageLayer.h index 405a9799de..f09ba30a1a 100644 --- a/src/mesh/layers/tnlMeshStorageLayer.h +++ b/src/mesh/layers/tnlMeshStorageLayer.h @@ -23,38 +23,38 @@ #include <mesh/traits/tnlMeshEntitiesTraits.h> #include <mesh/traits/tnlStorageTraits.h> -template< typename DimensionsTraits, +template< typename DimensionsTag, typename Device, typename ConfigTag, typename EntityStorageTag = typename tnlMeshEntitiesTraits< ConfigTag, - DimensionsTraits >::EntityStorageTag > + DimensionsTag >::EntityStorageTag > class tnlMeshStorageTag; template< typename ConfigTag, - typename DimensionsTraits, + typename DimensionsTag, typename EntityStorageTag = typename tnlMeshEntitiesTraits< ConfigTag, - DimensionsTraits >::EntityStorageTag > + DimensionsTag >::EntityStorageTag > class tnlMeshStorageLayer; template< typename ConfigTag > class tnlMeshStorageLayers : public tnlMeshStorageLayer< ConfigTag, - typename tnlMeshTraits< ConfigTag >::DimensionsTraits > + typename tnlMeshTraits< ConfigTag >::DimensionsTag > {}; template< typename ConfigTag, - typename DimensionsTraits > + typename DimensionsTag > class tnlMeshStorageLayer< ConfigTag, - DimensionsTraits, + DimensionsTag, tnlStorageTraits< true > > - : public tnlMeshStorageLayer< ConfigTag, typename DimensionsTraits::Previous > + : public tnlMeshStorageLayer< ConfigTag, typename DimensionsTag::Decrement > { typedef tnlMeshStorageLayer< ConfigTag, - typename DimensionsTraits::Previous > BaseType; + typename DimensionsTag::Decrement > BaseType; - typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits > Tag; + typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTag > Tag; typedef typename Tag::ContainerType ContainerType; typedef typename Tag::SharedContainerType SharedContainerType; typedef typename ContainerType::IndexType GlobalIndexType; @@ -70,16 +70,16 @@ class tnlMeshStorageLayer< ConfigTag, tnlMeshStorageLayer() { - this->entities.setName( tnlString( "tnlMeshStorageLayer < " ) + tnlString( DimensionsTraits::value ) + " >::entities" ); - this->sharedEntities.setName( tnlString( "tnlMeshStorageLayer < " ) + tnlString( DimensionsTraits::value ) + " >::sharedEntities" ); + this->entities.setName( tnlString( "tnlMeshStorageLayer < " ) + tnlString( DimensionsTag::value ) + " >::entities" ); + this->sharedEntities.setName( tnlString( "tnlMeshStorageLayer < " ) + tnlString( DimensionsTag::value ) + " >::sharedEntities" ); } /*~tnlMeshStorageLayer() { - cout << "Destroying mesh storage layer with " << DimensionsTraits::value << " dimensions and " << this->entities.getSize() << " entities." << endl; + cout << "Destroying mesh storage layer with " << DimensionsTag::value << " dimensions and " << this->entities.getSize() << " entities." << endl; }*/ - bool setNumberOfEntities( DimensionsTraits, const GlobalIndexType size ) + bool setNumberOfEntities( DimensionsTag, const GlobalIndexType size ) { if( ! this->entities.setSize( size ) ) return false; @@ -87,36 +87,36 @@ class tnlMeshStorageLayer< ConfigTag, return true; } - GlobalIndexType getNumberOfEntities( DimensionsTraits ) const + GlobalIndexType getNumberOfEntities( DimensionsTag ) const { return this->entities.getSize(); } - void setEntity( DimensionsTraits, + void setEntity( DimensionsTag, const GlobalIndexType entityIndex, const EntityType& entity ) const { this->entities.setElement( entityIndex, entity ); } - EntityType& getEntity( DimensionsTraits, + EntityType& getEntity( DimensionsTag, const GlobalIndexType entityIndex ) { return this->entities[ entityIndex ]; } - const EntityType& getEntity( DimensionsTraits, + const EntityType& getEntity( DimensionsTag, const GlobalIndexType entityIndex ) const { return this->entities[ entityIndex ]; } - SharedContainerType& getEntities( DimensionsTraits ) + SharedContainerType& getEntities( DimensionsTag ) { return this->sharedEntities; } - const SharedContainerType& getEntities( DimensionsTraits ) const + const SharedContainerType& getEntities( DimensionsTag ) const { return this->sharedEntities; } @@ -126,7 +126,7 @@ class tnlMeshStorageLayer< ConfigTag, if( ! BaseType::save( file ) || ! this->entities.save( file ) ) { - cerr << "Saving of the mesh entities with " << DimensionsTraits::value << " dimensions failed." << endl; + cerr << "Saving of the mesh entities with " << DimensionsTag::value << " dimensions failed." << endl; return false; } return true; @@ -134,11 +134,11 @@ class tnlMeshStorageLayer< ConfigTag, bool load( tnlFile& file ) { - //cout << "Loading mesh layer with dimensions " << DimensionsTraits::value << endl; + //cout << "Loading mesh layer with dimensions " << DimensionsTag::value << endl; if( ! BaseType::load( file ) || ! this->entities.load( file ) ) { - cerr << "Loading of the mesh entities with " << DimensionsTraits::value << " dimensions failed." << endl; + cerr << "Loading of the mesh entities with " << DimensionsTag::value << " dimensions failed." << endl; return false; } this->sharedEntities.bind( this->entities ); @@ -148,7 +148,7 @@ class tnlMeshStorageLayer< ConfigTag, void print( ostream& str ) const { BaseType::print( str ); - str << "The entities with " << DimensionsTraits::value << " dimensions are: " << endl; + str << "The entities with " << DimensionsTag::value << " dimensions are: " << endl; for( GlobalIndexType i = 0; i < entities.getSize();i ++ ) { str << i << " "; @@ -170,24 +170,24 @@ class tnlMeshStorageLayer< ConfigTag, }; template< typename ConfigTag, - typename DimensionsTraits > + typename DimensionsTag > class tnlMeshStorageLayer< ConfigTag, - DimensionsTraits, + DimensionsTag, tnlStorageTraits< false > > : public tnlMeshStorageLayer< ConfigTag, - typename DimensionsTraits::Previous > + typename DimensionsTag::Decrement > { }; template< typename ConfigTag > class tnlMeshStorageLayer< ConfigTag, - tnlDimensionsTraits< 0 >, + tnlDimensionsTag< 0 >, tnlStorageTraits< true > > { - typedef tnlDimensionsTraits< 0 > DimensionsTraits; + typedef tnlDimensionsTag< 0 > DimensionsTag; typedef tnlMeshEntitiesTraits< ConfigTag, - DimensionsTraits > Tag; + DimensionsTag > Tag; typedef typename Tag::ContainerType ContainerType; typedef typename Tag::SharedContainerType SharedContainerType; typedef typename ContainerType::IndexType GlobalIndexType; @@ -198,13 +198,13 @@ class tnlMeshStorageLayer< ConfigTag, tnlMeshStorageLayer() { - this->vertices.setName( tnlString( "tnlMeshStorageLayer < " ) + tnlString( DimensionsTraits::value ) + " >::vertices" ); - this->sharedVertices.setName( tnlString( "tnlMeshStorageLayer < " ) + tnlString( DimensionsTraits::value ) + " >::sharedVertices" ); + this->vertices.setName( tnlString( "tnlMeshStorageLayer < " ) + tnlString( DimensionsTag::value ) + " >::vertices" ); + this->sharedVertices.setName( tnlString( "tnlMeshStorageLayer < " ) + tnlString( DimensionsTag::value ) + " >::sharedVertices" ); } /*~tnlMeshStorageLayer() { - cout << "mesh storage layer: dimensions = " << DimensionsTraits::value << " entities = " << this->vertices.getSize() << endl; + cout << "mesh storage layer: dimensions = " << DimensionsTag::value << " entities = " << this->vertices.getSize() << endl; }*/ @@ -248,43 +248,43 @@ class tnlMeshStorageLayer< ConfigTag, * This is only for the completeness and compatibility * with higher dimensions entities storage layers. */ - bool setNumberOfEntities( DimensionsTraits, + bool setNumberOfEntities( DimensionsTag, const GlobalIndexType size ) { return this->vertices.setSize( size ); } - GlobalIndexType getNumberOfEntities( DimensionsTraits ) const + GlobalIndexType getNumberOfEntities( DimensionsTag ) const { return this->vertices.getSize(); } - void setEntity( DimensionsTraits, + void setEntity( DimensionsTag, const GlobalIndexType entityIndex, const VertexType& entity ) const { this->vertices.setElement( entityIndex, entity ); } - VertexType& getEntity( DimensionsTraits, + VertexType& getEntity( DimensionsTag, const GlobalIndexType entityIndex ) { return this->vertices[ entityIndex ]; } - const VertexType& getEntity( DimensionsTraits, + const VertexType& getEntity( DimensionsTag, const GlobalIndexType entityIndex ) const { return this->vertices.getElement( entityIndex ); } - SharedContainerType& getEntities( DimensionsTraits ) + SharedContainerType& getEntities( DimensionsTag ) { return this->sharedVertices; } - const SharedContainerType& getEntities( DimensionsTraits ) const + const SharedContainerType& getEntities( DimensionsTag ) const { return this->sharedVertices; } @@ -293,7 +293,7 @@ class tnlMeshStorageLayer< ConfigTag, { if( ! this->vertices.save( file ) ) { - cerr << "Saving of the mesh entities with " << DimensionsTraits::value << " dimensions failed." << endl; + cerr << "Saving of the mesh entities with " << DimensionsTag::value << " dimensions failed." << endl; return false; } return true; @@ -303,7 +303,7 @@ class tnlMeshStorageLayer< ConfigTag, { if( ! this->vertices.load( file ) ) { - cerr << "Loading of the mesh entities with " << DimensionsTraits::value << " dimensions failed." << endl; + cerr << "Loading of the mesh entities with " << DimensionsTag::value << " dimensions failed." << endl; return false; } this->sharedVertices.bind( this->vertices ); @@ -336,7 +336,7 @@ class tnlMeshStorageLayer< ConfigTag, */ template< typename ConfigTag > class tnlMeshStorageLayer< ConfigTag, - tnlDimensionsTraits< 0 >, + tnlDimensionsTag< 0 >, tnlStorageTraits< false > > { protected: diff --git a/src/mesh/layers/tnlMeshSubentityStorageLayer.h b/src/mesh/layers/tnlMeshSubentityStorageLayer.h index ce7e54c82e..a8ff2ac889 100644 --- a/src/mesh/layers/tnlMeshSubentityStorageLayer.h +++ b/src/mesh/layers/tnlMeshSubentityStorageLayer.h @@ -19,14 +19,14 @@ #define TNLMESHSUBENTITYSTORAGELAYER_H_ #include <core/tnlFile.h> -#include <mesh/traits/tnlDimensionsTraits.h> +#include <mesh/tnlDimensionsTag.h> #include <mesh/traits/tnlStorageTraits.h> #include <mesh/traits/tnlMeshSubentitiesTraits.h> template< typename ConfigTag, typename EntityTag, typename DimensionTraits, - typename SubentityStorageTag = + typename SubentityStorageTag = typename tnlMeshSubentitiesTraits< ConfigTag, EntityTag, DimensionTraits >::SubentityStorageTag > @@ -38,29 +38,29 @@ template< typename ConfigTag, class tnlMeshSubentityStorageLayers : public tnlMeshSubentityStorageLayer< ConfigTag, EntityTag, - tnlDimensionsTraits< EntityTag::dimensions - 1 > > + tnlDimensionsTag< EntityTag::dimensions - 1 > > { }; template< typename ConfigTag, typename EntityTag, - typename DimensionsTraits > + typename DimensionsTag > class tnlMeshSubentityStorageLayer< ConfigTag, EntityTag, - DimensionsTraits, + DimensionsTag, tnlStorageTraits< true > > : public tnlMeshSubentityStorageLayer< ConfigTag, EntityTag, - typename DimensionsTraits::Previous > + typename DimensionsTag::Decrement > { typedef tnlMeshSubentityStorageLayer< ConfigTag, EntityTag, - typename DimensionsTraits::Previous > BaseType; + typename DimensionsTag::Decrement > BaseType; typedef tnlMeshSubentitiesTraits< ConfigTag, EntityTag, - DimensionsTraits > SubentityTraits; + DimensionsTag > SubentityTraits; protected: @@ -79,7 +79,7 @@ class tnlMeshSubentityStorageLayer< ConfigTag, /*~tnlMeshSubentityStorageLayer() { - cout << " Destroying " << this->sharedSubentitiesIndices.getSize() << " subentities with "<< DimensionsTraits::value << " dimensions." << endl; + cout << " Destroying " << this->sharedSubentitiesIndices.getSize() << " subentities with "<< DimensionsTag::value << " dimensions." << endl; }*/ tnlMeshSubentityStorageLayer& operator = ( const tnlMeshSubentityStorageLayer& layer ) @@ -94,7 +94,7 @@ class tnlMeshSubentityStorageLayer< ConfigTag, if( ! BaseType::save( file ) || ! this->subentitiesIndices.save( file ) ) { - cerr << "Saving of the entity subentities layer with " << DimensionsTraits::value << " failed." << endl; + cerr << "Saving of the entity subentities layer with " << DimensionsTag::value << " failed." << endl; return false; } return true; @@ -105,7 +105,7 @@ class tnlMeshSubentityStorageLayer< ConfigTag, if( ! BaseType::load( file ) || ! this->subentitiesIndices.load( file ) ) { - cerr << "Loading of the entity subentities layer with " << DimensionsTraits::value << " failed." << endl; + cerr << "Loading of the entity subentities layer with " << DimensionsTag::value << " failed." << endl; return false; } this->sharedSubentitiesIndices.bind( this->subentitiesIndices ); @@ -116,7 +116,7 @@ class tnlMeshSubentityStorageLayer< ConfigTag, { BaseType::print( str ); str << endl; - str << "\t Subentities with " << DimensionsTraits::value << " dimensions are: " << subentitiesIndices << "."; + str << "\t Subentities with " << DimensionsTag::value << " dimensions are: " << subentitiesIndices << "."; } bool operator==( const tnlMeshSubentityStorageLayer& layer ) const @@ -135,26 +135,26 @@ class tnlMeshSubentityStorageLayer< ConfigTag, /**** * Define setter/getter for the current level of the subentities */ - void setSubentityIndex( DimensionsTraits, + void setSubentityIndex( DimensionsTag, const LocalIndexType localIndex, const GlobalIndexType globalIndex ) { this->subentitiesIndices[ localIndex ] = globalIndex; } - GlobalIndexType getSubentityIndex( DimensionsTraits, + GlobalIndexType getSubentityIndex( DimensionsTag, const LocalIndexType localIndex ) const { return this->subentitiesIndices[ localIndex ]; } - SharedContainerType& getSubentitiesIndices( DimensionsTraits ) + SharedContainerType& getSubentitiesIndices( DimensionsTag ) { tnlAssert( this->subentitiesIndices.getData() == this->sharedSubentitiesIndices.getData(), ); return this->sharedSubentitiesIndices; } - const SharedContainerType& getSubentitiesIndices( DimensionsTraits ) const + const SharedContainerType& getSubentitiesIndices( DimensionsTag ) const { tnlAssert( this->subentitiesIndices.getData() == this->sharedSubentitiesIndices.getData(), ); return this->sharedSubentitiesIndices; @@ -170,14 +170,14 @@ class tnlMeshSubentityStorageLayer< ConfigTag, template< typename ConfigTag, typename EntityTag, - typename DimensionsTraits > + typename DimensionsTag > class tnlMeshSubentityStorageLayer< ConfigTag, EntityTag, - DimensionsTraits, + DimensionsTag, tnlStorageTraits< false > > : public tnlMeshSubentityStorageLayer< ConfigTag, EntityTag, - typename DimensionsTraits::Previous > + typename DimensionsTag::Decrement > { }; @@ -186,14 +186,14 @@ template< typename ConfigTag, typename EntityTag > class tnlMeshSubentityStorageLayer< ConfigTag, EntityTag, - tnlDimensionsTraits< 0 >, + tnlDimensionsTag< 0 >, tnlStorageTraits< true > > { - typedef tnlDimensionsTraits< 0 > DimensionsTraits; + typedef tnlDimensionsTag< 0 > DimensionsTag; typedef tnlMeshSubentitiesTraits< ConfigTag, EntityTag, - DimensionsTraits > SubentityTraits; + DimensionsTag > SubentityTraits; protected: @@ -210,7 +210,7 @@ class tnlMeshSubentityStorageLayer< ConfigTag, /*~tnlMeshSubentityStorageLayer() { - cout << " Destroying " << this->sharedVerticesIndices.getSize() << " subentities with "<< DimensionsTraits::value << " dimensions." << endl; + cout << " Destroying " << this->sharedVerticesIndices.getSize() << " subentities with "<< DimensionsTag::value << " dimensions." << endl; }*/ @@ -224,7 +224,7 @@ class tnlMeshSubentityStorageLayer< ConfigTag, { if( ! this->verticesIndices.save( file ) ) { - cerr << "Saving of the entity subentities layer with " << DimensionsTraits::value << " failed." << endl; + cerr << "Saving of the entity subentities layer with " << DimensionsTag::value << " failed." << endl; return false; } return true; @@ -234,7 +234,7 @@ class tnlMeshSubentityStorageLayer< ConfigTag, { if( ! this->verticesIndices.load( file ) ) { - cerr << "Loading of the entity subentities layer with " << DimensionsTraits::value << " failed." << endl; + cerr << "Loading of the entity subentities layer with " << DimensionsTag::value << " failed." << endl; return false; } this->sharedVerticesIndices.bind( this->verticesIndices ); @@ -243,7 +243,7 @@ class tnlMeshSubentityStorageLayer< ConfigTag, void print( ostream& str ) const { - str << "\t Subentities with " << DimensionsTraits::value << " dimensions are: " << this->verticesIndices << "."; + str << "\t Subentities with " << DimensionsTag::value << " dimensions are: " << this->verticesIndices << "."; } bool operator==( const tnlMeshSubentityStorageLayer& layer ) const @@ -251,25 +251,25 @@ class tnlMeshSubentityStorageLayer< ConfigTag, return ( verticesIndices == layer.verticesIndices ); } - GlobalIndexType getSubentityIndex( DimensionsTraits, + GlobalIndexType getSubentityIndex( DimensionsTag, const LocalIndexType localIndex ) const { return this->verticesIndices[ localIndex ]; } - void setSubentityIndex( DimensionsTraits, + void setSubentityIndex( DimensionsTag, const LocalIndexType localIndex, const GlobalIndexType globalIndex ) { this->verticesIndices[ localIndex ] = globalIndex; } - SharedContainerType& getSubentitiesIndices( DimensionsTraits ) + SharedContainerType& getSubentitiesIndices( DimensionsTag ) { tnlAssert( this->verticesIndices.getData() == this->sharedVerticesIndices.getData(), ); return this->sharedVerticesIndices; } - const SharedContainerType& getSubentitiesIndices( DimensionsTraits ) const + const SharedContainerType& getSubentitiesIndices( DimensionsTag ) const { tnlAssert( this->verticesIndices.getData() == this->sharedVerticesIndices.getData(), ); return this->sharedVerticesIndices; @@ -286,7 +286,7 @@ template< typename ConfigTag, typename EntityTag > class tnlMeshSubentityStorageLayer< ConfigTag, EntityTag, - tnlDimensionsTraits< 0 >, + tnlDimensionsTag< 0 >, tnlStorageTraits< false > > { public: diff --git a/src/mesh/layers/tnlMeshSuperentityStorageLayer.h b/src/mesh/layers/tnlMeshSuperentityStorageLayer.h index d7184117c9..7a9046a4af 100644 --- a/src/mesh/layers/tnlMeshSuperentityStorageLayer.h +++ b/src/mesh/layers/tnlMeshSuperentityStorageLayer.h @@ -19,18 +19,18 @@ #define TNLMESHSUPERENTITYSTORAGELAYER_H_ #include <core/tnlFile.h> -#include <mesh/traits/tnlDimensionsTraits.h> +#include <mesh/tnlDimensionsTag.h> #include <mesh/traits/tnlStorageTraits.h> #include <mesh/traits/tnlMeshTraits.h> #include <mesh/traits/tnlMeshSuperentitiesTraits.h> template< typename ConfigTag, typename EntityTag, - typename DimensionsTraits, + typename DimensionsTag, typename SuperentityStorageTag = typename tnlMeshSuperentitiesTraits< ConfigTag, EntityTag, - DimensionsTraits >::SuperentityStorageTag > + DimensionsTag >::SuperentityStorageTag > class tnlMeshSuperentityStorageLayer; template< typename ConfigTag, @@ -38,28 +38,28 @@ template< typename ConfigTag, class tnlMeshSuperentityStorageLayers : public tnlMeshSuperentityStorageLayer< ConfigTag, EntityTag, - typename tnlMeshTraits< ConfigTag >::DimensionsTraits > + typename tnlMeshTraits< ConfigTag >::DimensionsTag > { }; template< typename ConfigTag, typename EntityTag, - typename DimensionsTraits > + typename DimensionsTag > class tnlMeshSuperentityStorageLayer< ConfigTag, EntityTag, - DimensionsTraits, + DimensionsTag, tnlStorageTraits< true > > : public tnlMeshSuperentityStorageLayer< ConfigTag, EntityTag, - typename DimensionsTraits::Previous > + typename DimensionsTag::Decrement > { typedef tnlMeshSuperentityStorageLayer< ConfigTag, EntityTag, - typename DimensionsTraits::Previous > BaseType; + typename DimensionsTag::Decrement > BaseType; typedef - tnlMeshSuperentitiesTraits< ConfigTag, EntityTag, DimensionsTraits > SuperentityTag; + tnlMeshSuperentitiesTraits< ConfigTag, EntityTag, DimensionsTag > SuperentityTag; protected: @@ -79,13 +79,13 @@ class tnlMeshSuperentityStorageLayer< ConfigTag, tnlMeshSuperentityStorageLayer() { - this->superentitiesIndices.setName( tnlString( "tnlMeshSuperentityStorageLayer < " ) + tnlString( DimensionsTraits::value ) + " >::superentitiesIndices" ); - this->sharedSuperentitiesIndices.setName( tnlString( "tnlMeshSuperentityStorageLayer < " ) + tnlString( DimensionsTraits::value ) + " >::sharedSuperentitiesIndices" ); + this->superentitiesIndices.setName( tnlString( "tnlMeshSuperentityStorageLayer < " ) + tnlString( DimensionsTag::value ) + " >::superentitiesIndices" ); + this->sharedSuperentitiesIndices.setName( tnlString( "tnlMeshSuperentityStorageLayer < " ) + tnlString( DimensionsTag::value ) + " >::sharedSuperentitiesIndices" ); } /*~tnlMeshSuperentityStorageLayer() { - cerr << " Destroying " << this->superentitiesIndices.getSize() << " superentities with "<< DimensionsTraits::value << " dimensions." << endl; + cerr << " Destroying " << this->superentitiesIndices.getSize() << " superentities with "<< DimensionsTag::value << " dimensions." << endl; cerr << " this->superentitiesIndices.getName() = " << this->superentitiesIndices.getName() << endl; cerr << " this->sharedSuperentitiesIndices.getName() = " << this->sharedSuperentitiesIndices.getName() << endl; }*/ @@ -101,7 +101,7 @@ class tnlMeshSuperentityStorageLayer< ConfigTag, /**** * Define setter/getter for the current level of the superentities */ - bool setNumberOfSuperentities( DimensionsTraits, + bool setNumberOfSuperentities( DimensionsTag, const LocalIndexType size ) { if( ! this->superentitiesIndices.setSize( size ) ) @@ -111,30 +111,30 @@ class tnlMeshSuperentityStorageLayer< ConfigTag, return true; } - LocalIndexType getNumberOfSuperentities( DimensionsTraits ) const + LocalIndexType getNumberOfSuperentities( DimensionsTag ) const { return this->superentitiesIndices.getSize(); } - void setSuperentityIndex( DimensionsTraits, + void setSuperentityIndex( DimensionsTag, const LocalIndexType localIndex, const GlobalIndexType globalIndex ) { this->superentitiesIndices[ localIndex ] = globalIndex; } - GlobalIndexType getSuperentityIndex( DimensionsTraits, + GlobalIndexType getSuperentityIndex( DimensionsTag, const LocalIndexType localIndex ) const { return this->superentitiesIndices[ localIndex ]; } - SharedContainerType& getSuperentitiesIndices( DimensionsTraits ) + SharedContainerType& getSuperentitiesIndices( DimensionsTag ) { return this->sharedSuperentitiesIndices; } - const SharedContainerType& getSuperentitiesIndices( DimensionsTraits ) const + const SharedContainerType& getSuperentitiesIndices( DimensionsTag ) const { return this->sharedSuperentitiesIndices; } @@ -144,7 +144,7 @@ class tnlMeshSuperentityStorageLayer< ConfigTag, if( ! BaseType::save( file ) || ! this->superentitiesIndices.save( file ) ) { - //cerr << "Saving of the entity superentities layer with " << DimensionsTraits::value << " failed." << endl; + //cerr << "Saving of the entity superentities layer with " << DimensionsTag::value << " failed." << endl; return false; } return true; @@ -155,7 +155,7 @@ class tnlMeshSuperentityStorageLayer< ConfigTag, if( ! BaseType::load( file ) || ! this->superentitiesIndices.load( file ) ) { - //cerr << "Loading of the entity superentities layer with " << DimensionsTraits::value << " failed." << endl; + //cerr << "Loading of the entity superentities layer with " << DimensionsTag::value << " failed." << endl; return false; } return true; @@ -164,7 +164,7 @@ class tnlMeshSuperentityStorageLayer< ConfigTag, void print( ostream& str ) const { BaseType::print( str ); - str << endl << "\t Superentities with " << DimensionsTraits::value << " dimensions are: " << this->superentitiesIndices << "."; + str << endl << "\t Superentities with " << DimensionsTag::value << " dimensions are: " << this->superentitiesIndices << "."; } bool operator==( const tnlMeshSuperentityStorageLayer& layer ) const @@ -182,14 +182,14 @@ class tnlMeshSuperentityStorageLayer< ConfigTag, template< typename ConfigTag, typename EntityTag, - typename DimensionsTraits > + typename DimensionsTag > class tnlMeshSuperentityStorageLayer< ConfigTag, EntityTag, - DimensionsTraits, + DimensionsTag, tnlStorageTraits< false > > : public tnlMeshSuperentityStorageLayer< ConfigTag, EntityTag, - typename DimensionsTraits::Previous > + typename DimensionsTag::Decrement > { public: @@ -199,18 +199,18 @@ template< typename ConfigTag, typename EntityTag > class tnlMeshSuperentityStorageLayer< ConfigTag, EntityTag, - tnlDimensionsTraits< EntityTag::dimensions >, + tnlDimensionsTag< EntityTag::dimensions >, tnlStorageTraits< false > > { - typedef tnlDimensionsTraits< EntityTag::dimensions > DimensionsTraits; + typedef tnlDimensionsTag< EntityTag::dimensions > DimensionsTag; typedef tnlMeshSuperentitiesTraits< ConfigTag, EntityTag, - DimensionsTraits > SuperentityTag; + DimensionsTag > SuperentityTag; typedef tnlMeshSuperentityStorageLayer< ConfigTag, EntityTag, - DimensionsTraits, + DimensionsTag, tnlStorageTraits< false > > ThisType; protected: @@ -222,12 +222,12 @@ class tnlMeshSuperentityStorageLayer< ConfigTag, /**** * These methods are due to 'using BaseType::...;' in the derived classes. */ - bool setNumberOfSuperentities( DimensionsTraits, + bool setNumberOfSuperentities( DimensionsTag, const LocalIndexType size ); - LocalIndexType getNumberOfSuperentities( DimensionsTraits ) const; - GlobalIndexType getSuperentityIndex( DimensionsTraits, + LocalIndexType getNumberOfSuperentities( DimensionsTag ) const; + GlobalIndexType getSuperentityIndex( DimensionsTag, const LocalIndexType localIndex ){} - void setSuperentityIndex( DimensionsTraits, + void setSuperentityIndex( DimensionsTag, const LocalIndexType localIndex, const GlobalIndexType globalIndex ) {} @@ -258,17 +258,17 @@ template< typename ConfigTag, typename EntityTag > class tnlMeshSuperentityStorageLayer< ConfigTag, EntityTag, - tnlDimensionsTraits< EntityTag::dimensions >, + tnlDimensionsTag< EntityTag::dimensions >, tnlStorageTraits< true > > { - typedef tnlDimensionsTraits< EntityTag::dimensions > DimensionsTraits; + typedef tnlDimensionsTag< EntityTag::dimensions > DimensionsTag; typedef tnlMeshSuperentitiesTraits< ConfigTag, EntityTag, - DimensionsTraits > SuperentityTag; + DimensionsTag > SuperentityTag; typedef tnlMeshSuperentityStorageLayer< ConfigTag, EntityTag, - DimensionsTraits, + DimensionsTag, tnlStorageTraits< true > > ThisType; protected: @@ -280,12 +280,12 @@ class tnlMeshSuperentityStorageLayer< ConfigTag, /**** * These methods are due to 'using BaseType::...;' in the derived classes. */ - bool setNumberOfSuperentities( DimensionsTraits, + bool setNumberOfSuperentities( DimensionsTag, const LocalIndexType size ); - LocalIndexType getNumberOfSuperentities( DimensionsTraits ) const; - GlobalIndexType getSuperentityIndex( DimensionsTraits, + LocalIndexType getNumberOfSuperentities( DimensionsTag ) const; + GlobalIndexType getSuperentityIndex( DimensionsTag, const LocalIndexType localIndex ){} - void setSuperentityIndex( DimensionsTraits, + void setSuperentityIndex( DimensionsTag, const LocalIndexType localIndex, const GlobalIndexType globalIndex ) {} diff --git a/src/mesh/traits/tnlDimensionsTraits.h b/src/mesh/tnlDimensionsTag.h similarity index 71% rename from src/mesh/traits/tnlDimensionsTraits.h rename to src/mesh/tnlDimensionsTag.h index 25bfbc5db6..852c0f6ae9 100644 --- a/src/mesh/traits/tnlDimensionsTraits.h +++ b/src/mesh/tnlDimensionsTag.h @@ -1,5 +1,5 @@ /*************************************************************************** - tnlDimensionsTraits.h - description + tnlDimensionsTag.h - description ------------------- begin : Feb 11, 2014 copyright : (C) 2014 by Tomas Oberhuber @@ -15,28 +15,29 @@ * * ***************************************************************************/ -#ifndef TNLDIMENSIONSTRAITS_H_ -#define TNLDIMENSIONSTRAITS_H_ +#ifndef TNLDIMENSIONSTAG_H_ +#define TNLDIMENSIONSTAG_H_ #include <core/tnlAssert.h> template< int Dimensions > -class tnlDimensionsTraits +class tnlDimensionsTag { public: - enum { value = Dimensions }; + static const int value = Dimensions; - typedef tnlDimensionsTraits< Dimensions - 1 > Previous; + typedef tnlDimensionsTag< Dimensions - 1 > Decrement; - tnlStaticAssert( value >= 0, "The value of the dimensions cannot be negative." ); + tnlStaticAssert( value >= 0, "The value of the dimensions cannot be negative." ); }; template<> -class tnlDimensionsTraits< 0 > +class tnlDimensionsTag< 0 > { public: - enum { value = 0 }; + + static const int value = 0; }; -#endif /* TNLDIMENSIONSTRAITS_H_ */ +#endif /* TNLDIMENSIONSTAG_H_ */ diff --git a/src/mesh/tnlMesh.h b/src/mesh/tnlMesh.h index 6455c7d03e..449fc8f24a 100644 --- a/src/mesh/tnlMesh.h +++ b/src/mesh/tnlMesh.h @@ -21,17 +21,18 @@ #include <core/tnlObject.h> #include <mesh/tnlMeshEntity.h> #include <mesh/layers/tnlMeshStorageLayer.h> +#include <mesh/config/tnlMeshConfigValidator.h> -template< typename ConfigTag > +template< typename MeshConfig > class tnlMesh : public tnlObject, - public tnlMeshStorageLayers< ConfigTag > + public tnlMeshStorageLayers< MeshConfig > { - typedef tnlMeshStorageLayers< ConfigTag > BaseType; + typedef tnlMeshStorageLayers< MeshConfig > BaseType; public: - typedef ConfigTag Config; - typedef typename tnlMeshTraits< ConfigTag >::PointType PointType; - enum { dimensions = tnlMeshTraits< ConfigTag >::meshDimensions }; + typedef MeshConfig Config; + typedef typename tnlMeshTraits< MeshConfig >::PointType PointType; + enum { dimensions = tnlMeshTraits< MeshConfig >::meshDimensions }; /*~tnlMesh() { @@ -40,7 +41,7 @@ class tnlMesh : public tnlObject, static tnlString getType() { - return tnlString( "tnlMesh< ") + ConfigTag::getType() + " >"; + return tnlString( "tnlMesh< ") + MeshConfig::getType() + " >"; } virtual tnlString getTypeVirtual() const @@ -76,15 +77,16 @@ class tnlMesh : public tnlObject, template< int Dimensions > struct EntitiesTraits { - typedef tnlDimensionsTraits< Dimensions > DimensionsTraits; - typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits > MeshEntitiesTraits; + typedef tnlDimensionsTag< Dimensions > DimensionsTag; + typedef tnlMeshEntitiesTraits< MeshConfig, DimensionsTag > MeshEntitiesTraits; typedef typename MeshEntitiesTraits::Type Type; typedef typename MeshEntitiesTraits::ContainerType ContainerType; typedef typename MeshEntitiesTraits::SharedContainerType SharedContainerType; typedef typename ContainerType::IndexType GlobalIndexType; typedef typename ContainerType::ElementType EntityType; - enum { available = tnlMeshEntityStorage< ConfigTag, Dimensions >::enabled }; + static const bool available = MeshConfig::entityStorage( Dimensions ); }; + typedef EntitiesTraits< dimensions > CellTraits; using BaseType::setNumberOfVertices; using BaseType::getNumberOfVertices; @@ -100,74 +102,74 @@ class tnlMesh : public tnlObject, template< int Dimensions > bool setNumberOfEntities( typename EntitiesTraits< Dimensions >::GlobalIndexType size ) { - return BaseType::setNumberOfEntities( tnlDimensionsTraits< Dimensions >(), size ); + return BaseType::setNumberOfEntities( tnlDimensionsTag< Dimensions >(), size ); } template< int Dimensions > typename EntitiesTraits< Dimensions >::GlobalIndexType getNumberOfEntities() const { - return BaseType::getNumberOfEntities( tnlDimensionsTraits< Dimensions >() ); + return BaseType::getNumberOfEntities( tnlDimensionsTag< Dimensions >() ); } bool setNumberOfCells( typename EntitiesTraits< dimensions >::GlobalIndexType size ) { - return BaseType::setNumberOfEntities( tnlDimensionsTraits< dimensions >(), size ); + return BaseType::setNumberOfEntities( tnlDimensionsTag< dimensions >(), size ); } typename EntitiesTraits< dimensions >::GlobalIndexType getNumberOfCells() const { - return BaseType::getNumberOfEntities( tnlDimensionsTraits< dimensions >() ); + return BaseType::getNumberOfEntities( tnlDimensionsTag< dimensions >() ); } template< int Dimensions > typename EntitiesTraits< Dimensions >::EntityType& getEntity( const typename EntitiesTraits< Dimensions >::GlobalIndexType entityIndex ) { - return BaseType::getEntity( tnlDimensionsTraits< Dimensions >(), entityIndex ); + return BaseType::getEntity( tnlDimensionsTag< Dimensions >(), entityIndex ); } template< int Dimensions > const typename EntitiesTraits< Dimensions >::EntityType& getEntity( const typename EntitiesTraits< Dimensions >::GlobalIndexType entityIndex ) const { - return BaseType::getEntity( tnlDimensionsTraits< Dimensions >(), entityIndex ); + return BaseType::getEntity( tnlDimensionsTag< Dimensions >(), entityIndex ); } template< int Dimensions > void setEntity( const typename EntitiesTraits< Dimensions >::GlobalIndexType entityIndex, const typename EntitiesTraits< Dimensions >::EntityType& entity ) { - BaseType::setEntity( tnlDimensionsTraits< Dimensions >(), entityIndex, entity ); + BaseType::setEntity( tnlDimensionsTag< Dimensions >(), entityIndex, entity ); } template< int Dimensions > typename EntitiesTraits< Dimensions >::SharedContainerType& getEntities() { - return BaseType::getEntities( tnlDimensionsTraits< Dimensions >() ); + return BaseType::getEntities( tnlDimensionsTag< Dimensions >() ); } template< int Dimensions > const typename EntitiesTraits< Dimensions >::SharedContainerType& getEntities() const { - return BaseType::getEntities( tnlDimensionsTraits< Dimensions >() ); + return BaseType::getEntities( tnlDimensionsTag< Dimensions >() ); } typename EntitiesTraits< dimensions >::EntityType& getCell( const typename EntitiesTraits< dimensions >::GlobalIndexType entityIndex ) { - return BaseType::getEntity( tnlDimensionsTraits< dimensions >(), entityIndex ); + return BaseType::getEntity( tnlDimensionsTag< dimensions >(), entityIndex ); } const typename EntitiesTraits< dimensions >::EntityType& getCell( const typename EntitiesTraits< dimensions >::GlobalIndexType entityIndex ) const { - return BaseType::getEntity( tnlDimensionsTraits< dimensions >(), entityIndex ); + return BaseType::getEntity( tnlDimensionsTag< dimensions >(), entityIndex ); } void setCell( const typename EntitiesTraits< dimensions >::GlobalIndexType entityIndex, const typename EntitiesTraits< dimensions >::EntityType& entity ) { - BaseType::setEntity( tnlDimensionsTraits< dimensions >(), entityIndex, entity ); + BaseType::setEntity( tnlDimensionsTag< dimensions >(), entityIndex, entity ); } void print( ostream& str ) const @@ -184,9 +186,7 @@ class tnlMesh : public tnlObject, void init(); - tnlStaticAssert( dimensions > 0, "The mesh dimesnions must be greater than 0." ); - tnlStaticAssert( EntitiesTraits< 0 >::available, "Vertices must always be stored" ); - tnlStaticAssert( EntitiesTraits< dimensions >::available, "Cells must always be stored" ); + tnlMeshConfigValidator< MeshConfig > configValidator; }; diff --git a/src/mesh/tnlMeshEntity.h b/src/mesh/tnlMeshEntity.h index 5abc50fb81..6a42ce9c6b 100644 --- a/src/mesh/tnlMeshEntity.h +++ b/src/mesh/tnlMeshEntity.h @@ -22,7 +22,7 @@ #include <core/tnlDynamicTypeTag.h> #include <mesh/tnlMeshEntityId.h> #include <mesh/traits/tnlMeshTraits.h> -#include <mesh/traits/tnlDimensionsTraits.h> +#include <mesh/tnlDimensionsTag.h> #include <mesh/topologies/tnlMeshVertexTag.h> #include <mesh/layers/tnlMeshSubentityStorageLayer.h> #include <mesh/layers/tnlMeshSuperentityStorageLayer.h> @@ -105,10 +105,11 @@ class tnlMeshEntity template< int Dimensions > struct SubentitiesTraits { - typedef tnlDimensionsTraits< Dimensions > DimensionsTraits; + static_assert( Dimensions < meshDimensions, "Asking for subentities with more or the same number of dimensions then the mesh itself." ); + typedef tnlDimensionsTag< Dimensions > DimensionsTag; typedef tnlMeshSubentitiesTraits< ConfigTag, EntityTag, - DimensionsTraits > SubentityTraits; + DimensionsTag > SubentityTraits; typedef typename SubentityTraits::ContainerType ContainerType; typedef typename SubentityTraits::SharedContainerType SharedContainerType; typedef typename ContainerType::ElementType GlobalIndexType; @@ -116,9 +117,10 @@ class tnlMeshEntity // TODO: make this as: // typedef typename Type::IndexType LocalIndexType - enum { available = tnlMeshSubentityStorage< ConfigTag, + /*enum { available = tnlMeshSubentityStorage< ConfigTag, EntityTag, - Dimensions >::enabled }; + Dimensions >::enabled };*/ + static const bool available = ConfigTag::template subentityStorage( EntityTag(), Dimensions ); enum { subentitiesCount = SubentityTraits::count }; }; @@ -138,13 +140,14 @@ class tnlMeshEntity void setSubentityIndex( const typename SubentitiesTraits< Dimensions >::LocalIndexType localIndex, const typename SubentitiesTraits< Dimensions >::GlobalIndexType globalIndex ) { + static_assert( SubentitiesTraits< Dimensions >::available, "You try to set subentity which is not configured for storage." ); tnlAssert( 0 <= localIndex && localIndex < SubentitiesTraits< Dimensions >::subentitiesCount, cerr << "localIndex = " << localIndex << " subentitiesCount = " << SubentitiesTraits< Dimensions >::subentitiesCount ); typedef tnlMeshSubentityStorageLayers< ConfigTag, EntityTag > SubentityBaseType; - SubentityBaseType::setSubentityIndex( tnlDimensionsTraits< Dimensions >(), + SubentityBaseType::setSubentityIndex( tnlDimensionsTag< Dimensions >(), localIndex, globalIndex ); } @@ -153,13 +156,14 @@ class tnlMeshEntity typename SubentitiesTraits< Dimensions >::GlobalIndexType getSubentityIndex( const typename SubentitiesTraits< Dimensions >::LocalIndexType localIndex) const { + static_assert( SubentitiesTraits< Dimensions >::available, "You try to get subentity which is not configured for storage." ); tnlAssert( 0 <= localIndex && localIndex < SubentitiesTraits< Dimensions >::subentitiesCount, cerr << "localIndex = " << localIndex << " subentitiesCount = " << SubentitiesTraits< Dimensions >::subentitiesCount ); typedef tnlMeshSubentityStorageLayers< ConfigTag, EntityTag > SubentityBaseType; - return SubentityBaseType::getSubentityIndex( tnlDimensionsTraits< Dimensions >(), + return SubentityBaseType::getSubentityIndex( tnlDimensionsTag< Dimensions >(), localIndex ); } @@ -167,16 +171,18 @@ class tnlMeshEntity typename SubentitiesTraits< Dimensions >::SharedContainerType& getSubentitiesIndices() { + static_assert( SubentitiesTraits< Dimensions >::available, "You try to get subentities which are not configured for storage." ); typedef tnlMeshSubentityStorageLayers< ConfigTag, EntityTag > SubentityBaseType; - return SubentityBaseType::getSubentitiesIndices( tnlDimensionsTraits< Dimensions >() ); + return SubentityBaseType::getSubentitiesIndices( tnlDimensionsTag< Dimensions >() ); } template< int Dimensions > const typename SubentitiesTraits< Dimensions >::SharedContainerType& getSubentitiesIndices() const { + static_assert( SubentitiesTraits< Dimensions >::available, "You try to set subentities which are not configured for storage." ); typedef tnlMeshSubentityStorageLayers< ConfigTag, EntityTag > SubentityBaseType; - return SubentityBaseType::getSubentitiesIndices( tnlDimensionsTraits< Dimensions >() ); + return SubentityBaseType::getSubentitiesIndices( tnlDimensionsTag< Dimensions >() ); } /**** @@ -185,47 +191,52 @@ class tnlMeshEntity template< int Dimensions > struct SuperentitiesTraits { - typedef tnlDimensionsTraits< Dimensions > DimensionsTraits; + static_assert( Dimensions <= meshDimensions, "Asking for subentities with more dimensions then the mesh itself." ); + typedef tnlDimensionsTag< Dimensions > DimensionsTag; typedef tnlMeshSuperentitiesTraits< ConfigTag, EntityTag, - DimensionsTraits > SuperentityTraits; + DimensionsTag > SuperentityTraits; typedef typename SuperentityTraits::ContainerType ContainerType; typedef typename SuperentityTraits::SharedContainerType SharedContainerType; typedef typename ContainerType::ElementType GlobalIndexType; typedef int LocalIndexType; // TODO: make this as: // typedef typename Type::IndexType LocalIndexType - enum { available = tnlMeshSuperentityStorage< ConfigTag, + /*enum { available = tnlMeshSuperentityStorage< ConfigTag, EntityTag, - Dimensions >::enabled }; + Dimensions >::enabled };*/ + static const bool available = ConfigTag::template superentityStorage( EntityTag(), Dimensions ); }; template< int Dimensions > bool setNumberOfSuperentities( const typename SuperentitiesTraits< Dimensions >::LocalIndexType size ) { + static_assert( SuperentitiesTraits< Dimensions >::available, "You try to set number of superentities which are not configured for storage." ); tnlAssert( size >= 0, cerr << "size = " << size << endl; ); typedef tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag > SuperentityBaseType; - return SuperentityBaseType::setNumberOfSuperentities( tnlDimensionsTraits< Dimensions >(), + return SuperentityBaseType::setNumberOfSuperentities( tnlDimensionsTag< Dimensions >(), size ); } template< int Dimensions > typename SuperentitiesTraits< Dimensions >::LocalIndexType getNumberOfSuperentities() const { + static_assert( SuperentitiesTraits< Dimensions >::available, "You try to get number of superentities which are not configured for storage." ); typedef tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag > SuperentityBaseType; - return SuperentityBaseType::getNumberOfSuperentities( tnlDimensionsTraits< Dimensions >() ); + return SuperentityBaseType::getNumberOfSuperentities( tnlDimensionsTag< Dimensions >() ); } template< int Dimensions > void setSuperentityIndex( const typename SuperentitiesTraits< Dimensions >::LocalIndexType localIndex, const typename SuperentitiesTraits< Dimensions >::GlobalIndexType globalIndex ) { + static_assert( SuperentitiesTraits< Dimensions >::available, "You try to set superentity which is not configured for storage." ); tnlAssert( localIndex < this->getNumberOfSuperentities< Dimensions >(), cerr << " localIndex = " << localIndex << " this->getNumberOfSuperentities< Dimensions >() = " << this->getNumberOfSuperentities< Dimensions >() << endl; ); typedef tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag > SuperentityBaseType; - SuperentityBaseType::setSuperentityIndex( tnlDimensionsTraits< Dimensions >(), + SuperentityBaseType::setSuperentityIndex( tnlDimensionsTag< Dimensions >(), localIndex, globalIndex ); } @@ -234,26 +245,29 @@ class tnlMeshEntity typename SuperentitiesTraits< Dimensions >::GlobalIndexType getSuperentityIndex( const typename SuperentitiesTraits< Dimensions >::LocalIndexType localIndex ) const { + static_assert( SuperentitiesTraits< Dimensions >::available, "You try to get superentity which is not configured for storage." ); tnlAssert( localIndex < this->getNumberOfSuperentities< Dimensions >(), cerr << " localIndex = " << localIndex << " this->getNumberOfSuperentities< Dimensions >() = " << this->getNumberOfSuperentities< Dimensions >() << endl; ); typedef tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag > SuperentityBaseType; - return SuperentityBaseType::getSuperentityIndex( tnlDimensionsTraits< Dimensions >(), + return SuperentityBaseType::getSuperentityIndex( tnlDimensionsTag< Dimensions >(), localIndex ); } template< int Dimensions > typename SuperentitiesTraits< Dimensions >::SharedContainerType& getSuperentitiesIndices() { + static_assert( SuperentitiesTraits< Dimensions >::available, "You try to get superentities which are not configured for storage." ); typedef tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag > SuperentityBaseType; - return SuperentityBaseType::getSuperentitiesIndices( tnlDimensionsTraits< Dimensions >() ); + return SuperentityBaseType::getSuperentitiesIndices( tnlDimensionsTag< Dimensions >() ); } template< int Dimensions > const typename SuperentitiesTraits< Dimensions >::SharedContainerType& getSuperentitiesIndices() const { + static_assert( SuperentitiesTraits< Dimensions >::available, "You try to get superentities which are not configured for storage." ); typedef tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag > SuperentityBaseType; - return SuperentityBaseType::getSubentitiesIndices( tnlDimensionsTraits< Dimensions >() ); + return SuperentityBaseType::getSubentitiesIndices( tnlDimensionsTag< Dimensions >() ); } /**** @@ -370,19 +384,20 @@ class tnlMeshEntity< ConfigTag, tnlMeshVertexTag > template< int Dimensions > struct SuperentitiesTraits { - typedef tnlDimensionsTraits< Dimensions > DimensionsTraits; + typedef tnlDimensionsTag< Dimensions > DimensionsTag; typedef tnlMeshSuperentitiesTraits< ConfigTag, tnlMeshVertexTag, - DimensionsTraits > SuperentityTraits; + DimensionsTag > SuperentityTraits; typedef typename SuperentityTraits::ContainerType ContainerType; typedef typename SuperentityTraits::SharedContainerType SharedContainerType; typedef typename ContainerType::ElementType GlobalIndexType; typedef int LocalIndexType; // TODO: make this as: // typedef typename Type::IndexType LocalIndexType - enum { available = tnlMeshSuperentityStorage< ConfigTag, + /*enum { available = tnlMeshSuperentityStorage< ConfigTag, tnlMeshVertexTag, - Dimensions >::enabled }; + Dimensions >::enabled };*/ + static const bool available = ConfigTag::template superentityStorage< tnlMeshVertexTag >( Dimensions ); }; template< int Dimensions > bool setNumberOfSuperentities( const typename SuperentitiesTraits< Dimensions >::LocalIndexType size ) @@ -390,7 +405,7 @@ class tnlMeshEntity< ConfigTag, tnlMeshVertexTag > tnlAssert( size >= 0, cerr << "size = " << size << endl; ); typedef tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag > SuperentityBaseType; - return SuperentityBaseType::setNumberOfSuperentities( tnlDimensionsTraits< Dimensions >(), + return SuperentityBaseType::setNumberOfSuperentities( tnlDimensionsTag< Dimensions >(), size ); } @@ -398,21 +413,21 @@ class tnlMeshEntity< ConfigTag, tnlMeshVertexTag > typename SuperentitiesTraits< Dimensions >::LocalIndexType getNumberOfSuperentities() const { typedef tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag > SuperentityBaseType; - return SuperentityBaseType::getNumberOfSuperentities( tnlDimensionsTraits< Dimensions >() ); + return SuperentityBaseType::getNumberOfSuperentities( tnlDimensionsTag< Dimensions >() ); } template< int Dimensions > typename SuperentitiesTraits< Dimensions >::SharedContainerType& getSuperentitiesIndices() { typedef tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag > SuperentityBaseType; - return SuperentityBaseType::getSuperentitiesIndices( tnlDimensionsTraits< Dimensions >() ); + return SuperentityBaseType::getSuperentitiesIndices( tnlDimensionsTag< Dimensions >() ); } template< int Dimensions > const typename SuperentitiesTraits< Dimensions >::SharedContainerType& getSuperentitiesIndeces() const { typedef tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag > SuperentityBaseType; - return SuperentityBaseType::getSubentitiesIndices( tnlDimensionsTraits< Dimensions >() ); + return SuperentityBaseType::getSubentitiesIndices( tnlDimensionsTag< Dimensions >() ); } template< int Dimensions > @@ -423,7 +438,7 @@ class tnlMeshEntity< ConfigTag, tnlMeshVertexTag > cerr << " localIndex = " << localIndex << " this->getNumberOfSuperentities< Dimensions >() = " << this->getNumberOfSuperentities< Dimensions >() << endl; ); typedef tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag > SuperentityBaseType; - SuperentityBaseType::setSuperentityIndex( tnlDimensionsTraits< Dimensions >(), + SuperentityBaseType::setSuperentityIndex( tnlDimensionsTag< Dimensions >(), localIndex, globalIndex ); } @@ -436,7 +451,7 @@ class tnlMeshEntity< ConfigTag, tnlMeshVertexTag > cerr << " localIndex = " << localIndex << " this->getNumberOfSuperentities< Dimensions >() = " << this->getNumberOfSuperentities< Dimensions >() << endl; ); typedef tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag > SuperentityBaseType; - return SuperentityBaseType::getSuperentityIndex( tnlDimensionsTraits< Dimensions >(), + return SuperentityBaseType::getSuperentityIndex( tnlDimensionsTag< Dimensions >(), localIndex ); } diff --git a/src/mesh/tnlMeshEntityInitializer.h b/src/mesh/tnlMeshEntityInitializer.h index 9647efd67c..4e3daa5f96 100644 --- a/src/mesh/tnlMeshEntityInitializer.h +++ b/src/mesh/tnlMeshEntityInitializer.h @@ -26,15 +26,15 @@ class tnlMeshInitializer; template<typename ConfigTag, typename EntityTag, - typename DimensionsTraits, + typename DimensionsTag, typename SubentityStorageTag = typename tnlMeshSubentitiesTraits< ConfigTag, EntityTag, - DimensionsTraits >::SubentityStorageTag, + DimensionsTag >::SubentityStorageTag, typename SuperentityStorageTag = typename tnlMeshSuperentitiesTraits< ConfigTag, typename tnlMeshSubentitiesTraits< ConfigTag, EntityTag, - DimensionsTraits >::SubentityTag, - tnlDimensionsTraits< EntityTag::dimensions > >::SuperentityStorageTag > + DimensionsTag >::SubentityTag, + tnlDimensionsTag< EntityTag::dimensions > >::SuperentityStorageTag > class tnlMeshEntityInitializerLayer; template< typename ConfigTag, @@ -42,29 +42,29 @@ template< typename ConfigTag, class tnlMeshEntityInitializer : public tnlMeshEntityInitializerLayer< ConfigTag, EntityTag, - tnlDimensionsTraits< EntityTag::dimensions - 1 > >, + tnlDimensionsTag< EntityTag::dimensions - 1 > >, public tnlMeshSuperentityInitializerLayer< ConfigTag, EntityTag, - typename tnlMeshTraits< ConfigTag >::DimensionsTraits > + typename tnlMeshTraits< ConfigTag >::DimensionsTag > { - typedef tnlDimensionsTraits< EntityTag::dimensions > DimensionsTraits; + typedef tnlDimensionsTag< EntityTag::dimensions > DimensionsTag; private: typedef tnlMeshEntityInitializerLayer< ConfigTag, EntityTag, - tnlDimensionsTraits< EntityTag::dimensions - 1 > > SubentityBaseType; + tnlDimensionsTag< EntityTag::dimensions - 1 > > SubentityBaseType; typedef tnlMeshSuperentityInitializerLayer< ConfigTag, EntityTag, typename - tnlMeshTraits< ConfigTag >::DimensionsTraits > SuperentityBaseType; + tnlMeshTraits< ConfigTag >::DimensionsTag > SuperentityBaseType; - typedef typename tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits >::Type EntityType; + typedef typename tnlMeshEntitiesTraits< ConfigTag, DimensionsTag >::Type EntityType; typedef typename tnlMeshEntitiesTraits< ConfigTag, - DimensionsTraits >::ContainerType::IndexType GlobalIndexType; + DimensionsTag >::ContainerType::IndexType GlobalIndexType; - typedef tnlMeshSubentitiesTraits< ConfigTag, EntityTag, tnlDimensionsTraits< 0 > > SubvertexTag; + typedef tnlMeshSubentitiesTraits< ConfigTag, EntityTag, tnlDimensionsTag< 0 > > SubvertexTag; typedef typename SubvertexTag::ContainerType::ElementType VertexGlobalIndexType; typedef typename SubvertexTag::ContainerType::IndexType VertexLocalIndexType; @@ -181,7 +181,7 @@ class tnlMeshEntityInitializer enum { subentitiesCount = Tag::count }; enum { subentityVerticesCount = tnlMeshSubentitiesTraits< ConfigTag, SubentityTag, - tnlDimensionsTraits< 0 > >::count }; + tnlDimensionsTag< 0 > >::count }; public: static void createSubentities( SubentityContainerType& subentities, @@ -227,16 +227,16 @@ template< typename ConfigTag > class tnlMeshEntityInitializer< ConfigTag, tnlMeshVertexTag > : public tnlMeshSuperentityInitializerLayer< ConfigTag, tnlMeshVertexTag, - typename tnlMeshTraits< ConfigTag >::DimensionsTraits > + typename tnlMeshTraits< ConfigTag >::DimensionsTag > { - typedef tnlDimensionsTraits< 0 > DimensionsTraits; + typedef tnlDimensionsTag< 0 > DimensionsTag; typedef tnlMeshSuperentityInitializerLayer< ConfigTag, tnlMeshVertexTag, - typename tnlMeshTraits< ConfigTag >::DimensionsTraits > SuperentityBaseType; + typename tnlMeshTraits< ConfigTag >::DimensionsTag > SuperentityBaseType; - typedef typename tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits >::Type EntityType; - typedef typename tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits >::ContainerType::IndexType GlobalIndexType; + typedef typename tnlMeshEntitiesTraits< ConfigTag, DimensionsTag >::Type EntityType; + typedef typename tnlMeshEntitiesTraits< ConfigTag, DimensionsTag >::ContainerType::IndexType GlobalIndexType; typedef tnlMeshInitializer< ConfigTag > InitializerType; @@ -301,11 +301,11 @@ class tnlMeshEntityInitializerLayer< ConfigTag, tnlStorageTraits< true > > : public tnlMeshEntityInitializerLayer< ConfigTag, EntityTag, - typename DimensionsTag::Previous > + typename DimensionsTag::Decrement > { typedef tnlMeshEntityInitializerLayer< ConfigTag, EntityTag, - typename DimensionsTag::Previous > BaseType; + typename DimensionsTag::Decrement > BaseType; typedef tnlMeshSubentitiesTraits< ConfigTag, EntityTag, DimensionsTag > SubentitiesTraits; typedef typename SubentitiesTraits::SubentityContainerType SubentityContainerType; @@ -314,7 +314,7 @@ class tnlMeshEntityInitializerLayer< ConfigTag, typedef tnlMeshInitializer< ConfigTag > InitializerType; typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > EntityInitializerType; - typedef tnlDimensionsTraits< EntityTag::dimensions > EntityDimensionsTraits; + typedef tnlDimensionsTag< EntityTag::dimensions > EntityDimensionsTag; protected: void initSubentities( EntityInitializerType& entityInitializer, @@ -333,7 +333,7 @@ class tnlMeshEntityInitializerLayer< ConfigTag, GlobalIndexType superentityIndex = entityInitializer.getEntityIndex(); subentityContainer[ i ] = subentityIndex; //cout << " Setting " << i << "-th subentity to " << subentityContainer[ i ] << endl; - meshInitializer.getEntityInitializer( DimensionsTag(), subentityIndex ).addSuperentity( EntityDimensionsTraits(), superentityIndex ); + meshInitializer.getEntityInitializer( DimensionsTag(), subentityIndex ).addSuperentity( EntityDimensionsTag(), superentityIndex ); } BaseType::initSubentities( entityInitializer, meshInitializer ); @@ -350,11 +350,11 @@ class tnlMeshEntityInitializerLayer< ConfigTag, tnlStorageTraits< false > > : public tnlMeshEntityInitializerLayer< ConfigTag, EntityTag, - typename DimensionsTag::Previous > + typename DimensionsTag::Decrement > { typedef tnlMeshEntityInitializerLayer< ConfigTag, EntityTag, - typename DimensionsTag::Previous > BaseType; + typename DimensionsTag::Decrement > BaseType; typedef typename tnlMeshSubentitiesTraits< ConfigTag, EntityTag, @@ -396,11 +396,11 @@ class tnlMeshEntityInitializerLayer< ConfigTag, tnlStorageTraits< true > > : public tnlMeshEntityInitializerLayer< ConfigTag, EntityTag, - typename DimensionsTag::Previous > + typename DimensionsTag::Decrement > { typedef tnlMeshEntityInitializerLayer< ConfigTag, EntityTag, - typename DimensionsTag::Previous > BaseType; + typename DimensionsTag::Decrement > BaseType; typedef typename tnlMeshSubentitiesTraits< ConfigTag, EntityTag, @@ -412,7 +412,7 @@ class tnlMeshEntityInitializerLayer< ConfigTag, typedef tnlMeshInitializer< ConfigTag > InitializerType; typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > EntityInitializerType; - typedef tnlDimensionsTraits< EntityTag::dimensions > EntityDimensionsTag; + typedef tnlDimensionsTag< EntityTag::dimensions > EntityDimensionsTag; protected: void initSubentities( EntityInitializerType& entityInitializer, @@ -445,18 +445,18 @@ class tnlMeshEntityInitializerLayer< ConfigTag, tnlStorageTraits< false > > : public tnlMeshEntityInitializerLayer< ConfigTag, EntityTag, - typename DimensionsTag::Previous > + typename DimensionsTag::Decrement > {}; template< typename ConfigTag, typename EntityTag > class tnlMeshEntityInitializerLayer< ConfigTag, EntityTag, - tnlDimensionsTraits< 0 >, + tnlDimensionsTag< 0 >, tnlStorageTraits< true >, tnlStorageTraits< true > > { - typedef tnlDimensionsTraits< 0 > DimensionsTag; + typedef tnlDimensionsTag< 0 > DimensionsTag; typedef tnlMeshSubentitiesTraits< ConfigTag, EntityTag, DimensionsTag > SubentitiesTraits; @@ -466,7 +466,7 @@ class tnlMeshEntityInitializerLayer< ConfigTag, typedef tnlMeshInitializer< ConfigTag > InitializerType; typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > EntityInitializerType; - typedef tnlDimensionsTraits< EntityTag::dimensions > EntityDimensionsTag; + typedef tnlDimensionsTag< EntityTag::dimensions > EntityDimensionsTag; protected: void initSubentities( EntityInitializerType &entityInitializer, @@ -491,7 +491,7 @@ template< typename ConfigTag, typename EntityTag > class tnlMeshEntityInitializerLayer< ConfigTag, EntityTag, - tnlDimensionsTraits< 0 >, + tnlDimensionsTag< 0 >, tnlStorageTraits< true >, tnlStorageTraits< false > > { @@ -508,7 +508,7 @@ template< typename ConfigTag, typename EntityTag > class tnlMeshEntityInitializerLayer< ConfigTag, EntityTag, - tnlDimensionsTraits< 0 >, + tnlDimensionsTag< 0 >, tnlStorageTraits< false >, tnlStorageTraits< true > > // Forces termination of recursive inheritance (prevents compiler from generating huge error logs) { @@ -523,7 +523,7 @@ template< typename ConfigTag, typename EntityTag > class tnlMeshEntityInitializerLayer< ConfigTag, EntityTag, - tnlDimensionsTraits< 0 >, + tnlDimensionsTag< 0 >, tnlStorageTraits< false >, tnlStorageTraits< false > > // Forces termination of recursive inheritance (prevents compiler from generating huge error logs) { diff --git a/src/mesh/tnlMeshEntityKey.h b/src/mesh/tnlMeshEntityKey.h index 0937caaa98..925994f361 100644 --- a/src/mesh/tnlMeshEntityKey.h +++ b/src/mesh/tnlMeshEntityKey.h @@ -20,7 +20,7 @@ #include <mesh/tnlMeshEntity.h> #include <mesh/traits/tnlMeshSubentitiesTraits.h> -#include <mesh/traits/tnlDimensionsTraits.h> +#include <mesh/tnlDimensionsTag.h> /**** * Unique identification of a mesh entity by its vertices. @@ -36,7 +36,7 @@ class tnlMeshEntityKey typedef typename tnlMeshSubentitiesTraits< ConfigTag, EntityTag, - tnlDimensionsTraits< 0 > >::ContainerType ContainerType; + tnlDimensionsTag< 0 > >::ContainerType ContainerType; public: diff --git a/src/mesh/tnlMeshInitializer.h b/src/mesh/tnlMeshInitializer.h index 897aa59014..1f91e8458c 100644 --- a/src/mesh/tnlMeshInitializer.h +++ b/src/mesh/tnlMeshInitializer.h @@ -19,7 +19,7 @@ #define TNLMESHINITIALIZER_H_ #include <mesh/traits/tnlMeshEntitiesTraits.h> -#include <mesh/traits/tnlDimensionsTraits.h> +#include <mesh/tnlDimensionsTag.h> #include <mesh/traits/tnlMeshSubentitiesTraits.h> #include <mesh/traits/tnlMeshSuperentitiesTraits.h> #include <mesh/tnlMeshEntityInitializer.h> @@ -27,9 +27,9 @@ #include <mesh/traits/tnlStorageTraits.h> template< typename ConfigTag, - typename DimensionsTraits, + typename DimensionsTag, typename EntityStorageTag = typename tnlMeshEntitiesTraits< ConfigTag, - DimensionsTraits >::EntityStorageTag > + DimensionsTag >::EntityStorageTag > class tnlMeshInitializerLayer; @@ -40,7 +40,7 @@ class tnlMeshEntityInitializer; template< typename ConfigTag > class tnlMeshInitializer : public tnlMeshInitializerLayer< ConfigTag, - typename tnlMeshTraits< ConfigTag >::DimensionsTraits > + typename tnlMeshTraits< ConfigTag >::DimensionsTag > { typedef tnlMesh< ConfigTag > MeshType; @@ -77,17 +77,17 @@ class tnlMeshInitializer template< typename ConfigTag > class tnlMeshInitializerLayer< ConfigTag, - typename tnlMeshTraits< ConfigTag >::DimensionsTraits, + typename tnlMeshTraits< ConfigTag >::DimensionsTag, tnlStorageTraits< true > > : public tnlMeshInitializerLayer< ConfigTag, - typename tnlMeshTraits< ConfigTag >::DimensionsTraits::Previous > + typename tnlMeshTraits< ConfigTag >::DimensionsTag::Decrement > { - typedef typename tnlMeshTraits< ConfigTag >::DimensionsTraits DimensionsTraits; + typedef typename tnlMeshTraits< ConfigTag >::DimensionsTag DimensionsTag; typedef tnlMeshInitializerLayer< ConfigTag, - typename DimensionsTraits::Previous > BaseType; + typename DimensionsTag::Decrement > BaseType; - typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits > Tag; + typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTag > Tag; typedef typename Tag::Tag EntityTag; typedef typename Tag::ContainerType ContainerType; typedef typename ContainerType::IndexType GlobalIndexType; @@ -98,7 +98,7 @@ class tnlMeshInitializerLayer< ConfigTag, public: using BaseType::getEntityInitializer; - CellInitializerType& getEntityInitializer( DimensionsTraits, GlobalIndexType index ) + CellInitializerType& getEntityInitializer( DimensionsTag, GlobalIndexType index ) { return cellInitializerContainer[ index ]; } @@ -135,7 +135,7 @@ class tnlMeshInitializerLayer< ConfigTag, void createEntitiesFromCells( bool verbose ) { - //cout << " Creating entities with " << DimensionsTraits::value << " dimensions..." << endl; + //cout << " Creating entities with " << DimensionsTag::value << " dimensions..." << endl; cellInitializerContainer.setSize( this->getMesh().getNumberOfCells() ); for( GlobalIndexType cell = 0; cell < this->getMesh().getNumberOfCells(); @@ -155,12 +155,12 @@ class tnlMeshInitializerLayer< ConfigTag, void initEntities( InitializerType& meshInitializer ) { - //cout << " Initiating entities with " << DimensionsTraits::value << " dimensions..." << endl; + //cout << " Initiating entities with " << DimensionsTag::value << " dimensions..." << endl; for( typename CellInitializerContainerType::IndexType i = 0; i < cellInitializerContainer.getSize(); i++ ) { - //cout << " Initiating entity " << i << " with " << DimensionsTraits::value << " dimensions..." << endl; + //cout << " Initiating entity " << i << " with " << DimensionsTag::value << " dimensions..." << endl; cellInitializerContainer[ i ].initEntity( meshInitializer ); } cellInitializerContainer.reset(); @@ -173,17 +173,17 @@ class tnlMeshInitializerLayer< ConfigTag, template< typename ConfigTag, - typename DimensionsTraits > + typename DimensionsTag > class tnlMeshInitializerLayer< ConfigTag, - DimensionsTraits, + DimensionsTag, tnlStorageTraits< true > > : public tnlMeshInitializerLayer< ConfigTag, - typename DimensionsTraits::Previous > + typename DimensionsTag::Decrement > { typedef tnlMeshInitializerLayer< ConfigTag, - typename DimensionsTraits::Previous > BaseType; + typename DimensionsTag::Decrement > BaseType; - typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits > Tag; + typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTag > Tag; typedef typename Tag::Tag EntityTag; typedef typename Tag::Type EntityType; typedef typename Tag::ContainerType ContainerType; @@ -192,14 +192,14 @@ class tnlMeshInitializerLayer< ConfigTag, typedef tnlMeshInitializer< ConfigTag > InitializerType; typedef tnlMeshEntityInitializer< ConfigTag, - typename ConfigTag::CellTag > CellInitializerType; + typename ConfigTag::CellType > CellInitializerType; typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > EntityInitializerType; typedef tnlArray< EntityInitializerType, tnlHost, GlobalIndexType > EntityInitializerContainerType; typedef typename tnlMeshSubentitiesTraits< ConfigTag, - typename ConfigTag::CellTag, - DimensionsTraits >::SubentityContainerType SubentitiesContainerType; + typename ConfigTag::CellType, + DimensionsTag >::SubentityContainerType SubentitiesContainerType; public: @@ -214,7 +214,7 @@ class tnlMeshInitializerLayer< ConfigTag, } using BaseType::getEntityInitializer; - EntityInitializerType& getEntityInitializer( DimensionsTraits, GlobalIndexType index ) + EntityInitializerType& getEntityInitializer( DimensionsTag, GlobalIndexType index ) { return entityInitializerContainer[ index ]; } @@ -223,9 +223,9 @@ class tnlMeshInitializerLayer< ConfigTag, void createEntitiesFromCells( const CellInitializerType& cellInitializer ) { - //cout << " Creating entities with " << DimensionsTraits::value << " dimensions..." << endl; + //cout << " Creating entities with " << DimensionsTag::value << " dimensions..." << endl; SubentitiesContainerType subentities; - cellInitializer.template createSubentities< DimensionsTraits >( subentities ); + cellInitializer.template createSubentities< DimensionsTag >( subentities ); for( typename SubentitiesContainerType::IndexType i = 0; i < subentities.getSize(); i++ ) @@ -233,7 +233,7 @@ class tnlMeshInitializerLayer< ConfigTag, //cout << " Inserting subentity " << endl << subentities[ i ] << endl; uniqueContainer.insert( subentities[ i ] ); } - //cout << " Container with entities with " << DimensionsTraits::value << " dimensions has: " << endl << this->uniqueContainer << endl; + //cout << " Container with entities with " << DimensionsTag::value << " dimensions has: " << endl << this->uniqueContainer << endl; BaseType::createEntitiesFromCells( cellInitializer ); } @@ -245,23 +245,23 @@ class tnlMeshInitializerLayer< ConfigTag, void initEntities( InitializerType &meshInitializer ) { - //cout << " Initiating entities with " << DimensionsTraits::value << " dimensions..." << endl; - //cout << " Container with entities with " << DimensionsTraits::value << " dimensions has: " << endl << this->uniqueContainer << endl; + //cout << " Initiating entities with " << DimensionsTag::value << " dimensions..." << endl; + //cout << " Container with entities with " << DimensionsTag::value << " dimensions has: " << endl << this->uniqueContainer << endl; const GlobalIndexType numberOfEntities = uniqueContainer.getSize(); - this->getMesh().template setNumberOfEntities< DimensionsTraits::value >( numberOfEntities ); - uniqueContainer.toArray( this->getMesh().template getEntities< DimensionsTraits::value >() ); + this->getMesh().template setNumberOfEntities< DimensionsTag::value >( numberOfEntities ); + uniqueContainer.toArray( this->getMesh().template getEntities< DimensionsTag::value >() ); uniqueContainer.reset(); - //cout << " this->getMesh().template getEntities< DimensionsTraits::value >() has: " << this->getMesh().template getEntities< DimensionsTraits::value >() << endl; + //cout << " this->getMesh().template getEntities< DimensionsTag::value >() has: " << this->getMesh().template getEntities< DimensionsTag::value >() << endl; - //ContainerType& entityContainer = this->getMesh().entityContainer(DimensionsTraits()); + //ContainerType& entityContainer = this->getMesh().entityContainer(DimensionsTag()); for( GlobalIndexType i = 0; i < numberOfEntities; i++) { - //cout << "Initiating entity " << i << " with " << DimensionsTraits::value << " dimensions..." << endl; + //cout << "Initiating entity " << i << " with " << DimensionsTag::value << " dimensions..." << endl; EntityInitializerType& entityInitializer = entityInitializerContainer[ i ]; - //cout << "Initiating with entity " << this->getMesh().template getEntity< DimensionsTraits::value >( i ) << endl; - entityInitializer.init( this->getMesh().template getEntity< DimensionsTraits::value >( i ), i ); + //cout << "Initiating with entity " << this->getMesh().template getEntity< DimensionsTag::value >( i ) << endl; + entityInitializer.init( this->getMesh().template getEntity< DimensionsTag::value >( i ), i ); entityInitializer.initEntity( meshInitializer ); } @@ -276,24 +276,24 @@ class tnlMeshInitializerLayer< ConfigTag, }; template< typename ConfigTag, - typename DimensionsTraits > + typename DimensionsTag > class tnlMeshInitializerLayer< ConfigTag, - DimensionsTraits, + DimensionsTag, tnlStorageTraits< false > > : public tnlMeshInitializerLayer< ConfigTag, - typename DimensionsTraits::Previous > + typename DimensionsTag::Decrement > {}; template< typename ConfigTag > class tnlMeshInitializerLayer< ConfigTag, - tnlDimensionsTraits< 0 >, + tnlDimensionsTag< 0 >, tnlStorageTraits< true > > { typedef tnlMesh< ConfigTag > MeshType; - typedef tnlDimensionsTraits< 0 > DimensionsTraits; + typedef tnlDimensionsTag< 0 > DimensionsTag; - typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits > Tag; + typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTag > Tag; typedef typename Tag::Tag EntityTag; typedef typename Tag::ContainerType ContainerType; typedef typename Tag::SharedContainerType SharedContainerType; @@ -303,7 +303,7 @@ class tnlMeshInitializerLayer< ConfigTag, typedef tnlMeshInitializer< ConfigTag > InitializerType; typedef tnlMeshEntityInitializer< ConfigTag, - typename ConfigTag::CellTag > CellInitializerType; + typename ConfigTag::CellType > CellInitializerType; typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > VertexInitializerType; typedef tnlArray< VertexInitializerType, tnlHost, GlobalIndexType > VertexInitializerContainerType; @@ -320,7 +320,7 @@ class tnlMeshInitializerLayer< ConfigTag, return *( this->mesh ); } - VertexInitializerType& getEntityInitializer( DimensionsTraits, GlobalIndexType index ) + VertexInitializerType& getEntityInitializer( DimensionsTag, GlobalIndexType index ) { tnlAssert( index >= 0 && index < vertexInitializerContainer.getSize(), cerr << " index = " << index @@ -334,18 +334,18 @@ class tnlMeshInitializerLayer< ConfigTag, void createEntityInitializers() { - vertexInitializerContainer.setSize( this->getMesh().template getNumberOfEntities< DimensionsTraits::value >() ); + vertexInitializerContainer.setSize( this->getMesh().template getNumberOfEntities< DimensionsTag::value >() ); } void initEntities( InitializerType& meshInitializer ) { - //cout << " Initiating entities with " << DimensionsTraits::value << " dimensions..." << endl; - SharedContainerType& vertexContainer = this->getMesh().template getEntities< DimensionsTraits::value >(); + //cout << " Initiating entities with " << DimensionsTag::value << " dimensions..." << endl; + SharedContainerType& vertexContainer = this->getMesh().template getEntities< DimensionsTag::value >(); for( GlobalIndexType i = 0; i < vertexContainer.getSize(); i++ ) { - //cout << "Initiating entity " << i << " with " << DimensionsTraits::value << " dimensions..." << endl; + //cout << "Initiating entity " << i << " with " << DimensionsTag::value << " dimensions..." << endl; VertexInitializerType& vertexInitializer = vertexInitializerContainer[ i ]; vertexInitializer.init( vertexContainer[ i ], i ); vertexInitializer.initEntity( meshInitializer ); diff --git a/src/mesh/tnlMeshIntegrityChecker.h b/src/mesh/tnlMeshIntegrityChecker.h index 86f0de4dfb..9cfd9e97ef 100644 --- a/src/mesh/tnlMeshIntegrityChecker.h +++ b/src/mesh/tnlMeshIntegrityChecker.h @@ -24,10 +24,10 @@ template< typename MeshType > class tnlMeshIntegrityChecker : public tnlMeshIntegrityCheckerLayer< MeshType, - tnlDimensionsTraits< MeshType::Config::CellTag::dimensions > > + tnlDimensionsTag< MeshType::Config::CellType::dimensions > > { - typedef tnlDimensionsTraits< MeshType::Config::CellTag::dimensions > DimensionsTraits; - typedef tnlMeshIntegrityCheckerLayer< MeshType, DimensionsTraits > BaseType; + typedef tnlDimensionsTag< MeshType::Config::CellType::dimensions > DimensionsTag; + typedef tnlMeshIntegrityCheckerLayer< MeshType, DimensionsTag > BaseType; public: static bool checkMesh( const MeshType& mesh ) diff --git a/src/mesh/tnlMeshIntegrityCheckerLayer.h b/src/mesh/tnlMeshIntegrityCheckerLayer.h index a67a844230..9966a26081 100644 --- a/src/mesh/tnlMeshIntegrityCheckerLayer.h +++ b/src/mesh/tnlMeshIntegrityCheckerLayer.h @@ -19,27 +19,27 @@ #define TNLMESHINTEGRITYCHECKERLAYER_H_ #include <mesh/traits/tnlMeshEntitiesTraits.h> -#include <mesh/traits/tnlDimensionsTraits.h> +#include <mesh/tnlDimensionsTag.h> #include <mesh/traits/tnlStorageTraits.h> template< typename MeshType, - typename DimensionsTraits, + typename DimensionsTag, typename EntityStorageTag = typename tnlMeshEntitiesTraits< typename MeshType::Config, - DimensionsTraits >::EntityStorageTag > + DimensionsTag >::EntityStorageTag > class tnlMeshIntegrityCheckerLayer; template< typename MeshType, - typename DimensionsTraits > + typename DimensionsTag > class tnlMeshIntegrityCheckerLayer< MeshType, - DimensionsTraits, + DimensionsTag, tnlStorageTraits< true > > : public tnlMeshIntegrityCheckerLayer< MeshType, - typename DimensionsTraits::Previous > + typename DimensionsTag::Decrement > { public: typedef tnlMeshIntegrityCheckerLayer< MeshType, - typename DimensionsTraits::Previous > BaseType; - enum { dimensions = DimensionsTraits::value }; + typename DimensionsTag::Decrement > BaseType; + enum { dimensions = DimensionsTag::value }; static bool checkEntities( const MeshType& mesh ) { @@ -61,7 +61,7 @@ class tnlMeshIntegrityCheckerLayer< MeshType, template< typename MeshType > class tnlMeshIntegrityCheckerLayer< MeshType, - tnlDimensionsTraits< 0 >, + tnlDimensionsTag< 0 >, tnlStorageTraits< true > > { public: @@ -85,19 +85,19 @@ class tnlMeshIntegrityCheckerLayer< MeshType, }; template< typename MeshType, - typename DimensionsTraits > + typename DimensionsTag > class tnlMeshIntegrityCheckerLayer< MeshType, - DimensionsTraits, + DimensionsTag, tnlStorageTraits< false > > : public tnlMeshIntegrityCheckerLayer< MeshType, - typename DimensionsTraits::Previous > + typename DimensionsTag::Decrement > { }; template< typename MeshType > class tnlMeshIntegrityCheckerLayer< MeshType, - tnlDimensionsTraits< 0 >, + tnlDimensionsTag< 0 >, tnlStorageTraits< false > > { diff --git a/src/mesh/tnlMeshReaderNetgen.h b/src/mesh/tnlMeshReaderNetgen.h index e694b10269..a9e813ae06 100644 --- a/src/mesh/tnlMeshReaderNetgen.h +++ b/src/mesh/tnlMeshReaderNetgen.h @@ -28,8 +28,10 @@ class tnlMeshReaderNetgen { public: - static bool detectDimensions( const tnlString& fileName, - int& dimensions ) + tnlMeshReaderNetgen() + : dimensions( 0 ){} + + bool detectMesh( const tnlString& fileName ) { fstream inputFile( fileName.getString() ); if( ! inputFile ) @@ -52,6 +54,11 @@ class tnlMeshReaderNetgen if( ! inputFile ) return false; getline( inputFile, line ); + iss.str( line ); + long int numberOfVertices; + iss >> numberOfVertices; + + //cout << "There are " << numberOfVertices << " vertices." << endl; /**** * Read the first vertex and compute number of components @@ -59,14 +66,60 @@ class tnlMeshReaderNetgen if( ! inputFile ) return false; getline( inputFile, line ); + iss.clear(); iss.str( line ); - dimensions = -1; + this->dimensions = -1; while( iss ) { double aux; iss >> aux; - dimensions++; + this->dimensions++; + } + + /**** + * Skip vertices + */ + long int verticesRead( 1 ); + while( verticesRead < numberOfVertices ) + { + getline( inputFile, line ); + if( ! inputFile ) + { + cerr << "The mesh file " << fileName << " is probably corrupted, some vertices are missing." << endl; + return false; + } + verticesRead++; + } + + /**** + * Skip whitespaces + */ + inputFile >> ws; + + /**** + * Get number of cells + */ + long int numberOfCells; + getline( inputFile, line ); + iss.clear(); + iss.str( line ); + iss >> numberOfCells; + //cout << "There are " << numberOfCells << " cells." << endl; + + /**** + * Get number of vertices in a cell + */ + getline( inputFile, line ); + iss.clear(); + iss.str( line ); + this->verticesInCell = -2; + while( iss ) + { + int aux; + iss >> aux; + this->verticesInCell++; } + //cout << "There are " << this->verticesInCell << " vertices in cell ..." << endl; return true; } @@ -156,7 +209,7 @@ class tnlMeshReaderNetgen iss.str( line ); int subdomainIndex; iss >> subdomainIndex; - for( int cellVertex = 0; cellVertex < dimensions + 1; cellVertex++ ) + for( int cellVertex = 0; cellVertex < mesh.getCell( i ).getNumberOfVertices(); cellVertex++ ) { VertexIndexType vertexIdx; iss >> vertexIdx; @@ -170,8 +223,19 @@ class tnlMeshReaderNetgen return true; } + int getDimensions() const + { + return this->dimensions; + } + + int getVerticesInCell() const + { + return this->verticesInCell; + } + protected: + int dimensions, verticesInCell; }; diff --git a/src/mesh/tnlMeshSuperentityInitializerLayer.h b/src/mesh/tnlMeshSuperentityInitializerLayer.h index dd0025712c..0232ac4214 100644 --- a/src/mesh/tnlMeshSuperentityInitializerLayer.h +++ b/src/mesh/tnlMeshSuperentityInitializerLayer.h @@ -19,7 +19,7 @@ #define TNLMESHSUPERENTITYINITIALIZERLAYER_H_ #include <mesh/traits/tnlStorageTraits.h> -#include <mesh/traits/tnlDimensionsTraits.h> +#include <mesh/tnlDimensionsTag.h> template< typename ConfigTag, typename EntityTag > @@ -40,11 +40,11 @@ class tnlMeshSuperentityInitializerLayer< ConfigTag, tnlStorageTraits< true > > : public tnlMeshSuperentityInitializerLayer< ConfigTag, EntityTag, - typename DimensionsTag::Previous > + typename DimensionsTag::Decrement > { typedef tnlMeshSuperentityInitializerLayer< ConfigTag, EntityTag, - typename DimensionsTag::Previous > BaseType; + typename DimensionsTag::Decrement > BaseType; typedef typename tnlMeshSuperentitiesTraits< ConfigTag, EntityTag, @@ -85,7 +85,7 @@ class tnlMeshSuperentityInitializerLayer< ConfigTag, tnlStorageTraits< false > > : public tnlMeshSuperentityInitializerLayer< ConfigTag, EntityTag, - typename DimensionsTag::Previous > + typename DimensionsTag::Decrement > { }; @@ -93,7 +93,7 @@ template< typename ConfigTag, typename EntityTag > class tnlMeshSuperentityInitializerLayer< ConfigTag, EntityTag, - tnlDimensionsTraits< EntityTag::dimensions >, + tnlDimensionsTag< EntityTag::dimensions >, tnlStorageTraits< true > > { typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > EntityInitializerType; @@ -107,7 +107,7 @@ template< typename ConfigTag, typename EntityTag > class tnlMeshSuperentityInitializerLayer< ConfigTag, EntityTag, - tnlDimensionsTraits< EntityTag::dimensions >, + tnlDimensionsTag< EntityTag::dimensions >, tnlStorageTraits< false > > { typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > EntityInitializerType; diff --git a/src/mesh/tnlMeshWriterVTKLegacy.h b/src/mesh/tnlMeshWriterVTKLegacy.h index ab5d84c7a0..2b854936c2 100644 --- a/src/mesh/tnlMeshWriterVTKLegacy.h +++ b/src/mesh/tnlMeshWriterVTKLegacy.h @@ -24,16 +24,46 @@ #include <sstream> #include <iomanip> +#include <mesh/topologies/tnlMeshTriangleTag.h> +#include <mesh/topologies/tnlMeshQuadrilateralTag.h> +#include <mesh/topologies/tnlMeshTetrahedronTag.h> +#include <mesh/topologies/tnlMeshHexahedronTag.h> +#include <mesh/tnlMeshEntity.h> + + using namespace std; +enum tnlVTKMeshEntities { tnlVTKVertex = 1, + tnlVTKPolyVertex = 2, + tnlVTKLine = 3, + tnlVTKPolyLine = 4, + tnlVTKTriangle = 5, + tnlVTKTriangleStrip = 6, + tnlVTKPolygon = 7, + tnlVTKPixel = 8, + tnlVTKQuad = 9, + tnlVTKTetra = 10, + tnlVTKVoxel = 11, + tnlVTKHexahedron = 12, + tnlVTKWedge = 13, + tnlVTKPyramid = 14 }; + +template< typename MeshEntity > +struct tnlMeshEntityVTKType{}; + +template< typename ConfigTag > struct tnlMeshEntityVTKType< tnlMeshEntity< ConfigTag, tnlMeshTriangleTag > > { enum { VTKType = tnlVTKTriangle }; }; +template< typename ConfigTag > struct tnlMeshEntityVTKType< tnlMeshEntity< ConfigTag, tnlMeshQuadrilateralTag > >{ enum { VTKType = tnlVTKQuad }; }; +template< typename ConfigTag > struct tnlMeshEntityVTKType< tnlMeshEntity< ConfigTag, tnlMeshTetrahedronTag > > { enum { VTKType = tnlVTKTetra }; }; +template< typename ConfigTag > struct tnlMeshEntityVTKType< tnlMeshEntity< ConfigTag, tnlMeshHexahedronTag > > { enum { VTKType = tnlVTKHexahedron }; }; + class tnlMeshWriterVTKLegacy { public: template< typename MeshType > static bool write( const tnlString& fileName, - MeshType& mesh, - bool verbose ) + MeshType& mesh, + bool verbose ) { if( MeshType::dimensions > 3 ) { @@ -60,16 +90,43 @@ class tnlMeshWriterVTKLegacy MeshType& mesh, bool verbose ) { + typedef typename MeshType::CellTraits MeshEntitiesTraits; + typedef typename MeshEntitiesTraits::Type CellType; file << "# vtk DataFile Version 2.0" << endl; file << "TNL Mesh" << endl; file << "ASCII" << endl; file << "DATASET UNSTRUCTURED_GRID" << endl; file << endl; - file << "POINTS " << mesh.template getNumberOfEntities< 0 >() << " float" << endl; + file << "POINTS " << mesh.template getNumberOfEntities< 0 >() << " double" << endl; for( int i = 0; i < mesh.template getNumberOfEntities< 0 >(); i++ ) { - file << mesh.template getEntity< 0 >( i ).getPoint(); + mesh.template getEntity< 0 >( i ).getPoint().write( file ); + for( int j = MeshType::dimensions; j < 3; j++ ) + file << " 0.0"; + file << endl; } + file << endl; + file << "CELLS " << mesh.template getNumberOfCells(); + long int listSize( 0 ); + for( int i = 0; i < mesh.template getNumberOfCells(); i++ ) + listSize += mesh.getCell( i ).template getNumberOfSubentities< 0 >() + 1; + file << " " << listSize << endl; + for( int i = 0; i < mesh.template getNumberOfCells(); i++ ) + { + int numberOfVertices = mesh.getCell( i ).template getNumberOfSubentities< 0 >(); + file << numberOfVertices << " "; + for( int j = 0; j < numberOfVertices - 1; j++ ) + file << mesh.getCell( i ).template getSubentityIndex< 0 >( j ) << " "; + file << mesh.getCell( i ).template getSubentityIndex< 0 >( numberOfVertices - 1 ) << endl; + } + file << endl; + file << "CELL_TYPES " << mesh.template getNumberOfCells() << endl; + for( int i = 0; i < mesh.template getNumberOfCells(); i++ ) + { + file << tnlMeshEntityVTKType< CellType >::VTKType << endl; + } + file << endl; + return true; } diff --git a/src/mesh/traits/CMakeLists.txt b/src/mesh/traits/CMakeLists.txt index acf4304f70..4730c8c295 100755 --- a/src/mesh/traits/CMakeLists.txt +++ b/src/mesh/traits/CMakeLists.txt @@ -1,5 +1,4 @@ -SET( headers tnlDimensionsTraits.h - tnlMeshTraits.h +SET( headers tnlMeshTraits.h tnlStorageTraits.h tnlMeshEntitiesTraits.h tnlMeshEntitiesTag.h diff --git a/src/mesh/traits/tnlMeshConfigTraits.h b/src/mesh/traits/tnlMeshConfigTraits.h new file mode 100644 index 0000000000..7f2525ef1f --- /dev/null +++ b/src/mesh/traits/tnlMeshConfigTraits.h @@ -0,0 +1,63 @@ +/*************************************************************************** + tnlMeshConfigTraits.h - description + ------------------- + begin : Aug 14, 2015 + copyright : (C) 2015 by Tomas Oberhuber et al. + email : tomas.oberhuber@fjfi.cvut.cz + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef TNLMESHCONFIGTRAITS_H +#define TNLMESHCONFIGTRAITS_H + +#include <mesh/traits/tnlMeshEntitiesTraits.h> +#include <mesh/traits/tnlMeshSubentitiesTraits.h> +#include <mesh/traits/tnlMeshSuperentitiesTraits.h> + +template< typename MeshConfig > +class tnlMeshConfigTraits +{ + public: + static const int meshDimensions = MeshConfig::CellType::dimensions; + static const int worldDimensions = MeshConfig::worldDimensions; + + typedef typename MeshConfig::RealType RealType; + typedef typename MeshConfig::GlobalIndexType GlobalIndexType; + typedef typename MeshConfig::LocalIndexType LocalIndexType; + typedef typename tnlMeshEntitiesTag< MeshConfig, + tnlDimensionsTag< 0 > >::Tag VertexType; + typedef typename MeshConfig::CellType CellType; + + typedef tnlDimensionsTag< meshDimensions > MeshDimensions; + typedef typename tnlMeshTraits< MeshConfig >::PointType Point; + /*typedef Entity<TConfig, TVertexTopology> TVertex; + typedef Entity<TConfig, TCellTopology> TCell; + typedef EntitySeed<TConfig, TCellTopology> TCellSeed;*/ + + // TODO: to asi presunout do implementace, stejne to bude vazane na TNL + typedef tnlArrayArray< GlobalIndexType, GlobalIndexType > GlobalIdArrayType; + typedef tnlSharedArray< GlobalIndexType, LocalIndexType > IdArrayAccessorType; + typedef tnlSharedArray< LocalIndexType, LocalIndexType > IdPermutationArrayAccessorType; + typedef tnlArray< Point, GlobalIndexType> PointArrayType; + //typedef tnlArray<TCellSeed, TGlobalIndex> TCellSeedArray; + + template< typename Dimensions > using EntityTraits = + tnlMeshEntitiesTraits< MeshConfig, Dimensions >; + + template< typename MeshEntity, typename SubDimensions > using SubentityTraits = + tnlMeshSubentitiesTraits< MeshConfig, MeshEntity, SubDimensions >; + + template< typename MeshEntityy, typename SuperDimensions > using SuperentityTraits = + tnlMeshSuperentitiesTraits< MeshConfig, MeshEntity, SuperDimensions >; +}; + +#endif /* TNLMESHCONFIGTRAITS_H */ + diff --git a/src/mesh/traits/tnlMeshEntitiesTag.h b/src/mesh/traits/tnlMeshEntitiesTag.h index 001d9b2fa3..26f14cd35b 100644 --- a/src/mesh/traits/tnlMeshEntitiesTag.h +++ b/src/mesh/traits/tnlMeshEntitiesTag.h @@ -22,22 +22,22 @@ #include <mesh/traits/tnlMeshTraits.h> template< typename ConfigTag, - typename DimensionsTraits > + typename DimensionsTag > class tnlMeshEntitiesTag { public: - typedef typename tnlSubentities< typename ConfigTag::CellTag, - DimensionsTraits::value >::Tag Tag; + typedef typename tnlSubentities< typename ConfigTag::CellType, + DimensionsTag::value >::Tag Tag; }; template< typename ConfigTag > class tnlMeshEntitiesTag< ConfigTag, - typename tnlMeshTraits< ConfigTag >::DimensionsTraits > + typename tnlMeshTraits< ConfigTag >::DimensionsTag > { public: - typedef typename ConfigTag::CellTag Tag; + typedef typename ConfigTag::CellType Tag; }; diff --git a/src/mesh/traits/tnlMeshEntitiesTraits.h b/src/mesh/traits/tnlMeshEntitiesTraits.h index bc6217b57c..bcd95070e8 100644 --- a/src/mesh/traits/tnlMeshEntitiesTraits.h +++ b/src/mesh/traits/tnlMeshEntitiesTraits.h @@ -26,16 +26,17 @@ #include <mesh/tnlMeshEntityKey.h> template< typename ConfigTag, - typename DimensionsTraits > + typename DimensionsTag > class tnlMeshEntitiesTraits -{ - enum { storageEnabled = tnlMeshEntityStorage< ConfigTag, - DimensionsTraits::value>::enabled }; +{ + /*enum { storageEnabled = tnlMeshEntityStorage< ConfigTag, + DimensionsTag::value>::enabled };*/ + static const bool storageEnabled = ConfigTag::entityStorage( DimensionsTag::value ); typedef typename ConfigTag::GlobalIndexType GlobalIndexType; typedef typename ConfigTag::LocalIndexType LocalIndexType; typedef typename tnlMeshEntitiesTag< ConfigTag, - DimensionsTraits >::Tag EntityTag; + DimensionsTag >::Tag EntityTag; typedef tnlMeshEntityKey< ConfigTag, EntityTag > Key; public: diff --git a/src/mesh/traits/tnlMeshSubentitiesTraits.h b/src/mesh/traits/tnlMeshSubentitiesTraits.h index b520d32f4a..a5bcf83429 100644 --- a/src/mesh/traits/tnlMeshSubentitiesTraits.h +++ b/src/mesh/traits/tnlMeshSubentitiesTraits.h @@ -26,16 +26,17 @@ template< typename ConfigTag, typename EntityTag, - typename DimensionsTraits > + typename DimensionsTag > class tnlMeshSubentitiesTraits { - enum { storageEnabled = tnlMeshSubentityStorage< ConfigTag, + /*enum { storageEnabled = tnlMeshSubentityStorage< ConfigTag, EntityTag, - DimensionsTraits::value >::enabled }; + DimensionsTag::value >::enabled };*/ + static const bool storageEnabled = ConfigTag::subentityStorage( EntityTag(), DimensionsTag::value ); typedef typename ConfigTag::GlobalIndexType GlobalIndexType; typedef typename ConfigTag::LocalIndexType LocalIndexType; - typedef tnlSubentities< EntityTag, DimensionsTraits::value > Tag; + typedef tnlSubentities< EntityTag, DimensionsTag::value > Tag; public: typedef tnlMeshEntity< ConfigTag, EntityTag > EntityType; diff --git a/src/mesh/traits/tnlMeshSuperentitiesTraits.h b/src/mesh/traits/tnlMeshSuperentitiesTraits.h index 3946114bd5..c07e9ca2f0 100644 --- a/src/mesh/traits/tnlMeshSuperentitiesTraits.h +++ b/src/mesh/traits/tnlMeshSuperentitiesTraits.h @@ -28,12 +28,13 @@ template< typename ConfigTag, typename EntityTag, - typename DimensionsTraits > + typename DimensionsTag > class tnlMeshSuperentitiesTraits { - enum { storageEnabled = tnlMeshSuperentityStorage< ConfigTag, + /*enum { storageEnabled = tnlMeshSuperentityStorage< ConfigTag, EntityTag, - DimensionsTraits::value >::enabled }; + DimensionsTag::value >::enabled };*/ + static const bool storageEnabled = ConfigTag::template superentityStorage< EntityTag >( EntityTag(), DimensionsTag::value ); typedef typename ConfigTag::GlobalIndexType GlobalIndexType; typedef typename ConfigTag::LocalIndexType LocalIndexType; @@ -43,10 +44,10 @@ class tnlMeshSuperentitiesTraits typedef tnlMeshEntity< ConfigTag, EntityTag > EntityType; typedef typename tnlMeshEntitiesTraits< ConfigTag, - DimensionsTraits >::Tag SuperentityTag; + DimensionsTag >::Tag SuperentityTag; typedef typename tnlMeshEntitiesTraits< ConfigTag, - DimensionsTraits >::Type SuperentityType; + DimensionsTag >::Type SuperentityType; typedef tnlStorageTraits< storageEnabled > SuperentityStorageTag; diff --git a/src/mesh/traits/tnlMeshTraits.h b/src/mesh/traits/tnlMeshTraits.h index f324e03c10..595e3f82a2 100644 --- a/src/mesh/traits/tnlMeshTraits.h +++ b/src/mesh/traits/tnlMeshTraits.h @@ -19,7 +19,7 @@ #define TNLMESHTRAITS_H_ #include <core/vectors/tnlStaticVector.h> -#include <mesh/traits/tnlDimensionsTraits.h> +#include <mesh/tnlDimensionsTag.h> template< typename ConfigTag, typename EntityTag > @@ -30,13 +30,13 @@ class tnlMeshTraits { public: - enum { meshDimensions = ConfigTag::CellTag::dimensions }; + enum { meshDimensions = ConfigTag::CellType::dimensions }; enum { worldDimensions = ConfigTag::worldDimensions }; - typedef tnlDimensionsTraits< meshDimensions > DimensionsTraits; + typedef tnlDimensionsTag< meshDimensions > DimensionsTag; typedef tnlStaticVector< worldDimensions, typename ConfigTag::RealType > PointType; - typedef tnlMeshEntity< ConfigTag, typename ConfigTag::CellTag > CellType; + typedef tnlMeshEntity< ConfigTag, typename ConfigTag::CellType > CellType; }; diff --git a/tests/unit-tests/mesh/tnlMeshEntityTester.h b/tests/unit-tests/mesh/tnlMeshEntityTester.h index fdf5221e2a..bc0f709b84 100644 --- a/tests/unit-tests/mesh/tnlMeshEntityTester.h +++ b/tests/unit-tests/mesh/tnlMeshEntityTester.h @@ -31,20 +31,42 @@ #include <mesh/topologies/tnlMeshTriangleTag.h> #include <mesh/topologies/tnlMeshTetrahedronTag.h> -typedef tnlMeshConfigBase< tnlMeshTriangleTag, 2, double, int, int, void > TestTriangleEntityTag; +//typedef tnlMeshConfigBase< tnlMeshTriangleTag, 2, double, int, int, void > TestTriangleEntityTag; typedef tnlMeshConfigBase< tnlMeshEdgeTag, 2, double, int, int, void > TestEdgeEntityTag; typedef tnlMeshConfigBase< tnlMeshVertexTag, 2, double, int, int, void > TestVertexEntityTag; -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestTriangleEntityTag, tnlMeshVertexTag, Dimensions > +class TestTriangleMeshConfig : public tnlMeshConfigBase< tnlMeshTriangleTag > { - enum { enabled = true }; + public: + + template< typename MeshEntity > + static constexpr bool subentityStorage( MeshEntity entity, int subentityDimensions ) + { + return true; + } + + template< typename MeshEntity > + static constexpr bool superentityStorage( MeshEntity entity, int superentityDimensions ) + { + return true; + } }; -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestTriangleEntityTag, tnlMeshEdgeTag, Dimensions > +class TestTetrahedronMeshConfig : public tnlMeshConfigBase< tnlMeshTetrahedronTag > { - enum { enabled = true }; + public: + + template< typename MeshEntity > + static constexpr bool subentityStorage( MeshEntity entity, int subentityDimensions ) + { + return true; + } + + template< typename MeshEntity > + static constexpr bool superentityStorage( MeshEntity entity, int superentityDimensions ) + { + return true; + } }; template< typename RealType, typename Device, typename IndexType > @@ -155,7 +177,10 @@ class tnlMeshEntityTester : public CppUnit :: TestCase void triangleMeshEntityTest() { - typedef tnlMeshEntity< TestTriangleEntityTag, tnlMeshTriangleTag > TriangleMeshEntityType; + typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshTriangleTag > TriangleMeshEntityType; + + static_assert( TriangleMeshEntityType::SubentitiesTraits< 1 >::available, "Testing triangular mesh does not store edges as required." ); + static_assert( TriangleMeshEntityType::SubentitiesTraits< 0 >::available, "" ); typedef tnlMeshEntity< TestEdgeEntityTag, tnlMeshEdgeTag > EdgeMeshEntityType; typedef tnlMeshEntity< TestVertexEntityTag, tnlMeshVertexTag > VertexMeshEntityType; typedef typename VertexMeshEntityType::PointType PointType; @@ -213,13 +238,13 @@ class tnlMeshEntityTester : public CppUnit :: TestCase void tetrahedronMeshEntityTest() { - typedef tnlMeshConfigBase< tnlMeshTetrahedronTag, 3, RealType, IndexType, IndexType, void > TestTetrahedronEntityTag; + //typedef tnlMeshConfigBase< tnlMeshTetrahedronTag, 3, RealType, IndexType, IndexType, void > TestTetrahedronEntityTag; typedef tnlMeshConfigBase< tnlMeshTriangleTag, 3, RealType, IndexType, IndexType, void > TestTriangleEntityTag; typedef tnlMeshConfigBase< tnlMeshEdgeTag, 3, RealType, IndexType, IndexType, void > TestEdgeEntityTag; typedef tnlMeshConfigBase< tnlMeshVertexTag, 3, RealType, IndexType, IndexType, void > TestVertexEntityTag; - typedef tnlMeshEntity< TestTetrahedronEntityTag, tnlMeshTetrahedronTag > TetrahedronMeshEntityType; - typedef tnlMeshEntity< TestTriangleEntityTag, tnlMeshTriangleTag > TriangleMeshEntityType; + typedef tnlMeshEntity< TestTetrahedronMeshConfig, tnlMeshTetrahedronTag > TetrahedronMeshEntityType; + typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshTriangleTag > TriangleMeshEntityType; typedef tnlMeshEntity< TestEdgeEntityTag, tnlMeshEdgeTag > EdgeMeshEntityType; typedef tnlMeshEntity< TestVertexEntityTag, tnlMeshVertexTag > VertexMeshEntityType; typedef typename VertexMeshEntityType::PointType PointType; @@ -339,9 +364,9 @@ class tnlMeshEntityTester : public CppUnit :: TestCase void twoTrianglesTest() { - typedef tnlMeshEntity< TestTriangleEntityTag, tnlMeshTriangleTag > TriangleMeshEntityType; - typedef tnlMeshEntity< TestTriangleEntityTag, tnlMeshEdgeTag > EdgeMeshEntityType; - typedef tnlMeshEntity< TestTriangleEntityTag, tnlMeshVertexTag > VertexMeshEntityType; + typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshTriangleTag > TriangleMeshEntityType; + typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshEdgeTag > EdgeMeshEntityType; + typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshVertexTag > VertexMeshEntityType; typedef typename VertexMeshEntityType::PointType PointType; CPPUNIT_ASSERT( PointType::getType() == ( tnlStaticVector< 2, RealType >::getType() ) ); diff --git a/tests/unit-tests/mesh/tnlMeshTester.h b/tests/unit-tests/mesh/tnlMeshTester.h index efc5858d7f..acb8406d94 100644 --- a/tests/unit-tests/mesh/tnlMeshTester.h +++ b/tests/unit-tests/mesh/tnlMeshTester.h @@ -35,72 +35,44 @@ #include <mesh/topologies/tnlMeshHexahedronTag.h> #include <mesh/tnlMeshInitializer.h> -typedef tnlMeshConfigBase< tnlMeshTriangleTag, 2, double, int, int, void > TestTriangleMeshConfig; - -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestTriangleMeshConfig, tnlMeshVertexTag, Dimensions > -{ - enum { enabled = true }; -}; - -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestTriangleMeshConfig, tnlMeshEdgeTag, Dimensions > +class TestTriangleMeshConfig : public tnlMeshConfigBase< tnlMeshTriangleTag > { - enum { enabled = true }; -}; - -typedef tnlMeshConfigBase< tnlMeshQuadrilateralTag, 2, double, int, int, void > TestQuadrilateralMeshConfig; - -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestQuadrilateralMeshConfig, tnlMeshVertexTag, Dimensions > -{ - enum { enabled = true }; -}; + public: -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestQuadrilateralMeshConfig, tnlMeshEdgeTag, Dimensions > -{ - enum { enabled = true }; + static constexpr bool entityStorage( int dimensions ) { return true; }; + template< typename MeshEntity > static constexpr bool subentityStorage( MeshEntity, int SubentityDimensions ) { return true; }; + template< typename MeshEntity > static constexpr bool subentityOrientationStorage( MeshEntity, int SubentityDimensions ) { return true; }; + template< typename MeshEntity > static constexpr bool superentityStorage( MeshEntity, int SuperentityDimensions ) { return true; }; }; -typedef tnlMeshConfigBase< tnlMeshTetrahedronTag, 3, double, int, int, void > TestTetrahedronMeshConfig; - -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestTetrahedronMeshConfig, tnlMeshVertexTag, Dimensions > +class TestQuadrilateralMeshConfig : public tnlMeshConfigBase< tnlMeshQuadrilateralTag > { - enum { enabled = true }; -}; + public: -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestTetrahedronMeshConfig, tnlMeshEdgeTag, Dimensions > -{ - enum { enabled = true }; + static constexpr bool entityStorage( int dimensions ) { return true; }; + template< typename MeshEntity > static constexpr bool subentityStorage( MeshEntity, int SubentityDimensions ) { return true; }; + template< typename MeshEntity > static constexpr bool subentityOrientationStorage( MeshEntity, int SubentityDimensions ) { return true; }; + template< typename MeshEntity > static constexpr bool superentityStorage( MeshEntity, int SuperentityDimensions ) { return true; }; }; -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestTetrahedronMeshConfig, tnlMeshTriangleTag, Dimensions > +class TestTetrahedronMeshConfig : public tnlMeshConfigBase< tnlMeshTetrahedronTag > { - enum { enabled = true }; -}; - -typedef tnlMeshConfigBase< tnlMeshHexahedronTag, 3, double, int, int, void > TestHexahedronMeshConfig; + public: -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestHexahedronMeshConfig, tnlMeshVertexTag, Dimensions > -{ - enum { enabled = true }; + static constexpr bool entityStorage( int dimensions ) { return true; }; + template< typename MeshEntity > static constexpr bool subentityStorage( MeshEntity, int SubentityDimensions ) { return true; }; + template< typename MeshEntity > static constexpr bool subentityOrientationStorage( MeshEntity, int SubentityDimensions ) { return true; }; + template< typename MeshEntity > static constexpr bool superentityStorage( MeshEntity, int SuperentityDimensions ) { return true; }; }; -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestHexahedronMeshConfig, tnlMeshEdgeTag, Dimensions > +class TestHexahedronMeshConfig : public tnlMeshConfigBase< tnlMeshHexahedronTag > { - enum { enabled = true }; -}; + public: -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestHexahedronMeshConfig, tnlMeshTriangleTag, Dimensions > -{ - enum { enabled = true }; + static constexpr bool entityStorage( int dimensions ) { return true; }; + template< typename MeshEntity > static constexpr bool subentityStorage( MeshEntity, int SubentityDimensions ) { return true; }; + template< typename MeshEntity > static constexpr bool subentityOrientationStorage( MeshEntity, int SubentityDimensions ) { return true; }; + template< typename MeshEntity > static constexpr bool superentityStorage( MeshEntity, int SuperentityDimensions ) { return true; }; }; template< typename RealType, typename Device, typename IndexType > diff --git a/tools/src/tnl-mesh-convert.h b/tools/src/tnl-mesh-convert.h index bd0b694b7b..cef12af4bf 100644 --- a/tools/src/tnl-mesh-convert.h +++ b/tools/src/tnl-mesh-convert.h @@ -29,72 +29,85 @@ #include <mesh/tnlMeshIntegrityChecker.h> #include <core/mfilename.h> -template< int Dimensions > -bool readMeshWithDimensions( const tnlParameterContainer& parameters ) +template< typename MeshReader, + typename MeshType > +bool convertMesh( const tnlParameterContainer& parameters ) { const tnlString& inputFileName = parameters.getParameter< tnlString >( "input-file" ); const tnlString& outputFileName = parameters.getParameter< tnlString >( "output-file" ); - const tnlString inputFileExt = getFileExtension( inputFileName ); const tnlString outputFileExt = getFileExtension( outputFileName ); - if( Dimensions == 2 ) - { - typedef tnlMesh< tnlMeshConfigBase< tnlMeshTriangleTag > > MeshType; - MeshType mesh; - if( inputFileExt == "ng" && - ! tnlMeshReaderNetgen::readMesh<>( inputFileName, mesh, true ) ) - return false; - tnlMeshInitializer< tnlMeshConfigBase< tnlMeshTriangleTag > > meshInitializer; - meshInitializer.setVerbose( true ); - if( ! meshInitializer.initMesh( mesh ) ) - return false; - if( ! tnlMeshIntegrityChecker< MeshType >::checkMesh( mesh ) ) + MeshType mesh; + if( ! MeshReader::readMesh( inputFileName, mesh, true ) ) + return false; + tnlMeshInitializer< typename MeshType::Config > meshInitializer; + meshInitializer.setVerbose( true ); + if( ! meshInitializer.initMesh( mesh ) ) + return false; + if( ! tnlMeshIntegrityChecker< MeshType >::checkMesh( mesh ) ) + return false; + cout << "Writing the mesh to a file " << outputFileName << "." << endl; + if( outputFileExt == "tnl" ) + { + if( ! mesh.save( outputFileName ) ) + { + cerr << "I am not able to write the mesh into the file " << outputFileName << "." << endl; return false; - tnlString outputFile; - cout << "Writing the 2D mesh to the file " << outputFile << "." << endl; - if( outputFileExt == "tnl" ) - { - if( ! mesh.save( outputFile ) ) - { - cerr << "I am not able to write the mesh into the file " << outputFile << "." << endl; - return false; - } } - if( outputFileExt == "vtk" ) + } + if( outputFileExt == "vtk" ) + { + if( ! tnlMeshWriterVTKLegacy::write( outputFileName, mesh, true ) ) + { + cerr << "I am not able to write the mesh into the file " << outputFileName << "." << endl; + return false; + } + return true; + } +} + +bool readNetgenMesh( const tnlParameterContainer& parameters ) +{ + const tnlString& inputFileName = parameters.getParameter< tnlString >( "input-file" ); + + tnlMeshReaderNetgen meshReader; + if( ! meshReader.detectMesh( inputFileName ) ) + return false; + + cout << "Reading mesh with " << meshReader.getDimensions() << " dimensions..." << endl; + + if( meshReader.getDimensions() == 2 ) + { + if( meshReader.getVerticesInCell() == 3 ) { - if( ! tnlMeshWriterVTKLegacy::write( outputFileName, mesh, true ) ) - { - cerr << "I am not able to write the mesh into the file " << outputFile << "." << endl; - return false; - } + typedef tnlMesh< tnlMeshConfigBase< tnlMeshTriangleTag > > MeshType; + cout << "Mesh consisting of triangles was detected ... " << endl; + return convertMesh< tnlMeshReaderNetgen, MeshType >( parameters ); } + if( meshReader.getVerticesInCell() == 4 ) + { + typedef tnlMesh< tnlMeshConfigBase< tnlMeshQuadrilateralTag > > MeshType; + cout << "Mesh consisting of quadrilaterals was detected ... " << endl; + return convertMesh< tnlMeshReaderNetgen, MeshType >( parameters ); + } } - if( Dimensions == 3 ) + if( meshReader.getDimensions() == 3 ) { - typedef tnlMesh< tnlMeshConfigBase< tnlMeshTetrahedronTag > > MeshType; - MeshType mesh; - if( inputFileExt == "ng" && - ! tnlMeshReaderNetgen::readMesh<>( inputFileName, mesh, true ) ) - return false; - tnlMeshInitializer< tnlMeshConfigBase< tnlMeshTetrahedronTag > > meshInitializer; - meshInitializer.setVerbose( true ); - if( ! meshInitializer.initMesh( mesh ) ) - return false; - if( ! tnlMeshIntegrityChecker< MeshType >::checkMesh( mesh ) ) - return false; - tnlString outputFile; - if( parameters.getParameter< tnlString >( "output-file", outputFile ) ) + if( meshReader.getVerticesInCell() == 4 ) { - cout << "Writing the 3D mesh to the file " << outputFile << "." << endl; - if( ! mesh.save( outputFile ) ) - { - cerr << "I am not able to safe the mesh into the file " << outputFile << "." << endl; - return false; - } + typedef tnlMesh< tnlMeshConfigBase< tnlMeshTetrahedronTag > > MeshType; + cout << "Mesh consisting of tetrahedrons was detected ... " << endl; + return convertMesh< tnlMeshReaderNetgen, MeshType >( parameters ); + } + if( meshReader.getVerticesInCell() == 8 ) + { + typedef tnlMesh< tnlMeshConfigBase< tnlMeshHexahedronTag > > MeshType; + cout << "Mesh consisting of hexahedrons was detected ... " << endl; + return convertMesh< tnlMeshReaderNetgen, MeshType >( parameters ); } } - - return true; + cerr << "Wrong mesh dimensions were detected ( " << meshReader.getDimensions() << " )." << endl; + return false; } bool convertMesh( const tnlParameterContainer& parameters ) @@ -103,19 +116,8 @@ bool convertMesh( const tnlParameterContainer& parameters ) const tnlString fileExt = getFileExtension( inputFileName ); if( fileExt == "ng" ) - { - int dimensions; - if( ! tnlMeshReaderNetgen::detectDimensions( inputFileName, dimensions ) ) - return false; - if( dimensions == 2 && - ! readMeshWithDimensions< 2 >( parameters ) ) - return false; - if( dimensions == 3 && - ! readMeshWithDimensions< 3 >( parameters ) ) - return false; - } - - return true; + return readNetgenMesh( parameters ); } + #endif /* TNL_MESH_CONVERT_H_ */ diff --git a/tools/src/tnl-view.cpp b/tools/src/tnl-view.cpp index 45a285f2fd..99e32b54d0 100644 --- a/tools/src/tnl-view.cpp +++ b/tools/src/tnl-view.cpp @@ -119,7 +119,7 @@ int main( int argc, char* argv[] ) /*tnlString meshFile = parameters. getParameter< tnlString >( "mesh" ); struct MeshConfig : public tnlMeshConfigBase< 2 > { - typedef tnlMeshTriangleTag CellTag; + typedef tnlMeshTriangleTag CellType; }; tnlMesh< MeshConfig > mesh; if( ! mesh.load( meshFile ) ) -- GitLab