53 public CGAL::Kdtree_d<CGAL::Kdtree_interface<Point_3<Real> > >
55 typedef CGAL::Kdtree_d<CGAL::Kdtree_interface<Point_3<Real> > >
Base;
61 public CGAL::Kdtree_d<CGAL::Kdtree_interface<Point_3_ref > >
63 typedef CGAL::Kdtree_d<CGAL::Kdtree_interface<Point_3_ref > >
Base;
73 : _win(mesh->window()), _mani2(NULL),
76 _win->panes(
const_cast<std::vector<const COM::Pane*>&
>(
_panes));
81 : _win( mani2[0]->pane()->window()), _mani2(mani2),
84 _win->panes(
const_cast<std::vector<const COM::Pane*>&
>(
_panes));
88 std::vector<int> &nodes) {
90 const int s = bs.size();
91 for (
int i=0;
i<
s; ++
i)
92 if ( bs[
i]) nodes.push_back( i+1);
97 std::vector<int> &nodes,
98 std::vector<Point_3> &pnts,
101 for (
unsigned int i=0;
i<ns.size(); ++
i) count+=ns[
i].size();
104 nodes.clear(); nodes.reserve( count+2*ns.size());
105 pnts.clear(); pnts.reserve( count+2*ns.size());
108 nodes.push_back(
_panes[
i]->
id());
109 nodes.push_back( ns[
i].size());
111 nodes.insert( nodes.end(), ns[
i].begin(), ns[
i].end());
113 pnts.push_back(
Point_3(HUGE_VAL,HUGE_VAL,HUGE_VAL));
114 Point_3 &bnd_min = pnts.back();
115 pnts.push_back(
Point_3(-HUGE_VAL,-HUGE_VAL,-HUGE_VAL));
116 Point_3 &bnd_max = pnts.back();
119 const int d = attr->size_of_components();
121 for (std::vector<int>::const_iterator it=ns[
i].begin(),
iend=ns[
i].end();
127 for (
int k=0;
k<
d; ++
k)
128 p[
k] = *(
const double*)attr->get_addr( j,
k);
133 int vdst=(ene[eID.
lid()+1==ene.size_of_edges()?0:eID.
lid()+1]);
134 int j1=ene[eID.
lid()]-1, j2=vdst-1;
136 for (
int k=0;
k<
d; ++
k) {
137 p[
k] = 0.5*(*(
const double*)attr->get_addr( j1,
k) +
138 *(
const double*)attr->get_addr( j2,
k));
144 for (
int k=0;
k<3; ++
k) {
146 bnd_max[
k] =
std::max( bnd_max[k], p[k]);
154 std::vector<Point_3> &pnts) {
156 for (
unsigned int i=0;
i<ns.size(); ++
i) count+=ns[
i].size();
157 pnts.clear(); pnts.reserve( count);
161 const int d = attr->size_of_components();
163 for (std::vector<int>::const_iterator it=ns[
i].begin(),
iend=ns[
i].end();
167 for (
int k=0;
k<
d; ++
k)
168 p[
k] = *(
const double*)attr->get_addr( j,
k);
179 std::vector<Point_3> &pnts,
181 std::vector<bool> &is_co,
184 int n=pn.size_of_real_nodes();
185 is_co.clear(); is_co.resize( n,
false);
191 ktree_local.build( pnts);
196 std::vector< Point_3> outList; outList.reserve(4);
199 const COM::Attribute *attr = pn.attribute(
COM::COM_NC);
200 const int d = attr->size_of_components();
202 for (
int j=0;
j<
n; ++
j) {
204 for (
int k=0;
k<
d; ++
k)
205 q[
k] = *(
const double*)attr->get_addr(
j,
k);
209 KD_tree_3::Box
box( lb, ub, 3);
214 tree->search( std::back_inserter( outList), box);
216 if ( outList.size()) is_co[
j]=
true;
222 std::vector<Point_3> &pnts,
223 bool for_facet)
throw(
int) {
225 std::vector< std::vector<int> > ns(_panes.size());
226 std::vector< std::vector<int> > iso_ns(_panes.size());
228 double sql = HUGE_VAL;
230 for (
int i=0,
s=_panes.size();
i<
s; ++
i) {
231 std::vector<bool> is_border;
232 std::vector<bool> is_isolated;
233 std::vector<Facet_ID> facets;
245 iso_local += iso_ns[
i].size();
249 ns[
i].insert( ns[i].end(), (
int*)&*facets.begin(), (
int*)&*facets.end());
255 if ( _comm != MPI_COMM_NULL)
256 MPI_Allreduce( &sql, &g_sql, 1, MPI_DOUBLE,
MPI_MIN, _comm);
258 if ( g_sql==HUGE_VAL) g_sql=0;
262 std::vector<int> iso_counts;
265 int comm_size, comm_rank;
266 if ( _comm != MPI_COMM_NULL) {
267 MPI_Comm_size( _comm, &comm_size);
268 MPI_Comm_rank( _comm, &comm_rank);
270 iso_counts.resize(comm_size);
271 MPI_Allgather(&iso_local, 1, MPI_INT, &iso_counts[0], 1, MPI_INT, _comm);
274 for (
int i=0;
i<comm_size; ++
i) iso_local+=iso_counts[
i];
282 collect_points( iso_ns, pnts);
285 std::vector< Point_3> pnts_g( iso_local);
287 if ( _comm != MPI_COMM_NULL) {
288 for (
int i=0;
i<comm_size; ++
i)
291 std::vector<int> iso_disps(comm_size, 0);
292 for (
int i=1;
i<comm_size; ++
i)
293 iso_disps[
i]=iso_disps[
i-1]+iso_counts[
i-1];
295 MPI_Allgatherv( &pnts[0], iso_counts[comm_rank], MPI_DOUBLE,
296 &pnts_g[0], &iso_counts[0], &iso_disps[0],
302 if ( pnts_g.size()>0) {
305 ktree.build( pnts_g);
307 for (
int i=0, s=_panes.size();
i<
s; ++
i) {
308 std::vector<bool> is_co;
309 determine_coisolated_nodes( *_panes[
i], pnts_g, tol, is_co, &ktree);
316 for (
unsigned int i=0;
i<ns.size(); ++
i) {
317 std::vector<int> &nsi = ns[
i];
318 nsi.insert( ns[
i].end(), iso_ns[
i].begin(), iso_ns[
i].end());
321 std::sort(nsi.begin(), nsi.end());
322 std::vector<int>::iterator new_end=std::unique(nsi.begin(), nsi.end());
323 nsi.erase( new_end, nsi.end());
328 collect_nodes( ns, nodes, pnts, for_facet);
338 if ( nodes.empty())
return;
339 assert( nodes.size() == pnts.size());
340 std::vector< Point_3_ref> b; b.reserve( pnts.size());
343 unsigned int count = 0;
344 while (count<nodes.size()) {
345 bbox.push_back( pnts[count]);
346 bbox.push_back( pnts[++count]);
347 for (
int i=0,
n = nodes[count++];
i<
n; ++
i, ++count) {
359 if (bmax1.
x()+eps < bmin2.
x() || bmax2.
x()+eps < bmin1.
x())
361 if (bmax1.
y()+eps < bmin2.
y() || bmax2.
y()+eps < bmin1.
y())
363 if (bmax1.
z()+eps < bmin2.
z() || bmax2.
z()+eps < bmin1.
z())
371 for (
int i=0,
n=bbox.size();
i<
n;
i+=2) {
383 std::vector<int> &nodes,
385 unsigned int count = 0;
387 while (count<r_nodes.size()) {
388 const Point_3<Real> &xmin=r_pnts[count], &xmax=r_pnts[count+1];
391 { count += 2+r_nodes[count+1];
continue; }
392 int pane = r_nodes[count++];
395 for (
int i=0,
n = r_nodes[count++];
i<
n; ++
i, ++count) {
399 KD_tree_pntref_3::Box
box( lb, ub, 3);
401 std::vector< Point_3_ref> outList; outList.reserve(4);
402 ktree.search( std::back_inserter( outList), box);
403 if ( !outList.empty()) {
405 nodes.push_back( -pane);
407 pnts.push_back( xmin); pnts.push_back( xmax);
409 nodes.push_back( r_nodes[count]);
414 if ( nn>0) *(nodes.end()-nn-1) = nn;
434 std::vector<Point_3> &pnts,
435 bool for_facet)
throw(
int) {
437 double tol = get_local_boundary_nodes( nodes, pnts, for_facet);
438 if ( _comm == MPI_COMM_NULL)
return tol;
440 int comm_size, comm_rank;
441 MPI_Comm_size( _comm, &comm_size);
442 MPI_Comm_rank( _comm, &comm_rank);
445 int ns=nodes.size(); assert( pnts.size()==nodes.size());
446 std::vector<int> nss( comm_size);
448 MPI_Allgather( &ns, 1, MPI_INT, &nss[0], 1, MPI_INT, _comm);
450 std::vector<MPI_Request> reqs; reqs.reserve( (comm_size-1)*2);
452 std::vector<int> l_nodes = nodes;
453 std::vector<Point_3> l_pnts = pnts;
455 for (
int i=1;
i<comm_size; ++
i) {
456 const int to_rank = (comm_rank+
i)%comm_size;
458 MPI_Isend( &l_nodes[0], nodes.size(), MPI_INT, to_rank,
459 101, _comm, &req); reqs.push_back(req);
460 MPI_Isend( &l_pnts[0], 3*pnts.size(), MPI_DOUBLE, to_rank,
461 102, _comm, &req); reqs.push_back(req);
465 std::vector< Point_3> bbox;
466 std::vector< int> r_nodes, r_nodes_pre = nodes;
467 std::vector< Point_3> r_pnts, r_pnts_pre;
468 int from_rank_pre = comm_rank;
470 for (
int i=comm_size-1;
i>=1; --
i) {
471 MPI_Request l_reqs[2];
472 MPI_Status l_stats[2];
474 const int from_rank = (comm_rank+
i)%comm_size;
475 r_nodes.resize( nss[from_rank]);
476 r_pnts.resize( nss[from_rank]);
477 MPI_Irecv( &r_nodes[0], r_nodes.size(), MPI_INT, from_rank,
478 101, _comm, &l_reqs[0]);
479 MPI_Irecv( &r_pnts[0], 3*r_pnts.size(), MPI_DOUBLE, from_rank,
480 102, _comm, &l_reqs[1]);
483 if (
i==comm_size-1) {
490 MPI_Waitall( 2, l_reqs, l_stats);
491 r_nodes_pre.swap( r_nodes); r_pnts_pre.swap( r_pnts);
492 from_rank_pre = from_rank;
496 local_rtree, tol, nodes, pnts);
498 std::vector<MPI_Status> stat( reqs.size());
500 MPI_Waitall( reqs.size(), &reqs[0], &stat[0]);
514 bool for_facet)
throw(
int) {
516 typedef std::map< int, std::map< int, std::vector<pair_int> > > B2v_map;
526 std::vector<int> nodes, panes;
527 std::vector<Point_3> pnts;
531 double tol = collect_boundary_nodes( nodes, pnts, for_facet);
533 panes.resize( nodes.size());
534 for (
unsigned int count=0; count<nodes.size(); count+=nodes[count+1]+2) {
535 std::fill( &panes[count], &panes[count+nodes[count+1]+2], nodes[count]);
538 std::vector< Point_3> bbox;
542 std::vector< bool> processed(nodes.size());
543 std::fill_n( processed.begin(), nodes.size(),
false);
545 unsigned int count = 0;
546 while (count<nodes.size()) {
547 int paneid = nodes[count++];
552 for (
int i=0,
n=nodes[count++];
i<
n; ++
i, ++count) {
553 if ( processed[count])
continue;
555 const Point_3 &p = pnts[count];
558 KD_tree_pntref_3::Box
box( lb, ub, 3);
560 std::vector< Point_3_ref> outList; outList.reserve(4);
561 ktree.search( std::back_inserter( outList), box);
562 assert( !outList.empty());
564 std::vector< Node_ID> ids; ids.reserve( outList.size());
565 for ( std::vector< Point_3_ref>::iterator
566 i=outList.begin();
i!=outList.end(); ++
i) {
568 processed[
offset] =
true;
569 ids.push_back(
Node_ID( panes[offset],nodes[offset]));
572 std::vector< Node_ID >::const_iterator id1=ids.begin();
573 for ( id1=ids.begin(); id1!=ids.end(); ++id1) {
574 std::vector< Node_ID >::const_iterator id2=id1; ++id2;
576 for ( ; id2!=ids.end(); ++id2) {
577 if (
abs(id1->first) <
abs(id2->first) ||
578 abs(id1->first) ==
abs(id2->first) &&
579 id1->second < id2->second)
580 b2v_map[id1->first][id2->first].
581 push_back(
pair_int(id1->second, id2->second));
583 b2v_map[id2->first][id1->first].
584 push_back(
pair_int(id2->second, id1->second));
595 std::map<int, std::vector<int> > b2v_t;
596 B2v_map::iterator
i,
iend;
597 for ( i=b2v_map.begin(), iend=b2v_map.end(); i!=
iend; ++
i) {
599 std::map<int,int> branchcut;
601 B2v_map::mapped_type::iterator
j,
jend;
602 for ( j=i->second.begin(), jend=i->second.end(); j!=
jend; ++
j) {
609 std::sort( j->second.begin(), j->second.end());
610 if ( i->first == j->first) {
613 std::vector< int> &b2v_i = b2v_t[i->first];
614 b2v_i.push_back( j->first);
615 b2v_i.push_back( j->second.size()*2);
617 B2v_map::mapped_type::mapped_type::const_iterator
k, kend;
618 for ( k=j->second.begin(), kend=j->second.end(); k!=kend; ++
k) {
619 b2v_i.push_back( k->first);
620 b2v_i.push_back( k->second);
621 branchcut[k->first] = k->second;
626 std::vector< int> &b2v_i = b2v_t[i->first];
627 b2v_i.push_back(
std::abs(j->first));
628 b2v_i.push_back( j->second.size());
630 B2v_map::mapped_type::mapped_type::const_iterator
k, kend;
631 for ( k=j->second.begin(), kend=j->second.end(); k!=kend; ++
k)
632 b2v_i.push_back( k->first);
635 std::vector< int> &b2v_j = b2v_t[j->first];
636 b2v_j.push_back(
std::abs(i->first));
637 b2v_j.push_back( j->second.size());
639 B2v_map::mapped_type::mapped_type::const_iterator
k, kend;
640 for ( k=j->second.begin(), kend=j->second.end(); k!=kend; ++
k)
641 b2v_j.push_back( k->second);
646 if ( !branchcut.empty()) {
647 if ( _win->pane(i->first).is_structured())
648 std::cerr <<
"\nRocmap Info: Got a branchcut in pane "
649 << i->first <<
" of window " << _win->name() << std::endl;
651 std::cerr <<
"\nRocmap Warning: Got duplicate nodes within pane "
652 << i->first <<
" of window " << _win->name() << std::endl;
653 while ( !branchcut.empty()) {
654 std::map<int,int>::iterator it=branchcut.begin();
656 std::cerr <<
"Rocmap Warning: Duplicate nodes " << it->first
657 <<
" and " << it->second << std::endl;
668 b2v.resize(_panes.size());
669 Pane_set::const_iterator it=_panes.begin();
670 for (
int i=0,
s=_panes.size(); i<
s; ++
i, ++it) {
671 b2v[
i].swap( b2v_t[(*it)->id()]);
677 bool for_facet)
throw(
int)
679 std::vector< std::vector<int> > b2v;
681 create_b2map( b2v, for_facet);
684 for (
int i=0,
n=b2v.size();
i!=
n; ++
i) {
685 COM::Attribute *attr;
686 attr =
const_cast<COM::Attribute*
>(_panes[
i]->attribute( pconn->id()));
688 int size = b2v[
i].size() + _pconn_offset;
689 attr->set_size( size);
693 if ( !attr->initialized())
694 addr = (
int*)attr->allocate( 1, size,
false);
696 addr = (
int*)attr->pointer();
698 int cap = attr->capacity();
700 int j=0,len=b2v[
i].size();
701 for(; j+1<len; j+=2+(b2v[
i])[j+1]){
708 if (_pconn_offset && cap >= 1){
718 COM::Attribute *pconn_f)
throw(
int) {
719 if ( pconn_n) create_b2map( pconn_n,
false);
720 if ( pconn_f) create_b2map( pconn_f,
true);
725 int *npanes_total,
int *npanes_ghost){
726 const COM::Window *win = pconn->window();
727 const COM::Attribute *pconn_pn;
728 pconn_pn = pconn->window()->pane( *pane_id).attribute( pconn->id());
731 const int *tmp_ptr = (
const int *)pconn_pn->pointer();
732 const int *ptr_pconn = tmp_ptr ? tmp_ptr+
_pconn_offset : tmp_ptr;
733 const int len_real = ptr_pconn ? pconn_pn->size_of_real_items()-
_pconn_offset : 0;
734 const int len_total = ptr_pconn ? pconn_pn->size_of_items()-
_pconn_offset : 0;
737 "Invalid NULL pointer for argument npanes_total");
741 for ( ; i+1<len_real; i+=2+ptr_pconn[i+1]) {
743 *npanes_total += win->owner_rank( ptr_pconn[i])>=0;
747 for ( ; i+1<len_total; i+=2+ptr_pconn[i+1]) {
749 *npanes_total += win->owner_rank( ptr_pconn[i])>=0;
755 for ( i=len_real; i+1<len_total; i+=2+ptr_pconn[i+1])
756 *npanes_ghost += win->owner_rank( ptr_pconn[i])>=0;
763 const COM::Window *win = pconn->window();
767 std::vector<const COM::Pane*> panes; win->panes(panes);
768 for (
int p=0, np=panes.size(); p<np; ++p) {
769 const COM::Attribute *pconn_pn = panes[p]->attribute( pconn->id());
772 const int *pconn_ptr = (
const int *)pconn_pn->pointer();
774 if ( pconn_ptr==NULL)
continue;
776 const int len_total = pconn_pn->size_of_items()-
_pconn_offset;
778 const int len_ghost = pconn_ptr ? pconn_pn->size_of_ghost_items() : 0;
779 if ( len_ghost == 0) { nblocks =
std::max( nblocks, 1);
continue; }
784 int index=1, ncpanes=pconn_ptr[0];
785 for (
int i=1;
i<=ncpanes; ++
i, index+=pconn_ptr[index+1]+2);
787 ncpanes=pconn_ptr[index++];
788 for (
int i=1;
i<=ncpanes; ++
i, index+=pconn_ptr[index+1]+2);
790 nblocks =
std::max( nblocks, 2+(index<len_ghost));
795 int nblocks_local = nblocks;
796 MPI_Allreduce( &nblocks_local, &nblocks, 1, MPI_INT,
MPI_MAX,
797 win->get_communicator());
std::pair< int, int > Node_ID
#define MAP_END_NAMESPACE
#define COM_assertion(EX)
Error checking utility similar to the assert macro of the C language.
Utility for constructing pane connectivities in parallel.
void create_b2map(COM::Attribute *pconn, bool for_facet)
Create b2v mapping (pane connectivity) for nodes or edges and store the solution into the given Rocco...
static void convert_nodelist(const std::vector< bool > &bs, std::vector< int > &nodes)
void determine_coisolated_nodes(const COM::Pane &pn, std::vector< Point_3 > &pnts, const double tol, std::vector< bool > &is_co, KD_tree_3 *tree=NULL)
An adaptor for enumerating node IDs of an element.
void collect_nodes(const std::vector< std::vector< int > > &ns, std::vector< int > &nodes, std::vector< Point_3 > &pnts, bool for_facet)
here we put it at the!beginning of the common block The point to point and collective!routines know about but MPI_TYPE_STRUCT as yet does not!MPI_STATUS_IGNORE and MPI_STATUSES_IGNORE are similar objects!Until the underlying MPI library implements the C version of these are declared as arrays of MPI_STATUS_SIZE!The types and are OPTIONAL!Their values are zero if they are not available Note that!using these reduces the portability of MPI_IO INTEGER MPI_BOTTOM INTEGER MPI_DOUBLE_PRECISION INTEGER MPI_LOGICAL INTEGER MPI_2REAL INTEGER MPI_2DOUBLE_COMPLEX INTEGER MPI_LB INTEGER MPI_WTIME_IS_GLOBAL INTEGER MPI_GROUP_EMPTY INTEGER MPI_MAX
#define COM_assertion_msg(EX, msg)
Vector_n max(const Array_n_const &v1, const Array_n_const &v2)
char lid() const
Local edge ID of the halfedge within its element.
void compute_pconn(COM::Attribute *pconn_n, COM::Attribute *pconn_f=NULL)
Create b2v mapping for nodes and facets (edges or faces) correspondence.
here we put it at the!beginning of the common block The point to point and collective!routines know about but MPI_TYPE_STRUCT as yet does not!MPI_STATUS_IGNORE and MPI_STATUSES_IGNORE are similar objects!Until the underlying MPI library implements the C version of these are declared as arrays of MPI_STATUS_SIZE!The types and are OPTIONAL!Their values are zero if they are not available Note that!using these reduces the portability of MPI_IO INTEGER MPI_BOTTOM INTEGER MPI_DOUBLE_PRECISION INTEGER MPI_LOGICAL INTEGER MPI_2REAL INTEGER MPI_2DOUBLE_COMPLEX INTEGER MPI_LB INTEGER MPI_WTIME_IS_GLOBAL INTEGER MPI_GROUP_EMPTY INTEGER MPI_MIN
std::pair< int, int > pair_int
real *8 function offset(vNorm, x2, y2, z2)
void collect_points(const std::vector< std::vector< int > > &ns, std::vector< Point_3 > &pnts)
int eid() const
Element ID of the halfedge.
void determine_border_nodes(std::vector< bool > &is_border, std::vector< bool > &is_isolated, std::vector< Facet_ID > *b=NULL, int ghost_level=0)
Determine the border nodes (excluding isolated nodes)
static const int _pconn_offset
*********************************************************************Illinois Open Source License ****University of Illinois NCSA **Open Source License University of Illinois All rights reserved ****Developed free of to any person **obtaining a copy of this software and associated documentation to deal with the Software without including without limitation the rights to ** copy
MAP::Point_3< double > Point_3
double collect_boundary_nodes(std::vector< int > &nodes, std::vector< Point_3 > &pnts, bool for_facet)
Collect the boundary nodes of all panes that are coincident with the boundary nodes of local panes...
**********************************************************************Rocstar Simulation Suite Illinois Rocstar LLC All rights reserved ****Illinois Rocstar LLC IL **www illinoisrocstar com **sales illinoisrocstar com WITHOUT WARRANTY OF ANY **EXPRESS OR INCLUDING BUT NOT LIMITED TO THE WARRANTIES **OF FITNESS FOR A PARTICULAR PURPOSE AND **NONINFRINGEMENT IN NO EVENT SHALL THE CONTRIBUTORS OR **COPYRIGHT HOLDERS BE LIABLE FOR ANY DAMAGES OR OTHER WHETHER IN AN ACTION OF TORT OR **Arising OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE **USE OR OTHER DEALINGS WITH THE SOFTWARE **********************************************************************INTERFACE SUBROUTINE knode iend
Provides a data structure accessing nodes, elements, and edges in a pane, in a manner similar to the ...
const COM::Window *const _win
static void make_kd_tree(const std::vector< int > &nodes, const std::vector< Point_3< Real > > &pnts, std::vector< Point_3< Real > > &bbox, KD_tree_pntref_3 &ktree)
Vector_n min(const Array_n_const &v1, const Array_n_const &v2)
static void collect_coincident_nodes(const std::vector< int > &r_nodes, const std::vector< Point_3< Real > > &r_pnts, const std::vector< Point_3< Real > > &bbox, KD_tree_pntref_3 &ktree, double tol, std::vector< int > &nodes, std::vector< Point_3< Real > > &pnts)
**********************************************************************Rocstar Simulation Suite Illinois Rocstar LLC All rights reserved ****Illinois Rocstar LLC IL **www illinoisrocstar com **sales illinoisrocstar com WITHOUT WARRANTY OF ANY **EXPRESS OR INCLUDING BUT NOT LIMITED TO THE WARRANTIES **OF FITNESS FOR A PARTICULAR PURPOSE AND **NONINFRINGEMENT IN NO EVENT SHALL THE CONTRIBUTORS OR **COPYRIGHT HOLDERS BE LIABLE FOR ANY DAMAGES OR OTHER WHETHER IN AN ACTION OF TORT OR **Arising OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE **USE OR OTHER DEALINGS WITH THE SOFTWARE **********************************************************************INTERFACE SUBROUTINE knode jend
Pane_connectivity(const COM::Attribute *mesh, MPI_Comm c=MPI_COMM_WORLD)
Constructors.
double get_local_boundary_nodes(std::vector< int > &nodes, std::vector< Point_3 > &pnts, bool for_facet)
Obtains the IDs and coordinates of boundary nodes of all local panes.
CGAL::Kdtree_d< CGAL::Kdtree_interface< Point_3_ref > > Base
The ID of a facet (edge in 2D and face in 3D) encodes an element ID and the local facet's ID internal...
Point_3_ref(const Point_3< Real > &r, int k)
#define MAP_BEGIN_NAMESPACE
double min_squared_edge_len(const std::vector< Facet_ID > &)
Compute the minimum squared edge length of given edges.
CGAL::Kdtree_d< CGAL::Kdtree_interface< Point_3< Real > > > Base
static void size_of_cpanes(const COM::Attribute *pconn, const int *pane_id, int *npanes_total, int *npanes_ghost=NULL)
Get the number of communicating panes.
static int pconn_nblocks(const COM::Attribute *pconn)
Determine the number of pconn blocks for all panes.
Utility for detecting boundaries of a pane.
static bool intersect_bbox(const Point_3< Real > &bmin1, const Point_3< Real > &bmax1, const Point_3< Real > &bmin2, const Point_3< Real > &bmax2, Real eps)
Point_3_ref(Real x, Real y, Real z)