@@ -158,65 +158,65 @@ def apply_static_rate_limits(
158
158
pd.DataFrame: A yaw offset lookup table with rate limits applied.
159
159
"""
160
160
161
- offsets_all = np .vstack (df_opt .yaw_angles_opt .to_numpy ()). transpose ()
161
+ offsets_all = np .vstack (df_opt .yaw_angles_opt .to_numpy ())
162
162
163
163
wd_array = np .unique (df_opt .wind_direction )
164
164
ws_array = np .unique (df_opt .wind_speed )
165
165
ti_array = np .unique (df_opt .turbulence_intensity )
166
166
167
167
wd_step = wd_array [1 ] - wd_array [0 ]
168
168
ws_step = ws_array [1 ] - ws_array [0 ]
169
+ ti_step = ti_array [1 ] - ti_array [0 ] if len (ti_array ) > 1 else 1
169
170
170
171
# 4D array, with dimensions: (turbine, wd, ws, ti)
171
172
# TODO: will this ordering always work? Or not?
172
173
offsets_array = offsets_all .reshape (
173
- (offsets_all . shape [ 0 ], len (wd_array ), len (ws_array ), len (ti_array ))
174
+ (len (wd_array ), len (ws_array ), len (ti_array ), offsets_all . shape [ - 1 ] )
174
175
)
175
176
176
177
# Apply wd rate limits
177
178
offsets_limited_lr = offsets_array .copy ()
178
179
for i in range (1 , len (wd_array )):
179
- delta_yaw = offsets_limited_lr [:, i , :, :] - offsets_limited_lr [:, i - 1 , :, :]
180
+ delta_yaw = offsets_limited_lr [i , : , :, :] - offsets_limited_lr [i - 1 , : , :, :]
180
181
delta_yaw = np .clip (delta_yaw , - wd_rate_limit * wd_step , wd_rate_limit * wd_step )
181
- offsets_limited_lr [:, i , :, :] = offsets_limited_lr [:, i - 1 , :, :] + delta_yaw
182
+ offsets_limited_lr [i , : , :, :] = offsets_limited_lr [i - 1 , : , :, :] + delta_yaw
182
183
offsets_limited_rl = offsets_array .copy ()
183
184
for i in range (len (wd_array )- 2 , - 1 , - 1 ):
184
- delta_yaw = offsets_limited_rl [:, i , :, :] - offsets_limited_rl [:, i + 1 , :, :]
185
+ delta_yaw = offsets_limited_rl [i , : , :, :] - offsets_limited_rl [i + 1 , : , :, :]
185
186
delta_yaw = np .clip (delta_yaw , - wd_rate_limit * wd_step , wd_rate_limit * wd_step )
186
- offsets_limited_rl [:, i , :, :] = offsets_limited_rl [:, i + 1 , :, :] + delta_yaw
187
+ offsets_limited_rl [i , : , :, :] = offsets_limited_rl [i + 1 , : , :, :] + delta_yaw
187
188
offsets_array = (offsets_limited_lr + offsets_limited_rl ) / 2
188
189
189
190
# Apply ws rate limits
190
191
offsets_limited_lr = offsets_array .copy ()
191
192
for j in range (1 , len (ws_array )):
192
- delta_yaw = offsets_limited_lr [:, :, j , :] - offsets_limited_lr [:, :, j - 1 , :]
193
+ delta_yaw = offsets_limited_lr [:, j , : , :] - offsets_limited_lr [:, j - 1 , : , :]
193
194
delta_yaw = np .clip (delta_yaw , - ws_rate_limit * ws_step , ws_rate_limit * ws_step )
194
- offsets_limited_lr [:, :, j , :] = offsets_limited_lr [:, :, j - 1 , :] + delta_yaw
195
+ offsets_limited_lr [:, j , : , :] = offsets_limited_lr [:, j - 1 , : , :] + delta_yaw
195
196
offsets_limited_rl = offsets_array .copy ()
196
197
for j in range (len (ws_array )- 2 , - 1 , - 1 ):
197
- delta_yaw = offsets_limited_rl [:, :, j , :] - offsets_limited_rl [:, :, j + 1 , :]
198
+ delta_yaw = offsets_limited_rl [:, j , : , :] - offsets_limited_rl [:, j + 1 , : , :]
198
199
delta_yaw = np .clip (delta_yaw , - ws_rate_limit * ws_step , ws_rate_limit * ws_step )
199
- offsets_limited_rl [:, :, j , :] = offsets_limited_rl [:, :, j + 1 , :] + delta_yaw
200
+ offsets_limited_rl [:, j , : , :] = offsets_limited_rl [:, j + 1 , : , :] + delta_yaw
200
201
offsets_array = (offsets_limited_lr + offsets_limited_rl ) / 2
201
202
202
203
# Apply ti rate limits
203
204
offsets_limited_lr = offsets_array .copy ()
204
205
for k in range (1 , len (ti_array )):
205
- delta_yaw = offsets_limited_lr [:, :, :, k ] - offsets_limited_lr [:, :, :, k - 1 ]
206
- delta_yaw = np .clip (delta_yaw , - ti_rate_limit , ti_rate_limit )
207
- offsets_limited_lr [:, :, :, k ] = offsets_limited_lr [:, :, :, k - 1 ] + delta_yaw
206
+ delta_yaw = offsets_limited_lr [:, :, k , : ] - offsets_limited_lr [:, :, k - 1 , : ]
207
+ delta_yaw = np .clip (delta_yaw , - ti_rate_limit * ti_step , ti_rate_limit * ti_step )
208
+ offsets_limited_lr [:, :, k , : ] = offsets_limited_lr [:, :, k - 1 , : ] + delta_yaw
208
209
offsets_limited_rl = offsets_array .copy ()
209
210
for k in range (len (ti_array )- 2 , - 1 , - 1 ):
210
- delta_yaw = offsets_limited_rl [:, :, :, k ] - offsets_limited_rl [:, :, :, k + 1 ]
211
- delta_yaw = np .clip (delta_yaw , - ti_rate_limit , ti_rate_limit )
212
- offsets_limited_rl [:, :, :, k ] = offsets_limited_rl [:, :, :, k + 1 ] + delta_yaw
211
+ delta_yaw = offsets_limited_rl [:, :, k , : ] - offsets_limited_rl [:, :, k + 1 , : ]
212
+ delta_yaw = np .clip (delta_yaw , - ti_rate_limit * ti_step , ti_rate_limit * ti_step )
213
+ offsets_limited_rl [:, :, k , : ] = offsets_limited_rl [:, :, k + 1 , : ] + delta_yaw
213
214
offsets_array = (offsets_limited_lr + offsets_limited_rl ) / 2
214
215
215
216
# Flatten array back into 2D array for dataframe
216
- offsets_shape = offsets_array .shape
217
217
offsets_all_limited = offsets_array .reshape (
218
- (offsets_shape [ 0 ], offsets_shape [ 1 ] * offsets_shape [ 2 ] * offsets_shape [ 3 ])
219
- ). transpose ()
218
+ (len ( wd_array ) * len ( ws_array ) * len ( ti_array ), offsets_all . shape [ - 1 ])
219
+ )
220
220
df_opt_rate_limited = df_opt .copy ()
221
221
df_opt_rate_limited ["yaw_angles_opt" ] = [* offsets_all_limited ]
222
222
0 commit comments