modify script to use bifacial modelling method

This commit is contained in:
Lucas Tan 2025-04-04 09:39:55 +08:00
parent 2cae51ccbf
commit cc7a1eb993

View File

@ -4,6 +4,7 @@ import logging
import math import math
import pvlib import pvlib
from pvlib.bifacial.pvfactors import pvfactors_timeseries
from Utilities.Processes import calculate_no_of_panels, calculate_required_system_size from Utilities.Processes import calculate_no_of_panels, calculate_required_system_size
@ -143,57 +144,48 @@ def calculate_energy_production_vertical(c):
no_of_rows = np.unique(panel_coordinates["y"]).shape[0] no_of_rows = np.unique(panel_coordinates["y"]).shape[0]
no_of_shaded_rows = no_of_rows - 1 no_of_shaded_rows = no_of_rows - 1
no_of_panels_in_row = np.unique(panel_coordinates["x"]).shape[0]
collector_width = c["panel"]["dimensions"]["length"] collector_width = c["panel"]["dimensions"]["length"]
# calculate delta between unique y coordinates of panels to get pitch # calculate delta between unique y coordinates of panels to get pitch
pitch = np.unique(panel_coordinates["y"])[1] - np.unique(panel_coordinates["y"])[0] pitch = np.unique(panel_coordinates["y"])[1] - np.unique(panel_coordinates["y"])[0]
surface_to_axis_offset = 0 surface_to_axis_offset = 0
shaded_row_rotation = 90 shaded_row_rotation = 90
shading_row_rotation = 90 shading_row_rotation = 90
surface_azimuth = 90 # east facing
axis_tilt = 0 axis_tilt = 0
axis_azimuth = 180 axis_azimuth = 0
morning_projected_solar_zenith = pvlib.shading.projected_solar_zenith_angle( ground_coverage = (
solar_zenith=solar_positions["apparent_zenith"], no_of_panels
solar_azimuth=solar_positions["azimuth"], * c["panel"]["dimensions"]["width"]
axis_azimuth=axis_azimuth, * c["panel"]["dimensions"]["thickness"]
axis_tilt=axis_tilt,
) )
land_area = (
c["environment"]["roof"]["dimensions"]["width"]
* c["environment"]["roof"]["dimensions"]["length"]
)
gcr = ground_coverage / land_area
logger.info(f"Ground coverage ratio: {gcr}")
morning_shaded_fraction = pvlib.shading.shaded_fraction1d( # use pvfactors bifacial modelling package
solar_zenith=morning_projected_solar_zenith, for row in range(no_of_rows):
solar_azimuth=solar_positions["azimuth"], result = pvfactors_timeseries(
axis_azimuth=axis_azimuth, solar_zenith=solar_positions["apparent_zenith"],
shaded_row_rotation=shaded_row_rotation, solar_azimuth=solar_positions["azimuth"],
shading_row_rotation=shading_row_rotation, surface_azimuth=surface_azimuth,
collector_width=collector_width, surface_tilt=90,
pitch=pitch, axis_azimuth=axis_azimuth,
surface_to_axis_offset=surface_to_axis_offset, timestamps=solar_positions.index,
axis_tilt=axis_tilt, dni=clearsky_data["dni"],
) dhi=clearsky_data["dhi"],
morning_shaded_fraction = morning_shaded_fraction * no_of_shaded_rows / no_of_rows gcr=gcr,
pvrow_height=c["panel"]["dimensions"]["length"],
afternoon_projected_solar_zenith = pvlib.shading.projected_solar_zenith_angle( pvrow_width=c["panel"]["dimensions"]["width"] * no_of_panels_in_row,
solar_zenith=solar_positions["apparent_zenith"], albedo=0.2,
solar_azimuth=solar_positions["azimuth"], n_pvrows=no_of_rows,
axis_azimuth=axis_azimuth + 180, index_observed_pvrow=row,
axis_tilt=axis_tilt, )
)
afternoon_shaded_fraction = pvlib.shading.shaded_fraction1d(
solar_zenith=afternoon_projected_solar_zenith,
solar_azimuth=solar_positions["azimuth"],
axis_azimuth=axis_azimuth + 180,
shaded_row_rotation=shaded_row_rotation,
shading_row_rotation=shading_row_rotation,
collector_width=collector_width,
pitch=pitch,
surface_to_axis_offset=surface_to_axis_offset,
axis_tilt=axis_tilt,
)
afternoon_shaded_fraction = (
afternoon_shaded_fraction * no_of_shaded_rows / no_of_rows
)
logger.info("Shaded fraction calculated for solar positions")
# calculate irradiance on plane of array # calculate irradiance on plane of array
poa_front = pvlib.irradiance.get_total_irradiance( poa_front = pvlib.irradiance.get_total_irradiance(