Commit 8585bc52 authored by Ján Bobot's avatar Ján Bobot Committed by Jakub Klinkovský
Browse files

Refactored MeshBuilder to store face seed indeces in a matrix instead of array of EntitySeeds

parent 183033f2
Loading
Loading
Loading
Loading
+10 −10
Original line number Diff line number Diff line
@@ -27,8 +27,8 @@ struct EntityDecomposer;
template< typename MeshConfig, EntityDecomposerVersion SubentityDecomposerVersion > // SubentityDecomposerVersion is not used for polygons
struct EntityDecomposer< MeshConfig, Topologies::Polygon, EntityDecomposerVersion::ConnectEdgesToCentroid, SubentityDecomposerVersion >
{
   using Device = typename Devices::Host;
   using Topology = typename Topologies::Polygon;
   using Device = Devices::Host;
   using Topology = Topologies::Polygon;
   using MeshEntityType = MeshEntity< MeshConfig, Device, Topology >;
   using VertexMeshEntityType = typename MeshEntityType::template SubentityTraits< 0 >::SubentityType;
   using PointType = typename VertexMeshEntityType::PointType;
@@ -76,8 +76,8 @@ struct EntityDecomposer< MeshConfig, Topologies::Polygon, EntityDecomposerVersio
template< typename MeshConfig, EntityDecomposerVersion SubentityDecomposerVersion > // SubentityDecomposerVersion is not used for polygons
struct EntityDecomposer< MeshConfig, Topologies::Polygon, EntityDecomposerVersion::ConnectEdgesToPoint, SubentityDecomposerVersion >
{
   using Device = typename Devices::Host;
   using Topology = typename Topologies::Polygon;
   using Device = Devices::Host;
   using Topology = Topologies::Polygon;
   using MeshEntityType = MeshEntity< MeshConfig, Device, Topology >;
   using VertexMeshEntityType = typename MeshEntityType::template SubentityTraits< 0 >::SubentityType;
   using PointType = typename VertexMeshEntityType::PointType;
@@ -111,9 +111,9 @@ struct EntityDecomposer< MeshConfig, Topologies::Polygon, EntityDecomposerVersio
template< typename MeshConfig, EntityDecomposerVersion SubentityDecomposerVersion >
struct EntityDecomposer< MeshConfig, Topologies::Polyhedron, EntityDecomposerVersion::ConnectEdgesToCentroid, SubentityDecomposerVersion >
{
   using Device = typename Devices::Host;
   using CellTopology = typename Topologies::Polyhedron;
   using FaceTopology = typename Topologies::Polygon;
   using Device = Devices::Host;
   using CellTopology = Topologies::Polyhedron;
   using FaceTopology = Topologies::Polygon;
   using MeshEntityType = MeshEntity< MeshConfig, Device, CellTopology >;
   using VertexMeshEntityType = typename MeshEntityType::template SubentityTraits< 0 >::SubentityType;
   using PointType = typename VertexMeshEntityType::PointType;
@@ -164,9 +164,9 @@ template< typename MeshConfig, EntityDecomposerVersion SubentityDecomposerVersio
struct EntityDecomposer< MeshConfig, Topologies::Polyhedron, EntityDecomposerVersion::ConnectEdgesToPoint, SubentityDecomposerVersion >
{
   // https://mathoverflow.net/a/7672
   using Device = typename Devices::Host;
   using CellTopology = typename Topologies::Polyhedron;
   using FaceTopology = typename Topologies::Polygon;
   using Device = Devices::Host;
   using CellTopology = Topologies::Polyhedron;
   using FaceTopology = Topologies::Polygon;
   using MeshEntityType = MeshEntity< MeshConfig, Device, CellTopology >;
   using MeshSubentityType = MeshEntity< MeshConfig, Device, FaceTopology >;
   using VertexMeshEntityType = typename MeshEntityType::template SubentityTraits< 0 >::SubentityType;
+26 −9
Original line number Diff line number Diff line
@@ -180,6 +180,24 @@ getPlanarMesh( const Mesh< MeshConfig, Devices::Host > & inMesh )
      }
   }

   // set corners count for face seeds
   GlobalIndexType setFacesCount = 0;
   for( GlobalIndexType i = 0; i < inFacesCount; i++ ) {
      const auto & faceMapping = faceMap[ i ];
      const bool isPlanarRes = ( faceMapping.second - faceMapping.first ) == 1;
      if( isPlanarRes ) {
         const auto face = inMesh.template getEntity< 2 >( i );
         const auto verticesCount = face.template getSubentitiesCount< 0 >();
         meshBuilder.setFaceCornersCount( setFacesCount++, verticesCount );
      }
      else {
         for( GlobalIndexType j = faceMapping.first; j < faceMapping.second; j++ ) {
            meshBuilder.setFaceCornersCount( setFacesCount++, 3 );
         }
      }
   }
   meshBuilder.initializeFaceSeeds();

   // Lambda for creating new points
   auto createPointFunc = [&] ( const PointType & point ) {
      const auto pointIdx = setPointsCount++;
@@ -188,13 +206,13 @@ getPlanarMesh( const Mesh< MeshConfig, Devices::Host > & inMesh )
   };

   // Lambda for setting seed of decomposed triangle
   GlobalIndexType setFacesCount = 0;
   setFacesCount = 0;
   auto setDecomposedFaceFunc = [&] ( GlobalIndexType v0, GlobalIndexType v1, GlobalIndexType v2 ) {
      auto & entitySeed = meshBuilder.getFaceSeed( setFacesCount++ );
      entitySeed.setCornersCount( 3 );
      entitySeed.setCornerId( 0, v0 );
      entitySeed.setCornerId( 1, v1 );
      entitySeed.setCornerId( 2, v2 );
      const GlobalIndexType faceId = setFacesCount++;
      auto seed = meshBuilder.getFaceSeed( faceId );
      seed.setCornerId( 0, v0 );
      seed.setCornerId( 1, v1 );
      seed.setCornerId( 2, v2 );
   };

   // Decompose non-planar faces and copy the rest
@@ -204,10 +222,9 @@ getPlanarMesh( const Mesh< MeshConfig, Devices::Host > & inMesh )
      const auto & faceMapping = faceMap[ i ];
      const bool isPlanarRes = ( faceMapping.second - faceMapping.first ) == 1; // Face was planar if face maps only onto 1 face
      if( isPlanarRes ) { // Copy planar faces
         auto & faceSeed = meshBuilder.getFaceSeed( setFacesCount++ );
         faceSeed.setCornersCount( verticesCount );
         const GlobalIndexType faceId = setFacesCount++;
         for( LocalIndexType j = 0; j < verticesCount; j++ ) {
            faceSeed.setCornerId( j, face.template getSubentityIndex< 0 >( j ) );
            meshBuilder.getFaceSeed( faceId ).setCornerId( j, face.template getSubentityIndex< 0 >( j ) );
         }
      }
      else { // Decompose non-planar cells
+1 −1
Original line number Diff line number Diff line
@@ -50,7 +50,7 @@ class MeshInitializableBase

      // The points and cellSeeds arrays will be reset when not needed to save memory.
      void init( typename MeshTraitsType::PointArrayType& points,
                 typename MeshTraitsType::FaceSeedArrayType& faceSeeds,
                 typename MeshTraitsType::FaceSeedMatrixType& faceSeeds,
                 typename MeshTraitsType::CellSeedArrayType& cellSeeds );
};

+1 −1
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@ template< typename MeshConfig, typename Device, typename MeshType >
void
MeshInitializableBase< MeshConfig, Device, MeshType >::
init( typename MeshTraitsType::PointArrayType& points,
      typename MeshTraitsType::FaceSeedArrayType& faceSeeds,
      typename MeshTraitsType::FaceSeedMatrixType& faceSeeds,
      typename MeshTraitsType::CellSeedArrayType& cellSeeds )
{
   MeshType* mesh = static_cast< MeshType* >( this );
+36 −24
Original line number Diff line number Diff line
@@ -32,7 +32,9 @@ public:
   using PointType          = typename MeshTraitsType::PointType;
   using CellTopology       = typename MeshTraitsType::CellTopology;
   using CellSeedType       = typename MeshTraitsType::CellSeedType;
   using FaceSeedType    = typename MeshTraitsType::FaceSeedType;
   using CellSeedMatrixType = typename MeshTraitsType::CellSeedMatrixType;
   using FaceSeedMatrixType = typename MeshTraitsType::FaceSeedMatrixType;
   using FaceSeedType       = typename FaceSeedMatrixType::EntitySeedMatrixSeed;
   
   void setPointsCount( const GlobalIndexType& points )
   {
@@ -43,7 +45,17 @@ public:

   void setFacesCount( const GlobalIndexType& facesCount )
   {
      this->faceSeeds.setSize( facesCount );
      this->faceSeeds.setDimensions( facesCount, this->points.getSize() );
   }

   void setFaceCornersCount( const GlobalIndexType& faceIndex, const LocalIndexType& cornersCount )
   {
      this->faceSeeds.setEntityCornersCount( faceIndex, cornersCount );
   }

   void initializeFaceSeeds()
   {
      this->faceSeeds.initializeRows();
   }

   void setCellsCount( const GlobalIndexType& cellsCount )
@@ -58,7 +70,7 @@ public:

   GlobalIndexType getFacesCount() const
   {
      return this->faceSeeds.getSize();
      return this->faceSeeds.getEntitiesCount();
   }

   GlobalIndexType getCellsCount() const
@@ -73,9 +85,9 @@ public:
      this->pointsSet[ index ] = true;
   }

   FaceSeedType& getFaceSeed( GlobalIndexType index )
   FaceSeedType getFaceSeed( GlobalIndexType index )
   {
      return this->faceSeeds[ index ];
      return this->faceSeeds.getSeed( index );
   }

   CellSeedType& getCellSeed( GlobalIndexType index )
@@ -129,13 +141,13 @@ private:
      else
      {
         for( GlobalIndexType i = 0; i < getFacesCount(); i++ ) {
            const auto& cornerIds = this->faceSeeds[ i ].getCornerIds();
            for( LocalIndexType j = 0; j < cornerIds.getSize(); j++ ) {
               if( cornerIds[ j ] < 0 || getPointsCount() <= cornerIds[ j ] ) {
                  std::cerr << "face seed " << i << " is referencing unavailable point " << cornerIds[ j ] << std::endl;
            const auto faceSeed = this->faceSeeds.getSeed( i );
            for( LocalIndexType j = 0; j < faceSeed.getCornersCount(); j++ ) {
               if( faceSeed.getCornerId( j ) < 0 || getPointsCount() <= faceSeed.getCornerId( j ) ) {
                  std::cerr << "face seed " << i << " is referencing unavailable point " << faceSeed.getCornerId( j ) << std::endl;
                  return false;
               }
               assignedPoints[ cornerIds[ j ] ] = true;
               assignedPoints[ faceSeed.getCornerId( j ) ] = true;
            }
         }

@@ -145,7 +157,7 @@ private:
         }

         BoolVector assignedFaces;
         assignedFaces.setLike( faceSeeds );
         assignedFaces.setSize( faceSeeds.getEntitiesCount() );
         assignedFaces.setValue( false );

         for( GlobalIndexType i = 0; i < getCellsCount(); i++ ) {
@@ -169,7 +181,7 @@ private:
   }

   PointArrayType points;
   FaceSeedArrayType faceSeeds;
   FaceSeedMatrixType faceSeeds;
   CellSeedArrayType cellSeeds;
   BoolVector pointsSet;
};
Loading