|
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 #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