sanity checking shading results
This commit is contained in:
parent
05186bd77f
commit
2f8f0ab9e9
6
README.md
Normal file
6
README.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
Solar Calculations
|
||||||
|
|
||||||
|
Solar Zenith: Angle between the position of the sun and vertical
|
||||||
|
Solar Azimuth: Horizontal angle with respect to north of the Sun's position
|
||||||
|
|
||||||
|
Shadow Length Formula: Height of object / tan(solar_zenith)
|
@ -16,6 +16,7 @@ def optimise_vertical_panel_pitch(c):
|
|||||||
Returns:
|
Returns:
|
||||||
float: The negative of the energy production from vertical panels.
|
float: The negative of the energy production from vertical panels.
|
||||||
"""
|
"""
|
||||||
|
pitch += c["panel"]["dimensions"]["thickness"]
|
||||||
c["array"]["spacing"] = pitch
|
c["array"]["spacing"] = pitch
|
||||||
logging.info(f"Optimizing with pitch: {pitch}m")
|
logging.info(f"Optimizing with pitch: {pitch}m")
|
||||||
vertical_energy, _ = calculate_energy_production_vertical(c)
|
vertical_energy, _ = calculate_energy_production_vertical(c)
|
||||||
|
@ -16,3 +16,13 @@ def calculate_no_of_panels(system_size, panel_peak_power):
|
|||||||
no_of_panels = np.ceil(system_size / panel_peak_power_kWp)
|
no_of_panels = np.ceil(system_size / panel_peak_power_kWp)
|
||||||
|
|
||||||
return no_of_panels
|
return no_of_panels
|
||||||
|
|
||||||
|
|
||||||
|
def calculate_required_system_size(c):
|
||||||
|
c["array"]["system_size"] = (
|
||||||
|
c["array"]["peak_power_demand"]
|
||||||
|
* c["array"]["DC_AC_ratio"]
|
||||||
|
* c["array"]["performance_ratio"]
|
||||||
|
)
|
||||||
|
|
||||||
|
return c
|
||||||
|
@ -5,9 +5,7 @@ import math
|
|||||||
|
|
||||||
import pvlib
|
import pvlib
|
||||||
|
|
||||||
from Utilities.Processes import (
|
from Utilities.Processes import calculate_no_of_panels, calculate_required_system_size
|
||||||
calculate_no_of_panels,
|
|
||||||
)
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -23,7 +21,6 @@ def get_location(c):
|
|||||||
|
|
||||||
|
|
||||||
def define_grid_layout(c, panel_tilt):
|
def define_grid_layout(c, panel_tilt):
|
||||||
# get number of panels required
|
|
||||||
no_of_panels = calculate_no_of_panels(
|
no_of_panels = calculate_no_of_panels(
|
||||||
c["array"]["system_size"], c["panel"]["peak_power"]
|
c["array"]["system_size"], c["panel"]["peak_power"]
|
||||||
)
|
)
|
||||||
@ -52,7 +49,7 @@ def define_grid_layout(c, panel_tilt):
|
|||||||
max_number_of_rows = np.floor(
|
max_number_of_rows = np.floor(
|
||||||
(
|
(
|
||||||
c["environment"]["roof"]["dimensions"]["length"]
|
c["environment"]["roof"]["dimensions"]["length"]
|
||||||
- (2 * c["array"]["edge_setback"] + c["panel"]["dimensions"]["length"])
|
- (2 * c["array"]["edge_setback"])
|
||||||
)
|
)
|
||||||
/ pitch
|
/ pitch
|
||||||
)
|
)
|
||||||
@ -129,6 +126,7 @@ def get_solar_data(c):
|
|||||||
|
|
||||||
|
|
||||||
def calculate_energy_production_vertical(c):
|
def calculate_energy_production_vertical(c):
|
||||||
|
c = calculate_required_system_size(c)
|
||||||
panel_coordinates, no_of_panels = define_grid_layout(c, panel_tilt=90)
|
panel_coordinates, no_of_panels = define_grid_layout(c, panel_tilt=90)
|
||||||
solar_positions, clearsky_data = get_solar_data(c)
|
solar_positions, clearsky_data = get_solar_data(c)
|
||||||
|
|
||||||
@ -230,6 +228,9 @@ def calculate_energy_production_vertical(c):
|
|||||||
|
|
||||||
|
|
||||||
def calculate_energy_production_horizontal(c):
|
def calculate_energy_production_horizontal(c):
|
||||||
|
c["array"]["system_size"] = (
|
||||||
|
c["array"]["system_size"] * c["array"]["horizontal_max_capacity"]
|
||||||
|
)
|
||||||
panel_coordinates, no_of_panels = define_grid_layout(c, panel_tilt=0)
|
panel_coordinates, no_of_panels = define_grid_layout(c, panel_tilt=0)
|
||||||
solar_positions, clearsky_data = get_solar_data(c)
|
solar_positions, clearsky_data = get_solar_data(c)
|
||||||
|
|
||||||
|
13
config.yml
13
config.yml
@ -1,9 +1,12 @@
|
|||||||
array:
|
array:
|
||||||
system_size: 900 # in kWp
|
peak_power_demand: 900 # in kWac
|
||||||
spacing: 21.8 # spacing between adjacent panel rows in m
|
DC_AC_ratio: 1.2 # ratio of DC to AC power
|
||||||
|
spacing: 0.4 # spacing between adjacent panel rows in m
|
||||||
edge_setback: 1.8 # distance from the edge of the roof to the array
|
edge_setback: 1.8 # distance from the edge of the roof to the array
|
||||||
roof_slope: 0
|
roof_slope: 0
|
||||||
slope: 0 # degrees from horizontal (+ve means shaded row is higher than the row in front)
|
slope: 0 # degrees from horizontal (+ve means shaded row is higher than the row in front)
|
||||||
|
horizontal_max_capacity: 0.75 # scale down due to peak power demand limit of NOVA
|
||||||
|
performance_ratio: 0.9 # ratio of actual energy output to the theoretical maximum
|
||||||
|
|
||||||
simulation_date_time:
|
simulation_date_time:
|
||||||
start: 2025-03-30 00:00 # start date and time in ISO 8601 format
|
start: 2025-03-30 00:00 # start date and time in ISO 8601 format
|
||||||
@ -13,9 +16,9 @@ environment:
|
|||||||
roof:
|
roof:
|
||||||
dimensions:
|
dimensions:
|
||||||
# dimensions all in m
|
# dimensions all in m
|
||||||
length: 100
|
length: 50
|
||||||
width: 125
|
width: 40
|
||||||
albedo: 0.8 # % of light reflected from the surface
|
albedo: 0.2 # % of light reflected from the surface
|
||||||
tilt: 0 # degrees from horizontal
|
tilt: 0 # degrees from horizontal
|
||||||
location:
|
location:
|
||||||
latitude: 3.1186108758412945
|
latitude: 3.1186108758412945
|
||||||
|
15
main.py
15
main.py
@ -36,29 +36,32 @@ optimal_pitch, vertical_energy, no_of_panels_vertical = optimise_vertical_panel_
|
|||||||
logger.info("Energy production for vertical panels calculated successfully.")
|
logger.info("Energy production for vertical panels calculated successfully.")
|
||||||
logger.debug(f"Vertical Energy Production: {vertical_energy.sum()}")
|
logger.debug(f"Vertical Energy Production: {vertical_energy.sum()}")
|
||||||
logger.debug("Number of panels: %d", no_of_panels_vertical)
|
logger.debug("Number of panels: %d", no_of_panels_vertical)
|
||||||
|
logger.debug(f"System size: {no_of_panels_vertical * c['panel']['peak_power']/1e3} kWp")
|
||||||
|
|
||||||
horizontal_energy, no_of_panels_horizontal = calculate_energy_production_horizontal(c)
|
horizontal_energy, no_of_panels_horizontal = calculate_energy_production_horizontal(c)
|
||||||
logger.info("Energy production for horizontal panels calculated successfully.")
|
logger.info("Energy production for horizontal panels calculated successfully.")
|
||||||
logger.debug(f"Horizontal Energy Production: {horizontal_energy.sum()}")
|
logger.debug(f"Horizontal Energy Production: {horizontal_energy.sum()}")
|
||||||
logger.debug("Number of panels: %d", no_of_panels_horizontal)
|
logger.debug("Number of panels: %d", no_of_panels_horizontal)
|
||||||
|
logger.debug(
|
||||||
|
f"System size: {no_of_panels_horizontal * c['panel']['peak_power']/1e3} kWp"
|
||||||
|
)
|
||||||
|
|
||||||
NOVA_scaledown = 0.75
|
|
||||||
|
|
||||||
horizontal_energy_scaled = horizontal_energy * NOVA_scaledown
|
|
||||||
logger.info("Energy production for horizontal panels scaled down to NOVA requirement.")
|
logger.info("Energy production for horizontal panels scaled down to NOVA requirement.")
|
||||||
|
|
||||||
logger.info(
|
logger.info(
|
||||||
f"Energy production for horizontal panels: {np.round(horizontal_energy_scaled.sum(),0)} kWh"
|
f"Energy production for horizontal panels: {np.round(horizontal_energy.sum(),0)} kWh"
|
||||||
)
|
)
|
||||||
|
logger.info(f"No. of panels for horizontal orientation: {int(no_of_panels_horizontal)}")
|
||||||
logger.info(
|
logger.info(
|
||||||
f"Energy production for vertical panels: {np.round(vertical_energy.sum(),0)} kWh"
|
f"Energy production for vertical panels: {np.round(vertical_energy.sum(),0)} kWh"
|
||||||
)
|
)
|
||||||
|
logger.info(f"No. of panels for vertical orientation: {int(no_of_panels_vertical)}")
|
||||||
|
|
||||||
# overlay horizontal and vertical energy production
|
# overlay horizontal and vertical energy production
|
||||||
pl.figure(figsize=(10, 6))
|
pl.figure(figsize=(10, 6))
|
||||||
pl.plot(
|
pl.plot(
|
||||||
horizontal_energy_scaled.index,
|
horizontal_energy.index,
|
||||||
horizontal_energy_scaled.values,
|
horizontal_energy.values,
|
||||||
label="Horizontal Panels",
|
label="Horizontal Panels",
|
||||||
)
|
)
|
||||||
pl.plot(vertical_energy.index, vertical_energy.values, label="Vertical Panels")
|
pl.plot(vertical_energy.index, vertical_energy.values, label="Vertical Panels")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user