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