https://mooseframework.inl.gov
Loading...
Searching...
No Matches
SBMUtils.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10#include "SBMUtils.h"
11#include "Function.h"
12#include "FunctionInterface.h"
13#include "MooseParsedFunction.h"
15
16#include <limits>
17
18namespace SBMUtils
19{
20
21bool
22checkWatertightnessFromRawElems(const std::vector<const Elem *> & bd_elements)
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}
31
32std::vector<const Function *>
33buildDistanceFunctions(const std::vector<FunctionName> & function_names,
34 const FunctionInterface & function_provider)
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}
54
55RealVectorValue
56distanceVectorFromFunction(const Function * func, const libMesh::Point & pt, Real t)
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}
73
74RealVectorValue
75trueNormalFromFunction(const Function * func, const libMesh::Point & pt, Real t)
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}
93
94RealVectorValue
95closestDistanceVector(const std::vector<const Function *> & funcs,
96 const libMesh::Point & pt,
97 Real t)
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}
115
116RealVectorValue
117closestTrueNormalVector(const std::vector<const Function *> & funcs,
118 const libMesh::Point & pt,
119 Real t)
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}
137
138} // namespace SBMUtils
void mooseError(Args &&... args)
const std::string name
Definition Setup.h:21
const Function & getFunctionByName(const FunctionName &name) const
virtual RealGradient gradient(Real t, const Point &p) const
virtual Real value(Real t, const Point &p) const
Computes the unsigned distance to a surface mesh using KDTree nearest neighbor lookup from SBMSurface...
RealVectorValue closestTrueNormalVector(const std::vector< const Function * > &funcs, const libMesh::Point &pt, Real t)
Scan all distance functions and return the corresponding normal vector.
Definition SBMUtils.C:117
bool checkWatertightnessFromRawElems(const std::vector< const Elem * > &bd_elements)
Definition SBMUtils.C:22
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.
Definition SBMUtils.C:33
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
RealVectorValue closestDistanceVector(const std::vector< const Function * > &funcs, const libMesh::Point &pt, Real t)
Scan all distance functions and return the closest distance vector.
Definition SBMUtils.C:95
static constexpr Real TOLERANCE