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 "NumericalAlgorithms/Spectral/CollocationPointsAndWeights.hpp"
9 :
10 : /// \cond
11 : class DataVector;
12 : class Matrix;
13 : namespace Spectral {
14 : enum class Quadrature : uint8_t;
15 : enum class Parity : uint8_t;
16 : } // namespace Spectral
17 : /// \endcond
18 :
19 : namespace Spectral {
20 :
21 : /*!
22 : * \ingroup SpectralGroup
23 : *
24 : * \brief A collection of helper functions for the radial functions used in
25 : * Zernike polyomials
26 : *
27 : */
28 : template <size_t Dim>
29 1 : class Zernike {
30 : public:
31 : /*!
32 : * \brief Value of the basis function \f$\Phi^m_n(\xi) = R^m_n(r)\f$,
33 : * where \f$r \equiv \frac{1}{2} (\xi + 1)\f$, implemented from
34 : * \cite Matsushima1995
35 : */
36 : template <typename T>
37 1 : static T basis_function_value(size_t n, size_t m, const T& xi);
38 :
39 : /*!
40 : * \brief Collocation points \f${x_i}\f$ and quadrature weights \f${w_i}\f$
41 : */
42 : static std::pair<DataVector, DataVector>
43 1 : compute_collocation_points_and_weights(size_t num_points);
44 :
45 : /*!
46 : * \brief Matrix \f$D_{i,j}\f$ used to obtain the first derivative for a
47 : * given parity.
48 : *
49 : * Due to the clustering of Zernike collocation toward the upper side, the
50 : * generic implementation of derivatives with barycentric weights yields
51 : * large errors. By utilizing the fact that the Zernike bases' \f$m\f$
52 : * corresponds to parity of representable functions, we can extend the
53 : * function to negative \f$r\f$ before forming the matrix, greatly improving
54 : * accuracy.
55 : */
56 1 : static Matrix differentiation_matrix(size_t num_points, Parity parity);
57 :
58 : /*!
59 : * \brief %Matrix used to interpolate to the \p target_points.
60 : *
61 : * Due to the clustering of Zernike collocation toward the upper side, the
62 : * generic barycentric interpolation yields large errors. By utilizing the
63 : * fact that the Zernike bases' \f$m\f$ corresponds to parity of
64 : * representable functions, we extend the function to negative \f$r\f$ before
65 : * forming the matrix, greatly improving accuracy.
66 : *
67 : * The returned matrix \f$M\f$ has \f$n_\mathrm{target}\f$ rows and
68 : * \p num_points columns, so that \f$f_\mathrm{target} = M
69 : * f_\mathrm{source}\f$.
70 : *
71 : * This should only be used for ZernikeB1. To interpolate ZernikeB2 or
72 : * ZernikeB3, look at Irregular or Cardinal.
73 : */
74 : template <typename T>
75 1 : static Matrix interpolation_matrix(size_t num_points, const T& target_points,
76 : Parity parity);
77 : };
78 : } // namespace Spectral
|