Index: trunk/tests/test_data/generated_output_data/test_swh_1986_ERA5_SWH.nc =================================================================== diff -u Binary files differ Index: trunk/tests/TestUtils.py =================================================================== diff -u -r148 -r216 --- trunk/tests/TestUtils.py (.../TestUtils.py) (revision 148) +++ trunk/tests/TestUtils.py (.../TestUtils.py) (revision 216) @@ -37,7 +37,7 @@ return directory @staticmethod - def get_local_test_data_dir(dir_name: str): + def get_local_test_data_dir(dir_name: str) -> Path: """ Returns the desired directory relative to the test data. Avoiding extra code on the tests. Index: trunk/SDToolBox/predictor_definition.py =================================================================== diff -u -r187 -r216 --- trunk/SDToolBox/predictor_definition.py (.../predictor_definition.py) (revision 187) +++ trunk/SDToolBox/predictor_definition.py (.../predictor_definition.py) (revision 216) @@ -51,35 +51,22 @@ Returns: xarray -- Gradients points added to input DataArray. """ - - if data_array is None: + if data_array is None or not isinstance(data_array, (xr.DataArray, xr.Dataset)): raise Exception(om.error_no_valid_input_data) + if isinstance(data_array, xr.Dataset): + data_array = data_array.to_array() + meshed_latitudes, _ = np.meshgrid( data_array.coords[OutputData.var_lat_key], data_array.coords[OutputData.var_lon_key], ) - # derivative_points = np.nan * np.ones( - # ( - # data_array[OutputData.var_time_key].size, - # data_array[OutputData.var_lat_key].size, - # data_array[OutputData.var_lon_key].size, - # ), - # dtype=float, - # ) - # gradient_slp = [] - values = np.nan * np.ones( - ( - data_array[OutputData.var_time_key].size, - data_array[OutputData.var_lat_key].size, - data_array[OutputData.var_lon_key].size, - ), - dtype=float, - ) + values = np.nan * np.ones_like(data_array, dtype=float,) for time in range(0, data_array.coords[OutputData.var_time_key].size - 1): derivative_points = np.nan * np.ones( ( + data_array["variable"].size, data_array[OutputData.var_lat_key].size, data_array[OutputData.var_lon_key].size, ) @@ -96,22 +83,22 @@ / 180 ) derivative_longitude_first = ( - data_array[time, latitude_idx, longitude_idx] - - data_array[time, latitude_idx, longitude_idx - 1] + data_array[:, time, latitude_idx, longitude_idx] + - data_array[:, time, latitude_idx, longitude_idx - 1] ) / np.cos(phi) derivative_longitude_second = ( - data_array[time, latitude_idx, longitude_idx + 1] - - data_array[time, latitude_idx, longitude_idx] + data_array[:, time, latitude_idx, longitude_idx + 1] + - data_array[:, time, latitude_idx, longitude_idx] ) / np.cos(phi) derivative_latitude_first = ( - data_array[time, latitude_idx, longitude_idx] - - data_array[time, latitude_idx - 1, longitude_idx] + data_array[:, time, latitude_idx, longitude_idx] + - data_array[:, time, latitude_idx - 1, longitude_idx] ) derivative_latitude_second = ( - data_array[time, latitude_idx + 1, longitude_idx] - - data_array[time, latitude_idx, longitude_idx] + data_array[:, time, latitude_idx + 1, longitude_idx] + - data_array[:, time, latitude_idx, longitude_idx] ) - derivative_points[latitude_idx, longitude_idx] = ( + derivative_points[:, latitude_idx, longitude_idx] = ( ( np.square(derivative_longitude_first) + np.square(derivative_longitude_second) @@ -123,8 +110,8 @@ ) / 2 ) - control = [time, latitude_idx, longitude_idx] - values[time, :, :] = derivative_points + values[:, time, :, :] = derivative_points + # Make sure shape of values (derivative_points) matches expectation. data_array.values = values return data_array Index: trunk/tests/test_data/generated_output_data/test_msl_1986_ERA5_MSL.nc =================================================================== diff -u Binary files differ Index: trunk/SDToolBox/output_data.py =================================================================== diff -u -r215 -r216 --- trunk/SDToolBox/output_data.py (.../output_data.py) (revision 215) +++ trunk/SDToolBox/output_data.py (.../output_data.py) (revision 216) @@ -416,15 +416,15 @@ # Set projection details. logging.info(f"Creating projection variable {self.var_proj_key}.") - netcdf.createVariable( - self.var_proj_key, "|S1", (), zlib=True, complevel=5, shuffle=True - ) - epsg_code = "EPSG:4326" - logging.info( - f"Adding EPSG code: {epsg_code} " - + f"to projection variable {self.var_proj_key}." - ) - netcdf.variables[self.var_proj_key].EPSG_code = "EPSG:4326" + # netcdf.createVariable( + # self.var_proj_key, "|S1", (), zlib=True, complevel=5, shuffle=True + # ) + # epsg_code = "EPSG:4326" + # logging.info( + # f"Adding EPSG code: {epsg_code} " + # + f"to projection variable {self.var_proj_key}." + # ) + # netcdf.variables[self.var_proj_key].EPSG_code = "EPSG:4326" return netcdf Index: trunk/tests/test_predictor_definition.py =================================================================== diff -u -r187 -r216 --- trunk/tests/test_predictor_definition.py (.../test_predictor_definition.py) (revision 187) +++ trunk/tests/test_predictor_definition.py (.../test_predictor_definition.py) (revision 216) @@ -51,21 +51,30 @@ class Test_SpatialGradientsCalculation: @pytest.mark.systemtest - def test_given_chunked_data_compute_slp_gradients(self): + @pytest.mark.parametrize( + "filename", + [ + pytest.param("test_msl_1986_ERA5_MSL.nc", id="MSL"), + pytest.param("test_swh_1986_ERA5_SWH.nc", id="SWH"), + ], + ) + def test_given_chunked_data_compute_slp_gradients(self, filename: str): # 1. Get test data dir_test_data = TestUtils.get_local_test_data_dir("generated_output_data") - test_nc_file = dir_test_data / "test_swh_1981_to_1986_CF.nc" + test_nc_file = dir_test_data / filename assert test_nc_file.is_file(), "" + "Test file not found at {}".format( test_nc_file ) output_xarray = xr.open_dataset(test_nc_file) + # 2. Run test. result = PredictorDefinition.compute_spatial_gradients(output_xarray) # 3. Validate extracted data. assert result is not None assert isinstance(result, xr.DataArray) - assert result.dims == output_xarray.dims + assert result.dims == output_xarray.to_array().dims + assert result.shape == output_xarray.to_array().shape @pytest.mark.unittest def test_given_an_xarray_compute_slp_gradients(self):