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