Loading src/TNL/Meshes/Mesh.h +3 −3 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ #include <TNL/Meshes/MeshDetails/layers/MeshStorageLayer.h> #include <TNL/Meshes/MeshDetails/config/MeshConfigValidator.h> #include <TNL/Meshes/MeshDetails/initializer/MeshInitializer.h> #include <TNL/Meshes/MeshDetails/layers/MeshSuperentityStorageRebinder.h> #include <TNL/Meshes/MeshDetails/layers/MeshEntityStorageRebinder.h> namespace TNL { namespace Meshes { Loading Loading @@ -94,7 +94,7 @@ class Mesh protected: // Methods for the mesh initializer using StorageBaseType::getEntitiesArray; using StorageBaseType::getSubentityStorageNetwork; using StorageBaseType::getSuperentityStorageNetwork; MeshConfigValidator< MeshConfig > configValidator; Loading @@ -102,7 +102,7 @@ class Mesh friend MeshInitializer< MeshConfig >; template< typename Mesh, typename DimensionsTag, typename SuperdimensionsTag > friend struct MeshSuperentityStorageRebinderWorker; friend struct MeshEntityStorageRebinderWorker; }; template< typename MeshConfig > Loading src/TNL/Meshes/MeshDetails/MeshEntity_impl.h +5 −5 Original line number Diff line number Diff line Loading @@ -45,7 +45,7 @@ bool MeshEntity< MeshConfig, EntityTopology >:: save( File& file ) const { if( ! MeshSubentityStorageLayers< MeshConfig, EntityTopology >::save( file ) /*|| if( ! MeshSubentityAccess< MeshConfig, EntityTopology >::save( file ) /*|| ! MeshSuperentityStorageLayers< MeshConfig, EntityTopology >::save( file )*/ ) return false; return true; Loading @@ -57,7 +57,7 @@ bool MeshEntity< MeshConfig, EntityTopology >:: load( File& file ) { if( ! MeshSubentityStorageLayers< MeshConfig, EntityTopology >::load( file ) /*|| if( ! MeshSubentityAccess< MeshConfig, EntityTopology >::load( file ) /*|| ! MeshSuperentityStorageLayers< MeshConfig, EntityTopology >::load( file ) */ ) return false; return true; Loading @@ -69,8 +69,8 @@ void MeshEntity< MeshConfig, EntityTopology >:: print( std::ostream& str ) const { str << "\t Mesh entity dimension: " << EntityTopology::dimensions << std::endl; MeshSubentityStorageLayers< MeshConfig, EntityTopology >::print( str ); str << "\t Mesh entity dimensions: " << EntityTopology::dimensions << std::endl; MeshSubentityAccess< MeshConfig, EntityTopology >::print( str ); MeshSuperentityAccess< MeshConfig, EntityTopology >::print( str ); } Loading @@ -80,7 +80,7 @@ bool MeshEntity< MeshConfig, EntityTopology >:: operator==( const MeshEntity& entity ) const { return ( MeshSubentityStorageLayers< MeshConfig, EntityTopology >::operator==( entity ) && return ( MeshSubentityAccess< MeshConfig, EntityTopology >::operator==( entity ) && MeshSuperentityAccess< MeshConfig, EntityTopology >::operator==( entity ) && MeshEntityId< typename MeshConfig::IdType, typename MeshConfig::GlobalIndexType >::operator==( entity ) ); Loading src/TNL/Meshes/MeshDetails/Mesh_impl.h +4 −4 Original line number Diff line number Diff line Loading @@ -131,7 +131,7 @@ load( File& file ) return false; } // update pointers from entities into the superentity storage network MeshSuperentityStorageRebinder< Mesh< MeshConfig > >::exec( *this ); MeshEntityStorageRebinder< Mesh< MeshConfig > >::exec( *this ); return true; } Loading @@ -154,14 +154,14 @@ operator==( const Mesh& mesh ) const template< typename MeshConfig > bool Mesh< MeshConfig >:: init( const typename Mesh< MeshConfig >::MeshTraitsType::PointArrayType& points, const typename Mesh< MeshConfig >::MeshTraitsType::CellSeedArrayType& cellSeeds ) init( const typename MeshTraitsType::PointArrayType& points, const typename MeshTraitsType::CellSeedArrayType& cellSeeds ) { MeshInitializer< MeshConfig> meshInitializer; if( ! meshInitializer.createMesh( points, cellSeeds, *this ) ) return false; // update pointers from entities into the superentity storage network MeshSuperentityStorageRebinder< Mesh< MeshConfig > >::exec( *this ); MeshEntityStorageRebinder< Mesh< MeshConfig > >::exec( *this ); return true; } Loading src/TNL/Meshes/MeshDetails/initializer/MeshEntityInitializer.h +14 −16 Original line number Diff line number Diff line Loading @@ -56,11 +56,10 @@ class MeshEntityInitializer EntityTopology, typename MeshTraits< MeshConfig >::DimensionsTag >; static constexpr int Dimensions = DimensionsTag::value; using MeshTraitsType = MeshTraits< MeshConfig >; using GlobalIndexType = typename MeshTraitsType::GlobalIndexType; using LocalIndexType = typename MeshTraitsType::LocalIndexType; using EntityTraitsType = typename MeshTraitsType::template EntityTraits< Dimensions >; using EntityTraitsType = typename MeshTraitsType::template EntityTraits< DimensionsTag::value >; using EntityType = typename EntityTraitsType::EntityType; using SubvertexTraits = typename MeshTraitsType::template SubentityTraits< EntityTopology, 0 >; Loading @@ -76,7 +75,7 @@ public: static void initEntity( EntityType& entity, GlobalIndexType entityIndex, const SeedType& entitySeed, InitializerType& initializer) { for( LocalIndexType i = 0; i < entitySeed.getCornerIds().getSize(); i++ ) initializer.template setSubentityIndex< 0 >( entity, i, entitySeed.getCornerIds()[ i ] ); initializer.template setSubentityIndex< 0 >( entity, entityIndex, i, entitySeed.getCornerIds()[ i ] ); BaseType::initSubentities( entity, entityIndex, entitySeed, initializer ); } Loading Loading @@ -134,9 +133,8 @@ class MeshEntityInitializerLayer< MeshConfig, EntityTopology, typename DimensionsTag::Decrement >; static constexpr int Dimensions = DimensionsTag::value; using MeshTraitsType = MeshTraits< MeshConfig >; using SubentityTraitsType = typename MeshTraitsType::template SubentityTraits< EntityTopology, Dimensions >; using SubentityTraitsType = typename MeshTraitsType::template SubentityTraits< EntityTopology, DimensionsTag::value >; using GlobalIndexType = typename SubentityTraitsType::GlobalIndexType; using InitializerType = MeshInitializer< MeshConfig >; Loading @@ -157,7 +155,7 @@ protected: for( LocalIndexType i = 0; i < subentitySeeds.getSize(); i++ ) { const GlobalIndexType subentityIndex = meshInitializer.findEntitySeedIndex( subentitySeeds[ i ] ); InitializerType::template setSubentityIndex< DimensionsTag::value >( entity, i, subentityIndex ); meshInitializer.template setSubentityIndex< DimensionsTag::value >( entity, entityIndex, i, subentityIndex ); //std::cout << " Adding subentity " << subentityIndex << std::endl; meshInitializer. template getSuperentityInitializer< DimensionsTag >(). Loading Loading @@ -214,7 +212,7 @@ protected: for( LocalIndexType i = 0; i < subentitySeeds.getSize(); i++ ) { const GlobalIndexType subentityIndex = meshInitializer.findEntitySeedIndex( subentitySeeds[ i ] ); InitializerType::template setSubentityIndex< DimensionsTag::value >( entity, i, subentityIndex ); meshInitializer.template setSubentityIndex< DimensionsTag::value >( entity, entityIndex, i, subentityIndex ); //std::cout << " Adding subentity " << subentityIndex << std::endl; subentityOrientationsArray[ i ] = meshInitializer.template getReferenceOrientation< DimensionsTag >( subentityIndex ).createOrientation( subentitySeeds[ i ] ); //std::cout << " Subentity orientation = " << subentityOrientationsArray[ i ].getSubvertexPermutation() << std::endl; Loading Loading @@ -273,7 +271,7 @@ protected: for( LocalIndexType i = 0; i < subentitySeeds.getSize(); i++ ) { const GlobalIndexType subentityIndex = meshInitializer.findEntitySeedIndex( subentitySeeds[ i ] ); InitializerType::template setSubentityIndex< DimensionsTag::value >( entity, i, subentityIndex ); meshInitializer.template setSubentityIndex< DimensionsTag::value >( entity, entityIndex, i, subentityIndex ); //std::cout << " Adding subentity " << subentityIndex << std::endl; subentityOrientationsArray[ i ] = meshInitializer.template getReferenceOrientation< DimensionsTag >( subentitySeeds[ i ] ).createOrientation( subentitySeeds[ i ] ); } Loading Loading @@ -318,7 +316,7 @@ protected: for( LocalIndexType i = 0; i < subentitySeeds.getSize(); i++) { const GlobalIndexType subentityIndex = meshInitializer.findEntitySeedIndex( subentitySeeds[ i ] ); InitializerType::template setSubentityIndex< DimensionsTag::value >( entity, i, subentityIndex ); meshInitializer.template setSubentityIndex< DimensionsTag::value >( entity, entityIndex, i, subentityIndex ); } BaseType::initSubentities(entity, entityIndex, entitySeed, meshInitializer); Loading Loading @@ -411,7 +409,7 @@ protected: //std::cout << " Initiating subentities with " << DimensionsTag::value << " dimensions ... " << std::endl; for( LocalIndexType i = 0; i < entity.template getNumberOfSubentities< DimensionsTag::value >(); i++ ) { const GlobalIndexType subentityIndex = entity.template getSubentityIndex< DimensionsTag::value >( i ); const GlobalIndexType subentityIndex = meshInitializer.template getSubentityIndex< DimensionsTag::value >( entity, entityIndex, i ); meshInitializer.template getSuperentityInitializer< DimensionsTag >().addSuperentity( EntityDimensionsTag(), subentityIndex, entityIndex); } } Loading src/TNL/Meshes/MeshDetails/initializer/MeshInitializer.h +52 −53 Original line number Diff line number Diff line Loading @@ -54,18 +54,12 @@ class MeshInitializer public: using MeshType = Mesh< MeshConfig >; using MeshTraitsType = MeshTraits< MeshConfig >; static constexpr int Dimensions = MeshTraitsType::meshDimensions; using DimensionsTag = MeshDimensionsTag< Dimensions >; using DimensionsTag = MeshDimensionsTag< MeshTraitsType::meshDimensions >; using BaseType = MeshInitializerLayer< MeshConfig, DimensionsTag >; using PointArrayType = typename MeshTraitsType::PointArrayType; using CellSeedArrayType = typename MeshTraitsType::CellSeedArrayType; using GlobalIndexType = typename MeshTraitsType::GlobalIndexType; template< typename DimensionsTag, typename SuperdimensionsTag > using SuperentityStorageNetwork = typename MeshTraitsType::template SuperentityTraits< typename MeshTraitsType::template EntityTraits< DimensionsTag::value >::EntityTopology, SuperdimensionsTag::value >::StorageNetworkType; MeshInitializer() : verbose( false ), mesh( 0 ) Loading @@ -90,16 +84,33 @@ class MeshInitializer BaseType::createEntityReferenceOrientations(); if( verbose ) std::cout << "====== Initiating entities ==============" << std::endl; BaseType::initEntities( *this, points, cellSeeds ); BaseType::initEntities( *this, points, cellSeeds, mesh ); return true; } template< int Dimensions > bool setNumberOfEntities( const GlobalIndexType& entitiesCount ) { return mesh->template setNumberOfEntities< Dimensions >( entitiesCount ); } template< int Subdimensions, typename EntityType, typename LocalIndex, typename GlobalIndex > static void setSubentityIndex( EntityType& entity, const LocalIndex& localIndex, const GlobalIndex& globalIndex ) void setSubentityIndex( const EntityType& entity, const GlobalIndex& entityIndex, const LocalIndex& localIndex, const GlobalIndex& globalIndex ) { // The mesh entities are not yet bound to the storage network at this point, // so we operate directly on the storage. mesh->template getSubentityStorageNetwork< EntityType::EntityTopology::dimensions, Subdimensions >().getValues( entityIndex )[ localIndex ] = globalIndex; } template< int Subdimensions, typename EntityType, typename LocalIndex, typename GlobalIndex > GlobalIndex getSubentityIndex( const EntityType& entity, const GlobalIndex& entityIndex, const LocalIndex& localIndex ) { entity.template setSubentityIndex< Subdimensions >( localIndex, globalIndex ); // The mesh entities are not yet bound to the storage network at this point, // so we operate directly on the storage. return mesh->template getSubentityStorageNetwork< EntityType::EntityTopology::dimensions, Subdimensions >().getValues( entityIndex )[ localIndex ]; } template<typename SubDimensionsTag, typename MeshEntity > Loading @@ -109,18 +120,11 @@ class MeshInitializer return entity.template subentityOrientationsArray< SubDimensionTag::value >(); } template< int Dimensions > typename MeshTraitsType::template EntityTraits< Dimensions >::StorageArrayType& meshEntitiesArray() { return mesh->template getEntitiesArray< Dimensions >(); } template< typename EntityTopology, typename SuperdimensionsTag > typename MeshTraitsType::template SuperentityTraits< EntityTopology, SuperdimensionsTag::value >::StorageNetworkType& template< typename EntityTopology, int Superdimensions > typename MeshTraitsType::template SuperentityTraits< EntityTopology, Superdimensions >::StorageNetworkType& meshSuperentityStorageNetwork() { return mesh->template getSuperentityStorageNetwork< EntityTopology, SuperdimensionsTag >(); return mesh->template getSuperentityStorageNetwork< EntityTopology::dimensions, Superdimensions >(); } static void Loading @@ -141,7 +145,7 @@ class MeshInitializer const MeshEntityReferenceOrientation< MeshConfig, typename MeshTraitsType::template EntityTraits< DimensionsTag::value >::EntityTopology >& getReferenceOrientation( GlobalIndexType index ) const { return BaseType::getReferenceOrientation( DimensionTag(), index); return BaseType::getReferenceOrientation( DimensionsTag(), index ); } protected: Loading Loading @@ -191,21 +195,20 @@ class MeshInitializerLayer< MeshConfig, BaseType::createEntitySeedsFromCellSeeds( cellSeeds ); } void initEntities( InitializerType& initializer, const PointArrayType& points, const CellSeedArrayType& cellSeeds) void initEntities( InitializerType& initializer, const PointArrayType& points, const CellSeedArrayType& cellSeeds, MeshType& mesh ) { StorageArrayType& entityArray = initializer.template meshEntitiesArray< Dimensions >(); //cout << " Initiating entities with " << DimensionsTag::value << " dimensions ... " << std::endl; entityArray.setSize( cellSeeds.getSize() ); for( GlobalIndexType i = 0; i < entityArray.getSize(); i++ ) //std::cout << " Initiating entities with " << DimensionsTag::value << " dimensions ... " << std::endl; initializer.template setNumberOfEntities< Dimensions >( cellSeeds.getSize() ); for( GlobalIndexType i = 0; i < cellSeeds.getSize(); i++ ) { //cout << " Initiating entity " << i << std::endl; EntityInitializerType::initEntity( entityArray[i], i, cellSeeds[i], initializer ); //std::cout << " Initiating entity " << i << std::endl; EntityInitializerType::initEntity( mesh.template getEntity< Dimensions >( i ), i, cellSeeds[i], initializer ); } /*** * There are no superentities in this layer storing mesh cells. */ BaseType::initEntities( initializer, points ); BaseType::initEntities( initializer, points, mesh ); } using BaseType::findEntitySeedIndex; Loading Loading @@ -270,11 +273,10 @@ class MeshInitializerLayer< MeshConfig, typename DimensionsTag::Decrement > { using MeshTraitsType = MeshTraits< MeshConfig >; static constexpr int Dimensions = DimensionsTag::value; using BaseType = MeshInitializerLayer< MeshConfig, typename DimensionsTag::Decrement >; using MeshType = Mesh< MeshConfig >; using EntityTraitsType = typename MeshTraitsType::template EntityTraits< Dimensions >; using EntityTraitsType = typename MeshTraitsType::template EntityTraits< DimensionsTag::value >; using EntityTopology = typename EntityTraitsType::EntityTopology; using GlobalIndexType = typename MeshTraitsType::GlobalIndexType; using CellTopology = typename MeshTraitsType::CellTopology; Loading Loading @@ -325,24 +327,23 @@ class MeshInitializerLayer< MeshConfig, return this->superentityInitializer; } void initEntities( InitializerType& initializer, const PointArrayType& points ) void initEntities( InitializerType& initializer, const PointArrayType& points, MeshType& mesh ) { StorageArrayType& entityArray = initializer.template meshEntitiesArray< Dimensions >(); //cout << " Initiating entities with " << DimensionsTag::value << " dimensions ... " << std::endl; entityArray.setSize( this->seedsIndexedSet.getSize() ); //std::cout << " Initiating entities with " << DimensionsTag::value << " dimensions ... " << std::endl; initializer.template setNumberOfEntities< DimensionsTag::value >( this->seedsIndexedSet.getSize() ); EntitySeedArrayType seedsArray; seedsArray.setSize( this->seedsIndexedSet.getSize() ); this->seedsIndexedSet.toArray( seedsArray ); for( GlobalIndexType i = 0; i < this->seedsIndexedSet.getSize(); i++ ) { //cout << " Initiating entity " << i << std::endl; EntityInitializerType::initEntity( entityArray[ i ], i, seedsArray[ i ], initializer ); //std::cout << " Initiating entity " << i << std::endl; EntityInitializerType::initEntity( mesh.template getEntity< DimensionsTag::value >( i ), i, seedsArray[ i ], initializer ); } this->seedsIndexedSet.reset(); this->superentityInitializer.initSuperentities( initializer ); BaseType::initEntities(initializer, points); BaseType::initEntities( initializer, points, mesh ); } void createEntityReferenceOrientations() Loading Loading @@ -427,28 +428,27 @@ class MeshInitializerLayer< MeshConfig, return this->superentityInitializer; } void initEntities( InitializerType& initializer, const PointArrayType& points ) void initEntities( InitializerType& initializer, const PointArrayType& points, MeshType& mesh ) { EntityArrayType& entityArray = initializer.template meshEntitiesArray< DimensionsTag::value >(); //cout << " Initiating entities with " << DimensionsTag::value << " dimensions ... " << std::endl; entityArray.setSize( this->seedsIndexedSet.getSize() ); initializer.template setNumberOfEntities< DimensionsTag::value >( this->seedsIndexedSet.getSize() ); SeedArrayType seedsArray; seedsArray.setSize( this->seedsIndexedSet.getSize() ); this->seedsIndexedSet.toArray( seedsArray ); for( GlobalIndexType i = 0; i < this->seedsIndexedSet.getSize(); i++ ) { //cout << " Initiating entity " << i << std::endl; EntityInitializerType::initEntity( entityArray[ i ], i, seedsArray[ i ], initializer ); //std::cout << " Initiating entity " << i << std::endl; EntityInitializerType::initEntity( mesh.template getEntity< DimensionsTag::value >( i ), i, seedsArray[ i ], initializer ); } this->seedsIndexedSet.reset(); this->superentityInitializer.initSuperentities( initializer ); BaseType::initEntities(initializer, points); BaseType::initEntities( initializer, points, mesh ); } using BaseType::getReferenceOrientation; const ReferenceOrientationType& getReferenceOrientation( DimensionTag, GlobalIndexType index) const const ReferenceOrientationType& getReferenceOrientation( DimensionsTag, GlobalIndexType index ) const { return this->referenceOrientations[ index ]; } Loading Loading @@ -534,12 +534,11 @@ class MeshInitializerLayer< MeshConfig, void createEntitySeedsFromCellSeeds( const CellSeedArrayType& cellSeeds ) {} void initEntities( InitializerType& initializer, const PointArrayType& points ) void initEntities( InitializerType& initializer, const PointArrayType& points, MeshType& mesh ) { EntityArrayType& vertexArray = initializer.template meshEntitiesArray< DimensionsTag::value >(); vertexArray.setSize( points.getSize() ); for( GlobalIndexType i = 0; i < vertexArray.getSize(); i++ ) EntityInitializerType::setVertexPoint( vertexArray[i], points[i], initializer ); initializer.template setNumberOfEntities< 0 >( points.getSize() ); for( GlobalIndexType i = 0; i < points.getSize(); i++ ) EntityInitializerType::setVertexPoint( mesh.template getEntity< 0 >( i ), points[i], initializer ); superentityInitializer.initSuperentities( initializer ); } Loading Loading
src/TNL/Meshes/Mesh.h +3 −3 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ #include <TNL/Meshes/MeshDetails/layers/MeshStorageLayer.h> #include <TNL/Meshes/MeshDetails/config/MeshConfigValidator.h> #include <TNL/Meshes/MeshDetails/initializer/MeshInitializer.h> #include <TNL/Meshes/MeshDetails/layers/MeshSuperentityStorageRebinder.h> #include <TNL/Meshes/MeshDetails/layers/MeshEntityStorageRebinder.h> namespace TNL { namespace Meshes { Loading Loading @@ -94,7 +94,7 @@ class Mesh protected: // Methods for the mesh initializer using StorageBaseType::getEntitiesArray; using StorageBaseType::getSubentityStorageNetwork; using StorageBaseType::getSuperentityStorageNetwork; MeshConfigValidator< MeshConfig > configValidator; Loading @@ -102,7 +102,7 @@ class Mesh friend MeshInitializer< MeshConfig >; template< typename Mesh, typename DimensionsTag, typename SuperdimensionsTag > friend struct MeshSuperentityStorageRebinderWorker; friend struct MeshEntityStorageRebinderWorker; }; template< typename MeshConfig > Loading
src/TNL/Meshes/MeshDetails/MeshEntity_impl.h +5 −5 Original line number Diff line number Diff line Loading @@ -45,7 +45,7 @@ bool MeshEntity< MeshConfig, EntityTopology >:: save( File& file ) const { if( ! MeshSubentityStorageLayers< MeshConfig, EntityTopology >::save( file ) /*|| if( ! MeshSubentityAccess< MeshConfig, EntityTopology >::save( file ) /*|| ! MeshSuperentityStorageLayers< MeshConfig, EntityTopology >::save( file )*/ ) return false; return true; Loading @@ -57,7 +57,7 @@ bool MeshEntity< MeshConfig, EntityTopology >:: load( File& file ) { if( ! MeshSubentityStorageLayers< MeshConfig, EntityTopology >::load( file ) /*|| if( ! MeshSubentityAccess< MeshConfig, EntityTopology >::load( file ) /*|| ! MeshSuperentityStorageLayers< MeshConfig, EntityTopology >::load( file ) */ ) return false; return true; Loading @@ -69,8 +69,8 @@ void MeshEntity< MeshConfig, EntityTopology >:: print( std::ostream& str ) const { str << "\t Mesh entity dimension: " << EntityTopology::dimensions << std::endl; MeshSubentityStorageLayers< MeshConfig, EntityTopology >::print( str ); str << "\t Mesh entity dimensions: " << EntityTopology::dimensions << std::endl; MeshSubentityAccess< MeshConfig, EntityTopology >::print( str ); MeshSuperentityAccess< MeshConfig, EntityTopology >::print( str ); } Loading @@ -80,7 +80,7 @@ bool MeshEntity< MeshConfig, EntityTopology >:: operator==( const MeshEntity& entity ) const { return ( MeshSubentityStorageLayers< MeshConfig, EntityTopology >::operator==( entity ) && return ( MeshSubentityAccess< MeshConfig, EntityTopology >::operator==( entity ) && MeshSuperentityAccess< MeshConfig, EntityTopology >::operator==( entity ) && MeshEntityId< typename MeshConfig::IdType, typename MeshConfig::GlobalIndexType >::operator==( entity ) ); Loading
src/TNL/Meshes/MeshDetails/Mesh_impl.h +4 −4 Original line number Diff line number Diff line Loading @@ -131,7 +131,7 @@ load( File& file ) return false; } // update pointers from entities into the superentity storage network MeshSuperentityStorageRebinder< Mesh< MeshConfig > >::exec( *this ); MeshEntityStorageRebinder< Mesh< MeshConfig > >::exec( *this ); return true; } Loading @@ -154,14 +154,14 @@ operator==( const Mesh& mesh ) const template< typename MeshConfig > bool Mesh< MeshConfig >:: init( const typename Mesh< MeshConfig >::MeshTraitsType::PointArrayType& points, const typename Mesh< MeshConfig >::MeshTraitsType::CellSeedArrayType& cellSeeds ) init( const typename MeshTraitsType::PointArrayType& points, const typename MeshTraitsType::CellSeedArrayType& cellSeeds ) { MeshInitializer< MeshConfig> meshInitializer; if( ! meshInitializer.createMesh( points, cellSeeds, *this ) ) return false; // update pointers from entities into the superentity storage network MeshSuperentityStorageRebinder< Mesh< MeshConfig > >::exec( *this ); MeshEntityStorageRebinder< Mesh< MeshConfig > >::exec( *this ); return true; } Loading
src/TNL/Meshes/MeshDetails/initializer/MeshEntityInitializer.h +14 −16 Original line number Diff line number Diff line Loading @@ -56,11 +56,10 @@ class MeshEntityInitializer EntityTopology, typename MeshTraits< MeshConfig >::DimensionsTag >; static constexpr int Dimensions = DimensionsTag::value; using MeshTraitsType = MeshTraits< MeshConfig >; using GlobalIndexType = typename MeshTraitsType::GlobalIndexType; using LocalIndexType = typename MeshTraitsType::LocalIndexType; using EntityTraitsType = typename MeshTraitsType::template EntityTraits< Dimensions >; using EntityTraitsType = typename MeshTraitsType::template EntityTraits< DimensionsTag::value >; using EntityType = typename EntityTraitsType::EntityType; using SubvertexTraits = typename MeshTraitsType::template SubentityTraits< EntityTopology, 0 >; Loading @@ -76,7 +75,7 @@ public: static void initEntity( EntityType& entity, GlobalIndexType entityIndex, const SeedType& entitySeed, InitializerType& initializer) { for( LocalIndexType i = 0; i < entitySeed.getCornerIds().getSize(); i++ ) initializer.template setSubentityIndex< 0 >( entity, i, entitySeed.getCornerIds()[ i ] ); initializer.template setSubentityIndex< 0 >( entity, entityIndex, i, entitySeed.getCornerIds()[ i ] ); BaseType::initSubentities( entity, entityIndex, entitySeed, initializer ); } Loading Loading @@ -134,9 +133,8 @@ class MeshEntityInitializerLayer< MeshConfig, EntityTopology, typename DimensionsTag::Decrement >; static constexpr int Dimensions = DimensionsTag::value; using MeshTraitsType = MeshTraits< MeshConfig >; using SubentityTraitsType = typename MeshTraitsType::template SubentityTraits< EntityTopology, Dimensions >; using SubentityTraitsType = typename MeshTraitsType::template SubentityTraits< EntityTopology, DimensionsTag::value >; using GlobalIndexType = typename SubentityTraitsType::GlobalIndexType; using InitializerType = MeshInitializer< MeshConfig >; Loading @@ -157,7 +155,7 @@ protected: for( LocalIndexType i = 0; i < subentitySeeds.getSize(); i++ ) { const GlobalIndexType subentityIndex = meshInitializer.findEntitySeedIndex( subentitySeeds[ i ] ); InitializerType::template setSubentityIndex< DimensionsTag::value >( entity, i, subentityIndex ); meshInitializer.template setSubentityIndex< DimensionsTag::value >( entity, entityIndex, i, subentityIndex ); //std::cout << " Adding subentity " << subentityIndex << std::endl; meshInitializer. template getSuperentityInitializer< DimensionsTag >(). Loading Loading @@ -214,7 +212,7 @@ protected: for( LocalIndexType i = 0; i < subentitySeeds.getSize(); i++ ) { const GlobalIndexType subentityIndex = meshInitializer.findEntitySeedIndex( subentitySeeds[ i ] ); InitializerType::template setSubentityIndex< DimensionsTag::value >( entity, i, subentityIndex ); meshInitializer.template setSubentityIndex< DimensionsTag::value >( entity, entityIndex, i, subentityIndex ); //std::cout << " Adding subentity " << subentityIndex << std::endl; subentityOrientationsArray[ i ] = meshInitializer.template getReferenceOrientation< DimensionsTag >( subentityIndex ).createOrientation( subentitySeeds[ i ] ); //std::cout << " Subentity orientation = " << subentityOrientationsArray[ i ].getSubvertexPermutation() << std::endl; Loading Loading @@ -273,7 +271,7 @@ protected: for( LocalIndexType i = 0; i < subentitySeeds.getSize(); i++ ) { const GlobalIndexType subentityIndex = meshInitializer.findEntitySeedIndex( subentitySeeds[ i ] ); InitializerType::template setSubentityIndex< DimensionsTag::value >( entity, i, subentityIndex ); meshInitializer.template setSubentityIndex< DimensionsTag::value >( entity, entityIndex, i, subentityIndex ); //std::cout << " Adding subentity " << subentityIndex << std::endl; subentityOrientationsArray[ i ] = meshInitializer.template getReferenceOrientation< DimensionsTag >( subentitySeeds[ i ] ).createOrientation( subentitySeeds[ i ] ); } Loading Loading @@ -318,7 +316,7 @@ protected: for( LocalIndexType i = 0; i < subentitySeeds.getSize(); i++) { const GlobalIndexType subentityIndex = meshInitializer.findEntitySeedIndex( subentitySeeds[ i ] ); InitializerType::template setSubentityIndex< DimensionsTag::value >( entity, i, subentityIndex ); meshInitializer.template setSubentityIndex< DimensionsTag::value >( entity, entityIndex, i, subentityIndex ); } BaseType::initSubentities(entity, entityIndex, entitySeed, meshInitializer); Loading Loading @@ -411,7 +409,7 @@ protected: //std::cout << " Initiating subentities with " << DimensionsTag::value << " dimensions ... " << std::endl; for( LocalIndexType i = 0; i < entity.template getNumberOfSubentities< DimensionsTag::value >(); i++ ) { const GlobalIndexType subentityIndex = entity.template getSubentityIndex< DimensionsTag::value >( i ); const GlobalIndexType subentityIndex = meshInitializer.template getSubentityIndex< DimensionsTag::value >( entity, entityIndex, i ); meshInitializer.template getSuperentityInitializer< DimensionsTag >().addSuperentity( EntityDimensionsTag(), subentityIndex, entityIndex); } } Loading
src/TNL/Meshes/MeshDetails/initializer/MeshInitializer.h +52 −53 Original line number Diff line number Diff line Loading @@ -54,18 +54,12 @@ class MeshInitializer public: using MeshType = Mesh< MeshConfig >; using MeshTraitsType = MeshTraits< MeshConfig >; static constexpr int Dimensions = MeshTraitsType::meshDimensions; using DimensionsTag = MeshDimensionsTag< Dimensions >; using DimensionsTag = MeshDimensionsTag< MeshTraitsType::meshDimensions >; using BaseType = MeshInitializerLayer< MeshConfig, DimensionsTag >; using PointArrayType = typename MeshTraitsType::PointArrayType; using CellSeedArrayType = typename MeshTraitsType::CellSeedArrayType; using GlobalIndexType = typename MeshTraitsType::GlobalIndexType; template< typename DimensionsTag, typename SuperdimensionsTag > using SuperentityStorageNetwork = typename MeshTraitsType::template SuperentityTraits< typename MeshTraitsType::template EntityTraits< DimensionsTag::value >::EntityTopology, SuperdimensionsTag::value >::StorageNetworkType; MeshInitializer() : verbose( false ), mesh( 0 ) Loading @@ -90,16 +84,33 @@ class MeshInitializer BaseType::createEntityReferenceOrientations(); if( verbose ) std::cout << "====== Initiating entities ==============" << std::endl; BaseType::initEntities( *this, points, cellSeeds ); BaseType::initEntities( *this, points, cellSeeds, mesh ); return true; } template< int Dimensions > bool setNumberOfEntities( const GlobalIndexType& entitiesCount ) { return mesh->template setNumberOfEntities< Dimensions >( entitiesCount ); } template< int Subdimensions, typename EntityType, typename LocalIndex, typename GlobalIndex > static void setSubentityIndex( EntityType& entity, const LocalIndex& localIndex, const GlobalIndex& globalIndex ) void setSubentityIndex( const EntityType& entity, const GlobalIndex& entityIndex, const LocalIndex& localIndex, const GlobalIndex& globalIndex ) { // The mesh entities are not yet bound to the storage network at this point, // so we operate directly on the storage. mesh->template getSubentityStorageNetwork< EntityType::EntityTopology::dimensions, Subdimensions >().getValues( entityIndex )[ localIndex ] = globalIndex; } template< int Subdimensions, typename EntityType, typename LocalIndex, typename GlobalIndex > GlobalIndex getSubentityIndex( const EntityType& entity, const GlobalIndex& entityIndex, const LocalIndex& localIndex ) { entity.template setSubentityIndex< Subdimensions >( localIndex, globalIndex ); // The mesh entities are not yet bound to the storage network at this point, // so we operate directly on the storage. return mesh->template getSubentityStorageNetwork< EntityType::EntityTopology::dimensions, Subdimensions >().getValues( entityIndex )[ localIndex ]; } template<typename SubDimensionsTag, typename MeshEntity > Loading @@ -109,18 +120,11 @@ class MeshInitializer return entity.template subentityOrientationsArray< SubDimensionTag::value >(); } template< int Dimensions > typename MeshTraitsType::template EntityTraits< Dimensions >::StorageArrayType& meshEntitiesArray() { return mesh->template getEntitiesArray< Dimensions >(); } template< typename EntityTopology, typename SuperdimensionsTag > typename MeshTraitsType::template SuperentityTraits< EntityTopology, SuperdimensionsTag::value >::StorageNetworkType& template< typename EntityTopology, int Superdimensions > typename MeshTraitsType::template SuperentityTraits< EntityTopology, Superdimensions >::StorageNetworkType& meshSuperentityStorageNetwork() { return mesh->template getSuperentityStorageNetwork< EntityTopology, SuperdimensionsTag >(); return mesh->template getSuperentityStorageNetwork< EntityTopology::dimensions, Superdimensions >(); } static void Loading @@ -141,7 +145,7 @@ class MeshInitializer const MeshEntityReferenceOrientation< MeshConfig, typename MeshTraitsType::template EntityTraits< DimensionsTag::value >::EntityTopology >& getReferenceOrientation( GlobalIndexType index ) const { return BaseType::getReferenceOrientation( DimensionTag(), index); return BaseType::getReferenceOrientation( DimensionsTag(), index ); } protected: Loading Loading @@ -191,21 +195,20 @@ class MeshInitializerLayer< MeshConfig, BaseType::createEntitySeedsFromCellSeeds( cellSeeds ); } void initEntities( InitializerType& initializer, const PointArrayType& points, const CellSeedArrayType& cellSeeds) void initEntities( InitializerType& initializer, const PointArrayType& points, const CellSeedArrayType& cellSeeds, MeshType& mesh ) { StorageArrayType& entityArray = initializer.template meshEntitiesArray< Dimensions >(); //cout << " Initiating entities with " << DimensionsTag::value << " dimensions ... " << std::endl; entityArray.setSize( cellSeeds.getSize() ); for( GlobalIndexType i = 0; i < entityArray.getSize(); i++ ) //std::cout << " Initiating entities with " << DimensionsTag::value << " dimensions ... " << std::endl; initializer.template setNumberOfEntities< Dimensions >( cellSeeds.getSize() ); for( GlobalIndexType i = 0; i < cellSeeds.getSize(); i++ ) { //cout << " Initiating entity " << i << std::endl; EntityInitializerType::initEntity( entityArray[i], i, cellSeeds[i], initializer ); //std::cout << " Initiating entity " << i << std::endl; EntityInitializerType::initEntity( mesh.template getEntity< Dimensions >( i ), i, cellSeeds[i], initializer ); } /*** * There are no superentities in this layer storing mesh cells. */ BaseType::initEntities( initializer, points ); BaseType::initEntities( initializer, points, mesh ); } using BaseType::findEntitySeedIndex; Loading Loading @@ -270,11 +273,10 @@ class MeshInitializerLayer< MeshConfig, typename DimensionsTag::Decrement > { using MeshTraitsType = MeshTraits< MeshConfig >; static constexpr int Dimensions = DimensionsTag::value; using BaseType = MeshInitializerLayer< MeshConfig, typename DimensionsTag::Decrement >; using MeshType = Mesh< MeshConfig >; using EntityTraitsType = typename MeshTraitsType::template EntityTraits< Dimensions >; using EntityTraitsType = typename MeshTraitsType::template EntityTraits< DimensionsTag::value >; using EntityTopology = typename EntityTraitsType::EntityTopology; using GlobalIndexType = typename MeshTraitsType::GlobalIndexType; using CellTopology = typename MeshTraitsType::CellTopology; Loading Loading @@ -325,24 +327,23 @@ class MeshInitializerLayer< MeshConfig, return this->superentityInitializer; } void initEntities( InitializerType& initializer, const PointArrayType& points ) void initEntities( InitializerType& initializer, const PointArrayType& points, MeshType& mesh ) { StorageArrayType& entityArray = initializer.template meshEntitiesArray< Dimensions >(); //cout << " Initiating entities with " << DimensionsTag::value << " dimensions ... " << std::endl; entityArray.setSize( this->seedsIndexedSet.getSize() ); //std::cout << " Initiating entities with " << DimensionsTag::value << " dimensions ... " << std::endl; initializer.template setNumberOfEntities< DimensionsTag::value >( this->seedsIndexedSet.getSize() ); EntitySeedArrayType seedsArray; seedsArray.setSize( this->seedsIndexedSet.getSize() ); this->seedsIndexedSet.toArray( seedsArray ); for( GlobalIndexType i = 0; i < this->seedsIndexedSet.getSize(); i++ ) { //cout << " Initiating entity " << i << std::endl; EntityInitializerType::initEntity( entityArray[ i ], i, seedsArray[ i ], initializer ); //std::cout << " Initiating entity " << i << std::endl; EntityInitializerType::initEntity( mesh.template getEntity< DimensionsTag::value >( i ), i, seedsArray[ i ], initializer ); } this->seedsIndexedSet.reset(); this->superentityInitializer.initSuperentities( initializer ); BaseType::initEntities(initializer, points); BaseType::initEntities( initializer, points, mesh ); } void createEntityReferenceOrientations() Loading Loading @@ -427,28 +428,27 @@ class MeshInitializerLayer< MeshConfig, return this->superentityInitializer; } void initEntities( InitializerType& initializer, const PointArrayType& points ) void initEntities( InitializerType& initializer, const PointArrayType& points, MeshType& mesh ) { EntityArrayType& entityArray = initializer.template meshEntitiesArray< DimensionsTag::value >(); //cout << " Initiating entities with " << DimensionsTag::value << " dimensions ... " << std::endl; entityArray.setSize( this->seedsIndexedSet.getSize() ); initializer.template setNumberOfEntities< DimensionsTag::value >( this->seedsIndexedSet.getSize() ); SeedArrayType seedsArray; seedsArray.setSize( this->seedsIndexedSet.getSize() ); this->seedsIndexedSet.toArray( seedsArray ); for( GlobalIndexType i = 0; i < this->seedsIndexedSet.getSize(); i++ ) { //cout << " Initiating entity " << i << std::endl; EntityInitializerType::initEntity( entityArray[ i ], i, seedsArray[ i ], initializer ); //std::cout << " Initiating entity " << i << std::endl; EntityInitializerType::initEntity( mesh.template getEntity< DimensionsTag::value >( i ), i, seedsArray[ i ], initializer ); } this->seedsIndexedSet.reset(); this->superentityInitializer.initSuperentities( initializer ); BaseType::initEntities(initializer, points); BaseType::initEntities( initializer, points, mesh ); } using BaseType::getReferenceOrientation; const ReferenceOrientationType& getReferenceOrientation( DimensionTag, GlobalIndexType index) const const ReferenceOrientationType& getReferenceOrientation( DimensionsTag, GlobalIndexType index ) const { return this->referenceOrientations[ index ]; } Loading Loading @@ -534,12 +534,11 @@ class MeshInitializerLayer< MeshConfig, void createEntitySeedsFromCellSeeds( const CellSeedArrayType& cellSeeds ) {} void initEntities( InitializerType& initializer, const PointArrayType& points ) void initEntities( InitializerType& initializer, const PointArrayType& points, MeshType& mesh ) { EntityArrayType& vertexArray = initializer.template meshEntitiesArray< DimensionsTag::value >(); vertexArray.setSize( points.getSize() ); for( GlobalIndexType i = 0; i < vertexArray.getSize(); i++ ) EntityInitializerType::setVertexPoint( vertexArray[i], points[i], initializer ); initializer.template setNumberOfEntities< 0 >( points.getSize() ); for( GlobalIndexType i = 0; i < points.getSize(); i++ ) EntityInitializerType::setVertexPoint( mesh.template getEntity< 0 >( i ), points[i], initializer ); superentityInitializer.initSuperentities( initializer ); } Loading