@typescriptify/sweph 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/README.md +422 -0
  2. package/ephe/semo_18.se1 +0 -0
  3. package/ephe/sepl_18.se1 +0 -0
  4. package/originalCode/.eslintrc.json +124 -0
  5. package/originalCode/.gitattributes +2 -0
  6. package/originalCode/.github/FUNDING.yml +5 -0
  7. package/originalCode/.github/workflows/test.yml +35 -0
  8. package/originalCode/LICENSE +840 -0
  9. package/originalCode/README.md +91 -0
  10. package/originalCode/binding.gyp +41 -0
  11. package/originalCode/constants.js +366 -0
  12. package/originalCode/docs.gif +0 -0
  13. package/originalCode/index.d.ts +5115 -0
  14. package/originalCode/index.js +7 -0
  15. package/originalCode/index.mjs +109 -0
  16. package/originalCode/package.json +55 -0
  17. package/originalCode/src/functions/azalt.cpp +39 -0
  18. package/originalCode/src/functions/azalt_rev.cpp +35 -0
  19. package/originalCode/src/functions/calc.cpp +29 -0
  20. package/originalCode/src/functions/calc_pctr.cpp +31 -0
  21. package/originalCode/src/functions/calc_ut.cpp +29 -0
  22. package/originalCode/src/functions/close.cpp +6 -0
  23. package/originalCode/src/functions/cotrans.cpp +26 -0
  24. package/originalCode/src/functions/cotrans_sp.cpp +26 -0
  25. package/originalCode/src/functions/cs2degstr.cpp +19 -0
  26. package/originalCode/src/functions/cs2lonlatstr.cpp +23 -0
  27. package/originalCode/src/functions/cs2timestr.cpp +23 -0
  28. package/originalCode/src/functions/csnorm.cpp +15 -0
  29. package/originalCode/src/functions/csroundsec.cpp +15 -0
  30. package/originalCode/src/functions/d2l.cpp +15 -0
  31. package/originalCode/src/functions/date_conversion.cpp +30 -0
  32. package/originalCode/src/functions/day_of_week.cpp +15 -0
  33. package/originalCode/src/functions/degnorm.cpp +15 -0
  34. package/originalCode/src/functions/deltat.cpp +15 -0
  35. package/originalCode/src/functions/deltat_ex.cpp +24 -0
  36. package/originalCode/src/functions/difcs2n.cpp +19 -0
  37. package/originalCode/src/functions/difcsn.cpp +19 -0
  38. package/originalCode/src/functions/difdeg2n.cpp +19 -0
  39. package/originalCode/src/functions/difdegn.cpp +19 -0
  40. package/originalCode/src/functions/fixstar.cpp +32 -0
  41. package/originalCode/src/functions/fixstar2.cpp +32 -0
  42. package/originalCode/src/functions/fixstar2_mag.cpp +28 -0
  43. package/originalCode/src/functions/fixstar2_ut.cpp +32 -0
  44. package/originalCode/src/functions/fixstar_mag.cpp +28 -0
  45. package/originalCode/src/functions/fixstar_ut.cpp +32 -0
  46. package/originalCode/src/functions/gauquelin_sector.cpp +44 -0
  47. package/originalCode/src/functions/get_ayanamsa.cpp +15 -0
  48. package/originalCode/src/functions/get_ayanamsa_ex.cpp +27 -0
  49. package/originalCode/src/functions/get_ayanamsa_ex_ut.cpp +27 -0
  50. package/originalCode/src/functions/get_ayanamsa_name.cpp +19 -0
  51. package/originalCode/src/functions/get_ayanamsa_ut.cpp +15 -0
  52. package/originalCode/src/functions/get_current_file_data.cpp +28 -0
  53. package/originalCode/src/functions/get_library_path.cpp +8 -0
  54. package/originalCode/src/functions/get_orbital_elements.cpp +29 -0
  55. package/originalCode/src/functions/get_planet_name.cpp +19 -0
  56. package/originalCode/src/functions/get_tid_acc.cpp +7 -0
  57. package/originalCode/src/functions/heliacal_pheno_ut.cpp +52 -0
  58. package/originalCode/src/functions/heliacal_ut.cpp +52 -0
  59. package/originalCode/src/functions/helio_cross.cpp +33 -0
  60. package/originalCode/src/functions/helio_cross_ut.cpp +33 -0
  61. package/originalCode/src/functions/house_name.cpp +20 -0
  62. package/originalCode/src/functions/house_pos.cpp +36 -0
  63. package/originalCode/src/functions/houses.cpp +35 -0
  64. package/originalCode/src/functions/houses_armc.cpp +38 -0
  65. package/originalCode/src/functions/houses_armc_ex2.cpp +47 -0
  66. package/originalCode/src/functions/houses_ex.cpp +37 -0
  67. package/originalCode/src/functions/houses_ex2.cpp +46 -0
  68. package/originalCode/src/functions/jdet_to_utc.cpp +38 -0
  69. package/originalCode/src/functions/jdut1_to_utc.cpp +38 -0
  70. package/originalCode/src/functions/julday.cpp +25 -0
  71. package/originalCode/src/functions/lat_to_lmt.cpp +27 -0
  72. package/originalCode/src/functions/lmt_to_lat.cpp +27 -0
  73. package/originalCode/src/functions/lun_eclipse_how.cpp +34 -0
  74. package/originalCode/src/functions/lun_eclipse_when.cpp +31 -0
  75. package/originalCode/src/functions/lun_eclipse_when_loc.cpp +39 -0
  76. package/originalCode/src/functions/lun_occult_when_glob.cpp +35 -0
  77. package/originalCode/src/functions/lun_occult_when_loc.cpp +43 -0
  78. package/originalCode/src/functions/lun_occult_where.cpp +34 -0
  79. package/originalCode/src/functions/mooncross.cpp +26 -0
  80. package/originalCode/src/functions/mooncross_node.cpp +30 -0
  81. package/originalCode/src/functions/mooncross_node_ut.cpp +30 -0
  82. package/originalCode/src/functions/mooncross_ut.cpp +26 -0
  83. package/originalCode/src/functions/nod_aps.cpp +42 -0
  84. package/originalCode/src/functions/nod_aps_ut.cpp +42 -0
  85. package/originalCode/src/functions/orbit_max_min_true_distance.cpp +37 -0
  86. package/originalCode/src/functions/pheno.cpp +29 -0
  87. package/originalCode/src/functions/pheno_ut.cpp +29 -0
  88. package/originalCode/src/functions/radnorm.cpp +15 -0
  89. package/originalCode/src/functions/refrac.cpp +23 -0
  90. package/originalCode/src/functions/refrac_extended.cpp +32 -0
  91. package/originalCode/src/functions/revjul.cpp +33 -0
  92. package/originalCode/src/functions/rise_trans.cpp +44 -0
  93. package/originalCode/src/functions/rise_trans_true_hor.cpp +46 -0
  94. package/originalCode/src/functions/set_delta_t_userdef.cpp +14 -0
  95. package/originalCode/src/functions/set_ephe_path.cpp +14 -0
  96. package/originalCode/src/functions/set_jpl_file.cpp +14 -0
  97. package/originalCode/src/functions/set_sid_mode.cpp +20 -0
  98. package/originalCode/src/functions/set_tid_acc.cpp +14 -0
  99. package/originalCode/src/functions/set_topo.cpp +20 -0
  100. package/originalCode/src/functions/sidtime.cpp +15 -0
  101. package/originalCode/src/functions/sidtime0.cpp +21 -0
  102. package/originalCode/src/functions/sol_eclipse_how.cpp +34 -0
  103. package/originalCode/src/functions/sol_eclipse_when_glob.cpp +31 -0
  104. package/originalCode/src/functions/sol_eclipse_when_loc.cpp +39 -0
  105. package/originalCode/src/functions/sol_eclipse_where.cpp +30 -0
  106. package/originalCode/src/functions/solcross.cpp +26 -0
  107. package/originalCode/src/functions/solcross_ut.cpp +26 -0
  108. package/originalCode/src/functions/split_deg.cpp +35 -0
  109. package/originalCode/src/functions/time_equ.cpp +25 -0
  110. package/originalCode/src/functions/utc_time_zone.cpp +48 -0
  111. package/originalCode/src/functions/utc_to_jd.cpp +37 -0
  112. package/originalCode/src/functions/version.cpp +8 -0
  113. package/originalCode/src/functions/vis_limit_mag.cpp +50 -0
  114. package/originalCode/src/sweph.cpp +150 -0
  115. package/originalCode/src/sweph.h +119 -0
  116. package/originalCode/swisseph/swecl.c +6428 -0
  117. package/originalCode/swisseph/swedate.c +588 -0
  118. package/originalCode/swisseph/swedate.h +81 -0
  119. package/originalCode/swisseph/swehel.c +3511 -0
  120. package/originalCode/swisseph/swehouse.c +3143 -0
  121. package/originalCode/swisseph/swehouse.h +98 -0
  122. package/originalCode/swisseph/swejpl.c +958 -0
  123. package/originalCode/swisseph/swejpl.h +103 -0
  124. package/originalCode/swisseph/swemmoon.c +1930 -0
  125. package/originalCode/swisseph/swemplan.c +967 -0
  126. package/originalCode/swisseph/swemptab.h +10640 -0
  127. package/originalCode/swisseph/swenut2000a.h +2819 -0
  128. package/originalCode/swisseph/sweodef.h +326 -0
  129. package/originalCode/swisseph/sweph.c +8614 -0
  130. package/originalCode/swisseph/sweph.h +849 -0
  131. package/originalCode/swisseph/swephexp.h +1020 -0
  132. package/originalCode/swisseph/swephlib.c +4634 -0
  133. package/originalCode/swisseph/swephlib.h +189 -0
  134. package/package.json +28 -0
  135. package/scripts/gen-swemptab.js +177 -0
  136. package/scripts/gen-swenut2000a.js +106 -0
  137. package/src/SwissEph/README.md +268 -0
  138. package/src/SwissEph/UseCases/Ayanamsa.md +363 -0
  139. package/src/SwissEph/UseCases/AzimuthAltitude.md +408 -0
  140. package/src/SwissEph/UseCases/CoordinateSystems.md +337 -0
  141. package/src/SwissEph/UseCases/DateAndTime.md +368 -0
  142. package/src/SwissEph/UseCases/DeltaT.md +258 -0
  143. package/src/SwissEph/UseCases/EphemerisFiles.md +338 -0
  144. package/src/SwissEph/UseCases/FixedStars.md +300 -0
  145. package/src/SwissEph/UseCases/GauquelinSectors.md +304 -0
  146. package/src/SwissEph/UseCases/HeliacalEvents.md +396 -0
  147. package/src/SwissEph/UseCases/HelioCrossings.md +325 -0
  148. package/src/SwissEph/UseCases/HousePosition.md +254 -0
  149. package/src/SwissEph/UseCases/HouseSystems.md +279 -0
  150. package/src/SwissEph/UseCases/LunarEclipse.md +326 -0
  151. package/src/SwissEph/UseCases/MeridianTransit.md +279 -0
  152. package/src/SwissEph/UseCases/MoonCrossings.md +373 -0
  153. package/src/SwissEph/UseCases/NodesAndApsides.md +307 -0
  154. package/src/SwissEph/UseCases/Occultation.md +352 -0
  155. package/src/SwissEph/UseCases/OrbitalElements.md +469 -0
  156. package/src/SwissEph/UseCases/Phenomena.md +328 -0
  157. package/src/SwissEph/UseCases/PlanetPositions.md +366 -0
  158. package/src/SwissEph/UseCases/Planetocentric.md +278 -0
  159. package/src/SwissEph/UseCases/Refraction.md +314 -0
  160. package/src/SwissEph/UseCases/RiseAndSet.md +433 -0
  161. package/src/SwissEph/UseCases/SiderealTime.md +302 -0
  162. package/src/SwissEph/UseCases/SolarEclipse.md +379 -0
  163. package/src/SwissEph/UseCases/SunCrossings.md +275 -0
  164. package/src/SwissEph/UseCases/TopocentricCorrection.md +335 -0
  165. package/src/SwissEph/errors.ts +10 -0
  166. package/src/SwissEph/index.ts +823 -0
  167. package/src/SwissEph/types.ts +291 -0
  168. package/src/constants.ts +762 -0
  169. package/src/file-reader.ts +147 -0
  170. package/src/index.ts +10 -0
  171. package/src/swecl.ts +4526 -0
  172. package/src/swedate.ts +376 -0
  173. package/src/swehel.ts +1939 -0
  174. package/src/swehouse.ts +2167 -0
  175. package/src/swejpl.ts +470 -0
  176. package/src/swemmoon.ts +1318 -0
  177. package/src/swemplan.ts +585 -0
  178. package/src/swemptab.ts +4448 -0
  179. package/src/swenut2000a.ts +2763 -0
  180. package/src/sweph.ts +3993 -0
  181. package/src/swephlib.ts +2720 -0
  182. package/src/types.ts +490 -0
  183. package/tests/c-style/ayanamsa.test.ts +63 -0
  184. package/tests/c-style/config.test.ts +96 -0
  185. package/tests/c-style/crossings.test.ts +81 -0
  186. package/tests/c-style/date-time.test.ts +114 -0
  187. package/tests/c-style/eclipses.test.ts +84 -0
  188. package/tests/c-style/fixed-stars.test.ts +66 -0
  189. package/tests/c-style/heliacal.test.ts +34 -0
  190. package/tests/c-style/houses.test.ts +135 -0
  191. package/tests/c-style/math-utils.test.ts +160 -0
  192. package/tests/c-style/orbital.test.ts +78 -0
  193. package/tests/c-style/phenomena.test.ts +42 -0
  194. package/tests/c-style/planetocentric.test.ts +26 -0
  195. package/tests/c-style/planets.test.ts +117 -0
  196. package/tests/c-style/rise-set.test.ts +71 -0
  197. package/tests/helpers.ts +21 -0
  198. package/tests/modern/ayanamsa.test.ts +47 -0
  199. package/tests/modern/calc.test.ts +113 -0
  200. package/tests/modern/config.test.ts +46 -0
  201. package/tests/modern/crossings.test.ts +45 -0
  202. package/tests/modern/eclipses.test.ts +81 -0
  203. package/tests/modern/errors.test.ts +71 -0
  204. package/tests/modern/heliacal.test.ts +30 -0
  205. package/tests/modern/houses.test.ts +87 -0
  206. package/tests/modern/orbital.test.ts +79 -0
  207. package/tests/modern/phenomena.test.ts +41 -0
  208. package/tests/modern/rise-set.test.ts +60 -0
  209. package/tests/modern/statics.test.ts +99 -0
  210. package/tests/modern/utilities.test.ts +70 -0
  211. package/tsconfig.json +20 -0
@@ -0,0 +1,1318 @@
1
+ /* SWISSEPH
2
+ *
3
+ * Steve Moshier's analytical lunar ephemeris
4
+ *
5
+ * TypeScript translation of swemmoon.c (DE404 version)
6
+ *
7
+ * Copyright (C) 1997 - 2021 Astrodienst AG, Switzerland.
8
+ * All rights reserved. (AGPL)
9
+ */
10
+
11
+ /*
12
+ * Expansions for the geocentric ecliptic longitude,
13
+ * latitude, and distance of the Moon referred to the mean equinox
14
+ * and ecliptic of date.
15
+ *
16
+ * This version adjusts the ELP2000-85 analytical Lunar theory of
17
+ * Chapront-Touze and Chapront to fit the JPL DE404 long ephemeris
18
+ * on the interval from 3000 B.C. to 3000 A.D.
19
+ */
20
+
21
+ import {
22
+ J2000, STR, PI, DEGTORAD, RADTODEG, AUNIT,
23
+ OK, ERR, SEFLG_MOSEPH,
24
+ SEI_MOON, SEI_INTP_APOG, SEI_INTP_PERG,
25
+ MOSHLUEPH_START, MOSHLUEPH_END, MOSHNDEPH_START, MOSHNDEPH_END,
26
+ JPL_DE431_START, JPL_DE431_END,
27
+ MOON_SPEED_INTV, MOON_MEAN_DIST, MOON_MEAN_ECC, MOON_MEAN_INCL,
28
+ J_TO_J2000,
29
+ } from './constants';
30
+
31
+ import type { SweData } from './types';
32
+
33
+ import {
34
+ swiPolcart, swiCoortrf, swiCoortrf2, swiPrecess,
35
+ swiCartpol, sweDegnorm, swiMod2PI,
36
+ } from './swephlib';
37
+
38
+ /* =====================================================================
39
+ * DE404 fitted coefficients (z array, 25 values)
40
+ * ===================================================================== */
41
+ const z: Float64Array = new Float64Array([
42
+ /* The following are scaled in arc seconds, time in Julian centuries.
43
+ They replace the corresponding terms in the mean elements. */
44
+ -1.312045233711e+01, /* F, t^2 */
45
+ -1.138215912580e-03, /* F, t^3 */
46
+ -9.646018347184e-06, /* F, t^4 */
47
+ 3.146734198839e+01, /* l, t^2 */
48
+ 4.768357585780e-02, /* l, t^3 */
49
+ -3.421689790404e-04, /* l, t^4 */
50
+ -6.847070905410e+00, /* D, t^2 */
51
+ -5.834100476561e-03, /* D, t^3 */
52
+ -2.905334122698e-04, /* D, t^4 */
53
+ -5.663161722088e+00, /* L, t^2 */
54
+ 5.722859298199e-03, /* L, t^3 */
55
+ -8.466472828815e-05, /* L, t^4 */
56
+ /* The following longitude terms are in arc seconds times 10^5. */
57
+ -8.429817796435e+01, /* t^2 cos(18V - 16E - l) */
58
+ -2.072552484689e+02, /* t^2 sin(18V - 16E - l) */
59
+ 7.876842214863e+00, /* t^2 cos(10V - 3E - l) */
60
+ 1.836463749022e+00, /* t^2 sin(10V - 3E - l) */
61
+ -1.557471855361e+01, /* t^2 cos(8V - 13E) */
62
+ -2.006969124724e+01, /* t^2 sin(8V - 13E) */
63
+ 2.152670284757e+01, /* t^2 cos(4E - 8M + 3J) */
64
+ -6.179946916139e+00, /* t^2 sin(4E - 8M + 3J) */
65
+ -9.070028191196e-01, /* t^2 cos(18V - 16E) */
66
+ -1.270848233038e+01, /* t^2 sin(18V - 16E) */
67
+ -2.145589319058e+00, /* t^2 cos(2J - 5S) */
68
+ 1.381936399935e+01, /* t^2 sin(2J - 5S) */
69
+ -1.999840061168e+00, /* t^3 sin(l') */
70
+ ]);
71
+
72
+ /* =====================================================================
73
+ * Perturbation tables
74
+ * ===================================================================== */
75
+
76
+ const NLR = 118;
77
+ const LR: Int16Array = new Int16Array([
78
+ /* Longitude Radius
79
+ D l' l F 1" .0001" 1km .0001km */
80
+
81
+ 0, 0, 1, 0, 22639, 5858,-20905,-3550,
82
+ 2, 0,-1, 0, 4586, 4383, -3699,-1109,
83
+ 2, 0, 0, 0, 2369, 9139, -2955,-9676,
84
+ 0, 0, 2, 0, 769, 257, -569,-9251,
85
+ 0, 1, 0, 0, -666,-4171, 48, 8883,
86
+ 0, 0, 0, 2, -411,-5957, -3,-1483,
87
+ 2, 0,-2, 0, 211, 6556, 246, 1585,
88
+ 2,-1,-1, 0, 205, 4358, -152,-1377,
89
+ 2, 0, 1, 0, 191, 9562, -170,-7331,
90
+ 2,-1, 0, 0, 164, 7285, -204,-5860,
91
+ 0, 1,-1, 0, -147,-3213, -129,-6201,
92
+ 1, 0, 0, 0, -124,-9881, 108, 7427,
93
+ 0, 1, 1, 0, -109,-3803, 104, 7552,
94
+ 2, 0, 0,-2, 55, 1771, 10, 3211,
95
+ 0, 0, 1, 2, -45, -996, 0, 0,
96
+ 0, 0, 1,-2, 39, 5333, 79, 6606,
97
+ 4, 0,-1, 0, 38, 4298, -34,-7825,
98
+ 0, 0, 3, 0, 36, 1238, -23,-2104,
99
+ 4, 0,-2, 0, 30, 7726, -21,-6363,
100
+ 2, 1,-1, 0, -28,-3971, 24, 2085,
101
+ 2, 1, 0, 0, -24,-3582, 30, 8238,
102
+ 1, 0,-1, 0, -18,-5847, -8,-3791,
103
+ 1, 1, 0, 0, 17, 9545, -16,-6747,
104
+ 2,-1, 1, 0, 14, 5303, -12,-8314,
105
+ 2, 0, 2, 0, 14, 3797, -10,-4448,
106
+ 4, 0, 0, 0, 13, 8991, -11,-6500,
107
+ 2, 0,-3, 0, 13, 1941, 14, 4027,
108
+ 0, 1,-2, 0, -9,-6791, -7, -27,
109
+ 2, 0,-1, 2, -9,-3659, 0, 7740,
110
+ 2,-1,-2, 0, 8, 6055, 10, 562,
111
+ 1, 0, 1, 0, -8,-4531, 6, 3220,
112
+ 2,-2, 0, 0, 8, 502, -9,-8845,
113
+ 0, 1, 2, 0, -7,-6302, 5, 7509,
114
+ 0, 2, 0, 0, -7,-4475, 1, 657,
115
+ 2,-2,-1, 0, 7, 3712, -4,-9501,
116
+ 2, 0, 1,-2, -6,-3832, 4, 1311,
117
+ 2, 0, 0, 2, -5,-7416, 0, 0,
118
+ 4,-1,-1, 0, 4, 3740, -3,-9580,
119
+ 0, 0, 2, 2, -3,-9976, 0, 0,
120
+ 3, 0,-1, 0, -3,-2097, 3, 2582,
121
+ 2, 1, 1, 0, -2,-9145, 2, 6164,
122
+ 4,-1,-2, 0, 2, 7319, -1,-8970,
123
+ 0, 2,-1, 0, -2,-5679, -2,-1171,
124
+ 2, 2,-1, 0, -2,-5212, 2, 3536,
125
+ 2, 1,-2, 0, 2, 4889, 0, 1437,
126
+ 2,-1, 0,-2, 2, 1461, 0, 6571,
127
+ 4, 0, 1, 0, 1, 9777, -1,-4226,
128
+ 0, 0, 4, 0, 1, 9337, -1,-1169,
129
+ 4,-1, 0, 0, 1, 8708, -1,-5714,
130
+ 1, 0,-2, 0, -1,-7530, -1,-7385,
131
+ 2, 1, 0,-2, -1,-4372, 0,-1357,
132
+ 0, 0, 2,-2, -1,-3726, -4,-4212,
133
+ 1, 1, 1, 0, 1, 2618, 0,-9333,
134
+ 3, 0,-2, 0, -1,-2241, 0, 8624,
135
+ 4, 0,-3, 0, 1, 1868, 0,-5142,
136
+ 2,-1, 2, 0, 1, 1770, 0,-8488,
137
+ 0, 2, 1, 0, -1,-1617, 1, 1655,
138
+ 1, 1,-1, 0, 1, 777, 0, 8512,
139
+ 2, 0, 3, 0, 1, 595, 0,-6697,
140
+ 2, 0, 1, 2, 0,-9902, 0, 0,
141
+ 2, 0,-4, 0, 0, 9483, 0, 7785,
142
+ 2,-2, 1, 0, 0, 7517, 0,-6575,
143
+ 0, 1,-3, 0, 0,-6694, 0,-4224,
144
+ 4, 1,-1, 0, 0,-6352, 0, 5788,
145
+ 1, 0, 2, 0, 0,-5840, 0, 3785,
146
+ 1, 0, 0,-2, 0,-5833, 0,-7956,
147
+ 6, 0,-2, 0, 0, 5716, 0,-4225,
148
+ 2, 0,-2,-2, 0,-5606, 0, 4726,
149
+ 1,-1, 0, 0, 0,-5569, 0, 4976,
150
+ 0, 1, 3, 0, 0,-5459, 0, 3551,
151
+ 2, 0,-2, 2, 0,-5357, 0, 7740,
152
+ 2, 0,-1,-2, 0, 1790, 8, 7516,
153
+ 3, 0, 0, 0, 0, 4042, -1,-4189,
154
+ 2,-1,-3, 0, 0, 4784, 0, 4950,
155
+ 2,-1, 3, 0, 0, 932, 0, -585,
156
+ 2, 0, 2,-2, 0,-4538, 0, 2840,
157
+ 2,-1,-1, 2, 0,-4262, 0, 373,
158
+ 0, 0, 0, 4, 0, 4203, 0, 0,
159
+ 0, 1, 0, 2, 0, 4134, 0,-1580,
160
+ 6, 0,-1, 0, 0, 3945, 0,-2866,
161
+ 2,-1, 0, 2, 0,-3821, 0, 0,
162
+ 2,-1, 1,-2, 0,-3745, 0, 2094,
163
+ 4, 1,-2, 0, 0,-3576, 0, 2370,
164
+ 1, 1,-2, 0, 0, 3497, 0, 3323,
165
+ 2,-3, 0, 0, 0, 3398, 0,-4107,
166
+ 0, 0, 3, 2, 0,-3286, 0, 0,
167
+ 4,-2,-1, 0, 0,-3087, 0,-2790,
168
+ 0, 1,-1,-2, 0, 3015, 0, 0,
169
+ 4, 0,-1,-2, 0, 3009, 0,-3218,
170
+ 2,-2,-2, 0, 0, 2942, 0, 3430,
171
+ 6, 0,-3, 0, 0, 2925, 0,-1832,
172
+ 2, 1, 2, 0, 0,-2902, 0, 2125,
173
+ 4, 1, 0, 0, 0,-2891, 0, 2445,
174
+ 4,-1, 1, 0, 0, 2825, 0,-2029,
175
+ 3, 1,-1, 0, 0, 2737, 0,-2126,
176
+ 0, 1, 1, 2, 0, 2634, 0, 0,
177
+ 1, 0, 0, 2, 0, 2543, 0, 0,
178
+ 3, 0, 0,-2, 0,-2530, 0, 2010,
179
+ 2, 2,-2, 0, 0,-2499, 0,-1089,
180
+ 2,-3,-1, 0, 0, 2469, 0,-1481,
181
+ 3,-1,-1, 0, 0,-2314, 0, 2556,
182
+ 4, 0, 2, 0, 0, 2185, 0,-1392,
183
+ 4, 0,-1, 2, 0,-2013, 0, 0,
184
+ 0, 2,-2, 0, 0,-1931, 0, 0,
185
+ 2, 2, 0, 0, 0,-1858, 0, 0,
186
+ 2, 1,-3, 0, 0, 1762, 0, 0,
187
+ 4, 0,-2, 2, 0,-1698, 0, 0,
188
+ 4,-2,-2, 0, 0, 1578, 0,-1083,
189
+ 4,-2, 0, 0, 0, 1522, 0,-1281,
190
+ 3, 1, 0, 0, 0, 1499, 0,-1077,
191
+ 1,-1,-1, 0, 0,-1364, 0, 1141,
192
+ 1,-3, 0, 0, 0,-1281, 0, 0,
193
+ 6, 0, 0, 0, 0, 1261, 0, -859,
194
+ 2, 0, 2, 2, 0,-1239, 0, 0,
195
+ 1,-1, 1, 0, 0,-1207, 0, 1100,
196
+ 0, 0, 5, 0, 0, 1110, 0, -589,
197
+ 0, 3, 0, 0, 0,-1013, 0, 213,
198
+ 4,-1,-3, 0, 0, 998, 0, 0,
199
+ ]);
200
+
201
+ const NMB = 77;
202
+ const MB: Int16Array = new Int16Array([
203
+ /* Latitude
204
+ D l' l F 1" .0001" */
205
+
206
+ 0, 0, 0, 1,18461, 2387,
207
+ 0, 0, 1, 1, 1010, 1671,
208
+ 0, 0, 1,-1, 999, 6936,
209
+ 2, 0, 0,-1, 623, 6524,
210
+ 2, 0,-1, 1, 199, 4837,
211
+ 2, 0,-1,-1, 166, 5741,
212
+ 2, 0, 0, 1, 117, 2607,
213
+ 0, 0, 2, 1, 61, 9120,
214
+ 2, 0, 1,-1, 33, 3572,
215
+ 0, 0, 2,-1, 31, 7597,
216
+ 2,-1, 0,-1, 29, 5766,
217
+ 2, 0,-2,-1, 15, 5663,
218
+ 2, 0, 1, 1, 15, 1216,
219
+ 2, 1, 0,-1, -12, -941,
220
+ 2,-1,-1, 1, 8, 8681,
221
+ 2,-1, 0, 1, 7, 9586,
222
+ 2,-1,-1,-1, 7, 4346,
223
+ 0, 1,-1,-1, -6,-7314,
224
+ 4, 0,-1,-1, 6, 5796,
225
+ 0, 1, 0, 1, -6,-4601,
226
+ 0, 0, 0, 3, -6,-2965,
227
+ 0, 1,-1, 1, -5,-6324,
228
+ 1, 0, 0, 1, -5,-3684,
229
+ 0, 1, 1, 1, -5,-3113,
230
+ 0, 1, 1,-1, -5, -759,
231
+ 0, 1, 0,-1, -4,-8396,
232
+ 1, 0, 0,-1, -4,-8057,
233
+ 0, 0, 3, 1, 3, 9841,
234
+ 4, 0, 0,-1, 3, 6745,
235
+ 4, 0,-1, 1, 2, 9985,
236
+ 0, 0, 1,-3, 2, 7986,
237
+ 4, 0,-2, 1, 2, 4139,
238
+ 2, 0, 0,-3, 2, 1863,
239
+ 2, 0, 2,-1, 2, 1462,
240
+ 2,-1, 1,-1, 1, 7660,
241
+ 2, 0,-2, 1, -1,-6244,
242
+ 0, 0, 3,-1, 1, 5813,
243
+ 2, 0, 2, 1, 1, 5198,
244
+ 2, 0,-3,-1, 1, 5156,
245
+ 2, 1,-1, 1, -1,-3178,
246
+ 2, 1, 0, 1, -1,-2643,
247
+ 4, 0, 0, 1, 1, 1919,
248
+ 2,-1, 1, 1, 1, 1346,
249
+ 2,-2, 0,-1, 1, 859,
250
+ 0, 0, 1, 3, -1, -194,
251
+ 2, 1, 1,-1, 0,-8227,
252
+ 1, 1, 0,-1, 0, 8042,
253
+ 1, 1, 0, 1, 0, 8026,
254
+ 0, 1,-2,-1, 0,-7932,
255
+ 2, 1,-1,-1, 0,-7910,
256
+ 1, 0, 1, 1, 0,-6674,
257
+ 2,-1,-2,-1, 0, 6502,
258
+ 0, 1, 2, 1, 0,-6388,
259
+ 4, 0,-2,-1, 0, 6337,
260
+ 4,-1,-1,-1, 0, 5958,
261
+ 1, 0, 1,-1, 0,-5889,
262
+ 4, 0, 1,-1, 0, 4734,
263
+ 1, 0,-1,-1, 0,-4299,
264
+ 4,-1, 0,-1, 0, 4149,
265
+ 2,-2, 0, 1, 0, 3835,
266
+ 3, 0, 0,-1, 0,-3518,
267
+ 4,-1,-1, 1, 0, 3388,
268
+ 2, 0,-1,-3, 0, 3291,
269
+ 2,-2,-1, 1, 0, 3147,
270
+ 0, 1, 2,-1, 0,-3129,
271
+ 3, 0,-1,-1, 0,-3052,
272
+ 0, 1,-2, 1, 0,-3013,
273
+ 2, 0, 1,-3, 0,-2912,
274
+ 2,-2,-1,-1, 0, 2686,
275
+ 0, 0, 4, 1, 0, 2633,
276
+ 2, 0,-3, 1, 0, 2541,
277
+ 2, 0,-1, 3, 0,-2448,
278
+ 2, 1, 1, 1, 0,-2370,
279
+ 4,-1,-2, 1, 0, 2138,
280
+ 4, 0, 1, 1, 0, 2126,
281
+ 3, 0,-1, 1, 0,-2059,
282
+ 4, 1,-1,-1, 0,-1719,
283
+ ]);
284
+
285
+ const NLRT = 38;
286
+ const LRT: Int16Array = new Int16Array([
287
+ /*
288
+ Multiply by T
289
+ Longitude Radius
290
+ D l' l F .1" .00001" .1km .00001km */
291
+
292
+ 0, 1, 0, 0, 16, 7680, -1,-2302,
293
+ 2,-1,-1, 0, -5,-1642, 3, 8245,
294
+ 2,-1, 0, 0, -4,-1383, 5, 1395,
295
+ 0, 1,-1, 0, 3, 7115, 3, 2654,
296
+ 0, 1, 1, 0, 2, 7560, -2,-6396,
297
+ 2, 1,-1, 0, 0, 7118, 0,-6068,
298
+ 2, 1, 0, 0, 0, 6128, 0,-7754,
299
+ 1, 1, 0, 0, 0,-4516, 0, 4194,
300
+ 2,-2, 0, 0, 0,-4048, 0, 4970,
301
+ 0, 2, 0, 0, 0, 3747, 0, -540,
302
+ 2,-2,-1, 0, 0,-3707, 0, 2490,
303
+ 2,-1, 1, 0, 0,-3649, 0, 3222,
304
+ 0, 1,-2, 0, 0, 2438, 0, 1760,
305
+ 2,-1,-2, 0, 0,-2165, 0,-2530,
306
+ 0, 1, 2, 0, 0, 1923, 0,-1450,
307
+ 0, 2,-1, 0, 0, 1292, 0, 1070,
308
+ 2, 2,-1, 0, 0, 1271, 0,-6070,
309
+ 4,-1,-1, 0, 0,-1098, 0, 990,
310
+ 2, 0, 0, 0, 0, 1073, 0,-1360,
311
+ 2, 0,-1, 0, 0, 839, 0, -630,
312
+ 2, 1, 1, 0, 0, 734, 0, -660,
313
+ 4,-1,-2, 0, 0, -688, 0, 480,
314
+ 2, 1,-2, 0, 0, -630, 0, 0,
315
+ 0, 2, 1, 0, 0, 587, 0, -590,
316
+ 2,-1, 0,-2, 0, -540, 0, -170,
317
+ 4,-1, 0, 0, 0, -468, 0, 390,
318
+ 2,-2, 1, 0, 0, -378, 0, 330,
319
+ 2, 1, 0,-2, 0, 364, 0, 0,
320
+ 1, 1, 1, 0, 0, -317, 0, 240,
321
+ 2,-1, 2, 0, 0, -295, 0, 210,
322
+ 1, 1,-1, 0, 0, -270, 0, -210,
323
+ 2,-3, 0, 0, 0, -256, 0, 310,
324
+ 2,-3,-1, 0, 0, -187, 0, 110,
325
+ 0, 1,-3, 0, 0, 169, 0, 110,
326
+ 4, 1,-1, 0, 0, 158, 0, -150,
327
+ 4,-2,-1, 0, 0, -155, 0, 140,
328
+ 0, 0, 1, 0, 0, 155, 0, -250,
329
+ 2,-2,-2, 0, 0, -148, 0, -170,
330
+ ]);
331
+
332
+ const NBT = 16;
333
+ const BT: Int16Array = new Int16Array([
334
+ /*
335
+ Multiply by T
336
+ Latitude
337
+ D l' l F .00001" */
338
+
339
+ 2,-1, 0,-1, -7430,
340
+ 2, 1, 0,-1, 3043,
341
+ 2,-1,-1, 1, -2229,
342
+ 2,-1, 0, 1, -1999,
343
+ 2,-1,-1,-1, -1869,
344
+ 0, 1,-1,-1, 1696,
345
+ 0, 1, 0, 1, 1623,
346
+ 0, 1,-1, 1, 1418,
347
+ 0, 1, 1, 1, 1339,
348
+ 0, 1, 1,-1, 1278,
349
+ 0, 1, 0,-1, 1217,
350
+ 2,-2, 0,-1, -547,
351
+ 2,-1, 1,-1, -443,
352
+ 2, 1,-1, 1, 331,
353
+ 2, 1, 0, 1, 317,
354
+ 2, 0, 0,-1, 295,
355
+ ]);
356
+
357
+ const NLRT2 = 25;
358
+ const LRT2: Int16Array = new Int16Array([
359
+ /*
360
+ Multiply by T^2
361
+ Longitude Radius
362
+ D l' l F .00001" .00001km */
363
+
364
+ 0, 1, 0, 0, 487, -36,
365
+ 2,-1,-1, 0, -150, 111,
366
+ 2,-1, 0, 0, -120, 149,
367
+ 0, 1,-1, 0, 108, 95,
368
+ 0, 1, 1, 0, 80, -77,
369
+ 2, 1,-1, 0, 21, -18,
370
+ 2, 1, 0, 0, 20, -23,
371
+ 1, 1, 0, 0, -13, 12,
372
+ 2,-2, 0, 0, -12, 14,
373
+ 2,-1, 1, 0, -11, 9,
374
+ 2,-2,-1, 0, -11, 7,
375
+ 0, 2, 0, 0, 11, 0,
376
+ 2,-1,-2, 0, -6, -7,
377
+ 0, 1,-2, 0, 7, 5,
378
+ 0, 1, 2, 0, 6, -4,
379
+ 2, 2,-1, 0, 5, -3,
380
+ 0, 2,-1, 0, 5, 3,
381
+ 4,-1,-1, 0, -3, 3,
382
+ 2, 0, 0, 0, 3, -4,
383
+ 4,-1,-2, 0, -2, 0,
384
+ 2, 1,-2, 0, -2, 0,
385
+ 2,-1, 0,-2, -2, 0,
386
+ 2, 1, 1, 0, 2, -2,
387
+ 2, 0,-1, 0, 2, 0,
388
+ 0, 2, 1, 0, 2, 0,
389
+ ]);
390
+
391
+ const NBT2 = 12;
392
+ const BT2: Int16Array = new Int16Array([
393
+ /*
394
+ Multiply by T^2
395
+ Latitude
396
+ D l' l F .00001" */
397
+
398
+ 2,-1, 0,-1, -22,
399
+ 2, 1, 0,-1, 9,
400
+ 2,-1, 0, 1, -6,
401
+ 2,-1,-1, 1, -6,
402
+ 2,-1,-1,-1, -5,
403
+ 0, 1, 0, 1, 5,
404
+ 0, 1,-1,-1, 5,
405
+ 0, 1, 1, 1, 4,
406
+ 0, 1, 1,-1, 4,
407
+ 0, 1, 0,-1, 4,
408
+ 0, 1,-1, 1, 4,
409
+ 2,-2, 0,-1, -2,
410
+ ]);
411
+
412
+ /* corrections for mean lunar node in degrees, from -13100 to 17200,
413
+ * in 100-year steps. corrections are set to 0 between the years 0 and 3000 */
414
+ const mean_node_corr: Float64Array = new Float64Array([
415
+ -2.56,
416
+ -2.473, -2.392347, -2.316425, -2.239639, -2.167764, -2.095100, -2.024810, -1.957622, -1.890097, -1.826389,
417
+ -1.763335, -1.701047, -1.643016, -1.584186, -1.527309, -1.473352, -1.418917, -1.367736, -1.317202, -1.267269,
418
+ -1.221121, -1.174218, -1.128862, -1.086214, -1.042998, -1.002491, -0.962635, -0.923176, -0.887191, -0.850403,
419
+ -0.814929, -0.782117, -0.748462, -0.717241, -0.686598, -0.656013, -0.628726, -0.600460, -0.573219, -0.548634,
420
+ -0.522931, -0.499285, -0.476273, -0.452978, -0.432663, -0.411386, -0.390788, -0.372825, -0.353681, -0.336230,
421
+ -0.319520, -0.302343, -0.287794, -0.272262, -0.257166, -0.244534, -0.230635, -0.218126, -0.206365, -0.194000,
422
+ -0.183876, -0.172782, -0.161877, -0.153254, -0.143371, -0.134501, -0.126552, -0.117932, -0.111199, -0.103716,
423
+ -0.096160, -0.090718, -0.084046, -0.078007, -0.072959, -0.067235, -0.062990, -0.058102, -0.053070, -0.049786,
424
+ -0.045381, -0.041317, -0.038165, -0.034501, -0.031871, -0.028844, -0.025701, -0.024018, -0.021427, -0.018881,
425
+ -0.017291, -0.015186, -0.013755, -0.012098, -0.010261, -0.009688, -0.008218, -0.006670, -0.005979, -0.004756,
426
+ -0.003991, -0.002996, -0.001974, -0.001975, -0.001213, -0.000377, -0.000356, 5.779e-05, 0.000378, 0.000710,
427
+ 0.001092, 0.000767, 0.000985, 0.001443, 0.001069, 0.001141, 0.001321, 0.001462, 0.001695, 0.001319,
428
+ 0.001567, 0.001873, 0.001376, 0.001336, 0.001347, 0.001330, 0.001256, 0.000813, 0.000946, 0.001079,
429
+ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
430
+ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
431
+ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
432
+ -0.000364, -0.000452, -0.001091, -0.001159, -0.001136, -0.001798, -0.002249, -0.002622, -0.002990, -0.003555,
433
+ -0.004425, -0.004758, -0.005134, -0.006065, -0.006839, -0.007474, -0.008283, -0.009411, -0.010786, -0.011810,
434
+ -0.012989, -0.014825, -0.016426, -0.017922, -0.019774, -0.021881, -0.024194, -0.026190, -0.028440, -0.031285,
435
+ -0.033817, -0.036318, -0.039212, -0.042456, -0.045799, -0.048994, -0.052710, -0.056948, -0.061017, -0.065181,
436
+ -0.069843, -0.074922, -0.079976, -0.085052, -0.090755, -0.096840, -0.102797, -0.108939, -0.115568, -0.122636,
437
+ -0.129593, -0.136683, -0.144641, -0.152825, -0.161044, -0.169758, -0.178916, -0.188712, -0.198401, -0.208312,
438
+ -0.219395, -0.230407, -0.241577, -0.253508, -0.265640, -0.278556, -0.291330, -0.304353, -0.318815, -0.332882,
439
+ -0.347316, -0.362895, -0.378421, -0.395061, -0.411748, -0.428666, -0.447477, -0.465636, -0.484277, -0.504600,
440
+ -0.524405, -0.545533, -0.567020, -0.588404, -0.612099, -0.634965, -0.658262, -0.683866, -0.708526, -0.734719,
441
+ -0.761800, -0.788562, -0.818092, -0.846885, -0.876177, -0.908385, -0.939371, -0.972027, -1.006149, -1.039634,
442
+ -1.076135, -1.112156, -1.148490, -1.188312, -1.226761, -1.266821, -1.309156, -1.350583, -1.395223, -1.440028,
443
+ -1.485047, -1.534104, -1.582023, -1.631506, -1.684031, -1.735687, -1.790421, -1.846039, -1.901951, -1.961872,
444
+ -2.021179, -2.081987, -2.146259, -2.210031, -2.276609, -2.344904, -2.413795, -2.486559, -2.559564, -2.634215,
445
+ -2.712692, -2.791289, -2.872533, -2.956217, -3.040965, -3.129234, -3.218545, -3.309805, -3.404827, -3.5008,
446
+ -3.601, -3.7, -3.8,
447
+ ]);
448
+
449
+ /* corrections for mean lunar apsides in degrees, from -13100 to 17200,
450
+ * in 100-year steps. corrections are set to 0 between the years 0 and 3000 */
451
+ const mean_apsis_corr: Float64Array = new Float64Array([
452
+ 7.525,
453
+ 7.290, 7.057295, 6.830813, 6.611723, 6.396775, 6.189569, 5.985968, 5.788342, 5.597304, 5.410167,
454
+ 5.229946, 5.053389, 4.882187, 4.716494, 4.553532, 4.396734, 4.243718, 4.094282, 3.950865, 3.810366,
455
+ 3.674978, 3.543284, 3.414270, 3.290526, 3.168775, 3.050904, 2.937541, 2.826189, 2.719822, 2.616193,
456
+ 2.515431, 2.419193, 2.323782, 2.232545, 2.143635, 2.056803, 1.974913, 1.893874, 1.816201, 1.741957,
457
+ 1.668083, 1.598335, 1.529645, 1.463016, 1.399693, 1.336905, 1.278097, 1.220965, 1.165092, 1.113071,
458
+ 1.060858, 1.011007, 0.963701, 0.916523, 0.872887, 0.829596, 0.788486, 0.750017, 0.711177, 0.675589,
459
+ 0.640303, 0.605303, 0.573490, 0.541113, 0.511482, 0.483159, 0.455210, 0.430305, 0.404643, 0.380782,
460
+ 0.358524, 0.335405, 0.315244, 0.295131, 0.275766, 0.259223, 0.241586, 0.225890, 0.210404, 0.194775,
461
+ 0.181573, 0.167246, 0.154514, 0.143435, 0.131131, 0.121648, 0.111835, 0.102474, 0.094284, 0.085204,
462
+ 0.078240, 0.070697, 0.063696, 0.058894, 0.052390, 0.047632, 0.043129, 0.037823, 0.034143, 0.029188,
463
+ 0.025648, 0.021972, 0.018348, 0.017127, 0.013989, 0.011967, 0.011003, 0.007865, 0.007033, 0.005574,
464
+ 0.004060, 0.003699, 0.002465, 0.002889, 0.002144, 0.001018, 0.001757, -9.67e-05, -0.000734, -0.000392,
465
+ -0.001546, -0.000863, -0.001266, -0.000933, -0.000503, -0.001304, 0.000238, -0.000507, -0.000897, 0.000647,
466
+ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
467
+ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
468
+ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
469
+ 0.000514, 0.000683, 0.002228, 0.001974, 0.003485, 0.004280, 0.005409, 0.007468, 0.007938, 0.011012,
470
+ 0.012525, 0.013757, 0.016757, 0.017932, 0.020780, 0.023416, 0.026386, 0.030428, 0.033512, 0.038789,
471
+ 0.043126, 0.047778, 0.054175, 0.058891, 0.065878, 0.072345, 0.079668, 0.088238, 0.095307, 0.104873,
472
+ 0.113533, 0.122336, 0.133205, 0.142922, 0.154871, 0.166488, 0.179234, 0.193928, 0.207262, 0.223089,
473
+ 0.238736, 0.254907, 0.273232, 0.291085, 0.311046, 0.331025, 0.351955, 0.374422, 0.396341, 0.420772,
474
+ 0.444867, 0.469984, 0.497448, 0.524717, 0.554752, 0.584581, 0.616272, 0.649744, 0.682947, 0.719405,
475
+ 0.755834, 0.793780, 0.833875, 0.873893, 0.917340, 0.960429, 1.005471, 1.052384, 1.099317, 1.149508,
476
+ 1.200130, 1.253038, 1.307672, 1.363480, 1.422592, 1.481900, 1.544111, 1.607982, 1.672954, 1.741025,
477
+ 1.809727, 1.882038, 1.955243, 2.029956, 2.108428, 2.186805, 2.268697, 2.352071, 2.437370, 2.525903,
478
+ 2.615415, 2.709082, 2.804198, 2.901704, 3.002606, 3.104412, 3.210406, 3.317733, 3.428386, 3.541634,
479
+ 3.656634, 3.775988, 3.896306, 4.020480, 4.146814, 4.275356, 4.408257, 4.542282, 4.681174, 4.822524,
480
+ 4.966424, 5.114948, 5.264973, 5.419906, 5.577056, 5.737688, 5.902347, 6.069138, 6.241065, 6.415155,
481
+ 6.593317, 6.774853, 6.959322, 7.148845, 7.340334, 7.537156, 7.737358, 7.940882, 8.149932, 8.361576,
482
+ 8.579150, 8.799591, 9.024378, 9.254584, 9.487362, 9.726535, 9.968784, 10.216089, 10.467716, 10.725293,
483
+ 10.986, 11.25, 11.52,
484
+ ]);
485
+
486
+ /* =====================================================================
487
+ * Module-level mutable state (C: static TLS variables)
488
+ * ===================================================================== */
489
+
490
+ const ss: number[][] = [
491
+ [0, 0, 0, 0, 0, 0, 0, 0],
492
+ [0, 0, 0, 0, 0, 0, 0, 0],
493
+ [0, 0, 0, 0, 0, 0, 0, 0],
494
+ [0, 0, 0, 0, 0, 0, 0, 0],
495
+ [0, 0, 0, 0, 0, 0, 0, 0],
496
+ ];
497
+ const cc: number[][] = [
498
+ [0, 0, 0, 0, 0, 0, 0, 0],
499
+ [0, 0, 0, 0, 0, 0, 0, 0],
500
+ [0, 0, 0, 0, 0, 0, 0, 0],
501
+ [0, 0, 0, 0, 0, 0, 0, 0],
502
+ [0, 0, 0, 0, 0, 0, 0, 0],
503
+ ];
504
+
505
+ let l = 0; /* Moon's ecliptic longitude */
506
+ let B = 0; /* Ecliptic latitude */
507
+ let moonpol = [0.0, 0.0, 0.0];
508
+
509
+ /* Orbit calculation begins */
510
+ let SWELP = 0;
511
+ let M = 0;
512
+ let MP = 0;
513
+ let D = 0;
514
+ let NF = 0;
515
+ let T = 0;
516
+ let T2 = 0;
517
+ let T3 = 0;
518
+ let T4 = 0;
519
+ let f = 0;
520
+ let g = 0;
521
+ let Ve = 0;
522
+ let Ea = 0;
523
+ let Ma = 0;
524
+ let Ju = 0;
525
+ let Sa = 0;
526
+ let cg = 0;
527
+ let sg = 0;
528
+ let l1 = 0;
529
+ let l2 = 0;
530
+ let l3 = 0;
531
+ let l4 = 0;
532
+
533
+ /* =====================================================================
534
+ * Internal helper functions
535
+ * ===================================================================== */
536
+
537
+ /** Reduce arc seconds modulo 360 degrees. Answer in arc seconds. */
538
+ function mods3600(x: number): number {
539
+ return x - 1296000.0 * Math.floor(x / 1296000.0);
540
+ }
541
+
542
+ /** Compute mean elements (T must be set before calling) */
543
+ function meanElements(): void {
544
+ const fracT = T - Math.trunc(T); /* fmod(T, 1) */
545
+ /* Mean anomaly of sun = l' (J. Laskar) */
546
+ M = mods3600(129600000.0 * fracT - 3418.961646 * T + 1287104.76154);
547
+ M += ((((((((
548
+ 1.62e-20 * T
549
+ - 1.0390e-17) * T
550
+ - 3.83508e-15) * T
551
+ + 4.237343e-13) * T
552
+ + 8.8555011e-11) * T
553
+ - 4.77258489e-8) * T
554
+ - 1.1297037031e-5) * T
555
+ + 1.4732069041e-4) * T
556
+ - 0.552891801772) * T2;
557
+ /* DE404: Mean distance of moon from its ascending node = F */
558
+ NF = mods3600(1739232000.0 * fracT + 295263.0983 * T - 2.079419901760e-01 * T + 335779.55755);
559
+ /* Mean anomaly of moon = l */
560
+ MP = mods3600(1717200000.0 * fracT + 715923.4728 * T - 2.035946368532e-01 * T + 485868.28096);
561
+ /* Mean elongation of moon = D */
562
+ D = mods3600(1601856000.0 * fracT + 1105601.4603 * T + 3.962893294503e-01 * T + 1072260.73512);
563
+ /* Mean longitude of moon, referred to mean ecliptic and equinox of date */
564
+ SWELP = mods3600(1731456000.0 * fracT + 1108372.83264 * T - 6.784914260953e-01 * T + 785939.95571);
565
+ /* Higher degree secular terms found by least squares fit */
566
+ NF += ((z[2] * T + z[1]) * T + z[0]) * T2;
567
+ MP += ((z[5] * T + z[4]) * T + z[3]) * T2;
568
+ D += ((z[8] * T + z[7]) * T + z[6]) * T2;
569
+ SWELP += ((z[11] * T + z[10]) * T + z[9]) * T2;
570
+ }
571
+
572
+ /** Compute planetary mean longitudes */
573
+ function meanElementsPl(): void {
574
+ /* Mean longitudes of planets (Laskar, Bretagnon) */
575
+ Ve = mods3600(210664136.4335482 * T + 655127.283046);
576
+ Ve += ((((((((
577
+ -9.36e-023 * T
578
+ - 1.95e-20) * T
579
+ + 6.097e-18) * T
580
+ + 4.43201e-15) * T
581
+ + 2.509418e-13) * T
582
+ - 3.0622898e-10) * T
583
+ - 2.26602516e-9) * T
584
+ - 1.4244812531e-5) * T
585
+ + 0.005871373088) * T2;
586
+ Ea = mods3600(129597742.26669231 * T + 361679.214649);
587
+ Ea += ((((((((-1.16e-22 * T
588
+ + 2.976e-19) * T
589
+ + 2.8460e-17) * T
590
+ - 1.08402e-14) * T
591
+ - 1.226182e-12) * T
592
+ + 1.7228268e-10) * T
593
+ + 1.515912254e-7) * T
594
+ + 8.863982531e-6) * T
595
+ - 2.0199859001e-2) * T2;
596
+ Ma = mods3600(68905077.59284 * T + 1279559.78866);
597
+ Ma += (-1.043e-5 * T + 9.38012e-3) * T2;
598
+ Ju = mods3600(10925660.428608 * T + 123665.342120);
599
+ Ju += (1.543273e-5 * T - 3.06037836351e-1) * T2;
600
+ Sa = mods3600(4399609.65932 * T + 180278.89694);
601
+ Sa += ((4.475946e-8 * T - 6.874806E-5) * T + 7.56161437443E-1) * T2;
602
+ }
603
+
604
+ /** Build sin/cos lookup table for multiple angles */
605
+ function sscc_fn(k: number, arg: number, n: number): void {
606
+ const su = Math.sin(arg);
607
+ const cu = Math.cos(arg);
608
+ ss[k][0] = su; /* sin(L) */
609
+ cc[k][0] = cu; /* cos(L) */
610
+ let sv = 2.0 * su * cu;
611
+ let cv = cu * cu - su * su;
612
+ ss[k][1] = sv; /* sin(2L) */
613
+ cc[k][1] = cv;
614
+ for (let i = 2; i < n; i++) {
615
+ const s = su * cv + cu * sv;
616
+ cv = cu * cv - su * sv;
617
+ sv = s;
618
+ ss[k][i] = sv; /* sin( i+1 L ) */
619
+ cc[k][i] = cv;
620
+ }
621
+ }
622
+
623
+ /** Step through the perturbation table */
624
+ function chewm(
625
+ pt: Int16Array, nlines: number, nangles: number,
626
+ typflg: number, ans: number[],
627
+ ): void {
628
+ let idx = 0;
629
+ for (let i = 0; i < nlines; i++) {
630
+ let k1 = 0;
631
+ let sv = 0.0;
632
+ let cv = 0.0;
633
+ for (let m = 0; m < nangles; m++) {
634
+ const j = pt[idx++]; /* multiple angle factor */
635
+ if (j) {
636
+ let k = j;
637
+ if (j < 0) k = -k; /* make angle factor > 0 */
638
+ /* sin, cos (k*angle) from lookup table */
639
+ let su = ss[m][k - 1];
640
+ const cu = cc[m][k - 1];
641
+ if (j < 0) su = -su; /* negative angle factor */
642
+ if (k1 === 0) {
643
+ /* Set sin, cos of first angle. */
644
+ sv = su;
645
+ cv = cu;
646
+ k1 = 1;
647
+ } else {
648
+ /* Combine angles by trigonometry. */
649
+ const ff = su * cv + cu * sv;
650
+ cv = cu * cv - su * sv;
651
+ sv = ff;
652
+ }
653
+ }
654
+ }
655
+ /* Accumulate */
656
+ let j: number, k: number;
657
+ switch (typflg) {
658
+ /* large longitude and radius */
659
+ case 1:
660
+ j = pt[idx++];
661
+ k = pt[idx++];
662
+ ans[0] += (10000.0 * j + k) * sv;
663
+ j = pt[idx++];
664
+ k = pt[idx++];
665
+ if (k) ans[2] += (10000.0 * j + k) * cv;
666
+ break;
667
+ /* longitude and radius */
668
+ case 2:
669
+ j = pt[idx++];
670
+ k = pt[idx++];
671
+ ans[0] += j * sv;
672
+ ans[2] += k * cv;
673
+ break;
674
+ /* large latitude */
675
+ case 3:
676
+ j = pt[idx++];
677
+ k = pt[idx++];
678
+ ans[1] += (10000.0 * j + k) * sv;
679
+ break;
680
+ /* latitude */
681
+ case 4:
682
+ j = pt[idx++];
683
+ ans[1] += j * sv;
684
+ break;
685
+ }
686
+ }
687
+ }
688
+
689
+ /* =====================================================================
690
+ * Moon computation phases (DE404 version)
691
+ * ===================================================================== */
692
+
693
+ function moon1(): void {
694
+ let a: number;
695
+ /* Initialize ss and cc arrays (fix by Bhanu Pinnamaneni) */
696
+ for (let i = 0; i < 5; i++) {
697
+ for (let j = 0; j < 8; j++) {
698
+ ss[i][j] = 0;
699
+ cc[i][j] = 0;
700
+ }
701
+ }
702
+ sscc_fn(0, STR * D, 6);
703
+ sscc_fn(1, STR * M, 4);
704
+ sscc_fn(2, STR * MP, 4);
705
+ sscc_fn(3, STR * NF, 4);
706
+ moonpol[0] = 0.0;
707
+ moonpol[1] = 0.0;
708
+ moonpol[2] = 0.0;
709
+ /* terms in T^2, scale 1.0 = 10^-5" */
710
+ chewm(LRT2, NLRT2, 4, 2, moonpol);
711
+ chewm(BT2, NBT2, 4, 4, moonpol);
712
+
713
+ f = 18 * Ve - 16 * Ea;
714
+
715
+ g = STR * (f - MP); /* 18V - 16E - l */
716
+ cg = Math.cos(g);
717
+ sg = Math.sin(g);
718
+ l = 6.367278 * cg + 12.747036 * sg; /* t^0 */
719
+ l1 = 23123.70 * cg - 10570.02 * sg; /* t^1 */
720
+ l2 = z[12] * cg + z[13] * sg; /* t^2 */
721
+ moonpol[2] += 5.01 * cg + 2.72 * sg;
722
+
723
+ g = STR * (10.0 * Ve - 3.0 * Ea - MP);
724
+ cg = Math.cos(g);
725
+ sg = Math.sin(g);
726
+ l += -0.253102 * cg + 0.503359 * sg;
727
+ l1 += 1258.46 * cg + 707.29 * sg;
728
+ l2 += z[14] * cg + z[15] * sg;
729
+
730
+ g = STR * (8.0 * Ve - 13.0 * Ea);
731
+ cg = Math.cos(g);
732
+ sg = Math.sin(g);
733
+ l += -0.187231 * cg - 0.127481 * sg;
734
+ l1 += -319.87 * cg - 18.34 * sg;
735
+ l2 += z[16] * cg + z[17] * sg;
736
+
737
+ a = 4.0 * Ea - 8.0 * Ma + 3.0 * Ju;
738
+ g = STR * a;
739
+ cg = Math.cos(g);
740
+ sg = Math.sin(g);
741
+ l += -0.866287 * cg + 0.248192 * sg;
742
+ l1 += 41.87 * cg + 1053.97 * sg;
743
+ l2 += z[18] * cg + z[19] * sg;
744
+
745
+ g = STR * (a - MP);
746
+ cg = Math.cos(g);
747
+ sg = Math.sin(g);
748
+ l += -0.165009 * cg + 0.044176 * sg;
749
+ l1 += 4.67 * cg + 201.55 * sg;
750
+
751
+ g = STR * f; /* 18V - 16E */
752
+ cg = Math.cos(g);
753
+ sg = Math.sin(g);
754
+ l += 0.330401 * cg + 0.661362 * sg;
755
+ l1 += 1202.67 * cg - 555.59 * sg;
756
+ l2 += z[20] * cg + z[21] * sg;
757
+
758
+ g = STR * (f - 2.0 * MP); /* 18V - 16E - 2l */
759
+ cg = Math.cos(g);
760
+ sg = Math.sin(g);
761
+ l += 0.352185 * cg + 0.705041 * sg;
762
+ l1 += 1283.59 * cg - 586.43 * sg;
763
+
764
+ g = STR * (2.0 * Ju - 5.0 * Sa);
765
+ cg = Math.cos(g);
766
+ sg = Math.sin(g);
767
+ l += -0.034700 * cg + 0.160041 * sg;
768
+ l2 += z[22] * cg + z[23] * sg;
769
+
770
+ g = STR * (SWELP - NF);
771
+ cg = Math.cos(g);
772
+ sg = Math.sin(g);
773
+ l += 0.000116 * cg + 7.063040 * sg;
774
+ l1 += 298.8 * sg;
775
+
776
+ /* T^3 terms */
777
+ sg = Math.sin(STR * M);
778
+ /* l3 not initialized in original! Fixed: */
779
+ l3 = z[24] * sg;
780
+ l4 = 0;
781
+
782
+ g = STR * (2.0 * D - M);
783
+ sg = Math.sin(g);
784
+ cg = Math.cos(g);
785
+ moonpol[2] += -0.2655 * cg * T;
786
+
787
+ g = STR * (M - MP);
788
+ moonpol[2] += -0.1568 * Math.cos(g) * T;
789
+
790
+ g = STR * (M + MP);
791
+ moonpol[2] += 0.1309 * Math.cos(g) * T;
792
+
793
+ g = STR * (2.0 * (D + M) - MP);
794
+ sg = Math.sin(g);
795
+ cg = Math.cos(g);
796
+ moonpol[2] += 0.5568 * cg * T;
797
+
798
+ l2 += moonpol[0];
799
+
800
+ g = STR * (2.0 * D - M - MP);
801
+ moonpol[2] += -0.1910 * Math.cos(g) * T;
802
+
803
+ moonpol[1] *= T;
804
+ moonpol[2] *= T;
805
+
806
+ /* terms in T */
807
+ moonpol[0] = 0.0;
808
+ chewm(BT, NBT, 4, 4, moonpol);
809
+ chewm(LRT, NLRT, 4, 1, moonpol);
810
+
811
+ g = STR * (f - MP - NF - 2355767.6); /* 18V - 16E - l - F */
812
+ moonpol[1] += -1127.0 * Math.sin(g);
813
+ g = STR * (f - MP + NF - 235353.6); /* 18V - 16E - l + F */
814
+ moonpol[1] += -1123.0 * Math.sin(g);
815
+ g = STR * (Ea + D + 51987.6);
816
+ moonpol[1] += 1303.0 * Math.sin(g);
817
+ g = STR * SWELP;
818
+ moonpol[1] += 342.0 * Math.sin(g);
819
+
820
+ g = STR * (2.0 * Ve - 3.0 * Ea);
821
+ cg = Math.cos(g);
822
+ sg = Math.sin(g);
823
+ l += -0.343550 * cg - 0.000276 * sg;
824
+ l1 += 105.90 * cg + 336.53 * sg;
825
+
826
+ g = STR * (f - 2.0 * D); /* 18V - 16E - 2D */
827
+ cg = Math.cos(g);
828
+ sg = Math.sin(g);
829
+ l += 0.074668 * cg + 0.149501 * sg;
830
+ l1 += 271.77 * cg - 124.20 * sg;
831
+
832
+ g = STR * (f - 2.0 * D - MP);
833
+ cg = Math.cos(g);
834
+ sg = Math.sin(g);
835
+ l += 0.073444 * cg + 0.147094 * sg;
836
+ l1 += 265.24 * cg - 121.16 * sg;
837
+
838
+ g = STR * (f + 2.0 * D - MP);
839
+ cg = Math.cos(g);
840
+ sg = Math.sin(g);
841
+ l += 0.072844 * cg + 0.145829 * sg;
842
+ l1 += 265.18 * cg - 121.29 * sg;
843
+
844
+ g = STR * (f + 2.0 * (D - MP));
845
+ cg = Math.cos(g);
846
+ sg = Math.sin(g);
847
+ l += 0.070201 * cg + 0.140542 * sg;
848
+ l1 += 255.36 * cg - 116.79 * sg;
849
+
850
+ g = STR * (Ea + D - NF);
851
+ cg = Math.cos(g);
852
+ sg = Math.sin(g);
853
+ l += 0.288209 * cg - 0.025901 * sg;
854
+ l1 += -63.51 * cg - 240.14 * sg;
855
+
856
+ g = STR * (2.0 * Ea - 3.0 * Ju + 2.0 * D - MP);
857
+ cg = Math.cos(g);
858
+ sg = Math.sin(g);
859
+ l += 0.077865 * cg + 0.438460 * sg;
860
+ l1 += 210.57 * cg + 124.84 * sg;
861
+
862
+ g = STR * (Ea - 2.0 * Ma);
863
+ cg = Math.cos(g);
864
+ sg = Math.sin(g);
865
+ l += -0.216579 * cg + 0.241702 * sg;
866
+ l1 += 197.67 * cg + 125.23 * sg;
867
+
868
+ g = STR * (a + MP);
869
+ cg = Math.cos(g);
870
+ sg = Math.sin(g);
871
+ l += -0.165009 * cg + 0.044176 * sg;
872
+ l1 += 4.67 * cg + 201.55 * sg;
873
+
874
+ g = STR * (a + 2.0 * D - MP);
875
+ cg = Math.cos(g);
876
+ sg = Math.sin(g);
877
+ l += -0.133533 * cg + 0.041116 * sg;
878
+ l1 += 6.95 * cg + 187.07 * sg;
879
+
880
+ g = STR * (a - 2.0 * D + MP);
881
+ cg = Math.cos(g);
882
+ sg = Math.sin(g);
883
+ l += -0.133430 * cg + 0.041079 * sg;
884
+ l1 += 6.28 * cg + 169.08 * sg;
885
+
886
+ g = STR * (3.0 * Ve - 4.0 * Ea);
887
+ cg = Math.cos(g);
888
+ sg = Math.sin(g);
889
+ l += -0.175074 * cg + 0.003035 * sg;
890
+ l1 += 49.17 * cg + 150.57 * sg;
891
+
892
+ g = STR * (2.0 * (Ea + D - MP) - 3.0 * Ju + 213534.0);
893
+ l1 += 158.4 * Math.sin(g);
894
+
895
+ l1 += moonpol[0];
896
+
897
+ a = 0.1 * T; /* set amplitude scale of 1.0 = 10^-4 arcsec */
898
+ moonpol[1] *= a;
899
+ moonpol[2] *= a;
900
+ }
901
+
902
+ function moon2(): void {
903
+ /* terms in T^0 */
904
+ g = STR * (2 * (Ea - Ju + D) - MP + 648431.172);
905
+ l += 1.14307 * Math.sin(g);
906
+ g = STR * (Ve - Ea + 648035.568);
907
+ l += 0.82155 * Math.sin(g);
908
+ g = STR * (3 * (Ve - Ea) + 2 * D - MP + 647933.184);
909
+ l += 0.64371 * Math.sin(g);
910
+ g = STR * (Ea - Ju + 4424.04);
911
+ l += 0.63880 * Math.sin(g);
912
+ g = STR * (SWELP + MP - NF + 4.68);
913
+ l += 0.49331 * Math.sin(g);
914
+ g = STR * (SWELP - MP - NF + 4.68);
915
+ l += 0.4914 * Math.sin(g);
916
+ g = STR * (SWELP + NF + 2.52);
917
+ l += 0.36061 * Math.sin(g);
918
+ g = STR * (2.0 * Ve - 2.0 * Ea + 736.2);
919
+ l += 0.30154 * Math.sin(g);
920
+ g = STR * (2.0 * Ea - 3.0 * Ju + 2.0 * D - 2.0 * MP + 36138.2);
921
+ l += 0.28282 * Math.sin(g);
922
+ g = STR * (2.0 * Ea - 2.0 * Ju + 2.0 * D - 2.0 * MP + 311.0);
923
+ l += 0.24516 * Math.sin(g);
924
+ g = STR * (Ea - Ju - 2.0 * D + MP + 6275.88);
925
+ l += 0.21117 * Math.sin(g);
926
+ g = STR * (2.0 * (Ea - Ma) - 846.36);
927
+ l += 0.19444 * Math.sin(g);
928
+ g = STR * (2.0 * (Ea - Ju) + 1569.96);
929
+ l -= 0.18457 * Math.sin(g);
930
+ g = STR * (2.0 * (Ea - Ju) - MP - 55.8);
931
+ l += 0.18256 * Math.sin(g);
932
+ g = STR * (Ea - Ju - 2.0 * D + 6490.08);
933
+ l += 0.16499 * Math.sin(g);
934
+ g = STR * (Ea - 2.0 * Ju - 212378.4);
935
+ l += 0.16427 * Math.sin(g);
936
+ g = STR * (2.0 * (Ve - Ea - D) + MP + 1122.48);
937
+ l += 0.16088 * Math.sin(g);
938
+ g = STR * (Ve - Ea - MP + 32.04);
939
+ l -= 0.15350 * Math.sin(g);
940
+ g = STR * (Ea - Ju - MP + 4488.88);
941
+ l += 0.14346 * Math.sin(g);
942
+ g = STR * (2.0 * (Ve - Ea + D) - MP - 8.64);
943
+ l += 0.13594 * Math.sin(g);
944
+ g = STR * (2.0 * (Ve - Ea - D) + 1319.76);
945
+ l += 0.13432 * Math.sin(g);
946
+ g = STR * (Ve - Ea - 2.0 * D + MP - 56.16);
947
+ l -= 0.13122 * Math.sin(g);
948
+ g = STR * (Ve - Ea + MP + 54.36);
949
+ l -= 0.12722 * Math.sin(g);
950
+ g = STR * (3.0 * (Ve - Ea) - MP + 433.8);
951
+ l += 0.12539 * Math.sin(g);
952
+ g = STR * (Ea - Ju + MP + 4002.12);
953
+ l += 0.10994 * Math.sin(g);
954
+ g = STR * (20.0 * Ve - 21.0 * Ea - 2.0 * D + MP - 317511.72);
955
+ l += 0.10652 * Math.sin(g);
956
+ g = STR * (26.0 * Ve - 29.0 * Ea - MP + 270002.52);
957
+ l += 0.10490 * Math.sin(g);
958
+ g = STR * (3.0 * Ve - 4.0 * Ea + D - MP - 322765.56);
959
+ l += 0.10386 * Math.sin(g);
960
+
961
+ g = STR * (SWELP + 648002.556);
962
+ B = 8.04508 * Math.sin(g);
963
+ g = STR * (Ea + D + 996048.252);
964
+ B += 1.51021 * Math.sin(g);
965
+ g = STR * (f - MP + NF + 95554.332);
966
+ B += 0.63037 * Math.sin(g);
967
+ g = STR * (f - MP - NF + 95553.792);
968
+ B += 0.63014 * Math.sin(g);
969
+ g = STR * (SWELP - MP + 2.9);
970
+ B += 0.45587 * Math.sin(g);
971
+ g = STR * (SWELP + MP + 2.5);
972
+ B += -0.41573 * Math.sin(g);
973
+ g = STR * (SWELP - 2.0 * NF + 3.2);
974
+ B += 0.32623 * Math.sin(g);
975
+ g = STR * (SWELP - 2.0 * D + 2.5);
976
+ B += 0.29855 * Math.sin(g);
977
+ }
978
+
979
+ function moon3(): void {
980
+ /* terms in T^0 */
981
+ moonpol[0] = 0.0;
982
+ chewm(LR, NLR, 4, 1, moonpol);
983
+ chewm(MB, NMB, 4, 3, moonpol);
984
+ l += (((l4 * T + l3) * T + l2) * T + l1) * T * 1.0e-5;
985
+ moonpol[0] = SWELP + l + 1.0e-4 * moonpol[0];
986
+ moonpol[1] = 1.0e-4 * moonpol[1] + B;
987
+ moonpol[2] = 1.0e-4 * moonpol[2] + 385000.52899; /* kilometers */
988
+ }
989
+
990
+ /** Compute final ecliptic polar coordinates */
991
+ function moon4(): void {
992
+ moonpol[2] /= AUNIT / 1000;
993
+ moonpol[0] = STR * mods3600(moonpol[0]);
994
+ moonpol[1] = STR * moonpol[1];
995
+ B = moonpol[1];
996
+ }
997
+
998
+ /* =====================================================================
999
+ * Ecliptic of date → equatorial J2000 conversion
1000
+ * ===================================================================== */
1001
+
1002
+ function ecldatEqu2000(swed: SweData, tjd: number, xpm: Float64Array | number[]): void {
1003
+ /* cartesian */
1004
+ swiPolcart(xpm, xpm);
1005
+ /* equatorial */
1006
+ swiCoortrf2(xpm, xpm, -swed.oec.seps, swed.oec.ceps);
1007
+ /* j2000 */
1008
+ swiPrecess(xpm, tjd, 0, J_TO_J2000, swed);
1009
+ }
1010
+
1011
+ /* =====================================================================
1012
+ * Correction functions for mean node and apogee
1013
+ * ===================================================================== */
1014
+
1015
+ const CORR_MNODE_JD_T0GREG = -3063616.5; /* 1 jan -13100 greg. */
1016
+
1017
+ function corrMeanNode(J: number): number {
1018
+ const J0 = CORR_MNODE_JD_T0GREG;
1019
+ const dayscty = 36524.25;
1020
+ if (J < JPL_DE431_START) return 0;
1021
+ if (J > JPL_DE431_END) return 0;
1022
+ const dJ = J - J0;
1023
+ const i = Math.floor(dJ / dayscty);
1024
+ const dfrac = (dJ - i * dayscty) / dayscty;
1025
+ const dcor0 = mean_node_corr[i];
1026
+ const dcor1 = mean_node_corr[i + 1];
1027
+ return dcor0 + dfrac * (dcor1 - dcor0);
1028
+ }
1029
+
1030
+ const CORR_MAPOG_JD_T0GREG = -3063616.5; /* 1 jan -13100 greg. */
1031
+
1032
+ function corrMeanApog(J: number): number {
1033
+ const J0 = CORR_MAPOG_JD_T0GREG;
1034
+ const dayscty = 36524.25;
1035
+ if (J < JPL_DE431_START) return 0;
1036
+ if (J > JPL_DE431_END) return 0;
1037
+ const dJ = J - J0;
1038
+ const i = Math.floor(dJ / dayscty);
1039
+ const dfrac = (dJ - i * dayscty) / dayscty;
1040
+ const dcor0 = mean_apsis_corr[i];
1041
+ const dcor1 = mean_apsis_corr[i + 1];
1042
+ return dcor0 + dfrac * (dcor1 - dcor0);
1043
+ }
1044
+
1045
+ /* =====================================================================
1046
+ * Public exported functions
1047
+ * ===================================================================== */
1048
+
1049
+ /**
1050
+ * Calculate geometric coordinates of Moon without light time or
1051
+ * nutation correction.
1052
+ *
1053
+ * @param J Julian Ephemeris Date
1054
+ * @param pol output array: pol[0]=lon, pol[1]=lat, pol[2]=radius (radians, au)
1055
+ * @returns 0 (OK)
1056
+ */
1057
+ export function swiMoshmoon2(J: number, pol: Float64Array | number[]): number {
1058
+ T = (J - J2000) / 36525.0;
1059
+ T2 = T * T;
1060
+ meanElements();
1061
+ meanElementsPl();
1062
+ moon1();
1063
+ moon2();
1064
+ moon3();
1065
+ moon4();
1066
+ for (let i = 0; i < 3; i++) {
1067
+ pol[i] = moonpol[i];
1068
+ }
1069
+ return 0;
1070
+ }
1071
+
1072
+ /**
1073
+ * Moshier's moon with speed computation.
1074
+ *
1075
+ * @param swed SweData state
1076
+ * @param tjd Julian day
1077
+ * @param doSave if true, save into swed.pldat[SEI_MOON]
1078
+ * @param xpmret optional output array (6 doubles) for position+speed
1079
+ * @returns OK or ERR
1080
+ */
1081
+ export function swiMoshmoon(
1082
+ swed: SweData, tjd: number, doSave: boolean,
1083
+ xpmret: Float64Array | number[] | null, serr?: string[],
1084
+ ): number {
1085
+ const pdp = swed.pldat[SEI_MOON];
1086
+ let xpm: Float64Array | number[];
1087
+ const xx = new Float64Array(6);
1088
+ if (doSave) {
1089
+ xpm = pdp.x;
1090
+ } else {
1091
+ xpm = xx;
1092
+ }
1093
+ /* allow 0.2 day tolerance so that true node interval fits in */
1094
+ if (tjd < MOSHLUEPH_START - 0.2 || tjd > MOSHLUEPH_END + 0.2) {
1095
+ if (serr != null) {
1096
+ serr[0] = (serr[0] || '') +
1097
+ `jd ${tjd} outside Moshier's Moon range ${MOSHLUEPH_START.toFixed(2)} .. ${MOSHLUEPH_END.toFixed(2)} `;
1098
+ }
1099
+ return ERR;
1100
+ }
1101
+ /* if moon has already been computed */
1102
+ if (tjd === pdp.teval && pdp.iephe === SEFLG_MOSEPH) {
1103
+ if (xpmret != null) {
1104
+ for (let i = 0; i <= 5; i++) xpmret[i] = pdp.x[i];
1105
+ }
1106
+ return OK;
1107
+ }
1108
+ /* else compute moon */
1109
+ swiMoshmoon2(tjd, xpm);
1110
+ if (doSave) {
1111
+ pdp.teval = tjd;
1112
+ pdp.xflgs = -1;
1113
+ pdp.iephe = SEFLG_MOSEPH;
1114
+ }
1115
+ /* Moshier moon is referred to ecliptic of date. But we need
1116
+ * equatorial positions for several reasons. */
1117
+ ecldatEqu2000(swed, tjd, xpm);
1118
+ /* speed from 2 other positions */
1119
+ const x1 = new Float64Array(6);
1120
+ const x2 = new Float64Array(6);
1121
+ let t = tjd + MOON_SPEED_INTV;
1122
+ swiMoshmoon2(t, x1);
1123
+ ecldatEqu2000(swed, t, x1);
1124
+ t = tjd - MOON_SPEED_INTV;
1125
+ swiMoshmoon2(t, x2);
1126
+ ecldatEqu2000(swed, t, x2);
1127
+ for (let i = 0; i <= 2; i++) {
1128
+ const b = (x1[i] - x2[i]) / 2;
1129
+ const a = (x1[i] + x2[i]) / 2 - xpm[i];
1130
+ xpm[i + 3] = (2 * a + b) / MOON_SPEED_INTV;
1131
+ }
1132
+ if (xpmret != null) {
1133
+ for (let i = 0; i <= 5; i++) xpmret[i] = xpm[i];
1134
+ }
1135
+ return OK;
1136
+ }
1137
+
1138
+ /**
1139
+ * Mean lunar node.
1140
+ *
1141
+ * @param J Julian day
1142
+ * @param pol output array for position (polar ecliptic of date)
1143
+ * @returns OK or ERR
1144
+ */
1145
+ export function swiMeanNode(
1146
+ J: number, pol: Float64Array | number[], serr?: string[],
1147
+ ): number {
1148
+ T = (J - J2000) / 36525.0;
1149
+ T2 = T * T;
1150
+ T3 = T * T2;
1151
+ T4 = T2 * T2;
1152
+ if (J < MOSHNDEPH_START || J > MOSHNDEPH_END) {
1153
+ if (serr != null) {
1154
+ serr[0] = (serr[0] || '') +
1155
+ `jd ${J} outside mean node range ${MOSHNDEPH_START.toFixed(2)} .. ${MOSHNDEPH_END.toFixed(2)} `;
1156
+ }
1157
+ return ERR;
1158
+ }
1159
+ meanElements();
1160
+ const dcor = corrMeanNode(J) * 3600;
1161
+ /* longitude */
1162
+ pol[0] = swiMod2PI((SWELP - NF - dcor) * STR);
1163
+ /* latitude */
1164
+ pol[1] = 0.0;
1165
+ /* distance */
1166
+ pol[2] = MOON_MEAN_DIST / AUNIT; /* or should it be derived from mean orbital ellipse? */
1167
+ return OK;
1168
+ }
1169
+
1170
+ /**
1171
+ * Mean lunar apogee (dark moon, Lilith).
1172
+ *
1173
+ * @param J Julian day
1174
+ * @param pol output array for position (polar ecliptic of date)
1175
+ * @returns OK or ERR
1176
+ */
1177
+ export function swiMeanApog(
1178
+ J: number, pol: Float64Array | number[], serr?: string[],
1179
+ ): number {
1180
+ T = (J - J2000) / 36525.0;
1181
+ T2 = T * T;
1182
+ T3 = T * T2;
1183
+ T4 = T2 * T2;
1184
+ if (J < MOSHNDEPH_START || J > MOSHNDEPH_END) {
1185
+ if (serr != null) {
1186
+ serr[0] = (serr[0] || '') +
1187
+ `jd ${J} outside mean apogee range ${MOSHNDEPH_START.toFixed(2)} .. ${MOSHNDEPH_END.toFixed(2)} `;
1188
+ }
1189
+ return ERR;
1190
+ }
1191
+ meanElements();
1192
+ pol[0] = swiMod2PI((SWELP - MP) * STR + PI);
1193
+ pol[1] = 0;
1194
+ pol[2] = MOON_MEAN_DIST * (1 + MOON_MEAN_ECC) / AUNIT; /* apogee */
1195
+ /* Lilith / Dark Moon projection onto ecliptic */
1196
+ let dcor = corrMeanApog(J) * DEGTORAD;
1197
+ pol[0] = swiMod2PI(pol[0] - dcor);
1198
+ /* apogee is now projected onto ecliptic */
1199
+ let node = (SWELP - NF) * STR;
1200
+ dcor = corrMeanNode(J) * DEGTORAD;
1201
+ node = swiMod2PI(node - dcor);
1202
+ pol[0] = swiMod2PI(pol[0] - node);
1203
+ swiPolcart(pol, pol);
1204
+ swiCoortrf(pol, pol, -MOON_MEAN_INCL * DEGTORAD);
1205
+ swiCartpol(pol, pol);
1206
+ pol[0] = swiMod2PI(pol[0] + node);
1207
+ return OK;
1208
+ }
1209
+
1210
+ /**
1211
+ * Mean lunar elements (node, dnode, perigee, dperigee).
1212
+ *
1213
+ * @param tjd Julian day
1214
+ * @returns object with node, dnode, peri, dperi in degrees
1215
+ */
1216
+ export function swiMeanLunarElements(
1217
+ tjd: number,
1218
+ ): { node: number; dnode: number; peri: number; dperi: number } {
1219
+ T = (tjd - J2000) / 36525.0;
1220
+ T2 = T * T;
1221
+ meanElements();
1222
+ let node = sweDegnorm((SWELP - NF) * STR * RADTODEG);
1223
+ let peri = sweDegnorm((SWELP - MP) * STR * RADTODEG);
1224
+ T -= 1.0 / 36525;
1225
+ meanElements();
1226
+ let dnode = sweDegnorm(node - (SWELP - NF) * STR * RADTODEG);
1227
+ dnode -= 360;
1228
+ const dperi = sweDegnorm(peri - (SWELP - MP) * STR * RADTODEG);
1229
+ let dcor = corrMeanNode(tjd);
1230
+ node = sweDegnorm(node - dcor);
1231
+ dcor = corrMeanApog(tjd);
1232
+ peri = sweDegnorm(peri - dcor);
1233
+ return { node, dnode, peri, dperi };
1234
+ }
1235
+
1236
+ /**
1237
+ * Calculate geometric coordinates of true interpolated Moon apsides.
1238
+ *
1239
+ * @param J Julian day
1240
+ * @param pol output array (3 doubles)
1241
+ * @param ipli SEI_INTP_APOG or SEI_INTP_PERG
1242
+ * @returns 0
1243
+ */
1244
+ export function swiIntpApsides(
1245
+ J: number, pol: Float64Array | number[], ipli: number,
1246
+ ): number {
1247
+ const rsv = [0.0, 0.0, 0.0];
1248
+ const zMP = 27.55454988;
1249
+ const fNF = 27.212220817 / zMP;
1250
+ const fD = 29.530588835 / zMP;
1251
+ const fLP = 27.321582 / zMP;
1252
+ const fM = 365.2596359 / zMP;
1253
+ const fVe = 224.7008001 / zMP;
1254
+ const fEa = 365.2563629 / zMP;
1255
+ const fMa = 686.9798519 / zMP;
1256
+ const fJu = 4332.589348 / zMP;
1257
+ const fSa = 10759.22722 / zMP;
1258
+
1259
+ T = (J - J2000) / 36525.0;
1260
+ T2 = T * T;
1261
+ T4 = T2 * T2;
1262
+ meanElements();
1263
+ meanElementsPl();
1264
+
1265
+ const sNF = mods3600(NF);
1266
+ const sD = mods3600(D);
1267
+ const sLP = mods3600(SWELP);
1268
+ const sMP = mods3600(MP);
1269
+ const sM = M;
1270
+ const sVe = Ve;
1271
+ const sEa = Ea;
1272
+ const sMa = Ma;
1273
+ const sJu = Ju;
1274
+ const sSa = Sa;
1275
+
1276
+ let niter = 4;
1277
+ if (ipli === SEI_INTP_PERG) { MP = 0.0; niter = 5; }
1278
+ if (ipli === SEI_INTP_APOG) { MP = 648000.0; niter = 4; }
1279
+
1280
+ let cMP = 0;
1281
+ let dd = 18000.0;
1282
+ let mMP = 0, mLP = 0, mNF = 0, mD = 0;
1283
+
1284
+ for (let iii = 0; iii <= niter; iii++) {
1285
+ const dMP = sMP - MP;
1286
+ mLP = sLP - dMP;
1287
+ mNF = sNF - dMP;
1288
+ mD = sD - dMP;
1289
+ mMP = sMP - dMP;
1290
+ for (let ii = 0; ii <= 2; ii++) {
1291
+ MP = mMP + (ii - 1) * dd;
1292
+ NF = mNF + (ii - 1) * dd / fNF;
1293
+ D = mD + (ii - 1) * dd / fD;
1294
+ SWELP = mLP + (ii - 1) * dd / fLP;
1295
+ M = sM + (ii - 1) * dd / fM;
1296
+ Ve = sVe + (ii - 1) * dd / fVe;
1297
+ Ea = sEa + (ii - 1) * dd / fEa;
1298
+ Ma = sMa + (ii - 1) * dd / fMa;
1299
+ Ju = sJu + (ii - 1) * dd / fJu;
1300
+ Sa = sSa + (ii - 1) * dd / fSa;
1301
+ moon1();
1302
+ moon2();
1303
+ moon3();
1304
+ moon4();
1305
+ if (ii === 1) {
1306
+ for (let i = 0; i < 3; i++) pol[i] = moonpol[i];
1307
+ }
1308
+ rsv[ii] = moonpol[2];
1309
+ }
1310
+ cMP = (1.5 * rsv[0] - 2 * rsv[1] + 0.5 * rsv[2]) / (rsv[0] + rsv[2] - 2 * rsv[1]);
1311
+ cMP *= dd;
1312
+ cMP = cMP - dd;
1313
+ mMP += cMP;
1314
+ MP = mMP;
1315
+ dd /= 10;
1316
+ }
1317
+ return 0;
1318
+ }