Sierra Toolkit Version of the Day
UnitTestFemImpl.cpp
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 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends