Sierra Toolkit Version of the Day
UnitTestHexFixture.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 #include <stdexcept>
00009 #include <stk_util/unit_test_support/stk_utest_macros.hpp>
00010 #include <stk_mesh/fixtures/HexFixture.hpp>
00011 
00012 #include <stk_mesh/fem/SkinMesh.hpp>
00013 
00014 namespace {
00015 
00016   STKUNIT_UNIT_TEST( UnitTestHexFixture, elem_ids_1d_x )
00017   {
00018     const unsigned NX = 3;
00019     const unsigned NY = 1;
00020     const unsigned NZ = 1;
00021     stk::mesh::fixtures::HexFixture hf(MPI_COMM_WORLD,NX,NY,NZ);
00022     hf.meta_data.commit();
00023     hf.generate_mesh();
00024     STKUNIT_EXPECT_TRUE( hf.elem_id(0,0,0) == 1 );
00025     STKUNIT_EXPECT_TRUE( hf.elem_id(1,0,0) == 2 );
00026     STKUNIT_EXPECT_TRUE( hf.elem_id(2,0,0) == 3 );
00027   }
00028   STKUNIT_UNIT_TEST( UnitTestHexFixture, elem_ids_3d_x )
00029   {
00030     const unsigned NX = 3;
00031     const unsigned NY = 3;
00032     const unsigned NZ = 3;
00033     stk::mesh::fixtures::HexFixture hf(MPI_COMM_WORLD,NX,NY,NZ);
00034     hf.meta_data.commit();
00035     hf.generate_mesh();
00036     STKUNIT_EXPECT_TRUE( hf.elem_id(0,0,0) == 1 );
00037     STKUNIT_EXPECT_TRUE( hf.elem_id(1,0,0) == 2 );
00038     STKUNIT_EXPECT_TRUE( hf.elem_id(2,0,0) == 3 );
00039   }
00040   STKUNIT_UNIT_TEST( UnitTestHexFixture, elem_ids_1d_y )
00041   {
00042     const unsigned NX = 1;
00043     const unsigned NY = 3;
00044     const unsigned NZ = 1;
00045     stk::mesh::fixtures::HexFixture hf(MPI_COMM_WORLD,NX,NY,NZ);
00046     hf.meta_data.commit();
00047     hf.generate_mesh();
00048     STKUNIT_EXPECT_TRUE( hf.elem_id(0,0,0) == 1 );
00049     STKUNIT_EXPECT_TRUE( hf.elem_id(0,1,0) == 2 );
00050     STKUNIT_EXPECT_TRUE( hf.elem_id(0,2,0) == 3 );
00051   }
00052   STKUNIT_UNIT_TEST( UnitTestHexFixture, elem_ids_3d_y )
00053   {
00054     const unsigned NX = 3;
00055     const unsigned NY = 3;
00056     const unsigned NZ = 3;
00057     stk::mesh::fixtures::HexFixture hf(MPI_COMM_WORLD,NX,NY,NZ);
00058     hf.meta_data.commit();
00059     hf.generate_mesh();
00060     STKUNIT_EXPECT_TRUE( hf.elem_id(0,0,0) == 1 );
00061     STKUNIT_EXPECT_TRUE( hf.elem_id(0,1,0) == 4 );
00062     STKUNIT_EXPECT_TRUE( hf.elem_id(0,2,0) == 7 );
00063   }
00064   STKUNIT_UNIT_TEST( UnitTestHexFixture, elem_ids_1d_z )
00065   {
00066     const unsigned NX = 1;
00067     const unsigned NY = 1;
00068     const unsigned NZ = 3;
00069     stk::mesh::fixtures::HexFixture hf(MPI_COMM_WORLD,NX,NY,NZ);
00070     hf.meta_data.commit();
00071     hf.generate_mesh();
00072     STKUNIT_EXPECT_TRUE( hf.elem_id(0,0,0) == 1 );
00073     STKUNIT_EXPECT_TRUE( hf.elem_id(0,0,1) == 2 );
00074     STKUNIT_EXPECT_TRUE( hf.elem_id(0,0,2) == 3 );
00075   }
00076   STKUNIT_UNIT_TEST( UnitTestHexFixture, elem_ids_3d_z )
00077   {
00078     const unsigned NX = 3;
00079     const unsigned NY = 3;
00080     const unsigned NZ = 3;
00081     stk::mesh::fixtures::HexFixture hf(MPI_COMM_WORLD,NX,NY,NZ);
00082     hf.meta_data.commit();
00083     hf.generate_mesh();
00084     STKUNIT_EXPECT_TRUE( hf.elem_id(0,0,0) == 1 );
00085     STKUNIT_EXPECT_TRUE( hf.elem_id(0,0,1) == 10 );
00086     STKUNIT_EXPECT_TRUE( hf.elem_id(0,0,2) == 19 );
00087   }
00088   STKUNIT_UNIT_TEST( UnitTestHexFixture, elem_ids_3d_diag )
00089   {
00090     const unsigned NX = 3;
00091     const unsigned NY = 3;
00092     const unsigned NZ = 3;
00093     stk::mesh::fixtures::HexFixture hf(MPI_COMM_WORLD,NX,NY,NZ);
00094     hf.meta_data.commit();
00095     hf.generate_mesh();
00096     STKUNIT_EXPECT_TRUE( hf.elem_id(0,0,0) == 1 );
00097     STKUNIT_EXPECT_TRUE( hf.elem_id(1,1,1) == 14 );
00098     STKUNIT_EXPECT_TRUE( hf.elem_id(2,2,2) == 27 );
00099   }
00100   STKUNIT_UNIT_TEST( UnitTestHexFixture, trivial_parallel_2 )
00101   {
00102     const unsigned NX = 2;
00103     const unsigned NY = 1;
00104     const unsigned NZ = 1;
00105     // map< processor, vector of element ids >
00106     std::map<unsigned,std::vector<stk::mesh::EntityId> > parallel_distribution;
00107     {
00108       std::vector< stk::mesh::EntityId> element_ids;
00109       element_ids.push_back(1);
00110       parallel_distribution[0] = element_ids;
00111       element_ids[0] = 2;
00112       parallel_distribution[1] = element_ids;
00113     }
00114     const unsigned p_rank = stk::parallel_machine_rank(MPI_COMM_WORLD);
00115     const unsigned p_size = stk::parallel_machine_size(MPI_COMM_WORLD);
00116     if (2 <= p_size) {
00117       stk::mesh::fixtures::HexFixture hf(MPI_COMM_WORLD,NX,NY,NZ);
00118       hf.meta_data.commit();
00119       if (p_rank <= 1) {
00120         hf.generate_mesh(parallel_distribution[p_rank]);
00121       }
00122       else {
00123         std::vector<stk::mesh::EntityId> empty_vector;
00124         hf.generate_mesh( empty_vector ) ;
00125       }
00126       stk::mesh::BulkData & mesh = hf.bulk_data;
00127       stk::mesh::TopologicalMetaData & top = hf.top_data;
00128       // Verify element_id 1 is owned by proc 0
00129       // Verify element_id 2 is owned by proc 1
00130       stk::mesh::Entity * entity_1 = mesh.get_entity(top.element_rank,1);
00131       stk::mesh::Entity * entity_2 = mesh.get_entity(top.element_rank,2);
00132       if (p_rank <= 1) {
00133         STKUNIT_ASSERT_TRUE( entity_1 != NULL );
00134         STKUNIT_ASSERT_TRUE( entity_2 != NULL );
00135         STKUNIT_EXPECT_TRUE( 0 == entity_1->owner_rank() );
00136         STKUNIT_EXPECT_TRUE( 1 == entity_2->owner_rank() );
00137       }
00138       else {
00139         STKUNIT_EXPECT_TRUE( entity_1 == NULL );
00140         STKUNIT_EXPECT_TRUE( entity_2 == NULL );
00141       }
00142     }
00143   }
00144   STKUNIT_UNIT_TEST( UnitTestHexFixture, disjoint_parallel_psizex1x1 )
00145   {
00146     // layout: p_size x 1 x 1 hex mesh
00147     // elements:
00148     // [ e_1, e_2, e_3, ..., e_n ]
00149     // processors:
00150     // [ p_0, p_1, p_2, ..., p_{n-1} ]
00151     //
00152     const unsigned p_rank = stk::parallel_machine_rank(MPI_COMM_WORLD);
00153     const unsigned p_size = stk::parallel_machine_size(MPI_COMM_WORLD);
00154     if (p_size == 4) {
00155       const unsigned NX = 4;
00156       //const unsigned NX = p_size;
00157       const unsigned NY = 1;
00158       const unsigned NZ = 1;
00159       // map< processor, vector of element ids >
00160       std::map<unsigned,std::vector<stk::mesh::EntityId> > parallel_distribution;
00161       for (unsigned p=0 ; p < p_size ; ++p) {
00162         std::vector< stk::mesh::EntityId> element_ids;
00163         element_ids.push_back(p+1); // element id's start at 1
00164         parallel_distribution[p] = element_ids;
00165       }
00166       stk::mesh::fixtures::HexFixture hf(MPI_COMM_WORLD,NX,NY,NZ);
00167       hf.meta_data.commit();
00168       hf.generate_mesh(parallel_distribution[p_rank]);
00169       stk::mesh::BulkData & mesh = hf.bulk_data;
00170       stk::mesh::TopologicalMetaData & top = hf.top_data;
00171       if (p_rank == 0) {
00172         stk::mesh::Entity * entity_1 = mesh.get_entity(top.element_rank,1);
00173         stk::mesh::Entity * entity_2 = mesh.get_entity(top.element_rank,2);
00174         STKUNIT_ASSERT_TRUE( entity_1 != NULL );
00175         STKUNIT_ASSERT_TRUE( entity_2 != NULL );
00176         STKUNIT_EXPECT_TRUE( 0 == entity_1->owner_rank() );
00177         STKUNIT_EXPECT_TRUE( 1 == entity_2->owner_rank() );
00178       }
00179       else if (p_rank < p_size-1) {
00180         stk::mesh::Entity * entity_im1 = mesh.get_entity(top.element_rank,1+p_rank-1);
00181         stk::mesh::Entity * entity_i = mesh.get_entity(top.element_rank,1+p_rank);
00182         stk::mesh::Entity * entity_ip1 = mesh.get_entity(top.element_rank,1+p_rank+1);
00183         STKUNIT_ASSERT_TRUE( entity_im1 != NULL );
00184         STKUNIT_ASSERT_TRUE( entity_i != NULL );
00185         STKUNIT_ASSERT_TRUE( entity_ip1 != NULL );
00186         STKUNIT_EXPECT_TRUE( p_rank-1 == entity_im1->owner_rank() );
00187         STKUNIT_EXPECT_TRUE( p_rank   == entity_i->owner_rank() );
00188         STKUNIT_EXPECT_TRUE( p_rank+1 == entity_ip1->owner_rank() );
00189       }
00190       else if (p_rank == p_size-1) {
00191         stk::mesh::Entity * entity_im1 = mesh.get_entity(top.element_rank,1+p_rank-1);
00192         stk::mesh::Entity * entity_i = mesh.get_entity(top.element_rank,1+p_rank);
00193         STKUNIT_ASSERT_TRUE( entity_im1 != NULL );
00194         STKUNIT_ASSERT_TRUE( entity_i != NULL );
00195         STKUNIT_EXPECT_TRUE( (p_rank-1) == entity_im1->owner_rank() );
00196         STKUNIT_EXPECT_TRUE( p_rank == entity_i->owner_rank() );
00197       }
00198       else { // invalid
00199         STKUNIT_ASSERT_TRUE(false);
00200       }
00201     }
00202   }
00203   STKUNIT_UNIT_TEST( UnitTestHexFixture, disjoint_parallel_4x2x1 )
00204   {
00205     // layout: 4x2x1 hex mesh
00206     // elements:
00207     // [ e_1, e_2, e_3, e_4 ]
00208     // [ e_5, e_6, e_7, e_8 ]
00209     // processors:
00210     // [ p_0, p_1, p_1, p_1 ]
00211     // [ p_1, p_0, p_1, p_1 ]
00212     //
00213     const unsigned NX = 4;
00214     const unsigned NY = 2;
00215     const unsigned NZ = 1;
00216     // map< processor, vector of element ids >
00217     std::map<unsigned,std::vector<stk::mesh::EntityId> > parallel_distribution;
00218     {
00219       std::vector< stk::mesh::EntityId> element_ids;
00220       element_ids.push_back(1);
00221       element_ids.push_back(6);
00222       parallel_distribution[0] = element_ids; // proc 0
00223       element_ids.clear();
00224       element_ids.push_back(2);
00225       element_ids.push_back(3);
00226       element_ids.push_back(4);
00227       element_ids.push_back(5);
00228       element_ids.push_back(7);
00229       element_ids.push_back(8);
00230       parallel_distribution[1] = element_ids; // proc 1
00231     }
00232     const unsigned p_rank = stk::parallel_machine_rank(MPI_COMM_WORLD);
00233     const unsigned p_size = stk::parallel_machine_size(MPI_COMM_WORLD);
00234     if (2 <= p_size) {
00235       stk::mesh::fixtures::HexFixture hf(MPI_COMM_WORLD,NX,NY,NZ);
00236 
00237       hf.meta_data.commit();
00238       if (p_rank <= 1) {
00239         hf.generate_mesh(parallel_distribution[p_rank]);
00240       }
00241       else {
00242         std::vector<stk::mesh::EntityId> empty_vector;
00243         hf.generate_mesh( empty_vector ) ;
00244       }
00245 
00246       stk::mesh::BulkData & mesh = hf.bulk_data;
00247       stk::mesh::TopologicalMetaData & top = hf.top_data;
00248       // Verify element_id 1 is owned by proc 0
00249       // Verify element_id 2 is owned by proc 1
00250       stk::mesh::Entity * entity_1 = mesh.get_entity(top.element_rank,1);
00251       stk::mesh::Entity * entity_2 = mesh.get_entity(top.element_rank,2);
00252       stk::mesh::Entity * entity_3 = mesh.get_entity(top.element_rank,3);
00253       stk::mesh::Entity * entity_4 = mesh.get_entity(top.element_rank,4);
00254       stk::mesh::Entity * entity_5 = mesh.get_entity(top.element_rank,5);
00255       stk::mesh::Entity * entity_6 = mesh.get_entity(top.element_rank,6);
00256       stk::mesh::Entity * entity_7 = mesh.get_entity(top.element_rank,7);
00257       stk::mesh::Entity * entity_8 = mesh.get_entity(top.element_rank,8);
00258       if (p_rank == 0) {
00259         STKUNIT_ASSERT_TRUE( entity_1 != NULL );
00260         STKUNIT_ASSERT_TRUE( entity_2 != NULL );
00261         STKUNIT_ASSERT_TRUE( entity_3 != NULL );
00262         STKUNIT_ASSERT_TRUE( entity_4 == NULL );
00263         STKUNIT_ASSERT_TRUE( entity_5 != NULL );
00264         STKUNIT_ASSERT_TRUE( entity_6 != NULL );
00265         STKUNIT_ASSERT_TRUE( entity_7 != NULL );
00266         STKUNIT_ASSERT_TRUE( entity_8 == NULL );
00267         STKUNIT_EXPECT_TRUE( 0 == entity_1->owner_rank() );
00268         STKUNIT_EXPECT_TRUE( 1 == entity_2->owner_rank() );
00269         STKUNIT_EXPECT_TRUE( 1 == entity_3->owner_rank() );
00270         //STKUNIT_EXPECT_TRUE( 1 == entity_4->owner_rank() );
00271         STKUNIT_EXPECT_TRUE( 1 == entity_5->owner_rank() );
00272         STKUNIT_EXPECT_TRUE( 0 == entity_6->owner_rank() );
00273         STKUNIT_EXPECT_TRUE( 1 == entity_7->owner_rank() );
00274         //STKUNIT_EXPECT_TRUE( 1 == entity_8->owner_rank() );
00275       }
00276       else if (p_rank == 1) {
00277         STKUNIT_ASSERT_TRUE( entity_1 != NULL );
00278         STKUNIT_ASSERT_TRUE( entity_2 != NULL );
00279         STKUNIT_ASSERT_TRUE( entity_3 != NULL );
00280         STKUNIT_ASSERT_TRUE( entity_4 != NULL );
00281         STKUNIT_ASSERT_TRUE( entity_5 != NULL );
00282         STKUNIT_ASSERT_TRUE( entity_6 != NULL );
00283         STKUNIT_ASSERT_TRUE( entity_7 != NULL );
00284         STKUNIT_ASSERT_TRUE( entity_8 != NULL );
00285         STKUNIT_EXPECT_TRUE( 0 == entity_1->owner_rank() );
00286         STKUNIT_EXPECT_TRUE( 1 == entity_2->owner_rank() );
00287         STKUNIT_EXPECT_TRUE( 1 == entity_3->owner_rank() );
00288         STKUNIT_EXPECT_TRUE( 1 == entity_4->owner_rank() );
00289         STKUNIT_EXPECT_TRUE( 1 == entity_5->owner_rank() );
00290         STKUNIT_EXPECT_TRUE( 0 == entity_6->owner_rank() );
00291         STKUNIT_EXPECT_TRUE( 1 == entity_7->owner_rank() );
00292         STKUNIT_EXPECT_TRUE( 1 == entity_8->owner_rank() );
00293       }
00294       else {
00295         STKUNIT_EXPECT_TRUE( entity_1 == NULL );
00296         STKUNIT_EXPECT_TRUE( entity_2 == NULL );
00297         STKUNIT_EXPECT_TRUE( entity_3 == NULL );
00298         STKUNIT_EXPECT_TRUE( entity_4 == NULL );
00299         STKUNIT_EXPECT_TRUE( entity_5 == NULL );
00300         STKUNIT_EXPECT_TRUE( entity_6 == NULL );
00301         STKUNIT_EXPECT_TRUE( entity_7 == NULL );
00302         STKUNIT_EXPECT_TRUE( entity_8 == NULL );
00303       }
00304     }
00305   }
00306   STKUNIT_UNIT_TEST( UnitTestHexFixture, disjoint_parallel_5x1x1 )
00307   {
00308     // layout:
00309     // [ e_1, e_2, e_3, e_4, e_5 ] elements
00310     // [ p_0, p_1, p_1, p_1, p_0 ] processors
00311     //
00312     const unsigned NX = 5;
00313     const unsigned NY = 1;
00314     const unsigned NZ = 1;
00315     // map< processor, vector of element ids >
00316     std::map<unsigned,std::vector<stk::mesh::EntityId> > parallel_distribution;
00317     {
00318       std::vector< stk::mesh::EntityId> element_ids;
00319       element_ids.push_back(1);
00320       element_ids.push_back(5);
00321       parallel_distribution[0] = element_ids;
00322       element_ids.clear();
00323       element_ids.push_back(2);
00324       element_ids.push_back(3);
00325       element_ids.push_back(4);
00326       parallel_distribution[1] = element_ids;
00327     }
00328     const unsigned p_rank = stk::parallel_machine_rank(MPI_COMM_WORLD);
00329     const unsigned p_size = stk::parallel_machine_size(MPI_COMM_WORLD);
00330     if (2 <= p_size) {
00331       stk::mesh::fixtures::HexFixture hf(MPI_COMM_WORLD,NX,NY,NZ);
00332 
00333       hf.meta_data.commit();
00334       if (p_rank <= 1) {
00335         hf.generate_mesh(parallel_distribution[p_rank]);
00336       }
00337       else {
00338         std::vector<stk::mesh::EntityId> empty_vector;
00339         hf.generate_mesh( empty_vector ) ;
00340       }
00341 
00342       stk::mesh::BulkData & mesh = hf.bulk_data;
00343       stk::mesh::TopologicalMetaData & top = hf.top_data;
00344       // Verify element_id 1 is owned by proc 0
00345       // Verify element_id 2 is owned by proc 1
00346       stk::mesh::Entity * entity_1 = mesh.get_entity(top.element_rank,1);
00347       stk::mesh::Entity * entity_2 = mesh.get_entity(top.element_rank,2);
00348       stk::mesh::Entity * entity_3 = mesh.get_entity(top.element_rank,3);
00349       stk::mesh::Entity * entity_4 = mesh.get_entity(top.element_rank,4);
00350       stk::mesh::Entity * entity_5 = mesh.get_entity(top.element_rank,5);
00351       if (p_rank == 0) {
00352         STKUNIT_ASSERT_TRUE( entity_1 != NULL );
00353         STKUNIT_ASSERT_TRUE( entity_2 != NULL );
00354         STKUNIT_ASSERT_TRUE( entity_3 == NULL );
00355         STKUNIT_ASSERT_TRUE( entity_4 != NULL );
00356         STKUNIT_ASSERT_TRUE( entity_5 != NULL );
00357         STKUNIT_EXPECT_TRUE( 0 == entity_1->owner_rank() );
00358         STKUNIT_EXPECT_TRUE( 1 == entity_2->owner_rank() );
00359         STKUNIT_EXPECT_TRUE( 1 == entity_4->owner_rank() );
00360         STKUNIT_EXPECT_TRUE( 0 == entity_5->owner_rank() );
00361       }
00362       else if (p_rank == 1) {
00363         STKUNIT_ASSERT_TRUE( entity_1 != NULL );
00364         STKUNIT_ASSERT_TRUE( entity_2 != NULL );
00365         STKUNIT_ASSERT_TRUE( entity_3 != NULL );
00366         STKUNIT_ASSERT_TRUE( entity_4 != NULL );
00367         STKUNIT_ASSERT_TRUE( entity_5 != NULL );
00368         STKUNIT_EXPECT_TRUE( 0 == entity_1->owner_rank() );
00369         STKUNIT_EXPECT_TRUE( 1 == entity_2->owner_rank() );
00370         STKUNIT_EXPECT_TRUE( 1 == entity_3->owner_rank() );
00371         STKUNIT_EXPECT_TRUE( 1 == entity_4->owner_rank() );
00372         STKUNIT_EXPECT_TRUE( 0 == entity_5->owner_rank() );
00373       }
00374       else {
00375         STKUNIT_EXPECT_TRUE( entity_1 == NULL );
00376         STKUNIT_EXPECT_TRUE( entity_2 == NULL );
00377         STKUNIT_EXPECT_TRUE( entity_3 == NULL );
00378         STKUNIT_EXPECT_TRUE( entity_4 == NULL );
00379         STKUNIT_EXPECT_TRUE( entity_5 == NULL );
00380       }
00381     }
00382   }
00383   STKUNIT_UNIT_TEST( UnitTestHexFixture, disjoint_parallel_5x1x1_skin )
00384   {
00385   }
00386 
00387 } // end namespace
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends