< EasterSunday.c | index | GreenwichSideralTime.c >

Copyright (c) 1999-2012

Permission to use, copy, modify, and distribute this software and its documentation under the terms of the GNU eneral Public License is hereby granted. No representations are made about the suitability of this software for any purpose. It is provided "as is" without express or implied warranty.

See the GNU General Public License.

EclipsesJDE.c


/* see page 379 */

#ifdef ASTROALGO
   #include <math.h>
   #include <stdio.h>
   #include "AstroAlgo.h"

   __declspec(dllexport) short __stdcall
#else
   short
#endif

#define D (double)

ShEclipsesJDE(double *pdoResult, double doYear, short shType)
   {
   short  shReturnValue = (short)  0;

   double doA1      = D 0;
   double doE       = D 0;
   double doF       = D 0;
   double doF1      = D 0;
   double doJDE     = D 0;
   double doJDEcorr = D 0;
   double doK       = D 0;
   double doM       = D 0;
   double doM_      = D 0;
   double doO       = D 0;
   double doP       = D 0;
   double doQ       = D 0;
   double doT0       = D 0;
   double doT1       = D 0;
   double doTemp1   = D 0;

   if (pdoResult == NULL)
      {
      shReturnValue = (short) 1;
      }
   else if ((doYear < -2000) || (doYear > 6000))
      {
      shReturnValue = (short) 2;
      }
   else if ((shType < 0) || (shType > 1))   /* 0 solar eclipse, 1 lunar eclipse */
      {
      shReturnValue = (short) 3;
      }
   else
      {
      *pdoResult = D -1;

      doK = (doYear - D 2000) * D 12.3685;
      doK = floor(doK);

      if (shType == 1)     /* lunar eclipse */
         {
         doK += D 0.5;
         }

      doT0 = doK / D 1236.85;

      doJDE =    D 2451550.09766
              + (D 29.530588861  * doK)
              + (D 0.0015437     * doT0 * doT0)
              + (D 0.000000150   * doT0 * doT0 * doT0)
              + (D 0.00000000073 * doT0 * doT0 * doT0 * doT0);

      doF  =     D 160.7108
              + (D 390.67050284  * doK)
              - (D   0.0016118   * doT0 * doT0)
              - (D   0.00000227  * doT0 * doT0 * doT0)
              + (D   0.000000011 * doT0 * doT0 * doT0 * doT0);

      doF  = REDUCE360(doF);

      doTemp1 = sin(DEGREES2RADIAN(doF));
      if (doTemp1 < 0)                               /* abs */
         {
         doTemp1 *= D -1;
         }

      if (doTemp1 > D 0.3583679495453)               /* no eclipse */
         {
         *pdoResult = D 0;
         }
      else
         {
         doT1 = (doJDE - D 2451545) / D 36525;

         doE   =    D 1
                 - (D 0.002516      * doT1)
                 - (D 0.0000074     * 1 * doT1);

         doM   =    D   2.5534
                 + (D  29.10535670  * doK)
                 - (D   0.0000014   * doT1 * doT1)
                 - (D   0.00000011  * doT1 * doT1 * doT1);

         doM_  =    D 201.5643
                 + (D 385.81693528  * doK)
                 + (D   0.0107582   * doT1 * doT1)
                 + (D   0.0000138   * doT1 * doT1 * doT1)
                 - (D   0.000000058 * doT1 * doT1 * doT1 * doT1);


         doO   =    D 124.7746
                 - (D   1.56375588  * doK)
                 + (D   0.0020672   * doT1 * doT1)
                 + (D   0.00000215  * doT1 * doT1 * doT1);

         doA1 = (D 299.77 + (D 0.107408 * doK)) - (D 0.009173 * doT1 * doT1);
         doF1 = doF - (D 0.02665 * sin(DEGREES2RADIAN(doO)));

         if (shType == 0)          /* solar eclipse */
            {
            doJDEcorr += D -0.4075       * sin(DEGREES2RADIAN(doM_));
            doJDEcorr += D  0.1721 * doE * sin(DEGREES2RADIAN(doM));
            }

         else if (shType == 1)     /* lunar eclipse */
            {
            doJDEcorr += D -0.4065       * sin(DEGREES2RADIAN(doM_));
            doJDEcorr += D  0.1727 * doE * sin(DEGREES2RADIAN(doM));
            }
         else
            {
            shReturnValue = (short) 4;
            }

         doJDEcorr += D  0.0161       * sin(DEGREES2RADIAN(D 2 * doM_));
         doJDEcorr += D -0.0097       * sin(DEGREES2RADIAN(D 2 * doF1));
         doJDEcorr += D  0.0073 * doE * sin(DEGREES2RADIAN(doM_ - doM));
         doJDEcorr += D -0.0050 * doE * sin(DEGREES2RADIAN(doM_ + doM));
         doJDEcorr += D -0.0023       * sin(DEGREES2RADIAN(doM_ - (D 2 * doF1)));
         doJDEcorr += D  0.0021 * doE * sin(DEGREES2RADIAN(D 2 * doM));
         doJDEcorr += D  0.0012       * sin(DEGREES2RADIAN(doM_ + (D 2 * doF1)));
         doJDEcorr += D  0.0006 * doE * sin(DEGREES2RADIAN((D 2 * doM_) + doM));
         doJDEcorr += D -0.0004       * sin(DEGREES2RADIAN(D 3 * doM_));
         doJDEcorr += D -0.0003 * doE * sin(DEGREES2RADIAN(doM + (D 2 * doF1)));
         doJDEcorr += D  0.0003       * sin(DEGREES2RADIAN(doA1));
         doJDEcorr += D -0.0002 * doE * sin(DEGREES2RADIAN(doM - (D 2 * doF1)));
         doJDEcorr += D -0.0002 * doE * sin(DEGREES2RADIAN((D 2 * doM_) - doM));
         doJDEcorr += D -0.0002       * sin(DEGREES2RADIAN(doO));
         }

      doP += D  0.2070 * doE * sin(DEGREES2RADIAN(doM));
      doP += D  0.0024 * doE * sin(DEGREES2RADIAN(D 2 * doM));
      doP += D -0.0392       * sin(DEGREES2RADIAN(doM_));
      doP += D  0.0116       * sin(DEGREES2RADIAN(D 2 * doM_));
      doP += D -0.0073 * doE * sin(DEGREES2RADIAN(doM_ + doM));
      doP += D  0.0067 * doE * sin(DEGREES2RADIAN(doM_ - doM));
      doP += D  0.0118       * sin(DEGREES2RADIAN(D 2 * doF1));

      *pdoResult =  doJDE + doJDEcorr;
      }

   #if 1
   doM  = REDUCE360(doM);
   doM_ = REDUCE360(doM_);
   doO  = REDUCE360(doO);
   doF1 = REDUCE360(doF1);

   (void) fprintf(stdout, "\n*pdoResult = %13.4f", *pdoResult);
   (void) fprintf(stdout, "\nA1         = %13.4f", doA1);
   (void) fprintf(stdout, "\nE          = %13.4f", doE);
   (void) fprintf(stdout, "\nF          = %13.4f", doF);
   (void) fprintf(stdout, "\nF1         = %13.4f", doF1);
   (void) fprintf(stdout, "\nJDE        = %13.4f", doJDE);
   (void) fprintf(stdout, "\nJDEcorr    = %13.4f", doJDEcorr);
   (void) fprintf(stdout, "\nk          = %13.4f", doK);
   (void) fprintf(stdout, "\nM          = %13.4f", doM);
   (void) fprintf(stdout, "\nM_         = %13.4f", doM_);
   (void) fprintf(stdout, "\nO          = %13.4f", doO);
   (void) fprintf(stdout, "\nP          = %13.4f", doP);
   (void) fprintf(stdout, "\nQ          = %13.4f", doQ);
   (void) fprintf(stdout, "\nT0         = %13.4f", doT0);
   (void) fprintf(stdout, "\nT1         = %13.4f", doT1);
   (void) fprintf(stdout, "%s", "\n");
   #endif

   return shReturnValue;
   }

#undef D

< EasterSunday.c | index | GreenwichSideralTime.c >


printer friendly view

   
Google
 
Web www.christophedavid.org