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
23 import org.hipparchus.CalculusFieldElement;
24 import org.hipparchus.ode.FieldDenseOutputModel;
25 import org.hipparchus.ode.FieldODEStateAndDerivative;
26 import org.orekit.errors.OrekitException;
27 import org.orekit.errors.OrekitMessages;
28 import org.orekit.frames.Frame;
29 import org.orekit.orbits.FieldOrbit;
30 import org.orekit.propagation.FieldAdditionalStateProvider;
31 import org.orekit.propagation.FieldBoundedPropagator;
32 import org.orekit.propagation.FieldSpacecraftState;
33 import org.orekit.propagation.PropagationType;
34 import org.orekit.propagation.analytical.FieldAbstractAnalyticalPropagator;
35 import org.orekit.time.FieldAbsoluteDate;
36 import org.orekit.utils.FieldArrayDictionary;
37 import org.orekit.utils.ParameterDriver;
38
39
40
41
42
43
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 public class FieldIntegratedEphemeris <T extends CalculusFieldElement<T>>
71 extends FieldAbstractAnalyticalPropagator<T> implements FieldBoundedPropagator<T> {
72
73
74 private static final double EXTRAPOLATION_TOLERANCE = 1.0;
75
76
77 private final FieldStateMapper<T> mapper;
78
79
80
81
82
83
84
85 private PropagationType type;
86
87
88 private final FieldAbsoluteDate<T> startDate;
89
90
91 private final FieldAbsoluteDate<T> minDate;
92
93
94 private final FieldAbsoluteDate<T> maxDate;
95
96
97 private FieldDenseOutputModel<T> model;
98
99
100 private final FieldArrayDictionary<T> unmanaged;
101
102
103
104
105 private final String[] equations;
106
107
108
109
110 private final int[] dimensions;
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125 public FieldIntegratedEphemeris(final FieldAbsoluteDate<T> startDate,
126 final FieldAbsoluteDate<T> minDate, final FieldAbsoluteDate<T> maxDate,
127 final FieldStateMapper<T> mapper, final PropagationType type,
128 final FieldDenseOutputModel<T> model,
129 final FieldArrayDictionary<T> unmanaged,
130 final List<FieldAdditionalStateProvider<T>> providers,
131 final String[] equations, final int[] dimensions) {
132
133 super(startDate.getField(), mapper.getAttitudeProvider());
134
135 this.startDate = startDate;
136 this.minDate = minDate;
137 this.maxDate = maxDate;
138 this.mapper = mapper;
139 this.type = type;
140 this.model = model;
141 this.unmanaged = unmanaged;
142
143
144 for (final FieldAdditionalStateProvider<T> provider : providers) {
145 addAdditionalStateProvider(provider);
146 }
147
148 this.equations = equations.clone();
149 this.dimensions = dimensions.clone();
150
151
152 super.resetInitialState(getInitialState());
153
154 }
155
156
157
158
159
160
161 private FieldODEStateAndDerivative<T> getInterpolatedState(final FieldAbsoluteDate<T> date) {
162
163
164
165 if (date.compareTo(minDate.shiftedBy(-EXTRAPOLATION_TOLERANCE)) < 0) {
166
167 throw new OrekitException(OrekitMessages.OUT_OF_RANGE_EPHEMERIDES_DATE_BEFORE,
168 date, minDate, maxDate, minDate.durationFrom(date).getReal());
169 }
170 if (date.compareTo(maxDate.shiftedBy(EXTRAPOLATION_TOLERANCE)) > 0) {
171
172 throw new OrekitException(OrekitMessages.OUT_OF_RANGE_EPHEMERIDES_DATE_AFTER,
173 date, minDate, maxDate, date.durationFrom(maxDate).getReal());
174 }
175
176 return model.getInterpolatedState(date.durationFrom(startDate));
177
178 }
179
180
181 @Override
182 protected FieldSpacecraftState<T> basicPropagate(final FieldAbsoluteDate<T> date) {
183 final FieldODEStateAndDerivative<T> os = getInterpolatedState(date);
184 FieldSpacecraftState<T> state = mapper.mapArrayToState(mapper.mapDoubleToDate(os.getTime(), date),
185 os.getPrimaryState(), os.getPrimaryDerivative(),
186 type);
187 for (FieldArrayDictionary<T>.Entry initial : unmanaged.getData()) {
188 state = state.addAdditionalState(initial.getKey(), initial.getValue());
189 }
190 return state;
191 }
192
193
194 @Override
195 protected FieldOrbit<T> propagateOrbit(final FieldAbsoluteDate<T> date, final T[] parameters) {
196 return basicPropagate(date).getOrbit();
197 }
198
199
200 @Override
201 protected T getMass(final FieldAbsoluteDate<T> date) {
202 return basicPropagate(date).getMass();
203 }
204
205
206
207
208 @Override
209 public FieldAbsoluteDate<T> getMinDate() {
210 return minDate;
211 }
212
213
214
215
216 @Override
217 public FieldAbsoluteDate<T> getMaxDate() {
218 return maxDate;
219 }
220
221 @Override
222 public Frame getFrame() {
223 return this.mapper.getFrame();
224 }
225
226
227 @Override
228 public void resetInitialState(final FieldSpacecraftState<T> state) {
229 throw new OrekitException(OrekitMessages.NON_RESETABLE_STATE);
230 }
231
232
233 @Override
234 protected void resetIntermediateState(final FieldSpacecraftState<T> state, final boolean forward) {
235 throw new OrekitException(OrekitMessages.NON_RESETABLE_STATE);
236 }
237
238
239 @Override
240 public FieldSpacecraftState<T> getInitialState() {
241 return updateAdditionalStates(basicPropagate(getMinDate()));
242 }
243
244
245 @Override
246 protected FieldSpacecraftState<T> updateAdditionalStates(final FieldSpacecraftState<T> original) {
247
248 FieldSpacecraftState<T> updated = super.updateAdditionalStates(original);
249
250 if (equations.length > 0) {
251 final FieldODEStateAndDerivative<T> osd = getInterpolatedState(updated.getDate());
252 final T[] combinedState = osd.getSecondaryState(1);
253 final T[] combinedDerivative = osd.getSecondaryDerivative(1);
254 int index = 0;
255 for (int i = 0; i < equations.length; ++i) {
256 final T[] state = Arrays.copyOfRange(combinedState, index, index + dimensions[i]);
257 final T[] derivative = Arrays.copyOfRange(combinedDerivative, index, index + dimensions[i]);
258 updated = updated.
259 addAdditionalState(equations[i], state).
260 addAdditionalStateDerivative(equations[i], derivative);
261 index += dimensions[i];
262 }
263 }
264
265 return updated;
266
267 }
268
269
270 @Override
271 public List<ParameterDriver> getParametersDrivers() {
272
273 return Collections.emptyList();
274 }
275
276 }