61 const Tag* file_id_tag )
63 int num_material_sets = 0;
64 const int* material_set_list = 0;
82 std::set< int > blocks;
83 for(
const int* mat_set_end = material_set_list + num_material_sets; material_set_list != mat_set_end;
85 blocks.insert( *material_set_list );
88 std::map< long, EntityHandle > node_id_map;
103 cg_open( filename, CG_MODE_READ, &filePtr );
111 long num_verts = 0, num_elems = 0, num_sets = 0;
112 int num_bases = 0, num_zones = 0, num_sections = 0;
120 cg_nbases( filePtr, &num_bases );
127 for(
int indexBase = 1; indexBase <= num_bases; ++indexBase )
130 cg_nzones( filePtr, indexBase, &num_zones );
137 for(
int indexZone = 1; indexZone <= num_zones; ++indexZone )
140 cg_zone_read( filePtr, indexBase, indexZone, zoneName, size );
143 cg_nsections( filePtr, indexBase, indexZone, &num_sections );
147 num_sets = num_sections;
149 std::cout <<
"\nnumber of nodes = " << num_verts;
150 std::cout <<
"\nnumber of elems = " << num_elems;
151 std::cout <<
"\nnumber of parts = " << num_sets << std::endl;
159 std::vector< double* > coord_arrays;
165 cgsize_t beginPos = 1, endPos = num_verts;
168 cg_coord_read( filePtr, indexBase, indexZone,
"CoordinateX", RealDouble, &beginPos, &endPos,
170 cg_coord_read( filePtr, indexBase, indexZone,
"CoordinateY", RealDouble, &beginPos, &endPos,
172 cg_coord_read( filePtr, indexBase, indexZone,
"CoordinateZ", RealDouble, &beginPos, &endPos,
178 double sumZcoord = 0.0;
179 double eps = 1.0e-12;
180 for(
long i = 0; i < num_verts; ++i, ++handle )
184 node_id_map.insert( std::pair< long, EntityHandle >(
index, handle ) ).second;
186 sumZcoord += *( coord_arrays[2] + i );
188 if( std::abs( sumZcoord ) <= eps )
mesh_dim = 2;
191 std::vector< int > ids( num_verts );
192 std::vector< int >::iterator id_iter = ids.begin();
193 std::vector< EntityHandle > handles( num_verts );
194 std::vector< EntityHandle >::iterator h_iter = handles.begin();
195 for( std::map< long, EntityHandle >::iterator i = node_id_map.begin(); i != node_id_map.end();
196 ++i, ++id_iter, ++h_iter )
217 long section_offset = 0;
221 std::vector< int > volumeID( num_sections, 0 );
223 for(
int section = 0; section < num_sections; ++section )
225 ElementType_t elemsType;
226 int iparent_flag, nbndry;
227 char sectionName[128];
230 int cgSection = section + 1;
232 cg_section_read( filePtr, indexBase, indexZone, cgSection, sectionName, &elemsType, &beginPos, &endPos,
233 &nbndry, &iparent_flag );
235 size_t section_size = endPos - beginPos + 1;
248 if(
mesh_dim == 2 ) volumeID[section] = 1;
253 if(
mesh_dim == 2 ) volumeID[section] = 1;
258 if(
mesh_dim == 3 ) volumeID[section] = 1;
263 if(
mesh_dim == 3 ) volumeID[section] = 1;
268 if(
mesh_dim == 3 ) volumeID[section] = 1;
273 if(
mesh_dim == 3 ) volumeID[section] = 1;
283 if( elemsType == TETRA_4 || elemsType == PYRA_5 || elemsType == PENTA_6 || elemsType == HEXA_8 ||
284 elemsType == TRI_3 || elemsType == QUAD_4 || ( ( elemsType == BAR_2 ) &&
mesh_dim == 2 ) )
292 cg_ElementDataSize( filePtr, indexBase, indexZone, cgSection, &connDataSize );
295 std::vector< cgsize_t > elemNodes( connDataSize );
297 cg_elements_read( filePtr, indexBase, indexZone, cgSection, &elemNodes[0], &iparentdata );
302 create_elements( sectionName, file_id_tag, ent_type, verts_per_elem, section_offset, section_size,
305 else if( elemsType == MIXED )
312 cg_ElementDataSize( filePtr, indexBase, indexZone, cgSection, &connDataSize );
314 std::vector< cgsize_t > elemNodes( connDataSize );
316 cg_elements_read( filePtr, indexBase, indexZone, cgSection, &elemNodes[0], &iparentdata );
318 std::vector< cgsize_t > elemsConn_EDGE;
319 std::vector< cgsize_t > elemsConn_TRI, elemsConn_QUAD;
320 std::vector< cgsize_t > elemsConn_TET, elemsConn_PYRA, elemsConn_PRISM, elemsConn_HEX;
321 cgsize_t count_EDGE, count_TRI, count_QUAD;
322 cgsize_t count_TET, count_PYRA, count_PRISM, count_HEX;
326 count_EDGE = count_TRI = count_QUAD = 0;
327 count_TET = count_PYRA = count_PRISM = count_HEX = 0;
330 for(
int i = beginPos; i <= endPos; i++ )
332 elemsType = ElementType_t( elemNodes[connIndex] );
335 cg_npe( elemsType, &verts_per_elem );
364 connIndex += ( verts_per_elem + 1 );
367 if( count_EDGE > 0 ) elemsConn_EDGE.resize( count_EDGE * 2 );
368 if( count_TRI > 0 ) elemsConn_TRI.resize( count_TRI * 3 );
369 if( count_QUAD > 0 ) elemsConn_QUAD.resize( count_QUAD * 4 );
370 if( count_TET > 0 ) elemsConn_TET.resize( count_TET * 4 );
371 if( count_PYRA > 0 ) elemsConn_PYRA.resize( count_PYRA * 5 );
372 if( count_PRISM > 0 ) elemsConn_PRISM.resize( count_PRISM * 6 );
373 if( count_HEX > 0 ) elemsConn_HEX.resize( count_HEX * 8 );
377 int idx_edge, idx_tri, idx_quad;
378 int idx_tet, idx_pyra, idx_prism, idx_hex;
379 idx_edge = idx_tri = idx_quad = 0;
380 idx_tet = idx_pyra = idx_prism = idx_hex = 0;
383 for(
int i = beginPos; i <= endPos; i++ )
385 elemsType = ElementType_t( elemNodes[connIndex] );
388 cg_npe( elemsType, &verts_per_elem );
393 for(
int j = 0; j < 2; ++j )
394 elemsConn_EDGE[idx_edge + j] = elemNodes[connIndex + j + 1];
398 for(
int j = 0; j < 3; ++j )
399 elemsConn_TRI[idx_tri + j] = elemNodes[connIndex + j + 1];
403 for(
int j = 0; j < 4; ++j )
404 elemsConn_QUAD[idx_quad + j] = elemNodes[connIndex + j + 1];
408 for(
int j = 0; j < 4; ++j )
409 elemsConn_TET[idx_tet + j] = elemNodes[connIndex + j + 1];
413 for(
int j = 0; j < 5; ++j )
414 elemsConn_PYRA[idx_pyra + j] = elemNodes[connIndex + j + 1];
418 for(
int j = 0; j < 6; ++j )
419 elemsConn_PRISM[idx_prism + j] = elemNodes[connIndex + j + 1];
423 for(
int j = 0; j < 8; ++j )
424 elemsConn_HEX[idx_hex + j] = elemNodes[connIndex + j + 1];
431 connIndex += ( verts_per_elem + 1 );
442 create_elements( sectionName, file_id_tag,
MBTRI, 3, section_offset, count_TRI, elemsConn_TRI );
449 create_elements( sectionName, file_id_tag,
MBTET, 4, section_offset, count_TET, elemsConn_TET );
455 if( count_PRISM > 0 )
460 create_elements( sectionName, file_id_tag,
MBHEX, 8, section_offset, count_HEX, elemsConn_HEX );
474 const Tag* file_id_tag,
475 const EntityType& ent_type,
476 const int& verts_per_elem,
477 long& section_offset,
479 const std::vector< cgsize_t >& elemsConn )
493 memcpy( conn_array, &elemsConn[0], elemsConn.size() *
sizeof(
EntityHandle ) );
497 std::vector< EntityHandle > elemsConnTwin( elemsConn.size(), 0 );
498 for(
int i = 0; i < elemsConn.size(); i++ )
500 elemsConnTwin[i] =
static_cast< EntityHandle >( elemsConn[i] );
502 memcpy( conn_array, &elemsConnTwin[0], elemsConnTwin.size() *
sizeof(
EntityHandle ) );
512 Range elements( handle, handle + elems_count - 1 );
516 std::vector< int > id_list( elems_count );
519 for(
cgsize_t i = 0; i < elems_count; ++i )
520 id_list[i] = i + 1 + section_offset;
521 section_offset += elems_count;
523 create_sets( sectionName, file_id_tag, ent_type, elements, id_list, 0 );
529 const Tag* file_id_tag,
531 const Range& elements,
532 const std::vector< int >& set_ids,
550 const char* setName = sectionName;