1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.orekit.estimation.common;
19
20 import java.util.HashMap;
21 import java.util.Map;
22
23 import org.orekit.estimation.measurements.modifiers.RangeIonosphericDelayModifier;
24 import org.orekit.estimation.measurements.modifiers.RangeRateIonosphericDelayModifier;
25 import org.orekit.gnss.Frequency;
26 import org.orekit.models.earth.ionosphere.IonosphericModel;
27 import org.orekit.models.earth.ionosphere.KlobucharIonoCoefficientsLoader;
28 import org.orekit.models.earth.ionosphere.KlobucharIonoModel;
29 import org.orekit.time.AbsoluteDate;
30 import org.orekit.time.DateComponents;
31 import org.orekit.time.TimeScalesFactory;
32
33
34
35
36 class Iono {
37
38
39 private final boolean twoWay;
40
41
42 private final Map<Frequency, Map<DateComponents, RangeIonosphericDelayModifier>> rangeModifiers;
43
44
45 private final Map<Frequency, Map<DateComponents, RangeRateIonosphericDelayModifier>> rangeRateModifiers;
46
47
48
49
50 Iono(final boolean twoWay) {
51 this.twoWay = twoWay;
52 this.rangeModifiers = new HashMap<>();
53 this.rangeRateModifiers = new HashMap<>();
54 }
55
56
57
58
59
60
61 public RangeIonosphericDelayModifier getRangeModifier(final Frequency frequency,
62 final AbsoluteDate date) {
63 final DateComponents dc = date.getComponents(TimeScalesFactory.getUTC()).getDate();
64 ensureFrequencyAndDateSupported(frequency, dc);
65 return rangeModifiers.get(frequency).get(dc);
66 }
67
68
69
70
71
72
73 public RangeRateIonosphericDelayModifier getRangeRateModifier(final Frequency frequency,
74 final AbsoluteDate date) {
75 final DateComponents dc = date.getComponents(TimeScalesFactory.getUTC()).getDate();
76 ensureFrequencyAndDateSupported(frequency, dc);
77 return rangeRateModifiers.get(frequency).get(dc);
78 }
79
80
81
82
83
84 private void ensureFrequencyAndDateSupported(final Frequency frequency, final DateComponents dc) {
85
86 if (!rangeModifiers.containsKey(frequency)) {
87 rangeModifiers.put(frequency, new HashMap<>());
88 rangeRateModifiers.put(frequency, new HashMap<>());
89 }
90
91 if (!rangeModifiers.get(frequency).containsKey(dc)) {
92
93
94 final KlobucharIonoCoefficientsLoader loader = new KlobucharIonoCoefficientsLoader();
95 loader.loadKlobucharIonosphericCoefficients(dc);
96 final IonosphericModel model = new KlobucharIonoModel(loader.getAlpha(), loader.getBeta());
97
98
99 final double f = frequency.getMHzFrequency() * 1.0e6;
100
101
102 rangeModifiers.get(frequency).put(dc, new RangeIonosphericDelayModifier(model, f));
103 rangeRateModifiers.get(frequency).put(dc, new RangeRateIonosphericDelayModifier(model, f, twoWay));
104
105 }
106
107 }
108
109 }