| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // This file is part of INSTINCT, the INS Toolkit for Integrated | ||
| 2 | // Navigation Concepts and Training by the Institute of Navigation of | ||
| 3 | // the University of Stuttgart, Germany. | ||
| 4 | // | ||
| 5 | // This Source Code Form is subject to the terms of the Mozilla Public | ||
| 6 | // License, v. 2.0. If a copy of the MPL was not distributed with this | ||
| 7 | // file, You can obtain one at https://mozilla.org/MPL/2.0/. | ||
| 8 | |||
| 9 | #include "ViennaMappingFunction.hpp" | ||
| 10 | #include <cmath> | ||
| 11 | #include <tuple> | ||
| 12 | |||
| 13 | namespace NAV | ||
| 14 | { | ||
| 15 | ✗ | double vmf1h(const double& ah, const double& dmjd, | |
| 16 | const double& dlat, const double& ht, const double& zd) | ||
| 17 | { | ||
| 18 | ✗ | double doy = dmjd - 44239.0 + 1 - 28; | |
| 19 | |||
| 20 | ✗ | double bh = 0.0029; | |
| 21 | ✗ | double c0h = 0.062; | |
| 22 | |||
| 23 | ✗ | auto [phh, c11h, c10h] = dlat < 0.0 | |
| 24 | ✗ | ? std::make_tuple(M_PI, 0.007, 0.002) // southern hemisphere | |
| 25 | ✗ | : std::make_tuple(0.0, 0.005, 0.001); // northern hemisphere | |
| 26 | |||
| 27 | ✗ | double ch = c0h + ((std::cos(doy / 365.25 * 2.0 * M_PI + phh) + 1.0) * c11h / 2.0 + c10h) * (1.0 - std::cos(dlat)); | |
| 28 | |||
| 29 | ✗ | double sine = std::sin(M_PI / 2.0 - zd); | |
| 30 | ✗ | double beta = bh / (sine + ch); | |
| 31 | ✗ | double gamma = ah / (sine + beta); | |
| 32 | ✗ | double topcon = 1.0 + ah / (1.0 + bh / (1.0 + ch)); | |
| 33 | ✗ | double vmf1h = topcon / (sine + gamma); | |
| 34 | |||
| 35 | // height correction [Niell, 1996] | ||
| 36 | ✗ | double a_ht = 2.53e-5; | |
| 37 | ✗ | double b_ht = 5.49e-3; | |
| 38 | ✗ | double c_ht = 1.14e-3; | |
| 39 | ✗ | double hs_km = ht / 1000.0; | |
| 40 | ✗ | beta = b_ht / (sine + c_ht); | |
| 41 | ✗ | gamma = a_ht / (sine + beta); | |
| 42 | ✗ | topcon = 1.0 + a_ht / (1.0 + b_ht / (1.0 + c_ht)); | |
| 43 | ✗ | double ht_corr_coef = 1.0 / sine - topcon / (sine + gamma); | |
| 44 | ✗ | double ht_corr = ht_corr_coef * hs_km; | |
| 45 | ✗ | vmf1h += ht_corr; | |
| 46 | |||
| 47 | ✗ | return vmf1h; | |
| 48 | } | ||
| 49 | ✗ | double vmf1w(const double& aw, const double& zd) | |
| 50 | { | ||
| 51 | ✗ | double sine = std::sin(M_PI / 2.0 - zd); | |
| 52 | ✗ | double bw = 0.00146; | |
| 53 | ✗ | double cw = 0.04391; | |
| 54 | ✗ | double beta = bw / (sine + cw); | |
| 55 | ✗ | double gamma = aw / (sine + beta); | |
| 56 | ✗ | double topcon = 1.0 + aw / (1.0 + bw / (1.0 + cw)); | |
| 57 | |||
| 58 | ✗ | return topcon / (sine + gamma); | |
| 59 | } | ||
| 60 | |||
| 61 | } // namespace NAV | ||
| 62 |