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