![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
#include <Intx2Mesh.hpp>
Definition at line 55 of file Intx2Mesh.hpp.
moab::Intx2Mesh::Intx2Mesh | ( | Interface * | mbimpl | ) |
Definition at line 28 of file Intx2Mesh.cpp.
References gid, and moab::Interface::globalId_tag().
: mb( mbimpl ), mbs1( 0 ), mbs2( 0 ), outSet( 0 ), gid( 0 ), TgtFlagTag( 0 ), tgtParentTag( 0 ), srcParentTag( 0 ),
countTag( 0 ), srcNeighTag( 0 ), tgtNeighTag( 0 ), neighTgtEdgeTag( 0 ), orgSendProcTag( 0 ), tgtConn( NULL ),
srcConn( NULL ), epsilon_1( 0.0 ), epsilon_area( 0.0 ), box_error( 0.0 ), localRoot( 0 ), my_rank( 0 )
#ifdef MOAB_HAVE_MPI
,
parcomm( NULL ), remote_cells( NULL ), remote_cells_with_tracers( NULL )
#endif
,
max_edges_1( 0 ), max_edges_2( 0 ), counting( 0 )
{
gid = mbimpl->globalId_tag();
}
moab::Intx2Mesh::~Intx2Mesh | ( | ) | [virtual] |
Definition at line 42 of file Intx2Mesh.cpp.
{
// TODO Auto-generated destructor stub
#ifdef MOAB_HAVE_MPI
if( remote_cells )
{
delete remote_cells;
remote_cells = NULL;
}
#endif
}
void moab::Intx2Mesh::clean | ( | ) |
Definition at line 796 of file Intx2Mesh.cpp.
References moab::Range::begin(), counting, moab::Range::end(), extraNodesVec, mb, moab::Interface::tag_delete(), TgtEdges, and TgtFlagTag.
Referenced by intersect_meshes(), and intersect_meshes_kdtree().
{
//
int indx = 0;
for( Range::iterator eit = TgtEdges.begin(); eit != TgtEdges.end(); ++eit, indx++ )
{
delete extraNodesVec[indx];
}
// extraNodesMap.clear();
extraNodesVec.clear();
// also, delete some bit tags, used to mark processed tgts and srcs
mb->tag_delete( TgtFlagTag );
counting = 0; // reset counting to original value
}
virtual ErrorCode moab::Intx2Mesh::computeIntersectionBetweenTgtAndSrc | ( | EntityHandle | tgt, |
EntityHandle | src, | ||
double * | P, | ||
int & | nP, | ||
double & | area, | ||
int | markb[MAXEDGES], | ||
int | markr[MAXEDGES], | ||
int & | nsidesSrc, | ||
int & | nsidesTgt, | ||
bool | check_boxes_first = false |
||
) | [pure virtual] |
Implemented in moab::Intx2MeshOnSphere, moab::IntxRllCssphere, and moab::Intx2MeshInPlane.
Referenced by intersect_meshes(), and intersect_meshes_kdtree().
void moab::Intx2Mesh::correct_polygon | ( | EntityHandle * | foundIds, |
int & | nP | ||
) |
Definition at line 813 of file Intx2Mesh.cpp.
Referenced by moab::Intx2MeshInPlane::findNodes(), moab::IntxRllCssphere::findNodes(), and moab::Intx2MeshOnSphere::findNodes().
{
int i = 0;
while( i < nP )
{
int nextIndex = ( i + 1 ) % nP;
if( nodes[i] == nodes[nextIndex] )
{
#ifdef ENABLE_DEBUG
// we need to reduce nP, and collapse nodes
if( dbg_1 )
{
std::cout << " nodes duplicated in list: ";
for( int j = 0; j < nP; j++ )
std::cout << nodes[j] << " ";
std::cout << "\n";
std::cout << " node " << nodes[i] << " at index " << i << " is duplicated"
<< "\n";
}
#endif
// this will work even if we start from 1 2 3 1; when i is 3, we find nextIndex is 0,
// then next thing does nothing
// (nP-1 is 3, so k is already >= nP-1); it will result in nodes -> 1, 2, 3
for( int k = i; k < nP - 1; k++ )
nodes[k] = nodes[k + 1];
nP--; // decrease the number of nodes; also, decrease i, just if we may need to check
// again
i--;
}
i++;
}
return;
}
ErrorCode moab::Intx2Mesh::create_departure_mesh_2nd_alg | ( | EntityHandle & | euler_set, |
EntityHandle & | covering_lagr_set | ||
) |
Referenced by test_intx_in_parallel_elem_based(), and update_tracer().
ErrorCode moab::Intx2Mesh::create_departure_mesh_3rd_alg | ( | EntityHandle & | lagr_set, |
EntityHandle & | covering_set | ||
) |
Referenced by compute_tracer_case1(), get_departure_grid(), and intersection_at_level().
ErrorCode moab::Intx2Mesh::createTags | ( | ) | [virtual] |
Definition at line 90 of file Intx2Mesh.cpp.
References moab::Range::begin(), countTag, DetermineOrderedNeighbors(), moab::Range::end(), ErrorCode, extraNodesVec, moab::Interface::get_adjacencies(), moab::Interface::get_connectivity(), moab::Interface::INTERSECT, max_edges_1, max_edges_2, mb, MB_CHK_SET_ERR, MB_SUCCESS, MB_TAG_CREAT, MB_TAG_DENSE, MB_TYPE_BIT, MB_TYPE_HANDLE, MB_TYPE_INTEGER, mbs1, mbs2, neighTgtEdgeTag, rs2, moab::Range::size(), srcNeighTag, srcParentTag, moab::Interface::tag_delete(), moab::Interface::tag_get_handle(), moab::Interface::tag_set_data(), tgtConn, TgtEdges, TgtFlagTag, tgtNeighTag, tgtParentTag, and moab::Interface::UNION.
Referenced by intersect_meshes().
{
if( tgtParentTag ) mb->tag_delete( tgtParentTag );
if( srcParentTag ) mb->tag_delete( srcParentTag );
if( countTag ) mb->tag_delete( countTag );
unsigned char def_data_bit = 0; // unused by default
// maybe the tgt tag is better to be deleted every time, and recreated;
// or is it easy to set all values to something again? like 0?
ErrorCode rval = mb->tag_get_handle( "tgtFlag", 1, MB_TYPE_BIT, TgtFlagTag, MB_TAG_CREAT, &def_data_bit );MB_CHK_SET_ERR( rval, "can't get tgt flag tag" );
// create tgt edges if they do not exist yet; so when they are looked upon, they are found
// this is the only call that is potentially NlogN, in the whole method
rval = mb->get_adjacencies( rs2, 1, true, TgtEdges, Interface::UNION );MB_CHK_SET_ERR( rval, "can't get adjacent tgt edges" );
// now, create a map from each edge to a list of potential new nodes on a tgt edge
// this memory has to be cleaned up
// change it to a vector, and use the index in range of tgt edges
int indx = 0;
extraNodesVec.resize( TgtEdges.size() );
for( Range::iterator eit = TgtEdges.begin(); eit != TgtEdges.end(); ++eit, indx++ )
{
std::vector< EntityHandle >* nv = new std::vector< EntityHandle >;
extraNodesVec[indx] = nv;
}
int defaultInt = -1;
rval = mb->tag_get_handle( "TargetParent", 1, MB_TYPE_INTEGER, tgtParentTag, MB_TAG_DENSE | MB_TAG_CREAT,
&defaultInt );MB_CHK_SET_ERR( rval, "can't create positive tag" );
rval = mb->tag_get_handle( "SourceParent", 1, MB_TYPE_INTEGER, srcParentTag, MB_TAG_DENSE | MB_TAG_CREAT,
&defaultInt );MB_CHK_SET_ERR( rval, "can't create negative tag" );
rval = mb->tag_get_handle( "Counting", 1, MB_TYPE_INTEGER, countTag, MB_TAG_DENSE | MB_TAG_CREAT, &defaultInt );MB_CHK_SET_ERR( rval, "can't create Counting tag" );
// for each cell in set 1, determine its neigh in set 1 (could be null too)
// for each cell in set 2, determine its neigh in set 2 (if on boundary, could be 0)
rval = DetermineOrderedNeighbors( mbs1, max_edges_1, srcNeighTag );MB_CHK_SET_ERR( rval, "can't determine neighbors for set 1" );
rval = DetermineOrderedNeighbors( mbs2, max_edges_2, tgtNeighTag );MB_CHK_SET_ERR( rval, "can't determine neighbors for set 2" );
// for tgt cells, save a dense tag with the bordering edges, so we do not have to search for
// them each time edges were for sure created before (tgtEdges)
std::vector< EntityHandle > zeroh( max_edges_2, 0 );
// if we have a tag with this name, it could be of a different size, so delete it
rval = mb->tag_get_handle( "__tgtEdgeNeighbors", neighTgtEdgeTag );
if( rval == MB_SUCCESS && neighTgtEdgeTag ) mb->tag_delete( neighTgtEdgeTag );
rval = mb->tag_get_handle( "__tgtEdgeNeighbors", max_edges_2, MB_TYPE_HANDLE, neighTgtEdgeTag,
MB_TAG_DENSE | MB_TAG_CREAT, &zeroh[0] );MB_CHK_SET_ERR( rval, "can't create tgt edge neighbors tag" );
for( Range::iterator rit = rs2.begin(); rit != rs2.end(); rit++ )
{
EntityHandle tgtCell = *rit;
int num_nodes = 0;
rval = mb->get_connectivity( tgtCell, tgtConn, num_nodes );MB_CHK_SET_ERR( rval, "can't get tgt conn" );
// account for padded polygons
while( tgtConn[num_nodes - 2] == tgtConn[num_nodes - 1] && num_nodes > 3 )
num_nodes--;
int i = 0;
for( i = 0; i < num_nodes; i++ )
{
EntityHandle v[2] = { tgtConn[i],
tgtConn[( i + 1 ) % num_nodes] }; // this is fine even for padded polygons
std::vector< EntityHandle > adj_entities;
rval = mb->get_adjacencies( v, 2, 1, false, adj_entities, Interface::INTERSECT );
if( rval != MB_SUCCESS || adj_entities.size() < 1 ) return rval; // get out , big error
zeroh[i] = adj_entities[0]; // should be only one edge between 2 nodes
// also, even if number of edges is less than max_edges_2, they will be ignored, even if
// the tag is dense
}
// now set the value of the tag
rval = mb->tag_set_data( neighTgtEdgeTag, &tgtCell, 1, &( zeroh[0] ) );MB_CHK_SET_ERR( rval, "can't set edge tgt tag" );
}
return MB_SUCCESS;
}
ErrorCode moab::Intx2Mesh::DetermineOrderedNeighbors | ( | EntityHandle | inputSet, |
int | max_edges, | ||
Tag & | neighTag | ||
) |
Definition at line 166 of file Intx2Mesh.cpp.
References moab::Range::begin(), moab::Interface::contains_entities(), moab::Range::end(), ErrorCode, moab::Interface::get_adjacencies(), moab::Interface::get_connectivity(), moab::Interface::get_entities_by_dimension(), moab::Interface::INTERSECT, moab::Interface::list_entities(), mb, MB_CHK_SET_ERR, MB_SUCCESS, MB_TAG_CREAT, MB_TAG_DENSE, MB_TYPE_HANDLE, moab::Interface::tag_get_handle(), and moab::Interface::tag_set_data().
Referenced by createTags().
{
Range cells;
ErrorCode rval = mb->get_entities_by_dimension( inputSet, 2, cells );MB_CHK_SET_ERR( rval, "can't get cells in set" );
std::vector< EntityHandle > neighbors( max_edges );
std::vector< EntityHandle > zeroh( max_edges, 0 );
// nameless tag, as the name is not important; we will have 2 related tags, but one on tgt mesh,
// one on src mesh
rval = mb->tag_get_handle( "", max_edges, MB_TYPE_HANDLE, neighTag, MB_TAG_DENSE | MB_TAG_CREAT, &zeroh[0] );MB_CHK_SET_ERR( rval, "can't create neighbors tag" );
for( Range::iterator cit = cells.begin(); cit != cells.end(); cit++ )
{
EntityHandle cell = *cit;
int nnodes = 3;
// will get the nnodes ordered neighbors;
// first cell is for nodes 0, 1, second to 1, 2, third to 2, 3, last to nnodes-1,
const EntityHandle* conn4;
rval = mb->get_connectivity( cell, conn4, nnodes );MB_CHK_SET_ERR( rval, "can't get connectivity of a cell" );
int nsides = nnodes;
// account for possible padded polygons
while( conn4[nsides - 2] == conn4[nsides - 1] && nsides > 3 )
nsides--;
for( int i = 0; i < nsides; i++ )
{
EntityHandle v[2];
v[0] = conn4[i];
v[1] = conn4[( i + 1 ) % nsides];
// get all cells adjacent to these 2 vertices on the edge
std::vector< EntityHandle > adjcells;
std::vector< EntityHandle > cellsInSet;
rval = mb->get_adjacencies( v, 2, 2, false, adjcells, Interface::INTERSECT );MB_CHK_SET_ERR( rval, "can't adjacency to 2 verts" );
// now look for the cells contained in the input set;
// the input set should be a correct mesh, not overlapping cells, and manifold
size_t siz = adjcells.size();
for( size_t j = 0; j < siz; j++ )
if( mb->contains_entities( inputSet, &( adjcells[j] ), 1 ) ) cellsInSet.push_back( adjcells[j] );
siz = cellsInSet.size();
if( siz > 2 )
{
std::cout << "non manifold mesh, error" << mb->list_entities( &( cellsInSet[0] ), cellsInSet.size() )
<< "\n";MB_CHK_SET_ERR( MB_FAILURE, "non-manifold input mesh set" ); // non-manifold
}
if( siz == 1 )
{
// it must be the border of the input mesh;
neighbors[i] = 0; // we are guaranteed that ids are !=0; this is marking a border
// borders do not appear for a sphere in serial, but they do appear for
// parallel processing anyway
continue;
}
// here siz ==2, it is either the first or second
if( cell == cellsInSet[0] )
neighbors[i] = cellsInSet[1];
else
neighbors[i] = cellsInSet[0];
}
// fill the rest with 0
for( int i = nsides; i < max_edges; i++ )
neighbors[i] = 0;
// now simply set the neighbors tag; the last few positions will not be used, but for
// simplicity will keep them all (MAXEDGES)
rval = mb->tag_set_data( neighTag, &cell, 1, &neighbors[0] );MB_CHK_SET_ERR( rval, "can't set neigh tag" );
}
return MB_SUCCESS;
}
ErrorCode moab::Intx2Mesh::FindMaxEdges | ( | EntityHandle | set1, |
EntityHandle | set2 | ||
) | [virtual] |
Definition at line 82 of file Intx2Mesh.cpp.
References ErrorCode, FindMaxEdgesInSet(), max_edges_1, max_edges_2, MB_CHK_SET_ERR, and MB_SUCCESS.
Referenced by moab::TempestRemapper::ConstructCoveringSet(), main(), and test_intx_in_parallel_elem_based().
{
ErrorCode rval = FindMaxEdgesInSet( set1, max_edges_1 );MB_CHK_SET_ERR( rval, "can't determine max_edges in set 1" );
rval = FindMaxEdgesInSet( set2, max_edges_2 );MB_CHK_SET_ERR( rval, "can't determine max_edges in set 2" );
return MB_SUCCESS;
}
ErrorCode moab::Intx2Mesh::FindMaxEdgesInSet | ( | EntityHandle | eset, |
int & | max_edges | ||
) | [virtual] |
Definition at line 53 of file Intx2Mesh.cpp.
References moab::Range::begin(), moab::Range::end(), ErrorCode, moab::Interface::get_connectivity(), moab::Interface::get_entities_by_dimension(), mb, MB_CHK_ERR, MB_CHK_SET_ERR, and MB_SUCCESS.
Referenced by FindMaxEdges().
{
Range cells;
ErrorCode rval = mb->get_entities_by_dimension( eset, 2, cells );MB_CHK_ERR( rval );
max_edges = 0; // can be 0 for point clouds
for( Range::iterator cit = cells.begin(); cit != cells.end(); cit++ )
{
EntityHandle cell = *cit;
const EntityHandle* conn4;
int nnodes = 3;
rval = mb->get_connectivity( cell, conn4, nnodes );MB_CHK_SET_ERR( rval, "can't get connectivity of a cell" );
if( nnodes > max_edges ) max_edges = nnodes;
}
// if in parallel, communicate the actual max_edges; it is not needed for tgt mesh (to be
// global) but it is better to be consistent
#ifdef MOAB_HAVE_MPI
if( parcomm )
{
int local_max_edges = max_edges;
// now reduce max_edges over all processors
int mpi_err =
MPI_Allreduce( &local_max_edges, &max_edges, 1, MPI_INT, MPI_MAX, parcomm->proc_config().proc_comm() );
if( MPI_SUCCESS != mpi_err ) return MB_FAILURE;
}
#endif
return MB_SUCCESS;
}
virtual ErrorCode moab::Intx2Mesh::findNodes | ( | EntityHandle | tgt, |
int | nsTgt, | ||
EntityHandle | src, | ||
int | nsSrc, | ||
double * | iP, | ||
int | nP | ||
) | [pure virtual] |
Implemented in moab::Intx2MeshOnSphere, moab::IntxRllCssphere, and moab::Intx2MeshInPlane.
Referenced by intersect_meshes(), and intersect_meshes_kdtree().
ErrorCode moab::Intx2Mesh::intersect_meshes | ( | EntityHandle | mbs1, |
EntityHandle | mbs2, | ||
EntityHandle & | outputSet | ||
) |
Definition at line 439 of file Intx2Mesh.cpp.
References moab::Range::begin(), moab::AdaptiveKDTree::build_tree(), clean(), moab::Range::clear(), computeIntersectionBetweenTgtAndSrc(), counting, createTags(), moab::AdaptiveKDTree::distance_search(), moab::Range::empty(), moab::Range::end(), epsilon_1, moab::Range::erase(), ErrorCode, moab::Range::find(), findNodes(), moab::Interface::get_connectivity(), moab::Interface::get_coords(), moab::Interface::get_entities_by_dimension(), moab::ID_FROM_HANDLE(), moab::Interface::id_from_handle(), moab::Range::insert(), moab::Interface::list_entities(), MAXEDGES, mb, MB_CHK_ERR, MB_CHK_SET_ERR, MB_SUCCESS, mbs1, mbs2, moab::Range::merge(), my_rank, nr, outSet, rs1, rs2, setup_tgt_cell(), size, moab::Range::size(), srcNeighTag, moab::Interface::tag_get_data(), moab::Interface::tag_set_data(), TgtFlagTag, tgtNeighTag, and moab::Interface::write_mesh().
Referenced by compute_tracer_case1(), moab::TempestRemapper::ComputeOverlapMesh(), intersection_at_level(), main(), test_intx_in_parallel_elem_based(), and update_tracer().
{
ErrorCode rval;
mbs1 = mbset1; // set 1 is departure, and it is completely covering the euler set on proc
mbs2 = mbset2;
outSet = outputSet;
#ifdef VERBOSE
std::stringstream ffs, fft;
ffs << "source_rank0" << my_rank << ".vtk";
rval = mb->write_mesh( ffs.str().c_str(), &mbset1, 1 );MB_CHK_ERR( rval );
fft << "target_rank0" << my_rank << ".vtk";
rval = mb->write_mesh( fft.str().c_str(), &mbset2, 1 );MB_CHK_ERR( rval );
#endif
// really, should be something from t1 and t2; src is 1 (lagrange), tgt is 2 (euler)
EntityHandle startSrc = 0, startTgt = 0;
rval = mb->get_entities_by_dimension( mbs1, 2, rs1 );MB_CHK_ERR( rval );
rval = mb->get_entities_by_dimension( mbs2, 2, rs2 );MB_CHK_ERR( rval );
// std::cout << "rs1.size() = " << rs1.size() << " and rs2.size() = " << rs2.size() << "\n";
// std::cout.flush();
createTags(); // will also determine max_edges_1, max_edges_2 (for src and tgt meshes)
Range rs22 = rs2; // a copy of the initial range; we will remove from it elements as we
// advance ; rs2 is needed for marking the polygon to the tgt parent
// create the local kdd tree with source elements; will use it to search
// more efficiently for the seeds in advancing front;
// some of the target cells will not be covered by source cells, and they need to be eliminated
// early from contention
// build a kd tree with the rs1 (source) cells
AdaptiveKDTree kd( mb );
EntityHandle tree_root = 0;
rval = kd.build_tree( rs1, &tree_root );MB_CHK_ERR( rval );
while( !rs22.empty() )
{
#if defined( ENABLE_DEBUG ) || defined( VERBOSE )
if( rs22.size() < rs2.size() )
{
std::cout << " possible not connected arrival mesh; my_rank: " << my_rank << " counting: " << counting
<< "\n";
std::stringstream ffo;
ffo << "file0" << counting << "rank0" << my_rank << ".vtk";
rval = mb->write_mesh( ffo.str().c_str(), &outSet, 1 );MB_CHK_ERR( rval );
}
#endif
bool seedFound = false;
for( Range::iterator it = rs22.begin(); it != rs22.end(); ++it )
{
startTgt = *it;
int found = 0;
// find vertex positions
const EntityHandle* conn = NULL;
int nnodes = 0;
rval = mb->get_connectivity( startTgt, conn, nnodes );MB_CHK_ERR( rval );
// find leaves close to those positions
std::vector< double > positions;
positions.resize( nnodes * 3 );
rval = mb->get_coords( conn, nnodes, &positions[0] );MB_CHK_ERR( rval );
// find leaves within a distance from each vertex of target
// in those leaves, collect all cells; we will try for an intx in there, instead of
// looping over all rs1 cells, as before
Range close_source_cells;
std::vector< EntityHandle > leaves;
for( int i = 0; i < nnodes; i++ )
{
leaves.clear();
rval = kd.distance_search( &positions[3 * i], epsilon_1, leaves, epsilon_1, epsilon_1 );MB_CHK_ERR( rval );
for( std::vector< EntityHandle >::iterator j = leaves.begin(); j != leaves.end(); ++j )
{
Range tmp;
rval = mb->get_entities_by_dimension( *j, 2, tmp );MB_CHK_ERR( rval );
close_source_cells.merge( tmp.begin(), tmp.end() );
}
}
for( Range::iterator it2 = close_source_cells.begin(); it2 != close_source_cells.end() && !found; ++it2 )
{
startSrc = *it2;
double area = 0;
// if area is > 0 , we have intersections
double P[10 * MAXEDGES]; // max 8 intx points + 8 more in the polygon
//
int nP = 0;
int nb[MAXEDGES], nr[MAXEDGES]; // sides 3 or 4? also, check boxes first
int nsTgt, nsSrc;
rval =
computeIntersectionBetweenTgtAndSrc( startTgt, startSrc, P, nP, area, nb, nr, nsSrc, nsTgt, true );MB_CHK_ERR( rval );
if( area > 0 )
{
found = 1;
seedFound = true;
break; // found 2 elements that intersect; these will be the seeds
}
}
if( found )
break;
else
{
#if defined( VERBOSE )
std::cout << " on rank " << my_rank << " target cell " << ID_FROM_HANDLE( startTgt )
<< " not intx with any source\n";
#endif
rs22.erase( startTgt );
}
}
if( !seedFound ) continue; // continue while(!rs22.empty())
std::queue< EntityHandle > srcQueue; // these are corresponding to Ta,
srcQueue.push( startSrc );
std::queue< EntityHandle > tgtQueue;
tgtQueue.push( startTgt );
Range toResetSrcs; // will be used to reset src flags for every tgt quad
// processed
/*if (my_rank==0)
dbg_1 = 1;*/
unsigned char used = 1;
// mark the start tgt quad as used, so it will not come back again
rval = mb->tag_set_data( TgtFlagTag, &startTgt, 1, &used );MB_CHK_ERR( rval );
while( !tgtQueue.empty() )
{
// flags for the side : 0 means a src cell not found on side
// a paired src not found yet for the neighbors of tgt
Range nextSrc[MAXEDGES]; // there are new ranges of possible next src cells for
// seeding the side j of tgt cell
EntityHandle currentTgt = tgtQueue.front();
tgtQueue.pop();
int nsidesTgt; // will be initialized now
double areaTgtCell = setup_tgt_cell( currentTgt, nsidesTgt ); // this is the area in the gnomonic plane
double recoveredArea = 0;
// get the neighbors of tgt, and if they are solved already, do not bother with that
// side of tgt
EntityHandle tgtNeighbors[MAXEDGES] = { 0 };
rval = mb->tag_get_data( tgtNeighTag, ¤tTgt, 1, tgtNeighbors );MB_CHK_SET_ERR( rval, "can't get neighbors of current tgt" );
#ifdef ENABLE_DEBUG
if( dbg_1 )
{
std::cout << "Next: neighbors for current tgt ";
for( int kk = 0; kk < nsidesTgt; kk++ )
{
if( tgtNeighbors[kk] > 0 )
std::cout << mb->id_from_handle( tgtNeighbors[kk] ) << " ";
else
std::cout << 0 << " ";
}
std::cout << std::endl;
}
#endif
// now get the status of neighbors; if already solved, make them 0, so not to bother
// anymore on that side of tgt
for( int j = 0; j < nsidesTgt; j++ )
{
EntityHandle tgtNeigh = tgtNeighbors[j];
unsigned char status = 1;
if( tgtNeigh == 0 ) continue;
rval = mb->tag_get_data( TgtFlagTag, &tgtNeigh, 1, &status );MB_CHK_ERR( rval ); // status 0 is unused
if( 1 == status ) tgtNeighbors[j] = 0; // so will not look anymore on this side of tgt
}
#ifdef ENABLE_DEBUG
if( dbg_1 )
{
std::cout << "reset sources: ";
for( Range::iterator itr = toResetSrcs.begin(); itr != toResetSrcs.end(); ++itr )
std::cout << mb->id_from_handle( *itr ) << " ";
std::cout << std::endl;
}
#endif
EntityHandle currentSrc = srcQueue.front();
// tgt and src queues are parallel; for clarity we should have kept in the queue pairs
// of entity handle std::pair; so just one queue, with
// pairs;
// at every moment, the queue contains pairs of cells that intersect, and they form the
// "advancing front"
srcQueue.pop();
toResetSrcs.clear(); // empty the range of used srcs, will have to be set unused again,
// at the end of tgt element processing
toResetSrcs.insert( currentSrc );
// mb2->set_tag_data
std::queue< EntityHandle > localSrc;
localSrc.push( currentSrc );
#ifdef VERBOSE
int countingStart = counting;
#endif
// will advance-front search in the neighborhood of tgt cell, until we finish processing
// all
// possible src cells; localSrc queue will contain all possible src cells that cover
// the current tgt cell
while( !localSrc.empty() )
{
//
EntityHandle srcT = localSrc.front();
localSrc.pop();
double P[10 * MAXEDGES], area; //
int nP = 0;
int nb[MAXEDGES] = { 0 };
int nr[MAXEDGES] = { 0 };
int nsidesSrc; ///
// area is in 2d, points are in 3d (on a sphere), back-projected, or in a plane
// intersection points could include the vertices of initial elements
// nb [j] = 0 means no intersection on the side j for element src (markers)
// nb [j] = 1 means that the side j (from j to j+1) of src poly intersects the
// tgt poly. A potential next poly in the tgt queue is the tgt poly that is
// adjacent to this side
rval = computeIntersectionBetweenTgtAndSrc( /* tgt */ currentTgt, srcT, P, nP, area, nb, nr, nsidesSrc,
nsidesTgt );MB_CHK_ERR( rval );
if( nP > 0 )
{
#ifdef ENABLE_DEBUG
if( dbg_1 )
{
for( int k = 0; k < 3; k++ )
{
std::cout << " nb, nr: " << k << " " << nb[k] << " " << nr[k] << "\n";
}
}
#endif
// intersection found: output P and original triangles if nP > 2
EntityHandle neighbors[MAXEDGES] = { 0 };
rval = mb->tag_get_data( srcNeighTag, &srcT, 1, neighbors );
if( rval != MB_SUCCESS )
{
std::cout << " can't get the neighbors for src element " << mb->id_from_handle( srcT );
return MB_FAILURE;
}
// add neighbors to the localSrc queue, if they are not marked
for( int nn = 0; nn < nsidesSrc; nn++ )
{
EntityHandle neighbor = neighbors[nn];
if( neighbor > 0 && nb[nn] > 0 ) // advance across src boundary nn
{
if( toResetSrcs.find( neighbor ) == toResetSrcs.end() )
{
localSrc.push( neighbor );
#ifdef ENABLE_DEBUG
if( dbg_1 )
{
std::cout << " local src elem " << mb->id_from_handle( neighbor )
<< " for tgt:" << mb->id_from_handle( currentTgt ) << "\n";
mb->list_entities( &neighbor, 1 );
}
#endif
toResetSrcs.insert( neighbor );
}
}
}
// n(find(nc>0))=ac; % ac is starting candidate for neighbor
for( int nn = 0; nn < nsidesTgt; nn++ )
{
if( nr[nn] > 0 && tgtNeighbors[nn] > 0 )
nextSrc[nn].insert( srcT ); // potential src cell that can intersect
// the tgt neighbor nn
}
if( nP > 1 )
{ // this will also construct triangles/polygons in the new mesh, if needed
rval = findNodes( currentTgt, nsidesTgt, srcT, nsidesSrc, P, nP );MB_CHK_ERR( rval );
}
recoveredArea += area;
}
#ifdef ENABLE_DEBUG
else if( dbg_1 )
{
std::cout << " tgt, src, do not intersect: " << mb->id_from_handle( currentTgt ) << " "
<< mb->id_from_handle( srcT ) << "\n";
}
#endif
} // end while (!localSrc.empty())
recoveredArea = ( recoveredArea - areaTgtCell ) / areaTgtCell; // replace now with recovery fraction
#if defined( ENABLE_DEBUG ) || defined( VERBOSE )
if( fabs( recoveredArea ) > epsilon_1 )
{
#ifdef VERBOSE
std::cout << " tgt area: " << areaTgtCell << " recovered :" << recoveredArea * ( 1 + areaTgtCell )
<< " fraction error recovery:" << recoveredArea
<< " tgtID: " << mb->id_from_handle( currentTgt ) << " countingStart:" << countingStart
<< "\n";
#endif
}
#endif
// here, we are finished with tgtCurrent, take it out of the rs22 range (tgt, arrival
// mesh)
rs22.erase( currentTgt );
// also, look at its neighbors, and add to the seeds a next one
for( int j = 0; j < nsidesTgt; j++ )
{
EntityHandle tgtNeigh = tgtNeighbors[j];
if( tgtNeigh == 0 || nextSrc[j].size() == 0 ) // if tgt is bigger than src, there could be no src
// to advance on that side
continue;
int nsidesTgt2 = 0;
setup_tgt_cell( tgtNeigh,
nsidesTgt2 ); // find possible intersection with src cell from nextSrc
for( Range::iterator nit = nextSrc[j].begin(); nit != nextSrc[j].end(); ++nit )
{
EntityHandle nextB = *nit;
// we identified tgt quad n[j] as possibly intersecting with neighbor j of the
// src quad
double P[10 * MAXEDGES], area; //
int nP = 0;
int nb[MAXEDGES] = { 0 };
int nr[MAXEDGES] = { 0 };
int nsidesSrc; ///
rval = computeIntersectionBetweenTgtAndSrc(
/* tgt */ tgtNeigh, nextB, P, nP, area, nb, nr, nsidesSrc, nsidesTgt2 );MB_CHK_ERR( rval );
if( area > 0 )
{
tgtQueue.push( tgtNeigh );
srcQueue.push( nextB );
#ifdef ENABLE_DEBUG
if( dbg_1 )
std::cout << "new polys pushed: src, tgt:" << mb->id_from_handle( tgtNeigh ) << " "
<< mb->id_from_handle( nextB ) << std::endl;
#endif
rval = mb->tag_set_data( TgtFlagTag, &tgtNeigh, 1, &used );MB_CHK_ERR( rval );
break; // so we are done with this side of tgt, we have found a proper next
// seed
}
}
}
} // end while (!tgtQueue.empty())
}
#ifdef ENABLE_DEBUG
if( dbg_1 )
{
for( int k = 0; k < 6; k++ )
mout_1[k].close();
}
#endif
// before cleaning up , we need to settle the position of the intersection points
// on the boundary edges
// this needs to be collective, so we should maybe wait something
#ifdef MOAB_HAVE_MPI
rval = resolve_intersection_sharing();MB_CHK_SET_ERR( rval, "can't correct position, Intx2Mesh.cpp \n" );
#endif
this->clean();
return MB_SUCCESS;
}
ErrorCode moab::Intx2Mesh::intersect_meshes_kdtree | ( | EntityHandle | mbset1, |
EntityHandle | mbset2, | ||
EntityHandle & | outputSet | ||
) |
Definition at line 237 of file Intx2Mesh.cpp.
References moab::Range::begin(), box_error, moab::AdaptiveKDTree::build_tree(), clean(), computeIntersectionBetweenTgtAndSrc(), countTag, moab::AdaptiveKDTree::distance_search(), moab::Range::empty(), moab::Range::end(), epsilon_1, ErrorCode, extraNodesVec, findNodes(), moab::Interface::get_adjacencies(), moab::Interface::get_connectivity(), moab::Interface::get_coords(), moab::Interface::get_entities_by_dimension(), moab::Interface::id_from_handle(), moab::Interface::INTERSECT, max_edges_1, max_edges_2, MAXEDGES, mb, MB_CHK_ERR, MB_CHK_SET_ERR, MB_SUCCESS, MB_TAG_CREAT, MB_TAG_DENSE, MB_TYPE_HANDLE, MB_TYPE_INTEGER, mbs1, mbs2, moab::Range::merge(), my_rank, neighTgtEdgeTag, nr, outSet, rs1, rs2, setup_tgt_cell(), moab::Range::size(), srcParentTag, moab::Interface::tag_delete(), moab::Interface::tag_get_handle(), moab::Interface::tag_set_data(), tgtConn, TgtEdges, tgtParentTag, moab::tolerance, and moab::Interface::UNION.
Referenced by moab::TempestRemapper::ComputeOverlapMesh().
{
ErrorCode rval;
mbs1 = mbset1; // set 1 is departure, and it is completely covering the euler set on proc
mbs2 = mbset2;
outSet = outputSet;
rval = mb->get_entities_by_dimension( mbs1, 2, rs1 );MB_CHK_ERR( rval );
rval = mb->get_entities_by_dimension( mbs2, 2, rs2 );MB_CHK_ERR( rval );
// from create tags, copy relevant ones
if( tgtParentTag ) mb->tag_delete( tgtParentTag );
if( srcParentTag ) mb->tag_delete( srcParentTag );
if( countTag ) mb->tag_delete( countTag );
// create tgt edges if they do not exist yet; so when they are looked upon, they are found
// this is the only call that is potentially NlogN, in the whole method
rval = mb->get_adjacencies( rs2, 1, true, TgtEdges, Interface::UNION );MB_CHK_SET_ERR( rval, "can't get adjacent tgt edges" );
int indx = 0;
extraNodesVec.resize( TgtEdges.size() );
for( Range::iterator eit = TgtEdges.begin(); eit != TgtEdges.end(); ++eit, indx++ )
{
std::vector< EntityHandle >* nv = new std::vector< EntityHandle >;
extraNodesVec[indx] = nv;
}
int defaultInt = -1;
rval = mb->tag_get_handle( "TargetParent", 1, MB_TYPE_INTEGER, tgtParentTag, MB_TAG_DENSE | MB_TAG_CREAT,
&defaultInt );MB_CHK_SET_ERR( rval, "can't create positive tag" );
rval = mb->tag_get_handle( "SourceParent", 1, MB_TYPE_INTEGER, srcParentTag, MB_TAG_DENSE | MB_TAG_CREAT,
&defaultInt );MB_CHK_SET_ERR( rval, "can't create negative tag" );
rval = mb->tag_get_handle( "Counting", 1, MB_TYPE_INTEGER, countTag, MB_TAG_DENSE | MB_TAG_CREAT, &defaultInt );MB_CHK_SET_ERR( rval, "can't create Counting tag" );
// for tgt cells, save a dense tag with the bordering edges, so we do not have to search for
// them each time edges were for sure created before (tgtEdges)
// if we have a tag with this name, it could be of a different size, so delete it
rval = mb->tag_get_handle( "__tgtEdgeNeighbors", neighTgtEdgeTag );
if( rval == MB_SUCCESS && neighTgtEdgeTag ) mb->tag_delete( neighTgtEdgeTag );
std::vector< EntityHandle > zeroh( max_edges_2, 0 );
rval = mb->tag_get_handle( "__tgtEdgeNeighbors", max_edges_2, MB_TYPE_HANDLE, neighTgtEdgeTag,
MB_TAG_DENSE | MB_TAG_CREAT, &zeroh[0] );MB_CHK_SET_ERR( rval, "can't create tgt edge neighbors tag" );
for( Range::iterator rit = rs2.begin(); rit != rs2.end(); rit++ )
{
EntityHandle tgtCell = *rit;
int num_nodes = 0;
rval = mb->get_connectivity( tgtCell, tgtConn, num_nodes );MB_CHK_SET_ERR( rval, "can't get tgt conn" );
// account for padded polygons
while( tgtConn[num_nodes - 2] == tgtConn[num_nodes - 1] && num_nodes > 3 )
num_nodes--;
int i = 0;
for( i = 0; i < num_nodes; i++ )
{
EntityHandle v[2] = { tgtConn[i],
tgtConn[( i + 1 ) % num_nodes] }; // this is fine even for padded polygons
std::vector< EntityHandle > adj_entities;
rval = mb->get_adjacencies( v, 2, 1, false, adj_entities, Interface::INTERSECT );
if( rval != MB_SUCCESS || adj_entities.size() < 1 ) return rval; // get out , big error
zeroh[i] = adj_entities[0]; // should be only one edge between 2 nodes
// also, even if number of edges is less than max_edges_2, they will be ignored, even if
// the tag is dense
}
// now set the value of the tag
rval = mb->tag_set_data( neighTgtEdgeTag, &tgtCell, 1, &( zeroh[0] ) );MB_CHK_SET_ERR( rval, "can't set edge tgt tag" );
}
// create the kd tree on source cells, and intersect all targets in an expensive loop
// build a kd tree with the rs1 (source) cells
AdaptiveKDTree kd( mb );
EntityHandle tree_root = 0;
rval = kd.build_tree( rs1, &tree_root );MB_CHK_ERR( rval );
// find out max edge on source mesh;
double max_length = 0;
{
std::vector< double > coords;
coords.resize( 3 * max_edges_1 );
for( Range::iterator it = rs1.begin(); it != rs1.end(); it++ )
{
const EntityHandle* conn = NULL;
int nnodes;
rval = mb->get_connectivity( *it, conn, nnodes );MB_CHK_SET_ERR( rval, "can't get connectivity" );
while( conn[nnodes - 2] == conn[nnodes - 1] && nnodes > 3 )
nnodes--;
rval = mb->get_coords( conn, nnodes, &coords[0] );MB_CHK_SET_ERR( rval, "can't get coordinates" );
for( int j = 0; j < nnodes; j++ )
{
int next = ( j + 1 ) % nnodes;
double leng;
leng = ( coords[3 * j] - coords[3 * next] ) * ( coords[3 * j] - coords[3 * next] ) +
( coords[3 * j + 1] - coords[3 * next + 1] ) * ( coords[3 * j + 1] - coords[3 * next + 1] ) +
( coords[3 * j + 2] - coords[3 * next + 2] ) * ( coords[3 * j + 2] - coords[3 * next + 2] );
leng = sqrt( leng );
if( leng > max_length ) max_length = leng;
}
}
}
// maximum sag on a spherical mesh make sense only for intx on a sphere, with radius 1 :(
double tolerance = 1.e-15;
if( max_length < 1. )
{
// basically, the sag for an arc of length max_length on a circle of radius 1
tolerance = 1. - sqrt( 1 - max_length * max_length / 4 );
if( box_error < tolerance ) box_error = tolerance;
tolerance = 3 * tolerance; // we use it for gnomonic plane too, projected sag could be =* sqrt(2.)
// be more generous, use 1.5 ~= sqrt(2.)
if( !my_rank )
{
std::cout << " max edge length: " << max_length << " tolerance for kd tree: " << tolerance << "\n";
std::cout << " box overlap tolerance: " << box_error << "\n";
}
}
for( Range::iterator it = rs2.begin(); it != rs2.end(); ++it )
{
EntityHandle tcell = *it;
// find vertex positions
const EntityHandle* conn = NULL;
int nnodes = 0;
rval = mb->get_connectivity( tcell, conn, nnodes );MB_CHK_ERR( rval );
// find leaves close to those positions
double areaTgtCell = setup_tgt_cell( tcell, nnodes ); // this is the area in the gnomonic plane
double recoveredArea = 0;
std::vector< double > positions;
positions.resize( nnodes * 3 );
rval = mb->get_coords( conn, nnodes, &positions[0] );MB_CHK_ERR( rval );
// distance to search will be based on average edge length
double av_len = 0;
for( int k = 0; k < nnodes; k++ )
{
int ik = ( k + 1 ) % nnodes;
double len1 = 0;
for( int j = 0; j < 3; j++ )
{
double len2 = positions[3 * k + j] - positions[3 * ik + j];
len1 += len2 * len2;
}
av_len += sqrt( len1 );
}
if( nnodes > 0 ) av_len /= nnodes;
// find leaves within a distance from each vertex of target
// in those leaves, collect all cells; we will try for an intx in there
Range close_source_cells;
std::vector< EntityHandle > leaves;
for( int i = 0; i < nnodes; i++ )
{
leaves.clear();
rval = kd.distance_search( &positions[3 * i], av_len, leaves, tolerance, epsilon_1 );MB_CHK_ERR( rval );
for( std::vector< EntityHandle >::iterator j = leaves.begin(); j != leaves.end(); ++j )
{
Range tmp;
rval = mb->get_entities_by_dimension( *j, 2, tmp );MB_CHK_ERR( rval );
close_source_cells.merge( tmp.begin(), tmp.end() );
}
}
#ifdef VERBOSE
if( close_source_cells.empty() )
{
std::cout << " there are no close source cells to target cell " << tcell << " id from handle "
<< mb->id_from_handle( tcell ) << "\n";
}
#endif
for( Range::iterator it2 = close_source_cells.begin(); it2 != close_source_cells.end(); ++it2 )
{
EntityHandle startSrc = *it2;
double area = 0;
// if area is > 0 , we have intersections
double P[10 * MAXEDGES]; // max 8 intx points + 8 more in the polygon
//
int nP = 0;
int nb[MAXEDGES], nr[MAXEDGES]; // sides 3 or 4? also, check boxes first
int nsTgt, nsSrc;
rval = computeIntersectionBetweenTgtAndSrc( tcell, startSrc, P, nP, area, nb, nr, nsSrc, nsTgt, true );MB_CHK_ERR( rval );
if( area > 0 )
{
if( nP > 1 )
{ // this will also construct triangles/polygons in the new mesh, if needed
rval = findNodes( tcell, nnodes, startSrc, nsSrc, P, nP );MB_CHK_ERR( rval );
}
recoveredArea += area;
}
}
recoveredArea = ( recoveredArea - areaTgtCell ) / areaTgtCell; // replace now with recovery fract
}
// before cleaning up , we need to settle the position of the intersection points
// on the boundary edges
// this needs to be collective, so we should maybe wait something
#ifdef MOAB_HAVE_MPI
rval = resolve_intersection_sharing();MB_CHK_SET_ERR( rval, "can't correct position, Intx2Mesh.cpp \n" );
#endif
this->clean();
return MB_SUCCESS;
}
void moab::Intx2Mesh::set_box_error | ( | double | berror | ) | [inline] |
Definition at line 136 of file Intx2Mesh.hpp.
References box_error.
Referenced by moab::TempestRemapper::ConstructCoveringSet(), create_mesh(), main(), and test_intx_in_parallel_elem_based().
{
box_error = berror;
}
void moab::Intx2Mesh::set_error_tolerance | ( | double | eps | ) | [inline] |
Definition at line 119 of file Intx2Mesh.hpp.
References epsilon_1, and epsilon_area.
Referenced by moab::TempestRemapper::ConstructCoveringSet(), main(), test_intx_in_parallel_elem_based(), and update_tracer().
{
epsilon_1 = eps;
epsilon_area = eps * sqrt( eps );
}
virtual double moab::Intx2Mesh::setup_tgt_cell | ( | EntityHandle | tgt, |
int & | nsTgt | ||
) | [pure virtual] |
Implemented in moab::Intx2MeshOnSphere, moab::IntxRllCssphere, and moab::Intx2MeshInPlane.
Referenced by intersect_meshes(), and intersect_meshes_kdtree().
std::vector< double > moab::Intx2Mesh::allBoxes [protected] |
Definition at line 250 of file Intx2Mesh.hpp.
double moab::Intx2Mesh::box_error [protected] |
int moab::Intx2Mesh::counting [protected] |
Definition at line 265 of file Intx2Mesh.hpp.
Referenced by clean(), moab::Intx2MeshInPlane::findNodes(), moab::IntxRllCssphere::findNodes(), moab::Intx2MeshOnSphere::findNodes(), and intersect_meshes().
Tag moab::Intx2Mesh::countTag [protected] |
Definition at line 214 of file Intx2Mesh.hpp.
Referenced by createTags(), moab::Intx2MeshInPlane::findNodes(), moab::IntxRllCssphere::findNodes(), moab::Intx2MeshOnSphere::findNodes(), and intersect_meshes_kdtree().
double moab::Intx2Mesh::epsilon_1 [protected] |
Definition at line 247 of file Intx2Mesh.hpp.
Referenced by moab::Intx2MeshInPlane::computeIntersectionBetweenTgtAndSrc(), moab::IntxRllCssphere::computeIntersectionBetweenTgtAndSrc(), moab::Intx2MeshOnSphere::computeIntersectionBetweenTgtAndSrc(), moab::Intx2MeshInPlane::findNodes(), moab::IntxRllCssphere::findNodes(), moab::Intx2MeshOnSphere::findNodes(), intersect_meshes(), intersect_meshes_kdtree(), and set_error_tolerance().
double moab::Intx2Mesh::epsilon_area [protected] |
Definition at line 248 of file Intx2Mesh.hpp.
Referenced by moab::Intx2MeshInPlane::computeIntersectionBetweenTgtAndSrc(), moab::IntxRllCssphere::computeIntersectionBetweenTgtAndSrc(), moab::Intx2MeshOnSphere::computeIntersectionBetweenTgtAndSrc(), and set_error_tolerance().
std::vector< std::vector< EntityHandle >* > moab::Intx2Mesh::extraNodesVec [protected] |
Definition at line 245 of file Intx2Mesh.hpp.
Referenced by clean(), createTags(), moab::Intx2MeshInPlane::findNodes(), moab::IntxRllCssphere::findNodes(), moab::Intx2MeshOnSphere::findNodes(), and intersect_meshes_kdtree().
Tag moab::Intx2Mesh::gid [protected] |
Definition at line 203 of file Intx2Mesh.hpp.
Referenced by moab::Intx2MeshOnSphere::findNodes(), Intx2Mesh(), and moab::Intx2MeshOnSphere::update_tracer_data().
Range moab::Intx2Mesh::localEnts [protected] |
Definition at line 254 of file Intx2Mesh.hpp.
EntityHandle moab::Intx2Mesh::localRoot [protected] |
Definition at line 253 of file Intx2Mesh.hpp.
int moab::Intx2Mesh::max_edges_1 [protected] |
Definition at line 263 of file Intx2Mesh.hpp.
Referenced by moab::TempestRemapper::ConstructCoveringSet(), createTags(), FindMaxEdges(), and intersect_meshes_kdtree().
int moab::Intx2Mesh::max_edges_2 [protected] |
Definition at line 264 of file Intx2Mesh.hpp.
Referenced by moab::TempestRemapper::ConstructCoveringSet(), createTags(), FindMaxEdges(), and intersect_meshes_kdtree().
Interface* moab::Intx2Mesh::mb [protected] |
Definition at line 195 of file Intx2Mesh.hpp.
Referenced by clean(), moab::Intx2MeshInPlane::computeIntersectionBetweenTgtAndSrc(), moab::IntxRllCssphere::computeIntersectionBetweenTgtAndSrc(), moab::Intx2MeshOnSphere::computeIntersectionBetweenTgtAndSrc(), createTags(), DetermineOrderedNeighbors(), FindMaxEdgesInSet(), moab::Intx2MeshInPlane::findNodes(), moab::IntxRllCssphere::findNodes(), moab::Intx2MeshOnSphere::findNodes(), intersect_meshes(), intersect_meshes_kdtree(), moab::Intx2MeshInPlane::setup_tgt_cell(), moab::IntxRllCssphere::setup_tgt_cell(), moab::Intx2MeshOnSphere::setup_tgt_cell(), and moab::Intx2MeshOnSphere::update_tracer_data().
EntityHandle moab::Intx2Mesh::mbs1 [protected] |
Definition at line 197 of file Intx2Mesh.hpp.
Referenced by createTags(), intersect_meshes(), and intersect_meshes_kdtree().
EntityHandle moab::Intx2Mesh::mbs2 [protected] |
Definition at line 198 of file Intx2Mesh.hpp.
Referenced by createTags(), intersect_meshes(), and intersect_meshes_kdtree().
unsigned int moab::Intx2Mesh::my_rank [protected] |
Definition at line 255 of file Intx2Mesh.hpp.
Referenced by moab::Intx2MeshOnSphere::findNodes(), intersect_meshes(), intersect_meshes_kdtree(), and moab::Intx2MeshOnSphere::update_tracer_data().
Tag moab::Intx2Mesh::neighTgtEdgeTag [protected] |
Definition at line 221 of file Intx2Mesh.hpp.
Referenced by createTags(), moab::Intx2MeshInPlane::findNodes(), moab::IntxRllCssphere::findNodes(), moab::Intx2MeshOnSphere::findNodes(), and intersect_meshes_kdtree().
Tag moab::Intx2Mesh::orgSendProcTag [protected] |
Definition at line 223 of file Intx2Mesh.hpp.
Referenced by moab::Intx2MeshOnSphere::findNodes().
EntityHandle moab::Intx2Mesh::outSet [protected] |
Definition at line 202 of file Intx2Mesh.hpp.
Referenced by moab::Intx2MeshInPlane::findNodes(), moab::IntxRllCssphere::findNodes(), moab::Intx2MeshOnSphere::findNodes(), intersect_meshes(), and intersect_meshes_kdtree().
Range moab::Intx2Mesh::rs1 [protected] |
Definition at line 199 of file Intx2Mesh.hpp.
Referenced by moab::Intx2MeshInPlane::findNodes(), moab::IntxRllCssphere::findNodes(), intersect_meshes(), intersect_meshes_kdtree(), and moab::Intx2MeshOnSphere::update_tracer_data().
Range moab::Intx2Mesh::rs2 [protected] |
Definition at line 200 of file Intx2Mesh.hpp.
Referenced by createTags(), moab::Intx2MeshInPlane::findNodes(), moab::IntxRllCssphere::findNodes(), intersect_meshes(), intersect_meshes_kdtree(), and moab::Intx2MeshOnSphere::update_tracer_data().
const EntityHandle* moab::Intx2Mesh::srcConn [protected] |
Definition at line 228 of file Intx2Mesh.hpp.
Referenced by moab::Intx2MeshInPlane::computeIntersectionBetweenTgtAndSrc(), moab::IntxRllCssphere::computeIntersectionBetweenTgtAndSrc(), moab::Intx2MeshOnSphere::computeIntersectionBetweenTgtAndSrc(), moab::Intx2MeshInPlane::findNodes(), moab::IntxRllCssphere::findNodes(), and moab::Intx2MeshOnSphere::findNodes().
CartVect moab::Intx2Mesh::srcCoords[MAXEDGES] [protected] |
Definition at line 230 of file Intx2Mesh.hpp.
Referenced by moab::Intx2MeshInPlane::computeIntersectionBetweenTgtAndSrc(), moab::IntxRllCssphere::computeIntersectionBetweenTgtAndSrc(), and moab::Intx2MeshOnSphere::computeIntersectionBetweenTgtAndSrc().
double moab::Intx2Mesh::srcCoords2D[MAXEDGES2] [protected] |
Definition at line 232 of file Intx2Mesh.hpp.
Referenced by moab::Intx2MeshInPlane::computeIntersectionBetweenTgtAndSrc(), moab::IntxRllCssphere::computeIntersectionBetweenTgtAndSrc(), moab::Intx2MeshOnSphere::computeIntersectionBetweenTgtAndSrc(), moab::Intx2MeshInPlane::findNodes(), moab::IntxRllCssphere::findNodes(), and moab::Intx2MeshOnSphere::findNodes().
Tag moab::Intx2Mesh::srcNeighTag [protected] |
Definition at line 216 of file Intx2Mesh.hpp.
Referenced by createTags(), and intersect_meshes().
Tag moab::Intx2Mesh::srcParentTag [protected] |
Definition at line 213 of file Intx2Mesh.hpp.
Referenced by createTags(), moab::Intx2MeshInPlane::findNodes(), moab::IntxRllCssphere::findNodes(), moab::Intx2MeshOnSphere::findNodes(), intersect_meshes_kdtree(), and moab::Intx2MeshOnSphere::update_tracer_data().
const EntityHandle* moab::Intx2Mesh::tgtConn [protected] |
for coverage mesh, will store the original sender
Definition at line 227 of file Intx2Mesh.hpp.
Referenced by createTags(), moab::Intx2MeshInPlane::findNodes(), moab::IntxRllCssphere::findNodes(), moab::Intx2MeshOnSphere::findNodes(), intersect_meshes_kdtree(), moab::Intx2MeshInPlane::setup_tgt_cell(), moab::IntxRllCssphere::setup_tgt_cell(), and moab::Intx2MeshOnSphere::setup_tgt_cell().
CartVect moab::Intx2Mesh::tgtCoords[MAXEDGES] [protected] |
Definition at line 229 of file Intx2Mesh.hpp.
Referenced by moab::Intx2MeshInPlane::computeIntersectionBetweenTgtAndSrc(), moab::IntxRllCssphere::computeIntersectionBetweenTgtAndSrc(), moab::Intx2MeshOnSphere::computeIntersectionBetweenTgtAndSrc(), moab::Intx2MeshInPlane::setup_tgt_cell(), moab::IntxRllCssphere::setup_tgt_cell(), and moab::Intx2MeshOnSphere::setup_tgt_cell().
double moab::Intx2Mesh::tgtCoords2D[MAXEDGES2] [protected] |
Definition at line 231 of file Intx2Mesh.hpp.
Referenced by moab::Intx2MeshInPlane::computeIntersectionBetweenTgtAndSrc(), moab::IntxRllCssphere::computeIntersectionBetweenTgtAndSrc(), moab::Intx2MeshOnSphere::computeIntersectionBetweenTgtAndSrc(), moab::Intx2MeshInPlane::findNodes(), moab::IntxRllCssphere::findNodes(), moab::Intx2MeshOnSphere::findNodes(), moab::Intx2MeshInPlane::setup_tgt_cell(), moab::IntxRllCssphere::setup_tgt_cell(), and moab::Intx2MeshOnSphere::setup_tgt_cell().
Range moab::Intx2Mesh::TgtEdges [protected] |
Definition at line 208 of file Intx2Mesh.hpp.
Referenced by clean(), createTags(), moab::Intx2MeshInPlane::findNodes(), moab::IntxRllCssphere::findNodes(), moab::Intx2MeshOnSphere::findNodes(), and intersect_meshes_kdtree().
Tag moab::Intx2Mesh::TgtFlagTag [protected] |
Definition at line 206 of file Intx2Mesh.hpp.
Referenced by clean(), createTags(), and intersect_meshes().
Tag moab::Intx2Mesh::tgtNeighTag [protected] |
Definition at line 218 of file Intx2Mesh.hpp.
Referenced by createTags(), and intersect_meshes().
Tag moab::Intx2Mesh::tgtParentTag [protected] |
Definition at line 212 of file Intx2Mesh.hpp.
Referenced by createTags(), moab::Intx2MeshInPlane::findNodes(), moab::IntxRllCssphere::findNodes(), moab::Intx2MeshOnSphere::findNodes(), intersect_meshes_kdtree(), and moab::Intx2MeshOnSphere::update_tracer_data().