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