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