Loading src/TNL/Meshes/Mesh.h +4 −0 Original line number Diff line number Diff line Loading @@ -23,6 +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> namespace TNL { namespace Meshes { Loading Loading @@ -96,6 +97,9 @@ class Mesh MeshConfigValidator< MeshConfig > configValidator; friend MeshInitializer< MeshConfig >; template< typename Mesh, typename DimensionsTag, typename SuperdimensionsTag > friend struct MeshSuperentityStorageRebinderWorker; }; template< typename MeshConfig > Loading src/TNL/Meshes/MeshDetails/Mesh_impl.h +7 −1 Original line number Diff line number Diff line Loading @@ -130,6 +130,8 @@ load( File& file ) std::cerr << "Mesh loading failed." << std::endl; return false; } // update pointers from entities into the superentity storage network MeshSuperentityStorageRebinder< Mesh< MeshConfig > >::exec( *this ); return true; } Loading @@ -156,7 +158,11 @@ init( const typename Mesh< MeshConfig >::MeshTraitsType::PointArrayType& points, const typename Mesh< MeshConfig >::MeshTraitsType::CellSeedArrayType& cellSeeds ) { MeshInitializer< MeshConfig> meshInitializer; return meshInitializer.createMesh( points, cellSeeds, *this ); if( ! meshInitializer.createMesh( points, cellSeeds, *this ) ) return false; // update pointers from entities into the superentity storage network MeshSuperentityStorageRebinder< Mesh< MeshConfig > >::exec( *this ); return true; } Loading src/TNL/Meshes/MeshDetails/initializer/MeshInitializer.h +0 −7 Original line number Diff line number Diff line Loading @@ -130,13 +130,6 @@ class MeshInitializer return mesh->template getSuperentityStorageNetwork< EntityTopology, SuperdimensionsTag >(); } template< int Superdimensions, typename MeshEntity, typename Storage > static void bindSuperentitiesStorageNetwork( MeshEntity& entity, const Storage& storage ) { entity.template bindSuperentitiesStorageNetwork< Superdimensions >( storage ); } static void setVertexPoint( typename MeshType::VertexType& vertex, const typename MeshType::PointType& point ) { Loading src/TNL/Meshes/MeshDetails/initializer/MeshSuperentityStorageInitializer.h +0 −3 Original line number Diff line number Diff line Loading @@ -111,9 +111,6 @@ class MeshSuperentityStorageInitializerLayer< MeshConfig, LocalIndexType i = 0; for( auto v_it = it->second.cbegin(); v_it != it->second.cend(); v_it++ ) superentitiesIndices[ i++ ] = *v_it; EntityType& entity = meshInitializer.template meshEntitiesArray< EntityDimensions::value >()[ entityIndex ]; meshInitializer.template bindSuperentitiesStorageNetwork< DimensionsTag::value >( entity, superentityStorageNetwork.getValues( entityIndex++ ) ); } dynamicStorageNetwork.clear(); Loading src/TNL/Meshes/MeshDetails/layers/MeshSuperentityStorageRebinder.h 0 → 100644 +88 −0 Original line number Diff line number Diff line /*************************************************************************** MeshSuperentityStorageRebinder.h - description ------------------- begin : Oct 22, 2016 copyright : (C) 2014 by Tomas Oberhuber et al. email : tomas.oberhuber@fjfi.cvut.cz ***************************************************************************/ /* See Copyright Notice in tnl/Copyright */ #pragma once /* * Everything in this file is basically just a templatized version of the * following pseudo-code (which does not work because normal variables are not * usable in template arguments): * * for( int dimensions = 0; dimensions < MeshTraitsType::meshDimensions; dimensions++ ) * for( int superdimensions = dimensions + 1; superdimensions <= MeshTraitsType::meshDimensions; superdimensions++ ) * if( EntityTraits< dimensions >::SuperentityTraits< superdimensions >::storageEnabled ) * for( GlobalIndexType i = 0; i < mesh.template getNumberOfEntities< dimensions >(); i++ ) * { * auto& entity = mesh.template getEntity< dimensions >( i ); * entity.template bindSuperentitiesStorageNetwork< superdimensions >( mesh.template getSuperentityStorageNetwork< superdimensions >().getValues( i ) ); * } */ #include <TNL/Meshes/MeshDimensionsTag.h> namespace TNL { namespace Meshes { template< typename Mesh, typename DimensionsTag, typename SuperdimensionsTag > struct MeshSuperentityStorageRebinderWorker { static void exec( Mesh& mesh ) { for( typename Mesh::GlobalIndexType i = 0; i < mesh.template getNumberOfEntities< DimensionsTag::value >(); i++ ) { auto& entity = mesh.template getEntity< DimensionsTag::value >( i ); auto& storage = mesh.template getSuperentityStorageNetwork< typename Mesh::template EntityTraits< DimensionsTag::value >::EntityTopology, SuperdimensionsTag >(); entity.template bindSuperentitiesStorageNetwork< SuperdimensionsTag::value >( storage.getValues( i ) ); } } }; template< typename Mesh, typename DimensionsTag, typename SuperdimensionsTag > struct MeshSuperentityStorageRebinderInner { static void exec( Mesh& mesh ) { MeshSuperentityStorageRebinderWorker< Mesh, DimensionsTag, SuperdimensionsTag >::exec( mesh ); MeshSuperentityStorageRebinderInner< Mesh, DimensionsTag, typename SuperdimensionsTag::Decrement >::exec( mesh ); } }; template< typename Mesh, typename SuperdimensionsTag > struct MeshSuperentityStorageRebinderInner< Mesh, typename SuperdimensionsTag::Decrement, SuperdimensionsTag > { static void exec( Mesh& mesh ) { MeshSuperentityStorageRebinderWorker< Mesh, typename SuperdimensionsTag::Decrement, SuperdimensionsTag >::exec( mesh ); } }; template< typename Mesh, typename DimensionsTag = typename MeshDimensionsTag< Mesh::MeshTraitsType::meshDimensions >::Decrement > struct MeshSuperentityStorageRebinder { static void exec( Mesh& mesh ) { MeshSuperentityStorageRebinderInner< Mesh, DimensionsTag, MeshDimensionsTag< Mesh::MeshTraitsType::meshDimensions > >::exec( mesh ); MeshSuperentityStorageRebinder< Mesh, typename DimensionsTag::Decrement >::exec( mesh ); } }; template< typename Mesh > struct MeshSuperentityStorageRebinder< Mesh, MeshDimensionsTag< 0 > > { static void exec( Mesh& mesh ) { MeshSuperentityStorageRebinderInner< Mesh, MeshDimensionsTag< 0 >, MeshDimensionsTag< Mesh::MeshTraitsType::meshDimensions > >::exec( mesh ); } }; } // namespace Meshes } // namespace TNL Loading
src/TNL/Meshes/Mesh.h +4 −0 Original line number Diff line number Diff line Loading @@ -23,6 +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> namespace TNL { namespace Meshes { Loading Loading @@ -96,6 +97,9 @@ class Mesh MeshConfigValidator< MeshConfig > configValidator; friend MeshInitializer< MeshConfig >; template< typename Mesh, typename DimensionsTag, typename SuperdimensionsTag > friend struct MeshSuperentityStorageRebinderWorker; }; template< typename MeshConfig > Loading
src/TNL/Meshes/MeshDetails/Mesh_impl.h +7 −1 Original line number Diff line number Diff line Loading @@ -130,6 +130,8 @@ load( File& file ) std::cerr << "Mesh loading failed." << std::endl; return false; } // update pointers from entities into the superentity storage network MeshSuperentityStorageRebinder< Mesh< MeshConfig > >::exec( *this ); return true; } Loading @@ -156,7 +158,11 @@ init( const typename Mesh< MeshConfig >::MeshTraitsType::PointArrayType& points, const typename Mesh< MeshConfig >::MeshTraitsType::CellSeedArrayType& cellSeeds ) { MeshInitializer< MeshConfig> meshInitializer; return meshInitializer.createMesh( points, cellSeeds, *this ); if( ! meshInitializer.createMesh( points, cellSeeds, *this ) ) return false; // update pointers from entities into the superentity storage network MeshSuperentityStorageRebinder< Mesh< MeshConfig > >::exec( *this ); return true; } Loading
src/TNL/Meshes/MeshDetails/initializer/MeshInitializer.h +0 −7 Original line number Diff line number Diff line Loading @@ -130,13 +130,6 @@ class MeshInitializer return mesh->template getSuperentityStorageNetwork< EntityTopology, SuperdimensionsTag >(); } template< int Superdimensions, typename MeshEntity, typename Storage > static void bindSuperentitiesStorageNetwork( MeshEntity& entity, const Storage& storage ) { entity.template bindSuperentitiesStorageNetwork< Superdimensions >( storage ); } static void setVertexPoint( typename MeshType::VertexType& vertex, const typename MeshType::PointType& point ) { Loading
src/TNL/Meshes/MeshDetails/initializer/MeshSuperentityStorageInitializer.h +0 −3 Original line number Diff line number Diff line Loading @@ -111,9 +111,6 @@ class MeshSuperentityStorageInitializerLayer< MeshConfig, LocalIndexType i = 0; for( auto v_it = it->second.cbegin(); v_it != it->second.cend(); v_it++ ) superentitiesIndices[ i++ ] = *v_it; EntityType& entity = meshInitializer.template meshEntitiesArray< EntityDimensions::value >()[ entityIndex ]; meshInitializer.template bindSuperentitiesStorageNetwork< DimensionsTag::value >( entity, superentityStorageNetwork.getValues( entityIndex++ ) ); } dynamicStorageNetwork.clear(); Loading
src/TNL/Meshes/MeshDetails/layers/MeshSuperentityStorageRebinder.h 0 → 100644 +88 −0 Original line number Diff line number Diff line /*************************************************************************** MeshSuperentityStorageRebinder.h - description ------------------- begin : Oct 22, 2016 copyright : (C) 2014 by Tomas Oberhuber et al. email : tomas.oberhuber@fjfi.cvut.cz ***************************************************************************/ /* See Copyright Notice in tnl/Copyright */ #pragma once /* * Everything in this file is basically just a templatized version of the * following pseudo-code (which does not work because normal variables are not * usable in template arguments): * * for( int dimensions = 0; dimensions < MeshTraitsType::meshDimensions; dimensions++ ) * for( int superdimensions = dimensions + 1; superdimensions <= MeshTraitsType::meshDimensions; superdimensions++ ) * if( EntityTraits< dimensions >::SuperentityTraits< superdimensions >::storageEnabled ) * for( GlobalIndexType i = 0; i < mesh.template getNumberOfEntities< dimensions >(); i++ ) * { * auto& entity = mesh.template getEntity< dimensions >( i ); * entity.template bindSuperentitiesStorageNetwork< superdimensions >( mesh.template getSuperentityStorageNetwork< superdimensions >().getValues( i ) ); * } */ #include <TNL/Meshes/MeshDimensionsTag.h> namespace TNL { namespace Meshes { template< typename Mesh, typename DimensionsTag, typename SuperdimensionsTag > struct MeshSuperentityStorageRebinderWorker { static void exec( Mesh& mesh ) { for( typename Mesh::GlobalIndexType i = 0; i < mesh.template getNumberOfEntities< DimensionsTag::value >(); i++ ) { auto& entity = mesh.template getEntity< DimensionsTag::value >( i ); auto& storage = mesh.template getSuperentityStorageNetwork< typename Mesh::template EntityTraits< DimensionsTag::value >::EntityTopology, SuperdimensionsTag >(); entity.template bindSuperentitiesStorageNetwork< SuperdimensionsTag::value >( storage.getValues( i ) ); } } }; template< typename Mesh, typename DimensionsTag, typename SuperdimensionsTag > struct MeshSuperentityStorageRebinderInner { static void exec( Mesh& mesh ) { MeshSuperentityStorageRebinderWorker< Mesh, DimensionsTag, SuperdimensionsTag >::exec( mesh ); MeshSuperentityStorageRebinderInner< Mesh, DimensionsTag, typename SuperdimensionsTag::Decrement >::exec( mesh ); } }; template< typename Mesh, typename SuperdimensionsTag > struct MeshSuperentityStorageRebinderInner< Mesh, typename SuperdimensionsTag::Decrement, SuperdimensionsTag > { static void exec( Mesh& mesh ) { MeshSuperentityStorageRebinderWorker< Mesh, typename SuperdimensionsTag::Decrement, SuperdimensionsTag >::exec( mesh ); } }; template< typename Mesh, typename DimensionsTag = typename MeshDimensionsTag< Mesh::MeshTraitsType::meshDimensions >::Decrement > struct MeshSuperentityStorageRebinder { static void exec( Mesh& mesh ) { MeshSuperentityStorageRebinderInner< Mesh, DimensionsTag, MeshDimensionsTag< Mesh::MeshTraitsType::meshDimensions > >::exec( mesh ); MeshSuperentityStorageRebinder< Mesh, typename DimensionsTag::Decrement >::exec( mesh ); } }; template< typename Mesh > struct MeshSuperentityStorageRebinder< Mesh, MeshDimensionsTag< 0 > > { static void exec( Mesh& mesh ) { MeshSuperentityStorageRebinderInner< Mesh, MeshDimensionsTag< 0 >, MeshDimensionsTag< Mesh::MeshTraitsType::meshDimensions > >::exec( mesh ); } }; } // namespace Meshes } // namespace TNL