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.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 /** True longitude. */
72 private final double lv;
73
74 /** Eccentric longitude. */
75 private final double le;
76
77 /** Retrograde factor I.
78 * <p>
79 * DSST model needs equinoctial orbit as internal representation.
80 * Classical equinoctial elements have discontinuities when inclination
81 * is close to zero. In this representation, I = +1. <br>
82 * To avoid this discontinuity, another representation exists and equinoctial
83 * elements can be expressed in a different way, called "retrograde" orbit.
84 * This implies I = -1. <br>
85 * As Orekit doesn't implement the retrograde orbit, I is always set to +1.
86 * But for the sake of consistency with the theory, the retrograde factor
87 * has been kept in the formulas.
88 * </p>
89 */
90 private final int I;
91
92 /** A = sqrt(μ * a). */
93 private final double A;
94
95 /** B = sqrt(1 - h² - k²). */
96 private final double B;
97
98 /** C = 1 + p² + q². */
99 private final double C;
100
101 /** Equinoctial frame f vector. */
102 private final Vector3D f;
103
104 /** Equinoctial frame g vector. */
105 private final Vector3D g;
106
107 /** Equinoctial frame w vector. */
108 private final Vector3D w;
109
110 /** Direction cosine α. */
111 private final double alpha;
112
113 /** Direction cosine β. */
114 private final double beta;
115
116 /** Direction cosine γ. */
117 private final double gamma;
118
119 /** Simple constructor.
120 * @param orbit related mean orbit for auxiliary elements
121 * @param retrogradeFactor retrograde factor I [Eq. 2.1.2-(2)]
122 */
123 public AuxiliaryElements(final Orbit orbit, final int retrogradeFactor) {
124 // Date of the orbit
125 date = orbit.getDate();
126
127 // Orbit definition frame
128 frame = orbit.getFrame();
129
130 // Central body attraction coefficient
131 mu = orbit.getMu();
132
133 // Eccentricity
134 ecc = orbit.getE();
135
136 // Keplerian mean motion
137 n = orbit.getKeplerianMeanMotion();
138
139 // Keplerian period
140 period = orbit.getKeplerianPeriod();
141
142 // Equinoctial elements [Eq. 2.1.2-(1)]
143 sma = orbit.getA();
144 k = orbit.getEquinoctialEx();
145 h = orbit.getEquinoctialEy();
146 q = orbit.getHx();
147 p = orbit.getHy();
148 lm = MathUtils.normalizeAngle(orbit.getLM(), FastMath.PI);
149 lv = MathUtils.normalizeAngle(orbit.getLv(), FastMath.PI);
150 le = MathUtils.normalizeAngle(orbit.getLE(), FastMath.PI);
151
152 // Retrograde factor [Eq. 2.1.2-(2)]
153 I = retrogradeFactor;
154
155 final double k2 = k * k;
156 final double h2 = h * h;
157 final double q2 = q * q;
158 final double p2 = p * p;
159
160 // A, B, C parameters [Eq. 2.1.6-(1)]
161 A = FastMath.sqrt(mu * sma);
162 B = FastMath.sqrt(1 - k2 - h2);
163 C = 1 + q2 + p2;
164
165 // Equinoctial reference frame [Eq. 2.1.4-(1)]
166 final double ooC = 1. / C;
167 final double px2 = 2. * p;
168 final double qx2 = 2. * q;
169 final double pq2 = px2 * q;
170 f = new Vector3D(ooC, new Vector3D(1. - p2 + q2, pq2, -px2 * I));
171 g = new Vector3D(ooC, new Vector3D(pq2 * I, (1. + p2 - q2) * I, qx2));
172 w = new Vector3D(ooC, new Vector3D(px2, -qx2, (1. - p2 - q2) * I));
173
174 // Direction cosines for central body [Eq. 2.1.9-(1)]
175 alpha = f.getZ();
176 beta = g.getZ();
177 gamma = w.getZ();
178 }
179
180 /** Get the date of the orbit.
181 * @return the date
182 */
183 public AbsoluteDate getDate() {
184 return date;
185 }
186
187 /** Get the definition frame of the orbit.
188 * @return the definition frame
189 */
190 public Frame getFrame() {
191 return frame;
192 }
193
194 /** Get the central body attraction coefficient.
195 * @return μ
196 */
197 public double getMu() {
198 return mu;
199 }
200
201 /** Get the eccentricity.
202 * @return ecc
203 */
204 public double getEcc() {
205 return ecc;
206 }
207
208 /** Get the Keplerian mean motion.
209 * @return n
210 */
211 public double getMeanMotion() {
212 return n;
213 }
214
215 /** Get the Keplerian period.
216 * @return period
217 */
218 public double getKeplerianPeriod() {
219 return period;
220 }
221
222 /** Get the semi-major axis.
223 * @return the semi-major axis a
224 */
225 public double getSma() {
226 return sma;
227 }
228
229 /** Get the x component of eccentricity vector.
230 * <p>
231 * This element called k in DSST corresponds to ex
232 * for the {@link org.orekit.orbits.EquinoctialOrbit}
233 * </p>
234 * @return k
235 */
236 public double getK() {
237 return k;
238 }
239
240 /** Get the y component of eccentricity vector.
241 * <p>
242 * This element called h in DSST corresponds to ey
243 * for the {@link org.orekit.orbits.EquinoctialOrbit}
244 * </p>
245 * @return h
246 */
247 public double getH() {
248 return h;
249 }
250
251 /** Get the x component of inclination vector.
252 * <p>
253 * This element called q in DSST corresponds to hx
254 * for the {@link org.orekit.orbits.EquinoctialOrbit}
255 * </p>
256 * @return q
257 */
258 public double getQ() {
259 return q;
260 }
261
262 /** Get the y component of inclination vector.
263 * <p>
264 * This element called p in DSST corresponds to hy
265 * for the {@link org.orekit.orbits.EquinoctialOrbit}
266 * </p>
267 * @return p
268 */
269 public double getP() {
270 return p;
271 }
272
273 /** Get the mean longitude.
274 * @return lm
275 */
276 public double getLM() {
277 return lm;
278 }
279
280 /** Get the true longitude.
281 * @return lv
282 */
283 public double getLv() {
284 return lv;
285 }
286
287 /** Get the eccentric longitude.
288 * @return lf
289 */
290 public double getLf() {
291 return le;
292 }
293
294 /** Get the retrograde factor.
295 * @return the retrograde factor I
296 */
297 public int getRetrogradeFactor() {
298 return I;
299 }
300
301 /** Get A = sqrt(μ * a).
302 * @return A
303 */
304 public double getA() {
305 return A;
306 }
307
308 /** Get B = sqrt(1 - e²).
309 * @return B
310 */
311 public double getB() {
312 return B;
313 }
314
315 /** Get C = 1 + p² + q².
316 * @return C
317 */
318 public double getC() {
319 return C;
320 }
321
322 /** Get equinoctial frame vector f.
323 * @return f vector
324 */
325 public Vector3D getVectorF() {
326 return f;
327 }
328
329 /** Get equinoctial frame vector g.
330 * @return g vector
331 */
332 public Vector3D getVectorG() {
333 return g;
334 }
335
336 /** Get equinoctial frame vector w.
337 * @return w vector
338 */
339 public Vector3D getVectorW() {
340 return w;
341 }
342
343 /** Get direction cosine α for central body.
344 * @return α
345 */
346 public double getAlpha() {
347 return alpha;
348 }
349
350 /** Get direction cosine β for central body.
351 * @return β
352 */
353 public double getBeta() {
354 return beta;
355 }
356
357 /** Get direction cosine γ for central body.
358 * @return γ
359 */
360 public double getGamma() {
361 return gamma;
362 }
363
364 }