1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.semianalytical.dsst.utilities;
18
19 import java.util.ArrayList;
20 import java.util.List;
21
22 import org.apache.commons.math3.complex.Complex;
23 import org.apache.commons.math3.util.FastMath;
24
25
26
27
28
29
30
31
32
33 public class GHmsjPolynomials {
34
35
36
37
38 private final CjSjCoefficient cjsjKH;
39
40
41
42
43 private final CjSjCoefficient cjsjAB;
44
45
46
47
48 private int I;
49
50
51
52
53
54
55
56
57 public GHmsjPolynomials(final double k, final double h,
58 final double alpha, final double beta,
59 final int retroFactor) {
60 this.cjsjKH = new CjSjCoefficient(k, h);
61 this.cjsjAB = new CjSjCoefficient(alpha, beta);
62 this.I = retroFactor;
63 }
64
65
66
67
68
69
70
71 public double getGmsj(final int m, final int s, final int j) {
72 final int sMj = FastMath.abs(s - j);
73 double gms = 0d;
74 if (FastMath.abs(s) <= m) {
75 final int mMis = m - I * s;
76 gms = cjsjKH.getCj(sMj) * cjsjAB.getCj(mMis) -
77 I * sgn(s - j) * cjsjKH.getSj(sMj) * cjsjAB.getSj(mMis);
78 } else {
79 final int sMim = FastMath.abs(s - I * m);
80 gms = cjsjKH.getCj(sMj) * cjsjAB.getCj(sMim) +
81 sgn(s - j) * sgn(s - m) * cjsjKH.getSj(sMj) * cjsjAB.getSj(sMim);
82 }
83 return gms;
84 }
85
86
87
88
89
90
91
92 public double getHmsj(final int m, final int s, final int j) {
93 final int sMj = FastMath.abs(s - j);
94 double hms = 0d;
95 if (FastMath.abs(s) <= m) {
96 final int mMis = m - I * s;
97 hms = I * cjsjKH.getCj(sMj) * cjsjAB.getSj(mMis) + sgn(s - j) *
98 cjsjKH.getSj(sMj) * cjsjAB.getCj(mMis);
99 } else {
100 final int sMim = FastMath.abs(s - I * m);
101 hms = -sgn(s - m) * cjsjKH.getCj(sMj) * cjsjAB.getSj(sMim) +
102 sgn(s - j) * cjsjKH.getSj(sMj) * cjsjAB.getCj(sMim);
103 }
104 return hms;
105 }
106
107
108
109
110
111
112
113 public double getdGmsdk(final int m, final int s, final int j) {
114 final int sMj = FastMath.abs(s - j);
115 double dGmsdk = 0d;
116 if (FastMath.abs(s) <= m) {
117 final int mMis = m - I * s;
118 dGmsdk = cjsjKH.getDcjDk(sMj) * cjsjAB.getCj(mMis) -
119 I * sgn(s - j) * cjsjKH.getDsjDk(sMj) * cjsjAB.getSj(mMis);
120 } else {
121 final int sMim = FastMath.abs(s - I * m);
122 dGmsdk = cjsjKH.getDcjDk(sMj) * cjsjAB.getCj(sMim) +
123 sgn(s - j) * sgn(s - m) * cjsjKH.getDsjDk(sMj) * cjsjAB.getSj(sMim);
124 }
125 return dGmsdk;
126 }
127
128
129
130
131
132
133
134 public double getdGmsdh(final int m, final int s, final int j) {
135 final int sMj = FastMath.abs(s - j);
136 double dGmsdh = 0d;
137 if (FastMath.abs(s) <= m) {
138 final int mMis = m - I * s;
139 dGmsdh = cjsjKH.getDcjDh(sMj) * cjsjAB.getCj(mMis) -
140 I * sgn(s - j) * cjsjKH.getDsjDh(sMj) * cjsjAB.getSj(mMis);
141 } else {
142 final int sMim = FastMath.abs(s - I * m);
143 dGmsdh = cjsjKH.getDcjDh(sMj) * cjsjAB.getCj(sMim) +
144 sgn(s - j) * sgn(s - m) * cjsjKH.getDsjDh(sMj) * cjsjAB.getSj(sMim);
145 }
146 return dGmsdh;
147 }
148
149
150
151
152
153
154
155 public double getdGmsdAlpha(final int m, final int s, final int j) {
156 final int sMj = FastMath.abs(s - j);
157 double dGmsdAl = 0d;
158 if (FastMath.abs(s) <= m) {
159 final int mMis = m - I * s;
160 dGmsdAl = cjsjKH.getCj(sMj) * cjsjAB.getDcjDk(mMis) -
161 I * sgn(s - j) * cjsjKH.getSj(sMj) * cjsjAB.getDsjDk(mMis);
162 } else {
163 final int sMim = FastMath.abs(s - I * m);
164 dGmsdAl = cjsjKH.getCj(sMj) * cjsjAB.getDcjDk(sMim) +
165 sgn(s - j) * sgn(s - m) * cjsjKH.getSj(sMj) * cjsjAB.getDsjDk(sMim);
166 }
167 return dGmsdAl;
168 }
169
170
171
172
173
174
175
176 public double getdGmsdBeta(final int m, final int s, final int j) {
177 final int sMj = FastMath.abs(s - j);
178 double dGmsdBe = 0d;
179 if (FastMath.abs(s) <= m) {
180 final int mMis = m - I * s;
181 dGmsdBe = cjsjKH.getCj(sMj) * cjsjAB.getDcjDh(mMis) -
182 I * sgn(s - j) * cjsjKH.getSj(sMj) * cjsjAB.getDsjDh(mMis);
183 } else {
184 final int sMim = FastMath.abs(s - I * m);
185 dGmsdBe = cjsjKH.getCj(sMj) * cjsjAB.getDcjDh(sMim) +
186 sgn(s - j) * sgn(s - m) * cjsjKH.getSj(sMj) * cjsjAB.getDsjDh(sMim);
187 }
188 return dGmsdBe;
189 }
190
191
192
193
194
195
196
197 public double getdHmsdk(final int m, final int s, final int j) {
198 final int sMj = FastMath.abs(s - j);
199 double dHmsdk = 0d;
200 if (FastMath.abs(s) <= m) {
201 final int mMis = m - I * s;
202 dHmsdk = I * cjsjKH.getDcjDk(sMj) * cjsjAB.getSj(mMis) +
203 sgn(s - j) * cjsjKH.getDsjDk(sMj) * cjsjAB.getCj(mMis);
204 } else {
205 final int sMim = FastMath.abs(s - I * m);
206 dHmsdk = -sgn(s - m) * cjsjKH.getDcjDk(sMj) * cjsjAB.getSj(sMim) +
207 sgn(s - j) * cjsjKH.getDsjDk(sMj) * cjsjAB.getCj(sMim);
208 }
209 return dHmsdk;
210 }
211
212
213
214
215
216
217
218 public double getdHmsdh(final int m, final int s, final int j) {
219 final int sMj = FastMath.abs(s - j);
220 double dHmsdh = 0d;
221 if (FastMath.abs(s) <= m) {
222 final int mMis = m - I * s;
223 dHmsdh = I * cjsjKH.getDcjDh(sMj) * cjsjAB.getSj(mMis) +
224 sgn(s - j) * cjsjKH.getDsjDh(sMj) * cjsjAB.getCj(mMis);
225 } else {
226 final int sMim = FastMath.abs(s - I * m);
227 dHmsdh = -sgn(s - m) * cjsjKH.getDcjDh(sMj) * cjsjAB.getSj(sMim) +
228 sgn(s - j) * cjsjKH.getDsjDh(sMj) * cjsjAB.getCj(sMim);
229 }
230 return dHmsdh;
231 }
232
233
234
235
236
237
238
239 public double getdHmsdAlpha(final int m, final int s, final int j) {
240 final int sMj = FastMath.abs(s - j);
241 double dHmsdAl = 0d;
242 if (FastMath.abs(s) <= m) {
243 final int mMis = m - I * s;
244 dHmsdAl = I * cjsjKH.getCj(sMj) * cjsjAB.getDsjDk(mMis) +
245 sgn(s - j) * cjsjKH.getSj(sMj) * cjsjAB.getDcjDk(mMis);
246 } else {
247 final int sMim = FastMath.abs(s - I * m);
248 dHmsdAl = -sgn(s - m) * cjsjKH.getCj(sMj) * cjsjAB.getDsjDk(sMim) +
249 sgn(s - j) * cjsjKH.getSj(sMj) * cjsjAB.getDcjDk(sMim);
250 }
251 return dHmsdAl;
252 }
253
254
255
256
257
258
259
260 public double getdHmsdBeta(final int m, final int s, final int j) {
261 final int sMj = FastMath.abs(s - j);
262 double dHmsdBe = 0d;
263 if (FastMath.abs(s) <= m) {
264 final int mMis = m - I * s;
265 dHmsdBe = I * cjsjKH.getCj(sMj) * cjsjAB.getDsjDh(mMis) +
266 sgn(s - j) * cjsjKH.getSj(sMj) * cjsjAB.getDcjDh(mMis);
267 } else {
268 final int sMim = FastMath.abs(s - I * m);
269 dHmsdBe = -sgn(s - m) * cjsjKH.getCj(sMj) * cjsjAB.getDsjDh(sMim) +
270 sgn(s - j) * cjsjKH.getSj(sMj) * cjsjAB.getDcjDh(sMim);
271 }
272 return dHmsdBe;
273 }
274
275
276
277
278
279 private int sgn(final int i) {
280 return (i < 0) ? -1 : 1;
281 }
282
283
284
285
286
287
288
289
290
291
292
293 private static class CjSjCoefficient {
294
295
296 private int jLast;
297
298
299 private final Complex kih;
300
301
302 private final List<Complex> cjsj;
303
304
305
306
307
308 public CjSjCoefficient(final double k, final double h) {
309 kih = new Complex(k, h);
310 cjsj = new ArrayList<Complex>();
311 cjsj.add(new Complex(1, 0));
312 cjsj.add(kih);
313 jLast = 1;
314 }
315
316
317
318
319
320 public double getCj(final int j) {
321 if (j > jLast) {
322
323 updateCjSj(j);
324 }
325 return cjsj.get(j).getReal();
326 }
327
328
329
330
331
332 public double getSj(final int j) {
333 if (j > jLast) {
334
335 updateCjSj(j);
336 }
337 return cjsj.get(j).getImaginary();
338 }
339
340
341
342
343
344 public double getDcjDk(final int j) {
345 return j == 0 ? 0 : j * getCj(j - 1);
346 }
347
348
349
350
351
352 public double getDsjDk(final int j) {
353 return j == 0 ? 0 : j * getSj(j - 1);
354 }
355
356
357
358
359
360 public double getDcjDh(final int j) {
361 return j == 0 ? 0 : -j * getSj(j - 1);
362 }
363
364
365
366
367
368 public double getDsjDh(final int j) {
369 return j == 0 ? 0 : j * getCj(j - 1);
370 }
371
372
373
374
375 private void updateCjSj(final int j) {
376 Complex last = cjsj.get(cjsj.size() - 1);
377 for (int i = jLast; i < j; i++) {
378 final Complex next = last.multiply(kih);
379 cjsj.add(next);
380 last = next;
381 }
382 jLast = j;
383 }
384
385 }
386
387 }