diff --git a/floris/wind_data.py b/floris/wind_data.py index 02828d12a..c3537dc4a 100644 --- a/floris/wind_data.py +++ b/floris/wind_data.py @@ -189,7 +189,14 @@ def __init__( if not isinstance(wind_speeds, np.ndarray) or wind_speeds.ndim != 1: raise TypeError("wind_speeds must be a 1D NumPy array") - # Confirm that both wind_directions and wind_speeds are monitonically + # Confirm that none of wind_directions or wind_speeds contain NaN values + if np.isnan(wind_directions).any(): + raise ValueError("wind_directions must not contain NaNs") + + if np.isnan(wind_speeds).any(): + raise ValueError("wind_speeds must not contain NaNs") + + # Confirm that both wind_directions and wind_speeds are monotonically # increasing and evenly spaced _n_wd = len(wind_directions) _n_ws = len(wind_speeds) @@ -1193,6 +1200,14 @@ def __init__( if not isinstance(turbulence_intensities, np.ndarray) or turbulence_intensities.ndim != 1: raise TypeError("turbulence_intensities must be a 1D NumPy array") + # Check that wind_directions, wind_speeds, and turbulence_intensities do not contain NaNs + if np.isnan(wind_directions).any(): + raise ValueError("wind_directions must not contain NaNs") + if np.isnan(wind_speeds).any(): + raise ValueError("wind_speeds must not contain NaNs") + if np.isnan(turbulence_intensities).any(): + raise ValueError("turbulence_intensities must not contain NaNs") + # Confirm that both wind_directions and wind_speeds # and turbulence intensities are monotonically # increasing and evenly spaced diff --git a/tests/wind_data_integration_test.py b/tests/wind_data_integration_test.py index 7c3bb00ed..927660c06 100644 --- a/tests/wind_data_integration_test.py +++ b/tests/wind_data_integration_test.py @@ -37,6 +37,21 @@ def test_time_series_instantiation(): with pytest.raises(TypeError): TimeSeries(wind_directions, wind_speeds) + # Test instantiation with NaN values + with pytest.raises(ValueError, match="contain NaNs"): + TimeSeries(np.array([270, 280, np.nan]), wind_speeds, turbulence_intensities=0.06) + with pytest.raises(ValueError, match="contain NaNs"): + TimeSeries(wind_directions, np.array([np.nan, 5, 5,]), turbulence_intensities=0.06) + with pytest.raises(ValueError, match="contain NaNs"): + TimeSeries(wind_directions, wind_speeds, np.array([0.06, np.nan, 0.06])) + with pytest.raises(ValueError, match="contain NaNs"): + TimeSeries( + wind_directions, + wind_speeds, + 0.06*np.ones_like(wind_speeds), + np.array([1.0, np.nan, 3.0]) + ) + # Test that passing a float TI returns a list of length matched to wind directions time_series = TimeSeries(wind_directions, wind_speeds, turbulence_intensities=0.06) np.testing.assert_allclose(time_series.turbulence_intensities, [0.06, 0.06, 0.06]) @@ -81,6 +96,12 @@ def test_wind_rose_init(): with pytest.raises(ValueError): WindRose(np.array([290, 280, 270]), np.array([6, 7]), 0.06) + # Test that passing in a NaN value raises an error + with pytest.raises(ValueError, match="contain NaNs"): + WindRose(np.array([270, 280, np.nan]), np.array([6, 7]), 0.06) + with pytest.raises(ValueError, match="contain NaNs"): + WindRose(np.array([270, 280, 290]), np.array([np.nan, 7]), 0.06) + wind_directions = np.array([270, 280, 290]) wind_speeds = np.array([6, 7]) @@ -824,6 +845,13 @@ def test_wind_ti_rose_init(): turbulence_intensities=turbulence_intensities, ) + # Test that passing in a NaN value raises an error + with pytest.raises(ValueError, match="contain NaNs"): + WindTIRose(np.array([270, 280, np.nan, 300]), wind_speeds, turbulence_intensities) + with pytest.raises(ValueError, match="contain NaNs"): + WindTIRose(wind_directions, np.array([6, np.nan, 8]), turbulence_intensities) + with pytest.raises(ValueError, match="contain NaNs"): + WindTIRose(wind_directions, wind_speeds, np.array([0.05, np.nan])) def test_wind_ti_rose_grid(): wind_directions = np.array([270, 280, 290, 300])