@@ -96,6 +96,106 @@ def __init__(self, wind_object, wake_losses_method='wind_efficiency_curve',
9696 "cluster but `wind_object` is an object of the " +
9797 "class WindFarm." )
9898
99+ def wind_farm_power_curve (self , wind_farm , ** kwargs ):
100+ r"""
101+ Caluclates the power curve of a wind farm.
102+ Depending on the parameters of the class the power curves are smoothed
103+ and/or density corrected before or after the summation and/or a wind
104+ farm efficiency is applied after the summation. TODO: check entry
105+ Parameters
106+ ----------
107+ wind_farm : WindFarm
108+ A :class:`~.wind_farm.WindFarm` object representing the wind farm.
109+ Other Parameters
110+ ----------------
111+ roughness_length : Float, optional.
112+ Roughness length.
113+ turbulence_intensity : Float, optional.
114+ Turbulence intensity.
115+ Returns
116+ -------
117+ summarized_power_curve_df : pd.DataFrame
118+ Calculated power curve of the wind farm.
119+ """
120+ # Initialize data frame for power curve values
121+ df = pd .DataFrame ()
122+ for turbine_type_dict in wind_farm .wind_turbine_fleet :
123+ # Check if all needed parameters are available
124+ if self .smoothing :
125+ if (self .standard_deviation_method ==
126+ 'turbulence_intensity' and
127+ 'turbulence_intensity' not in kwargs ):
128+ if 'roughness_length' in kwargs :
129+ # Calculate turbulence intensity and write to kwargs
130+ turbulence_intensity = (
131+ tools .estimate_turbulence_intensity (
132+ turbine_type_dict [
133+ 'wind_turbine' ].hub_height ,
134+ kwargs ['roughness_length' ]))
135+ kwargs [
136+ 'turbulence_intensity' ] = turbulence_intensity
137+ else :
138+ raise ValueError (
139+ "`roughness_length` must be defined for using " +
140+ "'turbulence_intensity' as " +
141+ "`standard_deviation_method` if " +
142+ "`turbulence_intensity` is not given" )
143+ if self .wake_losses_method is not None :
144+ if wind_farm .efficiency is None :
145+ raise KeyError (
146+ "wind_farm_efficiency is needed if " +
147+ "`wake_losses_method´ is '{0}', but " .format (
148+ self .wake_losses_method ) +
149+ " `wind_farm_efficiency` of {0} is {1}." .format (
150+ self .wind_object .object_name ,
151+ self .wind_object .efficiency ))
152+ # Get original power curve
153+ power_curve = pd .DataFrame (
154+ turbine_type_dict ['wind_turbine' ].power_curve )
155+ # Editions to power curve before the summation
156+ if (self .smoothing and
157+ self .smoothing_order == 'turbine_power_curves' ):
158+ power_curve = power_curves .smooth_power_curve (
159+ power_curve ['wind_speed' ], power_curve ['power' ],
160+ standard_deviation_method = self .standard_deviation_method ,
161+ ** kwargs )
162+ # Add power curves of all turbines of same type to data frame after
163+ # renaming columns
164+ power_curve .columns = ['wind_speed' , turbine_type_dict [
165+ 'wind_turbine' ].object_name ]
166+ df = pd .concat (
167+ [df , pd .DataFrame ( # TODO: merge without renaming
168+ power_curve .set_index (['wind_speed' ]) *
169+ turbine_type_dict ['number_of_turbines' ])], axis = 1 )
170+ # Rename back TODO: copy()
171+ power_curve .columns = ['wind_speed' , 'power' ]
172+ # Sum up power curves of all turbine types
173+ summarized_power_curve = pd .DataFrame (
174+ sum (df [item ].interpolate (method = 'index' ) for item in list (df )))
175+ summarized_power_curve .columns = ['power' ]
176+ # Return wind speed (index) to a column of the data frame
177+ summarized_power_curve_df = pd .DataFrame (
178+ data = [list (summarized_power_curve .index ),
179+ list (
180+ summarized_power_curve ['power' ].values )]).transpose ()
181+ summarized_power_curve_df .columns = ['wind_speed' , 'power' ]
182+ # Editions to power curve after the summation
183+ if (self .smoothing and
184+ self .smoothing_order == 'wind_farm_power_curves' ):
185+ summarized_power_curve_df = power_curves .smooth_power_curve (
186+ summarized_power_curve_df ['wind_speed' ],
187+ summarized_power_curve_df ['power' ],
188+ standard_deviation_method = self .standard_deviation_method ,
189+ ** kwargs )
190+ if (self .wake_losses_method == 'constant_efficiency' or
191+ self .wake_losses_method == 'wind_efficiency_curve' ):
192+ summarized_power_curve_df = (
193+ power_curves .wake_losses_to_power_curve (
194+ summarized_power_curve_df ['wind_speed' ].values ,
195+ summarized_power_curve_df ['power' ].values ,
196+ wake_losses_method = self .wake_losses_method ,
197+ wind_farm_efficiency = self .wind_object .efficiency ))
198+ return summarized_power_curve_df
99199 def turbine_cluster_power_curve (self , ** kwargs ):
100200 r"""
101201 Caluclates the power curve of a wind turbine cluster.
0 commit comments