SG++

Combination technique functionality.
The combination technique is an older variant of sparse grids which only allows dimensional, but not spatial adaptivity. However, a central advantage is that global interpolation and quadrature schemes can be used, e.g. polynomial interpolation. This allows for high orders of convergence when using sufficiently smooth functions.
The functionality of the module includes
We will introduce some basic terminology and conventions here. For usage and more details on features, please refer to usage examples (C++) and usage examples (Python).
The combination technique is an abstract scheme to combine onedimensional numeric (linear) operations into a multidimensional operation. It provides a far better tradeoff between grid points and accuracy than working on a single regular/full grid \(X^{(1)} \times \ldots \times X^{(d)}\). For each dimension \(k \in \{1, \ldots, d\}\), the combination technique uses a sequence \((X^{(i)}_l)_{l \in \mathbb{N}_0}\) of 1Dgrids of increasing size. The index \(l\) is also called the level of the grid. Unlike many papers, the level \(l\) starts from zero in this implementation.
The combination technique evaluates a given function on multiple (rather small) regular/full grids \(X_l := X^{(1)}_{l_1} \times \ldots \times X^{(d)}_{l_d}, l \in I \subseteq \mathbb{N}_0^d\). Here, \(l\) is a multiindex which is also called level of the (multidimensional) grid. \(I\) is the set of multiindices of levels that corresponds to the regular/full grids that are evaluated. It must satisfy \(\forall l \in I: \forall j \in \mathbb{N}_0: ((\forall i \in \{1, \ldots, d\}: j_i \leq l_i) \Rightarrow j \in I)\). The results of all evaluated grids are combined to obtain a more precise numeric result. When we speak of adding levels, we mean inserting a level multiindex into \(I\) and incorporating the result of the evaluation on the added regular/full grid into the numerical approximation.
Standard approximations indicate that level multiindices with a higher sum of their components are potentially less important. For \(q \in \mathbb{N}_0\), this yields the set \(I = \{l \in \mathbb{N}_0^d \mid l_1 + \ldots + l_d \leq q\}\) of regular levels. Often, it is better to choose the set of levels adaptively. This module provides such adaption algorithms; they also work in parallel.
The combigrid module separates operators and grid points. For example, the quadrature operation computes its quadrature weights by integrating Lagrange polynomials on grid that you choose for it. If you choose a sequence of points for the first dimension, you also have to choose \(X^{(1)}_l\) for all \(l \in \mathbb{N}_0\), i.e. the number of grid points per level, which is also referred to as the growth of the (number of) grid points. It is generally advisable that the grid points are nested, i.e. \(X^{(i)}_0 \subseteq X^{(i)}_1 \subseteq X^{(i)}_2 \subseteq \ldots\), which may require a specific growth of the grid points. To simplify the decisions to be made, the combigrid module already provides suitable combinations of grid points, growths and operators.
The main functionality of the module is containted in
To use the UQ methods of the combigrid module, Dakota is required as a dependency. Integrate Dakota