15 #include "libmesh/elem.h" 16 #include "libmesh/node.h" 17 #include "libmesh/mesh_base.h" 18 #include "libmesh/point_locator_base.h" 25 const unsigned int num_outputs,
26 const Real conformality_tol,
27 unsigned int & num_nonconformal_nodes)
29 num_nonconformal_nodes = 0;
30 auto pl =
mesh->sub_point_locator();
31 pl->set_close_to_point_tol(conformality_tol);
33 if (!
mesh->is_serial())
34 mooseError(
"Only serialized/replicated meshes are supported");
37 for (
auto & node :
mesh->node_ptr_range())
40 std::set<const Elem *> elements;
41 (*pl)(*node, elements);
44 for (
auto & elem : elements)
48 bool found_conformal =
false;
50 for (
auto & elem_node : elem->node_ref_range())
52 if (*node == elem_node)
54 found_conformal =
true;
60 num_nonconformal_nodes++;
61 if (num_nonconformal_nodes < num_outputs)
62 console <<
"Non-conformality detected at : " << *node << std::endl;
63 else if (num_nonconformal_nodes == num_outputs)
64 console <<
"Maximum output reached, log is silenced" << std::endl;
68 pl->unset_close_to_point_tol();
74 Point & intersection_point,
75 const Real intersection_tol)
78 mooseAssert(edge1.type() ==
EDGE2,
"Elements must be of type EDGE2");
79 mooseAssert(edge2.type() ==
EDGE2,
"Elements must be of type EDGE2");
81 const Point & p1 = edge1.point(0);
82 const Point & p2 = edge1.point(1);
83 const Point & p3 = edge2.point(0);
84 const Point & p4 = edge2.point(1);
87 if (p1 == p3 || p1 == p4 || p2 == p3 || p2 == p4)
95 const auto d1343 = (p1 - p3) * (p4 - p3);
96 const auto d4321 = (p4 - p3) * (p2 - p1);
97 const auto d1321 = (p1 - p3) * (p2 - p1);
98 const auto d4343 = (p4 - p3) * (p4 - p3);
99 const auto d2121 = (p2 - p1) * (p2 - p1);
101 const auto denominator = d2121 * d4343 - d4321 * d4321;
102 const auto numerator = d1343 * d4321 - d1321 * d4343;
104 if (std::fabs(denominator) < intersection_tol)
108 const auto mua = numerator / denominator;
109 const auto mub = (d1343 + (mua * d4321)) / d4343;
112 const auto pa = p1 + mua * (p2 - p1);
113 const auto pb = p3 + mub * (p4 - p3);
117 if (mua < 0 || mua > 1)
119 if (mub < 0 || mub > 1)
126 intersection_point = pa;
A helper class for re-directing output streams to Console output objects form MooseObjects.
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
bool checkFirstOrderEdgeOverlap(const Elem &edge1, const Elem &edge2, Point &intersection_point, const Real intersection_tol)
Real distance(const Point &p)
void checkNonConformalMesh(const std::unique_ptr< libMesh::MeshBase > &mesh, const ConsoleStream &console, const unsigned int num_outputs, const Real conformality_tol, unsigned int &num_nonconformal_nodes)