Sunrise.csh



# Calculate sunrise and sunset times based on an algorithm that
# originally appeared in QST, June 84, page 56.  Transcribed from
# a BASIC program by N4TL based on calculations originally done
# by WS4G and SM0CCN.

# Usage:  sun [ month day [latitude longitude]]

# If latitude or longitude are omitted, this script will look for
# global variables named LATITUDE and LONGITUDE.  If the month
# or day is omitted, today's date will be used.

proc declination(month, day)
   # Approximation for sun declination
   local dec
   @ dec = day + 30.3*(month - 1)
   @ dec = 10 + .988*dec
   @ dec = -23.5*cos(dec*pi/180)
   return dec
end

proc fnacs(x)
   return pi/2 - atan(x/sqrt(1-x*x))
end

proc printtime(name, timeofday, suffix)
   local hour, min
   if (timeofday < 0) @ timeofday += 24
   if (timeofday > 24) @ timeofday -= 24
   @ hour = floor(timeofday)
   @ min = round((timeofday - hour)*60)
   if (min == 60) then
      @ min = 0
      @ hour++
   end
   calc printf("%s is %d:%02d%s", name, hour, min, suffix)
end

proc sunrise(month, day, latitude, longitude)
   local i, x, y, sunrise, sunset, length, dec, Month
   set Month = january february march april may june ^
      july august september october november december
   if (latitude == "" || latitude == "") then
      if ($?LONGITUDE && $?LATITUDE) then
         @ latitude = LATITUDE
         @ longitude = LONGITUDE
      else
         echo Longitude and Latitude must be specified
         return
      end
   end
   if (month == "" || day == "") then
      local dt
      set dt = `dt`
      set month = $dt:1
      set day = $dt:2
   end
   if (month !~ '[0-9]*') then
      local m
      @ m = "$lower(month)*"
      for i = 0 to 11 do
         if (Month[i] =~ m) break;
      end
      @ month = i + 1
   end
   @ dec = declination(month, day)
   @ x = longitude/15
   @ y = tan(dec*pi/180)*tan(latitude*pi/180)
   if (y > 1 || y < -1) then
      echo No sunrise or sunset
   else
      @ z = fnacs(y)*180/pi/15
      @ sunrise = x + z
      @ sunset = x - z
      @ length = sunset - sunrise
      printtime Sunrise $sunrise " UTC"
      printtime Sunset $sunset " UTC"
      printtime "Length of day" $length
   end
end

sunrise $argv



Hamilton C shell | Free Updates | Free Demo Software | Win32 Training
Y2K | Customer Testimonials | On-line Hamilton C shell User Guide
Home | Email | Support | Company Profile | Distributors | Links



Copyright © 1997-2001 by Hamilton Laboratories. All rights reserved.
You are visitor number 838. This page was last modified August 14, 2001.