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.semianalytical.dsst.utilities;
18
19 import org.apache.commons.math3.geometry.euclidean.threed.Vector3D;
20 import org.apache.commons.math3.util.FastMath;
21 import org.apache.commons.math3.util.MathUtils;
22 import org.orekit.frames.Frame;
23 import org.orekit.orbits.Orbit;
24 import org.orekit.time.AbsoluteDate;
25
26
27 /** Container class for common parameters used by all DSST forces.
28 * <p>
29 * Most of them are defined in Danielson paper at § 2.1.
30 * </p>
31 * @author Pascal Parraud
32 */
33 public class AuxiliaryElements {
34
35 /** Orbit date. */
36 private final AbsoluteDate date;
37
38 /** Orbit frame. */
39 private final Frame frame;
40
41 /** Central body attraction coefficient. */
42 private final double mu;
43
44 /** Eccentricity. */
45 private final double ecc;
46
47 /** Keplerian mean motion. */
48 private final double n;
49
50 /** Keplerian period. */
51 private final double period;
52
53 /** Semi-major axis. */
54 private final double sma;
55
56 /** x component of eccentricity vector. */
57 private final double k;
58
59 /** y component of eccentricity vector. */
60 private final double h;
61
62 /** x component of inclination vector. */
63 private final double q;
64
65 /** y component of inclination vector. */
66 private final double p;
67
68 /** Mean longitude. */
69 private final double lm;
70
71 /** Retrograde factor I.
72 * <p>
73 * DSST model needs equinoctial orbit as internal representation.
74 * Classical equinoctial elements have discontinuities when inclination
75 * is close to zero. In this representation, I = +1. <br>
76 * To avoid this discontinuity, another representation exists and equinoctial
77 * elements can be expressed in a different way, called "retrograde" orbit.
78 * This implies I = -1. <br>
79 * As Orekit doesn't implement the retrograde orbit, I is always set to +1.
80 * But for the sake of consistency with the theory, the retrograde factor
81 * has been kept in the formulas.
82 * </p>
83 */
84 private final int I;
85
86 /** A = sqrt(μ * a). */
87 private final double A;
88
89 /** B = sqrt(1 - h<sup>2</sup> - k<sup>2</sup>). */
90 private final double B;
91
92 /** C = 1 + p<sup>2</sup> + q<sup>2</sup>. */
93 private final double C;
94
95 /** Equinoctial frame f vector. */
96 private final Vector3D f;
97
98 /** Equinoctial frame g vector. */
99 private final Vector3D g;
100
101 /** Equinoctial frame w vector. */
102 private final Vector3D w;
103
104 /** Direction cosine α. */
105 private final double alpha;
106
107 /** Direction cosine β. */
108 private final double beta;
109
110 /** Direction cosine γ. */
111 private final double gamma;
112
113 /** Simple constructor.
114 * @param orbit related mean orbit for auxiliary elements
115 * @param retrogradeFactor retrograde factor I [Eq. 2.1.2-(2)]
116 */
117 public AuxiliaryElements(final Orbit orbit, final int retrogradeFactor) {
118 // Date of the orbit
119 date = orbit.getDate();
120
121 // Orbit definition frame
122 frame = orbit.getFrame();
123
124 // Central body attraction coefficient
125 mu = orbit.getMu();
126
127 // Eccentricity
128 ecc = orbit.getE();
129
130 // Keplerian mean motion
131 n = orbit.getKeplerianMeanMotion();
132
133 // Keplerian period
134 period = orbit.getKeplerianPeriod();
135
136 // Equinoctial elements [Eq. 2.1.2-(1)]
137 sma = orbit.getA();
138 k = orbit.getEquinoctialEx();
139 h = orbit.getEquinoctialEy();
140 q = orbit.getHx();
141 p = orbit.getHy();
142 lm = MathUtils.normalizeAngle(orbit.getLM(), FastMath.PI);
143
144 // Retrograde factor [Eq. 2.1.2-(2)]
145 I = retrogradeFactor;
146
147 final double k2 = k * k;
148 final double h2 = h * h;
149 final double q2 = q * q;
150 final double p2 = p * p;
151
152 // A, B, C parameters [Eq. 2.1.6-(1)]
153 A = FastMath.sqrt(mu * sma);
154 B = FastMath.sqrt(1 - k2 - h2);
155 C = 1 + q2 + p2;
156
157 // Equinoctial reference frame [Eq. 2.1.4-(1)]
158 final double ooC = 1. / C;
159 final double px2 = 2. * p;
160 final double qx2 = 2. * q;
161 final double pq2 = px2 * q;
162 f = new Vector3D(ooC, new Vector3D(1. - p2 + q2, pq2, -px2 * I));
163 g = new Vector3D(ooC, new Vector3D(pq2 * I, (1. + p2 - q2) * I, qx2));
164 w = new Vector3D(ooC, new Vector3D(px2, -qx2, (1. - p2 - q2) * I));
165
166 // Direction cosines for central body [Eq. 2.1.9-(1)]
167 alpha = f.getZ();
168 beta = g.getZ();
169 gamma = w.getZ();
170 }
171
172 /** Get the date of the orbit.
173 * @return the date
174 */
175 public AbsoluteDate getDate() {
176 return date;
177 }
178
179 /** Get the definition frame of the orbit.
180 * @return the definition frame
181 */
182 public Frame getFrame() {
183 return frame;
184 }
185
186 /** Get the central body attraction coefficient.
187 * @return μ
188 */
189 public double getMu() {
190 return mu;
191 }
192
193 /** Get the eccentricity.
194 * @return ecc
195 */
196 public double getEcc() {
197 return ecc;
198 }
199
200 /** Get the Keplerian mean motion.
201 * @return n
202 */
203 public double getMeanMotion() {
204 return n;
205 }
206
207 /** Get the Keplerian period.
208 * @return period
209 */
210 public double getKeplerianPeriod() {
211 return period;
212 }
213
214 /** Get the semi-major axis.
215 * @return the semi-major axis a
216 */
217 public double getSma() {
218 return sma;
219 }
220
221 /** Get the x component of eccentricity vector.
222 * <p>
223 * This element called k in DSST corresponds to ex
224 * for the {@link org.orekit.orbits.EquinoctialOrbit}
225 * </p>
226 * @return k
227 */
228 public double getK() {
229 return k;
230 }
231
232 /** Get the y component of eccentricity vector.
233 * <p>
234 * This element called h in DSST corresponds to ey
235 * for the {@link org.orekit.orbits.EquinoctialOrbit}
236 * </p>
237 * @return h
238 */
239 public double getH() {
240 return h;
241 }
242
243 /** Get the x component of inclination vector.
244 * <p>
245 * This element called q in DSST corresponds to hx
246 * for the {@link org.orekit.orbits.EquinoctialOrbit}
247 * </p>
248 * @return q
249 */
250 public double getQ() {
251 return q;
252 }
253
254 /** Get the y component of inclination vector.
255 * <p>
256 * This element called p in DSST corresponds to hy
257 * for the {@link org.orekit.orbits.EquinoctialOrbit}
258 * </p>
259 * @return p
260 */
261 public double getP() {
262 return p;
263 }
264
265 /** Get the mean longitude.
266 * @return lm
267 */
268 public double getLM() {
269 return lm;
270 }
271
272 /** Get the retrograde factor.
273 * @return the retrograde factor I
274 */
275 public int getRetrogradeFactor() {
276 return I;
277 }
278
279 /** Get A = sqrt(μ * a).
280 * @return A
281 */
282 public double getA() {
283 return A;
284 }
285
286 /** Get B = sqrt(1 - e<sup>2</sup>).
287 * @return B
288 */
289 public double getB() {
290 return B;
291 }
292
293 /** Get C = 1 + p<sup>2</sup> + q<sup>2</sup>.
294 * @return C
295 */
296 public double getC() {
297 return C;
298 }
299
300 /** Get equinoctial frame vector f.
301 * @return f vector
302 */
303 public Vector3D getVectorF() {
304 return f;
305 }
306
307 /** Get equinoctial frame vector g.
308 * @return g vector
309 */
310 public Vector3D getVectorG() {
311 return g;
312 }
313
314 /** Get equinoctial frame vector w.
315 * @return w vector
316 */
317 public Vector3D getVectorW() {
318 return w;
319 }
320
321 /** Get direction cosine α for central body.
322 * @return α
323 */
324 public double getAlpha() {
325 return alpha;
326 }
327
328 /** Get direction cosine β for central body.
329 * @return β
330 */
331 public double getBeta() {
332 return beta;
333 }
334
335 /** Get direction cosine γ for central body.
336 * @return γ
337 */
338 public double getGamma() {
339 return gamma;
340 }
341
342 }