1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation;
18
19 import java.util.ArrayList;
20 import java.util.Collections;
21 import java.util.HashMap;
22 import java.util.List;
23 import java.util.Map;
24
25 import org.orekit.attitudes.AttitudeProvider;
26 import org.orekit.errors.OrekitException;
27 import org.orekit.errors.OrekitMessages;
28 import org.orekit.frames.Frame;
29 import org.orekit.propagation.sampling.StepHandlerMultiplexer;
30 import org.orekit.time.AbsoluteDate;
31 import org.orekit.utils.TimeSpanMap;
32 import org.orekit.utils.TimeStampedPVCoordinates;
33
34
35
36
37
38
39
40
41
42 public abstract class AbstractPropagator implements Propagator {
43
44
45 private StepHandlerMultiplexer multiplexer;
46
47
48 private AbsoluteDate startDate;
49
50
51 private AttitudeProvider attitudeProvider;
52
53
54 private final List<AdditionalStateProvider> additionalStateProviders;
55
56
57 private final Map<String, TimeSpanMap<double[]>> unmanagedStates;
58
59
60 private SpacecraftState initialState;
61
62
63
64 protected AbstractPropagator() {
65 multiplexer = new StepHandlerMultiplexer();
66 additionalStateProviders = new ArrayList<AdditionalStateProvider>();
67 unmanagedStates = new HashMap<>();
68 }
69
70
71
72
73 protected void setStartDate(final AbsoluteDate startDate) {
74 this.startDate = startDate;
75 }
76
77
78
79
80 protected AbsoluteDate getStartDate() {
81 return startDate;
82 }
83
84
85 public AttitudeProvider getAttitudeProvider() {
86 return attitudeProvider;
87 }
88
89
90 public void setAttitudeProvider(final AttitudeProvider attitudeProvider) {
91 this.attitudeProvider = attitudeProvider;
92 }
93
94
95 public SpacecraftState getInitialState() {
96 return initialState;
97 }
98
99
100 public Frame getFrame() {
101 return initialState.getFrame();
102 }
103
104
105 public void resetInitialState(final SpacecraftState state) {
106 initialState = state;
107 setStartDate(state.getDate());
108 }
109
110
111 public StepHandlerMultiplexer getMultiplexer() {
112 return multiplexer;
113 }
114
115
116 public void addAdditionalStateProvider(final AdditionalStateProvider additionalStateProvider) {
117
118
119 if (isAdditionalStateManaged(additionalStateProvider.getName())) {
120
121 throw new OrekitException(OrekitMessages.ADDITIONAL_STATE_NAME_ALREADY_IN_USE,
122 additionalStateProvider.getName());
123 }
124
125
126 additionalStateProviders.add(additionalStateProvider);
127
128 }
129
130
131 public List<AdditionalStateProvider> getAdditionalStateProviders() {
132 return Collections.unmodifiableList(additionalStateProviders);
133 }
134
135
136
137
138
139
140 protected SpacecraftState updateAdditionalStates(final SpacecraftState original) {
141
142
143
144 SpacecraftState updated = original;
145
146
147 for (final Map.Entry<String, TimeSpanMap<double[]>> entry : unmanagedStates.entrySet()) {
148 updated = updated.addAdditionalState(entry.getKey(),
149 entry.getValue().get(original.getDate()));
150 }
151
152
153 for (final AdditionalStateProvider provider : additionalStateProviders) {
154 updated = updated.addAdditionalState(provider.getName(),
155 provider.getAdditionalState(updated));
156 }
157
158 return updated;
159
160 }
161
162
163 public boolean isAdditionalStateManaged(final String name) {
164 for (final AdditionalStateProvider provider : additionalStateProviders) {
165 if (provider.getName().equals(name)) {
166 return true;
167 }
168 }
169 return false;
170 }
171
172
173 public String[] getManagedAdditionalStates() {
174 final String[] managed = new String[additionalStateProviders.size()];
175 for (int i = 0; i < managed.length; ++i) {
176 managed[i] = additionalStateProviders.get(i).getName();
177 }
178 return managed;
179 }
180
181
182 public SpacecraftState propagate(final AbsoluteDate target) {
183 if (startDate == null) {
184 startDate = getInitialState().getDate();
185 }
186 return propagate(startDate, target);
187 }
188
189
190 public TimeStampedPVCoordinates getPVCoordinates(final AbsoluteDate date, final Frame frame) {
191 return propagate(date).getPVCoordinates(frame);
192 }
193
194
195
196
197 protected void initializePropagation() {
198
199 unmanagedStates.clear();
200
201 if (initialState != null) {
202
203
204
205 for (final Map.Entry<String, double[]> initial : initialState.getAdditionalStates().entrySet()) {
206 if (!isAdditionalStateManaged(initial.getKey())) {
207
208
209 unmanagedStates.put(initial.getKey(), new TimeSpanMap<>(initial.getValue()));
210 }
211 }
212 }
213 }
214
215
216
217
218 protected void stateChanged(final SpacecraftState state) {
219 final AbsoluteDate date = state.getDate();
220 final boolean forward = date.durationFrom(getStartDate()) >= 0.0;
221 for (final Map.Entry<String, double[]> changed : state.getAdditionalStates().entrySet()) {
222 final TimeSpanMap<double[]> tsm = unmanagedStates.get(changed.getKey());
223 if (tsm != null) {
224
225 if (forward) {
226 tsm.addValidAfter(changed.getValue(), date);
227 } else {
228 tsm.addValidBefore(changed.getValue(), date);
229 }
230 }
231 }
232 }
233
234 }