33[[nodiscard]] std::pair<Eigen::MatrixX<T>, Eigen::MatrixX<T>>
associatedLegendre(
const T& theta,
size_t ndegree = 10)
36 int N =
static_cast<int>(ndegree + 2);
38 Eigen::MatrixX<T> P = Eigen::MatrixX<T>::Zero(N, N);
39 Eigen::MatrixX<T> Pd = Eigen::MatrixX<T>::Zero(N, N);
41#if defined(__GNUC__) || defined(__clang__)
42 #pragma GCC diagnostic push
43 #pragma GCC diagnostic ignored "-Wnull-dereference"
47 P(1, 0) = std::numbers::sqrt3 * std::cos(theta);
48 P(1, 1) = std::numbers::sqrt3 * std::sin(theta);
49#if defined(__GNUC__) || defined(__clang__)
50 #pragma GCC diagnostic pop
53 for (
int n = 2; n <= N - 1; n++)
55 auto nd =
static_cast<double>(n);
56 P(n, n) = std::sqrt((2.0 * nd + 1.0) / (2.0 * nd)) * std::sin(theta) * P(n - 1, n - 1);
58 for (
int m = 0; m <= n; m++)
60 auto md =
static_cast<double>(m);
64 P(n, m) = std::sqrt(((2.0 * nd + 1.0) * (2.0 * nd - 1.0)) / ((nd + md) * (nd - md))) * std::cos(theta) * P(n - 1, m);
68 P(n, m) = std::sqrt(((2.0 * nd + 1.0) * (2.0 * nd - 1.0)) / ((nd + md) * (nd - md))) * std::cos(theta) * P(n - 1, m)
69 - std::sqrt(((2.0 * nd + 1.0) * (nd + md - 1.0) * (nd - md - 1.0)) / ((2.0 * nd - 3.0) * (nd + md) * (nd - md))) * std::cos(theta) * P(n - 2, m);
76 Pd(1, 0) = -std::numbers::sqrt3 * std::sin(theta);
77 Pd(1, 1) = std::numbers::sqrt3 * std::cos(theta);
79 for (
int n = 2; n <= N - 1; n++)
81 auto nd =
static_cast<double>(n);
83 Pd(n, 0) = -0.5 * std::sqrt(2.0 * nd * (nd + 1.0)) * P(n, 1);
84 Pd(n, 1) = 0.5 * (std::sqrt(2.0 * nd * (nd + 1.0)) * P(n, 0) - std::sqrt((nd - 1.0) * (nd + 2.0)) * std::pow(P(n, 2), 2.0));
86 for (
int m = 2; m <= n - 1; m++)
88 auto md =
static_cast<double>(m);
91 Pd(n, m) = 0.5 * (std::sqrt((nd + md) * (nd - md + 1.0)) * P(n, m - 1) - std::sqrt((nd - md) * (nd + md + 1.0)) * P(n, m + 1));
95 return std::make_pair(P, Pd);
std::pair< Eigen::MatrixX< T >, Eigen::MatrixX< T > > associatedLegendre(const T &theta, size_t ndegree=10)
Calculates the associated Legendre Polynomial coefficients necessary for the EGM96.
Definition AssociatedLegendre.hpp:33