|
MOAB: Mesh Oriented datABase
(version 5.4.1)
|
#include "moab/ParallelComm.hpp"#include "MBParallelConventions.h"#include "MBTagConventions.hpp"#include "moab/Core.hpp"#include "moab/MeshTopoUtil.hpp"#include "ReadParallel.hpp"#include "moab/FileOptions.hpp"#include "TestUtil.hpp"#include <algorithm>#include <vector>#include <set>#include <sstream>
Include dependency graph for pcomm_unit.cpp:Go to the source code of this file.
Defines | |
| #define | MPI_COMM_WORLD 0 |
| #define | P 4 |
| #define | INDEXG(i, j, k) ( (k)*NIJK[1] * NIJK[0] + (j)*NIJK[0] + ( i ) ) |
| #define | INDEXL(i, j, k) ( ( (k)-ijkmin[p][2] ) * nijk[p][1] * nijk[p][0] + ( (j)-ijkmin[p][1] ) * nijk[p][0] + ( (i)-ijkmin[p][0] ) ) |
Functions | |
| void | test_pack_vertices () |
| void | test_pack_elements () |
| void | test_pack_higher_order () |
| void | test_pack_poly () |
| void | test_pack_sets_simple () |
| void | test_pack_set_contents () |
| void | test_pack_sets_of_sets () |
| void | test_pack_set_parent_child () |
| void | test_pack_tag_data_sparse () |
| void | test_pack_tag_data_dense () |
| void | test_pack_tag_data_default_value () |
| void | test_pack_bit_tag_data () |
| void | test_pack_variable_length_tag () |
| void | test_pack_tag_handle_data () |
| void | test_pack_shared_entities_2d () |
| void | test_pack_shared_entities_3d () |
| void | test_filter_pstatus () |
| void | test_new_pcomm_instance () |
| int | main (int argc, char *argv[]) |
| void | pack_unpack_noremoteh (Core &moab, Range &entities) |
| void | pack_unpack_noremoteh (Core &moab) |
| void | check_sizes (Interface &moab, int num_vtx, int num_edge, int num_tri, int num_quad, int num_polygon, int num_tet, int num_pyr, int num_wedge, int num_knife, int num_hex, int num_polyhedron) |
| void | create_simple_grid (Interface &moab, unsigned x, unsigned y, unsigned z) |
| void | create_simple_grid (Interface &moab, unsigned xyz=3) |
| ErrorCode | create_patch (Interface *moab, Range &verts, Range &quads, unsigned int n, double *xyz, int *gids) |
| ErrorCode | create_shared_grid_2d (ParallelComm **pc, Range *verts, Range *quads) |
| ErrorCode | create_shared_grid_3d (ParallelComm **pc, Range *verts, Range *hexes) |
| ErrorCode | get_entities (Interface *mb, std::vector< EntityHandle > &ent_verts, int verts_per_entity, int dim, Range &ents) |
Variables | |
| int | rank = 0 |
| #define INDEXG | ( | i, | |
| j, | |||
| k | |||
| ) | ( (k)*NIJK[1] * NIJK[0] + (j)*NIJK[0] + ( i ) ) |
Referenced by create_shared_grid_3d().
| #define INDEXL | ( | i, | |
| j, | |||
| k | |||
| ) | ( ( (k)-ijkmin[p][2] ) * nijk[p][1] * nijk[p][0] + ( (j)-ijkmin[p][1] ) * nijk[p][0] + ( (i)-ijkmin[p][0] ) ) |
Referenced by create_shared_grid_3d().
| #define MPI_COMM_WORLD 0 |
Definition at line 19 of file pcomm_unit.cpp.
Referenced by main(), pack_unpack_noremoteh(), test_filter_pstatus(), test_new_pcomm_instance(), test_pack_shared_entities_2d(), and test_pack_shared_entities_3d().
| #define P 4 |
Referenced by moab::area_coordinates(), moab::FBEngine::chain_able_edge(), moab::SmoothCurve::compute_control_points_on_boundary_edges(), moab::SmoothFace::compute_internal_control_points_on_facets(), moab::SmoothFace::compute_tangents_for_each_edge(), create_shared_grid_3d(), moab::SmoothFace::evaluate_smooth_edge(), moab::SmoothCurve::evaluate_smooth_edge(), moab::FBEngine::getPntRayIntsct(), moab::SmoothFace::init_bezier_edge(), moab::Intx2Mesh::intersect_meshes(), moab::Intx2Mesh::intersect_meshes_kdtree(), moab::FBEngine::print_debug_triangle(), moab::SimplexTemplateRefiner::refine_3_simplex(), moab::FBEngine::split_surface_with_direction(), and moab::SmoothCurve::u_from_position().
| void check_sizes | ( | Interface & | moab, |
| int | num_vtx, | ||
| int | num_edge, | ||
| int | num_tri, | ||
| int | num_quad, | ||
| int | num_polygon, | ||
| int | num_tet, | ||
| int | num_pyr, | ||
| int | num_wedge, | ||
| int | num_knife, | ||
| int | num_hex, | ||
| int | num_polyhedron | ||
| ) |
Definition at line 140 of file pcomm_unit.cpp.
References CHECK_EQUAL, CHECK_ERR, ErrorCode, moab::Interface::get_number_entities_by_type(), MBEDGE, MBHEX, MBKNIFE, MBPOLYGON, MBPOLYHEDRON, MBPRISM, MBPYRAMID, MBQUAD, MBTET, MBTRI, and MBVERTEX.
Referenced by test_pack_elements(), test_pack_higher_order(), and test_pack_poly().
{
int count;
ErrorCode rval;
rval = moab.get_number_entities_by_type( 0, MBVERTEX, count );CHECK_ERR( rval );
CHECK_EQUAL( num_vtx, count );
rval = moab.get_number_entities_by_type( 0, MBEDGE, count );CHECK_ERR( rval );
CHECK_EQUAL( num_edge, count );
rval = moab.get_number_entities_by_type( 0, MBTRI, count );CHECK_ERR( rval );
CHECK_EQUAL( num_tri, count );
rval = moab.get_number_entities_by_type( 0, MBQUAD, count );CHECK_ERR( rval );
CHECK_EQUAL( num_quad, count );
rval = moab.get_number_entities_by_type( 0, MBPOLYGON, count );CHECK_ERR( rval );
CHECK_EQUAL( num_polygon, count );
rval = moab.get_number_entities_by_type( 0, MBTET, count );CHECK_ERR( rval );
CHECK_EQUAL( num_tet, count );
rval = moab.get_number_entities_by_type( 0, MBPYRAMID, count );CHECK_ERR( rval );
CHECK_EQUAL( num_pyr, count );
rval = moab.get_number_entities_by_type( 0, MBPRISM, count );CHECK_ERR( rval );
CHECK_EQUAL( num_wedge, count );
rval = moab.get_number_entities_by_type( 0, MBKNIFE, count );CHECK_ERR( rval );
CHECK_EQUAL( num_knife, count );
rval = moab.get_number_entities_by_type( 0, MBHEX, count );CHECK_ERR( rval );
CHECK_EQUAL( num_hex, count );
rval = moab.get_number_entities_by_type( 0, MBPOLYHEDRON, count );CHECK_ERR( rval );
CHECK_EQUAL( num_polyhedron, count );
}
| ErrorCode create_patch | ( | Interface * | moab, |
| Range & | verts, | ||
| Range & | quads, | ||
| unsigned int | n, | ||
| double * | xyz, | ||
| int * | gids | ||
| ) |
Definition at line 224 of file pcomm_unit.cpp.
References moab::Interface::create_element(), moab::Interface::create_vertices(), ErrorCode, moab::Interface::globalId_tag(), moab::Range::insert(), MB_SUCCESS, MBQUAD, and moab::Interface::tag_set_data().
Referenced by create_shared_grid_2d().
{
// create vertices/quads in square array
ErrorCode result = moab->create_vertices( xyz, n * n, verts );
if( MB_SUCCESS != result ) return result;
std::vector< EntityHandle > connect;
for( unsigned int j = 0; j < n - 1; j++ )
{
for( unsigned int i = 0; i < n - 1; i++ )
{
connect.push_back( verts[n * j + i] );
connect.push_back( verts[n * j + i + 1] );
connect.push_back( verts[n * ( j + 1 ) + i + 1] );
connect.push_back( verts[n * ( j + 1 ) + i] );
}
}
unsigned int nquads = ( n - 1 ) * ( n - 1 );
for( unsigned int i = 0; i < nquads; i++ )
{
EntityHandle dum_quad;
result = moab->create_element( MBQUAD, &connect[4 * i], 4, dum_quad );
if( MB_SUCCESS != result ) return result;
quads.insert( dum_quad );
}
// global ids
Tag gid_tag = moab->globalId_tag();
result = moab->tag_set_data( gid_tag, verts, gids );
if( MB_SUCCESS != result ) return result;
return result;
}
| ErrorCode create_shared_grid_2d | ( | ParallelComm ** | pc, |
| Range * | verts, | ||
| Range * | quads | ||
| ) |
Definition at line 258 of file pcomm_unit.cpp.
References CHECK_ERR, create_patch(), ErrorCode, and moab::ParallelComm::resolve_shared_ents().
Referenced by test_pack_shared_entities_2d().
{
//
// P2______
// /__/__/ /|P1
// y: /__/__/ /||
// 1 _____ ||/ _____ 1
// | | | |/|-1 | | |
// .5 |__|__| ||/ |__|__| .5
// |P0| | |/-.5 |P3| |
// 0 |__|__| z:0 |__|__| 0
// x:-1 -.5 0 0 .5 1
//
// nodes: P2
// 18 16 14 P1
// 17 15 13 14
// 6 7 8 13 12
// 8 11 10
// 6 7 8 5 9 8 23 24 P3
// 3 4 5 2 5 21 22
// P0 0 1 2 2 19 20
int gids[] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, // P0
2, 9, 10, 5, 11, 12, 8, 13, 14, // P1
6, 7, 8, 17, 15, 13, 18, 16, 14, // P2
2, 19, 20, 5, 21, 22, 8, 23, 24 // P3
};
double xyz[] = {
-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,
-1.0, 1.0, 0.0, -0.5, 1.0, 0.0, 0.0, 1.0, 0.0, // n0-8
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, // n9-14
-0.5, 1.0, -0.5, -0.5, 1.0, -1.0, -1.0, 1.0, -0.5, -1.0, 1.0, -1.0, // n15-18
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, // n19-24
};
double xyztmp[27];
// create the test mesh above
for( unsigned int i = 0; i < 4; i++ )
{
for( unsigned int j = 0; j < 9; j++ )
{
xyztmp[3 * j] = xyz[3 * gids[9 * i + j]];
xyztmp[3 * j + 1] = xyz[3 * gids[9 * i + j] + 1];
xyztmp[3 * j + 2] = xyz[3 * gids[9 * i + j] + 2];
}
create_patch( pc[i]->get_moab(), verts[i], quads[i], 3, xyztmp, &gids[9 * i] );
}
ErrorCode rval = ParallelComm::resolve_shared_ents( pc, 4, 0, 2 );CHECK_ERR( rval );
return rval;
}
| ErrorCode create_shared_grid_3d | ( | ParallelComm ** | pc, |
| Range * | verts, | ||
| Range * | hexes | ||
| ) |
Definition at line 313 of file pcomm_unit.cpp.
References CHECK_ERR, moab::Interface::create_element(), moab::Interface::create_vertices(), ErrorCode, fname, moab::ParallelComm::get_moab(), moab::Interface::globalId_tag(), INDEXG, INDEXL, moab::Range::insert(), MB_SUCCESS, MBHEX, P, rank, moab::ParallelComm::resolve_shared_ents(), moab::Interface::tag_set_data(), and moab::Interface::write_file().
Referenced by test_pack_shared_entities_3d().
{
//
// 4 _____ _____
// | | | | | |
// 3|__|__| |__|__| GIDS HANDLES
// |P1| | |P2| |
// |__|__| |__|__| 20 21 22 22 23 24 7 8 9 7 8 9
// 2 ___________ 15 16 17 17 18 19 4 5 6 4 5 6
// | | | | | 10 11 12 12 13 14 1 2 3 1 2 3
// / 1|__|__|__|__|
// | | |P0| | | 10 11 12 13 14 10 11 12 13 14
// J 0|__|__|__|__| 5 6 7 8 9 5 6 7 8 9
// I-> 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
//
// P3 - k = 2..4
// create structured meshes
// ijkmin[p][ijk], ijkmax[p][ijk]
#define P 4
int ijkmin[P][3] = { { 0, 0, 0 }, { 0, 2, 0 }, { 2, 2, 0 }, { 0, 0, 2 } };
int ijkmax[P][3] = { { 4, 2, 2 }, { 2, 4, 2 }, { 4, 4, 2 }, { 4, 4, 4 } };
int nijk[P][3];
int NIJK[3] = { 0, 0, 0 };
#define INDEXG( i, j, k ) ( (k)*NIJK[1] * NIJK[0] + (j)*NIJK[0] + ( i ) )
#define INDEXL( i, j, k ) \
( ( (k)-ijkmin[p][2] ) * nijk[p][1] * nijk[p][0] + ( (j)-ijkmin[p][1] ) * nijk[p][0] + ( (i)-ijkmin[p][0] ) )
int p, i, j, k;
for( p = 0; p < P; p++ )
{
for( i = 0; i < 3; i++ )
{
nijk[p][i] = ijkmax[p][i] - ijkmin[p][i] + 1;
NIJK[i] = std::max( NIJK[i], nijk[p][i] );
}
}
std::vector< int > gids;
std::vector< double > xyz;
ErrorCode rval;
Tag gid_tag;
for( p = 0; p < P; p++ )
{
gid_tag = pc[p]->get_moab()->globalId_tag();
// make vertices
int nverts = nijk[p][0] * nijk[p][1] * nijk[p][2];
xyz.resize( 3 * nverts );
gids.resize( nverts );
// set vertex gids
int nv = 0;
for( k = ijkmin[p][2]; k <= ijkmax[p][2]; k++ )
for( j = ijkmin[p][1]; j <= ijkmax[p][1]; j++ )
for( i = ijkmin[p][0]; i <= ijkmax[p][0]; i++ )
{
// xyz
xyz[3 * nv] = i;
xyz[3 * nv + 1] = j;
xyz[3 * nv + 2] = k;
// gid
gids[nv++] = INDEXG( i, j, k );
}
rval = pc[p]->get_moab()->create_vertices( &xyz[0], nverts, verts[p] );CHECK_ERR( rval );
rval = pc[p]->get_moab()->tag_set_data( gid_tag, verts[p], &gids[0] );
if( MB_SUCCESS != rval ) return rval;
// make elements
nv = 0;
EntityHandle connect[8], dum_hex;
for( k = ijkmin[p][2]; k < ijkmax[p][2]; k++ )
for( j = ijkmin[p][1]; j < ijkmax[p][1]; j++ )
for( i = ijkmin[p][0]; i < ijkmax[p][0]; i++ )
{
// gid
connect[0] = verts[p][INDEXL( i, j, k )];
connect[1] = verts[p][INDEXL( i + 1, j, k )];
connect[2] = verts[p][INDEXL( i + 1, j + 1, k )];
connect[3] = verts[p][INDEXL( i, j + 1, k )];
connect[4] = verts[p][INDEXL( i, j, k + 1 )];
connect[5] = verts[p][INDEXL( i + 1, j, k + 1 )];
connect[6] = verts[p][INDEXL( i + 1, j + 1, k + 1 )];
connect[7] = verts[p][INDEXL( i, j + 1, k + 1 )];
rval = pc[p]->get_moab()->create_element( MBHEX, connect, 8, dum_hex );
hexes[p].insert( dum_hex );
gids[nv++] = INDEXG( i, j, k );
}
rval = pc[p]->get_moab()->tag_set_data( gid_tag, hexes[p], &gids[0] );
if( MB_SUCCESS != rval ) return rval;
std::ostringstream fname;
fname << "tmp" << p << "." << rank << ".h5m";
rval = pc[p]->get_moab()->write_file( fname.str().c_str() );
if( MB_SUCCESS != rval ) return rval;
}
rval = ParallelComm::resolve_shared_ents( pc, 4, 0, 3 );CHECK_ERR( rval );
return rval;
}
| void create_simple_grid | ( | Interface & | moab, |
| unsigned | x, | ||
| unsigned | y, | ||
| unsigned | z | ||
| ) |
Definition at line 196 of file pcomm_unit.cpp.
References CHECK_ERR, moab::Interface::create_element(), moab::Interface::create_vertex(), ErrorCode, and MBHEX.
Referenced by create_simple_grid(), test_filter_pstatus(), test_pack_bit_tag_data(), test_pack_set_contents(), test_pack_sets_simple(), test_pack_tag_data_default_value(), test_pack_tag_data_dense(), test_pack_tag_data_sparse(), test_pack_tag_handle_data(), and test_pack_variable_length_tag().
{
ErrorCode rval;
EntityHandle* verts = new EntityHandle[x * y * z];
for( unsigned k = 0; k < z; ++k )
for( unsigned j = 0; j < y; ++j )
for( unsigned i = 0; i < x; ++i )
{
const double coords[3] = { static_cast< double >( i ), static_cast< double >( j ),
static_cast< double >( k ) };
rval = moab.create_vertex( coords, verts[x * y * k + x * j + i] );CHECK_ERR( rval );
}
EntityHandle* elems = new EntityHandle[( x - 1 ) * ( y - 1 ) * ( z - 1 )];
for( unsigned k = 0; k < ( z - 1 ); ++k )
for( unsigned j = 0; j < ( y - 1 ); ++j )
for( unsigned i = 0; i < ( x - 1 ); ++i )
{
const size_t idx = (size_t)i + (size_t)j * x + (size_t)k * x * y;
const EntityHandle conn[8] = {
verts[idx], verts[idx + 1], verts[idx + x + 1], verts[idx + x],
verts[idx + x * y], verts[idx + x * y + 1], verts[idx + x * y + x + 1], verts[idx + x * y + x] };
rval = moab.create_element( MBHEX, conn, 8, elems[( x - 1 ) * ( y - 1 ) * k + ( x - 1 ) * j + i] );CHECK_ERR( rval );
}
delete[] verts;
delete[] elems;
}
| void create_simple_grid | ( | Interface & | moab, |
| unsigned | xyz = 3 |
||
| ) |
Definition at line 192 of file pcomm_unit.cpp.
References create_simple_grid().
{
create_simple_grid( moab, xyz, xyz, xyz );
}
| ErrorCode get_entities | ( | Interface * | mb, |
| std::vector< EntityHandle > & | ent_verts, | ||
| int | verts_per_entity, | ||
| int | dim, | ||
| Range & | ents | ||
| ) |
Definition at line 1575 of file pcomm_unit.cpp.
References CHECK_ERR, moab::Range::clear(), ErrorCode, moab::Interface::get_adjacencies(), MB_SUCCESS, moab::Range::merge(), and moab::Range::size().
{
assert( !( ent_verts.size() % verts_per_entity ) );
unsigned int num_ents = ent_verts.size() / verts_per_entity;
Range dum_ents;
ErrorCode result;
for( unsigned int i = 0; i < num_ents; i++ )
{
result = mb->get_adjacencies( &ent_verts[verts_per_entity * i], verts_per_entity, dim, true, dum_ents );CHECK_ERR( result );
assert( dum_ents.size() == 1 );
ents.merge( dum_ents );
dum_ents.clear();
}
return MB_SUCCESS;
}
| int main | ( | int | argc, |
| char * | argv[] | ||
| ) |
Definition at line 59 of file pcomm_unit.cpp.
References MPI_COMM_WORLD, rank, RUN_TEST, test_filter_pstatus(), test_new_pcomm_instance(), test_pack_elements(), test_pack_higher_order(), test_pack_poly(), test_pack_set_contents(), test_pack_set_parent_child(), test_pack_sets_of_sets(), test_pack_sets_simple(), test_pack_shared_entities_2d(), test_pack_shared_entities_3d(), test_pack_tag_data_default_value(), test_pack_tag_data_dense(), test_pack_tag_data_sparse(), test_pack_tag_handle_data(), test_pack_variable_length_tag(), and test_pack_vertices().
{
#ifdef MOAB_HAVE_MPI
MPI_Init( &argc, &argv );
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
#endif
int num_err = 0;
num_err += RUN_TEST( test_pack_vertices );
num_err += RUN_TEST( test_pack_elements );
num_err += RUN_TEST( test_pack_higher_order );
num_err += RUN_TEST( test_pack_poly );
num_err += RUN_TEST( test_pack_sets_simple );
num_err += RUN_TEST( test_pack_set_contents );
num_err += RUN_TEST( test_pack_sets_of_sets );
num_err += RUN_TEST( test_pack_set_parent_child );
num_err += RUN_TEST( test_pack_tag_data_sparse );
num_err += RUN_TEST( test_pack_tag_data_dense );
num_err += RUN_TEST( test_pack_tag_data_default_value );
// num_err += RUN_TEST( test_pack_bit_tag_data );
num_err += RUN_TEST( test_pack_variable_length_tag );
num_err += RUN_TEST( test_pack_tag_handle_data );
num_err += RUN_TEST( test_pack_shared_entities_2d );
num_err += RUN_TEST( test_pack_shared_entities_3d );
num_err += RUN_TEST( test_filter_pstatus );
num_err += RUN_TEST( test_new_pcomm_instance );
#ifdef MOAB_HAVE_MPI
MPI_Finalize();
#endif
return num_err;
}
| void pack_unpack_noremoteh | ( | Core & | moab, |
| Range & | entities | ||
| ) |
Definition at line 93 of file pcomm_unit.cpp.
References moab::Range::begin(), moab::ParallelComm::Buffer::buff_ptr, CHECK_ERR, moab::Range::clear(), moab::Range::empty(), moab::Range::end(), ErrorCode, moab::Core::get_adjacencies(), moab::Core::get_entities_by_handle(), moab::ParallelComm::INITIAL_BUFF_SIZE, MBENTITYSET, moab::Range::merge(), MPI_COMM_WORLD, moab::ParallelComm::pack_buffer(), moab::ParallelComm::Buffer::reset_ptr(), moab::ParallelComm::Buffer::set_stored_size(), moab::Range::size(), moab::Range::subset_by_type(), moab::subtract(), moab::Interface::UNION, moab::ParallelComm::unpack_buffer(), and moab::Core::~Core().
Referenced by pack_unpack_noremoteh(), test_pack_bit_tag_data(), test_pack_elements(), test_pack_higher_order(), test_pack_poly(), test_pack_set_contents(), test_pack_set_parent_child(), test_pack_sets_of_sets(), test_pack_sets_simple(), test_pack_tag_data_default_value(), test_pack_tag_data_dense(), test_pack_tag_data_sparse(), test_pack_tag_handle_data(), test_pack_variable_length_tag(), and test_pack_vertices().
{
ErrorCode rval;
if( entities.empty() )
{
rval = moab.get_entities_by_handle( 0, entities );CHECK_ERR( rval );
}
ParallelComm* pcomm = new ParallelComm( &moab, MPI_COMM_WORLD );
// get the necessary vertices too
Range tmp_range = entities.subset_by_type( MBENTITYSET );
entities = subtract( entities, tmp_range );
rval = moab.get_adjacencies( entities, 0, false, entities, Interface::UNION );CHECK_ERR( rval );
entities.merge( tmp_range );
ParallelComm::Buffer buff( ParallelComm::INITIAL_BUFF_SIZE );
buff.reset_ptr( sizeof( int ) );
rval = pcomm->pack_buffer( entities, false, true, false, -1, &buff );CHECK_ERR( rval );
buff.set_stored_size();
delete pcomm;
moab.~Core();
new( &moab ) Core();
pcomm = new ParallelComm( &moab, MPI_COMM_WORLD );
entities.clear();
std::vector< std::vector< EntityHandle > > L1hloc, L1hrem;
std::vector< std::vector< int > > L1p;
std::vector< EntityHandle > L2hloc, L2hrem;
std::vector< unsigned int > L2p;
buff.reset_ptr( sizeof( int ) );
std::vector< EntityHandle > entities_vec( entities.size() );
std::copy( entities.begin(), entities.end(), entities_vec.begin() );
rval = pcomm->unpack_buffer( buff.buff_ptr, false, -1, -1, L1hloc, L1hrem, L1p, L2hloc, L2hrem, L2p, entities_vec );CHECK_ERR( rval );
std::copy( entities_vec.begin(), entities_vec.end(), range_inserter( entities ) );
delete pcomm;
}
| void pack_unpack_noremoteh | ( | Core & | moab | ) |
Definition at line 133 of file pcomm_unit.cpp.
References pack_unpack_noremoteh().
{
Range empty;
pack_unpack_noremoteh( moab, empty );
}
| void test_filter_pstatus | ( | ) |
Test filter_pstatus function
Definition at line 1656 of file pcomm_unit.cpp.
References moab::Range::begin(), CHECK, CHECK_ERR, create_simple_grid(), ErrorCode, moab::Interface::get_entities_by_type(), moab::Range::insert(), MBVERTEX, MPI_COMM_WORLD, PSTATUS_AND, PSTATUS_GHOST, PSTATUS_INTERFACE, PSTATUS_MULTISHARED, PSTATUS_NOT, PSTATUS_NOT_OWNED, PSTATUS_SHARED, moab::Range::rbegin(), moab::Range::size(), and moab::Core::tag_set_data().
Referenced by main().
{
Range::iterator i;
Core moab;
Interface& mb = moab;
ErrorCode rval;
// create some mesh
create_simple_grid( mb, 3 );
std::vector< EntityHandle > verts;
Range dum_vertsr, vertsr;
rval = mb.get_entities_by_type( 0, MBVERTEX, dum_vertsr );CHECK_ERR( rval );
vertsr.insert( dum_vertsr[0], dum_vertsr[8] );
for( int k = 0; k < 9; k++ )
verts.push_back( vertsr[k] );
CHECK( !verts.empty() );
ParallelComm* pcomm = new ParallelComm( &moab, MPI_COMM_WORLD );
std::vector< int > procs( 70, -1 );
for( int k = 0; k < 6; k++ )
procs[k] = k;
std::vector< unsigned char > pvals( verts.size(), 0 );
// interface, owned
pvals[0] = ( PSTATUS_INTERFACE | PSTATUS_SHARED ); // p0
rval = moab.tag_set_data( pcomm->sharedp_tag(), &verts[0], 1, &procs[0] );CHECK_ERR( rval );
// interface, not owned
pvals[1] = ( PSTATUS_NOT_OWNED | PSTATUS_INTERFACE | PSTATUS_SHARED ); // p1
rval = moab.tag_set_data( pcomm->sharedp_tag(), &verts[1], 1, &procs[1] );CHECK_ERR( rval );
// interface, multi-shared, owned
pvals[2] = ( PSTATUS_INTERFACE | PSTATUS_SHARED | PSTATUS_MULTISHARED ); // p0, p1
rval = moab.tag_set_data( pcomm->sharedps_tag(), &verts[2], 1, &procs[0] );CHECK_ERR( rval );
// interface, multi-shared, not owned
pvals[3] = ( PSTATUS_INTERFACE | PSTATUS_MULTISHARED | PSTATUS_NOT_OWNED | PSTATUS_SHARED ); // p1, p2
rval = moab.tag_set_data( pcomm->sharedps_tag(), &verts[3], 1, &procs[1] );CHECK_ERR( rval );
// ghost, shared
pvals[4] = ( PSTATUS_GHOST | PSTATUS_SHARED | PSTATUS_NOT_OWNED ); // p2
rval = moab.tag_set_data( pcomm->sharedp_tag(), &verts[4], 1, &procs[2] );CHECK_ERR( rval );
// ghost, multi-shared
pvals[5] = ( PSTATUS_GHOST | PSTATUS_MULTISHARED | PSTATUS_NOT_OWNED | PSTATUS_SHARED ); // p2, p3
rval = moab.tag_set_data( pcomm->sharedps_tag(), &verts[5], 1, &procs[2] );CHECK_ERR( rval );
// owned, shared
pvals[6] = ( PSTATUS_SHARED ); // p4
rval = moab.tag_set_data( pcomm->sharedp_tag(), &verts[6], 1, &procs[4] );CHECK_ERR( rval );
// owned, multi-shared
pvals[7] = ( PSTATUS_MULTISHARED | PSTATUS_SHARED ); // p4, p5
rval = moab.tag_set_data( pcomm->sharedps_tag(), &verts[7], 1, &procs[4] );CHECK_ERR( rval );
// not shared, owned
pvals[8] = 0x0;
rval = moab.tag_set_data( pcomm->pstatus_tag(), &verts[0], 9, &pvals[0] );CHECK_ERR( rval );
Range tmp_range = vertsr;
// interface ents
rval = pcomm->filter_pstatus( tmp_range, PSTATUS_INTERFACE, PSTATUS_AND );CHECK_ERR( rval );
CHECK( tmp_range.size() == 4 && *tmp_range.begin() == verts[0] && *tmp_range.rbegin() == verts[3] );
// not interface
tmp_range = vertsr;
rval = pcomm->filter_pstatus( tmp_range, PSTATUS_INTERFACE, PSTATUS_NOT );CHECK_ERR( rval );
CHECK( tmp_range.size() == 5 && *tmp_range.begin() == verts[4] && *tmp_range.rbegin() == verts[8] );
// interface not owned
tmp_range = vertsr;
rval = pcomm->filter_pstatus( tmp_range, PSTATUS_INTERFACE | PSTATUS_NOT_OWNED, PSTATUS_AND );CHECK_ERR( rval );
CHECK( tmp_range.size() == 2 && *tmp_range.begin() == verts[1] && *tmp_range.rbegin() == verts[3] );
// ghost
tmp_range = vertsr;
rval = pcomm->filter_pstatus( tmp_range, PSTATUS_GHOST, PSTATUS_AND );CHECK_ERR( rval );
CHECK( tmp_range.size() == 2 && *tmp_range.begin() == verts[4] && *tmp_range.rbegin() == verts[5] );
// shared not multi-shared
tmp_range = vertsr;
rval = pcomm->filter_pstatus( tmp_range, PSTATUS_SHARED, PSTATUS_AND );CHECK_ERR( rval );
rval = pcomm->filter_pstatus( tmp_range, PSTATUS_MULTISHARED, PSTATUS_NOT );CHECK_ERR( rval );
CHECK( tmp_range.size() == 4 && tmp_range[0] == verts[0] && tmp_range[1] == verts[1] && tmp_range[2] == verts[4] &&
tmp_range[3] == verts[6] );
// shared w/ p0
tmp_range = vertsr;
rval = pcomm->filter_pstatus( tmp_range, PSTATUS_SHARED, PSTATUS_AND, 0 );CHECK_ERR( rval );
CHECK( tmp_range.size() == 2 && tmp_range[1] == verts[2] );
// shared w/ p2 && not owned
tmp_range = vertsr;
rval = pcomm->filter_pstatus( tmp_range, PSTATUS_SHARED | PSTATUS_NOT_OWNED, PSTATUS_AND, 2 );CHECK_ERR( rval );
CHECK( tmp_range.size() == 3 && tmp_range[0] == verts[3] && tmp_range[1] == verts[4] && tmp_range[2] == verts[5] );
delete pcomm;
}
| void test_new_pcomm_instance | ( | ) |
Test creating a new ParallelComm instance in addition to an existing one
Definition at line 1745 of file pcomm_unit.cpp.
References CHECK_ERR, ErrorCode, example, moab::Interface::load_file(), MPI_COMM_WORLD, and read_options.
Referenced by main().
{
#if defined( MOAB_HAVE_MPI ) && defined( MOAB_HAVE_HDF5 )
Core moab;
Interface& mb = moab;
// This parallel read will create a ParallelComm instance implicitly
std::string example = TestDir + "unittest/64bricks_1khex.h5m";
std::string read_options = "PARALLEL=READ_PART;PARTITION=PARALLEL_PARTITION;PARALLEL_RESOLVE_SHARED_ENTS";
ErrorCode rval = mb.load_file( example.c_str(), 0, read_options.c_str() );CHECK_ERR( rval );
// It is highly recommended to reuse existing ParallelComm instance with
// ParallelComm::get_pcomm() Creating a new ParallelComm instance should still be allowed,
// anyway
ParallelComm* pcomm = new moab::ParallelComm( &moab, MPI_COMM_WORLD );
// Do something with pcomm
// ...
delete pcomm;
#endif
}
| void test_pack_bit_tag_data | ( | ) |
Test pack/unpack tag values
Definition at line 1312 of file pcomm_unit.cpp.
References moab::Range::begin(), CHECK, CHECK_EQUAL, CHECK_ERR, moab::Range::clear(), create_simple_grid(), moab::Range::empty(), moab::Range::end(), ErrorCode, moab::Interface::get_coords(), moab::Interface::get_entities_by_type(), mb, MB_TAG_BIT, MB_TAG_EXCL, MB_TYPE_BIT, MBVERTEX, pack_unpack_noremoteh(), size, moab::Interface::tag_get_data(), moab::Interface::tag_get_data_type(), moab::Interface::tag_get_handle(), moab::Interface::tag_get_length(), moab::Interface::tag_get_type(), moab::Interface::tag_set_data(), and TagType.
{
Range::iterator i;
Core moab;
Interface& mb = moab;
ErrorCode rval;
// create some mesh
create_simple_grid( mb, 3 );
Range verts;
rval = mb.get_entities_by_type( 0, MBVERTEX, verts );CHECK_ERR( rval );
CHECK( !verts.empty() );
// Create a bit tag
const char tag_name[] = "test bit";
Tag tag;
rval = mb.tag_get_handle( tag_name, 3, MB_TYPE_BIT, tag, MB_TAG_EXCL );CHECK_ERR( rval );
// Set bits to 1 unless cooresponding coordinate of
// vertex is zero.
for( i = verts.begin(); i != verts.end(); ++i )
{
double coords[3];
rval = mb.get_coords( &*i, 1, coords );CHECK_ERR( rval );
unsigned char data = 0;
for( int j = 0; j < 3; ++j )
if( fabs( coords[j] ) > 1e-6 ) data |= ( 1 << j );
rval = mb.tag_set_data( tag, &*i, 1, &data );CHECK_ERR( rval );
}
// pack and unpack
Range ents;
pack_unpack_noremoteh( moab, ents );
verts.clear();
rval = mb.get_entities_by_type( 0, MBVERTEX, verts );CHECK_ERR( rval );
// check tag meta
rval = mb.tag_get_handle( tag_name, 3, MB_TYPE_BIT, tag );CHECK_ERR( rval );
int size;
rval = mb.tag_get_length( tag, size );CHECK_ERR( rval );
CHECK_EQUAL( 3, size );
TagType storage;
rval = mb.tag_get_type( tag, storage );CHECK_ERR( rval );
CHECK_EQUAL( MB_TAG_BIT, storage );
DataType type;
rval = mb.tag_get_data_type( tag, type );
CHECK_EQUAL( MB_TYPE_BIT, type );
// check tag values
for( i = verts.begin(); i != verts.end(); ++i )
{
double coords[3];
rval = mb.get_coords( &*i, 1, coords );CHECK_ERR( rval );
unsigned char expected = 0;
for( int j = 0; j < 3; ++j )
if( fabs( coords[j] ) > 1e-6 ) expected |= ( 1 << j );
unsigned char data = (unsigned char)0xFF;
rval = mb.tag_get_data( tag, &*i, 1, &data );CHECK_ERR( rval );
CHECK_EQUAL( (int)expected, (int)data );
}
}
| void test_pack_elements | ( | ) |
Test pack/unpack of elements
Definition at line 450 of file pcomm_unit.cpp.
References moab::Range::back(), CHECK_EQUAL, CHECK_ERR, CHECK_REAL_EQUAL, check_sizes(), moab::Range::clear(), moab::Core::create_element(), moab::Core::create_vertex(), ErrorCode, moab::Range::front(), moab::Core::get_connectivity(), moab::Core::get_coords(), moab::Core::get_entities_by_type(), hex_corners, moab::Range::insert(), MBHEX, MBPRISM, MBPYRAMID, MBQUAD, MBTET, MBTRI, pack_unpack_noremoteh(), moab::Range::size(), and swap().
Referenced by main().
{
Core moab;
ErrorCode rval;
Range elems;
// define some vertices
const size_t num_verts = 12;
EntityHandle verts[num_verts];
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,
1, 1, 0, -1, 1, 0, -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1 };
for( size_t i = 0; i < num_verts; ++i )
{
rval = moab.create_vertex( hex_corners + 3 * i, verts[i] );CHECK_ERR( rval );
}
// define two adjacent hexes
const size_t num_hex = 2;
EntityHandle hexes[num_hex];
rval = moab.create_element( MBHEX, verts, 8, hexes[0] );CHECK_ERR( rval );
elems.insert( hexes[0] );
rval = moab.create_element( MBHEX, verts + 4, 8, hexes[1] );CHECK_ERR( rval );
elems.insert( hexes[1] );
// define a single quad on the adjacent sides of the hexes
const size_t num_quad = 1;
EntityHandle quad;
rval = moab.create_element( MBQUAD, verts + 4, 4, quad );CHECK_ERR( rval );
elems.insert( quad );
// define a decomposition of the first hex into 5 tets
const size_t num_tet = 5;
EntityHandle tets[num_tet];
EntityHandle tet_conn[num_tet][4] = { { verts[0], verts[1], verts[3], verts[4] },
{ verts[1], verts[2], verts[3], verts[6] },
{ verts[1], verts[3], verts[4], verts[6] },
{ verts[4], verts[6], verts[5], verts[1] },
{ verts[7], verts[6], verts[4], verts[3] } };
rval = moab.create_element( MBTET, tet_conn[0], 4, tets[0] );CHECK_ERR( rval );
elems.insert( tets[0] );
rval = moab.create_element( MBTET, tet_conn[1], 4, tets[1] );CHECK_ERR( rval );
elems.insert( tets[1] );
rval = moab.create_element( MBTET, tet_conn[2], 4, tets[2] );CHECK_ERR( rval );
elems.insert( tets[2] );
rval = moab.create_element( MBTET, tet_conn[3], 4, tets[3] );CHECK_ERR( rval );
elems.insert( tets[3] );
rval = moab.create_element( MBTET, tet_conn[4], 4, tets[4] );CHECK_ERR( rval );
elems.insert( tets[4] );
// define the 4 shared faces of the above tets as tris
// (the faces of the 3rd tet)
const size_t num_tri = 4;
EntityHandle tris[num_tri];
EntityHandle tri_conn[num_tri][3] = { { verts[3], verts[1], verts[4] },
{ verts[1], verts[6], verts[4] },
{ verts[1], verts[3], verts[6] },
{ verts[3], verts[4], verts[6] } };
rval = moab.create_element( MBTRI, tri_conn[0], 3, tris[0] );CHECK_ERR( rval );
elems.insert( tris[0] );
rval = moab.create_element( MBTRI, tri_conn[1], 3, tris[1] );CHECK_ERR( rval );
elems.insert( tris[1] );
rval = moab.create_element( MBTRI, tri_conn[2], 3, tris[2] );CHECK_ERR( rval );
elems.insert( tris[2] );
rval = moab.create_element( MBTRI, tri_conn[3], 3, tris[3] );CHECK_ERR( rval );
elems.insert( tris[3] );
// define a decomposition of the second hex into two wedges
const size_t num_wedge = 2;
EntityHandle wedges[num_wedge];
EntityHandle wedge_conn[num_wedge][6] = { { verts[4], verts[5], verts[7], verts[8], verts[9], verts[11] },
{ verts[5], verts[6], verts[7], verts[9], verts[10], verts[11] } };
rval = moab.create_element( MBPRISM, wedge_conn[0], 6, wedges[0] );CHECK_ERR( rval );
elems.insert( wedges[0] );
rval = moab.create_element( MBPRISM, wedge_conn[1], 6, wedges[1] );CHECK_ERR( rval );
elems.insert( wedges[1] );
// define a pyramid
EntityHandle pyr;
rval = moab.create_element( MBPYRAMID, verts, 5, pyr );CHECK_ERR( rval );
elems.insert( pyr );
// pack and unpack mesh
pack_unpack_noremoteh( moab, elems );
// check_counts
check_sizes( moab, num_verts, 0, num_tri, num_quad, 0, num_tet, 1, num_wedge, 0, num_hex, 0 );
// get connectivity for two hexes and a quad
Range range;
const EntityHandle *conn1, *conn2, *conn3;
int len1, len2, len3;
rval = moab.get_entities_by_type( 0, MBHEX, range );CHECK_ERR( rval );
CHECK_EQUAL( num_hex, range.size() );
rval = moab.get_connectivity( range.front(), conn1, len1, true );CHECK_ERR( rval );
CHECK_EQUAL( 8, len1 );
rval = moab.get_connectivity( range.back(), conn2, len2, true );CHECK_ERR( rval );
CHECK_EQUAL( 8, len2 );
range.clear();
rval = moab.get_entities_by_type( 0, MBQUAD, range );CHECK_ERR( rval );
CHECK_EQUAL( num_quad, range.size() );
rval = moab.get_connectivity( range.front(), conn3, len3, true );CHECK_ERR( rval );
CHECK_EQUAL( 4, len3 );
// Check if hexes are reversed
if( conn1[0] == conn2[4] )
{
std::swap( conn1, conn2 );
}
// Check consistant connectivity between hexes
CHECK_EQUAL( conn1[4], conn2[0] );
CHECK_EQUAL( conn1[5], conn2[1] );
CHECK_EQUAL( conn1[6], conn2[2] );
CHECK_EQUAL( conn1[7], conn2[3] );
// Check connectivity of quad on shared face
CHECK_EQUAL( conn1[4], conn3[0] );
CHECK_EQUAL( conn1[5], conn3[1] );
CHECK_EQUAL( conn1[6], conn3[2] );
CHECK_EQUAL( conn1[7], conn3[3] );
// Check coordinates
const EntityHandle combined[12] = { conn1[0], conn1[1], conn1[2], conn1[3], conn3[0], conn3[1],
conn3[2], conn3[3], conn2[4], conn2[5], conn2[6], conn2[7] };
double coords[36];
rval = moab.get_coords( combined, 12, coords );CHECK_ERR( rval );
for( int i = 0; i < 36; ++i )
{
CHECK_REAL_EQUAL( hex_corners[i], coords[i], 1e-12 );
}
}
| void test_pack_higher_order | ( | ) |
Test pack/unpack of higher-order elements
Definition at line 580 of file pcomm_unit.cpp.
References moab::Range::back(), CHECK_EQUAL, CHECK_ERR, CHECK_REAL_EQUAL, check_sizes(), moab::Range::clear(), moab::Core::create_element(), moab::Core::create_vertex(), ErrorCode, moab::Range::front(), moab::Core::get_connectivity(), moab::Core::get_coords(), moab::Core::get_entities_by_type(), moab::Range::insert(), MBTET, MBTRI, pack_unpack_noremoteh(), moab::Range::size(), and swap().
Referenced by main().
{
Core moab;
ErrorCode rval;
Range elems;
// define coordinates for a pyramid decomposed
// into two 10-node tets
const size_t num_vert = 14;
const double coords[3 * num_vert] = { -1, -1, 0, 0, -1, 0, 1, -1, 0, 1, 0, 0, 1, 1,
0, 0, 1, 0, -1, 1, 0, -1, 0, 0, 0, 0, 0, 0,
0, 1, -.5, -.5, .5, .5, -.5, .5, .5, .5, .5, -.5, .5, .5 };
EntityHandle verts[num_vert];
for( size_t i = 0; i < num_vert; ++i )
{
rval = moab.create_vertex( coords + 3 * i, verts[i] );CHECK_ERR( rval );
}
// define two tets
const size_t num_tet = 2;
EntityHandle tet_conn[2][10] = {
{ verts[0], verts[4], verts[9], verts[2], verts[8], verts[12], verts[10], verts[1], verts[3], verts[11] },
{ verts[0], verts[9], verts[4], verts[6], verts[10], verts[12], verts[8], verts[7], verts[13], verts[5] } };
EntityHandle tets[num_tet];
rval = moab.create_element( MBTET, tet_conn[0], 10, tets[0] );CHECK_ERR( rval );
elems.insert( tets[0] );
rval = moab.create_element( MBTET, tet_conn[1], 10, tets[1] );CHECK_ERR( rval );
elems.insert( tets[1] );
// define interior tri face
const size_t num_tri = 1;
EntityHandle tri_conn[6] = { verts[0], verts[4], verts[9], verts[8], verts[12], verts[10] };
EntityHandle tri;
rval = moab.create_element( MBTRI, tri_conn, 6, tri );CHECK_ERR( rval );
elems.insert( tri );
// pack and unpack mesh
pack_unpack_noremoteh( moab, elems );
// check_counts
check_sizes( moab, num_vert, 0, num_tri, 0, 0, num_tet, 0, 0, 0, 0, 0 );
// get connectivity for two tets and a tri
Range range;
const EntityHandle *conn1, *conn2, *conn3;
int len1, len2, len3;
rval = moab.get_entities_by_type( 0, MBTET, range );CHECK_ERR( rval );
CHECK_EQUAL( num_tet, range.size() );
rval = moab.get_connectivity( range.front(), conn1, len1, false );CHECK_ERR( rval );
CHECK_EQUAL( 10, len1 );
rval = moab.get_connectivity( range.back(), conn2, len2, false );CHECK_ERR( rval );
CHECK_EQUAL( 10, len2 );
range.clear();
rval = moab.get_entities_by_type( 0, MBTRI, range );CHECK_ERR( rval );
CHECK_EQUAL( num_tri, range.size() );
rval = moab.get_connectivity( range.front(), conn3, len3, false );CHECK_ERR( rval );
CHECK_EQUAL( 6, len3 );
// The first face of one of the tets is in the
// same order as the tri.
if( conn3[1] != conn1[1] ) std::swap( conn1, conn2 );
// check consistant connectivity for face shared by tets
CHECK_EQUAL( conn1[0], conn2[0] );
CHECK_EQUAL( conn1[1], conn2[2] );
CHECK_EQUAL( conn1[2], conn2[1] );
CHECK_EQUAL( conn1[4], conn2[6] );
CHECK_EQUAL( conn1[5], conn2[5] );
CHECK_EQUAL( conn1[6], conn2[4] );
// check connsistant connectivity between tet face and tri
CHECK_EQUAL( conn1[0], conn3[0] );
CHECK_EQUAL( conn1[1], conn3[1] );
CHECK_EQUAL( conn1[2], conn3[2] );
CHECK_EQUAL( conn1[4], conn3[3] );
CHECK_EQUAL( conn1[5], conn3[4] );
CHECK_EQUAL( conn1[6], conn3[5] );
// order vertex handles corresponding to original coordinate list
const EntityHandle combined[num_vert] = { conn1[0], conn1[7], conn1[3], conn1[8], conn1[1], conn2[9], conn2[3],
conn2[7], conn1[4], conn1[2], conn1[6], conn1[9], conn1[5], conn2[8] };
double coords2[3 * num_vert];
rval = moab.get_coords( combined, num_vert, coords2 );CHECK_ERR( rval );
// check vertex coordinates
for( int i = 0; i < 36; ++i )
{
CHECK_REAL_EQUAL( coords[i], coords2[i], 1e-12 );
}
}
| void test_pack_poly | ( | ) |
Test pack/unpack of polygons & polyhedra
Definition at line 671 of file pcomm_unit.cpp.
References moab::Range::begin(), CHECK, CHECK_EQUAL, CHECK_ERR, CHECK_REAL_EQUAL, check_sizes(), moab::Range::clear(), moab::Core::create_element(), moab::Core::create_vertex(), moab::Range::end(), ErrorCode, moab::Range::front(), moab::Core::get_connectivity(), moab::Core::get_coords(), moab::Core::get_entities_by_type(), moab::Range::insert(), MBPOLYGON, MBPOLYHEDRON, MBTRI, pack_unpack_noremoteh(), and moab::Range::size().
Referenced by main().
{
Core moab;
ErrorCode rval;
Range elems;
// define a pyramid w/ a octagonal base
const double a = 0.5;
const double b = 1 + sqrt( 2.0 ) / 2.0;
const size_t num_vert = 9;
const double coords[3 * num_vert] = { -a, -b, 0, a, -b, 0, b, -a, 0, b, a, 0, a, b,
0, -a, b, 0, -b, a, 0, -b, -a, 0, 0, 0, 1 };
EntityHandle verts[num_vert];
for( size_t i = 0; i < num_vert; ++i )
{
rval = moab.create_vertex( coords + 3 * i, verts[i] );CHECK_ERR( rval );
}
// define octagonal base
const size_t num_polygon = 1;
EntityHandle octagon;
rval = moab.create_element( MBPOLYGON, verts, 8, octagon );CHECK_ERR( rval );
// define triangular sides
const size_t num_tri = num_vert - 1;
EntityHandle tri[num_tri];
for( size_t i = 0; i < num_tri; ++i )
{
const EntityHandle conn[3] = { verts[i], verts[( i + 1 ) % num_tri], verts[num_tri] };
rval = moab.create_element( MBTRI, conn, 3, tri[i] );CHECK_ERR( rval );
}
// define the octagon-based pyramid
const size_t num_polyhedron = 1;
EntityHandle polyhedron;
EntityHandle all_faces[num_vert];
all_faces[0] = octagon;
std::copy( tri, tri + num_tri, all_faces + 1 );
rval = moab.create_element( MBPOLYHEDRON, all_faces, num_vert, polyhedron );CHECK_ERR( rval );
// pack and unpack the mesh
elems.clear();
elems.insert( polyhedron );
elems.insert( octagon );
std::copy( tri, tri + num_tri, range_inserter( elems ) );
pack_unpack_noremoteh( moab, elems );
// check counts
check_sizes( moab, num_vert, 0, num_tri, 0, num_polygon, 0, 0, 0, 0, 0, num_polyhedron );
// get entities
Range range;
rval = moab.get_entities_by_type( 0, MBPOLYHEDRON, range );CHECK_ERR( rval );
CHECK_EQUAL( num_polyhedron, range.size() );
polyhedron = range.front();
range.clear();
rval = moab.get_entities_by_type( 0, MBPOLYGON, range );CHECK_ERR( rval );
CHECK_EQUAL( num_polygon, range.size() );
octagon = range.front();
range.clear();
rval = moab.get_entities_by_type( 0, MBTRI, range );CHECK_ERR( rval );
CHECK_EQUAL( num_tri, range.size() );
// check coords of octagon vertices
const EntityHandle* oct_conn;
int eight = 0;
rval = moab.get_connectivity( octagon, oct_conn, eight );CHECK_ERR( rval );
CHECK_EQUAL( 8, eight );
double oct_coords[3 * 8];
rval = moab.get_coords( oct_conn, 8, oct_coords );CHECK_ERR( rval );
for( int i = 0; i < 3 * 8; ++i )
{
CHECK_REAL_EQUAL( coords[i], oct_coords[i], 1e-12 );
}
// check faces of polyhedron
std::vector< EntityHandle > volconn;
rval = moab.get_connectivity( &polyhedron, 1, volconn );CHECK_ERR( rval );
CHECK_EQUAL( num_tri + 1, volconn.size() );
CHECK_EQUAL( volconn[0], octagon );
for( Range::iterator i = range.begin(); i != range.end(); ++i )
{
CHECK( std::find( volconn.begin(), volconn.end(), *i ) != volconn.end() );
}
}
| void test_pack_set_contents | ( | ) |
Test pack/unpack of entity sets including implicit packing of set contents
Definition at line 883 of file pcomm_unit.cpp.
References moab::Core::add_entities(), CHECK_EQUAL, CHECK_ERR, moab::Range::clear(), moab::Core::create_meshset(), create_simple_grid(), moab::Core::delete_entities(), moab::Range::empty(), entities, ErrorCode, moab::Range::front(), moab::Core::get_entities_by_type(), moab::Range::insert(), MBENTITYSET, MBVERTEX, MESHSET_SET, pack_unpack_noremoteh(), and moab::Range::size().
Referenced by main().
{
Core moab;
ErrorCode rval;
create_simple_grid( moab, 3 );
// delete any existing sets
Range sets;
rval = moab.get_entities_by_type( 0, MBENTITYSET, sets );CHECK_ERR( rval );
if( !sets.empty() )
{
rval = moab.delete_entities( sets );CHECK_ERR( rval );
}
// get all vertices
Range vertices;
rval = moab.get_entities_by_type( 0, MBVERTEX, vertices );CHECK_ERR( rval );
CHECK_EQUAL( 27, (int)vertices.size() );
// create meshset containing vertices
EntityHandle set;
rval = moab.create_meshset( MESHSET_SET, set );CHECK_ERR( rval );
rval = moab.add_entities( set, vertices );CHECK_ERR( rval );
// pack and unpack range containing only set handle.
// Will fail unless we also pass in set contents explicitly
Range entities( vertices );
entities.insert( set );
pack_unpack_noremoteh( moab, entities );
// expect single set in mesh
entities.clear();
rval = moab.get_entities_by_type( 0, MBENTITYSET, entities );CHECK_ERR( rval );
CHECK_EQUAL( 1, (int)entities.size() );
set = entities.front();
// expect 27 vertices in mesh
vertices.clear();
rval = moab.get_entities_by_type( 0, MBVERTEX, vertices );CHECK_ERR( rval );
CHECK_EQUAL( 27, (int)vertices.size() );
// expect set to contain all 27 vertices
vertices.clear();
rval = moab.get_entities_by_type( set, MBVERTEX, vertices );CHECK_ERR( rval );
CHECK_EQUAL( 27, (int)vertices.size() );
}
| void test_pack_set_parent_child | ( | ) |
Test pack/unpack of set parent/child relations
Definition at line 1008 of file pcomm_unit.cpp.
References moab::Core::add_child_meshset(), moab::Core::add_parent_child(), moab::Core::add_parent_meshset(), moab::Range::begin(), CHECK, CHECK_EQUAL, CHECK_ERR, children, moab::Range::clear(), moab::Core::create_meshset(), moab::Core::delete_entities(), moab::Range::empty(), moab::Range::end(), ErrorCode, moab::Core::get_child_meshsets(), moab::Core::get_entities_by_type(), moab::Core::get_parent_meshsets(), moab::Range::insert(), MB_SUCCESS, MBENTITYSET, MESHSET_SET, moab::Core::num_child_meshsets(), moab::Core::num_parent_meshsets(), pack_unpack_noremoteh(), and moab::Range::size().
Referenced by main().
{
Core moab;
ErrorCode rval;
// delete any existing sets
Range sets;
rval = moab.get_entities_by_type( 0, MBENTITYSET, sets );CHECK_ERR( rval );
if( !sets.empty() )
{
rval = moab.delete_entities( sets );CHECK_ERR( rval );
}
// create three sets such that set3 has a child link to
// set1, set2 has a parent link to set1, and such that set3 and
// set2 are parent and child, respectively.
EntityHandle set1, set2, set3;
sets.clear();
rval = moab.create_meshset( MESHSET_ORDERED, set1 );CHECK_ERR( rval );
sets.insert( set1 );
rval = moab.create_meshset( MESHSET_SET, set2 );CHECK_ERR( rval );
sets.insert( set2 );
rval = moab.create_meshset( MESHSET_SET, set3 );CHECK_ERR( rval );
sets.insert( set3 );
rval = moab.add_child_meshset( set3, set1 );CHECK_ERR( rval );
rval = moab.add_parent_meshset( set2, set1 );CHECK_ERR( rval );
rval = moab.add_parent_child( set3, set2 );CHECK_ERR( rval );
// make sure everything is valid before doing the pack/unpack
int count;
rval = moab.num_child_meshsets( set1, &count );
CHECK( MB_SUCCESS == rval && 0 == count );
rval = moab.num_child_meshsets( set2, &count );
CHECK( MB_SUCCESS == rval && 0 == count );
rval = moab.num_child_meshsets( set3, &count );
CHECK( MB_SUCCESS == rval && 2 == count );
rval = moab.num_parent_meshsets( set1, &count );
CHECK( MB_SUCCESS == rval && 0 == count );
rval = moab.num_parent_meshsets( set2, &count );
CHECK( MB_SUCCESS == rval && 2 == count );
rval = moab.num_parent_meshsets( set3, &count );
CHECK( MB_SUCCESS == rval && 0 == count );
// pack and unpack
pack_unpack_noremoteh( moab, sets );
// get sets
sets.clear();
rval = moab.get_entities_by_type( 0, MBENTITYSET, sets );CHECK_ERR( rval );
CHECK_EQUAL( 3, (int)sets.size() );
// look for a set with two child links (set3)
set1 = set2 = set3 = 0;
for( Range::iterator i = sets.begin(); i != sets.end(); ++i )
{
int mcount;
rval = moab.num_child_meshsets( *i, &mcount );CHECK_ERR( rval );
if( mcount == 2 )
{
set3 = *i;
break;
}
}
CHECK( 0 != set3 );
// check set relations
std::vector< EntityHandle > parents, children;
rval = moab.get_child_meshsets( set3, children );CHECK_ERR( rval );
CHECK_EQUAL( (std::vector< EntityHandle >::size_type)2, children.size() );
set1 = children[0];
set2 = children[1];
rval = moab.get_parent_meshsets( set1, parents );CHECK_ERR( rval );
CHECK( parents.empty() );
children.clear();
rval = moab.get_parent_meshsets( set1, children );CHECK_ERR( rval );
CHECK( children.empty() );
rval = moab.get_parent_meshsets( set2, parents );CHECK_ERR( rval );
CHECK_EQUAL( (std::vector< EntityHandle >::size_type)2, parents.size() );
CHECK_EQUAL( set1, parents[0] );
CHECK_EQUAL( set3, parents[1] );
}
| void test_pack_sets_of_sets | ( | ) |
Test pack/unpack of entity sets containing entity sets
Definition at line 929 of file pcomm_unit.cpp.
References moab::Core::add_entities(), moab::Range::back(), moab::Range::begin(), CHECK, CHECK_EQUAL, CHECK_ERR, moab::Range::clear(), moab::Core::create_meshset(), moab::Core::delete_entities(), moab::Range::empty(), moab::Range::end(), ErrorCode, moab::Range::front(), moab::Core::get_entities_by_type(), moab::Core::get_number_entities_by_type(), moab::Range::insert(), MBENTITYSET, MESHSET_SET, pack_unpack_noremoteh(), and moab::Range::size().
Referenced by main().
{
Core moab;
ErrorCode rval;
// delete any existing sets
Range sets;
rval = moab.get_entities_by_type( 0, MBENTITYSET, sets );CHECK_ERR( rval );
if( !sets.empty() )
{
rval = moab.delete_entities( sets );CHECK_ERR( rval );
}
// create three sets such that set2 contains set1, and set3 contains
// both set1 and set2
EntityHandle set1, set2, set3;
sets.clear();
rval = moab.create_meshset( MESHSET_ORDERED, set1 );CHECK_ERR( rval );
sets.insert( set1 );
rval = moab.create_meshset( MESHSET_SET, set2 );CHECK_ERR( rval );
rval = moab.add_entities( set2, sets );CHECK_ERR( rval );
sets.insert( set2 );
rval = moab.create_meshset( MESHSET_SET, set3 );CHECK_ERR( rval );
rval = moab.add_entities( set3, sets );CHECK_ERR( rval );
sets.insert( set3 );
// pack and unpack
pack_unpack_noremoteh( moab, sets );
// get sets
sets.clear();
rval = moab.get_entities_by_type( 0, MBENTITYSET, sets );CHECK_ERR( rval );
CHECK_EQUAL( 3, (int)sets.size() );
// figure out which is which
set1 = set2 = set3 = 0;
for( Range::iterator i = sets.begin(); i != sets.end(); ++i )
{
int count;
rval = moab.get_number_entities_by_type( *i, MBENTITYSET, count );CHECK_ERR( rval );
CHECK( count >= 0 && count <= 2 );
switch( count )
{
case 0:
CHECK_EQUAL( (EntityHandle)0, set1 );
set1 = *i;
break;
case 1:
CHECK_EQUAL( (EntityHandle)0, set2 );
set2 = *i;
break;
case 2:
CHECK_EQUAL( (EntityHandle)0, set3 );
set3 = *i;
break;
}
}
// check that set2 contains set1
sets.clear();
rval = moab.get_entities_by_type( set2, MBENTITYSET, sets );CHECK_ERR( rval );
CHECK_EQUAL( 1, (int)sets.size() );
CHECK_EQUAL( set1, sets.front() );
// check that set3 contains set1 and set2
sets.clear();
rval = moab.get_entities_by_type( set3, MBENTITYSET, sets );CHECK_ERR( rval );
CHECK_EQUAL( 2, (int)sets.size() );
if( sets.front() == set1 )
{
CHECK_EQUAL( set2, sets.back() );
}
else
{
CHECK_EQUAL( set2, sets.front() );
CHECK_EQUAL( set1, sets.back() );
}
}
| void test_pack_sets_simple | ( | ) |
Test pack/unpack of entity sets
Definition at line 759 of file pcomm_unit.cpp.
References moab::Core::add_entities(), moab::Range::begin(), CHECK_EQUAL, CHECK_ERR, moab::Range::clear(), moab::Core::create_meshset(), create_simple_grid(), moab::Core::delete_entities(), moab::Range::empty(), moab::Range::end(), entities, ErrorCode, moab::Range::front(), moab::Core::get_entities_by_handle(), moab::Core::get_entities_by_type(), moab::Core::get_meshset_options(), moab::Core::get_number_entities_by_type(), moab::Range::insert(), MBENTITYSET, MBHEX, MBVERTEX, moab::Range::merge(), MESHSET_SET, MESHSET_TRACK_OWNER, moab::Range::num_of_type(), pack_unpack_noremoteh(), and moab::Range::size().
Referenced by main().
{
Core moab;
ErrorCode rval;
create_simple_grid( moab, 3 );
// delete any existing sets
Range sets;
rval = moab.get_entities_by_type( 0, MBENTITYSET, sets );CHECK_ERR( rval );
if( !sets.empty() )
{
rval = moab.delete_entities( sets );CHECK_ERR( rval );
}
// get all entities
Range entities;
rval = moab.get_entities_by_handle( 0, entities );CHECK_ERR( rval );
// expect 8 elements and 27 vertices
CHECK_EQUAL( 35, (int)entities.size() );
CHECK_EQUAL( 27u, entities.num_of_type( MBVERTEX ) );
CHECK_EQUAL( 8u, entities.num_of_type( MBHEX ) );
// create five sets:
// 1) one with all the elements and vertices,
// 2) one with half of the elements,
// 3) one with the other half of the elements,
// 4) one with a single vertex,
// 5) an empty set,
EntityHandle all_set, half1_set, half2_set, vertex_set, empty_set;
const unsigned int all_opt = MESHSET_SET | MESHSET_TRACK_OWNER, half1_opt = MESHSET_SET, half2_opt = MESHSET_SET,
vertex_opt = MESHSET_ORDERED, empty_opt = MESHSET_ORDERED | MESHSET_TRACK_OWNER;
rval = moab.create_meshset( all_opt, all_set );CHECK_ERR( rval );
entities.insert( all_set );
rval = moab.create_meshset( half1_opt, half1_set );CHECK_ERR( rval );
entities.insert( half1_set );
rval = moab.create_meshset( half2_opt, half2_set );CHECK_ERR( rval );
entities.insert( half2_set );
rval = moab.create_meshset( vertex_opt, vertex_set );CHECK_ERR( rval );
entities.insert( vertex_set );
rval = moab.create_meshset( empty_opt, empty_set );CHECK_ERR( rval );
entities.insert( empty_set );
Range elems, verts, half;
rval = moab.get_entities_by_type( 0, MBVERTEX, verts );CHECK_ERR( rval );
rval = moab.get_entities_by_type( 0, MBHEX, elems );CHECK_ERR( rval );
rval = moab.add_entities( all_set, verts );CHECK_ERR( rval );
rval = moab.add_entities( all_set, elems );CHECK_ERR( rval );
half.merge( elems.begin(), elems.begin() += elems.size() / 2 );
rval = moab.add_entities( half1_set, half );CHECK_ERR( rval );
half.clear();
half.merge( elems.begin() += elems.size() / 2, elems.end() );
rval = moab.add_entities( half2_set, half );CHECK_ERR( rval );
EntityHandle vert = verts.front();
rval = moab.add_entities( vertex_set, &vert, 1 );CHECK_ERR( rval );
// do pack and unpack
pack_unpack_noremoteh( moab, entities );
// get entities by type
verts.clear();
rval = moab.get_entities_by_type( 0, MBVERTEX, verts );CHECK_ERR( rval );
elems.clear();
rval = moab.get_entities_by_type( 0, MBHEX, elems );CHECK_ERR( rval );
sets.clear();
rval = moab.get_entities_by_type( 0, MBENTITYSET, sets );CHECK_ERR( rval );
CHECK_EQUAL( 27, (int)verts.size() );
CHECK_EQUAL( 8, (int)elems.size() );
CHECK_EQUAL( 5, (int)sets.size() );
// guess which is which
empty_set = all_set = vertex_set = half1_set = half2_set = 0;
for( Range::iterator i = sets.begin(); i != sets.end(); ++i )
{
int num_vtx, num_elem;
rval = moab.get_number_entities_by_type( *i, MBVERTEX, num_vtx );CHECK_ERR( rval );
rval = moab.get_number_entities_by_type( *i, MBHEX, num_elem );CHECK_ERR( rval );
if( num_vtx == 0 )
{
if( num_elem == 0 )
{
CHECK_EQUAL( (EntityHandle)0, empty_set );
empty_set = *i;
}
else if( !half1_set )
{
half1_set = *i;
}
else
{
CHECK_EQUAL( (EntityHandle)0, half2_set );
half2_set = *i;
}
}
else if( num_vtx == 1 )
{
CHECK_EQUAL( 0, num_elem );
CHECK_EQUAL( (EntityHandle)0, vertex_set );
vertex_set = *i;
}
else
{
CHECK_EQUAL( 8, num_elem );
CHECK_EQUAL( 27, num_vtx );
CHECK_EQUAL( (EntityHandle)0, all_set );
all_set = *i;
}
}
// check set options
unsigned opt;
rval = moab.get_meshset_options( all_set, opt );CHECK_ERR( rval );
CHECK_EQUAL( all_opt, opt );
rval = moab.get_meshset_options( half1_set, opt );CHECK_ERR( rval );
CHECK_EQUAL( half1_opt, opt );
rval = moab.get_meshset_options( half2_set, opt );CHECK_ERR( rval );
CHECK_EQUAL( half2_opt, opt );
rval = moab.get_meshset_options( vertex_set, opt );CHECK_ERR( rval );
CHECK_EQUAL( vertex_opt, opt );
rval = moab.get_meshset_options( empty_set, opt );CHECK_ERR( rval );
CHECK_EQUAL( empty_opt, opt );
}
| void test_pack_shared_entities_2d | ( | ) |
Test pack/unpack of shared entities in 2d
Definition at line 1595 of file pcomm_unit.cpp.
References CHECK_ERR, create_shared_grid_2d(), ErrorCode, moab::ParallelComm::exchange_ghost_cells(), MPI_COMM_WORLD, and moab::ParallelComm::set_rank().
Referenced by main().
{
Core moab[4];
ParallelComm* pc[4];
for( unsigned int i = 0; i < 4; i++ )
{
pc[i] = new ParallelComm( &moab[i], MPI_COMM_WORLD );
pc[i]->set_rank( i );
}
Range verts[4], quads[4];
ErrorCode rval = create_shared_grid_2d( pc, verts, quads );CHECK_ERR( rval );
// moab[0].list_entities(0,1);
// exchange interface cells
rval = ParallelComm::exchange_ghost_cells( pc, 4, -1, -1, 0, 0, true );CHECK_ERR( rval );
// now 1 layer of hex ghosts
rval = ParallelComm::exchange_ghost_cells( pc, 4, 2, 0, 1, 0, true );CHECK_ERR( rval );
// now 1 layer of hex ghosts w/ edges
rval = ParallelComm::exchange_ghost_cells( pc, 4, 2, 0, 1, 1, true );CHECK_ERR( rval );
for( unsigned int i = 0; i < 4; i++ )
delete pc[i];
}
| void test_pack_shared_entities_3d | ( | ) |
Test pack/unpack of shared entities in 3d
Definition at line 1623 of file pcomm_unit.cpp.
References CHECK_ERR, create_shared_grid_3d(), ErrorCode, moab::ParallelComm::exchange_ghost_cells(), moab::ParallelComm::get_buffers(), MPI_COMM_WORLD, and moab::ParallelComm::set_rank().
Referenced by main().
{
Core moab[4];
ParallelComm* pc[4];
for( unsigned int i = 0; i < 4; i++ )
{
pc[i] = new ParallelComm( &moab[i], MPI_COMM_WORLD );
pc[i]->set_rank( i );
for( unsigned int j = 0; j < 4; j++ )
{
if( j == i )
continue;
else
pc[i]->get_buffers( j );
}
}
Range verts[4], hexes[4];
ErrorCode rval = create_shared_grid_3d( pc, verts, hexes );CHECK_ERR( rval );
// exchange interface cells
rval = ParallelComm::exchange_ghost_cells( pc, 4, -1, -1, 0, 0, true );CHECK_ERR( rval );
// now 1 layer of hex ghosts
rval = ParallelComm::exchange_ghost_cells( pc, 4, 3, 0, 1, 0, true );CHECK_ERR( rval );
// now 1 layer of hex ghosts w/ faces, edges
rval = ParallelComm::exchange_ghost_cells( pc, 4, 3, 0, 1, 3, true );CHECK_ERR( rval );
for( unsigned int i = 0; i < 4; i++ )
delete pc[i];
}
| void test_pack_tag_data_default_value | ( | ) |
Definition at line 1224 of file pcomm_unit.cpp.
References moab::Range::begin(), CHECK, CHECK_EQUAL, CHECK_ERR, moab::Range::clear(), moab::Interface::create_meshset(), create_simple_grid(), moab::Range::empty(), moab::Range::end(), ErrorCode, moab::Range::front(), moab::Interface::get_entities_by_type(), mb, MB_TAG_DENSE, MB_TAG_EXCL, MB_TYPE_OPAQUE, MBENTITYSET, MBHEX, MBVERTEX, MESHSET_SET, pack_unpack_noremoteh(), size, moab::Interface::tag_get_data(), moab::Interface::tag_get_data_type(), moab::Interface::tag_get_default_value(), moab::Interface::tag_get_handle(), moab::Interface::tag_get_length(), moab::Interface::tag_get_type(), moab::Interface::tag_set_data(), and TagType.
Referenced by main().
{
Range::iterator i;
int size;
DataType type;
TagType storage;
Core moab;
Interface& mb = moab;
ErrorCode rval;
create_simple_grid( mb, 3 );
Range verts, elems, sets;
rval = mb.get_entities_by_type( 0, MBVERTEX, verts );CHECK_ERR( rval );
CHECK( !verts.empty() );
rval = mb.get_entities_by_type( 0, MBHEX, elems );CHECK_ERR( rval );
CHECK( !elems.empty() );
// Define a dense, opaque tag with a default value of "DEFLT".
// Set the tag on one element, one vertex,and one set to "TAGGD".
const char dense_5_opaque_tag_name[] =
"This is intentionally a very long tag name in an attempt to test for an arbitrary "
"limitations on tag name length.";
Tag dense_5_opaque_tag;
rval = mb.tag_get_handle( dense_5_opaque_tag_name, 5, MB_TYPE_OPAQUE, dense_5_opaque_tag,
MB_TAG_DENSE | MB_TAG_EXCL, "DEFLT" );CHECK_ERR( rval );
EntityHandle set;
rval = mb.create_meshset( MESHSET_SET, set );CHECK_ERR( rval );
const EntityHandle handles[3] = { verts.front(), elems.front(), set };
const char data[] = "TAGGDTAGGDTAGGD";
rval = mb.tag_set_data( dense_5_opaque_tag, handles, 3, data );CHECK_ERR( rval );
// pack and unpack
Range ents;
pack_unpack_noremoteh( moab, ents );
elems.clear();
verts.clear();
sets.clear();
rval = mb.get_entities_by_type( 0, MBVERTEX, verts );CHECK_ERR( rval );
rval = mb.get_entities_by_type( 0, MBHEX, elems );CHECK_ERR( rval );
rval = mb.get_entities_by_type( 0, MBENTITYSET, sets );CHECK_ERR( rval );
// check tag meta for dense_5_opaque_tag
rval = mb.tag_get_handle( dense_5_opaque_tag_name, 5, MB_TYPE_OPAQUE, dense_5_opaque_tag );CHECK_ERR( rval );
rval = mb.tag_get_length( dense_5_opaque_tag, size );CHECK_ERR( rval );
CHECK_EQUAL( 5, size );
rval = mb.tag_get_type( dense_5_opaque_tag, storage );CHECK_ERR( rval );
CHECK_EQUAL( MB_TAG_DENSE, storage );
rval = mb.tag_get_data_type( dense_5_opaque_tag, type );CHECK_ERR( rval );
CHECK_EQUAL( MB_TYPE_OPAQUE, type );
char odata[6];
odata[5] = '\0';
rval = mb.tag_get_default_value( dense_5_opaque_tag, odata );CHECK_ERR( rval );
CHECK_EQUAL( std::string( "DEFLT" ), std::string( odata ) );
// count number of each type with tag set to non-default
int vcount = 0, ecount = 0, scount = 0;
for( i = verts.begin(); i != verts.end(); ++i )
{
rval = mb.tag_get_data( dense_5_opaque_tag, &*i, 1, odata );CHECK_ERR( rval );
if( strcmp( odata, "DEFLT" ) != 0 )
{
CHECK_EQUAL( std::string( "TAGGD" ), std::string( odata ) );
++vcount;
}
}
CHECK_EQUAL( 1, vcount );
for( i = elems.begin(); i != elems.end(); ++i )
{
rval = mb.tag_get_data( dense_5_opaque_tag, &*i, 1, odata );CHECK_ERR( rval );
if( strcmp( odata, "DEFLT" ) != 0 )
{
CHECK_EQUAL( "TAGGD", odata );
++ecount;
}
}
CHECK_EQUAL( 1, ecount );
for( i = sets.begin(); i != sets.end(); ++i )
{
rval = mb.tag_get_data( dense_5_opaque_tag, &*i, 1, odata );CHECK_ERR( rval );
if( strcmp( odata, "DEFLT" ) != 0 )
{
CHECK_EQUAL( "TAGGD", odata );
++scount;
}
}
CHECK_EQUAL( 1, scount );
}
| void test_pack_tag_data_dense | ( | ) |
Definition at line 1164 of file pcomm_unit.cpp.
References moab::Range::begin(), CHECK, CHECK_EQUAL, CHECK_ERR, CHECK_REAL_EQUAL, moab::Range::clear(), create_simple_grid(), moab::Range::empty(), moab::Range::end(), ErrorCode, moab::Interface::get_coords(), moab::Interface::get_entities_by_type(), mb, MB_ENTITY_NOT_FOUND, MB_TAG_DENSE, MB_TAG_EXCL, MB_TYPE_DOUBLE, MBVERTEX, pack_unpack_noremoteh(), size, moab::Interface::tag_get_data(), moab::Interface::tag_get_data_type(), moab::Interface::tag_get_default_value(), moab::Interface::tag_get_handle(), moab::Interface::tag_get_length(), moab::Interface::tag_get_type(), moab::Interface::tag_set_data(), and TagType.
Referenced by main().
{
Range::iterator i;
int size;
DataType type;
TagType storage;
Core moab;
Interface& mb = moab;
ErrorCode rval;
create_simple_grid( mb, 3 );
Range verts;
rval = mb.get_entities_by_type( 0, MBVERTEX, verts );CHECK_ERR( rval );
CHECK( !verts.empty() );
// Define a dense tag containing a single double-precision floating
// point value. For each vertex, store the distance from the origin
// in this tag.
const char dense_1_double_tag_name[] = "test tag 2";
Tag dense_1_double_tag;
rval =
mb.tag_get_handle( dense_1_double_tag_name, 1, MB_TYPE_DOUBLE, dense_1_double_tag, MB_TAG_DENSE | MB_TAG_EXCL );CHECK_ERR( rval );
for( i = verts.begin(); i != verts.end(); ++i )
{
double coords[3];
rval = mb.get_coords( &*i, 1, coords );CHECK_ERR( rval );
double val = sqrt( coords[0] * coords[0] + coords[1] * coords[1] + coords[2] * coords[2] );
rval = mb.tag_set_data( dense_1_double_tag, &*i, 1, &val );CHECK_ERR( rval );
}
// pack and unpack
Range ents;
pack_unpack_noremoteh( moab, ents );
verts.clear();
rval = mb.get_entities_by_type( 0, MBVERTEX, verts );CHECK_ERR( rval );
// check tag meta for dense_1_double_tag
rval = mb.tag_get_handle( dense_1_double_tag_name, 1, MB_TYPE_DOUBLE, dense_1_double_tag );CHECK_ERR( rval );
rval = mb.tag_get_length( dense_1_double_tag, size );CHECK_ERR( rval );
CHECK_EQUAL( 1, size );
rval = mb.tag_get_type( dense_1_double_tag, storage );CHECK_ERR( rval );
CHECK_EQUAL( MB_TAG_DENSE, storage );
rval = mb.tag_get_data_type( dense_1_double_tag, type );CHECK_ERR( rval );
CHECK_EQUAL( MB_TYPE_DOUBLE, type );
double dval;
rval = mb.tag_get_default_value( dense_1_double_tag, &dval );
CHECK_EQUAL( MB_ENTITY_NOT_FOUND, rval );
// check tag data for dense_1_double_tag
for( i = verts.begin(); i != verts.end(); ++i )
{
double coords[3];
rval = mb.get_coords( &*i, 1, coords );CHECK_ERR( rval );
const double expected = sqrt( coords[0] * coords[0] + coords[1] * coords[1] + coords[2] * coords[2] );
rval = mb.tag_get_data( dense_1_double_tag, &*i, 1, &dval );CHECK_ERR( rval );
CHECK_REAL_EQUAL( expected, dval, 1e-6 );
}
}
| void test_pack_tag_data_sparse | ( | ) |
Test pack/unpack tag values
Definition at line 1091 of file pcomm_unit.cpp.
References moab::Range::begin(), CHECK, CHECK_EQUAL, CHECK_ERR, moab::Range::clear(), create_simple_grid(), moab::Range::empty(), moab::Range::end(), ErrorCode, moab::Interface::get_connectivity(), moab::Interface::get_coords(), moab::Interface::get_entities_by_type(), moab::Interface::get_entities_by_type_and_tag(), mb, MB_ENTITY_NOT_FOUND, MB_TAG_CREAT, MB_TAG_SPARSE, MB_TYPE_INTEGER, MBHEX, pack_unpack_noremoteh(), size, moab::Range::size(), moab::Interface::tag_get_data(), moab::Interface::tag_get_data_type(), moab::Interface::tag_get_default_value(), moab::Interface::tag_get_handle(), moab::Interface::tag_get_length(), moab::Interface::tag_get_type(), moab::Interface::tag_set_data(), and TagType.
Referenced by main().
{
Range::iterator i;
int size;
DataType type;
TagType storage;
Core moab;
Interface& mb = moab;
ErrorCode rval;
create_simple_grid( mb, 3 );
Range elems;
rval = mb.get_entities_by_type( 0, MBHEX, elems );CHECK_ERR( rval );
CHECK( !elems.empty() );
// Define a sparse tag containing two integers. For every other element
// in the mesh, set the tag value to the floor of the x and y
// coordinates of the first vertex in the elements connectivity list.
const char sparse_2_int_tag_name[] = "test tag 1";
Tag sparse_2_int_tag;
rval =
mb.tag_get_handle( sparse_2_int_tag_name, 2, MB_TYPE_INTEGER, sparse_2_int_tag, MB_TAG_SPARSE | MB_TAG_CREAT );CHECK_ERR( rval );
bool skip = false;
for( i = elems.begin(); i != elems.end(); ++i, skip = !skip )
{
if( skip ) continue;
const EntityHandle* conn = 0;
int len;
rval = mb.get_connectivity( *i, conn, len );CHECK_ERR( rval );
double coords[3];
rval = mb.get_coords( conn, 1, coords );CHECK_ERR( rval );
const int data[2] = { (int)coords[0], (int)coords[1] };
rval = mb.tag_set_data( sparse_2_int_tag, &*i, 1, data );CHECK_ERR( rval );
}
// pack and unpack
Range ents;
pack_unpack_noremoteh( moab, ents );
elems.clear();
rval = mb.get_entities_by_type( 0, MBHEX, elems );CHECK_ERR( rval );
// check tag meta for sparse_2_int_tag
rval = mb.tag_get_handle( sparse_2_int_tag_name, 2, MB_TYPE_INTEGER, sparse_2_int_tag );CHECK_ERR( rval );
rval = mb.tag_get_length( sparse_2_int_tag, size );CHECK_ERR( rval );
CHECK_EQUAL( 2, size );
rval = mb.tag_get_type( sparse_2_int_tag, storage );CHECK_ERR( rval );
CHECK_EQUAL( MB_TAG_SPARSE, storage );
rval = mb.tag_get_data_type( sparse_2_int_tag, type );CHECK_ERR( rval );
CHECK_EQUAL( MB_TYPE_INTEGER, type );
int intdata[2];
rval = mb.tag_get_default_value( sparse_2_int_tag, intdata );
CHECK_EQUAL( MB_ENTITY_NOT_FOUND, rval );
// check tag data for sparse_2_int_tag
Range tagged;
rval = mb.get_entities_by_type_and_tag( 0, MBHEX, &sparse_2_int_tag, 0, 1, tagged );CHECK_ERR( rval );
CHECK_EQUAL( ( elems.size() + 1 ) / 2, tagged.size() );
for( i = tagged.begin(); i != tagged.end(); ++i )
{
rval = mb.tag_get_data( sparse_2_int_tag, &*i, 1, intdata );CHECK_ERR( rval );
const EntityHandle* conn = 0;
int len;
rval = mb.get_connectivity( *i, conn, len );CHECK_ERR( rval );
double coords[3];
rval = mb.get_coords( conn, 1, coords );CHECK_ERR( rval );
CHECK_EQUAL( (int)( coords[0] ), intdata[0] );
CHECK_EQUAL( (int)( coords[1] ), intdata[1] );
}
}
| void test_pack_tag_handle_data | ( | ) |
Test pack/unpack tag values
Definition at line 1466 of file pcomm_unit.cpp.
References moab::Range::begin(), CHECK, CHECK_EQUAL, CHECK_ERR, moab::Range::clear(), create_simple_grid(), moab::Range::empty(), moab::Range::end(), ErrorCode, moab::Interface::get_connectivity(), moab::Interface::get_entities_by_type(), MB_TAG_EXCL, MB_TAG_SPARSE, MB_TYPE_HANDLE, MBHEX, MBVERTEX, pack_unpack_noremoteh(), size, moab::Interface::tag_get_data(), moab::Interface::tag_get_data_type(), moab::Interface::tag_get_default_value(), moab::Interface::tag_get_handle(), moab::Interface::tag_get_length(), moab::Interface::tag_get_type(), moab::Interface::tag_set_data(), and TagType.
Referenced by main().
{
Range::iterator i;
Core moab;
Interface& mb = moab;
ErrorCode rval;
// create some mesh
create_simple_grid( mb, 3 );
Range verts, elems;
rval = mb.get_entities_by_type( 0, MBVERTEX, verts );CHECK_ERR( rval );
CHECK( !verts.empty() );
rval = mb.get_entities_by_type( 0, MBHEX, elems );CHECK_ERR( rval );
CHECK( !elems.empty() );
// create a tag
const char* tag_name = "entity tag";
EntityHandle default_val[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
Tag tag;
rval = mb.tag_get_handle( tag_name, 8, MB_TYPE_HANDLE, tag, MB_TAG_SPARSE | MB_TAG_EXCL, &default_val );CHECK_ERR( rval );
// Store on each vertex the handles of the adjacent hexes, padded
// with NULL handles.
EntityHandle tagdata[8 * 8];
for( i = elems.begin(); i != elems.end(); ++i )
{
const EntityHandle* conn;
int len;
rval = mb.get_connectivity( *i, conn, len );CHECK_ERR( rval );
CHECK_EQUAL( 8, len );
rval = mb.tag_get_data( tag, conn, len, tagdata );CHECK_ERR( rval );
for( int j = 0; j < 8; ++j )
{
EntityHandle* vdata = tagdata + 8 * j;
int idx = 0;
while( vdata[idx] )
{
++idx;
CHECK( idx < 8 );
}
vdata[idx] = *i;
}
rval = mb.tag_set_data( tag, conn, len, tagdata );CHECK_ERR( rval );
}
// pack and unpack
pack_unpack_noremoteh( moab );
verts.clear();
rval = mb.get_entities_by_type( 0, MBVERTEX, verts );CHECK_ERR( rval );
// check tag meta
rval = mb.tag_get_handle( tag_name, 8, MB_TYPE_HANDLE, tag );CHECK_ERR( rval );
int size;
rval = mb.tag_get_length( tag, size );CHECK_ERR( rval );
CHECK_EQUAL( 8, size );
TagType storage;
rval = mb.tag_get_type( tag, storage );CHECK_ERR( rval );
CHECK_EQUAL( MB_TAG_SPARSE, storage );
DataType type;
rval = mb.tag_get_data_type( tag, type );CHECK_ERR( rval );
CHECK_EQUAL( MB_TYPE_HANDLE, type );
rval = mb.tag_get_default_value( tag, tagdata );CHECK_ERR( rval );
for( int j = 0; j < 8; ++j )
{
CHECK_EQUAL( (EntityHandle)0, tagdata[j] );
}
// check tag values
for( i = elems.begin(); i != elems.end(); ++i )
{
const EntityHandle* conn;
int len;
rval = mb.get_connectivity( *i, conn, len );CHECK_ERR( rval );
CHECK_EQUAL( 8, len );
rval = mb.tag_get_data( tag, conn, len, tagdata );CHECK_ERR( rval );
for( int j = 0; j < 8; ++j )
{
EntityHandle* vdata = tagdata + 8 * j;
int idx = 0;
while( vdata[idx] != *i )
{
++idx;
CHECK( idx < 8 );
}
vdata[idx] = 0;
}
rval = mb.tag_set_data( tag, conn, len, tagdata );CHECK_ERR( rval );
}
for( i = verts.begin(); i != verts.end(); ++i )
{
rval = mb.tag_get_data( tag, &*i, 1, tagdata );CHECK_ERR( rval );
for( int j = 0; j < 8; ++j )
{
CHECK_EQUAL( (EntityHandle)0, tagdata[j] );
}
}
}
| void test_pack_variable_length_tag | ( | ) |
Test pack/unpack of variable length tag values
Definition at line 1381 of file pcomm_unit.cpp.
References moab::Range::begin(), CHECK, CHECK_EQUAL, CHECK_ERR, moab::Range::clear(), create_simple_grid(), moab::Range::empty(), moab::Range::end(), ErrorCode, moab::Interface::get_coords(), moab::Interface::get_entities_by_type(), mb, MB_TAG_DENSE, MB_TAG_EXCL, MB_TAG_VARLEN, MB_TYPE_INTEGER, MB_VARIABLE_DATA_LENGTH, MBVERTEX, pack_unpack_noremoteh(), size, moab::Interface::tag_get_by_ptr(), moab::Interface::tag_get_data_type(), moab::Interface::tag_get_default_value(), moab::Interface::tag_get_handle(), moab::Interface::tag_get_length(), moab::Interface::tag_get_type(), moab::Interface::tag_set_by_ptr(), and TagType.
Referenced by main().
{
Range::iterator i;
Core moab;
Interface& mb = moab;
ErrorCode rval;
// create some mesh
create_simple_grid( mb, 3 );
Range verts;
rval = mb.get_entities_by_type( 0, MBVERTEX, verts );CHECK_ERR( rval );
CHECK( !verts.empty() );
// create a variable-length tag
const char* tag_name = "var_int_tag";
const int defval_size = 5;
const int default_val[defval_size] = { 0xBEEF, 0xFEED, 0xDEAD, 0xBAD, 0xBEAD };
Tag tag;
rval = mb.tag_get_handle( tag_name, defval_size, MB_TYPE_INTEGER, tag, MB_TAG_DENSE | MB_TAG_VARLEN | MB_TAG_EXCL,
default_val );CHECK_ERR( rval );
// for each vertex, store in the tag an integer between 1 and 3,
// followed by the floor of the cooresponding number of vertex
// coordinates, beginning with x.
for( i = verts.begin(); i != verts.end(); ++i )
{
double coords[3];
rval = mb.get_coords( &*i, 1, coords );CHECK_ERR( rval );
const int num_coord = 1 + *i % 3;
const int data_size = num_coord + 1;
const int data[4] = { num_coord, (int)coords[0], (int)coords[1], (int)coords[2] };
const void* data_ptrs[1] = { data };
rval = mb.tag_set_by_ptr( tag, &*i, 1, data_ptrs, &data_size );CHECK_ERR( rval );
}
// pack and unpack
pack_unpack_noremoteh( moab );
verts.clear();
rval = mb.get_entities_by_type( 0, MBVERTEX, verts );CHECK_ERR( rval );
// check tag meta
rval = mb.tag_get_handle( tag_name, 0, MB_TYPE_INTEGER, tag );CHECK_ERR( rval );
int size;
rval = mb.tag_get_length( tag, size );
CHECK_EQUAL( MB_VARIABLE_DATA_LENGTH, rval );
TagType storage;
rval = mb.tag_get_type( tag, storage );CHECK_ERR( rval );
CHECK_EQUAL( MB_TAG_DENSE, storage );
DataType type;
rval = mb.tag_get_data_type( tag, type );CHECK_ERR( rval );
CHECK_EQUAL( MB_TYPE_INTEGER, type );
const void* defval_ptr;
rval = mb.tag_get_default_value( tag, defval_ptr, size );CHECK_ERR( rval );
CHECK_EQUAL( defval_size, size );
const int* defval_arr = reinterpret_cast< const int* >( defval_ptr );
for( int j = 0; j < size; ++j )
CHECK_EQUAL( default_val[j], defval_arr[j] );
// check tag values
for( i = verts.begin(); i != verts.end(); ++i )
{
double coords[3];
rval = mb.get_coords( &*i, 1, coords );CHECK_ERR( rval );
int tsize;
const void* valptr;
rval = mb.tag_get_by_ptr( tag, &*i, 1, &valptr, &tsize );CHECK_ERR( rval );
CHECK( tsize > 1 );
CHECK( tsize <= 4 );
const int* valarr = reinterpret_cast< const int* >( valptr );
CHECK( valarr[0] >= 1 );
CHECK( valarr[0] <= 3 );
for( int j = 0; j < valarr[0]; ++j )
{
CHECK_EQUAL( (int)( coords[j] ), valarr[j + 1] );
}
}
}
| void test_pack_vertices | ( | ) |
Test pack/unpack of vertices
Definition at line 418 of file pcomm_unit.cpp.
References CHECK, CHECK_EQUAL, CHECK_ERR, moab::Core::create_vertices(), ErrorCode, moab::Core::get_coords(), pack_unpack_noremoteh(), and moab::Range::size().
Referenced by main().
{
Core moab;
ErrorCode rval;
Range verts;
const size_t num_verts = 4;
const double coords[3 * num_verts] = { -0.5, -1. / 3, 0.0, 0.5, -1. / 3, 0.0,
0.0, 2. / 3, 0.0, 0.0, 0.0, 0.745356 };
rval = moab.create_vertices( coords, num_verts, verts );CHECK_ERR( rval );
pack_unpack_noremoteh( moab, verts );
CHECK_EQUAL( num_verts, verts.size() );
double coords2[3 * num_verts];
rval = moab.get_coords( verts, coords2 );CHECK_ERR( rval );
std::vector< bool > seen( num_verts, false );
for( unsigned i = 0; i < num_verts; ++i )
{
unsigned j;
for( j = 0; j < num_verts; ++j )
if( coords[3 * j] == coords2[3 * i] && coords[3 * j + 1] == coords2[3 * i + 1] &&
coords[3 * j + 2] == coords2[3 * i + 2] )
break;
CHECK( j < num_verts );
CHECK( !seen[j] );
seen[j] = true;
}
}
| int rank = 0 |
Definition at line 57 of file pcomm_unit.cpp.