1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.integration;
18
19 import java.util.Arrays;
20 import java.util.Collections;
21 import java.util.List;
22 import java.util.stream.Stream;
23
24 import org.hipparchus.CalculusFieldElement;
25 import org.hipparchus.Field;
26 import org.hipparchus.ode.FieldDenseOutputModel;
27 import org.hipparchus.ode.FieldODEStateAndDerivative;
28 import org.orekit.attitudes.AttitudeProvider;
29 import org.orekit.attitudes.AttitudeProviderModifier;
30 import org.orekit.errors.OrekitException;
31 import org.orekit.errors.OrekitMessages;
32 import org.orekit.frames.Frame;
33 import org.orekit.orbits.FieldOrbit;
34 import org.orekit.propagation.FieldAdditionalDataProvider;
35 import org.orekit.propagation.FieldBoundedPropagator;
36 import org.orekit.propagation.FieldSpacecraftState;
37 import org.orekit.propagation.PropagationType;
38 import org.orekit.propagation.analytical.FieldAbstractAnalyticalPropagator;
39 import org.orekit.propagation.events.EventDetector;
40 import org.orekit.propagation.events.FieldEventDetector;
41 import org.orekit.time.FieldAbsoluteDate;
42 import org.orekit.utils.FieldDataDictionary;
43 import org.orekit.utils.ParameterDriver;
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 public class FieldIntegratedEphemeris <T extends CalculusFieldElement<T>>
77 extends FieldAbstractAnalyticalPropagator<T> implements FieldBoundedPropagator<T> {
78
79
80 private static final double EXTRAPOLATION_TOLERANCE = 1.0;
81
82
83 private final FieldStateMapper<T> mapper;
84
85
86
87
88
89
90
91 private final PropagationType type;
92
93
94 private final FieldAbsoluteDate<T> startDate;
95
96
97 private final FieldAbsoluteDate<T> minDate;
98
99
100 private final FieldAbsoluteDate<T> maxDate;
101
102
103 private final FieldDenseOutputModel<T> model;
104
105
106 private final FieldDataDictionary<T> unmanaged;
107
108
109
110
111 private final String[] equations;
112
113
114
115
116 private final int[] dimensions;
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132 public FieldIntegratedEphemeris(final FieldAbsoluteDate<T> startDate,
133 final FieldAbsoluteDate<T> minDate, final FieldAbsoluteDate<T> maxDate,
134 final FieldStateMapper<T> mapper, final AttitudeProvider attitudeProvider,
135 final PropagationType type, final FieldDenseOutputModel<T> model,
136 final FieldDataDictionary<T> unmanaged,
137 final List<FieldAdditionalDataProvider<?, T>> providers,
138 final String[] equations, final int[] dimensions) {
139
140 super(startDate.getField(), attitudeProvider);
141
142 this.startDate = startDate;
143 this.minDate = minDate;
144 this.maxDate = maxDate;
145 this.mapper = mapper;
146 this.type = type;
147 this.model = model;
148 this.unmanaged = unmanaged;
149
150
151 for (final FieldAdditionalDataProvider<?, T> provider : providers) {
152 addAdditionalDataProvider(provider);
153 }
154
155 this.equations = equations.clone();
156 this.dimensions = dimensions.clone();
157
158
159 super.resetInitialState(getInitialState());
160
161
162 setAttitudeProvider(new AttitudeProviderModifier() {
163 @Override
164 public AttitudeProvider getUnderlyingAttitudeProvider() {
165 return attitudeProvider;
166 }
167
168 @Override
169 public Stream<EventDetector> getEventDetectors() {
170 return Stream.of();
171 }
172
173 @Override
174 public <W extends CalculusFieldElement<W>> Stream<FieldEventDetector<W>> getFieldEventDetectors(final Field<W> field) {
175 return Stream.of();
176 }
177 });
178 }
179
180
181
182
183
184
185 private FieldODEStateAndDerivative<T> getInterpolatedState(final FieldAbsoluteDate<T> date) {
186
187
188
189 if (date.compareTo(minDate.shiftedBy(-EXTRAPOLATION_TOLERANCE)) < 0) {
190
191 throw new OrekitException(OrekitMessages.OUT_OF_RANGE_EPHEMERIDES_DATE_BEFORE,
192 date, minDate, maxDate, minDate.durationFrom(date).getReal());
193 }
194 if (date.compareTo(maxDate.shiftedBy(EXTRAPOLATION_TOLERANCE)) > 0) {
195
196 throw new OrekitException(OrekitMessages.OUT_OF_RANGE_EPHEMERIDES_DATE_AFTER,
197 date, minDate, maxDate, date.durationFrom(maxDate).getReal());
198 }
199
200 return model.getInterpolatedState(date.durationFrom(startDate));
201
202 }
203
204
205 @Override
206 public FieldSpacecraftState<T> basicPropagate(final FieldAbsoluteDate<T> date) {
207 final FieldODEStateAndDerivative<T> os = getInterpolatedState(date);
208 FieldSpacecraftState<T> state = mapper.mapArrayToState(mapper.mapDoubleToDate(os.getTime(), date),
209 os.getPrimaryState(), os.getPrimaryDerivative(),
210 type);
211 for (FieldDataDictionary<T>.Entry initial : unmanaged.getData()) {
212 state = state.addAdditionalData(initial.getKey(), initial.getValue());
213 }
214 return state;
215 }
216
217
218 @Override
219 public FieldOrbit<T> propagateOrbit(final FieldAbsoluteDate<T> date,
220 final T[] parameters) {
221 return basicPropagate(date).getOrbit();
222 }
223
224
225 @Override
226 protected T getMass(final FieldAbsoluteDate<T> date) {
227 return basicPropagate(date).getMass();
228 }
229
230
231
232
233 @Override
234 public FieldAbsoluteDate<T> getMinDate() {
235 return minDate;
236 }
237
238
239
240
241 @Override
242 public FieldAbsoluteDate<T> getMaxDate() {
243 return maxDate;
244 }
245
246 @Override
247 public Frame getFrame() {
248 return this.mapper.getFrame();
249 }
250
251
252 @Override
253 public void resetInitialState(final FieldSpacecraftState<T> state) {
254 throw new OrekitException(OrekitMessages.NON_RESETABLE_STATE);
255 }
256
257
258 @Override
259 protected void resetIntermediateState(final FieldSpacecraftState<T> state, final boolean forward) {
260 throw new OrekitException(OrekitMessages.NON_RESETABLE_STATE);
261 }
262
263
264 @Override
265 public FieldSpacecraftState<T> getInitialState() {
266 return updateAdditionalData(basicPropagate(getMinDate()));
267 }
268
269
270 @Override
271 public FieldSpacecraftState<T> updateAdditionalData(final FieldSpacecraftState<T> original) {
272
273 FieldSpacecraftState<T> updated = super.updateAdditionalData(original);
274
275 if (equations.length > 0) {
276 final FieldODEStateAndDerivative<T> osd = getInterpolatedState(updated.getDate());
277 final T[] combinedState = osd.getSecondaryState(1);
278 final T[] combinedDerivative = osd.getSecondaryDerivative(1);
279 int index = 0;
280 for (int i = 0; i < equations.length; ++i) {
281 final T[] state = Arrays.copyOfRange(combinedState, index, index + dimensions[i]);
282 final T[] derivative = Arrays.copyOfRange(combinedDerivative, index, index + dimensions[i]);
283 updated = updated.
284 addAdditionalData(equations[i], state).
285 addAdditionalStateDerivative(equations[i], derivative);
286 index += dimensions[i];
287 }
288 }
289
290 return updated;
291
292 }
293
294
295 @Override
296 public List<ParameterDriver> getParametersDrivers() {
297
298 return Collections.emptyList();
299 }
300
301 }