17 m_TET_edges.resize(6,std::vector<unsigned int>(2,0));
21 m_HEX_edges.resize(12,std::vector<unsigned int>(2,0));
85 std::vector<ExactPoint_3> & elem_C_points,
86 std::vector<std::vector<unsigned int> > & elem_C_tetras,
87 std::vector<std::vector<unsigned int> > & elem_C_triangles,
88 std::vector<ExactPoint_3> & elem_D_points,
89 std::vector<std::vector<unsigned int> > & elem_D_tetras,
90 std::vector<std::vector<unsigned int> > & elem_D_triangles)
92 bool bElemIntersect =
false;
95 for(
unsigned int jjj = 0; jjj < elem_D_triangles.size(); ++jjj)
97 std::vector<unsigned int> & work_triangle = elem_D_triangles[jjj];
99 elem_D_points[work_triangle[1]],
100 elem_D_points[work_triangle[2]]);
102 for(
unsigned int iii = 0; iii < elem_C_tetras.size(); ++iii)
104 std::vector<unsigned int> & work_tetra = elem_C_tetras[iii];
106 elem_C_points[work_tetra[1]],
107 elem_C_points[work_tetra[2]],
108 elem_C_points[work_tetra[3]]);
129 for(
unsigned int jjj = 0; jjj < elem_C_triangles.size(); ++jjj)
131 std::vector<unsigned int> & work_triangle = elem_C_triangles[jjj];
133 elem_C_points[work_triangle[1]],
134 elem_C_points[work_triangle[2]]);
136 for(
unsigned int iii = 0; iii < elem_D_tetras.size(); ++iii)
138 std::vector<unsigned int> & work_tetra = elem_D_tetras.at(iii);
140 elem_D_points[work_tetra[1]],
141 elem_D_points[work_tetra[2]],
142 elem_D_points[work_tetra[3]]);
160 return bElemIntersect;
164 const libMesh::Elem * Query_elem,
165 std::unique_ptr<libMesh::PointLocatorBase> & point_locator,
166 bool bGuaranteeQueryIsInMesh)
168 libMesh::PointLocatorBase& locator = *point_locator.get();
169 if(!bGuaranteeQueryIsInMesh)
177 unsigned int elem_nb_nodes = Query_elem->n_nodes();
178 libMesh::Point dummyPoint;
179 bool bInsideTheMesh =
true;
182 for(
unsigned int iii = 0; iii < elem_nb_nodes; ++iii)
184 dummyPoint = Query_elem->point(iii);
185 const libMesh::Elem * Patch_elem = locator(Query_elem->point(iii));
187 if(Patch_elem == NULL)
189 bInsideTheMesh =
false;
197 return locator(Query_elem->point(0));
201 const libMesh::Elem * Query_elem,
202 std::unique_ptr<libMesh::PointLocatorBase> & point_locator,
203 std::set<unsigned int> & Intersecting_elems)
205 libMesh::PointLocatorBase& locator = *point_locator.get();
208 Intersecting_elems.clear();
211 unsigned int elem_nb_nodes = Query_elem->n_nodes();
212 libMesh::Point dummyPoint;
217 for(
unsigned int iii = 0; iii < elem_nb_nodes; ++iii)
219 dummyPoint = Query_elem->point(iii);
220 const libMesh::Elem * Patch_elem = locator(Query_elem->point(iii));
222 if(Patch_elem != NULL)
224 Intersecting_elems.insert(Patch_elem->id());
229 return nbOfInters != 0;
233 const libMesh::Elem * elem_A,
234 const libMesh::Elem * elem_B)
237 bool bBboxIntersect =
false;
238 bool bElemIntersect =
false;
240 unsigned int n_nodes_A = elem_A->n_nodes();
241 unsigned int n_nodes_B = elem_B->n_nodes();
248 std::vector<ExactPoint_3>::const_iterator exact_points_A_begin =
m_exact_points_A.begin();
249 std::vector<ExactPoint_3>::const_iterator exact_points_B_begin =
m_exact_points_B.begin();
251 Bbox_3 exact_bbox_A = CGAL::bbox_3(exact_points_A_begin,exact_points_A_begin + n_nodes_A);
252 Bbox_3 exact_bbox_B = CGAL::bbox_3(exact_points_B_begin,exact_points_B_begin + n_nodes_B);
254 bBboxIntersect = CGAL::do_intersect(exact_bbox_A,exact_bbox_B);
261 std::vector<std::vector<unsigned int> > * elem_A_tetras = NULL;
262 std::vector<std::vector<unsigned int> > * elem_A_triangles = NULL;
264 std::vector<std::vector<unsigned int> > * elem_B_tetras = NULL;
265 std::vector<std::vector<unsigned int> > * elem_B_triangles = NULL;
267 if(elem_A->type() == libMesh::TET4)
273 else if(elem_A->type() == libMesh::HEX8)
284 if(elem_B->type() == libMesh::TET4)
290 else if(elem_B->type() == libMesh::HEX8)
306 bElemIntersect =
false;
309 return bElemIntersect;
313 const libMesh::Elem * elem_B,
314 std::set<Point_3> & points_out,
315 bool bCreateNewNefForA,
319 bool bElemIntersect =
true;
324 m_perf_log.push(
"Test intersection",
"Exact intersection construction");
326 m_perf_log.pop(
"Test intersection",
"Exact intersection construction");
328 else if(bConvertPoints)
332 m_perf_log.push(
"Point conversion to exact",
"Exact intersection construction");
333 if(bCreateNewNefForA)
338 m_perf_log.pop(
"Point conversion to exact",
"Exact intersection construction");
344 unsigned int n_nodes_A = elem_A->n_nodes();
345 unsigned int n_nodes_B = elem_B->n_nodes();
347 std::vector<ExactPoint_3>::const_iterator exact_points_A_begin =
m_exact_points_A.begin();
348 std::vector<ExactPoint_3>::const_iterator exact_points_B_begin =
m_exact_points_B.begin();
350 m_perf_log.push(
"Nef polyhedron construction",
"Exact intersection construction");
351 if(bCreateNewNefForA)
354 exact_points_A_begin + n_nodes_A,
363 exact_points_B_begin + n_nodes_B,
366 m_perf_log.pop(
"Nef polyhedron construction",
"Exact intersection construction");
369 m_perf_log.push(
"Nef polyhedron intersection",
"Exact intersection construction");
371 m_perf_log.pop(
"Nef polyhedron intersection",
"Exact intersection construction");
373 m_perf_log.push(
"Point set output",
"Exact intersection construction");
377 bElemIntersect =
true;
380 for(Nef_Polyhedron::Vertex_const_iterator it_vertex =
m_nef_I.vertices_begin();
381 it_vertex !=
m_nef_I.vertices_end();
389 bElemIntersect =
false;
391 m_perf_log.pop(
"Point set output",
"Exact intersection construction");
394 return bElemIntersect;
398 const libMesh::Elem * elem_B,
399 bool bCreateNewNefForA)
401 bool bElemIntersect =
true;
413 unsigned int n_nodes_A = elem_A->n_nodes();
414 unsigned int n_nodes_B = elem_B->n_nodes();
416 std::vector<ExactPoint_3>::const_iterator exact_points_A_begin =
m_exact_points_A.begin();
417 std::vector<ExactPoint_3>::const_iterator exact_points_B_begin =
m_exact_points_B.begin();
419 if(bCreateNewNefForA)
423 exact_points_A_begin + n_nodes_A,
432 exact_points_B_begin + n_nodes_B,
441 bElemIntersect =
true;
445 bElemIntersect =
false;
449 return bElemIntersect;
453 const libMesh::Elem * elem_B,
454 std::set<libMesh::Point> & points_out,
455 bool bCreateNewNefForA,
459 bool bElemIntersect =
true;
466 libMesh::Point dummy_libMesh_point;
468 std::vector<double> bbox_dims(6,0);
469 double inter_vol = 0;
474 m_perf_log.push(
"Test intersection",
"Exact intersection construction inside coupling");
476 m_perf_log.pop(
"Test intersection",
"Exact intersection construction inside coupling");
478 else if(bConvertPoints)
482 m_perf_log.push(
"Point conversion to exact",
"Exact intersection construction inside coupling");
485 m_perf_log.pop(
"Point conversion to exact",
"Exact intersection construction inside coupling");
491 unsigned int n_nodes_A = elem_A->n_nodes();
492 unsigned int n_nodes_B = elem_B->n_nodes();
494 std::vector<ExactPoint_3>::const_iterator exact_points_A_begin =
m_exact_points_A.begin();
495 std::vector<ExactPoint_3>::const_iterator exact_points_B_begin =
m_exact_points_B.begin();
497 m_perf_log.push(
"Nef polyhedron construction",
"Exact intersection construction inside coupling");
498 if(bCreateNewNefForA)
502 exact_points_A_begin + n_nodes_A,
512 exact_points_B_begin + n_nodes_B,
514 m_perf_log.pop(
"Nef polyhedron construction",
"Exact intersection construction inside coupling");
517 m_perf_log.push(
"Nef polyhedron intersection",
"Exact intersection construction inside coupling");
521 m_perf_log.pop(
"Nef polyhedron intersection",
"Exact intersection construction inside coupling");
523 m_perf_log.push(
"Point set output",
"Exact intersection construction inside coupling");
526 m_nef_I.number_of_volumes() > 1 &&
527 m_nef_I.number_of_vertices() > 3 &&
528 m_nef_I.number_of_facets() > 1)
532 bElemIntersect =
true;
534 for(Nef_Polyhedron::Vertex_const_iterator it_vertex =
m_nef_I.vertices_begin();
535 it_vertex !=
m_nef_I.vertices_end();
539 points_out.insert(libMesh::Point(dummy_CGAL_point.x(),dummy_CGAL_point.y(),dummy_CGAL_point.z()));
545 std::set<libMesh::Point>::const_iterator it_set = points_out.begin();
546 dummy_libMesh_point = *it_set;
548 bbox_dims[0] = dummy_libMesh_point(0);
549 bbox_dims[1] = dummy_libMesh_point(0);
550 bbox_dims[2] = dummy_libMesh_point(1);
551 bbox_dims[3] = dummy_libMesh_point(1);
552 bbox_dims[4] = dummy_libMesh_point(2);
553 bbox_dims[5] = dummy_libMesh_point(2);
556 for(; it_set != points_out.end(); ++it_set)
558 dummy_libMesh_point = *it_set;
559 if(bbox_dims[0] > dummy_libMesh_point(0))
560 bbox_dims[0] = dummy_libMesh_point(0);
561 if(bbox_dims[1] < dummy_libMesh_point(0))
562 bbox_dims[1] = dummy_libMesh_point(0);
563 if(bbox_dims[2] > dummy_libMesh_point(1))
564 bbox_dims[2] = dummy_libMesh_point(1);
565 if(bbox_dims[3] < dummy_libMesh_point(1))
566 bbox_dims[3] = dummy_libMesh_point(1);
567 if(bbox_dims[4] > dummy_libMesh_point(2))
568 bbox_dims[4] = dummy_libMesh_point(2);
569 if(bbox_dims[5] < dummy_libMesh_point(2))
570 bbox_dims[5] = dummy_libMesh_point(2);
576 inter_vol = std::abs((bbox_dims[1] - bbox_dims[0]) * (bbox_dims[3] - bbox_dims[2]) * (bbox_dims[5] - bbox_dims[4]));
581 bElemIntersect =
false;
583 std::set<libMesh::Point>::const_iterator it_set = points_out.begin();
585 for(; it_set != points_out.end(); ++it_set)
595 bElemIntersect =
false;
598 m_perf_log.pop(
"Point set output",
"Exact intersection construction inside coupling");
601 return bElemIntersect;
606 unsigned int n_nodes_C = elem_C->n_nodes();
612 std::vector<ExactPoint_3>::const_iterator exact_points_C_begin =
m_exact_points_C.begin();
614 exact_points_C_begin + n_nodes_C,
618 if(elem_C->type() == libMesh::TET4)
624 else if(elem_C->type() == libMesh::HEX8)
637 std::vector<ExactPoint_3> & points_output)
639 libMesh::Point dummyPoint;
640 for(
unsigned int iii = 0; iii < elem_input->n_nodes(); ++iii)
642 dummyPoint = elem_input->point(iii);
650 std::vector<ExactPoint_3>::const_iterator it_end,
ExactKernel::Triangle_3 ExactTriangle_3
CGAL::Nef_polyhedron_3< ExactKernel, CGAL::SNC_indexed_items > Nef_Polyhedron
CGAL::Tetrahedron_3< ExactKernel > ExactTetrahedron
ExactKernel::Point_3 ExactPoint_3