https://mooseframework.inl.gov
Loading...
Searching...
No Matches
LeastSquaresFitHistory.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
12#include "PolynomialFit.h"
13#include "Conversion.h"
14
16
19{
21
22 params.addRequiredParam<VectorPostprocessorName>(
23 "vectorpostprocessor",
24 "The vectorpostprocessor on whose values we perform a least squares fit");
25 params.addRequiredParam<std::string>("x_name", "The name of the independent variable");
26 params.addRequiredParam<std::string>("y_name", "The name of the dependent variable");
27 params.addRequiredParam<unsigned int>("order", "The order of the polynomial fit");
28 params.addParam<bool>(
29 "truncate_order",
30 true,
31 "Truncate the order of the fitted polynomial if an insufficient number of data points are "
32 "provided. If this is set to false, an error will be generated in that case.");
33 params.addParam<Real>(
34 "x_scale", 1.0, "Value used to scale x values (scaling is done after shifting)");
35 params.addParam<Real>(
36 "x_shift", 0.0, "Value used to shift x values (shifting is done before scaling)");
37 params.addParam<Real>(
38 "y_scale", 1.0, "Value used to scale y values (scaling is done after shifting)");
39 params.addParam<Real>(
40 "y_shift", 0.0, "Value used to shift y values (shifting is done before scaling)");
42 "Performs a polynomial least squares fit on the data contained in "
43 "another VectorPostprocessor and stores the full time history of the coefficients");
44
45 params.set<bool>("contains_complete_history") = true;
46 params.addParamNamesToGroup("contains_complete_history", "Advanced");
47
48 return params;
49}
50
52 : GeneralVectorPostprocessor(parameters),
53 _vpp_name(getParam<VectorPostprocessorName>("vectorpostprocessor")),
54 _order(parameters.get<unsigned int>("order")),
55 _truncate_order(parameters.get<bool>("truncate_order")),
56 _x_name(getParam<std::string>("x_name")),
57 _y_name(getParam<std::string>("y_name")),
58 _x_values(getVectorPostprocessorValue("vectorpostprocessor", _x_name)),
59 _y_values(getVectorPostprocessorValue("vectorpostprocessor", _y_name)),
60 _x_scale(parameters.get<Real>("x_scale")),
61 _x_shift(parameters.get<Real>("x_shift")),
62 _y_scale(parameters.get<Real>("y_scale")),
63 _y_shift(parameters.get<Real>("y_shift")),
64 _last_t_step(declareRecoverableData<int>("ls_last_t_step", -1))
65{
66 _coeffs.resize(_order + 1);
67 for (unsigned int i = 0; i < _coeffs.size(); ++i)
68 _coeffs[i] = &declareVector("coef_" + Moose::stringify(i));
69 _times = &declareVector("time");
70}
71
72void
74{
75 // no reset/clear needed since contains complete history
76}
77
78void
80{
81 if (_x_values.size() != _y_values.size())
82 mooseError("In LeastSquresFitTimeHistory size of data in x_values and y_values must be equal");
83 if (_x_values.size() == 0)
84 mooseError("In LeastSquresFitTimeHistory size of data in x_values and y_values must be > 0");
85
86 // If we are repeating a timestep, make sure to clear the last entry
87 if (_last_t_step == _t_step)
88 {
89 std::for_each(_coeffs.begin(), _coeffs.end(), [](auto coeff) { coeff->pop_back(); });
90 _times->pop_back();
91 }
92 else
94
95 // Create a copy of _x_values that we can modify.
96 std::vector<Real> x_values(_x_values.begin(), _x_values.end());
97 std::vector<Real> y_values(_y_values.begin(), _y_values.end());
98
99 for (MooseIndex(_x_values) i = 0; i < _x_values.size(); ++i)
100 {
101 x_values[i] = (x_values[i] + _x_shift) * _x_scale;
102 y_values[i] = (y_values[i] + _y_shift) * _y_scale;
103 }
104
105 PolynomialFit pf(x_values, y_values, _order, _truncate_order);
106 pf.generate();
107
108 std::vector<Real> coeffs = pf.getCoefficients();
109 mooseAssert(coeffs.size() == _coeffs.size(),
110 "Sizes of current coefficients and vector of coefficient vectors must match");
111 for (MooseIndex(coeffs) i = 0; i < coeffs.size(); ++i)
112 _coeffs[i]->push_back(coeffs[i]);
113
114 _times->push_back(_t);
115}
registerMooseObject("MooseApp", LeastSquaresFitHistory)
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
This class is here to combine the VectorPostprocessor interface and the base class VectorPostprocesso...
static InputParameters validParams()
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)
This method takes a space delimited list of parameter names and adds them to the specified group name...
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.
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.
T & set(const std::string &name, bool quiet_mode=false)
Returns a writable reference to the named parameters.
virtual void generate()
Generate the fit.
const std::vector< Real > & getCoefficients()
Const reference to the vector of coefficients of the least squares fit.
LeastSquaresFitHistory is a VectorPostprocessor that performs a least squares fit on data calculated ...
std::vector< VectorPostprocessorValue * > _coeffs
Vector of vectors with the individual coefficients.
int & _last_t_step
The last timestep that this object operated on.
const VectorPostprocessorValue & _y_values
const VectorPostprocessorValue & _x_values
The variables with the x, y data to be fit.
VectorPostprocessorValue * _times
Vector of times.
virtual void execute() override
Perform the least squares fit.
const Real _x_scale
Values used to scale and or shift x and y data.
LeastSquaresFitHistory(const InputParameters &parameters)
Class constructor.
static InputParameters validParams()
const unsigned int _order
The order of the polynomial fit to be performed.
virtual void initialize() override
Initialize, clears old results.
const bool _truncate_order
Whether to truncate the polynomial order if an insufficient number of points is provided.
Least squares polynomial fit.
int & _t_step
The number of the time step.
VectorPostprocessorValue & declareVector(const std::string &vector_name)
Register a new vector to fill up.
std::string stringify(const T &t)
conversion to string
Definition Conversion.h:64