-
Mads M. Pedersen authored
Added different superposition models for turbulence intensity, as StenFrandsen uses effective turbulence intensity instead of the usual added turbulence intensity
Mads M. Pedersen authoredAdded different superposition models for turbulence intensity, as StenFrandsen uses effective turbulence intensity instead of the usual added turbulence intensity
test_superposition_models.py 3.03 KiB
import pytest
import numpy as np
from py_wake import NOJ
from py_wake.site._site import UniformSite
from py_wake.superposition_models import LinearSum, SquaredSum, MaxSum
from py_wake.tests import npt
from py_wake.wind_farm_models.engineering_models import PropagateDownwind, All2AllIterative
from py_wake.deficit_models.noj import NOJDeficit
from py_wake.flow_map import HorizontalGrid
from py_wake.tests.test_wind_farm_models.test_noj import NibeA0
d02 = 8.1 - 5.7
d12 = 8.1 - 4.90473373
@pytest.mark.parametrize('superpositionModel,res', [(LinearSum(), 8.1 - (d02 + d12)),
(SquaredSum(), 8.1 - np.hypot(d02, d12)),
(MaxSum(), 8.1 - d12)])
def test_superposition_models(superpositionModel, res):
site = UniformSite([1], 0.1)
wake_model = NOJ(site, NibeA0, superpositionModel=superpositionModel)
x_i = [0, 0, 0]
y_i = [0, -40, -100]
h_i = [50, 50, 50]
WS_eff_ilk = wake_model.calc_wt_interaction(x_i, y_i, h_i, [0, 0, 1], 0.0, 8.1)[0]
npt.assert_array_almost_equal(WS_eff_ilk[-1, 0, 0], res)
@pytest.mark.parametrize('superpositionModel,sum_func', [(LinearSum(), np.sum),
(SquaredSum(), lambda x: np.hypot(*x)),
(MaxSum(), np.max)])
def test_superposition_model_indices(superpositionModel, sum_func):
class WTSite(UniformSite):
def local_wind(self, x_i=None, y_i=None, h_i=None, wd=None, ws=None, wd_bin_size=None, ws_bins=None):
lw = UniformSite.local_wind(self, x_i=x_i, y_i=y_i, h_i=h_i, wd=wd, ws=ws,
wd_bin_size=wd_bin_size, ws_bins=ws_bins)
lw.WS_ilk += np.arange(len(x_i))[:, np.newaxis, np.newaxis]
return lw
site = WTSite([1], 0.1)
x_i = [0, 0, 0]
y_i = [0, -40, -100]
h_i = [50, 50, 50]
# WS_ilk different at each wt position
WS_ilk = site.local_wind(x_i, y_i, h_i, wd=0, ws=8.1).WS_ilk
npt.assert_array_equal(WS_ilk, np.reshape([8.1, 9.1, 10.1], (3, 1, 1)))
for wake_model in [PropagateDownwind(site, NibeA0, wake_deficitModel=NOJDeficit(), superpositionModel=superpositionModel),
All2AllIterative(site, NibeA0, wake_deficitModel=NOJDeficit(), superpositionModel=superpositionModel)]:
# No wake (ct = 0), i.e. WS_eff == WS
WS_eff_ilk = wake_model.calc_wt_interaction(x_i, y_i, h_i, [1, 1, 1], 0.0, 8.1)[0]
npt.assert_array_equal(WS_eff_ilk, WS_ilk)
ref = WS_ilk - np.reshape([0, 3.75, sum_func([2.4, 3.58974359])], (3, 1, 1))
# full wake (CT=8/9)
WS_eff_ilk = wake_model.calc_wt_interaction(x_i, y_i, h_i, [0, 0, 0], 0.0, 8.1)[0]
npt.assert_array_almost_equal(WS_eff_ilk, ref
)
sim_res = wake_model(x_i, y_i, h_i, [0, 0, 0], 0.0, 8.1)
WS_eff_ilk = sim_res.flow_map(HorizontalGrid(x=[0], y=y_i, h=50)).WS_eff_xylk[:, 0]
npt.assert_array_almost_equal(WS_eff_ilk, ref)