Line data Source code
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 "LeastSquaresFitHistory.h" 11 : #include "VectorPostprocessorInterface.h" 12 : #include "PolynomialFit.h" 13 : #include "Conversion.h" 14 : 15 : registerMooseObject("MooseApp", LeastSquaresFitHistory); 16 : 17 : InputParameters 18 14337 : LeastSquaresFitHistory::validParams() 19 : { 20 14337 : InputParameters params = GeneralVectorPostprocessor::validParams(); 21 : 22 14337 : params.addRequiredParam<VectorPostprocessorName>( 23 : "vectorpostprocessor", 24 : "The vectorpostprocessor on whose values we perform a least squares fit"); 25 14337 : params.addRequiredParam<std::string>("x_name", "The name of the independent variable"); 26 14337 : params.addRequiredParam<std::string>("y_name", "The name of the dependent variable"); 27 14337 : params.addRequiredParam<unsigned int>("order", "The order of the polynomial fit"); 28 43011 : params.addParam<bool>( 29 : "truncate_order", 30 28674 : 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 43011 : params.addParam<Real>( 34 28674 : "x_scale", 1.0, "Value used to scale x values (scaling is done after shifting)"); 35 43011 : params.addParam<Real>( 36 28674 : "x_shift", 0.0, "Value used to shift x values (shifting is done before scaling)"); 37 43011 : params.addParam<Real>( 38 28674 : "y_scale", 1.0, "Value used to scale y values (scaling is done after shifting)"); 39 43011 : params.addParam<Real>( 40 28674 : "y_shift", 0.0, "Value used to shift y values (shifting is done before scaling)"); 41 14337 : params.addClassDescription( 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 14337 : params.set<bool>("contains_complete_history") = true; 46 14337 : params.addParamNamesToGroup("contains_complete_history", "Advanced"); 47 : 48 14337 : return params; 49 0 : } 50 : 51 36 : LeastSquaresFitHistory::LeastSquaresFitHistory(const InputParameters & parameters) 52 : : GeneralVectorPostprocessor(parameters), 53 36 : _vpp_name(getParam<VectorPostprocessorName>("vectorpostprocessor")), 54 36 : _order(parameters.get<unsigned int>("order")), 55 36 : _truncate_order(parameters.get<bool>("truncate_order")), 56 36 : _x_name(getParam<std::string>("x_name")), 57 36 : _y_name(getParam<std::string>("y_name")), 58 36 : _x_values(getVectorPostprocessorValue("vectorpostprocessor", _x_name)), 59 36 : _y_values(getVectorPostprocessorValue("vectorpostprocessor", _y_name)), 60 36 : _x_scale(parameters.get<Real>("x_scale")), 61 36 : _x_shift(parameters.get<Real>("x_shift")), 62 36 : _y_scale(parameters.get<Real>("y_scale")), 63 72 : _y_shift(parameters.get<Real>("y_shift")) 64 : { 65 36 : _coeffs.resize(_order + 1); 66 108 : for (unsigned int i = 0; i < _coeffs.size(); ++i) 67 72 : _coeffs[i] = &declareVector("coef_" + Moose::stringify(i)); 68 36 : _times = &declareVector("time"); 69 36 : } 70 : 71 : void 72 99 : LeastSquaresFitHistory::initialize() 73 : { 74 : // no reset/clear needed since contains complete history 75 99 : } 76 : 77 : void 78 99 : LeastSquaresFitHistory::execute() 79 : { 80 99 : if (_x_values.size() != _y_values.size()) 81 0 : mooseError("In LeastSquresFitTimeHistory size of data in x_values and y_values must be equal"); 82 99 : if (_x_values.size() == 0) 83 0 : mooseError("In LeastSquresFitTimeHistory size of data in x_values and y_values must be > 0"); 84 : 85 : // Create a copy of _x_values that we can modify. 86 99 : std::vector<Real> x_values(_x_values.begin(), _x_values.end()); 87 99 : std::vector<Real> y_values(_y_values.begin(), _y_values.end()); 88 : 89 1188 : for (MooseIndex(_x_values) i = 0; i < _x_values.size(); ++i) 90 : { 91 1089 : x_values[i] = (x_values[i] + _x_shift) * _x_scale; 92 1089 : y_values[i] = (y_values[i] + _y_shift) * _y_scale; 93 : } 94 : 95 99 : PolynomialFit pf(x_values, y_values, _order, _truncate_order); 96 99 : pf.generate(); 97 : 98 99 : std::vector<Real> coeffs = pf.getCoefficients(); 99 : mooseAssert(coeffs.size() == _coeffs.size(), 100 : "Sizes of current coefficients and vector of coefficient vectors must match"); 101 297 : for (MooseIndex(coeffs) i = 0; i < coeffs.size(); ++i) 102 198 : _coeffs[i]->push_back(coeffs[i]); 103 : 104 99 : _times->push_back(_t); 105 99 : }