import math from scripts.radiation_tilted import RadiationTilted import hub.helpers.constants as cte from hub.helpers.monthly_values import MonthlyValues class PVSizingSimulation(RadiationTilted): def __init__(self, building, solar_angles, tilt_angle, module_height, module_width, ghi): super().__init__(building, solar_angles, tilt_angle, ghi) self.module_height = module_height self.module_width = module_width self.total_number_of_panels = 0 self.enrich() def available_space(self): roof_area = self.building.roofs[0].perimeter_area maintenance_factor = 0.1 orientation_factor = 0.2 if self.building.function == cte.RESIDENTIAL: mechanical_equipment_factor = 0.2 else: mechanical_equipment_factor = 0.3 available_roof = (maintenance_factor + orientation_factor + mechanical_equipment_factor) * roof_area return available_roof def inter_row_spacing(self): winter_solstice = self.df[(self.df['AST'].dt.month == 12) & (self.df['AST'].dt.day == 21) & (self.df['AST'].dt.hour == 12)] solar_altitude = winter_solstice['solar altitude'].values[0] solar_azimuth = winter_solstice['solar azimuth'].values[0] distance = ((self.module_height * abs(math.cos(math.radians(solar_azimuth)))) / math.tan(math.radians(solar_altitude))) distance = float(format(distance, '.1f')) return distance def number_of_panels(self, available_roof, inter_row_distance): space_dimension = math.sqrt(available_roof) space_dimension = float(format(space_dimension, '.2f')) panels_per_row = math.ceil(space_dimension / self.module_width) number_of_rows = math.ceil(space_dimension / inter_row_distance) self.total_number_of_panels = panels_per_row * number_of_rows return panels_per_row, number_of_rows def pv_output(self): radiation = self.total_radiation_tilted pv_module_area = self.module_width * self.module_height available_roof = self.available_space() inter_row_spacing = self.inter_row_spacing() self.number_of_panels(available_roof, inter_row_spacing) self.building.roofs[0].installed_solar_collector_area = pv_module_area * self.total_number_of_panels system_efficiency = 0.2 pv_hourly_production = [x * system_efficiency * self.total_number_of_panels * pv_module_area * cte.WATTS_HOUR_TO_JULES for x in radiation] self.building.onsite_electrical_production[cte.HOUR] = pv_hourly_production self.building.onsite_electrical_production[cte.MONTH] = ( MonthlyValues.get_total_month(self.building.onsite_electrical_production[cte.HOUR])) self.building.onsite_electrical_production[cte.YEAR] = [sum(self.building.onsite_electrical_production[cte.MONTH])]