19 #pragma warning( disable : 4786 )
22 #define MOAB_MPE_LOG "moab.mpe"
72 #ifdef MOAB_HAVE_HDF5_PARALLEL
75 #define DefaultWriterName "WriteHDF5Parallel"
79 #define DefaultWriterName "WriteHDF5"
81 #elif defined( MOAB_HAVE_NETCDF )
84 #define DefaultWriterName "WriteNCDF"
88 #define DefaultWriterName "WriteVtk"
114 #define ALLOW_NULL_FOR_MESH_TAG
119 #undef DISALLOW_EMPTY_HANDLE_LIST_FOR_TAGS
127 std::cerr <<
"WARNING: Accepting empty array to indicate mesh tag" << std::endl;
130 #ifdef ALLOW_NULL_FOR_MESH_TAG
131 #define CHECK_MESH_NULL \
132 EntityHandle root = 0; \
133 if( NULL == entity_handles && 0 == num_entities ) \
135 entity_handles = &root; \
137 warn_null_array_mesh_tag(); \
139 #elif defined( DISALLOW_EMPTY_HANDLE_LIST_FOR_TAGS )
140 #define CHECK_MESH_NULL \
141 if( NULL == entity_handles ) \
143 std::cerr << "ERROR: Deprecated NULL handle list at " __FILE__ ":" << __LINE__ << std::endl; \
147 #define CHECK_MESH_NULL
159 return reinterpret_cast< const MeshSetSequence*
>( seq )->get_set( h );
174 printf(
"Error initializing moab::Core\n" );
182 if( mMBWriteUtil )
delete mMBWriteUtil;
183 if( mMBReadUtil )
delete mMBReadUtil;
184 if( scdInterface )
delete scdInterface;
197 if( MPI_SUCCESS == MPI_Initialized( &flag ) )
207 initErrorHandlerInCore =
false;
211 initErrorHandlerInCore =
true;
214 geometricDimension = 3;
218 geomDimensionTag = 0;
227 mError =
new( std::nothrow )
Error;
244 geom_dimension_tag();
250 mesh_modified =
false;
265 std::vector< ParallelComm* > pc_list;
267 for( std::vector< ParallelComm* >::iterator vit = pc_list.begin(); vit != pc_list.end(); ++vit )
276 if( aEntityFactory )
delete aEntityFactory;
280 while( !tagList.empty() )
281 tag_delete( tagList.front() );
283 if( sequenceManager )
delete sequenceManager;
287 delete readerWriterSet;
290 if( mError )
delete mError;
297 const char* logfile = getenv(
"MPE_LOG_FILE" );
298 if( !logfile ) logfile = default_log;
310 if( !mMBReadUtil ) mMBReadUtil =
new ReadUtil(
this, mError );
315 if( !mMBWriteUtil ) mMBWriteUtil =
new WriteUtil(
this );
320 ptr = reader_writer_set();
322 else if( interface_type ==
typeid(
Error ) )
332 if( !scdInterface ) scdInterface =
new ScdInterface(
this );
396 ErrorCode error_code = sequence_manager()->find( handle, dummy_seq );
413 return load_file( file_name, 0, 0, name, block_id_list, num_blocks );
418 const char* setoptions,
419 const char* set_tag_name,
420 const int* set_tag_vals,
421 int num_set_tag_vals )
428 assert( !file_set || ( *file_set && is_valid( *file_set ) ) );
429 if( file_set && !*file_set )
431 MB_SET_GLB_ERR( MB_FAILURE,
"Non-NULL file set pointer should point to non-NULL set" );
435 std::string parallel_opt;
436 rval = opts.
get_option(
"PARALLEL", parallel_opt );
451 if( set_tag_name && num_set_tag_vals )
454 "can't load subset file in parallel" );
459 "can't load file in parallel" );
462 MB_SET_GLB_ERR( MB_FAILURE,
"PARALLEL option not valid, this instance compiled for serial execution" );
467 if( set_tag_name && num_set_tag_vals )
469 MB_CHK_SET_ERR( serial_load_file( file_name, file_set, opts, &sl ),
"can't load subset file in serial" );
473 MB_CHK_SET_ERR( serial_load_file( file_name, file_set, opts ),
"can't load file in serial" );
496 get_entities_by_handle( 0, new_ents );
497 new_ents =
subtract( new_ents, initial_ents );
498 delete_entities( new_ents );
500 std::vector< Tag > all_tags, new_tags;
501 tag_get_tags( all_tags );
502 std::sort( initial_tags.begin(), initial_tags.end() );
503 std::sort( all_tags.begin(), all_tags.end() );
504 std::set_difference( all_tags.begin(), all_tags.end(), initial_tags.begin(), initial_tags.end(),
505 std::back_inserter( new_tags ) );
506 while( !new_tags.empty() )
508 tag_delete( new_tags.back() );
520 #if defined( WIN32 ) || defined( WIN64 ) || defined( MSC_VER )
521 struct _stat stat_data;
522 status = _stat( file_name, &stat_data );
524 struct stat stat_data;
525 status = stat( file_name, &stat_data );
531 #if defined( WIN32 ) || defined( WIN64 ) || defined( MSC_VER )
532 else if( stat_data.st_mode & _S_IFDIR )
535 else if( S_ISDIR( stat_data.st_mode ) )
544 MB_CHK_SET_ERR( get_entities_by_handle( 0, initial_ents ),
"can't get entities by handle" );
546 std::vector< Tag > initial_tags;
555 bool tried_one =
false;
556 for( iter = set->
begin(); iter != set->
end(); ++iter )
558 if( !iter->reads_extension( ext.c_str() ) )
continue;
564 rval = reader->
load_file( file_name, file_set, opts, subsets, id_tag );
567 clean_up_failed_read( initial_ents, initial_tags );
574 for( iter = set->
begin(); iter != set->
end(); ++iter )
577 if( !reader )
continue;
578 rval = reader->
load_file( file_name, file_set, opts, subsets, id_tag );
581 clean_up_failed_read( initial_ents, initial_tags );
587 clean_up_failed_read( initial_ents, initial_tags );
588 MB_SET_ERR( rval,
"Failed to load file after trying all possible readers" );
593 get_entities_by_handle( 0, new_ents );
594 new_ents =
subtract( new_ents, initial_ents );
598 rval = mMBReadUtil->get_gather_set( gather_set );
602 new_ents.
erase( gather_set );
606 rval = get_entities_by_handle( gather_set, gather_ents );
610 rval = add_entities( *file_set, new_ents );
617 const char* tag_name,
619 std::vector< int >& vals,
629 rval = reader->
read_tag_values( file_name, tag_name, opts, vals, subsets );
636 for( iter = set->
begin(); iter != set->
end(); ++iter )
638 reader = iter->make_reader(
this );
641 rval = reader->
read_tag_values( file_name, tag_name, opts, vals, subsets );
653 return write_file( file_name, 0, 0, output_list, num_sets );
657 const char* file_type,
658 const char* options_string,
665 std::copy( output_sets, output_sets + num_output_sets,
range_inserter( range ) );
666 return write_file( file_name, file_type, options_string, range, tag_list, num_tags );
670 const char* file_type,
671 const char* options_string,
672 const Range& output_sets,
677 std::vector< EntityHandle > list( output_sets.
size() );
678 std::copy( output_sets.
begin(), output_sets.
end(), list.begin() );
687 MB_SET_GLB_ERR( MB_FAILURE,
"Unexpected value for CREATE option" );
693 std::vector< std::string > qa_records;
702 if( ( file_type && !i->name().compare( file_type ) ) || i->writes_extension( ext.c_str() ) )
709 writer->
write_file( file_name, overwrite, opts, list_ptr, list.
size(), qa_records, tag_list, num_tags );
712 printf(
"Writer with name %s for file %s using extension %s (file type \"%s\") was "
714 i->name().c_str(), file_name, ext.c_str(), file_type );
720 MB_SET_ERR( rval,
"Unrecognized file type \"" << file_type <<
"\"" );
726 printf(
"Using default writer %s for file %s \n",
DefaultWriterName, file_name );
727 rval = writer.
write_file( file_name, overwrite, opts, list_ptr, list.
size(), qa_records, tag_list, num_tags );
753 if( aEntityFactory )
delete aEntityFactory;
756 for( std::list< TagInfo* >::iterator i = tagList.begin(); i != tagList.end(); ++i )
758 result = ( *i )->release_all_data( sequenceManager, mError,
false );
762 sequenceManager->clear();
770 dim = geometricDimension;
781 if( geometricDimension < dim )
785 get_number_entities_by_dimension( 0, geometricDimension, num );
795 geometricDimension = dim;
811 int num_verts = vertices.
size();
814 coords.resize( geometricDimension * num_verts );
817 result = get_coords( &( *it ), 1, xyz );
820 coords[vec_pos] = xyz[0];
821 coords[num_verts + vec_pos] = xyz[1];
822 coords[2 * num_verts + vec_pos] = xyz[2];
832 double*& xcoords_ptr,
833 double*& ycoords_ptr,
834 double*& zcoords_ptr,
838 ErrorCode rval = sequence_manager()->find( *iter, seq );
841 xcoords_ptr = ycoords_ptr = zcoords_ptr = NULL;
842 MB_SET_ERR( rval,
"Couldn't find sequence for start handle" );
856 if( *end ) real_end = std::min( real_end, *end );
857 count = real_end - *iter + 1;
880 count = i->second -
first + 1;
890 double const *x, *y, *z;
895 for(
EntityID j = 0; j < count; ++j )
897 coords[3 * j] = x[j];
898 coords[3 * j + 1] = y[j];
899 coords[3 * j + 2] = z[j];
901 coords = &coords[3 * count];
908 MB_CHK_SET_ERR( get_coords( &( *rit ), 1, coords ),
"can't get coords" );
934 count = i->second -
first + 1;
944 double const *x, *y, *z;
948 memcpy( x_coords, x + offset, count *
sizeof(
double ) );
953 memcpy( y_coords, y + offset, count *
sizeof(
double ) );
958 memcpy( z_coords, z + offset, count *
sizeof(
double ) );
968 MB_CHK_SET_ERR( get_coords( &( *rit ), 1, xyz ),
"can't get coords" );
969 *x_coords++ = xyz[0];
970 *y_coords++ = xyz[1];
971 *z_coords++ = xyz[2];
981 const EntityHandle*
const end = entities + num_entities;
991 seq = sequence_manager()->get_last_accessed_sequence(
MBVERTEX );
1008 static int num_conn;
1009 status = get_connectivity( *iter, conn, num_conn,
false, &dum_conn );
1011 status = get_coords( conn, num_conn, &dum_pos[0] );
1013 coords[0] = coords[1] = coords[2] = 0.0;
1014 for(
int i = 0; i < num_conn; i++ )
1016 coords[0] += dum_pos[3 * i];
1017 coords[1] += dum_pos[3 * i + 1];
1018 coords[2] += dum_pos[3 * i + 2];
1020 coords[0] /= num_conn;
1021 coords[1] /= num_conn;
1022 coords[2] /= num_conn;
1034 const double*& z )
const
1041 status = sequence_manager()->find( entity_handle, seq );
1045 status =
static_cast< const VertexSequence*
>( seq )->get_coordinates_ref( entity_handle, x, y, z );
1060 for( i = 0; i < num_entities; i++ )
1065 status = sequence_manager()->find( entity_handles[i], seq );
1069 status =
static_cast< VertexSequence*
>( seq )->set_coordinates( entity_handles[i], coords[j],
1070 coords[j + 1], coords[j + 2] );
1095 status = sequence_manager()->find( *rit, seq );
1099 status =
static_cast< VertexSequence*
>( seq )->set_coordinates( *rit, coords[j], coords[j + 1],
1113 return sequenceManager->get_sequence_multiplier();
1118 assert( factor >= 1.0 );
1119 sequenceManager->set_sequence_multiplier( factor );
1131 ErrorCode result = get_entities_by_type( 0, entity_type, this_range );
1133 int num_ents = this_range.
size();
1140 result = get_connectivity( *this_it, connect_vec, num_ents,
true );
1142 connect.insert( connect.end(), &connect_vec[0], &connect_vec[num_ents] );
1150 const int num_handles,
1151 Range& connectivity,
1152 bool corners_only )
const
1154 std::vector< EntityHandle > tmp_connect;
1155 ErrorCode result = get_connectivity( entity_handles, num_handles, tmp_connect, corners_only );
1158 std::sort( tmp_connect.begin(), tmp_connect.end() );
1159 std::copy( tmp_connect.rbegin(), tmp_connect.rend(),
range_inserter( connectivity ) );
1165 const int num_handles,
1166 std::vector< EntityHandle >& connectivity,
1168 std::vector< int >* offsets )
const
1170 connectivity.clear();
1174 std::vector< EntityHandle > tmp_storage;
1177 if( offsets ) offsets->push_back( 0 );
1178 for(
int i = 0; i < num_handles; ++i )
1180 MB_CHK_SET_ERR( get_connectivity( entity_handles[i], conn, len, corners_only, &tmp_storage ),
1181 "can't get connectivity" );
1182 connectivity.insert( connectivity.end(), conn, conn + len );
1183 if( offsets ) offsets->push_back( connectivity.size() );
1193 std::vector< EntityHandle >* storage )
const
1201 if( entity_type < MBVERTEX || entity_type >=
MBENTITYSET )
1213 status = sequence_manager()->find( entity_handle, seq );
1216 return static_cast< const ElementSequence*
>( seq )->get_connectivity( entity_handle, connectivity, number_nodes,
1217 corners_only, storage );
1233 status = sequence_manager()->find( entity_handle, seq );
1238 status =
static_cast< ElementSequence*
>( seq )->get_connectivity( entity_handle, old_conn, len );
1241 aEntityFactory->notify_change_connectivity( entity_handle, old_conn, connect, num_connect );
1243 status =
static_cast< ElementSequence*
>( seq )->set_connectivity( entity_handle, connect, num_connect );
1245 aEntityFactory->notify_change_connectivity( entity_handle, connect, old_conn, num_connect );
1250 template <
typename ITER >
1255 bool create_if_missing,
1256 Range& adj_entities )
1258 const size_t DEFAULT_MAX_BLOCKS_SIZE = 4000;
1259 const size_t MAX_OUTER_ITERATIONS = 100;
1261 std::vector< EntityHandle > temp_vec, storage;
1262 std::vector< EntityHandle >::const_iterator ti;
1270 size_t remaining = end - begin;
1271 assert( begin + remaining == end );
1276 const size_t block_size = std::max( DEFAULT_MAX_BLOCKS_SIZE, remaining / MAX_OUTER_ITERATIONS );
1277 while( remaining > 0 )
1279 const size_t count = remaining > block_size ? block_size : remaining;
1282 for(
size_t j = 0; j < count; ++i, ++j )
1286 temp_vec.push_back( *i );
1290 tmp_result =
gMB->get_connectivity( *i, conn, conn_len,
false, &storage );
1293 result = tmp_result;
1296 temp_vec.insert( temp_vec.end(), conn, conn + conn_len );
1300 tmp_result =
gMB->a_entity_factory()->get_adjacencies( *i, to_dimension, create_if_missing, temp_vec );
1303 result = tmp_result;
1309 std::sort( temp_vec.begin(), temp_vec.end() );
1310 ins = adj_entities.
begin();
1311 ti = temp_vec.begin();
1312 while( ti != temp_vec.end() )
1316 for( ++ti; ti != temp_vec.end() && ( *ti - second <= 1 ); ++ti )
1324 template <
typename ITER >
1328 const int to_dimension,
1329 const bool create_if_missing,
1330 std::vector< EntityHandle >& adj_entities )
1332 const size_t SORT_THRESHOLD = 200;
1333 std::vector< EntityHandle > temp_vec;
1334 std::vector< EntityHandle >::iterator adj_it, w_it;
1339 adj_entities.clear();
1346 if( adj_entities.empty() )
1350 adj_entities.push_back( *begin );
1351 else if( to_dimension == 0 && entity_type !=
MBPOLYHEDRON )
1353 result =
mb->get_connectivity( &( *begin ), 1, adj_entities );
1358 result =
mb->a_entity_factory()->get_adjacencies( *begin, to_dimension, create_if_missing, adj_entities );
1364 for( ITER from_it = begin; from_it != end; ++from_it )
1372 temp_vec.push_back( *from_it );
1373 else if( to_dimension == 0 && entity_type !=
MBPOLYHEDRON )
1375 result =
mb->get_connectivity( &( *from_it ), 1, temp_vec );
1380 result =
mb->a_entity_factory()->get_adjacencies( *from_it, to_dimension, create_if_missing, temp_vec );
1385 w_it = adj_it = adj_entities.begin();
1386 if( temp_vec.size() * adj_entities.size() < SORT_THRESHOLD )
1388 for( ; adj_it != adj_entities.end(); ++adj_it )
1389 if( std::find( temp_vec.begin(), temp_vec.end(), *adj_it ) != temp_vec.end() )
1397 std::sort( temp_vec.begin(), temp_vec.end() );
1398 for( ; adj_it != adj_entities.end(); ++adj_it )
1399 if( std::binary_search( temp_vec.begin(), temp_vec.end(), *adj_it ) )
1405 adj_entities.erase( w_it, adj_entities.end() );
1408 if( adj_entities.empty() )
break;
1414 template <
typename ITER >
1418 const int to_dimension,
1419 const bool create_if_missing,
1420 Range& adj_entities )
1422 std::vector< EntityHandle > results;
1424 "can't get adjacencies intersection" );
1426 if( adj_entities.
empty() )
1428 std::copy( results.begin(), results.end(),
range_inserter( adj_entities ) );
1433 while( it != adj_entities.
end() )
1435 if( std::find( results.begin(), results.end(), *it ) == results.end() )
1436 it = adj_entities.
erase( it );
1445 #ifdef MOAB_HAVE_AHF
1447 template <
typename ITER >
1448 static inline ErrorCode get_adjacencies_intersection_ahf( Core*
mb,
1451 const int to_dimension,
1452 std::vector< EntityHandle >& adj_entities )
1454 const size_t SORT_THRESHOLD = 200;
1455 std::vector< EntityHandle > temp_vec;
1456 std::vector< EntityHandle >::iterator adj_it, w_it;
1461 adj_entities.clear();
1468 if( adj_entities.empty() )
1473 result =
mb->get_connectivity( &( *begin ), 1, adj_entities );
1475 result =
mb->a_half_facet_rep()->get_adjacencies( *begin, to_dimension, adj_entities );
1480 for( ITER from_it = begin; from_it != end; ++from_it )
1488 result =
mb->get_connectivity( &( *from_it ), 1, temp_vec );
1490 result =
mb->a_half_facet_rep()->get_adjacencies( *from_it, to_dimension, temp_vec );
1494 w_it = adj_it = adj_entities.begin();
1495 if( temp_vec.size() * adj_entities.size() < SORT_THRESHOLD )
1497 for( ; adj_it != adj_entities.end(); ++adj_it )
1498 if( std::find( temp_vec.begin(), temp_vec.end(), *adj_it ) != temp_vec.end() )
1506 std::sort( temp_vec.begin(), temp_vec.end() );
1507 for( ; adj_it != adj_entities.end(); ++adj_it )
1508 if( std::binary_search( temp_vec.begin(), temp_vec.end(), *adj_it ) )
1514 adj_entities.erase( w_it, adj_entities.end() );
1517 if( adj_entities.empty() )
break;
1527 const int num_entities,
1528 const int to_dimension,
1529 const bool create_if_missing,
1530 std::vector< EntityHandle >& adj_entities,
1531 const int operation_type )
1534 #ifdef MOAB_HAVE_AHF
1535 bool can_handle =
true;
1537 if( to_dimension == 4 )
1539 else if( create_if_missing )
1542 bool mixed = ahfRep->check_mixed_entity_type();
1544 if( mixed ) can_handle =
false;
1553 return get_adjacencies_intersection_ahf(
this, from_entities, from_entities + num_entities, to_dimension,
1560 std::vector< EntityHandle > tmp_storage;
1563 for(
int i = 0; i < num_entities; ++i )
1567 result = get_connectivity( from_entities[i], conn, len,
false, &tmp_storage );
1568 adj_entities.insert( adj_entities.end(), conn, conn + len );
1573 result = ahfRep->get_adjacencies( from_entities[i], to_dimension, adj_entities );
1577 std::sort( adj_entities.begin(), adj_entities.end() );
1578 adj_entities.erase( std::unique( adj_entities.begin(), adj_entities.end() ), adj_entities.end() );
1587 create_if_missing, adj_entities );
1593 std::vector< EntityHandle > tmp_storage;
1596 for(
int i = 0; i < num_entities; ++i )
1600 result = get_connectivity( from_entities[i], conn, len,
false, &tmp_storage );
1602 adj_entities.insert( adj_entities.end(), conn, conn + len );
1607 aEntityFactory->get_adjacencies( from_entities[i], to_dimension, create_if_missing, adj_entities );
1611 std::sort( adj_entities.begin(), adj_entities.end() );
1612 adj_entities.erase( std::unique( adj_entities.begin(), adj_entities.end() ), adj_entities.end() );
1616 #ifdef MOAB_HAVE_AHF
1624 const int num_entities,
1625 const int to_dimension,
1626 const bool create_if_missing,
1627 Range& adj_entities,
1628 const int operation_type )
1632 create_if_missing, adj_entities );
1635 create_if_missing, adj_entities );
1642 const size_t DEFAULT_MAX_BLOCKS_SIZE = 4000;
1643 const size_t MAX_OUTER_ITERATIONS = 100;
1645 std::vector< EntityHandle > temp_vec, storage;
1646 std::vector< EntityHandle >::const_iterator ti;
1654 size_t remaining = from_entities.
size();
1657 adj_entities.
merge( from_entities.
begin(), i );
1662 const size_t block_size = std::max( DEFAULT_MAX_BLOCKS_SIZE, remaining / MAX_OUTER_ITERATIONS );
1663 while( remaining > 0 )
1665 const size_t count = remaining > block_size ? block_size : remaining;
1668 for(
size_t j = 0; j < count; ++i, ++j )
1670 tmp_result = get_connectivity( *i, conn, conn_len, corners_only, &storage );
1673 result = tmp_result;
1677 const size_t oldsize = temp_vec.size();
1678 temp_vec.resize( oldsize + conn_len );
1679 memcpy( &temp_vec[oldsize], conn,
sizeof(
EntityHandle ) * conn_len );
1682 std::sort( temp_vec.begin(), temp_vec.end() );
1683 ins = adj_entities.
begin();
1684 ti = temp_vec.begin();
1685 while( ti != temp_vec.end() )
1689 for( ++ti; ti != temp_vec.end() && ( *ti - second <= 1 ); ++ti )
1700 int& verts_per_entity,
1713 ErrorCode rval = sequence_manager()->find( *iter, seq );
1717 assert( eseq != NULL );
1722 MB_SET_ERR( MB_FAILURE,
"Couldn't find connectivity array for start handle" );
1728 if( *end ) real_end = std::min( real_end, *end );
1729 count = real_end - *iter + 1;
1739 MB_CHK_SET_ERR( get_connectivity( from_entities, range ),
"can't get connectivity" );
1749 MB_CHK_SET_ERR( get_connectivity( polygons, range ),
"can't get connectivity" );
1752 if( vertices.
empty() )
1753 vertices.
swap( range );
1755 vertices.
merge( range );
1760 const int to_dimension,
1761 const bool create_if_missing,
1762 Range& adj_entities,
1763 const int operation_type )
1767 create_if_missing, adj_entities );
1770 else if( to_dimension == 0 )
1771 return get_vertices( from_entities, adj_entities );
1786 const int num_handles,
1791 for(
const EntityHandle* it = to_handles; it != to_handles + num_handles; it++ )
1793 result = aEntityFactory->add_adjacency( from_handle, *it, both_ways );
1810 for(
Range::iterator rit = adjacencies.begin(); rit != adjacencies.end(); ++rit )
1812 result = aEntityFactory->add_adjacency( from_handle, *rit, both_ways );
1827 const int num_handles )
1831 for(
const EntityHandle* it = to_handles; it != to_handles + num_handles; it++ )
1833 result = aEntityFactory->remove_adjacency( from_handle, *it );
1835 result = aEntityFactory->remove_adjacency( *it, from_handle );
1844 const std::vector< EntityHandle >**& adjs_ptr,
1857 ErrorCode rval = sequence_manager()->find( *iter, seq );
1861 if( !adjs_ptr )
return rval;
1866 if( *end ) real_end = std::min( real_end, *end );
1867 count = real_end - *iter + 1;
1873 const int dimension,
1875 const bool recursive )
const
1881 result = sequence_manager()->find( meshset, seq );
1884 result = mseq->
get_dimension( sequence_manager(), meshset, dimension, entities, recursive );
1887 else if( dimension > 3 )
1889 sequence_manager()->get_entities(
MBENTITYSET, entities );
1896 sequence_manager()->get_entities( this_type, entities );
1904 const int dimension,
1905 std::vector< EntityHandle >& entities,
1906 const bool recursive )
const
1912 result = sequence_manager()->find( meshset, seq );
1915 result = mseq->
get_dimension( sequence_manager(), meshset, dimension, entities, recursive );
1918 else if( dimension > 3 )
1920 sequence_manager()->get_entities(
MBENTITYSET, entities );
1927 sequence_manager()->get_entities( this_type, entities );
1935 const EntityType entity_type,
1937 const bool recursive )
const
1943 result = sequence_manager()->find( meshset, seq );
1946 result = mseq->
get_type( sequence_manager(), meshset, entity_type, entities, recursive );
1951 sequence_manager()->get_entities( entity_type, entities );
1958 const EntityType entity_type,
1959 std::vector< EntityHandle >& entities,
1960 const bool recursive )
const
1966 result = sequence_manager()->find( meshset, seq );
1969 result = mseq->
get_type( sequence_manager(), meshset, entity_type, entities, recursive );
1974 sequence_manager()->get_entities( entity_type, entities );
1981 const EntityType entity_type,
1983 const void*
const* values,
1986 const int condition,
1987 const bool recursive )
const
1992 result = get_entities_by_type( meshset, entity_type, range, recursive );
1999 for(
int it = 0; it < num_tags && !range.
empty(); it++ )
2008 if( NULL == values || NULL == values[it] )
2010 result = tags[it]->
get_tagged_entities( sequenceManager, tmp_range, entity_type, &range );
2020 if( tags[it]->equals_default_value( values[it] ) )
2022 Range all_tagged, untagged;
2023 result = tags[it]->
get_tagged_entities( sequenceManager, all_tagged, entity_type, &range );
2032 range.
swap( tmp_range );
2034 entities.
merge( tmp_range );
2048 result = sequence_manager()->find( meshset, seq );
2051 result = mseq->
get_entities( sequence_manager(), meshset, entities, recursive );
2058 sequence_manager()->get_entities( entity_type, entities );
2065 std::vector< EntityHandle >& entities,
2066 const bool recursive )
const
2069 if( recursive || !meshset )
2072 result = get_entities_by_handle( meshset, tmp_range, recursive );
2073 size_t offset = entities.size();
2074 entities.resize( offset + tmp_range.
size() );
2075 std::copy( tmp_range.
begin(), tmp_range.
end(), entities.begin() + offset );
2080 result = sequence_manager()->find( meshset, seq );
2093 const bool recursive )
const
2103 number += sequence_manager()->get_number_entities( this_type );
2109 result = sequence_manager()->find( meshset, seq );
2112 result = mseq->
num_dimension( sequence_manager(), meshset, dim, number, recursive );
2121 const EntityType entity_type,
2123 const bool recursive )
const
2133 result = sequence_manager()->find( meshset, seq );
2136 result = mseq->
num_type( sequence_manager(), meshset, entity_type, num_ent, recursive );
2141 num_ent = sequence_manager()->get_number_entities( entity_type );
2148 const EntityType entity_type,
2149 const Tag* tag_handles,
2150 const void*
const* values,
2154 const bool recursive )
const
2157 ErrorCode result = get_entities_by_type_and_tag( meshset, entity_type, tag_handles, values, num_tags, dum_ents,
2158 condition, recursive );
2159 num_entities = dum_ents.
size();
2169 result = sequence_manager()->find( meshset, seq );
2172 return mseq->
num_entities( sequence_manager(), meshset, num_ent, recursive );
2179 result = get_number_entities_by_type( 0, this_type, dummy );
2195 void* tag_data )
const
2197 assert( valid_tag_handle( tag_handle ) );
2199 return tag_handle->
get_data( sequenceManager, mError, entity_handles, num_entities, tag_data );
2205 assert( valid_tag_handle( tag_handle ) );
2206 return tag_handle->
get_data( sequenceManager, mError, entity_handles, tag_data );
2213 const void* tag_data )
2215 assert( valid_tag_handle( tag_handle ) );
2217 return tag_handle->
set_data( sequenceManager, mError, entity_handles, num_entities, tag_data );
2223 assert( valid_tag_handle( tag_handle ) );
2224 return tag_handle->
set_data( sequenceManager, mError, entity_handles, tag_data );
2231 const void** tag_data,
2232 int* tag_sizes )
const
2234 assert( valid_tag_handle( tag_handle ) );
2237 tag_handle->
get_data( sequenceManager, mError, entity_handles, num_entities, tag_data, tag_sizes );
2239 if( tag_sizes && typesize != 1 )
2240 for(
int i = 0; i < num_entities; ++i )
2241 tag_sizes[i] /= typesize;
2247 const Range& entity_handles,
2248 const void** tag_data,
2249 int* tag_sizes )
const
2251 assert( valid_tag_handle( tag_handle ) );
2252 ErrorCode result = tag_handle->
get_data( sequenceManager, mError, entity_handles, tag_data, tag_sizes );
2254 if( tag_sizes && typesize != 1 )
2256 int num_entities = entity_handles.
size();
2257 for(
int i = 0; i < num_entities; ++i )
2258 tag_sizes[i] /= typesize;
2267 void const*
const* tag_data,
2268 const int* tag_sizes )
2270 assert( valid_tag_handle( tag_handle ) );
2272 std::vector< int > tmp_sizes;
2274 if( typesize != 1 && tag_sizes )
2276 tmp_sizes.resize( num_entities );
2277 for(
int i = 0; i < num_entities; ++i )
2278 tmp_sizes[i] = tag_sizes[i] * typesize;
2279 tag_sizes = &tmp_sizes[0];
2281 return tag_handle->
set_data( sequenceManager, mError, entity_handles, num_entities, tag_data, tag_sizes );
2286 const Range& entity_handles,
2287 void const*
const* tag_data,
2288 const int* tag_sizes )
2290 assert( valid_tag_handle( tag_handle ) );
2291 std::vector< int > tmp_sizes;
2293 if( typesize != 1 && tag_sizes )
2295 int num_entities = entity_handles.
size();
2296 tmp_sizes.resize( num_entities );
2297 for(
int i = 0; i < num_entities; ++i )
2298 tmp_sizes[i] = tag_sizes[i] * typesize;
2299 tag_sizes = &tmp_sizes[0];
2301 return tag_handle->
set_data( sequenceManager, mError, entity_handles, tag_data, tag_sizes );
2308 const void* tag_data,
2311 assert( valid_tag_handle( tag_handle ) );
2313 return tag_handle->
clear_data( sequenceManager, mError, entity_handles, num_entities, tag_data,
2320 assert( valid_tag_handle( tag_handle ) );
2321 return tag_handle->
clear_data( sequenceManager, mError, entity_handles, tag_data,
2327 const char* iter =
reinterpret_cast< const char*
>( mem );
2328 const char*
const end = iter + size;
2329 for( ; iter != end; ++iter )
2330 if( *iter )
return false;
2339 const void* default_value,
2342 if( created ) *created =
false;
2363 for( std::list< Tag >::iterator i = tagList.begin(); i != tagList.end(); ++i )
2365 if( ( *i )->get_name() == name )
2382 if( extype != data_type )
2404 else if( tag_handle->
get_size() != size )
2414 if( default_value && !( flags & MB_TAG_DFTOK ) &&
2444 tag_handle =
DenseTag::create_tag( sequenceManager, mError, name, size, data_type, default_value );
2447 tag_handle =
new VarLenSparseTag( name, data_type, default_value, size );
2450 tag_handle =
new SparseTag( name, size, data_type, default_value );
2456 tag_handle =
new MeshTag( name, size, data_type, default_value, size );
2468 if( created ) *created =
true;
2469 tagList.push_back( tag_handle );
2478 const void* default_value )
const
2491 for( std::list< Tag >::const_iterator i = tagList.begin(); i != tagList.end(); ++i )
2493 if( ( *i )->get_name() == name )
2503 return const_cast< Core*
>( this )->tag_get_handle( name, size, data_type, tag_handle,
2510 assert( valid_tag_handle( tag_handle ) );
2512 return tag_handle->
remove_data( sequenceManager, mError, entity_handles, num_entities );
2518 assert( valid_tag_handle( tag_handle ) );
2519 return tag_handle->
remove_data( sequenceManager, mError, entity_handles );
2525 std::list< TagInfo* >::iterator i = std::find( tagList.begin(), tagList.end(), tag_handle );
2543 assert( valid_tag_handle( tag_handle ) );
2544 ErrorCode result = tag_handle->
tag_iterate( sequenceManager, mError, iter, end, data_ptr, allocate );
2545 if(
MB_SUCCESS == result ) count = iter - init;
2636 assert( valid_tag_handle( tag_handle ) );
2644 std::copy( tagList.begin(), tagList.end(), std::back_inserter( tag_handles ) );
2651 for( std::list< TagInfo* >::const_iterator i = tagList.begin(); i != tagList.end(); ++i )
2652 if( ( *i )->is_tagged( sequenceManager, entity ) ) tag_handles.push_back( *i );
2658 const int negone = -1;
2659 if( 0 == materialTag )
2666 const int negone = -1;
2667 if( 0 == neumannBCTag )
2669 return neumannBCTag;
2674 const int negone = -1;
2675 if( 0 == dirichletBCTag )
2678 return dirichletBCTag;
2683 const int negone = -1;
2684 if( 0 == globalIdTag )
2691 const int negone = -1;
2692 if( 0 == geomDimensionTag )
2695 return geomDimensionTag;
2701 const int num_nodes,
2707 ErrorCode status = sequence_manager()->create_element( entity_type, connectivity, num_nodes, element_handle );
2708 if(
MB_SUCCESS == status ) status = aEntityFactory->notify_create_entity( element_handle, connectivity, num_nodes );
2710 #ifdef MOAB_HAVE_AHF
2711 mesh_modified =
true;
2721 return sequence_manager()->create_vertex( coords, entity_handle );
2731 std::vector< double* > arrays;
2737 for(
int i = 0; i < nverts; i++ )
2739 arrays[0][i] = coordinates[3 * i];
2740 arrays[1][i] = coordinates[3 * i + 1];
2741 arrays[2][i] = coordinates[3 * i + 2];
2744 entity_handles.
clear();
2745 entity_handles.
insert( start_handle_out, start_handle_out + nverts - 1 );
2754 bool delete_removed_entity )
2756 if( auto_merge )
return MB_FAILURE;
2759 if( entity_to_keep == entity_to_remove )
return MB_FAILURE;
2769 status = sequence_manager()->find( entity_to_keep, seq );
2771 status = sequence_manager()->find( entity_to_remove, seq );
2779 std::vector< EntityHandle > conn, conn2;
2781 result = get_connectivity( &entity_to_keep, 1, conn );
2783 result = get_connectivity( &entity_to_remove, 1, conn2 );
2789 ( conn.size() != conn2.size() || !
CN::ConnectivityMatch( &conn[0], &conn2[0], conn.size(), dum1, dum2 ) ) )
2793 result = aEntityFactory->merge_adjust_adjacencies( entity_to_keep, entity_to_remove );
2795 if(
MB_SUCCESS == result && delete_removed_entity ) result = delete_entities( &entity_to_remove, 1 );
2806 for( std::list< TagInfo* >::iterator i = tagList.begin(); i != tagList.end(); ++i )
2808 temp_result = ( *i )->remove_data( sequenceManager, mError, range );
2817 temp_result = aEntityFactory->notify_delete_entity( *rit );
2820 result = temp_result;
2821 failed_ents.
insert( *rit );
2831 ptr->clear( *rit, a_entity_factory() );
2832 rel = ptr->get_parents( count );
2833 for( j = 0; j < count; ++j )
2834 remove_child_meshset( rel[j], *rit );
2835 rel = ptr->get_children( count );
2836 for( j = 0; j < count; ++j )
2837 remove_parent_meshset( rel[j], *rit );
2842 if( !failed_ents.
empty() )
2846 sequence_manager()->delete_entities( mError, dum_range );
2850 result = sequence_manager()->delete_entities( mError, range );
2861 for( std::list< TagInfo* >::iterator i = tagList.begin(); i != tagList.end(); ++i )
2863 temp_result = ( *i )->remove_data( sequenceManager, mError, entities, num_entities );
2868 for(
int i = 0; i < num_entities; i++ )
2872 bool failed =
false;
2873 temp_result = aEntityFactory->notify_delete_entity( entities[i] );
2876 result = temp_result;
2886 ptr->
clear( entities[i], a_entity_factory() );
2887 rel = ptr->get_parents( count );
2888 for( j = 0; j < count; ++j )
2889 remove_child_meshset( rel[j], entities[i] );
2890 rel = ptr->get_children( count );
2891 for( j = 0; j < count; ++j )
2892 remove_parent_meshset( rel[j], entities[i] );
2898 sequence_manager()->delete_entity( mError, entities[i] );
2902 temp_result = sequence_manager()->delete_entity( mError, entities[i] );
2903 if(
MB_SUCCESS != temp_result ) result = temp_result;
2914 if( NULL == entities && num_entities == 0 )
2918 std::cout << std::endl;
2919 std::cout <<
"Number of entities per type: " << std::endl;
2922 result = get_number_entities_by_type( 0, this_type, num_ents );
2925 std::cout << std::endl;
2929 else if( NULL == entities && num_entities < 0 )
2933 std::cout << std::endl;
2936 result = get_entities_by_type( 0, this_type, temp_range );
2939 return list_entities( temp_range );
2941 else if( NULL == entities && num_entities > 0 )
2945 std::cout << std::endl;
2946 result = get_entities_by_type( 0, (EntityType)num_entities, temp_range );
2948 return list_entities( temp_range );
2953 for(
int i = 0; i < num_entities; i++ )
2958 tmp_result = (
const_cast< Core*
>( this ) )->list_entity( entities[i] );
2959 if(
MB_SUCCESS != tmp_result ) result = tmp_result;
2975 tmp_result = (
const_cast< Core*
>( this ) )->list_entity( *rit );
2976 if(
MB_SUCCESS != tmp_result ) result = tmp_result;
2987 if( !is_valid( entity ) )
2989 std::cout <<
"(invalid)" << std::endl;
2993 if( 0 != globalIdTag )
2996 result = tag_get_data( globalIdTag, &entity, 1, &
dum );
2997 if(
MB_SUCCESS == result ) std::cout <<
"Global id = " <<
dum << std::endl;
3005 result = get_coords( &( entity ), 1, coords );
3007 std::cout <<
"Coordinates: (" << coords[0] <<
", " << coords[1] <<
", " << coords[2] <<
")" << std::endl;
3010 this->print( entity,
"" );
3012 std::cout <<
" Adjacencies:" << std::endl;
3015 for(
int dim = 0; dim <= 3; dim++ )
3021 result = (
const_cast< Core*
>( this ) )->get_adjacencies( &( entity ), 1, dim,
false, adj_vec );
3022 if( MB_FAILURE == result )
continue;
3023 for( HandleVec::iterator adj_it = adj_vec.begin(); adj_it != adj_vec.end(); ++adj_it )
3025 if( adj_it != adj_vec.begin() )
3031 if( !adj_vec.empty() )
3033 std::cout << std::endl;
3038 if( !some ) std::cout <<
"(none)" << std::endl;
3041 aEntityFactory->get_adjacencies( entity, explicit_adjs, num_exp );
3042 if( NULL != explicit_adjs && 0 != num_exp )
3044 std::cout <<
" Explicit adjacencies: ";
3045 for(
int i = 0; i < num_exp; i++ )
3047 if( i != 0 ) std::cout <<
", ";
3051 std::cout << std::endl;
3053 if( multiple != 0 ) std::cout <<
" (MULTIPLE = " << multiple <<
")" << std::endl;
3055 result = print_entity_tags( std::string(), entity,
MB_TAG_DENSE );
3057 std::cout << std::endl;
3063 const bool mid_side,
3064 const bool mid_face,
3065 const bool mid_volume,
3069 return fact.
convert( meshset, mid_side, mid_face, mid_volume );
3082 const EntityHandle *parent_conn = NULL, *child_conn = NULL;
3083 int num_parent_vertices = 0, num_child_vertices = 0;
3084 ErrorCode result = get_connectivity( parent, parent_conn, num_parent_vertices,
true );
3088 result = get_connectivity( parent, parent_conn, num_parent_vertices,
true, &tmp_connect );
3094 int child_index = std::find( parent_conn, parent_conn + num_parent_vertices, child ) - parent_conn;
3095 if( child_index == num_parent_vertices )
3103 sd_number = child_index;
3113 for(
int i = 0; i < num_parent_vertices; i++ )
3114 if( child == parent_conn[i] )
3123 result = get_connectivity( child, child_conn, num_child_vertices,
true );
3131 int child_conn_indices[10];
3132 assert( (
unsigned)num_child_vertices <=
sizeof( child_conn_indices ) /
sizeof( child_conn_indices[0] ) );
3133 for(
int i = 0; i < num_child_vertices; ++i )
3135 child_conn_indices[i] =
3136 std::find( parent_conn, parent_conn + num_parent_vertices, child_conn[i] ) - parent_conn;
3137 if( child_conn_indices[i] >= num_parent_vertices )
3146 return ( 0 == temp_result ?
MB_SUCCESS : MB_FAILURE );
3151 const EntityHandle* first_v = std::find( parent_conn, parent_conn + num_parent_vertices, child_conn[0] );
3153 sd_number = first_v - parent_conn;
3174 int actual_num_parent_vertices = num_parent_vertices;
3175 while( actual_num_parent_vertices >= 3 &&
3176 ( parent_conn[actual_num_parent_vertices - 2] == parent_conn[actual_num_parent_vertices - 1] ) )
3177 actual_num_parent_vertices--;
3179 if( parent_conn[( sd_number + 1 ) % num_parent_vertices] == child_conn[1] )
3181 else if( parent_conn[( sd_number + num_parent_vertices - 1 ) % num_parent_vertices] ==
3186 else if( ( sd_number == actual_num_parent_vertices - 1 ) && ( child_conn[1] == parent_conn[0] ) )
3201 const EntityType subfacet_type,
3210 int num_parent_vertices = 0;
3211 ErrorCode result = get_connectivity( parent_handle, parent_conn, num_parent_vertices,
false );
3237 if( subfacet_type != parent_type )
3242 int subfacet_indices[10];
3243 assert( subfacet_size <=
sizeof( subfacet_indices ) /
sizeof( subfacet_indices[0] ) );
3244 for(
unsigned j = 0; j < subfacet_size; ++j )
3246 subfacet_indices[j] =
3247 std::find( parent_conn, parent_conn + num_parent_vertices, subfacet_conn[j] ) - parent_conn;
3248 if( subfacet_indices[j] >= num_parent_vertices )
3254 int dum, side_no, temp_offset;
3256 CN::SideNumber( parent_type, subfacet_indices, subfacet_size, subfacet_type, side_no,
dum, temp_offset );
3257 if( temp_result != 0 )
return MB_FAILURE;
3265 hon = parent_conn[offset];
3273 const int sd_number,
3279 ErrorCode result = get_connectivity( source_entity, verts, num_verts );
3285 if( sd_number < num_verts )
3287 target_entity = verts[sd_number];
3296 Range side_verts, target_ents;
3299 std::vector< int > vertex_indices;
3302 if( 0 != temp_result )
return MB_FAILURE;
3304 for(
unsigned int i = 0; i < vertex_indices.size(); i++ )
3305 side_verts.
insert( verts[vertex_indices[i]] );
3310 result = (
const_cast< Core*
>( this ) )->get_adjacencies( side_verts, dim,
false, target_ents );
3318 if( !target_ents.
empty() ) target_entity = *( target_ents.
begin() );
3327 return sequence_manager()->create_mesh_set( setoptions, ms_handle );
3341 setoptions = set->
flags();
3350 return set->
set_flags( setoptions, ms_handle, a_entity_factory() );
3356 for(
int i = 0; i < num_meshsets; ++i )
3360 set->
clear( ms_handles[i], a_entity_factory() );
3375 set->
clear( *i, a_entity_factory() );
3389 return set1->
subtract( set2, meshset1, a_entity_factory() );
3398 return set1->
intersect( set2, meshset1, a_entity_factory() );
3407 return set1->
unite( set2, meshset1, a_entity_factory() );
3414 return set->
add_entities( entities, meshset, a_entity_factory() );
3423 return set->
add_entities( entities, num_entities, meshset, a_entity_factory() );
3443 return set->
remove_entities( entities, num_entities, meshset, a_entity_factory() );
3452 const int operation_type )
3457 return set->contains_entities( entities, num_entities, operation_type );
3470 return set->
replace_entities( meshset, old_entities, new_entities, num_entities, a_entity_factory() );
3476 std::vector< EntityHandle >& parents,
3477 const int num_hops )
const
3482 ErrorCode rval = sequence_manager()->find( meshset, seq );
3486 return mseq->
get_parents( sequence_manager(), meshset, parents, num_hops );
3493 std::vector< EntityHandle > parent_vec;
3494 ErrorCode result = get_parent_meshsets( meshset, parent_vec, num_hops );
3496 std::sort( parent_vec.begin(), parent_vec.end() );
3497 std::copy( parent_vec.rbegin(), parent_vec.rend(),
range_inserter( parents ) );
3502 std::vector< EntityHandle >& children,
3503 const int num_hops )
const
3508 ErrorCode rval = sequence_manager()->find( meshset, seq );
3512 return mseq->
get_children( sequence_manager(), meshset, children, num_hops );
3519 std::vector< EntityHandle > child_vec;
3520 ErrorCode result = get_child_meshsets( meshset, child_vec, num_hops );
3522 std::sort( child_vec.begin(), child_vec.end() );
3523 std::copy( child_vec.rbegin(), child_vec.rend(),
range_inserter( children ) );
3528 std::vector< EntityHandle >& children,
3529 const int num_hops )
const
3533 return get_entities_by_type( meshset,
MBENTITYSET, children );
3537 ErrorCode rval = sequence_manager()->find( meshset, seq );
3548 return get_entities_by_type( meshset,
MBENTITYSET, children );
3551 std::vector< EntityHandle > child_vec;
3552 ErrorCode result = get_contained_meshsets( meshset, child_vec, num_hops );
3554 std::sort( child_vec.begin(), child_vec.end() );
3555 std::copy( child_vec.rbegin(), child_vec.rend(),
range_inserter( children ) );
3564 ErrorCode rval = sequence_manager()->find( meshset, seq );
3568 return mseq->
num_parents( sequence_manager(), meshset, *number, num_hops );
3576 ErrorCode rval = sequence_manager()->find( meshset, seq );
3580 return mseq->
num_children( sequence_manager(), meshset, *number, num_hops );
3587 return get_number_entities_by_type( 0,
MBENTITYSET, *number );
3591 ErrorCode rval = sequence_manager()->find( meshset, seq );
3613 for(
int i = 0; i < count; ++i )
3616 for(
int i = 0; i < count; ++i )
3636 for(
int i = 0; i < count; ++i )
3639 for(
int i = 0; i < count; ++i )
3690 return (
unsigned)code <= (unsigned)MB_FAILURE ? ErrorCodeStr[code] :
"INVALID ERROR CODE";
3698 if( 0 != ms_handle )
3700 get_entities_by_handle( ms_handle, entities );
3701 std::cout << prefix <<
"MBENTITYSET " <<
ID_FROM_HANDLE( ms_handle ) << std::endl;
3705 get_entities_by_dimension( 0, 3, entities );
3706 if( entities.
empty() ) get_entities_by_dimension( 0, 2, entities );
3707 if( entities.
empty() ) get_entities_by_dimension( 0, 1, entities );
3708 get_entities_by_dimension( 0, 0, entities );
3710 std::cout << prefix <<
"--: " << std::endl;
3713 std::string indent_prefix = prefix;
3714 indent_prefix +=
" ";
3715 entities.
print( indent_prefix.c_str() );
3717 if( !first_call || !ms_handle )
return;
3721 this->get_parent_meshsets( ms_handle, temp );
3722 std::cout <<
" Parent sets: ";
3724 std::cout <<
"(none)" << std::endl;
3729 if( rit != temp.
begin() ) std::cout <<
", ";
3732 std::cout << std::endl;
3736 this->get_child_meshsets( ms_handle, temp );
3737 std::cout <<
" Child sets: ";
3739 std::cout <<
"(none)" << std::endl;
3744 if( rit != temp.
begin() ) std::cout <<
", ";
3747 std::cout << std::endl;
3751 print_entity_tags( indent_prefix, ms_handle,
MB_TAG_SPARSE );
3756 std::vector< Tag > set_tags;
3757 ErrorCode result = this->tag_get_tags_on_entity( handle, set_tags );
3758 std::cout << indent_prefix << ( tp ==
MB_TAG_SPARSE ?
"Sparse tags:" :
"Dense tags:" ) << std::endl;
3759 indent_prefix +=
" ";
3761 for( std::vector< Tag >::iterator vit = set_tags.begin(); vit != set_tags.end(); ++vit )
3764 result = this->tag_get_type( *vit, this_type );
3765 if(
MB_SUCCESS != result || tp != this_type )
continue;
3767 result = this->tag_get_data_type( *vit, this_data_type );
3770 result = this->tag_get_length( *vit, this_size );
3773 std::vector< double > dbl_vals( this_size );
3774 std::vector< int > int_vals( this_size );
3775 std::vector< EntityHandle > hdl_vals( this_size );
3776 std::string tag_name;
3777 result = this->tag_get_name( *vit, tag_name );
3779 switch( this_data_type )
3782 result = this->tag_get_data( *vit, &handle, 1, &int_vals[0] );
3784 std::cout << indent_prefix << tag_name <<
" = ";
3785 if( this_size < 10 )
3786 for(
int i = 0; i < this_size; i++ )
3787 std::cout << int_vals[i] <<
" ";
3789 std::cout << int_vals[0] <<
"... (mult values)";
3790 std::cout << std::endl;
3793 result = this->tag_get_data( *vit, &handle, 1, &dbl_vals[0] );
3795 std::cout << indent_prefix << tag_name <<
" = ";
3796 if( this_size < 10 )
3797 for(
int i = 0; i < this_size; i++ )
3798 std::cout << dbl_vals[i] <<
" ";
3800 std::cout << dbl_vals[0] <<
"... (mult values)";
3801 std::cout << std::endl;
3804 result = this->tag_get_data( *vit, &handle, 1, &hdl_vals[0] );
3806 std::cout << indent_prefix << tag_name <<
" = ";
3807 if( this_size < 10 )
3808 for(
int i = 0; i < this_size; i++ )
3809 std::cout << hdl_vals[i] <<
" ";
3811 std::cout << hdl_vals[0] <<
"... (mult values)";
3812 std::cout << std::endl;
3818 result = this->tag_get_data( *vit, &handle, 1, &dum_tag );
3822 std::cout << indent_prefix << tag_name <<
" = " << dum_tag << std::endl;
3837 ErrorCode result = get_entities_by_handle( 0, all_ents );
3842 result = check_adjacencies( &( *rit ), 1 );
3853 std::ostringstream oss;
3855 for(
int i = 0; i < num_ents; i++ )
3858 std::ostringstream ent_str;
3860 int this_dim = dimension_from_handle( this_ent );
3862 if( !is_valid( this_ent ) )
3864 std::cerr << ent_str.str() <<
"Not a valid entity." << std::endl;
3865 result = MB_FAILURE;
3874 for(
int dim = 0; dim <= 3; dim++ )
3876 if( dim == this_dim )
continue;
3877 tmp_result = get_adjacencies( &this_ent, 1, dim,
false, adjs,
Interface::UNION );
3880 oss << ent_str.str() <<
"Failed to get adjacencies for dimension " << dim <<
"." << std::endl;
3881 result = tmp_result;
3884 if( !oss.str().empty() )
3886 std::cerr << oss.str();
3894 tmp_result = sequence_manager()->find( *rit, seq );
3899 result = tmp_result;
3904 tmp_result = get_adjacencies( &( *rit ), 1, this_dim,
false, rev_adjs );
3907 oss << ent_str.str() <<
"Failed to get reverse adjacency from "
3910 oss <<
" (MULTIPLE)" << std::endl;
3912 oss <<
" (" << tmp_result <<
")" << std::endl;
3913 result = tmp_result;
3915 else if( rev_adjs.
find( this_ent ) == rev_adjs.
end() )
3917 oss << ent_str.str() <<
"Failed to find adjacency to this entity from "
3920 result = tmp_result;
3923 if( !oss.str().empty() )
3925 std::cerr << oss.str();
3938 ErrorCode result = sequence_manager()->find( this_ent, seq );
3943 EntityType ent_type,
3950 unsigned int setoptions;
3953 MB_CHK_SET_ERR( get_meshset_options( meshset, setoptions ),
"can't get meshset options" );
3957 set_iter =
new( std::nothrow )
RangeSetIterator(
this, meshset, chunk_size, ent_type, ent_dim, check_valid );
3959 set_iter =
new( std::nothrow )
VectorSetIterator(
this, meshset, chunk_size, ent_type, ent_dim, check_valid );
3961 setIterators.push_back( set_iter );
3972 std::vector< SetIterator* >::iterator vit = std::find( setIterators.begin(), setIterators.end(), set_iter );
3973 if( vit == setIterators.end() )
3975 MB_SET_ERR( MB_FAILURE,
"Didn't find that iterator" );
3978 setIterators.erase( vit );
3989 for( std::vector< SetIterator* >::const_iterator vit = setIterators.begin(); vit != setIterators.end(); ++vit )
3990 if( ( *vit )->ent_set() == meshset ) set_iters.push_back( *vit );
4001 const Tag* tag_array,
4007 type_memstorage i_entity_storage, ia_entity_storage, i_adjacency_storage, ia_adjacency_storage, i_tag_storage,
4009 type_memstorage *total_tag_storage = 0, *amortized_total_tag_storage = 0;
4012 total_tag_storage = tag_storage;
4013 amortized_total_tag_storage = amortized_tag_storage;
4015 if( total_storage || total_amortized_storage )
4017 if( !entity_storage ) entity_storage = &i_entity_storage;
4018 if( !amortized_entity_storage ) amortized_entity_storage = &ia_entity_storage;
4019 if( !adjacency_storage ) adjacency_storage = &i_adjacency_storage;
4020 if( !amortized_adjacency_storage ) amortized_adjacency_storage = &ia_adjacency_storage;
4024 if( entity_storage || amortized_entity_storage )
4026 if( !amortized_entity_storage )
4027 amortized_entity_storage = &ia_entity_storage;
4028 else if( !entity_storage )
4029 entity_storage = &i_entity_storage;
4031 if( adjacency_storage || amortized_adjacency_storage )
4033 if( !amortized_adjacency_storage )
4034 amortized_adjacency_storage = &ia_adjacency_storage;
4035 else if( !adjacency_storage )
4036 adjacency_storage = &i_adjacency_storage;
4039 if( !total_tag_storage && total_storage ) total_tag_storage = &i_tag_storage;
4040 if( !amortized_total_tag_storage && total_amortized_storage ) amortized_total_tag_storage = &ia_tag_storage;
4043 if( amortized_entity_storage )
4046 sequenceManager->get_memory_use( *ents, *entity_storage, *amortized_entity_storage );
4048 sequenceManager->get_memory_use( *entity_storage, *amortized_entity_storage );
4052 if( amortized_adjacency_storage )
4055 aEntityFactory->get_memory_use( *ents, *adjacency_storage, *amortized_adjacency_storage );
4057 #ifdef MOAB_HAVE_AHF
4058 ahfRep->get_memory_use( *adjacency_storage, *amortized_adjacency_storage );
4060 aEntityFactory->get_memory_use( *adjacency_storage, *amortized_adjacency_storage );
4067 for(
unsigned i = 0; i < num_tags; ++i )
4069 if( !valid_tag_handle( tag_array[i] ) )
continue;
4071 unsigned long total = 0, per_ent = 0;
4076 size_t count = 0, count2 = 0;
4078 if( tag_storage ) tag_storage[i] = count * per_ent;
4079 if( amortized_tag_storage )
4083 amortized_tag_storage[i] =
static_cast< type_memstorage >( total * count * 1.0 / count2 );
4092 tag_storage[i] = count * per_ent;
4094 if( amortized_tag_storage ) amortized_tag_storage[i] = total;
4100 if( total_tag_storage || amortized_total_tag_storage )
4102 if( amortized_total_tag_storage ) *amortized_total_tag_storage = 0;
4103 if( total_tag_storage ) *total_tag_storage = 0;
4105 std::vector< Tag > tags;
4106 tag_get_tags( tags );
4107 for( std::list< TagInfo* >::const_iterator i = tagList.begin(); i != tagList.end(); ++i )
4109 unsigned long total = 0, per_ent = 0;
4110 ( *i )->get_memory_use( sequenceManager, total, per_ent );
4114 size_t count = 0, count2 = 0;
4115 ( *i )->num_tagged_entities( sequenceManager, count,
MBMAXTYPE, ents );
4116 if( total_tag_storage ) *total_tag_storage += count * per_ent;
4117 if( amortized_total_tag_storage )
4119 ( *i )->num_tagged_entities( sequenceManager, count2 );
4121 *amortized_total_tag_storage +=
static_cast< type_memstorage >( total * count * 1.0 / count2 );
4127 if( total_tag_storage )
4129 ( *i )->num_tagged_entities( sequenceManager, count );
4130 *total_tag_storage += count * per_ent;
4132 if( amortized_total_tag_storage ) *amortized_total_tag_storage += total;
4138 if( total_storage ) *total_storage = *entity_storage + *adjacency_storage + *total_tag_storage;
4140 if( total_amortized_storage )
4141 *total_amortized_storage =
4142 *amortized_entity_storage + *amortized_adjacency_storage + *amortized_total_tag_storage;
4146 unsigned long num_ents,
4153 const Tag* tag_array,
4165 std::vector< EntityHandle > list( num_ents );
4166 std::copy( ent_array, ent_array + num_ents, list.begin() );
4167 std::sort( list.begin(), list.end() );
4169 for( std::vector< EntityHandle >::reverse_iterator i = list.rbegin(); i != list.rend(); ++i )
4170 j = range.
insert( j, *i, *i );
4174 std::copy( ent_array, ent_array + num_ents,
range_inserter( range ) );
4178 estimated_memory_use_internal( ent_array ? &range : 0, total_storage, total_amortized_storage, entity_storage,
4179 amortized_entity_storage, adjacency_storage, amortized_adjacency_storage, tag_array,
4180 num_tags, tag_storage, amortized_tag_storage );
4190 const Tag* tag_array,
4195 estimated_memory_use_internal( &ents, total_storage, total_amortized_storage, entity_storage,
4196 amortized_entity_storage, adjacency_storage, amortized_adjacency_storage, tag_array,
4197 num_tags, tag_storage, amortized_tag_storage );
4205 if( !verts.
empty() )
4206 printf(
" Vertex ID X Y Z Adjacencies \n"
4207 " ---------- -------- -------- -------- -----------...\n" );
4210 for( i = verts.
begin(); i != verts.
end(); ++i )
4222 printf(
" %10d %8g %8g %8g", (
int)
ID_FROM_HANDLE( h ), c[0], c[1], c[2] );
4224 printf(
" %10d < ERROR %4d >", (
int)
ID_FROM_HANDLE( h ), (
int)rval );
4226 rval = a_entity_factory()->get_adjacencies( h, adj, nadj );
4229 printf(
" <ERROR %d>\n", (
int)rval );
4233 for(
int j = 0; j < nadj; ++j )
4249 if( elems.
empty() )
continue;
4252 for( i = elems.
begin(); i != elems.
end(); ++i )
4255 if( n > clen ) clen = n;
4259 if( clen < (
int)strlen(
"Connectivity" ) ) clen = strlen(
"Connectivity" );
4260 std::vector< char >
dashes( clen,
'-' );
4261 dashes.push_back(
'\0' );
4262 printf(
" %7s ID %-*s Adjacencies\n",
CN::EntityTypeName( t ), clen,
"Connectivity" );
4263 printf(
" ---------- %s -----------...\n", &
dashes[0] );
4265 std::vector< EntityHandle > storage;
4268 for( i = elems.
begin(); i != elems.
end(); ++i )
4278 rval = get_connectivity( h, conn, nconn,
false, &storage );
4280 printf(
" <ERROR %2d>%*s", (
int)rval, clen - 10,
"" );
4283 for(
int j = 0; j < nconn; ++j )
4285 printf(
"%*s", clen - 5 * nconn,
"" );
4288 rval = a_entity_factory()->get_adjacencies( h, adj, nadj );
4291 printf(
" <ERROR %d>\n", (
int)rval );
4295 for(
int j = 0; j < nadj; ++j )
4312 EntityType entity_type,
4321 if( !scdInterface ) scdInterface =
new ScdInterface(
this );
4323 MB_CHK_SET_ERR( scdInterface->create_scd_sequence( coord_min, coord_max, entity_type,
4324 (
int)start_id_hint, newBox ),
4325 "can't create scd sequence" );
4328 first_handle_out = newBox->
get_vertex( coord_min );
4330 first_handle_out = newBox->
get_element( coord_min );
4331 return sequence_manager()->find( first_handle_out, sequence_out );
4346 return sequence_manager()->add_vsequence( vert_seq, elem_seq, p1, q1, p2, q2, p3, q3, bb_input, bb_min, bb_max );