https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Functions
SBMUtils Namespace Reference

Functions

bool checkWatertightnessFromRawElems (const std::vector< const Elem * > &bd_elements)
 
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.
 
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.
 
RealVectorValue closestTrueNormalVector (const std::vector< const Function * > &funcs, const libMesh::Point &pt, Real t)
 Scan all distance functions and return the corresponding normal vector.
 

Function Documentation

◆ buildDistanceFunctions()

std::vector< const Function * > SBMUtils::buildDistanceFunctions ( const std::vector< FunctionName > &  function_names,
const FunctionInterface function_provider 
)

Build a list of distance functions based on names specified in input.

Definition at line 33 of file SBMUtils.C.

35{
36 std::vector<const Function *> funcs;
37 funcs.reserve(function_names.size());
38
39 for (const auto & name : function_names)
40 {
41 const Function * func = &function_provider.getFunctionByName(name);
42 if (!dynamic_cast<const MooseParsedFunction *>(func) &&
43 !dynamic_cast<const UnsignedDistanceToSurfaceMesh *>(func))
44 {
45 mooseError("SBM distance helpers only support ParsedFunction or "
46 "UnsignedDistanceToSurfaceMesh types. Offending function: ",
47 name);
48 }
49 funcs.emplace_back(func);
50 }
51
52 return funcs;
53}
void mooseError(Args &&... args)
const std::string name
Definition Setup.h:21
const Function & getFunctionByName(const FunctionName &name) const
Computes the unsigned distance to a surface mesh using KDTree nearest neighbor lookup from SBMSurface...

Referenced by ShortestDistanceToSurface::ShortestDistanceToSurface().

◆ checkWatertightnessFromRawElems()

bool SBMUtils::checkWatertightnessFromRawElems ( const std::vector< const Elem * > &  bd_elements)

Definition at line 22 of file SBMUtils.C.

23{
24 for (const auto * el : bd_elements)
25 for (unsigned int s = 0; s < el->n_sides(); ++s)
26 if (!el->neighbor_ptr(s))
27 return false;
28
29 return true;
30}
for(PetscInt i=0;i< nvars;++i)
void ErrorVector unsigned int

Referenced by SBMSurfaceMeshBuilder::checkWatertightness(), TEST(), and TEST().

◆ closestDistanceVector()

RealVectorValue SBMUtils::closestDistanceVector ( const std::vector< const Function * > &  funcs,
const libMesh::Point pt,
Real  t 
)

Scan all distance functions and return the closest distance vector.

Definition at line 95 of file SBMUtils.C.

98{
99 Real min_dist = std::numeric_limits<Real>::max();
100 RealVectorValue closest_dist_vec;
101
102 for (const auto & func : funcs)
103 {
104 const auto dist_vec = distanceVectorFromFunction(func, pt, t);
105 const auto dist = dist_vec.norm();
106 if (dist < min_dist)
107 {
108 min_dist = dist;
109 closest_dist_vec = dist_vec;
110 }
111 }
112
113 return closest_dist_vec;
114}
RealVectorValue distanceVectorFromFunction(const Function *func, const libMesh::Point &pt, Real t)
Compute the distance vector induced by a distance function.
Definition SBMUtils.C:56

Referenced by ShortestDistanceToSurface::distanceVector().

◆ closestTrueNormalVector()

RealVectorValue SBMUtils::closestTrueNormalVector ( const std::vector< const Function * > &  funcs,
const libMesh::Point pt,
Real  t 
)

Scan all distance functions and return the corresponding normal vector.

Definition at line 117 of file SBMUtils.C.

120{
121 Real min_dist = std::numeric_limits<Real>::max();
122 RealVectorValue closest_normal_vec;
123
124 for (const auto & func : funcs)
125 {
126 const auto dist_vec = distanceVectorFromFunction(func, pt, t);
127 const auto dist = dist_vec.norm();
128 if (dist < min_dist)
129 {
130 min_dist = dist;
131 closest_normal_vec = trueNormalFromFunction(func, pt, t);
132 }
133 }
134
135 return closest_normal_vec;
136}
RealVectorValue trueNormalFromFunction(const Function *func, const libMesh::Point &pt, Real t)
Compute the true boundary surface normal using a distance function.
Definition SBMUtils.C:75

Referenced by ShortestDistanceToSurface::trueNormal().

◆ distanceVectorFromFunction()

RealVectorValue SBMUtils::distanceVectorFromFunction ( const Function func,
const libMesh::Point pt,
Real  t 
)

Compute the distance vector induced by a distance function.

The provided function must represent a distance to the true boundary: either a signed distance function (ParsedFunction) or an unsigned distance function provided by UnsignedDistanceToSurfaceMesh.

Definition at line 56 of file SBMUtils.C.

57{
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.");
63
64 const Real phi = func->value(t, pt);
65 const RealVectorValue grad_phi = func->gradient(t, pt);
66 const Real grad_norm = grad_phi.norm();
67
68 if (grad_norm <= libMesh::TOLERANCE)
69 return RealVectorValue(0.0, 0.0, 0.0);
70
71 return -(phi / grad_norm) * grad_phi;
72}
virtual RealGradient gradient(Real t, const Point &p) const
virtual Real value(Real t, const Point &p) const
static constexpr Real TOLERANCE

Referenced by closestDistanceVector(), closestTrueNormalVector(), ShortestDistanceToSurface::distanceVectorByFunc(), ShortestDistanceToSurface::distanceVectorByIndex(), and trueNormalFromFunction().

◆ trueNormalFromFunction()

RealVectorValue SBMUtils::trueNormalFromFunction ( const Function func,
const libMesh::Point pt,
Real  t 
)

Compute the true boundary surface normal using a distance function.

The query point is first projected onto the true boundary, and the surface normal of the boundary is then evaluated at the projected (closest) point.

Definition at line 75 of file SBMUtils.C.

76{
77 if (const auto * parsed = dynamic_cast<const MooseParsedFunction *>(func))
78 {
79 const auto proj_pt = pt + distanceVectorFromFunction(func, pt, t);
80 const RealVectorValue grad_phi = parsed->gradient(t, proj_pt);
81 const Real grad_norm = grad_phi.norm();
82 if (grad_norm <= libMesh::TOLERANCE)
83 return RealVectorValue(0.0, 0.0, 0.0);
84 return grad_phi / grad_norm;
85 }
86 else
87 {
88 const auto * mesh_func = dynamic_cast<const UnsignedDistanceToSurfaceMesh *>(func);
89 mooseAssert(mesh_func, "Function was not a valid distance strategy");
90 return mesh_func->surfaceNormal(pt);
91 }
92}

Referenced by closestTrueNormalVector(), ShortestDistanceToSurface::trueNormalByFunc(), and ShortestDistanceToSurface::trueNormalByIndex().