UNPKG

8.16 kBJavaScriptView Raw
1/**
2 * @copyright 2013 Sonia Keys
3 * @copyright 2016 commenthol
4 * @license MIT
5 * @module jupiter
6 */
7/**
8 * Jupiter: Chapter 42, Ephemeris for Physical Observations of Jupiter.
9 */
10
11import base from './base';
12import nutation from './nutation';
13import planetposition from './planetposition';
14
15/**
16 * Physical computes quantities for physical observations of Jupiter.
17 *
18 * All angular results in radians.
19 *
20 * @param {number} jde - Julian ephemeris day
21 * @param {planetposition.Planet} earth
22 * @param {planetposition.Planet} jupiter
23 * @return {Array}
24 * {number} DS - Planetocentric declination of the Sun.
25 * {number} DE - Planetocentric declination of the Earth.
26 * {number} ω1 - Longitude of the System I central meridian of the illuminated disk,
27 * as seen from Earth.
28 * {number} ω2 - Longitude of the System II central meridian of the illuminated disk,
29 * as seen from Earth.
30 * {number} P - Geocentric position angle of Jupiter's northern rotation pole.
31 */
32export function physical(jde, earth, jupiter) {
33 // (jde float64, earth, jupiter *pp.V87Planet) (DS, DE, ω1, ω2, P float64)
34 // Step 1.0
35 var d = jde - 2433282.5;
36 var T1 = d / base.JulianCentury;
37 var p = Math.PI / 180;
38 var α0 = 268 * p + 0.1061 * p * T1;
39 var δ0 = 64.5 * p - 0.0164 * p * T1;
40 // Step 2.0
41 var W1 = 17.71 * p + 877.90003539 * p * d;
42 var W2 = 16.838 * p + 870.27003539 * p * d;
43 // Step 3.0
44 var pos = earth.position(jde);
45 var _ref = [pos.lon, pos.lat, pos.range],
46 l0 = _ref[0],
47 b0 = _ref[1],
48 R = _ref[2];
49
50 var fk5 = planetposition.toFK5(l0, b0, jde);
51 l0 = fk5.lon;
52 b0 = fk5.lat;
53 // Steps 4-7.
54
55 var _base$sincos = base.sincos(l0),
56 sl0 = _base$sincos[0],
57 cl0 = _base$sincos[1];
58
59 var sb0 = Math.sin(b0);
60 var Δ = 4.0; // surely better than 0.0
61
62 var l = void 0,
63 b = void 0,
64 r = void 0,
65 x = void 0,
66 y = void 0,
67 z = void 0;
68 var f = function f() {
69 var τ = base.lightTime(Δ);
70 var pos = jupiter.position(jde - τ);
71 l = pos.lon;
72 b = pos.lat;
73 r = pos.range;
74 var fk5 = planetposition.toFK5(l, b, jde);
75 l = fk5.lon;
76 b = fk5.lat;
77
78 var _base$sincos2 = base.sincos(b),
79 sb = _base$sincos2[0],
80 cb = _base$sincos2[1];
81
82 var _base$sincos3 = base.sincos(l),
83 sl = _base$sincos3[0],
84 cl = _base$sincos3[1];
85 // (42.2) p. 289
86
87
88 x = r * cb * cl - R * cl0;
89 y = r * cb * sl - R * sl0;
90 z = r * sb - R * sb0;
91 // (42.3) p. 289
92 Δ = Math.sqrt(x * x + y * y + z * z);
93 };
94 f();
95 f();
96
97 // Step 8.0
98 var ε0 = nutation.meanObliquity(jde);
99 // Step 9.0
100
101 var _base$sincos4 = base.sincos(ε0),
1020 = _base$sincos4[0],
1030 = _base$sincos4[1];
104
105 var _base$sincos5 = base.sincos(l),
106 sl = _base$sincos5[0],
107 cl = _base$sincos5[1];
108
109 var _base$sincos6 = base.sincos(b),
110 sb = _base$sincos6[0],
111 cb = _base$sincos6[1];
112
113 var αs = Math.atan2(cε0 * sl - sε0 * sb / cb, cl);
114 var δs = Math.asin(cε0 * sb + sε0 * cb * sl);
115 // Step 10.0
116
117 var _base$sincos7 = base.sincos(δs),
118 sδs = _base$sincos7[0],
119 cδs = _base$sincos7[1];
120
121 var _base$sincos8 = base.sincos(δ0),
1220 = _base$sincos8[0],
1230 = _base$sincos8[1];
124
125 var DS = Math.asin(-sδ0 * sδs - cδ0 * cδs * Math.cos(α0 - αs));
126 // Step 11.0
127 var u = y * cε0 - z * sε0;
128 var v = y * sε0 + z * cε0;
129 var α = Math.atan2(u, x);
130 var δ = Math.atan(v / Math.hypot(x, u));
131
132 var _base$sincos9 = base.sincos(δ),
133 sδ = _base$sincos9[0],
134 cδ = _base$sincos9[1];
135
136 var _base$sincos10 = base.sincos(α0 - α),
1370α = _base$sincos10[0],
1380α = _base$sincos10[1];
139
140 var ζ = Math.atan2(sδ0 * cδ * cα0α - sδ * cδ0, cδ * sα0α);
141 // Step 12.0
142 var DE = Math.asin(-sδ0 * sδ - cδ0 * cδ * Math.cos(α0 - α));
143 // Step 13.0
144 var ω1 = W1 - ζ - 5.07033 * p * Δ;
145 var ω2 = W2 - ζ - 5.02626 * p * Δ;
146 // Step 14.0
147 var C = (2 * r * Δ + R * R - r * r - Δ * Δ) / (4 * r * Δ);
148 if (Math.sin(l - l0) < 0) {
149 C = -C;
150 }
151 ω1 = base.pmod(ω1 + C, 2 * Math.PI);
152 ω2 = base.pmod(ω2 + C, 2 * Math.PI);
153 // Step 15.0
154
155 var _nutation$nutation = nutation.nutation(jde),
156 Δψ = _nutation$nutation[0],
157 Δε = _nutation$nutation[1];
158
159 var ε = ε0 + Δε;
160 // Step 16.0
161
162 var _base$sincos11 = base.sincos(ε),
163 sε = _base$sincos11[0],
164 cε = _base$sincos11[1];
165
166 var _base$sincos12 = base.sincos(α),
167 sα = _base$sincos12[0],
168 cα = _base$sincos12[1];
169
170 α += 0.005693 * p * (cα * cl0 * cε + sα * sl0) / cδ;
171 δ += 0.005693 * p * (cl0 * cε * (sε / cε * cδ - sα * sδ) + cα * sδ * sl0);
172 // Step 17.0
173 var tδ = sδ / cδ;
174 var Δα = (cε + sε * sα * tδ) * Δψ - cα * tδ * Δε;
175 var Δδ = sε * cα * Δψ + sα * Δε;
176 var αʹ = α + Δα;
177 var δʹ = δ + Δδ;
178
179 var _base$sincos13 = base.sincos(α0),
1800 = _base$sincos13[0],
1810 = _base$sincos13[1];
182
183 var0 = sδ0 / cδ0;
184 var Δα0 = (cε + sε * sα0 * tδ0) * Δψ - cα0 * tδ0 * Δε;
185 var Δδ0 = sε * cα0 * Δψ + sα0 * Δε;
186 var α0ʹ = α0 + Δα0;
187 var δ0ʹ = δ0 + Δδ0;
188 // Step 18.0
189
190 var _base$sincos14 = base.sincos(δʹ),
191 sδʹ = _base$sincos14[0],
192 cδʹ = _base$sincos14[1];
193
194 var _base$sincos15 = base.sincos(δ0ʹ),
1950ʹ = _base$sincos15[0],
1960ʹ = _base$sincos15[1];
197
198 var _base$sincos16 = base.sincos(α0ʹ - αʹ),
1990ʹαʹ = _base$sincos16[0],
2000ʹαʹ = _base$sincos16[1];
201 // (42.4) p. 290
202
203
204 var P = Math.atan2(cδ0ʹ * sα0ʹαʹ, sδ0ʹ * cδʹ - cδ0ʹ * sδʹ * cα0ʹαʹ);
205 if (P < 0) {
206 P += 2 * Math.PI;
207 }
208 return [DS, DE, ω1, ω2, P];
209}
210
211/**
212 * Physical2 computes quantities for physical observations of Jupiter.
213 *
214 * Results are less accurate than with Physical().
215 * All angular results in radians.
216 *
217 * @param {number} jde - Julian ephemeris day
218 * @return {Array}
219 * {number} DS - Planetocentric declination of the Sun.
220 * {number} DE - Planetocentric declination of the Earth.
221 * {number} ω1 - Longitude of the System I central meridian of the illuminated disk,
222 * as seen from Earth.
223 * {number} ω2 - Longitude of the System II central meridian of the illuminated disk,
224 * as seen from Earth.
225 */
226export function physical2(jde) {
227 // (jde float64) (DS, DE, ω1, ω2 float64)
228 var d = jde - base.J2000;
229 var p = Math.PI / 180;
230 var V = 172.74 * p + 0.00111588 * p * d;
231 var M = 357.529 * p + 0.9856003 * p * d;
232 var sV = Math.sin(V);
233 var N = 20.02 * p + 0.0830853 * p * d + 0.329 * p * sV;
234 var J = 66.115 * p + 0.9025179 * p * d - 0.329 * p * sV;
235
236 var _base$sincos17 = base.sincos(M),
237 sM = _base$sincos17[0],
238 cM = _base$sincos17[1];
239
240 var _base$sincos18 = base.sincos(N),
241 sN = _base$sincos18[0],
242 cN = _base$sincos18[1];
243
244 var _base$sincos19 = base.sincos(2 * M),
245 s2M = _base$sincos19[0],
246 c2M = _base$sincos19[1];
247
248 var _base$sincos20 = base.sincos(2 * N),
249 s2N = _base$sincos20[0],
250 c2N = _base$sincos20[1];
251
252 var A = 1.915 * p * sM + 0.02 * p * s2M;
253 var B = 5.555 * p * sN + 0.168 * p * s2N;
254 var K = J + A - B;
255 var R = 1.00014 - 0.01671 * cM - 0.00014 * c2M;
256 var r = 5.20872 - 0.25208 * cN - 0.00611 * c2N;
257
258 var _base$sincos21 = base.sincos(K),
259 sK = _base$sincos21[0],
260 cK = _base$sincos21[1];
261
262 var Δ = Math.sqrt(r * r + R * R - 2 * r * R * cK);
263 var ψ = Math.asin(R / Δ * sK);
264 var dd = d - Δ / 173;
265 var ω1 = 210.98 * p + 877.8169088 * p * dd + ψ - B;
266 var ω2 = 187.23 * p + 870.1869088 * p * dd + ψ - B;
267 var C = Math.sin(ψ / 2);
268 C *= C;
269 if (sK > 0) {
270 C = -C;
271 }
272 ω1 = base.pmod(ω1 + C, 2 * Math.PI);
273 ω2 = base.pmod(ω2 + C, 2 * Math.PI);
274 var λ = 34.35 * p + 0.083091 * p * d + 0.329 * p * sV + B;
275 var DS = 3.12 * p * Math.sin(λ + 42.8 * p);
276 var DE = DS - 2.22 * p * Math.sin(ψ) * Math.cos(λ + 22 * p) - 1.3 * p * (r - Δ) / Δ * Math.sin(λ - 100.5 * p);
277 return [DS, DE, ω1, ω2];
278}
279
280export default {
281 physical: physical,
282 physical2: physical2
283};
\No newline at end of file