home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_2.iso / files / 678b.lha / SunRise / SunRise.c < prev    next >
C/C++ Source or Header  |  1992-07-02  |  4KB  |  156 lines

  1. /*
  2.  *  SunRise.c - a program to calculate sunrise and sunset
  3.  *  Amiga C version by Ralph Siemsen 30-Jun-92 @ Ottawa
  4.  *
  5.  *  This program calculates the time of sunrise, sunset, and twilight
  6.  *  (astronomical, nautical, and civil) to within a minute or two
  7.  *  during the second half of the twentieth century.
  8.  *
  9.  */
  10.  
  11. #include <stdio.h>
  12. #include <math.h>
  13.  
  14. #define PI 3.1415926536
  15. #define RISE 0
  16. #define SET 1
  17.  
  18. double    CalcTime(), StoD(), DtoS(), Norm();
  19. double    ApproxTime, SRA, SDec;
  20. double    Latitude, Longtitude, TimeZone;
  21. short    Month, Day, Year, DayOfYear, Mode;
  22.  
  23. main ()
  24. {
  25.   short i;  /* variable for local storage */
  26.  
  27.   /* Query the user for latitude,longtitude,etc. */
  28.     GetInputs();
  29.  
  30.   /* Compute the day-of-year */
  31.     i = (Month + 9) / 12;
  32.     if (Year % 4) i*=2;        /* check for leap year */
  33.     DayOfYear = (275 * Month)/9 + Day - i - 30;
  34.  
  35.   /* Rising Phenomena */
  36.     Mode = RISE;
  37.     Prep ();
  38.     printf ("\n");
  39.     printf ("  A. DAWN: %5.2f\n", CalcTime(-0.309017) );
  40.     printf ("  N. DAWN: %5.2f\n", CalcTime(-0.207912) );
  41.     printf ("  C. DAWN: %5.2f\n", CalcTime(-0.104528) );
  42.     printf ("  SUNRISE: %5.2f\n", CalcTime(-0.0145439) );
  43.  
  44.   /* Setting Phenomena */
  45.     Mode = SET;
  46.     Prep ();
  47.     printf ("\n");
  48.     printf ("  SUNSET : %5.2f\n", CalcTime(-0.0145439) );
  49.     printf ("  C. DUSK: %5.2f\n", CalcTime(-0.104528) );
  50.     printf ("  N. DUSK: %5.2f\n", CalcTime(-0.207912) );
  51.     printf ("  A. DUSK: %5.2f\n", CalcTime(-0.309017) );
  52. }
  53.  
  54. GetInputs ()
  55. {
  56.     double temp;
  57.  
  58.     printf ("Latitude? ");
  59.         scanf ("%lf",&temp);
  60.         Latitude = 0.0174533 * StoD(temp);
  61.     printf ("Longtitude? ");
  62.         scanf ("%lf",&temp);
  63.         Longtitude = 0.0174533 * StoD(temp);
  64.     printf ("Time Zone? ");
  65.         scanf ("%lf",&temp);
  66.         TimeZone = 0.261799 * StoD(temp);
  67.     printf ("Year? ");
  68.         scanf ("%d",&Year);
  69.     printf ("Month? ");
  70.         scanf ("%d",&Month);
  71.     printf ("Day? ");
  72.         scanf ("%d",&Day);
  73. }
  74.  
  75. Prep ()
  76. {
  77.     /* This routine initializes the global variables */
  78.     /* ApproxTime, SRA, and SDec */
  79.  
  80.     double SMA;        /* Solar Mean Anomaly */
  81.     double STL;        /* Solar True Longtitude */
  82.  
  83.     ApproxTime = DayOfYear + (((Mode ? 3*PI/2 : PI/2) + Longtitude) / (2*PI));
  84.  
  85.     SMA = ApproxTime * 0.017202 - 0.0574039;
  86.     STL = SMA + 0.0334405*sin(SMA) + 0.000349066*sin(2*SMA) + 4.93289;
  87.     STL = Norm(STL);
  88.  
  89.     SRA = atan (0.91746*tan(STL));
  90.     /* Quadrant Adjustment: */
  91.     if (STL > 3*PI/2) SRA = SRA + 2*PI;
  92.     else if (STL > PI/2) SRA = SRA + PI;
  93.  
  94.     SDec = 0.39782*sin(STL);
  95.     SDec = atan (SDec / sqrt (-SDec*SDec + 1));
  96. }
  97.  
  98. double CalcTime (magic)
  99. double magic;
  100. {
  101.     double S,T;
  102.     
  103.     S = magic - sin(SDec) * sin(Latitude);
  104.     S = S / (cos(SDec) * cos(Latitude));
  105.     
  106.     if (fabs(S) <= 1) {
  107.         S = PI/2 - atan(S / sqrt(-S*S+1));        /* Adjustment */
  108.         if (Mode == RISE) S = 2*PI - S;
  109.         T = S + SRA - 0.0172028*ApproxTime - 1.73364 + Longtitude - TimeZone;
  110.     return (DtoS(3.81972*Norm(T)));
  111.     }
  112.     else return (0.0);
  113. }
  114.  
  115. double Norm (value)
  116. double (value);
  117. {
  118.     /* This routine adjusts its argument so that is in the range 0 - 2PI */
  119.  
  120.     while (value < 0) value = value + 2*PI;
  121.     while (value >= 2*PI) value = value - 2*PI;
  122.     return (value);
  123. }
  124.  
  125. double StoD (value)
  126. double value;
  127. {
  128.     /* convert the sexagesimal 'value' into decimal representation */
  129.     /* ie: 12.30 (12 hours,30 minutes) becomes 12.5 hours */
  130.  
  131.     short hours,minutes,seconds;
  132.  
  133.     hours = value;            /* real->integer */
  134.     value = (value - hours) * 100;
  135.     minutes = value;            /* real->integer */
  136.     value = (value - minutes) * 100;
  137.     seconds = value;            /* real->integer */
  138.  
  139.     return (hours + minutes/60.0 + seconds/3600.0);
  140. }
  141.  
  142. double DtoS (value)
  143. double value;
  144. {
  145.     /* convert decimal into sexagesimal; opposite of StoD() */
  146.  
  147.     short hours,minutes;
  148.  
  149.     hours = value;            /* real->integer */
  150.     value = (value - hours) * 60;
  151.     minutes = value+0.5;        /* real->integer */
  152.  
  153.     return (hours + minutes/100.0);
  154. }
  155.  
  156.