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)