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;" );
469 std::vector< double > positions;
470 positions.resize( nnodes * 3 );
475 for(
int k = 0; k < nnodes; k++ )
477 int ik = ( k + 1 ) % nnodes;
479 for(
int j = 0; j < 3; j++ )
481 double len2 = positions[3 * k + j] - positions[3 * ik + j];
484 av_len += sqrt( len1 );
486 if( nnodes > 0 ) av_len /= nnodes;
489 Range close_source_cells;
490 std::vector< EntityHandle > leaves;
491 for(
int i = 0; i < nnodes; i++ )
495 "can't search for leaves" );
497 for( std::vector< EntityHandle >::iterator j = leaves.begin(); j != leaves.end(); ++j )
506 if( close_source_cells.
empty() )
508 std::cout <<
" there are no close source cells to target cell " << tcell
524 "can't compute intersection between target and source" );
533 <<
" g:" << global_id_ent(
mb, startSrc,
gid ) <<
" counting: " <<
counting <<
"\n";
547 if(
nullptr != parcomm )
549 MB_CHK_SET_ERR( resolve_intersection_sharing(),
"can't resolve intersection sharing (correct position)" );
565 std::stringstream ffs, fft;
566 ffs <<
"source_rank0" <<
my_rank <<
".vtk";
568 fft <<
"target_rank0" <<
my_rank <<
".vtk";
596 FileOptions kdOpts(
"PLANE_SET=1;SPLITS_PER_DIR=2;SPHERICAL;RADIUS=1.0;" );
603 #if defined( ENABLE_DEBUG )
604 for(
auto it = rs22.
begin(); it != rs22.
end(); ++it )
610 std::cout <<
" cell: \t" <<
" ht:" <<
mb->
id_from_handle( cell ) <<
" nodes: " << nnodes
611 <<
" gt:" << global_id_ent(
mb, cell,
gid ) <<
" stat: " << char_stat_ent(
mb, cell,
TgtFlagTag )
616 while( !rs22.
empty() )
618 #if defined( ENABLE_DEBUG ) || defined( VERBOSE )
621 std::cout <<
" possible not connected arrival mesh; my_rank: " <<
my_rank <<
" counting: " <<
counting
622 <<
" rs22.size():" << rs22.
size() <<
"\n";
623 std::stringstream ffo;
626 for(
auto it = rs22.
begin(); it != rs22.
end(); ++it )
632 std::cout <<
" cell: \t" <<
" ht:" <<
mb->
id_from_handle( cell ) <<
" nodes: " << nnodes
633 <<
" g:" << global_id_ent(
mb, cell,
gid )
634 <<
" stat: " << char_stat_ent(
mb, cell,
TgtFlagTag ) <<
"\n";
638 bool seedFound =
false;
639 Range verified_seeds;
643 unsigned char status = 0;
647 verified_seeds.
insert( startTgt );
656 std::vector< double > positions;
657 positions.resize( nnodes * 3 );
662 Range close_source_cells;
663 std::vector< EntityHandle > leaves;
664 for(
int i = 0; i < nnodes; i++ )
668 "can't search for leaves" );
670 for( std::vector< EntityHandle >::iterator j = leaves.begin(); j != leaves.end(); ++j )
691 "can't compute intersection between target and source" );
705 <<
" g:" << global_id_ent(
mb, startTgt,
gid ) <<
" not intx with any source\n";
707 verified_seeds.
insert( startTgt );
710 rs22 =
subtract( rs22, verified_seeds );
711 if( !seedFound )
continue;
713 std::queue< EntityHandle > srcQueue;
714 srcQueue.push( startSrc );
715 std::queue< EntityHandle > tgtQueue;
716 tgtQueue.push( startTgt );
718 unsigned char used = 1;
721 while( !tgtQueue.empty() )
732 double recoveredArea = 0;
737 "can't get target neighbors" );
741 std::cout <<
"Next: neighbors for current tgt nsidesTgt: " << nsidesTgt <<
" ";
742 for(
int kk = 0; kk < nsidesTgt; kk++ )
744 if( tgtNeighbors[kk] > 0 )
747 std::cout << 0 <<
" ";
749 std::cout << std::endl;
754 for(
int j = 0; j < nsidesTgt; j++ )
757 unsigned char status = 1;
758 if( tgtNeigh == 0 )
continue;
760 "can't get target flag" );
761 if( 1 == status ) tgtNeighbors[j] = 0;
773 Range localSrcAlreadyTested;
774 localSrc.
insert( currentSrc );
782 while( !localSrc.
empty() )
799 nsidesSrc, nsidesTgt ),
800 "can't compute intersection between target and source" );
801 localSrcAlreadyTested.
insert( srcT );
807 <<
" g:" << global_id_ent(
mb, srcT,
gid ) <<
" nsidesSrc:" << nsidesSrc <<
"\n";
809 <<
" g:" << global_id_ent(
mb, currentTgt,
gid )
810 <<
" stat:" << char_stat_ent(
mb, currentTgt,
TgtFlagTag ) <<
" nsidesTgt:" << nsidesTgt
812 unsigned char status = 1;
816 for(
int k = 0; k < nsidesSrc; k++ )
817 std::cout <<
" nb[" << k <<
"]=" << nb[k];
819 for(
int k = 0; k < nsidesTgt; k++ )
820 std::cout <<
" nr[" << k <<
"]=" << nr[k];
829 "failed to get the neighbors for source element " <<
mb->
id_from_handle( srcT ) );
831 Range newPotentialSrc;
833 for(
int nn = 0; nn < nsidesSrc; nn++ )
840 if( localSrcAlreadyTested.
index( neighbor ) < 0 )
842 localSrc.
insert( neighbor );
858 Range adjacentSourceCells1, adjacentSourceCells2;
860 adjacentSourceCells1 =
intersect( adjacentSourceCells1,
rs1 );
862 adjacentSourceCells2 =
intersect( adjacentSourceCells2,
rs1 );
863 adjacentSourceCells1.merge( adjacentSourceCells2 );
864 Range potentialSrc =
subtract( adjacentSourceCells1, localSrcAlreadyTested );
865 newPotentialSrc.
merge( potentialSrc );
870 if( !newPotentialSrc.
empty() )
872 localSrc.
merge( newPotentialSrc );
875 for(
int nn = 0; nn < nsidesTgt; nn++ )
877 if( nr[nn] > 0 && tgtNeighbors[nn] > 0 )
878 nextSrc[nn].
insert( srcT );
884 "can't find nodes" );
886 std::cout <<
" intersect: " <<
" ht:" <<
mb->
id_from_handle( currentTgt ) <<
" "
888 <<
" g:" << global_id_ent(
mb, currentTgt,
gid ) <<
" "
889 <<
" g:" << global_id_ent(
mb, srcT,
gid ) <<
" counting: " <<
counting <<
"\n";
893 recoveredArea += area;
898 std::cout <<
" tgt, src, do not intersect: " <<
"ht:" <<
mb->
id_from_handle( currentTgt ) <<
" "
903 recoveredArea = ( recoveredArea - areaTgtCell ) / areaTgtCell;
904 #if defined( ENABLE_DEBUG ) || defined( VERBOSE )
908 std::cout <<
" tgt area: " << areaTgtCell <<
" recovered :" << recoveredArea * ( 1 + areaTgtCell )
909 <<
" fraction error recovery:" << recoveredArea
911 <<
" countingStart:" << countingStart <<
"\n";
917 rs22.
erase( currentTgt );
920 <<
" g:" << global_id_ent(
mb, currentTgt,
gid ) <<
" rs22.size():" << rs22.
size() <<
"\n";
925 for(
int j = 0; j < nsidesTgt; j++ )
928 if( tgtNeigh == 0 || nextSrc[j].size() == 0 )
946 tgtNeigh, nextB, P, nP, area, nb, nr, nsidesSrc, nsidesTgt2 ),
947 "can't compute intersection between target and source" );
950 unsigned char is_used = 0;
954 tgtQueue.push( tgtNeigh );
955 srcQueue.push( nextB );
958 std::cout <<
"new polys pushed: src, tgt:" <<
" ht:" <<
mb->
id_from_handle( tgtNeigh )
963 "can't set target flag" );
978 MB_CHK_SET_ERR( resolve_intersection_sharing(),
"can't resolve intersection sharing" );
988 size_t sz = cells.
size();
989 std::vector< int > masks( sz );
996 if( masks[indx] )
continue;
997 cellsToRemove.
insert( *eit );
999 cells =
subtract( cells, cellsToRemove );
1027 int nextIndex = ( i + 1 ) % nP;
1028 if( nodes[i] == nodes[nextIndex] )
1034 std::cout <<
" nodes duplicated in list: ";
1035 for(
int j = 0; j < nP; j++ )
1036 std::cout << nodes[j] <<
" ";
1038 std::cout <<
" node " << nodes[i] <<
" at index " << i <<
" is duplicated" <<
"\n";
1044 for(
int k = i; k < nP - 1; k++ )
1045 nodes[k] = nodes[k + 1];
1055 #ifdef MOAB_HAVE_MPI
1061 if( gnomonic ) gnomonic =
false;
1066 int num_local_verts = (int)local_verts.
size();
ERRORR( rval,
"can't get local vertices" );
1068 assert( parcomm !=
nullptr );
1071 double bmin[3] = { std::numeric_limits< double >::max(), std::numeric_limits< double >::max(),
1072 std::numeric_limits< double >::max() };
1073 double bmax[3] = { -std::numeric_limits< double >::max(), -std::numeric_limits< double >::max(),
1074 -std::numeric_limits< double >::max() };
1076 std::vector< double > coords( 3 * num_local_verts );
1077 rval =
mb->
get_coords( local_verts, &coords[0] );
ERRORR( rval,
"can't get coords of vertices " );
1079 for(
int i = 0; i < num_local_verts; i++ )
1081 for(
int k = 0; k < 3; k++ )
1083 double val = coords[3 * i + k];
1084 if( val < bmin[k] ) bmin[k] = val;
1085 if( val > bmax[k] ) bmax[k] = val;
1088 int numprocs = parcomm->proc_config().proc_size();
1091 my_rank = parcomm->proc_config().proc_rank();
1092 for(
int k = 0; k < 3; k++ )
1100 #if ( MPI_VERSION >= 2 )
1102 mpi_err = MPI_Allgather( MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, &
allBoxes[0], 6, MPI_DOUBLE,
1103 parcomm->proc_config().proc_comm() );
1106 std::vector< double > allBoxes_tmp( 6 * parcomm->proc_config().proc_size() );
1107 mpi_err = MPI_Allgather( &
allBoxes[6 *
my_rank], 6, MPI_DOUBLE, &allBoxes_tmp[0], 6, MPI_DOUBLE,
1108 parcomm->proc_config().proc_comm() );
1112 if( MPI_SUCCESS != mpi_err )
return MB_FAILURE;
1117 std::cout <<
" maximum number of vertices per cell are " <<
max_edges_1 <<
" on first mesh and " <<
max_edges_2
1118 <<
" on second mesh \n";
1119 for(
int i = 0; i < numprocs; i++ )
1121 std::cout <<
"proc: " << i <<
" box min: " <<
allBoxes[6 * i] <<
" " <<
allBoxes[6 * i + 1] <<
" "
1123 std::cout <<
" box max: " <<
allBoxes[6 * i + 3] <<
" " <<
allBoxes[6 * i + 4] <<
" "
1135 assert( parcomm !=
nullptr );
1141 std::string tag_name(
"DP" );
1150 int num_local_verts = (int)local_verts.size();
ERRORR( rval,
"can't get local vertices" );
1152 rval = Intx2Mesh::build_processor_euler_boxes( euler_set, local_verts );
ERRORR( rval,
"can't build processor boxes" );
1154 std::vector< int > gids( num_local_verts );
1158 std::vector< double > dep_points( 3 * num_local_verts );
1159 rval =
mb->
tag_get_data( dpTag, local_verts, (
void*)&dep_points[0] );
ERRORR( rval,
"can't get DP tag values" );
1162 std::map< int, Range > Rto;
1163 int numprocs = parcomm->proc_config().proc_size();
1171 CartVect qbmin( std::numeric_limits< double >::max() );
1172 CartVect qbmax( -std::numeric_limits< double >::max() );
1173 for(
int i = 0; i < num_nodes; i++ )
1176 size_t index = local_verts.find( v ) - local_verts.begin();
1177 CartVect dp( &dep_points[3 *
index] );
1178 for(
int j = 0; j < 3; j++ )
1180 if( qbmin[j] > dp[j] ) qbmin[j] = dp[j];
1181 if( qbmax[j] < dp[j] ) qbmax[j] = dp[j];
1184 for(
int p = 0; p < numprocs; p++ )
1186 CartVect bbmin( &
allBoxes[6 * p] );
1187 CartVect bbmax( &
allBoxes[6 * p + 3] );
1198 for(
int p = 0; p < numprocs; p++ )
1200 if( p == (
int)
my_rank )
continue;
1201 Range& range_to_P = Rto[p];
1203 if( range_to_P.empty() )
continue;
1206 numq = numq + range_to_P.size();
1207 numv = numv + vertsToP.size();
1208 range_to_P.merge( vertsToP );
1212 TLv.initialize( 2, 0, 0, 3, numv );
1213 TLv.enableWriteAccess();
1218 TLq.enableWriteAccess();
1220 std::cout <<
"from proc " <<
my_rank <<
" send " << numv <<
" vertices and " << numq <<
" elements\n";
1222 for(
int to_proc = 0; to_proc < numprocs; to_proc++ )
1224 if( to_proc == (
int)
my_rank )
continue;
1225 Range& range_to_P = Rto[to_proc];
1226 Range V = range_to_P.subset_by_type(
MBVERTEX );
1231 unsigned int index = local_verts.find( v ) - local_verts.begin();
1232 int n = TLv.get_n();
1233 TLv.vi_wr[2 * n] = to_proc;
1234 TLv.vi_wr[2 * n + 1] = gids[
index];
1235 TLv.vr_wr[3 * n] = dep_points[3 *
index];
1236 TLv.vr_wr[3 * n + 1] = dep_points[3 *
index + 1];
1237 TLv.vr_wr[3 * n + 2] = dep_points[3 *
index + 2];
1241 Range Q = range_to_P.subset_by_dimension( 2 );
1247 int n = TLq.get_n();
1248 TLq.vi_wr[sizeTuple * n] = to_proc;
1249 TLq.vi_wr[sizeTuple * n + 1] = global_id;
1254 ERRORR( rval,
"can't get connectivity for cell" );
1255 if( num_nodes >
MAXEDGES )
ERRORR( MB_FAILURE,
"too many nodes in a polygon" );
1256 for(
int i = 0; i < num_nodes; i++ )
1259 unsigned int index = local_verts.find( v ) - local_verts.begin();
1260 TLq.vi_wr[sizeTuple * n + 2 + i] = gids[
index];
1264 TLq.vi_wr[sizeTuple * n + 2 + k] =
1274 ( parcomm->proc_config().crystal_router() )->gs_transfer( 1, TLv, 0 );
1275 ( parcomm->proc_config().crystal_router() )->gs_transfer( 1, TLq, 0 );
1279 std::map< int, EntityHandle > globalID_to_handle;
1281 globalID_to_eh.clear();
1283 int n = TLv.get_n();
1284 for(
int i = 0; i < n; i++ )
1286 int globalId = TLv.vi_rd[2 * i + 1];
1287 if( globalID_to_handle.find( globalId ) == globalID_to_handle.end() )
1290 double dp_pos[3] = { TLv.vr_wr[3 * i], TLv.vr_wr[3 * i + 1], TLv.vr_wr[3 * i + 2] };
1292 globalID_to_handle[globalId] = new_vert;
1300 Range local_q = local.subset_by_dimension( 2 );
1302 for(
Range::iterator it = local_q.begin(); it != local_q.end(); ++it )
1309 for(
int i = 0; i < nnodes; i++ )
1312 unsigned int index = local_verts.find( v1 ) - local_verts.begin();
1313 int globalId = gids[
index];
1314 if( globalID_to_handle.find( globalId ) == globalID_to_handle.end() )
1317 double dp_pos[3] = { dep_points[3 *
index], dep_points[3 *
index + 1], dep_points[3 *
index + 2] };
1320 globalID_to_handle[globalId] = new_vert;
1322 new_conn[i] = globalID_to_handle[gids[
index]];
1326 EntityType entType =
MBQUAD;
1328 if( nnodes < 4 ) entType =
MBTRI;
1330 rval =
mb->
create_element( entType, new_conn, nnodes, new_element );
ERRORR( rval,
"can't create new quad " );
1331 rval =
mb->
add_entities( covering_lagr_set, &new_element, 1 );
ERRORR( rval,
"can't add new element to dep set" );
1335 globalID_to_eh[gid_el] = new_element;
1337 rval =
mb->
tag_set_data( corrTag, &new_element, 1, &q );
ERRORR( rval,
"can't set corr tag on new el" );
1344 remote_cells =
new TupleList();
1345 remote_cells->initialize( 2, 0, 1, 0, n );
1346 remote_cells->enableWriteAccess();
1347 for(
int i = 0; i < n; i++ )
1349 int globalIdEl = TLq.vi_rd[sizeTuple * i + 1];
1350 int from_proc = TLq.vi_wr[sizeTuple * i];
1352 if( globalID_to_eh.find( globalIdEl ) == globalID_to_eh.end() )
1359 int vgid = TLq.vi_rd[sizeTuple * i + 2 + j];
1364 assert( globalID_to_handle.find( vgid ) != globalID_to_handle.end() );
1365 new_conn[j] = globalID_to_handle[vgid];
1371 EntityType entType =
MBQUAD;
1373 if( nnodes < 4 ) entType =
MBTRI;
1374 rval =
mb->
create_element( entType, new_conn, nnodes, new_element );
ERRORR( rval,
"can't create new element " );
1375 globalID_to_eh[globalIdEl] = new_element;
1376 rval =
mb->
add_entities( covering_lagr_set, &new_element, 1 );
ERRORR( rval,
"can't add new element to dep set" );
1378 remote_cells->vi_wr[2 * i] = from_proc;
1379 remote_cells->vi_wr[2 * i + 1] = globalIdEl;
1381 remote_cells->vul_wr[i] = TLq.vul_rd[i];
1382 remote_cells->inc_n();
1384 rval =
mb->
tag_set_data(
gid, &new_element, 1, &globalIdEl );
ERRORR( rval,
"can't set global id tag on new el" );
1390 sort_buffer.buffer_init( n );
1391 remote_cells->sort( 1, &sort_buffer );
1392 sort_buffer.
reset();
1409 assert( parcomm !=
nullptr );
1410 if( 1 == parcomm->proc_config().proc_size() )
1412 covering_set = lagr_set;
1419 int num_local_verts = (int)local_verts.size();
ERRORR( rval,
"can't get local vertices" );
1421 std::vector< int > gids( num_local_verts );
1424 Range localDepCells;
1431 int num_lagr_verts = (int)lagr_verts.size();
ERRORR( rval,
"can't get local lagr vertices" );
1434 std::vector< double > dep_points( 3 * num_lagr_verts );
1435 rval =
mb->
get_coords( lagr_verts, &dep_points[0] );
ERRORR( rval,
"can't get departure points position" );
1438 std::map< int, Range > Rto;
1439 int numprocs = parcomm->proc_config().proc_size();
1441 for(
Range::iterator eit = localDepCells.begin(); eit != localDepCells.end(); ++eit )
1447 CartVect qbmin( std::numeric_limits< double >::max() );
1448 CartVect qbmax( -std::numeric_limits< double >::max() );
1449 for(
int i = 0; i < num_nodes; i++ )
1452 int index = lagr_verts.index( v );
1453 assert( -1 !=
index );
1454 CartVect dp( &dep_points[3 *
index] );
1455 for(
int j = 0; j < 3; j++ )
1457 if( qbmin[j] > dp[j] ) qbmin[j] = dp[j];
1458 if( qbmax[j] < dp[j] ) qbmax[j] = dp[j];
1461 for(
int p = 0; p < numprocs; p++ )
1463 CartVect bbmin( &
allBoxes[6 * p] );
1464 CartVect bbmax( &
allBoxes[6 * p + 3] );
1475 for(
int p = 0; p < numprocs; p++ )
1477 if( p == (
int)
my_rank )
continue;
1478 Range& range_to_P = Rto[p];
1480 if( range_to_P.empty() )
continue;
1483 numq = numq + range_to_P.size();
1484 numv = numv + vertsToP.size();
1485 range_to_P.merge( vertsToP );
1489 TLv.initialize( 2, 0, 0, 3, numv );
1490 TLv.enableWriteAccess();
1496 TLq.enableWriteAccess();
1498 std::cout <<
"from proc " <<
my_rank <<
" send " << numv <<
" vertices and " << numq <<
" elements\n";
1501 for(
int to_proc = 0; to_proc < numprocs; to_proc++ )
1503 if( to_proc == (
int)
my_rank )
continue;
1504 Range& range_to_P = Rto[to_proc];
1505 Range V = range_to_P.subset_by_type(
MBVERTEX );
1510 int index = lagr_verts.index( v );
1511 assert( -1 !=
index );
1512 int n = TLv.get_n();
1513 TLv.vi_wr[2 * n] = to_proc;
1514 TLv.vi_wr[2 * n + 1] = gids[
index];
1515 TLv.vr_wr[3 * n] = dep_points[3 *
index];
1516 TLv.vr_wr[3 * n + 1] = dep_points[3 *
index + 1];
1517 TLv.vr_wr[3 * n + 2] = dep_points[3 *
index + 2];
1521 Range Q = range_to_P.subset_by_dimension( 2 );
1527 int n = TLq.get_n();
1528 TLq.vi_wr[sizeTuple * n] = to_proc;
1529 TLq.vi_wr[sizeTuple * n + 1] = global_id;
1533 q, conn4, num_nodes );
1534 if( num_nodes >
MAXEDGES )
ERRORR( MB_FAILURE,
"too many nodes in a polygon" );
1535 for(
int i = 0; i < num_nodes; i++ )
1538 int index = lagr_verts.index( v );
1539 assert( -1 !=
index );
1540 TLq.vi_wr[sizeTuple * n + 2 + i] = gids[
index];
1544 TLq.vi_wr[sizeTuple * n + 2 + k] =
1548 rval =
mb->
tag_get_data( corrTag, &q, 1, &tgtCell );
ERRORR( rval,
"can't get corresponding tgt cell for dep cell" );
1549 TLq.vul_wr[n] = tgtCell;
1555 ( parcomm->proc_config().crystal_router() )->gs_transfer( 1, TLv, 0 );
1556 ( parcomm->proc_config().crystal_router() )->gs_transfer( 1, TLq, 0 );
1560 std::map< int, EntityHandle > globalID_to_handle;
1564 for(
Range::iterator vit = lagr_verts.begin(); vit != lagr_verts.end(); ++vit, k++ )
1566 globalID_to_handle[gids[k]] = *vit;
1570 globalID_to_eh.clear();
1572 int n = TLv.get_n();
1573 for(
int i = 0; i < n; i++ )
1575 int globalId = TLv.vi_rd[2 * i + 1];
1576 if( globalID_to_handle.find( globalId ) == globalID_to_handle.end() )
1579 double dp_pos[3] = { TLv.vr_wr[3 * i], TLv.vr_wr[3 * i + 1], TLv.vr_wr[3 * i + 2] };
1581 globalID_to_handle[globalId] = new_vert;
1589 Range local_q = local.subset_by_dimension( 2 );
1591 for(
Range::iterator it = local_q.begin(); it != local_q.end(); ++it )
1596 globalID_to_eh[gid_el] = q;
1604 remote_cells =
new TupleList();
1605 remote_cells->initialize( 2, 0, 1, 0, n );
1606 remote_cells->enableWriteAccess();
1607 for(
int i = 0; i < n; i++ )
1609 int globalIdEl = TLq.vi_rd[sizeTuple * i + 1];
1610 int from_proc = TLq.vi_rd[sizeTuple * i];
1612 if( globalID_to_eh.find( globalIdEl ) == globalID_to_eh.end() )
1619 int vgid = TLq.vi_rd[sizeTuple * i + 2 + j];
1624 assert( globalID_to_handle.find( vgid ) != globalID_to_handle.end() );
1625 new_conn[j] = globalID_to_handle[vgid];
1631 EntityType entType =
MBQUAD;
1633 if( nnodes < 4 ) entType =
MBTRI;
1634 rval =
mb->
create_element( entType, new_conn, nnodes, new_element );
ERRORR( rval,
"can't create new element " );
1635 globalID_to_eh[globalIdEl] = new_element;
1636 local_q.insert( new_element );
1639 remote_cells->vi_wr[2 * i] = from_proc;
1640 remote_cells->vi_wr[2 * i + 1] = globalIdEl;
1642 remote_cells->vul_wr[i] = TLq.vul_rd[i];
1643 remote_cells->inc_n();
1647 rval =
mb->
add_entities( covering_set, local_q );
ERRORR( rval,
"can't add entities to new mesh set " );
1651 sort_buffer.buffer_init( n );
1652 remote_cells->sort( 1, &sort_buffer );
1653 sort_buffer.
reset();
1658 ErrorCode Intx2Mesh::resolve_intersection_sharing()
1660 if( parcomm && parcomm->size() > 1 )
1670 Range nonOwnedVerts;
1677 "can't filter pstatus" );
1687 Range vertsCovInterface;
1689 "can't filter pstatus" );
1691 Range nodesToDuplicate =
intersect( vertsCovInterface, nonOwnedVerts );
1694 Range connectedCells;
1697 connectedCells =
intersect( connectedCells, intxCells );
1699 std::map< EntityHandle, EntityHandle > duplicatedVerticesMap;
1700 for(
Range::iterator vit = nodesToDuplicate.begin(); vit != nodesToDuplicate.end(); ++vit )
1707 duplicatedVerticesMap[
vertex] = newVertex;
1711 for(
Range::iterator eit = connectedCells.begin(); eit != connectedCells.end(); ++eit )
1715 std::vector< EntityHandle > connectivity;
1717 for(
size_t i = 0; i < connectivity.size(); i++ )
1720 std::map< EntityHandle, EntityHandle >::iterator mit = duplicatedVerticesMap.find( currentVertex );
1721 if( mit != duplicatedVerticesMap.end() )
1723 connectivity[i] = mit->second;
1726 int nnodes = (int)connectivity.size();