From 041d60708c43d46518686adf1d0ecceb15f1f00e Mon Sep 17 00:00:00 2001
From: Jan Bobot <bobotjan@fit.cvut.cz>
Date: Wed, 25 Aug 2021 11:39:32 +0200
Subject: [PATCH] Moved the declaration of SubentityMatrixType from
 MeshSubentityTraits to MeshEntityTraits

---
 .../MeshDetails/initializer/Initializer.h     |  2 +-
 .../Meshes/MeshDetails/layers/StorageLayer.h  |  4 +-
 .../layers/SubentityStorageLayer.h            | 12 +++---
 .../MeshDetails/traits/MeshEntityTraits.h     | 43 ++++++++++++++-----
 .../MeshDetails/traits/MeshSubentityTraits.h  |  6 ---
 .../Meshes/MeshDetails/traits/MeshTraits.h    | 27 +++++++++---
 6 files changed, 63 insertions(+), 31 deletions(-)

diff --git a/src/TNL/Meshes/MeshDetails/initializer/Initializer.h b/src/TNL/Meshes/MeshDetails/initializer/Initializer.h
index eb8e54564c..8dfd3c0dba 100644
--- a/src/TNL/Meshes/MeshDetails/initializer/Initializer.h
+++ b/src/TNL/Meshes/MeshDetails/initializer/Initializer.h
@@ -84,7 +84,7 @@ class Initializer
       using NeighborCountsArray = typename MeshTraitsType::NeighborCountsArray;
 
       template< int Dimension, int Subdimension >
-      using SubentityMatrixRowsCapacitiesType = typename MeshTraitsType::template SubentityMatrixType< Dimension, Subdimension >::RowsCapacitiesType;
+      using SubentityMatrixRowsCapacitiesType = typename MeshTraitsType::template SubentityMatrixType< Dimension >::RowsCapacitiesType;
 
       // The points and cellSeeds arrays will be reset when not needed to save memory.
       void createMesh( PointArrayType& points,
diff --git a/src/TNL/Meshes/MeshDetails/layers/StorageLayer.h b/src/TNL/Meshes/MeshDetails/layers/StorageLayer.h
index 8423cc722d..84f3128341 100644
--- a/src/TNL/Meshes/MeshDetails/layers/StorageLayer.h
+++ b/src/TNL/Meshes/MeshDetails/layers/StorageLayer.h
@@ -113,7 +113,7 @@ public:
 
    template< int Dimension, int Subdimension >
    __cuda_callable__
-   typename MeshTraitsType::template SubentityMatrixType< Dimension, Subdimension >&
+   typename MeshTraitsType::template SubentityMatrixType< Dimension >&
    getSubentitiesMatrix()
    {
       static_assert( Dimension > Subdimension, "Invalid combination of Dimension and Subdimension." );
@@ -127,7 +127,7 @@ public:
 
    template< int Dimension, int Subdimension >
    __cuda_callable__
-   const typename MeshTraitsType::template SubentityMatrixType< Dimension, Subdimension >&
+   const typename MeshTraitsType::template SubentityMatrixType< Dimension >&
    getSubentitiesMatrix() const
    {
       static_assert( Dimension > Subdimension, "Invalid combination of Dimension and Subdimension." );
diff --git a/src/TNL/Meshes/MeshDetails/layers/SubentityStorageLayer.h b/src/TNL/Meshes/MeshDetails/layers/SubentityStorageLayer.h
index b00fed8328..e3b63c4800 100644
--- a/src/TNL/Meshes/MeshDetails/layers/SubentityStorageLayer.h
+++ b/src/TNL/Meshes/MeshDetails/layers/SubentityStorageLayer.h
@@ -67,7 +67,7 @@ protected:
 
    template< int Subdimension >
    __cuda_callable__
-   typename MeshTraitsType::template SubentityMatrixType< EntityTopology::dimension, Subdimension >&
+   typename MeshTraitsType::template SubentityMatrixType< EntityTopology::dimension >&
    getSubentitiesMatrix()
    {
       static_assert( EntityTopology::dimension > Subdimension, "Invalid combination of Dimension and Subdimension." );
@@ -76,7 +76,7 @@ protected:
 
    template< int Subdimension >
    __cuda_callable__
-   const typename MeshTraitsType::template SubentityMatrixType< EntityTopology::dimension, Subdimension >&
+   const typename MeshTraitsType::template SubentityMatrixType< EntityTopology::dimension >&
    getSubentitiesMatrix() const
    {
       static_assert( EntityTopology::dimension > Subdimension, "Invalid combination of Dimension and Subdimension." );
@@ -108,7 +108,7 @@ class SubentityStorageLayer< MeshConfig,
 protected:
    using GlobalIndexType    = typename MeshTraitsType::GlobalIndexType;
    using LocalIndexType     = typename MeshTraitsType::LocalIndexType;
-   using SubentityMatrixType = typename MeshTraitsType::template SubentityMatrixType< EntityTopology::dimension, SubdimensionTag::value >;
+   using SubentityMatrixType = typename MeshTraitsType::template SubentityMatrixType< EntityTopology::dimension >;
 
    SubentityStorageLayer() = default;
 
@@ -210,7 +210,7 @@ protected:
    using GlobalIndexType     = typename MeshTraitsType::GlobalIndexType;
    using LocalIndexType      = typename MeshTraitsType::LocalIndexType;
    using NeighborCountsArray = typename MeshTraitsType::NeighborCountsArray;
-   using SubentityMatrixType = typename MeshTraitsType::template SubentityMatrixType< EntityTopology::dimension, SubdimensionTag::value >;
+   using SubentityMatrixType = typename MeshTraitsType::template SubentityMatrixType< EntityTopology::dimension >;
 
    SubentityStorageLayer() = default;
 
@@ -330,7 +330,7 @@ protected:
    using GlobalIndexType     = typename MeshTraitsType::GlobalIndexType;
    using LocalIndexType      = typename MeshTraitsType::LocalIndexType;
    using NeighborCountsArray = typename MeshTraitsType::NeighborCountsArray;
-   using SubentityMatrixType = typename MeshTraitsType::template SubentityMatrixType< EntityTopology::dimension, SubdimensionTag::value >;
+   using SubentityMatrixType = typename MeshTraitsType::template SubentityMatrixType< EntityTopology::dimension >;
 
    SubentityStorageLayer() = default;
 
@@ -444,7 +444,7 @@ protected:
    using GlobalIndexType     = typename MeshTraitsType::GlobalIndexType;
    using LocalIndexType      = typename MeshTraitsType::LocalIndexType;
    using NeighborCountsArray = typename MeshTraitsType::NeighborCountsArray;
-   using SubentityMatrixType = typename MeshTraitsType::template SubentityMatrixType< EntityTopology::dimension, SubdimensionTag::value >;
+   using SubentityMatrixType = typename MeshTraitsType::template SubentityMatrixType< EntityTopology::dimension >;
 
    SubentityStorageLayer() = default;
 
diff --git a/src/TNL/Meshes/MeshDetails/traits/MeshEntityTraits.h b/src/TNL/Meshes/MeshDetails/traits/MeshEntityTraits.h
index 2bf7f856fc..db54ac8278 100644
--- a/src/TNL/Meshes/MeshDetails/traits/MeshEntityTraits.h
+++ b/src/TNL/Meshes/MeshDetails/traits/MeshEntityTraits.h
@@ -29,25 +29,43 @@ namespace Meshes {
 
 template< typename MeshConfig, typename Device, typename EntityTopology > class MeshEntity;
 
+/****
+ *       Mesh entity traits with specializations
+ *
+ *  DYNAMIC TOPOLOGY
+ *       FALSE
+ */
 template< typename MeshConfig,
-          typename DimensionTag >
-struct EntityTopologyGetter
+          typename Device,
+          int Dimension >
+class MeshEntityTraits< MeshConfig, Device, Dimension, false >
 {
-   static_assert( DimensionTag::value <= MeshConfig::meshDimension, "There are no entities with dimension higher than the mesh dimension." );
-   using Topology = typename Topologies::Subtopology< typename MeshConfig::CellTopology, DimensionTag::value >::Topology;
-};
+   using GlobalIndexType = typename MeshConfig::GlobalIndexType;
 
-template< typename MeshConfig >
-struct EntityTopologyGetter< MeshConfig, DimensionTag< MeshConfig::CellTopology::dimension > >
-{
-   using Topology = typename MeshConfig::CellTopology;
-};
+public:
+   static_assert( 0 <= Dimension && Dimension <= MeshConfig::meshDimension, "invalid dimension" );
 
+   using EntityTopology                = typename EntityTopologyGetter< MeshConfig, DimensionTag< Dimension > >::Topology;
+   using EntityType                    = MeshEntity< MeshConfig, Device, EntityTopology >;
+   using SeedType                      = EntitySeed< MeshConfig, EntityTopology >;
+
+   using SeedIndexedSetType            = Containers::UnorderedIndexedSet< SeedType, GlobalIndexType, typename SeedType::HashType, typename SeedType::KeyEqual >;
+   using SeedSetType                   = std::unordered_set< typename SeedIndexedSetType::key_type, typename SeedIndexedSetType::hasher, typename SeedIndexedSetType::key_equal >;
 
+   // container for storing the subentity indices
+   using SubentityMatrixType = Matrices::SparseMatrix< bool, Device, GlobalIndexType, Matrices::GeneralMatrix, EllpackSegments >;
+};
+
+/****
+ *       Mesh entity traits with specializations
+ *
+ *  DYNAMIC TOPOLOGY
+ *       TRUE
+ */
 template< typename MeshConfig,
           typename Device,
           int Dimension >
-class MeshEntityTraits
+class MeshEntityTraits< MeshConfig, Device, Dimension, true >
 {
    using GlobalIndexType = typename MeshConfig::GlobalIndexType;
 
@@ -60,6 +78,9 @@ public:
 
    using SeedIndexedSetType            = Containers::UnorderedIndexedSet< SeedType, GlobalIndexType, typename SeedType::HashType, typename SeedType::KeyEqual >;
    using SeedSetType                   = std::unordered_set< typename SeedIndexedSetType::key_type, typename SeedIndexedSetType::hasher, typename SeedIndexedSetType::key_equal >;
+
+   // container for storing the subentity indices
+   using SubentityMatrixType = Matrices::SparseMatrix< bool, Device, GlobalIndexType, Matrices::GeneralMatrix, SlicedEllpackSegments >;
 };
 
 } // namespace Meshes
diff --git a/src/TNL/Meshes/MeshDetails/traits/MeshSubentityTraits.h b/src/TNL/Meshes/MeshDetails/traits/MeshSubentityTraits.h
index 7ab39d200a..0f191784e6 100644
--- a/src/TNL/Meshes/MeshDetails/traits/MeshSubentityTraits.h
+++ b/src/TNL/Meshes/MeshDetails/traits/MeshSubentityTraits.h
@@ -48,9 +48,6 @@ public:
    using SubentityTopology = typename MeshEntityTraits< MeshConfig, Device, Dimension >::EntityTopology;
    using SubentityType     = typename MeshEntityTraits< MeshConfig, Device, Dimension >::EntityType;
 
-   // container for storing the subentity indices
-   using SubentityMatrixType = Matrices::SparseMatrix< bool, Device, GlobalIndexType, Matrices::GeneralMatrix, EllpackSegments >;
-
    template< LocalIndexType subentityIndex,
              LocalIndexType subentityVertexIndex >
    struct Vertex
@@ -86,9 +83,6 @@ public:
 
    using SubentityTopology = typename MeshEntityTraits< MeshConfig, Device, Dimension >::EntityTopology;
    using SubentityType     = typename MeshEntityTraits< MeshConfig, Device, Dimension >::EntityType;
-
-   // container for storing the subentity indices
-   using SubentityMatrixType = Matrices::SparseMatrix< bool, Device, GlobalIndexType, Matrices::GeneralMatrix, SlicedEllpackSegments >;
 };
 
 } // namespace Meshes
diff --git a/src/TNL/Meshes/MeshDetails/traits/MeshTraits.h b/src/TNL/Meshes/MeshDetails/traits/MeshTraits.h
index d2f128f8e2..df079e40b3 100644
--- a/src/TNL/Meshes/MeshDetails/traits/MeshTraits.h
+++ b/src/TNL/Meshes/MeshDetails/traits/MeshTraits.h
@@ -33,11 +33,28 @@ template< typename MeshConfig, typename Device, typename EntityTopology > class
 
 template< typename MeshConfig,
           typename EntityTopology,
-          bool variableSize = std::is_same< EntityTopology, Topologies::Polygon >::value ||
-                              std::is_same< EntityTopology, Topologies::Polyhedron >::value >
+          bool IsDynamicTopology = Topologies::IsDynamicTopology< EntityTopology >::value >
 class EntitySeed;
 
-template< typename MeshConfig, typename Device, int Dimension > class MeshEntityTraits;
+template< typename MeshConfig,
+          typename DimensionTag >
+struct EntityTopologyGetter
+{
+   static_assert( DimensionTag::value <= MeshConfig::meshDimension, "There are no entities with dimension higher than the mesh dimension." );
+   using Topology = typename Topologies::Subtopology< typename MeshConfig::CellTopology, DimensionTag::value >::Topology;
+};
+
+template< typename MeshConfig >
+struct EntityTopologyGetter< MeshConfig, DimensionTag< MeshConfig::CellTopology::dimension > >
+{
+   using Topology = typename MeshConfig::CellTopology;
+};
+
+template< typename MeshConfig,
+          typename Device,
+          int Dimension,
+          bool IsDynamicTopology = Topologies::IsDynamicTopology< typename EntityTopologyGetter< MeshConfig, DimensionTag< Dimension > >::Topology >::value >
+class MeshEntityTraits;
 
 template< typename MeshConfig,
           typename Device,
@@ -93,8 +110,8 @@ public:
    using DimensionTag = Meshes::DimensionTag< meshDimension >;
 
    // container for storing the subentity indices
-   template< int Dimension, int Subdimension >
-   using SubentityMatrixType = typename SubentityTraits< typename EntityTraits< Dimension >::EntityTopology, Subdimension >::SubentityMatrixType;
+   template< int Dimension >
+   using SubentityMatrixType = typename EntityTraits< Dimension >::SubentityMatrixType;
 
    // container for storing the superentity indices
    using SuperentityMatrixType = Matrices::SparseMatrix< bool, Device, GlobalIndexType, Matrices::GeneralMatrix, SlicedEllpackSegments >;
-- 
GitLab