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])]