113 lines
5.0 KiB
Python
113 lines
5.0 KiB
Python
import pandas as pd
|
|
import math
|
|
import hub.helpers.constants as cte
|
|
from hub.helpers.monthly_values import MonthlyValues
|
|
|
|
|
|
class RadiationTilted:
|
|
def __init__(self, building, solar_angles, tilt_angle, ghi, solar_constant=1366.1, maximum_clearness_index=1,
|
|
min_cos_zenith=0.065, maximum_zenith_angle=87):
|
|
self.building = building
|
|
self.ghi = ghi
|
|
self.tilt_angle = tilt_angle
|
|
self.zeniths = solar_angles['zenith'].tolist()[:-1]
|
|
self.incidents = solar_angles['incident angle'].tolist()[:-1]
|
|
self.date_time = solar_angles['DateTime'].tolist()[:-1]
|
|
self.ast = solar_angles['AST'].tolist()[:-1]
|
|
self.solar_azimuth = solar_angles['solar azimuth'].tolist()[:-1]
|
|
self.solar_altitude = solar_angles['solar altitude'].tolist()[:-1]
|
|
data = {'DateTime': self.date_time, 'AST': self.ast, 'solar altitude': self.solar_altitude, 'zenith': self.zeniths,
|
|
'solar azimuth': self.solar_azimuth, 'incident angle': self.incidents, 'ghi': self.ghi}
|
|
self.df = pd.DataFrame(data)
|
|
self.df['DateTime'] = pd.to_datetime(self.df['DateTime'])
|
|
self.df['AST'] = pd.to_datetime(self.df['AST'])
|
|
self.df.set_index('DateTime', inplace=True)
|
|
self.solar_constant = solar_constant
|
|
self.maximum_clearness_index = maximum_clearness_index
|
|
self.min_cos_zenith = min_cos_zenith
|
|
self.maximum_zenith_angle = maximum_zenith_angle
|
|
self.i_on = []
|
|
self.i_oh = []
|
|
self.k_t = []
|
|
self.fraction_diffuse = []
|
|
self.diffuse_horizontal = []
|
|
self.beam_horizontal = []
|
|
self.dni = []
|
|
self.beam_tilted = []
|
|
self.diffuse_tilted = []
|
|
self.total_radiation_tilted = []
|
|
self.calculate()
|
|
|
|
def dni_extra(self):
|
|
for i in range(len(self.df)):
|
|
self.i_on.append(self.solar_constant * (1 + 0.033 * math.cos(math.radians(360 * self.df.index.dayofyear[i] / 365))))
|
|
|
|
self.df['extraterrestrial normal radiation (Wh/m2)'] = self.i_on
|
|
|
|
def clearness_index(self):
|
|
for i in range(len(self.df)):
|
|
self.i_oh.append(self.i_on[i] * max(math.cos(math.radians(self.zeniths[i])), self.min_cos_zenith))
|
|
self.k_t.append(self.ghi[i] / self.i_oh[i])
|
|
self.k_t[i] = max(0, self.k_t[i])
|
|
self.k_t[i] = min(self.maximum_clearness_index, self.k_t[i])
|
|
self.df['extraterrestrial radiation on horizontal (Wh/m2)'] = self.i_oh
|
|
self.df['clearness index'] = self.k_t
|
|
|
|
def diffuse_fraction(self):
|
|
for i in range(len(self.df)):
|
|
if self.k_t[i] <= 0.22:
|
|
self.fraction_diffuse.append(1 - 0.09 * self.k_t[i])
|
|
elif self.k_t[i] <= 0.8:
|
|
self.fraction_diffuse.append(0.9511 - 0.1604 * self.k_t[i] + 4.388 * self.k_t[i] ** 2 -
|
|
16.638 * self.k_t[i] ** 3 + 12.336 * self.k_t[i] ** 4)
|
|
else:
|
|
self.fraction_diffuse.append(0.165)
|
|
if self.zeniths[i] > self.maximum_zenith_angle:
|
|
self.fraction_diffuse[i] = 1
|
|
|
|
self.df['diffuse fraction'] = self.fraction_diffuse
|
|
|
|
def radiation_components_horizontal(self):
|
|
for i in range(len(self.df)):
|
|
self.diffuse_horizontal.append(self.ghi[i] * self.fraction_diffuse[i])
|
|
self.beam_horizontal.append(self.ghi[i] - self.diffuse_horizontal[i])
|
|
self.dni.append((self.ghi[i] - self.diffuse_horizontal[i]) / math.cos(math.radians(self.zeniths[i])))
|
|
if self.zeniths[i] > self.maximum_zenith_angle or self.dni[i] < 0:
|
|
self.dni[i] = 0
|
|
|
|
self.df['diffuse horizontal (Wh/m2)'] = self.diffuse_horizontal
|
|
self.df['dni (Wh/m2)'] = self.dni
|
|
self.df['beam horizontal (Wh/m2)'] = self.beam_horizontal
|
|
|
|
def radiation_components_tilted(self):
|
|
for i in range(len(self.df)):
|
|
self.beam_tilted.append(self.dni[i] * math.cos(math.radians(self.incidents[i])))
|
|
self.beam_tilted[i] = max(self.beam_tilted[i], 0)
|
|
self.diffuse_tilted.append(self.diffuse_horizontal[i] * ((1 + math.cos(math.radians(self.tilt_angle))) / 2))
|
|
self.total_radiation_tilted.append(self.beam_tilted[i] + self.diffuse_tilted[i])
|
|
|
|
self.df['beam tilted (Wh/m2)'] = self.beam_tilted
|
|
self.df['diffuse tilted (Wh/m2)'] = self.diffuse_tilted
|
|
self.df['total radiation tilted (Wh/m2)'] = self.total_radiation_tilted
|
|
|
|
def calculate(self) -> pd.DataFrame:
|
|
self.dni_extra()
|
|
self.clearness_index()
|
|
self.diffuse_fraction()
|
|
self.radiation_components_horizontal()
|
|
self.radiation_components_tilted()
|
|
return self.df
|
|
|
|
def enrich(self):
|
|
tilted_radiation = self.total_radiation_tilted
|
|
self.building.roofs[0].global_irradiance_tilted[cte.HOUR] = [x * cte.WATTS_HOUR_TO_JULES for x in
|
|
tilted_radiation]
|
|
self.building.roofs[0].global_irradiance_tilted[cte.HOUR] = [x * cte.WATTS_HOUR_TO_JULES for x in
|
|
tilted_radiation]
|
|
self.building.roofs[0].global_irradiance_tilted[cte.MONTH] = (
|
|
MonthlyValues.get_total_month(self.building.roofs[0].global_irradiance_tilted[cte.HOUR]))
|
|
self.building.roofs[0].global_irradiance_tilted[cte.YEAR] = \
|
|
[sum(self.building.roofs[0].global_irradiance_tilted[cte.MONTH])]
|
|
|
|
|