def geom_mean_long(time): ''' Sun mean longitude (degrees) ''' julian_cent = julian_century(time) angle = 280.46646 + julian_cent * (julian_cent * 3.032e-4 + 36000.76983) return angle % 360
def daytime_length(time, latitude): ''' Length of day time (Sunlight duration) in hours. ''' julian_cent = julian_century(time) hour_angle = sunrise_hour_angle(time, latitude) return 8 * hour_angle / 60
def geom_mean_anom(time): ''' Sun Mean Anomaly (degrees) ''' julian_cent = julian_century(time) angle = 357.52911 + julian_cent * (35999.05029 - julian_cent * 1.537e-4) return angle
def sunset(time, latitude, longitude): ''' Sunset time ''' noon = solar_noon(time, longitude) julian_cent = julian_century(time) hour_angle = sunrise_hour_angle(time, latitude) delta = datetime.timedelta(minutes=4 * hour_angle) return noon + delta
def solar_zenith(time, latitude, longitude): ''' Solar Zenith Angle in degrees ''' julian_cent = julian_century(time) decn = solar_declination(time) h_angle = hour_angle(time, longitude) a1 = sin(radians(latitude)) * sin(radians(decn)) a2 = cos(radians(latitude)) * cos(radians(decn)) * cos(radians(h_angle)) return degrees(acos(a1 + a2))
def equation_of_center(time): ''' Sun Equation of Center ''' julian_cent = julian_century(time) anom = geom_mean_anom(time) anom = radians(anom) t1 = sin(anom) * (1.914602 - julian_cent * (0.004817 + 1.4e-5 * julian_cent)) t2 = sin(2 * anom) * (0.019993 - 0.000101 * julian_cent) t3 = sin(3 * anom) * 0.000289 return t1 + t2 + t3
def true_solar_time(time, longitude): ''' True solar time in minutes from midnight ''' utc = pytz.timezone('UTC') julian_cent = julian_century(time) eot = equation_of_time(time) delta = datetime.timedelta(minutes=eot + longitude * 4) true_time = (time + delta).astimezone(utc) hour = true_time.hour minute = true_time.minute second = true_time.second return get_minutes(true_time)
def solar_noon(time, longitude): ''' Solar noon time ''' tz = time.tzinfo utc = pytz.timezone('UTC') julian_cent = julian_century(time) eot = equation_of_time(time) noon_offset = (720 - 4 * longitude - eot) / 1440 base_time = datetime.time() midnight = datetime.datetime.combine(time.date(), base_time) midnight = utc.localize(midnight) noon_utc = midnight + datetime.timedelta(days=noon_offset) return noon_utc.astimezone(tz)
def solar_azimuth(time, latitude, longitude): ''' Azimuth angle (measured Clockwise from North) ''' julian_cent = julian_century(time) zenith = radians(solar_zenith(time, latitude, longitude)) decln = radians(solar_declination(time)) h_angle = hour_angle(time, longitude) lat = radians(latitude) if h_angle > 0: a1 = sin(lat) * cos(zenith) - sin(decln) a2 = cos(lat) * sin(zenith) azimuth = degrees(acos( a1 / a2)) + 180 return azimuth%360 else: a1 = sin(lat) * cos(zenith) - sin(decln) a2 = cos(lat) * sin(zenith) azimuth = 540 - degrees(acos(a1 /a2)) return azimuth%360
def obeliq_corr(time): julian_cent = julian_century(time) moe = mean_obliq_ecliptic(time) return moe + 0.00256 * cos(radians(125.04 - 1934.136 * julian_cent))
def mean_obliq_ecliptic(time): julian_cent = julian_century(time) res = 46.815 + julian_cent * (0.00059 - julian_cent * 0.001813) res = 21.448 - julian_cent * (res) res = 23 + (26 + res / 60) / 60 return res
def app_long(time): julian_cent = julian_century(time) tlon = true_longitude(time) return tlon - 0.00569 - 0.00478 * sin( radians(125.04 - 1934.136 * julian_cent))
def eccent_earth_orbit(time): ''' Eccentricity of Earth orbit ''' julian_cent = julian_century(time) return 0.016708634 - julian_cent * (4.2037e-5 + 1.267e-7 * julian_cent)
def test_julian_century(self): tz = pytz.timezone('Australia/Perth') time = datetime.datetime(2010, 6, 21, 4, 45) time = tz.localize(time) self.assertAlmostEqual(julian_century(time), 0.10467801733972)