Commit c82d63d5 authored by Jakub Klinkovský's avatar Jakub Klinkovský
Browse files

Storing subentities globally in multimaps, just like superentities

parent 72759e36
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -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 {
@@ -94,7 +94,7 @@ class Mesh

   protected:
      // Methods for the mesh initializer
      using StorageBaseType::getEntitiesArray;
      using StorageBaseType::getSubentityStorageNetwork;
      using StorageBaseType::getSuperentityStorageNetwork;

      MeshConfigValidator< MeshConfig > configValidator;
@@ -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 >
+5 −5
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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 );
}

@@ -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 ) );
+4 −4
Original line number Diff line number Diff line
@@ -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;
}

@@ -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;
}

+14 −16
Original line number Diff line number Diff line
@@ -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 >;
@@ -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 );
   }

@@ -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 >;
@@ -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 >().
@@ -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;
@@ -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 ] );
      }
@@ -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);
@@ -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);
      }
   }
+52 −53
Original line number Diff line number Diff line
@@ -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 )
@@ -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 >
@@ -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
@@ -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:
@@ -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;
@@ -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;
@@ -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()
@@ -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 ];
      }
@@ -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