|
Sierra Toolkit Version of the Day
|
00001 /*------------------------------------------------------------------------*/ 00002 /* Copyright 2010 Sandia Corporation. */ 00003 /* Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive */ 00004 /* license for use of this work by or on behalf of the U.S. Government. */ 00005 /* Export of this program may require a license from the */ 00006 /* United States Government. */ 00007 /*------------------------------------------------------------------------*/ 00008 00009 #include <stk_util/unit_test_support/stk_utest_macros.hpp> 00010 00011 00012 #include <stdexcept> 00013 00014 #include <Shards_BasicTopologies.hpp> 00015 00016 #include <stk_util/parallel/Parallel.hpp> 00017 00018 #include <stk_mesh/fem/TopologicalMetaData.hpp> 00019 00020 00021 namespace { 00022 00023 //---------------------------------------------------------------------------- 00024 //---------------------------------------------------------------------------- 00025 00026 class TestFixture { 00027 public: 00028 typedef stk::mesh::MetaData BaseMetaData ; 00029 typedef stk::mesh::TopologicalMetaData TopoMetaData ; 00030 00031 BaseMetaData baseMetaData ; 00032 TopoMetaData topoMetaData ; 00033 00034 TestFixture( unsigned spatial_dimension ) 00035 : baseMetaData( TopoMetaData::entity_rank_names( spatial_dimension ) ) 00036 , topoMetaData( baseMetaData , spatial_dimension ) 00037 {} 00038 00039 int get_entity_rank( const CellTopologyData * top ) const 00040 { return topoMetaData.get_entity_rank( top ); } 00041 }; 00042 00043 STKUNIT_UNIT_TEST( UnitTestTopologicalMetaData , entity_rank ) 00044 { 00045 TestFixture test1D( 1u ); 00046 TestFixture test2D( 2u ); 00047 TestFixture test3D( 3u ); 00048 00049 STKUNIT_EXPECT_EQUAL( test1D.topoMetaData.spatial_dimension , 1u ); 00050 STKUNIT_EXPECT_EQUAL( test1D.topoMetaData.node_rank , 0u ); 00051 STKUNIT_EXPECT_EQUAL( test1D.topoMetaData.edge_rank , 0u ); 00052 STKUNIT_EXPECT_EQUAL( test1D.topoMetaData.side_rank , 0u ); 00053 STKUNIT_EXPECT_EQUAL( test1D.topoMetaData.element_rank , 1u ); 00054 STKUNIT_EXPECT_EQUAL( test1D.topoMetaData.patch_rank , 2u ); 00055 00056 STKUNIT_EXPECT_EQUAL( test2D.topoMetaData.spatial_dimension , 2u ); 00057 STKUNIT_EXPECT_EQUAL( test2D.topoMetaData.node_rank , 0u ); 00058 STKUNIT_EXPECT_EQUAL( test2D.topoMetaData.edge_rank , 1u ); 00059 STKUNIT_EXPECT_EQUAL( test2D.topoMetaData.side_rank , 1u ); 00060 STKUNIT_EXPECT_EQUAL( test2D.topoMetaData.element_rank , 2u ); 00061 STKUNIT_EXPECT_EQUAL( test2D.topoMetaData.patch_rank , 3u ); 00062 00063 STKUNIT_EXPECT_EQUAL( test3D.topoMetaData.spatial_dimension , 3u ); 00064 STKUNIT_EXPECT_EQUAL( test3D.topoMetaData.node_rank , 0u ); 00065 STKUNIT_EXPECT_EQUAL( test3D.topoMetaData.edge_rank , 1u ); 00066 STKUNIT_EXPECT_EQUAL( test3D.topoMetaData.side_rank , 2u ); 00067 STKUNIT_EXPECT_EQUAL( test3D.topoMetaData.element_rank , 3u ); 00068 STKUNIT_EXPECT_EQUAL( test3D.topoMetaData.patch_rank , 4u ); 00069 } 00070 00071 00072 STKUNIT_UNIT_TEST( UnitTestTopologicalMetaData , cellTopology ) 00073 { 00074 const CellTopologyData * node = shards::getCellTopologyData< shards::Node >(); 00075 00076 const CellTopologyData * line2 = shards::getCellTopologyData< shards::Line<2> >(); 00077 const CellTopologyData * line3 = shards::getCellTopologyData< shards::Line<3> >(); 00078 00079 const CellTopologyData * tri3 = shards::getCellTopologyData< shards::Triangle<3> >(); 00080 const CellTopologyData * tri6 = shards::getCellTopologyData< shards::Triangle<6> >(); 00081 const CellTopologyData * tri4 = shards::getCellTopologyData< shards::Triangle<4> >(); 00082 00083 const CellTopologyData * quad4 = shards::getCellTopologyData< shards::Quadrilateral<4> >(); 00084 const CellTopologyData * quad8 = shards::getCellTopologyData< shards::Quadrilateral<8> >(); 00085 const CellTopologyData * quad9 = shards::getCellTopologyData< shards::Quadrilateral<9> >(); 00086 00087 const CellTopologyData * tet4 = shards::getCellTopologyData< shards::Tetrahedron<4> >(); 00088 const CellTopologyData * tet10 = shards::getCellTopologyData< shards::Tetrahedron<10> >(); 00089 const CellTopologyData * tet8 = shards::getCellTopologyData< shards::Tetrahedron<8> >(); 00090 00091 const CellTopologyData * pyr5 = shards::getCellTopologyData< shards::Pyramid<5> >(); 00092 const CellTopologyData * pyr13 = shards::getCellTopologyData< shards::Pyramid<13> >(); 00093 const CellTopologyData * pyr14 = shards::getCellTopologyData< shards::Pyramid<14> >(); 00094 00095 const CellTopologyData * wedge6 = shards::getCellTopologyData< shards::Wedge<6> >(); 00096 const CellTopologyData * wedge15 = shards::getCellTopologyData< shards::Wedge<15> >(); 00097 const CellTopologyData * wedge18 = shards::getCellTopologyData< shards::Wedge<18> >(); 00098 00099 const CellTopologyData * hex8 = shards::getCellTopologyData< shards::Hexahedron<8> >(); 00100 const CellTopologyData * hex20 = shards::getCellTopologyData< shards::Hexahedron<20> >(); 00101 const CellTopologyData * hex27 = shards::getCellTopologyData< shards::Hexahedron<27> >(); 00102 00103 00104 const CellTopologyData * particle = shards::getCellTopologyData< shards::Particle >(); 00105 00106 const CellTopologyData * beam2 = shards::getCellTopologyData< shards::Beam<2> >(); 00107 const CellTopologyData * beam3 = shards::getCellTopologyData< shards::Beam<3> >(); 00108 00109 const CellTopologyData * shellLine2 = shards::getCellTopologyData< shards::ShellLine<2> >(); 00110 const CellTopologyData * shellLine3 = shards::getCellTopologyData< shards::ShellLine<3> >(); 00111 00112 const CellTopologyData * shellTri3 = shards::getCellTopologyData< shards::ShellTriangle<3> >(); 00113 const CellTopologyData * shellTri6 = shards::getCellTopologyData< shards::ShellTriangle<6> >(); 00114 00115 const CellTopologyData * shellQuad4 = shards::getCellTopologyData< shards::ShellQuadrilateral<4> >(); 00116 const CellTopologyData * shellQuad8 = shards::getCellTopologyData< shards::ShellQuadrilateral<8> >(); 00117 const CellTopologyData * shellQuad9 = shards::getCellTopologyData< shards::ShellQuadrilateral<9> >(); 00118 00119 00120 for ( unsigned spatial_dimension = 1 ; 00121 spatial_dimension < 4 ; ++spatial_dimension ) { 00122 00123 TestFixture test( spatial_dimension ); 00124 00125 STKUNIT_EXPECT_EQUAL( 0 , test.get_entity_rank( node ) ); 00126 STKUNIT_EXPECT_EQUAL( 1 , test.get_entity_rank( line2 ) ); 00127 STKUNIT_EXPECT_EQUAL( 1 , test.get_entity_rank( line3 ) ); 00128 STKUNIT_EXPECT_EQUAL( (int) spatial_dimension , test.get_entity_rank( particle ) ); 00129 if ( 1 < spatial_dimension ) { 00130 STKUNIT_EXPECT_EQUAL( 2 , test.get_entity_rank( tri3 ) ); 00131 STKUNIT_EXPECT_EQUAL( 2 , test.get_entity_rank( tri6 ) ); 00132 STKUNIT_EXPECT_EQUAL( 2 , test.get_entity_rank( tri4 ) ); 00133 STKUNIT_EXPECT_EQUAL( 2 , test.get_entity_rank( quad4 ) ); 00134 STKUNIT_EXPECT_EQUAL( 2 , test.get_entity_rank( quad8 ) ); 00135 STKUNIT_EXPECT_EQUAL( 2 , test.get_entity_rank( quad9 ) ); 00136 00137 STKUNIT_EXPECT_EQUAL( (int) spatial_dimension , test.get_entity_rank( beam2 ) ); 00138 STKUNIT_EXPECT_EQUAL( (int) spatial_dimension , test.get_entity_rank( beam3 ) ); 00139 } 00140 else { 00141 STKUNIT_ASSERT_THROW( test.get_entity_rank( tri3 ) , std::runtime_error ); 00142 STKUNIT_ASSERT_THROW( test.get_entity_rank( tri6 ) , std::runtime_error ); 00143 STKUNIT_ASSERT_THROW( test.get_entity_rank( tri4 ) , std::runtime_error ); 00144 STKUNIT_ASSERT_THROW( test.get_entity_rank( quad4 ) , std::runtime_error ); 00145 STKUNIT_ASSERT_THROW( test.get_entity_rank( quad8 ) , std::runtime_error ); 00146 STKUNIT_ASSERT_THROW( test.get_entity_rank( quad9 ) , std::runtime_error ); 00147 00148 STKUNIT_ASSERT_THROW( test.get_entity_rank( beam2 ) , std::runtime_error ); 00149 STKUNIT_ASSERT_THROW( test.get_entity_rank( beam3 ) , std::runtime_error ); 00150 } 00151 00152 if ( 2 == spatial_dimension ) { 00153 STKUNIT_EXPECT_EQUAL( 2 , test.get_entity_rank( shellLine2 ) ); 00154 STKUNIT_EXPECT_EQUAL( 2 , test.get_entity_rank( shellLine3 ) ); 00155 } 00156 else { 00157 STKUNIT_ASSERT_THROW( test.get_entity_rank( shellLine2 ) , std::runtime_error ); 00158 STKUNIT_ASSERT_THROW( test.get_entity_rank( shellLine3 ) , std::runtime_error ); 00159 } 00160 00161 if ( 2 < spatial_dimension ) { 00162 STKUNIT_EXPECT_EQUAL( 3 , test.get_entity_rank( tet4 ) ); 00163 STKUNIT_EXPECT_EQUAL( 3 , test.get_entity_rank( tet10 ) ); 00164 STKUNIT_EXPECT_EQUAL( 3 , test.get_entity_rank( tet8 ) ); 00165 00166 STKUNIT_EXPECT_EQUAL( 3 , test.get_entity_rank( pyr5 ) ); 00167 STKUNIT_EXPECT_EQUAL( 3 , test.get_entity_rank( pyr13 ) ); 00168 STKUNIT_EXPECT_EQUAL( 3 , test.get_entity_rank( pyr14 ) ); 00169 00170 STKUNIT_EXPECT_EQUAL( 3 , test.get_entity_rank( wedge6 ) ); 00171 STKUNIT_EXPECT_EQUAL( 3 , test.get_entity_rank( wedge15 ) ); 00172 STKUNIT_EXPECT_EQUAL( 3 , test.get_entity_rank( wedge18 ) ); 00173 00174 STKUNIT_EXPECT_EQUAL( 3 , test.get_entity_rank( hex8 ) ); 00175 STKUNIT_EXPECT_EQUAL( 3 , test.get_entity_rank( hex20 ) ); 00176 STKUNIT_EXPECT_EQUAL( 3 , test.get_entity_rank( hex27 ) ); 00177 00178 STKUNIT_EXPECT_EQUAL( 3 , test.get_entity_rank( shellTri3 ) ); 00179 STKUNIT_EXPECT_EQUAL( 3 , test.get_entity_rank( shellTri6 ) ); 00180 00181 STKUNIT_EXPECT_EQUAL( 3 , test.get_entity_rank( shellQuad4 ) ); 00182 STKUNIT_EXPECT_EQUAL( 3 , test.get_entity_rank( shellQuad8 ) ); 00183 STKUNIT_EXPECT_EQUAL( 3 , test.get_entity_rank( shellQuad9 ) ); 00184 } 00185 else { 00186 STKUNIT_ASSERT_THROW( test.get_entity_rank( tet4 ) , std::runtime_error ); 00187 STKUNIT_ASSERT_THROW( test.get_entity_rank( tet10 ) , std::runtime_error ); 00188 STKUNIT_ASSERT_THROW( test.get_entity_rank( tet8 ) , std::runtime_error ); 00189 00190 STKUNIT_ASSERT_THROW( test.get_entity_rank( pyr5 ) , std::runtime_error ); 00191 STKUNIT_ASSERT_THROW( test.get_entity_rank( pyr13 ) , std::runtime_error ); 00192 STKUNIT_ASSERT_THROW( test.get_entity_rank( pyr14 ) , std::runtime_error ); 00193 00194 STKUNIT_ASSERT_THROW( test.get_entity_rank( wedge6 ) , std::runtime_error ); 00195 STKUNIT_ASSERT_THROW( test.get_entity_rank( wedge15 ) , std::runtime_error ); 00196 STKUNIT_ASSERT_THROW( test.get_entity_rank( wedge18 ) , std::runtime_error ); 00197 00198 STKUNIT_ASSERT_THROW( test.get_entity_rank( hex8 ) , std::runtime_error ); 00199 STKUNIT_ASSERT_THROW( test.get_entity_rank( hex20 ) , std::runtime_error ); 00200 STKUNIT_ASSERT_THROW( test.get_entity_rank( hex27 ) , std::runtime_error ); 00201 00202 STKUNIT_ASSERT_THROW( test.get_entity_rank( shellTri3 ) , std::runtime_error ); 00203 STKUNIT_ASSERT_THROW( test.get_entity_rank( shellTri6 ) , std::runtime_error ); 00204 00205 STKUNIT_ASSERT_THROW( test.get_entity_rank( shellQuad4 ) , std::runtime_error ); 00206 STKUNIT_ASSERT_THROW( test.get_entity_rank( shellQuad8 ) , std::runtime_error ); 00207 STKUNIT_ASSERT_THROW( test.get_entity_rank( shellQuad9 ) , std::runtime_error ); 00208 } 00209 } 00210 } 00211 00212 STKUNIT_UNIT_TEST( UnitTestTopologicalMetaData , part_supersets ) 00213 { 00214 static const char method[] = "UnitTestPartCellTopologyMap::part_supersets" ; 00215 const unsigned spatial_dimension = 3 ; 00216 00217 TestFixture test( spatial_dimension ); 00218 00219 const CellTopologyData * const top_hex8 = shards::getCellTopologyData< shards::Hexahedron<8> >(); 00220 const CellTopologyData * const top_tet4 = shards::getCellTopologyData< shards::Tetrahedron<4> >(); 00221 00222 stk::mesh::Part & hex8 = test.topoMetaData.declare_part( top_hex8->name , top_hex8 ); 00223 stk::mesh::Part & tet4 = test.topoMetaData.declare_part( top_tet4->name , top_tet4 ); 00224 00225 stk::mesh::Part & part_hex_1 = test.baseMetaData.declare_part( "block_1" , spatial_dimension ); 00226 stk::mesh::Part & part_hex_2 = test.baseMetaData.declare_part( "block_2" , spatial_dimension ); 00227 stk::mesh::Part & part_hex_3 = test.baseMetaData.declare_part( "block_3" , spatial_dimension ); 00228 stk::mesh::Part & part_tet_1 = test.baseMetaData.declare_part( "block_4" , spatial_dimension ); 00229 stk::mesh::Part & part_tet_2 = test.baseMetaData.declare_part( "block_5" , spatial_dimension ); 00230 00231 test.baseMetaData.declare_part_subset( hex8 , part_hex_1 ); 00232 test.baseMetaData.declare_part_subset( hex8 , part_hex_2 ); 00233 test.baseMetaData.declare_part_subset( hex8 , part_hex_3 ); 00234 00235 test.baseMetaData.declare_part_subset( tet4 , part_tet_1 ); 00236 test.baseMetaData.declare_part_subset( tet4 , part_tet_2 ); 00237 00238 STKUNIT_EXPECT_EQUAL( top_hex8 , stk::mesh::TopologicalMetaData::get_cell_topology( hex8 , method ) ); 00239 STKUNIT_EXPECT_EQUAL( top_hex8 , stk::mesh::TopologicalMetaData::get_cell_topology( part_hex_1 , method ) ); 00240 STKUNIT_EXPECT_EQUAL( top_hex8 , stk::mesh::TopologicalMetaData::get_cell_topology( part_hex_2 , method ) ); 00241 STKUNIT_EXPECT_EQUAL( top_hex8 , stk::mesh::TopologicalMetaData::get_cell_topology( part_hex_3 , method ) ); 00242 00243 STKUNIT_EXPECT_EQUAL( top_tet4 , stk::mesh::TopologicalMetaData::get_cell_topology( tet4 , method ) ); 00244 STKUNIT_EXPECT_EQUAL( top_tet4 , stk::mesh::TopologicalMetaData::get_cell_topology( part_tet_1 , method ) ); 00245 STKUNIT_EXPECT_EQUAL( top_tet4 , stk::mesh::TopologicalMetaData::get_cell_topology( part_tet_2 , method ) ); 00246 00247 } 00248 00249 STKUNIT_UNIT_TEST( UnitTestPartCellTopologyMap , errors ) 00250 { 00251 const unsigned spatial_dimension = 2 ; 00252 00253 TestFixture test( spatial_dimension ); 00254 00255 const CellTopologyData * const top_quad4 = shards::getCellTopologyData< shards::Quadrilateral<4> >(); 00256 const CellTopologyData * const top_tri3 = shards::getCellTopologyData< shards::Triangle<3> >(); 00257 const CellTopologyData * const top_tet4 = shards::getCellTopologyData< shards::Tetrahedron<4> >(); 00258 00259 STKUNIT_ASSERT_THROW( test.topoMetaData.declare_cell_topology( top_quad4 , 0 ) , std::runtime_error ); 00260 STKUNIT_ASSERT_THROW( test.topoMetaData.declare_cell_topology( top_quad4 , 1 ) , std::runtime_error ); 00261 STKUNIT_ASSERT_THROW( test.topoMetaData.declare_cell_topology( top_quad4 , 3 ) , std::runtime_error ); 00262 00263 STKUNIT_ASSERT_THROW( test.topoMetaData.declare_cell_topology( top_tri3 , 3 ) , std::runtime_error ); 00264 STKUNIT_ASSERT_THROW( test.topoMetaData.declare_cell_topology( top_tet4 , 3 ) , std::runtime_error ); 00265 } 00266 00267 //---------------------------------------------------------------------------- 00268 //---------------------------------------------------------------------------- 00269 00270 /* 00271 00272 class FiniteElementMesh { 00273 public: 00274 00275 typedef stk::mesh::MetaData BaseMetaData ; 00276 typedef stk::mesh::TopologicalMetaData TopoMetaData ; 00277 typedef stk::mesh::BulkData BulkData ; 00278 00279 BaseMetaData baseMetaData ; 00280 TopoMetaData topoMetaData ; 00281 BulkData bulkData ; 00282 00283 FiniteElementMesh( unsigned spatial_dimension , 00284 stk::ParallelMachine machine ) 00285 : baseMetaData( TopoMetaData::entity_rank_names( spatial_dimension ) ) 00286 , topoMetaData( metaData , spatial_dimension ) 00287 , bulkData( metaData , machine ) 00288 {} 00289 }; 00290 00291 STKUNIT_UNIT_TEST( UnitTestPartCellTopologyMap , bucket ) 00292 { 00293 stk::ParallelMachine machine = MPI_COMM_WORLD ; 00294 00295 const CellTopologyData * const top_tet4 = 00296 shards::getCellTopologyData< shards::Tetrahedron<4> >(); 00297 00298 const unsigned spatial_dimension = 3 ; 00299 00300 FiniteElementMesh mesh( spatial_dimension , machine ); 00301 00302 stk::mesh::Part & block = 00303 mesh.topoMetaData.declare_part< shards::Tetrahedron<4> >( "block_1" ); 00304 00305 mesh.baseMetaData.commit(); 00306 00307 mesh.bulkData.modification_begin(); 00308 00309 stk::mesh::Entity * element = NULL ; 00310 00311 if ( mesh.bulkData.parallel_rank() == 0 ) { 00312 int node_ids[4] = { 1 , 2 , 3 , 4 }; 00313 00314 element = & declare_element( mesh.bulkData , block , 1 , node_ids ); 00315 } 00316 00317 mesh.bulkData.modification_end(); 00318 00319 if ( element ) { 00320 STKUNIT_EXPECT_EQUAL( top_tet4 , stk::mesh::get_cell_topology( *element ) ); 00321 } 00322 } 00323 00324 */ 00325 00326 //---------------------------------------------------------------------------- 00327 //---------------------------------------------------------------------------- 00328 00329 } // namespace 00330