Source code for improver.cli.temp_lapse_rate
#!/usr/bin/env python
# (C) Crown Copyright, Met Office. All rights reserved.
#
# This file is part of 'IMPROVER' and is released under the BSD 3-Clause license.
# See LICENSE in the root of the repository for full licensing details.
"""Script to calculate temperature lapse rates for given temperature and
orogrophy datasets."""
from improver import cli
from improver.constants import DALR
[docs]
@cli.clizefy
@cli.with_output
def process(
temperature: cli.inputcube,
orography: cli.inputcube = None,
land_sea_mask: cli.inputcube = None,
*,
max_height_diff: float = 35,
nbhood_radius: int = 7,
max_lapse_rate: float = -3 * DALR,
min_lapse_rate: float = DALR,
dry_adiabatic=False,
model_id_attr: str = None,
):
"""Calculate temperature lapse rates in units of K m-1 over orography grid.
Args:
temperature (iris.cube.Cube):
Air temperature data. This is required even when returning DALR,
as this defines the grid on which lapse rates are required.
orography (iris.cube.Cube):
Orography data.
land_sea_mask (iris.cube.Cube):
Binary land-sea mask data. True for land-points, False for sea.
max_height_diff (float):
Maximum allowable height difference between the central point and
points in the neighbourhood over which the lapse rate will be
calculated.
nbhood_radius (int):
Radius of neighbourhood in grid points around each point. The
neighbourhood is a square array with side length
2*nbhood_radius + 1. The default value of 7 is from the reference
paper (see plugin documentation).
max_lapse_rate (float):
Maximum lapse rate allowed, in K m-1.
min_lapse_rate (float):
Minimum lapse rate allowed, in K m-1.
dry_adiabatic (bool):
If True, returns a cube containing the dry adiabatic lapse rate
rather than calculating the true lapse rate.
model_id_attr (str):
Name of the attribute used to identify the source model for
blending. This is inherited from the input temperature cube.
Returns:
iris.cube.Cube:
Lapse rate (K m-1)
Raises:
ValueError: If minimum lapse rate is greater than maximum.
ValueError: If Maximum height difference is less than zero.
ValueError: If neighbourhood radius is less than zero.
RuntimeError: If calculating the true lapse rate and orography or
land mask arguments are not given.
"""
import numpy as np
from improver.metadata.utilities import (
create_new_diagnostic_cube,
generate_mandatory_attributes,
)
from improver.temperature.lapse_rate import LapseRate
if dry_adiabatic:
attributes = generate_mandatory_attributes(
[temperature], model_id_attr=model_id_attr
)
result = create_new_diagnostic_cube(
"air_temperature_lapse_rate",
"K m-1",
temperature,
attributes,
data=np.full_like(temperature.data, DALR).astype(np.float32),
)
return result
if min_lapse_rate > max_lapse_rate:
msg = "Minimum lapse rate specified is greater than the maximum."
raise ValueError(msg)
if max_height_diff < 0:
msg = "Maximum height difference specified is less than zero."
raise ValueError(msg)
if nbhood_radius < 0:
msg = "Neighbourhood radius specified is less than zero."
raise ValueError(msg)
if orography is None or land_sea_mask is None:
msg = "Missing orography and/or land mask arguments."
raise RuntimeError(msg)
result = LapseRate(
max_height_diff=max_height_diff,
nbhood_radius=nbhood_radius,
max_lapse_rate=max_lapse_rate,
min_lapse_rate=min_lapse_rate,
)(temperature, orography, land_sea_mask, model_id_attr=model_id_attr)
return result