Skip to content

Commit 35723b4

Browse files
committed
Introduction of ITU Ref Atmosphere
- ITU Ref Atmosphere according to ITU-R P.835 - Adding of supportData files for atmospheric attenuation calculation for water vapour and oxygen
1 parent fa74e23 commit 35723b4

File tree

6 files changed

+417
-7
lines changed

6 files changed

+417
-7
lines changed
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
/*
2+
ISC License
3+
4+
Copyright (c) 2025, Department of Engineering Cybernetics, NTNU
5+
6+
Permission to use, copy, modify, and/or distribute this software for any
7+
purpose with or without fee is hereby granted, provided that the above
8+
copyright notice and this permission notice appear in all copies.
9+
10+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17+
18+
*/
19+
20+
#include "architecture/utilities/ItuRefAtmosphere.h"
21+
#include <cmath>
22+
#include <algorithm>
23+
24+
// Constructor
25+
ItuAtmosphere::ItuAtmosphere() {
26+
}
27+
28+
// Destructor
29+
ItuAtmosphere::~ItuAtmosphere() {
30+
}
31+
const ItuAtmosphere& ItuAtmosphere::instance() {
32+
static ItuAtmosphere inst;
33+
return inst;
34+
}
35+
36+
// Getters
37+
double ItuAtmosphere::getTempISA(double altitude_m) {
38+
return instance().calcTempISA(altitude_m);
39+
}
40+
41+
double ItuAtmosphere::getPresISA(double altitude_m) {
42+
return instance().calcPresISA(altitude_m);
43+
}
44+
45+
double ItuAtmosphere::getWaterVapDensityISA(double altitude_m) {
46+
return instance().calcWaterVapDensityISA(altitude_m);
47+
}
48+
49+
size_t ItuAtmosphere::findLayerIndex(double altitude_m) const {
50+
size_t layer_idx = NUM_LAYERS - 1;
51+
for (size_t i = 0; i < NUM_LAYERS - 1; ++i) {
52+
if (altitude_m >= ATMOSPHERE_DATA[i].h &&
53+
altitude_m < ATMOSPHERE_DATA[i + 1].h)
54+
{
55+
layer_idx = i;
56+
break;
57+
}
58+
}
59+
return layer_idx;
60+
}
61+
62+
double ItuAtmosphere::geometricHeight(double altitude_m) const {
63+
// For altitudes above 84.852 km, convert geopotential height to geometric height
64+
return (R_EARTH_ITU * altitude_m * 1e-3) / (R_EARTH_ITU - altitude_m*1e-3); // ITU-R P.835-7 eq 1b
65+
}
66+
67+
/* Calculate Temperature according to ITU-R P.835-7
68+
*/
69+
double ItuAtmosphere::calcTempISA(double altitude_m) const {
70+
// Clamp above model validity (85 km)
71+
if (altitude_m >= ATMOSPHERE_DATA[NUM_LAYERS - 1].h) {
72+
// if h above 84.852 km
73+
double Z = ItuAtmosphere::geometricHeight(altitude_m); // [km] Geometric height
74+
if (Z < 91.0) {
75+
return 186.8673; // [K] Constant temperature between 84.852 km and 91 km (ITU-R P.835-7 eq 4a)
76+
} else if (Z < 100.0) {
77+
return 263.1905 - 76.3232 * std::sqrt(1 - std::pow((Z - 91.0)/(19.9429),2)); // [K] Linear increase between 91 km and 100 km (ITU-R P.835-7 eq 4b)
78+
} else {
79+
return 195.08134; // [K] Above 100 km, assume constant temperature
80+
}
81+
}
82+
83+
// Find which layer the altitude falls into (table in header file)
84+
size_t layer_idx = ItuAtmosphere::findLayerIndex(altitude_m);
85+
86+
// Compute temperature at layer base: T_(layer_idx-1)
87+
double Ti = T0;
88+
for (size_t i = 0; i < layer_idx; ++i) {
89+
double h0 = ATMOSPHERE_DATA[i].h; // [m] Altitude at layer "i" base
90+
double h1 = ATMOSPHERE_DATA[i + 1].h; // [m] Altitude at layer "i+1" base
91+
double dT_dh_i = ATMOSPHERE_DATA[i].dT_dh; // [K/km] Temperature gradient in layer "i"
92+
Ti += dT_dh_i * (h1 - h0) * 1e-3; // [K] Temperature at top of layer "layer_idx-1"
93+
}
94+
95+
// Linear variation within that layer
96+
double Hi = ATMOSPHERE_DATA[layer_idx].h; // [m] Altitude at layer "layer_idx" base
97+
double dT_dh = ATMOSPHERE_DATA[layer_idx].dT_dh; // [K/km] Temperature gradient in layer "layer_idx"
98+
99+
return Ti + dT_dh * (altitude_m - Hi) * 1e-3; // [](ITU-R P.835-2 eq 2)
100+
}
101+
102+
/* Calculate Pressure according to ITU-R P.835-7
103+
* barometric formula for each atmospheric layer
104+
*/
105+
double ItuAtmosphere::calcPresISA(double altitude_m) const {
106+
// Find which layer the altitude falls into
107+
size_t layer_idx = ItuAtmosphere::findLayerIndex(altitude_m);
108+
double dT_dh = ATMOSPHERE_DATA[layer_idx].dT_dh;
109+
if (layer_idx == 0) {
110+
// 0 km < altitude < 11 km
111+
return 1013.25 * pow((288.15 / (288.15 - (dT_dh * altitude_m * 1e-3))), -itu_press_const/dT_dh); // ITU-R P.835-7 eq 3a
112+
} else if (layer_idx == 1) {
113+
// 11 km < altitude < 20 km
114+
return 226.3226 * exp(-0.157688 * (altitude_m * 1e-3 - 11.0)); // ITU-R P.835-7 eq 3b
115+
} else if (layer_idx == 2) {
116+
// 20 km < altitude < 32 km
117+
return 54.7498 * pow((216.65 / (216.65 + (altitude_m * 1e-3 - 20.0))), -itu_press_const); // ITU-R P.835-7 eq 3c
118+
} else if (layer_idx == 3) {
119+
// 32 km < altitude < 47 km
120+
return 8.680422 * pow((228.65 / (228.65 + (dT_dh * (altitude_m * 1e-3 - 32.0)))), -itu_press_const/dT_dh); // ITU-R P.835-7 eq 3d
121+
} else if (layer_idx == 4) {
122+
// 47 km < altitude < 51 km
123+
return 1.109106 * exp(-0.126226 * (altitude_m * 1e-3 - 47.0)); // ITU-R P.835-7 eq 3e
124+
} else if (layer_idx == 5) {
125+
// 51 km < altitude < 71 km
126+
return 0.6694167 * pow((270.65 / (270.65 - (dT_dh * (altitude_m * 1e-3 - 51.0)))), -itu_press_const/dT_dh); // ITU-R P.835-7 eq 3f
127+
} else if (layer_idx == 6) {
128+
// 71 km < altitude < 85 km
129+
return 0.03956649 * pow((214.65 / (214.65 - (dT_dh * (altitude_m * 1e-3 - 71.0)))), -itu_press_const/dT_dh); // ITU-R P.835-7 eq 3g
130+
} else {
131+
// altitude >= 85 km
132+
double Z = ItuAtmosphere::geometricHeight(altitude_m); // [km] Geometric height
133+
if (Z < 100.0e3) {
134+
return exp(95.571899 - 4.011801*Z + 6.424731*Z*Z*1e-2 - 4.789660*Z*Z*Z*1e-4 + 1.340543*Z*Z*Z*Z*1e-6); // ITU-R P.835-7 eq 5
135+
} else {
136+
return 0.0; // Pressure above 100 km is assumed zero
137+
}
138+
}
139+
}
140+
141+
/* Calculate Water Vapor Density according to ITU-R P.835-7
142+
* Uses exponential decay model with different scale heights
143+
*/
144+
double ItuAtmosphere::calcWaterVapDensityISA(double altitude_m) const {
145+
// Calculate geometric height
146+
double Z = ItuAtmosphere::geometricHeight(altitude_m); // [km] Geometric height
147+
double rho = rho0 * std::exp(-Z / h0_water); // [g/m3] ITU-R P.835-2 eq 6
148+
double T_Z = ItuAtmosphere::calcTempISA(altitude_m); // [K]
149+
double e_z = (rho*T_Z)/(216.7); // [hPa] Partial pressure at height Z
150+
double p_z = ItuAtmosphere::calcPresISA(altitude_m); // [hPa] Total pressure at height Z
151+
if (e_z/p_z < 2.0e-6) {
152+
// Use ITU-R 835-7 eq. 8
153+
rho = 2.0e-6 * (p_z * 216.7)/(T_Z); // [g/m3]
154+
}
155+
return rho;
156+
}
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
/*
2+
ISC License
3+
4+
Copyright (c) 2025, Department of Engineering Cybernetics, NTNU
5+
6+
Permission to use, copy, modify, and/or distribute this software for any
7+
purpose with or without fee is hereby granted, provided that the above
8+
copyright notice and this permission notice appear in all copies.
9+
10+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17+
18+
*/
19+
20+
21+
#ifndef ITU_ATMOSPHERE_H
22+
#define ITU_ATMOSPHERE_H
23+
24+
#include <cmath>
25+
#include <algorithm>
26+
27+
/*! @brief ITU-R P.835-2 Reference Standard Atmosphere Implementation
28+
*
29+
* This class implements the mean annual global reference atmosphere as specified
30+
* in ITU-R P.835-2 recommendation for calculating gaseous attenuation along Earth-space paths.
31+
* The class precomputes atmospheric properties at initialization and proviedes lookup values at runtime.
32+
*/
33+
class ItuAtmosphere {
34+
public:
35+
ItuAtmosphere();
36+
~ItuAtmosphere();
37+
38+
/*! @brief Static methods for accessing atmospheric temperature during runtime
39+
* @param altitude Altitude in [m]
40+
* @return Temperature in [K]
41+
*/
42+
static double getTempISA(double altitude);
43+
/*! @brief Static methods for accessing atmospheric pressure during runtime
44+
* @param altitude Altitude in [m]
45+
* @return Pressure in [hPa]
46+
*/
47+
static double getPresISA(double altitude);
48+
/*! @brief Static methods for accessing atmospheric water vapor density during runtime
49+
* @param altitude Altitude in [m]
50+
* @return Water vapor density in [g/m3]
51+
*/
52+
static double getWaterVapDensityISA(double altitude);
53+
54+
private:
55+
/*! @brief find the layer index for a given altitude
56+
* @param altitude_m Altitude in [m]
57+
* @return Layer index
58+
*/
59+
size_t findLayerIndex(double altitude_m) const;
60+
/*! @brief Calculate geometric height from altitude
61+
* @param altitude_m Altitude in [m]
62+
* @return Geometric height in [km]
63+
*/
64+
double geometricHeight(double altitude_m) const;
65+
/*! @brief Calculate the ISA temperature
66+
* @param altitude_m Altitude in [m]
67+
* @return Temperature in [K]
68+
*/
69+
double calcTempISA(double altitude_m) const;
70+
/*! @brief Calculate the ISA pressure
71+
* @param altitude_m Altitude in [m]
72+
* @return Pressure in [hPa]
73+
*/
74+
double calcPresISA(double altitude_m) const;
75+
/*! @brief Calculate the ISA water vapor density
76+
* @param altitude_m Altitude in [m]
77+
* @return Water vapor density in [g/m3]
78+
*/
79+
double calcWaterVapDensityISA(double altitude_m) const;
80+
81+
public:
82+
83+
private:
84+
/*! @brief Pressure constant for barometric formula [K/km]
85+
* derived from g * M / R
86+
* where:
87+
* R = 'gas constant' -> 8.31446[J/(mol*K)]
88+
* M = 'molar mass of air' -> 28.9645[g/mol]
89+
* g = "gravity" -> 9.80665[m/s2]
90+
* Source: ITU-R P.835-7
91+
*/
92+
static constexpr double itu_press_const = 34.1632; // [K/km]
93+
94+
/*! @brief Atmosphere layer structure for piecewise temperature profile
95+
* Defines layer boundaries and temperature gradients per source: ITU-R P.835-7
96+
*/
97+
struct AtmosphereLayer {
98+
double h; // Altitude Hi (km)
99+
double dT_dh; // Temperature gradient Li (K/km)
100+
};
101+
102+
/*! @brief Number of atmospheric layers in the reference atmosphere; Source: ITU-R P.835-7, Table 1 */
103+
static constexpr size_t NUM_LAYERS = 8;
104+
105+
/*! @brief Mean annual global reference atmosphere layer data
106+
* Source: ITU-R P.835-7, Table 1
107+
*/
108+
static constexpr AtmosphereLayer ATMOSPHERE_DATA[NUM_LAYERS] = {
109+
{ 0.0e3, -6.5}, // [m, K/km] 0 - 11 km
110+
{ 11.0e3, 0.0}, // [m, K/km] 11 - 20 km
111+
{ 20.0e3, 1.0}, // [m, K/km] 20 - 32 km
112+
{ 32.0e3, 2.8}, // [m, K/km] 32 - 47 km
113+
{ 47.0e3, 0.0}, // [m, K/km] 47 - 51 km
114+
{ 51.0e3, -2.8}, // [m, K/km] 51 - 71 km
115+
{ 71.0e3, -2.0}, // [m, K/km] 71 - 85 km
116+
{ 84.852e3, 0.0} // [m, K/km] Above 85 km (gradient not used beyond this assume const temp)
117+
};
118+
119+
/*! @brief Ground-level standard conditions (ITU-R P.835-7) */
120+
static constexpr double T0 = 288.15; ///< Standard temperature at sea level [K] (eq. 5)
121+
static constexpr double P0 = 1013.25; ///< Standard pressure at sea level [hPa] (eq. 5)
122+
static constexpr double rho0 = 7.5; ///< Standard water vapor density at sea level [g/m³] (eq. 7)
123+
124+
/*! @brief Scale heights for exponential profiles */
125+
static constexpr double h0_water = 2.0; ///< [km] Water vapor scale height (ITU-R P.835-7 eq 6)
126+
// static constexpr double h0_dry = 6.0; ///< [km] Dry atmosphere scale height (ITU-R P.835-7 eq 9)
127+
static constexpr double R_EARTH_ITU = 6356.766; ///< [km] Earth's radius for ITU atmosphere calculations
128+
129+
ItuAtmosphere(const ItuAtmosphere&) = delete;
130+
ItuAtmosphere& operator=(const ItuAtmosphere&) = delete;
131+
132+
/* Singleton instance */
133+
static const ItuAtmosphere& instance();
134+
};
135+
#endif /* ITU_ATMOSPHERE_H */

src/utilities/supportDataTools/dataFetcher.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
LOCAL_GRAV_DATA_BASE_PATH = "LocalGravData/"
5656
MAGNETIC_FIELD_BASE_PATH = "MagneticField/"
5757
SKY_BRIGHTNESS_BASE_PATH = "SkyBrightnessData/"
58+
ITU_ATMOSPHERE_RADIOFREQ_DAMPENING_BASE_PATH = "AtmRadioFreqDampData/"
5859

5960

6061
@functools.lru_cache(maxsize=32)
@@ -194,6 +195,10 @@ class MagneticFieldData(Enum):
194195
class SkyBrightnessData(Enum):
195196
skyTemperature408MHz = "haslam408_dsds_Remazeilles2014.fits"
196197

198+
class AtmRadioFreqDampData(Enum):
199+
oxygen = "oxygen.json"
200+
waterVapor = "waterVapor.json"
201+
197202
CATEGORY_BASE_PATHS = {
198203
"AlbedoData": ALBEDO_DATA_BASE_PATH,
199204
"AtmosphereData": ATMOSPHERE_DATA_BASE_PATH,
@@ -202,6 +207,7 @@ class SkyBrightnessData(Enum):
202207
"LocalGravData": LOCAL_GRAV_DATA_BASE_PATH,
203208
"MagneticFieldData": MAGNETIC_FIELD_BASE_PATH,
204209
"SkyBrightnessData": SKY_BRIGHTNESS_BASE_PATH,
210+
"AtmRadioFreqDampData": ITU_ATMOSPHERE_RADIOFREQ_DAMPENING_BASE_PATH,
205211
}
206212

207213

src/utilities/supportDataTools/registrySnippet.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,27 +8,29 @@
88
"supportData/AlbedoData/Earth_ALB_2018_CERES_Clear_10x10.csv": "md5:559c40494e0c2ff21117b0d2b4cb4337",
99
"supportData/AlbedoData/Earth_ALB_2018_CERES_Clear_1x1.csv": "md5:aab189dcb8bdf847d20817a1ccf3bbbd",
1010
"supportData/AlbedoData/Earth_ALB_2018_CERES_Clear_5x5.csv": "md5:a9190d8a2f9650f1e9ec3ba931acd1dd",
11-
"supportData/AlbedoData/Mars_ALB_TES_10x10.csv": "md5:087522357956a61fc4cb960b7ba9357d",
12-
"supportData/AlbedoData/Mars_ALB_TES_1x1.csv": "md5:e140359d0211b9a59c9f88e8a1c9827a",
13-
"supportData/AlbedoData/Mars_ALB_TES_5x5.csv": "md5:614c068da2f194656cc8952fcfd989b3",
1411
"supportData/AlbedoData/earthReflectivityMean_10x10.dat": "md5:55e4c55eaba239ba1e041a77b266d30a",
1512
"supportData/AlbedoData/earthReflectivityMean_1p25x1.dat": "md5:af8a8e46b849606707534d9b8906c519",
1613
"supportData/AlbedoData/earthReflectivityMean_5x5.dat": "md5:327e571b41d1e99198b4cd6d856e8b5a",
1714
"supportData/AlbedoData/earthReflectivityStd_10x10.dat": "md5:c0e0cfd18597f508c093fda1bb76bbad",
1815
"supportData/AlbedoData/earthReflectivityStd_1p25x1.dat": "md5:03208907ed87bbc27906f491a79ec8b1",
1916
"supportData/AlbedoData/earthReflectivityStd_5x5.dat": "md5:b592e99b2edefdb1fa2f9e07ff7007ae",
17+
"supportData/AlbedoData/Mars_ALB_TES_10x10.csv": "md5:087522357956a61fc4cb960b7ba9357d",
18+
"supportData/AlbedoData/Mars_ALB_TES_1x1.csv": "md5:e140359d0211b9a59c9f88e8a1c9827a",
19+
"supportData/AlbedoData/Mars_ALB_TES_5x5.csv": "md5:614c068da2f194656cc8952fcfd989b3",
2020
"supportData/AlbedoData/marsReflectivityMean_10x10.dat": "md5:b3c9e1e7eec6372430b90708bc10a30c",
2121
"supportData/AlbedoData/marsReflectivityMean_1p25x1.dat": "md5:ab382ea79e282bf63a2a80763854d093",
2222
"supportData/AlbedoData/marsReflectivityMean_5x5.dat": "md5:d9b355a9ee2de3ad3f0b3316d742d325",
2323
"supportData/AtmosphereData/EarthGRAMNominal.txt": "md5:f96ae0632e8253225770e1b927214675",
2424
"supportData/AtmosphereData/JupiterGRAMNominal.csv": "md5:09e1283af38e292465024306619758eb",
2525
"supportData/AtmosphereData/MarsGRAMNominal.txt": "md5:2c1e990dde154a5dd73c1a976f2f5b10",
26-
"supportData/AtmosphereData/NRLMSISE00Nominal.txt": "md5:cf86856b06038a725c41a07175092158",
2726
"supportData/AtmosphereData/NeptuneGRAMNominal.csv": "md5:5c500071dd9e61e862503ed454f808f0",
27+
"supportData/AtmosphereData/NRLMSISE00Nominal.txt": "md5:cf86856b06038a725c41a07175092158",
2828
"supportData/AtmosphereData/TitanGRAMNominal.csv": "md5:0b9570ac5d3d178545deb0fd7311dcfa",
29-
"supportData/AtmosphereData/USStandardAtmosphere1976.csv": "md5:891d4c45c6116415ca9dd153eac31bba",
3029
"supportData/AtmosphereData/UranusGRAMNominal.csv": "md5:fb7ce2f93f80fb616318378491d7acba",
30+
"supportData/AtmosphereData/USStandardAtmosphere1976.csv": "md5:891d4c45c6116415ca9dd153eac31bba",
3131
"supportData/AtmosphereData/VenusGRAMNominal.csv": "md5:d17ae5d6a30f510dc82554a6002f6dbb",
32+
"supportData/AtmRadioFreqDampData/oxygen.json": "md5:9da7cbceda2c3884e42359ea791c4713",
33+
"supportData/AtmRadioFreqDampData/waterVapour.json": "md5:3a2f93a0db881a8d7d2e44300cbc8111",
3234
"supportData/DentonGEO/model_e_array_all.txt": "md5:dcd84e90630a26affe53c9f96b36e22b",
3335
"supportData/DentonGEO/model_e_array_high.txt": "md5:93dbe65e6b0c20be7de3c8dbae7a4d79",
3436
"supportData/DentonGEO/model_e_array_low.txt": "md5:a107047ac9675ac5bef46d792f8db707",
@@ -37,15 +39,15 @@
3739
"supportData/DentonGEO/model_i_array_high.txt": "md5:3695ac88ce113eb89c32e689ab0b7cc8",
3840
"supportData/DentonGEO/model_i_array_low.txt": "md5:d282c5eb43efa2bdb50fd4e9ca5e4bc8",
3941
"supportData/DentonGEO/model_i_array_mid.txt": "md5:b89c93a47bdd9f3884795992cc9a6e3c",
40-
"supportData/EphemerisData/MVN_SCLKSCET.00000.tsc": "md5:8df85d39cff0440cd1a48115566145b4",
4142
"supportData/EphemerisData/de-403-masses.tpc": "md5:00137bda9537bb47cbd076b6716f4267",
43+
"supportData/EphemerisData/MVN_SCLKSCET.00000.tsc": "md5:8df85d39cff0440cd1a48115566145b4",
4244
"supportData/EphemerisData/naif0011.tls": "md5:2a3a51a665e21f2f151527dace5ede74",
4345
"supportData/EphemerisData/naif0012.tls": "md5:25a2fff30b0dedb4d76c06727b1895b1",
4446
"supportData/EphemerisData/pck00010.tpc": "md5:da153641f7346bd5b6a1226778e0d51b",
47+
"supportData/LocalGravData/eros007790.tab": "md5:5bdf62cee6c7069ea547cca6ed7c724f",
4548
"supportData/LocalGravData/GGM03S-J2-only.txt": "md5:08e8b083c473e8f5261628e1531a38e8",
4649
"supportData/LocalGravData/GGM03S.txt": "md5:295d419493ad83f85c3ab2bcb8c37e7c",
4750
"supportData/LocalGravData/GGM2BData.txt": "md5:79a4c3aa3199a68a136d25b7167a0cc1",
4851
"supportData/LocalGravData/VESTA20H.txt": "md5:f9ec4308ea7049656f64e64d6019d570",
49-
"supportData/LocalGravData/eros007790.tab": "md5:5bdf62cee6c7069ea547cca6ed7c724f",
5052
"supportData/MagneticField/WMM.COF": "md5:8caac788545d3a32d55faba8aa87c93b",
5153
}

0 commit comments

Comments
 (0)