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