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:

\[T_{\text{adjusted}} = T_{\text{obs}} + \Gamma \times (Z_{\text{station}} - Z_{\text{model}})\]

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/km parameters block is provided, the value parameter specifies the rate in K/km. When the parameters block is omitted entirely, the standard lapse rate from Constants::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 in group/variable format (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 from GeoVaLs/height_above_mean_sea_level_at_surface) or "lowestModelLevel" (height of the lowest model level from GeoVaLs/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 when scheme is "constant".

    • level1 (optional, default: 1): Lower model level index (1-based, counted from the surface). Used when scheme is "local".

    • level2 (optional, default: 2): Upper model level index (1-based, counted from the surface). Used when scheme is "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 when model height from is "terrain" (default).

  • GeoVaLs/height_above_mean_sea_level — required when model height from is "lowestModelLevel", or when lapse rate scheme is "local".

  • GeoVaLs/air_temperature — required when lapse rate scheme is "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 bounds are specified, the computed local lapse rate is clamped to [minvalue, maxvalue] before applying the adjustment.

  • When the model height block is omitted, the model terrain height (GeoVaLs/height_above_mean_sea_level_at_surface) is used with zero offset.

  • The offset in meters value is added to the model height before computing the height difference \(Z_{\text{station}} - Z_{\text{model}}\).