Commit fe39a59b authored by Jakub Klinkovský's avatar Jakub Klinkovský
Browse files

Added missing operators and a test for comparing MeshEntity instances

parent 8083b7a0
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -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
@@ -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 >::
+11 −1
Original line number Diff line number Diff line
@@ -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
+4 −0
Original line number Diff line number Diff line
@@ -70,6 +70,8 @@ class MeshEntity

      bool operator==( const MeshEntity& entity ) const;

      bool operator!=( const MeshEntity& entity ) const;
 
      constexpr int getEntityDimension() const;

      /****
@@ -166,6 +168,8 @@ class MeshEntity< MeshConfig, MeshVertexTopology >

      bool operator==( const MeshEntity& entity ) const;

      bool operator!=( const MeshEntity& entity ) const;
 
      constexpr int getEntityDimension() const;

      /****
+121 −0
Original line number Diff line number Diff line
@@ -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