47 #pragma warning( disable : 4786 )
53 #include "ccmioutility.h"
54 #include "ccmiocore.h"
99 #define INS_ID( stringvar, prefix, id ) sprintf( stringvar, prefix, id )
101 #define CHK_SET_CCMERR( ccm_err_code, ccm_err_msg ) \
103 if( kCCMIONoErr != ( ccm_err_code ) ) MB_SET_ERR( MB_FAILURE, ccm_err_msg ); \
112 : mbImpl( impl ), mCurrentMeshHandle( 0 ), mPartitionSetTag( 0 ), mNameTag( 0 ), mMaterialIdTag( 0 ),
113 mMaterialTypeTag( 0 ), mRadiationTag( 0 ), mPorosityIdTag( 0 ), mSpinIdTag( 0 ), mGroupIdTag( 0 ),
114 mColorIdxTag( 0 ), mProcessorIdTag( 0 ), mLightMaterialTag( 0 ), mFreeSurfaceMaterialTag( 0 ), mThicknessTag( 0 ),
115 mProstarRegionNumberTag( 0 ), mBoundaryTypeTag( 0 ), mCreatingProgramTag( 0 ), mDimension( 0 ),
118 assert( impl != NULL );
141 int dum_val_array[] = { -1, -1, -1, -1 };
158 const bool overwrite,
162 const std::vector< std::string >& ,
174 FILE* file = fopen( file_name,
"r" );
184 std::vector< EntityHandle > matsets, dirsets, neusets, partsets;
187 result =
get_sets( ent_handles, num_sets, matsets, dirsets, neusets, partsets );
MB_CHK_SET_ERR( result,
"Failed to get material/etc. sets" );
190 if( ent_handles && matsets.empty() )
196 if( matsets.empty() ) matsets.push_back( 0 );
198 std::vector< MaterialSetData > matset_info;
206 CCMIOID rootID, topologyID, stateID, problemID, verticesID, processorID;
209 result =
open_file( file_name, overwrite, rootID );
MB_CHK_SET_ERR( result,
"Couldn't open file or create state" );
215 std::vector< NeumannSetData > neuset_info;
239 CCMIOError
error = kCCMIONoErr;
243 CCMIOWriteProcessor( &
error, processorID, NULL, &verticesID, NULL, &topologyID, NULL, NULL, NULL, NULL );
252 CCMIOError
error = kCCMIONoErr;
255 if( CCMIOGetState( NULL, rootID,
kStateName, NULL, &stateID ) != kCCMIONoErr )
262 CCMIOSize_t i = CCMIOSIZEC( 0 );
263 if( CCMIONextEntity( NULL, stateID, kCCMIOProcessor, &i, &processorID ) != kCCMIONoErr )
265 CCMIONewEntity( &
error, stateID, kCCMIOProcessor, NULL, &processorID );
272 CCMIOClearProcessor( &
error, stateID, processorID, TRUE, TRUE, TRUE, TRUE, TRUE );
288 CCMIOError
error = kCCMIONoErr;
289 CCMIOCloseFile( &
error, rootID );
306 CCMIOError
error = kCCMIONoErr;
307 CCMIOOpenFile( &
error, filename, kCCMIOWrite, &rootID );
315 std::vector< EntityHandle >& matsets,
316 std::vector< EntityHandle >& dirsets,
317 std::vector< EntityHandle >& neusets,
318 std::vector< EntityHandle >& partsets )
325 std::copy( this_range.
begin(), this_range.
end(), std::back_inserter( matsets ) );
328 std::copy( this_range.
begin(), this_range.
end(), std::back_inserter( dirsets ) );
331 std::copy( this_range.
begin(), this_range.
end(), std::back_inserter( neusets ) );
336 std::copy( this_range.
begin(), this_range.
end(), std::back_inserter( partsets ) );
342 for(
const EntityHandle* iter = ent_handles; iter < ent_handles + num_sets; ++iter )
345 matsets.push_back( *iter );
347 dirsets.push_back( *iter );
349 neusets.push_back( *iter );
351 partsets.push_back( *iter );
362 std::vector< WriteCCMIO::MaterialSetData >& matset_data,
363 std::vector< WriteCCMIO::NeumannSetData >& neuset_data )
369 CCMIOError
error = kCCMIONoErr;
373 bool root_tagged =
false, other_set_tagged =
false;
383 std::vector< char > title_tag( tag_size + 1 );
388 other_set_tagged =
true;
399 *title_tag.rbegin() =
'\0';
400 if( root_tagged || other_set_tagged )
403 if( kCCMIONoErr == CCMIOGetEntityNode( &
error, rootID, &rootNode ) )
405 CCMIOSetTitle( &
error, rootNode, &title_tag[0] );
419 std::vector< char > cp_tag( tag_size + 1 );
424 other_set_tagged =
true;
435 *cp_tag.rbegin() =
'\0';
436 if( root_tagged || other_set_tagged )
439 if( kCCMIONoErr == CCMIOGetEntityNode( &
error, rootID, &rootNode ) )
441 CCMIOWriteOptstr( &
error, processorID,
"CreatingProgram", &cp_tag[0] );
448 CCMIONewEntity( &
error, rootID, kCCMIOProblemDescription, NULL, &problemID );
452 for(
unsigned int i = 0; i < matset_data.size(); i++ )
454 if( !matset_data[i].setName.empty() )
456 CCMIONewIndexedEntity( &
error, problemID, kCCMIOCellType, matset_data[i].matsetId,
457 matset_data[i].setName.c_str(), &
id );
460 CCMIOWriteOptstr( &
error,
id,
"MaterialType", matset_data[i].setName.c_str() );
466 std::ostringstream os;
467 std::string mat_name =
"Material", temp_str;
468 os << mat_name << ( i + 1 );
470 strcpy( dum_name, temp_str.c_str() );
471 CCMIONewIndexedEntity( &
error, problemID, kCCMIOCellType, matset_data[i].matsetId, dum_name, &
id );
474 CCMIOWriteOptstr( &
error,
id,
"MaterialType", dum_name );
503 for(
unsigned int i = 0; i < neuset_data.size(); i++ )
506 std::ostringstream dum_id;
507 dum_id << neuset_data[i].neusetId;
508 CCMIONewIndexedEntity( &
error, problemID, kCCMIOBoundaryRegion, neuset_data[i].neusetId, dum_id.str().c_str(),
519 CCMIOWriteState( &
error, stateID, problemID,
"Example state" );
547 CCMIOError
error = kCCMIONoErr;
548 CCMIOWriteOpti( &
error, node, opt_name, dum_val );
570 CCMIOError
error = kCCMIONoErr;
571 CCMIOWriteOptf( &
error, node, opt_name, dum_val );
581 const char* other_name )
595 std::vector< char > opt_val( tag_size + 1 );
601 if( std::find( opt_val.begin(), opt_val.end(),
'\0' ) == opt_val.end() ) *opt_val.rbegin() =
'\0';
603 CCMIOError
error = kCCMIONoErr;
606 CCMIOWriteOptstr( &
error, node, other_name, &opt_val[0] );
611 CCMIOWriteOptstr( &
error, node, opt_name, &opt_val[0] );
619 std::vector< MaterialSetData >& matset_data,
623 matset_data.resize( matsets.size() );
624 if( 1 == matsets.size() && 0 == matsets[0] )
635 std::vector< unsigned char > marks;
636 for(
unsigned int i = 0; i < matsets.size(); i++ )
638 EntityHandle this_set = matset_data[i].setHandle = matsets[i];
649 matset_data[i].entityType = start_type;
652 marks.resize( matset_data[i].elems.size(), 0x1 );
663 if(
MB_SUCCESS == result ) matset_data[i].setName = dum_name;
670 if( all_verts.
empty() )
679 std::vector< NeumannSetData >& neuset_info )
683 neuset_info.resize( neusets.size() );
684 for(
unsigned int i = 0; i < neusets.size(); i++ )
686 EntityHandle this_set = neuset_info[i].setHandle = neusets[i];
697 neuset_info[i].neusetId = i;
705 if(
MB_SUCCESS == result ) neuset_info[i].setName = dum_name;
717 int num_ents = ents.
size();
718 gids =
new int[num_ents];
720 minid = *std::min_element( gids, gids + num_ents );
721 maxid = *std::max_element( gids, gids + num_ents );
725 for(
int i = 1; i <= num_ents; i++ )
737 unsigned int num_verts = verts.
size();
738 std::vector< int > vgids( num_verts );
743 CCMIOError
error = kCCMIONoErr;
744 CCMIONewEntity( &
error, rootID, kCCMIOMap,
"Vertex map", &mapID );
747 int maxid = *std::max_element( vgids.begin(), vgids.end() );
749 CCMIOWriteMap( &
error, mapID, CCMIOSIZEC( num_verts ), CCMIOSIZEC( maxid ), &vgids[0], CCMIOINDEXC( kCCMIOStart ),
750 CCMIOINDEXC( kCCMIOEnd ) );
754 CCMIONewEntity( &
error, rootID, kCCMIOVertices,
"Vertices", &verticesID );
758 double* coords =
new double[3 * num_verts];
759 std::vector< double* > coord_arrays( 3 );
762 coord_arrays[0] = coords;
763 coord_arrays[1] = coords + num_verts;
764 coord_arrays[2] = ( dimension == 3 ? coords + 2 * num_verts : NULL );
777 MB_SET_ERR( result,
"Trouble transforming vertex coordinates" );
781 CCMIOWriteVerticesd( &
error, verticesID, CCMIOSIZEC( dimension ), 1.0, mapID, coords, CCMIOINDEXC( kCCMIOStart ),
782 CCMIOINDEXC( kCCMIOEnd ) );
799 double trans_matrix[16];
803 double* tmp_coords = coords;
804 for(
int i = 0; i < num_nodes; i++, tmp_coords += 1 )
806 double vec1[3] = { 0.0, 0.0, 0.0 };
807 for(
int row = 0; row < 3; row++ )
809 vec1[row] += ( trans_matrix[( row * 4 ) + 0] * coords[0] );
810 vec1[row] += ( trans_matrix[( row * 4 ) + 1] * coords[num_nodes] );
811 if( 3 == dimension ) vec1[row] += ( trans_matrix[( row * 4 ) + 2] * coords[2 * num_nodes] );
815 coords[num_nodes] = vec1[1];
816 coords[2 * num_nodes] = vec1[2];
823 std::vector< MaterialSetData >& matset_data,
824 std::vector< NeumannSetData >& neuset_data,
826 CCMIOID& topologyID )
828 std::vector< int > connect;
830 CCMIOID cellMapID, cells;
831 CCMIOError
error = kCCMIONoErr;
834 connect.reserve( 31 );
838 CCMIONewEntity( &
error, rootID, kCCMIOTopology,
"Topology", &topologyID );
841 CCMIONewEntity( &
error, rootID, kCCMIOMap,
"Cell map", &cellMapID );
844 CCMIONewEntity( &
error, topologyID, kCCMIOCells,
"Cells", &cells );
851 unsigned int i, num_elems = 0;
853 std::vector< int > egids;
856 for(
unsigned int m = 0; m < matset_data.size(); m++ )
857 tot_elems += matset_data[m].elems.
size();
859 for(
unsigned int m = 0; m < matset_data.size(); m++ )
861 unsigned int this_num = matset_data[m].elems.size();
866 all_elems.
merge( matset_data[m].elems );
871 egids.resize( matset_data[m].elems.size() );
872 for( i = 0; i < this_num; i++ )
879 CCMIOWriteMap( &
error, cellMapID, CCMIOSIZEC( tot_elems ), CCMIOSIZEC( tot_elems ), &egids[0],
880 CCMIOINDEXC( 0 == m ? kCCMIOStart : num_elems ),
881 CCMIOINDEXC( matset_data.size() == m ? kCCMIOEnd : num_elems + this_num ) );
884 if( -1 == matset_data[m].matsetId )
886 for( i = 0; i < this_num; i++ )
891 for( i = 0; i < this_num; i++ )
892 egids[i] = matset_data[m].matsetId;
895 CCMIOWriteCells( &
error, cells, cellMapID, &egids[0], CCMIOINDEXC( 0 == m ? kCCMIOStart : num_elems ),
896 CCMIOINDEXC( matset_data.size() == m ? kCCMIOEnd : num_elems + this_num ) );
904 int has_mid_nodes[4];
905 std::vector< EntityHandle > storage;
906 for( i = 0, rit = matset_data[m].elems.begin(); i < this_num; i++, ++rit )
913 CCMIOWriteOpt1i( &
error, cells,
"CellTopologyType", CCMIOSIZEC( tot_elems ), &egids[0],
914 CCMIOINDEXC( 0 == m ? kCCMIOStart : num_elems ),
915 CCMIOINDEXC( matset_data.size() == m ? kCCMIOEnd : num_elems + this_num ) );
918 num_elems += this_num;
924 Range neuset_facets, skin_facets;
930 for( i = 0; i < neuset_data.size(); i++ )
931 neuset_facets.
merge( neuset_data[i].elems );
933 skin_facets -= neuset_facets;
935 neuset_facets.
merge( skin_facets );
938 int fmaxid = neuset_facets.
size();
943 for( i = 0; i < neuset_data.size(); i++ )
946 unsigned char cmarks[2];
948 std::vector< EntityHandle > mcells;
950 for( rrit = neuset_data[i].elems.rbegin(); rrit != neuset_data[i].elems.rend(); ++rrit )
957 if( mcells.size() == 2 && (
mWholeMesh || ( cmarks[0] && cmarks[1] ) ) )
963 ext_faces.
insert( *rrit );
966 if( ext_faces.
size() != 0 && neuset_data[i].neusetId != 0 )
973 if( !skin_facets.
empty() )
986 unsigned char mval = 0x0, omval;
989 std::vector< EntityHandle > tmp_face_cells, storage;
990 std::vector< int > iface_connect, iface_cells;
997 for( i = 0, rit = all_elems.
begin(); i < num_elems; i++, ++rit )
1022 for(
int f = 0; f < num_facets; f++ )
1027 if( !is_polyh && ( ( mval >> f ) & 0x1 ) )
continue;
1036 connectf = tmp_connect;
1048 tmp_face_cells.clear();
1055 if( tmp_face_cells.size() != 2 )
continue;
1061 int side_num = 0, sense = 0, offset = 0;
1062 if( !is_polyh && tmp_face_cells[0] != *rit )
1065 tmp_face_cells[0] = tmp_face_cells[1];
1066 tmp_face_cells[1] = tmph;
1072 assert( tmp_face_cells[0] != tmp_face_cells[1] );
1073 iface_cells.resize( iface_cells.size() + 2 );
1075 &iface_cells[iface_cells.size() - 2] );
MB_CHK_SET_ERR( result,
"Trouble getting global ids for bounded cells" );
1076 iface_connect.push_back( num_connectf );
1081 unsigned int tmp_size = iface_connect.size();
1082 iface_connect.resize( tmp_size + num_connectf );
1101 omval |= ( 0x1 << (
unsigned int)side_num );
1111 CCMIONewEntity( &
error, rootID, kCCMIOMap, NULL, &mapID );
1114 unsigned int num_ifaces = iface_cells.size() / 2;
1117 egids.resize( num_ifaces );
1118 for( i = 1; i <= num_ifaces; i++ )
1119 egids[i - 1] = fmaxid + i;
1120 CCMIOWriteMap( &
error, mapID, CCMIOSIZEC( num_ifaces ), CCMIOSIZEC( fmaxid + num_ifaces ), &egids[0],
1121 CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) );
1125 CCMIONewEntity( &
error, topologyID, kCCMIOInternalFaces,
"Internal faces", &
id );
1127 CCMIOWriteFaces( &
error,
id, kCCMIOInternalFaces, mapID, CCMIOSIZEC( iface_connect.size() ), &iface_connect[0],
1128 CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) );
1130 CCMIOWriteFaceCells( &
error,
id, kCCMIOInternalFaces, mapID, &iface_cells[0], CCMIOINDEXC( kCCMIOStart ),
1131 CCMIOINDEXC( kCCMIOEnd ) );
1141 if( has_mid_nodes[0] || has_mid_nodes[2] || has_mid_nodes[3] )
return ctype;
1149 if( !has_mid_nodes[1] )
1155 if( has_mid_nodes[1] )
1161 if( has_mid_nodes[1] )
1167 if( has_mid_nodes[1] )
1173 if( has_mid_nodes[1] )
1179 if( has_mid_nodes[1] )
1196 CCMIOError
error = kCCMIONoErr;
1200 int *gids = NULL, minid, maxid;
1204 CCMIONewEntity( &
error, rootID, kCCMIOMap, NULL, &mapID );
1207 CCMIOWriteMap( &
error, mapID, CCMIOSIZEC( facets.
size() ), CCMIOSIZEC( maxid ), gids, CCMIOINDEXC( kCCMIOStart ),
1208 CCMIOINDEXC( kCCMIOEnd ) );
1215 std::vector< int > fconnect( facets.
size() * ( num_connect + 1 ) );
1218 &fconnect[0],
true );
MB_CHK_SET_ERR( result,
"Failed to get facet connectivity" );
1221 CCMIONewIndexedEntity( &
error, topologyID, kCCMIOBoundaryFaces, set_num,
"Boundary faces", &
id );
1224 CCMIOWriteFaces( &
error,
id, kCCMIOBoundaryFaces, mapID, CCMIOSIZEC( fconnect.size() ), &fconnect[0],
1225 CCMIOINDEXC( kCCMIOStart ), CCMIOINDEXC( kCCMIOEnd ) );
1229 std::vector< EntityHandle > cells;
1230 unsigned char cmarks[2];
1237 for( rit = facets.
begin(), i = 0; rit != facets.
end(); ++rit, i++ )
1250 if( cells.size() == 2 && (
mWholeMesh || ( cmarks[0] && cmarks[1] ) ) )
1254 else if( 1 == cells.size() && !
mWholeMesh && !cmarks[0] )
1260 if( 2 == cells.size() && !( cmarks[0] | 0x0 ) && ( cmarks[1] & 0x1 ) ) cells[0] = cells[1];
1269 CCMIOWriteFaceCells( &
error,
id, kCCMIOBoundaryFaces, mapID, &fconnect[0], CCMIOINDEXC( kCCMIOStart ),
1270 CCMIOINDEXC( kCCMIOEnd ) );
1278 Range& forward_elems,
1279 Range& reverse_elems )
1281 Range neuset_elems, neuset_meshsets;
1290 if( MB_FAILURE == result )
return result;
1298 if( range_iter != neuset_elems.
end() )
1301 neuset_elems.
erase( range_iter, neuset_elems.
end() );
1311 dum_it = neuset_elems.
begin();
1315 if( current_sense == 1 || current_sense == 0 )
1317 if( current_sense == -1 || current_sense == 0 )
1322 for( range_iter = neuset_meshsets.
begin(); range_iter != neuset_meshsets.
end(); ++range_iter )
1326 if( 0 == sense_tag || MB_FAILURE ==
mbImpl->
tag_get_data( sense_tag, &( *range_iter ), 1, &this_sense ) )
1330 get_neuset_elems( *range_iter, this_sense * current_sense, forward_elems, reverse_elems );