Skip to content
Snippets Groups Projects
Commit 622ce368 authored by Mads M. Pedersen's avatar Mads M. Pedersen
Browse files

Add MirrorSquaredSum

parent e76210ca
No related branches found
No related tags found
No related merge requests found
......@@ -19,13 +19,21 @@ class Mirror(GroundModel):
"""
args4deficit = ['dh_ijl', 'h_il', 'hcw_ijlk']
def __call__(self, calc_deficit, **kwargs):
def _calc(self, calc_deficit, **kwargs):
dh_ijl_mirror = 2 * kwargs['h_il'][:, na] + kwargs['dh_ijl']
cw_ijlk_mirror = None
if 'cw_ijlk' in kwargs:
cw_ijlk_mirror = np.sqrt(dh_ijl_mirror[..., na]**2, kwargs['hcw_ijlk']**2)
deficit_ijlk = np.sum([calc_deficit(**kwargs),
calc_deficit(dh_ijl=dh_ijl_mirror,
cw_ijlk=cw_ijlk_mirror,
**{k: v for k, v in kwargs.items() if k not in ['dh_ijl', 'cw_ijlk']})], 0)
return deficit_ijlk * ((kwargs['h_il'][:, na] + kwargs['dh_ijl'])[..., na] > 0) # remove deficit below ground
cw_ijlk_mirror = np.sqrt(dh_ijl_mirror[..., na]**2 + kwargs['hcw_ijlk']**2)
above_ground = ((kwargs['h_il'][:, na] + kwargs['dh_ijl'])[..., na] > 0)
return np.array([calc_deficit(**kwargs),
calc_deficit(dh_ijl=dh_ijl_mirror,
cw_ijlk=cw_ijlk_mirror,
**{k: v for k, v in kwargs.items() if k not in ['dh_ijl', 'cw_ijlk']})]) * above_ground[na]
def __call__(self, calc_deficit, **kwargs):
return np.sum(self._calc(calc_deficit, **kwargs), 0)
class MirrorSquaredSum(Mirror):
def __call__(self, calc_deficit, **kwargs):
return np.sqrt(np.sum(self._calc(calc_deficit, **kwargs)**2, 0))
......@@ -158,7 +158,7 @@ def test_fuga_table_edges():
flow_map_cw = fuga([0], [0], wd=270, ws=10).flow_map(HorizontalGrid([0], np.arange(-20 * D, 20 * D)))
flow_map = fuga([0], [0], wd=270, ws=10).flow_map(HorizontalGrid(np.arange(-150, 400) * D, np.arange(-20, 21) * D))
if 1:
if 0:
plt.plot(flow_map_dw.x / D, flow_map_dw.WS_eff.squeeze())
plt.grid()
plt.ylim([9.9, 10.1])
......@@ -190,7 +190,7 @@ def test_fuga_wriggles():
flow_map_cw_lst = np.array([fuga([0], [0], wd=270, ws=10).flow_map(HorizontalGrid([dw * D], y)).WS_eff.squeeze()
for dw in dw_lst])
if 1:
if 0:
for flow_map_cw, dw in zip(flow_map_cw_lst, dw_lst):
plt.plot(y, flow_map_cw, label="%dD" % dw)
plt.xlabel('y [m]')
......
......@@ -7,7 +7,7 @@ from py_wake.flow_map import YZGrid
import numpy as np
from py_wake.tests import npt
from py_wake.wind_turbines import WindTurbines, OneTypeWindTurbines
from py_wake.superposition_models import LinearSum
from py_wake.superposition_models import LinearSum, SquaredSum
from py_wake.wind_farm_models.engineering_models import PropagateDownwind, All2AllIterative
import pytest
from py_wake.deficit_models.gaussian import BastankhahGaussianDeficit, IEA37SimpleBastankhahGaussianDeficit,\
......@@ -15,9 +15,11 @@ from py_wake.deficit_models.gaussian import BastankhahGaussianDeficit, IEA37Simp
from py_wake.deficit_models.fuga import FugaDeficit
from py_wake.deficit_models.gcl import GCLDeficit
from py_wake.turbulence_models.stf import STF2017TurbulenceModel
from py_wake.ground_models.ground_models import MirrorSquaredSum
def test_Mirror_NOJ():
# Compare points in flow map with ws of WT at same position
site = UniformSite([1], ti=0.1)
V80_D0 = V80()
V80_D0._diameters = [0]
......@@ -40,11 +42,14 @@ def test_Mirror_NOJ():
plt.legend()
plt.show()
plt.close()
print(res)
npt.assert_array_equal(res, ref)
@pytest.mark.parametrize('wfm_cls', [PropagateDownwind, All2AllIterative])
def test_Mirror(wfm_cls):
# Compare points in flow map with ws of WT at same position. All2Alliterative failing with NOJ and WT.diameter=0
# and therefore this cannot be tested above
site = UniformSite([1], ti=0.1)
wt = V80()
wfm = wfm_cls(site, wt, ZongGaussianDeficit(a=[0, 1]),
......@@ -70,10 +75,12 @@ def test_Mirror(wfm_cls):
@pytest.mark.parametrize('wfm_cls', [PropagateDownwind, All2AllIterative])
def test_Mirror_flow_map(wfm_cls):
@pytest.mark.parametrize('groundModel,superpositionModel', [(Mirror(), LinearSum()),
(MirrorSquaredSum(), SquaredSum())])
def test_Mirror_flow_map(wfm_cls, groundModel, superpositionModel):
site = UniformSite([1], ti=0.1)
wt = V80()
wfm = NOJ(site, wt, k=.5, superpositionModel=LinearSum())
wfm = NOJ(site, wt, k=.5, superpositionModel=superpositionModel)
fm_ref = wfm([0, 0 + 1e-20], [0, 0 + 1e-20], wd=0, h=[50, -50]
).flow_map(YZGrid(x=0, y=np.arange(-100, 100, 1) + .1, z=np.arange(1, 100)))
......@@ -81,7 +88,7 @@ def test_Mirror_flow_map(wfm_cls):
plt.title("Underground WT added manually")
plt.figure()
wfm = wfm_cls(site, wt, NOJDeficit(k=.5), groundModel=Mirror())
wfm = wfm_cls(site, wt, NOJDeficit(k=.5), groundModel=groundModel, superpositionModel=superpositionModel)
fm_res = wfm([0], [0], wd=0, h=[50]).flow_map(YZGrid(x=0, y=np.arange(-100, 100, 1) + .1, z=np.arange(1, 100)))
fm_res.plot_wake_map()
plt.title("With Mirror GroundModel")
......
......@@ -37,3 +37,7 @@ def test_notebooks(notebook):
Grid.default_resolution = default_resolution
plt.close()
plt.rcParams.update({'figure.max_open_warning': 20})
if __name__ == '__main__':
print("\n".join([f.filename for f in get_notebooks()]))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment