Version: dev

RRTMLWHeating

Longwave heating of a model column from the RRTM up- and downwelling fluxes (WRF ra_lw_physics = 1, SUBROUTINE RTRN heating-rate loop 7000 and the TTEN/GLW/OLR mapping of SUBROUTINE RRTM in phys/module_ra_rrtm.F, WRF 4.8), written as the pressure-coordinate flux-divergence PDE dT/dt = -(g/cp) dF_net/ds, s = p_sfc - p on the EarthSciDiscretizations grids/column_nonuniform_1d grid. The grid's interface coordinate `ze` is here the PRESSURE DISTANCE ABOVE THE SURFACE s = p_e[1] - p_e (Pa, monotone increasing with lev), so the grid's layer measure dz is the layer pressure thickness p_e[k] - p_e[k+1] and the imported face_flux_D_lev_supplied_faces rule lowers D(F_net, lev) to (F_net[k+1] - F_net[k]) / (p_e[k] - p_e[k+1]); with the RRTM value of g/cp (HEATFAC) this is exactly RTRN's HTR(L-1) = HEATFAC (FNET(L-1) - FNET(L)) / (PZ(L-1) - PZ(L)), L = 1..NLAYERS, PZ in hPa, HTR in K/day, verified against the instrumented WRF dumps to real32 roundoff (this is the convention the instrumentation pass could not reproduce: HTR(L-1), not HTR(L), is the heating of layer L, and HTR(NLAYERS) is simply set to 0). Column mapping: RRTM indexes its column BOTTOM-UP like this grid -- RRTM layer L is model layer L for L <= NLEV (MM5ATM: PAVEL(L) = p(kte+1-L) undoes the top-down ordering of the RRTMLWRAD 1-D arrays), RRTM level L is the model interface L+1 (PZ(0) the surface p8w(1), PZ(NLEV) the model top p_top) -- and MM5ATM extends the column above p_top with NLAYERS - NLEV buffer layers of thickness deltap = 4 hPa down to PZ(NLAYERS) = 0 (temperatures from a standard profile offset to match the model top, constant water vapour 5e-6, model-top CH4/N2O, climatological ozone) so that the fluxes at the model interfaces include the emission of the atmosphere above the model top. Only the fluxes at the NLEV+1 MODEL interfaces enter this component (inputs F_up, F_dn of shape [lev_nodes], the first NLEV+1 entries of TOTUFLUX/TOTDFLUX); the buffer layers are heated by RTRN but their heating is discarded (RRTM: TTEN(K) = HTR(kte-K)/86400 for K = 1..kte, in the wrapper's top-down order). Outputs: dTdt (K/s, WRF TTEN reversed to bottom-up), dthdt = dTdt/exner (the increment RRTMLWRAD adds to RTHRATEN), glw = F_dn at the surface (GLW = TOTDFLUX(0)) and olr = F_up at the MODEL TOP (WRF sets OLR = TOTUFLUX(kte), the upward flux at p_top, not TOTUFLUX(NLAYERS) at the top of the RRTM column; the two differ by 3-7 W/m^2 in the reference run). The fluxes themselves (the RTRN two-stream sweep over 140 g-points and the gas optics) are the later stages of the RRTM transcription; this component is the flux-to-tendency stage that every longwave scheme shares. Inputs are REWRITE-TARGET ops `input_<name>` that the consumer lowers (in the inline tests through a per-test expression_template_imports library extracted from the WRF dumps, because esm-spec 6.6 parameter_overrides admit scalars only). EqWeFiC, cited here for FORTRAN_BUGS.md, couplings/ and components/atmospheric_dynamics/wrf_arw/, is https://github.com/EarthSciML/EqWeFiC, where these components were developed and are coupled into a WRF column.

Domain
atmospheric_radiation
Subdomain
rrtm_lw
Type
model
.esm schema
1.2.0
Source
components/atmospheric_radiation/rrtm_lw/rrtm_lw_heating.esm
Tags
#atmospheric_radiation #rrtm_lw #model #radiation #longwave #rrtm #heating-rate #column #wrf

Description

Longwave heating of a model column from the RRTM up- and downwelling fluxes (WRF ra_lw_physics = 1, SUBROUTINE RTRN heating-rate loop 7000 and the TTEN/GLW/OLR mapping of SUBROUTINE RRTM in phys/module_ra_rrtm.F, WRF 4.8), written as the pressure-coordinate flux-divergence PDE dT/dt = -(g/cp) dF_net/ds, s = p_sfc - p on the EarthSciDiscretizations grids/column_nonuniform_1d grid. The grid’s interface coordinate ze is here the PRESSURE DISTANCE ABOVE THE SURFACE s = p_e[1] - p_e (Pa, monotone increasing with lev), so the grid’s layer measure dz is the layer pressure thickness p_e[k] - p_e[k+1] and the imported face_flux_D_lev_supplied_faces rule lowers D(F_net, lev) to (F_net[k+1] - F_net[k]) / (p_e[k] - p_e[k+1]); with the RRTM value of g/cp (HEATFAC) this is exactly RTRN’s HTR(L-1) = HEATFAC (FNET(L-1) - FNET(L)) / (PZ(L-1) - PZ(L)), L = 1..NLAYERS, PZ in hPa, HTR in K/day, verified against the instrumented WRF dumps to real32 roundoff (this is the convention the instrumentation pass could not reproduce: HTR(L-1), not HTR(L), is the heating of layer L, and HTR(NLAYERS) is simply set to 0). Column mapping: RRTM indexes its column BOTTOM-UP like this grid – RRTM layer L is model layer L for L <= NLEV (MM5ATM: PAVEL(L) = p(kte+1-L) undoes the top-down ordering of the RRTMLWRAD 1-D arrays), RRTM level L is the model interface L+1 (PZ(0) the surface p8w(1), PZ(NLEV) the model top p_top) – and MM5ATM extends the column above p_top with NLAYERS - NLEV buffer layers of thickness deltap = 4 hPa down to PZ(NLAYERS) = 0 (temperatures from a standard profile offset to match the model top, constant water vapour 5e-6, model-top CH4/N2O, climatological ozone) so that the fluxes at the model interfaces include the emission of the atmosphere above the model top. Only the fluxes at the NLEV+1 MODEL interfaces enter this component (inputs F_up, F_dn of shape [lev_nodes], the first NLEV+1 entries of TOTUFLUX/TOTDFLUX); the buffer layers are heated by RTRN but their heating is discarded (RRTM: TTEN(K) = HTR(kte-K)/86400 for K = 1..kte, in the wrapper’s top-down order). Outputs: dTdt (K/s, WRF TTEN reversed to bottom-up), dthdt = dTdt/exner (the increment RRTMLWRAD adds to RTHRATEN), glw = F_dn at the surface (GLW = TOTDFLUX(0)) and olr = F_up at the MODEL TOP (WRF sets OLR = TOTUFLUX(kte), the upward flux at p_top, not TOTUFLUX(NLAYERS) at the top of the RRTM column; the two differ by 3-7 W/m^2 in the reference run). The fluxes themselves (the RTRN two-stream sweep over 140 g-points and the gas optics) are the later stages of the RRTM transcription; this component is the flux-to-tendency stage that every longwave scheme shares. Inputs are REWRITE-TARGET ops input_<name> that the consumer lowers (in the inline tests through a per-test expression_template_imports library extracted from the WRF dumps, because esm-spec 6.6 parameter_overrides admit scalars only). EqWeFiC, cited here for FORTRAN_BUGS.md, couplings/ and components/atmospheric_dynamics/wrf_arw/, is https://github.com/EarthSciML/EqWeFiC , where these components were developed and are coupled into a WRF column.

Reference

  • Mlawer, E. J., S. J. Taubman, P. D. Brown, M. J. Iacono, and S. A. Clough (1997). Radiative transfer for inhomogeneous atmospheres: RRTM, a validated correlated-k model for the longwave. J. Geophys. Res., 102(D14), 16663-16682.
  • WRF 4.8 phys/module_ra_rrtm.F: RTRN loop 7000 (lines 6655-6668, heating rate), RRTM lines 2341-2347 (TTEN/GLW/OLR), MM5ATM lines 4103-4150 (buffer layers above the model top), RRTMLWRAD lines 2029-2063 (column ordering).

Variables

NameUnitsDefaultDescription
TKLayer temperature (WRF t3d), the prognostic state, initialised from input_T and heated by dTdt.

Parameters

NameUnitsDefaultDescription
p_e_inPa0.0Coupling target (assembly input path): a shaped parameter that receives the interface pressure (WRF p8w, bottom-up) from the column geometry (EqWeFiC components/atmospheric_dynamics/wrf_arw/column_geometry.esm, output p_hyd_w, the hydrostatic interface pressure (p_top at the model top, the surface pressure at the ground), which is what WRF passes here rather than the extrapolated p8w) through a document-level coupling.variable_map (param_to_var); a mount-edge template library lowers this component’s input_p_e rewrite target to it (esm-spec 9.7.10, 10.4). Unused by this component’s own inline tests, which lower input_p_e to dumped constants instead.
exner_in10.0Coupling target (assembly input path): a shaped parameter that receives the layer Exner function (WRF pi3d) from the column geometry (EqWeFiC components/atmospheric_dynamics/wrf_arw/column_geometry.esm, output exner) through a document-level coupling.variable_map (param_to_var); a mount-edge template library lowers this component’s input_exner rewrite target to it (esm-spec 9.7.10, 10.4). Unused by this component’s own inline tests, which lower input_exner to dumped constants instead.
F_up_inW/m^20.0Coupling target (assembly input path): a shaped parameter that receives F_up from the upstream component through a document-level coupling.variable_map (param_to_var) when the assembly’s mount-edge template library lowers input_F_up to this parameter (see EqWeFiC couplings/rrtm_lw_column.esm). Standalone, input_F_up is lowered to a dumped column by the test’s library and this parameter is unused (default 0).
F_dn_inW/m^20.0Coupling target (assembly input path): a shaped parameter that receives F_dn from the upstream component through a document-level coupling.variable_map (param_to_var) when the assembly’s mount-edge template library lowers input_F_dn to this parameter (see EqWeFiC couplings/rrtm_lw_column.esm). Standalone, input_F_dn is lowered to a dumped column by the test’s library and this parameter is unused (default 0).

Observed

NameUnitsDefaultDescription
p_ePaInterface (full-level) pressure, p_e[1] the surface pressure and p_e[NLEV+1] the model-top pressure p_top (WRF p8w, bottom-up; RRTM PZ(0..kte) times 100), consumer-supplied through input_p_e.
zePaThe grid’s interface coordinate: pressure distance above the surface s = p_e[1] - p_e, 0 at the surface and increasing upward, so that the column grid’s finite-volume operators are taken with respect to pressure (the grid contract: a pressure- or mass-based column supplies its own monotone interface coordinate as ze).
zcPaLayer mid-point of the pressure coordinate, (ze[k] + ze[k+1])/2 (grid template column_cell_center).
dzPaLayer pressure thickness p_e[k] - p_e[k+1] = ze[k+1] - ze[k] (grid template column_cell_thickness); the control measure read by the flux-divergence rule (RTRN: PZ(L-1) - PZ(L) in hPa).
F_upW/m^2Upwelling longwave flux at the model interfaces (RRTM TOTUFLUX(0..kte), bottom-up), consumer-supplied through input_F_up.
F_dnW/m^2Downwelling longwave flux at the model interfaces (RRTM TOTDFLUX(0..kte), bottom-up), consumer-supplied through input_F_dn.
F_netW/m^2Net upward longwave flux F_up - F_dn at the model interfaces (RTRN FNET).
exner1Exner function of the layer (WRF pi3d), consumer-supplied through input_exner; converts the temperature tendency into the potential-temperature tendency RTHRATEN.
g_over_cpK/mRRTM’s g/cp in SI, HEATFAC converted from K/day per (W/m^2/hPa) to K/s per (W/m^2/Pa): heatfac pa_per_hpa / seconds_per_day = 9.76748e-3 K/m (the dry-adiabatic lapse rate with RRTM’s g and cp).
dTdtK/sLongwave heating rate -(g/cp) dF_net/ds of each model layer (RRTM TTEN, reversed to bottom-up; HTR(L-1)/86400 for layer L).
dthdtK/sPotential-temperature tendency dTdt/exner (the increment RRTMLWRAD adds to RTHRATEN).
glwW/m^2Downwelling longwave flux at the surface, F_dn[1] (RRTM GLW = TOTDFLUX(0)). Template wrf_glw of rrtm_flux_diagnostics.esm, shared with rtrn_sweep.esm.
olrW/m^2WRF’s OLR diagnostic: the upwelling longwave flux at the MODEL TOP, F_up[NLEV+1] (RRTM OLR = TOTUFLUX(kte)), which is not the flux at the top of the extended RRTM column (TOTUFLUX(NLAYERS), 3-7 W/m^2 lower in the reference run because the buffer layers above p_top absorb). Template wrf_olr of rrtm_flux_diagnostics.esm, shared with rtrn_sweep.esm.

Observed expressions

$$ p_{e} = \mathrm{input_p_e}\left(\right) $$

Interface (full-level) pressure, p_e[1] the surface pressure and p_e[NLEV+1] the model-top pressure p_top (WRF p8w, bottom-up; RRTM PZ(0..kte) times 100), consumer-supplied through input_p_e.

$$ ze = \mathrm{aggregate}\left(p_{e}\right) $$

The grid’s interface coordinate: pressure distance above the surface s = p_e[1] - p_e, 0 at the surface and increasing upward, so that the column grid’s finite-volume operators are taken with respect to pressure (the grid contract: a pressure- or mass-based column supplies its own monotone interface coordinate as ze).

$$ zc = \mathrm{column_cell_center}\left(ze=ze\right) $$

Layer mid-point of the pressure coordinate, (ze[k] + ze[k+1])/2 (grid template column_cell_center).

$$ dz = \mathrm{column_cell_thickness}\left(ze=ze\right) $$

Layer pressure thickness p_e[k] - p_e[k+1] = ze[k+1] - ze[k] (grid template column_cell_thickness); the control measure read by the flux-divergence rule (RTRN: PZ(L-1) - PZ(L) in hPa).

$$ F_{up} = \mathrm{input_F_up}\left(\right) $$

Upwelling longwave flux at the model interfaces (RRTM TOTUFLUX(0..kte), bottom-up), consumer-supplied through input_F_up.

$$ F_{dn} = \mathrm{input_F_dn}\left(\right) $$

Downwelling longwave flux at the model interfaces (RRTM TOTDFLUX(0..kte), bottom-up), consumer-supplied through input_F_dn.

$$ F_{net} = F_{up} - F_{dn} $$

Net upward longwave flux F_up - F_dn at the model interfaces (RTRN FNET).

$$ exner = \mathrm{input_exner}\left(\right) $$

Exner function of the layer (WRF pi3d), consumer-supplied through input_exner; converts the temperature tendency into the potential-temperature tendency RTHRATEN.

$$ g_{over\,cp} = \frac{par.heatfac \cdot par.pa_{per\,hpa}}{par.seconds_{per\,day}} $$

RRTM’s g/cp in SI, HEATFAC converted from K/day per (W/m^2/hPa) to K/s per (W/m^2/Pa): heatfac pa_per_hpa / seconds_per_day = 9.76748e-3 K/m (the dry-adiabatic lapse rate with RRTM’s g and cp).

$$ dTdt = \left(-1.0\right) \cdot g_{over\,cp} \cdot \mathrm{D}\left(F_{net}\right) $$

Longwave heating rate -(g/cp) dF_net/ds of each model layer (RRTM TTEN, reversed to bottom-up; HTR(L-1)/86400 for layer L).

$$ dthdt = \frac{dTdt}{exner} $$

Potential-temperature tendency dTdt/exner (the increment RRTMLWRAD adds to RTHRATEN).

$$ glw = \mathrm{wrf_glw}\left(F_{dn}=F_{dn}\right) $$

Downwelling longwave flux at the surface, F_dn[1] (RRTM GLW = TOTDFLUX(0)). Template wrf_glw of rrtm_flux_diagnostics.esm, shared with rtrn_sweep.esm.

$$ olr = \mathrm{wrf_olr}\left(F_{up}=F_{up}\right) $$

WRF’s OLR diagnostic: the upwelling longwave flux at the MODEL TOP, F_up[NLEV+1] (RRTM OLR = TOTUFLUX(kte)), which is not the flux at the top of the extended RRTM column (TOTUFLUX(NLAYERS), 3-7 W/m^2 lower in the reference run because the buffer layers above p_top absorb). Template wrf_olr of rrtm_flux_diagnostics.esm, shared with rtrn_sweep.esm.

Equations

$$ \mathrm{ic}\left(T\right) = \mathrm{input_T}\left(\right) $$ $$ \mathrm{D}\left(T\right) = dTdt $$

Raw .esm

Raw .esm JSON (this component)
{
  "expression_template_imports": [
    {
      "ref": "${ESD_ROOT}/grids/column_nonuniform_1d/grid.esm",
      "bindings": {
        "NLEV": "NLEV"
      }
    },
    {
      "ref": "${ESD_ROOT}/grids/column_nonuniform_1d/rules/face_flux_D_lev_supplied_faces.esm",
      "bindings": {
        "NLEV": "NLEV"
      }
    },
    {
      "ref": "./rrtm_flux_diagnostics.esm",
      "bindings": {
        "NLEV": "NLEV"
      }
    }
  ],
  "subsystems": {
    "wrf": {
      "ref": "../../../lib/wrf_constants.esm"
    },
    "par": {
      "ref": "./rrtm_parameters.esm"
    }
  },
  "variables": {
    "p_e_in": {
      "type": "parameter",
      "shape": [
        "lev_nodes"
      ],
      "units": "Pa",
      "default": 0.0,
      "description": "Coupling target (assembly input path): a shaped parameter that receives the interface pressure (WRF p8w, bottom-up) from the column geometry (EqWeFiC components/atmospheric_dynamics/wrf_arw/column_geometry.esm, output `p_hyd_w`, the hydrostatic interface pressure (p_top at the model top, the surface pressure at the ground), which is what WRF passes here rather than the extrapolated p8w) through a document-level `coupling.variable_map` (param_to_var); a mount-edge template library lowers this component's `input_p_e` rewrite target to it (esm-spec 9.7.10, 10.4). Unused by this component's own inline tests, which lower `input_p_e` to dumped constants instead."
    },
    "exner_in": {
      "type": "parameter",
      "shape": [
        "lev"
      ],
      "units": "1",
      "default": 0.0,
      "description": "Coupling target (assembly input path): a shaped parameter that receives the layer Exner function (WRF pi3d) from the column geometry (EqWeFiC components/atmospheric_dynamics/wrf_arw/column_geometry.esm, output `exner`) through a document-level `coupling.variable_map` (param_to_var); a mount-edge template library lowers this component's `input_exner` rewrite target to it (esm-spec 9.7.10, 10.4). Unused by this component's own inline tests, which lower `input_exner` to dumped constants instead."
    },
    "F_up_in": {
      "type": "parameter",
      "units": "W/m^2",
      "shape": [
        "lev_nodes"
      ],
      "default": 0.0,
      "description": "Coupling target (assembly input path): a shaped parameter that receives `F_up` from the upstream component through a document-level `coupling.variable_map` (`param_to_var`) when the assembly's mount-edge template library lowers `input_F_up` to this parameter (see EqWeFiC couplings/rrtm_lw_column.esm). Standalone, `input_F_up` is lowered to a dumped column by the test's library and this parameter is unused (default 0)."
    },
    "F_dn_in": {
      "type": "parameter",
      "units": "W/m^2",
      "shape": [
        "lev_nodes"
      ],
      "default": 0.0,
      "description": "Coupling target (assembly input path): a shaped parameter that receives `F_dn` from the upstream component through a document-level `coupling.variable_map` (`param_to_var`) when the assembly's mount-edge template library lowers `input_F_dn` to this parameter (see EqWeFiC couplings/rrtm_lw_column.esm). Standalone, `input_F_dn` is lowered to a dumped column by the test's library and this parameter is unused (default 0)."
    },
    "p_e": {
      "type": "unknown",
      "units": "Pa",
      "shape": [
        "lev_nodes"
      ],
      "description": "Interface (full-level) pressure, p_e[1] the surface pressure and p_e[NLEV+1] the model-top pressure p_top (WRF p8w, bottom-up; RRTM PZ(0..kte) times 100), consumer-supplied through `input_p_e`."
    },
    "ze": {
      "type": "unknown",
      "units": "Pa",
      "shape": [
        "lev_nodes"
      ],
      "description": "The grid's interface coordinate: pressure distance above the surface s = p_e[1] - p_e, 0 at the surface and increasing upward, so that the column grid's finite-volume operators are taken with respect to pressure (the grid contract: a pressure- or mass-based column supplies its own monotone interface coordinate as ze)."
    },
    "zc": {
      "type": "unknown",
      "units": "Pa",
      "shape": [
        "lev"
      ],
      "description": "Layer mid-point of the pressure coordinate, (ze[k] + ze[k+1])/2 (grid template column_cell_center)."
    },
    "dz": {
      "type": "unknown",
      "units": "Pa",
      "shape": [
        "lev"
      ],
      "description": "Layer pressure thickness p_e[k] - p_e[k+1] = ze[k+1] - ze[k] (grid template column_cell_thickness); the control measure read by the flux-divergence rule (RTRN: PZ(L-1) - PZ(L) in hPa)."
    },
    "F_up": {
      "type": "unknown",
      "units": "W/m^2",
      "shape": [
        "lev_nodes"
      ],
      "description": "Upwelling longwave flux at the model interfaces (RRTM TOTUFLUX(0..kte), bottom-up), consumer-supplied through `input_F_up`."
    },
    "F_dn": {
      "type": "unknown",
      "units": "W/m^2",
      "shape": [
        "lev_nodes"
      ],
      "description": "Downwelling longwave flux at the model interfaces (RRTM TOTDFLUX(0..kte), bottom-up), consumer-supplied through `input_F_dn`."
    },
    "F_net": {
      "type": "unknown",
      "units": "W/m^2",
      "shape": [
        "lev_nodes"
      ],
      "description": "Net upward longwave flux F_up - F_dn at the model interfaces (RTRN FNET)."
    },
    "exner": {
      "type": "unknown",
      "units": "1",
      "shape": [
        "lev"
      ],
      "description": "Exner function of the layer (WRF pi3d), consumer-supplied through `input_exner`; converts the temperature tendency into the potential-temperature tendency RTHRATEN."
    },
    "T": {
      "type": "unknown",
      "units": "K",
      "shape": [
        "lev"
      ],
      "description": "Layer temperature (WRF t3d), the prognostic state, initialised from `input_T` and heated by dTdt."
    },
    "g_over_cp": {
      "type": "unknown",
      "units": "K/m",
      "description": "RRTM's g/cp in SI, HEATFAC converted from K/day per (W/m^2/hPa) to K/s per (W/m^2/Pa): heatfac pa_per_hpa / seconds_per_day = 9.76748e-3 K/m (the dry-adiabatic lapse rate with RRTM's g and cp)."
    },
    "dTdt": {
      "type": "unknown",
      "units": "K/s",
      "shape": [
        "lev"
      ],
      "description": "Longwave heating rate -(g/cp) dF_net/ds of each model layer (RRTM TTEN, reversed to bottom-up; HTR(L-1)/86400 for layer L)."
    },
    "dthdt": {
      "type": "unknown",
      "units": "K/s",
      "shape": [
        "lev"
      ],
      "description": "Potential-temperature tendency dTdt/exner (the increment RRTMLWRAD adds to RTHRATEN)."
    },
    "glw": {
      "type": "unknown",
      "units": "W/m^2",
      "description": "Downwelling longwave flux at the surface, F_dn[1] (RRTM GLW = TOTDFLUX(0)). Template wrf_glw of rrtm_flux_diagnostics.esm, shared with rtrn_sweep.esm."
    },
    "olr": {
      "type": "unknown",
      "units": "W/m^2",
      "description": "WRF's OLR diagnostic: the upwelling longwave flux at the MODEL TOP, F_up[NLEV+1] (RRTM OLR = TOTUFLUX(kte)), which is not the flux at the top of the extended RRTM column (TOTUFLUX(NLAYERS), 3-7 W/m^2 lower in the reference run because the buffer layers above p_top absorb). Template wrf_olr of rrtm_flux_diagnostics.esm, shared with rtrn_sweep.esm."
    }
  },
  "equations": [
    {
      "lhs": "p_e",
      "rhs": {
        "op": "input_p_e",
        "args": []
      }
    },
    {
      "lhs": "ze",
      "rhs": {
        "op": "aggregate",
        "output_idx": [
          "kn"
        ],
        "args": [
          "p_e"
        ],
        "ranges": {
          "kn": {
            "from": "lev_nodes"
          }
        },
        "expr": {
          "op": "-",
          "args": [
            {
              "op": "index",
              "args": [
                "p_e",
                1
              ]
            },
            {
              "op": "index",
              "args": [
                "p_e",
                "kn"
              ]
            }
          ]
        }
      }
    },
    {
      "lhs": "zc",
      "rhs": {
        "op": "apply_expression_template",
        "args": [],
        "name": "column_cell_center",
        "bindings": {
          "ze": "ze"
        }
      }
    },
    {
      "lhs": "dz",
      "rhs": {
        "op": "apply_expression_template",
        "args": [],
        "name": "column_cell_thickness",
        "bindings": {
          "ze": "ze"
        }
      }
    },
    {
      "lhs": "F_up",
      "rhs": {
        "op": "input_F_up",
        "args": []
      }
    },
    {
      "lhs": "F_dn",
      "rhs": {
        "op": "input_F_dn",
        "args": []
      }
    },
    {
      "lhs": "F_net",
      "rhs": {
        "op": "-",
        "args": [
          "F_up",
          "F_dn"
        ]
      }
    },
    {
      "lhs": "exner",
      "rhs": {
        "op": "input_exner",
        "args": []
      }
    },
    {
      "lhs": {
        "op": "ic",
        "args": [
          "T"
        ]
      },
      "rhs": {
        "op": "input_T",
        "args": []
      }
    },
    {
      "lhs": "g_over_cp",
      "rhs": {
        "op": "/",
        "args": [
          {
            "op": "*",
            "args": [
              "par.heatfac",
              "par.pa_per_hpa"
            ]
          },
          "par.seconds_per_day"
        ]
      }
    },
    {
      "lhs": "dTdt",
      "rhs": {
        "op": "*",
        "args": [
          -1.0,
          "g_over_cp",
          {
            "op": "D",
            "args": [
              "F_net"
            ],
            "wrt": "lev"
          }
        ]
      }
    },
    {
      "lhs": {
        "op": "D",
        "args": [
          "T"
        ],
        "wrt": "t"
      },
      "rhs": "dTdt"
    },
    {
      "lhs": "dthdt",
      "rhs": {
        "op": "/",
        "args": [
          "dTdt",
          "exner"
        ]
      }
    },
    {
      "lhs": "glw",
      "rhs": {
        "op": "apply_expression_template",
        "args": [],
        "name": "wrf_glw",
        "bindings": {
          "F_dn": "F_dn"
        }
      }
    },
    {
      "lhs": "olr",
      "rhs": {
        "op": "apply_expression_template",
        "args": [],
        "name": "wrf_olr",
        "bindings": {
          "F_up": "F_up"
        }
      }
    }
  ],
  "tests": [
    {
      "id": "scm_call1_evening_clear",
      "description": "Reference: WRF 4.8 em_scm_xy single-column run (GNU real32 build, dt = 60 s, 59 layers, mp=6 ra_lw=1 ra_sw=1 sf_sfclay=1 sf_surface=1 bl_pbl=1, radt = 30 min) dumped by the instrumented fork ctessum-claude/WRF, commit e42a269 (v4.8.0-2-ge42a269e); module_esm_dump hooks in RRTMLWRAD and after RTRN inside SUBROUTINE RRTM of phys/module_ra_rrtm.F). RRTM has no standalone real64 driver (rrtminit needs WRF's I/O layer for the k-distribution data), so every expected value is the real32 in-model value and the tolerance contract is rel 1e-5. Inputs are the dumped RRTMLWRAD arguments of tile column 1 (p8w, pi3d, t3d, bottom-up) and the RRTM fluxes TOTUFLUX/TOTDFLUX at the model interfaces (RRTM levels 0..kte, already bottom-up). Expected values: dTdt against HTR(0..kte-1)/86400 (the RTRN heating of RRTM layers 1..kte, i.e. HTR(L-1) is layer L), dthdt against the wrapper's RTHRATEN increment, F_net and dz against the identities on the inputs, glw = TOTDFLUX(0), olr = TOTUFLUX(kte). Measured mismatch of this component against HTR over the four regimes is <= 2.4e-10 K/s in Linf (5e-6 of the column maximum of |dTdt|) and <= 5.3e-6 relative at the three largest-|dTdt| layers (real32 arithmetic of HEATFAC*(FNET(L-1)-FNET(L))/(PZ(L-1)-PZ(L)): differences of O(300 W/m^2) fluxes and O(1000 hPa) pressures carried in single precision), so the column assertions use Linf_error abs 1e-9 K/s (about 1e-5 of the column maximum) and the spot checks rel 1e-5, the real32 contract; the identities (F_net, dz, glw, olr, g_over_cp) use rel/abs 1e-9. The scheme is diagnostic (no time step), so no small-dt replay is involved. Regime: first radiation call (call 1, 19:00 UTC = 12:34 LST), clear sky (cldfra = 0, no condensate), tsk = 288.0 K, glw = 258.1 W/m^2, olr (model top) = 251.5 W/m^2; strongest cooling in the lowest layer and at layers 38-39 (the moist layer top).",
      "parameter_overrides": {},
      "expression_template_imports": [
        {
          "ref": "./tests/scm_call1_evening_clear_inputs.esm"
        }
      ],
      "time_span": {
        "start": 0,
        "end": 1
      },
      "tolerance": {
        "rel": 1e-09
      },
      "assertions": [
        {
          "variable": "g_over_cp",
          "time": 0.0,
          "expected": 0.009767476851851852,
          "tolerance": {
            "rel": 1e-09
          }
        },
        {
          "variable": "dz",
          "time": 0.0,
          "reduce": "Linf_error",
          "expected": 0.0,
          "reference": {
            "op": "aggregate",
            "output_idx": [
              "k"
            ],
            "args": [],
            "ranges": {
              "k": {
                "from": "lev"
              }
            },
            "expr": {
              "op": "index",
              "args": [
                {
                  "op": "const",
                  "args": [],
                  "value": [
                    596.734375,
                    611.84375,
                    627.328125,
                    643.21875,
                    659.5,
                    676.1875,
                    693.3125,
                    710.859375,
                    728.859375,
                    747.3125,
                    766.2265625,
                    785.625,
                    805.5078125,
                    825.90625,
                    846.40625,
                    866.53125,
                    888.6640625,
                    911.3671875,
                    934.6484375,
                    958.546875,
                    983.0390625,
                    1008.1875,
                    1033.9765625,
                    1060.4296875,
                    1087.5703125,
                    1115.40625,
                    1143.5546875,
                    1172.390625,
                    1201.9609375,
                    1232.28125,
                    1263.3515625,
                    1295.203125,
                    1327.859375,
                    1361.3359375,
                    1395.64453125,
                    1430.82421875,
                    1466.80078125,
                    1503.63671875,
                    1541.41796875,
                    1580.17578125,
                    1619.9140625,
                    1660.64453125,
                    1702.421875,
                    1745.203125,
                    1789.0390625,
                    1833.99609375,
                    1880.09765625,
                    1927.70703125,
                    1976.49609375,
                    2026.53515625,
                    2077.83984375,
                    2130.43359375,
                    2184.37890625,
                    2239.671875,
                    2296.361328125,
                    2354.484375,
                    2414.10546875,
                    2475.228515625,
                    2537.873046875
                  ]
                },
                "k"
              ]
            }
          },
          "tolerance": {
            "abs": 1e-06
          }
        },
        {
          "variable": "ze",
          "time": 0.0,
          "reduce": "Linf_error",
          "expected": 0.0,
          "reference": {
            "op": "aggregate",
            "output_idx": [
              "k"
            ],
            "args": [],
            "ranges": {
              "k": {
                "from": "lev_nodes"
              }
            },
            "expr": {
              "op": "index",
              "args": [
                {
                  "op": "const",
                  "args": [],
                  "value": [
                    0.0,
                    596.734375,
                    1208.578125,
                    1835.90625,
                    2479.125,
                    3138.625,
                    3814.8125,
                    4508.125,
                    5218.984375,
                    5947.84375,
                    6695.15625,
                    7461.3828125,
                    8247.0078125,
                    9052.515625,
                    9878.421875,
                    10724.828125,
                    11591.359375,
                    12480.0234375,
                    13391.390625,
                    14326.0390625,
                    15284.5859375,
                    16267.625,
                    17275.8125,
                    18309.7890625,
                    19370.21875,
                    20457.7890625,
                    21573.1953125,
                    22716.75,
                    23889.140625,
                    25091.1015625,
                    26323.3828125,
                    27586.734375,
                    28881.9375,
                    30209.796875,
                    31571.1328125,
                    32966.77734375,
                    34397.6015625,
                    35864.40234375,
                    37368.0390625,
                    38909.45703125,
                    40489.6328125,
                    42109.546875,
                    43770.19140625,
                    45472.61328125,
                    47217.81640625,
                    49006.85546875,
                    50840.8515625,
                    52720.94921875,
                    54648.65625,
                    56625.15234375,
                    58651.6875,
                    60729.52734375,
                    62859.9609375,
                    65044.33984375,
                    67284.01171875,
                    69580.373046875,
                    71934.857421875,
                    74348.962890625,
                    76824.19140625,
                    79362.064453125
                  ]
                },
                "k"
              ]
            }
          },
          "tolerance": {
            "abs": 1e-06
          }
        },
        {
          "variable": "F_net",
          "time": 0.0,
          "reduce": "Linf_error",
          "expected": 0.0,
          "reference": {
            "op": "aggregate",
            "output_idx": [
              "k"
            ],
            "args": [],
            "ranges": {
              "k": {
                "from": "lev_nodes"
              }
            },
            "expr": {
              "op": "index",
              "args": [
                {
                  "op": "const",
                  "args": [],
                  "value": [
                    121.39840698242188,
                    116.04458618164062,
                    115.74505615234375,
                    115.87049865722656,
                    116.12509155273438,
                    116.42520141601562,
                    116.73133850097656,
                    117.02584838867188,
                    117.28280639648438,
                    117.48208618164062,
                    117.59884643554688,
                    117.58186340332031,
                    117.33355712890625,
                    116.58712768554688,
                    113.89762878417969,
                    113.70494079589844,
                    115.689697265625,
                    116.84977722167969,
                    117.77621459960938,
                    118.63824462890625,
                    119.5059814453125,
                    120.44645690917969,
                    121.50479125976562,
                    122.71064758300781,
                    124.1083984375,
                    125.7783203125,
                    127.81422424316406,
                    129.9840087890625,
                    132.3035888671875,
                    134.78468322753906,
                    137.46669006347656,
                    140.3414306640625,
                    143.4545440673828,
                    146.84385681152344,
                    150.5635528564453,
                    154.70494079589844,
                    159.45375061035156,
                    164.44198608398438,
                    169.73606872558594,
                    175.47596740722656,
                    180.9467010498047,
                    186.4367218017578,
                    192.0836639404297,
                    197.90242767333984,
                    203.9805679321289,
                    210.1114044189453,
                    215.33899688720703,
                    217.84223175048828,
                    219.95657348632812,
                    221.87322998046875,
                    223.6592788696289,
                    225.2471466064453,
                    226.71625900268555,
                    228.07350540161133,
                    229.3031997680664,
                    230.44319534301758,
                    231.5967903137207,
                    232.83878135681152,
                    234.643404006958,
                    240.01601791381836
                  ]
                },
                "k"
              ]
            }
          },
          "tolerance": {
            "abs": 1e-09
          }
        },
        {
          "variable": "glw",
          "time": 0.0,
          "expected": 258.14453125,
          "tolerance": {
            "rel": 1e-09
          }
        },
        {
          "variable": "olr",
          "time": 0.0,
          "expected": 251.52928161621094,
          "tolerance": {
            "rel": 1e-09
          }
        },
        {
          "variable": "dTdt",
          "time": 0.0,
          "reduce": "Linf_error",
          "expected": 0.0,
          "reference": {
            "op": "aggregate",
            "output_idx": [
              "k"
            ],
            "args": [],
            "ranges": {
              "k": {
                "from": "lev"
              }
            },
            "expr": {
              "op": "index",
              "args": [
                {
                  "op": "const",
                  "args": [],
                  "value": [
                    8.76324596228423e-05,
                    4.7816739728053415e-06,
                    -1.9531438334120647e-06,
                    -3.866071088446511e-06,
                    -4.444733882943789e-06,
                    -4.422149310509364e-06,
                    -4.149105537820745e-06,
                    -3.5306763041902474e-06,
                    -2.670564550768446e-06,
                    -1.5260686201077921e-06,
                    2.1649227063688966e-07,
                    3.0871246148038794e-06,
                    9.05112811812648e-06,
                    3.180690109729767e-05,
                    2.2236111194447236e-06,
                    -2.237194942103492e-05,
                    -1.2750724951426187e-05,
                    -9.928950005107455e-06,
                    -9.008630834243916e-06,
                    -8.842095180794045e-06,
                    -9.344571994410621e-06,
                    -1.0253335176794617e-05,
                    -1.1391122997910888e-05,
                    -1.2874481854615388e-05,
                    -1.4997624136783459e-05,
                    -1.7828081768971903e-05,
                    -1.8532844605269256e-05,
                    -1.93250455238201e-05,
                    -2.016210859572446e-05,
                    -2.125848636583046e-05,
                    -2.222571935918596e-05,
                    -2.347683740986718e-05,
                    -2.493118522343812e-05,
                    -2.668843777091415e-05,
                    -2.8983729856985585e-05,
                    -3.24176362267247e-05,
                    -3.321678274207645e-05,
                    -3.4389821467576205e-05,
                    -3.637190494272444e-05,
                    -3.381602466106415e-05,
                    -3.3102866124223777e-05,
                    -3.321383562352922e-05,
                    -3.338460017133642e-05,
                    -3.4017736713091536e-05,
                    -3.347210862018444e-05,
                    -2.7841009475566724e-05,
                    -1.3004806306627061e-05,
                    -1.0713173973339575e-05,
                    -9.471764443097291e-06,
                    -8.608347011937036e-06,
                    -7.464254481924905e-06,
                    -6.7355152633455066e-06,
                    -6.068903538915846e-06,
                    -5.3628323668683015e-06,
                    -4.848937883421227e-06,
                    -4.785638992433195e-06,
                    -5.0250916845268675e-06,
                    -7.121219403213925e-06,
                    -2.067752182483673e-05
                  ]
                },
                "k"
              ]
            }
          },
          "tolerance": {
            "abs": 1e-09
          }
        },
        {
          "variable": "dTdt",
          "time": 0.0,
          "coords": {
            "lev": 1
          },
          "expected": 8.76324596228423e-05,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "dTdt",
          "time": 0.0,
          "coords": {
            "lev": 39
          },
          "expected": -3.637190494272444e-05,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "dTdt",
          "time": 0.0,
          "coords": {
            "lev": 38
          },
          "expected": -3.4389821467576205e-05,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "dthdt",
          "time": 0.0,
          "reduce": "Linf_error",
          "expected": 0.0,
          "reference": {
            "op": "aggregate",
            "output_idx": [
              "k"
            ],
            "args": [],
            "ranges": {
              "k": {
                "from": "lev"
              }
            },
            "expr": {
              "op": "index",
              "args": [
                {
                  "op": "const",
                  "args": [],
                  "value": [
                    8.844403782859445e-05,
                    4.8345973482355475e-06,
                    -1.978409500225098e-06,
                    -3.923549229511991e-06,
                    -4.519693902693689e-06,
                    -4.505867764237337e-06,
                    -4.2365290937596e-06,
                    -3.6128863030171487e-06,
                    -2.7388700800656807e-06,
                    -1.5687255654484034e-06,
                    2.2307646929675684e-07,
                    3.1888891953713028e-06,
                    9.373435204906855e-06,
                    3.30268194375094e-05,
                    2.3152267658588244e-06,
                    -2.33597747865133e-05,
                    -1.3352819223655388e-05,
                    -1.0429436770209577e-05,
                    -9.49257992033381e-06,
                    -9.347584636998363e-06,
                    -9.91232900560135e-06,
                    -1.0914641279669013e-05,
                    -1.2170202353445347e-05,
                    -1.3807335562887602e-05,
                    -1.614792381587904e-05,
                    -1.9274442820460536e-05,
                    -2.0122159185120836e-05,
                    -2.1075811673654243e-05,
                    -2.209080230386462e-05,
                    -2.340479113627225e-05,
                    -2.4593226044089533e-05,
                    -2.611453783174511e-05,
                    -2.7885012968908995e-05,
                    -3.0022361897863448e-05,
                    -3.280090095358901e-05,
                    -3.6918718251399696e-05,
                    -3.807934626820497e-05,
                    -3.969819954363629e-05,
                    -4.229307160130702e-05,
                    -3.9623540942557156e-05,
                    -3.910235682269558e-05,
                    -3.956917498726398e-05,
                    -4.013247962575406e-05,
                    -4.1285515180788934e-05,
                    -4.103651735931635e-05,
                    -3.450211079325527e-05,
                    -1.630216502235271e-05,
                    -1.3595095879281871e-05,
                    -1.2178687029518187e-05,
                    -1.122599951486336e-05,
                    -9.883584425551817e-06,
                    -9.067289283848368e-06,
                    -8.318317668454256e-06,
                    -7.496920261473861e-06,
                    -6.927485173946479e-06,
                    -7.004174676694674e-06,
                    -7.556528998975409e-06,
                    -1.1042669029848184e-05,
                    -3.321784606669098e-05
                  ]
                },
                "k"
              ]
            }
          },
          "tolerance": {
            "abs": 1e-09
          }
        },
        {
          "variable": "dthdt",
          "time": 0.0,
          "coords": {
            "lev": 1
          },
          "expected": 8.844403782859445e-05,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "dthdt",
          "time": 0.0,
          "coords": {
            "lev": 39
          },
          "expected": -4.229307160130702e-05,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "dthdt",
          "time": 0.0,
          "coords": {
            "lev": 38
          },
          "expected": -3.969819954363629e-05,
          "tolerance": {
            "rel": 1e-05
          }
        }
      ]
    },
    {
      "id": "scm_call600_night_cirrus",
      "description": "Reference: WRF 4.8 em_scm_xy single-column run (GNU real32 build, dt = 60 s, 59 layers, mp=6 ra_lw=1 ra_sw=1 sf_sfclay=1 sf_surface=1 bl_pbl=1, radt = 30 min) dumped by the instrumented fork ctessum-claude/WRF, commit e42a269 (v4.8.0-2-ge42a269e); module_esm_dump hooks in RRTMLWRAD and after RTRN inside SUBROUTINE RRTM of phys/module_ra_rrtm.F). RRTM has no standalone real64 driver (rrtminit needs WRF's I/O layer for the k-distribution data), so every expected value is the real32 in-model value and the tolerance contract is rel 1e-5. Inputs are the dumped RRTMLWRAD arguments of tile column 1 (p8w, pi3d, t3d, bottom-up) and the RRTM fluxes TOTUFLUX/TOTDFLUX at the model interfaces (RRTM levels 0..kte, already bottom-up). Expected values: dTdt against HTR(0..kte-1)/86400 (the RTRN heating of RRTM layers 1..kte, i.e. HTR(L-1) is layer L), dthdt against the wrapper's RTHRATEN increment, F_net and dz against the identities on the inputs, glw = TOTDFLUX(0), olr = TOTUFLUX(kte). Measured mismatch of this component against HTR over the four regimes is <= 2.4e-10 K/s in Linf (5e-6 of the column maximum of |dTdt|) and <= 5.3e-6 relative at the three largest-|dTdt| layers (real32 arithmetic of HEATFAC*(FNET(L-1)-FNET(L))/(PZ(L-1)-PZ(L)): differences of O(300 W/m^2) fluxes and O(1000 hPa) pressures carried in single precision), so the column assertions use Linf_error abs 1e-9 K/s (about 1e-5 of the column maximum) and the spot checks rel 1e-5, the real32 contract; the identities (F_net, dz, glw, olr, g_over_cp) use rel/abs 1e-9. The scheme is diagnostic (no time step), so no small-dt replay is involved. Regime: call 600 (00:00 UTC = 17:34 LST, after sunset), a 7-layer ice cloud (cldfra = 1, qi <= 1.7e-6) at layers 52-57 near the model top, tsk = 281.5 K, glw = 264.4 W/m^2, olr = 239.2 W/m^2.",
      "parameter_overrides": {},
      "expression_template_imports": [
        {
          "ref": "./tests/scm_call600_night_cirrus_inputs.esm"
        }
      ],
      "time_span": {
        "start": 0,
        "end": 1
      },
      "tolerance": {
        "rel": 1e-09
      },
      "assertions": [
        {
          "variable": "g_over_cp",
          "time": 0.0,
          "expected": 0.009767476851851852,
          "tolerance": {
            "rel": 1e-09
          }
        },
        {
          "variable": "dz",
          "time": 0.0,
          "reduce": "Linf_error",
          "expected": 0.0,
          "reference": {
            "op": "aggregate",
            "output_idx": [
              "k"
            ],
            "args": [],
            "ranges": {
              "k": {
                "from": "lev"
              }
            },
            "expr": {
              "op": "index",
              "args": [
                {
                  "op": "const",
                  "args": [],
                  "value": [
                    597.9375,
                    612.828125,
                    628.1640625,
                    643.9609375,
                    660.1796875,
                    676.8359375,
                    693.9375,
                    711.46875,
                    729.453125,
                    747.8984375,
                    766.796875,
                    786.1640625,
                    806.0,
                    826.3046875,
                    846.890625,
                    866.59375,
                    888.6640625,
                    911.3671875,
                    934.6484375,
                    958.546875,
                    983.0390625,
                    1008.1875,
                    1033.9765625,
                    1060.4296875,
                    1087.5703125,
                    1115.3984375,
                    1143.5546875,
                    1172.390625,
                    1201.9609375,
                    1232.28125,
                    1263.3515625,
                    1295.203125,
                    1327.859375,
                    1361.3359375,
                    1395.64453125,
                    1430.82421875,
                    1466.80078125,
                    1503.63671875,
                    1541.3671875,
                    1580.08984375,
                    1619.90234375,
                    1660.6484375,
                    1702.4296875,
                    1745.20703125,
                    1789.0546875,
                    1834.05859375,
                    1880.15234375,
                    1927.70703125,
                    1976.50390625,
                    2026.6015625,
                    2078.109375,
                    2130.61328125,
                    2184.4296875,
                    2239.619140625,
                    2296.236328125,
                    2354.306640625,
                    2413.892578125,
                    2474.994140625,
                    2537.625
                  ]
                },
                "k"
              ]
            }
          },
          "tolerance": {
            "abs": 1e-06
          }
        },
        {
          "variable": "ze",
          "time": 0.0,
          "reduce": "Linf_error",
          "expected": 0.0,
          "reference": {
            "op": "aggregate",
            "output_idx": [
              "k"
            ],
            "args": [],
            "ranges": {
              "k": {
                "from": "lev_nodes"
              }
            },
            "expr": {
              "op": "index",
              "args": [
                {
                  "op": "const",
                  "args": [],
                  "value": [
                    0.0,
                    597.9375,
                    1210.765625,
                    1838.9296875,
                    2482.890625,
                    3143.0703125,
                    3819.90625,
                    4513.84375,
                    5225.3125,
                    5954.765625,
                    6702.6640625,
                    7469.4609375,
                    8255.625,
                    9061.625,
                    9887.9296875,
                    10734.8203125,
                    11601.4140625,
                    12490.078125,
                    13401.4453125,
                    14336.09375,
                    15294.640625,
                    16277.6796875,
                    17285.8671875,
                    18319.84375,
                    19380.2734375,
                    20467.84375,
                    21583.2421875,
                    22726.796875,
                    23899.1875,
                    25101.1484375,
                    26333.4296875,
                    27596.78125,
                    28891.984375,
                    30219.84375,
                    31581.1796875,
                    32976.82421875,
                    34407.6484375,
                    35874.44921875,
                    37378.0859375,
                    38919.453125,
                    40499.54296875,
                    42119.4453125,
                    43780.09375,
                    45482.5234375,
                    47227.73046875,
                    49016.78515625,
                    50850.84375,
                    52730.99609375,
                    54658.703125,
                    56635.20703125,
                    58661.80859375,
                    60739.91796875,
                    62870.53125,
                    65054.9609375,
                    67294.580078125,
                    69590.81640625,
                    71945.123046875,
                    74359.015625,
                    76834.009765625,
                    79371.634765625
                  ]
                },
                "k"
              ]
            }
          },
          "tolerance": {
            "abs": 1e-06
          }
        },
        {
          "variable": "F_net",
          "time": 0.0,
          "reduce": "Linf_error",
          "expected": 0.0,
          "reference": {
            "op": "aggregate",
            "output_idx": [
              "k"
            ],
            "args": [],
            "ranges": {
              "k": {
                "from": "lev_nodes"
              }
            },
            "expr": {
              "op": "index",
              "args": [
                {
                  "op": "const",
                  "args": [],
                  "value": [
                    84.45724487304688,
                    88.33633422851562,
                    90.42971801757812,
                    92.182861328125,
                    93.67764282226562,
                    94.98707580566406,
                    96.15339660644531,
                    97.20613098144531,
                    98.1607666015625,
                    99.02717590332031,
                    99.7872314453125,
                    100.41767883300781,
                    100.85821533203125,
                    100.96946716308594,
                    100.32048034667969,
                    97.94850158691406,
                    99.88453674316406,
                    101.21865844726562,
                    102.28211975097656,
                    103.25938415527344,
                    104.23281860351562,
                    105.27626037597656,
                    106.43536376953125,
                    107.74041748046875,
                    109.23635864257812,
                    110.99751281738281,
                    113.08462524414062,
                    115.31300354003906,
                    117.67408752441406,
                    120.18048095703125,
                    122.87760925292969,
                    125.74606323242188,
                    128.83743286132812,
                    132.18414306640625,
                    135.83665466308594,
                    139.88221740722656,
                    144.46597290039062,
                    149.28782653808594,
                    154.39234924316406,
                    159.77490234375,
                    164.79876708984375,
                    169.8912353515625,
                    175.1105194091797,
                    180.4242935180664,
                    185.84981536865234,
                    191.15496063232422,
                    195.97337341308594,
                    198.6364974975586,
                    200.52881622314453,
                    202.11911010742188,
                    203.75542449951172,
                    206.74412536621094,
                    210.82027435302734,
                    215.30644607543945,
                    219.75281524658203,
                    223.58625602722168,
                    226.35574340820312,
                    227.9605541229248,
                    228.37066650390625,
                    227.66699695587158
                  ]
                },
                "k"
              ]
            }
          },
          "tolerance": {
            "abs": 1e-09
          }
        },
        {
          "variable": "glw",
          "time": 0.0,
          "expected": 264.3688659667969,
          "tolerance": {
            "rel": 1e-09
          }
        },
        {
          "variable": "olr",
          "time": 0.0,
          "expected": 239.18067932128906,
          "tolerance": {
            "rel": 1e-09
          }
        },
        {
          "variable": "dTdt",
          "time": 0.0,
          "reduce": "Linf_error",
          "expected": 0.0,
          "reference": {
            "op": "aggregate",
            "output_idx": [
              "k"
            ],
            "args": [],
            "ranges": {
              "k": {
                "from": "lev"
              }
            },
            "expr": {
              "op": "index",
              "args": [
                {
                  "op": "const",
                  "args": [],
                  "value": [
                    -6.336606211132474e-05,
                    -3.3365029979635165e-05,
                    -2.7260162212230542e-05,
                    -2.2672467209674695e-05,
                    -1.937326733712797e-05,
                    -1.6831245135377954e-05,
                    -1.481779471591667e-05,
                    -1.3105825141624169e-05,
                    -1.160130042720724e-05,
                    -9.926222264766694e-06,
                    -8.030654517588791e-06,
                    -5.473328616332124e-06,
                    -1.3482010992312874e-06,
                    7.671446849902471e-06,
                    2.7356948013658877e-05,
                    -2.182123009805326e-05,
                    -1.466355941913746e-05,
                    -1.1397558781835768e-05,
                    -1.0212819195455975e-05,
                    -9.919199402685518e-06,
                    -1.0367646399471495e-05,
                    -1.1229535771740807e-05,
                    -1.2328264613946279e-05,
                    -1.3778899554853086e-05,
                    -1.5816895498169794e-05,
                    -1.827670744171849e-05,
                    -1.9033312521598958e-05,
                    -1.9670825589586187e-05,
                    -2.036769632939939e-05,
                    -2.13783441318406e-05,
                    -2.2177115358688213e-05,
                    -2.3312863928300362e-05,
                    -2.4617808284582916e-05,
                    -2.620639624419036e-05,
                    -2.831309205955929e-05,
                    -3.129089872042338e-05,
                    -3.210884277467374e-05,
                    -3.3158458493374015e-05,
                    -3.410873589692293e-05,
                    -3.105549348725213e-05,
                    -3.070588189142722e-05,
                    -3.069835404555003e-05,
                    -3.048707765561563e-05,
                    -3.036536552287914e-05,
                    -2.8963806452574554e-05,
                    -2.566095303606104e-05,
                    -1.3835097628611105e-05,
                    -9.588091461746782e-06,
                    -7.858942090361207e-06,
                    -7.886470605929692e-06,
                    -1.404737846718894e-05,
                    -1.8686537665349465e-05,
                    -2.0059453392470326e-05,
                    -1.9391598524870695e-05,
                    -1.6306303441524504e-05,
                    -1.1489954259660509e-05,
                    -6.49365148058644e-06,
                    -1.6184856563254638e-06,
                    2.708486453802497e-06
                  ]
                },
                "k"
              ]
            }
          },
          "tolerance": {
            "abs": 1e-09
          }
        },
        {
          "variable": "dTdt",
          "time": 0.0,
          "coords": {
            "lev": 1
          },
          "expected": -6.336606211132474e-05,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "dTdt",
          "time": 0.0,
          "coords": {
            "lev": 39
          },
          "expected": -3.410873589692293e-05,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "dTdt",
          "time": 0.0,
          "coords": {
            "lev": 2
          },
          "expected": -3.3365029979635165e-05,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "dthdt",
          "time": 0.0,
          "reduce": "Linf_error",
          "expected": 0.0,
          "reference": {
            "op": "aggregate",
            "output_idx": [
              "k"
            ],
            "args": [],
            "ranges": {
              "k": {
                "from": "lev"
              }
            },
            "expr": {
              "op": "index",
              "args": [
                {
                  "op": "const",
                  "args": [],
                  "value": [
                    -6.395125819835812e-05,
                    -3.373355866642669e-05,
                    -2.7612246412900276e-05,
                    -2.3009139113128185e-05,
                    -1.9699684344232082e-05,
                    -1.7149648556369357e-05,
                    -1.512982817075681e-05,
                    -1.3410848623607308e-05,
                    -1.1897926924575586e-05,
                    -1.0203611054748762e-05,
                    -8.27484927867772e-06,
                    -5.653732387145283e-06,
                    -1.3962071534479037e-06,
                    7.965672921272926e-06,
                    2.8484113499871455e-05,
                    -2.278477950312663e-05,
                    -1.5356008589151315e-05,
                    -1.197209712699987e-05,
                    -1.0761478733911645e-05,
                    -1.0486286555533297e-05,
                    -1.09975853774813e-05,
                    -1.1953828106925357e-05,
                    -1.3171464161132462e-05,
                    -1.4777314390812535e-05,
                    -1.7030068192980252e-05,
                    -1.9759505448746495e-05,
                    -2.066558772639837e-05,
                    -2.1452966393553652e-05,
                    -2.231610233138781e-05,
                    -2.3536800654255785e-05,
                    -2.4539496735087596e-05,
                    -2.593220051494427e-05,
                    -2.7534568289411254e-05,
                    -2.948017390735913e-05,
                    -3.2042018574429676e-05,
                    -3.563562495401129e-05,
                    -3.680930603877641e-05,
                    -3.82768630515784e-05,
                    -3.966156509704888e-05,
                    -3.638900307123549e-05,
                    -3.6271016142563894e-05,
                    -3.657244087662548e-05,
                    -3.664936593850143e-05,
                    -3.68529035768006e-05,
                    -3.550946348696016e-05,
                    -3.1800544093130156e-05,
                    -1.7343028957839124e-05,
                    -1.2167399290774483e-05,
                    -1.0104973625857383e-05,
                    -1.0284652489644941e-05,
                    -1.8600543626234867e-05,
                    -2.5155837647616863e-05,
                    -2.7494654204929247e-05,
                    -2.710855915211141e-05,
                    -2.3296392100746743e-05,
                    -1.6816633433336392e-05,
                    -9.764959031599574e-06,
                    -2.509751311663422e-06,
                    4.351114057499217e-06
                  ]
                },
                "k"
              ]
            }
          },
          "tolerance": {
            "abs": 1e-09
          }
        },
        {
          "variable": "dthdt",
          "time": 0.0,
          "coords": {
            "lev": 1
          },
          "expected": -6.395125819835812e-05,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "dthdt",
          "time": 0.0,
          "coords": {
            "lev": 39
          },
          "expected": -3.966156509704888e-05,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "dthdt",
          "time": 0.0,
          "coords": {
            "lev": 2
          },
          "expected": -3.373355866642669e-05,
          "tolerance": {
            "rel": 1e-05
          }
        }
      ]
    },
    {
      "id": "scm_call1440_predawn_thin_cirrus",
      "description": "Reference: WRF 4.8 em_scm_xy single-column run (GNU real32 build, dt = 60 s, 59 layers, mp=6 ra_lw=1 ra_sw=1 sf_sfclay=1 sf_surface=1 bl_pbl=1, radt = 30 min) dumped by the instrumented fork ctessum-claude/WRF, commit e42a269 (v4.8.0-2-ge42a269e); module_esm_dump hooks in RRTMLWRAD and after RTRN inside SUBROUTINE RRTM of phys/module_ra_rrtm.F). RRTM has no standalone real64 driver (rrtminit needs WRF's I/O layer for the k-distribution data), so every expected value is the real32 in-model value and the tolerance contract is rel 1e-5. Inputs are the dumped RRTMLWRAD arguments of tile column 1 (p8w, pi3d, t3d, bottom-up) and the RRTM fluxes TOTUFLUX/TOTDFLUX at the model interfaces (RRTM levels 0..kte, already bottom-up). Expected values: dTdt against HTR(0..kte-1)/86400 (the RTRN heating of RRTM layers 1..kte, i.e. HTR(L-1) is layer L), dthdt against the wrapper's RTHRATEN increment, F_net and dz against the identities on the inputs, glw = TOTDFLUX(0), olr = TOTUFLUX(kte). Measured mismatch of this component against HTR over the four regimes is <= 2.4e-10 K/s in Linf (5e-6 of the column maximum of |dTdt|) and <= 5.3e-6 relative at the three largest-|dTdt| layers (real32 arithmetic of HEATFAC*(FNET(L-1)-FNET(L))/(PZ(L-1)-PZ(L)): differences of O(300 W/m^2) fluxes and O(1000 hPa) pressures carried in single precision), so the column assertions use Linf_error abs 1e-9 K/s (about 1e-5 of the column maximum) and the spot checks rel 1e-5, the real32 contract; the identities (F_net, dz, glw, olr, g_over_cp) use rel/abs 1e-9. The scheme is diagnostic (no time step), so no small-dt replay is involved. Regime: call 1440 (07:00 UTC = 00:34 LST, night), thin ice cloud (qi <= 6.7e-8) in 4 layers at 55-59, tsk = 278.4 K, glw = 254.2 W/m^2, olr = 241.5 W/m^2.",
      "parameter_overrides": {},
      "expression_template_imports": [
        {
          "ref": "./tests/scm_call1440_predawn_thin_cirrus_inputs.esm"
        }
      ],
      "time_span": {
        "start": 0,
        "end": 1
      },
      "tolerance": {
        "rel": 1e-09
      },
      "assertions": [
        {
          "variable": "g_over_cp",
          "time": 0.0,
          "expected": 0.009767476851851852,
          "tolerance": {
            "rel": 1e-09
          }
        },
        {
          "variable": "dz",
          "time": 0.0,
          "reduce": "Linf_error",
          "expected": 0.0,
          "reference": {
            "op": "aggregate",
            "output_idx": [
              "k"
            ],
            "args": [],
            "ranges": {
              "k": {
                "from": "lev"
              }
            },
            "expr": {
              "op": "index",
              "args": [
                {
                  "op": "const",
                  "args": [],
                  "value": [
                    598.171875,
                    613.21875,
                    628.609375,
                    644.3515625,
                    660.4296875,
                    676.8984375,
                    693.9375,
                    711.46875,
                    729.453125,
                    747.8984375,
                    766.796875,
                    786.1640625,
                    805.9921875,
                    826.28125,
                    846.828125,
                    866.6953125,
                    888.6640625,
                    911.3671875,
                    934.6484375,
                    958.546875,
                    983.0390625,
                    1008.1875,
                    1033.9765625,
                    1060.4296875,
                    1087.5703125,
                    1115.390625,
                    1143.5546875,
                    1172.390625,
                    1201.9609375,
                    1232.28125,
                    1263.3515625,
                    1295.203125,
                    1327.859375,
                    1361.3359375,
                    1395.6484375,
                    1430.82421875,
                    1466.80078125,
                    1503.63671875,
                    1541.3671875,
                    1579.96875,
                    1619.84375,
                    1660.63671875,
                    1702.4375,
                    1745.24609375,
                    1789.1953125,
                    1834.0703125,
                    1880.15234375,
                    1927.70703125,
                    1976.53515625,
                    2026.640625,
                    2078.05078125,
                    2130.609375,
                    2184.427734375,
                    2239.6171875,
                    2296.236328125,
                    2354.306640625,
                    2413.892578125,
                    2474.994140625,
                    2537.625
                  ]
                },
                "k"
              ]
            }
          },
          "tolerance": {
            "abs": 1e-06
          }
        },
        {
          "variable": "ze",
          "time": 0.0,
          "reduce": "Linf_error",
          "expected": 0.0,
          "reference": {
            "op": "aggregate",
            "output_idx": [
              "k"
            ],
            "args": [],
            "ranges": {
              "k": {
                "from": "lev_nodes"
              }
            },
            "expr": {
              "op": "index",
              "args": [
                {
                  "op": "const",
                  "args": [],
                  "value": [
                    0.0,
                    598.171875,
                    1211.390625,
                    1840.0,
                    2484.3515625,
                    3144.78125,
                    3821.6796875,
                    4515.6171875,
                    5227.0859375,
                    5956.5390625,
                    6704.4375,
                    7471.234375,
                    8257.3984375,
                    9063.390625,
                    9889.671875,
                    10736.5,
                    11603.1953125,
                    12491.859375,
                    13403.2265625,
                    14337.875,
                    15296.421875,
                    16279.4609375,
                    17287.6484375,
                    18321.625,
                    19382.0546875,
                    20469.625,
                    21585.015625,
                    22728.5703125,
                    23900.9609375,
                    25102.921875,
                    26335.203125,
                    27598.5546875,
                    28893.7578125,
                    30221.6171875,
                    31582.953125,
                    32978.6015625,
                    34409.42578125,
                    35876.2265625,
                    37379.86328125,
                    38921.23046875,
                    40501.19921875,
                    42121.04296875,
                    43781.6796875,
                    45484.1171875,
                    47229.36328125,
                    49018.55859375,
                    50852.62890625,
                    52732.78125,
                    54660.48828125,
                    56637.0234375,
                    58663.6640625,
                    60741.71484375,
                    62872.32421875,
                    65056.751953125,
                    67296.369140625,
                    69592.60546875,
                    71946.912109375,
                    74360.8046875,
                    76835.798828125,
                    79373.423828125
                  ]
                },
                "k"
              ]
            }
          },
          "tolerance": {
            "abs": 1e-06
          }
        },
        {
          "variable": "F_net",
          "time": 0.0,
          "reduce": "Linf_error",
          "expected": 0.0,
          "reference": {
            "op": "aggregate",
            "output_idx": [
              "k"
            ],
            "args": [],
            "ranges": {
              "k": {
                "from": "lev_nodes"
              }
            },
            "expr": {
              "op": "index",
              "args": [
                {
                  "op": "const",
                  "args": [],
                  "value": [
                    79.45018005371094,
                    82.16299438476562,
                    83.54476928710938,
                    84.86099243164062,
                    86.318359375,
                    88.095458984375,
                    90.02743530273438,
                    91.62791442871094,
                    92.95741271972656,
                    94.10519409179688,
                    95.10140991210938,
                    95.92817687988281,
                    96.5457763671875,
                    96.83477783203125,
                    96.57199096679688,
                    95.67074584960938,
                    96.93836975097656,
                    98.15974426269531,
                    99.23292541503906,
                    100.26068115234375,
                    101.31010437011719,
                    102.4425048828125,
                    103.69938659667969,
                    105.11051940917969,
                    106.724365234375,
                    108.59124755859375,
                    110.75169372558594,
                    113.08108520507812,
                    115.56156921386719,
                    118.20689392089844,
                    121.02700805664062,
                    124.03578186035156,
                    127.27024841308594,
                    130.7672576904297,
                    134.57455444335938,
                    138.7628631591797,
                    143.439697265625,
                    148.399658203125,
                    153.63565063476562,
                    159.121337890625,
                    164.10757446289062,
                    169.1546630859375,
                    174.36585235595703,
                    179.66007232666016,
                    185.0958023071289,
                    191.06092834472656,
                    196.0655288696289,
                    198.95166015625,
                    201.02811431884766,
                    203.00988006591797,
                    205.2512969970703,
                    208.51998138427734,
                    212.98980331420898,
                    217.66605377197266,
                    222.07667922973633,
                    225.88739395141602,
                    228.7305908203125,
                    230.34967231750488,
                    230.7418212890625,
                    230.02257251739502
                  ]
                },
                "k"
              ]
            }
          },
          "tolerance": {
            "abs": 1e-09
          }
        },
        {
          "variable": "glw",
          "time": 0.0,
          "expected": 254.17991638183594,
          "tolerance": {
            "rel": 1e-09
          }
        },
        {
          "variable": "olr",
          "time": 0.0,
          "expected": 241.5362548828125,
          "tolerance": {
            "rel": 1e-09
          }
        },
        {
          "variable": "dTdt",
          "time": 0.0,
          "reduce": "Linf_error",
          "expected": 0.0,
          "reference": {
            "op": "aggregate",
            "output_idx": [
              "k"
            ],
            "args": [],
            "ranges": {
              "k": {
                "from": "lev"
              }
            },
            "expr": {
              "op": "index",
              "args": [
                {
                  "op": "const",
                  "args": [],
                  "value": [
                    -4.429698818259769e-05,
                    -2.2009368296022767e-05,
                    -2.0451651955092395e-05,
                    -2.209177999584763e-05,
                    -2.6282508064199378e-05,
                    -2.7877950557955987e-05,
                    -2.25273961270297e-05,
                    -1.8252170196285953e-05,
                    -1.5369027301117226e-05,
                    -1.3010443912612067e-05,
                    -1.0531377737168912e-05,
                    -7.673200495817042e-06,
                    -3.502279933955934e-06,
                    3.1064036819669937e-06,
                    1.0395157668325637e-05,
                    -1.4285795666553356e-05,
                    -1.3424427145057254e-05,
                    -1.1501654430671974e-05,
                    -1.0740474832278711e-05,
                    -1.0693518237935173e-05,
                    -1.1251541199507536e-05,
                    -1.2176897790696886e-05,
                    -1.3330268363157908e-05,
                    -1.4864903081346441e-05,
                    -1.6766534083419375e-05,
                    -1.8918988881287753e-05,
                    -1.989609941288277e-05,
                    -2.0665472580326928e-05,
                    -2.149669246541129e-05,
                    -2.2353172578193524e-05,
                    -2.3262095120218067e-05,
                    -2.4391997743535924e-05,
                    -2.572326472511998e-05,
                    -2.731708464799104e-05,
                    -2.931198036229169e-05,
                    -3.192629803110052e-05,
                    -3.302850381091789e-05,
                    -3.4012471636136374e-05,
                    -3.4762151815273145e-05,
                    -3.0825270546807183e-05,
                    -3.0433405880574828e-05,
                    -3.0650921441890576e-05,
                    -3.0374822241288644e-05,
                    -3.0421719506934835e-05,
                    -3.256450648661013e-05,
                    -2.665233556871061e-05,
                    -1.4993631177478366e-05,
                    -1.0521124220556684e-05,
                    -9.79340186825505e-06,
                    -1.0802556795102579e-05,
                    -1.5363872603133873e-05,
                    -2.0491251790965045e-05,
                    -2.0909371475378672e-05,
                    -1.923577239116033e-05,
                    -1.620959214590214e-05,
                    -1.1795781276844167e-05,
                    -6.551381062578272e-06,
                    -1.5476087315215004e-06,
                    2.7684517273748364e-06
                  ]
                },
                "k"
              ]
            }
          },
          "tolerance": {
            "abs": 1e-09
          }
        },
        {
          "variable": "dTdt",
          "time": 0.0,
          "coords": {
            "lev": 1
          },
          "expected": -4.429698818259769e-05,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "dTdt",
          "time": 0.0,
          "coords": {
            "lev": 39
          },
          "expected": -3.4762151815273145e-05,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "dTdt",
          "time": 0.0,
          "coords": {
            "lev": 38
          },
          "expected": -3.4012471636136374e-05,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "dthdt",
          "time": 0.0,
          "reduce": "Linf_error",
          "expected": 0.0,
          "reference": {
            "op": "aggregate",
            "output_idx": [
              "k"
            ],
            "args": [],
            "ranges": {
              "k": {
                "from": "lev"
              }
            },
            "expr": {
              "op": "index",
              "args": [
                {
                  "op": "const",
                  "args": [],
                  "value": [
                    -4.4705851905746385e-05,
                    -2.2252372218645178e-05,
                    -2.071573726425413e-05,
                    -2.2419784727389924e-05,
                    -2.6725312636699528e-05,
                    -2.8405318516888656e-05,
                    -2.3001774025033228e-05,
                    -1.867696482804604e-05,
                    -1.5761983377160504e-05,
                    -1.3374017726164311e-05,
                    -1.0851610568352044e-05,
                    -7.926111720735207e-06,
                    -3.6269873362471117e-06,
                    3.225544560336857e-06,
                    1.0823458978848066e-05,
                    -1.491660441388376e-05,
                    -1.4058360648050439e-05,
                    -1.2081440218025818e-05,
                    -1.1317482858430594e-05,
                    -1.1304874533379916e-05,
                    -1.1935185284528416e-05,
                    -1.2962294022145215e-05,
                    -1.424200127075892e-05,
                    -1.594201057741884e-05,
                    -1.8052547602565028e-05,
                    -2.045389737759251e-05,
                    -2.1602367269224487e-05,
                    -2.2537726181326434e-05,
                    -2.3553104256279767e-05,
                    -2.4610053515061736e-05,
                    -2.5740051569300704e-05,
                    -2.7132584364153445e-05,
                    -2.8771002689609304e-05,
                    -3.0729614081792533e-05,
                    -3.317246228107251e-05,
                    -3.63592516805511e-05,
                    -3.7863599573029205e-05,
                    -3.926270073861815e-05,
                    -4.042136060888879e-05,
                    -3.6119232390774414e-05,
                    -3.594913141569123e-05,
                    -3.651588849606924e-05,
                    -3.6514378734864295e-05,
                    -3.692126483656466e-05,
                    -3.992388155893423e-05,
                    -3.302912227809429e-05,
                    -1.879531191661954e-05,
                    -1.3351427696761675e-05,
                    -1.2592290659085847e-05,
                    -1.4087491763348226e-05,
                    -2.0343759388197213e-05,
                    -2.7585345378611237e-05,
                    -2.865960414055735e-05,
                    -2.689072243811097e-05,
                    -2.31582216656534e-05,
                    -1.7264243069803342e-05,
                    -9.851771210378502e-06,
                    -2.3998436518013477e-06,
                    4.447446826816304e-06
                  ]
                },
                "k"
              ]
            }
          },
          "tolerance": {
            "abs": 1e-09
          }
        },
        {
          "variable": "dthdt",
          "time": 0.0,
          "coords": {
            "lev": 1
          },
          "expected": -4.4705851905746385e-05,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "dthdt",
          "time": 0.0,
          "coords": {
            "lev": 39
          },
          "expected": -4.042136060888879e-05,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "dthdt",
          "time": 0.0,
          "coords": {
            "lev": 38
          },
          "expected": -3.926270073861815e-05,
          "tolerance": {
            "rel": 1e-05
          }
        }
      ]
    },
    {
      "id": "scm_call2400_afternoon",
      "description": "Reference: WRF 4.8 em_scm_xy single-column run (GNU real32 build, dt = 60 s, 59 layers, mp=6 ra_lw=1 ra_sw=1 sf_sfclay=1 sf_surface=1 bl_pbl=1, radt = 30 min) dumped by the instrumented fork ctessum-claude/WRF, commit e42a269 (v4.8.0-2-ge42a269e); module_esm_dump hooks in RRTMLWRAD and after RTRN inside SUBROUTINE RRTM of phys/module_ra_rrtm.F). RRTM has no standalone real64 driver (rrtminit needs WRF's I/O layer for the k-distribution data), so every expected value is the real32 in-model value and the tolerance contract is rel 1e-5. Inputs are the dumped RRTMLWRAD arguments of tile column 1 (p8w, pi3d, t3d, bottom-up) and the RRTM fluxes TOTUFLUX/TOTDFLUX at the model interfaces (RRTM levels 0..kte, already bottom-up). Expected values: dTdt against HTR(0..kte-1)/86400 (the RTRN heating of RRTM layers 1..kte, i.e. HTR(L-1) is layer L), dthdt against the wrapper's RTHRATEN increment, F_net and dz against the identities on the inputs, glw = TOTDFLUX(0), olr = TOTUFLUX(kte). Measured mismatch of this component against HTR over the four regimes is <= 2.4e-10 K/s in Linf (5e-6 of the column maximum of |dTdt|) and <= 5.3e-6 relative at the three largest-|dTdt| layers (real32 arithmetic of HEATFAC*(FNET(L-1)-FNET(L))/(PZ(L-1)-PZ(L)): differences of O(300 W/m^2) fluxes and O(1000 hPa) pressures carried in single precision), so the column assertions use Linf_error abs 1e-9 K/s (about 1e-5 of the column maximum) and the spot checks rel 1e-5, the real32 contract; the identities (F_net, dz, glw, olr, g_over_cp) use rel/abs 1e-9. The scheme is diagnostic (no time step), so no small-dt replay is involved. Regime: call 2400 (15:00 UTC = 08:34 LST, day), two thin ice-cloud layers at 56-57, tsk = 282.0 K, glw = 254.1 W/m^2, olr = 245.8 W/m^2; the strongest cooling is at layer 45 rather than the surface layer.",
      "parameter_overrides": {},
      "expression_template_imports": [
        {
          "ref": "./tests/scm_call2400_afternoon_inputs.esm"
        }
      ],
      "time_span": {
        "start": 0,
        "end": 1
      },
      "tolerance": {
        "rel": 1e-09
      },
      "assertions": [
        {
          "variable": "g_over_cp",
          "time": 0.0,
          "expected": 0.009767476851851852,
          "tolerance": {
            "rel": 1e-09
          }
        },
        {
          "variable": "dz",
          "time": 0.0,
          "reduce": "Linf_error",
          "expected": 0.0,
          "reference": {
            "op": "aggregate",
            "output_idx": [
              "k"
            ],
            "args": [],
            "ranges": {
              "k": {
                "from": "lev"
              }
            },
            "expr": {
              "op": "index",
              "args": [
                {
                  "op": "const",
                  "args": [],
                  "value": [
                    598.296875,
                    613.390625,
                    628.875,
                    644.7265625,
                    660.671875,
                    677.015625,
                    693.984375,
                    711.4765625,
                    729.453125,
                    747.8984375,
                    766.796875,
                    786.1640625,
                    805.9921875,
                    826.265625,
                    846.7734375,
                    866.78125,
                    888.671875,
                    911.3671875,
                    934.6484375,
                    958.5390625,
                    983.0390625,
                    1008.1875,
                    1033.9765625,
                    1060.4296875,
                    1087.5703125,
                    1115.3828125,
                    1143.5546875,
                    1172.390625,
                    1201.9609375,
                    1232.28125,
                    1263.3515625,
                    1295.203125,
                    1327.859375,
                    1361.3359375,
                    1395.64453125,
                    1430.82421875,
                    1466.80078125,
                    1503.63671875,
                    1541.3671875,
                    1579.875,
                    1619.76953125,
                    1660.609375,
                    1702.44921875,
                    1745.30859375,
                    1789.3125,
                    1834.0703125,
                    1880.15625,
                    1927.7109375,
                    1976.55859375,
                    2026.62109375,
                    2078.046875,
                    2130.609375,
                    2184.427734375,
                    2239.6171875,
                    2296.236328125,
                    2354.306640625,
                    2413.892578125,
                    2474.994140625,
                    2537.625
                  ]
                },
                "k"
              ]
            }
          },
          "tolerance": {
            "abs": 1e-06
          }
        },
        {
          "variable": "ze",
          "time": 0.0,
          "reduce": "Linf_error",
          "expected": 0.0,
          "reference": {
            "op": "aggregate",
            "output_idx": [
              "k"
            ],
            "args": [],
            "ranges": {
              "k": {
                "from": "lev_nodes"
              }
            },
            "expr": {
              "op": "index",
              "args": [
                {
                  "op": "const",
                  "args": [],
                  "value": [
                    0.0,
                    598.296875,
                    1211.6875,
                    1840.5625,
                    2485.2890625,
                    3145.9609375,
                    3822.9765625,
                    4516.9609375,
                    5228.4375,
                    5957.890625,
                    6705.7890625,
                    7472.5859375,
                    8258.75,
                    9064.7421875,
                    9891.0078125,
                    10737.78125,
                    11604.5625,
                    12493.234375,
                    13404.6015625,
                    14339.25,
                    15297.7890625,
                    16280.828125,
                    17289.015625,
                    18322.9921875,
                    19383.421875,
                    20470.9921875,
                    21586.375,
                    22729.9296875,
                    23902.3203125,
                    25104.28125,
                    26336.5625,
                    27599.9140625,
                    28895.1171875,
                    30222.9765625,
                    31584.3125,
                    32979.95703125,
                    34410.78125,
                    35877.58203125,
                    37381.21875,
                    38922.5859375,
                    40502.4609375,
                    42122.23046875,
                    43782.83984375,
                    45485.2890625,
                    47230.59765625,
                    49019.91015625,
                    50853.98046875,
                    52734.13671875,
                    54661.84765625,
                    56638.40625,
                    58665.02734375,
                    60743.07421875,
                    62873.68359375,
                    65058.111328125,
                    67297.728515625,
                    69593.96484375,
                    71948.271484375,
                    74362.1640625,
                    76837.158203125,
                    79374.783203125
                  ]
                },
                "k"
              ]
            }
          },
          "tolerance": {
            "abs": 1e-06
          }
        },
        {
          "variable": "F_net",
          "time": 0.0,
          "reduce": "Linf_error",
          "expected": 0.0,
          "reference": {
            "op": "aggregate",
            "output_idx": [
              "k"
            ],
            "args": [],
            "ranges": {
              "k": {
                "from": "lev_nodes"
              }
            },
            "expr": {
              "op": "index",
              "args": [
                {
                  "op": "const",
                  "args": [],
                  "value": [
                    96.21334838867188,
                    94.34280395507812,
                    94.78349304199219,
                    95.2191162109375,
                    95.00898742675781,
                    95.48100280761719,
                    97.12742614746094,
                    98.6669921875,
                    99.98103332519531,
                    101.08491516113281,
                    102.00949096679688,
                    102.75865173339844,
                    103.31535339355469,
                    103.59707641601562,
                    103.54075622558594,
                    103.33348083496094,
                    104.22377014160156,
                    105.27418518066406,
                    106.27162170410156,
                    107.25798034667969,
                    108.27658081054688,
                    109.37535095214844,
                    110.59219360351562,
                    111.96142578125,
                    113.51956176757812,
                    115.30752563476562,
                    117.35240173339844,
                    119.57586669921875,
                    121.96458435058594,
                    124.52468872070312,
                    127.26802062988281,
                    130.20779418945312,
                    133.37255859375,
                    136.79669189453125,
                    140.52467346191406,
                    144.62315368652344,
                    149.15345764160156,
                    153.97018432617188,
                    159.06228637695312,
                    164.37496948242188,
                    169.13595581054688,
                    173.86378479003906,
                    178.73639678955078,
                    183.74270629882812,
                    189.0035171508789,
                    195.17477416992188,
                    200.0353546142578,
                    202.96534729003906,
                    205.0871810913086,
                    207.23751831054688,
                    209.4060287475586,
                    212.7370147705078,
                    217.29020309448242,
                    222.00028228759766,
                    226.42237091064453,
                    230.2362937927246,
                    233.08147811889648,
                    234.69145965576172,
                    235.061918258667,
                    234.31664848327637
                  ]
                },
                "k"
              ]
            }
          },
          "tolerance": {
            "abs": 1e-09
          }
        },
        {
          "variable": "glw",
          "time": 0.0,
          "expected": 254.10433959960938,
          "tolerance": {
            "rel": 1e-09
          }
        },
        {
          "variable": "olr",
          "time": 0.0,
          "expected": 245.83033752441406,
          "tolerance": {
            "rel": 1e-09
          }
        },
        {
          "variable": "dTdt",
          "time": 0.0,
          "reduce": "Linf_error",
          "expected": 0.0,
          "reference": {
            "op": "aggregate",
            "output_idx": [
              "k"
            ],
            "args": [],
            "ranges": {
              "k": {
                "from": "lev"
              }
            },
            "expr": {
              "op": "index",
              "args": [
                {
                  "op": "const",
                  "args": [],
                  "value": [
                    3.053750428888533e-05,
                    -7.017416258653005e-06,
                    -6.7659460560039235e-06,
                    3.183408536844783e-06,
                    -6.978315887627778e-06,
                    -2.3753422277945058e-05,
                    -2.1668684979279836e-05,
                    -1.803965480239303e-05,
                    -1.478120270702574e-05,
                    -1.2074834494679062e-05,
                    -9.54282780488332e-06,
                    -6.916591276725133e-06,
                    -3.414075407716963e-06,
                    6.657757761853713e-07,
                    2.3909144241500782e-06,
                    -1.0032342677866971e-05,
                    -1.1545212042552454e-05,
                    -1.0689944718722944e-05,
                    -1.0307857559786903e-05,
                    -1.037950317064921e-05,
                    -1.091738955842124e-05,
                    -1.1788921223746405e-05,
                    -1.2934530774752299e-05,
                    -1.4351767798264822e-05,
                    -1.6057673427793715e-05,
                    -1.7907139327791003e-05,
                    -1.899134643651821e-05,
                    -1.9900946429482212e-05,
                    -2.0804166517875812e-05,
                    -2.1744570522396653e-05,
                    -2.2728623891318287e-05,
                    -2.3866353763474357e-05,
                    -2.5187203729594194e-05,
                    -2.6748003783049407e-05,
                    -2.8683311409420436e-05,
                    -3.092601067490048e-05,
                    -3.207483501346023e-05,
                    -3.3077774224457916e-05,
                    -3.366584579149882e-05,
                    -2.9434465147830822e-05,
                    -2.850959422411742e-05,
                    -2.8660015927420722e-05,
                    -2.87228188029042e-05,
                    -2.9441642540472524e-05,
                    -3.3687620803161906e-05,
                    -2.5885386599434747e-05,
                    -1.5221403704749213e-05,
                    -1.0751118814503704e-05,
                    -1.0626189134739064e-05,
                    -1.0451364710375114e-05,
                    -1.5656659724535764e-05,
                    -2.0873467955324384e-05,
                    -2.106063343860485e-05,
                    -1.9285749230119917e-05,
                    -1.6223287416829e-05,
                    -1.1804011408929471e-05,
                    -6.514582093115206e-06,
                    -1.4619784498656238e-06,
                    2.8685897726703572e-06
                  ]
                },
                "k"
              ]
            }
          },
          "tolerance": {
            "abs": 1e-09
          }
        },
        {
          "variable": "dTdt",
          "time": 0.0,
          "coords": {
            "lev": 45
          },
          "expected": -3.3687620803161906e-05,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "dTdt",
          "time": 0.0,
          "coords": {
            "lev": 39
          },
          "expected": -3.366584579149882e-05,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "dTdt",
          "time": 0.0,
          "coords": {
            "lev": 38
          },
          "expected": -3.3077774224457916e-05,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "dthdt",
          "time": 0.0,
          "reduce": "Linf_error",
          "expected": 0.0,
          "reference": {
            "op": "aggregate",
            "output_idx": [
              "k"
            ],
            "args": [],
            "ranges": {
              "k": {
                "from": "lev"
              }
            },
            "expr": {
              "op": "index",
              "args": [
                {
                  "op": "const",
                  "args": [],
                  "value": [
                    3.0819228413747624e-05,
                    -7.0948667598713655e-06,
                    -6.853289050923195e-06,
                    3.230666152376216e-06,
                    -7.095874934748281e-06,
                    -2.4202743588830344e-05,
                    -2.2124964743852615e-05,
                    -1.845949373091571e-05,
                    -1.5159124814090319e-05,
                    -1.2412259820848703e-05,
                    -9.83300014922861e-06,
                    -7.144563824112993e-06,
                    -3.535641326379846e-06,
                    6.913103334227344e-07,
                    2.489424105078797e-06,
                    -1.0475331691850442e-05,
                    -1.2090405107301194e-05,
                    -1.1228814400965348e-05,
                    -1.0861624105018564e-05,
                    -1.0972906238748692e-05,
                    -1.158073155238526e-05,
                    -1.254929338756483e-05,
                    -1.3819197192788124e-05,
                    -1.539169534225948e-05,
                    -1.728931601974182e-05,
                    -1.935995533131063e-05,
                    -2.062002386082895e-05,
                    -2.1703932361560874e-05,
                    -2.2794323740527034e-05,
                    -2.394000330241397e-05,
                    -2.5149753128062002e-05,
                    -2.6547879315330647e-05,
                    -2.817142740241252e-05,
                    -3.0089440770098008e-05,
                    -3.246099367970601e-05,
                    -3.5220069548813626e-05,
                    -3.677032145787962e-05,
                    -3.8183719880180433e-05,
                    -3.914656917913817e-05,
                    -3.4489556128391996e-05,
                    -3.36766242980957e-05,
                    -3.414399907342158e-05,
                    -3.452842793194577e-05,
                    -3.57317621819675e-05,
                    -4.130079469177872e-05,
                    -3.2078671210911125e-05,
                    -1.9080835045315325e-05,
                    -1.3643293641507626e-05,
                    -1.3663084246218204e-05,
                    -1.362950661132345e-05,
                    -2.073144969472196e-05,
                    -2.8099882911192253e-05,
                    -2.88669289147947e-05,
                    -2.6960588002111763e-05,
                    -2.3177788534667343e-05,
                    -1.7276288417633623e-05,
                    -9.79643391474383e-06,
                    -2.267058789584553e-06,
                    4.608315521181794e-06
                  ]
                },
                "k"
              ]
            }
          },
          "tolerance": {
            "abs": 1e-09
          }
        },
        {
          "variable": "dthdt",
          "time": 0.0,
          "coords": {
            "lev": 45
          },
          "expected": -4.130079469177872e-05,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "dthdt",
          "time": 0.0,
          "coords": {
            "lev": 39
          },
          "expected": -3.914656917913817e-05,
          "tolerance": {
            "rel": 1e-05
          }
        },
        {
          "variable": "dthdt",
          "time": 0.0,
          "coords": {
            "lev": 38
          },
          "expected": -3.8183719880180433e-05,
          "tolerance": {
            "rel": 1e-05
          }
        }
      ]
    }
  ]
}