public
Description: Pysolar is a collection of Python libraries for simulating the irradiation of any point on earth by the sun. It includes code for extremely precise ephemeris calculations.
Homepage: http://pysolar.org
Clone URL: git://github.com/pingswept/pysolar.git
pysolar / simulate.py
100644 67 lines (55 sloc) 2.722 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/usr/bin/python
 
# Library for calculating location of the sun
 
# Copyright 2007 Brandon Stafford
#
# This file is part of Pysolar.
#
# Pysolar is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# Pysolar is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with Pysolar. If not, see <http://www.gnu.org/licenses/>.
 
import datetime
import radiation
import solar
from math import *
 
def BuildTimeList(start_utc_datetime, end_utc_datetime, step_minutes):
'''Create a list of sample points evenly spaced apart by step_minutes.'''
step = step_minutes * 60
time_list = []
span = end_utc_datetime - start_utc_datetime
dt = datetime.timedelta(seconds = step)
return map(lambda n: start_utc_datetime + dt * n, range((span.days * 86400 + span.seconds) / step))
 
def CheckAgainstHorizon(power):
    (time, alt, az, radiation, shade) = power
    alt_zero = 380
 
    if shade < alt_zero - int(alt_zero * sin(radians(alt))):
        radiation = 0
 
    return (time, alt, az, radiation, shade)
 
def SimulateSpan(latitude_deg, longitude_deg, horizon, start_utc_datetime, end_utc_datetime, step_minutes, elevation = 0, temperature_celsius = 25, pressure_millibars = 1013.25):
'''Simulate the motion of the sun over a time span and location of your choosing.
The start and end points are set by datetime objects, which can be created with
the standard Python datetime module like this:
import datetime
start = datetime.datetime(2008, 12, 23, 23, 14, 0)
'''
time_list = BuildTimeList(start_utc_datetime, end_utc_datetime, step_minutes)
 
angles_list = [(
time,
solar.GetAltitude(latitude_deg, longitude_deg, time, elevation, temperature_celsius, pressure_millibars),
solar.GetAzimuth(latitude_deg, longitude_deg, time, elevation)
) for time in time_list]
power_list = [(time, alt, az, radiation.GetRadiationDirect(time, alt), horizon[int(az)]) for (time, alt, az) in angles_list]
return filter(CheckAgainstHorizon, power_list)
 
# xs = shade.GetXShade(width, 120, azimuth_deg)
# ys = shade.GetYShade(height, 120, altitude_deg)
# shaded_area = xs * ys
# shaded_percentage = shaded_area/area
# import simulate, datetime; s = datetime.datetime(2008,1,1); e = datetime.datetime(2008,1,5); simulate.SimulateSpan(42.0, -70.0, s, e, 30)