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 private final AbsoluteDate max;
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 public AggregateBoundedPropagator(final Collection<? extends BoundedPropagator> propagators) {
76 super(null);
77 map = new TimeSpanMap<>(null);
78 propagators.forEach(p -> map.addValidAfter(p, p.getMinDate(), false));
79 setAttitudeProvider(new AggregateAttitudeProvider());
80 this.min = map.getFirstNonNullSpan().getData().getMinDate();
81 this.max = map.getLastNonNullSpan().getData().getMaxDate();
82 super.resetInitialState(getInitialState());
83 }
84
85
86
87
88
89
90
91
92
93
94
95
96 public AggregateBoundedPropagator(final NavigableMap<AbsoluteDate, ? extends BoundedPropagator> propagators,
97 final AbsoluteDate min, final AbsoluteDate max) {
98 super(null);
99 map = new TimeSpanMap<>(null);
100 propagators.forEach((d, p) -> map.addValidAfter(p, p.getMinDate(), false));
101 setAttitudeProvider(new AggregateAttitudeProvider());
102 this.min = min;
103 this.max = max;
104 super.resetInitialState(getInitialState());
105 }
106
107
108
109
110
111 public TimeSpanMap<BoundedPropagator> getPropagatorsMap() {
112 return map;
113 }
114
115 @Override
116 public SpacecraftState basicPropagate(final AbsoluteDate date) {
117
118
119
120
121 final SpacecraftState state = getPropagator(date).propagate(date);
122
123
124 final Attitude attitude =
125 getAttitudeProvider().getAttitude(this, date, state.getFrame());
126
127
128 if (state.isOrbitDefined()) {
129 return new SpacecraftState(
130 state.getOrbit(), attitude, state.getMass(),
131 state.getAdditionalDataValues(), state.getAdditionalStatesDerivatives());
132 } else {
133 return new SpacecraftState(
134 state.getAbsPVA(), attitude, state.getMass(),
135 state.getAdditionalDataValues(), state.getAdditionalStatesDerivatives());
136 }
137 }
138
139 @Override
140 public TimeStampedPVCoordinates getPVCoordinates(final AbsoluteDate date,
141 final Frame frame) {
142 return getPropagator(date).getPVCoordinates(date, frame);
143 }
144
145 @Override
146 public Vector3D getPosition(final AbsoluteDate date, final Frame frame) {
147 return getPropagator(date).propagate(date).getPosition(frame);
148 }
149
150 @Override
151 public Orbit propagateOrbit(final AbsoluteDate date) {
152 return getPropagator(date).propagate(date).getOrbit();
153 }
154
155 @Override
156 public AbsoluteDate getMinDate() {
157 return min;
158 }
159
160 @Override
161 public AbsoluteDate getMaxDate() {
162 return max;
163 }
164
165 @Override
166 protected double getMass(final AbsoluteDate date) {
167 return getPropagator(date).propagate(date).getMass();
168 }
169
170 @Override
171 public SpacecraftState getInitialState() {
172 return map.getFirstNonNullSpan().getData().getInitialState();
173 }
174
175 @Override
176 protected void resetIntermediateState(final SpacecraftState state,
177 final boolean forward) {
178 throw new OrekitException(OrekitMessages.NON_RESETABLE_STATE);
179 }
180
181 @Override
182 public void resetInitialState(final SpacecraftState state) {
183 throw new OrekitException(OrekitMessages.NON_RESETABLE_STATE);
184 }
185
186
187
188
189
190
191
192 private BoundedPropagator getPropagator(final AbsoluteDate date) {
193 final BoundedPropagator propagator = map.get(date);
194 if (propagator != null) {
195 return propagator;
196 } else {
197
198 return map.getFirstNonNullSpan().getData();
199 }
200 }
201
202
203 private class AggregateAttitudeProvider implements AttitudeProvider {
204
205
206 @Override
207 public Attitude getAttitude(final PVCoordinatesProvider pvProv,
208 final AbsoluteDate date,
209 final Frame frame) {
210 return getPropagator(date).getAttitudeProvider().getAttitude(pvProv, date, frame);
211 }
212
213
214 @Override
215 public <T extends CalculusFieldElement<T>> FieldAttitude<T> getAttitude(final FieldPVCoordinatesProvider<T> pvProv,
216 final FieldAbsoluteDate<T> date,
217 final Frame frame) {
218 return getPropagator(date.toAbsoluteDate()).getAttitudeProvider().getAttitude(pvProv, date, frame);
219 }
220
221
222 @Override
223 public Rotation getAttitudeRotation(final PVCoordinatesProvider pvProv, final AbsoluteDate date, final Frame frame) {
224 return getPropagator(date).getAttitudeProvider().getAttitudeRotation(pvProv, date, frame);
225 }
226
227
228 @Override
229 public <T extends CalculusFieldElement<T>> FieldRotation<T> getAttitudeRotation(final FieldPVCoordinatesProvider<T> pvProv,
230 final FieldAbsoluteDate<T> date,
231 final Frame frame) {
232 return getPropagator(date.toAbsoluteDate()).getAttitudeProvider().getAttitudeRotation(pvProv, date, frame);
233 }
234 }
235
236 }