Skip to content

Commit

Permalink
Fixing missing height 2m coordinates in GFDL-CM4 and KIOST-ESM (#2294)
Browse files Browse the repository at this point in the history
Co-authored-by: Karen Garcia Perdomo <[email protected]>
Co-authored-by: Valeriu Predoi <[email protected]>
  • Loading branch information
3 people authored Jan 16, 2024
1 parent f515169 commit 79455c1
Show file tree
Hide file tree
Showing 3 changed files with 127 additions and 18 deletions.
34 changes: 16 additions & 18 deletions esmvalcore/cmor/_fixes/cmip6/gfdl_cm4.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,30 +68,24 @@ def fix_metadata(self, cubes):
return cubes


class Uas(Fix):
"""Fixes for uas."""
class Tasmin(Tas):
"""Fixes for tasmin."""

def fix_metadata(self, cubes):
"""
Add height (10m) coordinate.

Parameters
----------
cubes : iris.cube.CubeList
Input cubes.
class Tasmax(Tas):
"""Fixes for tasmax."""

Returns
-------
iris.cube.CubeList

"""
cube = self.get_cube_from_list(cubes)
add_scalar_height_coord(cube, 10.0)
return cubes
class SfcWind(Tas):
"""Fixes for sfcWind."""


class Vas(Fix):
"""Fixes for vas."""
class Hurs(Tas):
"""Fixes for hurs."""


class Uas(Fix):
"""Fixes for uas."""

def fix_metadata(self, cubes):
"""
Expand All @@ -112,6 +106,10 @@ def fix_metadata(self, cubes):
return cubes


class Vas(Uas):
"""Fixes for vas."""


Omon = BaseOmon


Expand Down
8 changes: 8 additions & 0 deletions esmvalcore/cmor/_fixes/cmip6/kiost_esm.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,14 @@ class Huss(Tas):
"""Fixes for huss."""


class Tasmin(Tas):
"""Fixes for tasmin."""


class Tasmax(Tas):
"""Fixes for tasmax."""


class SfcWind(Fix):
"""Fixes for sfcWind."""

Expand Down
103 changes: 103 additions & 0 deletions tests/integration/cmor/_fixes/cmip6/test_gfdl_cm4.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,14 @@
Fgco2,
Omon,
Siconc,
Tas,
Uas,
)
from esmvalcore.cmor._fixes.common import SiconcFixScalarCoord
from esmvalcore.cmor._fixes.fix import GenericFix
from esmvalcore.cmor.fix import Fix
from esmvalcore.cmor.table import get_var_info
from cf_units import Unit


def test_get_cl_fix():
Expand Down Expand Up @@ -116,3 +119,103 @@ def test_get_siconc_fix():
def test_siconc_fix():
"""Test fix for ``siconc``."""
assert Siconc is SiconcFixScalarCoord


@pytest.fixture
def tas_cubes():
correct_lat_coord = iris.coords.DimCoord([0.0],
var_name='lat',
standard_name='latitude')
wrong_lat_coord = iris.coords.DimCoord([0.0],
var_name='latitudeCoord',
standard_name='latitude')
correct_lon_coord = iris.coords.DimCoord([0.0],
var_name='lon',
standard_name='longitude')
wrong_lon_coord = iris.coords.DimCoord([0.0],
var_name='longitudeCoord',
standard_name='longitude')
correct_cube = iris.cube.Cube([[2.0]],
var_name='tas',
dim_coords_and_dims=[(correct_lat_coord, 0),
(correct_lon_coord, 1)])
wrong_cube = iris.cube.Cube([[2.0]],
var_name='ta',
dim_coords_and_dims=[(wrong_lat_coord, 0),
(wrong_lon_coord, 1)])
scalar_cube = iris.cube.Cube(0.0, var_name='ps')
return iris.cube.CubeList([correct_cube, wrong_cube, scalar_cube])


def test_get_tas_fix():
fixes = Fix.get_fixes('CMIP6', 'GFDL-CM4', 'day', 'tas')
assert Tas(None) in fixes


def test_tas_fix_metadata(tas_cubes):
for cube in tas_cubes:
with pytest.raises(iris.exceptions.CoordinateNotFoundError):
cube.coord('height')
height_coord = iris.coords.AuxCoord(2.0,
var_name='height',
standard_name='height',
long_name='height',
units=Unit('m'),
attributes={'positive': 'up'})
vardef = get_var_info('CMIP6', 'day', 'tas')
fix = Tas(vardef)

out_cubes = fix.fix_metadata(tas_cubes)
assert out_cubes[0].var_name == 'tas'
coord = out_cubes[0].coord('height')
assert coord == height_coord


@pytest.fixture
def uas_cubes():
correct_lat_coord = iris.coords.DimCoord([0.0],
var_name='lat',
standard_name='latitude')
wrong_lat_coord = iris.coords.DimCoord([0.0],
var_name='latitudeCoord',
standard_name='latitude')
correct_lon_coord = iris.coords.DimCoord([0.0],
var_name='lon',
standard_name='longitude')
wrong_lon_coord = iris.coords.DimCoord([0.0],
var_name='longitudeCoord',
standard_name='longitude')
correct_cube = iris.cube.Cube([[10.0]],
var_name='uas',
dim_coords_and_dims=[(correct_lat_coord, 0),
(correct_lon_coord, 1)])
wrong_cube = iris.cube.Cube([[10.0]],
var_name='ua',
dim_coords_and_dims=[(wrong_lat_coord, 0),
(wrong_lon_coord, 1)])
scalar_cube = iris.cube.Cube(0.0, var_name='ps')
return iris.cube.CubeList([correct_cube, wrong_cube, scalar_cube])


def test_get_uas_fix():
fixes = Fix.get_fixes('CMIP6', 'GFDL-CM4', 'day', 'uas')
assert Uas(None) in fixes


def test_uas_fix_metadata(uas_cubes):
for cube in uas_cubes:
with pytest.raises(iris.exceptions.CoordinateNotFoundError):
cube.coord('height')
height_coord = iris.coords.AuxCoord(10.0,
var_name='height',
standard_name='height',
long_name='height',
units=Unit('m'),
attributes={'positive': 'up'})
vardef = get_var_info('CMIP6', 'day', 'uas')
fix = Uas(vardef)

out_cubes = fix.fix_metadata(uas_cubes)
assert out_cubes[0].var_name == 'uas'
coord = out_cubes[0].coord('height')
assert coord == height_coord

0 comments on commit 79455c1

Please sign in to comment.