Northing Calibration in FLASC#

Northing calibration, that is the detection of bias and changes in measurements of turbine yaw are important for many of the analysis in FLASC. This notebook demonstrates the use of several of these tools in FLASC for the calibration of northing measurements.

import warnings as wn
from datetime import timedelta as td

import numpy as np
import pandas as pd
from floris import TimeSeries
from floris.layout_visualization import plot_turbine_labels, plot_turbine_points
from floris.utilities import wrap_360
from matplotlib import pyplot as plt

from flasc import FlascDataFrame
from flasc.data_processing import (
    dataframe_manipulations as dfm,
    energy_ratio_wd_bias_estimation as best,
    filtering as filt,
    northing_offset as nof,
)
from flasc.data_processing.northing_offset_change_hoger import homogenize_hoger
from flasc.utilities import (
    floris_tools as ftools,
    optimization as flopt,
)
from flasc.utilities.utilities_examples import load_floris_artificial as load_floris

Load FLORIS model and show layout#

# Load FLORIS model
fm, turbine_weights = load_floris()
# Show the layout
fig, ax = plt.subplots()
plot_turbine_points(fm, ax)
plot_turbine_labels(fm, ax)
<Axes: >
../../_images/20e4cade48d93bca8e41e0365cc1da7afc01058c9cff8756376d0957e27d6a9e.png

Generate data set to illustrate operations#

For simplicity assume a fixed wind speed and turbulence intensity and uniform wind direction. Perturb the wind direction by random noise

# Set wind direction to step from 90 to 270, in steps that are 600 long and 10 degrees wide

wind_directions = np.linspace(90, 270, 10)
wind_directions = np.tile(wind_directions, 600)
wind_directions = np.sort(wind_directions)

# Apply noise
np.random.seed(0)
noise = np.random.normal(0, 5.0, wind_directions.shape)
wind_directions = wind_directions + noise

# Set a FLORIS time series object
time_series = TimeSeries(
    wind_directions=wind_directions, wind_speeds=8.0, turbulence_intensities=0.06
)
# Calculate FLORIS solution
fm.set(wind_data=time_series)
fm.run()
turbine_powers = fm.get_turbine_powers()

# Add random noise to the power output
turbine_powers = turbine_powers + np.random.normal(0, 25.0, turbine_powers.shape)
# Use the results to create a FLASC dataframe representing hypothetical scada data
df_scada = FlascDataFrame(
    {
        "time": pd.date_range(start="1/1/2020", periods=len(wind_directions), freq="600s"),
        "wind_directions": wind_directions,
        "wind_speeds": 8.0 * np.ones_like(wind_directions),
        "ti": 0.06 * np.ones_like(wind_directions),
    }
)
# Add the turbine powers to the dataframe with some added noise
for t_idx in range(fm.n_turbines):
    df_scada[f"pow_{t_idx:03d}"] = turbine_powers[:, t_idx]

# Set the turbine wind directions to be the true wind direction with some added noise
for t_idx in range(fm.n_turbines):
    df_scada[f"wd_{t_idx:03d}"] = wrap_360(
        wind_directions + np.random.normal(0, 5.0, wind_directions.shape)
    )

# Set wind speeds to be fixed with small noise
for t_idx in range(fm.n_turbines):
    df_scada[f"ws_{t_idx:03d}"] = 8.0 * np.ones_like(wind_directions) + np.random.normal(
        0, 0.1, wind_directions.shape
    )

df_scada
FlascDataFrame in FLASC format
time wind_directions wind_speeds ti pow_000 pow_001 pow_002 pow_003 pow_004 pow_005 ... wd_004 wd_005 wd_006 ws_000 ws_001 ws_002 ws_003 ws_004 ws_005 ws_006
0 2020-01-01 00:00:00 98.820262 8.0 0.06 1.754006e+06 1.753879e+06 6.357473e+05 9.640375e+05 9.666355e+05 1.753524e+06 ... 99.644321 101.107205 99.348930 8.011852 8.162351 8.159744 7.899556 8.076833 8.185659 8.064289
1 2020-01-01 00:10:00 92.000786 8.0 0.06 1.753913e+06 1.753904e+06 1.409497e+06 8.553318e+05 9.171484e+05 1.753951e+06 ... 82.166085 88.043464 89.257707 8.175628 7.808788 8.023940 8.084883 8.080681 7.849506 7.913113
2 2020-01-01 00:20:00 94.893690 8.0 0.06 1.753985e+06 1.753891e+06 9.842584e+05 6.162996e+05 6.600864e+05 1.753942e+06 ... 94.712330 92.252229 90.985282 7.991109 7.892661 7.928803 8.081048 8.073745 8.091502 8.053268
3 2020-01-01 00:30:00 101.204466 8.0 0.06 1.753950e+06 1.753555e+06 8.123594e+05 1.319409e+06 1.170321e+06 1.751776e+06 ... 110.699134 93.116417 108.537493 7.917771 8.077458 7.942418 7.960415 7.766181 7.875381 8.012211
4 2020-01-01 00:40:00 99.337790 8.0 0.06 1.754020e+06 1.753852e+06 6.487232e+05 1.043126e+06 1.030381e+06 1.753318e+06 ... 95.656436 92.461185 106.783658 7.850214 7.973655 8.028457 8.225742 8.147089 7.934316 7.798261
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
5995 2020-02-11 15:10:00 263.345981 8.0 0.06 1.753204e+06 1.687681e+06 1.753965e+06 1.730570e+06 1.753947e+06 8.849585e+05 ... 261.464863 265.654828 265.006674 7.867506 8.118957 7.879889 7.999180 8.046216 7.930540 7.880831
5996 2020-02-11 15:20:00 271.762993 8.0 0.06 1.435174e+06 1.752561e+06 1.753922e+06 9.033320e+05 1.753985e+06 1.702120e+06 ... 271.559170 267.387924 271.051594 8.028336 8.219887 7.878284 8.086875 8.154903 8.149477 8.080819
5997 2020-02-11 15:30:00 267.310576 8.0 0.06 1.728385e+06 1.740995e+06 1.753938e+06 1.521491e+06 1.753960e+06 1.223109e+06 ... 267.398639 263.998493 270.306531 8.020642 8.044316 8.031791 8.170447 8.253171 8.056111 7.903335
5998 2020-02-11 15:40:00 271.967222 8.0 0.06 1.408887e+06 1.752647e+06 1.753962e+06 8.717409e+05 1.753956e+06 1.709693e+06 ... 270.043104 273.116864 281.039771 8.063863 7.936743 8.230575 8.071727 7.996428 8.013610 8.109070
5999 2020-02-11 15:50:00 271.432591 8.0 0.06 1.475155e+06 1.752267e+06 1.753954e+06 9.545584e+05 1.753887e+06 1.687766e+06 ... 269.690265 269.465325 269.938743 7.972016 8.079571 8.001622 8.017239 8.017320 8.013297 7.983608

6000 rows × 25 columns

Northing calibration error#

Add to the data two types of northing calibration error:

  1. A constant bias on turbine 001

  2. A change in bias on turbine 002 halfway through the data set

df_scada["wd_001"] = wrap_360(
    15.0 + wind_directions + np.random.normal(0, 0.5, wind_directions.shape)
)

mid_point = int(len(wind_directions) / 2)
wd_change = wind_directions + np.random.normal(0, 0.5, wind_directions.shape)
wd_change[mid_point:] = wd_change[mid_point:] - 45.0
wd_change = wrap_360(wd_change)
df_scada["wd_002"] = wd_change
# Show the wd channels for the turbines
fig, ax = plt.subplots(figsize=(12, 6))

ax.plot(df_scada["time"], df_scada["wd_001"], label="wd_001 (Fixed Bias)", color="blue")
ax.plot(df_scada["time"], df_scada["wd_002"], label="wd_002 (Bias Changes)", color="red")
ax.plot(df_scada["time"], df_scada["wd_000"], label="wd_000", color="k", alpha=0.5)
ax.plot(df_scada["time"], df_scada["wd_003"], label="wd_003", color="k", alpha=0.5)
ax.plot(df_scada["time"], df_scada["wd_004"], label="wd_004", color="k", alpha=0.5)
ax.plot(df_scada["time"], df_scada["wd_005"], label="wd_005", color="k", alpha=0.5)
ax.plot(df_scada["time"], df_scada["wd_006"], label="wd_006", color="k", alpha=0.5)
ax.legend()
ax.set_xlabel("Time")
ax.set_ylabel("Wind direction (deg)")
Text(0, 0.5, 'Wind direction (deg)')
../../_images/3cf88593ea5e452f35cf1b9d2d027eae72d20dc44c4b6cc652014e4ca2e9a2dc.png
# Finally compute df_approx for use in later algorithms
# Can compute only at 8m/s for this example
df_fm_approx = ftools.calc_floris_approx_table(
    fm=fm,  # fi=fi_pci,
    wd_array=np.arange(0.0, 360.01, 1.0),
    ws_array=np.array([8.0]),
    ti_array=np.array([0.06]),
)
2025-05-12 18:26:25 Generating a df_approx table of FLORIS solutions covering a total of 361 cases.
2025-05-12 18:26:25 Finished calculating the FLORIS solutions for the dataframe.

Cross-Check Northing calibration#

crosscheck_northing_offset_consistency is a function to check if the relative offset between turbines is consistent. If the offset is consistent, then we know we can find a single offset value that would align the two turbine's northings. If this is not the case, one or both turbines likely experience jumps in their nacelle calibration throughout the timeseries.

# Create a copy in which we mark the wd measurements of turbines with northing drift  as faulty
df_scada_marked_faulty_northing_drift = df_scada.copy()

turb_wd_consistency = nof.crosscheck_northing_offset_consistency(
    df=df_scada_marked_faulty_northing_drift, fm=fm, plot_figure=True, bias_timestep=td(days=1)
)
print(turb_wd_consistency)
2025-05-12 18:26:25 Matching curves for turbine 000...
2025-05-12 18:26:27     T006  T001  T002  T005  T003
0    0.0 -16.0   0.0   0.0   0.0
1    0.0 -14.0   0.0   0.0   0.0
2    0.0 -16.0   0.0   0.0   0.0
3    0.0 -16.0   0.0   0.0   0.0
4    0.0 -14.0   0.0   2.0   0.0
5    0.0 -14.0   0.0   0.0   0.0
6    0.0 -16.0   0.0   0.0  -2.0
7    0.0 -16.0   0.0   0.0   0.0
8    0.0 -16.0   0.0   0.0   0.0
9    0.0 -16.0   0.0   0.0   0.0
10   0.0 -16.0   0.0   0.0   0.0
11   0.0 -16.0   0.0   0.0   0.0
12   0.0 -14.0   0.0   0.0   0.0
13   0.0 -14.0   0.0   0.0   0.0
14  -2.0 -16.0   0.0   0.0   0.0
15   0.0 -14.0   0.0   0.0   0.0
16   2.0 -14.0   0.0   2.0   0.0
17   0.0 -14.0   0.0   0.0   0.0
18  -2.0 -16.0   0.0   0.0   0.0
19   0.0 -16.0   0.0   0.0   0.0
20   0.0 -14.0   8.0   0.0   2.0
21   0.0 -14.0  46.0   0.0   0.0
22   0.0 -14.0  46.0   0.0   0.0
23   0.0 -14.0  46.0   0.0   0.0
24   0.0 -14.0  46.0   2.0   0.0
25   0.0 -16.0  44.0   0.0   0.0
26   0.0 -16.0  44.0  -2.0   0.0
27   0.0 -14.0  46.0   0.0   2.0
28   0.0 -14.0  46.0   0.0   0.0
29   0.0 -14.0  46.0   0.0   0.0
30   0.0 -14.0  44.0   0.0   0.0
31   0.0 -16.0  44.0   0.0   0.0
32   0.0 -14.0  46.0   0.0   0.0
33   0.0 -16.0  44.0   0.0   0.0
34   0.0 -14.0  46.0   0.0   0.0
35   0.0 -16.0  44.0   0.0   0.0
36   0.0 -14.0  46.0   0.0   2.0
37   0.0 -14.0  46.0   0.0   0.0
38   0.0 -14.0  46.0   0.0   0.0
39   0.0 -14.0  46.0   0.0   0.0
40   0.0 -16.0  44.0   0.0   0.0
41   0.0 -14.0  46.0   0.0   0.0
2025-05-12 18:26:27 Matching curves for turbine 001...
2025-05-12 18:26:28     T002  T006  T005  T003  T000
0   16.0  14.0  16.0  16.0  16.0
1   14.0  16.0  14.0  16.0  14.0
2   14.0  16.0  14.0  16.0  16.0
3   16.0  16.0  14.0  14.0  16.0
4   14.0  14.0  16.0  14.0  14.0
5   16.0  14.0  14.0  16.0  14.0
6   14.0  14.0  14.0  14.0  16.0
7   16.0  14.0  16.0  16.0  16.0
8   14.0  16.0  14.0  16.0  16.0
9   14.0  14.0  14.0  16.0  16.0
10  16.0  14.0  14.0  14.0  16.0
11  16.0  14.0  16.0  14.0  16.0
12  16.0  14.0  14.0  14.0  14.0
13  14.0  14.0  14.0  14.0  14.0
14  16.0  14.0  16.0  16.0  16.0
15  14.0  14.0  14.0  16.0  14.0
16  16.0  16.0  16.0  14.0  14.0
17  14.0  14.0  14.0  16.0  14.0
18  16.0  14.0  14.0  16.0  16.0
19  16.0  14.0  14.0  14.0  16.0
20  22.0  14.0  14.0  16.0  14.0
21  60.0  14.0  16.0  14.0  14.0
22  60.0  14.0  16.0  14.0  14.0
23  60.0  14.0  16.0  16.0  14.0
24  60.0  16.0  16.0  14.0  14.0
25  60.0  16.0  14.0  16.0  16.0
26  60.0  16.0  14.0  14.0  16.0
27  60.0  14.0  16.0  16.0  14.0
28  60.0  14.0  16.0  14.0  14.0
29  60.0  14.0  16.0  16.0  14.0
30  60.0  14.0  14.0  14.0  14.0
31  60.0  16.0  14.0  14.0  16.0
32  60.0  16.0  16.0  14.0  14.0
33  60.0  16.0  16.0  16.0  16.0
34  60.0  16.0  16.0  16.0  14.0
35  60.0  14.0  16.0  14.0  16.0
36  60.0  14.0  14.0  16.0  14.0
37  60.0  14.0  16.0  14.0  14.0
38  60.0  16.0  14.0  14.0  14.0
39  60.0  14.0  16.0  14.0  14.0
40  60.0  16.0  14.0  14.0  16.0
41  60.0  14.0  16.0  14.0  14.0
2025-05-12 18:26:28 Matching curves for turbine 002...
2025-05-12 18:26:29     T001  T003  T005  T000  T006
0  -16.0   0.0   0.0  -0.0   0.0
1  -14.0   0.0   0.0  -0.0   0.0
2  -14.0   0.0   0.0  -0.0   0.0
3  -16.0   0.0   0.0  -0.0   0.0
4  -14.0   0.0   0.0  -0.0   0.0
5  -16.0   0.0   0.0  -0.0   0.0
6  -14.0   0.0   0.0  -0.0   0.0
7  -16.0   0.0   0.0  -0.0   0.0
8  -14.0   0.0   0.0  -0.0   0.0
9  -14.0   0.0   0.0  -0.0   0.0
10 -16.0   0.0   0.0  -0.0   0.0
11 -16.0   0.0   0.0  -0.0   0.0
12 -16.0   0.0   0.0  -0.0   0.0
13 -14.0   0.0   0.0  -0.0   0.0
14 -16.0   0.0   0.0  -0.0   0.0
15 -14.0   0.0   0.0  -0.0   0.0
16 -16.0   0.0   2.0  -0.0   0.0
17 -14.0   0.0   0.0  -0.0   0.0
18 -16.0   0.0   0.0  -0.0   0.0
19 -16.0   0.0   0.0  -0.0   0.0
20 -22.0  -6.0  -8.0  -8.0  -8.0
21 -60.0 -46.0 -44.0 -46.0 -46.0
22 -60.0 -46.0 -44.0 -46.0 -46.0
23 -60.0 -44.0 -44.0 -46.0 -46.0
24 -60.0 -46.0 -44.0 -46.0 -44.0
25 -60.0 -44.0 -46.0 -44.0 -44.0
26 -60.0 -46.0 -46.0 -44.0 -44.0
27 -60.0 -44.0 -44.0 -46.0 -46.0
28 -60.0 -46.0 -44.0 -46.0 -46.0
29 -60.0 -44.0 -44.0 -46.0 -46.0
30 -60.0 -46.0 -46.0 -44.0 -46.0
31 -60.0 -46.0 -46.0 -44.0 -44.0
32 -60.0 -46.0 -44.0 -46.0 -44.0
33 -60.0 -44.0 -44.0 -44.0 -44.0
34 -60.0 -44.0 -44.0 -46.0 -44.0
35 -60.0 -46.0 -44.0 -44.0 -46.0
36 -60.0 -44.0 -46.0 -46.0 -46.0
37 -60.0 -46.0 -44.0 -46.0 -44.0
38 -60.0 -46.0 -46.0 -46.0 -44.0
39 -60.0 -46.0 -44.0 -46.0 -46.0
40 -60.0 -46.0 -46.0 -44.0 -44.0
41 -60.0 -46.0 -44.0 -46.0 -46.0
2025-05-12 18:26:29 Matching curves for turbine 003...
2025-05-12 18:26:29     T005  T002  T001  T004  T006
0    0.0  -0.0 -16.0   0.0   0.0
1    0.0  -0.0 -16.0   0.0   0.0
2    0.0  -0.0 -16.0   0.0   0.0
3    0.0  -0.0 -14.0   0.0   0.0
4    0.0  -0.0 -14.0   0.0   0.0
5    0.0  -0.0 -16.0   0.0   0.0
6    0.0  -0.0 -14.0   0.0   0.0
7    0.0  -0.0 -16.0   0.0   0.0
8    0.0  -0.0 -16.0   0.0   0.0
9    0.0  -0.0 -16.0   0.0   0.0
10   0.0  -0.0 -14.0   0.0   0.0
11   0.0  -0.0 -14.0   0.0   0.0
12   0.0  -0.0 -14.0   0.0   0.0
13   0.0  -0.0 -14.0   0.0   0.0
14   0.0  -0.0 -16.0   0.0   0.0
15   0.0  -0.0 -16.0   0.0   0.0
16   2.0  -0.0 -14.0   2.0   2.0
17   0.0  -0.0 -16.0   0.0   0.0
18   0.0  -0.0 -16.0   0.0   0.0
19   0.0  -0.0 -14.0   0.0   0.0
20  -2.0   6.0 -16.0   0.0  -2.0
21   0.0  46.0 -14.0   0.0   0.0
22   0.0  46.0 -14.0   0.0   0.0
23   0.0  44.0 -16.0   0.0   0.0
24   0.0  46.0 -14.0   0.0   0.0
25   0.0  44.0 -16.0  -2.0   0.0
26   0.0  46.0 -14.0   0.0   0.0
27   0.0  44.0 -16.0   0.0   0.0
28   0.0  46.0 -14.0   0.0   0.0
29   0.0  44.0 -16.0  -2.0   0.0
30   0.0  46.0 -14.0   0.0   0.0
31   0.0  46.0 -14.0   0.0   0.0
32   0.0  46.0 -14.0   0.0   0.0
33   0.0  44.0 -16.0   0.0   0.0
34   0.0  44.0 -16.0   0.0   0.0
35   0.0  46.0 -14.0   0.0   0.0
36  -2.0  44.0 -16.0  -2.0  -2.0
37   0.0  46.0 -14.0   0.0   0.0
38   0.0  46.0 -14.0   0.0   0.0
39   0.0  46.0 -14.0   0.0   0.0
40   0.0  46.0 -14.0   0.0   0.0
41   0.0  46.0 -14.0   0.0   0.0
2025-05-12 18:26:29 Matching curves for turbine 004...
2025-05-12 18:26:30     T003  T002  T005  T001  T006
0   -0.0   0.0   0.0 -16.0   0.0
1   -0.0   0.0   0.0 -14.0   0.0
2   -0.0   0.0   0.0 -16.0   0.0
3   -0.0   0.0   0.0 -16.0   0.0
4   -0.0   0.0   0.0 -16.0  -2.0
5   -0.0   0.0   0.0 -14.0   0.0
6   -0.0   0.0   0.0 -16.0   0.0
7   -0.0   0.0   0.0 -14.0   0.0
8   -0.0   0.0   0.0 -14.0   0.0
9   -0.0   0.0   0.0 -16.0   0.0
10  -0.0   0.0   0.0 -16.0  -2.0
11  -0.0   0.0   0.0 -14.0   0.0
12  -0.0   0.0   0.0 -16.0   0.0
13  -0.0   0.0   0.0 -16.0   0.0
14  -0.0   0.0   0.0 -16.0   0.0
15  -0.0   0.0   0.0 -16.0   0.0
16  -2.0   0.0   0.0 -16.0   0.0
17  -0.0   0.0   0.0 -16.0   0.0
18  -0.0   0.0   0.0 -14.0   0.0
19  -0.0   0.0   0.0 -14.0   0.0
20  -0.0   8.0   0.0 -14.0   0.0
21  -0.0  44.0   0.0 -16.0   0.0
22  -0.0  44.0   0.0 -16.0   0.0
23  -0.0  46.0   0.0 -14.0   0.0
24  -0.0  46.0   2.0 -14.0   0.0
25   2.0  46.0   0.0 -14.0   2.0
26  -0.0  44.0  -2.0 -16.0   0.0
27  -0.0  46.0   0.0 -14.0   0.0
28  -0.0  44.0   0.0 -16.0   0.0
29   2.0  46.0   2.0 -14.0   0.0
30  -0.0  46.0   0.0 -14.0   0.0
31  -0.0  44.0  -2.0 -16.0   0.0
32  -0.0  46.0   0.0 -14.0   0.0
33  -0.0  46.0   0.0 -14.0   0.0
34  -0.0  44.0   0.0 -16.0   0.0
35  -0.0  46.0   0.0 -14.0   0.0
36   2.0  46.0   0.0 -14.0   0.0
37  -0.0  46.0   0.0 -14.0   0.0
38  -0.0  44.0   0.0 -16.0   0.0
39  -0.0  44.0   0.0 -16.0   0.0
40  -0.0  44.0   0.0 -16.0   0.0
41  -0.0  46.0   0.0 -14.0   0.0
2025-05-12 18:26:30 Matching curves for turbine 005...
2025-05-12 18:26:31     T003  T001  T006  T002  T000
0   -0.0 -16.0   0.0  -0.0  -0.0
1   -0.0 -14.0   0.0  -0.0  -0.0
2   -0.0 -14.0   0.0  -0.0  -0.0
3   -0.0 -14.0   0.0  -0.0  -0.0
4   -0.0 -16.0  -2.0  -0.0  -2.0
5   -0.0 -14.0   0.0  -0.0  -0.0
6   -0.0 -14.0   0.0  -0.0  -0.0
7   -0.0 -16.0   0.0  -0.0  -0.0
8   -0.0 -14.0   0.0  -0.0  -0.0
9   -0.0 -14.0   0.0  -0.0  -0.0
10  -0.0 -14.0   0.0  -0.0  -0.0
11  -0.0 -16.0   0.0  -0.0  -0.0
12  -0.0 -14.0   0.0  -0.0  -0.0
13  -0.0 -14.0   0.0  -0.0  -0.0
14  -0.0 -16.0  -2.0  -0.0  -0.0
15  -0.0 -14.0   0.0  -0.0  -0.0
16  -2.0 -16.0   0.0  -2.0  -2.0
17  -0.0 -14.0   0.0  -0.0  -0.0
18  -0.0 -14.0   0.0  -0.0  -0.0
19  -0.0 -14.0   0.0  -0.0  -0.0
20   2.0 -14.0   0.0   8.0  -0.0
21  -0.0 -16.0   0.0  44.0  -0.0
22  -0.0 -16.0  -2.0  44.0  -0.0
23  -0.0 -16.0   0.0  44.0  -0.0
24  -0.0 -16.0   0.0  44.0  -2.0
25  -0.0 -14.0   0.0  46.0  -0.0
26  -0.0 -14.0   2.0  46.0   2.0
27  -0.0 -16.0   0.0  44.0  -0.0
28  -0.0 -16.0   0.0  44.0  -0.0
29  -0.0 -16.0   0.0  44.0  -0.0
30  -0.0 -14.0   0.0  46.0  -0.0
31  -0.0 -14.0   0.0  46.0  -0.0
32  -0.0 -16.0   0.0  44.0  -0.0
33  -0.0 -16.0   0.0  44.0  -0.0
34  -0.0 -16.0   0.0  44.0  -0.0
35  -0.0 -16.0   0.0  44.0  -0.0
36   2.0 -14.0   0.0  46.0  -0.0
37  -0.0 -16.0   0.0  44.0  -0.0
38  -0.0 -14.0   0.0  46.0  -0.0
39  -0.0 -16.0   0.0  44.0  -0.0
40  -0.0 -14.0   0.0  46.0  -0.0
41  -0.0 -16.0  -2.0  44.0  -0.0
2025-05-12 18:26:31 Matching curves for turbine 006...
2025-05-12 18:26:31     T001  T005  T000  T003  T002
0  -14.0  -0.0  -0.0  -0.0  -0.0
1  -16.0  -0.0  -0.0  -0.0  -0.0
2  -16.0  -0.0  -0.0  -0.0  -0.0
3  -16.0  -0.0  -0.0  -0.0  -0.0
4  -14.0   2.0  -0.0  -0.0  -0.0
5  -14.0  -0.0  -0.0  -0.0  -0.0
6  -14.0  -0.0  -0.0  -0.0  -0.0
7  -14.0  -0.0  -0.0  -0.0  -0.0
8  -16.0  -0.0  -0.0  -0.0  -0.0
9  -14.0  -0.0  -0.0  -0.0  -0.0
10 -14.0  -0.0  -0.0  -0.0  -0.0
11 -14.0  -0.0  -0.0  -0.0  -0.0
12 -14.0  -0.0  -0.0  -0.0  -0.0
13 -14.0  -0.0  -0.0  -0.0  -0.0
14 -14.0   2.0   2.0  -0.0  -0.0
15 -14.0  -0.0  -0.0  -0.0  -0.0
16 -16.0  -0.0  -2.0  -2.0  -0.0
17 -14.0  -0.0  -0.0  -0.0  -0.0
18 -14.0  -0.0   2.0  -0.0  -0.0
19 -14.0  -0.0  -0.0  -0.0  -0.0
20 -14.0  -0.0  -0.0   2.0   8.0
21 -14.0  -0.0  -0.0  -0.0  46.0
22 -14.0   2.0  -0.0  -0.0  46.0
23 -14.0  -0.0  -0.0  -0.0  46.0
24 -16.0  -0.0  -0.0  -0.0  44.0
25 -16.0  -0.0  -0.0  -0.0  44.0
26 -16.0  -2.0  -0.0  -0.0  44.0
27 -14.0  -0.0  -0.0  -0.0  46.0
28 -14.0  -0.0  -0.0  -0.0  46.0
29 -14.0  -0.0  -0.0  -0.0  46.0
30 -14.0  -0.0  -0.0  -0.0  46.0
31 -16.0  -0.0  -0.0  -0.0  44.0
32 -16.0  -0.0  -0.0  -0.0  44.0
33 -16.0  -0.0  -0.0  -0.0  44.0
34 -16.0  -0.0  -0.0  -0.0  44.0
35 -14.0  -0.0  -0.0  -0.0  46.0
36 -14.0  -0.0  -0.0   2.0  46.0
37 -14.0  -0.0  -0.0  -0.0  44.0
38 -16.0  -0.0  -0.0  -0.0  44.0
39 -14.0  -0.0  -0.0  -0.0  46.0
40 -16.0  -0.0  -0.0  -0.0  44.0
41 -14.0   2.0  -0.0  -0.0  46.0
2025-05-12 18:26:31 Turbine 000 seems to have no jumps in its WD measurement calibration. [CLEAN]
2025-05-12 18:26:31 Turbine 001 seems to have no jumps in its WD measurement calibration. [CLEAN]
2025-05-12 18:26:31 Turbine 002 seems to have one or multiple jumps in its WD measurement calibration. [BAD]
2025-05-12 18:26:31 Turbine 003 seems to have no jumps in its WD measurement calibration. [CLEAN]
2025-05-12 18:26:31 Turbine 004 seems to have no jumps in its WD measurement calibration. [CLEAN]
2025-05-12 18:26:31 Turbine 005 seems to have no jumps in its WD measurement calibration. [CLEAN]
2025-05-12 18:26:31 Turbine 006 seems to have no jumps in its WD measurement calibration. [CLEAN]
['clean', 'clean', 'bad', 'clean', 'clean', 'clean', 'clean']
../../_images/0abd740dd8289bd747522fd84db6083b1b57cbb2a8efd42914e9bb53634b5694.png

crosscheck_northing_offset_consistency detects that T002 contains a probable jump, one solution is to then remove T002's wind direction data from consideration however this is not done in this notebook as we next take advantage of HOGER recalibration. The code to do this is included below in comments

# # Mark wind direction measurements of turbines with inconsistent calibration as faulty
# faulty_turbines = [not s == "clean" for s in turb_wd_consistency]
# for ti in np.where(faulty_turbines)[0]:
#     df_scada_marked_faulty_northing_drift["wd_{:03d}".format(ti)] = np.nan

Homegenization with HOGER#

The homogenize function implements the HOGER method for recalibrating northing measurements. HOGER was developed by Paul Poncet (engie-paul-poncet) and Thomas Duc (engie-thomas-duc) of Engie, and Rubén González-Lope (rglope) and Alvaro Gonzalez Salcedo (alvarogonzalezsalcedo) of CENER within the TWAIN project.

The homogenize will remove apparent jumps in northing correction (but does not confirm the final level is unbiased overall)

df_scada_non_homogenized = df_scada.copy()
df_scada_homogenized, d2 = homogenize_hoger(df_scada_marked_faulty_northing_drift, threshold=10)

# Show the search results
d2
[2999.5]
/home/runner/work/flasc/flasc/flasc/data_processing/northing_offset_change_hoger.py:110: UserWarning: Encountered a tie, and the difference between minimal and maximal value is > length('x') * 0.05.
 The distribution could be multimodal
  warnings.warn(
Class Turbine Count Jump Knot Knot_date
0 1 wd_002 6 44.982446 2999.5 2020-01-21 19:40:00

The HOGER homeginization removes changes in northing calibration of turbines with respect to others, however the final selected value may contain a steady offset, as happens in this case

# Show the effects of homogenization
# Show the wd channels for the turbines
fig, ax = plt.subplots(figsize=(12, 6))
ax.plot(
    df_scada_homogenized["time"],
    df_scada_homogenized["wd_001"],
    label="wd_001 (Fixed Bias)",
    color="blue",
)
ax.plot(
    df_scada_homogenized["time"],
    df_scada_homogenized["wd_002"],
    label="wd_002 (Bias Changes)",
    color="red",
)
ax.plot(
    df_scada_homogenized["time"],
    df_scada_homogenized["wd_000"],
    label="wd_000",
    color="k",
    alpha=0.5,
)
ax.plot(
    df_scada_homogenized["time"],
    df_scada_homogenized["wd_003"],
    label="wd_003",
    color="k",
    alpha=0.5,
)
ax.plot(
    df_scada_homogenized["time"],
    df_scada_homogenized["wd_004"],
    label="wd_004",
    color="k",
    alpha=0.5,
)
ax.plot(
    df_scada_homogenized["time"],
    df_scada_homogenized["wd_005"],
    label="wd_005",
    color="k",
    alpha=0.5,
)
ax.plot(
    df_scada_homogenized["time"],
    df_scada_homogenized["wd_006"],
    label="wd_006",
    color="k",
    alpha=0.5,
)
ax.legend()
ax.set_xlabel("Time")
ax.set_ylabel("Wind direction (deg)")
Text(0, 0.5, 'Wind direction (deg)')
../../_images/dc9426858d128992db38e5a1162e5f75d0e627a6b3fb04760e93f5c1c1ed4953.png

Recalculate which turbines are clean with respect to offset changes#

# Create a copy in which we mark the wd measurements of turbines with northing drift  as faulty
df_scada_marked_faulty_northing_drift = df_scada_homogenized.copy()

turb_wd_consistency = nof.crosscheck_northing_offset_consistency(
    df=df_scada_marked_faulty_northing_drift, fm=fm, plot_figure=True, bias_timestep=td(days=2)
)
print(turb_wd_consistency)
2025-05-12 18:26:31 Matching curves for turbine 000...
2025-05-12 18:26:32     T006  T001  T002  T005  T003
0    0.0 -16.0  44.0   0.0   0.0
1    0.0 -16.0  44.0   0.0   0.0
2    0.0 -14.0  46.0   0.0   0.0
3    0.0 -16.0  44.0   0.0   0.0
4    0.0 -16.0  44.0   0.0   0.0
5    0.0 -16.0  44.0   0.0   0.0
6    0.0 -14.0  46.0   0.0   0.0
7    0.0 -16.0  44.0   0.0   0.0
8    0.0 -14.0  46.0   0.0   0.0
9    0.0 -16.0  44.0   0.0   0.0
10   0.0 -14.0  46.0   0.0   0.0
11   0.0 -14.0  46.0   0.0   0.0
12   0.0 -14.0  44.0   0.0   0.0
13   0.0 -14.0  46.0   0.0   0.0
14   0.0 -14.0  46.0   0.0   0.0
15   0.0 -16.0  44.0   0.0   0.0
16   0.0 -16.0  44.0   0.0   0.0
17   0.0 -14.0  46.0   0.0   0.0
18   0.0 -14.0  46.0   0.0   0.0
19   0.0 -14.0  46.0   0.0   0.0
20   0.0 -14.0  46.0   0.0   0.0
2025-05-12 18:26:32 Matching curves for turbine 001...
2025-05-12 18:26:33     T002  T006  T005  T003  T000
0   60.0  16.0  14.0  16.0  16.0
1   60.0  16.0  14.0  14.0  16.0
2   60.0  14.0  16.0  16.0  14.0
3   60.0  14.0  16.0  16.0  16.0
4   60.0  16.0  14.0  16.0  16.0
5   60.0  14.0  14.0  14.0  16.0
6   60.0  14.0  14.0  14.0  14.0
7   60.0  14.0  14.0  16.0  16.0
8   60.0  16.0  16.0  14.0  14.0
9   60.0  14.0  14.0  14.0  16.0
10  60.0  14.0  14.0  16.0  14.0
11  60.0  14.0  16.0  16.0  14.0
12  60.0  16.0  16.0  16.0  14.0
13  60.0  16.0  14.0  16.0  14.0
14  60.0  14.0  16.0  14.0  14.0
15  60.0  14.0  14.0  14.0  16.0
16  60.0  16.0  16.0  16.0  16.0
17  60.0  14.0  16.0  16.0  14.0
18  60.0  14.0  14.0  16.0  14.0
19  60.0  14.0  14.0  14.0  14.0
20  60.0  14.0  16.0  14.0  14.0
2025-05-12 18:26:33 Matching curves for turbine 002...
2025-05-12 18:26:33     T001  T003  T005  T000  T006
0  -60.0 -44.0 -46.0 -44.0 -44.0
1  -60.0 -46.0 -46.0 -44.0 -44.0
2  -60.0 -44.0 -44.0 -46.0 -46.0
3  -60.0 -44.0 -44.0 -44.0 -46.0
4  -60.0 -44.0 -46.0 -44.0 -44.0
5  -60.0 -46.0 -44.0 -44.0 -46.0
6  -60.0 -46.0 -46.0 -46.0 -46.0
7  -60.0 -44.0 -44.0 -44.0 -46.0
8  -60.0 -46.0 -44.0 -46.0 -44.0
9  -60.0 -46.0 -46.0 -44.0 -46.0
10 -60.0 -44.0 -46.0 -46.0 -46.0
11 -60.0 -44.0 -44.0 -46.0 -46.0
12 -60.0 -44.0 -44.0 -44.0 -44.0
13 -60.0 -44.0 -46.0 -46.0 -46.0
14 -60.0 -46.0 -44.0 -46.0 -46.0
15 -60.0 -46.0 -46.0 -44.0 -46.0
16 -60.0 -44.0 -44.0 -44.0 -44.0
17 -60.0 -44.0 -44.0 -46.0 -46.0
18 -60.0 -44.0 -46.0 -46.0 -46.0
19 -60.0 -46.0 -46.0 -46.0 -46.0
20 -60.0 -46.0 -44.0 -46.0 -46.0
2025-05-12 18:26:33 Matching curves for turbine 003...
2025-05-12 18:26:33     T005  T002  T001  T004  T006
0    0.0  44.0 -16.0   0.0   0.0
1    0.0  46.0 -14.0   0.0   0.0
2    0.0  44.0 -16.0   0.0   0.0
3    0.0  44.0 -16.0   0.0   0.0
4    0.0  44.0 -16.0   0.0   0.0
5    0.0  46.0 -14.0   0.0   0.0
6    0.0  46.0 -14.0   0.0   0.0
7    0.0  44.0 -16.0   0.0   0.0
8    0.0  46.0 -14.0   0.0   0.0
9    0.0  46.0 -14.0   0.0   0.0
10   0.0  44.0 -16.0   0.0   0.0
11   0.0  44.0 -16.0   0.0   0.0
12   0.0  44.0 -16.0   0.0   0.0
13   0.0  44.0 -16.0   0.0   0.0
14   0.0  46.0 -14.0   0.0   0.0
15   0.0  46.0 -14.0   0.0   0.0
16   0.0  44.0 -16.0   0.0   0.0
17   0.0  44.0 -16.0   0.0   0.0
18   0.0  44.0 -16.0   0.0   0.0
19   0.0  46.0 -14.0   0.0   0.0
20   0.0  46.0 -14.0   0.0   0.0
2025-05-12 18:26:33 Matching curves for turbine 004...
2025-05-12 18:26:34     T003  T002  T005  T001  T006
0   -0.0  46.0   0.0 -14.0   0.0
1   -0.0  44.0   0.0 -16.0   0.0
2   -0.0  44.0   0.0 -16.0   0.0
3   -0.0  46.0   0.0 -14.0   0.0
4   -0.0  46.0   0.0 -14.0   0.0
5   -0.0  44.0   0.0 -16.0   0.0
6   -0.0  44.0   0.0 -16.0   0.0
7   -0.0  44.0   0.0 -16.0   0.0
8   -0.0  44.0   0.0 -16.0   0.0
9   -0.0  46.0   0.0 -14.0   0.0
10  -0.0  44.0   0.0 -16.0   0.0
11  -0.0  46.0   0.0 -14.0   0.0
12  -0.0  46.0   0.0 -14.0   0.0
13  -0.0  44.0   0.0 -16.0   0.0
14  -0.0  46.0   0.0 -14.0   0.0
15  -0.0  44.0   0.0 -16.0   0.0
16  -0.0  46.0   0.0 -14.0   0.0
17  -0.0  44.0   0.0 -16.0   0.0
18  -0.0  46.0   0.0 -14.0   0.0
19  -0.0  44.0   0.0 -16.0   0.0
20  -0.0  44.0   0.0 -16.0   0.0
2025-05-12 18:26:34 Matching curves for turbine 005...
2025-05-12 18:26:34     T003  T001  T006  T002  T000
0   -0.0 -14.0   0.0  46.0  -0.0
1   -0.0 -14.0   0.0  46.0  -0.0
2   -0.0 -16.0   0.0  44.0  -0.0
3   -0.0 -16.0   0.0  44.0  -0.0
4   -0.0 -14.0   0.0  46.0  -0.0
5   -0.0 -14.0   0.0  44.0  -0.0
6   -0.0 -14.0   0.0  46.0  -0.0
7   -0.0 -14.0   0.0  44.0  -0.0
8   -0.0 -16.0   0.0  44.0  -0.0
9   -0.0 -14.0   0.0  46.0  -0.0
10  -0.0 -14.0   0.0  46.0  -0.0
11  -0.0 -16.0   0.0  44.0  -0.0
12  -0.0 -16.0   0.0  44.0  -0.0
13  -0.0 -14.0   0.0  46.0  -0.0
14  -0.0 -16.0   0.0  44.0  -0.0
15  -0.0 -14.0   0.0  46.0  -0.0
16  -0.0 -16.0   0.0  44.0  -0.0
17  -0.0 -16.0   0.0  44.0  -0.0
18  -0.0 -14.0   0.0  46.0  -0.0
19  -0.0 -14.0   0.0  46.0  -0.0
20  -0.0 -16.0   0.0  44.0  -0.0
2025-05-12 18:26:34 Matching curves for turbine 006...
2025-05-12 18:26:34     T001  T005  T000  T003  T002
0  -16.0  -0.0  -0.0  -0.0  44.0
1  -16.0  -0.0  -0.0  -0.0  44.0
2  -14.0  -0.0  -0.0  -0.0  46.0
3  -14.0  -0.0  -0.0  -0.0  46.0
4  -16.0  -0.0  -0.0  -0.0  44.0
5  -14.0  -0.0  -0.0  -0.0  46.0
6  -14.0  -0.0  -0.0  -0.0  46.0
7  -14.0  -0.0  -0.0  -0.0  46.0
8  -16.0  -0.0  -0.0  -0.0  44.0
9  -14.0  -0.0  -0.0  -0.0  46.0
10 -14.0  -0.0  -0.0  -0.0  46.0
11 -14.0  -0.0  -0.0  -0.0  46.0
12 -16.0  -0.0  -0.0  -0.0  44.0
13 -16.0  -0.0  -0.0  -0.0  46.0
14 -14.0  -0.0  -0.0  -0.0  46.0
15 -14.0  -0.0  -0.0  -0.0  46.0
16 -16.0  -0.0  -0.0  -0.0  44.0
17 -14.0  -0.0  -0.0  -0.0  46.0
18 -14.0  -0.0  -0.0  -0.0  46.0
19 -14.0  -0.0  -0.0  -0.0  46.0
20 -14.0  -0.0  -0.0  -0.0  46.0
2025-05-12 18:26:34 Turbine 000 seems to have no jumps in its WD measurement calibration. [CLEAN]
2025-05-12 18:26:34 Turbine 001 seems to have no jumps in its WD measurement calibration. [CLEAN]
2025-05-12 18:26:34 Turbine 002 seems to have no jumps in its WD measurement calibration. [CLEAN]
2025-05-12 18:26:34 Turbine 003 seems to have no jumps in its WD measurement calibration. [CLEAN]
2025-05-12 18:26:34 Turbine 004 seems to have no jumps in its WD measurement calibration. [CLEAN]
2025-05-12 18:26:34 Turbine 005 seems to have no jumps in its WD measurement calibration. [CLEAN]
2025-05-12 18:26:34 Turbine 006 seems to have no jumps in its WD measurement calibration. [CLEAN]
['clean', 'clean', 'clean', 'clean', 'clean', 'clean', 'clean']
../../_images/1263083b830c2342a7eed9c44ecebe4af7ad420ebd041497050f9404c1b6aee3.png

Remove steady offset from a single turbine#

By looking at the energy ratios and looking at the average offset between turbines' wind direction measurements, we can align every turbine that was flagged 'green' in the above plot with true north. Wind directions of turbines flagged red should not be used.

def get_bias_for_single_turbine(
    df, fm, ti, opt_search_range=[-180.0, 180.0], plot=True, figure_save_path=None
):
    print("Initializing wd bias estimator object for turbine %03d..." % ti)

    # Copy variables and unlink them
    df = df.copy()  # Unlink from input

    # Calculate which turbines are upstream for every wind direction
    df_upstream = ftools.get_upstream_turbs_floris(fm, wd_step=2.0)

    # We assign the total datasets "true" wind direction as equal to the wind
    # direction of the turbine which we want to perform northing calibration
    # on. In this case, turbine 'ti'.
    df = dfm.set_wd_by_turbines(df, [ti])

    # We define a function that calculates the freestream wind speed based
    # on a dataframe that is inserted. It does this based on knowing which
    # turbines are upstream for what wind directions, and then knowledge
    # of what the wind direction is for every row in the dataframe. However,
    # since the shift the "true" wind direction many times to estimate the
    # northing bias, we cannot precalculate this. It changes with every
    # northing bias guess. Hence, we must insert a function.
    def _set_ws_fun(df):
        return dfm.set_ws_by_upstream_turbines_in_radius(
            df=df,
            df_upstream=df_upstream,
            turb_no=ti,
            x_turbs=fm.layout_x,
            y_turbs=fm.layout_y,
            max_radius=5000.0,
            include_itself=True,
        )

    # We similarly define a function that calculates the reference power. This
    # is typically the power production of one or multiple upstream turbines.
    # Here, we assume it is the average power production of all upstream
    # turbines. Which turbines are upstream depends on the wind direction.
    def _set_pow_ref_fun(df):
        return dfm.set_pow_ref_by_upstream_turbines_in_radius(
            df=df,
            df_upstream=df_upstream,
            turb_no=ti,
            x_turbs=fm.layout_x,
            y_turbs=fm.layout_y,
            max_radius=5000.0,
            include_itself=True,
        )

    # We now have the reference power productions specified, being equal to
    # the mean power production of all turbines upstream. We also need to
    # define a test power production, which should be waked at least part of
    # the time so that we can match it with our FLORIS predictions. Here, we
    # calculate the energy ratios for the 3 turbines closest to the turbine
    # from which we take the wind direction measurement ('ti').
    turbines_sorted_by_distance = ftools.get_turbs_in_radius(
        x_turbs=fm.layout_x,
        y_turbs=fm.layout_y,
        turb_no=ti,
        max_radius=1.0e9,
        include_itself=False,
        sort_by_distance=True,
    )
    test_turbines = turbines_sorted_by_distance[0:3]

    # Now, we have all information set up and we can initialize the northing
    # bias estimation class.
    fsc = best.bias_estimation(
        df=df,
        df_fm_approx=df_fm_approx,
        test_turbines_subset=test_turbines,
        df_ws_mapping_func=_set_ws_fun,
        df_pow_ref_mapping_func=_set_pow_ref_fun,
    )

    # We can save the energy ratio curves for every iteration in the
    # optimization process. This is useful for debugging. However, it also
    # significantly slows down the estimation process. We disable it by
    # default by assigning it 'None'.
    plot_iter_path = None  # Disabled, useful for debugging but slow
    # plot_iter_path = os.path.join(out_path, "opt_iters_ti%03d" % ti)

    # Now estimate the wind direction bias while catching warning messages
    # that do not really inform but do pollute the console.
    with wn.catch_warnings():
        wn.filterwarnings(action="ignore", message="All-NaN slice encountered")

        # Estimate bias for the entire time range, from start to end of
        # dataframe, for wind speeds in region II of turbine operation, with
        # in steps of 3.0 deg (wd) and 5.0 m/s (ws). We search over the entire
        # range from -180.0 deg to +180.0 deg, in steps of 5.0 deg. This has
        # appeared to be a good stepsize empirically.
        wd_bias, _ = fsc.estimate_wd_bias(
            time_mask=None,  # For entire dataset
            ws_mask=(6.0, 10.0),
            er_wd_step=3.0,
            er_ws_step=5.0,
            er_wd_bin_width=3.0,
            er_N_btstrp=1,
            opt_search_brute_dx=5.0,
            opt_search_range=opt_search_range,
            plot_iter_path=plot_iter_path,
        )
        wd_bias = float(wd_bias[0])  # Convert to float

    # Print progress to console
    print("Turbine {}. estimated bias = {} deg.".format(ti, wd_bias))

    if plot:
        # Produce and save calibrated/corrected energy ratio figures
        fsc.plot_energy_ratios(show_uncorrected_data=True, save_path=figure_save_path)
        if figure_save_path is not None:
            print("Calibrated energy ratio figures saved to {:s}.".format(figure_save_path))

    # Finally, return the estimated wind direction bias
    return wd_bias


# We will calibrate the turbine nacelle heading for the first 'clean' turbine
first_clean_turbid = np.where([c == "clean" for c in turb_wd_consistency])[0][0]

# Calculate optimal bias for the first clean turbine, covering all possibilities
#  (from -180 deg to +180 deg offset)
wd_bias = get_bias_for_single_turbine(
    df=df_scada_homogenized,
    fm=fm,
    ti=first_clean_turbid,
    opt_search_range=(-180.0, 180.0),
    plot=True,
)
print("WD bias for first clean turbine: {:.3f} deg".format(wd_bias))

# Now calculate the northing-bias-corrected wind direction for this
#  turbine and call it our reference
wd_ref = wrap_360(df_scada_homogenized["wd_{:03d}".format(first_clean_turbid)] - wd_bias)
2025-05-12 18:26:34 Initializing a bias_estimation() object...
2025-05-12 18:26:34 Estimating the wind direction bias
2025-05-12 18:26:34     Initializing energy ratio inputs.
2025-05-12 18:26:34   Constructing energy table for wd_bias of -180.00 deg.
Initializing wd bias estimator object for turbine 000...
2025-05-12 18:26:34     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:34 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:34    minimum/maximum value in df:        (7.798, 8.248)
2025-05-12 18:26:34    minimum/maximum value in df:        (7.798, 8.248)
2025-05-12 18:26:34    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:35     Determining energy ratios for test turbine = 006. WD bias: -180.000 deg.
2025-05-12 18:26:35     Determining energy ratios for test turbine = 001. WD bias: -180.000 deg.
2025-05-12 18:26:35     Determining energy ratios for test turbine = 002. WD bias: -180.000 deg.
2025-05-12 18:26:35     Initializing energy ratio inputs.
2025-05-12 18:26:35   Constructing energy table for wd_bias of -175.00 deg.
2025-05-12 18:26:35     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:35 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:35    minimum/maximum value in df:        (7.709, 8.248)
2025-05-12 18:26:35    minimum/maximum value in df:        (7.709, 8.248)
2025-05-12 18:26:35    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:35     Determining energy ratios for test turbine = 006. WD bias: -175.000 deg.
2025-05-12 18:26:35     Determining energy ratios for test turbine = 001. WD bias: -175.000 deg.
2025-05-12 18:26:35     Determining energy ratios for test turbine = 002. WD bias: -175.000 deg.
2025-05-12 18:26:35     Initializing energy ratio inputs.
2025-05-12 18:26:35   Constructing energy table for wd_bias of -170.00 deg.
2025-05-12 18:26:35     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:35 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:35    minimum/maximum value in df:        (7.709, 8.243)
2025-05-12 18:26:35    minimum/maximum value in df:        (7.709, 8.243)
2025-05-12 18:26:35    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:35     Determining energy ratios for test turbine = 006. WD bias: -170.000 deg.
2025-05-12 18:26:35     Determining energy ratios for test turbine = 001. WD bias: -170.000 deg.
2025-05-12 18:26:35     Determining energy ratios for test turbine = 002. WD bias: -170.000 deg.
2025-05-12 18:26:36     Initializing energy ratio inputs.
2025-05-12 18:26:36   Constructing energy table for wd_bias of -165.00 deg.
2025-05-12 18:26:36     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:36 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:36    minimum/maximum value in df:        (7.799, 8.243)
2025-05-12 18:26:36    minimum/maximum value in df:        (7.799, 8.243)
2025-05-12 18:26:36    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:36     Determining energy ratios for test turbine = 006. WD bias: -165.000 deg.
2025-05-12 18:26:36     Determining energy ratios for test turbine = 001. WD bias: -165.000 deg.
2025-05-12 18:26:36     Determining energy ratios for test turbine = 002. WD bias: -165.000 deg.
2025-05-12 18:26:36     Initializing energy ratio inputs.
2025-05-12 18:26:36   Constructing energy table for wd_bias of -160.00 deg.
2025-05-12 18:26:36     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:36 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:36    minimum/maximum value in df:        (7.799, 8.230)
2025-05-12 18:26:36    minimum/maximum value in df:        (7.799, 8.230)
2025-05-12 18:26:36    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:36     Determining energy ratios for test turbine = 006. WD bias: -160.000 deg.
2025-05-12 18:26:36     Determining energy ratios for test turbine = 001. WD bias: -160.000 deg.
2025-05-12 18:26:36     Determining energy ratios for test turbine = 002. WD bias: -160.000 deg.
2025-05-12 18:26:36     Initializing energy ratio inputs.
2025-05-12 18:26:36   Constructing energy table for wd_bias of -155.00 deg.
2025-05-12 18:26:36     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:36 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:36    minimum/maximum value in df:        (7.788, 8.230)
2025-05-12 18:26:36    minimum/maximum value in df:        (7.788, 8.230)
2025-05-12 18:26:36    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:36     Determining energy ratios for test turbine = 006. WD bias: -155.000 deg.
2025-05-12 18:26:37     Determining energy ratios for test turbine = 001. WD bias: -155.000 deg.
2025-05-12 18:26:37     Determining energy ratios for test turbine = 002. WD bias: -155.000 deg.
2025-05-12 18:26:37     Initializing energy ratio inputs.
2025-05-12 18:26:37   Constructing energy table for wd_bias of -150.00 deg.
2025-05-12 18:26:37     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:37 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:37    minimum/maximum value in df:        (7.788, 8.227)
2025-05-12 18:26:37    minimum/maximum value in df:        (7.788, 8.227)
2025-05-12 18:26:37    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:37     Determining energy ratios for test turbine = 006. WD bias: -150.000 deg.
2025-05-12 18:26:37     Determining energy ratios for test turbine = 001. WD bias: -150.000 deg.
2025-05-12 18:26:37     Determining energy ratios for test turbine = 002. WD bias: -150.000 deg.
2025-05-12 18:26:37     Initializing energy ratio inputs.
2025-05-12 18:26:37   Constructing energy table for wd_bias of -145.00 deg.
2025-05-12 18:26:37     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:37 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:37    minimum/maximum value in df:        (7.794, 8.227)
2025-05-12 18:26:37    minimum/maximum value in df:        (7.794, 8.227)
2025-05-12 18:26:37    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:37     Determining energy ratios for test turbine = 006. WD bias: -145.000 deg.
2025-05-12 18:26:37     Determining energy ratios for test turbine = 001. WD bias: -145.000 deg.
2025-05-12 18:26:37     Determining energy ratios for test turbine = 002. WD bias: -145.000 deg.
2025-05-12 18:26:37     Initializing energy ratio inputs.
2025-05-12 18:26:37   Constructing energy table for wd_bias of -140.00 deg.
2025-05-12 18:26:37     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:37 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:37    minimum/maximum value in df:        (7.794, 8.227)
2025-05-12 18:26:37    minimum/maximum value in df:        (7.794, 8.227)
2025-05-12 18:26:37    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:38     Determining energy ratios for test turbine = 006. WD bias: -140.000 deg.
2025-05-12 18:26:38     Determining energy ratios for test turbine = 001. WD bias: -140.000 deg.
2025-05-12 18:26:38     Determining energy ratios for test turbine = 002. WD bias: -140.000 deg.
2025-05-12 18:26:38     Initializing energy ratio inputs.
2025-05-12 18:26:38   Constructing energy table for wd_bias of -135.00 deg.
2025-05-12 18:26:38     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:38 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:38    minimum/maximum value in df:        (7.811, 8.227)
2025-05-12 18:26:38    minimum/maximum value in df:        (7.811, 8.227)
2025-05-12 18:26:38    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:38     Determining energy ratios for test turbine = 006. WD bias: -135.000 deg.
2025-05-12 18:26:38     Determining energy ratios for test turbine = 001. WD bias: -135.000 deg.
2025-05-12 18:26:38     Determining energy ratios for test turbine = 002. WD bias: -135.000 deg.
2025-05-12 18:26:38     Initializing energy ratio inputs.
2025-05-12 18:26:38   Constructing energy table for wd_bias of -130.00 deg.
2025-05-12 18:26:38     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:38 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:38    minimum/maximum value in df:        (7.811, 8.219)
2025-05-12 18:26:38    minimum/maximum value in df:        (7.811, 8.219)
2025-05-12 18:26:38    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:38     Determining energy ratios for test turbine = 006. WD bias: -130.000 deg.
2025-05-12 18:26:38     Determining energy ratios for test turbine = 001. WD bias: -130.000 deg.
2025-05-12 18:26:38     Determining energy ratios for test turbine = 002. WD bias: -130.000 deg.
2025-05-12 18:26:38     Initializing energy ratio inputs.
2025-05-12 18:26:38   Constructing energy table for wd_bias of -125.00 deg.
2025-05-12 18:26:39     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:39 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:39    minimum/maximum value in df:        (7.795, 8.244)
2025-05-12 18:26:39    minimum/maximum value in df:        (7.795, 8.244)
2025-05-12 18:26:39    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:39     Determining energy ratios for test turbine = 006. WD bias: -125.000 deg.
2025-05-12 18:26:39     Determining energy ratios for test turbine = 001. WD bias: -125.000 deg.
2025-05-12 18:26:39     Determining energy ratios for test turbine = 002. WD bias: -125.000 deg.
2025-05-12 18:26:39     Initializing energy ratio inputs.
2025-05-12 18:26:39   Constructing energy table for wd_bias of -120.00 deg.
2025-05-12 18:26:39     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:39 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:39    minimum/maximum value in df:        (7.795, 8.244)
2025-05-12 18:26:39    minimum/maximum value in df:        (7.795, 8.244)
2025-05-12 18:26:39    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:39     Determining energy ratios for test turbine = 006. WD bias: -120.000 deg.
2025-05-12 18:26:39     Determining energy ratios for test turbine = 001. WD bias: -120.000 deg.
2025-05-12 18:26:39     Determining energy ratios for test turbine = 002. WD bias: -120.000 deg.
2025-05-12 18:26:39     Initializing energy ratio inputs.
2025-05-12 18:26:39   Constructing energy table for wd_bias of -115.00 deg.
2025-05-12 18:26:39     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:39 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:39    minimum/maximum value in df:        (7.795, 8.192)
2025-05-12 18:26:39    minimum/maximum value in df:        (7.795, 8.192)
2025-05-12 18:26:39    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:39     Determining energy ratios for test turbine = 006. WD bias: -115.000 deg.
2025-05-12 18:26:39     Determining energy ratios for test turbine = 001. WD bias: -115.000 deg.
2025-05-12 18:26:40     Determining energy ratios for test turbine = 002. WD bias: -115.000 deg.
2025-05-12 18:26:40     Initializing energy ratio inputs.
2025-05-12 18:26:40   Constructing energy table for wd_bias of -110.00 deg.
2025-05-12 18:26:40     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:40 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:40    minimum/maximum value in df:        (7.795, 8.198)
2025-05-12 18:26:40    minimum/maximum value in df:        (7.795, 8.198)
2025-05-12 18:26:40    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:40     Determining energy ratios for test turbine = 006. WD bias: -110.000 deg.
2025-05-12 18:26:40     Determining energy ratios for test turbine = 001. WD bias: -110.000 deg.
2025-05-12 18:26:40     Determining energy ratios for test turbine = 002. WD bias: -110.000 deg.
2025-05-12 18:26:40     Initializing energy ratio inputs.
2025-05-12 18:26:40   Constructing energy table for wd_bias of -105.00 deg.
2025-05-12 18:26:40     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:40 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:40    minimum/maximum value in df:        (7.803, 8.198)
2025-05-12 18:26:40    minimum/maximum value in df:        (7.803, 8.198)
2025-05-12 18:26:40    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:40     Determining energy ratios for test turbine = 006. WD bias: -105.000 deg.
2025-05-12 18:26:40     Determining energy ratios for test turbine = 001. WD bias: -105.000 deg.
2025-05-12 18:26:40     Determining energy ratios for test turbine = 002. WD bias: -105.000 deg.
2025-05-12 18:26:40     Initializing energy ratio inputs.
2025-05-12 18:26:40   Constructing energy table for wd_bias of -100.00 deg.
2025-05-12 18:26:40     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:40 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:40    minimum/maximum value in df:        (7.802, 8.219)
2025-05-12 18:26:40    minimum/maximum value in df:        (7.802, 8.219)
2025-05-12 18:26:40    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:41     Determining energy ratios for test turbine = 006. WD bias: -100.000 deg.
2025-05-12 18:26:41     Determining energy ratios for test turbine = 001. WD bias: -100.000 deg.
2025-05-12 18:26:41     Determining energy ratios for test turbine = 002. WD bias: -100.000 deg.
2025-05-12 18:26:41     Initializing energy ratio inputs.
2025-05-12 18:26:41   Constructing energy table for wd_bias of -95.00 deg.
2025-05-12 18:26:41     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:41 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:41    minimum/maximum value in df:        (7.795, 8.219)
2025-05-12 18:26:41    minimum/maximum value in df:        (7.795, 8.219)
2025-05-12 18:26:41    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:41     Determining energy ratios for test turbine = 006. WD bias: -95.000 deg.
2025-05-12 18:26:41     Determining energy ratios for test turbine = 001. WD bias: -95.000 deg.
2025-05-12 18:26:41     Determining energy ratios for test turbine = 002. WD bias: -95.000 deg.
2025-05-12 18:26:41     Initializing energy ratio inputs.
2025-05-12 18:26:41   Constructing energy table for wd_bias of -90.00 deg.
2025-05-12 18:26:41     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:41 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:41    minimum/maximum value in df:        (7.795, 8.249)
2025-05-12 18:26:41    minimum/maximum value in df:        (7.795, 8.249)
2025-05-12 18:26:41    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:41     Determining energy ratios for test turbine = 006. WD bias: -90.000 deg.
2025-05-12 18:26:41     Determining energy ratios for test turbine = 001. WD bias: -90.000 deg.
2025-05-12 18:26:41     Determining energy ratios for test turbine = 002. WD bias: -90.000 deg.
2025-05-12 18:26:41     Initializing energy ratio inputs.
2025-05-12 18:26:41   Constructing energy table for wd_bias of -85.00 deg.
2025-05-12 18:26:41     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:41 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:41    minimum/maximum value in df:        (7.795, 8.249)
2025-05-12 18:26:41    minimum/maximum value in df:        (7.795, 8.249)
2025-05-12 18:26:41    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:42     Determining energy ratios for test turbine = 006. WD bias: -85.000 deg.
2025-05-12 18:26:42     Determining energy ratios for test turbine = 001. WD bias: -85.000 deg.
2025-05-12 18:26:42     Determining energy ratios for test turbine = 002. WD bias: -85.000 deg.
2025-05-12 18:26:42     Initializing energy ratio inputs.
2025-05-12 18:26:42   Constructing energy table for wd_bias of -80.00 deg.
2025-05-12 18:26:42     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:42 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:42    minimum/maximum value in df:        (7.725, 8.227)
2025-05-12 18:26:42    minimum/maximum value in df:        (7.725, 8.227)
2025-05-12 18:26:42    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:42     Determining energy ratios for test turbine = 006. WD bias: -80.000 deg.
2025-05-12 18:26:42     Determining energy ratios for test turbine = 001. WD bias: -80.000 deg.
2025-05-12 18:26:42     Determining energy ratios for test turbine = 002. WD bias: -80.000 deg.
2025-05-12 18:26:42     Initializing energy ratio inputs.
2025-05-12 18:26:42   Constructing energy table for wd_bias of -75.00 deg.
2025-05-12 18:26:42     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:42 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:42    minimum/maximum value in df:        (7.725, 8.227)
2025-05-12 18:26:42    minimum/maximum value in df:        (7.725, 8.227)
2025-05-12 18:26:42    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:42     Determining energy ratios for test turbine = 006. WD bias: -75.000 deg.
2025-05-12 18:26:42     Determining energy ratios for test turbine = 001. WD bias: -75.000 deg.
2025-05-12 18:26:42     Determining energy ratios for test turbine = 002. WD bias: -75.000 deg.
2025-05-12 18:26:42     Initializing energy ratio inputs.
2025-05-12 18:26:42   Constructing energy table for wd_bias of -70.00 deg.
2025-05-12 18:26:43     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:43 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:43    minimum/maximum value in df:        (7.810, 8.227)
2025-05-12 18:26:43    minimum/maximum value in df:        (7.810, 8.227)
2025-05-12 18:26:43    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:43     Determining energy ratios for test turbine = 006. WD bias: -70.000 deg.
2025-05-12 18:26:43     Determining energy ratios for test turbine = 001. WD bias: -70.000 deg.
2025-05-12 18:26:43     Determining energy ratios for test turbine = 002. WD bias: -70.000 deg.
2025-05-12 18:26:43     Initializing energy ratio inputs.
2025-05-12 18:26:43   Constructing energy table for wd_bias of -65.00 deg.
2025-05-12 18:26:43     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:43 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:43    minimum/maximum value in df:        (7.773, 8.234)
2025-05-12 18:26:43    minimum/maximum value in df:        (7.773, 8.234)
2025-05-12 18:26:43    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:43     Determining energy ratios for test turbine = 006. WD bias: -65.000 deg.
2025-05-12 18:26:43     Determining energy ratios for test turbine = 001. WD bias: -65.000 deg.
2025-05-12 18:26:43     Determining energy ratios for test turbine = 002. WD bias: -65.000 deg.
2025-05-12 18:26:43     Initializing energy ratio inputs.
2025-05-12 18:26:43   Constructing energy table for wd_bias of -60.00 deg.
2025-05-12 18:26:43     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:43 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:43    minimum/maximum value in df:        (7.773, 8.234)
2025-05-12 18:26:43    minimum/maximum value in df:        (7.773, 8.234)
2025-05-12 18:26:43    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:43     Determining energy ratios for test turbine = 006. WD bias: -60.000 deg.
2025-05-12 18:26:44     Determining energy ratios for test turbine = 001. WD bias: -60.000 deg.
2025-05-12 18:26:44     Determining energy ratios for test turbine = 002. WD bias: -60.000 deg.
2025-05-12 18:26:44     Initializing energy ratio inputs.
2025-05-12 18:26:44   Constructing energy table for wd_bias of -55.00 deg.
2025-05-12 18:26:44     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:44 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:44    minimum/maximum value in df:        (7.810, 8.234)
2025-05-12 18:26:44    minimum/maximum value in df:        (7.810, 8.234)
2025-05-12 18:26:44    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:44     Determining energy ratios for test turbine = 006. WD bias: -55.000 deg.
2025-05-12 18:26:44     Determining energy ratios for test turbine = 001. WD bias: -55.000 deg.
2025-05-12 18:26:44     Determining energy ratios for test turbine = 002. WD bias: -55.000 deg.
2025-05-12 18:26:44     Initializing energy ratio inputs.
2025-05-12 18:26:44   Constructing energy table for wd_bias of -50.00 deg.
2025-05-12 18:26:44     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:44 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:44    minimum/maximum value in df:        (7.798, 8.234)
2025-05-12 18:26:44    minimum/maximum value in df:        (7.798, 8.234)
2025-05-12 18:26:44    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:44     Determining energy ratios for test turbine = 006. WD bias: -50.000 deg.
2025-05-12 18:26:44     Determining energy ratios for test turbine = 001. WD bias: -50.000 deg.
2025-05-12 18:26:44     Determining energy ratios for test turbine = 002. WD bias: -50.000 deg.
2025-05-12 18:26:44     Initializing energy ratio inputs.
2025-05-12 18:26:44   Constructing energy table for wd_bias of -45.00 deg.
2025-05-12 18:26:44     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:44 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:44    minimum/maximum value in df:        (7.783, 8.222)
2025-05-12 18:26:44    minimum/maximum value in df:        (7.783, 8.222)
2025-05-12 18:26:44    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:45     Determining energy ratios for test turbine = 006. WD bias: -45.000 deg.
2025-05-12 18:26:45     Determining energy ratios for test turbine = 001. WD bias: -45.000 deg.
2025-05-12 18:26:45     Determining energy ratios for test turbine = 002. WD bias: -45.000 deg.
2025-05-12 18:26:45     Initializing energy ratio inputs.
2025-05-12 18:26:45   Constructing energy table for wd_bias of -40.00 deg.
2025-05-12 18:26:45     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:45 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:45    minimum/maximum value in df:        (7.783, 8.235)
2025-05-12 18:26:45    minimum/maximum value in df:        (7.783, 8.235)
2025-05-12 18:26:45    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:45     Determining energy ratios for test turbine = 006. WD bias: -40.000 deg.
2025-05-12 18:26:45     Determining energy ratios for test turbine = 001. WD bias: -40.000 deg.
2025-05-12 18:26:45     Determining energy ratios for test turbine = 002. WD bias: -40.000 deg.
2025-05-12 18:26:45     Initializing energy ratio inputs.
2025-05-12 18:26:45   Constructing energy table for wd_bias of -35.00 deg.
2025-05-12 18:26:45     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:45 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:45    minimum/maximum value in df:        (7.783, 8.235)
2025-05-12 18:26:45    minimum/maximum value in df:        (7.783, 8.235)
2025-05-12 18:26:45    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:45     Determining energy ratios for test turbine = 006. WD bias: -35.000 deg.
2025-05-12 18:26:45     Determining energy ratios for test turbine = 001. WD bias: -35.000 deg.
2025-05-12 18:26:45     Determining energy ratios for test turbine = 002. WD bias: -35.000 deg.
2025-05-12 18:26:45     Initializing energy ratio inputs.
2025-05-12 18:26:45   Constructing energy table for wd_bias of -30.00 deg.
2025-05-12 18:26:46     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:46 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:46    minimum/maximum value in df:        (7.766, 8.240)
2025-05-12 18:26:46    minimum/maximum value in df:        (7.766, 8.240)
2025-05-12 18:26:46    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:46     Determining energy ratios for test turbine = 006. WD bias: -30.000 deg.
2025-05-12 18:26:46     Determining energy ratios for test turbine = 001. WD bias: -30.000 deg.
2025-05-12 18:26:46     Determining energy ratios for test turbine = 002. WD bias: -30.000 deg.
2025-05-12 18:26:46     Initializing energy ratio inputs.
2025-05-12 18:26:46   Constructing energy table for wd_bias of -25.00 deg.
2025-05-12 18:26:46     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:46 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:46    minimum/maximum value in df:        (7.766, 8.253)
2025-05-12 18:26:46    minimum/maximum value in df:        (7.766, 8.253)
2025-05-12 18:26:46    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:46     Determining energy ratios for test turbine = 006. WD bias: -25.000 deg.
2025-05-12 18:26:46     Determining energy ratios for test turbine = 001. WD bias: -25.000 deg.
2025-05-12 18:26:46     Determining energy ratios for test turbine = 002. WD bias: -25.000 deg.
2025-05-12 18:26:46     Initializing energy ratio inputs.
2025-05-12 18:26:46   Constructing energy table for wd_bias of -20.00 deg.
2025-05-12 18:26:46     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:46 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:46    minimum/maximum value in df:        (7.787, 8.253)
2025-05-12 18:26:46    minimum/maximum value in df:        (7.787, 8.253)
2025-05-12 18:26:46    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:47     Determining energy ratios for test turbine = 006. WD bias: -20.000 deg.
2025-05-12 18:26:47     Determining energy ratios for test turbine = 001. WD bias: -20.000 deg.
2025-05-12 18:26:47     Determining energy ratios for test turbine = 002. WD bias: -20.000 deg.
2025-05-12 18:26:47     Initializing energy ratio inputs.
2025-05-12 18:26:47   Constructing energy table for wd_bias of -15.00 deg.
2025-05-12 18:26:47     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:47 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:47    minimum/maximum value in df:        (7.776, 8.253)
2025-05-12 18:26:47    minimum/maximum value in df:        (7.776, 8.253)
2025-05-12 18:26:47    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:47     Determining energy ratios for test turbine = 006. WD bias: -15.000 deg.
2025-05-12 18:26:47     Determining energy ratios for test turbine = 001. WD bias: -15.000 deg.
2025-05-12 18:26:47     Determining energy ratios for test turbine = 002. WD bias: -15.000 deg.
2025-05-12 18:26:47     Initializing energy ratio inputs.
2025-05-12 18:26:47   Constructing energy table for wd_bias of -10.00 deg.
2025-05-12 18:26:47     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:47 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:47    minimum/maximum value in df:        (7.776, 8.253)
2025-05-12 18:26:47    minimum/maximum value in df:        (7.776, 8.253)
2025-05-12 18:26:47    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:47     Determining energy ratios for test turbine = 006. WD bias: -10.000 deg.
2025-05-12 18:26:47     Determining energy ratios for test turbine = 001. WD bias: -10.000 deg.
2025-05-12 18:26:47     Determining energy ratios for test turbine = 002. WD bias: -10.000 deg.
2025-05-12 18:26:47     Initializing energy ratio inputs.
2025-05-12 18:26:47   Constructing energy table for wd_bias of -5.00 deg.
2025-05-12 18:26:47     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:47 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:47    minimum/maximum value in df:        (7.776, 8.248)
2025-05-12 18:26:47    minimum/maximum value in df:        (7.776, 8.248)
2025-05-12 18:26:47    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:48     Determining energy ratios for test turbine = 006. WD bias: -5.000 deg.
2025-05-12 18:26:48     Determining energy ratios for test turbine = 001. WD bias: -5.000 deg.
2025-05-12 18:26:48     Determining energy ratios for test turbine = 002. WD bias: -5.000 deg.
2025-05-12 18:26:48     Initializing energy ratio inputs.
2025-05-12 18:26:48   Constructing energy table for wd_bias of 0.00 deg.
2025-05-12 18:26:48     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:48 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:48    minimum/maximum value in df:        (7.776, 8.231)
2025-05-12 18:26:48    minimum/maximum value in df:        (7.776, 8.231)
2025-05-12 18:26:48    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:48     Determining energy ratios for test turbine = 006. WD bias: 0.000 deg.
2025-05-12 18:26:48     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2025-05-12 18:26:48     Determining energy ratios for test turbine = 002. WD bias: 0.000 deg.
2025-05-12 18:26:48     Initializing energy ratio inputs.
2025-05-12 18:26:48   Constructing energy table for wd_bias of 5.00 deg.
2025-05-12 18:26:48     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:48 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:48    minimum/maximum value in df:        (7.789, 8.231)
2025-05-12 18:26:48    minimum/maximum value in df:        (7.789, 8.231)
2025-05-12 18:26:48    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:48     Determining energy ratios for test turbine = 006. WD bias: 5.000 deg.
2025-05-12 18:26:48     Determining energy ratios for test turbine = 001. WD bias: 5.000 deg.
2025-05-12 18:26:48     Determining energy ratios for test turbine = 002. WD bias: 5.000 deg.
2025-05-12 18:26:49     Initializing energy ratio inputs.
2025-05-12 18:26:49   Constructing energy table for wd_bias of 10.00 deg.
2025-05-12 18:26:49     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:49 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:49    minimum/maximum value in df:        (7.803, 8.222)
2025-05-12 18:26:49    minimum/maximum value in df:        (7.803, 8.222)
2025-05-12 18:26:49    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:49     Determining energy ratios for test turbine = 006. WD bias: 10.000 deg.
2025-05-12 18:26:49     Determining energy ratios for test turbine = 001. WD bias: 10.000 deg.
2025-05-12 18:26:49     Determining energy ratios for test turbine = 002. WD bias: 10.000 deg.
2025-05-12 18:26:49     Initializing energy ratio inputs.
2025-05-12 18:26:49   Constructing energy table for wd_bias of 15.00 deg.
2025-05-12 18:26:49     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:49 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:49    minimum/maximum value in df:        (7.803, 8.222)
2025-05-12 18:26:49    minimum/maximum value in df:        (7.803, 8.222)
2025-05-12 18:26:49    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:49     Determining energy ratios for test turbine = 006. WD bias: 15.000 deg.
2025-05-12 18:26:49     Determining energy ratios for test turbine = 001. WD bias: 15.000 deg.
2025-05-12 18:26:49     Determining energy ratios for test turbine = 002. WD bias: 15.000 deg.
2025-05-12 18:26:49     Initializing energy ratio inputs.
2025-05-12 18:26:49   Constructing energy table for wd_bias of 20.00 deg.
2025-05-12 18:26:49     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:49 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:49    minimum/maximum value in df:        (7.794, 8.222)
2025-05-12 18:26:49    minimum/maximum value in df:        (7.794, 8.222)
2025-05-12 18:26:49    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:50     Determining energy ratios for test turbine = 006. WD bias: 20.000 deg.
2025-05-12 18:26:50     Determining energy ratios for test turbine = 001. WD bias: 20.000 deg.
2025-05-12 18:26:50     Determining energy ratios for test turbine = 002. WD bias: 20.000 deg.
2025-05-12 18:26:50     Initializing energy ratio inputs.
2025-05-12 18:26:50   Constructing energy table for wd_bias of 25.00 deg.
2025-05-12 18:26:50     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:50 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:50    minimum/maximum value in df:        (7.794, 8.222)
2025-05-12 18:26:50    minimum/maximum value in df:        (7.794, 8.222)
2025-05-12 18:26:50    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:50     Determining energy ratios for test turbine = 006. WD bias: 25.000 deg.
2025-05-12 18:26:50     Determining energy ratios for test turbine = 001. WD bias: 25.000 deg.
2025-05-12 18:26:50     Determining energy ratios for test turbine = 002. WD bias: 25.000 deg.
2025-05-12 18:26:50     Initializing energy ratio inputs.
2025-05-12 18:26:50   Constructing energy table for wd_bias of 30.00 deg.
2025-05-12 18:26:50     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:50 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:50    minimum/maximum value in df:        (7.794, 8.193)
2025-05-12 18:26:50    minimum/maximum value in df:        (7.794, 8.193)
2025-05-12 18:26:50    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:50     Determining energy ratios for test turbine = 006. WD bias: 30.000 deg.
2025-05-12 18:26:50     Determining energy ratios for test turbine = 001. WD bias: 30.000 deg.
2025-05-12 18:26:50     Determining energy ratios for test turbine = 002. WD bias: 30.000 deg.
2025-05-12 18:26:50     Initializing energy ratio inputs.
2025-05-12 18:26:50   Constructing energy table for wd_bias of 35.00 deg.
2025-05-12 18:26:50     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:50 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:50    minimum/maximum value in df:        (7.794, 8.230)
2025-05-12 18:26:50    minimum/maximum value in df:        (7.794, 8.230)
2025-05-12 18:26:50    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:51     Determining energy ratios for test turbine = 006. WD bias: 35.000 deg.
2025-05-12 18:26:51     Determining energy ratios for test turbine = 001. WD bias: 35.000 deg.
2025-05-12 18:26:51     Determining energy ratios for test turbine = 002. WD bias: 35.000 deg.
2025-05-12 18:26:51     Initializing energy ratio inputs.
2025-05-12 18:26:51   Constructing energy table for wd_bias of 40.00 deg.
2025-05-12 18:26:51     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:51 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:51    minimum/maximum value in df:        (7.796, 8.239)
2025-05-12 18:26:51    minimum/maximum value in df:        (7.796, 8.239)
2025-05-12 18:26:51    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:51     Determining energy ratios for test turbine = 006. WD bias: 40.000 deg.
2025-05-12 18:26:51     Determining energy ratios for test turbine = 001. WD bias: 40.000 deg.
2025-05-12 18:26:51     Determining energy ratios for test turbine = 002. WD bias: 40.000 deg.
2025-05-12 18:26:51     Initializing energy ratio inputs.
2025-05-12 18:26:51   Constructing energy table for wd_bias of 45.00 deg.
2025-05-12 18:26:51     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:51 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:51    minimum/maximum value in df:        (7.802, 8.239)
2025-05-12 18:26:51    minimum/maximum value in df:        (7.802, 8.239)
2025-05-12 18:26:51    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:51     Determining energy ratios for test turbine = 006. WD bias: 45.000 deg.
2025-05-12 18:26:51     Determining energy ratios for test turbine = 001. WD bias: 45.000 deg.
2025-05-12 18:26:51     Determining energy ratios for test turbine = 002. WD bias: 45.000 deg.
2025-05-12 18:26:51     Initializing energy ratio inputs.
2025-05-12 18:26:51   Constructing energy table for wd_bias of 50.00 deg.
2025-05-12 18:26:52     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:52 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:52    minimum/maximum value in df:        (7.802, 8.239)
2025-05-12 18:26:52    minimum/maximum value in df:        (7.802, 8.239)
2025-05-12 18:26:52    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:52     Determining energy ratios for test turbine = 006. WD bias: 50.000 deg.
2025-05-12 18:26:52     Determining energy ratios for test turbine = 001. WD bias: 50.000 deg.
2025-05-12 18:26:52     Determining energy ratios for test turbine = 002. WD bias: 50.000 deg.
2025-05-12 18:26:52     Initializing energy ratio inputs.
2025-05-12 18:26:52   Constructing energy table for wd_bias of 55.00 deg.
2025-05-12 18:26:52     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:52 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:52    minimum/maximum value in df:        (7.795, 8.239)
2025-05-12 18:26:52    minimum/maximum value in df:        (7.795, 8.239)
2025-05-12 18:26:52    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:52     Determining energy ratios for test turbine = 006. WD bias: 55.000 deg.
2025-05-12 18:26:52     Determining energy ratios for test turbine = 001. WD bias: 55.000 deg.
2025-05-12 18:26:52     Determining energy ratios for test turbine = 002. WD bias: 55.000 deg.
2025-05-12 18:26:52     Initializing energy ratio inputs.
2025-05-12 18:26:52   Constructing energy table for wd_bias of 60.00 deg.
2025-05-12 18:26:52     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:52 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:52    minimum/maximum value in df:        (7.795, 8.220)
2025-05-12 18:26:52    minimum/maximum value in df:        (7.795, 8.220)
2025-05-12 18:26:52    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:52     Determining energy ratios for test turbine = 006. WD bias: 60.000 deg.
2025-05-12 18:26:52     Determining energy ratios for test turbine = 001. WD bias: 60.000 deg.
2025-05-12 18:26:53     Determining energy ratios for test turbine = 002. WD bias: 60.000 deg.
2025-05-12 18:26:53     Initializing energy ratio inputs.
2025-05-12 18:26:53   Constructing energy table for wd_bias of 65.00 deg.
2025-05-12 18:26:53     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:53 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:53    minimum/maximum value in df:        (7.795, 8.329)
2025-05-12 18:26:53    minimum/maximum value in df:        (7.795, 8.329)
2025-05-12 18:26:53    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:53     Determining energy ratios for test turbine = 006. WD bias: 65.000 deg.
2025-05-12 18:26:53     Determining energy ratios for test turbine = 001. WD bias: 65.000 deg.
2025-05-12 18:26:53     Determining energy ratios for test turbine = 002. WD bias: 65.000 deg.
2025-05-12 18:26:53     Initializing energy ratio inputs.
2025-05-12 18:26:53   Constructing energy table for wd_bias of 70.00 deg.
2025-05-12 18:26:53     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:53 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:53    minimum/maximum value in df:        (7.795, 8.329)
2025-05-12 18:26:53    minimum/maximum value in df:        (7.795, 8.329)
2025-05-12 18:26:53    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:53     Determining energy ratios for test turbine = 006. WD bias: 70.000 deg.
2025-05-12 18:26:53     Determining energy ratios for test turbine = 001. WD bias: 70.000 deg.
2025-05-12 18:26:53     Determining energy ratios for test turbine = 002. WD bias: 70.000 deg.
2025-05-12 18:26:53     Initializing energy ratio inputs.
2025-05-12 18:26:53   Constructing energy table for wd_bias of 75.00 deg.
2025-05-12 18:26:53     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:53 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:53    minimum/maximum value in df:        (7.798, 8.329)
2025-05-12 18:26:53    minimum/maximum value in df:        (7.798, 8.329)
2025-05-12 18:26:53    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:54     Determining energy ratios for test turbine = 006. WD bias: 75.000 deg.
2025-05-12 18:26:54     Determining energy ratios for test turbine = 001. WD bias: 75.000 deg.
2025-05-12 18:26:54     Determining energy ratios for test turbine = 002. WD bias: 75.000 deg.
2025-05-12 18:26:54     Initializing energy ratio inputs.
2025-05-12 18:26:54   Constructing energy table for wd_bias of 80.00 deg.
2025-05-12 18:26:54     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:54 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:54    minimum/maximum value in df:        (7.798, 8.329)
2025-05-12 18:26:54    minimum/maximum value in df:        (7.798, 8.329)
2025-05-12 18:26:54    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:54     Determining energy ratios for test turbine = 006. WD bias: 80.000 deg.
2025-05-12 18:26:54     Determining energy ratios for test turbine = 001. WD bias: 80.000 deg.
2025-05-12 18:26:54     Determining energy ratios for test turbine = 002. WD bias: 80.000 deg.
2025-05-12 18:26:54     Initializing energy ratio inputs.
2025-05-12 18:26:54   Constructing energy table for wd_bias of 85.00 deg.
2025-05-12 18:26:54     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:54 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:54    minimum/maximum value in df:        (7.798, 8.235)
2025-05-12 18:26:54    minimum/maximum value in df:        (7.798, 8.235)
2025-05-12 18:26:54    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:54     Determining energy ratios for test turbine = 006. WD bias: 85.000 deg.
2025-05-12 18:26:54     Determining energy ratios for test turbine = 001. WD bias: 85.000 deg.
2025-05-12 18:26:54     Determining energy ratios for test turbine = 002. WD bias: 85.000 deg.
2025-05-12 18:26:54     Initializing energy ratio inputs.
2025-05-12 18:26:54   Constructing energy table for wd_bias of 90.00 deg.
2025-05-12 18:26:54     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:54 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:54    minimum/maximum value in df:        (7.798, 8.235)
2025-05-12 18:26:54    minimum/maximum value in df:        (7.798, 8.235)
2025-05-12 18:26:54    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:55     Determining energy ratios for test turbine = 006. WD bias: 90.000 deg.
2025-05-12 18:26:55     Determining energy ratios for test turbine = 001. WD bias: 90.000 deg.
2025-05-12 18:26:55     Determining energy ratios for test turbine = 002. WD bias: 90.000 deg.
2025-05-12 18:26:55     Initializing energy ratio inputs.
2025-05-12 18:26:55   Constructing energy table for wd_bias of 95.00 deg.
2025-05-12 18:26:55     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:55 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:55    minimum/maximum value in df:        (7.789, 8.235)
2025-05-12 18:26:55    minimum/maximum value in df:        (7.789, 8.235)
2025-05-12 18:26:55    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:55     Determining energy ratios for test turbine = 006. WD bias: 95.000 deg.
2025-05-12 18:26:55     Determining energy ratios for test turbine = 001. WD bias: 95.000 deg.
2025-05-12 18:26:55     Determining energy ratios for test turbine = 002. WD bias: 95.000 deg.
2025-05-12 18:26:55     Initializing energy ratio inputs.
2025-05-12 18:26:55   Constructing energy table for wd_bias of 100.00 deg.
2025-05-12 18:26:55     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:55 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:55    minimum/maximum value in df:        (7.789, 8.204)
2025-05-12 18:26:55    minimum/maximum value in df:        (7.789, 8.204)
2025-05-12 18:26:55    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:55     Determining energy ratios for test turbine = 006. WD bias: 100.000 deg.
2025-05-12 18:26:55     Determining energy ratios for test turbine = 001. WD bias: 100.000 deg.
2025-05-12 18:26:55     Determining energy ratios for test turbine = 002. WD bias: 100.000 deg.
2025-05-12 18:26:56     Initializing energy ratio inputs.
2025-05-12 18:26:56   Constructing energy table for wd_bias of 105.00 deg.
2025-05-12 18:26:56     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:56 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:56    minimum/maximum value in df:        (7.789, 8.204)
2025-05-12 18:26:56    minimum/maximum value in df:        (7.789, 8.204)
2025-05-12 18:26:56    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:56     Determining energy ratios for test turbine = 006. WD bias: 105.000 deg.
2025-05-12 18:26:56     Determining energy ratios for test turbine = 001. WD bias: 105.000 deg.
2025-05-12 18:26:56     Determining energy ratios for test turbine = 002. WD bias: 105.000 deg.
2025-05-12 18:26:56     Initializing energy ratio inputs.
2025-05-12 18:26:56   Constructing energy table for wd_bias of 110.00 deg.
2025-05-12 18:26:56     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:56 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:56    minimum/maximum value in df:        (7.776, 8.195)
2025-05-12 18:26:56    minimum/maximum value in df:        (7.776, 8.195)
2025-05-12 18:26:56    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:56     Determining energy ratios for test turbine = 006. WD bias: 110.000 deg.
2025-05-12 18:26:56     Determining energy ratios for test turbine = 001. WD bias: 110.000 deg.
2025-05-12 18:26:56     Determining energy ratios for test turbine = 002. WD bias: 110.000 deg.
2025-05-12 18:26:56     Initializing energy ratio inputs.
2025-05-12 18:26:56   Constructing energy table for wd_bias of 115.00 deg.
2025-05-12 18:26:56     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:56 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:56    minimum/maximum value in df:        (7.776, 8.224)
2025-05-12 18:26:56    minimum/maximum value in df:        (7.776, 8.224)
2025-05-12 18:26:56    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:56     Determining energy ratios for test turbine = 006. WD bias: 115.000 deg.
2025-05-12 18:26:57     Determining energy ratios for test turbine = 001. WD bias: 115.000 deg.
2025-05-12 18:26:57     Determining energy ratios for test turbine = 002. WD bias: 115.000 deg.
2025-05-12 18:26:57     Initializing energy ratio inputs.
2025-05-12 18:26:57   Constructing energy table for wd_bias of 120.00 deg.
2025-05-12 18:26:57     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:57 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:57    minimum/maximum value in df:        (7.776, 8.224)
2025-05-12 18:26:57    minimum/maximum value in df:        (7.776, 8.224)
2025-05-12 18:26:57    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:57     Determining energy ratios for test turbine = 006. WD bias: 120.000 deg.
2025-05-12 18:26:57     Determining energy ratios for test turbine = 001. WD bias: 120.000 deg.
2025-05-12 18:26:57     Determining energy ratios for test turbine = 002. WD bias: 120.000 deg.
2025-05-12 18:26:57     Initializing energy ratio inputs.
2025-05-12 18:26:57   Constructing energy table for wd_bias of 125.00 deg.
2025-05-12 18:26:57     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:57 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:57    minimum/maximum value in df:        (7.776, 8.224)
2025-05-12 18:26:57    minimum/maximum value in df:        (7.776, 8.224)
2025-05-12 18:26:57    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:57     Determining energy ratios for test turbine = 006. WD bias: 125.000 deg.
2025-05-12 18:26:57     Determining energy ratios for test turbine = 001. WD bias: 125.000 deg.
2025-05-12 18:26:57     Determining energy ratios for test turbine = 002. WD bias: 125.000 deg.
2025-05-12 18:26:57     Initializing energy ratio inputs.
2025-05-12 18:26:57   Constructing energy table for wd_bias of 130.00 deg.
2025-05-12 18:26:57     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:57 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:57    minimum/maximum value in df:        (7.785, 8.227)
2025-05-12 18:26:57    minimum/maximum value in df:        (7.785, 8.227)
2025-05-12 18:26:57    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:58     Determining energy ratios for test turbine = 006. WD bias: 130.000 deg.
2025-05-12 18:26:58     Determining energy ratios for test turbine = 001. WD bias: 130.000 deg.
2025-05-12 18:26:58     Determining energy ratios for test turbine = 002. WD bias: 130.000 deg.
2025-05-12 18:26:58     Initializing energy ratio inputs.
2025-05-12 18:26:58   Constructing energy table for wd_bias of 135.00 deg.
2025-05-12 18:26:58     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:58 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:58    minimum/maximum value in df:        (7.785, 8.227)
2025-05-12 18:26:58    minimum/maximum value in df:        (7.785, 8.227)
2025-05-12 18:26:58    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:58     Determining energy ratios for test turbine = 006. WD bias: 135.000 deg.
2025-05-12 18:26:58     Determining energy ratios for test turbine = 001. WD bias: 135.000 deg.
2025-05-12 18:26:58     Determining energy ratios for test turbine = 002. WD bias: 135.000 deg.
2025-05-12 18:26:58     Initializing energy ratio inputs.
2025-05-12 18:26:58   Constructing energy table for wd_bias of 140.00 deg.
2025-05-12 18:26:58     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:58 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:58    minimum/maximum value in df:        (7.785, 8.227)
2025-05-12 18:26:58    minimum/maximum value in df:        (7.785, 8.227)
2025-05-12 18:26:58    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:58     Determining energy ratios for test turbine = 006. WD bias: 140.000 deg.
2025-05-12 18:26:58     Determining energy ratios for test turbine = 001. WD bias: 140.000 deg.
2025-05-12 18:26:58     Determining energy ratios for test turbine = 002. WD bias: 140.000 deg.
2025-05-12 18:26:58     Initializing energy ratio inputs.
2025-05-12 18:26:58   Constructing energy table for wd_bias of 145.00 deg.
2025-05-12 18:26:59     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:59 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:59    minimum/maximum value in df:        (7.798, 8.256)
2025-05-12 18:26:59    minimum/maximum value in df:        (7.798, 8.256)
2025-05-12 18:26:59    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:59     Determining energy ratios for test turbine = 006. WD bias: 145.000 deg.
2025-05-12 18:26:59     Determining energy ratios for test turbine = 001. WD bias: 145.000 deg.
2025-05-12 18:26:59     Determining energy ratios for test turbine = 002. WD bias: 145.000 deg.
2025-05-12 18:26:59     Initializing energy ratio inputs.
2025-05-12 18:26:59   Constructing energy table for wd_bias of 150.00 deg.
2025-05-12 18:26:59     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:59 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:59    minimum/maximum value in df:        (7.798, 8.256)
2025-05-12 18:26:59    minimum/maximum value in df:        (7.798, 8.256)
2025-05-12 18:26:59    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:59     Determining energy ratios for test turbine = 006. WD bias: 150.000 deg.
2025-05-12 18:26:59     Determining energy ratios for test turbine = 001. WD bias: 150.000 deg.
2025-05-12 18:26:59     Determining energy ratios for test turbine = 002. WD bias: 150.000 deg.
2025-05-12 18:26:59     Initializing energy ratio inputs.
2025-05-12 18:26:59   Constructing energy table for wd_bias of 155.00 deg.
2025-05-12 18:26:59     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:26:59 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:26:59    minimum/maximum value in df:        (7.804, 8.256)
2025-05-12 18:26:59    minimum/maximum value in df:        (7.804, 8.256)
2025-05-12 18:26:59    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:26:59     Determining energy ratios for test turbine = 006. WD bias: 155.000 deg.
2025-05-12 18:26:59     Determining energy ratios for test turbine = 001. WD bias: 155.000 deg.
2025-05-12 18:27:00     Determining energy ratios for test turbine = 002. WD bias: 155.000 deg.
2025-05-12 18:27:00     Initializing energy ratio inputs.
2025-05-12 18:27:00   Constructing energy table for wd_bias of 160.00 deg.
2025-05-12 18:27:00     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:27:00 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:27:00    minimum/maximum value in df:        (7.798, 8.256)
2025-05-12 18:27:00    minimum/maximum value in df:        (7.798, 8.256)
2025-05-12 18:27:00    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:27:00     Determining energy ratios for test turbine = 006. WD bias: 160.000 deg.
2025-05-12 18:27:00     Determining energy ratios for test turbine = 001. WD bias: 160.000 deg.
2025-05-12 18:27:00     Determining energy ratios for test turbine = 002. WD bias: 160.000 deg.
2025-05-12 18:27:00     Initializing energy ratio inputs.
2025-05-12 18:27:00   Constructing energy table for wd_bias of 165.00 deg.
2025-05-12 18:27:00     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:27:00 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:27:00    minimum/maximum value in df:        (7.798, 8.247)
2025-05-12 18:27:00    minimum/maximum value in df:        (7.798, 8.247)
2025-05-12 18:27:00    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:27:00     Determining energy ratios for test turbine = 006. WD bias: 165.000 deg.
2025-05-12 18:27:00     Determining energy ratios for test turbine = 001. WD bias: 165.000 deg.
2025-05-12 18:27:00     Determining energy ratios for test turbine = 002. WD bias: 165.000 deg.
2025-05-12 18:27:00     Initializing energy ratio inputs.
2025-05-12 18:27:00   Constructing energy table for wd_bias of 170.00 deg.
2025-05-12 18:27:00     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:27:00 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:27:00    minimum/maximum value in df:        (7.798, 8.247)
2025-05-12 18:27:00    minimum/maximum value in df:        (7.798, 8.247)
2025-05-12 18:27:00    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:27:01     Determining energy ratios for test turbine = 006. WD bias: 170.000 deg.
2025-05-12 18:27:01     Determining energy ratios for test turbine = 001. WD bias: 170.000 deg.
2025-05-12 18:27:01     Determining energy ratios for test turbine = 002. WD bias: 170.000 deg.
2025-05-12 18:27:01     Initializing energy ratio inputs.
2025-05-12 18:27:01   Constructing energy table for wd_bias of 175.00 deg.
2025-05-12 18:27:01     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:27:01 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:27:01    minimum/maximum value in df:        (7.798, 8.247)
2025-05-12 18:27:01    minimum/maximum value in df:        (7.798, 8.247)
2025-05-12 18:27:01    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:27:01     Determining energy ratios for test turbine = 006. WD bias: 175.000 deg.
2025-05-12 18:27:01     Determining energy ratios for test turbine = 001. WD bias: 175.000 deg.
2025-05-12 18:27:01     Determining energy ratios for test turbine = 002. WD bias: 175.000 deg.
2025-05-12 18:27:01     Initializing energy ratio inputs.
2025-05-12 18:27:01   Constructing energy table for wd_bias of 180.00 deg.
2025-05-12 18:27:01     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:27:01 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:27:01    minimum/maximum value in df:        (7.798, 8.248)
2025-05-12 18:27:01    minimum/maximum value in df:        (7.798, 8.248)
2025-05-12 18:27:01    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:27:01     Determining energy ratios for test turbine = 006. WD bias: 180.000 deg.
2025-05-12 18:27:01     Determining energy ratios for test turbine = 001. WD bias: 180.000 deg.
2025-05-12 18:27:01     Determining energy ratios for test turbine = 002. WD bias: 180.000 deg.
2025-05-12 18:27:01     Initializing energy ratio inputs.
2025-05-12 18:27:01   Constructing energy table for wd_bias of 0.00 deg.
2025-05-12 18:27:01     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:27:01 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:27:01    minimum/maximum value in df:        (7.776, 8.231)
2025-05-12 18:27:01    minimum/maximum value in df:        (7.776, 8.231)
2025-05-12 18:27:01    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:27:02     Determining energy ratios for test turbine = 006. WD bias: 0.000 deg.
2025-05-12 18:27:02     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2025-05-12 18:27:02     Determining energy ratios for test turbine = 002. WD bias: 0.000 deg.
2025-05-12 18:27:02     Initializing energy ratio inputs.
2025-05-12 18:27:02   Constructing energy table for wd_bias of 0.00 deg.
2025-05-12 18:27:02     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:27:02 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:27:02    minimum/maximum value in df:        (7.776, 8.231)
2025-05-12 18:27:02    minimum/maximum value in df:        (7.776, 8.231)
2025-05-12 18:27:02    minimum/maximum value in df_approx: (8.000, 8.000)
2025-05-12 18:27:02     Determining energy ratios for test turbine = 006. WD bias: 0.000 deg.
2025-05-12 18:27:02     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2025-05-12 18:27:02     Determining energy ratios for test turbine = 002. WD bias: 0.000 deg.
2025-05-12 18:27:02   Evaluating optimal solution with bootstrapping
2025-05-12 18:27:02     Initializing energy ratio inputs.
2025-05-12 18:27:02   Constructing energy table for wd_bias of 0.00 deg.
2025-05-12 18:27:02     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:27:02 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:27:02    minimum/maximum value in df:        (7.776, 8.231)
2025-05-12 18:27:02    minimum/maximum value in df:        (7.776, 8.231)
2025-05-12 18:27:02    minimum/maximum value in df_approx: (8.000, 8.000)
Optimization terminated successfully.
         Current function value: -0.893931
         Iterations: 1
         Function evaluations: 2
2025-05-12 18:27:02     Determining energy ratios for test turbine = 006. WD bias: 0.000 deg.
2025-05-12 18:27:02     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2025-05-12 18:27:02     Determining energy ratios for test turbine = 002. WD bias: 0.000 deg.
2025-05-12 18:27:02     Initializing energy ratio inputs.
2025-05-12 18:27:02   Constructing energy table for wd_bias of 0.00 deg.
2025-05-12 18:27:03     Interpolating FLORIS predictions for dataframe.
2025-05-12 18:27:03 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2025-05-12 18:27:03    minimum/maximum value in df:        (7.776, 8.231)
2025-05-12 18:27:03    minimum/maximum value in df:        (7.776, 8.231)
2025-05-12 18:27:03    minimum/maximum value in df_approx: (8.000, 8.000)
Turbine 0. estimated bias = 0.00025 deg.
2025-05-12 18:27:03     Determining energy ratios for test turbine = 006. WD bias: 0.000 deg.
2025-05-12 18:27:03     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2025-05-12 18:27:03     Determining energy ratios for test turbine = 002. WD bias: 0.000 deg.
WD bias for first clean turbine: 0.000 deg
Error in callback <function flush_figures at 0x7ffaf190ba30> (for post_execute), with arguments args (),kwargs {}:
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib_inline/backend_inline.py:126, in flush_figures()
    123 if InlineBackend.instance().close_figures:
    124     # ignore the tracking, just draw and close all figures
    125     try:
--> 126         return show(True)
    127     except Exception as e:
    128         # safely show traceback if in IPython, else raise
    129         ip = get_ipython()

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib_inline/backend_inline.py:90, in show(close, block)
     88 try:
     89     for figure_manager in Gcf.get_all_fig_managers():
---> 90         display(
     91             figure_manager.canvas.figure,
     92             metadata=_fetch_figure_metadata(figure_manager.canvas.figure)
     93         )
     94 finally:
     95     show._to_draw = []

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/IPython/core/display_functions.py:298, in display(include, exclude, metadata, transient, display_id, raw, clear, *objs, **kwargs)
    296     publish_display_data(data=obj, metadata=metadata, **kwargs)
    297 else:
--> 298     format_dict, md_dict = format(obj, include=include, exclude=exclude)
    299     if not format_dict:
    300         # nothing to display (e.g. _ipython_display_ took over)
    301         continue

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/IPython/core/formatters.py:238, in DisplayFormatter.format(self, obj, include, exclude)
    236 md = None
    237 try:
--> 238     data = formatter(obj)
    239 except:
    240     # FIXME: log the exception
    241     raise

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/decorator.py:235, in decorate.<locals>.fun(*args, **kw)
    233 if not kwsyntax:
    234     args, kw = fix(args, kw, sig)
--> 235 return caller(func, *(extras + args), **kw)

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/IPython/core/formatters.py:282, in catch_format_error(method, self, *args, **kwargs)
    280 """show traceback on failed format call"""
    281 try:
--> 282     r = method(self, *args, **kwargs)
    283 except NotImplementedError:
    284     # don't warn on NotImplementedErrors
    285     return self._check_return(None, args[0])

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/IPython/core/formatters.py:402, in BaseFormatter.__call__(self, obj)
    400     pass
    401 else:
--> 402     return printer(obj)
    403 # Finally look for special method names
    404 method = get_real_method(obj, self.print_method)

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/IPython/core/pylabtools.py:170, in print_figure(fig, fmt, bbox_inches, base64, **kwargs)
    167     from matplotlib.backend_bases import FigureCanvasBase
    168     FigureCanvasBase(fig)
--> 170 fig.canvas.print_figure(bytes_io, **kw)
    171 data = bytes_io.getvalue()
    172 if fmt == 'svg':

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/backend_bases.py:2184, in FigureCanvasBase.print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, bbox_inches, pad_inches, bbox_extra_artists, backend, **kwargs)
   2180 try:
   2181     # _get_renderer may change the figure dpi (as vector formats
   2182     # force the figure dpi to 72), so we need to set it again here.
   2183     with cbook._setattr_cm(self.figure, dpi=dpi):
-> 2184         result = print_method(
   2185             filename,
   2186             facecolor=facecolor,
   2187             edgecolor=edgecolor,
   2188             orientation=orientation,
   2189             bbox_inches_restore=_bbox_inches_restore,
   2190             **kwargs)
   2191 finally:
   2192     if bbox_inches and restore_bbox:

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/backend_bases.py:2040, in FigureCanvasBase._switch_canvas_and_return_print_method.<locals>.<lambda>(*args, **kwargs)
   2036     optional_kws = {  # Passed by print_figure for other renderers.
   2037         "dpi", "facecolor", "edgecolor", "orientation",
   2038         "bbox_inches_restore"}
   2039     skip = optional_kws - {*inspect.signature(meth).parameters}
-> 2040     print_method = functools.wraps(meth)(lambda *args, **kwargs: meth(
   2041         *args, **{k: v for k, v in kwargs.items() if k not in skip}))
   2042 else:  # Let third-parties do as they see fit.
   2043     print_method = meth

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/backends/backend_agg.py:481, in FigureCanvasAgg.print_png(self, filename_or_obj, metadata, pil_kwargs)
    434 def print_png(self, filename_or_obj, *, metadata=None, pil_kwargs=None):
    435     """
    436     Write the figure to a PNG file.
    437 
   (...)
    479         *metadata*, including the default 'Software' key.
    480     """
--> 481     self._print_pil(filename_or_obj, "png", pil_kwargs, metadata)

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/backends/backend_agg.py:429, in FigureCanvasAgg._print_pil(self, filename_or_obj, fmt, pil_kwargs, metadata)
    424 def _print_pil(self, filename_or_obj, fmt, pil_kwargs, metadata=None):
    425     """
    426     Draw the canvas, then save it using `.image.imsave` (to which
    427     *pil_kwargs* and *metadata* are forwarded).
    428     """
--> 429     FigureCanvasAgg.draw(self)
    430     mpl.image.imsave(
    431         filename_or_obj, self.buffer_rgba(), format=fmt, origin="upper",
    432         dpi=self.figure.dpi, metadata=metadata, pil_kwargs=pil_kwargs)

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/backends/backend_agg.py:382, in FigureCanvasAgg.draw(self)
    379 # Acquire a lock on the shared font cache.
    380 with (self.toolbar._wait_cursor_for_draw_cm() if self.toolbar
    381       else nullcontext()):
--> 382     self.figure.draw(self.renderer)
    383     # A GUI class may be need to update a window using this draw, so
    384     # don't forget to call the superclass.
    385     super().draw()

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/artist.py:94, in _finalize_rasterization.<locals>.draw_wrapper(artist, renderer, *args, **kwargs)
     92 @wraps(draw)
     93 def draw_wrapper(artist, renderer, *args, **kwargs):
---> 94     result = draw(artist, renderer, *args, **kwargs)
     95     if renderer._rasterizing:
     96         renderer.stop_rasterizing()

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/artist.py:71, in allow_rasterization.<locals>.draw_wrapper(artist, renderer)
     68     if artist.get_agg_filter() is not None:
     69         renderer.start_filter()
---> 71     return draw(artist, renderer)
     72 finally:
     73     if artist.get_agg_filter() is not None:

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/figure.py:3257, in Figure.draw(self, renderer)
   3254             # ValueError can occur when resizing a window.
   3256     self.patch.draw(renderer)
-> 3257     mimage._draw_list_compositing_images(
   3258         renderer, self, artists, self.suppressComposite)
   3260     renderer.close_group('figure')
   3261 finally:

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/image.py:134, in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
    132 if not_composite or not has_images:
    133     for a in artists:
--> 134         a.draw(renderer)
    135 else:
    136     # Composite any adjacent images together
    137     image_group = []

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/artist.py:71, in allow_rasterization.<locals>.draw_wrapper(artist, renderer)
     68     if artist.get_agg_filter() is not None:
     69         renderer.start_filter()
---> 71     return draw(artist, renderer)
     72 finally:
     73     if artist.get_agg_filter() is not None:

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/axes/_base.py:3216, in _AxesBase.draw(self, renderer)
   3213 if artists_rasterized:
   3214     _draw_rasterized(self.get_figure(root=True), artists_rasterized, renderer)
-> 3216 mimage._draw_list_compositing_images(
   3217     renderer, self, artists, self.get_figure(root=True).suppressComposite)
   3219 renderer.close_group('axes')
   3220 self.stale = False

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/image.py:134, in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
    132 if not_composite or not has_images:
    133     for a in artists:
--> 134         a.draw(renderer)
    135 else:
    136     # Composite any adjacent images together
    137     image_group = []

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/artist.py:71, in allow_rasterization.<locals>.draw_wrapper(artist, renderer)
     68     if artist.get_agg_filter() is not None:
     69         renderer.start_filter()
---> 71     return draw(artist, renderer)
     72 finally:
     73     if artist.get_agg_filter() is not None:

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/legend.py:763, in Legend.draw(self, renderer)
    760     Shadow(self.legendPatch, **self._shadow_props).draw(renderer)
    762 self.legendPatch.draw(renderer)
--> 763 self._legend_box.draw(renderer)
    765 renderer.close_group('legend')
    766 self.stale = False

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/artist.py:38, in _prevent_rasterization.<locals>.draw_wrapper(artist, renderer, *args, **kwargs)
     35     renderer.stop_rasterizing()
     36     renderer._rasterizing = False
---> 38 return draw(artist, renderer, *args, **kwargs)

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/offsetbox.py:380, in OffsetBox.draw(self, renderer)
    375 """
    376 Update the location of children if necessary and draw them
    377 to the given *renderer*.
    378 """
    379 bbox, offsets = self._get_bbox_and_child_offsets(renderer)
--> 380 px, py = self.get_offset(bbox, renderer)
    381 for c, (ox, oy) in zip(self.get_visible_children(), offsets):
    382     c.set_offset((px + ox, py + oy))

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/offsetbox.py:60, in _compat_get_offset.<locals>.get_offset(self, *args, **kwargs)
     56 params = _api.select_matching_signature(sigs, self, *args, **kwargs)
     57 bbox = (params["bbox"] if "bbox" in params else
     58         Bbox.from_bounds(-params["xdescent"], -params["ydescent"],
     59                          params["width"], params["height"]))
---> 60 return meth(params["self"], bbox, params["renderer"])

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/offsetbox.py:306, in OffsetBox.get_offset(self, bbox, renderer)
    291 @_compat_get_offset
    292 def get_offset(self, bbox, renderer):
    293     """
    294     Return the offset as a tuple (x, y).
    295 
   (...)
    303     renderer : `.RendererBase` subclass
    304     """
    305     return (
--> 306         self._offset(bbox.width, bbox.height, -bbox.x0, -bbox.y0, renderer)
    307         if callable(self._offset)
    308         else self._offset)

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/legend.py:721, in Legend._findoffset(self, width, height, xdescent, ydescent, renderer)
    718 """Helper function to locate the legend."""
    720 if self._loc == 0:  # "best".
--> 721     x, y = self._find_best_position(width, height, renderer)
    722 elif self._loc in Legend.codes.values():  # Fixed location.
    723     bbox = Bbox.from_bounds(0, 0, width, height)

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/legend.py:1153, in Legend._find_best_position(self, width, height, renderer)
   1149 assert self.isaxes  # always holds, as this is only called internally
   1151 start_time = time.perf_counter()
-> 1153 bboxes, lines, offsets = self._auto_legend_data(renderer)
   1155 bbox = Bbox.from_bounds(0, 0, width, height)
   1157 candidates = []

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/legend.py:960, in Legend._auto_legend_data(self, renderer)
    956     lines.append(
    957         artist.get_transform().transform_path(artist.get_path()))
    958 elif isinstance(artist, Rectangle):
    959     bboxes.append(
--> 960         artist.get_bbox().transformed(artist.get_data_transform()))
    961 elif isinstance(artist, Patch):
    962     lines.append(
    963         artist.get_transform().transform_path(artist.get_path()))

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/transforms.py:465, in BboxBase.transformed(self, transform)
    461 """
    462 Construct a `Bbox` by statically transforming this one by *transform*.
    463 """
    464 pts = self.get_points()
--> 465 ll, ul, lr = transform.transform(np.array(
    466     [pts[0], [pts[0, 0], pts[1, 1]], [pts[1, 0], pts[0, 1]]]))
    467 return Bbox([ll, [lr[0], ul[1]]])

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/transforms.py:1495, in Transform.transform(self, values)
   1492 values = values.reshape((-1, self.input_dims))
   1494 # Transform the values
-> 1495 res = self.transform_affine(self.transform_non_affine(values))
   1497 # Convert the result back to the shape of the input values.
   1498 if ndim == 0:

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/transforms.py:2410, in CompositeGenericTransform.transform_affine(self, values)
   2408 def transform_affine(self, values):
   2409     # docstring inherited
-> 2410     return self.get_affine().transform(values)

File /opt/hostedtoolcache/Python/3.10.17/x64/lib/python3.10/site-packages/matplotlib/transforms.py:2436, in CompositeGenericTransform.get_affine(self)
   2434     return self._b.get_affine()
   2435 else:
-> 2436     return Affine2D(np.dot(self._b.get_affine().get_matrix(),
   2437                            self._a.get_affine().get_matrix()))

KeyboardInterrupt: 

Step 4: Estimate the biases of the remaining turbines#

Now that we know the wind direction bias of a single turbine, we roughly know where true north lies. What we can now do is simply calculate the average offset between the wind direction of any turbine and this northing-calibrated wind direction. The wind direction bias for that turbine is likely very close to this number. We use this as a first guess for the energy-ratio-based bias estimation, and optimize within +- 5 degrees within this initial value.

def estimate_biases_with_reference_wd(df_scada, fm, wd_ref):
    # Now use this knowledge to estimate bias for every turbine
    num_turbines = len(fm.layout_x)
    wd_bias_list = np.zeros(num_turbines)

    for ti in range(num_turbines):
        # Calculate the offset between this turbine's wind direction and that
        # of the calibrated (reference) wind direction. Note that 'wd_ref' may
        # also be a met mast' wind direction signal, if available. The offset
        # between a turbine's wind direction and wd_ref is very likely to be
        # the bias or close to the bias in this turbine's northing.
        wd_test = df_scada["wd_{:03d}".format(ti)]
        x0, _ = flopt.match_y_curves_by_offset(
            wd_ref, wd_test, dy_eval=np.arange(-180.0, 180.0, 2.0), angle_wrapping=True
        )

        # Then, we refine this first guess by evaluating the cost function
        # at [-5.0, 0.0, 5.0] deg around x0, and let the optimizer
        # converge.
        x_search_bounds = np.round(x0) + np.array([-5.0, 5.0])

        # Calculate and save the results to a list
        wd_bias_list[ti] = get_bias_for_single_turbine(
            df=df_scada,
            fm=fm,
            ti=ti,
            opt_search_range=x_search_bounds,
            plot=True,
            figure_save_path=None,
        )
        print(" ")

    return wd_bias_list


wd_bias_list = estimate_biases_with_reference_wd(df_scada_homogenized, fm, wd_ref)
print("Wind direction biases: {}".format(wd_bias_list))
2024-12-02 11:23:29 Initializing a bias_estimation() object...
2024-12-02 11:23:29 Estimating the wind direction bias
2024-12-02 11:23:29     Initializing energy ratio inputs.
2024-12-02 11:23:29   Constructing energy table for wd_bias of -5.00 deg.
2024-12-02 11:23:29     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:29 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:29    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:29    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:29    minimum/maximum value in df_approx: (8.000, 8.000)
Initializing wd bias estimator object for turbine 000...
2024-12-02 11:23:29     Determining energy ratios for test turbine = 006. WD bias: -5.000 deg.
2024-12-02 11:23:29     Determining energy ratios for test turbine = 001. WD bias: -5.000 deg.
2024-12-02 11:23:29     Determining energy ratios for test turbine = 002. WD bias: -5.000 deg.
2024-12-02 11:23:29     Initializing energy ratio inputs.
2024-12-02 11:23:29   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:29     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:29 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:29    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:29    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:29    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:29     Determining energy ratios for test turbine = 006. WD bias: 0.000 deg.
2024-12-02 11:23:29     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2024-12-02 11:23:29     Determining energy ratios for test turbine = 002. WD bias: 0.000 deg.
2024-12-02 11:23:29     Initializing energy ratio inputs.
2024-12-02 11:23:29   Constructing energy table for wd_bias of 5.00 deg.
2024-12-02 11:23:29     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:29 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:29    minimum/maximum value in df:        (7.789, 8.231)
2024-12-02 11:23:29    minimum/maximum value in df:        (7.789, 8.231)
2024-12-02 11:23:29    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:29     Determining energy ratios for test turbine = 006. WD bias: 5.000 deg.
2024-12-02 11:23:30     Determining energy ratios for test turbine = 001. WD bias: 5.000 deg.
2024-12-02 11:23:30     Determining energy ratios for test turbine = 002. WD bias: 5.000 deg.
2024-12-02 11:23:30     Initializing energy ratio inputs.
2024-12-02 11:23:30   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:30     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:30 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:30    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:30    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:30    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:30     Determining energy ratios for test turbine = 006. WD bias: 0.000 deg.
2024-12-02 11:23:30     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2024-12-02 11:23:30     Determining energy ratios for test turbine = 002. WD bias: 0.000 deg.
2024-12-02 11:23:30     Initializing energy ratio inputs.
2024-12-02 11:23:30   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:30     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:30 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:30    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:30    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:30    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:30     Determining energy ratios for test turbine = 006. WD bias: 0.000 deg.
2024-12-02 11:23:30     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2024-12-02 11:23:30     Determining energy ratios for test turbine = 002. WD bias: 0.000 deg.
2024-12-02 11:23:30   Evaluating optimal solution with bootstrapping
2024-12-02 11:23:30     Initializing energy ratio inputs.
2024-12-02 11:23:30   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:30     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:30 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:30    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:30    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:30    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:30     Determining energy ratios for test turbine = 006. WD bias: 0.000 deg.
2024-12-02 11:23:30     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2024-12-02 11:23:30     Determining energy ratios for test turbine = 002. WD bias: 0.000 deg.
2024-12-02 11:23:30     Initializing energy ratio inputs.
2024-12-02 11:23:30   Constructing energy table for wd_bias of 0.00 deg.
Optimization terminated successfully.
         Current function value: -0.893931
         Iterations: 1
         Function evaluations: 2
Turbine 0. estimated bias = 0.00025 deg.
2024-12-02 11:23:30     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:30 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:30    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:30    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:30    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:30     Determining energy ratios for test turbine = 006. WD bias: 0.000 deg.
2024-12-02 11:23:30     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2024-12-02 11:23:30     Determining energy ratios for test turbine = 002. WD bias: 0.000 deg.
2024-12-02 11:23:31 Initializing a bias_estimation() object...
2024-12-02 11:23:31 Estimating the wind direction bias
2024-12-02 11:23:31     Initializing energy ratio inputs.
2024-12-02 11:23:31   Constructing energy table for wd_bias of 9.00 deg.
2024-12-02 11:23:31     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:31 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:31    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:31    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:31    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:31     Determining energy ratios for test turbine = 002. WD bias: 9.000 deg.
 
Initializing wd bias estimator object for turbine 001...
2024-12-02 11:23:31     Determining energy ratios for test turbine = 006. WD bias: 9.000 deg.
2024-12-02 11:23:31     Determining energy ratios for test turbine = 005. WD bias: 9.000 deg.
2024-12-02 11:23:31     Initializing energy ratio inputs.
2024-12-02 11:23:31   Constructing energy table for wd_bias of 14.00 deg.
2024-12-02 11:23:31     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:31 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:31    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:31    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:31    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:31     Determining energy ratios for test turbine = 002. WD bias: 14.000 deg.
2024-12-02 11:23:31     Determining energy ratios for test turbine = 006. WD bias: 14.000 deg.
2024-12-02 11:23:31     Determining energy ratios for test turbine = 005. WD bias: 14.000 deg.
2024-12-02 11:23:31     Initializing energy ratio inputs.
2024-12-02 11:23:31   Constructing energy table for wd_bias of 19.00 deg.
2024-12-02 11:23:31     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:31 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:31    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:31    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:31    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:31     Determining energy ratios for test turbine = 002. WD bias: 19.000 deg.
2024-12-02 11:23:31     Determining energy ratios for test turbine = 006. WD bias: 19.000 deg.
2024-12-02 11:23:31     Determining energy ratios for test turbine = 005. WD bias: 19.000 deg.
2024-12-02 11:23:31     Initializing energy ratio inputs.
2024-12-02 11:23:31   Constructing energy table for wd_bias of 14.00 deg.
2024-12-02 11:23:31     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:31 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:31    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:31    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:31    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:31     Determining energy ratios for test turbine = 002. WD bias: 14.000 deg.
2024-12-02 11:23:31     Determining energy ratios for test turbine = 006. WD bias: 14.000 deg.
2024-12-02 11:23:31     Determining energy ratios for test turbine = 005. WD bias: 14.000 deg.
2024-12-02 11:23:31     Initializing energy ratio inputs.
2024-12-02 11:23:31   Constructing energy table for wd_bias of 14.70 deg.
2024-12-02 11:23:31     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:31 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:31    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:31    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:31    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:32     Determining energy ratios for test turbine = 002. WD bias: 14.700 deg.
2024-12-02 11:23:32     Determining energy ratios for test turbine = 006. WD bias: 14.700 deg.
2024-12-02 11:23:32     Determining energy ratios for test turbine = 005. WD bias: 14.700 deg.
2024-12-02 11:23:32     Initializing energy ratio inputs.
2024-12-02 11:23:32   Constructing energy table for wd_bias of 15.40 deg.
2024-12-02 11:23:32     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:32 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:32    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:32    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:32    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:32     Determining energy ratios for test turbine = 002. WD bias: 15.400 deg.
2024-12-02 11:23:32     Determining energy ratios for test turbine = 006. WD bias: 15.400 deg.
2024-12-02 11:23:32     Determining energy ratios for test turbine = 005. WD bias: 15.400 deg.
2024-12-02 11:23:32     Initializing energy ratio inputs.
2024-12-02 11:23:32   Constructing energy table for wd_bias of 15.05 deg.
2024-12-02 11:23:32     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:32 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:32    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:32    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:32    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:32     Determining energy ratios for test turbine = 002. WD bias: 15.050 deg.
2024-12-02 11:23:32     Determining energy ratios for test turbine = 006. WD bias: 15.050 deg.
2024-12-02 11:23:32     Determining energy ratios for test turbine = 005. WD bias: 15.050 deg.
2024-12-02 11:23:32     Initializing energy ratio inputs.
2024-12-02 11:23:32   Constructing energy table for wd_bias of 15.40 deg.
2024-12-02 11:23:32     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:32 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:32    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:32    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:32    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:32     Determining energy ratios for test turbine = 002. WD bias: 15.400 deg.
2024-12-02 11:23:32     Determining energy ratios for test turbine = 006. WD bias: 15.400 deg.
2024-12-02 11:23:32     Determining energy ratios for test turbine = 005. WD bias: 15.400 deg.
2024-12-02 11:23:32     Initializing energy ratio inputs.
2024-12-02 11:23:32   Constructing energy table for wd_bias of 14.88 deg.
2024-12-02 11:23:32     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:32 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:32    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:32    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:32    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:32     Determining energy ratios for test turbine = 002. WD bias: 14.875 deg.
2024-12-02 11:23:32     Determining energy ratios for test turbine = 006. WD bias: 14.875 deg.
2024-12-02 11:23:33     Determining energy ratios for test turbine = 005. WD bias: 14.875 deg.
2024-12-02 11:23:33     Initializing energy ratio inputs.
2024-12-02 11:23:33   Constructing energy table for wd_bias of 15.23 deg.
2024-12-02 11:23:33     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:33 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:33    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:33    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:33    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:33     Determining energy ratios for test turbine = 002. WD bias: 15.225 deg.
2024-12-02 11:23:33     Determining energy ratios for test turbine = 006. WD bias: 15.225 deg.
2024-12-02 11:23:33     Determining energy ratios for test turbine = 005. WD bias: 15.225 deg.
2024-12-02 11:23:33     Initializing energy ratio inputs.
2024-12-02 11:23:33   Constructing energy table for wd_bias of 14.96 deg.
2024-12-02 11:23:33     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:33 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:33    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:33    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:33    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:33     Determining energy ratios for test turbine = 002. WD bias: 14.963 deg.
2024-12-02 11:23:33     Determining energy ratios for test turbine = 006. WD bias: 14.963 deg.
2024-12-02 11:23:33     Determining energy ratios for test turbine = 005. WD bias: 14.963 deg.
2024-12-02 11:23:33   Evaluating optimal solution with bootstrapping
2024-12-02 11:23:33     Initializing energy ratio inputs.
2024-12-02 11:23:33   Constructing energy table for wd_bias of 14.96 deg.
2024-12-02 11:23:33     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:33 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:33    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:33    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:33    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:33     Determining energy ratios for test turbine = 002. WD bias: 14.963 deg.
2024-12-02 11:23:33     Determining energy ratios for test turbine = 006. WD bias: 14.963 deg.
Optimization terminated successfully.
         Current function value: -0.999869
         Iterations: 4
         Function evaluations: 8
2024-12-02 11:23:33     Determining energy ratios for test turbine = 005. WD bias: 14.963 deg.
2024-12-02 11:23:33     Initializing energy ratio inputs.
2024-12-02 11:23:33   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:33     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:33 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:33    minimum/maximum value in df:        (7.776, 8.253)
2024-12-02 11:23:33    minimum/maximum value in df:        (7.776, 8.253)
2024-12-02 11:23:33    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:33     Determining energy ratios for test turbine = 002. WD bias: 0.000 deg.
2024-12-02 11:23:33     Determining energy ratios for test turbine = 006. WD bias: 0.000 deg.
2024-12-02 11:23:33     Determining energy ratios for test turbine = 005. WD bias: 0.000 deg.
Turbine 1. estimated bias = 14.9625 deg.
2024-12-02 11:23:34 Initializing a bias_estimation() object...
2024-12-02 11:23:34 Estimating the wind direction bias
2024-12-02 11:23:34     Initializing energy ratio inputs.
2024-12-02 11:23:34   Constructing energy table for wd_bias of -49.00 deg.
2024-12-02 11:23:34     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:34 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:34    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:34    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:34    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:34     Determining energy ratios for test turbine = 001. WD bias: -49.000 deg.
 
Initializing wd bias estimator object for turbine 002...
2024-12-02 11:23:34     Determining energy ratios for test turbine = 003. WD bias: -49.000 deg.
2024-12-02 11:23:34     Determining energy ratios for test turbine = 005. WD bias: -49.000 deg.
2024-12-02 11:23:34     Initializing energy ratio inputs.
2024-12-02 11:23:34   Constructing energy table for wd_bias of -44.00 deg.
2024-12-02 11:23:34     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:34 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:34    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:34    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:34    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:34     Determining energy ratios for test turbine = 001. WD bias: -44.000 deg.
2024-12-02 11:23:34     Determining energy ratios for test turbine = 003. WD bias: -44.000 deg.
2024-12-02 11:23:34     Determining energy ratios for test turbine = 005. WD bias: -44.000 deg.
2024-12-02 11:23:34     Initializing energy ratio inputs.
2024-12-02 11:23:34   Constructing energy table for wd_bias of -39.00 deg.
2024-12-02 11:23:34     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:34 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:34    minimum/maximum value in df:        (7.787, 8.231)
2024-12-02 11:23:34    minimum/maximum value in df:        (7.787, 8.231)
2024-12-02 11:23:34    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:34     Determining energy ratios for test turbine = 001. WD bias: -39.000 deg.
2024-12-02 11:23:34     Determining energy ratios for test turbine = 003. WD bias: -39.000 deg.
2024-12-02 11:23:34     Determining energy ratios for test turbine = 005. WD bias: -39.000 deg.
2024-12-02 11:23:34     Initializing energy ratio inputs.
2024-12-02 11:23:34   Constructing energy table for wd_bias of -44.00 deg.
2024-12-02 11:23:34     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:34 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:34    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:34    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:34    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:34     Determining energy ratios for test turbine = 001. WD bias: -44.000 deg.
2024-12-02 11:23:34     Determining energy ratios for test turbine = 003. WD bias: -44.000 deg.
2024-12-02 11:23:34     Determining energy ratios for test turbine = 005. WD bias: -44.000 deg.
2024-12-02 11:23:34     Initializing energy ratio inputs.
2024-12-02 11:23:34   Constructing energy table for wd_bias of -46.20 deg.
2024-12-02 11:23:34     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:34 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:34    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:34    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:34    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:35     Determining energy ratios for test turbine = 001. WD bias: -46.200 deg.
2024-12-02 11:23:35     Determining energy ratios for test turbine = 003. WD bias: -46.200 deg.
2024-12-02 11:23:35     Determining energy ratios for test turbine = 005. WD bias: -46.200 deg.
2024-12-02 11:23:35     Initializing energy ratio inputs.
2024-12-02 11:23:35   Constructing energy table for wd_bias of -41.80 deg.
2024-12-02 11:23:35     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:35 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:35    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:35    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:35    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:35     Determining energy ratios for test turbine = 001. WD bias: -41.800 deg.
2024-12-02 11:23:35     Determining energy ratios for test turbine = 003. WD bias: -41.800 deg.
2024-12-02 11:23:35     Determining energy ratios for test turbine = 005. WD bias: -41.800 deg.
2024-12-02 11:23:35     Initializing energy ratio inputs.
2024-12-02 11:23:35   Constructing energy table for wd_bias of -45.10 deg.
2024-12-02 11:23:35     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:35 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:35    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:35    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:35    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:35     Determining energy ratios for test turbine = 001. WD bias: -45.100 deg.
2024-12-02 11:23:35     Determining energy ratios for test turbine = 003. WD bias: -45.100 deg.
2024-12-02 11:23:35     Determining energy ratios for test turbine = 005. WD bias: -45.100 deg.
2024-12-02 11:23:35     Initializing energy ratio inputs.
2024-12-02 11:23:35   Constructing energy table for wd_bias of -46.20 deg.
2024-12-02 11:23:35     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:35 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:35    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:35    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:35    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:35     Determining energy ratios for test turbine = 001. WD bias: -46.200 deg.
2024-12-02 11:23:35     Determining energy ratios for test turbine = 003. WD bias: -46.200 deg.
2024-12-02 11:23:35     Determining energy ratios for test turbine = 005. WD bias: -46.200 deg.
2024-12-02 11:23:35     Initializing energy ratio inputs.
2024-12-02 11:23:35   Constructing energy table for wd_bias of -44.55 deg.
2024-12-02 11:23:35     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:35 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:35    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:35    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:35    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:35     Determining energy ratios for test turbine = 001. WD bias: -44.550 deg.
2024-12-02 11:23:35     Determining energy ratios for test turbine = 003. WD bias: -44.550 deg.
2024-12-02 11:23:36     Determining energy ratios for test turbine = 005. WD bias: -44.550 deg.
2024-12-02 11:23:36     Initializing energy ratio inputs.
2024-12-02 11:23:36   Constructing energy table for wd_bias of -45.65 deg.
2024-12-02 11:23:36     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:36 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:36    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:36    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:36    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:36     Determining energy ratios for test turbine = 001. WD bias: -45.650 deg.
2024-12-02 11:23:36     Determining energy ratios for test turbine = 003. WD bias: -45.650 deg.
2024-12-02 11:23:36     Determining energy ratios for test turbine = 005. WD bias: -45.650 deg.
2024-12-02 11:23:36     Initializing energy ratio inputs.
2024-12-02 11:23:36   Constructing energy table for wd_bias of -44.83 deg.
2024-12-02 11:23:36     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:36 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:36    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:36    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:36    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:36     Determining energy ratios for test turbine = 001. WD bias: -44.825 deg.
2024-12-02 11:23:36     Determining energy ratios for test turbine = 003. WD bias: -44.825 deg.
2024-12-02 11:23:36     Determining energy ratios for test turbine = 005. WD bias: -44.825 deg.
2024-12-02 11:23:36     Initializing energy ratio inputs.
2024-12-02 11:23:36   Constructing energy table for wd_bias of -45.38 deg.
2024-12-02 11:23:36     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:36 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:36    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:36    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:36    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:36     Determining energy ratios for test turbine = 001. WD bias: -45.375 deg.
2024-12-02 11:23:36     Determining energy ratios for test turbine = 003. WD bias: -45.375 deg.
2024-12-02 11:23:36     Determining energy ratios for test turbine = 005. WD bias: -45.375 deg.
2024-12-02 11:23:36     Initializing energy ratio inputs.
2024-12-02 11:23:36   Constructing energy table for wd_bias of -44.96 deg.
2024-12-02 11:23:36     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:36 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:36    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:36    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:36    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:36     Determining energy ratios for test turbine = 001. WD bias: -44.963 deg.
2024-12-02 11:23:36     Determining energy ratios for test turbine = 003. WD bias: -44.963 deg.
2024-12-02 11:23:36     Determining energy ratios for test turbine = 005. WD bias: -44.963 deg.
2024-12-02 11:23:36   Evaluating optimal solution with bootstrapping
2024-12-02 11:23:36     Initializing energy ratio inputs.
2024-12-02 11:23:36   Constructing energy table for wd_bias of -44.96 deg.
2024-12-02 11:23:36     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:36 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:36    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:36    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:36    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:37     Determining energy ratios for test turbine = 001. WD bias: -44.963 deg.
2024-12-02 11:23:37     Determining energy ratios for test turbine = 003. WD bias: -44.963 deg.
2024-12-02 11:23:37     Determining energy ratios for test turbine = 005. WD bias: -44.963 deg.
2024-12-02 11:23:37     Initializing energy ratio inputs.
2024-12-02 11:23:37   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:37     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:37 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:37    minimum/maximum value in df:        (7.802, 8.239)
2024-12-02 11:23:37    minimum/maximum value in df:        (7.802, 8.239)
2024-12-02 11:23:37    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:37     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2024-12-02 11:23:37     Determining energy ratios for test turbine = 003. WD bias: 0.000 deg.
2024-12-02 11:23:37     Determining energy ratios for test turbine = 005. WD bias: 0.000 deg.
Turbine 2. estimated bias = -44.962500000000006 deg.
2024-12-02 11:23:37 Initializing a bias_estimation() object...
2024-12-02 11:23:37 Estimating the wind direction bias
2024-12-02 11:23:37     Initializing energy ratio inputs.
2024-12-02 11:23:37   Constructing energy table for wd_bias of -5.00 deg.
2024-12-02 11:23:37     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:37 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:37    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:37    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:37    minimum/maximum value in df_approx: (8.000, 8.000)
 
Initializing wd bias estimator object for turbine 003...
2024-12-02 11:23:37     Determining energy ratios for test turbine = 005. WD bias: -5.000 deg.
2024-12-02 11:23:37     Determining energy ratios for test turbine = 002. WD bias: -5.000 deg.
2024-12-02 11:23:37     Determining energy ratios for test turbine = 001. WD bias: -5.000 deg.
2024-12-02 11:23:37     Initializing energy ratio inputs.
2024-12-02 11:23:37   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:37     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:37 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:37    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:37    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:37    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:38     Determining energy ratios for test turbine = 005. WD bias: 0.000 deg.
2024-12-02 11:23:38     Determining energy ratios for test turbine = 002. WD bias: 0.000 deg.
2024-12-02 11:23:38     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2024-12-02 11:23:38     Initializing energy ratio inputs.
2024-12-02 11:23:38   Constructing energy table for wd_bias of 5.00 deg.
2024-12-02 11:23:38     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:38 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:38    minimum/maximum value in df:        (7.787, 8.231)
2024-12-02 11:23:38    minimum/maximum value in df:        (7.787, 8.231)
2024-12-02 11:23:38    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:38     Determining energy ratios for test turbine = 005. WD bias: 5.000 deg.
2024-12-02 11:23:38     Determining energy ratios for test turbine = 002. WD bias: 5.000 deg.
2024-12-02 11:23:38     Determining energy ratios for test turbine = 001. WD bias: 5.000 deg.
2024-12-02 11:23:38     Initializing energy ratio inputs.
2024-12-02 11:23:38   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:38     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:38 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:38    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:38    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:38    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:38     Determining energy ratios for test turbine = 005. WD bias: 0.000 deg.
2024-12-02 11:23:38     Determining energy ratios for test turbine = 002. WD bias: 0.000 deg.
2024-12-02 11:23:38     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2024-12-02 11:23:38     Initializing energy ratio inputs.
2024-12-02 11:23:38   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:38     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:38 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:38    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:38    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:38    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:38     Determining energy ratios for test turbine = 005. WD bias: 0.000 deg.
2024-12-02 11:23:38     Determining energy ratios for test turbine = 002. WD bias: 0.000 deg.
2024-12-02 11:23:38     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2024-12-02 11:23:38   Evaluating optimal solution with bootstrapping
2024-12-02 11:23:38     Initializing energy ratio inputs.
2024-12-02 11:23:38   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:38     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:38 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:38    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:38    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:38    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:38     Determining energy ratios for test turbine = 005. WD bias: 0.000 deg.
2024-12-02 11:23:38     Determining energy ratios for test turbine = 002. WD bias: 0.000 deg.
2024-12-02 11:23:39     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
Optimization terminated successfully.
         Current function value: -0.861142
         Iterations: 1
         Function evaluations: 2
2024-12-02 11:23:39     Initializing energy ratio inputs.
2024-12-02 11:23:39   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:39     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:39 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:39    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:39    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:39    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:39     Determining energy ratios for test turbine = 005. WD bias: 0.000 deg.
2024-12-02 11:23:39     Determining energy ratios for test turbine = 002. WD bias: 0.000 deg.
2024-12-02 11:23:39     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
Turbine 3. estimated bias = 0.0 deg.
2024-12-02 11:23:39 Initializing a bias_estimation() object...
2024-12-02 11:23:39 Estimating the wind direction bias
2024-12-02 11:23:39     Initializing energy ratio inputs.
2024-12-02 11:23:39   Constructing energy table for wd_bias of -5.00 deg.
2024-12-02 11:23:39     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:39 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:39    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:39    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:39    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:39     Determining energy ratios for test turbine = 003. WD bias: -5.000 deg.
 
Initializing wd bias estimator object for turbine 004...
2024-12-02 11:23:39     Determining energy ratios for test turbine = 002. WD bias: -5.000 deg.
2024-12-02 11:23:39     Determining energy ratios for test turbine = 005. WD bias: -5.000 deg.
2024-12-02 11:23:39     Initializing energy ratio inputs.
2024-12-02 11:23:39   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:39     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:39 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:39    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:39    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:39    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:39     Determining energy ratios for test turbine = 003. WD bias: 0.000 deg.
2024-12-02 11:23:39     Determining energy ratios for test turbine = 002. WD bias: 0.000 deg.
2024-12-02 11:23:39     Determining energy ratios for test turbine = 005. WD bias: 0.000 deg.
2024-12-02 11:23:39     Initializing energy ratio inputs.
2024-12-02 11:23:39   Constructing energy table for wd_bias of 5.00 deg.
2024-12-02 11:23:39     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:39 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:39    minimum/maximum value in df:        (7.776, 8.221)
2024-12-02 11:23:39    minimum/maximum value in df:        (7.776, 8.221)
2024-12-02 11:23:39    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:40     Determining energy ratios for test turbine = 003. WD bias: 5.000 deg.
2024-12-02 11:23:40     Determining energy ratios for test turbine = 002. WD bias: 5.000 deg.
2024-12-02 11:23:40     Determining energy ratios for test turbine = 005. WD bias: 5.000 deg.
2024-12-02 11:23:40     Initializing energy ratio inputs.
2024-12-02 11:23:40   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:40     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:40 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:40    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:40    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:40    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:40     Determining energy ratios for test turbine = 003. WD bias: 0.000 deg.
2024-12-02 11:23:40     Determining energy ratios for test turbine = 002. WD bias: 0.000 deg.
2024-12-02 11:23:40     Determining energy ratios for test turbine = 005. WD bias: 0.000 deg.
2024-12-02 11:23:40     Initializing energy ratio inputs.
2024-12-02 11:23:40   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:40     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:40 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:40    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:40    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:40    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:40     Determining energy ratios for test turbine = 003. WD bias: 0.000 deg.
2024-12-02 11:23:40     Determining energy ratios for test turbine = 002. WD bias: 0.000 deg.
2024-12-02 11:23:40     Determining energy ratios for test turbine = 005. WD bias: 0.000 deg.
2024-12-02 11:23:40   Evaluating optimal solution with bootstrapping
2024-12-02 11:23:40     Initializing energy ratio inputs.
2024-12-02 11:23:40   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:40     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:40 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:40    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:40    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:40    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:40     Determining energy ratios for test turbine = 003. WD bias: 0.000 deg.
2024-12-02 11:23:40     Determining energy ratios for test turbine = 002. WD bias: 0.000 deg.
Optimization terminated successfully.
         Current function value: -0.890643
         Iterations: 1
         Function evaluations: 2
2024-12-02 11:23:40     Determining energy ratios for test turbine = 005. WD bias: 0.000 deg.
2024-12-02 11:23:40     Initializing energy ratio inputs.
2024-12-02 11:23:40   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:40     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:40 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:40    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:40    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:40    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:40     Determining energy ratios for test turbine = 003. WD bias: 0.000 deg.
2024-12-02 11:23:40     Determining energy ratios for test turbine = 002. WD bias: 0.000 deg.
2024-12-02 11:23:41     Determining energy ratios for test turbine = 005. WD bias: 0.000 deg.
Turbine 4. estimated bias = 0.0 deg.
2024-12-02 11:23:41 Initializing a bias_estimation() object...
2024-12-02 11:23:41 Estimating the wind direction bias
2024-12-02 11:23:41     Initializing energy ratio inputs.
2024-12-02 11:23:41   Constructing energy table for wd_bias of -5.00 deg.
2024-12-02 11:23:41     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:41 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:41    minimum/maximum value in df:        (7.776, 8.253)
2024-12-02 11:23:41    minimum/maximum value in df:        (7.776, 8.253)
2024-12-02 11:23:41    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:41     Determining energy ratios for test turbine = 003. WD bias: -5.000 deg.
2024-12-02 11:23:41     Determining energy ratios for test turbine = 001. WD bias: -5.000 deg.
 
Initializing wd bias estimator object for turbine 005...
2024-12-02 11:23:41     Determining energy ratios for test turbine = 006. WD bias: -5.000 deg.
2024-12-02 11:23:41     Initializing energy ratio inputs.
2024-12-02 11:23:41   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:41     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:41 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:41    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:41    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:41    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:41     Determining energy ratios for test turbine = 003. WD bias: 0.000 deg.
2024-12-02 11:23:41     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2024-12-02 11:23:41     Determining energy ratios for test turbine = 006. WD bias: 0.000 deg.
2024-12-02 11:23:41     Initializing energy ratio inputs.
2024-12-02 11:23:41   Constructing energy table for wd_bias of 5.00 deg.
2024-12-02 11:23:41     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:41 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:41    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:41    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:41    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:41     Determining energy ratios for test turbine = 003. WD bias: 5.000 deg.
2024-12-02 11:23:41     Determining energy ratios for test turbine = 001. WD bias: 5.000 deg.
2024-12-02 11:23:41     Determining energy ratios for test turbine = 006. WD bias: 5.000 deg.
2024-12-02 11:23:41     Initializing energy ratio inputs.
2024-12-02 11:23:41   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:41     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:41 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:41    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:41    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:41    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:42     Determining energy ratios for test turbine = 003. WD bias: 0.000 deg.
2024-12-02 11:23:42     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2024-12-02 11:23:42     Determining energy ratios for test turbine = 006. WD bias: 0.000 deg.
2024-12-02 11:23:42     Initializing energy ratio inputs.
2024-12-02 11:23:42   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:42     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:42 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:42    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:42    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:42    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:42     Determining energy ratios for test turbine = 003. WD bias: 0.000 deg.
2024-12-02 11:23:42     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2024-12-02 11:23:42     Determining energy ratios for test turbine = 006. WD bias: 0.000 deg.
2024-12-02 11:23:42   Evaluating optimal solution with bootstrapping
2024-12-02 11:23:42     Initializing energy ratio inputs.
2024-12-02 11:23:42   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:42     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:42 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:42    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:42    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:42    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:42     Determining energy ratios for test turbine = 003. WD bias: 0.000 deg.
2024-12-02 11:23:42     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2024-12-02 11:23:42     Determining energy ratios for test turbine = 006. WD bias: 0.000 deg.
Optimization terminated successfully.
         Current function value: -0.900444
         Iterations: 1
         Function evaluations: 2
2024-12-02 11:23:42     Initializing energy ratio inputs.
2024-12-02 11:23:42   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:42     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:42 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:42    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:42    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:42    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:42     Determining energy ratios for test turbine = 003. WD bias: 0.000 deg.
2024-12-02 11:23:42     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2024-12-02 11:23:42     Determining energy ratios for test turbine = 006. WD bias: 0.000 deg.
Turbine 5. estimated bias = 0.0 deg.
2024-12-02 11:23:43 Initializing a bias_estimation() object...
2024-12-02 11:23:43 Estimating the wind direction bias
2024-12-02 11:23:43     Initializing energy ratio inputs.
2024-12-02 11:23:43   Constructing energy table for wd_bias of -5.00 deg.
2024-12-02 11:23:43     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:43 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:43    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:43    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:43    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:43     Determining energy ratios for test turbine = 001. WD bias: -5.000 deg.
 
Initializing wd bias estimator object for turbine 006...
2024-12-02 11:23:43     Determining energy ratios for test turbine = 005. WD bias: -5.000 deg.
2024-12-02 11:23:43     Determining energy ratios for test turbine = 000. WD bias: -5.000 deg.
2024-12-02 11:23:43     Initializing energy ratio inputs.
2024-12-02 11:23:43   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:43     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:43 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:43    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:43    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:43    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:43     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2024-12-02 11:23:43     Determining energy ratios for test turbine = 005. WD bias: 0.000 deg.
2024-12-02 11:23:43     Determining energy ratios for test turbine = 000. WD bias: 0.000 deg.
2024-12-02 11:23:43     Initializing energy ratio inputs.
2024-12-02 11:23:43   Constructing energy table for wd_bias of 5.00 deg.
2024-12-02 11:23:43     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:43 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:43    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:43    minimum/maximum value in df:        (7.776, 8.231)
2024-12-02 11:23:43    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:43     Determining energy ratios for test turbine = 001. WD bias: 5.000 deg.
2024-12-02 11:23:43     Determining energy ratios for test turbine = 005. WD bias: 5.000 deg.
2024-12-02 11:23:43     Determining energy ratios for test turbine = 000. WD bias: 5.000 deg.
2024-12-02 11:23:43     Initializing energy ratio inputs.
2024-12-02 11:23:43   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:43     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:43 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:43    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:43    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:43    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:43     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2024-12-02 11:23:43     Determining energy ratios for test turbine = 005. WD bias: 0.000 deg.
2024-12-02 11:23:43     Determining energy ratios for test turbine = 000. WD bias: 0.000 deg.
2024-12-02 11:23:43     Initializing energy ratio inputs.
2024-12-02 11:23:43   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:43     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:43 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:43    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:43    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:43    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:43     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2024-12-02 11:23:44     Determining energy ratios for test turbine = 005. WD bias: 0.000 deg.
2024-12-02 11:23:44     Determining energy ratios for test turbine = 000. WD bias: 0.000 deg.
2024-12-02 11:23:44   Evaluating optimal solution with bootstrapping
2024-12-02 11:23:44     Initializing energy ratio inputs.
2024-12-02 11:23:44   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:44     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:44 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:44    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:44    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:44    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:44     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2024-12-02 11:23:44     Determining energy ratios for test turbine = 005. WD bias: 0.000 deg.
2024-12-02 11:23:44     Determining energy ratios for test turbine = 000. WD bias: 0.000 deg.
Optimization terminated successfully.
         Current function value: -0.884975
         Iterations: 1
         Function evaluations: 2
2024-12-02 11:23:44     Initializing energy ratio inputs.
2024-12-02 11:23:44   Constructing energy table for wd_bias of 0.00 deg.
2024-12-02 11:23:44     Interpolating FLORIS predictions for dataframe.
2024-12-02 11:23:44 Warning: the values in df[ws] exceed the range in the precalculated solutions df_fi_approx[ws].
2024-12-02 11:23:44    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:44    minimum/maximum value in df:        (7.776, 8.248)
2024-12-02 11:23:44    minimum/maximum value in df_approx: (8.000, 8.000)
2024-12-02 11:23:44     Determining energy ratios for test turbine = 001. WD bias: 0.000 deg.
2024-12-02 11:23:44     Determining energy ratios for test turbine = 005. WD bias: 0.000 deg.
2024-12-02 11:23:44     Determining energy ratios for test turbine = 000. WD bias: 0.000 deg.
Turbine 6. estimated bias = 0.00025 deg.
 
Wind direction biases: [ 2.50000e-04  1.49625e+01 -4.49625e+01  0.00000e+00  0.00000e+00
  0.00000e+00  2.50000e-04]
../../_images/d65ea546fb05c9685e8e31522b49c4f97d1c35aa15e4a706d24738fa49734368.png ../../_images/d97c9a44e334ff7ba715dc20c20e1765f5c52e8a6836ea9ca183de6faaa3205d.png ../../_images/88792bc8f6788fa28f85ba8bc74d90a6e59397316370ce1ed6dc2b7ef60eb0a6.png ../../_images/4652e9763e3e6f83e12444253efebc393adc9ab2dabbdfea325e01040f92d084.png ../../_images/931618ff413b0af72d6fb8efb11767160645fc087e16595fa4edbef8dbf8221d.png ../../_images/349cd53677261a5c8561f02a5f33ac979c284ae4e59123f13c5f9da17bbb9e43.png ../../_images/3a1de805672d34e7fac02f362653a90ea689e8c4794719d960fbecf45f71074d.png ../../_images/369d97f57cbb59857117e8e28cf7ca7289791402b1736dca3e06ec5c48a5eae6.png ../../_images/023b6d0cf1cc13663e7fc6ad57ddbfd36993743a8e4d8cf8e8e698b6b57288c5.png ../../_images/c7f5b927f11f9ad5b35fa0d593ed0139eec2f34674df62563eb7773956c2c75b.png ../../_images/97a70287bcc86dc1c2da451f0e8dad4493f34e9815f4241e357cee674d58b80e.png ../../_images/49818762a86d718bbc9d645104680b90f90dfd59a6feacbd3fc2306a423ef859.png ../../_images/bcd64420f6cb48799454dd333563c24237f4ccf16cd5906b483edca10cdd0965.png ../../_images/857b50924bd3c92a914869dfb3611f3f4f0373b9b00943278ef0c743347a1598.png ../../_images/69878180c3229f00b40e2ffdb485d16d8b6b7e2aba6812b8bfd04ed288ee00d6.png ../../_images/1b557aab6c8dea60fbeadd649b027dcfbb2f37b1ef131852b27dba160cce2df1.png ../../_images/15484727aa543a37778f63aae89895844d8bc0db3a2a1acb5b2cb97bd0816e5f.png ../../_images/0161bf71e4c90308d743569736219b95fdab3f669443a67d6b2cd68b4d14ac69.png ../../_images/fd41d3c92995300278150e2a5176ecddc7d719d83b5b3536e5fc8f7ed10886d4.png ../../_images/68492bfffc68f0c025e54db55fe37106f8b847705e3c8ab3fcb7a5749fdf1561.png ../../_images/90d857029a5b986c8c25ff6dccd4b751c9fcdb433da35eb15fe6fbeee402b08b.png

Step 5: Correct turbine wind directions for bias#

The next step is to apply the northing corrections directly on the data.

def apply_bias_corrections(df_scada, wd_bias_list):
    # Copy dataframe
    df_out = df_scada.copy()

    # Load the SCADA data
    num_turbines = dfm.get_num_turbines(df_scada)

    # Set turbine-individual bias corrections
    for ti in range(num_turbines):
        bias = wd_bias_list[ti]
        print("Removing {:.2f} deg bias for ti = {:03d}.".format(bias, ti))
        df_out["wd_{:03d}".format(ti)] = wrap_360(df_out["wd_{:03d}".format(ti)] - bias)

    return df_out


# Get bias corrections
print("wd_bias_list: {}".format(wd_bias_list))
df_scada_homogenized = apply_bias_corrections(
    df_scada=df_scada_homogenized.copy(), wd_bias_list=wd_bias_list
)
wd_bias_list: [ 2.50000e-04  1.49625e+01 -4.49625e+01  0.00000e+00  0.00000e+00
  0.00000e+00  2.50000e-04]
Removing 0.00 deg bias for ti = 000.
Removing 14.96 deg bias for ti = 001.
Removing -44.96 deg bias for ti = 002.
Removing 0.00 deg bias for ti = 003.
Removing 0.00 deg bias for ti = 004.
Removing 0.00 deg bias for ti = 005.
Removing 0.00 deg bias for ti = 006.

Step 6: Deal with inter-turbine faults#

Deal with faults at one turbine causing issues at another turbine. For example, if a turbine is shedding a wake on a second turbine, then for a fair comparison both of these two turbines should be operating normally. If the upstream turbine is curtailed or offline, the power production of the downstream turbine also changes. Hence, if we are unsure about the operating mode of one machine, we cannot make accurate FLORIS predictions on the second turbine either. In this scenario, we would classify the second turbine's measurement as faulty too, because of this.

def filter_for_faults_in_impacting_turbines(df):
    # Determine which turbines impact which other turbines through their wakes
    print("Calculating the 'df_impacting_turbines' matrix...")
    df_impacting_turbines = ftools.get_all_impacting_turbines(
        fm_in=fm,
        wd_array=np.arange(0.0, 360.0, 3.0),
        change_threshold=0.005,
        ws_test=9.0,
    )
    print(df_impacting_turbines)

    # Filter the measurements for each turbine: make sure all
    # other turbines affecting this turbine's
    # power production are marked as good measurements. If they are not,
    # then classify this turbine's
    # measurement as faulty too.
    num_turbines = dfm.get_num_turbines(df)
    for ti in range(num_turbines):
        # Assign a reference wind direction for this turbine. In this case,
        # we have such a small farm so we assume that the farm average wind
        # direction of representative of every turbine.
        df = dfm.set_wd_by_all_turbines(df)

        df_scada = filt.filter_df_by_faulty_impacting_turbines(
            df=df,
            ti=ti,
            df_impacting_turbines=df_impacting_turbines,
            verbose=True,
        )

    return df_scada


df_scada_northing_calibrated_interturbine_filtered = filter_for_faults_in_impacting_turbines(
    df=df_scada_homogenized.copy()
)
floris.floris_model.FlorisModel WARNING Deleting stored wind_data information.
Calculating the 'df_impacting_turbines' matrix...
floris.floris_model.FlorisModel WARNING Deleting stored wind_data information.
floris.floris_model.FlorisModel WARNING Deleting stored wind_data information.
floris.floris_model.FlorisModel WARNING Deleting stored wind_data information.
floris.floris_model.FlorisModel WARNING Deleting stored wind_data information.
floris.floris_model.FlorisModel WARNING Deleting stored wind_data information.
floris.floris_model.FlorisModel WARNING Deleting stored wind_data information.
2024-12-02 11:23:51 Faulty measurements for WTG 00 increased from 0.000 % to 0.000 %. Reason: 'Turbine is impacted by faulty upstream turbine'.
2024-12-02 11:23:51 Faulty measurements for WTG 01 increased from 0.000 % to 0.000 %. Reason: 'Turbine is impacted by faulty upstream turbine'.
2024-12-02 11:23:51 Faulty measurements for WTG 02 increased from 0.000 % to 0.000 %. Reason: 'Turbine is impacted by faulty upstream turbine'.
2024-12-02 11:23:51 Faulty measurements for WTG 03 increased from 0.000 % to 0.000 %. Reason: 'Turbine is impacted by faulty upstream turbine'.
2024-12-02 11:23:51 Faulty measurements for WTG 04 increased from 0.000 % to 0.000 %. Reason: 'Turbine is impacted by faulty upstream turbine'.
2024-12-02 11:23:51 Faulty measurements for WTG 05 increased from 0.000 % to 0.000 %. Reason: 'Turbine is impacted by faulty upstream turbine'.
2024-12-02 11:23:51 Faulty measurements for WTG 06 increased from 0.000 % to 0.000 %. Reason: 'Turbine is impacted by faulty upstream turbine'.
            0    1       2   3   4   5   6
wd                                        
0.0       [6]  [5]     [3]  []  []  []  []
3.0       [6]  [5]     [3]  []  []  []  []
6.0       [6]  [5]     [3]  []  []  []  []
9.0       [6]  [5]     [3]  []  []  []  []
12.0       []  [5]     [3]  []  []  []  []
...       ...  ...     ...  ..  ..  ..  ..
345.0  [6, 5]  [5]     [3]  []  []  []  []
348.0  [6, 5]  [5]  [3, 5]  []  []  []  []
351.0     [6]  [5]     [3]  []  []  []  []
354.0     [6]  [5]     [3]  []  []  []  []
357.0     [6]  [5]  [3, 5]  []  []  []  []

[120 rows x 7 columns]

Show the final yaw angles#

# Show the effects of homogenization
# Show the wd channels for the turbines
fig, ax = plt.subplots(figsize=(12, 6))
ax.plot(
    df_scada_homogenized["time"],
    df_scada_homogenized["wd_001"],
    label="wd_001 (Fixed Bias)",
    color="blue",
)
ax.plot(
    df_scada_homogenized["time"],
    df_scada_homogenized["wd_002"],
    label="wd_002 (Bias Changes)",
    color="red",
)
ax.plot(
    df_scada_homogenized["time"],
    df_scada_homogenized["wd_000"],
    label="wd_000",
    color="k",
    alpha=0.5,
)
ax.plot(
    df_scada_homogenized["time"],
    df_scada_homogenized["wd_003"],
    label="wd_003",
    color="k",
    alpha=0.5,
)
ax.plot(
    df_scada_homogenized["time"],
    df_scada_homogenized["wd_004"],
    label="wd_004",
    color="k",
    alpha=0.5,
)
ax.plot(
    df_scada_homogenized["time"],
    df_scada_homogenized["wd_005"],
    label="wd_005",
    color="k",
    alpha=0.5,
)
ax.plot(
    df_scada_homogenized["time"],
    df_scada_homogenized["wd_006"],
    label="wd_006",
    color="k",
    alpha=0.5,
)
ax.legend()
ax.set_xlabel("Time")
ax.set_ylabel("Wind direction (deg)")
Text(0, 0.5, 'Wind direction (deg)')
../../_images/b0242e5201b07e8f1cdb2e0810ce8aa6d8752fa8c65f24aa8d10b4b654a38587.png