12 #include "MBiMesh.hpp"
15 #include "moab/Intx2MeshOnSphere.hpp"
20 #include "moab/IntxUtils.hpp"
27 static double gtol = 1.e-9;
70 iBase_EntitySetHandle imesh_euler_set,
84 ERRORV( rval,
"can't get eulerian quads" );
89 std::string tag_name4(
"Area" );
91 ERRORV( rval,
"can't get area tag" );
93 std::cout <<
" num quads = " << eulQuads.
size() <<
"\n";
94 ERRORV( rval,
"can't set area for each quad" );
103 iBase_EntitySetHandle imesh_euler_set,
104 iBase_EntitySetHandle imesh_output_set,
120 ERRORV( rval,
"can't get eulerian quads" );
124 std::string tag_name2(
"TracerAverage" );
126 ERRORV( rval,
"can't get tracer tag " );
131 std::string tag_name4(
"Area" );
133 ERRORV( rval,
"can't get area tag" );
135 std::cout <<
" num quads = " << eulQuads.
size() <<
"\n";
138 ERRORV( rval,
"can't set tracer data" );
141 ERRORV( rval,
"can't update tracer " );
144 ERRORV( rval,
"can't get tracer data" );
150 void update_tracer( iMesh_Instance instance, iBase_EntitySetHandle imesh_euler_set,
int* ierr )
152 using namespace moab;
154 const double gtol = 1.e-9;
155 const bool debug =
false;
164 worker.SetRadius(
radius );
166 worker.SetErrorTolerance(
gtol );
171 ERRORV( rval,
"can't create covering set " );
175 ERRORV( rval,
"can't populate covering set " );
179 rval =
mb->
write_file(
"lagr.h5m", 0, 0, &covering_lagr_set, 1 );
180 ERRORV( rval,
"can't write covering set " );
184 rval = enforce_convexity(
mb, covering_lagr_set );
185 ERRORV( rval,
"can't write covering set " );
189 ERRORV( rval,
"can't create output set " );
192 ERRORV( rval,
"can't intersect " );
196 rval =
mb->
write_file(
"output.vtk", 0, 0, &outputSet, 1 );
197 ERRORV( rval,
"can't write covering set " );
202 std::string tag_name2(
"TracerAverage" );
204 ERRORV( rval,
"can't get tracer tag " );
209 std::string tag_name4(
"Area" );
211 ERRORV( rval,
"can't get area tag" );
214 ERRORV( rval,
"can't update tracer " );
230 int& totalNumVertices,
231 int& numCornerVertices,
232 std::vector< double* >& coordv )
248 int size_corners = 4 * nelem;
251 std::vector< int > corn1( size_corners );
252 std::copy( corners, corners + size_corners, corn1.begin() );
253 std::sort( corn1.begin(), corn1.end() );
254 corn1.erase( std::unique( corn1.begin(), corn1.end() ), corn1.end() );
256 numCornerVertices = (int)corn1.size();
263 std::map< int, int > index_map;
264 for(
size_t i = 0; i < corn1.size(); i++ )
265 index_map[corn1[i]] = i;
275 int e_max = nelem + numCornerVertices - 1;
277 int numVertsOnEdges = ( nc - 1 ) * e_max;
278 int numExtraVerts = numVertsOnEdges + ( nc - 1 ) * ( nc - 1 ) * nelem;
280 totalNumVertices = numCornerVertices + numExtraVerts;
284 std::vector< int > index_used( numCornerVertices, 0 );
292 rval = read_iface->
get_node_coords( 3, totalNumVertices, 0, start_vert, coordv );
ERRORR( rval,
"can't get node coords " );
294 int stride = ( nc + 1 ) * ( nc + 1 );
306 int order_in_coord[] = { 0, nc, ( nc + 1 ) * ( nc + 1 ) - 1, nc * ( nc + 1 ) };
307 for(
int i = 0; i < size_corners; i++ )
310 int index = index_map[id];
313 int ind_coord = i / 4;
314 ind_coord = ( ind_coord * stride + order_in_coord[j] ) * 3;
315 if( index_used[index] )
317 if( fabs( coordv[0][index] - coords[ind_coord] ) > 0.000001 )
318 std::cout <<
" id:" << corners[i] <<
" i:" << i <<
" j:" << j <<
" " << coordv[0][index] <<
" "
319 << coords[ind_coord] <<
"\n";
322 coordv[0][index] = coords[ind_coord];
323 coordv[1][index] = coords[ind_coord + 1];
324 coordv[2][index] = coords[ind_coord + 2];
325 index_used[index] = 1;
327 rval =
mb->
tag_set_data( tagid, &vertexh, 1, (
void*)&id );
ERRORR( rval,
"can't set tag id on vertex " );
332 for(
int i = 0; i < nelem; i++ )
334 for(
int j = 0; j < 4; j++ )
336 int index_v = index_map[corners[i * 4 + j]];
337 connect[i * 4 + j] = start_vert + index_v;
341 Range quads( start_elem, start_elem + nelem - 1 );
352 std::cout <<
" on rank " << rank <<
" e_max is " << e_max <<
" actual number of edges: " << coarseEdges.
size()
355 ERRORR( rval,
"can't resolve shared vertices and edges " );
366 rval =
mb->
write_file(
"coarse.h5m", 0,
"PARALLEL=WRITE_PART", &coarseSet, 1 );
ERRORR( rval,
"can't write in parallel coarse mesh" );
374 std::vector< double* >& coordv,
380 int numCornerVertices,
381 Tag& fineVertOnEdgeTag )
386 for(
int k = 0; k < 3; k++ )
387 coordv2[k] = coordv[k] + numCornerVertices;
391 int edges_index[4][
NC - 1];
406 for(
int j = 1; j <= nc - 1; j++ )
408 edges_index[0][j - 1] = j;
409 edges_index[1][j - 1] = ( j + 1 ) * ( nc + 1 ) - 1;
410 edges_index[2][j - 1] = ( nc + 1 ) * ( nc + 1 ) - j - 1;
411 edges_index[3][j - 1] = ( nc - j ) * ( nc + 1 );
414 int stride = ( nc + 1 ) * ( nc + 1 );
419 std::vector< EntityHandle > faces;
421 if( faces.size() < 1 )
return MB_FAILURE;
425 int indexq = coarseQuads.
index( quad );
427 if( indexq == -1 )
return MB_FAILURE;
429 EntityHandle firstRefinedV = start_v + numCornerVertices + indexv;
430 rval =
mb->
tag_set_data( fineVertOnEdgeTag, &
edge, 1, &firstRefinedV );
ERRORR( rval,
"can't set refined vertex tag" );
433 double* start_quad = &coords[3 * stride * indexq];
436 for(
int k = 1; k <= nc - 1; k++ )
438 int index_in_quad = edges_index[
side_number][k - 1] * 3;
439 coordv2[0][indexv] = start_quad[index_in_quad];
440 coordv2[1][indexv] = start_quad[index_in_quad + 1];
441 coordv2[2][indexv] = start_quad[index_in_quad + 2];
448 for(
int k = 1; k <= nc - 1; k++ )
450 int index_in_quad = edges_index[
side_number][nc - 1 - k] * 3;
451 coordv2[0][indexv] = start_quad[index_in_quad];
452 coordv2[1][indexv] = start_quad[index_in_quad + 1];
453 coordv2[2][indexv] = start_quad[index_in_quad + 2];
481 int numCornerVertices,
482 std::vector< double* >& coordv )
485 int stride = ( nc + 1 ) * ( nc + 1 );
527 fill_coord_on_edges(
mb, coordv, coords, edges, start_vert, coarseQuads, nc, numCornerVertices, fineVertTag );
ERRORR( rval,
"can't fill edges vertex coords on fine mesh" );
532 int iv = ( nc - 1 ) * edges.
size() + numCornerVertices;
533 start_vert = start_vert + numCornerVertices + ( nc - 1 ) * edges.
size();
542 std::vector< EntityHandle > vertList;
543 vertList.reserve( nelem * ( nc + 1 ) * ( nc + 1 ) );
547 for(
int ie = 0; ie < nelem; ie++ )
550 EntityHandle firstVert = start_vert + ( nc - 1 ) * ( nc - 1 ) * ie;
552 rval =
mb->
tag_set_data( fineVertTag, &eh, 1, &firstVert );
ERRORR( rval,
"can't set refined vertex tag" );
554 int index_coords = stride * ie;
555 for(
int j = 1; j <= ( nc - 1 ); j++ )
557 for(
int i = 1; i <= ( nc - 1 ); i++ )
559 int indx2 = 3 * ( index_coords + ( nc + 1 ) * j + i );
560 coordv[0][iv] = coords[indx2];
561 coordv[1][iv] = coords[indx2 + 1];
562 coordv[2][iv] = coords[indx2 + 2];
568 Range quads3( start_elem, start_elem + nelem * nc * nc - 1 );
571 for(
int ie = 0; ie < nelem; ie++ )
586 if( nnodes != 4 )
return MB_FAILURE;
588 arr2[0][0] = conn4[0];
589 arr2[nc][0] = conn4[1];
590 arr2[nc][nc] = conn4[2];
591 arr2[0][nc] = conn4[3];
594 std::vector< EntityHandle > aedges;
595 rval =
mb->
get_adjacencies( &coarseQ, 1, 1,
false, aedges );
ERRORR( rval,
"can't get adje edges of coarse quad" );
596 assert( (
int)aedges.size() == 4 );
598 for(
int k = 0; k < 4; k++ )
610 rval =
mb->
tag_get_data( fineVertTag, &edh, 1, &firstV );
ERRORR( rval,
"can't get first vertex tag on edge" );
615 for(
int i = 1; i <= nc - 1; i++ )
616 arr2[i][0] = firstV + i - 1;
620 for(
int j = 1; j <= nc - 1; j++ )
621 arr2[nc][j] = firstV + j - 1;
625 for(
int i = nc - 1; i >= 1; i-- )
626 arr2[i][nc] = firstV + nc - 1 - i;
630 for(
int j = nc - 1; j >= 1; j-- )
631 arr2[0][j] = firstV + nc - 1 - j;
638 for(
int i = 1; i <= nc - 1; i++ )
639 arr2[i][0] = firstV + nc - 1 - i;
643 for(
int j = 1; j <= nc - 1; j++ )
644 arr2[nc][j] = firstV + nc - 1 - j;
648 for(
int i = nc - 1; i >= 1; i-- )
649 arr2[i][nc] = firstV + i - 1;
653 for(
int j = nc - 1; j >= 1; j-- )
654 arr2[0][j] = firstV + j - 1;
660 rval =
mb->
tag_get_data( fineVertTag, &coarseQ, 1, &firstV );
ERRORR( rval,
"can't get first vertex tag on coarse tag" );
662 for(
int j = 1; j <= nc - 1; j++ )
664 for(
int i = 1; i <= nc - 1; i++ )
666 arr2[i][j] = firstV + inc;
671 for(
int j1 = 0; j1 < nc; j1++ )
673 for(
int i1 = 0; i1 < nc; i1++ )
675 connect[ic++] = arr2[i1][j1];
676 connect[ic++] = arr2[i1 + 1][j1];
677 connect[ic++] = arr2[i1 + 1][j1 + 1];
678 connect[ic++] = arr2[i1][j1 + 1];
682 for(
int j1 = 0; j1 <= nc; j1++ )
684 for(
int i1 = 0; i1 <= nc; i1++ )
686 vertList.push_back( arr2[i1][j1] );
696 rval = read_iface->
update_adjacencies( start_elem, nelem * nc * nc, 4, connect );
ERRORR( rval,
"can't update adjacencies on fine quads" );
698 rval =
mb->
tag_set_data( partitionTag, &fine_set, 1, &rank );
ERRORR( rval,
"can't set partition tag on fine set" );
708 rval = pmerge.
merge();
ERRORR( rval,
"can't resolve vertices on interior of boundary edges " );
712 Range owned_verts = verts;
728 std::stringstream fff;
732 rval =
mb->
write_file(
"fine.h5m", 0,
"PARALLEL=WRITE_PART", &fine_set, 1 );
ERRORR( rval,
"can't write set 3, fine " );
749 for(
int kk = 0; kk < (int)vertList.size(); kk++ )
752 int index = verts.
index( v );
755 std::cout <<
" can't locate vertex " << v <<
" in vertex Range \n";
769 std::cout <<
" vertex at index " << k <<
" in vertex Range " << verts[k] <<
" is not mapped \n";
780 iBase_EntitySetHandle* imesh_euler_set,
781 iBase_EntitySetHandle* imesh_departure_set,
782 iBase_EntitySetHandle* imesh_intx_set,
794 MPI_Comm mpicomm = MPI_Comm_f2c( comm );
800 ERRORV( rval,
"can't create coarse set " );
803 int totalNumVertices;
804 int numCornerVertices;
805 std::vector< double* > coordv;
806 rval =
create_coarse_mesh(
mb, pcomm, coarseSet, coords, corners, nc, nelem, start_vert, totalNumVertices,
807 numCornerVertices, coordv );
808 ERRORV( rval,
"can't create coarse set " );
812 ERRORV( rval,
"can't create fine set " );
814 rval =
create_fine_mesh(
mb, pcomm, coarseSet, fine_set, coords, nc, nelem, start_vert, numCornerVertices, coordv );
815 ERRORV( rval,
"can't create fine mesh set " );
817 *imesh_departure_set = (iBase_EntitySetHandle)fine_set;
821 ERRORV( rval,
"can't create moab euler set " );
822 *imesh_euler_set = (iBase_EntitySetHandle)euler_set;
826 rval = deep_copy_set_with_quads(
mb, fine_set, euler_set );
827 ERRORV( rval,
"can't populate lagrange set " );
831 ERRORV( rval,
"can't create output set " );
833 *imesh_intx_set = (iBase_EntitySetHandle)intx_set;
839 rval =
pworker->build_processor_euler_boxes( euler_set,
841 ERRORV( rval,
"can't compute euler boxes " );
867 assert( -1 != index );
871 sph.lat = dep_coords[2 * index];
872 sph.lon = dep_coords[2 * index + 1];
874 CartVect depPoint = spherical_to_cart( sph );
881 iBase_EntitySetHandle fine_set,
882 iBase_EntitySetHandle lagr_set,
883 iBase_EntitySetHandle intx_set,
896 if( NULL == pcomm )
return;
900 ERRORV( rval,
"can't set departure tag" );
903 std::stringstream fff;
905 rval =
mb->
write_mesh( fff.str().c_str(), &lagrMeshSet, 1 );
906 ERRORV( rval,
"can't write covering set " );
914 ERRORV( rval,
"can't compute covering set " );
918 std::stringstream fff;
920 rval =
mb->
write_mesh( fff.str().c_str(), &covering_set, 1 );
922 ERRORV( rval,
"can't write covering set " );
926 ERRORV( rval,
"can't intersect " );
930 std::stringstream fff;
932 rval =
mb->
write_mesh( fff.str().c_str(), &intxSet, 1 );
933 ERRORV( rval,
"can't write covering set " );
939 iBase_EntitySetHandle fine_set,
940 iBase_EntitySetHandle lagr_set,
941 iBase_EntitySetHandle intx_set,
951 ERRORV( rval,
"can't get all vertices" );
955 ERRORV( rval,
"can't get all elems" );
959 ERRORV( rval,
"can't get all polys from fine set" );
964 ERRORV( rval,
"can't get all polys from lagr set" );
968 ERRORV( rval,
"get verts that stay" );
977 ERRORV( rval,
"clear mesh set" );
980 ERRORV( rval,
"delete intx elements" );
982 ERRORV( rval,
"failed to delete intx vertices" );