Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
Export CGNS files. More...
#include <WriteCGNS.hpp>
Classes | |
class | SetStruct |
Public Member Functions | |
WriteCGNS (Interface *impl) | |
Constructor. | |
virtual | ~WriteCGNS () |
Destructor. | |
ErrorCode | write_file (const char *file_name, const bool overwrite, const FileOptions &opts, const EntityHandle *output_list, const int num_sets, const std::vector< std::string > &qa_list, const Tag *tag_list=NULL, int num_tags=0, int export_dimension=3) |
writes out a file | |
ErrorCode | get_vertex_entities (cgsize_t &VrtSize, std::vector< moab::EntityHandle > &Nodes) |
ErrorCode | get_edge_entities (cgsize_t &EdgeSize, std::vector< moab::EntityHandle > &Edges) |
ErrorCode | get_face_entities (cgsize_t &FaceSize, std::vector< moab::EntityHandle > &Faces) |
ErrorCode | get_cell_entities (cgsize_t &CellSize, std::vector< moab::EntityHandle > &Cells) |
ErrorCode | write_coord_cgns (std::vector< moab::EntityHandle > &nodes) |
ErrorCode | set_tag_values (std::vector< moab::Tag > &TagHandles, std::vector< moab::EntityHandle > &Edges, std::vector< moab::EntityHandle > &Faces, std::vector< moab::EntityHandle > &Cells, std::vector< WriteCGNS::SetStruct > &Sets) |
ErrorCode | get_set_entities (int i, std::vector< moab::Tag > &TagHandles, std::vector< WriteCGNS::SetStruct > &Sets) |
ErrorCode | get_cgns_type (int i, std::vector< WriteCGNS::SetStruct > &Sets) |
ErrorCode | get_conn_table (std::vector< moab::EntityHandle > &Elements, std::vector< int > &Begin, std::vector< int > &End, std::vector< moab::Tag > &TagHandles, std::vector< WriteCGNS::SetStruct > &Sets, std::vector< std::vector< cgsize_t > > &ConnTable) |
int | moab_cgns_conv (const EntityHandle handle) |
Static Public Member Functions | |
static WriterIface * | factory (Interface *) |
factory method | |
Private Attributes | |
Interface * | mbImpl |
WriteUtilIface * | mWriteIface |
const char * | fileName |
int | IndexFile |
const char * | BaseName |
int | IndexBase |
const char * | ZoneName |
int | IndexZone |
int | IndexSection |
int | IndexCoord [3] |
int | celldim |
int | physdim |
cgsize_t | isize [3] |
std::vector< moab::EntityHandle > | Nodes |
std::vector< moab::EntityHandle > | Edges |
std::vector< moab::EntityHandle > | Faces |
std::vector< moab::EntityHandle > | Cells |
cgsize_t | VrtSize |
cgsize_t | EdgeSize |
cgsize_t | FaceSize |
cgsize_t | CellSize |
Export CGNS files.
Definition at line 46 of file WriteCGNS.hpp.
moab::WriteCGNS::WriteCGNS | ( | Interface * | impl | ) |
Constructor.
Definition at line 25 of file WriteCGNS.cpp.
References IndexCoord, isize, mWriteIface, and moab::Interface::query_interface().
Referenced by factory().
: mbImpl( impl ), fileName( NULL ), IndexFile( 0 ), BaseName( NULL ), IndexBase( 0 ), ZoneName( NULL ), IndexZone( 0 ), IndexSection( 0 ), celldim( 0 ), physdim( 0 ), VrtSize( 0 ), EdgeSize( 0 ), FaceSize( 0 ), CellSize( 0 ) { impl->query_interface( mWriteIface ); IndexCoord[0] = IndexCoord[1] = IndexCoord[2] = 0; isize[0] = isize[1] = isize[2] = 0; }
moab::WriteCGNS::~WriteCGNS | ( | ) | [virtual] |
Destructor.
Definition at line 35 of file WriteCGNS.cpp.
References mbImpl, mWriteIface, and moab::Interface::release_interface().
{ mbImpl->release_interface( mWriteIface ); }
WriterIface * moab::WriteCGNS::factory | ( | Interface * | iface | ) | [static] |
factory method
Definition at line 20 of file WriteCGNS.cpp.
References WriteCGNS().
Referenced by moab::ReaderWriterSet::ReaderWriterSet().
ErrorCode moab::WriteCGNS::get_cell_entities | ( | cgsize_t & | CellSize, |
std::vector< moab::EntityHandle > & | Cells | ||
) |
Definition at line 337 of file WriteCGNS.cpp.
References celldim, ErrorCode, moab::Interface::get_entities_by_dimension(), mbImpl, and physdim.
Referenced by write_file().
{ ErrorCode rval; // The first input is 0 because one queries the entire mesh. // Get all entities of dimension = 3 in Cell rval = mbImpl->get_entities_by_dimension( 0, 3, Cells_, false ); if( Cells_.size() ) { celldim = 3; physdim = 3; // get the amout of volumes CellSize_ = Cells_.size(); } // done return rval; }
ErrorCode moab::WriteCGNS::get_cgns_type | ( | int | i, |
std::vector< WriteCGNS::SetStruct > & | Sets | ||
) |
Definition at line 637 of file WriteCGNS.cpp.
References MB_SUCCESS.
Referenced by set_tag_values().
{ std::vector< int > Test; int Sum = 0; // NbEntities is a vector which has the number of entities of each type // 0-MBEDGE | 1-MBTRI | 2-MBQUAD | 3-MBTET | 4-MBPYRAMID | 5-MBPRISM | 6-MBHEX // if NbEntities[i]>0 then Test[i]=1 // else then Test[i]=0 for( int j = 0; j < (int)Sets[i].NbEntities.size(); ++j ) { if( Sets[i].NbEntities[j] > 0 ) { Test.push_back( 1 ); Sum++; } else { Test.push_back( 0 ); } } // Test the Sum // if Sum > 1 then the Set is MIXED // if Sum = 0 then the Set is Homogeneous // else then the Set is empty if( Sum > 1 ) { Sets[i].CGNSType = MIXED; } else if( Sum == 1 ) { int j = 0; std::cout << "Homogeneous Type\n"; while( j < (int)Sets[i].NbEntities.size() && Sets[i].NbEntities[j] != 1 ) { ++j; } switch( j ) { case 0: Sets[i].CGNSType = BAR_2; break; case 1: Sets[i].CGNSType = TRI_3; break; case 2: Sets[i].CGNSType = QUAD_4; break; case 3: Sets[i].CGNSType = TETRA_4; break; case 4: Sets[i].CGNSType = PYRA_5; break; case 5: Sets[i].CGNSType = PENTA_6; break; case 6: Sets[i].CGNSType = HEXA_8; break; default: std::cout << "It was not possible to identify the CGNSType\n"; return MB_FAILURE; } } else { Sets[i].CGNSType = ElementTypeNull; } // NOT SURE IF THAT'S THE RIGHT WAY....... // Clear the test vector Test.clear(); return MB_SUCCESS; }
ErrorCode moab::WriteCGNS::get_conn_table | ( | std::vector< moab::EntityHandle > & | Elements, |
std::vector< int > & | Begin, | ||
std::vector< int > & | End, | ||
std::vector< moab::Tag > & | TagHandles, | ||
std::vector< WriteCGNS::SetStruct > & | Sets, | ||
std::vector< std::vector< cgsize_t > > & | ConnTable | ||
) |
Definition at line 715 of file WriteCGNS.cpp.
References cgsize_t, ErrorCode, moab::Interface::get_connectivity(), MB_SUCCESS, mbImpl, moab_cgns_conv(), and moab::Interface::tag_get_data().
Referenced by write_file().
{ ErrorCode rval; // int Begin = 0; // GOT TO WORK ON THIS // int End; // Get the number of Tags in the mesh int NbTags = TagHandles.size(); // Test all Elements, get their ids and connectivity // to fill ConnTable for( std::vector< moab::EntityHandle >::iterator i = Elements.begin(); i != Elements.end(); ++i ) { int id; // Test all Tags for( int j = 0; j < NbTags; ++j ) { // Test if the Tag has data if( Sets[j].IdSet != -1 ) { // Try to get data from entity rval = mbImpl->tag_get_data( TagHandles[j], &*i, 1, &id ); if( MB_SUCCESS != rval ) { return rval; } // If successful id==j if( id == j ) { // Get the entity type of the EntityHandle wich points to Cells int num_vtx; // Number of MeshVertices in array connectivity. const EntityHandle* conn; // Array in which connectivity of entity_handle is returned. // Gets a pointer to constant connectivity data of entity_handle rval = mbImpl->get_connectivity( *i, conn, num_vtx ); if( MB_SUCCESS != rval ) { return rval; } // If the Set is MIXED type // push CGNS ENUM type of the entity // before the connectivity if( Sets[j].CGNSType == MIXED ) { ConnTable[j].push_back( moab_cgns_conv( *i ) ); // moab_cgns_conv return an int which // represents the CGNS type Begin[j]++; } End[j] = Begin[j] + num_vtx; // Push conn in ConnTable in which "j" is the Set Index for( int k = Begin[j]; k < End[j]; ++k ) { ConnTable[j].push_back( (cgsize_t)conn[k - Begin[j]] ); } Begin[j] = End[j]; } } } } return MB_SUCCESS; }
ErrorCode moab::WriteCGNS::get_edge_entities | ( | cgsize_t & | EdgeSize, |
std::vector< moab::EntityHandle > & | Edges | ||
) |
Definition at line 301 of file WriteCGNS.cpp.
References celldim, ErrorCode, moab::Interface::get_entities_by_dimension(), mbImpl, and physdim.
Referenced by write_file().
{ ErrorCode rval; // The first input is 0 because one queries the entire mesh. // Get all entities of dimension = 1 in Edges rval = mbImpl->get_entities_by_dimension( 0, 1, Edges_, false ); if( Edges_.size() > 0 ) { celldim = 1; physdim = 1; // get the amout of edges EdgeSize_ = Edges_.size(); } // done return rval; }
ErrorCode moab::WriteCGNS::get_face_entities | ( | cgsize_t & | FaceSize, |
std::vector< moab::EntityHandle > & | Faces | ||
) |
Definition at line 319 of file WriteCGNS.cpp.
References celldim, ErrorCode, moab::Interface::get_entities_by_dimension(), mbImpl, and physdim.
Referenced by write_file().
{ ErrorCode rval; // The first input is 0 because one queries the entire mesh. // Get all entities of dimension = 2 in Faces rval = mbImpl->get_entities_by_dimension( 0, 2, Faces_, false ); if( Faces_.size() ) { celldim = 2; physdim = 2; // get the amout of faces FaceSize_ = Faces_.size(); } // done return rval; }
ErrorCode moab::WriteCGNS::get_set_entities | ( | int | i, |
std::vector< moab::Tag > & | TagHandles, | ||
std::vector< WriteCGNS::SetStruct > & | Sets | ||
) |
Definition at line 532 of file WriteCGNS.cpp.
References ErrorCode, moab::Interface::get_number_entities_by_type_and_tag(), MB_SUCCESS, MBEDGE, MBHEX, mbImpl, MBPRISM, MBPYRAMID, MBQUAD, MBTET, and MBTRI.
Referenced by set_tag_values().
{ ErrorCode rval; // Get the number of MBEDGE entities // NbEntities[0] holds the number of MBEDGE in the "Sets" int Number = 0; rval = mbImpl->get_number_entities_by_type_and_tag( 0, MBEDGE, &TagHandles[i], 0, 1, Number ); if( rval != MB_SUCCESS ) { std::cout << "Problem to get the number of entities by type and tag\n"; return rval; } Sets[i].NbEntities.push_back( Number ); // MBEDGE == Sets[i].NbEntities[0] Sets[i].NbEdges += Number; std::cout << "\tNumber of MBEDGE = " << Number << "\n"; // Get the number of MBTRI entities // NbEntities[1] holds the number of MBTRI in the "Sets" Number = 0; rval = mbImpl->get_number_entities_by_type_and_tag( 0, MBTRI, &TagHandles[i], 0, 1, Number ); if( rval != MB_SUCCESS ) { std::cout << "Problem to get the number of entities by type and tag\n"; return rval; } Sets[i].NbEntities.push_back( Number ); // MBTRI == Sets[i].NbEntities[1] Sets[i].NbFaces += Number; std::cout << "\tNumber of MBTRI = " << Number << "\n"; // Get the number of MBQUAD entities // NbEntities[2] holds the number of MBQUAD in the "Sets" Number = 0; rval = mbImpl->get_number_entities_by_type_and_tag( 0, MBQUAD, &TagHandles[i], 0, 1, Number ); if( rval != MB_SUCCESS ) { std::cout << "Problem to get the number of entities by type and tag\n"; return rval; } Sets[i].NbEntities.push_back( Number ); // MBQUAD == Sets[i].NbEntities[2] Sets[i].NbFaces += Number; std::cout << "\tNumber of MBQUAD = " << Number << "\n"; // Get the number of MBTET entities // NbEntities[3] holds the number of MBTET in the "Sets" Number = 0; rval = mbImpl->get_number_entities_by_type_and_tag( 0, MBTET, &TagHandles[i], 0, 1, Number ); if( rval != MB_SUCCESS ) { std::cout << "Problem to get the number of entities by type and tag\n"; return rval; } Sets[i].NbEntities.push_back( Number ); // MBTET == Sets[i].NbEntities[3] Sets[i].NbCells += Number; std::cout << "\tNumber of MBTET = " << Number << "\n"; // Get the number of MBPYRAMID entities // NbEntities[4] holds the number of MBPYRAMID in the "Sets" Number = 0; rval = mbImpl->get_number_entities_by_type_and_tag( 0, MBPYRAMID, &TagHandles[i], 0, 1, Number ); if( rval != MB_SUCCESS ) { std::cout << "Problem to get the number of entities by type and tag\n"; return rval; } Sets[i].NbEntities.push_back( Number ); // MBPYRAMID == Sets[i].NbEntities[4] Sets[i].NbCells += Number; std::cout << "\tNumber of MBPYRAMID = " << Number << "\n"; // Get the number of MBPRISM entities - MBPRISM == PENTA_6 // NbEntities[5] holds the number of MBPRISM in the "Sets" Number = 0; rval = mbImpl->get_number_entities_by_type_and_tag( 0, MBPRISM, &TagHandles[i], 0, 1, Number ); if( rval != MB_SUCCESS ) { std::cout << "Problem to get the number of entities by type and tag\n"; return rval; } Sets[i].NbEntities.push_back( Number ); // MBPRISM == Sets[i].NbEntities[5] Sets[i].NbCells += Number; std::cout << "\tNumber of MBPRISM = " << Number << "\n"; // Get the number of MBHEX entities // NbEntities[6] holds the number of MBHEX in the "Sets" Number = 0; rval = mbImpl->get_number_entities_by_type_and_tag( 0, MBHEX, &TagHandles[i], 0, 1, Number ); if( rval != MB_SUCCESS ) { std::cout << "Problem to get the number of entities by type and tag\n"; return rval; } Sets[i].NbEntities.push_back( Number ); // MBHEX == Sets[i].NbEntities[6] Sets[i].NbCells += Number; std::cout << "\tNumber of MBHEX = " << Number << "\n"; std::cout << "\tTotal number of Edges = " << Sets[i].NbEdges << "\n"; std::cout << "\tTotal number of Faces = " << Sets[i].NbFaces << "\n"; std::cout << "\tTotal number of Cells = " << Sets[i].NbCells << "\n"; return MB_SUCCESS; }
ErrorCode moab::WriteCGNS::get_vertex_entities | ( | cgsize_t & | VrtSize, |
std::vector< moab::EntityHandle > & | Nodes | ||
) |
Definition at line 278 of file WriteCGNS.cpp.
References celldim, ErrorCode, moab::Interface::get_entities_by_dimension(), mbImpl, Nodes, and physdim.
Referenced by write_file().
{ ErrorCode rval; // Get vertex entities // The first input is 0 because one queries the entire mesh. // Retrieves all entities of dimension = 0 in "Nodes" rval = mbImpl->get_entities_by_dimension( 0, 0, Nodes_, false ); if( Nodes.size() > 0 ) { celldim = 0; physdim = 0; // get the amout of vertex VrtSize_ = Nodes_.size(); } else { std::cout << "The mesh has not node points.\n"; } // done return rval; }
int moab::WriteCGNS::moab_cgns_conv | ( | const EntityHandle | handle | ) |
< Mesh Edge
< Triangular element (including shells)
< Quadrilateral element (including shells)
< Tetrahedral element
< Pyramid element
< Wedge element
< Hexahedral element
Definition at line 783 of file WriteCGNS.cpp.
References MBEDGE, MBHEX, mbImpl, MBPRISM, MBPYRAMID, MBQUAD, MBTET, MBTRI, and moab::Interface::type_from_handle().
Referenced by get_conn_table().
{ EntityType MoabType = mbImpl->type_from_handle( handle ); switch( MoabType ) { case MBEDGE: /**< Mesh Edge */ return BAR_2; case MBTRI: /**< Triangular element (including shells) */ return TRI_3; case MBQUAD: /**< Quadrilateral element (including shells) */ return QUAD_4; case MBTET: /**< Tetrahedral element */ return TETRA_4; case MBPYRAMID: /**< Pyramid element */ return PYRA_5; case MBPRISM: /**< Wedge element */ return PENTA_6; case MBHEX: /**< Hexahedral element */ return HEXA_8; default: std::cout << "It was not possible to identify the CGNSType\n"; return 0; } }
ErrorCode moab::WriteCGNS::set_tag_values | ( | std::vector< moab::Tag > & | TagHandles, |
std::vector< moab::EntityHandle > & | Edges, | ||
std::vector< moab::EntityHandle > & | Faces, | ||
std::vector< moab::EntityHandle > & | Cells, | ||
std::vector< WriteCGNS::SetStruct > & | Sets | ||
) |
Definition at line 438 of file WriteCGNS.cpp.
References Cells, ErrorCode, Faces, get_cgns_type(), get_set_entities(), MB_SUCCESS, mbImpl, physdim, moab::Interface::tag_get_name(), and moab::Interface::tag_set_data().
Referenced by write_file().
{ ErrorCode rval; // Get the number of Tags in the mesh int NbTags = TagHandles.size(); // Loop over all Tags for( int i = 0; i < NbTags; ++i ) { // Allocate another position in the vector of SetStruct using a default constructor Sets.push_back( SetStruct() ); // Get the Tag name rval = mbImpl->tag_get_name( TagHandles[i], Sets[i].TagName ); if( rval != MB_SUCCESS ) { std::cout << "Problem to get Tag Name\n"; return rval; } std::cout << "Tag name= " << Sets[i].TagName << "\n"; // Count all entities by type and put in Sets[i].NbEntities vector rval = get_set_entities( i, TagHandles, Sets ); if( rval != MB_SUCCESS ) { std::cout << "Problem to get Set entities\n"; return rval; } // Get the CGNSTYpe of the Set rval = get_cgns_type( i, Sets ); if( rval != MB_SUCCESS ) { std::cout << "Problem to get CGNSType\n"; return rval; } std::cout << "\tSets[" << i << "].CGNSType= " << Sets[i].CGNSType << "\n"; // int Number; // Set a data index for Edges and TagHandles[i] if( Sets[i].CGNSType == BAR_2 || Sets[i].CGNSType == TRI_3 || Sets[i].CGNSType == QUAD_4 || Sets[i].CGNSType == TETRA_4 || Sets[i].CGNSType == PYRA_5 || Sets[i].CGNSType == PENTA_6 || Sets[i].CGNSType == HEXA_8 || Sets[i].CGNSType == MIXED ) { if( Sets[i].NbEdges > 0 && physdim < 3 ) { // Set a data index for Edges and TagHandles[i] const std::vector< int > tag_values( Edges_.size(), i ); rval = mbImpl->tag_set_data( TagHandles[i], &Edges_[0], Edges_.size(), &tag_values[0] ); if( rval != MB_SUCCESS ) { std::cout << "Problem to set data for 1-D entities\n"; return rval; } } if( Sets[i].NbFaces > 0 && physdim > 1 ) { // Set a data index for Faces and TagHandles[i] const std::vector< int > tag_values( Faces.size(), i ); rval = mbImpl->tag_set_data( TagHandles[i], &Faces_[0], Faces_.size(), &tag_values[0] ); if( rval != MB_SUCCESS ) { std::cout << "Problem to set data for 2-D entities\n"; return rval; } } if( Sets[i].NbCells > 0 && physdim > 2 ) { // Set a data index for Cells and TagHandles[i] const std::vector< int > tag_values( Cells.size(), i ); rval = mbImpl->tag_set_data( TagHandles[i], &Cells_[0], Cells_.size(), &tag_values[0] ); if( rval != MB_SUCCESS ) { std::cout << "Problem to set data for 3-D entities\n"; return rval; } } // IdSet gets the Set Index indicating that it is not empty Sets[i].IdSet = i; } std::cout << "\tSets[" << i << "].IdSet = " << Sets[i].IdSet << "\n\n"; } return MB_SUCCESS; }
ErrorCode moab::WriteCGNS::write_coord_cgns | ( | std::vector< moab::EntityHandle > & | nodes | ) |
Definition at line 354 of file WriteCGNS.cpp.
References ErrorCode, moab::Interface::get_coords(), IndexBase, IndexCoord, IndexFile, IndexZone, MB_SUCCESS, and mbImpl.
Referenced by write_file().
{ ErrorCode rval; const int num_entities = (int)Nodes_.size(); // Moab works with one vector for the threee coordinates std::vector< double > Coords( 3 * num_entities ); std::vector< double >::iterator c = Coords.begin(); // CGNS uses one vector for each coordinate std::vector< double > CoordX; std::vector< double > CoordY; std::vector< double > CoordZ; // Summ the values of all coordinates to be sure if it is not zero double SumX = 0; double SumY = 0; double SumZ = 0; // Get the moab coordinates - Coords is the output rval = mbImpl->get_coords( &Nodes_[0], num_entities, &Coords[0] ); if( MB_SUCCESS != rval ) { std::cout << "Error getting coordinates from nodes.\n"; return rval; } // Reserve the size of nodes CoordX.reserve( Nodes_.size() ); CoordY.reserve( Nodes_.size() ); CoordZ.reserve( Nodes_.size() ); for( std::vector< moab::EntityHandle >::iterator i = Nodes_.begin(); i != Nodes_.end(); ++i ) { CoordX.push_back( *c ); // Put the X coordinate in CoordX vector SumX += abs( *c ); // Sum all X coordinates ++c; // Move to Y coordinate CoordY.push_back( *c ); // Put the Y coordinate in CoordY vector SumY += abs( *c ); // Sum all Y coordinates ++c; // Move to Z coordinate CoordZ.push_back( *c ); // Put the Z coordinate in CoordZ vector SumZ += abs( *c ); // Sum all Z coordinates ++c; // Move to X coordinate } // If X coordinate is not empty then write CoordX (user must use SIDS-standard names here) if( SumX != 0 ) { if( cg_coord_write( IndexFile, IndexBase, IndexZone, RealDouble, "CoordinateX", &CoordX[0], &IndexCoord[0] ) ) { std::cout << " Error writing X coordinates.\n"; cg_error_exit(); } } // If Y coordinate is not empty then write CoordY (user must use SIDS-standard names here) if( SumY != 0 ) { if( cg_coord_write( IndexFile, IndexBase, IndexZone, RealDouble, "CoordinateY", &CoordY[0], &IndexCoord[1] ) ) { std::cout << " Error writing Y coordinates.\n"; cg_error_exit(); } } // If Z coordinate is not empty then write CoordZ (user must use SIDS-standard names here) if( SumZ != 0 ) { if( cg_coord_write( IndexFile, IndexBase, IndexZone, RealDouble, "CoordinateZ", &CoordZ[0], &IndexCoord[2] ) ) { std::cout << " Error writing Z coordinates.\n"; cg_error_exit(); } } // Clear vectors Coords.clear(); CoordX.clear(); CoordY.clear(); CoordZ.clear(); // done return MB_SUCCESS; }
ErrorCode moab::WriteCGNS::write_file | ( | const char * | file_name, |
const bool | overwrite, | ||
const FileOptions & | opts, | ||
const EntityHandle * | output_list, | ||
const int | num_sets, | ||
const std::vector< std::string > & | qa_list, | ||
const Tag * | tag_list = NULL , |
||
int | num_tags = 0 , |
||
int | export_dimension = 3 |
||
) | [virtual] |
writes out a file
Implements moab::WriterIface.
Definition at line 41 of file WriteCGNS.cpp.
References BaseName, celldim, Cells, CellSize, cgsize_t, moab::WriteUtilIface::check_doesnt_exist(), Edges, EdgeSize, ErrorCode, Faces, FaceSize, fileName, get_cell_entities(), get_conn_table(), get_edge_entities(), get_face_entities(), get_vertex_entities(), IndexBase, IndexFile, IndexSection, IndexZone, isize, MB_SUCCESS, mbImpl, mWriteIface, Nodes, physdim, set_tag_values(), moab::Interface::tag_get_tags(), VrtSize, write_coord_cgns(), and ZoneName.
{ ErrorCode rval; if( !overwrite ) { rval = mWriteIface->check_doesnt_exist( file_name ); if( MB_SUCCESS != rval ) return rval; } std::cout << "THE CGNS CONVERSION ONLY WORKS FOR ENTITIES CITED BELOW:"; std::cout << "\n -MBVERTEX\n -MBEDGE\n -MBTRI\n -MBQUAD"; std::cout << "\n -MBTET\n -MBPYRAMID\n -MBHEX\n"; // Get entities to write // Get and count vertex entities rval = get_vertex_entities( VrtSize, Nodes ); if( rval != MB_SUCCESS ) { return rval; } // Get and count edge entities rval = get_edge_entities( EdgeSize, Edges ); if( rval != MB_SUCCESS ) { return rval; } // Get and count face entities rval = get_face_entities( FaceSize, Faces ); if( rval != MB_SUCCESS ) { return rval; } // Get and count cell entities rval = get_cell_entities( CellSize, Cells ); if( rval != MB_SUCCESS ) { return rval; } std::cout << "\nThe Number of Vertex is " << VrtSize << ".\n"; std::cout << "The Number of Edges is " << EdgeSize << ".\n"; std::cout << "The Number of Faces is " << FaceSize << ".\n"; std::cout << "The Number of Cells is " << CellSize << ".\n\n"; // save filename to member variable so we don't need to pass as an argument // to called functions fileName = file_name; std::cout << fileName << " file is a " << physdim << "-D mesh.\n"; // Open file IndexFile = 0; // open the cgns file // filename: (input) Name of the CGNS file, including path name if necessary. There is no // limit on the // length of this character variable. // CG_MODE_WRITE: (input) Mode used for opening the file. The modes currently supported are // CG_MODE_READ, // CG_MODE_WRITE, and CG_MODE_MODIFY. // filePtr: (output) CGNS file index number. if( cg_open( fileName, CG_MODE_WRITE, &IndexFile ) ) { std::cout << "Error opening file\n"; cg_error_exit(); } // Give a base name BaseName = "Cgns Base"; if( cg_base_write( IndexFile, BaseName, celldim, physdim, &IndexBase ) ) { std::cout << "Error creating CGNS base"; } // Give a zone name ZoneName = "Cgns Zone"; // isize array contains the total vertex size, cell size, and boundary // vertex size for the zone // Note that for unstructured zones, the index dimension is always 1 isize[0] = VrtSize; // isize[0] contains the total vertex size isize[1] = CellSize; // isize[1] contains the total cell size isize[2] = 0; // isize[2] = 0 for unsorted elements // Create zone */ // ZoneType_t: Unstructured if( cg_zone_write( IndexFile, IndexBase, ZoneName, isize, Unstructured, &IndexZone ) ) { std::cout << "Error creating CGNS zone\n"; cg_error_exit(); } // Write the vertex coordinates rval = write_coord_cgns( Nodes ); if( rval != MB_SUCCESS ) { return rval; } // Create a vector to hold the Tags std::vector< moab::Tag > TagHandles; // Get Tags rval = mbImpl->tag_get_tags( TagHandles ); if( rval != MB_SUCCESS ) { return rval; } // Get the number of Tags in the mesh int NbTags = TagHandles.size(); std::cout << "\nThe mesh has " << NbTags << " Tags.\n"; // Create a vector of size NbTags // Sets have informations about the entity set std::vector< SetStruct > Sets; Sets.reserve( NbTags ); // Fill Sets with all information needed rval = set_tag_values( TagHandles, Edges, Faces, Cells, Sets ); if( rval != MB_SUCCESS ) { std::cout << "Problem to set tag values\n"; return rval; } // Create a matrix to hold connectivity std::vector< std::vector< cgsize_t > > ConnTable; ConnTable.resize( NbTags ); std::vector< int > Begin( NbTags, 0 ); std::vector< int > End( NbTags, 0 ); // Take the connectivity of higher dimension entities cgsize_t BeginSetsIndex = 1; cgsize_t EndSetsIndex; switch( physdim ) { case 1: rval = get_conn_table( Edges, Begin, End, TagHandles, Sets, ConnTable ); if( rval != MB_SUCCESS ) { std::cout << "Problem to fill the connectivity table for 1-D entities\n"; return rval; } for( int i = 0; i < NbTags; ++i ) { if( Sets[i].IdSet != -1 ) { const char* SectionName = Sets[i].TagName.c_str(); EndSetsIndex = BeginSetsIndex + Sets[i].NbEdges - 1; // Write the section in CGNS file if( cg_section_write( IndexFile, IndexBase, IndexBase, SectionName, Sets[i].CGNSType, BeginSetsIndex, EndSetsIndex, 0, &ConnTable[i][0], &IndexSection ) ) { std::cout << "Issue on writing connectivity - 3-D\n"; cg_error_exit(); } BeginSetsIndex = EndSetsIndex + 1; } } break; case 2: rval = get_conn_table( Edges, Begin, End, TagHandles, Sets, ConnTable ); if( rval != MB_SUCCESS ) { std::cout << "Problem to fill the connectivity table for 1-D entities\n"; return rval; } rval = get_conn_table( Faces, Begin, End, TagHandles, Sets, ConnTable ); if( rval != MB_SUCCESS ) { std::cout << "Problem to fill the connectivity table for 2-D entities\n"; return rval; } for( int i = 0; i < NbTags; ++i ) { if( Sets[i].IdSet != -1 ) { const char* SectionName = Sets[i].TagName.c_str(); EndSetsIndex = BeginSetsIndex + Sets[i].NbEdges + Sets[i].NbFaces - 1; // Write the section in CGNS file if( cg_section_write( IndexFile, IndexBase, IndexBase, SectionName, Sets[i].CGNSType, BeginSetsIndex, EndSetsIndex, 0, &ConnTable[i][0], &IndexSection ) ) { std::cout << "Issue on writing connectivity -- 2-D\n"; cg_error_exit(); } BeginSetsIndex = EndSetsIndex + 1; } } break; case 3: rval = get_conn_table( Faces, Begin, End, TagHandles, Sets, ConnTable ); if( rval != MB_SUCCESS ) { std::cout << "Problem to fill the connectivity table for 2-D entities\n"; return rval; } rval = get_conn_table( Cells, Begin, End, TagHandles, Sets, ConnTable ); if( rval != MB_SUCCESS ) { std::cout << "Problem to fill the connectivity table for 3-D entities\n"; return rval; } for( int i = 0; i < NbTags; ++i ) { if( Sets[i].IdSet != -1 ) { const char* SectionName = Sets[i].TagName.c_str(); EndSetsIndex = BeginSetsIndex + Sets[i].NbFaces + Sets[i].NbCells - 1; std::cout << "BeginSetsIndex = " << BeginSetsIndex << "\tEndSetsIndex = " << EndSetsIndex << "\n"; // Write the section in CGNS file if( cg_section_write( IndexFile, IndexBase, IndexBase, SectionName, Sets[i].CGNSType, BeginSetsIndex, EndSetsIndex, 0, &ConnTable[i][0], &IndexSection ) ) { std::cout << "Issue on writing connectivity -- 3-D\n"; cg_error_exit(); } BeginSetsIndex = EndSetsIndex + 1; } } break; default: std::cout << "Issue on Physical dimension\n"; return MB_FAILURE; } // Close the CGNS mesh file if( cg_close( IndexFile ) ) { std::cout << "Error closing file\n"; cg_error_exit(); } // done return MB_SUCCESS; }
const char* moab::WriteCGNS::BaseName [private] |
Definition at line 139 of file WriteCGNS.hpp.
Referenced by write_file().
int moab::WriteCGNS::celldim [private] |
Definition at line 153 of file WriteCGNS.hpp.
Referenced by get_cell_entities(), get_edge_entities(), get_face_entities(), get_vertex_entities(), and write_file().
std::vector< moab::EntityHandle > moab::WriteCGNS::Cells [private] |
Definition at line 161 of file WriteCGNS.hpp.
Referenced by set_tag_values(), and write_file().
cgsize_t moab::WriteCGNS::CellSize [private] |
Definition at line 167 of file WriteCGNS.hpp.
Referenced by write_file().
std::vector< moab::EntityHandle > moab::WriteCGNS::Edges [private] |
Definition at line 159 of file WriteCGNS.hpp.
Referenced by write_file().
cgsize_t moab::WriteCGNS::EdgeSize [private] |
Definition at line 165 of file WriteCGNS.hpp.
Referenced by write_file().
std::vector< moab::EntityHandle > moab::WriteCGNS::Faces [private] |
Definition at line 160 of file WriteCGNS.hpp.
Referenced by set_tag_values(), and write_file().
cgsize_t moab::WriteCGNS::FaceSize [private] |
Definition at line 166 of file WriteCGNS.hpp.
Referenced by write_file().
const char* moab::WriteCGNS::fileName [private] |
Definition at line 135 of file WriteCGNS.hpp.
Referenced by write_file().
int moab::WriteCGNS::IndexBase [private] |
Definition at line 140 of file WriteCGNS.hpp.
Referenced by write_coord_cgns(), and write_file().
int moab::WriteCGNS::IndexCoord[3] [private] |
Definition at line 150 of file WriteCGNS.hpp.
Referenced by write_coord_cgns(), and WriteCGNS().
int moab::WriteCGNS::IndexFile [private] |
Definition at line 136 of file WriteCGNS.hpp.
Referenced by write_coord_cgns(), and write_file().
int moab::WriteCGNS::IndexSection [private] |
Definition at line 147 of file WriteCGNS.hpp.
Referenced by write_file().
int moab::WriteCGNS::IndexZone [private] |
Definition at line 144 of file WriteCGNS.hpp.
Referenced by write_coord_cgns(), and write_file().
cgsize_t moab::WriteCGNS::isize[3] [private] |
Definition at line 155 of file WriteCGNS.hpp.
Referenced by write_file(), and WriteCGNS().
Interface* moab::WriteCGNS::mbImpl [private] |
Definition at line 131 of file WriteCGNS.hpp.
Referenced by get_cell_entities(), get_conn_table(), get_edge_entities(), get_face_entities(), get_set_entities(), get_vertex_entities(), moab_cgns_conv(), set_tag_values(), write_coord_cgns(), write_file(), and ~WriteCGNS().
WriteUtilIface* moab::WriteCGNS::mWriteIface [private] |
Definition at line 132 of file WriteCGNS.hpp.
Referenced by write_file(), WriteCGNS(), and ~WriteCGNS().
std::vector< moab::EntityHandle > moab::WriteCGNS::Nodes [private] |
Definition at line 158 of file WriteCGNS.hpp.
Referenced by get_vertex_entities(), and write_file().
int moab::WriteCGNS::physdim [private] |
Definition at line 154 of file WriteCGNS.hpp.
Referenced by get_cell_entities(), get_edge_entities(), get_face_entities(), get_vertex_entities(), set_tag_values(), and write_file().
cgsize_t moab::WriteCGNS::VrtSize [private] |
Definition at line 164 of file WriteCGNS.hpp.
Referenced by write_file().
const char* moab::WriteCGNS::ZoneName [private] |
Definition at line 143 of file WriteCGNS.hpp.
Referenced by write_file().