www.mooseframework.org
LineValueSampler.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 "LineValueSampler.h"
11 #include <limits>
12 #include "libmesh/utility.h"
13 
15 
18 {
20 
21  params.addRequiredParam<Point>("start_point", "The beginning of the line");
22  params.addRequiredParam<Point>("end_point", "The ending of the line");
23 
24  params.addRequiredParam<unsigned int>("num_points",
25  "The number of points to sample along the line");
26 
27  params.addClassDescription("Samples variable(s) along a specified line");
28 
29  return params;
30 }
31 
33  : PointVariableSamplerBase(parameters),
34  _start_point(getParam<Point>("start_point")),
35  _end_point(getParam<Point>("end_point")),
36  _num_points(
37  declareRestartableData<unsigned int>("num_points", getParam<unsigned int>("num_points"))),
38  _line_vector(_end_point - _start_point),
39  _line_vector_norm(_line_vector.norm()),
40  _vpp_value(getVectorPostprocessorValueByName(_vpp_name, _variable_names[0]))
41 {
43  mooseError("LineValueSampler: `start_point` and `end_point` must be different.");
44 
46 }
47 
48 void
49 LineValueSampler::generatePointsAndIDs(const Point & start_point,
50  const Point & end_point,
51  unsigned int num_points,
52  std::vector<Point> & points,
53  std::vector<Real> & ids)
54 {
55 
56  Point difference = end_point - start_point;
57 
58  Point delta = difference / Real(num_points - 1);
59 
60  points.resize(num_points);
61  ids.resize(num_points);
62 
63  for (unsigned int i = 0; i < num_points - 1;
64  i++) // -1 so that we can manually put in the end point to get it perfect
65  {
66  Point p = start_point + (i * delta);
67 
68  points[i] = p;
69  ids[i] = (p - start_point).norm(); // The ID is the distance along the line
70  }
71 
72  // Add the end point explicitly
73  points[num_points - 1] = end_point;
74  ids[num_points - 1] = (end_point - start_point).norm();
75 }
76 
77 Real
78 LineValueSampler::getValue(const Point & p) const
79 {
80  if (_values.size() != 1)
81  mooseError("LineValueSampler: When calling getValue() on LineValueSampler, "
82  "only one variable can be provided as input to LineValueSampler.");
83 
84  // Check if vectors are sorted by id
85  if (_sort_by != 3)
86  mooseError("LineValueSampler: When calling getValue() on LineValueSampler, "
87  "`sort_by` should be set to `id`.");
88 
89  Real value = std::numeric_limits<Real>::infinity();
90 
91  // Project point onto the line segment and normalize by length of line segment
92  Real position =
93  (p - _points[0]) * (_points.back() - _points[0]) / Utility::pow<2>(_line_vector_norm);
94 
95  if (position >= 0.0 and position <= 1.0)
96  {
97  unsigned int vec_pos =
98  std::lower_bound(_id.begin(), _id.end(), position * _line_vector_norm) - _id.begin();
99 
100  if (MooseUtils::absoluteFuzzyEqual(_id[vec_pos], position * _line_vector_norm))
101  value = _vpp_value[vec_pos];
102  else
103  {
104  mooseWarning("Value requested outside of sampled points");
105  value = (_vpp_value[vec_pos - 1] + _vpp_value[vec_pos]) * 0.5;
106  }
107  }
108 
109  return value;
110 }
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:346
std::vector< Real > _ids
The ID to use for each point (yes, this is Real on purpose)
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
std::vector< Point > _points
The points to evaluate at.
static InputParameters validParams()
Real getValue(const Point &p) const
Gets the value of the variable at a point p.
const Point _end_point
void mooseWarning(Args &&... args) const
Emits a warning prefixed with object name and type.
void addRequiredParam(const std::string &name, const std::string &doc_string)
This method adds a parameter and documentation string to the InputParameters object that will be extr...
Base class for sampling variable(s) at points.
const unsigned int _sort_by
What to sort by.
Definition: SamplerBase.h:106
std::vector< VectorPostprocessorValue * > _values
Definition: SamplerBase.h:118
const Real _line_vector_norm
Length of line segment.
static InputParameters validParams()
LineValueSampler(const InputParameters &parameters)
virtual const OutputTools< Real >::VariableValue & value()
The value of the variable this object is operating on.
auto norm(const T &a) -> decltype(std::abs(a))
unsigned int & _num_points
const VectorPostprocessorValue & _vpp_value
VectorPostprocessorValue & _id
The node ID of each point.
Definition: SamplerBase.h:116
const Point _start_point
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static void generatePointsAndIDs(const Point &start_point, const Point &end_point, unsigned int num_points, std::vector< Point > &points, std::vector< Real > &ids)
Helper function to generate the list of points along a line and a unique ID for each point...
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...
registerMooseObject("MooseApp", LineValueSampler)
void ErrorVector unsigned int
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template pow< 2 >(tan(_arg))+1.0) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(sqrt