Loading src/TNL/Meshes/MeshDetails/MeshEntity_impl.h +17 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,15 @@ operator==( const MeshEntity& entity ) const typename MeshConfig::GlobalIndexType >::operator==( entity ) ); } template< typename MeshConfig, typename EntityTopology > bool MeshEntity< MeshConfig, EntityTopology >:: operator!=( const MeshEntity& entity ) const { return ! ( *this == entity ); } template< typename MeshConfig, typename EntityTopology > constexpr int Loading Loading @@ -340,6 +349,14 @@ operator==( const MeshEntity& entity ) const point == entity.point ); } template< typename MeshConfig > bool MeshEntity< MeshConfig, MeshVertexTopology >:: operator!=( const MeshEntity& entity ) const { return ! ( *this == entity ); } template< typename MeshConfig > constexpr int MeshEntity< MeshConfig, MeshVertexTopology >:: Loading src/TNL/Meshes/MeshDetails/layers/MeshSuperentityAccess.h +11 −1 Original line number Diff line number Diff line Loading @@ -133,7 +133,17 @@ public: using BaseType::getSuperentityIndex; using BaseType::getSuperentityIndices; MeshSuperentityAccessLayer& operator = ( const MeshSuperentityAccessLayer& layer ) = delete; MeshSuperentityAccessLayer() = default; explicit MeshSuperentityAccessLayer( const MeshSuperentityAccessLayer& layer ) { this->superentityIndices.bind( layer.superentityIndices ); } MeshSuperentityAccessLayer& operator=( const MeshSuperentityAccessLayer& layer ) { this->superentityIndices.bind( layer.superentityIndices ); } /**** * Define setter/getter for the current level of the superentities Loading src/TNL/Meshes/MeshEntity.h +4 −0 Original line number Diff line number Diff line Loading @@ -70,6 +70,8 @@ class MeshEntity bool operator==( const MeshEntity& entity ) const; bool operator!=( const MeshEntity& entity ) const; constexpr int getEntityDimension() const; /**** Loading Loading @@ -166,6 +168,8 @@ class MeshEntity< MeshConfig, MeshVertexTopology > bool operator==( const MeshEntity& entity ) const; bool operator!=( const MeshEntity& entity ) const; constexpr int getEntityDimension() const; /**** Loading src/UnitTests/Meshes/MeshEntityTest.h +121 −0 Original line number Diff line number Diff line Loading @@ -502,4 +502,125 @@ TEST( MeshEntityTest, TwoTrianglesMeshEntityTest ) ASSERT_EQ( edgeEntities[ 0 ].template getSuperentityIndex< 2 >( 1 ), 1 ); } TEST( MeshEntityTest, OneTriangleComparisonTest ) { using TriangleMeshEntityType = TestMeshEntity< TestTriangleMeshConfig, MeshTriangleTopology >; using EdgeMeshEntityType = TestMeshEntity< TestTriangleMeshConfig, typename TriangleMeshEntityType::SubentityTraits< 1 >::SubentityTopology >; using VertexMeshEntityType = TestMeshEntity< TestTriangleMeshConfig, typename TriangleMeshEntityType::SubentityTraits< 0 >::SubentityTopology >; static_assert( TriangleMeshEntityType::SubentityTraits< 1 >::storageEnabled, "Testing triangle entity does not store edges as required." ); static_assert( TriangleMeshEntityType::SubentityTraits< 0 >::storageEnabled, "Testing triangle entity does not store vertices as required." ); static_assert( EdgeMeshEntityType::SubentityTraits< 0 >::storageEnabled, "Testing edge entity does not store vertices as required." ); static_assert( EdgeMeshEntityType::SuperentityTraits< 2 >::storageEnabled, "Testing edge entity does not store triangles as required." ); static_assert( VertexMeshEntityType::SuperentityTraits< 2 >::storageEnabled, "Testing vertex entity does not store triangles as required." ); static_assert( VertexMeshEntityType::SuperentityTraits< 1 >::storageEnabled, "Testing vertex entity does not store edges as required." ); using PointType = typename VertexMeshEntityType::PointType; ASSERT_TRUE( PointType::getType() == ( Containers::StaticVector< 2, RealType >::getType() ) ); PointType point0( 0.0, 0.0 ), point1( 1.0, 0.0 ), point2( 0.0, 1.0 ); Containers::StaticArray< 3, VertexMeshEntityType > vertices; vertices[ 0 ].setPoint( point0 ); vertices[ 1 ].setPoint( point1 ); vertices[ 2 ].setPoint( point2 ); Containers::StaticArray< 3, EdgeMeshEntityType > edges; edges[ 0 ].template setSubentityIndex< 0 >( 0, 1 ); edges[ 0 ].template setSubentityIndex< 0 >( 1, 2 ); edges[ 1 ].template setSubentityIndex< 0 >( 0, 2 ); edges[ 1 ].template setSubentityIndex< 0 >( 1, 0 ); edges[ 2 ].template setSubentityIndex< 0 >( 0, 0 ); edges[ 2 ].template setSubentityIndex< 0 >( 1, 1 ); TriangleMeshEntityType triangle; triangle.template setSubentityIndex< 0 >( 0 , 0 ); triangle.template setSubentityIndex< 0 >( 1 , 1 ); triangle.template setSubentityIndex< 0 >( 2 , 2 ); triangle.template setSubentityIndex< 1 >( 0 , 0 ); triangle.template setSubentityIndex< 1 >( 1 , 1 ); triangle.template setSubentityIndex< 1 >( 2 , 2 ); StorageNetwork< TestTriangleMeshConfig, MeshVertexTopology, 1 > vertexEdgeSuperentities; vertexEdgeSuperentities.setKeysRange( 3 ); vertexEdgeSuperentities.allocate( 2 ); vertices[ 0 ].template bindSuperentitiesStorageNetwork< 1 >( vertexEdgeSuperentities.getValues( 0 ) ); vertices[ 0 ].template setNumberOfSuperentities< 1 >( 2 ); vertices[ 0 ].template setSuperentityIndex< 1 >( 0, 2 ); vertices[ 0 ].template setSuperentityIndex< 1 >( 1, 1 ); vertices[ 1 ].template bindSuperentitiesStorageNetwork< 1 >( vertexEdgeSuperentities.getValues( 1 ) ); vertices[ 1 ].template setNumberOfSuperentities< 1 >( 2 ); vertices[ 1 ].template setSuperentityIndex< 1 >( 0, 0 ); vertices[ 1 ].template setSuperentityIndex< 1 >( 1, 2 ); vertices[ 2 ].template bindSuperentitiesStorageNetwork< 1 >( vertexEdgeSuperentities.getValues( 2 ) ); vertices[ 2 ].template setNumberOfSuperentities< 1 >( 2 ); vertices[ 2 ].template setSuperentityIndex< 1 >( 0, 0 ); vertices[ 2 ].template setSuperentityIndex< 1 >( 1, 1 ); StorageNetwork< TestTriangleMeshConfig, MeshVertexTopology, 2 > vertexCellSuperentities; vertexCellSuperentities.setKeysRange( 3 ); vertexCellSuperentities.allocate( 1 ); vertices[ 0 ].template bindSuperentitiesStorageNetwork< 2 >( vertexCellSuperentities.getValues( 0 ) ); vertices[ 0 ].template setNumberOfSuperentities< 2 >( 1 ); vertices[ 0 ].template setSuperentityIndex< 2 >( 0, 0 ); vertices[ 1 ].template bindSuperentitiesStorageNetwork< 2 >( vertexCellSuperentities.getValues( 1 ) ); vertices[ 1 ].template setNumberOfSuperentities< 2 >( 1 ); vertices[ 1 ].template setSuperentityIndex< 2 >( 0, 0 ); vertices[ 2 ].template bindSuperentitiesStorageNetwork< 2 >( vertexCellSuperentities.getValues( 2 ) ); vertices[ 2 ].template setNumberOfSuperentities< 2 >( 1 ); vertices[ 2 ].template setSuperentityIndex< 2 >( 0, 0 ); StorageNetwork< TestTriangleMeshConfig, MeshEdgeTopology, 2 > edgeCellSuperentities; edgeCellSuperentities.setKeysRange( 3 ); edgeCellSuperentities.allocate( 1 ); edges[ 0 ].template bindSuperentitiesStorageNetwork< 2 >( edgeCellSuperentities.getValues( 0 ) ); edges[ 0 ].template setNumberOfSuperentities< 2 >( 1 ); edges[ 0 ].template setSuperentityIndex< 2 >( 0, 0 ); edges[ 1 ].template bindSuperentitiesStorageNetwork< 2 >( edgeCellSuperentities.getValues( 1 ) ); edges[ 1 ].template setNumberOfSuperentities< 2 >( 1 ); edges[ 1 ].template setSuperentityIndex< 2 >( 0, 0 ); edges[ 2 ].template bindSuperentitiesStorageNetwork< 2 >( edgeCellSuperentities.getValues( 2 ) ); edges[ 2 ].template setNumberOfSuperentities< 2 >( 1 ); edges[ 2 ].template setSuperentityIndex< 2 >( 0, 0 ); /* * Tests for MeshEntity::operator== */ EXPECT_EQ( vertices[ 0 ], vertices[ 0 ] ); EXPECT_NE( vertices[ 0 ], vertices[ 1 ] ); vertices[ 0 ].setPoint( point1 ); vertices[ 0 ].template setSuperentityIndex< 1 >( 0, 0 ); vertices[ 0 ].template setSuperentityIndex< 1 >( 1, 2 ); EXPECT_EQ( vertices[ 0 ], vertices[ 1 ] ); vertices[ 0 ].template setSuperentityIndex< 2 >( 0, 1 ); EXPECT_NE( vertices[ 0 ], vertices[ 1 ] ); vertices[ 1 ].template setSuperentityIndex< 2 >( 0, 1 ); EXPECT_EQ( vertices[ 0 ], vertices[ 1 ] ); EXPECT_EQ( edges[ 0 ], edges[ 0 ] ); EXPECT_NE( edges[ 0 ], edges[ 1 ] ); edges[ 0 ].template setSubentityIndex< 0 >( 0, 2 ); edges[ 0 ].template setSubentityIndex< 0 >( 1, 0 ); EXPECT_EQ( edges[ 0 ], edges[ 1 ] ); edges[ 0 ].template setSuperentityIndex< 2 >( 0, 1 ); EXPECT_NE( edges[ 0 ], edges[ 1 ] ); edges[ 1 ].template setSuperentityIndex< 2 >( 0, 1 ); EXPECT_EQ( edges[ 0 ], edges[ 1 ] ); } #endif Loading
src/TNL/Meshes/MeshDetails/MeshEntity_impl.h +17 −0 Original line number Diff line number Diff line Loading @@ -101,6 +101,15 @@ operator==( const MeshEntity& entity ) const typename MeshConfig::GlobalIndexType >::operator==( entity ) ); } template< typename MeshConfig, typename EntityTopology > bool MeshEntity< MeshConfig, EntityTopology >:: operator!=( const MeshEntity& entity ) const { return ! ( *this == entity ); } template< typename MeshConfig, typename EntityTopology > constexpr int Loading Loading @@ -340,6 +349,14 @@ operator==( const MeshEntity& entity ) const point == entity.point ); } template< typename MeshConfig > bool MeshEntity< MeshConfig, MeshVertexTopology >:: operator!=( const MeshEntity& entity ) const { return ! ( *this == entity ); } template< typename MeshConfig > constexpr int MeshEntity< MeshConfig, MeshVertexTopology >:: Loading
src/TNL/Meshes/MeshDetails/layers/MeshSuperentityAccess.h +11 −1 Original line number Diff line number Diff line Loading @@ -133,7 +133,17 @@ public: using BaseType::getSuperentityIndex; using BaseType::getSuperentityIndices; MeshSuperentityAccessLayer& operator = ( const MeshSuperentityAccessLayer& layer ) = delete; MeshSuperentityAccessLayer() = default; explicit MeshSuperentityAccessLayer( const MeshSuperentityAccessLayer& layer ) { this->superentityIndices.bind( layer.superentityIndices ); } MeshSuperentityAccessLayer& operator=( const MeshSuperentityAccessLayer& layer ) { this->superentityIndices.bind( layer.superentityIndices ); } /**** * Define setter/getter for the current level of the superentities Loading
src/TNL/Meshes/MeshEntity.h +4 −0 Original line number Diff line number Diff line Loading @@ -70,6 +70,8 @@ class MeshEntity bool operator==( const MeshEntity& entity ) const; bool operator!=( const MeshEntity& entity ) const; constexpr int getEntityDimension() const; /**** Loading Loading @@ -166,6 +168,8 @@ class MeshEntity< MeshConfig, MeshVertexTopology > bool operator==( const MeshEntity& entity ) const; bool operator!=( const MeshEntity& entity ) const; constexpr int getEntityDimension() const; /**** Loading
src/UnitTests/Meshes/MeshEntityTest.h +121 −0 Original line number Diff line number Diff line Loading @@ -502,4 +502,125 @@ TEST( MeshEntityTest, TwoTrianglesMeshEntityTest ) ASSERT_EQ( edgeEntities[ 0 ].template getSuperentityIndex< 2 >( 1 ), 1 ); } TEST( MeshEntityTest, OneTriangleComparisonTest ) { using TriangleMeshEntityType = TestMeshEntity< TestTriangleMeshConfig, MeshTriangleTopology >; using EdgeMeshEntityType = TestMeshEntity< TestTriangleMeshConfig, typename TriangleMeshEntityType::SubentityTraits< 1 >::SubentityTopology >; using VertexMeshEntityType = TestMeshEntity< TestTriangleMeshConfig, typename TriangleMeshEntityType::SubentityTraits< 0 >::SubentityTopology >; static_assert( TriangleMeshEntityType::SubentityTraits< 1 >::storageEnabled, "Testing triangle entity does not store edges as required." ); static_assert( TriangleMeshEntityType::SubentityTraits< 0 >::storageEnabled, "Testing triangle entity does not store vertices as required." ); static_assert( EdgeMeshEntityType::SubentityTraits< 0 >::storageEnabled, "Testing edge entity does not store vertices as required." ); static_assert( EdgeMeshEntityType::SuperentityTraits< 2 >::storageEnabled, "Testing edge entity does not store triangles as required." ); static_assert( VertexMeshEntityType::SuperentityTraits< 2 >::storageEnabled, "Testing vertex entity does not store triangles as required." ); static_assert( VertexMeshEntityType::SuperentityTraits< 1 >::storageEnabled, "Testing vertex entity does not store edges as required." ); using PointType = typename VertexMeshEntityType::PointType; ASSERT_TRUE( PointType::getType() == ( Containers::StaticVector< 2, RealType >::getType() ) ); PointType point0( 0.0, 0.0 ), point1( 1.0, 0.0 ), point2( 0.0, 1.0 ); Containers::StaticArray< 3, VertexMeshEntityType > vertices; vertices[ 0 ].setPoint( point0 ); vertices[ 1 ].setPoint( point1 ); vertices[ 2 ].setPoint( point2 ); Containers::StaticArray< 3, EdgeMeshEntityType > edges; edges[ 0 ].template setSubentityIndex< 0 >( 0, 1 ); edges[ 0 ].template setSubentityIndex< 0 >( 1, 2 ); edges[ 1 ].template setSubentityIndex< 0 >( 0, 2 ); edges[ 1 ].template setSubentityIndex< 0 >( 1, 0 ); edges[ 2 ].template setSubentityIndex< 0 >( 0, 0 ); edges[ 2 ].template setSubentityIndex< 0 >( 1, 1 ); TriangleMeshEntityType triangle; triangle.template setSubentityIndex< 0 >( 0 , 0 ); triangle.template setSubentityIndex< 0 >( 1 , 1 ); triangle.template setSubentityIndex< 0 >( 2 , 2 ); triangle.template setSubentityIndex< 1 >( 0 , 0 ); triangle.template setSubentityIndex< 1 >( 1 , 1 ); triangle.template setSubentityIndex< 1 >( 2 , 2 ); StorageNetwork< TestTriangleMeshConfig, MeshVertexTopology, 1 > vertexEdgeSuperentities; vertexEdgeSuperentities.setKeysRange( 3 ); vertexEdgeSuperentities.allocate( 2 ); vertices[ 0 ].template bindSuperentitiesStorageNetwork< 1 >( vertexEdgeSuperentities.getValues( 0 ) ); vertices[ 0 ].template setNumberOfSuperentities< 1 >( 2 ); vertices[ 0 ].template setSuperentityIndex< 1 >( 0, 2 ); vertices[ 0 ].template setSuperentityIndex< 1 >( 1, 1 ); vertices[ 1 ].template bindSuperentitiesStorageNetwork< 1 >( vertexEdgeSuperentities.getValues( 1 ) ); vertices[ 1 ].template setNumberOfSuperentities< 1 >( 2 ); vertices[ 1 ].template setSuperentityIndex< 1 >( 0, 0 ); vertices[ 1 ].template setSuperentityIndex< 1 >( 1, 2 ); vertices[ 2 ].template bindSuperentitiesStorageNetwork< 1 >( vertexEdgeSuperentities.getValues( 2 ) ); vertices[ 2 ].template setNumberOfSuperentities< 1 >( 2 ); vertices[ 2 ].template setSuperentityIndex< 1 >( 0, 0 ); vertices[ 2 ].template setSuperentityIndex< 1 >( 1, 1 ); StorageNetwork< TestTriangleMeshConfig, MeshVertexTopology, 2 > vertexCellSuperentities; vertexCellSuperentities.setKeysRange( 3 ); vertexCellSuperentities.allocate( 1 ); vertices[ 0 ].template bindSuperentitiesStorageNetwork< 2 >( vertexCellSuperentities.getValues( 0 ) ); vertices[ 0 ].template setNumberOfSuperentities< 2 >( 1 ); vertices[ 0 ].template setSuperentityIndex< 2 >( 0, 0 ); vertices[ 1 ].template bindSuperentitiesStorageNetwork< 2 >( vertexCellSuperentities.getValues( 1 ) ); vertices[ 1 ].template setNumberOfSuperentities< 2 >( 1 ); vertices[ 1 ].template setSuperentityIndex< 2 >( 0, 0 ); vertices[ 2 ].template bindSuperentitiesStorageNetwork< 2 >( vertexCellSuperentities.getValues( 2 ) ); vertices[ 2 ].template setNumberOfSuperentities< 2 >( 1 ); vertices[ 2 ].template setSuperentityIndex< 2 >( 0, 0 ); StorageNetwork< TestTriangleMeshConfig, MeshEdgeTopology, 2 > edgeCellSuperentities; edgeCellSuperentities.setKeysRange( 3 ); edgeCellSuperentities.allocate( 1 ); edges[ 0 ].template bindSuperentitiesStorageNetwork< 2 >( edgeCellSuperentities.getValues( 0 ) ); edges[ 0 ].template setNumberOfSuperentities< 2 >( 1 ); edges[ 0 ].template setSuperentityIndex< 2 >( 0, 0 ); edges[ 1 ].template bindSuperentitiesStorageNetwork< 2 >( edgeCellSuperentities.getValues( 1 ) ); edges[ 1 ].template setNumberOfSuperentities< 2 >( 1 ); edges[ 1 ].template setSuperentityIndex< 2 >( 0, 0 ); edges[ 2 ].template bindSuperentitiesStorageNetwork< 2 >( edgeCellSuperentities.getValues( 2 ) ); edges[ 2 ].template setNumberOfSuperentities< 2 >( 1 ); edges[ 2 ].template setSuperentityIndex< 2 >( 0, 0 ); /* * Tests for MeshEntity::operator== */ EXPECT_EQ( vertices[ 0 ], vertices[ 0 ] ); EXPECT_NE( vertices[ 0 ], vertices[ 1 ] ); vertices[ 0 ].setPoint( point1 ); vertices[ 0 ].template setSuperentityIndex< 1 >( 0, 0 ); vertices[ 0 ].template setSuperentityIndex< 1 >( 1, 2 ); EXPECT_EQ( vertices[ 0 ], vertices[ 1 ] ); vertices[ 0 ].template setSuperentityIndex< 2 >( 0, 1 ); EXPECT_NE( vertices[ 0 ], vertices[ 1 ] ); vertices[ 1 ].template setSuperentityIndex< 2 >( 0, 1 ); EXPECT_EQ( vertices[ 0 ], vertices[ 1 ] ); EXPECT_EQ( edges[ 0 ], edges[ 0 ] ); EXPECT_NE( edges[ 0 ], edges[ 1 ] ); edges[ 0 ].template setSubentityIndex< 0 >( 0, 2 ); edges[ 0 ].template setSubentityIndex< 0 >( 1, 0 ); EXPECT_EQ( edges[ 0 ], edges[ 1 ] ); edges[ 0 ].template setSuperentityIndex< 2 >( 0, 1 ); EXPECT_NE( edges[ 0 ], edges[ 1 ] ); edges[ 1 ].template setSuperentityIndex< 2 >( 0, 1 ); EXPECT_EQ( edges[ 0 ], edges[ 1 ] ); } #endif