19 #define MPI_COMM_WORLD 0
59 int main(
int argc,
char* argv[] )
62 MPI_Init( &argc, &argv );
121 std::vector< std::vector< EntityHandle > > L1hloc, L1hrem;
122 std::vector< std::vector< int > > L1p;
123 std::vector< EntityHandle > L2hloc, L2hrem;
124 std::vector< unsigned int > L2p;
126 std::vector< EntityHandle > entities_vec(
entities.size() );
128 rval = pcomm->
unpack_buffer( buff.
buff_ptr,
false, -1, -1, L1hloc, L1hrem, L1p, L2hloc, L2hrem, L2p, entities_vec );
CHECK_ERR( rval );
200 for(
unsigned k = 0; k < z; ++k )
201 for(
unsigned j = 0; j < y; ++j )
202 for(
unsigned i = 0; i < x; ++i )
204 const double coords[3] = {
static_cast< double >( i ),
static_cast< double >( j ),
205 static_cast< double >( k ) };
206 rval =
moab.create_vertex( coords, verts[x * y * k + x * j + i] );
CHECK_ERR( rval );
210 for(
unsigned k = 0; k < ( z - 1 ); ++k )
211 for(
unsigned j = 0; j < ( y - 1 ); ++j )
212 for(
unsigned i = 0; i < ( x - 1 ); ++i )
214 const size_t idx = (size_t)i + (
size_t)j * x + (size_t)k * x * y;
216 verts[idx], verts[idx + 1], verts[idx + x + 1], verts[idx + x],
217 verts[idx + x * y], verts[idx + x * y + 1], verts[idx + x * y + x + 1], verts[idx + x * y + x] };
218 rval =
moab.create_element(
MBHEX, conn, 8, elems[( x - 1 ) * ( y - 1 ) * k + ( x - 1 ) * j + i] );
CHECK_ERR( rval );
227 ErrorCode result =
moab->create_vertices( xyz, n * n, verts );
229 std::vector< EntityHandle > connect;
230 for(
unsigned int j = 0; j < n - 1; j++ )
232 for(
unsigned int i = 0; i < n - 1; i++ )
234 connect.push_back( verts[n * j + i] );
235 connect.push_back( verts[n * j + i + 1] );
236 connect.push_back( verts[n * ( j + 1 ) + i + 1] );
237 connect.push_back( verts[n * ( j + 1 ) + i] );
241 unsigned int nquads = ( n - 1 ) * ( n - 1 );
242 for(
unsigned int i = 0; i < nquads; i++ )
245 result =
moab->create_element(
MBQUAD, &connect[4 * i], 4, dum_quad );
251 Tag gid_tag =
moab->globalId_tag();
252 result =
moab->tag_set_data( gid_tag, verts, gids );
281 0, 1, 2, 3, 4, 5, 6, 7, 8,
282 2, 9, 10, 5, 11, 12, 8, 13, 14,
283 6, 7, 8, 17, 15, 13, 18, 16, 14,
284 2, 19, 20, 5, 21, 22, 8, 23, 24
287 -1.0, 0.0, 0.0, -0.5, 0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.5, 0.0, -0.5, 0.5, 0.0, 0.0, 0.5, 0.0,
288 -1.0, 1.0, 0.0, -0.5, 1.0, 0.0, 0.0, 1.0, 0.0,
289 0.0, 0.0, -0.5, 0.0, 0.0, -1.0, 0.0, 0.5, -0.5, 0.0, 0.5, -1.0, 0.0, 1.0, -0.5, 0.0, 1.0, -1.0,
290 -0.5, 1.0, -0.5, -0.5, 1.0, -1.0, -1.0, 1.0, -0.5, -1.0, 1.0, -1.0,
291 0.5, 0.0, 0.0, 1.0, 0.0, 0.0, 0.5, 0.5, 0.0, 1.0, 0.5, 0.0, 0.5, 1.0, 0.0, 1.0, 1.0, 0.0,
296 for(
unsigned int i = 0; i < 4; i++ )
298 for(
unsigned int j = 0; j < 9; j++ )
300 xyztmp[3 * j] = xyz[3 * gids[9 * i + j]];
301 xyztmp[3 * j + 1] = xyz[3 * gids[9 * i + j] + 1];
302 xyztmp[3 * j + 2] = xyz[3 * gids[9 * i + j] + 2];
305 create_patch( pc[i]->get_moab(), verts[i], quads[i], 3, xyztmp, &gids[9 * i] );
333 int ijkmin[
P][3] = { { 0, 0, 0 }, { 0, 2, 0 }, { 2, 2, 0 }, { 0, 0, 2 } };
334 int ijkmax[
P][3] = { { 4, 2, 2 }, { 2, 4, 2 }, { 4, 4, 2 }, { 4, 4, 4 } };
337 int NIJK[3] = { 0, 0, 0 };
338 #define INDEXG( i, j, k ) ( (k)*NIJK[1] * NIJK[0] + (j)*NIJK[0] + ( i ) )
339 #define INDEXL( i, j, k ) \
340 ( ( (k)-ijkmin[p][2] ) * nijk[p][1] * nijk[p][0] + ( (j)-ijkmin[p][1] ) * nijk[p][0] + ( (i)-ijkmin[p][0] ) )
343 for( p = 0; p <
P; p++ )
345 for( i = 0; i < 3; i++ )
347 nijk[p][i] = ijkmax[p][i] - ijkmin[p][i] + 1;
348 NIJK[i] = std::max( NIJK[i], nijk[p][i] );
352 std::vector< int > gids;
353 std::vector< double > xyz;
357 for( p = 0; p <
P; p++ )
362 int nverts = nijk[p][0] * nijk[p][1] * nijk[p][2];
363 xyz.resize( 3 * nverts );
364 gids.resize( nverts );
368 for( k = ijkmin[p][2]; k <= ijkmax[p][2]; k++ )
369 for( j = ijkmin[p][1]; j <= ijkmax[p][1]; j++ )
370 for( i = ijkmin[p][0]; i <= ijkmax[p][0]; i++ )
378 gids[nv++] =
INDEXG( i, j, k );
389 for( k = ijkmin[p][2]; k < ijkmax[p][2]; k++ )
390 for( j = ijkmin[p][1]; j < ijkmax[p][1]; j++ )
391 for( i = ijkmin[p][0]; i < ijkmax[p][0]; i++ )
394 connect[0] = verts[p][
INDEXL( i, j, k )];
395 connect[1] = verts[p][
INDEXL( i + 1, j, k )];
396 connect[2] = verts[p][
INDEXL( i + 1, j + 1, k )];
397 connect[3] = verts[p][
INDEXL( i, j + 1, k )];
398 connect[4] = verts[p][
INDEXL( i, j, k + 1 )];
399 connect[5] = verts[p][
INDEXL( i + 1, j, k + 1 )];
400 connect[6] = verts[p][
INDEXL( i + 1, j + 1, k + 1 )];
401 connect[7] = verts[p][
INDEXL( i, j + 1, k + 1 )];
403 hexes[p].
insert( dum_hex );
404 gids[nv++] =
INDEXG( i, j, k );
409 std::ostringstream
fname;
410 fname <<
"tmp" << p <<
"." <<
rank <<
".h5m";
424 const size_t num_verts = 4;
425 const double coords[3 * num_verts] = { -0.5, -1. / 3, 0.0, 0.5, -1. / 3, 0.0,
426 0.0, 2. / 3, 0.0, 0.0, 0.0, 0.745356 };
428 rval =
moab.create_vertices( coords, num_verts, verts );
CHECK_ERR( rval );
433 double coords2[3 * num_verts];
436 std::vector< bool > seen( num_verts,
false );
437 for(
unsigned i = 0; i < num_verts; ++i )
440 for( j = 0; j < num_verts; ++j )
441 if( coords[3 * j] == coords2[3 * i] && coords[3 * j + 1] == coords2[3 * i + 1] &&
442 coords[3 * j + 2] == coords2[3 * i + 2] )
444 CHECK( j < num_verts );
457 const size_t num_verts = 12;
459 const double hex_corners[3 * num_verts] = { -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1, -1, -1, 0, 1, -1, 0,
460 1, 1, 0, -1, 1, 0, -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1 };
461 for(
size_t i = 0; i < num_verts; ++i )
467 const size_t num_hex = 2;
475 const size_t num_quad = 1;
481 const size_t num_tet = 5;
483 EntityHandle tet_conn[num_tet][4] = { { verts[0], verts[1], verts[3], verts[4] },
484 { verts[1], verts[2], verts[3], verts[6] },
485 { verts[1], verts[3], verts[4], verts[6] },
486 { verts[4], verts[6], verts[5], verts[1] },
487 { verts[7], verts[6], verts[4], verts[3] } };
501 const size_t num_tri = 4;
503 EntityHandle tri_conn[num_tri][3] = { { verts[3], verts[1], verts[4] },
504 { verts[1], verts[6], verts[4] },
505 { verts[1], verts[3], verts[6] },
506 { verts[3], verts[4], verts[6] } };
517 const size_t num_wedge = 2;
519 EntityHandle wedge_conn[num_wedge][6] = { { verts[4], verts[5], verts[7], verts[8], verts[9], verts[11] },
520 { verts[5], verts[6], verts[7], verts[9], verts[10], verts[11] } };
522 elems.
insert( wedges[0] );
524 elems.
insert( wedges[1] );
535 check_sizes(
moab, num_verts, 0, num_tri, num_quad, 0, num_tet, 1, num_wedge, 0, num_hex, 0 );
540 int len1, len2, len3;
545 rval =
moab.get_connectivity( range.
back(), conn2, len2,
true );
CHECK_ERR( rval );
554 if( conn1[0] == conn2[4] )
570 const EntityHandle combined[12] = { conn1[0], conn1[1], conn1[2], conn1[3], conn3[0], conn3[1],
571 conn3[2], conn3[3], conn2[4], conn2[5], conn2[6], conn2[7] };
573 rval =
moab.get_coords( combined, 12, coords );
CHECK_ERR( rval );
574 for(
int i = 0; i < 36; ++i )
588 const size_t num_vert = 14;
589 const double coords[3 * num_vert] = { -1, -1, 0, 0, -1, 0, 1, -1, 0, 1, 0, 0, 1, 1,
590 0, 0, 1, 0, -1, 1, 0, -1, 0, 0, 0, 0, 0, 0,
591 0, 1, -.5, -.5, .5, .5, -.5, .5, .5, .5, .5, -.5, .5, .5 };
593 for(
size_t i = 0; i < num_vert; ++i )
595 rval =
moab.create_vertex( coords + 3 * i, verts[i] );
CHECK_ERR( rval );
599 const size_t num_tet = 2;
601 { verts[0], verts[4], verts[9], verts[2], verts[8], verts[12], verts[10], verts[1], verts[3], verts[11] },
602 { verts[0], verts[9], verts[4], verts[6], verts[10], verts[12], verts[8], verts[7], verts[13], verts[5] } };
611 const size_t num_tri = 1;
612 EntityHandle tri_conn[6] = { verts[0], verts[4], verts[9], verts[8], verts[12], verts[10] };
621 check_sizes(
moab, num_vert, 0, num_tri, 0, 0, num_tet, 0, 0, 0, 0, 0 );
626 int len1, len2, len3;
631 rval =
moab.get_connectivity( range.
back(), conn2, len2,
false );
CHECK_ERR( rval );
641 if( conn3[1] != conn1[1] )
std::swap( conn1, conn2 );
659 const EntityHandle combined[num_vert] = { conn1[0], conn1[7], conn1[3], conn1[8], conn1[1], conn2[9], conn2[3],
660 conn2[7], conn1[4], conn1[2], conn1[6], conn1[9], conn1[5], conn2[8] };
661 double coords2[3 * num_vert];
662 rval =
moab.get_coords( combined, num_vert, coords2 );
CHECK_ERR( rval );
665 for(
int i = 0; i < 36; ++i )
678 const double a = 0.5;
679 const double b = 1 + sqrt( 2.0 ) / 2.0;
680 const size_t num_vert = 9;
681 const double coords[3 * num_vert] = { -a, -b, 0, a, -b, 0, b, -a, 0, b, a, 0, a, b,
682 0, -a, b, 0, -b, a, 0, -b, -a, 0, 0, 0, 1 };
684 for(
size_t i = 0; i < num_vert; ++i )
686 rval =
moab.create_vertex( coords + 3 * i, verts[i] );
CHECK_ERR( rval );
690 const size_t num_polygon = 1;
695 const size_t num_tri = num_vert - 1;
697 for(
size_t i = 0; i < num_tri; ++i )
699 const EntityHandle conn[3] = { verts[i], verts[( i + 1 ) % num_tri], verts[num_tri] };
704 const size_t num_polyhedron = 1;
707 all_faces[0] = octagon;
708 std::copy( tri, tri + num_tri, all_faces + 1 );
713 elems.
insert( polyhedron );
719 check_sizes(
moab, num_vert, 0, num_tri, 0, num_polygon, 0, 0, 0, 0, 0, num_polyhedron );
725 polyhedron = range.
front();
730 octagon = range.
front();
739 rval =
moab.get_connectivity( octagon, oct_conn, eight );
CHECK_ERR( rval );
741 double oct_coords[3 * 8];
742 rval =
moab.get_coords( oct_conn, 8, oct_coords );
CHECK_ERR( rval );
743 for(
int i = 0; i < 3 * 8; ++i )
749 std::vector< EntityHandle > volconn;
750 rval =
moab.get_connectivity( &polyhedron, 1, volconn );
CHECK_ERR( rval );
755 CHECK( std::find( volconn.begin(), volconn.end(), *i ) != volconn.end() );
787 EntityHandle all_set, half1_set, half2_set, vertex_set, empty_set;
790 rval =
moab.create_meshset( all_opt, all_set );
CHECK_ERR( rval );
792 rval =
moab.create_meshset( half1_opt, half1_set );
CHECK_ERR( rval );
794 rval =
moab.create_meshset( half2_opt, half2_set );
CHECK_ERR( rval );
796 rval =
moab.create_meshset( vertex_opt, vertex_set );
CHECK_ERR( rval );
798 rval =
moab.create_meshset( empty_opt, empty_set );
CHECK_ERR( rval );
801 Range elems, verts, half;
805 rval =
moab.add_entities( all_set, verts );
CHECK_ERR( rval );
806 rval =
moab.add_entities( all_set, elems );
CHECK_ERR( rval );
808 rval =
moab.add_entities( half1_set, half );
CHECK_ERR( rval );
811 rval =
moab.add_entities( half2_set, half );
CHECK_ERR( rval );
813 rval =
moab.add_entities( vertex_set, &vert, 1 );
CHECK_ERR( rval );
831 empty_set = all_set = vertex_set = half1_set = half2_set = 0;
834 int num_vtx, num_elem;
844 else if( !half1_set )
854 else if( num_vtx == 1 )
871 rval =
moab.get_meshset_options( all_set, opt );
CHECK_ERR( rval );
873 rval =
moab.get_meshset_options( half1_set, opt );
CHECK_ERR( rval );
875 rval =
moab.get_meshset_options( half2_set, opt );
CHECK_ERR( rval );
877 rval =
moab.get_meshset_options( vertex_set, opt );
CHECK_ERR( rval );
879 rval =
moab.get_meshset_options( empty_set, opt );
CHECK_ERR( rval );
946 rval =
moab.create_meshset( MESHSET_ORDERED, set1 );
CHECK_ERR( rval );
964 set1 = set2 = set3 = 0;
969 CHECK( count >= 0 && count <= 2 );
997 if( sets.
front() == set1 )
1026 rval =
moab.create_meshset( MESHSET_ORDERED, set1 );
CHECK_ERR( rval );
1033 rval =
moab.add_child_meshset( set3, set1 );
CHECK_ERR( rval );
1034 rval =
moab.add_parent_meshset( set2, set1 );
CHECK_ERR( rval );
1035 rval =
moab.add_parent_child( set3, set2 );
CHECK_ERR( rval );
1039 rval =
moab.num_child_meshsets( set1, &count );
1041 rval =
moab.num_child_meshsets( set2, &count );
1043 rval =
moab.num_child_meshsets( set3, &count );
1045 rval =
moab.num_parent_meshsets( set1, &count );
1047 rval =
moab.num_parent_meshsets( set2, &count );
1049 rval =
moab.num_parent_meshsets( set3, &count );
1061 set1 = set2 = set3 = 0;
1065 rval =
moab.num_child_meshsets( *i, &mcount );
CHECK_ERR( rval );
1075 std::vector< EntityHandle > parents,
children;
1080 rval =
moab.get_parent_meshsets( set1, parents );
CHECK_ERR( rval );
1081 CHECK( parents.empty() );
1085 rval =
moab.get_parent_meshsets( set2, parents );
CHECK_ERR( rval );
1086 CHECK_EQUAL( (std::vector< EntityHandle >::size_type)2, parents.size() );
1109 const char sparse_2_int_tag_name[] =
"test tag 1";
1110 Tag sparse_2_int_tag;
1114 for( i = elems.
begin(); i != elems.
end(); ++i, skip = !skip )
1116 if( skip )
continue;
1123 const int data[2] = { (int)coords[0], (
int)coords[1] };
1149 for( i = tagged.
begin(); i != tagged.
end(); ++i )
1182 const char dense_1_double_tag_name[] =
"test tag 2";
1183 Tag dense_1_double_tag;
1186 for( i = verts.
begin(); i != verts.
end(); ++i )
1190 double val = sqrt( coords[0] * coords[0] + coords[1] * coords[1] + coords[2] * coords[2] );
1213 for( i = verts.
begin(); i != verts.
end(); ++i )
1218 const double expected = sqrt( coords[0] * coords[0] + coords[1] * coords[1] + coords[2] * coords[2] );
1235 Range verts, elems, sets;
1243 const char dense_5_opaque_tag_name[] =
1244 "This is intentionally a very long tag name in an attempt to test for an arbitrary "
1245 "limitations on tag name length.";
1246 Tag dense_5_opaque_tag;
1252 const char data[] =
"TAGGDTAGGDTAGGD";
1276 CHECK_EQUAL( std::string(
"DEFLT" ), std::string( odata ) );
1279 int vcount = 0, ecount = 0, scount = 0;
1280 for( i = verts.
begin(); i != verts.
end(); ++i )
1283 if( strcmp( odata,
"DEFLT" ) != 0 )
1285 CHECK_EQUAL( std::string(
"TAGGD" ), std::string( odata ) );
1290 for( i = elems.
begin(); i != elems.
end(); ++i )
1293 if( strcmp( odata,
"DEFLT" ) != 0 )
1300 for( i = sets.
begin(); i != sets.
end(); ++i )
1303 if( strcmp( odata,
"DEFLT" ) != 0 )
1326 const char tag_name[] =
"test bit";
1332 for( i = verts.
begin(); i != verts.
end(); ++i )
1337 unsigned char data = 0;
1338 for(
int j = 0; j < 3; ++j )
1339 if( fabs( coords[j] ) > 1e-6 ) data |= ( 1 << j );
1365 for( i = verts.
begin(); i != verts.
end(); ++i )
1370 unsigned char expected = 0;
1371 for(
int j = 0; j < 3; ++j )
1372 if( fabs( coords[j] ) > 1e-6 ) expected |= ( 1 << j );
1374 unsigned char data = (
unsigned char)0xFF;
1395 const char* tag_name =
"var_int_tag";
1396 const int defval_size = 5;
1397 const int default_val[defval_size] = { 0xBEEF, 0xFEED, 0xDEAD, 0xBAD, 0xBEAD };
1405 for( i = verts.
begin(); i != verts.
end(); ++i )
1410 const int num_coord = 1 + *i % 3;
1411 const int data_size = num_coord + 1;
1412 const int data[4] = { num_coord, (int)coords[0], (
int)coords[1], (int)coords[2] };
1413 const void* data_ptrs[1] = { data };
1437 const void* defval_ptr;
1440 const int* defval_arr =
reinterpret_cast< const int*
>( defval_ptr );
1441 for(
int j = 0; j <
size; ++j )
1445 for( i = verts.
begin(); i != verts.
end(); ++i )
1454 CHECK( tsize <= 4 );
1456 const int* valarr =
reinterpret_cast< const int*
>( valptr );
1457 CHECK( valarr[0] >= 1 );
1458 CHECK( valarr[0] <= 3 );
1459 for(
int j = 0; j < valarr[0]; ++j )
1482 const char* tag_name =
"entity tag";
1483 EntityHandle default_val[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
1490 for( i = elems.
begin(); i != elems.
end(); ++i )
1499 for(
int j = 0; j < 8; ++j )
1535 for(
int j = 0; j < 8; ++j )
1541 for( i = elems.
begin(); i != elems.
end(); ++i )
1550 for(
int j = 0; j < 8; ++j )
1554 while( vdata[idx] != *i )
1565 for( i = verts.
begin(); i != verts.
end(); ++i )
1568 for(
int j = 0; j < 8; ++j )
1576 std::vector< EntityHandle >& ent_verts,
1577 int verts_per_entity,
1581 assert( !( ent_verts.size() % verts_per_entity ) );
1582 unsigned int num_ents = ent_verts.size() / verts_per_entity;
1585 for(
unsigned int i = 0; i < num_ents; i++ )
1588 assert( dum_ents.
size() == 1 );
1589 ents.
merge( dum_ents );
1599 for(
unsigned int i = 0; i < 4; i++ )
1605 Range verts[4], quads[4];
1619 for(
unsigned int i = 0; i < 4; i++ )
1627 for(
unsigned int i = 0; i < 4; i++ )
1631 for(
unsigned int j = 0; j < 4; j++ )
1640 Range verts[4], hexes[4];
1652 for(
unsigned int i = 0; i < 4; i++ )
1665 std::vector< EntityHandle > verts;
1666 Range dum_vertsr, vertsr;
1668 vertsr.
insert( dum_vertsr[0], dum_vertsr[8] );
1669 for(
int k = 0; k < 9; k++ )
1670 verts.push_back( vertsr[k] );
1672 CHECK( !verts.empty() );
1676 std::vector< int > procs( 70, -1 );
1677 for(
int k = 0; k < 6; k++ )
1680 std::vector< unsigned char > pvals( verts.size(), 0 );
1710 Range tmp_range = vertsr;
1714 CHECK( tmp_range.
size() == 4 && *tmp_range.
begin() == verts[0] && *tmp_range.
rbegin() == verts[3] );
1718 CHECK( tmp_range.
size() == 5 && *tmp_range.
begin() == verts[4] && *tmp_range.
rbegin() == verts[8] );
1722 CHECK( tmp_range.
size() == 2 && *tmp_range.
begin() == verts[1] && *tmp_range.
rbegin() == verts[3] );
1726 CHECK( tmp_range.
size() == 2 && *tmp_range.
begin() == verts[4] && *tmp_range.
rbegin() == verts[5] );
1731 CHECK( tmp_range.
size() == 4 && tmp_range[0] == verts[0] && tmp_range[1] == verts[1] && tmp_range[2] == verts[4] &&
1732 tmp_range[3] == verts[6] );
1736 CHECK( tmp_range.
size() == 2 && tmp_range[1] == verts[2] );
1740 CHECK( tmp_range.
size() == 3 && tmp_range[0] == verts[3] && tmp_range[1] == verts[4] && tmp_range[2] == verts[5] );
1747 #if defined( MOAB_HAVE_MPI ) && defined( MOAB_HAVE_HDF5 )
1752 std::string
example = TestDir +
"unittest/64bricks_1khex.h5m";
1753 std::string
read_options =
"PARALLEL=READ_PART;PARTITION=PARALLEL_PARTITION;PARALLEL_RESOLVE_SHARED_ENTS";