42 MB_CHK_SET_ERR(
mb->get_connectivity( cells, verts ),
"Failed to get connectivity" );
48 std::vector< double* > ccenters;
53 std::vector< int > gids( cells.
size() );
54 MB_CHK_SET_ERR(
mb->get_coords( cells, ccenters[0], ccenters[1], ccenters[2] ),
"Failed to get coordinates" );
55 MB_CHK_SET_ERR(
mb->tag_get_data( gidTag, cells, &gids[0] ),
"Can't set global_id tag" );
58 MB_CHK_SET_ERR(
mb->add_entities( dual_set, dualverts ),
"Can't add entities" );
59 MB_CHK_SET_ERR(
mb->tag_set_data( gidTag, dualverts, &gids[0] ),
"Can't set global_id tag" );
61 #define CC( ind ) moab::CartVect( ccenters[0][ind], ccenters[1][ind], ccenters[2][ind] )
62 #define CCXMY( ind, cv ) \
63 moab::CartVect( ccenters[0][ind] - ( cv )[0], ccenters[1][ind] - ( cv )[1], ccenters[2][ind] - ( cv )[2] )
69 std::map< size_t, std::vector< moab::EntityHandle > > polygonConn;
75 std::vector< moab::EntityHandle > adjs;
77 MB_CHK_SET_ERR(
mb->get_adjacencies( &vtx, 1, 2,
true, adjs ),
"Failed to get adjacencies" );
78 const size_t nEdges = adjs.size();
81 MB_CHK_SET_ERR(
mb->get_coords( &vtx, 1, vxyz ),
"Failed to get coordinates" );
87 double dNode0Mag = node0.
length();
92 std::vector< double > dAngles;
93 dAngles.resize( nEdges );
96 for(
size_t j = 1; j < nEdges; j++ )
99 double dNodeDiffMag = nodeDiff.
length();
101 double dSide = nodeCross % nodeDiff;
102 double dDotNorm = ( node0 % nodeDiff ) / ( dNode0Mag * dNodeDiffMag );
110 dAngles[j] = acos( dDotNorm );
114 dAngles[j] = -dAngles[j] + 2.0 * M_PI;
118 std::vector< moab::EntityHandle >&
face = polygonConn[nEdges];
119 if(
face.size() == 0 )
face.reserve( nEdges * verts.
size() / 4 );
120 face.push_back( dualverts[adjs[0] - svtx] );
123 double dCurrentAngle = 0.0;
124 for(
size_t j = 1; j < nEdges; j++ )
127 double dNextAngle = 2.0 * M_PI;
129 for(
size_t k = 1; k < nEdges; k++ )
131 if( ( dAngles[k] > dCurrentAngle ) && ( dAngles[k] < dNextAngle ) )
134 dNextAngle = dAngles[k];
138 face.push_back( dualverts[adjs[ixNextNode] - svtx] );
139 dCurrentAngle = dNextAngle;
143 std::map< size_t, std::vector< moab::EntityHandle > >::iterator eit;
144 for( eit = polygonConn.begin(); eit != polygonConn.end(); ++eit )
146 const size_t nVPerE = eit->first;
147 const size_t nElePerType =
static_cast< int >( eit->second.size() / nVPerE );
153 "Can't get element connectivity" );
156 std::copy( eit->second.begin(), eit->second.end(), conn );
160 moab::Range mbcells( starte, starte + nElePerType - 1 );
161 dualcells.
merge( mbcells );
165 MB_CHK_SET_ERR(
mb->add_entities( dual_set, dualcells ),
"Can't add polygonal entities" );
168 assert( dualcells.
size() == verts.
size() );
169 gids.resize( verts.
size() );
170 MB_CHK_SET_ERR(
mb->tag_get_data( gidTag, verts, &gids[0] ),
"Can't set global_id tag" );
171 if( gids[0] == gids[1] && gids[0] < 0 )
180 for(
size_t ix = 0; ix < gids.size(); ++ix )
184 MB_CHK_SET_ERR(
mb->tag_set_data( gidTag, dualcells, &gids[0] ),
"Can't set global_id tag" );
185 std::cout <<
"GIDs: " << gids[0] <<
" " << gids[1] <<
" " << gids[2] <<
" " << gids[3] <<
" " << gids[4] <<
" "
200 int main(
int argc,
char** argv )
207 if( NULL ==
mb )
return 1;
209 std::string inputFile = std::string(
MESH_DIR ) +
"/globalmpas_deltri.h5m";
210 opts.
addOpt< std::string >(
"inFile,i",
"Specify the input file name string ", &inputFile );
211 #ifdef MOAB_HAVE_HDF5
212 std::string outputFile =
"outDualMesh.h5m";
214 std::string outputFile =
"outDualMesh.vtk";
216 opts.
addOpt< std::string >(
"outFile,o",
"Specify the input file name string ", &outputFile );
225 const char* readopts =
"";
226 MB_CHK_SET_ERR(
mb->load_file( inputFile.c_str(), &triangle_set, readopts ),
"Failed to read" );
230 MB_CHK_SET_ERR(
mb->get_entities_by_dimension( triangle_set, 2, cells ),
"Failed to get cells" );
232 std::cout <<
"Original number of triangular cells : " << cells.
size() <<
"\n";
238 MB_CHK_SET_ERR(
mb->write_file( outputFile.c_str() ),
"Failed to write new file" );
241 MB_CHK_SET_ERR(
mb->get_entities_by_dimension( dual_set, 2, cells ),
"Failed to get cells" );
242 std::cout <<
"Wrote the dual mesh: " << outputFile <<
" containing " << cells.
size() <<
" polygonal cells\n";