26constexpr int nmax = 9;
28std::array<Eigen::Matrix<double, nmax + 1, nmax + 1>, 2> calcLegendrePolynomials(
const Eigen::Vector3d& lla_pos)
31 double x = std::cos(lla_pos(0)) * std::cos(lla_pos(1));
32 double y = std::cos(lla_pos(0)) * std::sin(lla_pos(1));
33 double z = std::sin(lla_pos(0));
36 Eigen::Matrix<double, nmax + 1, nmax + 1> V;
37 Eigen::Matrix<double, nmax + 1, nmax + 1> W;
41 V(1, 0) = z * V(0, 0);
44 for (
int n = 2; n <= nmax; n++)
46 auto dn =
static_cast<double>(n);
47 V(n, 0) = ((2 * dn - 1) * z * V(n - 1, 0) - (dn - 1) * V(n - 2, 0)) / dn;
50 for (
int m = 1; m <= nmax; m++)
52 auto dm =
static_cast<double>(m);
53 V(m, m) = (2 * dm - 1) * (x * V(m - 1, m - 1) - y * W(m - 1, m - 1));
54 W(m, m) = (2 * dm - 1) * (x * W(m - 1, m - 1) + y * V(m - 1, m - 1));
57 V(m + 1, m) = (2 * dm + 1) * z * V(m, m);
58 W(m + 1, m) = (2 * dm + 1) * z * W(m, m);
60 for (
int n = m + 2; n <= nmax; n++)
62 auto dn =
static_cast<double>(n);
63 V(n, m) = ((2 * dn - 1) * z * V(n - 1, m) - (dn + dm - 1) * V(n - 2, m)) / (dn - dm);
64 W(n, m) = ((2 * dn - 1) * z * W(n - 1, m) - (dn + dm - 1) * W(n - 2, m)) / (dn - dm);
81 double doy = mjd - 44239.0 + 1 - 28;
83 auto [V, W] = calcLegendrePolynomials(lla_pos);
102 double ch = c0h + ((std::cos(doy / 365.25 * 2 * M_PI + phh) + 1) * c11h / 2 + c10h) * (1 - std::cos(lla_pos(0)));
107 for (
int n = 0; n <= nmax; n++)
109 for (
int m = 0; m <= n; m++)
111 ahm = ahm + (ah_mean.at(i) * V(n, m) + bh_mean.at(i) * W(n, m));
112 aha = aha + (ah_amp.at(i) * V(n, m) + bh_amp.at(i) * W(n, m));
116 double ah = (ahm + aha * std::cos(doy / 365.25 * 2 * M_PI)) * 1e-5;
118 double sine = std::sin(elevation);
119 double beta = bh / (sine + ch);
120 double gamma = ah / (sine + beta);
121 double topcon = (1 + ah / (1 + bh / (1 + ch)));
122 double gmfh = topcon / (sine + gamma);
125 double a_ht = 2.53e-5;
126 double b_ht = 5.49e-3;
127 double c_ht = 1.14e-3;
128 double hs_km = lla_pos(2) / 1000;
130 beta = b_ht / (sine + c_ht);
131 gamma = a_ht / (sine + beta);
132 topcon = (1 + a_ht / (1 + b_ht / (1 + c_ht)));
133 double ht_corr_coef = 1 / sine - topcon / (sine + gamma);
134 double ht_corr = ht_corr_coef * hs_km;
146 double doy = mjd - 44239.0 + 1 - 28;
148 auto [V, W] = calcLegendrePolynomials(lla_pos);
156 for (
int n = 0; n <= nmax; n++)
158 for (
int m = 0; m <= n; m++)
160 awm = awm + (aw_mean.at(i) * V(n, m) + bw_mean.at(i) * W(n, m));
161 awa = awa + (aw_amp.at(i) * V(n, m) + bw_amp.at(i) * W(n, m));
165 double aw = (awm + awa * std::cos(doy / 365.25 * 2 * M_PI)) * 1e-5;
167 double sine = std::sin(elevation);
168 double beta = bw / (sine + cw);
169 double gamma = aw / (sine + beta);
170 double topcon = (1 + aw / (1 + bw / (1 + cw)));
171 double gmfw = topcon / (sine + gamma);
double calcTropoMapFunc_GMFH(double mjd, const Eigen::Vector3d &lla_pos, double elevation)
Calculates the Global Mapping Function (GMF) for the hydrostatic delay.
double calcTropoMapFunc_GMFW(double mjd, const Eigen::Vector3d &lla_pos, double elevation)
Calculates the Global Mapping Function (GMF) for the wet delay.