Loading [MathJax]/extensions/tex2jax.js
https://mooseframework.inl.gov
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends
FindValueOnLine.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 "FindValueOnLine.h"
11 
12 // MOOSE includes
13 #include "MooseMesh.h"
14 #include "MooseUtils.h"
15 #include "MooseVariable.h"
16 
18 
21 {
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.");
29  params.addParam<bool>(
30  "error_if_not_found",
31  true,
32  "If true, stop with error if target value is not found on the line. If false, "
33  "return default_value.");
34  params.addParam<Real>("default_value",
35  -1,
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.");
39  params.addParam<Real>(
40  "tol",
41  1e-10,
42  "Stop search if a value is found that is equal to the target with this tolerance applied.");
43  params.addCoupledVar("v", "Variable to inspect");
44  return params;
45 }
46 
48  : GeneralPostprocessor(parameters),
49  Coupleable(this, false),
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)),
59  _position(0.0),
60  _mesh(_subproblem.mesh()),
61  _point_vec(1)
62 {
63 }
64 
65 void
67 {
68  // We do this here just in case it's been destroyed and recreated becaue of mesh adaptivity.
70  _pl->enable_out_of_mesh_mode();
71 }
72 
73 void
75 {
76  Real s;
77  Real s_left = 0.0;
79  Real s_right = 1.0;
81 
86  bool left_to_right = left < right;
87  // Initial bounds check
88  if ((left_to_right && _target < left) || (!left_to_right && _target < right))
89  {
91  {
92  mooseError("Target value \"",
93  _target,
94  "\" is less than the minimum sampled value \"",
95  std::min(left, right),
96  "\"");
97  }
98  else
99  {
101  return;
102  }
103  }
104  if ((left_to_right && _target > right) || (!left_to_right && _target > left))
105  {
107  {
108  mooseError("Target value \"",
109  _target,
110  "\" is greater than the maximum sampled value \"",
111  std::max(left, right),
112  "\"");
113  }
114  else
115  {
117  return;
118  }
119  }
120 
121  bool found_it = false;
122  Real value = 0;
123  for (unsigned int i = 0; i < _depth; ++i)
124  {
125  // find midpoint
126  s = (s_left + s_right) / 2.0;
127  Point p = s * (_end_point - _start_point) + _start_point;
128 
129  // sample value
130  value = getValueAtPoint(p);
131 
132  // have we hit the target value yet?
134  {
135  found_it = true;
136  break;
137  }
138 
139  // bisect
140  if ((left_to_right && _target < value) || (!left_to_right && _target > value))
141  // to the left
142  s_right = s;
143  else
144  // to the right
145  s_left = s;
146  }
147 
148  // Return error if target value (within tol) was not found within depth bisections
149  if (!found_it)
150  mooseError("Target value \"",
151  std::setprecision(10),
152  _target,
153  "\" not found on line within tolerance, last sample: ",
154  value,
155  ".");
156 
157  _position = s * _length;
158 }
159 
160 Real
162 {
163  const Elem * elem = (*_pl)(p);
164 
165  processor_id_type elem_proc_id =
166  elem ? elem->processor_id() : libMesh::DofObject::invalid_processor_id;
167  _communicator.min(elem_proc_id);
168 
169  if (elem_proc_id == libMesh::DofObject::invalid_processor_id)
170  {
171  // there is no element
172  mooseError("No element found at the current search point. Please make sure the sampling line "
173  "stays inside the mesh completely.");
174  }
175 
176  Real value = 0;
177 
178  if (elem)
179  {
180  if (elem->processor_id() == processor_id())
181  {
182  // element is local
183  _point_vec[0] = p;
185  value = _coupled_var.sln()[0];
186  }
187  }
188 
189  // broadcast value
190  _communicator.broadcast(value, elem_proc_id);
191  return value;
192 }
193 
196 {
197  return _position;
198 }
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.
Definition: MooseUtils.h:372
const Real _tol
tolerance for comparison to the target value
std::unique_ptr< libMesh::PointLocatorBase > _pl
helper object to locate elements containing points
MeshBase & mesh
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
const Parallel::Communicator & _communicator
This class is here to combine the Postprocessor interface and the base class Postprocessor object alo...
const Real _length
auto max(const L &left, const R &right)
SubProblem & _subproblem
Reference to the Subproblem for this user object.
Definition: UserObject.h:206
static InputParameters validParams()
MooseVariable & _coupled_var
coupled variable
FindValueOnLine(const InputParameters &parameters)
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
Definition: MooseTypes.h:198
const Point _end_point
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&#39;re using.
auto norm(const T &a) -> decltype(std::abs(a))
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
void addCoupledVar(const std::string &name, const std::string &doc_string)
This method adds a coupled variable name pair.
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.
Definition: Coupleable.h:45
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&#39;t have to create and destroy the dummy vector.
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type.
void addClassDescription(const std::string &doc_string)
This method adds a description of the class that will be displayed in the input file syntax dump...
void addParam(const std::string &name, const S &value, const std::string &doc_string)
These methods add an optional parameter and a documentation string to the InputParameters object...
virtual std::unique_ptr< libMesh::PointLocatorBase > getPointLocator() const
Proxy function to get a (sub)PointLocator from either the underlying libMesh mesh (default)...
Definition: MooseMesh.C:3702
processor_id_type processor_id() const
auto min(const L &left, const R &right)
void ErrorVector unsigned int
Real _position
detected interface location