https://mooseframework.inl.gov
Loading...
Searching...
No Matches
SBMDistanceFunctionTest.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 "MooseObjectUnitTest.h"
11#include "Function.h"
12#include "SBMUtils.h"
13
14#include "gtest/gtest.h"
15
16// Fixture that provides an app/problem so real Function objects can be built and handed to the
17// SBMUtils distance helpers, which accept only ParsedFunction / (Un)SignedDistanceToSurfaceMesh.
19{
20public:
21 SBMDistanceFunctionTest() : MooseObjectUnitTest("ShiftedBoundaryMethodApp") {}
22
23protected:
24 const Function & buildFunction(const std::string & type,
25 const std::string & name,
26 const std::function<void(InputParameters &)> & set_params)
27 {
29 params.set<FEProblem *>("_fe_problem") = _fe_problem.get();
30 params.set<FEProblemBase *>("_fe_problem_base") = _fe_problem.get();
31 set_params(params);
32 _fe_problem->addFunction(type, name, params);
33 Function & f = _fe_problem->getFunction(name);
35 return f;
36 }
37
38 const Function & parsed(const std::string & name, const std::string & expr)
39 {
40 return buildFunction("ParsedFunction",
41 name,
42 [&expr](InputParameters & p) { p.set<std::string>("expression") = expr; });
43 }
44};
45
46// distanceVectorFromFunction returns the vector from the point to the zero level set:
47// -(phi / |grad phi|) * grad phi. For phi = x (the plane x = 0) at (2, 0, 0) that is (-2, 0, 0).
48TEST_F(SBMDistanceFunctionTest, DistanceVectorFromPlane)
49{
50 const Function & phi = parsed("phi_x", "x");
51 const RealVectorValue d = SBMUtils::distanceVectorFromFunction(&phi, Point(2, 0, 0), 0);
52 EXPECT_NEAR(d(0), -2.0, 1e-6);
53 EXPECT_NEAR(d(1), 0.0, 1e-6);
54 EXPECT_NEAR(d(2), 0.0, 1e-6);
55}
56
57// A vanishing gradient (constant expression) yields a zero distance vector rather than dividing
58// by zero.
59TEST_F(SBMDistanceFunctionTest, DistanceVectorZeroGradient)
60{
61 const Function & c = parsed("phi_const", "5");
62 const RealVectorValue d = SBMUtils::distanceVectorFromFunction(&c, Point(1, 1, 1), 0);
63 EXPECT_NEAR(d.norm(), 0.0, 1e-12);
64}
65
66// trueNormalFromFunction returns the unit outward normal grad phi / |grad phi|; for phi = x it is
67// (1, 0, 0) everywhere.
68TEST_F(SBMDistanceFunctionTest, TrueNormalFromPlane)
69{
70 const Function & phi = parsed("phi_x2", "x");
71 const RealVectorValue n = SBMUtils::trueNormalFromFunction(&phi, Point(2, 0, 0), 0);
72 EXPECT_NEAR(n(0), 1.0, 1e-6);
73 EXPECT_NEAR(n(1), 0.0, 1e-6);
74 EXPECT_NEAR(n(2), 0.0, 1e-6);
75}
76
77// closestDistanceVector / closestTrueNormalVector select the nearest of several surfaces. At
78// (2, 0, 0) the plane x = 0 (distance 2) is closer than x = 10 (distance 8).
79TEST_F(SBMDistanceFunctionTest, ClosestPicksNearestSurface)
80{
81 const Function & near = parsed("near", "x");
82 const Function & far = parsed("far", "x - 10");
83 const std::vector<const Function *> funcs{&near, &far};
84 const Point pt(2, 0, 0);
85
86 const RealVectorValue d = SBMUtils::closestDistanceVector(funcs, pt, 0);
87 EXPECT_NEAR(d(0), -2.0, 1e-6);
88
89 const RealVectorValue n = SBMUtils::closestTrueNormalVector(funcs, pt, 0);
90 EXPECT_NEAR(n(0), 1.0, 1e-6);
91}
92
93// unionSignedDistance is the minimum signed distance over the functions: min(2, -8) = -8.
94TEST_F(SBMDistanceFunctionTest, UnionSignedDistanceTakesMin)
95{
96 const Function & u1 = parsed("u1", "x");
97 const Function & u2 = parsed("u2", "x - 10");
98 const std::vector<const Function *> funcs{&u1, &u2};
99 EXPECT_NEAR(SBMUtils::unionSignedDistance(funcs, 0, Point(2, 0, 0)), -8.0, 1e-6);
100}
101
102// A function that is not a supported signed-distance strategy is rejected. This exercises the same
103// type validation used by buildDistanceFunctions.
104TEST_F(SBMDistanceFunctionTest, UnionSignedDistanceRejectsUnsupportedType)
105{
106 const Function & c = buildFunction(
107 "ConstantFunction", "c", [](InputParameters & p) { p.set<Real>("value") = 1.0; });
108 const std::vector<const Function *> funcs{&c};
109 EXPECT_ANY_THROW(SBMUtils::unionSignedDistance(funcs, 0, Point(0, 0, 0)));
110}
Real f(Real x)
Test function for Brents method.
const Real p
TEST_F(SBMDistanceFunctionTest, DistanceVectorFromPlane)
const std::string name
Definition Setup.h:21
InputParameters getValidParams(const std::string &name) const
T & set(const std::string &name, bool quiet_mode=false)
std::shared_ptr< FEProblem > _fe_problem
const Function & buildFunction(const std::string &type, const std::string &name, const std::function< void(InputParameters &)> &set_params)
const Function & parsed(const std::string &name, const std::string &expr)
virtual void initialSetup()
Real unionSignedDistance(const std::vector< const Function * > &funcs, Real t, const Point &p)
Computes the union signed distance by taking the minimum of all signed distance functions.
Definition SBMUtils.C:207
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:185
RealVectorValue distanceVectorFromFunction(const Function *func, const libMesh::Point &pt, Real t)
Compute the distance vector induced by a distance function.
Definition SBMUtils.C:120
RealVectorValue trueNormalFromFunction(const Function *func, const libMesh::Point &pt, Real t)
Compute the true boundary surface normal at the point on the boundary closest to pt.
Definition SBMUtils.C:140
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:163