pivot modelling method to using pvlib shading_fraction1d
This commit is contained in:
		
							parent
							
								
									ccd4afbcd6
								
							
						
					
					
						commit
						a36a8db753
					
				| @ -1,4 +1,5 @@ | |||||||
| import numpy as np | import numpy as np | ||||||
|  | from ladybug_geometry.geometry3d import Point3D, Vector3D | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def calculate_no_of_panels(system_size, panel_peak_power): | def calculate_no_of_panels(system_size, panel_peak_power): | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ import numpy as np | |||||||
| import pandas as pd | import pandas as pd | ||||||
| import logging | import logging | ||||||
| import math | import math | ||||||
|  | from tqdm import tqdm | ||||||
| 
 | 
 | ||||||
| from ladybug_geometry.geometry3d.pointvector import Point3D, Vector3D | from ladybug_geometry.geometry3d.pointvector import Point3D, Vector3D | ||||||
| from ladybug_geometry.geometry3d.plane import Plane | from ladybug_geometry.geometry3d.plane import Plane | ||||||
| @ -9,7 +10,9 @@ from ladybug_geometry.geometry3d.polyface import Polyface3D | |||||||
| 
 | 
 | ||||||
| import pvlib | import pvlib | ||||||
| 
 | 
 | ||||||
| from Utilities.Processes import calculate_no_of_panels | from Utilities.Processes import ( | ||||||
|  |     calculate_no_of_panels, | ||||||
|  | ) | ||||||
| 
 | 
 | ||||||
| logger = logging.getLogger(__name__) | logger = logging.getLogger(__name__) | ||||||
| 
 | 
 | ||||||
| @ -98,7 +101,8 @@ def create_panels(coordinates, c): | |||||||
|     #   Here, we assume the width runs in the positive X-direction. |     #   Here, we assume the width runs in the positive X-direction. | ||||||
|     x_axis = Vector3D(1, 0, 0)  # points north |     x_axis = Vector3D(1, 0, 0)  # points north | ||||||
| 
 | 
 | ||||||
|     panels = [] |     panel_object = [] | ||||||
|  |     base_planes = [] | ||||||
|     for index, row in coordinates.iterrows(): |     for index, row in coordinates.iterrows(): | ||||||
|         # Create the bottom-left corner of the panel |         # Create the bottom-left corner of the panel | ||||||
|         panel_origin = Point3D(row["x"], row["y"], row["z"]) |         panel_origin = Point3D(row["x"], row["y"], row["z"]) | ||||||
| @ -109,12 +113,17 @@ def create_panels(coordinates, c): | |||||||
|         # Create the panel geometry |         # Create the panel geometry | ||||||
|         panel = Polyface3D.from_box( |         panel = Polyface3D.from_box( | ||||||
|             width=panel_width, |             width=panel_width, | ||||||
|             depth=panel_length, |             depth=panel_thickness, | ||||||
|             height=panel_thickness, |             height=panel_length, | ||||||
|             base_plane=panel_plane, |             base_plane=panel_plane, | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|         panels.append(panel) |         panel_object.append(panel) | ||||||
|  |         base_planes.append(panel_plane) | ||||||
|  | 
 | ||||||
|  |     panels = pd.DataFrame(columns=["panel", "base_plane"]) | ||||||
|  |     panels["panel"] = panel_object | ||||||
|  |     panels["base_plane"] = base_planes | ||||||
| 
 | 
 | ||||||
|     return panels |     return panels | ||||||
| 
 | 
 | ||||||
| @ -159,57 +168,7 @@ def calculate_sun_vector(solar_zenith, solar_azimuth): | |||||||
| 
 | 
 | ||||||
|     # Calculate the sun vector components |     # Calculate the sun vector components | ||||||
|     x = math.sin(zenith_rad) * math.cos(azimuth_rad) |     x = math.sin(zenith_rad) * math.cos(azimuth_rad) | ||||||
|     y = math.sin(zenith_rad) * math.sin(azimuth_rad) |     z = math.sin(zenith_rad) * math.sin(azimuth_rad) | ||||||
|     z = math.cos(zenith_rad) |     y = math.cos(zenith_rad) | ||||||
| 
 | 
 | ||||||
|     return Vector3D(x, y, z) |     return Vector3D(x, y, z) | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def compute_array_shading(panels, sun_vector, n_samples=25): |  | ||||||
|     """ |  | ||||||
|     Given a list of panel geometries (Polyface3D) and the sun vector, |  | ||||||
|     compute the shading fraction for each panel and return the overall average shading. |  | ||||||
| 
 |  | ||||||
|     Parameters: |  | ||||||
|       panels: List of Polyface3D objects representing the PV panels. |  | ||||||
|       sun_vector: Unit Vector3D in the direction of the sun. |  | ||||||
|       n_samples: Number of sample points per panel. |  | ||||||
| 
 |  | ||||||
|     Returns: |  | ||||||
|       Dictionary mapping panel index to its shading fraction, and the overall average. |  | ||||||
|     """ |  | ||||||
|     shading_results = {} |  | ||||||
|     for i, panel in enumerate(panels): |  | ||||||
|         # Define obstacles as all other panels in the array |  | ||||||
|         obstacles = [pan for j, pan in enumerate(panels) if j != i] |  | ||||||
|         shading_frac = calculate_shading_fraction( |  | ||||||
|             panel, sun_vector, obstacles, n_samples=n_samples |  | ||||||
|         ) |  | ||||||
|         shading_results[i] = shading_frac |  | ||||||
|     # Compute the overall average shading fraction across all panels: |  | ||||||
|     overall_avg = np.mean(list(shading_results.values())) |  | ||||||
|     return shading_results, overall_avg |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def calculate_shading_fraction(c): |  | ||||||
|     coordinates = define_grid_layout(c) |  | ||||||
|     panels = create_panels(coordinates, c) |  | ||||||
|     solar_positions = get_solar_data(c) |  | ||||||
| 
 |  | ||||||
|     shading_fractions = [] |  | ||||||
|     for panel in panels: |  | ||||||
|         shading_fraction = [] |  | ||||||
|         for index, row in solar_positions.iterrows(): |  | ||||||
|             # Get the solar position for the current time step |  | ||||||
|             # in a sphere, azimuth is the angle in the x-y plane from the north |  | ||||||
|             # and zenith is the angle from the vertical axis |  | ||||||
|             solar_zenith = row["apparent_zenith"] |  | ||||||
|             solar_azimuth = row["apparent_azimuth"] |  | ||||||
|             sun_vector = calculate_sun_vector(solar_zenith, solar_azimuth) |  | ||||||
| 
 |  | ||||||
|             # Calculate the shading fraction using the panel and solar position |  | ||||||
|             shading_fraction.append(panel.shading_fraction(solar_zenith, solar_azimuth)) |  | ||||||
| 
 |  | ||||||
|         shading_fractions.append(shading_fraction) |  | ||||||
| 
 |  | ||||||
|     return shading_fractions |  | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user