From 7d377c1c957286891a7ec550c1980c682801854a Mon Sep 17 00:00:00 2001 From: misi9170 Date: Thu, 30 Jan 2025 16:24:15 -0700 Subject: [PATCH 1/6] Specify input arrays as 4d in full_flow_cc_solver --- .../examples_get_flow/002_extract_wind_speed_at_points.py | 4 ++-- floris/core/core.py | 8 +++++--- floris/core/solver.py | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/examples/examples_get_flow/002_extract_wind_speed_at_points.py b/examples/examples_get_flow/002_extract_wind_speed_at_points.py index aaf086f4b..1a5655e26 100644 --- a/examples/examples_get_flow/002_extract_wind_speed_at_points.py +++ b/examples/examples_get_flow/002_extract_wind_speed_at_points.py @@ -20,8 +20,8 @@ # User options -# FLORIS model to use (limited to Gauss/GCH, Jensen, and empirical Gauss) -floris_model = "gch" # Try "gch", "jensen", "emgauss" +# FLORIS model to use (Turbopark not available) +floris_model = "gch" # Try "gch", "cc", "jensen", "emgauss" # Option to try different met mast locations met_mast_option = 0 # Try 0, 1, 2, 3 diff --git a/floris/core/core.py b/floris/core/core.py index d12005ba5..b19515f19 100644 --- a/floris/core/core.py +++ b/floris/core/core.py @@ -252,15 +252,17 @@ def solve_for_points(self, x, y, z): vel_model = self.wake.model_strings["velocity_model"] - if vel_model == "cc" or vel_model == "turbopark": + if vel_model == "turbopark": raise NotImplementedError( - "solve_for_points is currently only available with the "+\ - "gauss, jensen, and empirical_gauss models." + "solve_for_points is not available for the turbopark model." ) elif vel_model == "empirical_gauss": full_flow_empirical_gauss_solver(self.farm, self.flow_field, field_grid, self.wake) + elif vel_model == "cc": + full_flow_cc_solver(self.farm, self.flow_field, field_grid, self.wake) else: full_flow_sequential_solver(self.farm, self.flow_field, field_grid, self.wake) + # TODO: check---is this OK if the turbine grid is a cubature? return self.flow_field.u_sorted[:,:,0,0] # Remove turbine grid dimensions diff --git a/floris/core/solver.py b/floris/core/solver.py index a7c3d8796..b67e96346 100644 --- a/floris/core/solver.py +++ b/floris/core/solver.py @@ -841,7 +841,7 @@ def full_flow_cc_solver( x_i, y_i, effective_yaw_i, - turbulence_intensity_i, + turbulence_intensity_i[:, :, None, None], turb_Cts[:, i:i+1], rotor_diameter_i, **deflection_model_args, @@ -874,7 +874,7 @@ def full_flow_cc_solver( u_i, deflection_field, yaw_angle_i, - turbine_grid_flow_field.turbulence_intensity_field_sorted_avg, + turbine_grid_flow_field.turbulence_intensity_field_sorted_avg[:, :, None, None], turb_Cts, turbine_grid_farm.rotor_diameters_sorted[:, :, None, None], turb_u_wake, From 5c5126a4f88b78f221ef8b45933a9005a7aa5b71 Mon Sep 17 00:00:00 2001 From: misi9170 Date: Thu, 30 Jan 2025 17:48:37 -0700 Subject: [PATCH 2/6] Move dimension expansion to definition for consistency. --- floris/core/solver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/floris/core/solver.py b/floris/core/solver.py index b67e96346..61779e646 100644 --- a/floris/core/solver.py +++ b/floris/core/solver.py @@ -809,7 +809,7 @@ def full_flow_cc_solver( axial_induction_i = axial_induction_i[:, :, None, None] turbulence_intensity_i = \ - turbine_grid_flow_field.turbulence_intensity_field_sorted_avg[:, i:i+1] + turbine_grid_flow_field.turbulence_intensity_field_sorted_avg[:, i:i+1, None, None] yaw_angle_i = turbine_grid_farm.yaw_angles_sorted[:, i:i+1, None, None] hub_height_i = turbine_grid_farm.hub_heights_sorted[:, i:i+1, None, None] rotor_diameter_i = turbine_grid_farm.rotor_diameters_sorted[:, i:i+1, None, None] @@ -841,7 +841,7 @@ def full_flow_cc_solver( x_i, y_i, effective_yaw_i, - turbulence_intensity_i[:, :, None, None], + turbulence_intensity_i, turb_Cts[:, i:i+1], rotor_diameter_i, **deflection_model_args, From 0121115bdd43dc7f48b8b4f62389218150756274 Mon Sep 17 00:00:00 2001 From: misi9170 Date: Thu, 30 Jan 2025 17:57:53 -0700 Subject: [PATCH 3/6] Remove TODO check. --- floris/core/core.py | 1 - 1 file changed, 1 deletion(-) diff --git a/floris/core/core.py b/floris/core/core.py index b19515f19..857d2be1a 100644 --- a/floris/core/core.py +++ b/floris/core/core.py @@ -262,7 +262,6 @@ def solve_for_points(self, x, y, z): full_flow_cc_solver(self.farm, self.flow_field, field_grid, self.wake) else: full_flow_sequential_solver(self.farm, self.flow_field, field_grid, self.wake) - # TODO: check---is this OK if the turbine grid is a cubature? return self.flow_field.u_sorted[:,:,0,0] # Remove turbine grid dimensions From 534f86ee8d82cff65130185ec63e0ee224afd445 Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Tue, 4 Feb 2025 15:41:57 -0600 Subject: [PATCH 4/6] Use sorted awc modes settings --- floris/core/solver.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/floris/core/solver.py b/floris/core/solver.py index 61779e646..b7c0f6ede 100644 --- a/floris/core/solver.py +++ b/floris/core/solver.py @@ -774,7 +774,7 @@ def full_flow_cc_solver( yaw_angles=turbine_grid_farm.yaw_angles_sorted, tilt_angles=turbine_grid_farm.tilt_angles_sorted, power_setpoints=turbine_grid_farm.power_setpoints_sorted, - awc_modes=turbine_grid_farm.awc_modes, + awc_modes=turbine_grid_farm.awc_modes_sorted, awc_amplitudes=turbine_grid_farm.awc_amplitudes_sorted, thrust_coefficient_functions=turbine_grid_farm.turbine_thrust_coefficient_functions, tilt_interps=turbine_grid_farm.turbine_tilt_interps, @@ -794,7 +794,7 @@ def full_flow_cc_solver( yaw_angles=turbine_grid_farm.yaw_angles_sorted, tilt_angles=turbine_grid_farm.tilt_angles_sorted, power_setpoints=turbine_grid_farm.power_setpoints_sorted, - awc_modes=turbine_grid_farm.awc_modes, + awc_modes=turbine_grid_farm.awc_modes_sorted, awc_amplitudes=turbine_grid_farm.awc_amplitudes_sorted, axial_induction_functions=turbine_grid_farm.turbine_axial_induction_functions, tilt_interps=turbine_grid_farm.turbine_tilt_interps, @@ -937,7 +937,7 @@ def turbopark_solver( yaw_angles=farm.yaw_angles_sorted, tilt_angles=farm.tilt_angles_sorted, power_setpoints=farm.power_setpoints_sorted, - awc_modes=farm.awc_modes, + awc_modes=farm.awc_modes_sorted, awc_amplitudes=farm.awc_amplitudes_sorted, thrust_coefficient_functions=farm.turbine_thrust_coefficient_functions, tilt_interps=farm.turbine_tilt_interps, @@ -956,7 +956,7 @@ def turbopark_solver( yaw_angles=farm.yaw_angles_sorted, tilt_angles=farm.tilt_angles_sorted, power_setpoints=farm.power_setpoints_sorted, - awc_modes=farm.awc_modes, + awc_modes=farm.awc_modes_sorted, awc_amplitudes=farm.awc_amplitudes_sorted, thrust_coefficient_functions=farm.turbine_thrust_coefficient_functions, tilt_interps=farm.turbine_tilt_interps, @@ -978,7 +978,7 @@ def turbopark_solver( yaw_angles=farm.yaw_angles_sorted, tilt_angles=farm.tilt_angles_sorted, power_setpoints=farm.power_setpoints_sorted, - awc_modes=farm.awc_modes, + awc_modes=farm.awc_modes_sorted, awc_amplitudes=farm.awc_amplitudes_sorted, axial_induction_functions=farm.turbine_axial_induction_functions, tilt_interps=farm.turbine_tilt_interps, @@ -1027,7 +1027,7 @@ def turbopark_solver( yaw_angles=farm.yaw_angles_sorted, tilt_angles=farm.tilt_angles_sorted, power_setpoints=farm.power_setpoints_sorted, - awc_modes=farm.awc_modes, + awc_modes=farm.awc_modes_sorted, awc_amplitudes=farm.awc_amplitudes_sorted, thrust_coefficient_functions=farm.turbine_thrust_coefficient_functions, tilt_interps=farm.turbine_tilt_interps, From b239dffe4292774a2b1587f513f41e6301771a29 Mon Sep 17 00:00:00 2001 From: Rafael M Mudafort Date: Tue, 4 Feb 2025 16:09:36 -0600 Subject: [PATCH 5/6] Fix TI-field average array dims in CC & TurbOPark --- floris/core/solver.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/floris/core/solver.py b/floris/core/solver.py index b7c0f6ede..679a97c4a 100644 --- a/floris/core/solver.py +++ b/floris/core/solver.py @@ -694,7 +694,7 @@ def cc_solver( flow_field.turbulence_intensity_field_sorted_avg = np.mean( turbine_turbulence_intensity, axis=(2,3) - ) + )[:, :, None, None] def full_flow_cc_solver( @@ -809,7 +809,7 @@ def full_flow_cc_solver( axial_induction_i = axial_induction_i[:, :, None, None] turbulence_intensity_i = \ - turbine_grid_flow_field.turbulence_intensity_field_sorted_avg[:, i:i+1, None, None] + turbine_grid_flow_field.turbulence_intensity_field_sorted_avg[:, i:i+1] yaw_angle_i = turbine_grid_farm.yaw_angles_sorted[:, i:i+1, None, None] hub_height_i = turbine_grid_farm.hub_heights_sorted[:, i:i+1, None, None] rotor_diameter_i = turbine_grid_farm.rotor_diameters_sorted[:, i:i+1, None, None] @@ -874,7 +874,7 @@ def full_flow_cc_solver( u_i, deflection_field, yaw_angle_i, - turbine_grid_flow_field.turbulence_intensity_field_sorted_avg[:, :, None, None], + turbine_grid_flow_field.turbulence_intensity_field_sorted_avg, turb_Cts, turbine_grid_farm.rotor_diameters_sorted[:, :, None, None], turb_u_wake, @@ -1122,7 +1122,7 @@ def turbopark_solver( flow_field.turbulence_intensity_field_sorted_avg = np.mean( turbine_turbulence_intensity, axis=(2, 3) - ) + )[:, :, None, None] def full_flow_turbopark_solver( From 33c20db365a9cdf946bb86ea3ce7d3429f1897e0 Mon Sep 17 00:00:00 2001 From: misi9170 Date: Wed, 5 Feb 2025 10:28:23 -0700 Subject: [PATCH 6/6] Update comments and warning to point users to turboparkgauss model. --- .../examples_get_flow/002_extract_wind_speed_at_points.py | 4 ++-- floris/core/core.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/examples_get_flow/002_extract_wind_speed_at_points.py b/examples/examples_get_flow/002_extract_wind_speed_at_points.py index 1a5655e26..663124140 100644 --- a/examples/examples_get_flow/002_extract_wind_speed_at_points.py +++ b/examples/examples_get_flow/002_extract_wind_speed_at_points.py @@ -20,8 +20,8 @@ # User options -# FLORIS model to use (Turbopark not available) -floris_model = "gch" # Try "gch", "cc", "jensen", "emgauss" +# FLORIS model to use (legacy Turbopark not available) +floris_model = "gch" # Try "gch", "cc", "jensen", "emgauss", "turboparkgauss" # Option to try different met mast locations met_mast_option = 0 # Try 0, 1, 2, 3 diff --git a/floris/core/core.py b/floris/core/core.py index 857d2be1a..857b90fa4 100644 --- a/floris/core/core.py +++ b/floris/core/core.py @@ -254,7 +254,8 @@ def solve_for_points(self, x, y, z): if vel_model == "turbopark": raise NotImplementedError( - "solve_for_points is not available for the turbopark model." + "solve_for_points is not available for the legacy \'turbopark\' model. " + "However, it is available for \'turboparkgauss\'." ) elif vel_model == "empirical_gauss": full_flow_empirical_gauss_solver(self.farm, self.flow_field, field_grid, self.wake)