1   /* Copyright 2002-2018 CS Systèmes d'Information
2    * Licensed to CS Systèmes d'Information (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * CS licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.orekit.propagation;
18  
19  import java.util.Collection;
20  import java.util.List;
21  
22  import org.orekit.attitudes.AttitudeProvider;
23  import org.orekit.attitudes.InertialProvider;
24  import org.orekit.errors.OrekitException;
25  import org.orekit.frames.Frame;
26  import org.orekit.propagation.events.EventDetector;
27  import org.orekit.propagation.sampling.OrekitFixedStepHandler;
28  import org.orekit.propagation.sampling.OrekitStepHandler;
29  import org.orekit.time.AbsoluteDate;
30  import org.orekit.utils.PVCoordinatesProvider;
31  
32  /** This interface provides a way to propagate an orbit at any time.
33   *
34   * <p>This interface is the top-level abstraction for orbit propagation.
35   * It only allows propagation to a predefined date.
36   * It is implemented by analytical models which have no time limit,
37   * by orbit readers based on external data files, by numerical integrators
38   * using rich force models and by continuous models built after numerical
39   * integration has been completed and dense output data as been
40   * gathered.</p>
41  
42   * @author Luc Maisonobe
43   * @author V&eacute;ronique Pommier-Maurussane
44   *
45   */
46  
47  public interface Propagator extends PVCoordinatesProvider {
48  
49      /** Default mass. */
50      double DEFAULT_MASS = 1000.0;
51  
52      /** Default attitude provider. */
53      AttitudeProvider DEFAULT_LAW = InertialProvider.EME2000_ALIGNED;
54  
55      /** Indicator for slave mode. */
56      int SLAVE_MODE = 0;
57  
58      /** Indicator for master mode. */
59      int MASTER_MODE = 1;
60  
61      /** Indicator for ephemeris generation mode. */
62      int EPHEMERIS_GENERATION_MODE = 2;
63  
64      /** Get the current operating mode of the propagator.
65       * @return one of {@link #SLAVE_MODE}, {@link #MASTER_MODE},
66       * {@link #EPHEMERIS_GENERATION_MODE}
67       * @see #setSlaveMode()
68       * @see #setMasterMode(double, OrekitFixedStepHandler)
69       * @see #setMasterMode(OrekitStepHandler)
70       * @see #setEphemerisMode()
71       */
72      int getMode();
73  
74      /** Set the propagator to slave mode.
75       * <p>This mode is used when the user needs only the final orbit at the target time.
76       *  The (slave) propagator computes this result and return it to the calling
77       *  (master) application, without any intermediate feedback.
78       * <p>This is the default mode.</p>
79       * @see #setMasterMode(double, OrekitFixedStepHandler)
80       * @see #setMasterMode(OrekitStepHandler)
81       * @see #setEphemerisMode()
82       * @see #getMode()
83       * @see #SLAVE_MODE
84       */
85      void setSlaveMode();
86  
87      /** Set the propagator to master mode with fixed steps.
88       * <p>This mode is used when the user needs to have some custom function called at the
89       * end of each finalized step during integration. The (master) propagator integration
90       * loop calls the (slave) application callback methods at each finalized step.</p>
91       * @param h fixed stepsize (s)
92       * @param handler handler called at the end of each finalized step
93       * @see #setSlaveMode()
94       * @see #setMasterMode(OrekitStepHandler)
95       * @see #setEphemerisMode()
96       * @see #getMode()
97       * @see #MASTER_MODE
98       */
99      void setMasterMode(double h, OrekitFixedStepHandler handler);
100 
101     /** Set the propagator to master mode with variable steps.
102      * <p>This mode is used when the user needs to have some custom function called at the
103      * end of each finalized step during integration. The (master) propagator integration
104      * loop calls the (slave) application callback methods at each finalized step.</p>
105      * @param handler handler called at the end of each finalized step
106      * @see #setSlaveMode()
107      * @see #setMasterMode(double, OrekitFixedStepHandler)
108      * @see #setEphemerisMode()
109      * @see #getMode()
110      * @see #MASTER_MODE
111      */
112     void setMasterMode(OrekitStepHandler handler);
113 
114     /** Set the propagator to ephemeris generation mode.
115      *  <p>This mode is used when the user needs random access to the orbit state at any time
116      *  between the initial and target times, and in no sequential order. A typical example is
117      *  the implementation of search and iterative algorithms that may navigate forward and
118      *  backward inside the propagation range before finding their result.</p>
119      *  <p>Beware that since this mode stores <strong>all</strong> intermediate results,
120      *  it may be memory intensive for long integration ranges and high precision/short
121      *  time steps.</p>
122      * @see #getGeneratedEphemeris()
123      * @see #setSlaveMode()
124      * @see #setMasterMode(double, OrekitFixedStepHandler)
125      * @see #setMasterMode(OrekitStepHandler)
126      * @see #getMode()
127      * @see #EPHEMERIS_GENERATION_MODE
128      */
129     void setEphemerisMode();
130 
131     /**
132      * Set the propagator to ephemeris generation mode with the specified handler for each
133      * integration step.
134      *
135      * <p>This mode is used when the user needs random access to the orbit state at any
136      * time between the initial and target times, as well as access to the steps computed
137      * by the integrator as in Master Mode. A typical example is the implementation of
138      * search and iterative algorithms that may navigate forward and backward inside the
139      * propagation range before finding their result.</p>
140      *
141      * <p>Beware that since this mode stores <strong>all</strong> intermediate results, it
142      * may be memory intensive for long integration ranges and high precision/short time
143      * steps.</p>
144      *
145      * @param handler handler called at the end of each finalized step
146      * @see #setEphemerisMode()
147      * @see #getGeneratedEphemeris()
148      * @see #setSlaveMode()
149      * @see #setMasterMode(double, OrekitFixedStepHandler)
150      * @see #setMasterMode(OrekitStepHandler)
151      * @see #getMode()
152      * @see #EPHEMERIS_GENERATION_MODE
153      */
154     void setEphemerisMode(OrekitStepHandler handler);
155 
156     /** Get the ephemeris generated during propagation.
157      * @return generated ephemeris
158      * @exception IllegalStateException if the propagator was not set in ephemeris
159      * generation mode before propagation
160      * @see #setEphemerisMode()
161      */
162     BoundedPropagator getGeneratedEphemeris() throws IllegalStateException;
163 
164     /** Get the propagator initial state.
165      * @return initial state
166      * @exception OrekitException if state cannot be retrieved
167      */
168     SpacecraftState getInitialState() throws OrekitException;
169 
170     /** Reset the propagator initial state.
171      * @param state new initial state to consider
172      * @exception OrekitException if initial state cannot be reset
173      */
174     void resetInitialState(SpacecraftState state)
175         throws OrekitException;
176 
177     /** Add a set of user-specified state parameters to be computed along with the orbit propagation.
178      * @param additionalStateProvider provider for additional state
179      * @exception OrekitException if an additional state with the same name is already present
180      */
181     void addAdditionalStateProvider(AdditionalStateProvider additionalStateProvider)
182         throws OrekitException;
183 
184     /** Get an unmodifiable list of providers for additional state.
185      * @return providers for the additional states
186      */
187     List<AdditionalStateProvider> getAdditionalStateProviders();
188 
189     /** Check if an additional state is managed.
190      * <p>
191      * Managed states are states for which the propagators know how to compute
192      * its evolution. They correspond to additional states for which an
193      * {@link AdditionalStateProvider additional state provider} has been registered
194      * by calling the {@link #addAdditionalStateProvider(AdditionalStateProvider)
195      * addAdditionalStateProvider} method. If the propagator is an {@link
196      * org.orekit.propagation.integration.AbstractIntegratedPropagator integrator-based
197      * propagator}, the states for which a set of {@link
198      * org.orekit.propagation.integration.AdditionalEquations additional equations} has
199      * been registered by calling the {@link
200      * org.orekit.propagation.integration.AbstractIntegratedPropagator#addAdditionalEquations(
201      * org.orekit.propagation.integration.AdditionalEquations) addAdditionalEquations}
202      * method are also counted as managed additional states.
203      * </p>
204      * <p>
205      * Additional states that are present in the {@link #getInitialState() initial state}
206      * but have no evolution method registered are <em>not</em> considered as managed states.
207      * These unmanaged additional states are not lost during propagation, though. Their
208      * value will simply be copied unchanged throughout propagation.
209      * </p>
210      * @param name name of the additional state
211      * @return true if the additional state is managed
212      */
213     boolean isAdditionalStateManaged(String name);
214 
215     /** Get all the names of all managed states.
216      * @return names of all managed states
217      */
218     String[] getManagedAdditionalStates();
219 
220     /** Add an event detector.
221      * @param detector event detector to add
222      * @see #clearEventsDetectors()
223      * @see #getEventsDetectors()
224      * @param <T> class type for the generic version
225      */
226     <T extends EventDetector> void addEventDetector(T detector);
227 
228     /** Get all the events detectors that have been added.
229      * @return an unmodifiable collection of the added detectors
230      * @see #addEventDetector(EventDetector)
231      * @see #clearEventsDetectors()
232      */
233     Collection<EventDetector> getEventsDetectors();
234 
235     /** Remove all events detectors.
236      * @see #addEventDetector(EventDetector)
237      * @see #getEventsDetectors()
238      */
239     void clearEventsDetectors();
240 
241     /** Get attitude provider.
242      * @return attitude provider
243      */
244     AttitudeProvider getAttitudeProvider();
245 
246     /** Set attitude provider.
247      * @param attitudeProvider attitude provider
248      */
249     void setAttitudeProvider(AttitudeProvider attitudeProvider);
250 
251     /** Get the frame in which the orbit is propagated.
252      * <p>
253      * The propagation frame is the definition frame of the initial
254      * state, so this method should be called after this state has
255      * been set, otherwise it may return null.
256      * </p>
257      * @return frame in which the orbit is propagated
258      * @see #resetInitialState(SpacecraftState)
259      */
260     Frame getFrame();
261 
262     /** Propagate towards a target date.
263      * <p>Simple propagators use only the target date as the specification for
264      * computing the propagated state. More feature rich propagators can consider
265      * other information and provide different operating modes or G-stop
266      * facilities to stop at pinpointed events occurrences. In these cases, the
267      * target date is only a hint, not a mandatory objective.</p>
268      * @param target target date towards which orbit state should be propagated
269      * @return propagated state
270      * @exception OrekitException if state cannot be propagated
271      */
272     SpacecraftState propagate(AbsoluteDate target) throws OrekitException;
273 
274     /** Propagate from a start date towards a target date.
275      * <p>Those propagators use a start date and a target date to
276      * compute the propagated state. For propagators using event detection mechanism,
277      * if the provided start date is different from the initial state date, a first,
278      * simple propagation is performed, without processing any event computation.
279      * Then complete propagation is performed from start date to target date.</p>
280      * @param start start date from which orbit state should be propagated
281      * @param target target date to which orbit state should be propagated
282      * @return propagated state
283      * @exception OrekitException if state cannot be propagated
284      */
285     SpacecraftState propagate(AbsoluteDate start, AbsoluteDate target) throws OrekitException;
286 
287 }