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 import java.util.TreeMap;
22
23 import org.hipparchus.CalculusFieldElement;
24 import org.hipparchus.geometry.euclidean.threed.FieldRotation;
25 import org.hipparchus.geometry.euclidean.threed.Rotation;
26 import org.hipparchus.geometry.euclidean.threed.Vector3D;
27 import org.orekit.attitudes.Attitude;
28 import org.orekit.attitudes.AttitudeProvider;
29 import org.orekit.attitudes.FieldAttitude;
30 import org.orekit.errors.OrekitException;
31 import org.orekit.errors.OrekitMessages;
32 import org.orekit.frames.Frame;
33 import org.orekit.orbits.Orbit;
34 import org.orekit.propagation.BoundedPropagator;
35 import org.orekit.propagation.SpacecraftState;
36 import org.orekit.time.AbsoluteDate;
37 import org.orekit.time.FieldAbsoluteDate;
38 import org.orekit.utils.FieldPVCoordinatesProvider;
39 import org.orekit.utils.PVCoordinatesProvider;
40 import org.orekit.utils.TimeSpanMap;
41 import org.orekit.utils.TimeStampedPVCoordinates;
42
43
44
45
46
47
48
49
50
51 public class AggregateBoundedPropagator extends AbstractAnalyticalPropagator
52 implements BoundedPropagator {
53
54
55 private final TimeSpanMap<BoundedPropagator> map;
56
57
58 private final AbsoluteDate min;
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
117
118
119
120
121
122
123
124
125 @Deprecated
126 public NavigableMap<AbsoluteDate, BoundedPropagator> getPropagators() {
127 final NavigableMap<AbsoluteDate, BoundedPropagator> nm = new TreeMap<>();
128 for (TimeSpanMap.Span<BoundedPropagator> span = map.getFirstNonNullSpan(); span != null; span = span.next()) {
129 nm.put(span.getData().getMinDate(), span.getData());
130 }
131 return nm;
132 }
133
134 @Override
135 protected SpacecraftState basicPropagate(final AbsoluteDate date) {
136
137
138
139
140 final SpacecraftState state = getPropagator(date).propagate(date);
141
142
143 final Attitude attitude =
144 getAttitudeProvider().getAttitude(this, date, state.getFrame());
145
146
147 if (state.isOrbitDefined()) {
148 return new SpacecraftState(
149 state.getOrbit(), attitude, state.getMass(),
150 state.getAdditionalStatesValues(), state.getAdditionalStatesDerivatives());
151 } else {
152 return new SpacecraftState(
153 state.getAbsPVA(), attitude, state.getMass(),
154 state.getAdditionalStatesValues(), state.getAdditionalStatesDerivatives());
155 }
156 }
157
158 @Override
159 public TimeStampedPVCoordinates getPVCoordinates(final AbsoluteDate date,
160 final Frame frame) {
161 return getPropagator(date).getPVCoordinates(date, frame);
162 }
163
164 @Override
165 public Vector3D getPosition(final AbsoluteDate date, final Frame frame) {
166 return getPropagator(date).propagate(date).getPosition(frame);
167 }
168
169 @Override
170 protected Orbit propagateOrbit(final AbsoluteDate date) {
171 return getPropagator(date).propagate(date).getOrbit();
172 }
173
174 @Override
175 public AbsoluteDate getMinDate() {
176 return min;
177 }
178
179 @Override
180 public AbsoluteDate getMaxDate() {
181 return max;
182 }
183
184 @Override
185 protected double getMass(final AbsoluteDate date) {
186 return getPropagator(date).propagate(date).getMass();
187 }
188
189 @Override
190 public SpacecraftState getInitialState() {
191 return map.getFirstNonNullSpan().getData().getInitialState();
192 }
193
194 @Override
195 protected void resetIntermediateState(final SpacecraftState state,
196 final boolean forward) {
197 throw new OrekitException(OrekitMessages.NON_RESETABLE_STATE);
198 }
199
200 @Override
201 public void resetInitialState(final SpacecraftState state) {
202 throw new OrekitException(OrekitMessages.NON_RESETABLE_STATE);
203 }
204
205
206
207
208
209
210
211 private BoundedPropagator getPropagator(final AbsoluteDate date) {
212 final BoundedPropagator propagator = map.get(date);
213 if (propagator != null) {
214 return propagator;
215 } else {
216
217 return map.getFirstNonNullSpan().getData();
218 }
219 }
220
221
222 private class AggregateAttitudeProvider implements AttitudeProvider {
223
224
225 @Override
226 public Attitude getAttitude(final PVCoordinatesProvider pvProv,
227 final AbsoluteDate date,
228 final Frame frame) {
229 return getPropagator(date).getAttitudeProvider().getAttitude(pvProv, date, frame);
230 }
231
232
233 @Override
234 public <T extends CalculusFieldElement<T>> FieldAttitude<T> getAttitude(final FieldPVCoordinatesProvider<T> pvProv,
235 final FieldAbsoluteDate<T> date,
236 final Frame frame) {
237 return getPropagator(date.toAbsoluteDate()).getAttitudeProvider().getAttitude(pvProv, date, frame);
238 }
239
240
241 @Override
242 public Rotation getAttitudeRotation(final PVCoordinatesProvider pvProv, final AbsoluteDate date, final Frame frame) {
243 return getPropagator(date).getAttitudeProvider().getAttitudeRotation(pvProv, date, frame);
244 }
245
246
247 @Override
248 public <T extends CalculusFieldElement<T>> FieldRotation<T> getAttitudeRotation(final FieldPVCoordinatesProvider<T> pvProv,
249 final FieldAbsoluteDate<T> date,
250 final Frame frame) {
251 return getPropagator(date.toAbsoluteDate()).getAttitudeProvider().getAttitudeRotation(pvProv, date, frame);
252 }
253 }
254
255 }