12#include "libmesh/utility.h"
18#include "nlohmann/json.h"
38 virtual void store(std::ostream & stream,
void * context)
const;
39 virtual void store(nlohmann::json & json)
const;
40 virtual Real
compute(
const unsigned int order,
const Real
x,
const bool normalize =
true)
const;
43 computeDerivative(
const unsigned int order,
const Real
x,
const unsigned int m = 1)
const;
47 std::vector<Real> & points,
48 std::vector<Real> & weights)
const = 0;
50 std::vector<Real> & points,
51 std::vector<Real> & weights)
const;
61 Legendre(
const Real lower_bound,
const Real upper_bound);
62 virtual void store(std::ostream & stream,
void * context)
const override;
63 virtual void store(nlohmann::json & json)
const override;
67 compute(
const unsigned int order,
const Real
x,
const bool normalize =
true)
const override;
74 const unsigned int m = 1)
const override;
76 virtual Real
innerProduct(
const unsigned int order)
const override;
80 std::vector<Real> & points,
81 std::vector<Real> & weights)
const override;
85 std::vector<Real> & points,
86 std::vector<Real> & weights)
const override;
100 virtual void store(std::ostream & stream,
void * context)
const override;
101 virtual void store(nlohmann::json & json)
const override;
105 compute(
const unsigned int order,
const Real
x,
const bool normalize =
true)
const override;
110 const unsigned int m = 1)
const override;
111 virtual Real
innerProduct(
const unsigned int order)
const override;
115 std::vector<Real> & points,
116 std::vector<Real> & weights)
const override;
135 virtual unsigned int nDim()
const = 0;
151 TensorGrid(
const std::vector<unsigned int> & npoints,
152 std::vector<std::unique_ptr<const Polynomial>> & poly);
153 TensorGrid(
const unsigned int npoints, std::vector<std::unique_ptr<const Polynomial>> & poly)
158 virtual unsigned int nPoints()
const override {
return _quad->numRows(); };
159 virtual unsigned int nDim()
const override {
return _quad->numCols(); };
163 return _quad->computeRow(n);
165 virtual Real
quadraturePoint(
const unsigned int n,
const unsigned int dim)
const override
171 return _quad->computeWeight(n);
175 std::unique_ptr<const StochasticTools::WeightedCartesianProduct<Real, Real>>
_quad =
nullptr;
184 SmolyakGrid(
const unsigned int max_order, std::vector<std::unique_ptr<const Polynomial>> & poly);
187 virtual unsigned int nDim()
const override {
return _ndim; }
189 virtual std::vector<Real>
quadraturePoint(
const unsigned int n)
const override;
190 virtual Real
quadraturePoint(
const unsigned int n,
const unsigned int dim)
const override;
195 unsigned int gridIndex(
const unsigned int n)
const;
202 std::vector<std::unique_ptr<const StochasticTools::WeightedCartesianProduct<Real, Real>>>
_quad;
212 std::vector<std::unique_ptr<const Polynomial>> & poly);
215 virtual unsigned int nDim()
const override {
return _ndim; }
221 virtual Real
quadraturePoint(
const unsigned int n,
const unsigned int dim)
const override
238Real
legendre(
const unsigned int order,
240 const Real lower_bound = -1.0,
241 const Real upper_bound = 1.0);
246Real
hermite(
const unsigned int order,
const Real
x,
const Real
mu = 0.0,
const Real sig = 1.0);
257 std::vector<Real> & points,
258 std::vector<Real> & weights,
259 const Real lower_bound,
260 const Real upper_bound);
271 std::vector<Real> & points,
272 std::vector<Real> & weights,
277clenshaw_curtis(
const unsigned int order, std::vector<Real> & points, std::vector<Real> & weights);
282 std::unique_ptr<const PolynomialQuadrature::Polynomial> & ptr,
286 std::unique_ptr<const PolynomialQuadrature::Polynomial> & ptr,
const std::vector< double > x
void dataLoad(std::istream &stream, std::unique_ptr< const PolynomialQuadrature::Polynomial > &ptr, void *context)
void dataStore(std::ostream &stream, std::unique_ptr< const PolynomialQuadrature::Polynomial > &ptr, void *context)
void ErrorVector unsigned int
Clenshaw-Curtis sparse grid.
std::vector< std::pair< std::vector< Real >, Real > > _quadrature
virtual unsigned int nPoints() const override
Resulting number of quadrature points in grid.
virtual Real quadraturePoint(const unsigned int n, const unsigned int dim) const override
Quadrature point n for dimension dim.
virtual unsigned int nDim() const override
Inputted number of dimensions.
virtual std::vector< Real > quadraturePoint(const unsigned int n) const override
Quadrature point n.
virtual Real quadratureWeight(const unsigned int n) const override
Weight for quadrature point n.
Normal distributions use Hermite polynomials.
virtual void store(std::ostream &stream, void *context) 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\pi)
virtual Real innerProduct(const unsigned int order) const override
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}.
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!
Uniform distributions use Legendre polynomials.
Real computeDerivativeRef(const unsigned int order, const Real x, const unsigned int m=1) const
virtual Real innerProduct(const unsigned int order) const override
virtual void clenshawQuadrature(const unsigned int order, std::vector< Real > &points, std::vector< Real > &weights) const override
Just normal Clenshaw Curtis with shifted points.
virtual Real computeDerivative(const unsigned int order, const Real x, const unsigned int m=1) const override
Compute derivative of Legendre polynomial Recursive algorithm: d^m/dx^m P_n = (n + m - 1)d^(m-1)/dx^(...
virtual void gaussQuadrature(const unsigned int order, std::vector< Real > &points, std::vector< Real > &weights) const override
Gauss-Legendre quadrature: sum(weights) = 2.
virtual Real compute(const unsigned int order, const Real x, const bool normalize=true) const override
Legendre polynomial using static function then scales by <P_n^2> = 1 / (2n+1)
virtual void store(std::ostream &stream, void *context) const override
General polynomial class with function for evaluating a polynomial of a given order at a given point.
virtual void store(std::ostream &stream, void *context) const
Real productIntegral(const std::vector< unsigned int > order) const
virtual Real innerProduct(const unsigned int order) const =0
virtual void gaussQuadrature(const unsigned int order, std::vector< Real > &points, std::vector< Real > &weights) const =0
virtual ~Polynomial()=default
virtual void clenshawQuadrature(const unsigned int order, std::vector< Real > &points, std::vector< Real > &weights) const
virtual Real computeDerivative(const unsigned int order, const Real x, const unsigned int m=1) const
Computes the mth derivative of polynomial: d^mP_n/dx^m.
virtual Real compute(const unsigned int order, const Real x, const bool normalize=true) const
General multidimensional quadrature class.
virtual Real quadraturePoint(const unsigned int n, const unsigned int dim) const =0
Quadrature point n for dimension dim.
virtual unsigned int nPoints() const =0
Resulting number of quadrature points in grid.
virtual Real quadratureWeight(const unsigned int n) const =0
Weight for quadrature point n.
virtual unsigned int nDim() const =0
Inputted number of dimensions.
virtual ~Quadrature()=default
virtual std::vector< Real > quadraturePoint(const unsigned int n) const =0
Quadrature point n.
std::vector< int > _coeff
Modification of quadrature weight based on polynomial order.
virtual std::vector< Real > quadraturePoint(const unsigned int n) const override
Quadrature point n.
virtual Real quadratureWeight(const unsigned int n) const override
Weight for quadrature point n.
virtual unsigned int nDim() const override
Inputted number of dimensions.
virtual unsigned int nPoints() const override
Resulting number of quadrature points in grid.
std::vector< std::unique_ptr< const StochasticTools::WeightedCartesianProduct< Real, Real > > > _quad
Container for all the combinations of quadrature products.
std::vector< std::size_t > _npoints
Cumulative number of points for each quadrature product.
unsigned int gridIndex(const unsigned int n) const
Helper function to find which quadrature product to use.
Full tensor product of 1D quadratures.
std::unique_ptr< const StochasticTools::WeightedCartesianProduct< Real, Real > > _quad
virtual Real quadratureWeight(const unsigned int n) const override
Weight for quadrature point n.
TensorGrid(const unsigned int npoints, std::vector< std::unique_ptr< const Polynomial > > &poly)
virtual unsigned int nPoints() const override
Resulting number of quadrature points in grid.
virtual unsigned int nDim() const override
Inputted number of dimensions.
virtual std::vector< Real > quadraturePoint(const unsigned int n) const override
Quadrature point n.
virtual Real quadraturePoint(const unsigned int n, const unsigned int dim) const override
Quadrature point n for dimension dim.
Polynomials and quadratures based on defined distributions for Polynomial Chaos.
std::unique_ptr< const Polynomial > makePolynomial(const Distribution *dist)
void gauss_legendre(const unsigned int order, std::vector< Real > &points, std::vector< Real > &weights, const Real lower_bound, const Real upper_bound)
Generalized formula for any polynomial order.
void clenshaw_curtis(const unsigned int order, std::vector< Real > &points, std::vector< Real > &weights)
Real legendre(const unsigned int order, const Real x, const Real lower_bound=-1.0, const Real upper_bound=1.0)
Legendre polynomial of specified order.
Real hermite(const unsigned int order, const Real x, const Real mu=0.0, const Real sig=1.0)
Hermite polynomial of specified order.
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.