https://mooseframework.inl.gov
PolynomialQuadrature.h
Go to the documentation of this file.
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 #pragma once
11 
12 #include "libmesh/utility.h"
13 
14 #include "DataIO.h"
15 #include "Uniform.h"
16 #include "Normal.h"
17 #include "CartesianProduct.h"
18 #include "nlohmann/json.h"
19 
24 {
25 class Polynomial;
26 
27 std::unique_ptr<const Polynomial> makePolynomial(const Distribution * dist);
28 
34 {
35 public:
37  virtual ~Polynomial() = default;
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;
42  virtual Real
43  computeDerivative(const unsigned int order, const Real x, const unsigned int m = 1) const;
44  virtual Real innerProduct(const unsigned int order) const = 0;
45 
46  virtual void gaussQuadrature(const unsigned int order,
47  std::vector<Real> & points,
48  std::vector<Real> & weights) const = 0;
49  virtual void clenshawQuadrature(const unsigned int order,
50  std::vector<Real> & points,
51  std::vector<Real> & weights) const;
52  Real productIntegral(const std::vector<unsigned int> order) const;
53 };
54 
58 class Legendre : public Polynomial
59 {
60 public:
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;
64 
66  virtual Real
67  compute(const unsigned int order, const Real x, const bool normalize = true) const override;
72  virtual Real computeDerivative(const unsigned int order,
73  const Real x,
74  const unsigned int m = 1) const override;
75  Real computeDerivativeRef(const unsigned int order, const Real x, const unsigned int m = 1) const;
76  virtual Real innerProduct(const unsigned int order) const override;
77 
79  virtual void gaussQuadrature(const unsigned int order,
80  std::vector<Real> & points,
81  std::vector<Real> & weights) const override;
82 
84  virtual void clenshawQuadrature(const unsigned int order,
85  std::vector<Real> & points,
86  std::vector<Real> & weights) const override;
87 
88 private:
91 };
92 
96 class Hermite : public Polynomial
97 {
98 public:
99  Hermite(const Real mu, const Real sig);
100  virtual void store(std::ostream & stream, void * context) const override;
101  virtual void store(nlohmann::json & json) const override;
102 
104  virtual Real
105  compute(const unsigned int order, const Real x, const bool normalize = true) const override;
106 
108  virtual Real computeDerivative(const unsigned int order,
109  const Real x,
110  const unsigned int m = 1) const override;
111  virtual Real innerProduct(const unsigned int order) const override;
112 
114  virtual void gaussQuadrature(const unsigned int order,
115  std::vector<Real> & points,
116  std::vector<Real> & weights) const override;
117 
118 private:
119  const Real _mu;
120  const Real _sig;
121 };
122 
127 {
128 public:
130  virtual ~Quadrature() = default;
131 
133  virtual unsigned int nPoints() const = 0;
135  virtual unsigned int nDim() const = 0;
136 
138  virtual std::vector<Real> quadraturePoint(const unsigned int n) const = 0;
140  virtual Real quadraturePoint(const unsigned int n, const unsigned int dim) const = 0;
142  virtual Real quadratureWeight(const unsigned int n) const = 0;
143 };
144 
148 class TensorGrid : public Quadrature
149 {
150 public:
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)
154  : TensorGrid(std::vector<unsigned int>(poly.size(), npoints), poly)
155  {
156  }
157 
158  virtual unsigned int nPoints() const override { return _quad->numRows(); };
159  virtual unsigned int nDim() const override { return _quad->numCols(); };
160 
161  virtual std::vector<Real> quadraturePoint(const unsigned int n) const override
162  {
163  return _quad->computeRow(n);
164  };
165  virtual Real quadraturePoint(const unsigned int n, const unsigned int dim) const override
166  {
167  return _quad->computeValue(n, dim);
168  };
169  virtual Real quadratureWeight(const unsigned int n) const override
170  {
171  return _quad->computeWeight(n);
172  };
173 
174 private:
175  std::unique_ptr<const StochasticTools::WeightedCartesianProduct<Real, Real>> _quad = nullptr;
176 };
177 
181 class SmolyakGrid : public Quadrature
182 {
183 public:
184  SmolyakGrid(const unsigned int max_order, std::vector<std::unique_ptr<const Polynomial>> & poly);
185 
186  virtual unsigned int nPoints() const override { return _npoints.back(); }
187  virtual unsigned int nDim() const override { return _ndim; }
188 
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;
191  virtual Real quadratureWeight(const unsigned int n) const override;
192 
193 private:
195  unsigned int gridIndex(const unsigned int n) const;
196  const unsigned int _ndim;
198  std::vector<std::size_t> _npoints;
200  std::vector<int> _coeff;
202  std::vector<std::unique_ptr<const StochasticTools::WeightedCartesianProduct<Real, Real>>> _quad;
203 };
204 
209 {
210 public:
211  ClenshawCurtisGrid(const unsigned int max_order,
212  std::vector<std::unique_ptr<const Polynomial>> & poly);
213 
214  virtual unsigned int nPoints() const override { return _quadrature.size(); }
215  virtual unsigned int nDim() const override { return _ndim; }
216 
217  virtual std::vector<Real> quadraturePoint(const unsigned int n) const override
218  {
219  return _quadrature[n].first;
220  }
221  virtual Real quadraturePoint(const unsigned int n, const unsigned int dim) const override
222  {
223  return _quadrature[n].first[dim];
224  }
225  virtual Real quadratureWeight(const unsigned int n) const override
226  {
227  return _quadrature[n].second;
228  }
229 
230 private:
231  const unsigned int _ndim;
232  std::vector<std::pair<std::vector<Real>, Real>> _quadrature;
233 };
234 
238 Real legendre(const unsigned int order,
239  const Real x,
240  const Real lower_bound = -1.0,
241  const Real upper_bound = 1.0);
242 
246 Real hermite(const unsigned int order, const Real x, const Real mu = 0.0, const Real sig = 1.0);
247 
256 void gauss_legendre(const unsigned int order,
257  std::vector<Real> & points,
258  std::vector<Real> & weights,
259  const Real lower_bound,
260  const Real upper_bound);
261 
270 void gauss_hermite(const unsigned int order,
271  std::vector<Real> & points,
272  std::vector<Real> & weights,
273  const Real mu,
274  const Real sig);
275 
276 void
277 clenshaw_curtis(const unsigned int order, std::vector<Real> & points, std::vector<Real> & weights);
278 }
279 
280 template <>
281 void dataStore(std::ostream & stream,
282  std::unique_ptr<const PolynomialQuadrature::Polynomial> & ptr,
283  void * context);
284 template <>
285 void dataLoad(std::istream & stream,
286  std::unique_ptr<const PolynomialQuadrature::Polynomial> & ptr,
287  void * context);
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.
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&#39;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^(...
unsigned int dim
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
Definition: NS.h:123
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
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 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.