Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion improver/cli/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,16 @@ def with_output(

result = wrapped(*args, **kwargs)

if output and (isinstance(result, Cube) or isinstance(result, CubeList)):
# If result is a Cube or CubeList or an iterable containing only Cubes,
# save as netCDF
if (
output
and result
and (
(isinstance(result, (Cube, CubeList)))
or all([isinstance(x, Cube) for x in result])
)
):
save_netcdf(result, output, compression_level, least_significant_digit)
if pass_through_output:
return ObjectAsStr(result, output)
Expand Down
12 changes: 7 additions & 5 deletions improver/psychrometric_calculations/cloud_condensation_level.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ def __init__(self, model_id_attr: str = None):
model_id_attr=model_id_attr
)

def process(self, *cubes: Union[Cube, CubeList]) -> Tuple[Cube, Cube]:
def process(self, *cubes: Union[Cube, CubeList]) -> CubeList[Cube, Cube]:
"""
Call HumidityMixingRatio followed by CloudCondensationLevel to calculate cloud
condensation level.
Expand Down Expand Up @@ -138,7 +138,7 @@ def humidity_delta(p2, p, t, q):
).astype(np.float32)
return ccl_pressure, ccl_temperature

def process(self, *cubes: Union[Cube, CubeList]) -> Tuple[Cube, Cube]:
def process(self, *cubes: Union[Cube, CubeList]) -> CubeList[Cube, Cube]:
"""
Calculates the cloud condensation level from the near-surface inputs.
Values will be limited to the surface values where the calculated pressure is greater than
Expand All @@ -164,7 +164,9 @@ def process(self, *cubes: Union[Cube, CubeList]) -> Tuple[Cube, Cube]:
mask = ccl_pressure > self.pressure.data
ccl_pressure = np.where(mask, self.pressure.data, ccl_pressure)
ccl_temperature = np.where(mask, self.temperature.data, ccl_temperature)
return (
self._make_ccl_cube(ccl_temperature, is_temperature=True),
self._make_ccl_cube(ccl_pressure, is_temperature=False),
return CubeList(
[
self._make_ccl_cube(ccl_temperature, is_temperature=True),
self._make_ccl_cube(ccl_pressure, is_temperature=False),
]
)
6 changes: 3 additions & 3 deletions improver/utilities/spatial.py
Original file line number Diff line number Diff line change
Expand Up @@ -681,7 +681,7 @@ def _create_output_cube(gradient: Cube, name: str) -> Cube:
)
return grad_cube

def process(self, cube: Cube) -> Tuple[Cube, Cube]:
def process(self, cube: Cube) -> CubeList[Cube, Cube]:
"""
Calculate the gradient along the x and y axes and return
the result in separate cubes. The difference along each axis is
Expand All @@ -699,7 +699,7 @@ def process(self, cube: Cube) -> Tuple[Cube, Cube]:
y-axis.
"""
axis = ["x", "y"]
gradients = []
gradients = CubeList([])
diffs = DifferenceBetweenAdjacentGridSquares()(cube)
distances = DistanceBetweenGridSquares()(cube)

Expand All @@ -713,7 +713,7 @@ def process(self, cube: Cube) -> Tuple[Cube, Cube]:
grad_cube = grad_cube.regrid(cube, iris.analysis.Linear())
gradients.append(grad_cube)

return tuple(gradients)
return gradients


def maximum_within_vicinity(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import numpy as np
import pytest
from iris.coords import AuxCoord
from iris.cube import Cube
from iris.cube import Cube, CubeList

from improver.metadata.constants.attributes import MANDATORY_ATTRIBUTES
from improver.psychrometric_calculations.cloud_condensation_level import (
Expand Down Expand Up @@ -125,6 +125,7 @@ def test_basic(
humidity.data = np.full_like(humidity.data, humidity_value)
result = CloudCondensationLevel()([temperature, pressure, humidity])
metadata_ok(result, temperature)
assert isinstance(result, CubeList)
assert np.isclose(result[0].data, expected_t, atol=1e-2).all()
assert np.isclose(result[1].data, expected_p, atol=1e-0).all()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import numpy as np
import pytest
from iris.cube import CubeList

from improver.metadata.constants.attributes import MANDATORY_ATTRIBUTE_DEFAULTS
from improver.synthetic_data.set_up_test_cubes import set_up_variable_cube
Expand Down Expand Up @@ -135,7 +136,9 @@ def test_metadata(
expected_x_coord = cube.coord(axis="x").copy(expected_x_points)
expected_y_coord = cube.coord(axis="y").copy(expected_y_points)
plugin = GradientBetweenAdjacentGridSquares(regrid=regrid)
result_x, result_y = plugin(cube)
result = plugin(cube)
assert isinstance(result, CubeList)
result_x, result_y = result
for result, name in [(result_x, "x"), (result_y, "y")]:
assert result.name() == f"gradient_of_air_temperature_wrt_{name}"
assert result.units == "K m-1"
Expand Down