Newer
Older
/***************************************************************************
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>
bool EntityStorage = tnlMeshEntityTraits< MeshConfig, DimensionsTag::value >::storageEnabled >
class tnlMeshStorageLayer;
: public tnlMeshStorageLayer< MeshConfig, typename tnlMeshTraits< MeshConfig >::DimensionsTag >
: 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;
Tomáš Oberhuber
committed
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
if( ! BaseType::save( file ) ||
! this->entities.save( file ) )
{
cerr << "Saving of the mesh entities with " << DimensionsTag::value << " dimensions failed." << endl;
return false;
}
return true;
//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;
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 );
}
// 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() );
}
Tomáš Oberhuber
committed
using BaseType::getSuperentityStorageNetwork;
template< typename SuperdimensionsTag >
typename MeshTraits::template SuperentityTraits< EntityTopology, SuperdimensionsTag::value >::StorageNetworkType&
getSuperentityStorageNetwork( tnlDimensionsTag< EntityTopology::dimensions > )
{
return SuperentityStorageBaseType::getStorageNetwork( SuperdimensionsTag() );
}
class tnlMeshStorageLayer< MeshConfig, DimensionsTag, false >
: public tnlMeshStorageLayer< MeshConfig, typename DimensionsTag::Decrement >
class tnlMeshStorageLayer< MeshConfig, tnlDimensionsTag< 0 >, true > :
public tnlMeshSuperentityStorageLayers< MeshConfig,
typedef tnlDimensionsTag< 0 > DimensionsTag;
typedef tnlMeshSuperentityStorageLayers< MeshConfig,
tnlMeshVertexTopology > SuperentityStorageBaseType;
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;
Tomáš Oberhuber
committed
typedef tnlMeshVertexTopology EntityTopology;
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 ];
const VertexType& getVertex( const GlobalIndexType vertexIndex ) const
return this->vertices[ vertexIndex ];
void setVertex( const GlobalIndexType vertexIndex,
const PointType& point )
this->vertices[ vertexIndex ].setPoint( point );
}
/****
* This is only for the completeness and compatibility
* with higher dimensions entities storage layers.
*/
GlobalIndexType getNumberOfEntities( DimensionsTag ) const
{
return this->vertices.getSize();
}
VertexType& getEntity( DimensionsTag,
const GlobalIndexType entityIndex )
{
return this->vertices[ entityIndex ];
}
const VertexType& getEntity( DimensionsTag,
const GlobalIndexType entityIndex ) const
{
return this->vertices.getElement( entityIndex );
}
const AccessArrayType& getEntities( DimensionsTag ) const
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;
return true;
}
str << "The mesh vertices are: " << endl;
for( GlobalIndexType i = 0; i < vertices.getSize();i ++ )
{
SuperentityStorageBaseType::print( str );
bool operator==( const tnlMeshStorageLayer& meshLayer ) const
{
return ( vertices == meshLayer.vertices );
}
// 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() );
}
Tomáš Oberhuber
committed
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)
*/
class tnlMeshStorageLayer< MeshConfig, tnlDimensionsTag< 0 >, false >
#endif /* TNLMESHSTORAGELAYER_H_ */