23 params.
addClassDescription(
"Find a specific target value along a sampling line. The variable " 24 "values along the line should change monotonically. The target value " 25 "is searched using a bisection algorithm.");
26 params.
addParam<Point>(
"start_point",
"Start point of the sampling line.");
27 params.
addParam<Point>(
"end_point",
"End point of the sampling line.");
28 params.
addParam<
Real>(
"target",
"Target value to locate.");
32 "If true, stop with error if target value is not found on the line. If false, " 33 "return default_value.");
36 "Value to return if target value is not found on line and " 37 "error_if_not_found is false.");
38 params.
addParam<
unsigned int>(
"depth", 36,
"Maximum number of bisections to perform.");
42 "Stop search if a value is found that is equal to the target with this tolerance applied.");
50 _start_point(getParam<Point>(
"start_point")),
51 _end_point(getParam<Point>(
"end_point")),
52 _length((_end_point - _start_point).
norm()),
53 _target(getParam<
Real>(
"target")),
54 _error_if_not_found(getParam<bool>(
"error_if_not_found")),
55 _default_value(getParam<
Real>(
"default_value")),
56 _depth(getParam<unsigned
int>(
"depth")),
57 _tol(getParam<
Real>(
"tol")),
58 _coupled_var(*getVar(
"v", 0)),
60 _mesh(_subproblem.
mesh()),
70 _pl->enable_out_of_mesh_mode();
86 bool left_to_right = left < right;
88 if ((left_to_right &&
_target < left) || (!left_to_right &&
_target < right))
94 "\" is less than the minimum sampled value \"",
104 if ((left_to_right &&
_target > right) || (!left_to_right &&
_target > left))
110 "\" is greater than the maximum sampled value \"",
121 bool found_it =
false;
123 for (
unsigned int i = 0; i <
_depth; ++i)
126 s = (s_left + s_right) / 2.0;
151 std::setprecision(10),
153 "\" not found on line within tolerance, last sample: ",
163 const Elem * elem = (*_pl)(p);
172 mooseError(
"No element found at the current search point. Please make sure the sampling line " 173 "stays inside the mesh completely.");
const Point _start_point
line to sample along
static InputParameters validParams()
virtual void execute() override
Execute method.
const bool & _error_if_not_found
boolean indicating whether to stop with an error if value is not found on the line ...
virtual PostprocessorValue getValue() const override
This will get called to actually grab the final value the postprocessor has calculated.
virtual void initialize() override
Called before execute() is ever called so that data can be cleared.
bool absoluteFuzzyEqual(const T &var1, const T2 &var2, const T3 &tol=libMesh::TOLERANCE *libMesh::TOLERANCE)
Function to check whether two variables are equal within an absolute tolerance.
const Real _tol
tolerance for comparison to the target value
std::unique_ptr< libMesh::PointLocatorBase > _pl
helper object to locate elements containing points
const Parallel::Communicator & _communicator
This class is here to combine the Postprocessor interface and the base class Postprocessor object alo...
auto max(const L &left, const R &right)
SubProblem & _subproblem
Reference to the Subproblem for this user object.
static InputParameters validParams()
MooseVariable & _coupled_var
coupled variable
FindValueOnLine(const InputParameters ¶meters)
uint8_t processor_id_type
Find a specific target value along a sampling line.
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
void min(const T &r, T &o, Request &req) const
static const processor_id_type invalid_processor_id
Real getValueAtPoint(const Point &p)
const FieldVariableValue & sln() const override
element solutions
registerMooseObject("MooseApp", FindValueOnLine)
Real PostprocessorValue
various MOOSE typedefs
const Real & _default_value
value to return if target value is not found on the line and _error_if_not_found is false ...
MooseMesh & _mesh
The Mesh we're using.
const Real _target
value to find along the line
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
virtual void reinitElemPhys(const Elem *elem, const std::vector< Point > &phys_points_in_elem, const THREAD_ID tid)=0
Interface for objects that needs coupling capabilities.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const unsigned int _depth
search depth
std::vector< Point > _point_vec
So we don't have to create and destroy the dummy vector.
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type.
virtual std::unique_ptr< libMesh::PointLocatorBase > getPointLocator() const
Proxy function to get a (sub)PointLocator from either the underlying libMesh mesh (default)...
processor_id_type processor_id() const
auto min(const L &left, const R &right)
void ErrorVector unsigned int
Real _position
detected interface location