1use crate::space::util::constants::{X2_3, XKE};
2use core::f64::consts::{PI, TAU};
3use libm::pow;
4
5#[derive(Debug, Default, Clone, Copy, PartialEq)]
7pub struct DsInitOptions {
8 pub cosim: f64,
10 pub argpo: f64,
12 pub s1: f64,
14 pub s2: f64,
16 pub s3: f64,
18 pub s4: f64,
20 pub s5: f64,
22 pub sinim: f64,
24 pub ss1: f64,
26 pub ss2: f64,
28 pub ss3: f64,
30 pub ss4: f64,
32 pub ss5: f64,
34 pub sz1: f64,
36 pub sz3: f64,
38 pub sz11: f64,
40 pub sz13: f64,
42 pub sz21: f64,
44 pub sz23: f64,
46 pub sz31: f64,
48 pub sz33: f64,
50 pub tc: f64,
52 pub gsto: f64,
54 pub mo: f64,
56 pub mdot: f64,
58 pub no: f64,
60 pub nodeo: f64,
62 pub nodedot: f64,
64 pub xpidot: f64,
66 pub z1: f64,
68 pub z3: f64,
70 pub z11: f64,
72 pub z13: f64,
74 pub z21: f64,
76 pub z23: f64,
78 pub z31: f64,
80 pub z33: f64,
82 pub ecco: f64,
84 pub eccsq: f64,
86 pub emsq: f64,
88 pub em: f64,
90 pub argpm: f64,
92 pub inclm: f64,
94 pub mm: f64,
96 pub nm: f64,
98 pub nodem: f64,
100 pub irez: f64,
102 pub atime: f64,
104 pub d2201: f64,
106 pub d2211: f64,
108 pub d3210: f64,
110 pub d3222: f64,
112 pub d4410: f64,
114 pub d4422: f64,
116 pub d5220: f64,
118 pub d5232: f64,
120 pub d5421: f64,
122 pub d5433: f64,
124 pub dedt: f64,
126 pub didt: f64,
128 pub dmdt: f64,
130 pub dnodt: f64,
132 pub domdt: f64,
134 pub del1: f64,
136 pub del2: f64,
138 pub del3: f64,
140 pub xfact: f64,
142 pub xlamo: f64,
144 pub xli: f64,
146 pub xni: f64,
148}
149
150#[derive(Debug, Default, Clone, Copy, PartialEq)]
152pub struct DsInitOutput {
153 pub em: f64,
155 pub argpm: f64,
157 pub inclm: f64,
159 pub mm: f64,
161 pub nm: f64,
163 pub nodem: f64,
165
166 pub irez: f64,
168 pub atime: f64,
170
171 pub d2201: f64,
173 pub d2211: f64,
175 pub d3210: f64,
177 pub d3222: f64,
179 pub d4410: f64,
181
182 pub d4422: f64,
184 pub d5220: f64,
186 pub d5232: f64,
188 pub d5421: f64,
190 pub d5433: f64,
192
193 pub dedt: f64,
195 pub didt: f64,
197 pub dmdt: f64,
199 pub dndt: f64,
201 pub dnodt: f64,
203 pub domdt: f64,
205
206 pub del1: f64,
208 pub del2: f64,
210 pub del3: f64,
212
213 pub xfact: f64,
215 pub xlamo: f64,
217 pub xli: f64,
219 pub xni: f64,
221}
222
223pub fn dsinit(options: DsInitOptions, tsince: f64) -> DsInitOutput {
243 let DsInitOptions {
244 cosim,
245 argpo,
246 s1,
247 s2,
248 s3,
249 s4,
250 s5,
251 sinim,
252 ss1,
253 ss2,
254 ss3,
255 ss4,
256 ss5,
257 sz1,
258 sz3,
259 sz11,
260 sz13,
261 sz21,
262 sz23,
263 sz31,
264 sz33,
265 tc,
266 gsto,
267 mo,
268 mdot,
269 no,
270 nodeo,
271 nodedot,
272 xpidot,
273 z1,
274 z3,
275 z11,
276 z13,
277 z21,
278 z23,
279 z31,
280 z33,
281 ecco,
282 eccsq,
283 mut emsq,
284 mut em,
285 mut argpm,
286 mut inclm,
287 mut mm,
288 mut nm,
289 mut nodem,
290 mut atime,
292 mut d2201,
293 mut d2211,
294 mut d3210,
295 mut d3222,
296 mut d4410,
297 mut d4422,
298 mut d5220,
299 mut d5232,
300 mut d5421,
301 mut d5433,
302 mut del1,
308 mut del2,
309 mut del3,
310 mut xfact,
311 mut xlamo,
312 mut xli,
313 mut xni,
314 ..
315 } = options;
316
317 let mut f220: f64;
318 let f221: f64;
319 let f311: f64;
320 let f321: f64;
321 let f322: f64;
322 let mut f330: f64;
323 let f441: f64;
324 let f442: f64;
325 let f522: f64;
326 let f523: f64;
327 let f542: f64;
328 let f543: f64;
329 let g200: f64;
330 let g201: f64;
331 let g211: f64;
332 let g300: f64;
333 let mut g310: f64;
334 let g322: f64;
335 let g410: f64;
336 let g422: f64;
337 let g520: f64;
338 let g521: f64;
339 let g532: f64;
340 let g533: f64;
341 let sini2: f64;
342 let mut temp: f64;
343 let mut temp1: f64;
344 let xno2: f64;
345 let ainv2: f64;
346 let aonv: f64;
347 let cosisq: f64;
348 let eoc: f64;
349
350 let q22 = 1.7891679e-6;
351 let q31 = 2.1460748e-6;
352 let q33 = 2.2123015e-7;
353 let root22 = 1.7891679e-6;
354 let root44 = 7.3636953e-9;
355 let root54 = 2.1765803e-9;
356
357 let rptim = 4.375_269_088_011_3e-3; let root32 = 3.7393792e-7;
360 let root52 = 1.1428639e-7;
361 let znl = 1.5835218e-4;
362 let zns = 1.19459e-5;
363
364 let mut irez = 0;
366 if nm < 0.0052359877 && nm > 0.0034906585 {
367 irez = 1;
368 }
369 if (8.26e-3..=9.24e-3).contains(&nm) {
370 irez = 2;
371 }
372
373 let ses = ss1 * zns * ss5;
375 let sis = ss2 * zns * (sz11 + sz13);
376 let sls = -zns * ss3 * (sz1 + sz3 - 14.0 - 6.0 * emsq);
377 let sghs = ss4 * zns * (sz31 + sz33 - 6.0);
378 let mut shs = -zns * ss2 * (sz21 + sz23);
379
380 if !(5.2359877e-2..=PI - 5.2359877e-2).contains(&inclm) {
382 shs = 0.0;
383 }
384 if sinim != 0.0 {
385 shs /= sinim;
386 }
387 let sgs = sghs - cosim * shs;
388
389 let dedt = ses + s1 * znl * s5;
391 let didt = sis + s2 * znl * (z11 + z13);
392 let dmdt = sls - znl * s3 * (z1 + z3 - 14.0 - 6.0 * emsq);
393 let sghl = s4 * znl * (z31 + z33 - 6.0);
394 let mut shll = -znl * s2 * (z21 + z23);
395
396 if !(5.2359877e-2..=PI - 5.2359877e-2).contains(&inclm) {
398 shll = 0.0;
399 }
400 let mut domdt = sgs + sghl;
401 let mut dnodt = shs;
402 if sinim != 0.0 {
403 domdt -= (cosim / sinim) * shll;
404 dnodt += shll / sinim;
405 }
406
407 let dndt = 0.0;
409 let theta = (gsto + tc * rptim) % TAU;
410 em += dedt * tsince;
411 inclm += didt * tsince;
412 argpm += domdt * tsince;
413 nodem += dnodt * tsince;
414 mm += dmdt * tsince;
415
416 if irez != 0 {
427 aonv = pow(nm / XKE, X2_3);
429
430 if irez == 2 {
432 cosisq = cosim * cosim;
433 let emo = em;
434 em = ecco;
435 let emsqo = emsq;
436 emsq = eccsq;
437 eoc = em * emsq;
438 g201 = -0.306 - (em - 0.64) * 0.44;
439
440 if em <= 0.65 {
441 g211 = 3.616 - 13.247 * em + 16.29 * emsq;
442 g310 = -19.302 + 117.39 * em - 228.419 * emsq + 156.591 * eoc;
443 g322 = -18.9068 + 109.7927 * em - 214.6334 * emsq + 146.5816 * eoc;
444 g410 = -41.122 + 242.694 * em - 471.094 * emsq + 313.953 * eoc;
445 g422 = -146.407 + 841.88 * em - 1629.014 * emsq + 1083.435 * eoc;
446 g520 = -532.114 + 3017.977 * em - 5740.032 * emsq + 3708.276 * eoc;
447 } else {
448 g211 = -72.099 + 331.819 * em - 508.738 * emsq + 266.724 * eoc;
449 g310 = -346.844 + 1582.851 * em - 2415.925 * emsq + 1246.113 * eoc;
450 g322 = -342.585 + 1554.908 * em - 2366.899 * emsq + 1215.972 * eoc;
451 g410 = -1052.797 + 4758.686 * em - 7193.992 * emsq + 3651.957 * eoc;
452 g422 = -3581.69 + 16178.11 * em - 24462.77 * emsq + 12422.52 * eoc;
453 if em > 0.715 {
454 g520 = -5149.66 + 29936.92 * em - 54087.36 * emsq + 31324.56 * eoc;
455 } else {
456 g520 = 1464.74 - 4664.75 * em + 3763.64 * emsq;
457 }
458 }
459 if em < 0.7 {
460 g533 = -919.2277 + 4988.61 * em - 9064.77 * emsq + 5542.21 * eoc;
461 g521 = -822.71072 + 4568.6173 * em - 8491.4146 * emsq + 5337.524 * eoc;
462 g532 = -853.666 + 4690.25 * em - 8624.77 * emsq + 5341.4 * eoc;
463 } else {
464 g533 = -37995.78 + 161616.52 * em - 229838.2 * emsq + 109377.94 * eoc;
465 g521 = -51752.104 + 218913.95 * em - 309468.16 * emsq + 146349.42 * eoc;
466 g532 = -40023.88 + 170470.89 * em - 242699.48 * emsq + 115605.82 * eoc;
467 }
468 sini2 = sinim * sinim;
469 f220 = 0.75 * (1.0 + 2.0 * cosim + cosisq);
470 f221 = 1.5 * sini2;
471 f321 = 1.875 * sinim * (1.0 - 2.0 * cosim - 3.0 * cosisq);
472 f322 = -1.875 * sinim * (1.0 + 2.0 * cosim - 3.0 * cosisq);
473 f441 = 35.0 * sini2 * f220;
474 f442 = 39.375 * sini2 * sini2;
475
476 f522 = 9.84375
477 * sinim
478 * (sini2 * (1.0 - 2.0 * cosim - 5.0 * cosisq)
479 + 0.33333333 * (-2.0 + 4.0 * cosim + 6.0 * cosisq));
480 f523 = sinim
481 * (4.92187512 * sini2 * (-2.0 - 4.0 * cosim + 10.0 * cosisq)
482 + 6.56250012 * (1.0 + 2.0 * cosim - 3.0 * cosisq));
483 f542 = 29.53125
484 * sinim
485 * (2.0 - 8.0 * cosim + cosisq * (-12.0 + 8.0 * cosim + 10.0 * cosisq));
486 f543 = 29.53125
487 * sinim
488 * (-2.0 - 8.0 * cosim + cosisq * (12.0 + 8.0 * cosim - 10.0 * cosisq));
489
490 xno2 = nm * nm;
491 ainv2 = aonv * aonv;
492 temp1 = 3.0 * xno2 * ainv2;
493 temp = temp1 * root22;
494 d2201 = temp * f220 * g201;
495 d2211 = temp * f221 * g211;
496 temp1 *= aonv;
497 temp = temp1 * root32;
498 d3210 = temp * f321 * g310;
499 d3222 = temp * f322 * g322;
500 temp1 *= aonv;
501 temp = 2.0 * temp1 * root44;
502 d4410 = temp * f441 * g410;
503 d4422 = temp * f442 * g422;
504 temp1 *= aonv;
505 temp = temp1 * root52;
506 d5220 = temp * f522 * g520;
507 d5232 = temp * f523 * g532;
508 temp = 2.0 * temp1 * root54;
509 d5421 = temp * f542 * g521;
510 d5433 = temp * f543 * g533;
511 xlamo = (mo + nodeo + nodeo - (theta + theta)) % TAU;
512 xfact = mdot + dmdt + 2.0 * (nodedot + dnodt - rptim) - no;
513 em = emo;
514 emsq = emsqo;
515 }
516
517 if irez == 1 {
519 g200 = 1.0 + emsq * (-2.5 + 0.8125 * emsq);
520 g310 = 1.0 + 2.0 * emsq;
521 g300 = 1.0 + emsq * (-6.0 + 6.60937 * emsq);
522 f220 = 0.75 * (1.0 + cosim) * (1.0 + cosim);
523 f311 = 0.9375 * sinim * sinim * (1.0 + 3.0 * cosim) - 0.75 * (1.0 + cosim);
524 f330 = 1.0 + cosim;
525 f330 = f330 * 1.875 * f330 * f330;
527 del1 = 3.0 * nm * nm * aonv * aonv;
528 del2 = 2.0 * del1 * f220 * g200 * q22;
529 del3 = 3.0 * del1 * f330 * g300 * q33 * aonv;
530 del1 = del1 * f311 * g310 * q31 * aonv;
531 xlamo = (mo + nodeo + argpo - theta) % TAU;
532 xfact = mdot + xpidot + dmdt + domdt + dnodt - (no + rptim);
533 }
534
535 xli = xlamo;
537 xni = no;
538 atime = 0.0;
539 nm = no + dndt;
540 }
541
542 DsInitOutput {
543 em,
544 argpm,
545 inclm,
546 mm,
547 nm,
548 nodem,
549
550 irez: irez as f64,
551 atime,
552
553 d2201,
554 d2211,
555 d3210,
556 d3222,
557 d4410,
558
559 d4422,
560 d5220,
561 d5232,
562 d5421,
563 d5433,
564
565 dedt,
566 didt,
567 dmdt,
568 dndt,
569 dnodt,
570 domdt,
571
572 del1,
573 del2,
574 del3,
575
576 xfact,
577 xlamo,
578 xli,
579 xni,
580 }
581}