|
|
1.1 root 1: #include "sky.h"
2:
3: /*
4: * References:
5: * Brown,
6: * Improved Lunar Ephemeris
7: * Supplement to A.E. 1968
8: * Transformation corrections.
9: */
10:
11: double k1, k2, k3, k4;
12: double mnom, msun, noded, dmoon;
13: double sinx();
14: double cosx();
15:
16: extern struct moontab
17: {
18: float f;
19: char c[4];
20: } moontab[];
21:
22: extern struct moont1
23: {
24: float f1[2];
25: char c1[7];
26: } moont1[];
27:
28: moon()
29: {
30: register struct moontab *mp;
31: register struct moont1 *mp1;
32: double dlong, lsun, psun;
33: double eccm, eccs, chp, cpe;
34: double q0, v0, t0, m0, j0, sn0, l0;
35: double arg1, arg2, arg3, arg4, arg5, arg6, arg7;
36: double arg8, arg9, arg10, arg11, arg12, arg13;
37: double arg14, arg15, arg16, arg17;
38: double arg18, arg19, arg20, arg21, arg22;
39: double dgamma, k5, k6;
40: double lterms, sterms, cterms, nterms, pterms, spterms;
41: double gamma1, gamma2, gamma3, arglat;
42: double xmp, ymp, zmp;
43: double temp1, temp2;
44: double shsd;
45: double obl2;
46: double planp[7];
47:
48: object = "moon ";
49:
50: /*
51: * the fundamental elements - all referred to the epoch of
52: * Jan 0.5, 1900 and to the mean equinox of date.
53: */
54:
55: dlong = 270.434164 + 13.1763965268*eday - .001133*capt2
56: + 1.9e-6*capt3;
57: dlong -= .000086; /* empirical*/
58: argp = 334.329556 + .1114040803*eday - .010325*capt2
59: - 12.5e-6*capt3;
60: node = 259.183275 - .0529539222*eday + .002078*capt2
61: + 2.2e-6*capt3;
62: node += .000100; /* empirical */
63: lsun = 279.696678 + .9856473354*eday + .000303*capt2;
64: psun = 281.220844 + .0000470684*eday + .000453*capt2
65: + 3.3e-6*capt3;
66:
67: dlong = fmod(dlong, 360.);
68: argp = fmod(argp, 360.);
69: node = fmod(node, 360.);
70: lsun = fmod(lsun, 360.);
71: psun = fmod(psun, 360.);
72:
73: eccm = 22639.550;
74: eccs = .01675104 - .00004180*capt;
75: incl = 18461.400;
76: cpe = 124.986;
77: chp = 3422.451;
78:
79: /*
80: * some subsidiary elements - they are all longitudes
81: * and they are referred to the epoch 1/0.5 1900 and
82: * to the fixed mean equinox of 1850.0.
83: */
84:
85: q0 = 177.481153 + 4.0923388020*eday;
86: v0 = 342.069128 + 1.6021304820*eday;
87: t0 = 98.998753 + 0.9856091138*eday;
88: m0 = 293.049675 + 0.5240329445*eday;
89: j0 = 237.352319 + 0.0830912295*eday;
90: sn0 = 265.869508 + 0.03345974279*eday;
91: l0 = 269.736239 +13.1763583100*eday;
92:
93: /*
94: * the following are periodic corrections to the
95: * fundamental elements and constants.
96: * arg4 is the "Great Venus Inequality".
97: */
98:
99: arg1 = 41.1 + 20.2*(capt+.5);
100: arg2 = dlong - argp + 33. + 3.*t0 - 10.*v0 - 2.6*(capt+.5);
101: arg3 = dlong + 3.*argp - 4.*lsun + 67. - 23.*t0 + 25.*m0;
102: arg4 = dlong - argp + 151.1 + 16.*t0 - 18.*v0 - (capt+.5);
103: arg5 = node;
104: arg6 = node + 276.2 - 2.3*(capt+.5);
105: arg7 = 152. + 119.*(capt+0.5);
106: arg8 = dlong + argp - 2.*lsun + 105. + t0 - 3.*q0;
107: arg9 = 313.9 + 13.*t0 - 8.*v0;
108: arg10 = dlong - argp + 112.0 + 29.*t0 - 26.*v0;
109: arg11 = dlong - argp + 21.*t0 - 21.*v0;
110: arg12 = dlong + argp - 2.*lsun + 273. + 21.*t0 - 20.*v0;
111: arg13 = dlong + argp - 2.*lsun + 303. + 8.*t0 - 12.*v0;
112: arg14 = 2.*lsun - 2.*node + 270. + 6.*t0 - 5.*v0;
113: arg15 = dlong + 2.*lsun - 3.*argp + 24.*t0 - 24.*v0;
114: arg16 = dlong - lsun + 262. + 12.*t0 - 15.*v0;
115: arg17 = dlong - lsun + 190. + 25.*t0 - 23.*v0;
116: arg18 = 43. - 8.*t0 + 15.*m0;
117: arg19 = node - lsun + 165. + 2.*m0;
118: arg20 = node + 290.1 - 0.9*(capt+.5);
119: arg21 = 115. + 38.5*(capt+.5);
120: arg22 = 216.0 - 8.*t0 + 15.*m0;
121: arg1 *= radian;
122: arg2 *= radian;
123: arg3 *= radian;
124: arg4 *= radian;
125: arg5 *= radian;
126: arg6 *= radian;
127: arg7 *= radian;
128: arg8 *= radian;
129: arg9 *= radian;
130: arg10 *= radian;
131: arg11 *= radian;
132: arg12 *= radian;
133: arg13 *= radian;
134: arg14 *= radian;
135: arg15 *= radian;
136: arg16 *= radian;
137: arg17 *= radian;
138: arg18 *= radian;
139: arg19 *= radian;
140: arg20 *= radian;
141: arg21 *= radian;
142: arg22 *= radian;
143:
144: dlong += (
145: 0.84 *sin(arg1)
146: + 0.31 *sin(arg2)
147: + 0.04 *sin(arg3)
148: + 14.27 *sin(arg4)
149: + 7.261*sin(arg5)
150: + 0.282*sin(arg6)
151: + 0.04 *sin(arg7)
152: + 0.075*sin(arg8)
153: + 0.237*sin(arg9)
154: + 0.108*sin(arg10)
155: + 0.030*sin(arg11)
156: + 0.126*sin(arg12)
157: + 0.033*sin(arg13)
158: + 0.054*sin(arg14)
159: + 0.010*sin(arg15)
160: + 0.013*sin(arg16)
161: + 0.013*sin(arg17)
162: + 0.026*sin(arg18)
163: + 0.017*sin(arg19)
164: )/3600.;
165:
166: argp += (
167: - 2.10 *sin(arg1)
168: - 0.118*sin(arg4)
169: - 2.076*sin(arg5)
170: - 0.840*sin(arg6)
171: - 0.100*sin(arg7)
172: - 0.593*sin(arg9)
173: - 0.065*sin(arg18)
174: )/3600.;
175:
176: node += (
177: 0.63*sin(arg1)
178: + 0.17*sin(arg4)
179: + 95.96*sin(arg5)
180: + 15.58*sin(arg6)
181: + 1.86*sin(arg20)
182: )/3600.;
183:
184: t0 += (
185: -6.40*sin(arg1)
186: -0.27*sin(arg7)
187: -1.89*sin(arg9)
188: +0.20*sin(arg22)
189: )/3600.;
190:
191: lsun += (
192: -6.40*sin(arg1)
193: -0.27*sin(arg7)
194: -1.89*sin(arg9)
195: +0.20*sin(arg22)
196: )/3600.;
197:
198: dgamma = - 4.318*cos(arg5)
199: - 0.698*cos(arg6)
200: - 0.083*cos(arg20);
201:
202: j0 +=
203: 0.33*sin(arg21);
204:
205: sn0 +=
206: - 0.83*sin(arg21);
207:
208: /*
209: * the following factors account for the fact that the
210: * eccentricity, solar eccentricity, inclination and
211: * parallax used by Brown to make up his coefficients
212: * are both wrong and out of date. Brown did the same
213: * thing in a different way.
214: */
215:
216: k1 = eccm/22639.500;
217: k2 = eccs/.01675104;
218: k3 = 1. + 2.708e-6 + .000108008*dgamma;
219: k4 = cpe/125.154;
220: k5 = chp/3422.700;
221:
222: /*
223: * the principal arguments that are used to compute
224: * perturbations are the following differences of the
225: * fundamental elements.
226: */
227:
228: mnom = dlong - argp;
229: msun = lsun - psun;
230: noded = dlong - node;
231: dmoon = dlong - lsun;
232:
233: /*
234: * solar terms in longitude
235: */
236:
237: lterms = 0.0;
238: mp = moontab;
239: for(;;) {
240: if(mp->f == 0.0){
241: mp++;
242: break;
243: }
244: lterms += sinx(mp->f,
245: mp->c[0], mp->c[1],
246: mp->c[2], mp->c[3], 0.0);
247: mp++;
248: }
249:
250: lterms +=
251: (294.e-9*eday - 9193./1296000.*dgamma + .0013)*sinx(1.0,0,0,0,2,0.)
252: +(-220.e-9*eday + 5282./1296000.*dgamma)*sinx(1.0,1,0,0,-2,0.);
253:
254: planp[1] = q0;
255: planp[2] = v0;
256: planp[3] = t0;
257: planp[4] = m0;
258: planp[5] = j0;
259: planp[6] = sn0;
260:
261: /*
262: * planetary terms in longitude
263: */
264:
265: mp1 = moont1;
266: for(;;){
267: if(mp1->f1[0] == 0.){
268: mp1++;
269: break;
270: }
271: lterms += sinx(mp1->f1[0], mp1->c1[0], mp1->c1[1],
272: mp1->c1[2], mp1->c1[3],
273: mp1->c1[4]*t0+mp1->c1[5]*planp[mp1->c1[6]]+mp1->f1[1]);
274: mp1++;
275: }
276:
277: lterms += sinx(-.189, 0,0,0,0, node) /*IAU*/
278: + sinx(-.013, -1,0,0,0, node) /*IAU*/
279: + sinx(-.013, 1,0,0,0, node); /*IAU*/
280: lterms += sinx(0.019, 0,0,0,0, 5.*t0-3.*v0+node+216.0);
281: lterms += sinx(0.016, 0,0,0,0, -5.*t0+3.*v0+node+075.0);
282: lterms += sinx(-.038, 0,0,0,0, 2.*node);
283:
284: /*
285: * solar terms in latitude
286: */
287:
288: sterms = 0.0;
289: for(;;) {
290: if(mp->f == 0.0){
291: mp++;
292: break;
293: }
294: sterms += sinx(mp->f,
295: mp->c[0], mp->c[1],
296: mp->c[2], mp->c[3], 0.0);
297: mp++;
298: }
299:
300: cterms = 0.0;
301: for(;;) {
302: if(mp->f == 0.0){
303: mp++;
304: break;
305: }
306: cterms += cosx(mp->f,
307: mp->c[0], mp->c[1],
308: mp->c[2], mp->c[3], 0.0);
309: mp++;
310: }
311:
312: nterms = 0.0;
313: for(;;) {
314: if(mp->f == 0.0){
315: mp++;
316: break;
317: }
318: nterms += sinx(mp->f,
319: mp->c[0], mp->c[1],
320: mp->c[2], mp->c[3], 0.0);
321: mp++;
322: }
323:
324: /*
325: * planetary terms in latitude
326: */
327:
328: pterms = 0.;
329: for(;;){
330: if(mp1->f1[0] == 0.){
331: mp1++;
332: break;
333: }
334: pterms += sinx(mp1->f1[0], mp1->c1[0], mp1->c1[1],
335: mp1->c1[2], mp1->c1[3],
336: mp1->c1[4]*t0+mp1->c1[5]*planp[mp1->c1[6]]+mp1->f1[1]);
337: mp1++;
338: }
339:
340: pterms +=
341: sinx(0.014, 0,0,0,0, -2.*t0+2.*v0+l0+285.0)
342: + sinx(0.027, 0,0,0,0, -1.*t0+1.*v0+l0+285.0)
343: + sinx(0.015, 0,0,0,0, t0-v0+l0+105.0)
344: + sinx(0.077, 0,0,0,0, 5.*t0-3.*v0+l0+215.6)
345: + sinx(0.025, 0,0,0,0, -6.*t0+4.*v0+l0+255.0)
346: + sinx(0.074, 0,0,0,0, -5.*t0+3.*v0+l0+051.6)
347: + sinx(0.018, 0,0,0,0, -4.*t0+2.*v0+l0+075.0)
348: + sinx(0.010, 0,0,0,0, -3.*t0+v0+l0+075.0)
349: + sinx(0.030, 0,0,0,0, 8.*t0-5.*v0+l0+125.0);
350: pterms +=
351: sinx(0.010, 0,0,0,0, -t0+2.*m0+l0+345.0)
352: + sinx(0.035, 0,0,0,0, 2.*j0+l0+168.0)
353: + sinx(0.018, 0,0,0,0, -2.*j0+l0+024.0)
354: + sinx(-.017, 0,0,0,0, l0)
355: + sinx(0.083, 0,0,1,0, 2.*node)
356: + sinx(0.215, 0,0,0,0, dlong) /*IAU*/
357: + sinx(-.012, -1,0,0,0, dlong) /*IAU*/
358: + sinx(0.011, 1,0,0,0, dlong); /*IAU*/
359:
360: /*
361: * solar terms in parallax
362: */
363:
364: spterms = 3422.700;
365: for(;;) {
366: if(mp->f == 0.0){
367: mp++;
368: break;
369: }
370: spterms += cosx(mp->f,
371: mp->c[0], mp->c[1],
372: mp->c[2], mp->c[3], 0.0);
373: mp++;
374: }
375:
376: /*
377: * planetary terms in parallax
378: */
379:
380: for(;;){
381: if(mp1->f1[0] == 0.){
382: mp1++;
383: break;
384: }
385: spterms += cosx(mp1->f1[0], mp1->c1[0], mp1->c1[1],
386: mp1->c1[2], mp1->c1[3],
387: mp1->c1[4]*t0+mp1->c1[5]*planp[mp1->c1[6]]+mp1->f1[1]);
388: mp1++;
389: }
390:
391: /*
392: * computation of longitude
393: */
394:
395: lambda = (dlong + lterms/3600.)*radian;
396:
397: /*
398: * computation of latitude
399: */
400:
401: arglat = (noded + sterms/3600.)*radian;
402: gamma1 = 18519.700 * k3;
403: gamma2 = -6.241 * k3*k3*k3;
404: gamma3 = 0.004 * k3*k3*k3*k3*k3;
405:
406: k6 = (gamma1 + cterms) / gamma1;
407:
408: beta = k6 * (gamma1*sin(arglat) + gamma2*sin(3.*arglat)
409: + gamma3*sin(5.*arglat) + nterms)
410: + pterms;
411: if(flags & OCCULT)
412: beta -= 0.6;
413: beta *= radsec;
414:
415: /*
416: * computation of parallax
417: */
418:
419: spterms = k5 * spterms *radsec;
420: hp = spterms + (spterms*spterms*spterms)/6.;
421:
422: rad = hp/radsec;
423: georad = 1.;
424: semi = .0799 + .272453*(hp/radsec);
425: if(dmoon < 0.)
426: dmoon += 360.;
427: mag = dmoon/360.;
428:
429: /*
430: * change to equatorial coordinates
431: */
432:
433: lambda += psi;
434: obl2 = obliq + eps;
435: xmp = georad*cos(lambda)*cos(beta);
436: ymp = georad*(sin(lambda)*cos(beta)*cos(obl2) - sin(obl2)*sin(beta));
437: zmp = georad*(sin(lambda)*cos(beta)*sin(obl2) + cos(obl2)*sin(beta));
438:
439: alpha = atan2(ymp, xmp);
440: delta = atan2(zmp, sqrt(xmp*xmp+ymp*ymp));
441:
442: /*
443: *c lunar eclipse computation
444: */
445:
446: shsd = 1.0183*hp/radsec - 969.85/rps;
447: temp1 = sin(shdecl)*sin(delta) + cos(shdecl)*cos(delta)
448: *cos(shra - alpha);
449: temp2 = atan2(sqrt(1.-temp1*temp1),temp1)/radsec;
450: temp2 = semi + shsd - temp2;
451: temp2 = temp2/(2.*semi);
452: if(temp2 >= 0.){
453: if(temp2 < 1.)
454: printf("Partial Lunar Eclipse: Mag. = %.4f\n", temp2);
455: else
456: printf("Total Lunar Eclipse: Mag. = %.4f\n", temp2);
457: }
458:
459:
460: geolam = lambda;
461: geobet = beta;
462:
463: geo();
464:
465: /*
466: * solar eclipse computation
467: */
468:
469: if(!((flags&GEO)||(flags&HELIO))){
470: temp1 = sin(sundec)*sin(decl2) + cos(sundec)*cos(decl2)
471: *cos(sunra-ra);
472: temp1 = atan2(sqrt(1.-temp1*temp1),temp1)/radsec;
473: if(temp1 <= (semi2+sunsd)){
474: temp2 = (semi2+sunsd-temp1)/(2.*sunsd);
475: if(temp1 >= fabs(sunsd-semi2))
476: printf("Partial Solar Eclipse: Mag. = %.4f\n", temp2);
477: else if(temp2 > 1.)
478: printf("Total Solar Eclipse: Mag. = %.4f\n", temp2);
479: else
480: printf("Annular Solar Eclipse: Mag. = %.4f\n", temp2);
481: }
482: }
483:
484: /*
485: * constants for occultation computations
486: */
487:
488: moonra = ra;
489: moonde = decl2;
490: moonsd = semi2;
491:
492: }
493:
494: double
495: sinx(coef,i,j,k,m,angle)
496: double coef, angle;
497: {
498: double x;
499:
500: x = i*mnom + j*msun + k*noded + m*dmoon + angle;
501: x = coef*sin(x*radian);
502: if(i < 0)
503: i = -i;
504: for(; i>0; i--)
505: x *= k1;
506: if(j < 0)
507: j = -j;
508: for(; j>0; j--)
509: x *= k2;
510: if(k < 0)
511: k = -k;
512: for(; k>0; k--)
513: x *= k3;
514: if(m & 1)
515: x *= k4;
516:
517: return(x);
518: }
519:
520: double
521: cosx(coef,i,j,k,m,angle)
522: double coef, angle;
523: {
524: double x;
525:
526: x = i*mnom + j*msun + k*noded + m*dmoon + angle;
527: x = coef*cos(x*radian);
528: if(i < 0)
529: i = -i;
530: for(; i>0; i--)
531: x *= k1;
532: if(j < 0)
533: j = -j;
534: for(; j>0; j--)
535: x *= k2;
536: if(k < 0)
537: k = -k;
538: for(; k>0; k--)
539: x *= k3;
540: if(m & 1)
541: x *= k4;
542:
543: return(x);
544: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.