1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.analytical;
18
19 import java.util.ArrayList;
20 import java.util.List;
21 import java.util.stream.Collectors;
22
23 import org.hipparchus.CalculusFieldElement;
24 import org.hipparchus.Field;
25 import org.hipparchus.exception.MathIllegalArgumentException;
26 import org.orekit.attitudes.AttitudeProvider;
27 import org.orekit.attitudes.FieldAttitude;
28 import org.orekit.attitudes.FrameAlignedProvider;
29 import org.orekit.errors.OrekitException;
30 import org.orekit.errors.OrekitIllegalArgumentException;
31 import org.orekit.errors.OrekitMessages;
32 import org.orekit.frames.Frame;
33 import org.orekit.orbits.FieldOrbit;
34 import org.orekit.propagation.FieldSpacecraftState;
35 import org.orekit.propagation.FieldSpacecraftStateInterpolator;
36 import org.orekit.time.AbstractFieldTimeInterpolator;
37 import org.orekit.time.FieldAbsoluteDate;
38 import org.orekit.time.FieldTimeInterpolator;
39 import org.orekit.utils.FieldBoundedPVCoordinatesProvider;
40 import org.orekit.utils.FieldDataDictionary;
41 import org.orekit.utils.ImmutableFieldTimeStampedCache;
42 import org.orekit.utils.ParameterDriver;
43
44
45
46
47
48
49
50
51
52
53
54
55 public class FieldEphemeris<T extends CalculusFieldElement<T>> extends FieldAbstractAnalyticalPropagator<T>
56 implements FieldBoundedPVCoordinatesProvider<T> {
57
58
59 private final FieldAbsoluteDate<T> minDate;
60
61
62 private final FieldAbsoluteDate<T> maxDate;
63
64
65 private final Frame frame;
66
67
68 private final String[] additional;
69
70
71 private final ImmutableFieldTimeStampedCache<FieldSpacecraftState<T>, T> statesCache;
72
73
74 private final FieldTimeInterpolator<FieldSpacecraftState<T>, T> stateInterpolator;
75
76
77
78
79
80
81
82
83
84
85
86
87
88 public FieldEphemeris(final List<FieldSpacecraftState<T>> states, final int interpolationPoints)
89 throws MathIllegalArgumentException {
90 this(states, new FieldSpacecraftStateInterpolator<>(interpolationPoints, states.getFirst().getFrame(), states.getFirst().getFrame()));
91 }
92
93
94
95
96
97
98
99
100
101
102
103
104 public FieldEphemeris(final List<FieldSpacecraftState<T>> states,
105 final FieldTimeInterpolator<FieldSpacecraftState<T>, T> stateInterpolator)
106 throws MathIllegalArgumentException {
107 this(states, stateInterpolator, new FrameAlignedProvider(states.getFirst().getFrame()));
108 }
109
110
111
112
113
114
115
116
117
118
119
120
121
122 public FieldEphemeris(final List<FieldSpacecraftState<T>> states,
123 final FieldTimeInterpolator<FieldSpacecraftState<T>, T> stateInterpolator,
124 final AttitudeProvider attitudeProvider)
125 throws MathIllegalArgumentException {
126 super(states.getFirst().getDate().getField(), attitudeProvider);
127
128
129 checkInputConsistency(states, stateInterpolator);
130
131
132 final FieldSpacecraftState<T> s0 = states.getFirst();
133 minDate = s0.getDate();
134 maxDate = states.getLast().getDate();
135 frame = s0.getFrame();
136
137 final List<FieldDataDictionary<T>.Entry> as = s0.getAdditionalDataValues().getData();
138 additional = new String[as.size()];
139 for (int i = 0; i < additional.length; ++i) {
140 additional[i] = as.get(i).getKey();
141 }
142
143 this.statesCache = new ImmutableFieldTimeStampedCache<>(stateInterpolator.getNbInterpolationPoints(), states);
144 this.stateInterpolator = stateInterpolator;
145
146
147 super.resetInitialState(getInitialState());
148 }
149
150
151
152
153
154
155 public FieldEphemeris(final Field<T> field, final Ephemeris ephemeris) {
156 this(ephemeris.getStates().stream().map(state -> new FieldSpacecraftState<>(field, state)).collect(Collectors.toList()),
157 new FieldSpacecraftStateInterpolator<>(ephemeris.getStateInterpolator().getNbInterpolationPoints(),
158 ephemeris.getFrame()), ephemeris.getAttitudeProvider());
159 }
160
161
162
163
164
165 public List<FieldSpacecraftState<T>> getStates() {
166 return statesCache.getAll();
167 }
168
169
170
171
172
173
174
175 public void checkInputConsistency(final List<FieldSpacecraftState<T>> states,
176 final FieldTimeInterpolator<FieldSpacecraftState<T>, T> interpolator) {
177 checkStatesDefinitionsConsistency(states);
178
179
180 AbstractFieldTimeInterpolator.checkInterpolatorCompatibilityWithSampleSize(interpolator, states.size());
181 }
182
183
184
185
186
187
188 public void checkStatesDefinitionsConsistency(final List<FieldSpacecraftState<T>> states) {
189
190 final FieldSpacecraftState<T> s0 = states.getFirst();
191 final boolean s0IsOrbitDefined = s0.isOrbitDefined();
192 for (final FieldSpacecraftState<T> state : states) {
193 s0.ensureCompatibleAdditionalStates(state);
194 if (s0IsOrbitDefined != state.isOrbitDefined()) {
195 throw new OrekitIllegalArgumentException(OrekitMessages.DIFFERENT_STATE_DEFINITION);
196 }
197 }
198 }
199
200
201
202
203
204
205 public FieldAbsoluteDate<T> getMinDate() {
206 return minDate;
207 }
208
209
210
211
212
213
214 public FieldAbsoluteDate<T> getMaxDate() {
215 return maxDate;
216 }
217
218
219 @Override
220 public Frame getFrame() {
221 return frame;
222 }
223
224
225 @Override
226 public FieldSpacecraftState<T> basicPropagate(final FieldAbsoluteDate<T> date) {
227
228 final FieldAbsoluteDate<T> centralDate =
229 AbstractFieldTimeInterpolator.getCentralDate(date, statesCache, stateInterpolator.getExtrapolationThreshold());
230 final FieldSpacecraftState<T> evaluatedState = stateInterpolator.interpolate(date, statesCache.getNeighbors(centralDate));
231 final AttitudeProvider attitudeProvider = getAttitudeProvider();
232 final FieldAttitude<T> calculatedAttitude;
233
234 if (evaluatedState.isOrbitDefined()) {
235 calculatedAttitude =
236 attitudeProvider.getAttitude(evaluatedState.getOrbit(), date, evaluatedState.getFrame());
237 return new FieldSpacecraftState<>(evaluatedState.getOrbit(), calculatedAttitude, evaluatedState.getMass(),
238 evaluatedState.getMassRate(), evaluatedState.getAdditionalDataValues(),
239 evaluatedState.getAdditionalStatesDerivatives());
240 }
241 else {
242 calculatedAttitude =
243 attitudeProvider.getAttitude(evaluatedState.getAbsPVA(), date, evaluatedState.getFrame());
244 return new FieldSpacecraftState<>(evaluatedState.getAbsPVA(), calculatedAttitude, evaluatedState.getMass(),
245 evaluatedState.getMassRate(), evaluatedState.getAdditionalDataValues(),
246 evaluatedState.getAdditionalStatesDerivatives());
247 }
248 }
249
250
251 public FieldOrbit<T> propagateOrbit(final FieldAbsoluteDate<T> date, final T[] parameters) {
252 return basicPropagate(date).getOrbit();
253 }
254
255
256 protected T getMass(final FieldAbsoluteDate<T> date) {
257 return basicPropagate(date).getMass();
258 }
259
260
261
262
263
264
265
266
267
268 @Override
269 public void resetInitialState(final FieldSpacecraftState<T> state) {
270 resetIntermediateState(state, true);
271 }
272
273
274 protected void resetIntermediateState(final FieldSpacecraftState<T> state, final boolean forward) {
275 throw new OrekitException(OrekitMessages.NON_RESETABLE_STATE);
276 }
277
278
279 @Override
280 public FieldSpacecraftState<T> getInitialState() {
281 return basicPropagate(getMinDate());
282 }
283
284
285 @Override
286 public boolean isAdditionalDataManaged(final String name) {
287
288
289 if (super.isAdditionalDataManaged(name)) {
290 return true;
291 }
292
293
294 for (final String a : additional) {
295 if (a.equals(name)) {
296 return true;
297 }
298 }
299
300 return false;
301
302 }
303
304
305 @Override
306 public String[] getManagedAdditionalData() {
307 final String[] upperManaged = super.getManagedAdditionalData();
308 final String[] managed = new String[upperManaged.length + additional.length];
309 System.arraycopy(upperManaged, 0, managed, 0, upperManaged.length);
310 System.arraycopy(additional, 0, managed, upperManaged.length, additional.length);
311 return managed;
312 }
313
314
315
316
317 public FieldTimeInterpolator<FieldSpacecraftState<T>, T> getStateInterpolator() {
318 return stateInterpolator;
319 }
320
321 @Override
322 public List<ParameterDriver> getParametersDrivers() {
323 return new ArrayList<>();
324 }
325
326 }