https://mooseframework.inl.gov
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. More...
 
RealVectorValue distanceVectorFromFunction (const Function *func, const libMesh::Point &pt, Real t)
 Compute the distance vector induced by a distance function. More...
 
RealVectorValue trueNormalFromFunction (const Function *func, const libMesh::Point &pt, Real t)
 Compute the true boundary surface normal using a distance function. More...
 
RealVectorValue closestDistanceVector (const std::vector< const Function *> &funcs, const libMesh::Point &pt, Real t)
 Scan all distance functions and return the closest distance vector. More...
 
RealVectorValue closestTrueNormalVector (const std::vector< const Function *> &funcs, const libMesh::Point &pt, Real t)
 Scan all distance functions and return the corresponding normal vector. More...
 

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.

Referenced by ShortestDistanceToSurface::ShortestDistanceToSurface().

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

◆ checkWatertightnessFromRawElems()

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

Definition at line 22 of file SBMUtils.C.

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

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 }

◆ 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.

Referenced by ShortestDistanceToSurface::distanceVector().

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
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ 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.

Referenced by ShortestDistanceToSurface::trueNormal().

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 distanceVectorFromFunction(const Function *func, const libMesh::Point &pt, Real t)
Compute the distance vector induced by a distance function.
Definition: SBMUtils.C:56
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
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ 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.

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

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 }
auto norm() const
static constexpr Real TOLERANCE
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual RealGradient gradient(Real t, const Point &p) const
virtual Real value(Real t, const Point &p) const

◆ 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.

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

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 }
auto norm() const
Computes the unsigned distance to a surface mesh using KDTree nearest neighbor lookup from SBMSurface...
static constexpr Real TOLERANCE
RealVectorValue distanceVectorFromFunction(const Function *func, const libMesh::Point &pt, Real t)
Compute the distance vector induced by a distance function.
Definition: SBMUtils.C:56
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real