Newer
Older
from py_wake.site._site import UniformWeibullSite, UniformSite
import numpy as np
from py_wake.tests import npt
import pytest
from py_wake.examples.data.ParqueFicticio import ParqueFicticio_path
from py_wake.examples.data.ParqueFicticio.parque_ficticio import ParqueFicticioSite

Mads M. Pedersen
committed
from py_wake.site.wasp_grid_site import WaspGridSite, WaspGridSiteBase
import os
import time
from py_wake.tests.test_files.wasp_grid_site import one_layer

Mads M. Pedersen
committed
from py_wake.site.distance import TerrainFollowingDistance, StraightDistance, TerrainFollowingDistance2
@pytest.fixture
def site():
return ParqueFicticioSite()

Mads M. Pedersen
committed
@pytest.fixture
def site2():
site = ParqueFicticioSite(distance=TerrainFollowingDistance2())
x, y = site.initial_position.T
return site, x, y
def test_WaspGridSiteDistanceClass(site):
wgs = WaspGridSite(site._ds, distance=TerrainFollowingDistance(distance_resolution=2000))
assert wgs.distance_resolution == 2000
assert wgs.distances.__func__ == TerrainFollowingDistance.distances
wgs = WaspGridSite(site._ds, distance=StraightDistance())
assert wgs.distances.__func__ == StraightDistance.distances
def test_local_wind(site):
x_i, y_i = site.initial_position.T
h_i = x_i * 0 + 70
wdir_lst = np.arange(0, 360, 90)
wsp_lst = np.arange(3, 6)
WD_ilk, WS_ilk, TI_ilk, P_ilk = site.local_wind(x_i=x_i, y_i=y_i, h_i=h_i, wd=wdir_lst, ws=wsp_lst)
npt.assert_array_equal(WS_ilk.shape, (8, 4, 3))
WD_ilk, WS_ilk, TI_ilk, P_ilk = site.local_wind(x_i=x_i, y_i=y_i, h_i=h_i)
npt.assert_array_equal(WS_ilk.shape, (8, 360, 23))
# check probability local_wind()[-1]
npt.assert_almost_equal(site.local_wind(x_i=x_i, y_i=y_i, h_i=h_i, wd=[0], ws=[10])[-1],
site.local_wind(x_i=x_i, y_i=y_i, h_i=h_i, wd=[0], ws=[10], wd_bin_size=2)[-1] * 180, 6)
z = np.arange(30, 100)
zero = [0] * len(z)
ws = site.local_wind(x_i=x_i[:1], y_i=y_i[:1], h_i=z, wd=[0], ws=[10])[1][:, 0, 0]
ws35 = site.local_wind(x_i=x_i[:1], y_i=y_i[:1], h_i=[35], wd=[0], ws=[10])[1][:, 0, 0]
z0 = 10
if 0:
import matplotlib.pyplot as plt
plt.plot(ws, z)
plt.plot(ws35 * np.log(z / z0) / np.log(35 / z0), z)
plt.show()
# npt.assert_array_equal(10 * (z / 50)**.3, ws)

Mads M. Pedersen
committed
@pytest.mark.parametrize('site,dw_ref', [
(ParqueFicticioSite(distance=TerrainFollowingDistance2()),
[0., 207.7973259, 484.8129285, 727.1261764, 1039.5612311, 1263.5467003, 1490.7972623, 1841.0639107]),
(ParqueFicticioSite(distance=TerrainFollowingDistance()),
[0, 209.803579, 480.8335365, 715.6003233, 1026.9476322, 1249.5510034, 1475.1467251, 1824.1317343]),
(ParqueFicticioSite(distance=StraightDistance()),
[-0, 207, 477, 710, 1016, 1236, 1456, 1799])])
def test_distances(site, dw_ref):

Mads M. Pedersen
committed
dw_ijl, cw_ijl, dh_ijl, dwo = site.distances(src_x_i=x, src_y_i=y, src_h_i=np.array([70]),
dst_x_j=x, dst_y_j=y, dst_h_j=np.array([70]),
wd_il=np.array([[0]]))
npt.assert_almost_equal(dw_ijl[0, :, 0], dw_ref)
cw_ref = [236.1, 0., -131.1, -167.8, -204.5, -131.1, -131.1, -45.4]
npt.assert_almost_equal(cw_ijl[:, 1, 0], cw_ref)
npt.assert_almost_equal(dh_ijl, np.zeros_like(dh_ijl))
def test_distances_different_points(site2):
site, x, y = site2
with pytest.raises(NotImplementedError):
site.distances(src_x_i=x, src_y_i=y, src_h_i=np.array([70]),
dst_x_j=x[1:], dst_y_j=y[1:], dst_h_j=np.array([70]),
wd_il=np.array([[0]]))
# def test_distances_wd_shape():
# site = ParqueFicticioSite(distance=TerrainFollowingDistance2())
# x, y = site.initial_position.T
# dw_ijl, cw_ijl, dh_ijl, dwo = site.distances(src_x_i=x, src_y_i=y, src_h_i=np.array([70]),
# dst_x_j=x, dst_y_j=y, dst_h_j=np.array([70]),
# wd_il=np.ones((len(x), 1)) * 180)
# npt.assert_almost_equal(dw_ijl[0, :, 0], np.array([0., -207., -477., -710., -1016., -1236., -1456., -1799.]))
# npt.assert_almost_equal(cw_ijl[:, 1, 0], np.array([-236.1, 0., 131.1, 167.8, 204.5, 131.1, 131.1, 45.4]))
# npt.assert_almost_equal(dh_ijl, np.zeros_like(dh_ijl))
def test_speed_up_using_pickle():
pkl_fn = ParqueFicticio_path + "ParqueFicticio.pkl"
if os.path.exists(pkl_fn):
os.remove(pkl_fn)
start = time.time()

Mads M. Pedersen
committed
site = WaspGridSiteBase.from_wasp_grd(ParqueFicticio_path, speedup_using_pickle=False)

Mads M. Pedersen
committed
site = WaspGridSiteBase.from_wasp_grd(ParqueFicticio_path, speedup_using_pickle=True)

Mads M. Pedersen
committed
site = WaspGridSiteBase.from_wasp_grd(ParqueFicticio_path, speedup_using_pickle=True)
time_w_pkl = time.time() - start
npt.assert_array_less(time_w_pkl * 10, time_wo_pkl)
def test_interp_funcs_initialization_missing_key(site):

Mads M. Pedersen
committed
site = ParqueFicticioSite(distance=TerrainFollowingDistance2())
site.interp_funcs_initialization(['missing'])
def test_one_layer():

Mads M. Pedersen
committed
site = WaspGridSiteBase.from_wasp_grd(os.path.dirname(one_layer.__file__) + "/", speedup_using_pickle=False)
def test_missing_path():
with pytest.raises(NotImplementedError):

Mads M. Pedersen
committed
WaspGridSiteBase.from_wasp_grd("missing_path/", speedup_using_pickle=True)
with pytest.raises(Exception, match='Path was not a directory'):

Mads M. Pedersen
committed
WaspGridSiteBase.from_wasp_grd("missing_path/", speedup_using_pickle=False)
def test_elevation(site):
x_i, y_i = site.initial_position.T
npt.assert_array_less(np.abs(site.elevation(x_i=x_i, y_i=y_i) -
[519.4, 567.7, 583.6, 600, 574.8, 559.9, 517.7, 474.5] # ref from wasp
), 5)

Mads M. Pedersen
committed
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
def test_plot_map(site):
import matplotlib.pyplot as plt
with pytest.raises(AttributeError, match="missing not found in dataset. Available data variables are:\nws_mean,"):
site.plot_map('missing')
with pytest.raises(AttributeError, match=r"Sector None not found. Available sectors are: \[ 1"):
site.plot_map('ws_mean')
with pytest.raises(AttributeError, match="Height missing for 'ws_mean'"):
site.plot_map('ws_mean', sector=1)
site.plot_map('elev')
plt.figure()
site.plot_map('ws_mean', 80, sector=1)
if 0:
plt.show()
def test_elevation_outside_map(site):
import matplotlib.pyplot as plt
site.plot_map('elev')
x = np.linspace(262500, 265500, 500)
y = x * 0 + 6505450
plt.plot(x, y, '--', label='Terrain line')
plt.plot(x, y + site.elevation(x, y), label='Elevation')
npt.assert_array_equal(np.round(site.elevation(x, y)[::50]),
[np.nan, np.nan, 303, 390, 491, 566, 486, 524, np.nan, np.nan])
if 0:
plt.legend()
plt.show()
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
def test_plot_ws_distribution(site):
x, y = site.initial_position[0]
p1 = site.plot_ws_distribution(x=x, y=y, h=70, wd=[0, 90, 180, 270])
p2 = site.plot_ws_distribution(x=x, y=y, h=70, wd=[0, 90, 180, 270], include_wd_distribution=True)
if 0:
import matplotlib.pyplot as plt
plt.show()
# print(np.round(p1[::30], 4).tolist())
npt.assert_array_almost_equal(p1[::30], [0.0001, 0.0042, 0.0072, 0.0077, 0.0063,
0.0041, 0.0021, 0.0009, 0.0003, 0.0001], 4)
# print(np.round(p2[::30], 4).tolist())
npt.assert_array_almost_equal(p2[::30], [0.0001, 0.0021, 0.0033, 0.0033, 0.0025,
0.0014, 0.0007, 0.0002, 0.0001, 0.0], 4)
def test_plot_wd_distribution(site):
x, y = site.initial_position[0]
import matplotlib.pyplot as plt
p = site.plot_wd_distribution(x=x, y=y, h=70, n_wd=12, ax=plt)
# print(np.round(p, 3).tolist())
npt.assert_array_almost_equal(p, [0.052, 0.043, 0.058, 0.085, 0.089, 0.061,
0.047, 0.083, 0.153, 0.152, 0.108, 0.068], 3)
if 0:
plt.show()
def test_plot_wd_distribution_with_ws_levels(site):
x, y = site.initial_position[0]
p = site.plot_wd_distribution(x=x, y=y, n_wd=12, ws_bins=[0, 5, 10, 15, 20, 25])
# print(np.round(p, 3).tolist())
npt.assert_array_almost_equal(p, [[0.031, 0.019, 0.003, 0.0, 0.0],
[0.023, 0.018, 0.002, 0.0, 0.0],
[0.018, 0.032, 0.007, 0.0, 0.0],
[0.018, 0.048, 0.018, 0.001, 0.0],
[0.024, 0.052, 0.014, 0.0, 0.0],
[0.029, 0.031, 0.003, 0.0, 0.0],
[0.023, 0.022, 0.002, 0.0, 0.0],
[0.022, 0.041, 0.016, 0.002, 0.0],
[0.023, 0.062, 0.048, 0.016, 0.003],
[0.027, 0.058, 0.044, 0.018, 0.004],
[0.034, 0.044, 0.023, 0.007, 0.001],
[0.036, 0.026, 0.006, 0.001, 0.0]], 3)
if 0:
import matplotlib.pyplot as plt
plt.show()