1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.analytical;
18
19 import java.util.Collection;
20 import java.util.NavigableMap;
21
22 import org.hipparchus.CalculusFieldElement;
23 import org.hipparchus.geometry.euclidean.threed.FieldRotation;
24 import org.hipparchus.geometry.euclidean.threed.Rotation;
25 import org.hipparchus.geometry.euclidean.threed.Vector3D;
26 import org.orekit.attitudes.Attitude;
27 import org.orekit.attitudes.AttitudeProvider;
28 import org.orekit.attitudes.FieldAttitude;
29 import org.orekit.errors.OrekitException;
30 import org.orekit.errors.OrekitMessages;
31 import org.orekit.frames.Frame;
32 import org.orekit.orbits.Orbit;
33 import org.orekit.propagation.BoundedPropagator;
34 import org.orekit.propagation.SpacecraftState;
35 import org.orekit.time.AbsoluteDate;
36 import org.orekit.time.FieldAbsoluteDate;
37 import org.orekit.utils.FieldPVCoordinatesProvider;
38 import org.orekit.utils.PVCoordinatesProvider;
39 import org.orekit.utils.TimeSpanMap;
40 import org.orekit.utils.TimeStampedPVCoordinates;
41
42
43
44
45
46
47
48
49
50 public class AggregateBoundedPropagator extends AbstractAnalyticalPropagator
51 implements BoundedPropagator {
52
53
54 private final TimeSpanMap<BoundedPropagator> map;
55
56
57 private final AbsoluteDate min;
58
59
60 private final AbsoluteDate max;
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 public AggregateBoundedPropagator(final Collection<? extends BoundedPropagator> propagators) {
77 super(null);
78 map = new TimeSpanMap<>(null);
79 propagators.forEach(p -> map.addValidAfter(p, p.getMinDate(), false));
80 setAttitudeProvider(new AggregateAttitudeProvider());
81 this.min = map.getFirstNonNullSpan().getData().getMinDate();
82 this.max = map.getLastNonNullSpan().getData().getMaxDate();
83 super.resetInitialState(getInitialState());
84 }
85
86
87
88
89
90
91
92
93
94
95
96
97 public AggregateBoundedPropagator(final NavigableMap<AbsoluteDate, ? extends BoundedPropagator> propagators,
98 final AbsoluteDate min, final AbsoluteDate max) {
99 super(null);
100 map = new TimeSpanMap<>(null);
101 propagators.forEach((d, p) -> map.addValidAfter(p, p.getMinDate(), false));
102 setAttitudeProvider(new AggregateAttitudeProvider());
103 this.min = min;
104 this.max = max;
105 super.resetInitialState(getInitialState());
106 }
107
108
109
110
111
112 public TimeSpanMap<BoundedPropagator> getPropagatorsMap() {
113 return map;
114 }
115
116 @Override
117 public SpacecraftState basicPropagate(final AbsoluteDate date) {
118
119
120
121
122 final SpacecraftState state = getPropagator(date).propagate(date);
123
124 if (getAttitudeProvider() instanceof AggregateAttitudeProvider) {
125
126
127 return state;
128 } else {
129
130
131
132 final Attitude attitude =
133 getAttitudeProvider().getAttitude(this, date, state.getFrame());
134
135
136 if (state.isOrbitDefined()) {
137 return new SpacecraftState(state.getOrbit(), attitude, state.getMass(),
138 state.getAdditionalDataValues(), state.getAdditionalStatesDerivatives());
139 } else {
140 return new SpacecraftState(state.getAbsPVA(), attitude, state.getMass(),
141 state.getAdditionalDataValues(), state.getAdditionalStatesDerivatives());
142 }
143 }
144 }
145
146 @Override
147 public TimeStampedPVCoordinates getPVCoordinates(final AbsoluteDate date, final Frame frame) {
148 return getPropagator(date).getPVCoordinates(date, frame);
149 }
150
151 @Override
152 public Vector3D getPosition(final AbsoluteDate date, final Frame frame) {
153 return getPropagator(date).propagate(date).getPosition(frame);
154 }
155
156 @Override
157 public Orbit propagateOrbit(final AbsoluteDate date) {
158 return getPropagator(date).propagate(date).getOrbit();
159 }
160
161 @Override
162 public AbsoluteDate getMinDate() {
163 return min;
164 }
165
166 @Override
167 public AbsoluteDate getMaxDate() {
168 return max;
169 }
170
171 @Override
172 protected double getMass(final AbsoluteDate date) {
173 return getPropagator(date).propagate(date).getMass();
174 }
175
176 @Override
177 public SpacecraftState getInitialState() {
178 return map.getFirstNonNullSpan().getData().getInitialState();
179 }
180
181 @Override
182 protected void resetIntermediateState(final SpacecraftState state, final boolean forward) {
183 throw new OrekitException(OrekitMessages.NON_RESETABLE_STATE);
184 }
185
186 @Override
187 public void resetInitialState(final SpacecraftState state) {
188 throw new OrekitException(OrekitMessages.NON_RESETABLE_STATE);
189 }
190
191
192
193
194
195
196
197 private BoundedPropagator getPropagator(final AbsoluteDate date) {
198 final BoundedPropagator propagator = map.get(date);
199 if (propagator != null) {
200 return propagator;
201 } else {
202
203 return map.getFirstNonNullSpan().getData();
204 }
205 }
206
207
208 private class AggregateAttitudeProvider implements AttitudeProvider {
209
210
211 @Override
212 public Attitude getAttitude(final PVCoordinatesProvider pvProv,
213 final AbsoluteDate date,
214 final Frame frame) {
215 return getPropagator(date).getAttitudeProvider().getAttitude(pvProv, date, frame);
216 }
217
218
219 @Override
220 public <T extends CalculusFieldElement<T>> FieldAttitude<T> getAttitude(final FieldPVCoordinatesProvider<T> pvProv,
221 final FieldAbsoluteDate<T> date,
222 final Frame frame) {
223 return getPropagator(date.toAbsoluteDate()).getAttitudeProvider().getAttitude(pvProv, date, frame);
224 }
225
226
227 @Override
228 public Rotation getAttitudeRotation(final PVCoordinatesProvider pvProv, final AbsoluteDate date, final Frame frame) {
229 return getPropagator(date).getAttitudeProvider().getAttitudeRotation(pvProv, date, frame);
230 }
231
232
233 @Override
234 public <T extends CalculusFieldElement<T>> FieldRotation<T> getAttitudeRotation(final FieldPVCoordinatesProvider<T> pvProv,
235 final FieldAbsoluteDate<T> date,
236 final Frame frame) {
237 return getPropagator(date.toAbsoluteDate()).getAttitudeProvider().getAttitudeRotation(pvProv, date, frame);
238 }
239 }
240
241 }