https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Public Member Functions | Private Attributes | List of all members
PolynomialQuadrature::ClenshawCurtisGrid Class Reference

Clenshaw-Curtis sparse grid. More...

#include <PolynomialQuadrature.h>

Inheritance diagram for PolynomialQuadrature::ClenshawCurtisGrid:
[legend]

Public Member Functions

 ClenshawCurtisGrid (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 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.
 
virtual Real quadratureWeight (const unsigned int n) const override
 Weight for quadrature point n.
 

Private Attributes

const unsigned int _ndim
 
std::vector< std::pair< std::vector< Real >, Real > > _quadrature
 

Detailed Description

Clenshaw-Curtis sparse grid.

Definition at line 208 of file PolynomialQuadrature.h.

Constructor & Destructor Documentation

◆ ClenshawCurtisGrid()

PolynomialQuadrature::ClenshawCurtisGrid::ClenshawCurtisGrid ( const unsigned int  max_order,
std::vector< std::unique_ptr< const Polynomial > > &  poly 
)

Definition at line 521 of file PolynomialQuadrature.C.

523 : _ndim(poly.size())
524{
525 // Compute full tensor tuple
526 std::vector<std::vector<unsigned int>> tuple_1d(_ndim);
527 for (unsigned int d = 0; d < _ndim; ++d)
528 {
529 tuple_1d[d].resize(max_order);
530 for (unsigned int i = 0; i < max_order; ++i)
531 tuple_1d[d][i] = i;
532 }
534
535 // Curtis clenshaw has a lot of nested points,
536 // so it behooves us to avoid duplicate points
537 std::map<std::vector<Real>, Real> quad_map;
538 unsigned int maxq = max_order - 1;
539 unsigned int minq = (max_order > _ndim ? max_order - _ndim : 0);
540 for (std::size_t p = 0; p < tensor_tuple.numRows(); ++p)
541 {
542 std::vector<unsigned int> dorder = tensor_tuple.computeRow(p);
543 unsigned int q = std::accumulate(dorder.begin(), dorder.end(), 0);
544 if (q <= maxq && q >= minq)
545 {
546 int sgn = ((max_order - q - 1) % 2 == 0 ? 1 : -1);
547 Real coeff = static_cast<Real>(sgn * Utility::binomial(_ndim - 1, _ndim + q - max_order));
548
549 std::vector<std::vector<Real>> qpoints_1D(_ndim);
550 std::vector<std::vector<Real>> qweights_1D(_ndim);
551 for (unsigned int d = 0; d < poly.size(); ++d)
552 poly[d]->clenshawQuadrature(dorder[d], qpoints_1D[d], qweights_1D[d]);
553
554 StochasticTools::WeightedCartesianProduct<Real, Real> quad(qpoints_1D, qweights_1D);
555
556 for (unsigned int i = 0; i < quad.numRows(); ++i)
557 quad_map[quad.computeRow(i)] += coeff * quad.computeWeight(i);
558 }
559 }
560
561 _quadrature.reserve(quad_map.size());
562 for (const auto & it : quad_map)
563 _quadrature.push_back(it);
564}
const Real p
std::vector< std::pair< std::vector< Real >, Real > > _quadrature
R poly(const C &c, const T x, const bool derivative=false)
int sgn(T val)
The sign function.
Definition Numerics.h:41
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

Member Function Documentation

◆ nDim()

virtual unsigned int PolynomialQuadrature::ClenshawCurtisGrid::nDim ( ) const
inlineoverridevirtual

Inputted number of dimensions.

Implements PolynomialQuadrature::Quadrature.

Definition at line 215 of file PolynomialQuadrature.h.

215{ return _ndim; }

◆ nPoints()

virtual unsigned int PolynomialQuadrature::ClenshawCurtisGrid::nPoints ( ) const
inlineoverridevirtual

Resulting number of quadrature points in grid.

Implements PolynomialQuadrature::Quadrature.

Definition at line 214 of file PolynomialQuadrature.h.

214{ return _quadrature.size(); }

◆ quadraturePoint() [1/2]

virtual std::vector< Real > PolynomialQuadrature::ClenshawCurtisGrid::quadraturePoint ( const unsigned int  n) const
inlineoverridevirtual

Quadrature point n.

Implements PolynomialQuadrature::Quadrature.

Definition at line 217 of file PolynomialQuadrature.h.

218 {
219 return _quadrature[n].first;
220 }

◆ quadraturePoint() [2/2]

virtual Real PolynomialQuadrature::ClenshawCurtisGrid::quadraturePoint ( const unsigned int  n,
const unsigned int  dim 
) const
inlineoverridevirtual

Quadrature point n for dimension dim.

Implements PolynomialQuadrature::Quadrature.

Definition at line 221 of file PolynomialQuadrature.h.

222 {
223 return _quadrature[n].first[dim];
224 }
unsigned int dim

◆ quadratureWeight()

virtual Real PolynomialQuadrature::ClenshawCurtisGrid::quadratureWeight ( const unsigned int  n) const
inlineoverridevirtual

Weight for quadrature point n.

Implements PolynomialQuadrature::Quadrature.

Definition at line 225 of file PolynomialQuadrature.h.

226 {
227 return _quadrature[n].second;
228 }

Member Data Documentation

◆ _ndim

const unsigned int PolynomialQuadrature::ClenshawCurtisGrid::_ndim
private

Definition at line 231 of file PolynomialQuadrature.h.

Referenced by ClenshawCurtisGrid(), and nDim().

◆ _quadrature

std::vector<std::pair<std::vector<Real>, Real> > PolynomialQuadrature::ClenshawCurtisGrid::_quadrature
private

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