Skip to content
Snippets Groups Projects
Commit a73b6f6f authored by Jakub Klinkovský's avatar Jakub Klinkovský
Browse files

Fixed MeshEntityStorageRebinder for meshes with disabled subentities/superentities

parent 04bd295d
No related branches found
No related tags found
No related merge requests found
...@@ -30,18 +30,79 @@ ...@@ -30,18 +30,79 @@
namespace TNL { namespace TNL {
namespace Meshes { namespace Meshes {
template< typename Mesh,
typename DimensionsTag,
typename SuperdimensionsTag,
bool Enabled =
Mesh::MeshTraitsType::template SuperentityTraits< typename Mesh::template EntityType< DimensionsTag::value >::EntityTopology,
SuperdimensionsTag::value >::storageEnabled
>
struct MeshEntityStorageRebinderSuperentityWorker
{
template< typename Worker >
static void exec( Mesh& mesh )
{
// If the reader is wondering why the code is in the Worker and not here:
// that's because we're accessing protected method bindSuperentitiesStorageNetwork
// and friend templates in GCC 6.1 apparently don't play nice with partial
// template specializations.
Worker::bindSuperentities( mesh );
}
};
template< typename Mesh,
typename DimensionsTag,
typename SuperdimensionsTag >
struct MeshEntityStorageRebinderSuperentityWorker< Mesh, DimensionsTag, SuperdimensionsTag, false >
{
template< typename Worker >
static void exec( Mesh& mesh ) {}
};
template< typename Mesh,
typename DimensionsTag,
typename SuperdimensionsTag,
bool Enabled =
Mesh::MeshTraitsType::template SubentityTraits< typename Mesh::template EntityType< SuperdimensionsTag::value >::EntityTopology,
DimensionsTag::value >::storageEnabled
>
struct MeshEntityStorageRebinderSubentityWorker
{
template< typename Worker >
static void exec( Mesh& mesh )
{
// If the reader is wondering why the code is in the Worker and not here:
// that's because we're accessing protected method bindSubentitiesStorageNetwork
// and friend templates in GCC 6.1 apparently don't play nice with partial
// template specializations.
Worker::bindSubentities( mesh );
}
};
template< typename Mesh,
typename DimensionsTag,
typename SuperdimensionsTag >
struct MeshEntityStorageRebinderSubentityWorker< Mesh, DimensionsTag, SuperdimensionsTag, false >
{
template< typename Worker >
static void exec( Mesh& mesh ) {}
};
template< typename Mesh, typename DimensionsTag, typename SuperdimensionsTag > template< typename Mesh, typename DimensionsTag, typename SuperdimensionsTag >
struct MeshEntityStorageRebinderWorker struct MeshEntityStorageRebinderWorker
{ {
static void exec( Mesh& mesh ) static void exec( Mesh& mesh )
{ {
for( typename Mesh::GlobalIndexType i = 0; i < mesh.template getNumberOfEntities< SuperdimensionsTag::value >(); i++ ) MeshEntityStorageRebinderSuperentityWorker< Mesh, DimensionsTag, SuperdimensionsTag >::
{ template exec< MeshEntityStorageRebinderWorker >( mesh );
auto& superentity = mesh.template getEntity< SuperdimensionsTag::value >( i ); MeshEntityStorageRebinderSubentityWorker< Mesh, DimensionsTag, SuperdimensionsTag >::
auto& subentitiesStorage = mesh.template getSubentityStorageNetwork< SuperdimensionsTag::value, DimensionsTag::value >(); template exec< MeshEntityStorageRebinderWorker >( mesh );
superentity.template bindSubentitiesStorageNetwork< DimensionsTag::value >( subentitiesStorage.getValues( i ) ); }
}
static void bindSuperentities( Mesh& mesh )
{
for( typename Mesh::GlobalIndexType i = 0; i < mesh.template getNumberOfEntities< DimensionsTag::value >(); i++ ) for( typename Mesh::GlobalIndexType i = 0; i < mesh.template getNumberOfEntities< DimensionsTag::value >(); i++ )
{ {
auto& subentity = mesh.template getEntity< DimensionsTag::value >( i ); auto& subentity = mesh.template getEntity< DimensionsTag::value >( i );
...@@ -49,6 +110,16 @@ struct MeshEntityStorageRebinderWorker ...@@ -49,6 +110,16 @@ struct MeshEntityStorageRebinderWorker
subentity.template bindSuperentitiesStorageNetwork< SuperdimensionsTag::value >( superentitiesStorage.getValues( i ) ); subentity.template bindSuperentitiesStorageNetwork< SuperdimensionsTag::value >( superentitiesStorage.getValues( i ) );
} }
} }
static void bindSubentities( Mesh& mesh )
{
for( typename Mesh::GlobalIndexType i = 0; i < mesh.template getNumberOfEntities< SuperdimensionsTag::value >(); i++ )
{
auto& superentity = mesh.template getEntity< SuperdimensionsTag::value >( i );
auto& subentitiesStorage = mesh.template getSubentityStorageNetwork< SuperdimensionsTag::value, DimensionsTag::value >();
superentity.template bindSubentitiesStorageNetwork< DimensionsTag::value >( subentitiesStorage.getValues( i ) );
}
}
}; };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment