Newer
Older
/***************************************************************************
NeighborGridEntitiesStorage.h - description
-------------------
begin : Dec 18, 2015
copyright : (C) 2015 by Tomas Oberhuber
email : tomas.oberhuber@fjfi.cvut.cz
***************************************************************************/
/* See Copyright Notice in tnl/Copyright */
#pragma once
#include <TNL/Devices/Cuda.h>
#include <TNL/Meshes/DimensionTag.h>
#include <TNL/Meshes/GridEntityConfig.h>
#include <TNL/Meshes/GridDetails/NeighborGridEntityGetter.h>
namespace TNL {
namespace Meshes {
template< typename GridEntity,
int NeighborEntityDimension,
typename GridEntityConfig,
bool storage = GridEntityConfig::template neighborEntityStorage< GridEntity >( NeighborEntityDimension ) >
class NeighborGridEntityLayer
: public NeighborGridEntityLayer< GridEntity, NeighborEntityDimension - 1, GridEntityConfig >
{
public:
typedef NeighborGridEntityLayer< GridEntity, NeighborEntityDimension - 1, GridEntityConfig > BaseType;
typedef NeighborGridEntityGetter< GridEntity, NeighborEntityDimension > NeighborEntityGetterType;
using BaseType::getNeighborEntities;
__cuda_callable__
NeighborGridEntityLayer( const GridEntity& entity )
: BaseType( entity ),
neighborEntities( entity )
{}
__cuda_callable__
const NeighborEntityGetterType& getNeighborEntities( const DimensionTag< NeighborEntityDimension>& tag ) const
{
return this->neighborEntities;
}
__cuda_callable__
void refresh( const typename GridEntity::GridType& grid,
const typename GridEntity::GridType::IndexType& entityIndex )
{
BaseType::refresh( grid, entityIndex );
neighborEntities.refresh( grid, entityIndex );
}
protected:
NeighborEntityGetterType neighborEntities;
};
template< typename GridEntity,
typename GridEntityConfig,
bool storage >
class NeighborGridEntityLayer< GridEntity, 0, GridEntityConfig, storage >
{
public:
typedef NeighborGridEntityGetter< GridEntity, 0 > NeighborEntityGetterType;
__cuda_callable__
NeighborGridEntityLayer( const GridEntity& entity )
: neighborEntities( entity )
{}
__cuda_callable__
const NeighborEntityGetterType& getNeighborEntities( const DimensionTag< 0 >& tag ) const
{
return this->neighborEntities;
}
__cuda_callable__
void refresh( const typename GridEntity::GridType& grid,
const typename GridEntity::GridType::IndexType& entityIndex )
{
neighborEntities.refresh( grid, entityIndex );
}
protected:
NeighborEntityGetterType neighborEntities;
};
template< typename GridEntity,
typename GridEntityConfig >
class NeighborGridEntitiesStorage
Tomáš Oberhuber
committed
: public NeighborGridEntityLayer< GridEntity, GridEntity::getMeshDimension(), GridEntityConfig >
Tomáš Oberhuber
committed
typedef NeighborGridEntityLayer< GridEntity, GridEntity::getMeshDimension(), GridEntityConfig > BaseType;
public:
using BaseType::getNeighborEntities;
using BaseType::refresh;
__cuda_callable__
NeighborGridEntitiesStorage( const GridEntity& entity )
: BaseType( entity )
{}
template< int EntityDimension >
__cuda_callable__
const NeighborGridEntityGetter< GridEntity, EntityDimension >&
getNeighborEntities() const
{
return BaseType::getNeighborEntities( DimensionTag< EntityDimension >() );
}
};
} // namespace Meshes
} // namespace TNL