Loading src/TNL/Meshes/Geometry/EntityDecomposer.h +10 −10 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading src/TNL/Meshes/Geometry/getPlanarMesh.h +26 −9 Original line number Diff line number Diff line Loading @@ -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++; Loading @@ -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 Loading @@ -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 Loading src/TNL/Meshes/Mesh.h +1 −1 Original line number Diff line number Diff line Loading @@ -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 ); }; Loading src/TNL/Meshes/Mesh.hpp +1 −1 Original line number Diff line number Diff line Loading @@ -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 ); Loading src/TNL/Meshes/MeshBuilder.h +36 −24 Original line number Diff line number Diff line Loading @@ -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 ) { Loading @@ -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 ) Loading @@ -58,7 +70,7 @@ public: GlobalIndexType getFacesCount() const { return this->faceSeeds.getSize(); return this->faceSeeds.getEntitiesCount(); } GlobalIndexType getCellsCount() const Loading @@ -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 ) Loading Loading @@ -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; } } Loading @@ -145,7 +157,7 @@ private: } BoolVector assignedFaces; assignedFaces.setLike( faceSeeds ); assignedFaces.setSize( faceSeeds.getEntitiesCount() ); assignedFaces.setValue( false ); for( GlobalIndexType i = 0; i < getCellsCount(); i++ ) { Loading @@ -169,7 +181,7 @@ private: } PointArrayType points; FaceSeedArrayType faceSeeds; FaceSeedMatrixType faceSeeds; CellSeedArrayType cellSeeds; BoolVector pointsSet; }; Loading Loading
src/TNL/Meshes/Geometry/EntityDecomposer.h +10 −10 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading
src/TNL/Meshes/Geometry/getPlanarMesh.h +26 −9 Original line number Diff line number Diff line Loading @@ -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++; Loading @@ -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 Loading @@ -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 Loading
src/TNL/Meshes/Mesh.h +1 −1 Original line number Diff line number Diff line Loading @@ -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 ); }; Loading
src/TNL/Meshes/Mesh.hpp +1 −1 Original line number Diff line number Diff line Loading @@ -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 ); Loading
src/TNL/Meshes/MeshBuilder.h +36 −24 Original line number Diff line number Diff line Loading @@ -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 ) { Loading @@ -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 ) Loading @@ -58,7 +70,7 @@ public: GlobalIndexType getFacesCount() const { return this->faceSeeds.getSize(); return this->faceSeeds.getEntitiesCount(); } GlobalIndexType getCellsCount() const Loading @@ -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 ) Loading Loading @@ -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; } } Loading @@ -145,7 +157,7 @@ private: } BoolVector assignedFaces; assignedFaces.setLike( faceSeeds ); assignedFaces.setSize( faceSeeds.getEntitiesCount() ); assignedFaces.setValue( false ); for( GlobalIndexType i = 0; i < getCellsCount(); i++ ) { Loading @@ -169,7 +181,7 @@ private: } PointArrayType points; FaceSeedArrayType faceSeeds; FaceSeedMatrixType faceSeeds; CellSeedArrayType cellSeeds; BoolVector pointsSet; }; Loading