80 #define CHK_SET_CCMERR( ccm_err_code, ccm_err_msg ) \
82 if( kCCMIONoErr != ( ccm_err_code ) && kCCMIONoFileErr != ( ccm_err_code ) && \
83 kCCMIONoNodeErr != ( ccm_err_code ) ) \
84 MB_SET_ERR( MB_FAILURE, ccm_err_msg ); \
93 : mMaterialIdTag( 0 ), mMaterialTypeTag( 0 ), mRadiationTag( 0 ), mPorosityIdTag( 0 ), mSpinIdTag( 0 ),
94 mGroupIdTag( 0 ), mColorIdxTag( 0 ), mProcessorIdTag( 0 ), mLightMaterialTag( 0 ), mFreeSurfaceMaterialTag( 0 ),
95 mThicknessTag( 0 ), mProstarRegionNumberTag( 0 ), mBoundaryTypeTag( 0 ), mCreatingProgramTag( 0 ), mbImpl( impl ),
98 assert( impl != NULL );
111 const int negone = -1;
124 const int negonearr[] = { -1, -1, -1, -1 };
147 CCMIOID rootID, problemID, stateID, processorID, verticesID, topologyID, solutionID;
148 CCMIOError
error = kCCMIONoErr;
155 CCMIOOpenFile( &
error, file_name, kCCMIORead, &rootID );
162 std::vector< CCMIOSize_t > procs;
163 bool has_solution =
false;
165 "Failed to get processors" );
167 std::vector< CCMIOSize_t >::iterator vit;
168 Range new_ents, *new_ents_ptr = NULL;
169 if( file_set ) new_ents_ptr = &new_ents;
171 for( vit = procs.begin(); vit != procs.end(); ++vit )
174 "Failed to read processors" );
179 "Failed to load some meta-data" );
192 CCMIOError
error = kCCMIONoErr;
195 CCMIOGetState( &
error, rootID,
"default", &problemID, &stateID );
196 if( kCCMIONoErr !=
error )
198 CCMIOSize_t i = CCMIOSIZEC( 0 );
199 CCMIOError tmp_error = kCCMIONoErr;
200 CCMIONextEntity( &tmp_error, rootID, kCCMIOState, &i, &stateID );
201 if( kCCMIONoErr == tmp_error ) CCMIONextEntity( &
error, rootID, kCCMIOProblemDescription, &i, &problemID );
215 CCMIOError
error = kCCMIONoErr;
218 if( kCCMIONoErr == CCMIOGetEntityNode( &
error, rootID, &rootNode ) )
221 CCMIOGetTitle( &
error, rootNode, &name );
223 if( NULL != name && strlen( name ) != 0 )
229 "Simulation name tag not found or created" );
233 if( name ) free( name );
239 "Trouble getting CreatingProgram tag" );
254 CCMIOSize_t i = CCMIOSIZEC( 0 );
256 CCMIOError
error = kCCMIONoErr;
258 while( CCMIONextEntity( NULL, problemID, kCCMIOCellType, &i, &next ) == kCCMIONoErr )
262 CCMIOGetEntityIndex( &
error, next, &mindex );
263 std::map< int, EntityHandle >::iterator mit =
newMatsets.find( mindex );
270 "Trouble setting material set tag" );
274 CCMIOEntityLabel( &
error, next, &len, NULL );
275 std::vector< char > opt_string2( GETINT32( len ) + 1,
'\0' );
276 CCMIOEntityLabel( &
error, next, NULL, &opt_string2[0] );
282 "Trouble setting name tag for material set" );
286 "Trouble getting MaterialId tag" );
289 "Trouble getting MaterialType tag" );
292 "Trouble getting Radiation option" );
295 "Trouble getting PorosityId option" );
304 "Trouble getting ProcessorId option" );
307 "Trouble getting LightMaterial option" );
310 "Trouble getting FreeSurfaceMaterial option" );
313 "Trouble getting Thickness option" );
323 if( kCCMIONoErr == CCMIOReadOpti( NULL, node, opt_str, &idum ) )
328 "Failed to get tag handle" );
340 if( kCCMIONoErr == CCMIOReadOptf( NULL, node, opt_str, &fdum ) )
346 "Failed to get tag handle" );
349 double dum_dbl = fdum;
360 const char* other_tag_name )
363 CCMIOError
error = kCCMIONoErr;
364 std::vector< char > opt_string;
365 if( kCCMIONoErr != CCMIOReadOptstr( NULL, node, opt_str, &len, NULL ) )
return MB_SUCCESS;
367 opt_string.resize( len );
368 CCMIOReadOptstr( &
error, node, opt_str, &len, &opt_string[0] );
374 "Failed to get tag handle" );
389 CCMIOSize_t i = CCMIOSIZEC( 0 );
395 while( CCMIONextEntity( NULL, problemID, kCCMIOBoundaryRegion, &i, &next ) == kCCMIONoErr )
399 CCMIOError
error = kCCMIONoErr;
400 CCMIOGetEntityIndex( &
error, next, &mindex );
401 std::map< int, EntityHandle >::iterator mit =
newNeusets.find( mindex );
408 "Trouble setting neumann set tag" );
412 "Trouble creating BoundaryName tag" );
416 "Trouble creating BoundaryType tag" );
420 "Trouble creating ProstarRegionNumber tag" );
440 "Failed to read vertices" );
442 MB_CHK_SET_ERR(
read_cells( proc, problemID, verticesID, topologyID, vert_map, new_ents ),
"Failed to read cells" );
468 "Failed to read all cells" );
471 std::map< int, int > cell_topo_types;
476 MB_CHK_SET_ERR( face_map.sort( 1 ),
"Couldn't sort face map by cell id" );
478 std::vector< EntityHandle > new_cells;
483 vert_map, cell_topo_types, new_cells ),
484 "Failed to construct cells" );
488 std::vector< EntityHandle >::reverse_iterator vit;
489 for( vit = new_cells.rbegin(); vit != new_cells.rend(); ++vit )
490 rit = new_ents->
insert( rit, *vit );
500 CCMIOError
error = kCCMIONoErr;
501 CCMIOID cellID, mapID;
503 CCMIOGetEntity( &
error, topologyID, kCCMIOCells, 0, &cellID );
504 CCMIOEntitySize( &
error, cellID, &ncells, NULL );
505 int num_cells = GETINT32( ncells );
509 CCMIOReadOpt1i( &
error, cellID,
"CellTopologyType", &dum_int, CCMIOINDEXC( kCCMIOStart ),
510 CCMIOINDEXC( kCCMIOStart ) + 1 );
514 std::vector< int > dum_ints( num_cells );
515 CCMIOReadCells( &
error, cellID, &mapID, &dum_ints[0], CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOStart ) + 1 );
519 CCMIOReadMap( &
error, mapID, &dum_ints[0], CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) );
522 for( i = 0; i < num_cells; i++ )
523 cell_topo_types[dum_ints[i]] = 0;
526 std::vector< int > topo_types( num_cells );
527 CCMIOReadOpt1i( &
error, cellID,
"CellTopologyType", &topo_types[0], CCMIOINDEXC( kCCMIOStart ),
528 CCMIOINDEXC( kCCMIOEnd ) );
530 for( i = 0; i < num_cells; i++ )
531 cell_topo_types[dum_ints[i]] = topo_types[i];
538 std::vector< EntityHandle >& cells )
541 CCMIOSize_t dum_cells;
543 CCMIOError
error = kCCMIONoErr;
544 CCMIOID cellsID, mapID;
545 CCMIOGetEntity( &
error, topologyID, kCCMIOCells, 0, &cellsID );
546 CCMIOEntitySize( &
error, cellsID, &dum_cells, NULL );
547 num_cells = GETINT32( dum_cells );
550 if( num_cells != (
int)cells.size() )
MB_SET_ERR( MB_FAILURE,
"Number of cells doesn't agree" );
553 std::vector< int > cell_gids( num_cells );
554 CCMIOReadCells( &
error, cellsID, &mapID, NULL, CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) );
556 CCMIOReadMap( &
error, mapID, &cell_gids[0], CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) );
560 "Couldn't set gids tag" );
563 CCMIOReadCells( &
error, cellsID, NULL, &cell_gids[0], CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) );
567 std::map< int, Range > matset_ents;
568 for(
int i = 0; i < num_cells; i++ )
569 matset_ents[cell_gids[i]].insert( cells[i] );
571 for( std::map< int, Range >::iterator mit = matset_ents.begin(); mit != matset_ents.end(); ++mit )
588 std::map< int, int >& cell_topo_types,
589 std::vector< EntityHandle >& new_cells )
591 std::vector< EntityHandle > facehs;
592 std::vector< int > senses;
596 bool has_mid_nodes =
false;
599 while( i < face_map.n )
603 int this_id = face_map.get_int( i );
604 unsigned int inext = i;
605 while( face_map.get_int( inext ) == this_id && inext <= face_map.n )
609 facehs.push_back(
face );
610 senses.push_back( face_map.get_short( inext ) );
613 has_mid_nodes =
false;
615 std::map< int, std::vector< EntityHandle > >::iterator fmit;
616 std::map< int, std::vector< int > >::iterator smit;
617 std::map< int, int >::iterator typeit;
618 for( fmit = face_map.begin(), smit = sense_map.begin(); fmit != face_map.end(); ++fmit, ++smit )
622 int this_id = ( *fmit ).first;
623 facehs = ( *fmit ).second;
625 senses = ( *smit ).second;
626 typeit = cell_topo_types.find( this_id );
627 if( typeit != cell_topo_types.end() )
634 has_mid_nodes =
false;
642 new_cells.push_back( cell );
701 has_mid_nodes =
true;
711 std::vector< int >& senses,
712 EntityType this_type,
720 bool same_type =
true;
721 for( std::vector< EntityHandle >::iterator vit = facehs.begin(); vit != facehs.end(); ++vit )
730 std::vector< EntityHandle > verts;
731 EntityType input_type = this_type;
732 std::vector< EntityHandle > storage;
738 if( (
MBTET == input_type ||
MBMAXTYPE == input_type ) && same_type && face_type ==
MBTRI && facehs.size() == 4 )
745 if( senses[0] > 0 ) std::reverse( verts.begin(), verts.end() );
751 "Couldn't get connectivity" );
753 while( std::find( verts.begin(), verts.end(), conn[i] ) != verts.end() && i < conn_size )
760 verts.push_back( conn[i] );
763 else if( (
MBHEX == input_type ||
MBMAXTYPE == input_type ) && same_type &&
MBQUAD == face_type &&
777 Range tmp_faces, tmp_verts;
781 if( senses[0] > 0 ) std::reverse( verts.begin(), verts.end() );
784 std::copy( facehs.begin(), facehs.end(),
range_inserter( tmp_faces ) );
787 tmp_faces.
erase( facehs[0] );
791 tmp_verts.
erase( verts[0] );
792 tmp_verts.
erase( verts[1] );
794 std::copy( facehs.begin(), facehs.end(),
range_inserter( tmp_faces ) );
797 tmp_faces.
erase( q1 );
809 unsigned int ioff = std::find( storage.begin(), storage.end(), v0 ) - storage.begin();
810 if( 4 == ioff )
MB_SET_ERR( MB_FAILURE,
"Trouble finding offset" );
812 if( storage[( ioff + 1 ) % 4] != v1 )
814 std::reverse( storage.begin(), storage.end() );
815 ioff = std::find( storage.begin(), storage.end(), v0 ) - storage.begin();
817 if( 0 != ioff ) std::rotate( storage.begin(), storage.begin() + ioff, storage.end() );
820 std::copy( storage.begin(), storage.end(), std::back_inserter( verts ) );
825 if(
MBMAXTYPE == this_type && facehs.size() == 5 )
828 std::vector< EntityHandle > tris, quads;
829 for(
unsigned int i = 0; i < 5; i++ )
832 tris.push_back( facehs[i] );
834 quads.push_back( facehs[i] );
838 if( 2 == tris.size() && 3 == quads.size() )
843 int index = std::find( facehs.begin(), facehs.end(), tris[0] ) - facehs.begin();
845 if( senses[
index] > 0 ) std::reverse( verts.begin(), verts.end() );
849 Range tmp_faces, tmp_verts;
850 std::copy( facehs.begin(), facehs.end(),
range_inserter( tmp_faces ) );
853 tmp_faces.
erase( tris[0] );
868 index = std::find( facehs.begin(), facehs.end(), tris[1] ) - facehs.begin();
869 if( senses[
index] < 0 ) std::reverse( storage.begin(), storage.end() );
870 unsigned int ioff = std::find( storage.begin(), storage.end(), v0 ) - storage.begin();
871 if( 3 == ioff )
MB_SET_ERR( MB_FAILURE,
"Trouble finding offset" );
872 for(
unsigned int i = 0; i < 3; i++ )
873 verts.push_back( storage[( ioff + i ) % 3] );
878 else if( tris.size() == 4 && quads.size() == 1 )
882 int index = std::find( facehs.begin(), facehs.end(), quads[0] ) - facehs.begin();
884 if( senses[
index] > 0 ) std::reverse( verts.begin(), verts.end() );
888 for(
unsigned int i = 0; i < 3; i++ )
890 if( std::find( verts.begin(), verts.end(), storage[i] ) == verts.end() )
892 verts.push_back( storage[i] );
897 if( 5 == verts.size() ) this_type =
MBPYRAMID;
907 std::cerr <<
"Warning: types disagree (cell_topo_type = " <<
CN::EntityTypeName( input_type )
911 std::cerr <<
"Warning: couldn't find proper connectivity for specified topo_type = "
918 "create_element failed" );
939 CCMIOError
error = kCCMIONoErr;
943 index = CCMIOSIZEC( 0 );
947 while( kCCMIONoErr == CCMIONextEntity( NULL, topologyID, kCCMIOBoundaryFaces, &
index, &faceID ) )
949 CCMIOEntitySize( &
error, faceID, &nf, NULL );
952 CCMIOGetEntity( &
error, topologyID, kCCMIOInternalFaces, 0, &faceID );
953 CCMIOEntitySize( &
error, faceID, &nf, NULL );
956 face_map.resize( 2 * nint_faces + nbdy_faces );
960 index = CCMIOSIZEC( 0 );
961 while( kCCMIONoErr == CCMIONextEntity( NULL, topologyID, kCCMIOBoundaryFaces, &
index, &faceID ) )
968 "Trouble reading boundary faces" );
972 CCMIOGetEntity( &
error, topologyID, kCCMIOInternalFaces, 0, &faceID );
980 "Trouble reading internal faces" );
986 CCMIOEntity bdy_or_int,
994 if( kCCMIOInternalFaces != bdy_or_int && kCCMIOBoundaryFaces != bdy_or_int )
995 MB_SET_ERR( MB_FAILURE,
"Face type isn't boundary or internal" );
997 CCMIOSize_t dum_faces;
998 CCMIOError
error = kCCMIONoErr;
999 CCMIOEntitySize( &
error, faceID, &dum_faces, NULL );
1000 int num_faces = GETINT32( dum_faces );
1004 CCMIOSize_t farray_size = CCMIOSIZEC( 0 );
1005 CCMIOReadFaces( &
error, faceID, bdy_or_int, NULL, &farray_size, NULL, CCMIOINDEXC( kCCMIOStart ),
1006 CCMIOINDEXC( kCCMIOEnd ) );
1011 int num_sides = ( kCCMIOInternalFaces == bdy_or_int ? 2 : 1 );
1012 int* farray =
new int[GETINT32( farray_size )];
1016 CCMIOReadFaces( &
error, faceID, bdy_or_int, &mapID, NULL, farray, CCMIOINDEXC( kCCMIOStart ),
1017 CCMIOINDEXC( kCCMIOEnd ) );
1020 std::vector< EntityHandle > face_handles;
1025 if( num_sides * num_faces < farray_size )
1026 face_cells =
new int[num_sides * num_faces];
1028 face_cells = farray;
1029 CCMIOReadFaceCells( &
error, faceID, bdy_or_int, face_cells, CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) );
1032 int* tmp_ptr = face_cells;
1033 for(
unsigned int i = 0; i < face_handles.size(); i++ )
1036 short forward = 1, reverse = -1;
1037 face_map.push_back( &forward, tmp_ptr++, &face_handles[i], NULL );
1038 if( 2 == num_sides ) face_map.push_back( &reverse, tmp_ptr++, &face_handles[i], NULL );
1040 face_map[*tmp_ptr].push_back( face_handles[i] );
1041 sense_map[*tmp_ptr++].push_back( 1 );
1042 if( 2 == num_sides )
1044 face_map[*tmp_ptr].push_back( face_handles[i] );
1045 sense_map[*tmp_ptr++].push_back( -1 );
1051 CCMIOReadMap( &
error, mapID, face_cells, CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) );
1055 "Couldn't set face global ids" );
1058 if( kCCMIOBoundaryFaces == bdy_or_int )
1065 CCMIOGetEntityIndex( &
error, faceID, &
index );
1069 "Failed to add faces to neumann set" );
1078 std::sort( face_handles.begin(), face_handles.end() );
1079 std::copy( face_handles.rbegin(), face_handles.rend(),
range_inserter( *new_faces ) );
1087 std::vector< EntityHandle >& new_faces,
1090 std::vector< EntityHandle > verts;
1093 for(
int i = 0; i < num_faces; i++ )
1095 int num_verts = *farray++;
1096 verts.resize( num_verts );
1099 for(
int j = 0; j < num_verts; j++ )
1102 int tindex = vert_map.find( 1, farray[j] );
1105 tmp_rval = MB_FAILURE;
1108 verts[j] = vert_map.get_ulong( tindex, 0 );
1110 verts[j] = ( vert_map[farray[j]] )[0];
1113 farray += num_verts;
1121 if( faceh ) new_faces.push_back( faceh );
1124 if(
MB_SUCCESS != tmp_rval ) rval = tmp_rval;
1137 CCMIOError
error = kCCMIONoErr;
1140 CCMIOSize_t nverts = CCMIOSIZEC( 0 );
1141 CCMIOEntitySize( &
error, verticesID, &nverts, NULL );
1147 CCMIOReadVerticesf( &
error, verticesID, &dims, NULL, NULL, NULL, CCMIOINDEXC( 0 ), CCMIOINDEXC( 1 ) );
1152 std::vector< double* > arrays;
1157 std::vector< double > tmp_coords( GETINT32( dims ) * GETINT32( nverts ) );
1158 CCMIOReadVerticesd( &
error, verticesID, &dims, &scale, &mapID, &tmp_coords[0], CCMIOINDEXC( 0 ),
1159 CCMIOINDEXC( 0 + nverts ) );
1163 int i = 0, threei = 0;
1164 for( ; i < nverts; i++ )
1166 arrays[0][i] = tmp_coords[threei++];
1167 arrays[1][i] = tmp_coords[threei++];
1168 if( 3 == GETINT32( dims ) )
1169 arrays[2][i] = tmp_coords[threei++];
1177 for( i = 0; i < nverts; i++ )
1179 arrays[0][i] *= scale;
1180 arrays[1][i] *= scale;
1181 if( 3 == GETINT32( dims ) ) arrays[2][i] *= scale;
1186 std::vector< int > gids( GETINT32( nverts ) );
1187 CCMIOReadMap( &
error, mapID, &gids[0], CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) );
1191 Range new_verts( node_handle, node_handle + nverts - 1 );
1196 vert_map.resize( GETINT32( nverts ) );
1197 for( i = 0; i < GETINT32( nverts ); i++ )
1199 vert_map.push_back( NULL, &gids[i], &node_handle, NULL );
1201 for( i = 0; i < GETINT32( nverts ); i++ )
1203 ( vert_map[gids[i]] ).push_back( node_handle );
1208 if( verts ) verts->
merge( new_verts );
1214 CCMIOID& processorID,
1215 CCMIOID& verticesID,
1216 CCMIOID& topologyID,
1217 CCMIOID& solutionID,
1218 std::vector< CCMIOSize_t >& procs,
1221 CCMIOSize_t proc = CCMIOSIZEC( 0 );
1222 CCMIOError
error = kCCMIONoErr;
1224 CCMIONextEntity( &
error, stateID, kCCMIOProcessor, &proc, &processorID );
1226 if( CCMIOReadProcessor( NULL, processorID, &verticesID, &topologyID, NULL, &solutionID ) != kCCMIONoErr )
1229 CCMIOReadProcessor( &
error, processorID, &verticesID, &topologyID, NULL, NULL );
1234 procs.push_back( proc );
1242 std::vector< int >& ,