From d03f0163f450f03889c1e1c67ab2e0b5d6c9253c Mon Sep 17 00:00:00 2001
From: "Mads M. Pedersen" <mmpe@dtu.dk>
Date: Tue, 25 Feb 2025 15:43:43 +0000
Subject: [PATCH] adapt to numpy2

---
 py_wake/deficit_models/deficit_model.py          | 5 ++++-
 py_wake/deficit_models/gaussian.py               | 4 ++--
 py_wake/deflection_models/deflection_model.py    | 4 ++--
 py_wake/tests/test_sites/test_distances.py       | 8 ++++----
 py_wake/tests/test_utils/test_model_gradients.py | 4 +---
 py_wake/utils/gradients.py                       | 6 ++++++
 6 files changed, 19 insertions(+), 12 deletions(-)

diff --git a/py_wake/deficit_models/deficit_model.py b/py_wake/deficit_models/deficit_model.py
index 0573b44e6..e1673d902 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 99946962b..d31fe7d40 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 c6ed7dbcf..50acd752f 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 c20f303e9..c4e19e6aa 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 ae69d57d6..9b1e47fb9 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 0a2af4d80..e4e4d070d 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)
-- 
GitLab