diff --git a/py_wake/deficit_models/deficit_model.py b/py_wake/deficit_models/deficit_model.py index 0573b44e6e2f92a3f71f445d06821440ba729f72..e1673d902e5ab7a63fb41adebdc71d4003f3925c 100644 --- a/py_wake/deficit_models/deficit_model.py +++ b/py_wake/deficit_models/deficit_model.py @@ -6,6 +6,7 @@ from py_wake.utils.model_utils import method_args, RotorAvgAndGroundModelContain from py_wake.superposition_models import WeightedSum from py_wake.utils.grid_interpolator import GridInterpolator import inspect +from py_wake.utils import gradients class DeficitModel(ABC, RotorAvgAndGroundModelContainer): @@ -113,7 +114,9 @@ class BlockageDeficitModel(DeficitModel): if induc_ijlk is not None: # Close to the rotor the induced velocities become unphysical in some models and are # limited to the induction in the rotor plane estimated by BEM. - deficit_ijlk = np.where(np.abs(deficit_ijlk) > induc_ijlk, induc_ijlk * np.sign(deficit_ijlk), deficit_ijlk) + deficit_ijlk = np.where(np.abs(deficit_ijlk) > induc_ijlk, + induc_ijlk * gradients.sign(deficit_ijlk), + deficit_ijlk) return deficit_ijlk diff --git a/py_wake/deficit_models/gaussian.py b/py_wake/deficit_models/gaussian.py index 99946962bbf7747af055e3ecef7315d815863510..d31fe7d406f034eba2f00f2003d85745129d363b 100644 --- a/py_wake/deficit_models/gaussian.py +++ b/py_wake/deficit_models/gaussian.py @@ -516,8 +516,8 @@ class BlondelSuperGaussianDeficit2020(WakeDeficitModel): a1 = 2 ** (2 / n - 1) a2 = 2 ** (4 / n - 2) - deficit_center_ijlk = a1 - np.sqrt(a2 - ((n * ctx_ijlk) / (16.0 * gamma(2 / n) * np.sign(sigma_ijlk) * - (cabs(sigma_ijlk) ** (4 / n))))) + deficit_center_ijlk = a1 - np.sqrt(a2 - ((n * ctx_ijlk) / + (16.0 * gamma(2 / n) * gradients.sign(sigma_ijlk) * (cabs(sigma_ijlk) ** (4 / n))))) return deficit_center_ijlk diff --git a/py_wake/deflection_models/deflection_model.py b/py_wake/deflection_models/deflection_model.py index c6ed7dbcf818544fc7ee6ad486873220a5fb972b..50acd752f30fd044c6c22ac1e92020041dd34d86 100644 --- a/py_wake/deflection_models/deflection_model.py +++ b/py_wake/deflection_models/deflection_model.py @@ -70,8 +70,8 @@ class DeflectionIntegrator(DeflectionModel): deflection_rate = self.get_deflection_rate(theta_ilk=theta_total_ilk, dw_ijlkx=dw_ijlkx, yaw_ilk=yaw_ilk, tilt_ilk=tilt_ilk, **kwargs) deflection_ijlk = gradients.trapz(deflection_rate, dw_ijlkx, axis=4) - self.hcw_ijlk = hcw_ijlk + np.sign(dw_ijlk) * deflection_ijlk * np.cos(theta_total_angle_ilk[:, na]) - self.dh_ijlk = dh_ijlk + np.sign(dw_ijlk) * deflection_ijlk * np.sin(theta_total_angle_ilk[:, na]) + self.hcw_ijlk = hcw_ijlk + gradients.sign(dw_ijlk) * deflection_ijlk * np.cos(theta_total_angle_ilk[:, na]) + self.dh_ijlk = dh_ijlk + gradients.sign(dw_ijlk) * deflection_ijlk * np.sin(theta_total_angle_ilk[:, na]) return dw_ijlk, self.hcw_ijlk, self.dh_ijlk @abstractmethod diff --git a/py_wake/tests/test_sites/test_distances.py b/py_wake/tests/test_sites/test_distances.py index c20f303e91be638a689d0d1470d1d8f2ad6b965a..c4e19e6aa697cb43eb61cb2911183e584b9c4f6b 100644 --- a/py_wake/tests/test_sites/test_distances.py +++ b/py_wake/tests/test_sites/test_distances.py @@ -173,7 +173,7 @@ def test_straightDistance_turning(wfm_cls, turning, method, angle_func): warnings.simplefilter('ignore', UserWarning) fm_wide = sim_res.flow_map(XYGrid(x=450, y=np.linspace(-200, 200, 1001)), wd=270) - y = fm_wide.y[np.argmin(fm_wide.WS_eff.squeeze().values)] + y = fm_wide.y[np.argmin(fm_wide.WS_eff.squeeze().values)].item() with warnings.catch_warnings(): warnings.simplefilter('ignore', UserWarning) fm = sim_res.flow_map(XYGrid(x=450, y=np.linspace(y - 2, y + 2, 1001)), wd=270) @@ -313,11 +313,11 @@ def test_JITStreamlinesparquefictio(): # average downwind distance increase around 5 m npt.assert_almost_equal((dw + dw.T).mean(), 5, 0) - fm = sim_res.flow_map(XYGrid(x=np.linspace(site.ds.x[0], site.ds.x[-1], 500), - y=np.linspace(site.ds.y[0], site.ds.y[-1], 500))) + fm = sim_res.flow_map(XYGrid(x=np.linspace(site.ds.x[0].item(), site.ds.x[-1].item(), 500), + y=np.linspace(site.ds.y[0].item(), site.ds.y[-1].item(), 500))) stream_lines = vf3d.stream_lines(wd=np.full(x.shape, wd), start_points=np.array([x, y, np.full(x.shape, 70)]).T, dw_stop=y - 6504700) - if 1: + if 0: fm.plot_wake_map() for sl in stream_lines: plt.plot(sl[:, 0], sl[:, 1]) diff --git a/py_wake/tests/test_utils/test_model_gradients.py b/py_wake/tests/test_utils/test_model_gradients.py index ae69d57d6c22ff39fe77653e366ecd48d7c7bab1..9b1e47fb959cdc7f404cf2679b2c587b96446b60 100644 --- a/py_wake/tests/test_utils/test_model_gradients.py +++ b/py_wake/tests/test_utils/test_model_gradients.py @@ -5,8 +5,7 @@ import xarray as xr import matplotlib.pyplot as plt from py_wake import np from py_wake.deficit_models.deficit_model import WakeDeficitModel, BlockageDeficitModel -from py_wake.deficit_models.gaussian import IEA37SimpleBastankhahGaussianDeficit, \ - BastankhahGaussianDeficit, NiayifarGaussianDeficit +from py_wake.deficit_models.gaussian import BastankhahGaussianDeficit, NiayifarGaussianDeficit from py_wake.deficit_models.no_wake import NoWakeDeficit from py_wake.deflection_models.deflection_model import DeflectionModel from py_wake.examples.data.ParqueFicticio._parque_ficticio import ParqueFicticioSite @@ -25,7 +24,6 @@ from py_wake.utils import gradients from py_wake.utils.gradients import autograd, plot_gradients, fd, cs from py_wake.utils.model_utils import get_models from py_wake.wind_farm_models.engineering_models import PropagateDownwind, All2AllIterative, EngineeringWindFarmModel -from py_wake.wind_farm_models.wind_farm_model import WindFarmModel from py_wake.deficit_models.noj import NOJDeficit from py_wake.site.jit_streamline_distance import JITStreamlineDistance from py_wake.site.xrsite import XRSite diff --git a/py_wake/utils/gradients.py b/py_wake/utils/gradients.py index 0a2af4d80fcc5f4383e1cb009b4dbc321c2a26b6..e4e4d070d3af31c13091da7f995901973291a515 100644 --- a/py_wake/utils/gradients.py +++ b/py_wake/utils/gradients.py @@ -386,3 +386,9 @@ def gamma(x): return agamma(x) else: return sgamma(x) + + +def sign(x): + if np.iscomplexobj(x): + x = x.real + return np.sign(x)