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(), state.getAdditionalStates());
105 } else {
106 return new SpacecraftState(
107 state.getAbsPVA(), attitude, state.getMass(), state.getAdditionalStates());
108 }
109 }
110
111 @Override
112 public TimeStampedPVCoordinates getPVCoordinates(final AbsoluteDate date,
113 final Frame frame) {
114 return getPropagator(date).getPVCoordinates(date, frame);
115 }
116
117 @Override
118 protected Orbit propagateOrbit(final AbsoluteDate date) {
119 return getPropagator(date).propagate(date).getOrbit();
120 }
121
122 @Override
123 public AbsoluteDate getMinDate() {
124 return propagators.firstEntry().getValue().getMinDate();
125 }
126
127 @Override
128 public AbsoluteDate getMaxDate() {
129 return propagators.lastEntry().getValue().getMaxDate();
130 }
131
132 @Override
133 protected double getMass(final AbsoluteDate date) {
134 return getPropagator(date).propagate(date).getMass();
135 }
136
137 @Override
138 public SpacecraftState getInitialState() {
139 return propagators.firstEntry().getValue().getInitialState();
140 }
141
142 @Override
143 protected void resetIntermediateState(final SpacecraftState state,
144 final boolean forward) {
145 throw new OrekitException(OrekitMessages.NON_RESETABLE_STATE);
146 }
147
148 @Override
149 public void resetInitialState(final SpacecraftState state) {
150 throw new OrekitException(OrekitMessages.NON_RESETABLE_STATE);
151 }
152
153
154
155
156
157
158
159 private BoundedPropagator getPropagator(final AbsoluteDate date) {
160 final Entry<AbsoluteDate, BoundedPropagator> entry = propagators.floorEntry(date);
161 if (entry != null) {
162 return entry.getValue();
163 } else {
164
165 return propagators.firstEntry().getValue();
166 }
167 }
168
169 }