1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.analytical;
18
19
20 import java.util.Collections;
21 import java.util.List;
22
23 import org.hipparchus.CalculusFieldElement;
24 import org.hipparchus.util.MathArrays;
25 import org.orekit.attitudes.AttitudeProvider;
26 import org.orekit.attitudes.FieldAttitude;
27 import org.orekit.attitudes.InertialProvider;
28 import org.orekit.orbits.FieldOrbit;
29 import org.orekit.orbits.Orbit;
30 import org.orekit.orbits.OrbitType;
31 import org.orekit.orbits.PositionAngle;
32 import org.orekit.propagation.FieldSpacecraftState;
33 import org.orekit.time.FieldAbsoluteDate;
34 import org.orekit.utils.FieldArrayDictionary;
35 import org.orekit.utils.FieldTimeSpanMap;
36 import org.orekit.utils.ParameterDriver;
37
38
39
40
41
42 public class FieldKeplerianPropagator<T extends CalculusFieldElement<T>> extends FieldAbstractAnalyticalPropagator<T> {
43
44
45
46 private transient FieldTimeSpanMap<FieldSpacecraftState<T>, T> states;
47
48
49
50
51
52
53
54
55
56 public FieldKeplerianPropagator(final FieldOrbit<T> initialFieldOrbit) {
57 this(initialFieldOrbit, InertialProvider.of(initialFieldOrbit.getFrame()),
58 initialFieldOrbit.getMu(), initialFieldOrbit.getA().getField().getZero().add(DEFAULT_MASS));
59 }
60
61
62
63
64
65
66
67
68 public FieldKeplerianPropagator(final FieldOrbit<T> initialFieldOrbit, final T mu) {
69 this(initialFieldOrbit, InertialProvider.of(initialFieldOrbit.getFrame()),
70 mu, initialFieldOrbit.getA().getField().getZero().add(DEFAULT_MASS));
71 }
72
73
74
75
76
77
78
79
80 public FieldKeplerianPropagator(final FieldOrbit<T> initialFieldOrbit,
81 final AttitudeProvider attitudeProv) {
82 this(initialFieldOrbit, attitudeProv, initialFieldOrbit.getMu(), initialFieldOrbit.getA().getField().getZero().add(DEFAULT_MASS));
83 }
84
85
86
87
88
89
90
91
92 public FieldKeplerianPropagator(final FieldOrbit<T> initialFieldOrbit,
93 final AttitudeProvider attitudeProv,
94 final T mu) {
95 this(initialFieldOrbit, attitudeProv, mu, initialFieldOrbit.getA().getField().getZero().add(DEFAULT_MASS));
96 }
97
98
99
100
101
102
103
104
105 public FieldKeplerianPropagator(final FieldOrbit<T> initialOrbit, final AttitudeProvider attitudeProv,
106 final T mu, final T mass) {
107
108 super(initialOrbit.getA().getField(), attitudeProv);
109
110
111 final FieldSpacecraftState<T> initial = fixState(initialOrbit,
112 getAttitudeProvider().getAttitude(initialOrbit,
113 initialOrbit.getDate(),
114 initialOrbit.getFrame()),
115 mass, mu, null, null);
116 states = new FieldTimeSpanMap<>(initial, initialOrbit.getA().getField());
117 super.resetInitialState(initial);
118 }
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133 private FieldSpacecraftState<T> fixState(final FieldOrbit<T> orbit, final FieldAttitude<T> attitude, final T mass, final T mu,
134 final FieldArrayDictionary<T> additionalStates,
135 final FieldArrayDictionary<T> additionalStatesderivatives) {
136 final OrbitType type = orbit.getType();
137 final T[] stateVector = MathArrays.buildArray(mass.getField(), 6);
138 type.mapOrbitToArray(orbit, PositionAngle.TRUE, stateVector, null);
139 final FieldOrbit<T> fixedOrbit = type.mapArrayToOrbit(stateVector, null, PositionAngle.TRUE,
140 orbit.getDate(), mu, orbit.getFrame());
141 FieldSpacecraftState<T> fixedState = new FieldSpacecraftState<>(fixedOrbit, attitude, mass);
142 if (additionalStates != null) {
143 for (final FieldArrayDictionary<T>.Entry entry : additionalStates.getData()) {
144 fixedState = fixedState.addAdditionalState(entry.getKey(), entry.getValue());
145 }
146 }
147 if (additionalStatesderivatives != null) {
148 for (final FieldArrayDictionary<T>.Entry entry : additionalStatesderivatives.getData()) {
149 fixedState = fixedState.addAdditionalStateDerivative(entry.getKey(), entry.getValue());
150 }
151 }
152 return fixedState;
153 }
154
155
156 public void resetInitialState(final FieldSpacecraftState<T> state) {
157
158
159 final FieldSpacecraftState<T> formerInitial = getInitialState();
160 final T mu = formerInitial == null ? state.getMu() : formerInitial.getMu();
161 final FieldSpacecraftState<T> fixedState = fixState(state.getOrbit(),
162 state.getAttitude(),
163 state.getMass(),
164 mu,
165 state.getAdditionalStatesValues(),
166 state.getAdditionalStatesDerivatives());
167
168 states = new FieldTimeSpanMap<>(fixedState, state.getDate().getField());
169 super.resetInitialState(fixedState);
170
171 }
172
173
174 protected void resetIntermediateState(final FieldSpacecraftState<T> state, final boolean forward) {
175 if (forward) {
176 states.addValidAfter(state, state.getDate());
177 } else {
178 states.addValidBefore(state, state.getDate());
179 }
180 stateChanged(state);
181 }
182
183
184 protected FieldOrbit<T> propagateOrbit(final FieldAbsoluteDate<T> date, final T[] parameters) {
185
186 FieldOrbit<T> orbit = states.get(date).getOrbit();
187 do {
188
189
190 orbit = orbit.shiftedBy(date.durationFrom(orbit.getDate()));
191 } while (!date.equals(orbit.getDate()));
192 return orbit;
193 }
194
195
196 protected T getMass(final FieldAbsoluteDate<T> date) {
197 return states.get(date).getMass();
198 }
199
200
201 @Override
202 protected List<ParameterDriver> getParametersDrivers() {
203
204 return Collections.emptyList();
205 }
206
207 }