Source code for pyclearsky.clearskyrad

# Copyright (c) 2013, 2018 Santosh Philip
# =======================================================================
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# =======================================================================
"""calcs for clearsky radiation from Ashrae fundamentals 2009. page 14.9"""

import math


[docs]def func(arg1, arg2): """Summary line of func. Extended description of function. This is a Sample Function to show how the function documentation should be done. This is the numpy style documentation, will be formatted beautifully by sphinx-napoleon extension Parameters ---------- arg1 : int Description of arg1 arg2 : str Description of arg2 Returns ------- bool Description of return value """ return True
[docs]def degcos(theta): """return cos(theta) where theta is in degrees Parameters ---------- theta : float angle in degrees Returns ------- float cosine value of the angle theta (theta is in degrees) """ theta = math.radians(theta) return math.cos(theta)
[docs]def degsin(theta): """return sin(theta) where theta is in degrees Parameters ---------- theta : float angle in degrees Returns ------- float sine value of the angle theta (theta is in degrees) """ theta = math.radians(theta) return math.sin(theta)
[docs]def ETradiation(daynum=None, thedate=None): """Calculates Extraterrestial Radiation for a specific day This is equation (4) from ASHRAE Fundamentals 2009, page 14.7. The equation is: - E0 = Esc (1 + 0.033 * cos(360 * (n - 3) / 365)) - where n = daynum ETradiation takes *daynum* OR *thedate* as an input - daynum is the day of the year - (1 for January 1, 32 for February 1, etc) - thedate is a datetime.datetime object - ETradiation will calculate the daynum from the date Parameters ---------- daynum : int daynum is the day of the year thedate : datetime.datetime() daynum is calculated from the datetime object Returns ------- float Extraterrestial Radiation for a specific day """ if daynum: pass else: daynum = thedate.timetuple().tm_yday Esc = 1367. E0 = Esc * (1 + 0.033 * degcos(360. * (daynum - 3) / 365.)) return E0
[docs]def airmass(alt): """Calculates the airmass This is equation (16) from ASHRAE Fundamentals 2009, page 14.9. The equation is: - m = 1 / [sin(b) + 0.50572 * power(6.07995 + b, -1.6364)] - where b = solar altitude Parameters ---------- alt : float solar altitude Returns ------- float Air Mass """ b = alt m = 1 / (degsin(b) + 0.50572 * math.pow(6.07995 + b, -1.6364)) return m
[docs]def tau(fhandle): """return tau_b and tau_d for each month of the year These values are in the weather file with extension .stat Parameters ---------- fhandle : filehandle fhandle is a file open for reading Returns ------- taub : list taud : list return two lists with values of taub and taud """ for line in fhandle: line = line.strip() if line.startswith("taub"): words = line.split() taub = words[-12:] taub = [float(word) for word in taub] break for line in fhandle: line = line.strip() if line.startswith("taud"): words = line.split() taud = words[-12:] taud = [float(word) for word in taud] break return taub, taud
[docs]def getab(taub, taud): """calculates value of ab in equation (19) Equation (19) in ASHRAE Fundamentals 2009 pg 14.9 Parameters ---------- taub : float value of taub in equation (19) taud : float value of taud in equation (19) Returns ------- float the value of ab """ v1 = 1.219 v2 = 0.043 * taub v3 = 0.151 * taud v4 = 0.204 * taub * taud return v1 - v2 - v3 - v4
[docs]def getad(taub, taud): """calculates value of ad in equation (20) Equation (20) in ASHRAE Fundamentals 2009 pg 14.9 Parameters ---------- taub : float value of taub in equation (20) taud : float value of taud in equation (20) Returns ------- float the value of ad """ # """return ad in equation 20 # """ v1 = 0.202 v2 = 0.852 * taub v3 = 0.007 * taud v4 = 0.357 * taub * taud # print v1, v2, v3, v4 # return v1 - v2 - v3 - v4 # typo in the equation. Example is correct. return v1 + v2 - v3 - v4
[docs]def directnormal_inner(E0, taub, m, ab): """Calculates value of Eb in equation (17) Equation (17) in ASHRAE Fundamentals 2009 page 14.9 The equation is - Eb = E0 * exp( - taub * power(m, ab) ) Parameters ---------- E0 : float Extraterrestrial normal irradiance [Equation (4)] taub : float beam optical depth m : float Air Mass Equation (16) ab : float beam air mass exponents Returns ------- float Beam normal irradiance """ # """return the direct normal radiation # equation 17 # Eb = E0 * exp( - taub * power(m, ab) ) # """ Eb = E0 * math.exp(-taub * math.pow(m, ab)) return Eb
[docs]def diffhoriz_inner(E0, taud, m, ad): """Calculates value of Ed in equation (18) Equation (18) in ASHRAE Fundamentals 2009 page 14.9 The equation is - Ed = E0 * exp(-taud * power(m, ad)) Parameters ---------- E0 : float Extraterrestrial normal irradiance [Equation (4)] taud : float diffuse optical depth m : float Air Mass Equation (16) ad : float diffuse air mass exponents Returns ------- float Diffuse horizontal irradiance """ # """return diffuse horizontal radiation # equation 18 # Ed = E0 * exp(-taud * power(m, ad))""" # print math.exp(-taud * math.pow(m, ad)) Ed = E0 * math.exp(-taud * math.pow(m, ad)) return Ed
[docs]def directnormal(taub, taud, alt, daynum=None, thedate=None): """calculate direct normal irradiance from a clear sky - calculations for a specific day and specific sun altitude - taub and taud can be got from the .stat file - the .stat comes with the weather files (.epw, .ddy, .stat) - use either daynum or thedate - Calls directnormal_inner() that calculates equation (17) Parameters ---------- taub : float Clear Sky Optical Depth for Beam Irradiance taud : float Clear Sky Optical Depth for Diffuse Irradiance alt : float Altitude of the sun daynum : int daynum is the day of the year thedate : datetime.datetime() daynum is calculated from the datetime object Returns ------- float Direct Normal irradiance from a clear sky """ E0 = ETradiation(daynum=daynum, thedate=thedate) m = airmass(alt) ab = getab(taub, taud) Eb = directnormal_inner(E0, taub, m, ab) return Eb
[docs]def diffusehorizontal(taub, taud, alt, daynum=None, thedate=None): """calculate diffuse horizontal irradiance from a clear sky - calculations for a specific day and specific sun altitude - taub and taud can be got from the .stat file - the .stat comes with the weather files (.epw, .ddy, .stat) - use either daynum or thedate - Calls diffhoriz_inner() that calculates equation (18) Parameters ---------- taub : float Clear Sky Optical Depth for Beam Irradiance taud : float Clear Sky Optical Depth for Diffuse Irradiance alt : float Altitude of the sun daynum : int daynum is the day of the year thedate : datetime.datetime() daynum is calculated from the datetime object Returns ------- float Direct Normal irradiance from a clear sky """ E0 = ETradiation(daynum=daynum, thedate=thedate) m = airmass(alt) ad = getad(taub, taud) # print E0, taud, m, ad Ed = diffhoriz_inner(E0, taud, m, ad) return Ed