12 #define IS_BUILDING_MB
21 #define STRINGIFY_( X ) #X
22 #define STRINGIFY( X ) STRINGIFY_( X )
23 #ifdef MOAB_HAVE_UNORDERED_MAP
24 #include STRINGIFY( MOAB_HAVE_UNORDERED_MAP )
35 #define MIN( a, b ) ( ( a ) < ( b ) ? ( a ) : ( b ) )
38 #define snprintf( A, B, C, D ) _snprintf( ( A ), ( B ), ( C ), ( D ) )
42 #define HANDLE_ARRAY_PTR( array ) ( reinterpret_cast< EntityHandle* >( array ) )
43 #define CONST_HANDLE_ARRAY_PTR( array ) reinterpret_cast< const EntityHandle* >( array )
44 #define TAG_HANDLE( handle ) reinterpret_cast< Tag >( handle )
45 #define CONST_TAG_HANDLE( handle ) static_cast< const Tag >( handle )
46 #define ENTITY_HANDLE( handle ) reinterpret_cast< EntityHandle >( handle )
47 #define CONST_ENTITY_HANDLE( handle ) reinterpret_cast< const EntityHandle >( handle )
48 #define CAST_TO_VOID( ptr ) ( reinterpret_cast< void* >( ptr ) )
119 static inline void ht_content_type(
const std::vector< EntityHandle >& h,
bool& saw_ent,
bool& saw_set,
bool& saw_root )
121 std::vector< EntityHandle >::const_iterator i;
122 for( i = h.begin(); i != h.end(); ++i )
147 std::vector< EntityHandle > data(
size );
150 bool saw_set =
false, saw_ent =
false, saw_root =
false;
176 if( saw_set && !saw_ent )
178 else if( !saw_set && saw_ent )
180 else if( saw_root && !saw_ent )
190 for( r = 0; r < tags.size(); ++r )
201 for(
size_t i = 0; i < 16; ++i )
208 for(
size_t i = 0; i < 16; i += 5 )
222 if( instance == NULL )
225 *error_type =
MBIMESHI->lastErrorType;
230 if( instance == NULL )
232 strcpy( descr,
"iMesh_getDescription: Invalid instance" );
236 unsigned int len =
MIN( strlen(
MBIMESHI->lastErrorDescription ),
static_cast< unsigned int >( descr_len ) );
237 strncpy( descr,
MBIMESHI->lastErrorDescription, len );
244 std::string tmp_options =
filter_options( options, options + options_len );
255 int retval = MPI_Initialized( &flag );
256 if( MPI_SUCCESS != retval || !flag )
262 retval = MPI_Init( &argc, &argv );
263 assert( MPI_SUCCESS == retval );
265 *mbi =
new( std::nothrow )
MBiMesh( NULL );
269 *mbi =
new( std::nothrow )
MBiMesh( NULL );
276 *mbi =
new( std::nothrow )
MBiMesh( NULL );
302 std::string
filename( name, name_len );
305 std::string opts =
filter_options( options, options + options_len );
308 ErrorCode result =
MOABI->get_entities_by_handle( 0, orig_ents );
CHKERR( result,
"Internal error" );
314 file_set =
reinterpret_cast< const EntityHandle*
>( ptr );
317 result =
MOABI->load_file(
filename.c_str(), file_set, opts.c_str() );
319 CHKERR( result,
"iMesh_load:ERROR loading a mesh." );
325 result =
MOABI->get_entities_by_handle( 0, set_ents );
CHKERR( result,
"" );
328 set_ents =
subtract( set_ents, sets );
329 set_ents =
subtract( set_ents, orig_ents );
344 std::string
filename( name, name_len );
346 std::string opts =
filter_options( options, options + options_len );
351 CHKERR( result,
"iMesh_save:ERROR saving a mesh." );
364 MOABI->get_dimension( *geom_dim );
370 ErrorCode rval =
MOABI->set_dimension( geom_dim );
CHKERR( rval,
"iMesh_setGeometricDimension: failed" );
382 int** adjacency_table,
383 int* adjacency_table_allocated,
384 int* adjacency_table_size,
391 memcpy( *adjacency_table,
MBIMESHI->AdjTable, 16 *
sizeof(
int ) );
401 if( 16 != adj_table_size )
409 memcpy(
MBIMESHI->AdjTable, adj_table, 16 *
sizeof(
int ) );
416 const int entity_type,
425 const int entity_topology,
435 *handles_invalidated = 0;
441 const int entity_type,
442 const int entity_topology,
444 int* entity_handles_allocated,
445 int* entity_handles_size,
448 iMesh_getEntitiesRec( instance, entity_set_handle, entity_type, entity_topology,
false, entity_handles,
449 entity_handles_allocated, entity_handles_size, err );
454 const int vertex_handles_size,
457 int* coords_allocated,
462 MOABI->get_dimension( geom_dim );
478 std::vector< double > dum_coords( 3 * vertex_handles_size );
481 for(
int i = 0; i < vertex_handles_size; i++ )
483 for(
int j = 0; j < geom_dim; j++ )
484 ( *coords )[geom_dim * i + j] = dum_coords[3 * i + j];
490 std::vector< double > dum_coords( 3 * vertex_handles_size );
491 result =
MOABI->get_coords(
CONST_HANDLE_ARRAY_PTR( vertex_handles ), vertex_handles_size, &dum_coords[0] );
CHKERR( result,
"iMesh_getVtxArrCoords: problem getting vertex coords" );
493 for(
int i = 0; i < vertex_handles_size; i++ )
495 for(
int j = 0; j < geom_dim; j++ )
496 ( *coords )[i + vertex_handles_size * j] = dum_coords[3 * i + j];
509 const int requested_entity_type,
510 const int requested_entity_topology,
511 const int requested_array_size,
517 requested_array_size, resilient,
false, entArr_iterator, err );
526 int* entity_handles_allocated,
527 int* entity_handles_size,
534 *entity_handles_size );
535 *has_data = ( *entity_handles_size != 0 );
546 ErrorCode result = entArr_iterator->
reset(
MOABI );
CHKERR( result,
"Re-query of iterator data for iMesh_resetEntArrIter failed" );
554 delete entArr_iterator;
560 const int entity_handles_size,
562 int* topology_allocated,
569 for(
int i = 0; i < entity_handles_size; i++ )
572 *topology_size = entity_handles_size;
579 const int entity_handles_size,
581 int* etype_allocated,
588 for(
int i = 0; i < entity_handles_size; i++ )
591 *etype_size = entity_handles_size;
598 const int entity_handles_size,
599 const int entity_type_requested,
601 int* adjacentEntityHandles_allocated,
602 int* adjacentEntityHandles_size,
604 int* offset_allocated,
613 const EntityHandle*
const entity_end = entity_iter + entity_handles_size;
614 int* off_iter = *offset;
617 std::vector< EntityHandle > conn_storage;
618 std::vector< EntityHandle > adj_ents;
624 const bool allocated_array = !*adjacentEntityHandles_allocated || !*adjacentEntityHandles;
625 if( allocated_array )
632 array =
reinterpret_cast< EntityHandle*
>( *adjacentEntityHandles );
633 array_alloc = *adjacentEntityHandles_allocated;
636 for( ; entity_iter != entity_end; ++entity_iter )
638 *off_iter = prev_off;
644 result =
MOABI->get_connectivity( *entity_iter, connect, num_connect,
false, &conn_storage );
647 if( allocated_array ) free( array );
648 ERROR( result,
"iMesh_getEntArrAdj: trouble getting adjacency list." );
657 result =
MOABI->get_adjacencies( entity_iter, 1,
dim,
false, adj_ents, Interface::UNION );
660 if( allocated_array ) free( array );
661 ERROR( result,
"iMesh_getEntArrAdj: trouble getting adjacency list." );
664 connect = &adj_ents[0];
665 num_connect = adj_ents.size();
669 if( CN::Dimension(
TYPE_FROM_HANDLE( *entity_iter ) ) == entity_type_requested )
continue;
671 result =
MOABI->get_adjacencies( entity_iter, 1, entity_type_requested,
false, adj_ents );
674 if( allocated_array ) free( array );
675 ERROR( result,
"iMesh_getEntArrAdj: trouble getting adjacency list." );
677 connect = &adj_ents[0];
678 num_connect = adj_ents.size();
681 if( prev_off + num_connect <= array_alloc )
683 std::copy( connect, connect + num_connect, array + prev_off );
685 else if( allocated_array )
694 array_alloc = entity_handles_size * num_connect;
696 array_alloc = std::max( array_alloc * 2, prev_off + num_connect );
705 std::copy( connect, connect + num_connect, array + prev_off );
711 prev_off += num_connect;
713 *off_iter = prev_off;
714 *adjacentEntityHandles_size = prev_off;
716 if( *adjacentEntityHandles_size > array_alloc )
718 if( allocated_array ) free( array );
721 else if( allocated_array )
724 *adjacentEntityHandles_allocated = array_alloc;
733 int entity_handles_size,
734 int bridge_entity_type,
735 int requested_entity_type,
737 int* adj_entity_handles_allocated,
738 int* adj_entity_handles_size,
740 int* offset_allocated,
752 const EntityHandle*
const entity_end = entity_iter + entity_handles_size;
753 int* off_iter = *offset;
756 std::vector< EntityHandle > all_adj_ents;
761 if(
iBase_ALL_TYPES != bridge_entity_type ) min_bridge = max_bridge = bridge_entity_type;
762 if(
iBase_ALL_TYPES != requested_entity_type ) min_req = max_req = requested_entity_type;
764 for( ; entity_iter != entity_end; ++entity_iter )
766 *off_iter = prev_off;
771 for(
int bridge = min_bridge; bridge <= max_bridge; ++bridge )
773 if( source == bridge )
continue;
774 for(
int requested = min_req; requested <= max_req; ++requested )
776 if( bridge == requested )
continue;
777 result = mtu.
get_bridge_adjacencies( *entity_iter, bridge, requested, adj_ents );
CHKERR( result,
"iMesh_getEntArr2ndAdj: trouble getting adjacency list." );
781 std::copy( adj_ents.
begin(), adj_ents.
end(), std::back_inserter( all_adj_ents ) );
782 prev_off += adj_ents.
size();
784 *off_iter = prev_off;
787 memcpy( *adj_entity_handles, &all_adj_ents[0],
sizeof(
EntityHandle ) * all_adj_ents.size() );
792 if(
iBase_ALL_TYPES != bridge_entity_type && bridge_entity_type == requested_entity_type )
794 "requested entity types must be different." );
801 int entity_type_requestor,
802 int entity_topology_requestor,
803 int entity_type_requested,
805 int* entity_handles_allocated,
806 int* entity_handles_size,
808 int* adj_entity_handles_allocated,
809 int* adj_entity_handles_size,
810 int** adj_entity_indices,
811 int* adj_entity_indices_allocated,
812 int* adj_entity_indices_size,
814 int* offset_allocated,
818 const int allocated_entity_handles = ( *entity_handles_allocated == 0 );
819 const int allocated_indices = ( *adj_entity_indices_allocated == 0 );
820 const int allocated_offset = ( *offset_allocated == 0 );
823 iMesh_getEntities( instance, entity_set_handle, entity_type_requestor, entity_topology_requestor, entity_handles,
824 entity_handles_allocated, entity_handles_size, err );
829 int size = 0, alloc = 0;
830 iMesh_getEntArrAdj( instance, *entity_handles, *entity_handles_size, entity_type_requested, &all_adj_handles,
831 &alloc, &
size, offset, offset_allocated, offset_size, err );
834 if( allocated_entity_handles )
836 free( *entity_handles );
838 *entity_handles_allocated = 0;
844 *adj_entity_indices_size =
size;
845 if( allocated_indices )
848 if( !*adj_entity_indices )
851 *adj_entity_indices_allocated =
size;
853 else if( *adj_entity_indices_allocated <
size )
859 free( all_adj_handles );
860 if( allocated_entity_handles )
862 free( *entity_handles );
864 *entity_handles_allocated = 0;
866 if( allocated_offset )
870 *offset_allocated = 0;
881 if( *adj_entity_handles_allocated >=
size )
883 unique_adj = *adj_entity_handles;
889 std::copy( all_adj_handles, all_adj_handles +
size, unique_adj );
890 std::sort( unique_adj, unique_adj +
size );
891 *adj_entity_handles_size = std::unique( unique_adj, unique_adj +
size ) - unique_adj;
896 if( *adj_entity_handles != unique_adj )
898 if( !*adj_entity_handles_allocated )
900 *adj_entity_handles =
902 if( !*adj_entity_handles )
905 *adj_entity_handles_allocated = *adj_entity_handles_size;
907 else if( *adj_entity_handles_allocated < *adj_entity_handles_size )
912 free( all_adj_handles );
913 if( allocated_entity_handles )
915 free( *entity_handles );
917 *entity_handles_allocated = 0;
919 if( allocated_offset )
923 *offset_allocated = 0;
925 if( allocated_indices )
927 free( *adj_entity_indices );
928 *adj_entity_indices = 0;
929 *adj_entity_indices_allocated = 0;
934 std::copy( unique_adj, unique_adj + *adj_entity_handles_size, *adj_entity_handles );
936 unique_adj = *adj_entity_handles;
940 for(
int i = 0; i < *adj_entity_indices_size; ++i )
941 ( *adj_entity_indices )[i] =
942 std::lower_bound( unique_adj, unique_adj + *adj_entity_handles_size, all_adj_handles[i] ) - unique_adj;
943 free( all_adj_handles );
956 result =
MOABI->create_meshset( MESHSET_ORDERED, meshset );
960 CHKERR( result,
"iMesh_createEntSet: ERROR creating a entityset instance" );
972 ErrorCode result =
MOABI->delete_entities( &set, 1 );
CHKERR( result,
"iMesh_destroyEntSet: couldn't delete the set." );
982 unsigned int options;
984 if( options & MESHSET_ORDERED )
999 MOABI->num_contained_meshsets(
ENTITY_HANDLE( entity_set_handle ), num_sets, std::max( 0, num_hops + 1 ) );
CHKERR( rval,
"iMesh_entitysetGetNumberEntitySets:ERROR getting number of entitysets." );
1008 int* contained_entset_handles_allocated,
1009 int* contained_entset_handles_size,
1012 std::vector< EntityHandle > sets;
1014 MOABI->get_contained_meshsets(
ENTITY_HANDLE( entity_set_handle ), sets, std::max( num_hops + 1, 0 ) );
CHKERR( rval,
"iMesh_entitysetGetEntitySets: problem getting entities by type." );
1017 std::copy( sets.begin(), sets.end(), (
EntityHandle*)*contained_entset_handles );
1018 *contained_entset_handles_size = sets.size();
1024 int entity_handles_size,
1031 CHKERR( result,
"iMesh_addEntArrToSet:ERROR adding entities in EntitySet." );
1045 int entity_handles_size,
1053 CHKERR( result,
"iMesh_rmvEntArrFromSet:ERROR removing entities in EntitySet." );
1070 if( !entity_set_to_add || !entity_set_handle )
1076 CHKERR( result,
"iMesh_addEntSet:ERROR adding entitysets." );
1085 if( !entity_set_to_remove || !entity_set_handle )
1091 CHKERR( result,
"iMesh_rmvEntSet:ERROR removing entitysets in EntitySet." );
1101 int junk1 = 1, junk2 = 1;
1102 iMesh_isEntArrContained( instance, containing_entity_set, &contained_entity, 1, &is_contained, &junk1, &junk2,
1109 int num_entity_handles,
1111 int* is_contained_allocated,
1112 int* is_contained_size,
1118 *is_contained_size = num_entity_handles;
1120 if( containing_set )
1122 for(
int i = 0; i < num_entity_handles; ++i )
1125 ( *is_contained )[i] =
MOABI->contains_entities( set, &h, 1 );
1130 std::fill( *is_contained, ( *is_contained ) + num_entity_handles, 1 );
1178 std::vector< EntityHandle >
children;
1227 int* entity_set_handles_allocated,
1228 int* entity_set_handles_size,
1231 std::vector< EntityHandle >
children;
1250 int* entity_set_handles_allocated,
1251 int* entity_set_handles_size,
1254 std::vector< EntityHandle > parents;
1265 memcpy( ents, &parents[0], parents.size() *
sizeof(
EntityHandle ) );
1272 const int vertex_handles_size,
1273 const int storage_order,
1274 const double* new_coords,
1275 const int new_coords_size,
1281 MOABI->get_dimension( geom_dim );
1282 if( new_coords_size != geom_dim * vertex_handles_size )
1297 double dummy[3] = { 0, 0, 0 };
1298 for(
int i = 0; i < vertex_handles_size; i++ )
1300 for(
int j = 0; j < geom_dim; j++ )
1301 dummy[j] = new_coords[geom_dim * i + j];
1302 tmp_result =
MOABI->set_coords( &verts[i], 1, dummy );
1303 if(
MB_SUCCESS != tmp_result ) result = tmp_result;
1310 double dummy[3] = { 0, 0, 0 };
1311 for(
int i = 0; i < vertex_handles_size; i++ )
1313 for(
int j = 0; j < geom_dim; j++ )
1314 dummy[j] = new_coords[i + vertex_handles_size * j];
1315 tmp_result =
MOABI->set_coords( &verts[i], 1, dummy );
1316 if(
MB_SUCCESS != tmp_result ) result = tmp_result;
1320 CHKERR( result,
"iMesh_setVtxArrCoords: problem setting coordinates." );
1326 const int num_verts,
1327 const int storage_order,
1328 const double* new_coords,
1329 const int new_coords_size,
1331 int* new_vertex_handles_allocated,
1332 int* new_vertex_handles_size,
1336 MOABI->get_dimension( geom_dim );
1337 if( new_coords_size != geom_dim * num_verts )
1352 for(
int i = 0; i < num_verts; i++ )
1354 ErrorCode result =
MOABI->create_vertex( &new_coords[3 * i], new_verts[i] );
CHKERR( result,
"iMesh_createVtxArr: couldn't create vertex." );
1359 double tmp[3] = { 0, 0, 0 };
1360 for(
int i = 0; i < num_verts; i++ )
1362 for(
int j = 0; j < geom_dim; j++ )
1363 tmp[j] = new_coords[geom_dim * i + j];
1364 ErrorCode result =
MOABI->create_vertex( tmp, new_verts[i] );
CHKERR( result,
"iMesh_createVtxArr: couldn't create vertex." );
1370 double tmp[3] = { 0, 0, 0 };
1371 for(
int i = 0; i < num_verts; i++ )
1373 for(
int j = 0; j < geom_dim; j++ )
1374 tmp[j] = new_coords[j * num_verts + i];
1376 ErrorCode result =
MOABI->create_vertex( tmp, new_verts[i] );
CHKERR( result,
"iMesh_createVtxArr: couldn't create vertex." );
1385 const int new_entity_topology,
1387 const int lower_order_entity_handles_size,
1389 int* new_entity_handles_allocated,
1390 int* new_entity_handles_size,
1392 int* status_allocated,
1402 int num_ents = 0, num_verts;
1406 num_verts = CN::VerticesPerEntity( this_type );
1407 num_ents = lower_order_entity_handles_size / num_verts;
1410 if( lower_order_entity_handles_size % CN::VerticesPerEntity( this_type ) != 0 )
1418 "function, use createVtxArr instead." );
1438 for(
int i = 0; i < num_ents; i++ )
1440 tmp_result =
MOABI->create_element( this_type, lower_ents, num_verts, new_ents[i] );
1444 result = tmp_result;
1449 lower_ents += num_verts;
1452 CHKERR( result,
"iMesh_createEntArr: couldn't create one of the entities." );
1454 *new_entity_handles_size = num_ents;
1455 *status_size = num_ents;
1470 const int entity_handles_size,
1473 if( 0 == entity_handles_size )
1484 const char* tag_name,
1489 const int tag_name_size )
1500 if(
false == forced )
1507 result =
MOABI->get_entities_by_type_and_tag( 0, this_type, &this_tag, NULL, 1, ents, Interface::UNION );
CHKERR( result,
"iMesh_destroyTag: problem finding tag." );
1511 " are still assigned this tag." );
1515 const void* data_ptr;
1517 result =
MOABI->tag_get_by_ptr( this_tag, &root, 1, &data_ptr );
1520 " is still assigned this tag." );
1538 static ::std::string name;
1541 strncpy( out_data, name.c_str(), out_data_len );
1583 int* tag_size_bytes,
1586 ErrorCode result =
MOABI->tag_get_bytes(
TAG_HANDLE( tag_handle ), *tag_size_bytes );
CHKERR( result,
"iMesh_getTagSize: problem getting size." );
1592 const char* tag_name,
1595 const int tag_name_len )
1597 std::string tmp_tagname( tag_name, tag_name_len );
1604 std::string msg(
"iMesh_getTagHandle: problem getting handle for tag named '" );
1605 msg += std::string( tag_name ) + std::string(
"'" );
1607 ERROR( result, msg.c_str() );
1619 int* tag_handles_allocated,
1620 int* tag_handles_size,
1623 std::vector< Tag > all_tags;
1625 ErrorCode result =
MOABI->tag_get_tags( all_tags );
CHKERR( result,
"iMesh_getAllIfaceTags failed." );
1631 memcpy( *tag_handles, &all_tags[0], all_tags.size() *
sizeof(
Tag ) );
1632 *tag_handles_size = all_tags.size();
1640 const void* tag_value,
1647 result =
MOABI->tag_set_data(
TAG_HANDLE( tag_handle ), &set, 1, tag_value );
CHKERR( result,
"iMesh_setEntSetData: error" );
1655 const int tag_value,
1665 const double tag_value,
1669 iMesh_setEntSetData( instance, entity_set, tag_handle, &tag_value,
sizeof(
double ), err );
1698 int* tag_value_allocated,
1699 int* tag_value_size,
1706 ErrorCode result =
MOABI->tag_get_bytes( tag, tag_size );
CHKERR( result,
"iMesh_getEntSetData: couldn't get tag size." );
1710 result =
MOABI->tag_get_data( tag, &eh, 1, *
static_cast< void**
>( tag_value ) );
1712 CHKERR( result,
"iMesh_getEntSetData didn't succeed." );
1724 void* tag_ptr = out_data;
1725 int dum_size =
sizeof( int );
1726 iMesh_getEntSetData( instance, entity_set, tag_handle, &tag_ptr, &dum_size, &dum_size, err );
1736 void* tag_ptr = out_data;
1737 int tag_size =
sizeof( double );
1738 iMesh_getEntSetData( instance, entity_set, tag_handle, &tag_ptr, &tag_size, &tag_size, err );
1748 void* tag_ptr = out_data;
1750 iMesh_getEntSetData( instance, entity_set, tag_handle, &tag_ptr, &tag_size, &tag_size, err );
1760 void* tag_ptr = out_data;
1762 iMesh_getEntSetData( instance, entity_set, tag_handle, &tag_ptr, &tag_size, &tag_size, err );
1768 int* tag_handles_allocated,
1769 int* tag_handles_size,
1773 std::vector< Tag > all_tags;
1775 ErrorCode result =
MOABI->tag_get_tags_on_entity( eh, all_tags );
CHKERR( result,
"iMesh_entitysetGetAllTagHandles failed." );
1781 memcpy( *tag_handles, &all_tags[0], all_tags.size() *
sizeof(
Tag ) );
1783 *tag_handles_size = (int)all_tags.size();
1810 const double xyz[3] = { x, y, z };
1812 MOABI->get_dimension( geom_dim );
1825 const double xyz[3] = { x, y, z };
1827 MOABI->get_dimension( geom_dim );
1832 const int new_entity_topology,
1834 const int lower_order_entity_handles_size,
1839 if( 0 == lower_order_entity_handles_size )
1849 lower_order_entity_handles_size, tmp_ent );
1858 set_ents.
insert( tmp_ent );
1866 *new_entity_handle = 0;
1868 ERROR( result,
"iMesh_createEnt: couldn't create entity" );
1881 const int entity_handles_size,
1884 int* tag_values_allocated,
1885 int* tag_values_size,
1899 char tagn[64], msg[256];
1901 snprintf( msg,
sizeof( msg ),
"iMesh_getArrData: couldn't get size for tag \"%s\"",
1902 nerr == 0 ? tagn :
"unknown" );
1903 ERROR( result, msg );
1908 result =
MOABI->tag_get_data( tag, ents, entity_handles_size, *
static_cast< void**
>( tag_values ) );
1912 std::string message(
"iMesh_getArrData: " );
1914 message +=
"tag not found";
1916 message +=
"failed";
1921 message +=
"for tag \"";
1925 ERROR( result, message.c_str() );
1934 const int entity_handles_size,
1937 int* tag_values_allocated,
1938 int* tag_values_size,
1942 *tag_values_allocated *=
sizeof( int );
1943 if( tag_values_size != tag_values_allocated ) *tag_values_size *=
sizeof( int );
1944 iMesh_getArrData( instance, entity_handles, entity_handles_size, tag_handle, tag_values, tag_values_allocated,
1945 tag_values_size, err );
1946 *tag_values_allocated /=
sizeof( int );
1947 if( tag_values_size != tag_values_allocated ) *tag_values_size /=
sizeof( int );
1952 const int entity_handles_size,
1954 double** tag_values,
1955 int* tag_values_allocated,
1956 int* tag_values_size,
1960 *tag_values_allocated *=
sizeof( double );
1961 if( tag_values_size != tag_values_allocated ) *tag_values_size *=
sizeof( double );
1962 iMesh_getArrData( instance, entity_handles, entity_handles_size, tag_handle, tag_values, tag_values_allocated,
1963 tag_values_size, err );
1964 *tag_values_allocated /=
sizeof( double );
1965 if( tag_values_size != tag_values_allocated ) *tag_values_size /=
sizeof( double );
1970 const int entity_handles_size,
1973 int* tag_value_allocated,
1974 int* tag_value_size,
1979 if( tag_value_size != tag_value_allocated ) *tag_value_size *=
sizeof(
iBase_EntityHandle );
1980 iMesh_getArrData( instance, entity_handles, entity_handles_size, tag_handle,
1981 reinterpret_cast< void**
>( tag_value ), tag_value_allocated, tag_value_size, err );
1983 if( tag_value_size != tag_value_allocated ) *tag_value_size /=
sizeof(
iBase_EntityHandle );
1988 const int entity_handles_size,
1991 int* tag_value_allocated,
1992 int* tag_value_size,
1997 if( tag_value_size != tag_value_allocated ) *tag_value_size *=
sizeof(
iBase_EntityHandle );
1998 iMesh_getArrData( instance, entity_handles, entity_handles_size, tag_handle,
1999 reinterpret_cast< void**
>( tag_value ), tag_value_allocated, tag_value_size, err );
2001 if( tag_value_size != tag_value_allocated ) *tag_value_size /=
sizeof(
iBase_EntityHandle );
2006 const int entity_handles_size,
2008 const void* tag_values,
2009 const int tag_values_size,
2021 if( tag_values_size != ( tag_size * entity_handles_size ) )
2027 entity_handles_size, tag_values );
CHKERR( result,
"iMesh_setArrData didn't succeed." );
2033 const int entity_handles_size,
2035 const int* tag_values,
2036 const int tag_values_size,
2040 iMesh_setArrData( instance, entity_handles, entity_handles_size, tag_handle,
2041 reinterpret_cast< const char*
>( tag_values ),
sizeof(
int ) * tag_values_size, err );
2046 const int entity_handles_size,
2048 const double* tag_values,
2049 const int tag_values_size,
2053 iMesh_setArrData( instance, entity_handles, entity_handles_size, tag_handle,
2054 reinterpret_cast< const char*
>( tag_values ),
sizeof(
double ) * tag_values_size, err );
2059 const int entity_handles_size,
2062 const int tag_values_size,
2066 iMesh_setArrData( instance, entity_handles, entity_handles_size, tag_handle,
2067 reinterpret_cast< const char*
>( tag_values ),
sizeof(
iBase_EntityHandle ) * tag_values_size,
2073 const int entity_handles_size,
2076 const int tag_values_size,
2080 iMesh_setArrData( instance, entity_handles, entity_handles_size, tag_handle,
2081 reinterpret_cast< const char*
>( tag_values ),
sizeof(
iBase_EntityHandle ) * tag_values_size,
2087 const int entity_handles_size,
2095 entity_handles_size );
2108 int* tag_value_allocated,
2109 int* tag_value_size,
2112 iMesh_getArrData( instance, &entity_handle, 1, tag_handle, tag_value, tag_value_allocated, tag_value_size, err );
2122 void* val_ptr = out_data;
2123 int val_size =
sizeof( int );
2124 iMesh_getArrData( instance, &entity_handle, 1, tag_handle, &val_ptr, &val_size, &val_size, err );
2134 void* val_ptr = out_data;
2135 int val_size =
sizeof( double );
2136 iMesh_getArrData( instance, &entity_handle, 1, tag_handle, &val_ptr, &val_size, &val_size, err );
2146 void* val_ptr = out_data;
2158 void* val_ptr = out_data;
2166 const void* tag_value,
2167 const int tag_value_size,
2170 iMesh_setArrData( instance, &entity_handle, 1, tag_handle, tag_value, tag_value_size, err );
2176 const int tag_value,
2180 iMesh_setArrData( instance, &entity_handle, 1, tag_handle,
reinterpret_cast< const char*
>( &tag_value ),
2181 sizeof(
int ), err );
2188 const double tag_value,
2192 iMesh_setArrData( instance, &entity_handle, 1, tag_handle,
reinterpret_cast< const char*
>( &tag_value ),
2193 sizeof(
double ), err );
2203 iMesh_setArrData( instance, &entity_handle, 1, tag_handle,
reinterpret_cast< const char*
>( &tag_value ),
2214 iMesh_setArrData( instance, &entity_handle, 1, tag_handle,
reinterpret_cast< const char*
>( &tag_value ),
2221 int* tag_handles_allocated,
2222 int* tag_handles_size,
2225 std::vector< Tag > all_tags;
2233 memcpy( *tag_handles, &all_tags[0], all_tags.size() *
sizeof(
Tag ) );
2234 *tag_handles_size = all_tags.size();
2249 const int requested_entity_type,
2250 const int requested_entity_topology,
2251 const int resilient,
2267 &eh_size, &eh_size, is_end, err );
2310 double xyz[3] = { 0 }, *tmp_xyz = xyz;
2324 const int entity_type_requested,
2326 int* adj_entity_handles_allocated,
2327 int* adj_entity_handles_size,
2331 int* offsets_ptr = offsets;
2332 int offset_size, offset_allocated = 2;
2334 iMesh_getEntArrAdj( instance, &entity_handle, 1, entity_type_requested, adj_entity_handles,
2335 adj_entity_handles_allocated, adj_entity_handles_size, &offsets_ptr, &offset_allocated,
2336 &offset_size, err );
2341 int order_adjacent_key,
2342 int requested_entity_type,
2344 int* adj_entities_allocated,
2345 int* adj_entities_size,
2349 int* offsets_ptr = offsets;
2350 int offset_size, offset_allocated = 2;
2352 iMesh_getEntArr2ndAdj( instance, &entity_handle, 1, order_adjacent_key, requested_entity_type, adj_entities,
2353 adj_entities_allocated, adj_entities_size, &offsets_ptr, &offset_allocated, &offset_size,
2366 int isList1 = 0, isList2 = 0;
2373 if( isList1 && isList2 )
2374 result =
MOABI->create_meshset( MESHSET_ORDERED, temp_set );
2378 if(
MB_SUCCESS != result )
ERROR( result,
"iMesh_subtract: couldn't create result set." );
2390 if(
MB_SUCCESS == result ) result =
MOABI->remove_entities( temp_set, &temp_set, 1 );
2393 result =
MOABI->unite_meshset( temp_set, set1 );
2395 if(
MB_SUCCESS == result ) result =
MOABI->subtract_meshset( temp_set, set2 );
2398 CHKERR( result,
"iMesh_subtract: ERROR subtract failed." );
2413 int isList1 = 0, isList2 = 0;
2420 if( isList1 && isList2 )
2421 result =
MOABI->create_meshset( MESHSET_ORDERED, temp_set );
2425 if(
MB_SUCCESS != result )
ERROR( result,
"iMesh_intersect: couldn't create result set." );
2427 if( !entity_set_1 && !entity_set_2 )
2434 if(
MB_SUCCESS == result ) result =
MOABI->remove_entities( temp_set, &temp_set, 1 );
2436 else if( !entity_set_1 )
2438 result =
MOABI->unite_meshset( temp_set, set2 );
2440 else if( !entity_set_2 )
2442 result =
MOABI->unite_meshset( temp_set, set1 );
2446 if( isList1 && isList2 )
2452 #ifdef MOAB_HAVE_UNORDERED_MAP
2453 typedef MOAB_UNORDERED_MAP_NS::unordered_map< EntityHandle, size_t > lookup_t;
2455 typedef std::map< EntityHandle, size_t > lookup_t;
2461 std::vector< EntityHandle > contents2;
2462 result =
MOABI->get_entities_by_handle( set2, contents2 );
CHKERR( result,
"iMesh_intersect: ERROR intersect failed." );
2464 for( std::vector< EntityHandle >::iterator i = contents2.begin(); i != contents2.end(); ++i )
2466 #ifdef MOAB_HAVE_UNORDERED_MAP
2467 lookup_t::iterator j = lookup.find( *i );
2469 lookup_t::iterator j = lookup.lower_bound( *i );
2471 if( j != lookup.end() && j->first == *i )
2474 lookup.insert( j, lookup_t::value_type( *i, 1 ) );
2480 std::vector< EntityHandle > contents1;
2481 result =
MOABI->get_entities_by_handle( set1, contents1 );
CHKERR( result,
"iMesh_intersect: ERROR intersect failed." );
2483 std::vector< EntityHandle >::iterator w = contents1.begin();
2484 for( std::vector< EntityHandle >::iterator i = contents1.begin(); i != contents1.end(); ++i )
2486 lookup_t::iterator j = lookup.find( *i );
2487 if( j != lookup.end() && j->second )
2495 result =
MOABI->add_entities( temp_set, &contents1[0], w - contents1.begin() );
2499 result =
MOABI->unite_meshset( temp_set, set1 );
2500 if(
MB_SUCCESS == result ) result =
MOABI->intersect_meshset( temp_set, set2 );
2504 CHKERR( result,
"iMesh_intersect: ERROR intersect failed." );
2519 int isList1 = 0, isList2 = 0;
2526 if( isList1 && isList2 )
2527 result =
MOABI->create_meshset( MESHSET_ORDERED, temp_set );
2531 if(
MB_SUCCESS != result )
ERROR( result,
"iMesh_unite: couldn't create result set." );
2533 if( entity_set_1 && entity_set_2 )
2535 result =
MOABI->unite_meshset( temp_set, set1 );
2536 if(
MB_SUCCESS == result ) result =
MOABI->unite_meshset( temp_set, set2 );
2545 if(
MB_SUCCESS == result ) result =
MOABI->remove_entities( temp_set, &temp_set, 1 );
2548 CHKERR( result,
"iMesh_unite: ERROR unite failed." );
2557 const int entity_type,
2558 const int entity_topology,
2559 const int recursive,
2561 int* entity_handles_allocated,
2562 int* entity_handles_size,
2568 bool use_top =
false;
2571 std::vector< EntityHandle > out_entities;
2580 if( entity_topology !=
iMesh_SEPTAHEDRON && entity_type != CN::Dimension( type ) )
2597 result =
MOABI->get_entities_by_type( handle, type, out_entities, recursive );
2600 result =
MOABI->get_entities_by_dimension( handle, entity_type, out_entities, recursive );
2602 result =
MOABI->get_entities_by_handle( handle, out_entities, recursive );
2604 CHKERR( result,
"iMesh_GetEntities:ERROR getting entities." );
2607 std::vector< EntityHandle >::iterator iter, end_iter;
2613 for( end_iter = iter; iter != out_entities.end(); ++iter )
2615 out_entities.erase( end_iter, out_entities.end() );
2618 int num_ents = out_entities.size();
2625 for( iter = out_entities.begin(); iter != out_entities.end(); ++iter )
2630 *entity_handles_size = k;
2652 const int entity_type,
2653 const int recursive,
2663 result =
MOABI->get_number_entities_by_handle(
ENTITY_HANDLE( entity_set_handle ), *num_type, recursive );
2669 *num_type -= num_sets;
2674 result =
MOABI->get_number_entities_by_dimension(
ENTITY_HANDLE( entity_set_handle ), entity_type, *num_type,
2678 CHKERR( result,
"iMesh_entitysetGetNumberEntityOfType: "
2679 "ERROR getting number of entities by type." );
2701 const int entity_topology,
2702 const int recursive,
2718 result =
MOABI->get_number_entities_by_handle(
ENTITY_HANDLE( entity_set_handle ), *num_topo, recursive );
2725 *num_topo -= num_sets;
2734 CHKERR( result,
"iMesh_entitysetGetNumberEntityOfTopology: ERROR getting "
2735 "number of entities by topology." );
2761 const int entity_type,
2762 const int entity_topology,
2764 const char*
const* tag_vals,
2765 const int num_tags_vals,
2766 const int recursive,
2768 int* entity_handles_allocated,
2769 int* entity_handles_size,
2775 bool use_top =
false;
2787 if( entity_topology !=
iMesh_SEPTAHEDRON && entity_type != CN::Dimension( type ) )
2805 MOABI->get_entities_by_type_and_tag( handle, type, (
Tag*)tag_handles, (
const void*
const*)tag_vals,
2812 for( EntityType tp = dimpair.first; tp <= dimpair.second; tp++ )
2816 MOABI->get_entities_by_type_and_tag( handle, type, (
Tag*)tag_handles, (
const void*
const*)tag_vals,
2819 result = tmp_result;
2821 out_entities.
merge( tmp_range );
2825 result =
MOABI->get_entities_by_type_and_tag( handle, type, (
Tag*)tag_handles, (
const void*
const*)tag_vals,
2828 CHKERR( result,
"iMesh_GetEntities:ERROR getting entities." );
2839 for( ; iter != end_iter &&
MOABI->type_from_handle( *iter ) !=
MBENTITYSET; ++iter )
2844 for( ; iter != end_iter; ++iter )
2850 *entity_handles_size = k;
2858 const char*
const* tag_vals,
2859 const int num_tags_vals,
2860 const int recursive,
2862 int* set_handles_allocated,
2863 int* set_handles_size,
2871 result =
MOABI->get_entities_by_type_and_tag( handle,
MBENTITYSET, (
Tag*)tag_handles, (
const void*
const*)tag_vals,
2904 if( !ri )
CHKERR( MB_FAILURE,
"Wrong type of iterator, need a range-based iterator for iMesh_tagIterate." );
2907 *
static_cast< void**
>( data ) );
CHKERR( result,
"Problem getting tag iterator." );
2917 int* verts_per_entity,
2926 if( !ri )
CHKERR( MB_FAILURE,
"Wrong type of iterator, need a range-based iterator for iMesh_connectIterate." );
2930 *verts_per_entity, *count );
CHKERR( result,
"Problem getting connect iterator." );
2938 double** xcoords_ptr,
2940 double** ycoords_ptr,
2942 double** zcoords_ptr,
2951 if( !ri )
CHKERR( MB_FAILURE,
"Wrong type of iterator, need a range-based iterator for iMesh_coordsIterate." );
2954 MOABI->coords_iterate( ri->
position(), ri->
end(), *xcoords_ptr, *ycoords_ptr, *zcoords_ptr, *count );
CHKERR( result,
"Problem getting coords iterator." );
2988 ErrorCode result = entArr_iterator->
step( step_length, tmp );
CHKERR( result,
"Problem stepping iterator." );
2998 const int requested_entity_type,
2999 const int requested_entity_topology,
3000 const int requested_array_size,
3001 const int resilient,
3002 const int recursive,
3016 if( requested_entity_topology !=
iMesh_SEPTAHEDRON && requested_entity_type != CN::Dimension( req_type ) )
3027 result =
MOABI->get_meshset_options(
ENTITY_HANDLE( entity_set_handle ), flags );
CHKERR( result,
"Invalid entity set handle" );
3029 if( flags & MESHSET_ORDERED )
3032 ENTITY_HANDLE( entity_set_handle ), requested_array_size, recursive );
3036 ENTITY_HANDLE( entity_set_handle ), requested_array_size, recursive );
3037 result = ( *entArr_iterator )->reset(
MOABI );
3038 if(
MB_SUCCESS != result )
delete *entArr_iterator;
CHKERR( result,
"iMesh_initEntArrIter: ERROR getting entities of proper type or topology." );
3043 const char* tag_name,
3044 const char* tmp_tag_options,
3049 const int tag_name_len,
3050 const int tag_options_len )
3055 std::string tmp_tagname( tag_name, tag_name_len );
3062 std::string storage_type;
3063 const void* def_val = NULL;
3064 std::vector< int > def_int;
3065 std::vector< double > def_dbl;
3066 std::vector< moab::EntityHandle > def_handles;
3070 if( 0 != tag_options_len )
3072 std::string tag_options =
filter_options( tmp_tag_options, tmp_tag_options + tag_options_len );
3074 const char* option_vals[] = {
"SPARSE",
"DENSE",
"BIT",
"MESH" };
3078 result = opts.
match_option(
"TAG_STORAGE_TYPE", option_vals, opt_num );
3079 if( MB_FAILURE == result )
3080 ERROR( result,
"iMesh_createTagWithOptions: option string not recognized." );
3083 assert( opt_num >= 0 && opt_num <= 3 );
3084 storage = opt_types[opt_num];
3088 storage_type.clear();
3089 result = opts.
get_option(
"TAG_DEFAULT_VALUE", storage_type );
3097 def_int.resize( tag_size );
3098 std::fill( def_int.begin(), def_int.end(), dum_int );
3099 def_val = &def_int[0];
3103 def_dbl.resize( tag_size );
3104 std::fill( def_dbl.begin(), def_dbl.end(), dum_dbl );
3105 def_val = &def_dbl[0];
3111 ERROR( result,
"iMesh_createTagWithOptions: for default handle-type tag, "
3112 "must use non-negative int on input." );
3113 def_handles.resize( tag_size );
3115 def_val = &def_handles[0];
3118 if( (
int)storage_type.length() < tag_size )
3119 ERROR( result,
"iMesh_createTagWithOptions: default value for byte-type "
3120 "tag must be large enough to store tag value." );
3121 def_val = storage_type.c_str();
3133 std::string msg(
"iMesh_createTag: " );
3136 msg +=
"Tag already exists with name: \"";
3140 msg +=
"Failed to create tag with name: \"";
3143 ERROR( result, msg.c_str() );
3147 MBIMESHI->note_ent_handle_tag( new_tag );
3149 MBIMESHI->note_set_handle_tag( new_tag );
3201 result = instance->
get_adjacencies( from_ents, 2,
true, int_ents, Interface::UNION );
3203 unsigned int old_size = from_ents.
size();
3204 from_ents.
merge( int_ents );
3205 if( old_size != from_ents.
size() && in_set )
3215 result = instance->
get_adjacencies( from_ents, 1,
true, int_ents, Interface::UNION );
3217 unsigned int old_size = from_ents.
size();
3218 from_ents.
merge( int_ents );
3219 if( old_size != from_ents.
size() && in_set )
3231 std::string::size_type p = this_string.find_last_not_of(
" " );
3232 if( p != this_string.npos ) this_string.resize( p + 1 );
3252 ErrorCode rval =
MOABI->query_interface( scdi );
CHKERR( rval,
"Couldn't get structured mesh interface." );
3257 scdi->
construct_box(
HomCoord( local_dims[0], local_dims[1], ( -1 != local_dims[2] ? local_dims[2] : 0 ), 1 ),
3258 HomCoord( local_dims[3], local_dims[4], ( -1 != local_dims[5] ? local_dims[5] : 0 ), 1 ),
3259 NULL, 0, scd_box, NULL, NULL, ( vert_gids ?
true :
false ) );
CHKERR( rval,
"Trouble creating scd vertex sequence." );
3264 for(
int i = 0; i < 6; i++ )
3274 if( !( *set_handle ) )
3283 rval =
MOABI->add_entities(
ENTITY_HANDLE( *set_handle ), &s, 1 );
CHKERR( rval,
"Couldn't add box set to file set." );
3293 int *v_gid_data = NULL, *e_gid_data = NULL;
3294 if( vert_gids || elem_gids )
3296 gid_tag =
MOABI->globalId_tag();
3304 rval =
MOABI->tag_iterate( gid_tag, tmp_range.
begin(), topv, count, data );
CHKERR( rval,
"Failed to get tag iterator." );
3306 v_gid_data = (
int*)data;
3314 rval =
MOABI->tag_iterate( gid_tag, bote, tope, count, data );
CHKERR( rval,
"Failed to get tag iterator." );
3316 e_gid_data = (
int*)data;
3319 if( i_vals || j_vals || k_vals || v_gid_data || e_gid_data )
3323 double *xc, *yc, *zc;
3326 int i, j, k, il, jl, kl;
3327 int dil = local_dims[3] - local_dims[0] + 1;
3328 int djl = local_dims[4] - local_dims[1] + 1;
3329 int di = ( global_dims ? global_dims[3] - global_dims[0] + 1 : dil );
3330 int dj = ( global_dims ? global_dims[4] - global_dims[1] + 1 : djl );
3331 for( kl = local_dims[2]; kl <= local_dims[5]; kl++ )
3333 k = kl - local_dims[2];
3334 for( jl = local_dims[1]; jl <= local_dims[4]; jl++ )
3336 j = jl - local_dims[1];
3337 for( il = local_dims[0]; il <= local_dims[3]; il++ )
3339 i = il - local_dims[0];
3340 unsigned int pos = i + j * dil + k * dil * djl;
3341 xc[pos] = ( i_vals ? i_vals[i] : -1.0 );
3342 yc[pos] = ( j_vals ? j_vals[j] : -1.0 );
3343 zc[pos] = ( -1 == local_dims[2] ? 0.0 : ( k_vals ? k_vals[k] : -1.0 ) );
3346 *v_gid_data = ( -1 != kl ? kl * di * dj : 0 ) + jl * di + il + 1;
3349 if( e_gid_data && kl < local_dims[5] && jl < local_dims[4] && il < local_dims[3] )
3351 *e_gid_data = ( -1 != kl ? kl * ( di - 1 ) * ( dj - 1 ) : 0 ) + jl * ( di - 1 ) + il + 1;
3359 #ifdef MOAB_HAVE_MPI
3361 if( resolve_shared )
3370 if( -1 != ghost_dim )
3372 rval = pcomm->
exchange_ghost_cells( ghost_dim, bridge_dim, num_layers, addl_ents,
true );
CHKERR( rval,
"Trouble exchanging ghosts." );
3378 if( resolve_shared || ghost_dim || bridge_dim || num_layers || addl_ents )