1 /* Copyright 2002-2015 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.forces;
18
19 import org.apache.commons.math3.analysis.differentiation.DerivativeStructure;
20 import org.apache.commons.math3.geometry.euclidean.threed.FieldRotation;
21 import org.apache.commons.math3.geometry.euclidean.threed.FieldVector3D;
22 import org.apache.commons.math3.ode.ParameterizedODE;
23 import org.orekit.errors.OrekitException;
24 import org.orekit.frames.Frame;
25 import org.orekit.propagation.SpacecraftState;
26 import org.orekit.propagation.events.EventDetector;
27 import org.orekit.propagation.numerical.TimeDerivativesEquations;
28 import org.orekit.time.AbsoluteDate;
29
30 /** This interface represents a force modifying spacecraft motion.
31 *
32 * <p>
33 * Objects implementing this interface are intended to be added to a
34 * {@link org.orekit.propagation.numerical.NumericalPropagator numerical propagator}
35 * before the propagation is started.
36 * <p>
37 * <p>
38 * The propagator will call at each step the {@link #addContribution(SpacecraftState,
39 * TimeDerivativesEquations)} method. The force model instance will extract all the
40 * state data it needs (date,position, velocity, frame, attitude, mass) from the first
41 * parameter. From these state data, it will compute the perturbing acceleration. It
42 * will then add this acceleration to the second parameter which will take thins
43 * contribution into account and will use the Gauss equations to evaluate its impact
44 * on the global state derivative.
45 * </p>
46 * <p>
47 * Force models which create discontinuous acceleration patterns (typically for maneuvers
48 * start/stop or solar eclipses entry/exit) must provide one or more {@link
49 * org.orekit.propagation.events.EventDetector events detectors} to the
50 * propagator thanks to their {@link #getEventsDetectors()} method. This method
51 * is called once just before propagation starts. The events states will be checked by
52 * the propagator to ensure accurate propagation and proper events handling.
53 * </p>
54 *
55 * @author Mathieu Roméro
56 * @author Luc Maisonobe
57 * @author Véronique Pommier-Maurussane
58 */
59 public interface ForceModel extends ParameterizedODE {
60
61 /** Compute the contribution of the force model to the perturbing
62 * acceleration.
63 * @param s current state information: date, kinematics, attitude
64 * @param adder object where the contribution should be added
65 * @exception OrekitException if some specific error occurs
66 */
67 void addContribution(SpacecraftState s, TimeDerivativesEquations adder)
68 throws OrekitException;
69
70 /** Compute acceleration derivatives with respect to state parameters.
71 * <p>
72 * The derivatives should be computed with respect to position, velocity
73 * and optionnaly mass. The input parameters already take into account the
74 * free parameters (6 or 7 depending on derivation with respect to mass
75 * being considered or not) and order (always 1). Free parameters at indices
76 * 0, 1 and 2 correspond to derivatives with respect to position. Free
77 * parameters at indices 3, 4 and 5 correspond to derivatives with respect
78 * to velocity. Free parameter at index 6 (if present) corresponds to
79 * to derivatives with respect to mass.
80 * </p>
81 * @param date current date
82 * @param frame inertial reference frame for state (both orbit and attitude)
83 * @param position position of spacecraft in reference frame
84 * @param velocity velocity of spacecraft in reference frame
85 * @param rotation orientation (attitude) of the spacecraft with respect to reference frame
86 * @param mass spacecraft mass
87 * @return acceleration with all derivatives specified by the input parameters own derivatives
88 * @exception OrekitException if derivatives cannot be computed
89 * @since 6.0
90 */
91 FieldVector3D<DerivativeStructure> accelerationDerivatives(AbsoluteDate date, Frame frame,
92 FieldVector3D<DerivativeStructure> position, FieldVector3D<DerivativeStructure> velocity,
93 FieldRotation<DerivativeStructure> rotation, DerivativeStructure mass)
94 throws OrekitException;
95
96 /** Compute acceleration derivatives with respect to additional parameters.
97 * @param s spacecraft state
98 * @param paramName name of the parameter with respect to which derivatives are required
99 * @return acceleration with all derivatives specified by the input parameters own derivatives
100 * @exception OrekitException if derivatives cannot be computed
101 * @since 6.0
102 */
103 FieldVector3D<DerivativeStructure> accelerationDerivatives(SpacecraftState s, String paramName)
104 throws OrekitException;
105
106 /** Get the discrete events related to the model.
107 * @return array of events detectors or null if the model is not
108 * related to any discrete events
109 */
110 EventDetector[] getEventsDetectors();
111
112 }