LCOV - code coverage report
Current view: top level - src/vectorpostprocessors - LeastSquaresFitHistory.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 2bf808 Lines: 54 57 94.7 %
Date: 2025-07-17 01:28:37 Functions: 4 4 100.0 %
Legend: Lines: hit not hit

          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 : }

Generated by: LCOV version 1.14