Commit 1f040c7c authored by Jakub Klinkovský's avatar Jakub Klinkovský
Browse files

Fixed reordering of mesh entities with dynamic topology

parent c69ae2af
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -301,6 +301,10 @@ protected:
   template< int EntityDimension, int SubentityDimension >
   void
   setSubentitiesCounts( const typename MeshTraitsType::NeighborCountsArray& counts );

   template< int EntityDimension, int SubentityDimension >
   void
   setSubentitiesCounts( typename MeshTraitsType::NeighborCountsArray&& counts );
};

template< typename MeshConfig, typename Device >
+8 −0
Original line number Diff line number Diff line
@@ -144,6 +144,14 @@ Mesh< MeshConfig, Device >::setSubentitiesCounts( const typename MeshTraitsType:
   StorageBaseType::template setSubentitiesCounts< EntityDimension, SubentityDimension >( counts );
}

template< typename MeshConfig, typename Device >
template< int EntityDimension, int SubentityDimension >
void
Mesh< MeshConfig, Device >::setSubentitiesCounts( typename MeshTraitsType::NeighborCountsArray&& counts )
{
   StorageBaseType::template setSubentitiesCounts< EntityDimension, SubentityDimension >( std::move( counts ) );
}

template< typename MeshConfig, typename Device >
template< int EntityDimension, int SubentityDimension >
__cuda_callable__
+12 −0
Original line number Diff line number Diff line
@@ -28,6 +28,18 @@ private:
      static void
      exec( Mesh& mesh, const GlobalIndexArray& perm )
      {
         using EntityTopology = typename Mesh::template EntityType< Dimension >::EntityTopology;
         if( Topologies::IsDynamicTopology< EntityTopology >::value ) {
            // copy the subentity counts into an array
            typename Mesh::MeshTraitsType::NeighborCountsArray counts( perm.getSize() );
            for( typename GlobalIndexArray::ValueType i = 0; i < perm.getSize(); i++ )
               counts[ i ] = mesh.template getSubentitiesCount< Dimension, Subdimension >( i );
            // permute the array
            permuteArray( counts, perm );
            // set the permuted counts
            mesh.template setSubentitiesCounts< Dimension, Subdimension >( std::move( counts ) );
         }

         auto& subentitiesStorage = mesh.template getSubentitiesMatrix< Dimension, Subdimension >();
         Matrices::permuteMatrixRows( subentitiesStorage, perm );
      }
+12 −0
Original line number Diff line number Diff line
@@ -85,6 +85,18 @@ public:
      BaseType::template setSubentitiesCounts< Subdimension >( counts );
   }

   template< int Dimension, int Subdimension >
   void
   setSubentitiesCounts( typename MeshTraitsType::NeighborCountsArray&& counts )
   {
      static_assert( Dimension > Subdimension, "Invalid combination of Dimension and Subdimension." );
      static_assert( SubentityTraits< Dimension, Subdimension >::storageEnabled,
                     "You try to set subentitiesCounts for a combination of Dimension and Subdimension which is disabled in "
                     "the mesh configuration." );
      using BaseType = SubentityStorageLayerFamily< MeshConfig, Device, typename EntityTraits< Dimension >::EntityTopology >;
      BaseType::template setSubentitiesCounts< Subdimension >( std::move( counts ) );
   }

   template< int Dimension, int Subdimension >
   __cuda_callable__
   typename MeshTraitsType::LocalIndexType