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.propagation.integration;
18
19 import org.orekit.attitudes.AttitudeProvider;
20 import org.orekit.errors.OrekitException;
21 import org.orekit.frames.Frame;
22 import org.orekit.orbits.OrbitType;
23 import org.orekit.orbits.PositionAngle;
24 import org.orekit.propagation.SpacecraftState;
25 import org.orekit.time.AbsoluteDate;
26
27 /** This class maps between raw double elements and {@link SpacecraftState} instances.
28 * @author Luc Maisonobe
29 * @since 6.0
30 */
31 public abstract class StateMapper {
32
33 /** Reference date. */
34 private final AbsoluteDate referenceDate;
35
36 /** Propagation orbit type. */
37 private final OrbitType orbitType;
38
39 /** Position angle type. */
40 private final PositionAngle angleType;
41
42 /** Attitude provider. */
43 private final AttitudeProvider attitudeProvider;
44
45 /** Central attraction coefficient. */
46 private final double mu;
47
48 /** Inertial frame. */
49 private final Frame frame;
50
51 /** Simple constructor.
52 * <p>
53 * The position parameter type is meaningful only if {@link
54 * #getOrbitType() propagation orbit type}
55 * support it. As an example, it is not meaningful for propagation
56 * in {@link OrbitType#CARTESIAN Cartesian} parameters.
57 * </p>
58 * @param referenceDate reference date
59 * @param mu central attraction coefficient (m³/s²)
60 * @param orbitType orbit type to use for mapping
61 * @param positionAngleType angle type to use for propagation
62 * @param attitudeProvider attitude provider
63 * @param frame inertial frame
64 */
65 protected StateMapper(final AbsoluteDate referenceDate, final double mu,
66 final OrbitType orbitType, final PositionAngle positionAngleType,
67 final AttitudeProvider attitudeProvider, final Frame frame) {
68 this.referenceDate = referenceDate;
69 this.mu = mu;
70 this.orbitType = orbitType;
71 this.angleType = positionAngleType;
72 this.attitudeProvider = attitudeProvider;
73 this.frame = frame;
74 }
75
76 /** Get reference date.
77 * @return reference date
78 */
79 public AbsoluteDate getReferenceDate() {
80 return referenceDate;
81 }
82
83 /** Get propagation parameter type.
84 * @return orbit type used for propagation
85 */
86 public OrbitType getOrbitType() {
87 return orbitType;
88 }
89
90 /** Set position angle type.
91 */
92 public void setPositionAngleType() {
93 }
94
95 /** Get propagation parameter type.
96 * @return angle type to use for propagation
97 */
98 public PositionAngle getPositionAngleType() {
99 return angleType;
100 }
101
102 /** Get the central attraction coefficient μ.
103 * @return mu central attraction coefficient (m³/s²)
104 */
105 public double getMu() {
106 return mu;
107 }
108
109 /** Get the inertial frame.
110 * @return inertial frame
111 */
112 public Frame getFrame() {
113 return frame;
114 }
115
116 /** Get the attitude provider.
117 * @return attitude provider
118 */
119 public AttitudeProvider getAttitudeProvider() {
120 return attitudeProvider;
121 }
122
123 /** Map the raw double time offset to a date.
124 * @param t date offset
125 * @return date
126 */
127 public AbsoluteDate mapDoubleToDate(final double t) {
128 return referenceDate.shiftedBy(t);
129 }
130
131 /** Map a date to a raw double time offset.
132 * @param date date
133 * @return time offset
134 */
135 public double mapDateToDouble(final AbsoluteDate date) {
136 return date.durationFrom(referenceDate);
137 }
138
139 /** Map the raw double components to a spacecraft state.
140 * @param t date offset
141 * @param y state components
142 * @param meanOnly use only the mean elements to build the state
143 * @return spacecraft state
144 * @exception OrekitException if array is inconsistent or cannot be mapped
145 */
146 public abstract SpacecraftState mapArrayToState(final double t, final double[] y, final boolean meanOnly)
147 throws OrekitException;
148
149 /** Map a spacecraft state to raw double components.
150 * @param state state to map
151 * @param y placeholder where to put the components
152 * @exception OrekitException if state is inconsistent or cannot be mapped
153 */
154 public abstract void mapStateToArray(final SpacecraftState state, final double[] y)
155 throws OrekitException;
156
157 }