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.Map.Entry;
21 import java.util.NavigableMap;
22 import java.util.TreeMap;
23
24 import org.orekit.attitudes.Attitude;
25 import org.orekit.attitudes.AttitudeProvider;
26 import org.orekit.attitudes.InertialProvider;
27 import org.orekit.errors.OrekitException;
28 import org.orekit.errors.OrekitMessages;
29 import org.orekit.frames.Frame;
30 import org.orekit.orbits.Orbit;
31 import org.orekit.propagation.BoundedPropagator;
32 import org.orekit.propagation.SpacecraftState;
33 import org.orekit.time.AbsoluteDate;
34 import org.orekit.utils.TimeStampedPVCoordinates;
35
36
37
38
39
40
41
42
43 public class AggregateBoundedPropagator extends AbstractAnalyticalPropagator
44 implements BoundedPropagator {
45
46
47 private final NavigableMap<AbsoluteDate, BoundedPropagator> propagators;
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 public AggregateBoundedPropagator(
64 final Collection<? extends BoundedPropagator> propagators) {
65 super(defaultAttitude(propagators));
66 this.propagators = new TreeMap<>();
67 for (final BoundedPropagator propagator : propagators) {
68 this.propagators.put(propagator.getMinDate(), propagator);
69 }
70 super.resetInitialState(
71 this.propagators.firstEntry().getValue().getInitialState());
72 }
73
74
75
76
77
78
79 private static AttitudeProvider defaultAttitude(
80 final Collection<? extends BoundedPropagator> propagators) {
81
82
83 if (propagators.isEmpty()) {
84 throw new OrekitException(OrekitMessages.NOT_ENOUGH_PROPAGATORS);
85 }
86 return new InertialProvider(propagators.iterator().next().getFrame());
87 }
88
89 @Override
90 protected SpacecraftState basicPropagate(final AbsoluteDate date) {
91
92
93
94
95 final SpacecraftState state = getPropagator(date).propagate(date);
96
97
98 final Attitude attitude =
99 getAttitudeProvider().getAttitude(this, date, state.getFrame());
100
101
102 if (state.isOrbitDefined()) {
103 return new SpacecraftState(
104 state.getOrbit(), attitude, state.getMass(),
105 state.getAdditionalStatesValues(), state.getAdditionalStatesDerivatives());
106 } else {
107 return new SpacecraftState(
108 state.getAbsPVA(), attitude, state.getMass(),
109 state.getAdditionalStatesValues(), state.getAdditionalStatesDerivatives());
110 }
111 }
112
113 @Override
114 public TimeStampedPVCoordinates getPVCoordinates(final AbsoluteDate date,
115 final Frame frame) {
116 return getPropagator(date).getPVCoordinates(date, frame);
117 }
118
119 @Override
120 protected Orbit propagateOrbit(final AbsoluteDate date) {
121 return getPropagator(date).propagate(date).getOrbit();
122 }
123
124 @Override
125 public AbsoluteDate getMinDate() {
126 return propagators.firstEntry().getValue().getMinDate();
127 }
128
129 @Override
130 public AbsoluteDate getMaxDate() {
131 return propagators.lastEntry().getValue().getMaxDate();
132 }
133
134 @Override
135 protected double getMass(final AbsoluteDate date) {
136 return getPropagator(date).propagate(date).getMass();
137 }
138
139 @Override
140 public SpacecraftState getInitialState() {
141 return propagators.firstEntry().getValue().getInitialState();
142 }
143
144 @Override
145 protected void resetIntermediateState(final SpacecraftState state,
146 final boolean forward) {
147 throw new OrekitException(OrekitMessages.NON_RESETABLE_STATE);
148 }
149
150 @Override
151 public void resetInitialState(final SpacecraftState state) {
152 throw new OrekitException(OrekitMessages.NON_RESETABLE_STATE);
153 }
154
155
156
157
158
159
160
161 private BoundedPropagator getPropagator(final AbsoluteDate date) {
162 final Entry<AbsoluteDate, BoundedPropagator> entry = propagators.floorEntry(date);
163 if (entry != null) {
164 return entry.getValue();
165 } else {
166
167 return propagators.firstEntry().getValue();
168 }
169 }
170
171 }