Source code for ard.farm_aero.placeholder

import numpy as np

import ard.farm_aero.templates as templates


[docs] class PlaceholderBatchPower(templates.BatchFarmPowerTemplate): """ Placeholder component for computing power assuming nameplate power at all times. Options ------- modeling_options : dict a modeling options dictionary (inherited from `FarmAeroTemplate`) wind_query : floris.wind_data.WindRose a WindQuery objects that specifies the wind conditions that are to be computed Inputs ------ x_turbines : np.ndarray a 1D numpy array indicating the x-dimension locations of the turbines, with length `N_turbines` (inherited from `FarmAeroTemplate`) y_turbines : np.ndarray a 1D numpy array indicating the y-dimension locations of the turbines, with length `N_turbines` (inherited from `FarmAeroTemplate`) yaw_turbines : np.ndarray a numpy array indicating the yaw angle to drive each turbine to with respect to the ambient wind direction, with length `N_turbines` (inherited from `FarmAeroTemplate`) Outputs ------- power_farm : np.ndarray an array of the farm power for each of the wind conditions that have been queried power_turbines : np.ndarray an array of the farm power for each of the turbines in the farm across all of the conditions that have been queried on the wind rose (`N_turbines`, `N_wind_conditions`) thrust_turbines : np.ndarray an array of the wind turbine thrust for each of the turbines in the farm across all of the conditions that have been queried on the wind rose (`N_turbines`, `N_wind_conditions`) """
[docs] def initialize(self): super().initialize() # run super class script first!
[docs] def setup(self): super().setup() # unpack wind query object self.wind_query = self.options["wind_query"] self.directions_wind = self.options["wind_query"].get_directions() self.speeds_wind = self.options["wind_query"].get_speeds() if self.options["wind_query"].get_TIs() is None: self.options["wind_query"].set_TI_using_IEC_method() self.TIs_wind = self.options["wind_query"].get_TIs() self.N_wind_conditions = self.options["wind_query"].N_conditions # add the outputs we want for a batched power analysis: # - farm and turbine powers # - turbine thrusts self.add_output( "power_farm", np.zeros((self.N_wind_conditions,)), units="W", ) if self.return_turbine_output: self.add_output( "power_turbines", np.zeros((self.N_turbines, self.N_wind_conditions)), units="W", ) self.add_output( "thrust_turbines", np.zeros((self.N_turbines, self.N_wind_conditions)), units="N", )
[docs] def setup_partials(self): """Derivative setup for OM component.""" # the default (but not preferred!) derivatives are FDM self.declare_partials("*", "*", method="exact")
[docs] def compute(self, inputs, outputs): """ Computation for the OM component. """ # the following should be set outputs["power_farm"] = ( self.N_turbines * self.modeling_options["turbine"]["nameplate"]["power_rated"] * np.ones((self.N_wind_conditions,)) ) outputs["power_turbines"] = self.modeling_options["turbine"]["nameplate"][ "power_rated" ] * np.ones((self.N_turbines, self.N_wind_conditions)) outputs["thrust_turbines"] = np.zeros((self.N_turbines, self.N_wind_conditions))
[docs] class PlaceholderAEP(templates.FarmAEPTemplate): """ Placeholder component for computing AEP assuming nameplate power at all times. Options ------- modeling_options : dict a modeling options dictionary (inherited via `templates.FarmAEPTemplate`) wind_query : floris.wind_data.WindRose a WindQuery objects that specifies the wind conditions that are to be computed (inherited from `templates.FarmAEPTemplate`) Inputs ------ x_turbines : np.ndarray a 1D numpy array indicating the x-dimension locations of the turbines, with length `N_turbines` (inherited via `templates.FarmAEPTemplate`) y_turbines : np.ndarray a 1D numpy array indicating the y-dimension locations of the turbines, with length `N_turbines` (inherited via `templates.FarmAEPTemplate`) yaw_turbines : np.ndarray a numpy array indicating the yaw angle to drive each turbine to with respect to the ambient wind direction, with length `N_turbines` (inherited via `templates.FarmAEPTemplate`) Outputs ------- AEP_farm : float the AEP of the farm given by the analysis (inherited from `templates.FarmAEPTemplate`) power_farm : np.ndarray an array of the farm power for each of the wind conditions that have been queried (inherited from `templates.FarmAEPTemplate`) power_turbines : np.ndarray an array of the farm power for each of the turbines in the farm across all of the conditions that have been queried on the wind rose (`N_turbines`, `N_wind_conditions`) (inherited from `templates.FarmAEPTemplate`) thrust_turbines : np.ndarray an array of the wind turbine thrust for each of the turbines in the farm across all of the conditions that have been queried on the wind rose (`N_turbines`, `N_wind_conditions`) (inherited from `templates.FarmAEPTemplate`) """
[docs] def initialize(self): super().initialize() # run super class script first!
[docs] def setup(self): super().setup() # run super class script first!
[docs] def setup_partials(self): self.declare_partials("*", "*", method="exact")
[docs] def compute(self, inputs, outputs): # the following should be set outputs["AEP_farm"] = ( self.N_turbines * self.modeling_options["turbine"]["nameplate"]["power_rated"] * 1.0e6 * 8760.0 ) outputs["power_farm"] = ( self.N_turbines * self.modeling_options["turbine"]["nameplate"]["power_rated"] * 1.0e6 * np.ones((self.N_wind_conditions,)) ) outputs["power_turbines"] = ( self.modeling_options["turbine"]["nameplate"]["power_rated"] * 1.0e6 * np.ones((self.N_turbines, self.N_wind_conditions)) ) outputs["thrust_turbines"] = np.zeros((self.N_turbines, self.N_wind_conditions))