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