LCOV - code coverage report
Current view: top level - src/distributions - Normal.C (source / functions) Hit Total Coverage
Test: idaholab/moose stochastic_tools: f45d79 Lines: 31 32 96.9 %
Date: 2025-07-25 05:00:46 Functions: 8 8 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 "Normal.h"
      11             : #include "math.h"
      12             : #include "libmesh/utility.h"
      13             : 
      14             : registerMooseObject("StochasticToolsApp", Normal);
      15             : 
      16             : const std::array<Real, 6> Normal::_a = {
      17             :     {-0.322232431088, -1.0, -0.342242088547, -0.0204231210245, -0.0000453642210148}};
      18             : 
      19             : const std::array<Real, 6> Normal::_b = {
      20             :     {0.099348462606, 0.588581570495, 0.531103462366, 0.10353775285, 0.0038560700634}};
      21             : 
      22             : InputParameters
      23        3780 : Normal::validParams()
      24             : {
      25        3780 :   InputParameters params = Distribution::validParams();
      26        3780 :   params.addClassDescription("Normal distribution");
      27        7560 :   params.addRequiredParam<Real>("mean", "Mean (or expectation) of the distribution.");
      28        7560 :   params.addRequiredRangeCheckedParam<Real>(
      29             :       "standard_deviation", "standard_deviation > 0", "Standard deviation of the distribution ");
      30        3780 :   return params;
      31           0 : }
      32             : 
      33        1888 : Normal::Normal(const InputParameters & parameters)
      34             :   : Distribution(parameters),
      35        1888 :     _mean(getParam<Real>("mean")),
      36        5664 :     _standard_deviation(getParam<Real>("standard_deviation"))
      37             : {
      38        1888 : }
      39             : 
      40             : Real
      41       30388 : Normal::pdf(const Real & x, const Real & mean, const Real & std_dev)
      42             : {
      43       30388 :   return 1.0 / (std_dev * std::sqrt(2.0 * M_PI)) *
      44       30388 :          std::exp(-0.5 * Utility::pow<2>((x - mean) / std_dev));
      45             : }
      46             : 
      47             : Real
      48       13554 : Normal::cdf(const Real & x, const Real & mean, const Real & std_dev)
      49             : {
      50       13554 :   return 0.5 * (1.0 + std::erf((x - mean) / (std_dev * std::sqrt(2.0))));
      51             : }
      52             : 
      53             : Real
      54       47426 : Normal::quantile(const Real & p, const Real & mean, const Real & std_dev)
      55             : {
      56       47426 :   const Real x = (p < 0.5 ? p : 1.0 - p);
      57       47426 :   const Real y = std::sqrt(-2.0 * std::log(x));
      58       47426 :   const Real y2 = y * y;
      59       47426 :   const Real y3 = y2 * y;
      60       47426 :   const Real y4 = y3 * y;
      61       47426 :   const Real sgn = (p - 0.5 < 0.0 ? -1.0 : 1.0);
      62       47426 :   const Real Zp = sgn * (y + (_a[0] + _a[1] * y + _a[2] * y2 + _a[3] * y3 + _a[4] * y4) /
      63       47426 :                                  (_b[0] + _b[1] * y + _b[2] * y2 + _b[3] * y3 + _b[4] * y4));
      64       47426 :   return Zp * std_dev + mean;
      65             : }
      66             : 
      67             : Real
      68       12176 : Normal::pdf(const Real & x) const
      69             : {
      70       12176 :   return pdf(x, _mean, _standard_deviation);
      71             : }
      72             : 
      73             : Real
      74        1984 : Normal::cdf(const Real & x) const
      75             : {
      76        1984 :   return cdf(x, _mean, _standard_deviation);
      77             : }
      78             : 
      79             : Real
      80       32816 : Normal::quantile(const Real & p) const
      81             : {
      82       32816 :   return quantile(p, _mean, _standard_deviation);
      83             : }

Generated by: LCOV version 1.14