https://mooseframework.inl.gov
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. More...
 
virtual unsigned int nDim () const override
 Inputted number of dimensions. More...
 
virtual std::vector< RealquadraturePoint (const unsigned int n) const override
 Quadrature point n. More...
 
virtual Real quadraturePoint (const unsigned int n, const unsigned int dim) const override
 Quadrature point n for dimension dim. More...
 
virtual Real quadratureWeight (const unsigned int n) const override
 Weight for quadrature point n. More...
 

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 }
R poly(const C &c, const T x, const bool derivative=false)
std::vector< std::pair< std::vector< Real >, Real > > _quadrature
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(); }
std::vector< std::pair< std::vector< Real >, Real > > _quadrature

◆ 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  }
std::vector< std::pair< std::vector< Real >, Real > > _quadrature

◆ 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
std::vector< std::pair< std::vector< Real >, Real > > _quadrature

◆ 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  }
std::vector< std::pair< std::vector< Real >, Real > > _quadrature

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: