https://mooseframework.inl.gov
Loading...
Searching...
No Matches
LineValueSampler.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 "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
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{
42 if (MooseUtils::absoluteFuzzyEqual(_line_vector_norm, 0.0))
43 mooseError("LineValueSampler: `start_point` and `end_point` must be different.");
44
46}
47
48void
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
77Real
78LineValueSampler::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_index != 3) /*id*/
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}
registerMooseObject("MooseApp", LineValueSampler)
void mooseWarning(Args &&... args)
Emit a warning message with the given stringified, concatenated args.
Definition MooseError.h:345
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
void ErrorVector unsigned int
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
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...
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.
static InputParameters validParams()
LineValueSampler(const InputParameters &parameters)
const Point _end_point
unsigned int & _num_points
const Real _line_vector_norm
Length of line segment.
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.
Real getValue(const Point &p) const
Gets the value of the variable at a point p.
const Point _start_point
const VectorPostprocessorValue & _vpp_value
virtual const OutputTools< Real >::VariableValue & value()
The value of the variable this object is operating on.
std::vector< Point > _points
The points to evaluate at.
std::vector< Real > _ids
The ID to use for each point (yes, this is Real on purpose)
Base class for sampling variable(s) at points.
unsigned int _sort_by_index
The index for what to sort by: x=0, y=1, z=2, then sampled variables in ordered specified in the para...
std::vector< VectorPostprocessorValue * > _values
VectorPostprocessorValue & _id
The node ID of each point.
Base class for creating a user object with the SpatialUserObject and Moose::Functor APIs.
static InputParameters validParams()