1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.models.earth.troposphere;
18
19 import java.util.Collections;
20 import java.util.List;
21
22 import org.hipparchus.CalculusFieldElement;
23 import org.orekit.bodies.FieldGeodeticPoint;
24 import org.orekit.bodies.GeodeticPoint;
25 import org.orekit.models.earth.weather.FieldPressureTemperatureHumidity;
26 import org.orekit.models.earth.weather.PressureTemperatureHumidity;
27 import org.orekit.models.earth.weather.PressureTemperatureHumidityProvider;
28 import org.orekit.time.AbsoluteDate;
29 import org.orekit.time.FieldAbsoluteDate;
30 import org.orekit.utils.Constants;
31 import org.orekit.utils.FieldTrackingCoordinates;
32 import org.orekit.utils.ParameterDriver;
33 import org.orekit.utils.TrackingCoordinates;
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 public class AskneNordiusModel implements TroposphericModel {
52
53
54 public static final double LOW_ELEVATION_THRESHOLD = 0.05;
55
56
57 private static final double L0 = 2.2768e-5;
58
59
60 private static final double K_PRIME_2 = 16.5203;
61
62
63 private static final double K_3 = 377600;
64
65
66 private static final double RD = 287.0464;
67
68
69 private static final double FACTOR = 1.0e-6;
70
71
72 private final TroposphereMappingFunction mappingFunction;
73
74
75
76
77 private final PressureTemperatureHumidityProvider pthProvider;
78
79
80
81
82
83 public AskneNordiusModel(final TroposphereMappingFunction mappingFunction,
84 final PressureTemperatureHumidityProvider pthProvider) {
85 this.mappingFunction = mappingFunction;
86 this.pthProvider = pthProvider;
87 }
88
89
90 @Override
91 public TroposphericDelay pathDelay(final TrackingCoordinates trackingCoordinates, final GeodeticPoint point,
92 final double[] parameters, final AbsoluteDate date) {
93
94 final double[] mf = mappingFunction.mappingFactors(trackingCoordinates, point, date);
95
96
97 final PressureTemperatureHumidity weather = pthProvider.getWeatherParameters(point, date);
98
99
100 final double zh = L0 * weather.getPressure();
101 final double zw = FACTOR * (K_PRIME_2 + K_3 / weather.getTm()) *
102 RD * weather.getWaterVaporPressure() /
103 (Constants.G0_STANDARD_GRAVITY * (weather.getLambda() + 1.0));
104 final double sh = zh * mf[0];
105 final double sw = zw * mf[1];
106 return new TroposphericDelay(zh, zw, sh, sw);
107
108 }
109
110
111 @Override
112 public <T extends CalculusFieldElement<T>> FieldTroposphericDelay<T> pathDelay(final FieldTrackingCoordinates<T> trackingCoordinates,
113 final FieldGeodeticPoint<T> point,
114 final T[] parameters, final FieldAbsoluteDate<T> date) {
115
116 final T[] mf = mappingFunction.mappingFactors(trackingCoordinates, point, date);
117
118
119 final FieldPressureTemperatureHumidity<T> weather = pthProvider.getWeatherParameters(point, date);
120
121
122 final T zh = weather.getPressure().multiply(L0);
123 final T zw = weather.getTm().reciprocal().multiply(K_3).add(K_PRIME_2).
124 multiply(weather.getWaterVaporPressure().multiply(RD)).
125 divide(weather.getLambda().add(1.0).multiply(Constants.G0_STANDARD_GRAVITY)).
126 multiply(FACTOR);
127 final T sh = zh.multiply(mf[0]);
128 final T sw = zw.multiply(mf[1]);
129 return new FieldTroposphericDelay<>(zh, zw, sh, sw);
130
131 }
132
133
134 @Override
135 public List<ParameterDriver> getParametersDrivers() {
136 return Collections.emptyList();
137 }
138
139 }