24 for (
const auto * el : bd_elements)
25 for (
unsigned int s = 0; s < el->n_sides(); ++s)
26 if (!el->neighbor_ptr(s))
32 std::vector<const Function *>
36 std::vector<const Function *> funcs;
37 funcs.reserve(function_names.size());
39 for (
const auto &
name : function_names)
42 if (!dynamic_cast<const MooseParsedFunction *>(func) &&
43 !dynamic_cast<const UnsignedDistanceToSurfaceMesh *>(func))
45 mooseError(
"SBM distance helpers only support ParsedFunction or " 46 "UnsignedDistanceToSurfaceMesh types. Offending function: ",
49 funcs.emplace_back(func);
58 mooseAssert(dynamic_cast<const MooseParsedFunction *>(func) ||
59 dynamic_cast<const UnsignedDistanceToSurfaceMesh *>(func),
60 "Function was not a valid distance strategy, the only " 61 "supported types are ParsedFunction and " 62 "UnsignedDistanceToSurfaceMesh.");
66 const Real grad_norm = grad_phi.
norm();
71 return -(phi / grad_norm) * grad_phi;
77 if (
const auto * parsed = dynamic_cast<const MooseParsedFunction *>(func))
81 const Real grad_norm = grad_phi.
norm();
84 return grad_phi / grad_norm;
89 mooseAssert(mesh_func,
"Function was not a valid distance strategy");
90 return mesh_func->surfaceNormal(pt);
99 Real min_dist = std::numeric_limits<Real>::max();
102 for (
const auto & func : funcs)
105 const auto dist = dist_vec.norm();
109 closest_dist_vec = dist_vec;
113 return closest_dist_vec;
121 Real min_dist = std::numeric_limits<Real>::max();
124 for (
const auto & func : funcs)
127 const auto dist = dist_vec.norm();
135 return closest_normal_vec;
Computes the unsigned distance to a surface mesh using KDTree nearest neighbor lookup from SBMSurface...
void mooseError(Args &&... args)
static constexpr Real TOLERANCE
RealVectorValue distanceVectorFromFunction(const Function *func, const libMesh::Point &pt, Real t)
Compute the distance vector induced by a distance function.
RealVectorValue trueNormalFromFunction(const Function *func, const libMesh::Point &pt, Real t)
Compute the true boundary surface normal using a distance function.
RealVectorValue closestDistanceVector(const std::vector< const Function *> &funcs, const libMesh::Point &pt, Real t)
Scan all distance functions and return the closest distance vector.
bool checkWatertightnessFromRawElems(const std::vector< const Elem *> &bd_elements)
RealVectorValue closestTrueNormalVector(const std::vector< const Function *> &funcs, const libMesh::Point &pt, Real t)
Scan all distance functions and return the corresponding normal vector.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const Function & getFunctionByName(const FunctionName &name) const
virtual RealGradient gradient(Real t, const Point &p) const
std::vector< const Function * > buildDistanceFunctions(const std::vector< FunctionName > &function_names, const FunctionInterface &function_provider)
Build a list of distance functions based on names specified in input.
virtual Real value(Real t, const Point &p) const