Skip to content
Snippets Groups Projects
tnlMeshStorageLayer.h 11.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • /***************************************************************************
                              tnlMeshStorageLayer.h  -  description
                                 -------------------
        begin                : Feb 11, 2014
        copyright            : (C) 2014 by Tomas Oberhuber
        email                : tomas.oberhuber@fjfi.cvut.cz
     ***************************************************************************/
    
    /***************************************************************************
     *                                                                         *
     *   This program is free software; you can redistribute it and/or modify  *
     *   it under the terms of the GNU General Public License as published by  *
     *   the Free Software Foundation; either version 2 of the License, or     *
     *   (at your option) any later version.                                   *
     *                                                                         *
     ***************************************************************************/
    
    #ifndef TNLMESHSTORAGELAYER_H_
    #define TNLMESHSTORAGELAYER_H_
    
    
    #include <core/tnlFile.h>
    
    #include <mesh/traits/tnlMeshTraits.h>
    
    #include <mesh/traits/tnlMeshEntityTraits.h>
    
    #include <mesh/traits/tnlMeshTraits.h>
    
    template< typename MeshConfig,
    
              typename DimensionsTag,
    
              bool EntityStorage = tnlMeshEntityTraits< MeshConfig, DimensionsTag::value >::storageEnabled >
    
    class tnlMeshStorageLayer;
    
    
    
    template< typename MeshConfig >
    
    class tnlMeshStorageLayers
    
       : public tnlMeshStorageLayer< MeshConfig, typename tnlMeshTraits< MeshConfig >::DimensionsTag >
    
    template< typename MeshConfig,
    
              typename DimensionsTag >
    
    class tnlMeshStorageLayer< MeshConfig,
    
                               true >
    
       : public tnlMeshStorageLayer< MeshConfig, typename DimensionsTag::Decrement >,
         public tnlMeshSuperentityStorageLayers< MeshConfig, 
    
                                                 typename tnlMeshTraits< MeshConfig >::template EntityTraits< DimensionsTag::value >::EntityTopology >
    
          static const int Dimensions = DimensionsTag::value;
          typedef tnlMeshStorageLayer< MeshConfig, typename DimensionsTag::Decrement >   BaseType;
          typedef tnlMeshSuperentityStorageLayers< MeshConfig, 
                                                   typename tnlMeshTraits< MeshConfig >::template EntityTraits< DimensionsTag::value >::EntityTopology > SuperentityStorageBaseType;
          typedef tnlMeshTraits< MeshConfig >                                          MeshTraits;
          typedef typename MeshTraits::template EntityTraits< Dimensions >             EntityTraits; 
    
          typedef typename EntityTraits::StorageArrayType                              StorageArrayType;
          typedef typename EntityTraits::AccessArrayType                               AccessArrayType;
          typedef typename EntityTraits::GlobalIndexType                               GlobalIndexType;
          typedef typename EntityTraits::EntityType                                    EntityType;
    
          typedef typename EntityTraits::EntityTopology                                EntityTopology;
    
          using BaseType::getNumberOfEntities;
          using BaseType::getEntity;
          using BaseType::getEntities;
    
          tnlMeshStorageLayer()
          {
             this->entities.setName( tnlString( "tnlMeshStorageLayer < " ) + tnlString( DimensionsTag::value ) + " >::entities" );
             this->entitiesAccess.setName( tnlString( "tnlMeshStorageLayer < " ) + tnlString( DimensionsTag::value ) + " >::entitiesAccess" );
          }
    
          GlobalIndexType getNumberOfEntities( DimensionsTag ) const
          {
             return this->entities.getSize();
          }
    
          EntityType& getEntity( DimensionsTag,
                                 const GlobalIndexType entityIndex )
          {
             return this->entities[ entityIndex ];
          }
    
          const EntityType& getEntity( DimensionsTag,
                                       const GlobalIndexType entityIndex ) const
          {
             return this->entities[ entityIndex ];
          }
    
          AccessArrayType& getEntities( DimensionsTag )
          {
             return this->sharedEntities;
          }
    
          const AccessArrayType& getEntities( DimensionsTag ) const
    
             return this->sharedEntities;
    
          bool save( tnlFile& file ) const
    
             if( ! BaseType::save( file ) ||
                 ! this->entities.save( file ) )
             {
                cerr << "Saving of the mesh entities with " << DimensionsTag::value << " dimensions failed." << endl;
                return false;
             }
             return true;
    
          bool load( tnlFile& file )
    
             //cout << "Loading mesh layer with dimensions " << DimensionsTag::value << endl;
             if( ! BaseType::load( file ) ||
                 ! this->entities.load( file ) )
             {
                cerr << "Loading of the mesh entities with " << DimensionsTag::value << " dimensions failed." << endl;
                return false;
             }
             this->entitiesAccess.bind( this->entities );
             return true;
    
          void print( ostream& str ) const
          {
    
             BaseType::print( str );         
    
             str << "The entities with " << DimensionsTag::value << " dimensions are: " << endl;
             for( GlobalIndexType i = 0; i < entities.getSize();i ++ )
             {
                str << i << " ";
                entities[ i ].print( str );
                str << endl;
             }
    
             SuperentityStorageBaseType::print( str );
    
          }
    
          bool operator==( const tnlMeshStorageLayer& meshLayer ) const
          {
             return ( BaseType::operator==( meshLayer ) && entities == meshLayer.entities );
          }
    
          StorageArrayType entities;
    
          AccessArrayType entitiesAccess;
    
       
       // TODO: this is only for the mesh initializer - fix it
       public:
    
          using BaseType::entitiesArray;
          
    
          typename EntityTraits::StorageArrayType& entitiesArray( DimensionsTag )
    
          {
             return entities; 
          }
                  
          using BaseType::superentityIdsArray;
    	
          template< typename SuperDimensionsTag >
    
          typename MeshTraits::GlobalIdArrayType& superentityIdsArray( DimensionsTag )
    
          {
             return SuperentityStorageBaseType::superentityIdsArray( SuperDimensionsTag() );
          }
    
          
          using BaseType::getSuperentityStorageNetwork;
          template< typename SuperdimensionsTag >
          typename MeshTraits::template SuperentityTraits< EntityTopology, SuperdimensionsTag::value >::StorageNetworkType& 
          getSuperentityStorageNetwork( tnlDimensionsTag< EntityTopology::dimensions > )
          {
             return SuperentityStorageBaseType::getStorageNetwork( SuperdimensionsTag() );
          }
    
    template< typename MeshConfig,
    
              typename DimensionsTag >
    
    class tnlMeshStorageLayer< MeshConfig, DimensionsTag, false >
       : public tnlMeshStorageLayer< MeshConfig, typename DimensionsTag::Decrement  >
    
    template< typename MeshConfig >
    
    class tnlMeshStorageLayer< MeshConfig, tnlDimensionsTag< 0 >, true > :
    
       public tnlMeshSuperentityStorageLayers< MeshConfig, 
    
                                               tnlMeshVertexTopology >
    
       typedef tnlDimensionsTag< 0 >                        DimensionsTag;
    
       typedef tnlMeshSuperentityStorageLayers< MeshConfig, 
    
                                                tnlMeshVertexTopology > SuperentityStorageBaseType;
    
       typedef tnlMeshTraits< MeshConfig >                                          MeshTraits;
    
       typedef typename MeshTraits::template EntityTraits< 0 >                      EntityTraits; 
    
       
       typedef typename EntityTraits::StorageArrayType                              StorageArrayType;
       typedef typename EntityTraits::AccessArrayType                               AccessArrayType;
       typedef typename EntityTraits::GlobalIndexType                               GlobalIndexType;
       typedef typename EntityTraits::EntityType                                    VertexType;
       typedef typename VertexType::PointType                                       PointType;
    
       tnlMeshStorageLayer()
       {
    
          this->vertices.setName( tnlString( "tnlMeshStorageLayer < " ) + tnlString( DimensionsTag::value ) + " >::vertices" );
    
          this->verticesAccess.setName( tnlString( "tnlMeshStorageLayer < " ) + tnlString( DimensionsTag::value ) + " >::sharedVertices" );
    
       }
    
       GlobalIndexType getNumberOfVertices() const
       {
          return this->vertices.getSize();
       }
    
       void setVertex( const GlobalIndexType vertexIndex,
                       const VertexType& vertex ) const
       {
          this->vertices.setElement( vertexIndex, vertex );
       }
    
       VertexType& getVertex( const GlobalIndexType vertexIndex )
       {
    
          return this->vertices[ vertexIndex ];
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       const VertexType& getVertex( const GlobalIndexType vertexIndex ) const
    
          return this->vertices[ vertexIndex ];
    
       void setVertex( const GlobalIndexType vertexIndex,
    
          this->vertices[ vertexIndex ].setPoint( point );
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       }
    
       /****
        * This is only for the completeness and compatibility
        * with higher dimensions entities storage layers.
        */
    
    
       GlobalIndexType getNumberOfEntities( DimensionsTag ) const
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       {
          return this->vertices.getSize();
       }
    
    
       VertexType& getEntity( DimensionsTag,
    
                              const GlobalIndexType entityIndex )
       {
          return this->vertices[ entityIndex ];
       }
    
    
       const VertexType& getEntity( DimensionsTag,
    
                                    const GlobalIndexType entityIndex ) const
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
       {
          return this->vertices.getElement( entityIndex );
       }
    
    
       AccessArrayType& getEntities( DimensionsTag )
    
          return this->sharedVertices;
    
       const AccessArrayType& getEntities( DimensionsTag ) const
    
          return this->sharedVertices;
    
       bool save( tnlFile& file ) const
       {
    
          if( ! this->vertices.save( file ) )
          {
    
             cerr << "Saving of the mesh entities with " << DimensionsTag::value << " dimensions failed." << endl;
    
          return true;
       }
    
       bool load( tnlFile& file )
       {
    
          if( ! this->vertices.load( file ) )
          {
    
             cerr << "Loading of the mesh entities with " << DimensionsTag::value << " dimensions failed." << endl;
    
          this->verticesAccess.bind( this->vertices );
    
       void print( ostream& str ) const
    
          str << "The mesh vertices are: " << endl;
          for( GlobalIndexType i = 0; i < vertices.getSize();i ++ )
          {
    
             str << i << vertices[ i ] << endl;
    
          SuperentityStorageBaseType::print( str );
    
       bool operator==( const tnlMeshStorageLayer& meshLayer ) const
       {
          return ( vertices == meshLayer.vertices );
       }
    
    
       StorageArrayType vertices;
    
       AccessArrayType verticesAccess;
    
       
       // TODO: this is only for the mesh initializer - fix it
       public:
          
    
          typename EntityTraits::StorageArrayType& entitiesArray( DimensionsTag )
    
          {
             return vertices; 
          }
    
          
          template< typename SuperDimensionsTag >
    
          typename MeshTraits::GlobalIdArrayType& superentityIdsArray( DimensionsTag )
    
          {
             return SuperentityStorageBaseType::superentityIdsArray( SuperDimensionsTag() );
          }
    
    
          template< typename SuperdimensionsTag >
          typename MeshTraits::template SuperentityTraits< EntityTopology, SuperdimensionsTag::value >::StorageNetworkType& getSuperentityStorageNetwork( tnlDimensionsTag< EntityTopology::dimensions > )
          {
             return SuperentityStorageBaseType::getStorageNetwork( SuperdimensionsTag() );
          }
    
    
    };
    
    /****
     * Forces termination of recursive inheritance (prevents compiler from generating huge error logs)
     */
    
    template< typename MeshConfig >
    
    class tnlMeshStorageLayer< MeshConfig, tnlDimensionsTag< 0 >, false >
    
    
    
    #endif /* TNLMESHSTORAGELAYER_H_ */