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: | ||||
|             float: The negative of the energy production from vertical panels. | ||||
|         """ | ||||
|         pitch += c["panel"]["dimensions"]["thickness"] | ||||
|         c["array"]["spacing"] = pitch | ||||
|         logging.info(f"Optimizing with pitch: {pitch}m") | ||||
|         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) | ||||
| 
 | ||||
|     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 | ||||
| 
 | ||||
| from Utilities.Processes import ( | ||||
|     calculate_no_of_panels, | ||||
| ) | ||||
| from Utilities.Processes import calculate_no_of_panels, calculate_required_system_size | ||||
| 
 | ||||
| logger = logging.getLogger(__name__) | ||||
| 
 | ||||
| @ -23,7 +21,6 @@ def get_location(c): | ||||
| 
 | ||||
| 
 | ||||
| def define_grid_layout(c, panel_tilt): | ||||
|     # get number of panels required | ||||
|     no_of_panels = calculate_no_of_panels( | ||||
|         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( | ||||
|         ( | ||||
|             c["environment"]["roof"]["dimensions"]["length"] | ||||
|             - (2 * c["array"]["edge_setback"] + c["panel"]["dimensions"]["length"]) | ||||
|             - (2 * c["array"]["edge_setback"]) | ||||
|         ) | ||||
|         / pitch | ||||
|     ) | ||||
| @ -129,6 +126,7 @@ def get_solar_data(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) | ||||
|     solar_positions, clearsky_data = get_solar_data(c) | ||||
| 
 | ||||
| @ -230,6 +228,9 @@ def calculate_energy_production_vertical(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) | ||||
|     solar_positions, clearsky_data = get_solar_data(c) | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										13
									
								
								config.yml
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								config.yml
									
									
									
									
									
								
							| @ -1,9 +1,12 @@ | ||||
| array: | ||||
|   system_size: 900 # in kWp | ||||
|   spacing: 21.8 # spacing between adjacent panel rows in m | ||||
|   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 | ||||
|   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) | ||||
|   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: | ||||
|   start: 2025-03-30 00:00 # start date and time in ISO 8601 format | ||||
| @ -13,9 +16,9 @@ environment: | ||||
|   roof: | ||||
|     dimensions: | ||||
|       # dimensions all in m | ||||
|       length: 100 | ||||
|       width: 125 | ||||
|     albedo: 0.8 # % of light reflected from the surface | ||||
|       length: 50 | ||||
|       width: 40 | ||||
|     albedo: 0.2 # % of light reflected from the surface | ||||
|     tilt: 0 # degrees from horizontal | ||||
|   location: | ||||
|     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.debug(f"Vertical Energy Production: {vertical_energy.sum()}") | ||||
| 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) | ||||
| logger.info("Energy production for horizontal panels calculated successfully.") | ||||
| logger.debug(f"Horizontal Energy Production: {horizontal_energy.sum()}") | ||||
| 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( | ||||
|     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( | ||||
|     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 | ||||
| pl.figure(figsize=(10, 6)) | ||||
| pl.plot( | ||||
|     horizontal_energy_scaled.index, | ||||
|     horizontal_energy_scaled.values, | ||||
|     horizontal_energy.index, | ||||
|     horizontal_energy.values, | ||||
|     label="Horizontal Panels", | ||||
| ) | ||||
| pl.plot(vertical_energy.index, vertical_energy.values, label="Vertical Panels") | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user