https://mooseframework.inl.gov
Public Member Functions | Private Attributes | List of all members
PolynomialQuadrature::Hermite Class Reference

Normal distributions use Hermite polynomials. More...

#include <PolynomialQuadrature.h>

Inheritance diagram for PolynomialQuadrature::Hermite:
[legend]

Public Member Functions

 Hermite (const Real mu, const Real sig)
 
virtual void store (std::ostream &stream, void *context) const override
 
virtual void store (nlohmann::json &json) const override
 
virtual Real compute (const unsigned int order, const Real x, const bool normalize=true) const override
 Hermite polynomial using static function then scales by <P_n^2> = n! More...
 
virtual Real computeDerivative (const unsigned int order, const Real x, const unsigned int m=1) const override
 Compute derivative of Hermite polynomial P'n = nP{n-1}. More...
 
virtual Real innerProduct (const unsigned int order) const override
 
virtual void gaussQuadrature (const unsigned int order, std::vector< Real > &points, std::vector< Real > &weights) const override
 Gauss-Hermite quadrature: sum(weights) = sqrt(2) More...
 
virtual void clenshawQuadrature (const unsigned int order, std::vector< Real > &points, std::vector< Real > &weights) const
 
Real productIntegral (const std::vector< unsigned int > order) const
 

Private Attributes

const Real _mu
 
const Real _sig
 

Detailed Description

Normal distributions use Hermite polynomials.

Definition at line 96 of file PolynomialQuadrature.h.

Constructor & Destructor Documentation

◆ Hermite()

PolynomialQuadrature::Hermite::Hermite ( const Real  mu,
const Real  sig 
)

Definition at line 240 of file PolynomialQuadrature.C.

Member Function Documentation

◆ clenshawQuadrature()

void PolynomialQuadrature::Polynomial::clenshawQuadrature ( const unsigned int  order,
std::vector< Real > &  points,
std::vector< Real > &  weights 
) const
virtualinherited

Reimplemented in PolynomialQuadrature::Legendre.

Definition at line 81 of file PolynomialQuadrature.C.

84 {
85  ::mooseError("Clenshaw quadrature has not been implemented for this polynomial type.");
86 }

◆ compute()

Real PolynomialQuadrature::Hermite::compute ( const unsigned int  order,
const Real  x,
const bool  normalize = true 
) const
overridevirtual

Hermite polynomial using static function then scales by <P_n^2> = n!

Reimplemented from PolynomialQuadrature::Polynomial.

Definition at line 266 of file PolynomialQuadrature.C.

267 {
268  Real val = hermite(order, x, _mu, _sig);
269  if (normalize)
270  val /= innerProduct(order);
271  return val;
272 }
virtual Real innerProduct(const unsigned int order) const override
const std::vector< double > x
Real hermite(const unsigned int order, const Real x, const Real mu=0.0, const Real sig=1.0)
Hermite polynomial of specified order.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ computeDerivative()

Real PolynomialQuadrature::Hermite::computeDerivative ( const unsigned int  order,
const Real  x,
const unsigned int  m = 1 
) const
overridevirtual

Compute derivative of Hermite polynomial P'n = nP{n-1}.

Reimplemented from PolynomialQuadrature::Polynomial.

Definition at line 275 of file PolynomialQuadrature.C.

276 {
277  if (m > order)
278  return 0.0;
279 
280  Real xref = (x - _mu) / _sig;
281  Real val = hermite(order - m, xref);
282  for (unsigned int i = 0; i < m; ++i)
283  val *= static_cast<Real>(order - i) / _sig;
284 
285  return val;
286 }
const std::vector< double > x
Real hermite(const unsigned int order, const Real x, const Real mu=0.0, const Real sig=1.0)
Hermite polynomial of specified order.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ gaussQuadrature()

void PolynomialQuadrature::Hermite::gaussQuadrature ( const unsigned int  order,
std::vector< Real > &  points,
std::vector< Real > &  weights 
) const
overridevirtual

Gauss-Hermite quadrature: sum(weights) = sqrt(2)

Implements PolynomialQuadrature::Polynomial.

Definition at line 289 of file PolynomialQuadrature.C.

292 {
293  gauss_hermite(order, points, weights, _mu, _sig);
294 }
void gauss_hermite(const unsigned int order, std::vector< Real > &points, std::vector< Real > &weights, const Real mu, const Real sig)
Generalized formula for any polynomial order.

◆ innerProduct()

Real PolynomialQuadrature::Hermite::innerProduct ( const unsigned int  order) const
overridevirtual

Implements PolynomialQuadrature::Polynomial.

Definition at line 243 of file PolynomialQuadrature.C.

Referenced by compute().

244 {
245  return (Real)Utility::factorial(order);
246 }

◆ productIntegral()

Real PolynomialQuadrature::Polynomial::productIntegral ( const std::vector< unsigned int order) const
inherited

Definition at line 89 of file PolynomialQuadrature.C.

90 {
91  const unsigned int nprod = order.size();
92 
93  if (nprod == 1)
94  return (order[0] == 0 ? 1.0 : 0.0);
95  else if (nprod == 2)
96  return (order[0] == order[1] ? innerProduct(order[0]) : 0.0);
97 
98  unsigned int poly_order = std::accumulate(order.begin(), order.end(), 0);
99  unsigned int quad_order = (poly_order % 2 == 0 ? poly_order : poly_order - 1) / 2;
100 
101  std::vector<Real> xq;
102  std::vector<Real> wq;
103  gaussQuadrature(quad_order, xq, wq);
104 
105  Real val = 0.0;
106  for (unsigned int q = 0; q < xq.size(); ++q)
107  {
108  Real prod = wq[q];
109  for (unsigned int i = 0; i < nprod; ++i)
110  prod *= compute(order[i], xq[q], false);
111  val += prod;
112  }
113 
114  return val / std::accumulate(wq.begin(), wq.end(), 0.0);
115 }
virtual void gaussQuadrature(const unsigned int order, std::vector< Real > &points, std::vector< Real > &weights) const =0
virtual Real compute(const unsigned int order, const Real x, const bool normalize=true) const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual Real innerProduct(const unsigned int order) const =0

◆ store() [1/2]

void PolynomialQuadrature::Hermite::store ( std::ostream &  stream,
void context 
) const
overridevirtual

Reimplemented from PolynomialQuadrature::Polynomial.

Definition at line 249 of file PolynomialQuadrature.C.

250 {
251  std::string type = "Hermite";
252  dataStore(stream, type, context);
253  dataStore(stream, _mu, context);
254  dataStore(stream, _sig, context);
255 }
void dataStore(std::ostream &stream, std::unique_ptr< const PolynomialQuadrature::Polynomial > &ptr, void *context)

◆ store() [2/2]

void PolynomialQuadrature::Hermite::store ( nlohmann::json &  json) const
overridevirtual

Reimplemented from PolynomialQuadrature::Polynomial.

Definition at line 258 of file PolynomialQuadrature.C.

259 {
260  json["type"] = "Hermite";
261  json["mu"] = _mu;
262  json["sig"] = _sig;
263 }

Member Data Documentation

◆ _mu

const Real PolynomialQuadrature::Hermite::_mu
private

Definition at line 119 of file PolynomialQuadrature.h.

Referenced by compute(), computeDerivative(), gaussQuadrature(), and store().

◆ _sig

const Real PolynomialQuadrature::Hermite::_sig
private

Definition at line 120 of file PolynomialQuadrature.h.

Referenced by compute(), computeDerivative(), gaussQuadrature(), and store().


The documentation for this class was generated from the following files: