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.io.Serializable;
21 import java.util.HashMap;
22 import java.util.Map;
23
24 import org.hipparchus.Field;
25 import org.hipparchus.CalculusFieldElement;
26 import org.hipparchus.util.FastMath;
27 import org.orekit.time.AbsoluteDate;
28 import org.orekit.time.FieldAbsoluteDate;
29 import org.orekit.utils.AngularDerivativesFilter;
30 import org.orekit.utils.CartesianDerivativesFilter;
31 import org.orekit.utils.GenericTimeStampedCache;
32
33
34
35
36
37
38
39
40
41
42 public class ShiftingTransformProvider implements TransformProvider {
43
44
45 private static final long serialVersionUID = 20150601L;
46
47
48 private final InterpolatingTransformProvider interpolatingProvider;
49
50
51 private final transient GenericTimeStampedCache<Transform> cache;
52
53
54
55
56
57 private final transient Map<Field<? extends CalculusFieldElement<?>>, Object> fieldCaches;
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 public ShiftingTransformProvider(final TransformProvider rawProvider,
74 final CartesianDerivativesFilter cFilter,
75 final AngularDerivativesFilter aFilter,
76 final int gridPoints, final double step,
77 final int maxSlots, final double maxSpan, final double newSlotInterval) {
78 this(new InterpolatingTransformProvider(rawProvider, cFilter, aFilter,
79 gridPoints, step, maxSlots, maxSpan, newSlotInterval),
80 maxSlots, maxSpan, newSlotInterval);
81 }
82
83
84
85
86
87
88
89
90
91
92 private ShiftingTransformProvider(final InterpolatingTransformProvider interpolatingProvider,
93 final int maxSlots, final double maxSpan, final double newSlotInterval) {
94 this.interpolatingProvider = interpolatingProvider;
95 this.cache = new GenericTimeStampedCache<Transform>(2, maxSlots, maxSpan, newSlotInterval,
96 new TransformGenerator(2,
97 interpolatingProvider,
98 interpolatingProvider.getStep()));
99 this.fieldCaches = new HashMap<>();
100 }
101
102
103
104
105 public TransformProvider getRawProvider() {
106 return interpolatingProvider.getRawProvider();
107 }
108
109
110
111
112 public int getGridPoints() {
113 return interpolatingProvider.getGridPoints();
114 }
115
116
117
118
119 public double getStep() {
120 return interpolatingProvider.getStep();
121 }
122
123
124 public Transform getTransform(final AbsoluteDate date) {
125
126 final Transform closest = cache.getNeighbors(date).reduce((t0, t1) ->
127 FastMath.abs(date.durationFrom(t0.getDate())) < FastMath.abs(date.durationFrom(t1.getDate())) ? t0 : t1
128 ).get();
129 return closest.shiftedBy(date.durationFrom(closest.getDate()));
130 }
131
132
133 @Override
134 public StaticTransform getStaticTransform(final AbsoluteDate date) {
135
136 final Transform closest = cache.getNeighbors(date).reduce((t0, t1) ->
137 FastMath.abs(date.durationFrom(t0.getDate())) < FastMath.abs(date.durationFrom(t1.getDate())) ? t0 : t1
138 ).get();
139 return closest.staticShiftedBy(date.durationFrom(closest.getDate()));
140 }
141
142
143 public <T extends CalculusFieldElement<T>> FieldTransform<T> getTransform(final FieldAbsoluteDate<T> date) {
144 @SuppressWarnings("unchecked")
145 GenericTimeStampedCache<FieldTransform<T>> fieldCache =
146 (GenericTimeStampedCache<FieldTransform<T>>) fieldCaches.get(date.getField());
147 if (fieldCache == null) {
148 fieldCache =
149 new GenericTimeStampedCache<FieldTransform<T>>(cache.getMaxNeighborsSize(),
150 cache.getMaxSlots(),
151 cache.getMaxSpan(),
152 cache.getNewSlotQuantumGap(),
153 new FieldTransformGenerator<>(date.getField(),
154 cache.getMaxNeighborsSize(),
155 interpolatingProvider,
156 interpolatingProvider.getStep()));
157 fieldCaches.put(date.getField(), fieldCache);
158 }
159
160
161 final FieldTransform<T> closest = fieldCache.getNeighbors(date.toAbsoluteDate()).reduce((t0, t1) ->
162 date.durationFrom(t0.getDate()).abs().getReal() < date.durationFrom(t1.getDate()).abs().getReal() ?
163 t0 : t1
164 ).get();
165 return closest.shiftedBy(date.durationFrom(closest.getDate()));
166 }
167
168
169 @Override
170 public <T extends CalculusFieldElement<T>> FieldStaticTransform<T> getStaticTransform(final FieldAbsoluteDate<T> date) {
171 @SuppressWarnings("unchecked")
172 GenericTimeStampedCache<FieldTransform<T>> fieldCache =
173 (GenericTimeStampedCache<FieldTransform<T>>) fieldCaches.get(date.getField());
174 if (fieldCache == null) {
175 fieldCache =
176 new GenericTimeStampedCache<FieldTransform<T>>(cache.getMaxNeighborsSize(),
177 cache.getMaxSlots(),
178 cache.getMaxSpan(),
179 cache.getNewSlotQuantumGap(),
180 new FieldTransformGenerator<>(date.getField(),
181 cache.getMaxNeighborsSize(),
182 interpolatingProvider,
183 interpolatingProvider.getStep()));
184 fieldCaches.put(date.getField(), fieldCache);
185 }
186
187
188 final FieldTransform<T> closest = fieldCache.getNeighbors(date.toAbsoluteDate()).reduce((t0, t1) ->
189 date.durationFrom(t0.getDate()).abs().getReal() < date.durationFrom(t1.getDate()).abs().getReal() ?
190 t0 : t1
191 ).get();
192 return closest.staticShiftedBy(date.durationFrom(closest.getDate()));
193 }
194
195
196
197
198
199
200
201
202
203 private Object writeReplace() {
204 return new DTO(interpolatingProvider,
205 cache.getMaxSlots(), cache.getMaxSpan(), cache.getNewSlotQuantumGap());
206 }
207
208
209 private static class DTO implements Serializable {
210
211
212 private static final long serialVersionUID = 20150601L;
213
214
215 private final InterpolatingTransformProvider interpolatingProvider;
216
217
218 private final int maxSlots;
219
220
221 private final double maxSpan;
222
223
224 private final double newSlotInterval;
225
226
227
228
229
230
231
232
233
234
235 private DTO(final InterpolatingTransformProvider interpolatingProvider,
236 final int maxSlots, final double maxSpan, final double newSlotInterval) {
237 this.interpolatingProvider = interpolatingProvider;
238 this.maxSlots = maxSlots;
239 this.maxSpan = maxSpan;
240 this.newSlotInterval = newSlotInterval;
241 }
242
243
244
245
246 private Object readResolve() {
247
248 return new ShiftingTransformProvider(interpolatingProvider,
249 maxSlots, maxSpan, newSlotInterval);
250 }
251
252 }
253
254 }