29 mbi->tag_get_data( glid, &eh, 1, &gidval );
36 mbi->tag_get_data( glid, &eh, 1, &tagval );
37 return (
int)( tagval );
43 :
mb( mbimpl ), mbs1( 0 ), mbs2( 0 ), outSet( 0 ), gid( 0 ), TgtFlagTag( 0 ), tgtParentTag( 0 ), srcParentTag( 0 ),
44 countTag( 0 ), srcNeighTag( 0 ), tgtNeighTag( 0 ), neighTgtEdgeTag( 0 ), orgSendProcTag( 0 ), imaskTag( 0 ),
45 tgtConn( nullptr ), srcConn( nullptr ), epsilon_1( 0.0 ), epsilon_area( 0.0 ), box_error( 0.0 ), localRoot( 0 ),
49 parcomm( nullptr ), remote_cells( nullptr ), remote_cells_with_tracers( nullptr )
52 max_edges_1( 0 ), max_edges_2( 0 ), counting( 0 )
64 remote_cells =
nullptr;
81 if( nnodes > max_edges ) max_edges = nnodes;
88 int local_max_edges = max_edges;
91 MPI_Allreduce( &local_max_edges, &max_edges, 1, MPI_INT, MPI_MAX, parcomm->proc_config().proc_comm() );
92 if( MPI_SUCCESS != mpi_err )
return MB_FAILURE;
113 unsigned char def_data_bit = 0;
117 "can't get tgt flag tag" );
129 std::vector< EntityHandle >* nv =
new std::vector< EntityHandle >;
137 "can't create TargetParent tag" );
141 "can't create SourceParent tag" );
145 "can't create Counting tag" );
150 "can't determine neighbors for set 1" );
152 "can't determine neighbors for set 2" );
156 std::vector< EntityHandle > zeroh(
max_edges_2, 0 );
161 "can't create target edge neighbors tag" );
168 while(
tgtConn[num_nodes - 2] ==
tgtConn[num_nodes - 1] && num_nodes > 3 )
172 for( i = 0; i < num_nodes; i++ )
175 tgtConn[( i + 1 ) % num_nodes] };
176 std::vector< EntityHandle > adj_entities;
178 "can't get adjacencies" );
179 if( !adj_entities.size() )
MB_CHK_SET_ERR( MB_FAILURE,
"no adjacencies found" );
180 zeroh[i] = adj_entities[0];
189 "can't set edge target edge neighbors tag" );
199 std::vector< EntityHandle > neighbors( max_edges );
200 std::vector< EntityHandle > zeroh( max_edges, 0 );
205 "can't create neighbors tag" );
217 while( conn4[nsides - 2] == conn4[nsides - 1] && nsides > 3 )
220 for(
int i = 0; i < nsides; i++ )
224 v[1] = conn4[( i + 1 ) % nsides];
226 std::vector< EntityHandle > adjcells;
227 std::vector< EntityHandle > cellsInSet;
229 "can't get adjacency to 2 verts" );
232 size_t siz = adjcells.size();
233 for(
size_t j = 0; j < siz; j++ )
234 if(
mb->
contains_entities( inputSet, &( adjcells[j] ), 1 ) ) cellsInSet.push_back( adjcells[j] );
235 siz = cellsInSet.size();
239 std::cout <<
"non manifold mesh, error" <<
mb->
list_entities( &( cellsInSet[0] ), cellsInSet.size() )
252 if( cell == cellsInSet[0] )
253 neighbors[i] = cellsInSet[1];
255 neighbors[i] = cellsInSet[0];
258 for(
int i = nsides; i < max_edges; i++ )
344 "can't get adjacent target edges" );
350 std::vector< EntityHandle >* nv =
new std::vector< EntityHandle >;
358 "can't create target parent tag" );
361 "can't create source parent tag" );
364 "can't create Counting tag" );
371 std::vector< EntityHandle > zeroh(
max_edges_2, 0 );
374 "can't create tgt edge neighbors tag" );
382 while(
tgtConn[num_nodes - 2] ==
tgtConn[num_nodes - 1] && num_nodes > 3 )
385 for(
int i = 0; i < num_nodes; i++ )
388 tgtConn[( i + 1 ) % num_nodes] };
389 std::vector< EntityHandle > adj_entities;
391 if( rval !=
MB_SUCCESS || adj_entities.size() < 1 )
return rval;
392 zeroh[i] = adj_entities[0];
398 "can't set edge target edge neighbors tag" );
402 double max_length = 0;
404 std::vector< double > coords( 3 *
max_edges_1, 0.0 );
410 while( conn[nnodes - 2] == conn[nnodes - 1] && nnodes > 3 )
413 for(
int j = 0; j < nnodes; j++ )
415 int next = ( j + 1 ) % nnodes;
417 ( coords[3 * j] - coords[3 * next] ) * ( coords[3 * j] - coords[3 * next] ) +
418 ( coords[3 * j + 1] - coords[3 * next + 1] ) * ( coords[3 * j + 1] - coords[3 * next + 1] ) +
419 ( coords[3 * j + 2] - coords[3 * next + 2] ) * ( coords[3 * j + 2] - coords[3 * next + 2] );
423 max_length = std::sqrt( max_length );
428 if( max_length < 1. )
431 tolerance = 1. - sqrt( 1 - max_length * max_length / 4 );
438 std::cout <<
" max edge length: " << max_length <<
" tolerance for kd tree: " <<
tolerance <<
"\n";
439 std::cout <<
" box overlap tolerance: " <<
box_error <<
"\n";
445 if(
nullptr != parcomm ) MPI_Allreduce( &
box_error, &min_box_eps, 1, MPI_DOUBLE, MPI_MIN, parcomm->comm() );
451 FileOptions kdOpts(
"PLANE_SET=1;SPLITS_PER_DIR=2;SPHERICAL;RADIUS=1.0;" );
466 double recoveredArea = 0;
467 std::vector< double > positions;
468 positions.resize( nnodes * 3 );
473 for(
int k = 0; k < nnodes; k++ )
475 int ik = ( k + 1 ) % nnodes;
477 for(
int j = 0; j < 3; j++ )
479 double len2 = positions[3 * k + j] - positions[3 * ik + j];
482 av_len += sqrt( len1 );
484 if( nnodes > 0 ) av_len /= nnodes;
487 Range close_source_cells;
488 std::vector< EntityHandle > leaves;
489 for(
int i = 0; i < nnodes; i++ )
493 "can't search for leaves" );
495 for( std::vector< EntityHandle >::iterator j = leaves.begin(); j != leaves.end(); ++j )
504 if( close_source_cells.
empty() )
506 std::cout <<
" there are no close source cells to target cell " << tcell
522 "can't compute intersection between target and source" );
531 <<
" g:" << global_id_ent(
mb, startSrc,
gid ) <<
" counting: " <<
counting <<
"\n";
534 recoveredArea += area;
537 recoveredArea = ( recoveredArea - areaTgtCell ) / areaTgtCell;
543 if(
nullptr != parcomm )
545 MB_CHK_SET_ERR( resolve_intersection_sharing(),
"can't resolve intersection sharing (correct position)" );
561 std::stringstream ffs, fft;
562 ffs <<
"source_rank0" <<
my_rank <<
".vtk";
564 fft <<
"target_rank0" <<
my_rank <<
".vtk";
592 FileOptions kdOpts(
"PLANE_SET=1;SPLITS_PER_DIR=2;SPHERICAL;RADIUS=1.0;" );
599 #if defined( ENABLE_DEBUG )
600 for(
auto it = rs22.
begin(); it != rs22.
end(); ++it )
606 std::cout <<
" cell: \t" <<
" ht:" <<
mb->
id_from_handle( cell ) <<
" nodes: " << nnodes
607 <<
" gt:" << global_id_ent(
mb, cell,
gid ) <<
" stat: " << char_stat_ent(
mb, cell,
TgtFlagTag )
612 while( !rs22.
empty() )
614 #if defined( ENABLE_DEBUG ) || defined( VERBOSE )
617 std::cout <<
" possible not connected arrival mesh; my_rank: " <<
my_rank <<
" counting: " <<
counting
618 <<
" rs22.size():" << rs22.
size() <<
"\n";
619 std::stringstream ffo;
622 for(
auto it = rs22.
begin(); it != rs22.
end(); ++it )
628 std::cout <<
" cell: \t" <<
" ht:" <<
mb->
id_from_handle( cell ) <<
" nodes: " << nnodes
629 <<
" g:" << global_id_ent(
mb, cell,
gid )
630 <<
" stat: " << char_stat_ent(
mb, cell,
TgtFlagTag ) <<
"\n";
634 bool seedFound =
false;
635 Range verified_seeds;
639 unsigned char status = 0;
643 verified_seeds.
insert( startTgt );
652 std::vector< double > positions;
653 positions.resize( nnodes * 3 );
658 Range close_source_cells;
659 std::vector< EntityHandle > leaves;
660 for(
int i = 0; i < nnodes; i++ )
664 "can't search for leaves" );
666 for( std::vector< EntityHandle >::iterator j = leaves.begin(); j != leaves.end(); ++j )
687 "can't compute intersection between target and source" );
701 <<
" g:" << global_id_ent(
mb, startTgt,
gid ) <<
" not intx with any source\n";
703 verified_seeds.
insert( startTgt );
706 rs22 =
subtract( rs22, verified_seeds );
707 if( !seedFound )
continue;
709 std::queue< EntityHandle > srcQueue;
710 srcQueue.push( startSrc );
711 std::queue< EntityHandle > tgtQueue;
712 tgtQueue.push( startTgt );
714 unsigned char used = 1;
717 while( !tgtQueue.empty() )
728 double recoveredArea = 0;
733 "can't get target neighbors" );
737 std::cout <<
"Next: neighbors for current tgt nsidesTgt: " << nsidesTgt <<
" ";
738 for(
int kk = 0; kk < nsidesTgt; kk++ )
740 if( tgtNeighbors[kk] > 0 )
743 std::cout << 0 <<
" ";
745 std::cout << std::endl;
750 for(
int j = 0; j < nsidesTgt; j++ )
753 unsigned char status = 1;
754 if( tgtNeigh == 0 )
continue;
756 "can't get target flag" );
757 if( 1 == status ) tgtNeighbors[j] = 0;
769 Range localSrcAlreadyTested;
770 localSrc.
insert( currentSrc );
778 while( !localSrc.
empty() )
795 nsidesSrc, nsidesTgt ),
796 "can't compute intersection between target and source" );
797 localSrcAlreadyTested.
insert( srcT );
803 <<
" g:" << global_id_ent(
mb, srcT,
gid ) <<
" nsidesSrc:" << nsidesSrc <<
"\n";
805 <<
" g:" << global_id_ent(
mb, currentTgt,
gid )
806 <<
" stat:" << char_stat_ent(
mb, currentTgt,
TgtFlagTag ) <<
" nsidesTgt:" << nsidesTgt
808 unsigned char status = 1;
812 for(
int k = 0; k < nsidesSrc; k++ )
813 std::cout <<
" nb[" << k <<
"]=" << nb[k];
815 for(
int k = 0; k < nsidesTgt; k++ )
816 std::cout <<
" nr[" << k <<
"]=" << nr[k];
825 "failed to get the neighbors for source element " <<
mb->
id_from_handle( srcT ) );
827 Range newPotentialSrc;
829 for(
int nn = 0; nn < nsidesSrc; nn++ )
836 if( localSrcAlreadyTested.
index( neighbor ) < 0 )
838 localSrc.
insert( neighbor );
854 Range adjacentSourceCells1, adjacentSourceCells2;
856 adjacentSourceCells1 =
intersect( adjacentSourceCells1,
rs1 );
858 adjacentSourceCells2 =
intersect( adjacentSourceCells2,
rs1 );
859 adjacentSourceCells1.merge( adjacentSourceCells2 );
860 Range potentialSrc =
subtract( adjacentSourceCells1, localSrcAlreadyTested );
861 newPotentialSrc.
merge( potentialSrc );
866 if( !newPotentialSrc.
empty() )
868 localSrc.
merge( newPotentialSrc );
871 for(
int nn = 0; nn < nsidesTgt; nn++ )
873 if( nr[nn] > 0 && tgtNeighbors[nn] > 0 )
874 nextSrc[nn].
insert( srcT );
880 "can't find nodes" );
882 std::cout <<
" intersect: " <<
" ht:" <<
mb->
id_from_handle( currentTgt ) <<
" "
884 <<
" g:" << global_id_ent(
mb, currentTgt,
gid ) <<
" "
885 <<
" g:" << global_id_ent(
mb, srcT,
gid ) <<
" counting: " <<
counting <<
"\n";
889 recoveredArea += area;
894 std::cout <<
" tgt, src, do not intersect: " <<
"ht:" <<
mb->
id_from_handle( currentTgt ) <<
" "
899 recoveredArea = ( recoveredArea - areaTgtCell ) / areaTgtCell;
900 #if defined( ENABLE_DEBUG ) || defined( VERBOSE )
904 std::cout <<
" tgt area: " << areaTgtCell <<
" recovered :" << recoveredArea * ( 1 + areaTgtCell )
905 <<
" fraction error recovery:" << recoveredArea
907 <<
" countingStart:" << countingStart <<
"\n";
913 rs22.
erase( currentTgt );
916 <<
" g:" << global_id_ent(
mb, currentTgt,
gid ) <<
" rs22.size():" << rs22.
size() <<
"\n";
921 for(
int j = 0; j < nsidesTgt; j++ )
924 if( tgtNeigh == 0 || nextSrc[j].size() == 0 )
942 tgtNeigh, nextB, P, nP, area, nb, nr, nsidesSrc, nsidesTgt2 ),
943 "can't compute intersection between target and source" );
946 unsigned char is_used = 0;
950 tgtQueue.push( tgtNeigh );
951 srcQueue.push( nextB );
954 std::cout <<
"new polys pushed: src, tgt:" <<
" ht:" <<
mb->
id_from_handle( tgtNeigh )
959 "can't set target flag" );
974 MB_CHK_SET_ERR( resolve_intersection_sharing(),
"can't resolve intersection sharing" );
984 size_t sz = cells.
size();
985 std::vector< int > masks( sz );
992 if( masks[indx] )
continue;
993 cellsToRemove.
insert( *eit );
995 cells =
subtract( cells, cellsToRemove );
1023 int nextIndex = ( i + 1 ) % nP;
1024 if( nodes[i] == nodes[nextIndex] )
1030 std::cout <<
" nodes duplicated in list: ";
1031 for(
int j = 0; j < nP; j++ )
1032 std::cout << nodes[j] <<
" ";
1034 std::cout <<
" node " << nodes[i] <<
" at index " << i <<
" is duplicated" <<
"\n";
1040 for(
int k = i; k < nP - 1; k++ )
1041 nodes[k] = nodes[k + 1];
1051 #ifdef MOAB_HAVE_MPI
1057 if( gnomonic ) gnomonic =
false;
1062 int num_local_verts = (int)local_verts.
size();
ERRORR( rval,
"can't get local vertices" );
1064 assert( parcomm !=
nullptr );
1067 double bmin[3] = { std::numeric_limits< double >::max(), std::numeric_limits< double >::max(),
1068 std::numeric_limits< double >::max() };
1069 double bmax[3] = { -std::numeric_limits< double >::max(), -std::numeric_limits< double >::max(),
1070 -std::numeric_limits< double >::max() };
1072 std::vector< double > coords( 3 * num_local_verts );
1073 rval =
mb->
get_coords( local_verts, &coords[0] );
ERRORR( rval,
"can't get coords of vertices " );
1075 for(
int i = 0; i < num_local_verts; i++ )
1077 for(
int k = 0; k < 3; k++ )
1079 double val = coords[3 * i + k];
1080 if( val < bmin[k] ) bmin[k] = val;
1081 if( val > bmax[k] ) bmax[k] = val;
1084 int numprocs = parcomm->proc_config().proc_size();
1087 my_rank = parcomm->proc_config().proc_rank();
1088 for(
int k = 0; k < 3; k++ )
1096 #if ( MPI_VERSION >= 2 )
1098 mpi_err = MPI_Allgather( MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, &
allBoxes[0], 6, MPI_DOUBLE,
1099 parcomm->proc_config().proc_comm() );
1102 std::vector< double > allBoxes_tmp( 6 * parcomm->proc_config().proc_size() );
1103 mpi_err = MPI_Allgather( &
allBoxes[6 *
my_rank], 6, MPI_DOUBLE, &allBoxes_tmp[0], 6, MPI_DOUBLE,
1104 parcomm->proc_config().proc_comm() );
1108 if( MPI_SUCCESS != mpi_err )
return MB_FAILURE;
1113 std::cout <<
" maximum number of vertices per cell are " <<
max_edges_1 <<
" on first mesh and " <<
max_edges_2
1114 <<
" on second mesh \n";
1115 for(
int i = 0; i < numprocs; i++ )
1117 std::cout <<
"proc: " << i <<
" box min: " <<
allBoxes[6 * i] <<
" " <<
allBoxes[6 * i + 1] <<
" "
1119 std::cout <<
" box max: " <<
allBoxes[6 * i + 3] <<
" " <<
allBoxes[6 * i + 4] <<
" "
1131 assert( parcomm !=
nullptr );
1137 std::string tag_name(
"DP" );
1146 int num_local_verts = (int)local_verts.size();
ERRORR( rval,
"can't get local vertices" );
1148 rval = Intx2Mesh::build_processor_euler_boxes( euler_set, local_verts );
ERRORR( rval,
"can't build processor boxes" );
1150 std::vector< int > gids( num_local_verts );
1154 std::vector< double > dep_points( 3 * num_local_verts );
1155 rval =
mb->
tag_get_data( dpTag, local_verts, (
void*)&dep_points[0] );
ERRORR( rval,
"can't get DP tag values" );
1158 std::map< int, Range > Rto;
1159 int numprocs = parcomm->proc_config().proc_size();
1167 CartVect qbmin( std::numeric_limits< double >::max() );
1168 CartVect qbmax( -std::numeric_limits< double >::max() );
1169 for(
int i = 0; i < num_nodes; i++ )
1172 size_t index = local_verts.find( v ) - local_verts.begin();
1173 CartVect dp( &dep_points[3 *
index] );
1174 for(
int j = 0; j < 3; j++ )
1176 if( qbmin[j] > dp[j] ) qbmin[j] = dp[j];
1177 if( qbmax[j] < dp[j] ) qbmax[j] = dp[j];
1180 for(
int p = 0; p < numprocs; p++ )
1182 CartVect bbmin( &
allBoxes[6 * p] );
1183 CartVect bbmax( &
allBoxes[6 * p + 3] );
1194 for(
int p = 0; p < numprocs; p++ )
1196 if( p == (
int)
my_rank )
continue;
1197 Range& range_to_P = Rto[p];
1199 if( range_to_P.empty() )
continue;
1202 numq = numq + range_to_P.size();
1203 numv = numv + vertsToP.size();
1204 range_to_P.merge( vertsToP );
1208 TLv.initialize( 2, 0, 0, 3, numv );
1209 TLv.enableWriteAccess();
1214 TLq.enableWriteAccess();
1216 std::cout <<
"from proc " <<
my_rank <<
" send " << numv <<
" vertices and " << numq <<
" elements\n";
1218 for(
int to_proc = 0; to_proc < numprocs; to_proc++ )
1220 if( to_proc == (
int)
my_rank )
continue;
1221 Range& range_to_P = Rto[to_proc];
1222 Range V = range_to_P.subset_by_type(
MBVERTEX );
1227 unsigned int index = local_verts.find( v ) - local_verts.begin();
1228 int n = TLv.get_n();
1229 TLv.vi_wr[2 * n] = to_proc;
1230 TLv.vi_wr[2 * n + 1] = gids[
index];
1231 TLv.vr_wr[3 * n] = dep_points[3 *
index];
1232 TLv.vr_wr[3 * n + 1] = dep_points[3 *
index + 1];
1233 TLv.vr_wr[3 * n + 2] = dep_points[3 *
index + 2];
1237 Range Q = range_to_P.subset_by_dimension( 2 );
1243 int n = TLq.get_n();
1244 TLq.vi_wr[sizeTuple * n] = to_proc;
1245 TLq.vi_wr[sizeTuple * n + 1] = global_id;
1250 ERRORR( rval,
"can't get connectivity for cell" );
1251 if( num_nodes >
MAXEDGES )
ERRORR( MB_FAILURE,
"too many nodes in a polygon" );
1252 for(
int i = 0; i < num_nodes; i++ )
1255 unsigned int index = local_verts.find( v ) - local_verts.begin();
1256 TLq.vi_wr[sizeTuple * n + 2 + i] = gids[
index];
1260 TLq.vi_wr[sizeTuple * n + 2 + k] =
1270 ( parcomm->proc_config().crystal_router() )->gs_transfer( 1, TLv, 0 );
1271 ( parcomm->proc_config().crystal_router() )->gs_transfer( 1, TLq, 0 );
1275 std::map< int, EntityHandle > globalID_to_handle;
1277 globalID_to_eh.clear();
1279 int n = TLv.get_n();
1280 for(
int i = 0; i < n; i++ )
1282 int globalId = TLv.vi_rd[2 * i + 1];
1283 if( globalID_to_handle.find( globalId ) == globalID_to_handle.end() )
1286 double dp_pos[3] = { TLv.vr_wr[3 * i], TLv.vr_wr[3 * i + 1], TLv.vr_wr[3 * i + 2] };
1288 globalID_to_handle[globalId] = new_vert;
1296 Range local_q = local.subset_by_dimension( 2 );
1298 for(
Range::iterator it = local_q.begin(); it != local_q.end(); ++it )
1305 for(
int i = 0; i < nnodes; i++ )
1308 unsigned int index = local_verts.find( v1 ) - local_verts.begin();
1309 int globalId = gids[
index];
1310 if( globalID_to_handle.find( globalId ) == globalID_to_handle.end() )
1313 double dp_pos[3] = { dep_points[3 *
index], dep_points[3 *
index + 1], dep_points[3 *
index + 2] };
1316 globalID_to_handle[globalId] = new_vert;
1318 new_conn[i] = globalID_to_handle[gids[
index]];
1322 EntityType entType =
MBQUAD;
1324 if( nnodes < 4 ) entType =
MBTRI;
1326 rval =
mb->
create_element( entType, new_conn, nnodes, new_element );
ERRORR( rval,
"can't create new quad " );
1327 rval =
mb->
add_entities( covering_lagr_set, &new_element, 1 );
ERRORR( rval,
"can't add new element to dep set" );
1331 globalID_to_eh[gid_el] = new_element;
1333 rval =
mb->
tag_set_data( corrTag, &new_element, 1, &q );
ERRORR( rval,
"can't set corr tag on new el" );
1340 remote_cells =
new TupleList();
1341 remote_cells->initialize( 2, 0, 1, 0, n );
1342 remote_cells->enableWriteAccess();
1343 for(
int i = 0; i < n; i++ )
1345 int globalIdEl = TLq.vi_rd[sizeTuple * i + 1];
1346 int from_proc = TLq.vi_wr[sizeTuple * i];
1348 if( globalID_to_eh.find( globalIdEl ) == globalID_to_eh.end() )
1355 int vgid = TLq.vi_rd[sizeTuple * i + 2 + j];
1360 assert( globalID_to_handle.find( vgid ) != globalID_to_handle.end() );
1361 new_conn[j] = globalID_to_handle[vgid];
1367 EntityType entType =
MBQUAD;
1369 if( nnodes < 4 ) entType =
MBTRI;
1370 rval =
mb->
create_element( entType, new_conn, nnodes, new_element );
ERRORR( rval,
"can't create new element " );
1371 globalID_to_eh[globalIdEl] = new_element;
1372 rval =
mb->
add_entities( covering_lagr_set, &new_element, 1 );
ERRORR( rval,
"can't add new element to dep set" );
1374 remote_cells->vi_wr[2 * i] = from_proc;
1375 remote_cells->vi_wr[2 * i + 1] = globalIdEl;
1377 remote_cells->vul_wr[i] = TLq.vul_rd[i];
1378 remote_cells->inc_n();
1380 rval =
mb->
tag_set_data(
gid, &new_element, 1, &globalIdEl );
ERRORR( rval,
"can't set global id tag on new el" );
1386 sort_buffer.buffer_init( n );
1387 remote_cells->sort( 1, &sort_buffer );
1388 sort_buffer.
reset();
1405 assert( parcomm !=
nullptr );
1406 if( 1 == parcomm->proc_config().proc_size() )
1408 covering_set = lagr_set;
1415 int num_local_verts = (int)local_verts.size();
ERRORR( rval,
"can't get local vertices" );
1417 std::vector< int > gids( num_local_verts );
1420 Range localDepCells;
1427 int num_lagr_verts = (int)lagr_verts.size();
ERRORR( rval,
"can't get local lagr vertices" );
1430 std::vector< double > dep_points( 3 * num_lagr_verts );
1431 rval =
mb->
get_coords( lagr_verts, &dep_points[0] );
ERRORR( rval,
"can't get departure points position" );
1434 std::map< int, Range > Rto;
1435 int numprocs = parcomm->proc_config().proc_size();
1437 for(
Range::iterator eit = localDepCells.begin(); eit != localDepCells.end(); ++eit )
1443 CartVect qbmin( std::numeric_limits< double >::max() );
1444 CartVect qbmax( -std::numeric_limits< double >::max() );
1445 for(
int i = 0; i < num_nodes; i++ )
1448 int index = lagr_verts.index( v );
1449 assert( -1 !=
index );
1450 CartVect dp( &dep_points[3 *
index] );
1451 for(
int j = 0; j < 3; j++ )
1453 if( qbmin[j] > dp[j] ) qbmin[j] = dp[j];
1454 if( qbmax[j] < dp[j] ) qbmax[j] = dp[j];
1457 for(
int p = 0; p < numprocs; p++ )
1459 CartVect bbmin( &
allBoxes[6 * p] );
1460 CartVect bbmax( &
allBoxes[6 * p + 3] );
1471 for(
int p = 0; p < numprocs; p++ )
1473 if( p == (
int)
my_rank )
continue;
1474 Range& range_to_P = Rto[p];
1476 if( range_to_P.empty() )
continue;
1479 numq = numq + range_to_P.size();
1480 numv = numv + vertsToP.size();
1481 range_to_P.merge( vertsToP );
1485 TLv.initialize( 2, 0, 0, 3, numv );
1486 TLv.enableWriteAccess();
1492 TLq.enableWriteAccess();
1494 std::cout <<
"from proc " <<
my_rank <<
" send " << numv <<
" vertices and " << numq <<
" elements\n";
1497 for(
int to_proc = 0; to_proc < numprocs; to_proc++ )
1499 if( to_proc == (
int)
my_rank )
continue;
1500 Range& range_to_P = Rto[to_proc];
1501 Range V = range_to_P.subset_by_type(
MBVERTEX );
1506 int index = lagr_verts.index( v );
1507 assert( -1 !=
index );
1508 int n = TLv.get_n();
1509 TLv.vi_wr[2 * n] = to_proc;
1510 TLv.vi_wr[2 * n + 1] = gids[
index];
1511 TLv.vr_wr[3 * n] = dep_points[3 *
index];
1512 TLv.vr_wr[3 * n + 1] = dep_points[3 *
index + 1];
1513 TLv.vr_wr[3 * n + 2] = dep_points[3 *
index + 2];
1517 Range Q = range_to_P.subset_by_dimension( 2 );
1523 int n = TLq.get_n();
1524 TLq.vi_wr[sizeTuple * n] = to_proc;
1525 TLq.vi_wr[sizeTuple * n + 1] = global_id;
1529 q, conn4, num_nodes );
1530 if( num_nodes >
MAXEDGES )
ERRORR( MB_FAILURE,
"too many nodes in a polygon" );
1531 for(
int i = 0; i < num_nodes; i++ )
1534 int index = lagr_verts.index( v );
1535 assert( -1 !=
index );
1536 TLq.vi_wr[sizeTuple * n + 2 + i] = gids[
index];
1540 TLq.vi_wr[sizeTuple * n + 2 + k] =
1544 rval =
mb->
tag_get_data( corrTag, &q, 1, &tgtCell );
ERRORR( rval,
"can't get corresponding tgt cell for dep cell" );
1545 TLq.vul_wr[n] = tgtCell;
1551 ( parcomm->proc_config().crystal_router() )->gs_transfer( 1, TLv, 0 );
1552 ( parcomm->proc_config().crystal_router() )->gs_transfer( 1, TLq, 0 );
1556 std::map< int, EntityHandle > globalID_to_handle;
1560 for(
Range::iterator vit = lagr_verts.begin(); vit != lagr_verts.end(); ++vit, k++ )
1562 globalID_to_handle[gids[k]] = *vit;
1566 globalID_to_eh.clear();
1568 int n = TLv.get_n();
1569 for(
int i = 0; i < n; i++ )
1571 int globalId = TLv.vi_rd[2 * i + 1];
1572 if( globalID_to_handle.find( globalId ) == globalID_to_handle.end() )
1575 double dp_pos[3] = { TLv.vr_wr[3 * i], TLv.vr_wr[3 * i + 1], TLv.vr_wr[3 * i + 2] };
1577 globalID_to_handle[globalId] = new_vert;
1585 Range local_q = local.subset_by_dimension( 2 );
1587 for(
Range::iterator it = local_q.begin(); it != local_q.end(); ++it )
1592 globalID_to_eh[gid_el] = q;
1600 remote_cells =
new TupleList();
1601 remote_cells->initialize( 2, 0, 1, 0, n );
1602 remote_cells->enableWriteAccess();
1603 for(
int i = 0; i < n; i++ )
1605 int globalIdEl = TLq.vi_rd[sizeTuple * i + 1];
1606 int from_proc = TLq.vi_rd[sizeTuple * i];
1608 if( globalID_to_eh.find( globalIdEl ) == globalID_to_eh.end() )
1615 int vgid = TLq.vi_rd[sizeTuple * i + 2 + j];
1620 assert( globalID_to_handle.find( vgid ) != globalID_to_handle.end() );
1621 new_conn[j] = globalID_to_handle[vgid];
1627 EntityType entType =
MBQUAD;
1629 if( nnodes < 4 ) entType =
MBTRI;
1630 rval =
mb->
create_element( entType, new_conn, nnodes, new_element );
ERRORR( rval,
"can't create new element " );
1631 globalID_to_eh[globalIdEl] = new_element;
1632 local_q.insert( new_element );
1635 remote_cells->vi_wr[2 * i] = from_proc;
1636 remote_cells->vi_wr[2 * i + 1] = globalIdEl;
1638 remote_cells->vul_wr[i] = TLq.vul_rd[i];
1639 remote_cells->inc_n();
1643 rval =
mb->
add_entities( covering_set, local_q );
ERRORR( rval,
"can't add entities to new mesh set " );
1647 sort_buffer.buffer_init( n );
1648 remote_cells->sort( 1, &sort_buffer );
1649 sort_buffer.
reset();
1654 ErrorCode Intx2Mesh::resolve_intersection_sharing()
1656 if( parcomm && parcomm->size() > 1 )
1666 Range nonOwnedVerts;
1673 "can't filter pstatus" );
1683 Range vertsCovInterface;
1685 "can't filter pstatus" );
1687 Range nodesToDuplicate =
intersect( vertsCovInterface, nonOwnedVerts );
1690 Range connectedCells;
1693 connectedCells =
intersect( connectedCells, intxCells );
1695 std::map< EntityHandle, EntityHandle > duplicatedVerticesMap;
1696 for(
Range::iterator vit = nodesToDuplicate.begin(); vit != nodesToDuplicate.end(); vit++ )
1703 duplicatedVerticesMap[
vertex] = newVertex;
1707 for(
Range::iterator eit = connectedCells.begin(); eit != connectedCells.end(); eit++ )
1711 std::vector< EntityHandle > connectivity;
1713 for(
size_t i = 0; i < connectivity.size(); i++ )
1716 std::map< EntityHandle, EntityHandle >::iterator mit = duplicatedVerticesMap.find( currentVertex );
1717 if( mit != duplicatedVerticesMap.end() )
1719 connectivity[i] = mit->second;
1722 int nnodes = (int)connectivity.size();