1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.orekit.frames;
19
20 import java.util.HashMap;
21 import java.util.Map;
22
23 import org.hipparchus.Field;
24 import org.hipparchus.CalculusFieldElement;
25 import org.hipparchus.util.FastMath;
26 import org.orekit.time.AbsoluteDate;
27 import org.orekit.time.FieldAbsoluteDate;
28 import org.orekit.utils.AngularDerivativesFilter;
29 import org.orekit.utils.CartesianDerivativesFilter;
30 import org.orekit.utils.GenericTimeStampedCache;
31
32
33
34
35
36
37
38
39
40
41 public class ShiftingTransformProvider implements TransformProvider {
42
43
44 private final InterpolatingTransformProvider interpolatingProvider;
45
46
47 private final GenericTimeStampedCache<Transform> cache;
48
49
50
51
52
53 private final Map<Field<? extends CalculusFieldElement<?>>, Object> fieldCaches;
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 public ShiftingTransformProvider(final TransformProvider rawProvider,
70 final CartesianDerivativesFilter cFilter,
71 final AngularDerivativesFilter aFilter,
72 final int gridPoints, final double step,
73 final int maxSlots, final double maxSpan, final double newSlotInterval) {
74 this(new InterpolatingTransformProvider(rawProvider, cFilter, aFilter,
75 gridPoints, step, maxSlots, maxSpan, newSlotInterval),
76 maxSlots, maxSpan, newSlotInterval);
77 }
78
79
80
81
82
83
84
85
86
87
88 private ShiftingTransformProvider(final InterpolatingTransformProvider interpolatingProvider,
89 final int maxSlots, final double maxSpan, final double newSlotInterval) {
90 this.interpolatingProvider = interpolatingProvider;
91 this.cache = new GenericTimeStampedCache<>(2, maxSlots, maxSpan, newSlotInterval,
92 new TransformGenerator(2,
93 interpolatingProvider,
94 interpolatingProvider.getStep()));
95 this.fieldCaches = new HashMap<>();
96 }
97
98
99
100
101 public TransformProvider getRawProvider() {
102 return interpolatingProvider.getRawProvider();
103 }
104
105
106
107
108 public int getGridPoints() {
109 return interpolatingProvider.getGridPoints();
110 }
111
112
113
114
115 public double getStep() {
116 return interpolatingProvider.getStep();
117 }
118
119
120 public Transform getTransform(final AbsoluteDate date) {
121
122 final Transform closest = cache.getNeighbors(date).reduce((t0, t1) ->
123 FastMath.abs(date.durationFrom(t0.getDate())) < FastMath.abs(date.durationFrom(t1.getDate())) ? t0 : t1
124 ).get();
125 return closest.shiftedBy(date.durationFrom(closest.getDate()));
126 }
127
128
129 @Override
130 public StaticTransform getStaticTransform(final AbsoluteDate date) {
131
132 final Transform closest = cache.getNeighbors(date).reduce((t0, t1) ->
133 FastMath.abs(date.durationFrom(t0.getDate())) < FastMath.abs(date.durationFrom(t1.getDate())) ? t0 : t1
134 ).get();
135 return closest.staticShiftedBy(date.durationFrom(closest.getDate()));
136 }
137
138
139 public <T extends CalculusFieldElement<T>> FieldTransform<T> getTransform(final FieldAbsoluteDate<T> date) {
140 @SuppressWarnings("unchecked")
141 GenericTimeStampedCache<FieldTransform<T>> fieldCache =
142 (GenericTimeStampedCache<FieldTransform<T>>) fieldCaches.get(date.getField());
143 if (fieldCache == null) {
144 fieldCache =
145 new GenericTimeStampedCache<>(cache.getMaxNeighborsSize(),
146 cache.getMaxSlots(),
147 cache.getMaxSpan(),
148 cache.getNewSlotQuantumGap(),
149 new FieldTransformGenerator<>(date.getField(),
150 cache.getMaxNeighborsSize(),
151 interpolatingProvider,
152 interpolatingProvider.getStep()));
153 fieldCaches.put(date.getField(), fieldCache);
154 }
155
156
157 final FieldTransform<T> closest = fieldCache.getNeighbors(date.toAbsoluteDate()).reduce((t0, t1) ->
158 date.durationFrom(t0.getDate()).abs().getReal() < date.durationFrom(t1.getDate()).abs().getReal() ?
159 t0 : t1
160 ).get();
161 return closest.shiftedBy(date.durationFrom(closest.getDate()));
162 }
163
164
165 @Override
166 public <T extends CalculusFieldElement<T>> FieldStaticTransform<T> getStaticTransform(final FieldAbsoluteDate<T> date) {
167 @SuppressWarnings("unchecked")
168 GenericTimeStampedCache<FieldTransform<T>> fieldCache =
169 (GenericTimeStampedCache<FieldTransform<T>>) fieldCaches.get(date.getField());
170 if (fieldCache == null) {
171 fieldCache =
172 new GenericTimeStampedCache<>(cache.getMaxNeighborsSize(),
173 cache.getMaxSlots(),
174 cache.getMaxSpan(),
175 cache.getNewSlotQuantumGap(),
176 new FieldTransformGenerator<>(date.getField(),
177 cache.getMaxNeighborsSize(),
178 interpolatingProvider,
179 interpolatingProvider.getStep()));
180 fieldCaches.put(date.getField(), fieldCache);
181 }
182
183
184 final FieldTransform<T> closest = fieldCache.getNeighbors(date.toAbsoluteDate()).reduce((t0, t1) ->
185 date.durationFrom(t0.getDate()).abs().getReal() < date.durationFrom(t1.getDate()).abs().getReal() ?
186 t0 : t1
187 ).get();
188 return closest.staticShiftedBy(date.durationFrom(closest.getDate()));
189 }
190
191 }