diff --git a/floris/wind_data.py b/floris/wind_data.py index 3d49dec4b..802a0fb4e 100644 --- a/floris/wind_data.py +++ b/floris/wind_data.py @@ -174,7 +174,14 @@ def __init__( if not isinstance(wind_speeds, np.ndarray): raise TypeError("wind_speeds must be a 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 if len(wind_directions) > 1: # Check monotonically increasing @@ -1125,6 +1132,14 @@ def __init__( if not isinstance(turbulence_intensities, np.ndarray): raise TypeError("turbulence_intensities must be a 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 d3ca57438..57288145f 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]) @@ -750,6 +771,13 @@ def test_wind_ti_rose_init(): with pytest.raises(ValueError): WindTIRose(wind_directions, wind_speeds, turbulence_intensities, np.ones((3, 3, 3))) + # 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])