47 #pragma warning( disable : 4786 )
53 #include "ccmioutility.h"
54 #include "ccmiocore.h"
99 #define CHK_SET_CCMERR( ccm_err_code, ccm_err_msg ) \
101 if( kCCMIONoErr != ( ccm_err_code ) ) MB_SET_ERR( MB_FAILURE, ccm_err_msg ); \
110 : mbImpl( impl ), mCurrentMeshHandle( 0 ), mPartitionSetTag( 0 ), mNameTag( 0 ), mMaterialIdTag( 0 ),
111 mMaterialTypeTag( 0 ), mRadiationTag( 0 ), mPorosityIdTag( 0 ), mSpinIdTag( 0 ), mGroupIdTag( 0 ),
112 mColorIdxTag( 0 ), mProcessorIdTag( 0 ), mLightMaterialTag( 0 ), mFreeSurfaceMaterialTag( 0 ), mThicknessTag( 0 ),
113 mProstarRegionNumberTag( 0 ), mBoundaryTypeTag( 0 ), mCreatingProgramTag( 0 ), mDimension( 0 ),
116 assert( impl != NULL );
139 int dum_val_array[] = { -1, -1, -1, -1 };
156 const bool overwrite,
160 const std::vector< std::string >& ,
172 FILE* file = fopen( file_name,
"r" );
182 std::vector< EntityHandle > matsets, dirsets, neusets, partsets;
185 result =
get_sets( ent_handles, num_sets, matsets, dirsets, neusets, partsets );
189 if( ent_handles && matsets.empty() )
195 if( matsets.empty() ) matsets.push_back( 0 );
197 std::vector< MaterialSetData > matset_info;
207 CCMIOID rootID, topologyID, stateID, problemID, verticesID, processorID;
210 result =
open_file( file_name, overwrite, rootID );
214 MB_CHK_SET_ERR( result,
"Problem creating CCMIO file structure" );
219 std::vector< NeumannSetData > neuset_info;
249 CCMIOError
error = kCCMIONoErr;
253 CCMIOWriteProcessor( &
error, processorID, NULL, &verticesID, NULL, &topologyID, NULL, NULL, NULL, NULL );
262 CCMIOError
error = kCCMIONoErr;
265 if( CCMIOGetState( NULL, rootID,
kStateName, NULL, &stateID ) != kCCMIONoErr )
272 CCMIOSize_t i = CCMIOSIZEC( 0 );
273 if( CCMIONextEntity( NULL, stateID, kCCMIOProcessor, &i, &processorID ) != kCCMIONoErr )
275 CCMIONewEntity( &
error, stateID, kCCMIOProcessor, NULL, &processorID );
282 CCMIOClearProcessor( &
error, stateID, processorID, TRUE, TRUE, TRUE, TRUE, TRUE );
298 CCMIOError
error = kCCMIONoErr;
299 CCMIOCloseFile( &
error, rootID );
316 CCMIOError
error = kCCMIONoErr;
317 CCMIOOpenFile( &
error, filename, kCCMIOWrite, &rootID );
325 std::vector< EntityHandle >& matsets,
326 std::vector< EntityHandle >& dirsets,
327 std::vector< EntityHandle >& neusets,
328 std::vector< EntityHandle >& partsets )
335 std::copy( this_range.
begin(), this_range.
end(), std::back_inserter( matsets ) );
338 std::copy( this_range.
begin(), this_range.
end(), std::back_inserter( dirsets ) );
341 std::copy( this_range.
begin(), this_range.
end(), std::back_inserter( neusets ) );
346 std::copy( this_range.
begin(), this_range.
end(), std::back_inserter( partsets ) );
352 for(
const EntityHandle* iter = ent_handles; iter < ent_handles + num_sets; ++iter )
355 matsets.push_back( *iter );
357 dirsets.push_back( *iter );
359 neusets.push_back( *iter );
361 partsets.push_back( *iter );
372 std::vector< WriteCCMIO::MaterialSetData >& matset_data,
373 std::vector< WriteCCMIO::NeumannSetData >& neuset_data )
379 CCMIOError
error = kCCMIONoErr;
383 bool root_tagged =
false, other_set_tagged =
false;
393 std::vector< char > title_tag( tag_size + 1 );
398 "Problem getting simulation name tag" );
399 other_set_tagged =
true;
410 *title_tag.rbegin() =
'\0';
411 if( root_tagged || other_set_tagged )
414 if( kCCMIONoErr == CCMIOGetEntityNode( &
error, rootID, &rootNode ) )
416 CCMIOSetTitle( &
error, rootNode, &title_tag[0] );
430 std::vector< char > cp_tag( tag_size + 1 );
435 "Problem getting creating program tag" );
436 other_set_tagged =
true;
447 *cp_tag.rbegin() =
'\0';
448 if( root_tagged || other_set_tagged )
451 if( kCCMIONoErr == CCMIOGetEntityNode( &
error, rootID, &rootNode ) )
453 CCMIOWriteOptstr( &
error, processorID,
"CreatingProgram", &cp_tag[0] );
460 CCMIONewEntity( &
error, rootID, kCCMIOProblemDescription, NULL, &problemID );
464 for(
unsigned int i = 0; i < matset_data.size(); i++ )
466 if( !matset_data[i].setName.empty() )
468 CCMIONewIndexedEntity( &
error, problemID, kCCMIOCellType, matset_data[i].matsetId,
469 matset_data[i].setName.c_str(), &
id );
472 CCMIOWriteOptstr( &
error,
id,
"MaterialType", matset_data[i].setName.c_str() );
478 std::ostringstream os;
479 std::string mat_name =
"Material", temp_str;
480 os << mat_name << ( i + 1 );
482 strcpy( dum_name, temp_str.c_str() );
483 CCMIONewIndexedEntity( &
error, problemID, kCCMIOCellType, matset_data[i].matsetId, dum_name, &
id );
486 CCMIOWriteOptstr( &
error,
id,
"MaterialType", dum_name );
492 "Trouble writing MaterialId option" );
495 "Trouble writing Radiation option" );
498 "Trouble writing PorosityId option" );
501 "Trouble writing SpinId option" );
504 "Trouble writing GroupId option" );
507 "Trouble writing ColorIdx option" );
510 "Trouble writing ProcessorId option" );
513 "Trouble writing LightMaterial option." );
517 "Trouble writing FreeSurfaceMaterial option" );
520 "Trouble writing Thickness option" );
523 "Trouble writing MaterialType option" );
527 for(
unsigned int i = 0; i < neuset_data.size(); i++ )
530 std::ostringstream dum_id;
531 dum_id << neuset_data[i].neusetId;
532 CCMIONewIndexedEntity( &
error, problemID, kCCMIOBoundaryRegion, neuset_data[i].neusetId, dum_id.str().c_str(),
537 "Trouble writing boundary type number" );
540 "Trouble writing boundary type number" );
544 "Trouble writing prostar region number" );
547 CCMIOWriteState( &
error, stateID, problemID,
"Example state" );
575 CCMIOError
error = kCCMIONoErr;
576 CCMIOWriteOpti( &
error, node, opt_name, dum_val );
598 CCMIOError
error = kCCMIONoErr;
599 CCMIOWriteOptf( &
error, node, opt_name, dum_val );
609 const char* other_name )
623 std::vector< char > opt_val( tag_size + 1 );
629 if( std::find( opt_val.begin(), opt_val.end(),
'\0' ) == opt_val.end() ) *opt_val.rbegin() =
'\0';
631 CCMIOError
error = kCCMIONoErr;
634 CCMIOWriteOptstr( &
error, node, other_name, &opt_val[0] );
639 CCMIOWriteOptstr( &
error, node, opt_name, &opt_val[0] );
647 std::vector< MaterialSetData >& matset_data,
651 matset_data.resize( matsets.size() );
652 if( 1 == matsets.size() && 0 == matsets[0] )
660 MB_CHK_SET_ERR( result,
"Trouble gathering nodes from elements" );
665 std::vector< unsigned char > marks;
666 for(
unsigned int i = 0; i < matsets.size(); i++ )
668 EntityHandle this_set = matset_data[i].setHandle = matsets[i];
676 MB_CHK_SET_ERR( result,
"Trouble getting vertices for a matset" );
681 matset_data[i].entityType = start_type;
684 marks.resize( matset_data[i].elems.size(), 0x1 );
690 MB_CHK_SET_ERR( result,
"Couln't get global id for material set" );
697 if(
MB_SUCCESS == result ) matset_data[i].setName = dum_name;
704 if( all_verts.
empty() )
713 std::vector< NeumannSetData >& neuset_info )
717 neuset_info.resize( neusets.size() );
718 for(
unsigned int i = 0; i < neusets.size(); i++ )
720 EntityHandle this_set = neuset_info[i].setHandle = neusets[i];
724 MB_CHK_SET_ERR( result,
"Trouble getting (m-1)-dimensional ents for neuset" );
732 neuset_info[i].neusetId = i;
740 if(
MB_SUCCESS == result ) neuset_info[i].setName = dum_name;
752 int num_ents = ents.
size();
753 gids =
new int[num_ents];
756 minid = *std::min_element( gids, gids + num_ents );
757 maxid = *std::max_element( gids, gids + num_ents );
761 for(
int i = 1; i <= num_ents; i++ )
774 unsigned int num_verts = verts.
size();
775 std::vector< int > vgids( num_verts );
777 MB_CHK_SET_ERR( result,
"Failed to get global ids for vertices" );
781 CCMIOError
error = kCCMIONoErr;
782 CCMIONewEntity( &
error, rootID, kCCMIOMap,
"Vertex map", &mapID );
785 int maxid = *std::max_element( vgids.begin(), vgids.end() );
787 CCMIOWriteMap( &
error, mapID, CCMIOSIZEC( num_verts ), CCMIOSIZEC( maxid ), &vgids[0], CCMIOINDEXC( kCCMIOStart ),
788 CCMIOINDEXC( kCCMIOEnd ) );
792 CCMIONewEntity( &
error, rootID, kCCMIOVertices,
"Vertices", &verticesID );
796 double* coords =
new double[3 * num_verts];
797 std::vector< double* > coord_arrays( 3 );
800 coord_arrays[0] = coords;
801 coord_arrays[1] = coords + num_verts;
802 coord_arrays[2] = ( dimension == 3 ? coords + 2 * num_verts : NULL );
815 MB_SET_ERR( result,
"Trouble transforming vertex coordinates" );
819 CCMIOWriteVerticesd( &
error, verticesID, CCMIOSIZEC( dimension ), 1.0, mapID, coords, CCMIOINDEXC( kCCMIOStart ),
820 CCMIOINDEXC( kCCMIOEnd ) );
837 double trans_matrix[16];
842 double* tmp_coords = coords;
843 for(
int i = 0; i < num_nodes; i++, tmp_coords += 1 )
845 double vec1[3] = { 0.0, 0.0, 0.0 };
846 for(
int row = 0; row < 3; row++ )
848 vec1[row] += ( trans_matrix[( row * 4 ) + 0] * coords[0] );
849 vec1[row] += ( trans_matrix[( row * 4 ) + 1] * coords[num_nodes] );
850 if( 3 == dimension ) vec1[row] += ( trans_matrix[( row * 4 ) + 2] * coords[2 * num_nodes] );
854 coords[num_nodes] = vec1[1];
855 coords[2 * num_nodes] = vec1[2];
862 std::vector< MaterialSetData >& matset_data,
863 std::vector< NeumannSetData >& neuset_data,
865 CCMIOID& topologyID )
867 std::vector< int > connect;
869 CCMIOID cellMapID, cells;
870 CCMIOError
error = kCCMIONoErr;
873 connect.reserve( 31 );
877 CCMIONewEntity( &
error, rootID, kCCMIOTopology,
"Topology", &topologyID );
880 CCMIONewEntity( &
error, rootID, kCCMIOMap,
"Cell map", &cellMapID );
883 CCMIONewEntity( &
error, topologyID, kCCMIOCells,
"Cells", &cells );
890 unsigned int i, num_elems = 0;
892 std::vector< int > egids;
895 for(
unsigned int m = 0; m < matset_data.size(); m++ )
896 tot_elems += matset_data[m].elems.
size();
898 for(
unsigned int m = 0; m < matset_data.size(); m++ )
900 unsigned int this_num = matset_data[m].elems.size();
905 all_elems.
merge( matset_data[m].elems );
910 egids.resize( matset_data[m].elems.size() );
911 for( i = 0; i < this_num; i++ )
914 MB_CHK_SET_ERR( result,
"Failed to assign global ids for all elements being written" );
919 CCMIOWriteMap( &
error, cellMapID, CCMIOSIZEC( tot_elems ), CCMIOSIZEC( tot_elems ), &egids[0],
920 CCMIOINDEXC( 0 == m ? kCCMIOStart : num_elems ),
921 CCMIOINDEXC( matset_data.size() == m ? kCCMIOEnd : num_elems + this_num ) );
924 if( -1 == matset_data[m].matsetId )
926 for( i = 0; i < this_num; i++ )
931 for( i = 0; i < this_num; i++ )
932 egids[i] = matset_data[m].matsetId;
935 CCMIOWriteCells( &
error, cells, cellMapID, &egids[0], CCMIOINDEXC( 0 == m ? kCCMIOStart : num_elems ),
936 CCMIOINDEXC( matset_data.size() == m ? kCCMIOEnd : num_elems + this_num ) );
944 int has_mid_nodes[4];
945 std::vector< EntityHandle > storage;
946 for( i = 0, rit = matset_data[m].elems.begin(); i < this_num; i++, ++rit )
949 MB_CHK_SET_ERR( result,
"Trouble getting connectivity for entity type check" );
954 CCMIOWriteOpt1i( &
error, cells,
"CellTopologyType", CCMIOSIZEC( tot_elems ), &egids[0],
955 CCMIOINDEXC( 0 == m ? kCCMIOStart : num_elems ),
956 CCMIOINDEXC( matset_data.size() == m ? kCCMIOEnd : num_elems + this_num ) );
959 num_elems += this_num;
965 Range neuset_facets, skin_facets;
972 for( i = 0; i < neuset_data.size(); i++ )
973 neuset_facets.
merge( neuset_data[i].elems );
975 skin_facets -= neuset_facets;
977 neuset_facets.
merge( skin_facets );
980 int fmaxid = neuset_facets.
size();
985 for( i = 0; i < neuset_data.size(); i++ )
988 unsigned char cmarks[2];
990 std::vector< EntityHandle > mcells;
992 for( rrit = neuset_data[i].elems.rbegin(); rrit != neuset_data[i].elems.rend(); ++rrit )
999 MB_CHK_SET_ERR( result,
"Trouble getting mark tags on cells bounding facets" );
1001 if( mcells.size() == 2 && (
mWholeMesh || ( cmarks[0] && cmarks[1] ) ) )
1007 ext_faces.
insert( *rrit );
1010 if( ext_faces.
size() != 0 && neuset_data[i].neusetId != 0 )
1018 if( !skin_facets.
empty() )
1032 unsigned char mval = 0x0, omval;
1036 std::vector< EntityHandle > tmp_face_cells, storage;
1037 std::vector< int > iface_connect, iface_cells;
1044 for( i = 0, rit = all_elems.
begin(); i < num_elems; i++, ++rit )
1071 for(
int f = 0; f < num_facets; f++ )
1076 if( !is_polyh && ( ( mval >> f ) & 0x1 ) )
continue;
1085 connectf = tmp_connect;
1091 MB_CHK_SET_ERR( result,
"Couldn't get polyhedron connectivity" );
1098 tmp_face_cells.clear();
1106 if( tmp_face_cells.size() != 2 )
continue;
1112 int side_num = 0, sense = 0, offset = 0;
1113 if( !is_polyh && tmp_face_cells[0] != *rit )
1116 tmp_face_cells[0] = tmp_face_cells[1];
1117 tmp_face_cells[1] = tmph;
1123 assert( tmp_face_cells[0] != tmp_face_cells[1] );
1124 iface_cells.resize( iface_cells.size() + 2 );
1126 &iface_cells[iface_cells.size() - 2] );
1127 MB_CHK_SET_ERR( result,
"Trouble getting global ids for bounded cells" );
1128 iface_connect.push_back( num_connectf );
1133 unsigned int tmp_size = iface_connect.size();
1134 iface_connect.resize( tmp_size + num_connectf );
1136 MB_CHK_SET_ERR( result,
"Trouble getting global id for internal face" );
1146 MB_CHK_SET_ERR( result,
"Couldn't get other entity connectivity" );
1153 MB_CHK_SET_ERR( result,
"Couldn't get mark data for other cell" );
1156 omval |= ( 0x1 << (
unsigned int)side_num );
1158 MB_CHK_SET_ERR( result,
"Couldn't set mark data for other cell" );
1167 CCMIONewEntity( &
error, rootID, kCCMIOMap, NULL, &mapID );
1170 unsigned int num_ifaces = iface_cells.size() / 2;
1173 egids.resize( num_ifaces );
1174 for( i = 1; i <= num_ifaces; i++ )
1175 egids[i - 1] = fmaxid + i;
1176 CCMIOWriteMap( &
error, mapID, CCMIOSIZEC( num_ifaces ), CCMIOSIZEC( fmaxid + num_ifaces ), &egids[0],
1177 CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) );
1181 CCMIONewEntity( &
error, topologyID, kCCMIOInternalFaces,
"Internal faces", &
id );
1183 CCMIOWriteFaces( &
error,
id, kCCMIOInternalFaces, mapID, CCMIOSIZEC( iface_connect.size() ), &iface_connect[0],
1184 CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) );
1186 CCMIOWriteFaceCells( &
error,
id, kCCMIOInternalFaces, mapID, &iface_cells[0], CCMIOINDEXC( kCCMIOStart ),
1187 CCMIOINDEXC( kCCMIOEnd ) );
1197 if( has_mid_nodes[0] || has_mid_nodes[2] || has_mid_nodes[3] )
return ctype;
1205 if( !has_mid_nodes[1] )
1211 if( has_mid_nodes[1] )
1217 if( has_mid_nodes[1] )
1223 if( has_mid_nodes[1] )
1229 if( has_mid_nodes[1] )
1235 if( has_mid_nodes[1] )
1252 CCMIOError
error = kCCMIONoErr;
1256 int *gids = NULL, minid, maxid;
1258 MB_CHK_SET_ERR( result,
"Trouble getting global ids for facets" );
1261 CCMIONewEntity( &
error, rootID, kCCMIOMap, NULL, &mapID );
1264 CCMIOWriteMap( &
error, mapID, CCMIOSIZEC( facets.
size() ), CCMIOSIZEC( maxid ), gids, CCMIOINDEXC( kCCMIOStart ),
1265 CCMIOINDEXC( kCCMIOEnd ) );
1272 MB_CHK_SET_ERR( result,
"Failed to get connectivity of last facet" );
1273 std::vector< int > fconnect( facets.
size() * ( num_connect + 1 ) );
1276 &fconnect[0],
true );
1280 CCMIONewIndexedEntity( &
error, topologyID, kCCMIOBoundaryFaces, set_num,
"Boundary faces", &
id );
1283 CCMIOWriteFaces( &
error,
id, kCCMIOBoundaryFaces, mapID, CCMIOSIZEC( fconnect.size() ), &fconnect[0],
1284 CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) );
1288 std::vector< EntityHandle > cells;
1289 unsigned char cmarks[2];
1296 for( rit = facets.
begin(), i = 0; rit != facets.
end(); ++rit, i++ )
1310 MB_CHK_SET_ERR( result,
"Trouble getting mark tags on cells bounding facets" );
1311 if( cells.size() == 2 && (
mWholeMesh || ( cmarks[0] && cmarks[1] ) ) )
1315 else if( 1 == cells.size() && !
mWholeMesh && !cmarks[0] )
1321 if( 2 == cells.size() && !( cmarks[0] | 0x0 ) && ( cmarks[1] & 0x1 ) ) cells[0] = cells[1];
1325 MB_CHK_SET_ERR( result,
"Couldn't get global id tag for bounded cell" );
1331 CCMIOWriteFaceCells( &
error,
id, kCCMIOBoundaryFaces, mapID, &fconnect[0], CCMIOINDEXC( kCCMIOStart ),
1332 CCMIOINDEXC( kCCMIOEnd ) );
1340 Range& forward_elems,
1341 Range& reverse_elems )
1343 Range neuset_elems, neuset_meshsets;
1352 if( MB_FAILURE == result )
return result;
1360 if( range_iter != neuset_elems.
end() )
1363 neuset_elems.
erase( range_iter, neuset_elems.
end() );
1373 dum_it = neuset_elems.
begin();
1377 if( current_sense == 1 || current_sense == 0 )
1379 if( current_sense == -1 || current_sense == 0 )
1384 for( range_iter = neuset_meshsets.
begin(); range_iter != neuset_meshsets.
end(); ++range_iter )
1388 if( 0 == sense_tag || MB_FAILURE ==
mbImpl->
tag_get_data( sense_tag, &( *range_iter ), 1, &this_sense ) )
1392 get_neuset_elems( *range_iter, this_sense * current_sense, forward_elems, reverse_elems );