diff --git a/Utilities/Optimisation.py b/Utilities/Optimisation.py index 279adcf..3034862 100644 --- a/Utilities/Optimisation.py +++ b/Utilities/Optimisation.py @@ -27,7 +27,7 @@ def optimise_vertical_panel_pitch(c): # perform minimization initial_pitch = c["array"]["spacing"] result = minimize( - objective, initial_pitch, bounds=[(0, 5)], tol=1e-8, options={"eps": 0.5} + objective, initial_pitch, bounds=[(0, 20)], tol=1e-8, options={"eps": 1} ) optimal_pitch = result.x[0] c["array"]["spacing"] = optimal_pitch diff --git a/Utilities/Shading.py b/Utilities/Shading.py index a7cd7f2..62136d7 100644 --- a/Utilities/Shading.py +++ b/Utilities/Shading.py @@ -128,9 +128,9 @@ def get_solar_data(c): def sanity_check_minimum_pitch(c): solar_positions, _ = get_solar_data(c) zenith = solar_positions["zenith"].values - solar_positions["shadow_length"] = ( - c["panel"]["dimensions"]["length"] + c["environment"]["height"] - ) * np.tan(zenith / 180 * np.pi) + solar_positions["shadow_length"] = (c["panel"]["dimensions"]["length"]) * np.tan( + zenith / 180 * np.pi + ) return solar_positions @@ -150,10 +150,17 @@ def calculate_energy_production_vertical(c): shaded_row_rotation = 90 shading_row_rotation = 90 axis_tilt = 0 - axis_azimuth = 90 + axis_azimuth = 180 + + morning_projected_solar_zenith = pvlib.shading.projected_solar_zenith_angle( + solar_zenith=solar_positions["apparent_zenith"], + solar_azimuth=solar_positions["azimuth"], + axis_azimuth=axis_azimuth, + axis_tilt=axis_tilt, + ) morning_shaded_fraction = pvlib.shading.shaded_fraction1d( - solar_zenith=solar_positions["zenith"], + solar_zenith=morning_projected_solar_zenith, solar_azimuth=solar_positions["azimuth"], axis_azimuth=axis_azimuth, shaded_row_rotation=shaded_row_rotation, @@ -165,8 +172,14 @@ def calculate_energy_production_vertical(c): ) morning_shaded_fraction = morning_shaded_fraction * no_of_shaded_rows / no_of_rows + afternoon_projected_solar_zenith = pvlib.shading.projected_solar_zenith_angle( + solar_zenith=solar_positions["apparent_zenith"], + solar_azimuth=solar_positions["azimuth"], + axis_azimuth=axis_azimuth + 180, + axis_tilt=axis_tilt, + ) afternoon_shaded_fraction = pvlib.shading.shaded_fraction1d( - solar_zenith=solar_positions["zenith"], + solar_zenith=afternoon_projected_solar_zenith, solar_azimuth=solar_positions["azimuth"], axis_azimuth=axis_azimuth + 180, shaded_row_rotation=shaded_row_rotation, @@ -185,8 +198,8 @@ def calculate_energy_production_vertical(c): # calculate irradiance on plane of array poa_front = pvlib.irradiance.get_total_irradiance( surface_tilt=90, - surface_azimuth=axis_azimuth, - solar_zenith=solar_positions["zenith"], + surface_azimuth=90, + solar_zenith=morning_projected_solar_zenith, solar_azimuth=solar_positions["azimuth"], dni=clearsky_data["dni"], ghi=clearsky_data["ghi"], @@ -198,8 +211,8 @@ def calculate_energy_production_vertical(c): poa_rear = pvlib.irradiance.get_total_irradiance( surface_tilt=180 - 90, - surface_azimuth=axis_azimuth + 180, - solar_zenith=solar_positions["zenith"], + surface_azimuth=90 + 180, + solar_zenith=afternoon_projected_solar_zenith, solar_azimuth=solar_positions["azimuth"], dni=clearsky_data["dni"], ghi=clearsky_data["ghi"], @@ -254,10 +267,17 @@ def calculate_energy_production_horizontal(c): shaded_row_rotation = 0 shading_row_rotation = 0 axis_tilt = 0 - axis_azimuth = 180 # south facing + axis_azimuth = 90 # south facing + + projected_solar_zenith = pvlib.shading.projected_solar_zenith_angle( + solar_zenith=solar_positions["apparent_zenith"], + solar_azimuth=solar_positions["azimuth"], + axis_azimuth=axis_azimuth, + axis_tilt=axis_tilt, + ) shaded_fraction = pvlib.shading.shaded_fraction1d( - solar_zenith=solar_positions["zenith"], + solar_zenith=projected_solar_zenith, solar_azimuth=solar_positions["azimuth"], axis_azimuth=axis_azimuth, shaded_row_rotation=shaded_row_rotation, @@ -271,8 +291,8 @@ def calculate_energy_production_horizontal(c): poa = pvlib.irradiance.get_total_irradiance( surface_tilt=0, - surface_azimuth=axis_azimuth, - solar_zenith=solar_positions["zenith"], + surface_azimuth=180, + solar_zenith=projected_solar_zenith, solar_azimuth=solar_positions["azimuth"], dni=clearsky_data["dni"], ghi=clearsky_data["ghi"], diff --git a/config.yml b/config.yml index 845cdd5..4585f63 100644 --- a/config.yml +++ b/config.yml @@ -1,7 +1,7 @@ array: peak_power_demand: 900 # in kWac DC_AC_ratio: 1.2 # ratio of DC to AC power - spacing: 0.4 # spacing between adjacent panel rows in m + spacing: 3 # spacing between adjacent panel rows in m edge_setback: 1.8 # distance from the edge of the roof to the array roof_slope: 0 slope: 0 # degrees from horizontal (+ve means shaded row is higher than the row in front) @@ -16,7 +16,7 @@ environment: roof: dimensions: # dimensions all in m - length: 50 + length: 100 width: 40 albedo: 0.2 # % of light reflected from the surface tilt: 0 # degrees from horizontal