https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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{
25class Polynomial;
26
27std::unique_ptr<const Polynomial> makePolynomial(const Distribution * dist);
28
34{
35public:
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
58class Legendre : public Polynomial
59{
60public:
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
88private:
89 const Real _lower_bound;
90 const Real _upper_bound;
91};
92
96class Hermite : public Polynomial
97{
98public:
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
118private:
119 const Real _mu;
120 const Real _sig;
121};
122
127{
128public:
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
148class TensorGrid : public Quadrature
149{
150public:
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
174private:
175 std::unique_ptr<const StochasticTools::WeightedCartesianProduct<Real, Real>> _quad = nullptr;
176};
177
182{
183public:
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
193private:
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{
210public:
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
230private:
231 const unsigned int _ndim;
232 std::vector<std::pair<std::vector<Real>, Real>> _quadrature;
233};
234
238Real legendre(const unsigned int order,
239 const Real x,
240 const Real lower_bound = -1.0,
241 const Real upper_bound = 1.0);
242
246Real hermite(const unsigned int order, const Real x, const Real mu = 0.0, const Real sig = 1.0);
247
256void 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
270void 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
276void
277clenshaw_curtis(const unsigned int order, std::vector<Real> & points, std::vector<Real> & weights);
278}
279
280template <>
281void dataStore(std::ostream & stream,
282 std::unique_ptr<const PolynomialQuadrature::Polynomial> & ptr,
283 void * context);
284template <>
285void dataLoad(std::istream & stream,
286 std::unique_ptr<const PolynomialQuadrature::Polynomial> & ptr,
287 void * context);
const std::vector< double > x
const double mu
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)
unsigned int dim
void ErrorVector unsigned int
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 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 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.