From cc7236654d7d98bd2059d256768578441d12950e Mon Sep 17 00:00:00 2001 From: Andrew Simms Date: Tue, 9 Jul 2024 08:43:33 -0600 Subject: [PATCH 1/5] Test: Determine method using input frequency index --- mhkit/tests/wave/test_resource_spectrum.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/mhkit/tests/wave/test_resource_spectrum.py b/mhkit/tests/wave/test_resource_spectrum.py index 4907a5638..d72cf9846 100644 --- a/mhkit/tests/wave/test_resource_spectrum.py +++ b/mhkit/tests/wave/test_resource_spectrum.py @@ -158,6 +158,25 @@ def test_ifft_sum_of_sines(self): assert_allclose(eta_ifft, eta_sos) + def test_surface_elevation_uses_sum_of_sines_when_input_frequency_index_does_not_have_zero(self): + f = np.linspace(1 / 30, 1 / 2, 32) + S = wave.resource.jonswap_spectrum(f, self.Tp, self.Hs) + + eta_default = wave.resource.surface_elevation(S, self.t, seed=1) + eta_sos = wave.resource.surface_elevation( + S, self.t, seed=1, method="sum_of_sines" + ) + + assert_allclose(eta_default, eta_sos) + + def test_surface_elevation_uses_ifft_when_input_frequency_index_has_zero(self): + S = wave.resource.jonswap_spectrum(self.f, self.Tp, self.Hs) + + eta_default = wave.resource.surface_elevation(S, self.t, seed=1) + eta_ifft = wave.resource.surface_elevation(S, self.t, seed=1, method="ifft") + + assert_allclose(eta_default, eta_ifft) + def test_plot_spectrum(self): filename = abspath(join(plotdir, "wave_plot_spectrum.png")) if isfile(filename): From cac5b34b5eb9344de5bcafbedac357c8b3f1e0d3 Mon Sep 17 00:00:00 2001 From: Andrew Simms Date: Tue, 9 Jul 2024 08:46:31 -0600 Subject: [PATCH 2/5] Feat: Use sum of sines if ifft is not computable This change allows `surface_elevation` to return a result if the user inputs a spectrum with a frequency index that does not have a zero frequency. If the non zero frequency index condition is found when the method is `ifft` we warn the user and change the method to `sum_of_sines` --- mhkit/wave/resource.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mhkit/wave/resource.py b/mhkit/wave/resource.py index e38214eeb..d33a5968e 100644 --- a/mhkit/wave/resource.py +++ b/mhkit/wave/resource.py @@ -1,3 +1,5 @@ +import warnings + from scipy.optimize import fsolve as _fsolve from scipy import signal as _signal import pandas as pd @@ -335,9 +337,10 @@ def surface_elevation( if method == "ifft": if not f[0] == 0: - raise ValueError( - f"ifft method must have zero frequency defined. Lowest frequency is: {S.index.values[0]}" + warnings.warn( + f"ifft method must have zero frequency defined. Lowest frequency is: {S.index.values[0]}. Setting method to less efficient `sum_of_sines` method." ) + method = "sum_of_sines" if frequency_bins is None: delta_f = f.values[1] - f.values[0] From 432b76f053db5e7e012cd307beecd929e1cc086c Mon Sep 17 00:00:00 2001 From: Andrew Simms Date: Tue, 9 Jul 2024 08:47:34 -0600 Subject: [PATCH 3/5] Fix: Use previously found frequency index S.index may not exist for some input datasets, but f[0] does and we should use the value of f[0] here. --- mhkit/wave/resource.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mhkit/wave/resource.py b/mhkit/wave/resource.py index d33a5968e..7475fb331 100644 --- a/mhkit/wave/resource.py +++ b/mhkit/wave/resource.py @@ -338,7 +338,7 @@ def surface_elevation( if method == "ifft": if not f[0] == 0: warnings.warn( - f"ifft method must have zero frequency defined. Lowest frequency is: {S.index.values[0]}. Setting method to less efficient `sum_of_sines` method." + f"ifft method must have zero frequency defined. Lowest frequency is: {f[0].values}. Setting method to less efficient `sum_of_sines` method." ) method = "sum_of_sines" From 9df3a024c1713f42fe907886a93d010428b8fc95 Mon Sep 17 00:00:00 2001 From: Andrew Simms Date: Tue, 9 Jul 2024 08:52:41 -0600 Subject: [PATCH 4/5] Test: Warn when using ifft with a non zero frequency --- mhkit/tests/wave/test_resource_spectrum.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/mhkit/tests/wave/test_resource_spectrum.py b/mhkit/tests/wave/test_resource_spectrum.py index d72cf9846..61c154268 100644 --- a/mhkit/tests/wave/test_resource_spectrum.py +++ b/mhkit/tests/wave/test_resource_spectrum.py @@ -8,6 +8,7 @@ import pandas as pd import numpy as np import unittest +import pytest import os @@ -169,6 +170,15 @@ def test_surface_elevation_uses_sum_of_sines_when_input_frequency_index_does_not assert_allclose(eta_default, eta_sos) + def test_surface_elevation_warn_user_if_zero_frequency_not_defined_and_using_ifft( + self, + ): + f = np.linspace(1 / 30, 1 / 2, 32) + S = wave.resource.jonswap_spectrum(f, self.Tp, self.Hs) + + with pytest.warns(UserWarning): + wave.resource.surface_elevation(S, self.t, seed=1, method="ifft") + def test_surface_elevation_uses_ifft_when_input_frequency_index_has_zero(self): S = wave.resource.jonswap_spectrum(self.f, self.Tp, self.Hs) From 2dd5ccba8e5a7087017d7b51b2623ee9251ee85b Mon Sep 17 00:00:00 2001 From: Andrew Simms Date: Tue, 9 Jul 2024 09:16:22 -0600 Subject: [PATCH 5/5] Lint --- mhkit/tests/wave/test_resource_spectrum.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mhkit/tests/wave/test_resource_spectrum.py b/mhkit/tests/wave/test_resource_spectrum.py index 61c154268..387f87189 100644 --- a/mhkit/tests/wave/test_resource_spectrum.py +++ b/mhkit/tests/wave/test_resource_spectrum.py @@ -159,7 +159,9 @@ def test_ifft_sum_of_sines(self): assert_allclose(eta_ifft, eta_sos) - def test_surface_elevation_uses_sum_of_sines_when_input_frequency_index_does_not_have_zero(self): + def test_surface_elevation_uses_sum_of_sines_when_input_frequency_index_does_not_have_zero( + self, + ): f = np.linspace(1 / 30, 1 / 2, 32) S = wave.resource.jonswap_spectrum(f, self.Tp, self.Hs)