13 #if !defined( _MSC_VER ) && !defined( __MINGW32__ )
17 #define STRINGIFY_( X ) #X
18 #define STRINGIFY( X ) STRINGIFY_( X )
19 const char*
const FILENAME =
"iMeshP_test_file";
30 std::cerr << "Error code " << ierr << " at " << __FILE__ << ":" << __LINE__ << std::endl; \
38 ierr = is_any_proc_error( ierr ); \
46 if( is_any_proc_error( !( A ) ) ) \
49 MPI_Comm_rank( MPI_COMM_WORLD, &my_rank ); \
51 std::cerr << "Failed assertion: " #A << std::endl << " at " __FILE__ ":" << __LINE__ << std::endl; \
60 int err = MPI_Allreduce( &is_my_error, &result, 1, MPI_INT, MPI_MAX,
MPI_COMM_WORLD );
309 std::vector< iMeshP_PartHandle >& handles,
310 std::vector< iMeshP_Part >* ids = 0 )
315 handles.resize(
size );
316 std::copy( arr, arr +
size, handles.begin() );
324 assert(
size == (
int)ids->size() );
325 assert( ptr == &( *ids )[0] );
333 std::vector< iBase_EntityHandle >&
entities )
336 int junk = 0,
size = 0, err;
350 std::vector< iBase_EntityHandle >& elems,
351 std::vector< iBase_EntityHandle >& verts )
355 verts.resize( 4 * elems.size() );
356 std::vector< int > junk( elems.size() + 1 );
357 int junk1 = verts.size(), count, junk2 = junk.size(), junk3;
359 int* junk5 = &junk[0];
360 iMesh_getEntArrAdj( imesh, &elems[0], elems.size(),
iBase_VERTEX, &junk4, &junk1, &count, &junk5, &junk2, &junk3,
362 assert( junk1 == (
int)verts.size() );
363 assert( count == (
int)( 4 * elems.size() ) );
364 assert( junk2 == (
int)junk.size() );
365 assert( junk4 == &verts[0] );
366 assert( junk5 == &junk[0] );
367 std::sort( verts.begin(), verts.end() );
368 verts.erase( std::unique( verts.begin(), verts.end() ), verts.end() );
374 double* junk1 = coords;
375 int junk2 = 3 * num_verts;
380 assert( junk1 == coords );
381 assert( junk2 == 3 * num_verts );
382 assert( junk3 == 3 * num_verts );
390 #define RUN_TEST( A ) run_test( &( A ), #A )
407 #ifdef MOAB_HAVE_HDF5
417 std::cerr <<
"Failed to create input test file on root processor. Aborting." << std::endl;
427 std::cerr <<
"Failed to load input mesh." << std::endl
428 <<
"Cannot run further tests." << std::endl
429 <<
"ABORTING" << std::endl;
442 std::cerr <<
"Failed to create mesh. Aborting." << std::endl;
448 int result = ( *func )( imesh, prtn, map );
453 std::cout << func_name <<
" : FAILED!!" << std::endl;
455 std::cout << func_name <<
" : success" << std::endl;
462 int main(
int argc,
char* argv[] )
464 MPI_Init( &argc, &argv );
469 if( argc > 2 && !strcmp( argv[1],
"-p" ) )
471 #if !defined( _MSC_VER ) && !defined( __MINGW32__ )
472 std::cout <<
"Processor " <<
rank <<
" of " <<
size <<
" with PID " << getpid() << std::endl;
478 if( atoi( argv[2] ) ==
rank )
480 volatile int pause = 1;
512 #ifdef MOAB_HAVE_HDF5
520 std::cout <<
"All tests passed" << std::endl;
522 std::cout << num_errors <<
" TESTS FAILED!" << std::endl;
563 template <
int size >
578 const char*
tagname =
"GLOBAL_ID";
584 const int num_full_cols = 2 * ( num_parts / 2 );
585 const int need_half_cols = num_parts % 2;
586 const int num_cols = num_full_cols + 2 * need_half_cols;
587 const int num_vtx = 5 + 5 * num_cols - 4 * ( num_parts % 2 );
588 std::vector< EHARR< 5 > > vertices( num_cols + 1 );
589 std::vector< EHARR< 4 > > elements( num_cols );
590 std::vector< int > vertex_ids( num_vtx );
591 std::vector< iBase_EntityHandle > vertex_list( num_vtx );
592 for(
int i = 0; i < num_vtx; ++i )
593 vertex_ids[i] = i + 1;
597 for(
int i = 0; i <= num_cols; ++i )
599 double coords[15] = {
static_cast< double >( i ), 0, 0,
static_cast< double >( i ), 1, 0,
600 static_cast< double >( i ), 2, 0,
static_cast< double >( i ), 3, 0,
601 static_cast< double >( i ), 4, 0 };
603 const int n = ( num_full_cols == num_cols || i <= num_full_cols ) ? 5 : 3;
604 int junk1 = n, junk2 = n;
606 assert( ptr == vertices[i] );
607 assert( junk1 == n );
608 assert( junk2 == n );
609 for(
int j = 0; j < n; ++j )
610 vertex_list[vl_pos++] = vertices[i][j];
614 for(
int i = 0; i < num_cols; ++i )
617 for(
int j = 0; j < 4; ++j )
619 conn[4 * j] = vertices[i][j];
620 conn[4 * j + 1] = vertices[i][j + 1];
621 conn[4 * j + 2] = vertices[i + 1][j + 1];
622 conn[4 * j + 3] = vertices[i + 1][j];
625 const int n = ( i < num_full_cols ) ? 4 : 2;
626 int junk1 = n, junk2 = n, junk3 = n, junk4 = n;
629 iMesh_createEntArr( imesh,
iMesh_QUADRILATERAL, conn, 4 * n, &ptr, &junk1, &junk2, &ptr2, &junk3, &junk4,
631 assert( ptr == elements[i] );
632 assert( junk1 == n );
633 assert( junk2 == n );
634 assert( ptr2 == stat );
635 assert( junk3 == n );
636 assert( junk4 == n );
642 for(
int i = 0; i < num_parts; ++i )
647 elements[2 * ( i / 2 ) + 1][2 * ( i % 2 )],
648 elements[2 * ( i / 2 )][2 * ( i % 2 ) + 1],
649 elements[2 * ( i / 2 ) + 1][2 * ( i % 2 ) + 1] };
658 int tag_size, tag_type;
685 const char*
tagname =
"GLOBAL_ID";
688 const int num_cols = 2;
689 const int num_vtx = 9;
691 int bottom =
rank % 2;
693 std::vector< EHARR< 3 > > vertices( 3 );
694 std::vector< EHARR< 2 > > elements( 2 );
695 std::vector< int > vertex_ids( num_vtx );
696 std::vector< iBase_EntityHandle > vertex_list( num_vtx );
697 int start = 1 + 2 * bottom + 10 * (
rank / 2 );
699 for(
int i = 0; i < 3; ++i )
700 for(
int j = 0; j < 3; ++j )
702 vertex_ids[i + 3 * j] = start + i + 5 * j;
707 int startI = 2 * (
rank / 2 );
708 for(
int i = 0; i <= 2; ++i )
711 static_cast< double >( i + startI ), 2. * bottom, 0,
712 static_cast< double >( i + startI ), 1 + 2. * bottom, 0,
713 static_cast< double >( i + startI ), 2 + 2. * bottom, 0,
717 int junk1 = n, junk2 = n;
719 assert( ptr == vertices[i] );
720 assert( junk1 == n );
721 assert( junk2 == n );
722 for(
int j = 0; j < n; ++j )
723 vertex_list[vl_pos++] = vertices[i][j];
727 for(
int i = 0; i < num_cols; ++i )
730 for(
int j = 0; j < 2; ++j )
732 conn[4 * j] = vertices[i][j];
733 conn[4 * j + 1] = vertices[i][j + 1];
734 conn[4 * j + 2] = vertices[i + 1][j + 1];
735 conn[4 * j + 3] = vertices[i + 1][j];
739 int junk1 = n, junk2 = n, junk3 = n, junk4 = n;
742 iMesh_createEntArr( imesh,
iMesh_QUADRILATERAL, conn, 4 * n, &ptr, &junk1, &junk2, &ptr2, &junk3, &junk4,
744 assert( ptr == elements[i] );
745 assert( junk1 == n );
746 assert( junk2 == n );
747 assert( ptr2 == stat );
748 assert( junk3 == n );
749 assert( junk4 == n );
757 iBase_EntityHandle quads[] = { elements[0][0], elements[0][1], elements[1][0], elements[1][1] };
765 int tag_size, tag_type;
793 int xc = (int)round( x );
794 int yc = (int)round( y );
795 tag = 5 * xc + yc + 1;
809 const char* opt =
"moab:PARTITION=PARALLEL_PARTITION";
829 MPI_Comm comm = MPI_COMM_SELF;
836 int alloc = 0,
size = -1;
842 int idx = std::find( array, array +
size, prtn ) - array;
877 std::vector< iMeshP_PartHandle > parts( num_part_l );
879 int junk1 = num_part_l, count = -1;
882 assert( ptr == &parts[0] );
883 assert( junk1 == num_part_l );
884 ASSERT( count == num_part_l );
893 const int expected_global_quad_count = 4 * num_parts;
894 const int num_col = 2 * ( num_parts / 2 + num_parts % 2 );
895 const int expected_global_vtx_count = num_parts == 1 ? 9 : num_parts % 2 ? 1 + 5 * num_col : 5 + 5 * num_col;
906 ASSERT( count == expected_global_vtx_count );
912 ASSERT( count == expected_global_quad_count );
915 std::vector< iBase_EntityHandle > all_quads, half_quads;
917 assert( 0 == all_quads.size() % 2 );
918 half_quads.resize( all_quads.size() / 2 );
919 for(
size_t i = 0; i < all_quads.size() / 2; ++i )
920 half_quads[i] = all_quads[2 * i];
937 ASSERT( count == expected_global_quad_count / 2 );
949 std::vector< iMeshP_PartHandle > parts;
954 std::vector< iBase_EntityHandle > part_quads, part_all;
965 ASSERT( count == (
int)part_quads.size() );
971 ASSERT( count == (
int)part_all.size() );
976 int num_ent, junk1 = 0;
979 std::vector< iBase_EntityHandle > act_quads( ptr, ptr + num_ent );
984 std::vector< iBase_EntityHandle > act_all( ptr, ptr + num_ent );
986 std::sort( part_quads.begin(), part_quads.end() );
987 std::sort( part_all.begin(), part_all.end() );
988 std::sort( act_quads.begin(), act_quads.end() );
989 std::sort( act_all.begin(), act_all.end() );
990 ASSERT( part_quads == act_quads );
991 ASSERT( part_all == act_all );
994 std::vector< iBase_EntityHandle > half_quads( part_quads.size() / 2 );
995 for(
size_t i = 0; i < half_quads.size(); ++i )
996 half_quads[i] = part_quads[2 * i];
1003 std::vector< iBase_EntityHandle > all_quads, other_quads;
1005 std::sort( all_quads.begin(), all_quads.end() );
1006 std::sort( part_quads.begin(), part_quads.end() );
1007 std::set_difference( all_quads.begin(), all_quads.end(), part_quads.begin(), part_quads.end(),
1008 std::back_inserter( other_quads ) );
1017 ASSERT( count == (
int)half_quads.size() );
1032 act_quads.resize( num_ent );
1033 std::copy( ptr, ptr + num_ent, act_quads.begin() );
1035 std::sort( half_quads.begin(), half_quads.end() );
1036 std::sort( act_quads.begin(), act_quads.end() );
1037 ASSERT( act_quads == half_quads );
1091 std::vector< iMeshP_Part > ids;
1095 std::vector< iMeshP_PartHandle > handles( ids.size() );
1097 for( i = 0; i < ids.size(); ++i )
1102 if(
id != ids[i] )
break;
1104 ASSERT( i == ids.size() );
1107 std::vector< iMeshP_Part > ids2( ids.size() );
1108 int junk1 = ids.size(), junk2 = 0;
1112 ASSERT( ptr == &ids2[0] );
1113 ASSERT( junk2 == (
int)ids2.size() );
1117 std::vector< iMeshP_PartHandle > handles2( handles.size() );
1118 junk1 = handles.size();
1123 ASSERT( ptr2 == &handles2[0] );
1124 ASSERT( junk2 == (
int)handles2.size() );
1125 ASSERT( handles == handles2 );
1139 std::vector< iMeshP_Part > invalid, failed;
1150 invalid.push_back( map.
get_parts()[i] );
1152 if( !failed.empty() )
1154 std::cerr <<
"Processor " <<
rank <<
": iMeshP_getRankOfPart failed for " << failed.size() <<
" parts."
1158 if( !invalid.empty() )
1160 std::cerr <<
"Processor " <<
rank <<
": iMeshP_getRankOfPart was incorrect for " << invalid.size() <<
" parts."
1167 std::vector< int > ranks( map.
get_parts().size() );
1168 int junk1 = ranks.size(), junk2, *ptr = &ranks[0];
1171 assert( ptr == &ranks[0] );
1172 assert( junk1 == (
int)ranks.size() );
1173 ASSERT( junk2 == (
int)ranks.size() );
1178 if( !invalid.empty() )
1180 std::cerr <<
"Processor " <<
rank <<
": iMeshP_getRankOfPartArr was incorrect for " << invalid.size()
1181 <<
" parts." << std::endl;
1193 if( logical_part_id + 1 < num_parts )
neighbors[num_neighbors++] = logical_part_id + 1;
1194 if( logical_part_id + 2 < num_parts )
neighbors[num_neighbors++] = logical_part_id + 2;
1195 if( logical_part_id % 2 )
1197 neighbors[num_neighbors++] = logical_part_id - 1;
1198 if( logical_part_id > 2 )
1200 neighbors[num_neighbors++] = logical_part_id - 3;
1201 neighbors[num_neighbors++] = logical_part_id - 2;
1206 if( logical_part_id + 3 < num_parts )
neighbors[num_neighbors++] = logical_part_id + 3;
1207 if( logical_part_id > 1 )
1209 neighbors[num_neighbors++] = logical_part_id - 1;
1210 neighbors[num_neighbors++] = logical_part_id - 2;
1228 std::vector< iMeshP_Part > local_parts;
1232 std::vector< iMeshP_PartHandle > handles( local_parts.size() );
1234 int junk1 = handles.size(), junk2 = 0;
1238 assert( ptr == &handles[0] );
1239 assert( junk2 == (
int)handles.size() );
1242 std::vector< int > logical_ids;
1246 std::vector< std::vector< iMeshP_Part > >
neighbors( logical_ids.size() );
1247 for(
size_t i = 0; i < logical_ids.size(); ++i )
1249 int logical_neighbors[5], num_neighbors;
1252 for(
int j = 0; j < num_neighbors; ++j )
1258 std::vector< iMeshP_Part > invalid, failed;
1259 for(
size_t i = 0; i < local_parts.size(); ++i )
1264 failed.push_back( local_parts[i] );
1266 invalid.push_back( local_parts[i] );
1268 if( !failed.empty() )
1270 std::cerr <<
"Processor " <<
rank <<
": iMeshP_getNumPartNbors failed for " << failed.size() <<
" parts."
1275 if( !invalid.empty() )
1277 std::cerr <<
"Processor " <<
rank <<
": iMeshP_getNumPartNbors was incorrect for " << invalid.size()
1278 <<
" parts." << std::endl;
1285 for(
size_t i = 0; i < local_parts.size(); ++i )
1287 int count, junk = 0, another_count;
1290 assert( count == another_count );
1292 failed.push_back( local_parts[i] );
1295 std::sort( list, list + count );
1296 std::vector< iMeshP_Part > cpy( list, list + count );
1297 if( cpy !=
neighbors[i] ) invalid.push_back( local_parts[i] );
1301 if( !failed.empty() )
1303 std::cerr <<
"Processor " <<
rank <<
": iMeshP_getPartNbors failed for " << failed.size() <<
" parts."
1307 if( !invalid.empty() )
1309 std::cerr <<
"Processor " <<
rank <<
": iMeshP_getPartNbors was incorrect for " << invalid.size() <<
" parts."
1316 std::vector< int > count_vect( handles.size() );
1317 int* count_arr = &count_vect[0];
1318 junk1 = handles.size();
1322 assert( count_arr == &count_vect[0] );
1323 assert( junk2 == (
int)handles.size() );
1324 for(
size_t i = 0; i < local_parts.size(); ++i )
1326 if( count_arr[i] != (
int)
neighbors[i].
size() ) invalid.push_back( local_parts[i] );
1328 if( !invalid.empty() )
1330 std::cerr <<
"Processor " <<
rank <<
": iMeshP_getNumPartNborsArr was incorrect for " << invalid.size()
1331 <<
" parts." << std::endl;
1338 junk1 = handles.size(), junk2 = 0;
1339 int junk3 = 0, nbor_size;
1341 &nbor_arr, &junk3, &nbor_size, &
ierr );
1343 assert( count_arr == &count_vect[0] );
1344 assert( junk2 == (
int)handles.size() );
1345 std::vector< iMeshP_Part > all_nbors( nbor_arr, nbor_arr + nbor_size );
1347 std::vector< iMeshP_Part >::iterator j = all_nbors.begin();
1348 bool bad_length =
false;
1349 for(
size_t i = 0; i < local_parts.size(); ++i )
1351 if( all_nbors.end() - j > count_arr[i] )
1358 invalid.push_back( local_parts[i] );
1362 std::vector< iMeshP_Part >::iterator e = j + count_arr[i];
1364 if( !std::equal( j, e,
neighbors[i].begin() ) ) invalid.push_back( local_parts[i] );
1369 std::cerr <<
"Processor " <<
rank <<
": iMeshP_getPartNborsArr had inconsistent result array lengths."
1373 if( !invalid.empty() )
1375 std::cerr <<
"Processor " <<
rank <<
": iMeshP_getPartNborsArr was incorrect for " << invalid.size()
1376 <<
" parts." << std::endl;
1393 std::vector< iBase_EntityHandle >& vtx_handles )
1407 const double xbase = ( local_id / 2 ) * 2;
1408 const double ybase = ( local_id % 2 ) * 2;
1412 int junk1 = 4, junk2;
1414 assert( ptr == quads );
1415 assert( junk1 == 4 );
1416 assert( junk2 == 4 );
1420 int offsets[5], *off_ptr = offsets, junk3 = 5, junk4;
1423 iMesh_getEntArrAdj( imesh, quads, 4,
iBase_VERTEX, &ptr, &junk1, &junk2, &off_ptr, &junk3, &junk4, &
ierr );
CHKERR;
1424 assert( ptr == conn );
1425 assert( junk1 == 16 );
1426 assert( junk2 == 16 );
1427 assert( off_ptr == offsets );
1428 assert( junk3 == 5 );
1429 assert( junk4 == 5 );
1432 std::sort( conn, conn + 16 );
1433 const int num_vtx = std::unique( conn, conn + 16 ) - conn;
1434 assert( 9 == num_vtx );
1437 std::vector< double > coords( 27 );
1441 for(
int i = 0; i < num_vtx; ++i )
1443 int x = (int)round( coords[3 * i] - xbase );
1444 int y = (int)round( coords[3 * i + 1] - ybase );
1445 if( x < 0 || x > 2 || y < 0 || y > 2 )
1447 std::cerr <<
"Processor " <<
rank <<
": Error at " __FILE__
":" << __LINE__ << std::endl
1448 <<
" Invalid vertex coordinate: (" << coords[3 * i] <<
", " << coords[3 * i + 1] <<
", "
1449 << coords[3 * i + 2] <<
")" << std::endl
1450 <<
" For logical partition " << local_id << std::endl;
1453 verts[x][y] = conn[i];
1456 if( local_logical % 2 )
1458 switch( other_logical - local_logical )
1463 vtx_handles.resize( 1 );
1464 vtx_handles[0] = verts[2][0];
1467 vtx_handles.resize( 3 );
1468 std::copy( verts[2], verts[2] + 3, vtx_handles.begin() );
1471 vtx_handles.resize( 3 );
1472 vtx_handles[0] = verts[0][0];
1473 vtx_handles[1] = verts[1][0];
1474 vtx_handles[2] = verts[2][0];
1477 vtx_handles.resize( 3 );
1478 std::copy( verts[0], verts[0] + 3, vtx_handles.begin() );
1481 vtx_handles.resize( 1 );
1482 vtx_handles[0] = verts[0][0];
1485 vtx_handles.clear();
1491 switch( other_logical - local_logical )
1496 vtx_handles.resize( 3 );
1497 vtx_handles[0] = verts[0][2];
1498 vtx_handles[1] = verts[1][2];
1499 vtx_handles[2] = verts[2][2];
1502 vtx_handles.resize( 3 );
1503 std::copy( verts[2], verts[2] + 3, vtx_handles.begin() );
1506 vtx_handles.resize( 1 );
1507 vtx_handles[0] = verts[2][2];
1510 vtx_handles.resize( 1 );
1511 vtx_handles[0] = verts[0][2];
1514 vtx_handles.resize( 3 );
1515 std::copy( verts[0], verts[0] + 3, vtx_handles.begin() );
1518 vtx_handles.clear();
1538 std::vector< iMeshP_PartHandle > local_handles;
1539 std::vector< iMeshP_Part > local_ids;
1540 std::vector< iMeshP_Part > all_parts = map.
get_parts();
1541 std::map< iMeshP_PartHandle, std::vector< iBase_EntityHandle > > part_bdry;
1546 std::vector< std::pair< iMeshP_Part, iMeshP_Part > > num_failed, num_error, list_failed, list_error,
error;
1547 for(
size_t i = 0; i < local_handles.size(); ++i )
1551 for( std::vector< iMeshP_Part >::iterator j = all_parts.begin(); j != all_parts.end(); ++j )
1554 if( other_id == local_id )
continue;
1556 std::pair< iMeshP_Part, iMeshP_Part > part_pair;
1557 part_pair.first = local_id;
1558 part_pair.second = other_id;
1561 std::vector< iBase_EntityHandle > shared_verts;
1565 error.push_back( part_pair );
1568 std::sort( shared_verts.begin(), shared_verts.end() );
1574 num_error.push_back( part_pair );
1575 else if( count != (
int)shared_verts.size() )
1576 num_failed.push_back( part_pair );
1584 list_error.push_back( part_pair );
1587 std::copy( ptr, ptr + count, std::back_inserter( part_bdry[local_handles[i]] ) );
1588 std::sort( ptr, ptr + count );
1589 if( (
int)shared_verts.size() != count || !std::equal( shared_verts.begin(), shared_verts.end(), ptr ) )
1590 list_failed.push_back( part_pair );
1596 if( !
error.empty() )
1598 std::cerr <<
"Processor " <<
rank <<
": Error at " __FILE__
":" << __LINE__ << std::endl
1599 <<
" Internal error for " <<
error.size() <<
" part pairs." << std::endl;
1602 if( !num_error.empty() )
1604 std::cerr <<
"Processor " <<
rank <<
": Error at " __FILE__
":" << __LINE__ << std::endl
1605 <<
" iMeshP_getNumPartBdryEnts return error for " << num_error.size() <<
" part pairs." << std::endl;
1608 if( !list_error.empty() )
1610 std::cerr <<
"Processor " <<
rank <<
": Error at " __FILE__
":" << __LINE__ << std::endl
1611 <<
" iMeshP_getPartBdryEnts return error for " << list_error.size() <<
" part pairs." << std::endl;
1614 if( !num_failed.empty() )
1616 std::cerr <<
"Processor " <<
rank <<
": Error at " __FILE__
":" << __LINE__ << std::endl
1617 <<
" iMeshP_getNumPartBdryEnts return incorrect results for " << num_failed.size() <<
" part pairs."
1621 if( !list_failed.empty() )
1623 std::cerr <<
"Processor " <<
rank <<
": Error at " __FILE__
":" << __LINE__ << std::endl
1624 <<
" iMeshP_getPartBdryEnts return incorrect results for " << list_failed.size() <<
" part pairs."
1632 for(
size_t i = 0; i < local_handles.size(); ++i )
1634 std::vector< iBase_EntityHandle >& exp_bdry = part_bdry[local_handles[i]];
1635 std::sort( exp_bdry.begin(), exp_bdry.end() );
1636 exp_bdry.erase( std::unique( exp_bdry.begin(), exp_bdry.end() ), exp_bdry.end() );
1637 std::pair< iMeshP_Part, iMeshP_Part > part_pair;
1638 part_pair.first = local_ids[i];
1645 num_error.push_back( part_pair );
1646 else if( num != (
int)exp_bdry.size() )
1647 num_failed.push_back( part_pair );
1652 &junk, &num, &
ierr );
1654 list_error.push_back( part_pair );
1657 std::sort( bdry, bdry + num );
1658 if( num != (
int)exp_bdry.size() || !std::equal( bdry, bdry + num, exp_bdry.begin() ) )
1659 list_failed.push_back( part_pair );
1663 if( !num_error.empty() )
1665 std::cerr <<
"Processor " <<
rank <<
": Error at " __FILE__
":" << __LINE__ << std::endl
1666 <<
" iMeshP_getNumPartBdryEnts return error for " << num_error.size() <<
" part pairs." << std::endl;
1669 if( !list_error.empty() )
1671 std::cerr <<
"Processor " <<
rank <<
": Error at " __FILE__
":" << __LINE__ << std::endl
1672 <<
" iMeshP_getPartBdryEnts return error for " << list_error.size() <<
" part pairs." << std::endl;
1675 if( !num_failed.empty() )
1677 std::cerr <<
"Processor " <<
rank <<
": Error at " __FILE__
":" << __LINE__ << std::endl
1678 <<
" iMeshP_getNumPartBdryEnts return incorrect results for " << num_failed.size() <<
" part pairs."
1682 if( !list_failed.empty() )
1684 std::cerr <<
"Processor " <<
rank <<
": Error at " __FILE__
":" << __LINE__ << std::endl
1685 <<
" iMeshP_getPartBdryEnts return incorrect results for " << list_failed.size() <<
" part pairs."
1705 std::vector< iMeshP_PartHandle > local_handles;
1706 std::vector< iMeshP_Part > local_ids;
1707 std::vector< iMeshP_Part > all_parts = map.
get_parts();
1710 std::vector< std::pair< iMeshP_Part, iMeshP_Part > > single_failed, single_error, single_step_error, array_failed,
1711 array_error, array_step_error;
1712 for(
size_t i = 0; i < local_handles.size(); ++i )
1716 for( std::vector< iMeshP_Part >::iterator j = all_parts.begin(); j != all_parts.end(); ++j )
1719 if( other_id == local_id )
continue;
1721 std::pair< iMeshP_Part, iMeshP_Part > part_pair;
1722 part_pair.first = local_id;
1723 part_pair.second = other_id;
1726 std::vector< iBase_EntityHandle > shared_verts;
1729 std::sort( shared_verts.begin(), shared_verts.end() );
1736 single_error.push_back( part_pair );
1740 std::vector< iBase_EntityHandle > results;
1747 single_step_error.push_back( part_pair );
1750 if( !has_data )
break;
1751 results.push_back( handle );
1754 std::sort( results.begin(), results.end() );
1755 if( results.size() != shared_verts.size() ||
1756 !std::equal( results.begin(), results.end(), shared_verts.begin() ) )
1757 single_failed.push_back( part_pair );
1764 other_id, &aiter, &
ierr );
1767 array_error.push_back( part_pair );
1772 int junk = 5, count;
1776 array_step_error.push_back( part_pair );
1781 assert( count <= 5 );
1782 assert( ptr == results );
1783 std::sort( ptr, ptr + count );
1784 if( count != (
int)shared_verts.size() || !std::equal( shared_verts.begin(), shared_verts.end(), results ) )
1785 array_failed.push_back( part_pair );
1789 if( !single_error.empty() )
1791 std::cerr <<
"Processor " <<
rank <<
": Error at " __FILE__
":" << __LINE__ << std::endl
1792 <<
" iMeshP_initPartBdryEntIter return error for " << single_error.size() <<
" part pairs."
1796 if( !single_step_error.empty() )
1798 std::cerr <<
"Processor " <<
rank <<
": Error at " __FILE__
":" << __LINE__ << std::endl
1799 <<
" iMesh_getNextEntIter return error for " << single_step_error.size() <<
" part pairs."
1803 if( !single_failed.empty() )
1805 std::cerr <<
"Processor " <<
rank <<
": Error at " __FILE__
":" << __LINE__ << std::endl
1806 <<
" iMeshP_initPartBdryEntIter iterator iterated over invalid entities for " << single_failed.size()
1807 <<
" part pairs." << std::endl;
1811 if( !array_error.empty() )
1813 std::cerr <<
"Processor " <<
rank <<
": Error at " __FILE__
":" << __LINE__ << std::endl
1814 <<
" iMeshP_initPartBdryEntArrIter return error for " << array_error.size() <<
" part pairs."
1818 if( !array_step_error.empty() )
1820 std::cerr <<
"Processor " <<
rank <<
": Error at " __FILE__
":" << __LINE__ << std::endl
1821 <<
" iMesh_getNextEntArrIter return error for " << array_step_error.size() <<
" part pairs."
1825 if( !array_failed.empty() )
1827 std::cerr <<
"Processor " <<
rank <<
": Error at " __FILE__
":" << __LINE__ << std::endl
1828 <<
" iMeshP_initPartBdryEntArrIter iterator iterated over invalid entities for "
1829 << array_failed.size() <<
" part pairs." << std::endl;
1872 std::vector< iMeshP_PartHandle > local_handles;
1873 std::vector< iMeshP_Part > local_ids;
1878 std::vector< iBase_EntityHandle > all_quads;
1879 std::vector< iMeshP_Part > quad_owners;
1880 int invalid_count = 0;
1881 for(
size_t i = 0; i < local_handles.size(); ++i )
1883 std::vector< iBase_EntityHandle > quads;
1887 for(
size_t j = 0; j < quads.size(); ++j )
1889 all_quads.push_back( quads[j] );
1890 quad_owners.push_back( local_ids[i] );
1895 if( owner != local_ids[i] ) ++invalid_count;
1900 ASSERT( 0 == invalid_count );
1904 for(
size_t i = 0; i < local_handles.size(); ++i )
1906 std::vector< iBase_EntityHandle > quads;
1910 std::vector< iMeshP_Part > owners( quads.size() ), expected( quads.size(), local_ids[i] );
1911 int junk = owners.size(), count;
1915 assert( ptr == &owners[0] );
1916 assert( junk == (
int)owners.size() );
1917 assert( count == (
int)quads.size() );
1918 if( owners != expected ) ++invalid_count;
1921 ASSERT( 0 == invalid_count );
1925 int junk1 = 0, num_vtx;
1926 int *junk2 = 0, junk3 = 0, junk4;
1928 &junk3, &junk4, &
ierr );
1931 std::sort( vtx_arr, vtx_arr + num_vtx );
1932 num_vtx = std::unique( vtx_arr, vtx_arr + num_vtx ) - vtx_arr;
1933 std::vector< iBase_EntityHandle > all_verts( vtx_arr, vtx_arr + num_vtx );
1938 std::vector< iMeshP_Part > vert_owners( all_verts.size() );
1939 junk1 = vert_owners.size();
1943 assert( junk5 == &vert_owners[0] );
1944 assert( junk1 == (
int)vert_owners.size() );
1945 assert( junk3 == (
int)all_verts.size() );
1948 for(
size_t i = 0; i < all_verts.size(); ++i )
1954 ASSERT( 0 == invalid_count );
1957 std::vector< iBase_EntityHandle > all_entities( all_verts );
1958 std::copy( all_quads.begin(), all_quads.end(), std::back_inserter( all_entities ) );
1959 std::vector< iMeshP_Part > all_owners( vert_owners );
1960 std::copy( quad_owners.begin(), quad_owners.end(), std::back_inserter( all_owners ) );
1965 for(
size_t i = 0; i < local_handles.size(); ++i )
1972 if( !is_owner == ( local_ids[i] == all_owners[j] ) ) ++invalid_count;
1976 ASSERT( 0 == invalid_count );
1979 for(
size_t i = 0; i < local_handles.size(); ++i )
1981 std::vector< int > is_owner_list( all_entities.size() );
1982 junk1 = is_owner_list.size();
1983 int* junk6 = &is_owner_list[0];
1984 iMeshP_isEntOwnerArr( imesh, prtn, local_handles[i], &all_entities[0], all_entities.size(), &junk6, &junk1,
1987 assert( junk6 == &is_owner_list[0] );
1988 assert( junk1 == (
int)is_owner_list.size() );
1989 assert( junk3 == (
int)all_entities.size() );
1991 for(
size_t j = 0; j < all_entities.size(); ++j )
1993 if( !( is_owner_list[j] ) == ( local_ids[0] == all_owners[j] ) ) ++invalid_count;
1997 ASSERT( 0 == invalid_count );
2002 int local_count = all_verts.size(), global_count = 0;
2006 std::vector< int > vtxdata( 2 * all_verts.size() );
2007 std::vector< double > coords( 3 * all_verts.size() );
2009 for(
size_t i = 0; i < all_verts.size(); ++i )
2011 int x = (int)round( coords[3 * i] );
2012 int y = (int)round( coords[3 * i + 1] );
2013 vtxdata[2 * i] = ( x << 3 ) | y;
2014 vtxdata[2 * i + 1] = vert_owners[i];
2018 std::vector< int > all_data( 2 * global_count );
2019 std::vector< int > displ(
size ), counts(
size );
2020 for(
int i = 0; i <
size; i++ )
2022 counts[i] = vtxdata.size();
2023 displ[i] = i * vtxdata.size();
2027 ierr = MPI_Gatherv( &vtxdata[0], vtxdata.size(), MPI_INT, &all_data[0], &counts[0], &displ[0], MPI_INT, 0,
2033 std::multimap< int, int > data_map;
2034 for(
int i = 0; i < global_count; ++i )
2036 std::pair< int, int > p;
2037 p.first = all_data[2 * i];
2039 data_map.insert( p );
2043 std::multimap< int, int >::const_iterator a, b;
2044 for( a = data_map.begin(); a != data_map.end(); a = b )
2046 for( b = a; b != data_map.end() && a->first == b->first; ++b )
2048 int idx1 = a->second;
2049 int idx2 = b->second;
2050 if( all_data[2 * idx1 + 1] == all_data[2 * idx2 + 1] )
continue;
2054 int proc1 = std::lower_bound( displ.begin(), displ.end(), 2 * idx1 ) - displ.begin();
2055 if( displ[proc1] != 2 * idx1 ) ++proc1;
2056 int proc2 = std::lower_bound( displ.begin(), displ.end(), 2 * idx2 ) - displ.begin();
2057 if( displ[proc2] != 2 * idx2 ) ++proc2;
2059 std::cerr <<
"Error at " __FILE__
":" << __LINE__ <<
" : " << std::endl
2060 <<
" For vertex at (" << ( a->first >> 2 ) <<
", " << ( a->first & 3 ) <<
") :" << std::endl
2061 <<
" Processor " << proc1 <<
" has " << all_data[2 * idx1 + 1] <<
" as the owning part"
2063 <<
" Processor " << proc2 <<
" has " << all_data[2 * idx2 + 1] <<
" as the owning part"
2076 std::vector< iBase_EntityHandle >& boundary )
2078 int ierr, logical_id;
2084 for(
int j = 0; j < num_neighbors; ++j )
2086 std::vector< iBase_EntityHandle >
iface;
2088 std::copy(
iface.begin(),
iface.end(), std::back_inserter( boundary ) );
2091 std::sort( boundary.begin(), boundary.end() );
2092 boundary.erase( std::unique( boundary.begin(), boundary.end() ), boundary.end() );
2109 std::vector< iMeshP_PartHandle > parts;
2114 int num_quad_ent_incorrect = 0, num_quad_ent_error = 0;
2115 int num_quad_arr_incorrect = 0, num_quad_arr_error = 0;
2116 int num_vert_ent_incorrect = 0, num_vert_ent_error = 0;
2117 int num_vert_arr_incorrect = 0, num_vert_arr_error = 0;
2118 for(
size_t i = 0; i < parts.size(); ++i )
2123 std::vector< iBase_EntityHandle > quads, verts;
2128 for(
size_t j = 0; j < quads.size(); ++j )
2134 ++num_quad_ent_error;
2143 std::vector< int > stat_list( quads.size() );
2144 int* junk1 = &stat_list[0];
2145 int junk2 = stat_list.size(), count;
2149 ++num_quad_arr_error;
2153 assert( junk1 == &stat_list[0] );
2154 assert( junk2 == (
int)stat_list.size() );
2155 assert( count == (
int)quads.size() );
2156 for(
size_t j = 0; j < quads.size(); ++j )
2160 std::vector< iBase_EntityHandle > boundary;
2163 std::sort( boundary.begin(), boundary.end() );
2166 for(
size_t j = 0; j < verts.size(); ++j )
2172 ++num_vert_ent_error;
2176 bool on_boundary = std::binary_search( boundary.begin(), boundary.end(), verts[j] );
2181 stat_list.resize( verts.size() );
2182 junk1 = &stat_list[0];
2183 junk2 = stat_list.size();
2187 ++num_vert_arr_error;
2191 assert( junk1 == &stat_list[0] );
2192 assert( junk2 == (
int)stat_list.size() );
2193 assert( count == (
int)verts.size() );
2194 for(
size_t j = 0; j < verts.size(); ++j )
2196 bool on_boundary = std::binary_search( boundary.begin(), boundary.end(), verts[j] );
2202 ASSERT( 0 == num_quad_ent_error );
2203 ASSERT( 0 == num_quad_arr_error );
2204 ASSERT( 0 == num_vert_ent_error );
2205 ASSERT( 0 == num_vert_arr_error );
2206 ASSERT( 0 == num_quad_ent_incorrect );
2207 ASSERT( 0 == num_quad_arr_incorrect );
2208 ASSERT( 0 == num_vert_ent_incorrect );
2209 ASSERT( 0 == num_vert_arr_incorrect );
2227 std::vector< iMeshP_PartHandle > parts;
2230 ASSERT( !parts.empty() );
2239 std::vector< iBase_EntityHandle > quads, verts;
2248 std::map< iBase_EntityHandle, std::vector< iMeshP_Part > > vert_sharing;
2249 for(
int j = 0; j < num_neighbors; ++j )
2251 std::vector< iBase_EntityHandle >
iface;
2253 for(
size_t k = 0; k <
iface.size(); ++k )
2258 std::map< iBase_EntityHandle, std::vector< iMeshP_Part > >::iterator i;
2259 int num_failed = 0, num_incorrect = 0;
2260 for( i = vert_sharing.begin(); i != vert_sharing.end(); ++i )
2267 else if( (
unsigned)count != i->second.size() + 1 )
2270 ASSERT( 0 == num_failed );
2271 ASSERT( 0 == num_incorrect );
2274 num_failed = num_incorrect = 0;
2275 for( i = vert_sharing.begin(); i != vert_sharing.end(); ++i )
2278 int junk = 0, count;
2285 if( (
unsigned)count != i->second.size() + 1 )
2292 std::vector< iMeshP_Part > expected( i->second );
2293 expected.push_back( part_id );
2294 std::sort( list, list + count );
2295 std::sort( expected.begin(), expected.end() );
2296 bool eq = std::equal( list, list + count, expected.begin() );
2298 if( !eq ) ++num_incorrect;
2300 ASSERT( 0 == num_failed );
2301 ASSERT( 0 == num_incorrect );
2332 MPI_Datatype tmp_type;
2334 tmp_type = MPI_UNSIGNED;
2336 tmp_type = MPI_UNSIGNED_LONG;
2338 tmp_type = MPI_UNSIGNED_LONG_LONG;
2341 const MPI_Datatype type = tmp_type;
2344 std::vector< iMeshP_PartHandle > parts;
2347 std::vector< iMeshP_Part > part_ids( parts.size() );
2349 int junk2 = part_ids.size(), junk3;
2352 assert( junk1 == &part_ids[0] );
2353 assert( junk2 == (
int)part_ids.size() );
2354 assert( junk3 == (
int)parts.size() );
2358 std::vector< iBase_EntityHandle > local_data, local_vertices;
2359 for(
size_t i = 0; i < parts.size(); ++i )
2362 std::vector< iBase_EntityHandle > quads, verts;
2367 for(
size_t j = 0; j < verts.size(); ++j )
2374 tmp_h = part_ids[i];
2376 local_data.push_back( verts[j] );
2380 std::copy( verts.begin(), verts.end(), std::back_inserter( local_vertices ) );
2384 std::sort( local_vertices.begin(), local_vertices.end() );
2385 local_vertices.erase( std::unique( local_vertices.begin(), local_vertices.end() ), local_vertices.end() );
2386 std::vector< int > local_vtx_tags( local_vertices.size() );
CHKERR;
2387 for(
size_t i = 0; i < local_vertices.size(); ++i )
2389 ierr =
vertex_tag( imesh, local_vertices[i], local_vtx_tags[i] );
2395 std::vector< int > gcounts(
size ), gdisp(
size );
2396 int local_data_size = local_data.size();
2399 for(
int i = 1; i <
size; ++i )
2400 gdisp[i] = gdisp[i - 1] + gcounts[i - 1];
2401 std::vector< iBase_EntityHandle > global_data( gdisp[
size - 1] + gcounts[
size - 1] );
2402 ierr = MPI_Allgatherv( &local_data[0], local_data_size, type, &global_data[0], &gcounts[0], &gdisp[0], type,
2406 std::map< int, VtxCopyData > vtx_sharing;
2407 assert( global_data.size() % 3 == 0 );
2408 for(
size_t i = 0; i < global_data.size(); i += 3 )
2410 int tag = (int)(
size_t)global_data[i];
2413 vtx_sharing[tag].parts.push_back( part );
2414 vtx_sharing[tag].handles.push_back( handle );
2418 int num_error = 0, num_incorrect = 0, junk4;
2419 for(
size_t i = 0; i < local_vertices.size(); ++i )
2421 int num_copies = -1;
2425 junk2 = junk3 = junk4 = 0;
2426 iMeshP_getCopies( imesh, prtn, local_vertices[i], &ptr_part_ids, &junk2, &num_copies, &copies, &junk3, &junk4,
2433 assert( junk4 == num_copies );
2435 VtxCopyData& expected = vtx_sharing[local_vtx_tags[i]];
2436 if( num_copies != (
int)expected.
parts.size() )
2439 for(
size_t j = 0; j < expected.
parts.size(); ++j )
2441 int idx = std::find( ptr_part_ids, ptr_part_ids + num_copies, expected.
parts[j] ) - ptr_part_ids;
2442 if( idx == num_copies || copies[idx] != expected.
handles[j] )
2448 free( ptr_part_ids );
2451 ASSERT( 0 == num_error );
2452 ASSERT( 0 == num_incorrect );
2455 num_error = num_incorrect = 0;
2456 for(
size_t i = 0; i < local_vertices.size(); ++i )
2458 VtxCopyData& expected = vtx_sharing[local_vtx_tags[i]];
2459 for(
size_t j = 0; j < expected.
parts.size(); ++j )
2465 else if( expected.
handles[j] != copy )
2469 ASSERT( 0 == num_error );
2470 ASSERT( 0 == num_incorrect );
2473 num_error = num_incorrect = 0;
2474 for(
size_t i = 0; i < local_vertices.size(); ++i )
2476 VtxCopyData& expected = vtx_sharing[local_vtx_tags[i]];
2481 size_t idx = std::find( expected.
parts.begin(), expected.
parts.end(), owner_id ) - expected.
parts.begin();
2482 if( idx == expected.
parts.size() )
continue;
2489 else if( owner_id_2 != owner_id && copy != expected.
handles[idx] )
2492 ASSERT( 0 == num_error );
2493 ASSERT( 0 == num_incorrect );
2510 int ierr, num, junk = 0;
2514 std::copy( list, list + num, std::back_inserter( adj ) );
2526 std::vector< iBase_EntityHandle > all_verts;
2529 for(
size_t i = 0; i < all_verts.size(); ++i )
2532 if( n != 4 ) bdry.push_back( all_verts[i] );
2539 const std::vector< iBase_EntityHandle >& sorted_vertices )
2542 if( std::binary_search( sorted_vertices.begin(), sorted_vertices.end(),
vtx ) )
return iBase_SUCCESS;
2543 std::vector< iBase_EntityHandle > quads, verts;
2545 for(
size_t i = 0; i < quads.size(); ++i )
2549 for(
size_t j = 0; j < verts.size(); ++j )
2551 if( std::binary_search( sorted_vertices.begin(), sorted_vertices.end(), verts[j] ) )
return iBase_SUCCESS;
2561 const std::vector< iBase_EntityHandle >& verts,
2562 std::vector< int >& num_local_adj,
2563 std::vector< int >& num_all_adj )
2568 std::vector< int > vtx_tags( verts.size() );
2569 num_local_adj.resize( verts.size() );
2570 for(
size_t i = 0; i < verts.size(); ++i )
2576 std::vector< int > counts(
size ), displ(
size );
2577 int num_vtx = verts.size();
2580 for(
int i = 1; i <
size; ++i )
2581 displ[i] = displ[i - 1] + counts[i - 1];
2582 int total = displ[
size - 1] + counts[
size - 1];
2583 std::vector< int > all_tags( total ), all_adj_counts( total );
2584 ierr = MPI_Allgatherv( &vtx_tags[0], vtx_tags.size(), MPI_INT, &all_tags[0], &counts[0], &displ[0], MPI_INT,
2586 ierr = MPI_Allgatherv( &num_local_adj[0], num_local_adj.size(), MPI_INT, &all_adj_counts[0], &counts[0], &displ[0],
2589 num_all_adj.clear();
2590 num_all_adj.resize( total, 0 );
2591 for(
int i = 0; i < total; ++i )
2593 std::vector< int >::iterator it = std::find( vtx_tags.begin(), vtx_tags.end(), all_tags[i] );
2594 if( it == vtx_tags.end() )
continue;
2595 int idx = it - vtx_tags.begin();
2596 num_all_adj[idx] += all_adj_counts[i];
2612 std::vector< iBase_EntityHandle > bdry;
2616 std::vector< int > num_local_adj, num_global_adj;
2623 int num_incorrect = 0;
2624 for(
size_t i = 0; i < bdry.size(); ++i )
2630 ASSERT( 0 == num_incorrect );
2632 std::vector< iBase_EntityHandle > new_bdry;
2637 std::sort( bdry.begin(), bdry.end() );
2639 for(
size_t i = 0; i < new_bdry.size(); ++i )
2642 if(
ierr ) ++num_incorrect;
2644 ASSERT( 0 == num_incorrect );
2646 bdry.swap( new_bdry );
2654 for(
size_t i = 0; i < bdry.size(); ++i )
2662 std::sort( bdry.begin(), bdry.end() );
2664 for(
size_t i = 0; i < new_bdry.size(); ++i )
2667 if(
ierr ) ++num_incorrect;
2669 ASSERT( 0 == num_incorrect );
2687 std::vector< iBase_EntityHandle > all_elems;
2688 std::vector< iMeshP_Part > all_ids;
2689 std::vector< iBase_EntityHandle > quads;
2692 std::vector< iMeshP_PartHandle > local_handles;
2693 std::vector< iMeshP_Part > local_ids;
2700 int n_quads = quads.size();
2707 for(
int j = 0; j < n_quads; j++ )
2709 all_elems.push_back( quads[j] );
2710 all_ids.push_back( map.
get_parts()[i] );
2723 ASSERT( quads.size() == (
unsigned int)n_quads *
size );
2738 const char* src_name =
"test_src";
2739 const char* dst_name =
"test_dst";
2743 if( num_ghost_layers )
2756 std::vector< iBase_EntityHandle > verts;
2763 std::vector< int > tag_vals( verts.size(),
rank );
2770 tag_vals.resize( verts.size(), -1 );
2773 std::vector< int > ids( verts.size() );
2774 int *junk1 = &ids[0], junk2 = ids.size(), junk3;
2778 for(
size_t i = 0; i < verts.size(); ++i )
2783 std::cerr <<
"Rank " <<
rank <<
" : getIntData failed for vertex " << ids[i] << std::endl;
2795 std::vector< int > expected( verts.size() );
2796 std::vector< iMeshP_Part > parts( verts.size() );
2798 junk2 = parts.size();
2801 assert( junk4 == &parts[0] );
2802 assert( junk2 == (
int)parts.size() );
2803 assert( junk3 == (
int)verts.size() );
2804 junk1 = &expected[0];
2805 junk2 = expected.size();
2808 assert( junk1 == &expected[0] );
2809 assert( junk2 == (
int)expected.size() );
2810 assert( junk3 == (
int)parts.size() );
2812 ASSERT( tag_vals == expected );
2820 tag_vals.resize( verts.size(), -1 );
2823 tag_vals.resize( verts.size(), -1 );
2827 std::vector< iBase_EntityHandle > some;
2828 for(
size_t i = 0; i < verts.size(); ++i )
2834 some.push_back( verts[i] );
2840 tag_vals.resize( some.size(),
rank );
2848 tag_vals.resize( verts.size(), -1 );
2849 junk1 = &tag_vals[0];
2850 junk2 = tag_vals.size();
2852 assert( junk1 == &tag_vals[0] );
2853 assert( junk2 == (
int)tag_vals.size() );
2854 assert( junk3 == (
int)verts.size() );
2856 ASSERT( tag_vals == expected );
2893 std::vector< iMeshP_PartHandle > local_parts;
2894 std::vector< iMeshP_Part > imesh_ids;
2898 std::vector< int > local_ids( local_parts.size() );
2899 for(
size_t i = 0; i < local_parts.size(); ++i )
2905 int num_global = 0, num_local = local_parts.size();
2907 if( num_global != num_expected_parts )
2909 std::cerr <<
"Invalid/unexpected global part count at " __FILE__
":" << __LINE__ <<
" (proc " <<
rank
2910 <<
"): " << std::endl
2911 <<
" Expected: " << num_expected_parts << std::endl
2912 <<
" Actual: " << num_global << std::endl;
2917 std::vector< int > dspls(
size ), counts(
size );
2920 for(
int i = 1; i <
size; ++i )
2921 dspls[i] = dspls[i - 1] + counts[i - 1];
2924 std::vector< unsigned > global_part_ids( num_expected_parts );
2926 ierr = MPI_Allgatherv( &imesh_ids[0], num_local, MPI_UNSIGNED, &global_part_ids[0], &counts[0], &dspls[0],
2930 std::vector< int > global_id_list( num_expected_parts );
2931 ierr = MPI_Allgatherv( &local_ids[0], num_local, MPI_INT, &global_id_list[0], &counts[0], &dspls[0], MPI_INT,
2935 std::vector< int > global_owners( num_expected_parts );
2936 for(
int i = 0; i <
size; ++i )
2937 for(
int j = 0; j < counts[i]; ++j )
2938 global_owners[dspls[i] + j] = i;
2945 for(
int i = 0; i < num_expected_parts; ++i )
2958 std::cerr <<
"ERROR: Duplicate iMeshP_Part values detected at " __FILE__
":" << __LINE__ << std::endl;
2966 for(
int i = 0; i < num_expected_parts; ++i )
2973 std::cerr <<
"ERROR: Part mesh has been duplicated in multiple parts." << std::endl
2974 <<
" Detected at " __FILE__
":" << __LINE__ << std::endl
2975 <<
" See PartMap::part_from_coords" << std::endl;
2979 if( idx >= num_expected_parts )
2983 std::cerr <<
"ERROR: Part mesh invalid/incorrect mesh." << std::endl
2984 <<
" Detected at " __FILE__
":" << __LINE__ << std::endl
2985 <<
" See PartMap::part_from_coords" << std::endl;
3014 const int num_elem = 4;
3017 int junk1 = num_elem, n = -1;
3019 assert( ptr == array );
3020 assert( junk1 == num_elem );
3023 std::cerr <<
"Internal error at " __FILE__
":" << __LINE__ <<
" (proc " <<
rank
3024 <<
"): Expected all parts to have " << num_elem <<
" elements. Found one with " << n << std::endl;
3030 int junk2, junk3, offset_array[5];
3032 junk1 =
sizeof( adj_array ) /
sizeof( adj_array[0] );
3033 junk2 =
sizeof( offset_array ) /
sizeof( offset_array[0] );
3034 int* ptr2 = offset_array;
3035 iMesh_getEntArrAdj( imesh, array, num_elem,
iBase_VERTEX, &ptr, &junk1, &n, &ptr2, &junk2, &junk3, &
ierr );
CHKERR;
3036 assert( ptr == adj_array );
3037 assert( ptr2 == offset_array );
3038 assert( junk1 ==
sizeof( adj_array ) /
sizeof( adj_array[0] ) );
3039 assert( junk2 ==
sizeof( offset_array ) /
sizeof( offset_array[0] ) );
3040 assert( n == 4 * num_elem );
3041 assert( offset_array[0] == 0 );
3042 for(
int i = 1; i < junk3; ++i )
3043 assert( offset_array[i] - offset_array[i - 1] == 4 );
3048 for(
int i = 0; i < 4; ++i )
3052 for(
int j = 1; j < 4; ++j )
3056 for( k = 0; k < 4; ++k )
3057 if( mvtx[k] ==
vtx )
break;
3058 if( k == 4 ) all_match =
false;
3060 if( all_match )
break;
3062 assert( all_match );
3068 const int xi = ( (int)round( x ) - 1 ) / 2;
3069 const int yi = ( (int)round( y ) - 1 ) / 2;
3072 assert( fabs( x - 2 * xi - 1 ) < 1e-12 );
3073 assert( fabs( y - 2 * yi - 1 ) < 1e-12 );