Loading src/TNL/Meshes/MeshDetails/ConfigValidator.h +4 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #include <TNL/Meshes/Topologies/SubentityVertexMap.h> #include <TNL/Meshes/DimensionTag.h> #include <TNL/Meshes/Topologies/Polyhedron.h> namespace TNL { namespace Meshes { Loading Loading @@ -89,6 +90,9 @@ class ConfigValidatorLayerCell static_assert( MeshConfig::subentityStorage( CellTopology::dimension, 0 ), "subvertices of cells must be stored" ); static_assert( !std::is_same< CellTopology, Topologies::Polyhedron >::value || MeshConfig::subentityStorage( CellTopology::dimension, 2 ), "faces of cells must be stored for polyhedral meshes" ); }; template< typename MeshConfig > Loading src/TNL/Meshes/MeshDetails/initializer/SubentitySeedsCreator.h +68 −68 Original line number Diff line number Diff line Loading @@ -70,6 +70,38 @@ public: } }; template< typename MeshConfig, typename EntityTopology > class SubentitySeedsCreator< MeshConfig, EntityTopology, DimensionTag< 0 > > { using MeshType = Mesh< MeshConfig >; using MeshTraitsType = MeshTraits< MeshConfig >; using InitializerType = Initializer< MeshConfig >; using GlobalIndexType = typename MeshTraitsType::GlobalIndexType; using LocalIndexType = typename MeshTraitsType::LocalIndexType; using EntityTraitsType = typename MeshTraitsType::template EntityTraits< EntityTopology::dimension >; using SubentityTraits = typename MeshTraitsType::template SubentityTraits< EntityTopology, 0 >; using SubentityTopology = typename SubentityTraits::SubentityTopology; public: using SubentitySeedArray = Containers::StaticArray< SubentityTraits::count, EntitySeed< MeshConfig, SubentityTopology > >; static SubentitySeedArray create( InitializerType& initializer, MeshType& mesh, const GlobalIndexType entityIndex ) { const auto& subvertices = mesh.template getSubentitiesMatrix< EntityTopology::dimension, 0 >().getRow( entityIndex ); SubentitySeedArray seeds; for( LocalIndexType i = 0; i < seeds.getSize(); i++ ) seeds[ i ].setCornerId( 0, subvertices.getColumnIndex( i ) ); return seeds; } constexpr static LocalIndexType getSubentitiesCount( InitializerType& initializer, MeshType& mesh, const GlobalIndexType entityIndex ) { return SubentityTraits::count; } }; template< typename MeshConfig > class SubentitySeedsCreator< MeshConfig, Topologies::Polygon, DimensionTag< 1 > > { Loading Loading @@ -112,6 +144,42 @@ public: } }; template< typename MeshConfig > class SubentitySeedsCreator< MeshConfig, Topologies::Polygon, DimensionTag< 0 > > { using MeshType = Mesh< MeshConfig >; using MeshTraitsType = MeshTraits< MeshConfig >; using InitializerType = Initializer< MeshConfig >; using GlobalIndexType = typename MeshTraitsType::GlobalIndexType; using LocalIndexType = typename MeshTraitsType::LocalIndexType; using EntityTopology = Topologies::Polygon; using EntityTraitsType = typename MeshTraitsType::template EntityTraits< EntityTopology::dimension >; using SubentityTraits = typename MeshTraitsType::template SubentityTraits< EntityTopology, 0 >; using SubentityTopology = typename SubentityTraits::SubentityTopology; public: using SubentitySeedArray = Containers::Array< EntitySeed< MeshConfig, SubentityTopology >, Devices::Host, LocalIndexType >; static SubentitySeedArray create( InitializerType& initializer, MeshType& mesh, const GlobalIndexType entityIndex ) { const auto& subvertices = mesh.template getSubentitiesMatrix< EntityTopology::dimension, 0 >().getRow( entityIndex ); const LocalIndexType subverticesCount = mesh.template getSubentitiesCount< EntityTopology::dimension, 0 >( entityIndex ); SubentitySeedArray seeds; seeds.setSize( subverticesCount ); for( LocalIndexType i = 0; i < seeds.getSize(); i++ ) seeds[ i ].setCornerId( 0, subvertices.getColumnIndex( i ) ); return seeds; } static LocalIndexType getSubentitiesCount( InitializerType& initializer, MeshType& mesh, const GlobalIndexType entityIndex ) { return mesh.template getSubentitiesCount< EntityTopology::dimension, 0 >( entityIndex ); } }; template< typename MeshConfig > class SubentitySeedsCreator< MeshConfig, Topologies::Polyhedron, DimensionTag< 2 > > { Loading Loading @@ -290,73 +358,5 @@ public: } }; template< typename MeshConfig, typename EntityTopology > class SubentitySeedsCreator< MeshConfig, EntityTopology, DimensionTag< 0 > > { using MeshType = Mesh< MeshConfig >; using MeshTraitsType = MeshTraits< MeshConfig >; using InitializerType = Initializer< MeshConfig >; using GlobalIndexType = typename MeshTraitsType::GlobalIndexType; using LocalIndexType = typename MeshTraitsType::LocalIndexType; using EntityTraitsType = typename MeshTraitsType::template EntityTraits< EntityTopology::dimension >; using SubentityTraits = typename MeshTraitsType::template SubentityTraits< EntityTopology, 0 >; using SubentityTopology = typename SubentityTraits::SubentityTopology; public: using SubentitySeedArray = Containers::StaticArray< SubentityTraits::count, EntitySeed< MeshConfig, SubentityTopology > >; static SubentitySeedArray create( InitializerType& initializer, MeshType& mesh, const GlobalIndexType entityIndex ) { const auto& subvertices = mesh.template getSubentitiesMatrix< EntityTopology::dimension, 0 >().getRow( entityIndex ); SubentitySeedArray seeds; for( LocalIndexType i = 0; i < seeds.getSize(); i++ ) seeds[ i ].setCornerId( 0, subvertices.getColumnIndex( i ) ); return seeds; } constexpr static LocalIndexType getSubentitiesCount( InitializerType& initializer, MeshType& mesh, const GlobalIndexType entityIndex ) { return SubentityTraits::count; } }; template< typename MeshConfig > class SubentitySeedsCreator< MeshConfig, Topologies::Polygon, DimensionTag< 0 > > { using MeshType = Mesh< MeshConfig >; using MeshTraitsType = MeshTraits< MeshConfig >; using InitializerType = Initializer< MeshConfig >; using GlobalIndexType = typename MeshTraitsType::GlobalIndexType; using LocalIndexType = typename MeshTraitsType::LocalIndexType; using EntityTopology = Topologies::Polygon; using EntityTraitsType = typename MeshTraitsType::template EntityTraits< EntityTopology::dimension >; using SubentityTraits = typename MeshTraitsType::template SubentityTraits< EntityTopology, 0 >; using SubentityTopology = typename SubentityTraits::SubentityTopology; public: using SubentitySeedArray = Containers::Array< EntitySeed< MeshConfig, SubentityTopology >, Devices::Host, LocalIndexType >; static SubentitySeedArray create( InitializerType& initializer, MeshType& mesh, const GlobalIndexType entityIndex ) { const auto& subvertices = mesh.template getSubentitiesMatrix< EntityTopology::dimension, 0 >().getRow( entityIndex ); const LocalIndexType subverticesCount = mesh.template getSubentitiesCount< EntityTopology::dimension, 0 >( entityIndex ); SubentitySeedArray seeds; seeds.setSize( subverticesCount ); for( LocalIndexType i = 0; i < seeds.getSize(); i++ ) seeds[ i ].setCornerId( 0, subvertices.getColumnIndex( i ) ); return seeds; } static LocalIndexType getSubentitiesCount( InitializerType& initializer, MeshType& mesh, const GlobalIndexType entityIndex ) { return mesh.template getSubentitiesCount< EntityTopology::dimension, 0 >( entityIndex ); } }; } // namespace Meshes } // namespace TNL src/TNL/Meshes/MeshDetails/layers/SubentityStorageLayer.h +19 −4 Original line number Diff line number Diff line Loading @@ -20,8 +20,6 @@ #include <TNL/Meshes/DimensionTag.h> #include <TNL/Meshes/MeshDetails/traits/MeshTraits.h> #include <TNL/Meshes/MeshDetails/traits/WeakStorageTraits.h> #include <TNL/Meshes/Topologies/Polygon.h> #include <TNL/Meshes/Topologies/Polyhedron.h> namespace TNL { namespace Meshes { Loading @@ -31,8 +29,7 @@ template< typename MeshConfig, typename EntityTopology, typename SubdimensionTag, bool SubentityStorage = WeakSubentityStorageTrait< MeshConfig, Device, typename MeshTraits< MeshConfig, Device >::template EntityTraits< EntityTopology::dimension >::EntityTopology, SubdimensionTag >::storageEnabled, bool dynamicTopology = std::is_same< EntityTopology, Topologies::Polygon >::value || std::is_same< EntityTopology, Topologies::Polyhedron >::value > bool DynamicTopology = Topologies::isDynamicTopology< EntityTopology >::value > class SubentityStorageLayer; template< typename MeshConfig, Loading Loading @@ -87,6 +84,12 @@ protected: } }; /**** * Mesh subentity storage layer with specializations * * SUBENTITY STORAGE DYNAMIC TOPOLOGY * TRUE FALSE */ template< typename MeshConfig, typename Device, typename EntityTopology, Loading Loading @@ -183,6 +186,12 @@ private: friend class SubentityStorageLayer; }; /**** * Mesh subentity storage layer with specializations * * SUBENTITY STORAGE DYNAMIC TOPOLOGY * TRUE TRUE */ template< typename MeshConfig, typename Device, typename EntityTopology, Loading Loading @@ -297,6 +306,12 @@ private: friend class SubentityStorageLayer; }; /**** * Mesh subentity storage layer with specializations * * SUBENTITY STORAGE DYNAMIC TOPOLOGY * FALSE TRUE/FALSE */ template< typename MeshConfig, typename Device, typename EntityTopology, Loading src/TNL/Meshes/MeshDetails/traits/MeshSubentityTraits.h +12 −1 Original line number Diff line number Diff line Loading @@ -19,11 +19,16 @@ #include <TNL/Containers/StaticArray.h> #include <TNL/Meshes/MeshDetails/traits/MeshEntityTraits.h> #include <TNL/Meshes/Topologies/SubentityVertexMap.h> #include <TNL/Meshes/Topologies/Polygon.h> namespace TNL { namespace Meshes { /**** * Mesh subentity traits with specializations * * DYNAMIC TOPOLOGY * FALSE */ template< typename MeshConfig, typename Device, typename EntityTopology, Loading Loading @@ -58,6 +63,12 @@ public: }; }; /**** * Mesh subentity traits with specializations * * DYNAMIC TOPOLOGY * TRUE */ template< typename MeshConfig, typename Device, typename EntityTopology, Loading src/TNL/Meshes/MeshDetails/traits/MeshTraits.h +2 −2 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ #include <TNL/Meshes/DimensionTag.h> #include <TNL/Meshes/Topologies/Vertex.h> #include <TNL/Meshes/Topologies/Polyhedron.h> #include <TNL/Meshes/Topologies/isDynamicTopology.h> namespace TNL { namespace Meshes { Loading @@ -42,8 +43,7 @@ template< typename MeshConfig, typename Device, typename EntityTopology, int Dimension, bool dynamicTopology = std::is_same< EntityTopology, Topologies::Polygon >::value || std::is_same< EntityTopology, Topologies::Polyhedron >::value > bool dynamicTopology = Topologies::isDynamicTopology< EntityTopology >::value > class MeshSubentityTraits; template< typename MeshConfig, typename Device, typename MeshEntity, int Superdimension > class MeshSuperentityTraits; Loading Loading
src/TNL/Meshes/MeshDetails/ConfigValidator.h +4 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #include <TNL/Meshes/Topologies/SubentityVertexMap.h> #include <TNL/Meshes/DimensionTag.h> #include <TNL/Meshes/Topologies/Polyhedron.h> namespace TNL { namespace Meshes { Loading Loading @@ -89,6 +90,9 @@ class ConfigValidatorLayerCell static_assert( MeshConfig::subentityStorage( CellTopology::dimension, 0 ), "subvertices of cells must be stored" ); static_assert( !std::is_same< CellTopology, Topologies::Polyhedron >::value || MeshConfig::subentityStorage( CellTopology::dimension, 2 ), "faces of cells must be stored for polyhedral meshes" ); }; template< typename MeshConfig > Loading
src/TNL/Meshes/MeshDetails/initializer/SubentitySeedsCreator.h +68 −68 Original line number Diff line number Diff line Loading @@ -70,6 +70,38 @@ public: } }; template< typename MeshConfig, typename EntityTopology > class SubentitySeedsCreator< MeshConfig, EntityTopology, DimensionTag< 0 > > { using MeshType = Mesh< MeshConfig >; using MeshTraitsType = MeshTraits< MeshConfig >; using InitializerType = Initializer< MeshConfig >; using GlobalIndexType = typename MeshTraitsType::GlobalIndexType; using LocalIndexType = typename MeshTraitsType::LocalIndexType; using EntityTraitsType = typename MeshTraitsType::template EntityTraits< EntityTopology::dimension >; using SubentityTraits = typename MeshTraitsType::template SubentityTraits< EntityTopology, 0 >; using SubentityTopology = typename SubentityTraits::SubentityTopology; public: using SubentitySeedArray = Containers::StaticArray< SubentityTraits::count, EntitySeed< MeshConfig, SubentityTopology > >; static SubentitySeedArray create( InitializerType& initializer, MeshType& mesh, const GlobalIndexType entityIndex ) { const auto& subvertices = mesh.template getSubentitiesMatrix< EntityTopology::dimension, 0 >().getRow( entityIndex ); SubentitySeedArray seeds; for( LocalIndexType i = 0; i < seeds.getSize(); i++ ) seeds[ i ].setCornerId( 0, subvertices.getColumnIndex( i ) ); return seeds; } constexpr static LocalIndexType getSubentitiesCount( InitializerType& initializer, MeshType& mesh, const GlobalIndexType entityIndex ) { return SubentityTraits::count; } }; template< typename MeshConfig > class SubentitySeedsCreator< MeshConfig, Topologies::Polygon, DimensionTag< 1 > > { Loading Loading @@ -112,6 +144,42 @@ public: } }; template< typename MeshConfig > class SubentitySeedsCreator< MeshConfig, Topologies::Polygon, DimensionTag< 0 > > { using MeshType = Mesh< MeshConfig >; using MeshTraitsType = MeshTraits< MeshConfig >; using InitializerType = Initializer< MeshConfig >; using GlobalIndexType = typename MeshTraitsType::GlobalIndexType; using LocalIndexType = typename MeshTraitsType::LocalIndexType; using EntityTopology = Topologies::Polygon; using EntityTraitsType = typename MeshTraitsType::template EntityTraits< EntityTopology::dimension >; using SubentityTraits = typename MeshTraitsType::template SubentityTraits< EntityTopology, 0 >; using SubentityTopology = typename SubentityTraits::SubentityTopology; public: using SubentitySeedArray = Containers::Array< EntitySeed< MeshConfig, SubentityTopology >, Devices::Host, LocalIndexType >; static SubentitySeedArray create( InitializerType& initializer, MeshType& mesh, const GlobalIndexType entityIndex ) { const auto& subvertices = mesh.template getSubentitiesMatrix< EntityTopology::dimension, 0 >().getRow( entityIndex ); const LocalIndexType subverticesCount = mesh.template getSubentitiesCount< EntityTopology::dimension, 0 >( entityIndex ); SubentitySeedArray seeds; seeds.setSize( subverticesCount ); for( LocalIndexType i = 0; i < seeds.getSize(); i++ ) seeds[ i ].setCornerId( 0, subvertices.getColumnIndex( i ) ); return seeds; } static LocalIndexType getSubentitiesCount( InitializerType& initializer, MeshType& mesh, const GlobalIndexType entityIndex ) { return mesh.template getSubentitiesCount< EntityTopology::dimension, 0 >( entityIndex ); } }; template< typename MeshConfig > class SubentitySeedsCreator< MeshConfig, Topologies::Polyhedron, DimensionTag< 2 > > { Loading Loading @@ -290,73 +358,5 @@ public: } }; template< typename MeshConfig, typename EntityTopology > class SubentitySeedsCreator< MeshConfig, EntityTopology, DimensionTag< 0 > > { using MeshType = Mesh< MeshConfig >; using MeshTraitsType = MeshTraits< MeshConfig >; using InitializerType = Initializer< MeshConfig >; using GlobalIndexType = typename MeshTraitsType::GlobalIndexType; using LocalIndexType = typename MeshTraitsType::LocalIndexType; using EntityTraitsType = typename MeshTraitsType::template EntityTraits< EntityTopology::dimension >; using SubentityTraits = typename MeshTraitsType::template SubentityTraits< EntityTopology, 0 >; using SubentityTopology = typename SubentityTraits::SubentityTopology; public: using SubentitySeedArray = Containers::StaticArray< SubentityTraits::count, EntitySeed< MeshConfig, SubentityTopology > >; static SubentitySeedArray create( InitializerType& initializer, MeshType& mesh, const GlobalIndexType entityIndex ) { const auto& subvertices = mesh.template getSubentitiesMatrix< EntityTopology::dimension, 0 >().getRow( entityIndex ); SubentitySeedArray seeds; for( LocalIndexType i = 0; i < seeds.getSize(); i++ ) seeds[ i ].setCornerId( 0, subvertices.getColumnIndex( i ) ); return seeds; } constexpr static LocalIndexType getSubentitiesCount( InitializerType& initializer, MeshType& mesh, const GlobalIndexType entityIndex ) { return SubentityTraits::count; } }; template< typename MeshConfig > class SubentitySeedsCreator< MeshConfig, Topologies::Polygon, DimensionTag< 0 > > { using MeshType = Mesh< MeshConfig >; using MeshTraitsType = MeshTraits< MeshConfig >; using InitializerType = Initializer< MeshConfig >; using GlobalIndexType = typename MeshTraitsType::GlobalIndexType; using LocalIndexType = typename MeshTraitsType::LocalIndexType; using EntityTopology = Topologies::Polygon; using EntityTraitsType = typename MeshTraitsType::template EntityTraits< EntityTopology::dimension >; using SubentityTraits = typename MeshTraitsType::template SubentityTraits< EntityTopology, 0 >; using SubentityTopology = typename SubentityTraits::SubentityTopology; public: using SubentitySeedArray = Containers::Array< EntitySeed< MeshConfig, SubentityTopology >, Devices::Host, LocalIndexType >; static SubentitySeedArray create( InitializerType& initializer, MeshType& mesh, const GlobalIndexType entityIndex ) { const auto& subvertices = mesh.template getSubentitiesMatrix< EntityTopology::dimension, 0 >().getRow( entityIndex ); const LocalIndexType subverticesCount = mesh.template getSubentitiesCount< EntityTopology::dimension, 0 >( entityIndex ); SubentitySeedArray seeds; seeds.setSize( subverticesCount ); for( LocalIndexType i = 0; i < seeds.getSize(); i++ ) seeds[ i ].setCornerId( 0, subvertices.getColumnIndex( i ) ); return seeds; } static LocalIndexType getSubentitiesCount( InitializerType& initializer, MeshType& mesh, const GlobalIndexType entityIndex ) { return mesh.template getSubentitiesCount< EntityTopology::dimension, 0 >( entityIndex ); } }; } // namespace Meshes } // namespace TNL
src/TNL/Meshes/MeshDetails/layers/SubentityStorageLayer.h +19 −4 Original line number Diff line number Diff line Loading @@ -20,8 +20,6 @@ #include <TNL/Meshes/DimensionTag.h> #include <TNL/Meshes/MeshDetails/traits/MeshTraits.h> #include <TNL/Meshes/MeshDetails/traits/WeakStorageTraits.h> #include <TNL/Meshes/Topologies/Polygon.h> #include <TNL/Meshes/Topologies/Polyhedron.h> namespace TNL { namespace Meshes { Loading @@ -31,8 +29,7 @@ template< typename MeshConfig, typename EntityTopology, typename SubdimensionTag, bool SubentityStorage = WeakSubentityStorageTrait< MeshConfig, Device, typename MeshTraits< MeshConfig, Device >::template EntityTraits< EntityTopology::dimension >::EntityTopology, SubdimensionTag >::storageEnabled, bool dynamicTopology = std::is_same< EntityTopology, Topologies::Polygon >::value || std::is_same< EntityTopology, Topologies::Polyhedron >::value > bool DynamicTopology = Topologies::isDynamicTopology< EntityTopology >::value > class SubentityStorageLayer; template< typename MeshConfig, Loading Loading @@ -87,6 +84,12 @@ protected: } }; /**** * Mesh subentity storage layer with specializations * * SUBENTITY STORAGE DYNAMIC TOPOLOGY * TRUE FALSE */ template< typename MeshConfig, typename Device, typename EntityTopology, Loading Loading @@ -183,6 +186,12 @@ private: friend class SubentityStorageLayer; }; /**** * Mesh subentity storage layer with specializations * * SUBENTITY STORAGE DYNAMIC TOPOLOGY * TRUE TRUE */ template< typename MeshConfig, typename Device, typename EntityTopology, Loading Loading @@ -297,6 +306,12 @@ private: friend class SubentityStorageLayer; }; /**** * Mesh subentity storage layer with specializations * * SUBENTITY STORAGE DYNAMIC TOPOLOGY * FALSE TRUE/FALSE */ template< typename MeshConfig, typename Device, typename EntityTopology, Loading
src/TNL/Meshes/MeshDetails/traits/MeshSubentityTraits.h +12 −1 Original line number Diff line number Diff line Loading @@ -19,11 +19,16 @@ #include <TNL/Containers/StaticArray.h> #include <TNL/Meshes/MeshDetails/traits/MeshEntityTraits.h> #include <TNL/Meshes/Topologies/SubentityVertexMap.h> #include <TNL/Meshes/Topologies/Polygon.h> namespace TNL { namespace Meshes { /**** * Mesh subentity traits with specializations * * DYNAMIC TOPOLOGY * FALSE */ template< typename MeshConfig, typename Device, typename EntityTopology, Loading Loading @@ -58,6 +63,12 @@ public: }; }; /**** * Mesh subentity traits with specializations * * DYNAMIC TOPOLOGY * TRUE */ template< typename MeshConfig, typename Device, typename EntityTopology, Loading
src/TNL/Meshes/MeshDetails/traits/MeshTraits.h +2 −2 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ #include <TNL/Meshes/DimensionTag.h> #include <TNL/Meshes/Topologies/Vertex.h> #include <TNL/Meshes/Topologies/Polyhedron.h> #include <TNL/Meshes/Topologies/isDynamicTopology.h> namespace TNL { namespace Meshes { Loading @@ -42,8 +43,7 @@ template< typename MeshConfig, typename Device, typename EntityTopology, int Dimension, bool dynamicTopology = std::is_same< EntityTopology, Topologies::Polygon >::value || std::is_same< EntityTopology, Topologies::Polyhedron >::value > bool dynamicTopology = Topologies::isDynamicTopology< EntityTopology >::value > class MeshSubentityTraits; template< typename MeshConfig, typename Device, typename MeshEntity, int Superdimension > class MeshSuperentityTraits; Loading