Line data Source code
1 0 : // Distributed under the MIT License.
2 : // See LICENSE.txt for details.
3 :
4 : #pragma once
5 :
6 : #include <cstddef>
7 :
8 : #include "Utilities/Gsl.hpp"
9 :
10 : /// \cond
11 : class DataVector;
12 : class Matrix;
13 : /// \endcond
14 :
15 : namespace Spectral {
16 : /*!
17 : * \brief Computes the matrix for polynomial interpolation of a non-periodic
18 : * function known at the set of points \f$x_{source}\f$ to the set of points
19 : * \f$x_{target}\f$
20 : *
21 : * \details The algorithm is from \cite Fornberg1998. The returned matrix
22 : * \f$M\f$ will have \f$n_{target}\f$ rows and \f$n_{source}\f$ columns so that
23 : * \f$f_{target} = M f_{source}\f$
24 : *
25 : * \note The accuracy of the interpolation will depend upon the number and
26 : * distribution of the source points. It is strongly suggested that you
27 : * carefully investigate the accuracy for your use case.
28 : */
29 : template <typename TargetDataType>
30 1 : Matrix fornberg_interpolation_matrix(const TargetDataType& x_target,
31 : const DataVector& x_source);
32 :
33 : /*!
34 : * \brief Computes the weights for polynomial interpolation of a non-periodic
35 : * function known at the set of points \f$x_{source}\f$ to the point
36 : * \f$x_{target}\f$
37 : *
38 : * \details The algorithm is from \cite Fornberg1998. The DataVectors in the
39 : * array will be set to the size of \f$x_{source}\f$, where the first index
40 : * of the array holds the weights to interpolate a function from the grid
41 : * \f$x_{source}\f$ to \f$x_{target}\f$, the second index of the array holds
42 : * the weights to interpolate the first derivative of a function, and
43 : * so on.
44 : *
45 : * Calculating for the \f$n\f$-th derivative will yield all lower order
46 : * derivatives as well. If you just want the interpolation coefficients, use
47 : * `fornberg_interpolation_matrix`.
48 : *
49 : *
50 : * \note The accuracy of the interpolation will depend upon the number and
51 : * distribution of the source points. It is strongly suggested that you
52 : * carefully investigate the accuracy for your use case.
53 : */
54 : template <size_t MaxOrder>
55 1 : void fornberg_derivative_interpolation_weights(
56 : gsl::not_null<std::array<DataVector, MaxOrder + 1>*> result,
57 : double x_target, const DataVector& x_source);
58 :
59 : /*!
60 : * \brief Computes the matrix for interpolating a periodic function known at
61 : * the set of \f$n\f$ equally spaced points on the periodic domain \f$[0, 2
62 : * \pi]\f$ to the set of points \f$x_{target}\f$
63 : *
64 : * \details The returned matrix \f$M\f$ will have \f$n_{target}\f$ rows and
65 : * \f$n_{source}\f$ columns so that \f$f_{target} = M f_{source}\f$
66 : * Formally, this computes the sum
67 : * \f[ n w_j = 1 + 2 \sum_{k=1}^{\lfloor (n-1)/2 \rfloor} \cos(k(x - X_j))
68 : * \left[ + \cos\left(\frac{n}{2}(x - X_j)\right) \right] \f]
69 : * for each target point \f$x\f$, where \f$ X_j = \frac{2 \pi j}{n}\f$, and
70 : * the term in brackets is evaluated only if \f$n\f$ is even.
71 : *
72 : */
73 : template <typename TargetDataType>
74 1 : Matrix fourier_interpolation_matrix(const TargetDataType& x_target,
75 : size_t n_source_points);
76 : } // namespace Spectral
|