ModelHeightAdjustedAirTemperature¶
The ModelHeightAdjustedAirTemperature ObsFunction adjusts a surface observation Temperature value
from station height to model height using a temperature lapse rate correction.
The adjustment formula is:
where \(\Gamma\) is the lapse rate (K/m), \(Z_{\text{station}}\) is the observation station height, and \(Z_{\text{model}}\) is the model height (with optional offset applied).
Two lapse rate schemes are supported:
constant (default): Uses a fixed lapse rate. When the
temperature lapse rate in K/kmparameters block is provided, thevalueparameter specifies the rate in K/km. When the parameters block is omitted entirely, the standard lapse rate fromConstants::Lclr(unit: K/m) is used.local: Computes the lapse rate from the model temperature profile between two specified model levels near the surface, with optional bounds clamping.
Note
Internally, JEDI uses lapse rates in units of K/m. However, to improve readability and reduce the risk of typos, the YAML configuration accepts lapse rate values in K/km. The conversion to K/m is performed automatically in JEDI.
Options¶
elevation(required): The station elevation variable in units of meters. (e.g.MetaData/stationElevation).observed temperature variable(optional, default:ObsValue/airTemperatureAt2M): The observation temperature variable to adjust, specified ingroup/variableformat (e.g.ObsValue/airTemperature).model height(optional): A nested block configuring the model reference height. If omitted, defaults to terrain height with no offset.from(optional, default: “terrain”): Either"terrain"(model orography fromGeoVaLs/height_above_mean_sea_level_at_surface) or"lowestModelLevel"(height of the lowest model level fromGeoVaLs/height_above_mean_sea_level).offset in meters(optional, default: 0.0): A constant offset (in meters) added to the model height before computing the adjustment. This can be used, for example, to account for the fact that station observations are typically a few meters above the terrain.
temperature lapse rate in K/km(optional): A nested block configuring the lapse rate. If omitted entirely, the standard lapse rate (Constants::Lclr) is used.scheme(optional, default: “constant”): Either"constant"or"local".value(optional, default: 6.5): Constant lapse rate value in K/km. Used whenschemeis"constant".level1(optional, default: 1): Lower model level index (1-based, counted from the surface). Used whenschemeis"local".level2(optional, default: 2): Upper model level index (1-based, counted from the surface). Used whenschemeis"local".bounds(optional): If specified, clamp the computed local lapse rate to the given range. Contains:minvalue(required): Minimum allowed lapse rate in K/km.maxvalue(required): Maximum allowed lapse rate in K/km.
Required GeoVaLs¶
GeoVaLs/height_above_mean_sea_level_at_surface— required whenmodel heightfromis"terrain"(default).GeoVaLs/height_above_mean_sea_level— required whenmodel heightfromis"lowestModelLevel", or when lapse rateschemeis"local".GeoVaLs/air_temperature— required when lapse rateschemeis"local".
These are requested automatically via requiredVariables() and do not need additional YAML
configuration.
Examples¶
Default behaviour (terrain height, standard lapse rate Constants::Lclr, backward-compatible):
- filter: Variable Assignment
assignments:
- name: DerivedObsValue/airTemperatureAt2M
type: float
function:
name: ObsFunction/ModelHeightAdjustedAirTemperature
options:
elevation:
name: MetaData/stationElevation
Constant lapse rate with custom value (e.g. 5.0 K/km):
- filter: Variable Assignment
assignments:
- name: DerivedObsValue/airTemperatureAt2M
type: float
function:
name: ObsFunction/ModelHeightAdjustedAirTemperature
options:
elevation:
name: MetaData/stationElevation
temperature lapse rate in K/km:
scheme: constant
value: 5.0
Using lowest model level with an offset:
- filter: Variable Assignment
assignments:
- name: DerivedObsValue/airTemperatureAt2M
type: float
function:
name: ObsFunction/ModelHeightAdjustedAirTemperature
options:
elevation:
name: MetaData/stationElevation
model height:
from: lowestModelLevel
offset in meters: 2.0
Custom observed temperature variable:
- filter: Variable Assignment
assignments:
- name: DerivedObsValue/airTemperatureAt2M
type: float
function:
name: ObsFunction/ModelHeightAdjustedAirTemperature
options:
elevation:
name: MetaData/stationElevation
observed temperature variable: ObsValue/airTemperatureAt2M
Local lapse rate computed between model levels 1 and 10 (counted from surface), with bounds:
- filter: Variable Assignment
assignments:
- name: DerivedObsValue/airTemperatureAt2M
type: float
function:
name: ObsFunction/ModelHeightAdjustedAirTemperature
options:
elevation:
name: MetaData/stationElevation
temperature lapse rate in K/km:
scheme: local
level1: 1
level2: 10
bounds:
minvalue: 0.5
maxvalue: 10.0
Notes¶
Level indices are 1-based and counted from the surface upward (level 1 is the first model level above the surface).
When using
"local"mode, if the height difference between the two levels is less than 1 m, the standard lapse rate (Constants::Lclr) is used as a fallback to avoid numerical instability.When
boundsare specified, the computed local lapse rate is clamped to[minvalue, maxvalue]before applying the adjustment.When the
model heightblock is omitted, the model terrain height (GeoVaLs/height_above_mean_sea_level_at_surface) is used with zero offset.The
offset in metersvalue is added to the model height before computing the height difference \(Z_{\text{station}} - Z_{\text{model}}\).