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;
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;
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;
115 std::vector<Real> & points,
116 std::vector<Real> & weights)
const override;
133 virtual unsigned int nPoints()
const = 0;
135 virtual unsigned int nDim()
const = 0;
138 virtual std::vector<Real>
quadraturePoint(
const unsigned int n)
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);
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;
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; }
240 const Real lower_bound = -1.0,
241 const Real upper_bound = 1.0);
246 Real 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,
277 clenshaw_curtis(
const unsigned int order, std::vector<Real> & points, std::vector<Real> & weights);
282 std::unique_ptr<const PolynomialQuadrature::Polynomial> & ptr,
285 void dataLoad(std::istream & stream,
286 std::unique_ptr<const PolynomialQuadrature::Polynomial> & ptr,
virtual void gaussQuadrature(const unsigned int order, std::vector< Real > &points, std::vector< Real > &weights) const =0
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.
virtual unsigned int nDim() const override
Inputted number of dimensions.
Clenshaw-Curtis sparse grid.
General multidimensional quadrature class.
R poly(const C &c, const T x, const bool derivative=false)
virtual Real quadratureWeight(const unsigned int n) const override
Weight for quadrature point n.
Normal distributions use Hermite polynomials.
std::unique_ptr< const Polynomial > makePolynomial(const Distribution *dist)
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}.
SmolyakGrid(const unsigned int max_order, std::vector< std::unique_ptr< const Polynomial >> &poly)
virtual unsigned int nPoints() const override
Resulting number of quadrature points in grid.
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 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!
TensorGrid(const std::vector< unsigned int > &npoints, std::vector< std::unique_ptr< const Polynomial >> &poly)
virtual Real quadratureWeight(const unsigned int n) const override
Weight for quadrature point n.
Real computeDerivativeRef(const unsigned int order, const Real x, const unsigned int m=1) const
Uniform distributions use Legendre polynomials.
virtual unsigned int nPoints() const override
Resulting number of quadrature points in grid.
Real productIntegral(const std::vector< unsigned int > order) const
std::vector< std::pair< std::vector< Real >, Real > > _quadrature
virtual Real quadratureWeight(const unsigned int n) const override
Weight for quadrature point n.
virtual Real innerProduct(const unsigned int order) const override
void dataStore(std::ostream &stream, std::unique_ptr< const PolynomialQuadrature::Polynomial > &ptr, void *context)
virtual std::vector< Real > quadraturePoint(const unsigned int n) const override
Quadrature point n.
Legendre(const Real lower_bound, const Real upper_bound)
virtual unsigned int nPoints() const =0
Resulting number of quadrature points in grid.
virtual void gaussQuadrature(const unsigned int order, std::vector< Real > &points, std::vector< Real > &weights) const override
Gauss-Hermite quadrature: sum(weights) = sqrt(2)
ClenshawCurtisGrid(const unsigned int max_order, std::vector< std::unique_ptr< const Polynomial >> &poly)
const std::vector< double > x
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-Legendre quadrature: sum(weights) = 2.
static const std::string mu
virtual Real compute(const unsigned int order, const Real x, const bool normalize=true) const
unsigned int gridIndex(const unsigned int n) const
Helper function to find which quadrature product to use.
std::vector< std::size_t > _npoints
Cumulative number of points for each quadrature product.
virtual void store(std::ostream &stream, void *context) const
virtual ~Polynomial()=default
void clenshaw_curtis(const unsigned int order, std::vector< Real > &points, std::vector< Real > &weights)
Real hermite(const unsigned int order, const Real x, const Real mu=0.0, const Real sig=1.0)
Hermite polynomial of specified order.
virtual Real quadratureWeight(const unsigned int n) const =0
Weight for quadrature point n.
virtual void store(std::ostream &stream, void *context) const override
virtual ~Quadrature()=default
virtual unsigned int nDim() const override
Inputted number of dimensions.
Hermite(const Real mu, const Real sig)
General polynomial class with function for evaluating a polynomial of a given order at a given point...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
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.
Polynomials and quadratures based on defined distributions for Polynomial Chaos.
virtual std::vector< Real > quadraturePoint(const unsigned int n) const override
Quadrature point n.
TensorGrid(const unsigned int npoints, std::vector< std::unique_ptr< const Polynomial >> &poly)
virtual unsigned int nDim() const override
Inputted number of dimensions.
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.
virtual Real quadraturePoint(const unsigned int n, const unsigned int dim) const override
Quadrature point n for dimension dim.
void dataLoad(std::istream &stream, std::unique_ptr< const PolynomialQuadrature::Polynomial > &ptr, void *context)
virtual void clenshawQuadrature(const unsigned int order, std::vector< Real > &points, std::vector< Real > &weights) const override
Just normal Clenshaw Curtis with shifted points.
std::unique_ptr< const StochasticTools::WeightedCartesianProduct< Real, Real > > _quad
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 std::vector< Real > quadraturePoint(const unsigned int n) const override
Quadrature point n.
Full tensor product of 1D quadratures.
virtual Real innerProduct(const unsigned int order) const =0
virtual Real quadraturePoint(const unsigned int n, const unsigned int dim) const override
Quadrature point n for dimension dim.
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.
void ErrorVector unsigned int
virtual unsigned int nDim() const =0
Inputted number of dimensions.
virtual Real innerProduct(const unsigned int order) const override
virtual std::vector< Real > quadraturePoint(const unsigned int n) const =0
Quadrature point n.
virtual void clenshawQuadrature(const unsigned int order, std::vector< Real > &points, std::vector< Real > &weights) const
std::vector< int > _coeff
Modification of quadrature weight based on polynomial order.
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.