1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.orekit.propagation.semianalytical.dsst.forces;
18
19 import org.hipparchus.Field;
20 import org.hipparchus.CalculusFieldElement;
21 import org.hipparchus.geometry.euclidean.threed.FieldVector3D;
22 import org.hipparchus.util.CombinatoricsUtils;
23 import org.hipparchus.util.FastMath;
24 import org.hipparchus.util.MathArrays;
25 import org.orekit.bodies.CelestialBody;
26 import org.orekit.propagation.semianalytical.dsst.utilities.CoefficientsFactory;
27 import org.orekit.propagation.semianalytical.dsst.utilities.FieldAuxiliaryElements;
28 import org.orekit.propagation.semianalytical.dsst.utilities.UpperBounds;
29
30
31
32
33
34
35
36
37
38
39 public class FieldDSSTThirdBodyContext<T extends CalculusFieldElement <T>> extends FieldForceModelContext<T> {
40
41
42 private static final int MAX_POWER = 22;
43
44
45 private static final double BIG_TRUNCATION_TOLERANCE = 1.e-1;
46
47
48 private static final double SMALL_TRUNCATION_TOLERANCE = 1.9e-6;
49
50
51 private static final int MAX_ECCPOWER_SP = 4;
52
53
54 private int maxAR3Pow;
55
56
57 private int maxEccPow;
58
59
60 private T[] aoR3Pow;
61
62
63 private int maxEccPowShort;
64
65
66 private int maxFreqF;
67
68
69 private T[][] Qns;
70
71
72 private final T gm;
73
74
75 private T R3;
76
77
78 private final T A;
79
80
81
82 private final T alpha;
83
84 private final T beta;
85
86 private final T gamma;
87
88
89 private final T BB;
90
91 private final T BBB;
92
93
94 private final T X;
95
96 private final T XX;
97
98 private final T XXX;
99
100 private final T m2aoA;
101
102 private final T BoA;
103
104 private final T ooAB;
105
106 private final T mCo2AB;
107
108 private final T BoABpo;
109
110
111 private final T muoR3;
112
113
114 private final T b;
115
116
117 private final T hXXX;
118
119 private final T kXXX;
120
121
122 private final T motion;
123
124
125
126
127
128
129
130
131 FieldDSSTThirdBodyContext(final FieldAuxiliaryElements<T> auxiliaryElements,
132 final CelestialBody thirdBody,
133 final T[] parameters) {
134
135 super(auxiliaryElements);
136
137
138 final Field<T> field = auxiliaryElements.getDate().getField();
139 final T zero = field.getZero();
140
141 final T mu = parameters[1];
142 A = FastMath.sqrt(mu.multiply(auxiliaryElements.getSma()));
143
144 this.gm = parameters[0];
145
146
147 final T absA = FastMath.abs(auxiliaryElements.getSma());
148 motion = FastMath.sqrt(mu.divide(absA)).divide(absA);
149
150
151 final FieldVector3D<T> bodyPos = thirdBody.getPVCoordinates(auxiliaryElements.getDate(), auxiliaryElements.getFrame()).getPosition();
152 R3 = bodyPos.getNorm();
153
154
155 final FieldVector3D<T> bodyDir = bodyPos.normalize();
156 alpha = (T) bodyDir.dotProduct(auxiliaryElements.getVectorF());
157 beta = (T) bodyDir.dotProduct(auxiliaryElements.getVectorG());
158 gamma = (T) bodyDir.dotProduct(auxiliaryElements.getVectorW());
159
160
161 BB = auxiliaryElements.getB().multiply(auxiliaryElements.getB());
162
163 BBB = BB.multiply(auxiliaryElements.getB());
164
165
166 b = auxiliaryElements.getB().add(1.).reciprocal();
167
168
169 X = auxiliaryElements.getB().reciprocal();
170 XX = X.multiply(X);
171 XXX = X.multiply(XX);
172
173
174 m2aoA = auxiliaryElements.getSma().multiply(-2.).divide(A);
175
176 BoA = auxiliaryElements.getB().divide(A);
177
178 ooAB = (A.multiply(auxiliaryElements.getB())).reciprocal();
179
180 mCo2AB = auxiliaryElements.getC().multiply(ooAB).divide(2.).negate();
181
182 BoABpo = BoA.divide(auxiliaryElements.getB().add(1.));
183
184 muoR3 = R3.divide(gm).reciprocal();
185
186 hXXX = XXX.multiply(auxiliaryElements.getH());
187
188 kXXX = XXX.multiply(auxiliaryElements.getK());
189
190
191 final T aoR3 = auxiliaryElements.getSma().divide(R3);
192 final double tol = ( aoR3.getReal() > .3 || aoR3.getReal() > .15 && auxiliaryElements.getEcc().getReal() > .25) ? BIG_TRUNCATION_TOLERANCE : SMALL_TRUNCATION_TOLERANCE;
193
194
195
196 final T eo2 = FastMath.max(zero.add(0.0025), auxiliaryElements.getEcc().divide(2.));
197 final T x2o2 = XX.divide(2.);
198 final T[] eccPwr = MathArrays.buildArray(field, MAX_POWER);
199 final T[] chiPwr = MathArrays.buildArray(field, MAX_POWER);
200 eccPwr[0] = zero.add(1.);
201 chiPwr[0] = X;
202 for (int i = 1; i < MAX_POWER; i++) {
203 eccPwr[i] = eccPwr[i - 1].multiply(eo2);
204 chiPwr[i] = chiPwr[i - 1].multiply(x2o2);
205 }
206
207
208 final T ao2rxx = aoR3.divide(XX.multiply(2.));
209 T xmuarn = ao2rxx.multiply(ao2rxx).multiply(gm).divide(X.multiply(R3));
210 T term = zero;
211
212
213 maxAR3Pow = 2;
214 maxEccPow = 0;
215 int n = 2;
216 int m = 2;
217 int nsmd2 = 0;
218
219 do {
220 term = xmuarn.multiply((CombinatoricsUtils.factorialDouble(n + m) / (CombinatoricsUtils.factorialDouble(nsmd2) * CombinatoricsUtils.factorialDouble(nsmd2 + m))) *
221 (CombinatoricsUtils.factorialDouble(n + m + 1) / (CombinatoricsUtils.factorialDouble(m) * CombinatoricsUtils.factorialDouble(n + 1))) *
222 (CombinatoricsUtils.factorialDouble(n - m + 1) / CombinatoricsUtils.factorialDouble(n + 1))).
223 multiply(eccPwr[m]).multiply(UpperBounds.getDnl(XX, chiPwr[m], n + 2, m));
224
225 if (term.getReal() < tol) {
226 if (m == 0) {
227 break;
228 } else if (m < 2) {
229 xmuarn = xmuarn.multiply(ao2rxx);
230 m = 0;
231 n++;
232 nsmd2++;
233 } else {
234 m -= 2;
235 nsmd2++;
236 }
237 } else {
238 maxAR3Pow = n;
239 maxEccPow = FastMath.max(m, maxEccPow);
240 xmuarn = xmuarn.multiply(ao2rxx);
241 m++;
242 n++;
243 }
244 } while (n < MAX_POWER);
245
246 maxEccPow = FastMath.min(maxAR3Pow, maxEccPow);
247
248
249 aoR3Pow = MathArrays.buildArray(field, maxAR3Pow + 1);
250
251 aoR3Pow[0] = field.getOne();
252 for (int i = 1; i <= maxAR3Pow; i++) {
253 aoR3Pow[i] = aoR3.multiply(aoR3Pow[i - 1]);
254 }
255
256 maxFreqF = maxAR3Pow + 1;
257 maxEccPowShort = MAX_ECCPOWER_SP;
258
259 Qns = CoefficientsFactory.computeQns(gamma, maxAR3Pow, FastMath.max(maxEccPow, maxEccPowShort));
260 }
261
262
263
264
265 public T getA() {
266 return A;
267 }
268
269
270
271
272 public T getAlpha() {
273 return alpha;
274 }
275
276
277
278
279 public T getBeta() {
280 return beta;
281 }
282
283
284
285
286 public T getGamma() {
287 return gamma;
288 }
289
290
291
292
293 public T getBB() {
294 return BB;
295 }
296
297
298
299
300 public T getBBB() {
301 return BBB;
302 }
303
304
305
306
307 public T getb() {
308 return b;
309 }
310
311
312
313
314 public T getX() {
315 return X;
316 }
317
318
319
320
321 public T getM2aoA() {
322 return m2aoA;
323 }
324
325
326
327
328 public T getBoA() {
329 return BoA;
330 }
331
332
333
334
335 public T getOoAB() {
336 return ooAB;
337 }
338
339
340
341
342 public T getMCo2AB() {
343 return mCo2AB;
344 }
345
346
347
348
349 public T getBoABpo() {
350 return BoABpo;
351 }
352
353
354
355
356 public T getMuoR3() {
357 return muoR3;
358 }
359
360
361
362
363 public T getHXXX() {
364 return hXXX;
365 }
366
367
368
369
370 public T getKXXX() {
371 return kXXX;
372 }
373
374
375
376
377 public int getMaxAR3Pow() {
378 return maxAR3Pow;
379 }
380
381
382
383
384 public int getMaxEccPow() {
385 return maxEccPow;
386 }
387
388
389
390
391 public T[] getAoR3Pow() {
392 return aoR3Pow.clone();
393 }
394
395
396
397
398 public int getMaxFreqF() {
399 return maxFreqF;
400 }
401
402
403
404
405
406
407 public T getMeanMotion() {
408 return motion;
409 }
410
411
412
413
414 public T[][] getQns() {
415 return Qns.clone();
416 }
417
418 }