xref: /plan9-contrib/sys/src/cmd/astro/moon.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier #include "astro.h"
2*3e12c5d1SDavid du Colombier 
3*3e12c5d1SDavid du Colombier double k1, k2, k3, k4;
4*3e12c5d1SDavid du Colombier double mnom, msun, noded, dmoon;
5*3e12c5d1SDavid du Colombier 
6*3e12c5d1SDavid du Colombier void
moon(void)7*3e12c5d1SDavid du Colombier moon(void)
8*3e12c5d1SDavid du Colombier {
9*3e12c5d1SDavid du Colombier 	Moontab *mp;
10*3e12c5d1SDavid du Colombier 	double dlong, lsun, psun;
11*3e12c5d1SDavid du Colombier 	double eccm, eccs, chp, cpe;
12*3e12c5d1SDavid du Colombier 	double v0, t0, m0, j0;
13*3e12c5d1SDavid du Colombier 	double arg1, arg2, arg3, arg4, arg5, arg6, arg7;
14*3e12c5d1SDavid du Colombier 	double arg8, arg9, arg10;
15*3e12c5d1SDavid du Colombier 	double dgamma, k5, k6;
16*3e12c5d1SDavid du Colombier 	double lterms, sterms, cterms, nterms, pterms, spterms;
17*3e12c5d1SDavid du Colombier 	double gamma1, gamma2, gamma3, arglat;
18*3e12c5d1SDavid du Colombier 	double xmp, ymp, zmp;
19*3e12c5d1SDavid du Colombier 	double obl2;
20*3e12c5d1SDavid du Colombier 
21*3e12c5d1SDavid du Colombier /*
22*3e12c5d1SDavid du Colombier  *	the fundamental elements - all referred to the epoch of
23*3e12c5d1SDavid du Colombier  *	Jan 0.5, 1900 and to the mean equinox of date.
24*3e12c5d1SDavid du Colombier  */
25*3e12c5d1SDavid du Colombier 
26*3e12c5d1SDavid du Colombier 	dlong = 270.434164 + 13.1763965268*eday - .001133*capt2
27*3e12c5d1SDavid du Colombier 		 + 2.e-6*capt3;
28*3e12c5d1SDavid du Colombier 	argp = 334.329556 + .1114040803*eday - .010325*capt2
29*3e12c5d1SDavid du Colombier 		 - 12.e-6*capt3;
30*3e12c5d1SDavid du Colombier 	node = 259.183275 - .0529539222*eday + .002078*capt2
31*3e12c5d1SDavid du Colombier 		 + 2.e-6*capt3;
32*3e12c5d1SDavid du Colombier 	lsun = 279.696678 + .9856473354*eday + .000303*capt2;
33*3e12c5d1SDavid du Colombier 	psun = 281.220833 + .0000470684*eday + .000453*capt2
34*3e12c5d1SDavid du Colombier 		 + 3.e-6*capt3;
35*3e12c5d1SDavid du Colombier 
36*3e12c5d1SDavid du Colombier 	dlong = fmod(dlong, 360.);
37*3e12c5d1SDavid du Colombier 	argp = fmod(argp, 360.);
38*3e12c5d1SDavid du Colombier 	node = fmod(node, 360.);
39*3e12c5d1SDavid du Colombier 	lsun = fmod(lsun, 360.);
40*3e12c5d1SDavid du Colombier 	psun = fmod(psun, 360.);
41*3e12c5d1SDavid du Colombier 
42*3e12c5d1SDavid du Colombier 	eccm = 22639.550;
43*3e12c5d1SDavid du Colombier 	eccs = .01675104 - .00004180*capt;
44*3e12c5d1SDavid du Colombier 	incl = 18461.400;
45*3e12c5d1SDavid du Colombier 	cpe = 124.986;
46*3e12c5d1SDavid du Colombier 	chp = 3422.451;
47*3e12c5d1SDavid du Colombier 
48*3e12c5d1SDavid du Colombier /*
49*3e12c5d1SDavid du Colombier  *	some subsidiary elements - they are all longitudes
50*3e12c5d1SDavid du Colombier  *	and they are referred to the epoch 1/0.5 1900 and
51*3e12c5d1SDavid du Colombier  *	to the fixed mean equinox of 1850.0.
52*3e12c5d1SDavid du Colombier  */
53*3e12c5d1SDavid du Colombier 
54*3e12c5d1SDavid du Colombier 	v0 = 342.069128 + 1.6021304820*eday;
55*3e12c5d1SDavid du Colombier 	t0 =  98.998753 + 0.9856091138*eday;
56*3e12c5d1SDavid du Colombier 	m0 = 293.049675 + 0.5240329445*eday;
57*3e12c5d1SDavid du Colombier 	j0 = 237.352319 + 0.0830912295*eday;
58*3e12c5d1SDavid du Colombier 
59*3e12c5d1SDavid du Colombier /*
60*3e12c5d1SDavid du Colombier  *	the following are periodic corrections to the
61*3e12c5d1SDavid du Colombier  *	fundamental elements and constants.
62*3e12c5d1SDavid du Colombier  *	arg3 is the "Great Venus Inequality".
63*3e12c5d1SDavid du Colombier  */
64*3e12c5d1SDavid du Colombier 
65*3e12c5d1SDavid du Colombier 	arg1 = 41.1 + 20.2*(capt+.5);
66*3e12c5d1SDavid du Colombier 	arg2 = dlong - argp + 33. + 3.*t0 - 10.*v0 - 2.6*(capt+.5);
67*3e12c5d1SDavid du Colombier 	arg3 = dlong - argp + 151.1 + 16.*t0 - 18.*v0 - (capt+.5);
68*3e12c5d1SDavid du Colombier 	arg4 = node;
69*3e12c5d1SDavid du Colombier 	arg5 = node + 276.2 - 2.3*(capt+.5);
70*3e12c5d1SDavid du Colombier 	arg6 = 313.9 + 13.*t0 - 8.*v0;
71*3e12c5d1SDavid du Colombier 	arg7 = dlong - argp + 112.0 + 29.*t0 - 26.*v0;
72*3e12c5d1SDavid du Colombier 	arg8 = dlong + argp - 2.*lsun + 273. + 21.*t0 - 20.*v0;
73*3e12c5d1SDavid du Colombier 	arg9 = node + 290.1 - 0.9*(capt+.5);
74*3e12c5d1SDavid du Colombier 	arg10 = 115. + 38.5*(capt+.5);
75*3e12c5d1SDavid du Colombier 	arg1 *= radian;
76*3e12c5d1SDavid du Colombier 	arg2 *= radian;
77*3e12c5d1SDavid du Colombier 	arg3 *= radian;
78*3e12c5d1SDavid du Colombier 	arg4 *= radian;
79*3e12c5d1SDavid du Colombier 	arg5 *= radian;
80*3e12c5d1SDavid du Colombier 	arg6 *= radian;
81*3e12c5d1SDavid du Colombier 	arg7 *= radian;
82*3e12c5d1SDavid du Colombier 	arg8 *= radian;
83*3e12c5d1SDavid du Colombier 	arg9 *= radian;
84*3e12c5d1SDavid du Colombier 	arg10 *= radian;
85*3e12c5d1SDavid du Colombier 
86*3e12c5d1SDavid du Colombier 	dlong +=
87*3e12c5d1SDavid du Colombier 		   (0.84 *sin(arg1)
88*3e12c5d1SDavid du Colombier 		 +  0.31 *sin(arg2)
89*3e12c5d1SDavid du Colombier 		 + 14.27 *sin(arg3)
90*3e12c5d1SDavid du Colombier 		 +  7.261*sin(arg4)
91*3e12c5d1SDavid du Colombier 		 +  0.282*sin(arg5)
92*3e12c5d1SDavid du Colombier 		 +  0.237*sin(arg6)
93*3e12c5d1SDavid du Colombier 		 +  0.108*sin(arg7)
94*3e12c5d1SDavid du Colombier 		 +  0.126*sin(arg8))/3600.;
95*3e12c5d1SDavid du Colombier 
96*3e12c5d1SDavid du Colombier 	argp +=
97*3e12c5d1SDavid du Colombier 		 (- 2.10 *sin(arg1)
98*3e12c5d1SDavid du Colombier 		 -  0.118*sin(arg3)
99*3e12c5d1SDavid du Colombier 		 -  2.076*sin(arg4)
100*3e12c5d1SDavid du Colombier 		 -  0.840*sin(arg5)
101*3e12c5d1SDavid du Colombier 		 -  0.593*sin(arg6))/3600.;
102*3e12c5d1SDavid du Colombier 
103*3e12c5d1SDavid du Colombier 	node +=
104*3e12c5d1SDavid du Colombier 		   (0.63*sin(arg1)
105*3e12c5d1SDavid du Colombier 		 +  0.17*sin(arg3)
106*3e12c5d1SDavid du Colombier 		 + 95.96*sin(arg4)
107*3e12c5d1SDavid du Colombier 		 + 15.58*sin(arg5)
108*3e12c5d1SDavid du Colombier 		 +  1.86*sin(arg9))/3600.;
109*3e12c5d1SDavid du Colombier 
110*3e12c5d1SDavid du Colombier 	t0 +=
111*3e12c5d1SDavid du Colombier 		 (- 6.40*sin(arg1)
112*3e12c5d1SDavid du Colombier 		 -  1.89*sin(arg6))/3600.;
113*3e12c5d1SDavid du Colombier 
114*3e12c5d1SDavid du Colombier 	psun +=
115*3e12c5d1SDavid du Colombier 		   (6.40*sin(arg1)
116*3e12c5d1SDavid du Colombier 		 +  1.89*sin(arg6))/3600.;
117*3e12c5d1SDavid du Colombier 
118*3e12c5d1SDavid du Colombier 	dgamma = -  4.318*cos(arg4)
119*3e12c5d1SDavid du Colombier 		 -  0.698*cos(arg5)
120*3e12c5d1SDavid du Colombier 		 -  0.083*cos(arg9);
121*3e12c5d1SDavid du Colombier 
122*3e12c5d1SDavid du Colombier 	j0 +=
123*3e12c5d1SDavid du Colombier 		   0.33*sin(arg10);
124*3e12c5d1SDavid du Colombier 
125*3e12c5d1SDavid du Colombier /*
126*3e12c5d1SDavid du Colombier  *	the following factors account for the fact that the
127*3e12c5d1SDavid du Colombier  *	eccentricity, solar eccentricity, inclination and
128*3e12c5d1SDavid du Colombier  *	parallax used by Brown to make up his coefficients
129*3e12c5d1SDavid du Colombier  *	are both wrong and out of date.  Brown did the same
130*3e12c5d1SDavid du Colombier  *	thing in a different way.
131*3e12c5d1SDavid du Colombier  */
132*3e12c5d1SDavid du Colombier 
133*3e12c5d1SDavid du Colombier 	k1 = eccm/22639.500;
134*3e12c5d1SDavid du Colombier 	k2 = eccs/.01675104;
135*3e12c5d1SDavid du Colombier 	k3 = 1. + 2.708e-6 + .000108008*dgamma;
136*3e12c5d1SDavid du Colombier 	k4 = cpe/125.154;
137*3e12c5d1SDavid du Colombier 	k5 = chp/3422.700;
138*3e12c5d1SDavid du Colombier 
139*3e12c5d1SDavid du Colombier /*
140*3e12c5d1SDavid du Colombier  *	the principal arguments that are used to compute
141*3e12c5d1SDavid du Colombier  *	perturbations are the following differences of the
142*3e12c5d1SDavid du Colombier  *	fundamental elements.
143*3e12c5d1SDavid du Colombier  */
144*3e12c5d1SDavid du Colombier 
145*3e12c5d1SDavid du Colombier 	mnom = dlong - argp;
146*3e12c5d1SDavid du Colombier 	msun = lsun - psun;
147*3e12c5d1SDavid du Colombier 	noded = dlong - node;
148*3e12c5d1SDavid du Colombier 	dmoon = dlong - lsun;
149*3e12c5d1SDavid du Colombier 
150*3e12c5d1SDavid du Colombier /*
151*3e12c5d1SDavid du Colombier  *	solar terms in longitude
152*3e12c5d1SDavid du Colombier  */
153*3e12c5d1SDavid du Colombier 
154*3e12c5d1SDavid du Colombier 	lterms = 0.0;
155*3e12c5d1SDavid du Colombier 	mp = moontab;
156*3e12c5d1SDavid du Colombier 	for(;;) {
157*3e12c5d1SDavid du Colombier 		if(mp->f == 0.0)
158*3e12c5d1SDavid du Colombier 			break;
159*3e12c5d1SDavid du Colombier 		lterms += sinx(mp->f,
160*3e12c5d1SDavid du Colombier 			mp->c[0], mp->c[1],
161*3e12c5d1SDavid du Colombier 			mp->c[2], mp->c[3], 0.0);
162*3e12c5d1SDavid du Colombier 		mp++;
163*3e12c5d1SDavid du Colombier 	}
164*3e12c5d1SDavid du Colombier 	mp++;
165*3e12c5d1SDavid du Colombier 
166*3e12c5d1SDavid du Colombier /*
167*3e12c5d1SDavid du Colombier  *	planetary terms in longitude
168*3e12c5d1SDavid du Colombier  */
169*3e12c5d1SDavid du Colombier 
170*3e12c5d1SDavid du Colombier 	lterms += sinx(0.822, 0,0,0,0, t0-v0);
171*3e12c5d1SDavid du Colombier 	lterms += sinx(0.307, 0,0,0,0, 2.*t0-2.*v0+179.8);
172*3e12c5d1SDavid du Colombier 	lterms += sinx(0.348, 0,0,0,0, 3.*t0-2.*v0+272.9);
173*3e12c5d1SDavid du Colombier 	lterms += sinx(0.176, 0,0,0,0, 4.*t0-3.*v0+271.7);
174*3e12c5d1SDavid du Colombier 	lterms += sinx(0.092, 0,0,0,0, 5.*t0-3.*v0+199.);
175*3e12c5d1SDavid du Colombier 	lterms += sinx(0.129, 1,0,0,0, -t0+v0+180.);
176*3e12c5d1SDavid du Colombier 	lterms += sinx(0.152, 1,0,0,0, t0-v0);
177*3e12c5d1SDavid du Colombier 	lterms += sinx(0.127, 1,0,0,0, 3.*t0-3.*v0+180.);
178*3e12c5d1SDavid du Colombier 	lterms += sinx(0.099, 0,0,0,2, t0-v0);
179*3e12c5d1SDavid du Colombier 	lterms += sinx(0.136, 0,0,0,2, 2.*t0-2.*v0+179.5);
180*3e12c5d1SDavid du Colombier 	lterms += sinx(0.083, -1,0,0,2, -4.*t0+4.*v0+180.);
181*3e12c5d1SDavid du Colombier 	lterms += sinx(0.662, -1,0,0,2, -3.*t0+3.*v0+180.0);
182*3e12c5d1SDavid du Colombier 	lterms += sinx(0.137, -1,0,0,2, -2.*t0+2.*v0);
183*3e12c5d1SDavid du Colombier 	lterms += sinx(0.133, -1,0,0,2, t0-v0);
184*3e12c5d1SDavid du Colombier 	lterms += sinx(0.157, -1,0,0,2, 2.*t0-2.*v0+179.6);
185*3e12c5d1SDavid du Colombier 	lterms += sinx(0.079, -1,0,0,2, -8.*t0+6.*v0+162.6);
186*3e12c5d1SDavid du Colombier 	lterms += sinx(0.073, 2,0,0,-2, 3.*t0-3.*v0+180.);
187*3e12c5d1SDavid du Colombier 	lterms += sinx(0.643, 0,0,0,0, -t0+j0+178.8);
188*3e12c5d1SDavid du Colombier 	lterms += sinx(0.187, 0,0,0,0, -2.*t0+2.*j0+359.6);
189*3e12c5d1SDavid du Colombier 	lterms += sinx(0.087, 0,0,0,0, j0+289.9);
190*3e12c5d1SDavid du Colombier 	lterms += sinx(0.165, 0,0,0,0, -t0+2.*j0+241.5);
191*3e12c5d1SDavid du Colombier 	lterms += sinx(0.144, 1,0,0,0, t0-j0+1.0);
192*3e12c5d1SDavid du Colombier 	lterms += sinx(0.158, 1,0,0,0, -t0+j0+179.0);
193*3e12c5d1SDavid du Colombier 	lterms += sinx(0.190, 1,0,0,0, -2.*t0+2.*j0+180.0);
194*3e12c5d1SDavid du Colombier 	lterms += sinx(0.096, 1,0,0,0, -2.*t0+3.*j0+352.5);
195*3e12c5d1SDavid du Colombier 	lterms += sinx(0.070, 0,0,0,2, 2.*t0-2.*j0+180.);
196*3e12c5d1SDavid du Colombier 	lterms += sinx(0.167, 0,0,0,2, -t0+j0+178.5);
197*3e12c5d1SDavid du Colombier 	lterms += sinx(0.085, 0,0,0,2, -2.*t0+2.*j0+359.2);
198*3e12c5d1SDavid du Colombier 	lterms += sinx(1.137, -1,0,0,2, 2.*t0-2.*j0+180.3);
199*3e12c5d1SDavid du Colombier 	lterms += sinx(0.211, -1,0,0,2, -t0+j0+178.4);
200*3e12c5d1SDavid du Colombier 	lterms += sinx(0.089, -1,0,0,2, -2.*t0+2.*j0+359.2);
201*3e12c5d1SDavid du Colombier 	lterms += sinx(0.436, -1,0,0,2, 2.*t0-3.*j0+7.5);
202*3e12c5d1SDavid du Colombier 	lterms += sinx(0.240, 2,0,0,-2, -2.*t0+2.*j0+179.9);
203*3e12c5d1SDavid du Colombier 	lterms += sinx(0.284, 2,0,0,-2, -2.*t0+3.*j0+172.5);
204*3e12c5d1SDavid du Colombier 	lterms += sinx(0.195, 0,0,0,0, -2.*t0+2.*m0+180.2);
205*3e12c5d1SDavid du Colombier 	lterms += sinx(0.327, 0,0,0,0, -t0+2.*m0+224.4);
206*3e12c5d1SDavid du Colombier 	lterms += sinx(0.093, 0,0,0,0, -2.*t0+4.*m0+244.8);
207*3e12c5d1SDavid du Colombier 	lterms += sinx(0.073, 1,0,0,0, -t0+2.*m0+223.3);
208*3e12c5d1SDavid du Colombier 	lterms += sinx(0.074, 1,0,0,0, t0-2.*m0+306.3);
209*3e12c5d1SDavid du Colombier 	lterms += sinx(0.189, 0,0,0,0, node+180.);
210*3e12c5d1SDavid du Colombier 
211*3e12c5d1SDavid du Colombier /*
212*3e12c5d1SDavid du Colombier  *	solar terms in latitude
213*3e12c5d1SDavid du Colombier  */
214*3e12c5d1SDavid du Colombier 
215*3e12c5d1SDavid du Colombier 	sterms = 0;
216*3e12c5d1SDavid du Colombier 	for(;;) {
217*3e12c5d1SDavid du Colombier 		if(mp->f == 0)
218*3e12c5d1SDavid du Colombier 			break;
219*3e12c5d1SDavid du Colombier 		sterms += sinx(mp->f,
220*3e12c5d1SDavid du Colombier 			mp->c[0], mp->c[1],
221*3e12c5d1SDavid du Colombier 			mp->c[2], mp->c[3], 0);
222*3e12c5d1SDavid du Colombier 		mp++;
223*3e12c5d1SDavid du Colombier 	}
224*3e12c5d1SDavid du Colombier 	mp++;
225*3e12c5d1SDavid du Colombier 
226*3e12c5d1SDavid du Colombier 	cterms = 0;
227*3e12c5d1SDavid du Colombier 	for(;;) {
228*3e12c5d1SDavid du Colombier 		if(mp->f == 0)
229*3e12c5d1SDavid du Colombier 			break;
230*3e12c5d1SDavid du Colombier 		cterms += cosx(mp->f,
231*3e12c5d1SDavid du Colombier 			mp->c[0], mp->c[1],
232*3e12c5d1SDavid du Colombier 			mp->c[2], mp->c[3], 0);
233*3e12c5d1SDavid du Colombier 		mp++;
234*3e12c5d1SDavid du Colombier 	}
235*3e12c5d1SDavid du Colombier 	mp++;
236*3e12c5d1SDavid du Colombier 
237*3e12c5d1SDavid du Colombier 	nterms = 0;
238*3e12c5d1SDavid du Colombier 	for(;;) {
239*3e12c5d1SDavid du Colombier 		if(mp->f == 0)
240*3e12c5d1SDavid du Colombier 			break;
241*3e12c5d1SDavid du Colombier 		nterms += sinx(mp->f,
242*3e12c5d1SDavid du Colombier 			mp->c[0], mp->c[1],
243*3e12c5d1SDavid du Colombier 			mp->c[2], mp->c[3], 0);
244*3e12c5d1SDavid du Colombier 		mp++;
245*3e12c5d1SDavid du Colombier 	}
246*3e12c5d1SDavid du Colombier 	mp++;
247*3e12c5d1SDavid du Colombier 
248*3e12c5d1SDavid du Colombier /*
249*3e12c5d1SDavid du Colombier  *	planetary terms in latitude
250*3e12c5d1SDavid du Colombier  */
251*3e12c5d1SDavid du Colombier 
252*3e12c5d1SDavid du Colombier 	pterms =
253*3e12c5d1SDavid du Colombier 		   sinx(0.215, 0,0,0,0, dlong);
254*3e12c5d1SDavid du Colombier 
255*3e12c5d1SDavid du Colombier /*
256*3e12c5d1SDavid du Colombier  *	solar terms in parallax
257*3e12c5d1SDavid du Colombier  */
258*3e12c5d1SDavid du Colombier 
259*3e12c5d1SDavid du Colombier 	spterms = 3422.700;
260*3e12c5d1SDavid du Colombier 	for(;;) {
261*3e12c5d1SDavid du Colombier 		if(mp->f == 0)
262*3e12c5d1SDavid du Colombier 			break;
263*3e12c5d1SDavid du Colombier 		spterms += cosx(mp->f,
264*3e12c5d1SDavid du Colombier 			mp->c[0], mp->c[1],
265*3e12c5d1SDavid du Colombier 			mp->c[2], mp->c[3], 0);
266*3e12c5d1SDavid du Colombier 		mp++;
267*3e12c5d1SDavid du Colombier 	}
268*3e12c5d1SDavid du Colombier 
269*3e12c5d1SDavid du Colombier /*
270*3e12c5d1SDavid du Colombier  *	planetary terms in parallax
271*3e12c5d1SDavid du Colombier  */
272*3e12c5d1SDavid du Colombier 
273*3e12c5d1SDavid du Colombier 	spterms = spterms;
274*3e12c5d1SDavid du Colombier 
275*3e12c5d1SDavid du Colombier /*
276*3e12c5d1SDavid du Colombier  *	computation of longitude
277*3e12c5d1SDavid du Colombier  */
278*3e12c5d1SDavid du Colombier 
279*3e12c5d1SDavid du Colombier 	lambda = (dlong + lterms/3600.)*radian;
280*3e12c5d1SDavid du Colombier 
281*3e12c5d1SDavid du Colombier /*
282*3e12c5d1SDavid du Colombier  *	computation of latitude
283*3e12c5d1SDavid du Colombier  */
284*3e12c5d1SDavid du Colombier 
285*3e12c5d1SDavid du Colombier 	arglat = (noded + sterms/3600.)*radian;
286*3e12c5d1SDavid du Colombier 	gamma1 = 18519.700 * k3;
287*3e12c5d1SDavid du Colombier 	gamma2 = -6.241 * k3*k3*k3;
288*3e12c5d1SDavid du Colombier 	gamma3 = 0.004 * k3*k3*k3*k3*k3;
289*3e12c5d1SDavid du Colombier 
290*3e12c5d1SDavid du Colombier 	k6 = (gamma1 + cterms) / gamma1;
291*3e12c5d1SDavid du Colombier 
292*3e12c5d1SDavid du Colombier 	beta = k6 * (gamma1*sin(arglat) + gamma2*sin(3.*arglat)
293*3e12c5d1SDavid du Colombier 		 + gamma3*sin(5.*arglat) + nterms)
294*3e12c5d1SDavid du Colombier 		 + pterms;
295*3e12c5d1SDavid du Colombier 	if(flags['o'])
296*3e12c5d1SDavid du Colombier 		beta -= 0.6;
297*3e12c5d1SDavid du Colombier 	beta *= radsec;
298*3e12c5d1SDavid du Colombier 
299*3e12c5d1SDavid du Colombier /*
300*3e12c5d1SDavid du Colombier  *	computation of parallax
301*3e12c5d1SDavid du Colombier  */
302*3e12c5d1SDavid du Colombier 
303*3e12c5d1SDavid du Colombier 	spterms = k5 * spterms *radsec;
304*3e12c5d1SDavid du Colombier 	hp = spterms + (spterms*spterms*spterms)/6.;
305*3e12c5d1SDavid du Colombier 
306*3e12c5d1SDavid du Colombier 	rad = hp/radsec;
307*3e12c5d1SDavid du Colombier 	rp = 1.;
308*3e12c5d1SDavid du Colombier 	semi = .0799 + .272453*(hp/radsec);
309*3e12c5d1SDavid du Colombier 	if(dmoon < 0.)
310*3e12c5d1SDavid du Colombier 		dmoon += 360.;
311*3e12c5d1SDavid du Colombier 	mag = dmoon/360.;
312*3e12c5d1SDavid du Colombier 
313*3e12c5d1SDavid du Colombier /*
314*3e12c5d1SDavid du Colombier  *	change to equatorial coordinates
315*3e12c5d1SDavid du Colombier  */
316*3e12c5d1SDavid du Colombier 
317*3e12c5d1SDavid du Colombier 	lambda += phi;
318*3e12c5d1SDavid du Colombier 	obl2 = obliq + eps;
319*3e12c5d1SDavid du Colombier 	xmp = rp*cos(lambda)*cos(beta);
320*3e12c5d1SDavid du Colombier 	ymp = rp*(sin(lambda)*cos(beta)*cos(obl2) - sin(obl2)*sin(beta));
321*3e12c5d1SDavid du Colombier 	zmp = rp*(sin(lambda)*cos(beta)*sin(obl2) + cos(obl2)*sin(beta));
322*3e12c5d1SDavid du Colombier 
323*3e12c5d1SDavid du Colombier 	alpha = atan2(ymp, xmp);
324*3e12c5d1SDavid du Colombier 	delta = atan2(zmp, sqrt(xmp*xmp+ymp*ymp));
325*3e12c5d1SDavid du Colombier 	meday = eday;
326*3e12c5d1SDavid du Colombier 	mhp = hp;
327*3e12c5d1SDavid du Colombier 
328*3e12c5d1SDavid du Colombier 	geo();
329*3e12c5d1SDavid du Colombier }
330*3e12c5d1SDavid du Colombier 
331*3e12c5d1SDavid du Colombier double
sinx(double coef,int i,int j,int k,int m,double angle)332*3e12c5d1SDavid du Colombier sinx(double coef, int i, int j, int k, int m, double angle)
333*3e12c5d1SDavid du Colombier {
334*3e12c5d1SDavid du Colombier 	double x;
335*3e12c5d1SDavid du Colombier 
336*3e12c5d1SDavid du Colombier 	x = i*mnom + j*msun + k*noded + m*dmoon + angle;
337*3e12c5d1SDavid du Colombier 	x = coef*sin(x*radian);
338*3e12c5d1SDavid du Colombier 	if(i < 0)
339*3e12c5d1SDavid du Colombier 		i = -i;
340*3e12c5d1SDavid du Colombier 	for(; i>0; i--)
341*3e12c5d1SDavid du Colombier 		x *= k1;
342*3e12c5d1SDavid du Colombier 	if(j < 0)
343*3e12c5d1SDavid du Colombier 		j = -j;
344*3e12c5d1SDavid du Colombier 	for(; j>0; j--)
345*3e12c5d1SDavid du Colombier 		x *= k2;
346*3e12c5d1SDavid du Colombier 	if(k < 0)
347*3e12c5d1SDavid du Colombier 		k = -k;
348*3e12c5d1SDavid du Colombier 	for(; k>0; k--)
349*3e12c5d1SDavid du Colombier 		x *= k3;
350*3e12c5d1SDavid du Colombier 	if(m & 1)
351*3e12c5d1SDavid du Colombier 		x *= k4;
352*3e12c5d1SDavid du Colombier 
353*3e12c5d1SDavid du Colombier 	return x;
354*3e12c5d1SDavid du Colombier }
355*3e12c5d1SDavid du Colombier 
356*3e12c5d1SDavid du Colombier double
cosx(double coef,int i,int j,int k,int m,double angle)357*3e12c5d1SDavid du Colombier cosx(double coef, int i, int j, int k, int m, double angle)
358*3e12c5d1SDavid du Colombier {
359*3e12c5d1SDavid du Colombier 	double x;
360*3e12c5d1SDavid du Colombier 
361*3e12c5d1SDavid du Colombier 	x = i*mnom + j*msun + k*noded + m*dmoon + angle;
362*3e12c5d1SDavid du Colombier 	x = coef*cos(x*radian);
363*3e12c5d1SDavid du Colombier 	if(i < 0)
364*3e12c5d1SDavid du Colombier 		i = -i;
365*3e12c5d1SDavid du Colombier 	for(; i>0; i--)
366*3e12c5d1SDavid du Colombier 		x *= k1;
367*3e12c5d1SDavid du Colombier 	if(j < 0)
368*3e12c5d1SDavid du Colombier 		j = -j;
369*3e12c5d1SDavid du Colombier 	for(; j>0; j--)
370*3e12c5d1SDavid du Colombier 		x *= k2;
371*3e12c5d1SDavid du Colombier 	if(k < 0)
372*3e12c5d1SDavid du Colombier 		k = -k;
373*3e12c5d1SDavid du Colombier 	for(; k>0; k--)
374*3e12c5d1SDavid du Colombier 		x *= k3;
375*3e12c5d1SDavid du Colombier 	if(m & 1)
376*3e12c5d1SDavid du Colombier 		x *= k4;
377*3e12c5d1SDavid du Colombier 
378*3e12c5d1SDavid du Colombier 	return x;
379*3e12c5d1SDavid du Colombier }
380