def test_interpolation_speed(): import xarray as xr da = xr.DataArray(np.sin(0.3 * np.arange(20).reshape(5, 4)), [('x', np.arange(5)), ('y', [0.1, 0.2, 0.3, 0.4])]) x = xr.DataArray([0.5, 1.5, 2.5], dims='z') y = xr.DataArray([0.15, 0.25, 0.35], dims='z') da.interp(x=x, y=y) site = ParqueFicticioSite() x, y = site.initial_position.T X, Y, x_j, y_j, h_j = HorizontalGrid()(x, y, 70) wd = [270] # site.default_wd ws = site.default_ws res1, t_lst = timeit(site.interp_funcs['A'])( (x_j, y_j, h_j, x_j * 0 + 270)) print(res1.shape) res2, t_lst = timeit(lambda x, y, z, sec: site._ds.A.interp( x=xr.DataArray(x, dims='z'), y=xr.DataArray(y, dims='z'), z=xr.DataArray(z, dims='z'), sec=xr.DataArray(sec, dims='z')).data)(x_j, y_j, h_j, x_j * 0 + 10) npt.assert_array_almost_equal(res1, res2) if 0: c = plt.contourf(X, Y, res1.reshape(X.shape)) plt.colorbar(c) plt.figure() c = plt.contourf(X, Y, res2.reshape(X.shape)) plt.colorbar(c) plt.show()
def test_multiprocessing_wd(): pool = multiprocessing.Pool(4) aep1, t_lst1 = timeit(aep_wd, min_runs=1)((wt_x, wt_y, wd_lst)) aep2, t_lst2 = timeit(aep_all_multiprocessing, min_runs=1)(pool, wt_x, wt_y) t1, t2 = np.mean(t_lst1), np.mean(t_lst2) print("1 CPU: %.2fs, %d CPUs: %.2fs, speedup: %d%%" % (t1, pool._processes, t2, (t1 - t2) / t1 * 100)) npt.assert_almost_equal(aep1, aep2 / 36)
def compare_speed(): x = np.arange(0, 100) y = np.arange(10, 100) z = np.arange(30, 33) wd = np.arange(360) ws = np.arange(3, 26) V = np.random.rand(len(x), len(y), len(z), len(wd), len(ws)) print(V.shape) for x in [x, np.r_[x[:-1], 100]]: da = xr.DataArray(V, coords=[('x', x), ('y', y), ('z', z), ('wd', wd), ('ws', ws)]) coords = xr.Dataset(coords={'wd': np.arange(360), 'ws': [9, 10], 'i': np.arange(16), 'x': ('i', np.linspace(0, 9, 16)), 'y': ('i', np.linspace(10, 20, 16)), 'z': ('i', np.linspace(30, 32, 16))}) x1, t1 = timeit(da.sel_interp_all, verbose=True)(coords) I, L, K = len(coords.x), len(coords.wd), len(coords.ws) def interp(): c = np.array([coords.x.data.repeat(L * K), coords.y.data.repeat(L * K), coords.z.data.repeat(L * K), np.tile(coords.wd.data.repeat(K), I), np.tile(coords.ws.data, I * L)]).T return GridInterpolator([x, y, z, wd, ws], da.values)(c) x2, t2 = timeit(interp, verbose=True, line_profile=0, profile_funcs=[GridInterpolator.__call__])() npt.assert_array_almost_equal(x1, x2.reshape(16, len(coords.wd), len(coords.ws))) print(np.mean(t1) / np.mean(t2))
def test_multiprocessing_xy(): pool = multiprocessing.Pool(2) arg_lst = [(np.array(wt_x) + i, wt_y) for i in range(4)] aep1, t_lst1 = timeit(lambda arg_lst: [aep_xy(arg) for arg in arg_lst], min_time=0, min_runs=1)(arg_lst) aep2, t_lst2 = timeit(lambda arg_lst: pool.map(aep_xy, arg_lst), min_time=0, min_runs=1)(arg_lst) t1, t2 = np.mean(t_lst1), np.mean(t_lst2) print("1 CPU: %.2fs, %d CPUs: %.2fs, speedup: %d%%" % (t1, pool._processes, t2, (t1 - t2) / t1 * 100)) npt.assert_almost_equal(aep1, aep2)
def test_multiprocessing_wfm_xy(): pool = multiprocessing.Pool(2) arg_lst = [(get_wfm(grad=False), np.array(wt_x) + i, wt_y) for i in range(4)] aep1, t_lst1 = timeit(lambda arg_lst: [aep_wfm_xy(arg) for arg in arg_lst])(arg_lst) aep2, t_lst2 = timeit(lambda arg_lst: pool.map(aep_wfm_xy, arg_lst))(arg_lst) t1, t2 = np.mean(t_lst1), np.mean(t_lst2) if debug: print("1 CPU: %.2fs, %d CPUs: %.2fs, speedup: %d%%" % (t1, pool._processes, t2, (t1 - t2) / t1 * 100)) npt.assert_almost_equal(aep1, aep2)
def test_multiprocessing_wd(pool): # compare result of vectorized call 12wd with result of multiprocessing 1wd/cpu # Slow down is expected aep1, t_lst1 = timeit(aep_wd, min_runs=1)((wt_x, wt_y, wd_lst)) aep2, t_lst2 = timeit(aep_all_multiprocessing, min_runs=1)(pool, wt_x, wt_y) t1, t2 = np.mean(t_lst1), np.mean(t_lst2) if debug: print("1 CPU, 12wd/CPU: %.2fs, %d CPUs, 1wd/CPU: %.2fs, speedup: %d%%" % (t1, pool._processes, t2, (t1 - t2) / t1 * 100)) npt.assert_almost_equal(aep1, aep2 / len(wd_lst))
def test_GCL_ex80(): site = Hornsrev1Site() x, y = site.initial_position.T windTurbines = V80() wfm = PropagateDownwind(site, windTurbines, wake_deficitModel=GCLDeficit(), superpositionModel=LinearSum()) if 0: windTurbines.plot(x, y) plt.show() sim_res = timeit(wfm.__call__, line_profile=0, profile_funcs=[get_dU], verbose=0)(x, y, ws=np.arange(10, 15))[0] # test that the result is equal to previuos runs (no evidens that these number are correct) aep_ref = 1055.956615887197 npt.assert_almost_equal( sim_res.aep_ilk(normalize_probabilities=True).sum(), aep_ref, 5) sim_res = wfm(x, y, ws=np.arange(3, 10)) npt.assert_array_almost_equal( sim_res.aep_ilk(normalize_probabilities=True).sum(), 261.6143039016946, 5)
def test_fuga(): # move turbine 1 600 300 wt_x = [-250, 600, -500, 0, 500, -250, 250] wt_y = [433, 300, 0, 0, 0, -433, -433] wts = HornsrevV80() path = tfp + 'fuga/2MW/Z0=0.03000000Zi=00401Zeta0=0.00E+0/' site = UniformSite([1, 0, 0, 0], ti=0.075) wake_model = Fuga(path, site, wts) res, _ = timeit(wake_model.__call__, verbose=0, line_profile=0, profile_funcs=[FugaDeficit.interpolate, LUTInterpolator.__call__, GridInterpolator.__call__])(x=wt_x, y=wt_y, wd=[30], ws=[10]) npt.assert_array_almost_equal(res.WS_eff_ilk.flatten(), [10.002683492812844, 10.0, 8.413483643142389, 10.036952526815286, 9.371203842245153, 8.437429367715435, 8.012759083790058], 8) npt.assert_array_almost_equal(res.ct_ilk.flatten(), [0.79285509, 0.793, 0.80641348, 0.79100456, 0.80180315, 0.80643743, 0.80601276], 8) x_j = np.linspace(-1500, 1500, 500) y_j = np.linspace(-1500, 1500, 300) wake_model = Fuga(path, site, wts) sim_res = wake_model(wt_x, wt_y, wd=[30], ws=[10]) flow_map70 = sim_res.flow_map(HorizontalGrid(x_j, y_j, h=70)) flow_map73 = sim_res.flow_map(HorizontalGrid(x_j, y_j, h=73)) X, Y = flow_map70.XY Z70 = flow_map70.WS_eff_xylk[:, :, 0, 0] Z73 = flow_map73.WS_eff_xylk[:, :, 0, 0] if 0: flow_map70.plot_wake_map(levels=np.arange(6, 10.5, .1)) plt.plot(X[0], Y[140]) plt.figure() plt.plot(X[0], Z70[140, :], label="Z=70m") plt.plot(X[0], Z73[140, :], label="Z=73m") plt.plot(X[0, 100:400:10], Z70[140, 100:400:10], '.') print(list(np.round(Z70.data[140, 100:400:10], 4))) print(list(np.round(Z73.data[140, 100:400:10], 4))) plt.legend() plt.show() npt.assert_array_almost_equal( Z70[140, 100:400:10], [10.0467, 10.0473, 10.0699, 10.0093, 9.6786, 7.8589, 6.8539, 9.2199, 9.9837, 10.036, 10.0796, 10.0469, 10.0439, 9.1866, 7.2552, 9.1518, 10.0449, 10.0261, 10.0353, 9.9256, 9.319, 8.0062, 6.789, 8.3578, 9.9393, 10.0332, 10.0183, 10.0186, 10.0191, 10.0139], 4) npt.assert_array_almost_equal( Z73[140, 100:400:10], [10.0463, 10.0468, 10.0688, 10.0075, 9.6778, 7.9006, 6.9218, 9.228, 9.9808, 10.0354, 10.0786, 10.0464, 10.0414, 9.1973, 7.3099, 9.1629, 10.0432, 10.0257, 10.0344, 9.9236, 9.3274, 8.0502, 6.8512, 8.3813, 9.9379, 10.0325, 10.018, 10.0183, 10.019, 10.0138], 4)
def test_neighbour_farm_speed(): # import and setup site and windTurbines site = IEA37Site(16) # setup current, neighbour and all positions wt_x, wt_y = site.initial_position.T neighbour_x, neighbour_y = wt_x - 4000, wt_y all_x, all_y = np.r_[wt_x, neighbour_x], np.r_[wt_y, neighbour_y] windTurbines = WindTurbines.from_WindTurbines([IEA37_WindTurbines(), IEA37_WindTurbines()]) windTurbines._names = ["Current wind farm", "Neighbour wind farm"] types = [0] * len(wt_x) + [1] * len(neighbour_x) wf_model = PropagateDownwind(site, windTurbines, wake_deficitModel=BastankhahGaussianDeficit(use_effective_ws=True), superpositionModel=LinearSum()) # Consider wd=270 +/- 30 deg only wd_lst = np.arange(240, 301) sim_res, t = timeit(wf_model, verbose=False)(all_x, all_y, type=types, ws=9.8, wd=wd_lst) if 1: ext = 100 flow_box = wf_model(neighbour_x, neighbour_y, wd=wd_lst).flow_box( x=np.linspace(min(wt_x) - ext, max(wt_x) + ext, 53), y=np.linspace(min(wt_y) - ext, max(wt_y) + ext, 51), h=[100, 110, 120]) wake_site = XRSite.from_flow_box(flow_box) wake_site.save('tmp.nc') else: wake_site = XRSite.load('tmp.nc') wf_model_wake_site = PropagateDownwind(wake_site, windTurbines, wake_deficitModel=BastankhahGaussianDeficit(use_effective_ws=True), superpositionModel=LinearSum()) sim_res_wake_site, _ = timeit(wf_model_wake_site, verbose=False)(wt_x, wt_y, ws=9.8, wd=wd_lst) npt.assert_allclose(sim_res.aep().sel(wt=np.arange(len(wt_x))).sum(), sim_res_wake_site.aep().sum(), rtol=0.0005) npt.assert_array_almost_equal(sim_res.aep().sel(wt=np.arange(len(wt_x))), sim_res_wake_site.aep(), 2)
def test_fuga(): # move turbine 1 600 300 wt_x = [-250, 600, -500, 0, 500, -250, 250] wt_y = [433, 300, 0, 0, 0, -433, -433] wts = HornsrevV80() path = tfp + 'fuga/2MW/Z0=0.03000000Zi=00401Zeta0=0.00E+00/' site = UniformSite([1, 0, 0, 0], ti=0.075) wake_model = Fuga(path, site, wts) res, _ = timeit(wake_model.__call__, verbose=0, line_profile=0, profile_funcs=[ FugaDeficit.interpolate, LUTInterpolator.__call__, GridInterpolator.__call__ ])(x=wt_x, y=wt_y, wd=[30], ws=[10]) npt.assert_array_almost_equal(res.WS_eff_ilk.flatten(), [ 10.00669629, 10., 8.47606501, 10.03143097, 9.37288077, 8.49301941, 8.07462708 ], 8) npt.assert_array_almost_equal(res.ct_ilk.flatten(), [ 0.7926384, 0.793, 0.80647607, 0.79130273, 0.80177967, 0.80649302, 0.80607463 ], 8) x_j = np.linspace(-1500, 1500, 500) y_j = np.linspace(-1500, 1500, 300) wake_model = Fuga(path, site, wts) sim_res = wake_model(wt_x, wt_y, wd=[30], ws=[10]) flow_map70 = sim_res.flow_map(HorizontalGrid(x_j, y_j, h=70)) flow_map73 = sim_res.flow_map(HorizontalGrid(x_j, y_j, h=73)) X, Y = flow_map70.XY Z70 = flow_map70.WS_eff_xylk[:, :, 0, 0] Z73 = flow_map73.WS_eff_xylk[:, :, 0, 0] if 0: flow_map70.plot_wake_map(levels=np.arange(6, 10.5, .1)) plt.plot(X[0], Y[140]) plt.figure() plt.plot(X[0], Z70[140, :], label="Z=70m") plt.plot(X[0], Z73[140, :], label="Z=73m") plt.plot(X[0, 100:400:10], Z70[140, 100:400:10], '.') print(list(np.round(Z70.data[140, 100:400:10], 4))) print(list(np.round(Z73.data[140, 100:400:10], 4))) plt.legend() plt.show() npt.assert_array_almost_equal(Z70[140, 100:400:10], [ 10.0407, 10.0438, 10.0438, 10.013, 9.6847, 7.8787, 6.9561, 9.2251, 9.9686, 10.0382, 10.0498, 10.0569, 10.0325, 9.1787, 7.4004, 9.1384, 10.0329, 10.0297, 10.0232, 9.9265, 9.3163, 8.0768, 6.8858, 8.3754, 9.9592, 10.0197, 10.0118, 10.0141, 10.0118, 10.0095 ], 4) npt.assert_array_almost_equal(Z73[140, 100:400:10], [ 10.0404, 10.0435, 10.0433, 10.0113, 9.6836, 7.9206, 7.0218, 9.2326, 9.9665, 10.0376, 10.0494, 10.0563, 10.0304, 9.1896, 7.4515, 9.15, 10.0317, 10.0294, 10.0226, 9.9245, 9.3252, 8.1192, 6.9462, 8.3988, 9.9574, 10.0194, 10.0117, 10.014, 10.0117, 10.0094 ], 4)