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.time.AbsoluteDate;
28 import org.orekit.time.FieldAbsoluteDate;
29 import org.orekit.utils.Constants;
30 import org.orekit.utils.FieldTrackingCoordinates;
31 import org.orekit.utils.ParameterDriver;
32 import org.orekit.utils.TrackingCoordinates;
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 public class AskneNordiusModel implements TroposphericModel {
51
52
53 public static final double LOW_ELEVATION_THRESHOLD = 0.05;
54
55
56 private static final double L0 = 2.2768e-5;
57
58
59 private static final double K_PRIME_2 = 16.5203;
60
61
62 private static final double K_3 = 377600;
63
64
65 private static final double RD = 287.0464;
66
67
68 private static final double FACTOR = 1.0e-6;
69
70
71 private final TroposphereMappingFunction mappingFunction;
72
73
74
75
76 public AskneNordiusModel(final TroposphereMappingFunction mappingFunction) {
77 this.mappingFunction = mappingFunction;
78 }
79
80
81 @Override
82 public TroposphericDelay pathDelay(final TrackingCoordinates trackingCoordinates, final GeodeticPoint point,
83 final PressureTemperatureHumidity weather,
84 final double[] parameters, final AbsoluteDate date) {
85
86 final double[] mf = mappingFunction.mappingFactors(trackingCoordinates, point, weather, date);
87
88
89 final double zh = L0 * weather.getPressure();
90 final double zw = FACTOR * (K_PRIME_2 + K_3 / weather.getTm()) *
91 RD * weather.getWaterVaporPressure() /
92 (Constants.G0_STANDARD_GRAVITY * (weather.getLambda() + 1.0));
93 final double sh = zh * mf[0];
94 final double sw = zw * mf[1];
95 return new TroposphericDelay(zh, zw, sh, sw);
96
97 }
98
99
100 @Override
101 public <T extends CalculusFieldElement<T>> FieldTroposphericDelay<T> pathDelay(final FieldTrackingCoordinates<T> trackingCoordinates,
102 final FieldGeodeticPoint<T> point,
103 final FieldPressureTemperatureHumidity<T> weather,
104 final T[] parameters, final FieldAbsoluteDate<T> date) {
105
106 final T[] mf = mappingFunction.mappingFactors(trackingCoordinates, point, weather, date);
107
108
109 final T zh = weather.getPressure().multiply(L0);
110 final T zw = weather.getTm().reciprocal().multiply(K_3).add(K_PRIME_2).
111 multiply(weather.getWaterVaporPressure().multiply(RD)).
112 divide(weather.getLambda().add(1.0).multiply(Constants.G0_STANDARD_GRAVITY)).
113 multiply(FACTOR);
114 final T sh = zh.multiply(mf[0]);
115 final T sw = zw.multiply(mf[1]);
116 return new FieldTroposphericDelay<>(zh, zw, sh, sw);
117
118 }
119
120
121 @Override
122 public List<ParameterDriver> getParametersDrivers() {
123 return Collections.emptyList();
124 }
125
126 }