WSM6WarmRain
Warm-rain process rates of the WRF single-moment 6-class microphysics scheme (WSM6; Hong and Lim 2006, Hong, Dudhia and Chen 2004), transcribed from the warm-rain block of mp_wsm6_run in phys/physics_mmm/mp_wsm6.F90 (WRF 4.8, NCAR/MMM-physics): autoconversion of cloud water to rain praut = qck1 qc^(7/3) above the threshold qc0 (HDC eq. 16), accretion of cloud water by rain pracw = pacrr lambda^-(3+b) qc (rho0/rho)^(1/2) (HL eq. A40), and evaporation/condensation of rain prevp = (rh - 1)(precr1 lambda^-2 + precr2 f_v coeres)/F (HDC eq. 14), all in kg/kg/s as pointwise functions of the layer state on the layer index `lev` (WRF k, layer 1 at the surface; no grid geometry is needed). The raindrop size distribution (the inverse slope lambda^-1 and its powers, the density factor), the transport properties of air (kinematic viscosity, vapor diffusivity, thermal conductivity), the ventilation factor and the rain ventilation moment come from hydrometeor_slopes.esm mounted as subsystem `sd`, which the cold-rain, deposition, melting and sedimentation components mount too, so every process sees one size distribution and one work2 for a given state, as in the kernel; the diffusional-growth denominator F, which needs the saturation state, is computed here (microphysics_templates.esm); the scheme constants (n0r, a, b, r0, N_c, ...) come from wsm6_parameters.esm as subsystem `par` and the physical constants from lib/wrf_constants.esm as subsystem `wrf`. The derived rate coefficients qc0 = (4/3) pi rho_w r0^3 N_c / rho0, qck1 = 0.104 g E / (N_c rho_w)^(1/3) / mu rho0^(4/3), pacrr = pi n0r a Gamma(3+b) E_rc/4, precr1 = 2 pi n0r a_v and precr2 = 2 pi n0r b_v a^(1/2) Gamma(2.5+b/2) are observeds so that they can be checked against the values mp_wsm6_init computes. The saturation state (qsat, rh, xl) is an INPUT rather than computed here: WSM6 evaluates it once at the start of each sub-time step (saturation.esm) and does not refresh it after sedimentation, melting and freezing have changed the temperature, so the rates are evaluated at a temperature that differs from the one behind qsat/rh/xl (EqWeFiC FORTRAN_BUGS.md note N4); a consumer binds saturation.esm's outputs at the state of its choice. The UNLIMITED rates praut, pracw, prevp are the physics; the kernel additionally applies per-process time-step limiters (a sink may not remove more than q/dtcld per sub-step, rain evaporation/condensation may not exceed half the vapor deficit/excess per sub-step), which are exposed separately as praut_lim, pracw_lim, prevp_lim with the sub-step length dtcld as a parameter -- they are time-step artefacts, not physics (EqWeFiC FORTRAN_BUGS.md note N3), and the mass-conservation rescaling the kernel applies afterwards is not part of this component. Consumer-supplied inputs: the column fields qv, qc, qsat, rh, xl here and T, qr, qi, qs, qg, rho, p in `sd` (ice, snow and graupel enter only sd's diagnostics, not the warm-rain rates) are REWRITE-TARGET ops `input_<name>` (esm-spec 4.2 open tier) that the consumer lowers -- in the inline tests through a per-test `expression_template_imports` library (tests/<id>_inputs.esm, extracted from kernel dumps of the instrumented WRF fork ctessum-claude/WRF, commit e42a269 (v4.8.0-2-ge42a269e)) because esm-spec 6.6 `parameter_overrides` admit scalars only. EqWeFiC, cited here for FORTRAN_BUGS.md and couplings/, is https://github.com/EarthSciML/EqWeFiC, where these components were developed and are coupled into a WRF column.
Description
Warm-rain process rates of the WRF single-moment 6-class microphysics scheme (WSM6; Hong and Lim 2006, Hong, Dudhia and Chen 2004), transcribed from the warm-rain block of mp_wsm6_run in phys/physics_mmm/mp_wsm6.F90 (WRF 4.8, NCAR/MMM-physics): autoconversion of cloud water to rain praut = qck1 qc^(7/3) above the threshold qc0 (HDC eq. 16), accretion of cloud water by rain pracw = pacrr lambda^-(3+b) qc (rho0/rho)^(1/2) (HL eq. A40), and evaporation/condensation of rain prevp = (rh - 1)(precr1 lambda^-2 + precr2 f_v coeres)/F (HDC eq. 14), all in kg/kg/s as pointwise functions of the layer state on the layer index lev (WRF k, layer 1 at the surface; no grid geometry is needed). The raindrop size distribution (the inverse slope lambda^-1 and its powers, the density factor), the transport properties of air (kinematic viscosity, vapor diffusivity, thermal conductivity), the ventilation factor and the rain ventilation moment come from hydrometeor_slopes.esm mounted as subsystem sd, which the cold-rain, deposition, melting and sedimentation components mount too, so every process sees one size distribution and one work2 for a given state, as in the kernel; the diffusional-growth denominator F, which needs the saturation state, is computed here (microphysics_templates.esm); the scheme constants (n0r, a, b, r0, N_c, …) come from wsm6_parameters.esm as subsystem par and the physical constants from lib/wrf_constants.esm as subsystem wrf. The derived rate coefficients qc0 = (4/3) pi rho_w r0^3 N_c / rho0, qck1 = 0.104 g E / (N_c rho_w)^(1/3) / mu rho0^(4/3), pacrr = pi n0r a Gamma(3+b) E_rc/4, precr1 = 2 pi n0r a_v and precr2 = 2 pi n0r b_v a^(1/2) Gamma(2.5+b/2) are observeds so that they can be checked against the values mp_wsm6_init computes. The saturation state (qsat, rh, xl) is an INPUT rather than computed here: WSM6 evaluates it once at the start of each sub-time step (saturation.esm) and does not refresh it after sedimentation, melting and freezing have changed the temperature, so the rates are evaluated at a temperature that differs from the one behind qsat/rh/xl (EqWeFiC FORTRAN_BUGS.md note N4); a consumer binds saturation.esm’s outputs at the state of its choice. The UNLIMITED rates praut, pracw, prevp are the physics; the kernel additionally applies per-process time-step limiters (a sink may not remove more than q/dtcld per sub-step, rain evaporation/condensation may not exceed half the vapor deficit/excess per sub-step), which are exposed separately as praut_lim, pracw_lim, prevp_lim with the sub-step length dtcld as a parameter – they are time-step artefacts, not physics (EqWeFiC FORTRAN_BUGS.md note N3), and the mass-conservation rescaling the kernel applies afterwards is not part of this component. Consumer-supplied inputs: the column fields qv, qc, qsat, rh, xl here and T, qr, qi, qs, qg, rho, p in sd (ice, snow and graupel enter only sd’s diagnostics, not the warm-rain rates) are REWRITE-TARGET ops input_<name> (esm-spec 4.2 open tier) that the consumer lowers – in the inline tests through a per-test expression_template_imports library (tests/parameter_overrides admit scalars only. EqWeFiC, cited here for FORTRAN_BUGS.md and couplings/, is https://github.com/EarthSciML/EqWeFiC
, where these components were developed and are coupled into a WRF column.
Reference
- Hong, S.-Y., and J.-O. J. Lim (2006). The WRF single-moment 6-class microphysics scheme (WSM6). J. Korean Meteor. Soc. 42, 129-151.
- Hong, S.-Y., J. Dudhia, and S.-H. Chen (2004). A revised approach to ice microphysical processes for the bulk parameterization of clouds and precipitation. Mon. Wea. Rev. 132, 103-120.
- NCAR/MMM-physics mp_wsm6.F90 at commit 550b5b4 (WRF 4.8 phys/physics_mmm submodule).
Parameters
| Name | Units | Default | Description |
|---|---|---|---|
qv_in | kg/kg | 0.0 | Coupling-target parameter (additive): receives the vapor mixing ratio from the upstream stage through a document coupling (EqWeFiC couplings/microphysics_column*.esm), where the mount-edge template library lowers input_qv to this name. Unused by the standalone inline tests, which lower input_qv to a dumped column profile instead. |
qc_in | kg/kg | 0.0 | Coupling-target parameter (additive): receives the cloud-water mixing ratio from the upstream stage through a document coupling (EqWeFiC couplings/microphysics_column*.esm), where the mount-edge template library lowers input_qc to this name. Unused by the standalone inline tests, which lower input_qc to a dumped column profile instead. |
qsat_in | kg/kg | 0.0 | Coupling-target parameter (additive): receives the start-of-sub-step saturation mixing ratio over water from the upstream stage through a document coupling (EqWeFiC couplings/microphysics_column*.esm), where the mount-edge template library lowers input_qsat to this name. Unused by the standalone inline tests, which lower input_qsat to a dumped column profile instead. |
rh_in | 1 | 0.0 | Coupling-target parameter (additive): receives the start-of-sub-step relative humidity over water from the upstream stage through a document coupling (EqWeFiC couplings/microphysics_column*.esm), where the mount-edge template library lowers input_rh to this name. Unused by the standalone inline tests, which lower input_rh to a dumped column profile instead. |
xl_in | J/kg | 0.0 | Coupling-target parameter (additive): receives the start-of-sub-step latent heat of vaporization from the upstream stage through a document coupling (EqWeFiC couplings/microphysics_column*.esm), where the mount-edge template library lowers input_xl to this name. Unused by the standalone inline tests, which lower input_xl to a dumped column profile instead. |
dtcld | s | 60.0 | Length of the WSM6 sub-time step; enters only the rate limiters. |
Observed
| Name | Units | Default | Description |
|---|---|---|---|
qv | kg/kg | Water-vapor mixing ratio (WSM6 q). | |
qc | kg/kg | Cloud-water mixing ratio. | |
qsat | kg/kg | Saturation mixing ratio over water at the start-of-step state (saturation.esm qsat_w). | |
rh | 1 | Relative humidity with respect to water at the start-of-step state (saturation.esm rh_w). | |
xl | J/kg | Latent heat of vaporization at the start-of-step temperature (saturation.esm xl). | |
qc0 | kg/kg | Autoconversion threshold (4/3) pi rho_w r0^3 N_c / rho0 (WSM6 qc0). | |
qck1 | 1/s | Autoconversion rate constant 0.104 g E_auto / (N_c rho_w)^(1/3) / mu rho0^(4/3) (WSM6 qck1). | |
pacrr | 1/(m^(19/5)*s) | Accretion coefficient pi n0r a Gamma(3 + b) E_rc / 4 (WSM6 pacrr); units for b = 4/5. | |
precr1 | 1/m^4 | Rain evaporation coefficient of the non-ventilated term, 2 pi n0r a_v (WSM6 precr1). | |
precr2 | 1/(m^(39/10)*s^(1/2)) | Rain evaporation coefficient of the ventilated term, 2 pi n0r b_v a^(1/2) Gamma(2.5 + b/2) (WSM6 precr2); units for b = 4/5. | |
f_diff | s/m^2 | Diffusional-growth denominator rho xl^2/(ka r_v T^2) + 1/(qsat Dv) (WSM6 work1(:,:,1)). | |
praut | kg/kg/s | Autoconversion rate of cloud water to rain, unlimited (HDC eq. 16). | |
praut_lim | kg/kg/s | Autoconversion rate after the kernel’s time-step limiter min(praut, qc/dtcld) (WSM6 praut as applied). | |
pracw | kg/kg/s | Accretion rate of cloud water by rain, unlimited (HL eq. A40). | |
pracw_lim | kg/kg/s | Accretion rate after the kernel’s time-step limiter min(pracw, qc/dtcld) (WSM6 pracw as applied). | |
prevp | kg/kg/s | Rain evaporation (negative) / condensation (positive) rate, unlimited (HDC eq. 14). | |
satdt | kg/kg/s | Vapor excess over saturation per sub-step, (max(qv, qmin) - qsat)/dtcld (WSM6 satdt). | |
prevp_lim | kg/kg/s | Rain evaporation/condensation rate after the kernel’s time-step limiters (WSM6 prevp as applied). |
Observed expressions
$$ qv = \mathrm{input_qv}\left(\right) $$Water-vapor mixing ratio (WSM6 q).
$$ qc = \mathrm{input_qc}\left(\right) $$Cloud-water mixing ratio.
$$ qsat = \mathrm{input_qsat}\left(\right) $$Saturation mixing ratio over water at the start-of-step state (saturation.esm qsat_w).
$$ rh = \mathrm{input_rh}\left(\right) $$Relative humidity with respect to water at the start-of-step state (saturation.esm rh_w).
$$ xl = \mathrm{input_xl}\left(\right) $$Latent heat of vaporization at the start-of-step temperature (saturation.esm xl).
$$ qc0 = \frac{\frac{\mathrm{const}\left(\right)}{\mathrm{const}\left(\right)} \cdot wrf.piconst \cdot wrf.rhowater \cdot par.r0^{3} \cdot par.xncr}{wrf.rhoair0} $$Autoconversion threshold (4/3) pi rho_w r0^3 N_c / rho0 (WSM6 qc0).
$$ qck1 = \frac{par.autoconv_{coef} \cdot par.g_{autoconv} \cdot par.peaut}{\left(par.xncr \cdot wrf.rhowater\right)^{\frac{1}{3}} \cdot par.xmyu} \cdot wrf.rhoair0^{\frac{4}{3}} $$Autoconversion rate constant 0.104 g E_auto / (N_c rho_w)^(1/3) / mu rho0^(4/3) (WSM6 qck1).
$$ pacrr = \frac{wrf.piconst \cdot par.n0r \cdot par.avtr \cdot par.g3pbr \cdot par.eacrr}{\mathrm{const}\left(\right)} $$Accretion coefficient pi n0r a Gamma(3 + b) E_rc / 4 (WSM6 pacrr); units for b = 4/5.
$$ precr1 = \mathrm{const}\left(\right) \cdot wrf.piconst \cdot par.n0r \cdot par.vent_{a} $$Rain evaporation coefficient of the non-ventilated term, 2 pi n0r a_v (WSM6 precr1).
$$ precr2 = \mathrm{const}\left(\right) \cdot wrf.piconst \cdot par.n0r \cdot par.vent_{b} \cdot \sqrt{par.avtr} \cdot par.g5pbro2 $$Rain evaporation coefficient of the ventilated term, 2 pi n0r b_v a^(1/2) Gamma(2.5 + b/2) (WSM6 precr2); units for b = 4/5.
$$ f_{diff} = \mathrm{diffusional_growth_denominator}\left(L=xl, T=sd.T, rho=sd.rho, ka=sd.ka, r_{v}=wrf.r_{v}, qsat=qsat, Dv=sd.Dv\right) $$Diffusional-growth denominator rho xl^2/(ka r_v T^2) + 1/(qsat Dv) (WSM6 work1(:,:,1)).
$$ praut = \mathrm{hdc_autoconversion}\left(qc=qc, qc0=qc0, qck1=qck1\right) $$Autoconversion rate of cloud water to rain, unlimited (HDC eq. 16).
$$ praut_{lim} = \mathrm{sink_rate_limiter}\left(rate=praut, q=qc, dt=dtcld\right) $$Autoconversion rate after the kernel’s time-step limiter min(praut, qc/dtcld) (WSM6 praut as applied).
$$ pracw = \mathrm{accretion_of_cloud_by_rain}\left(qc=qc, qr=sd.qr, rslope3=sd.rslope3_{r}, rslopeb=sd.rslopeb_{r}, pacrr=pacrr, denfac=sd.denfac, qr_{min}=par.qcrmin, qc_{min}=par.qmin\right) $$Accretion rate of cloud water by rain, unlimited (HL eq. A40).
$$ pracw_{lim} = \mathrm{sink_rate_limiter}\left(rate=pracw, q=qc, dt=dtcld\right) $$Accretion rate after the kernel’s time-step limiter min(pracw, qc/dtcld) (WSM6 pracw as applied).
$$ prevp = \mathrm{rain_evaporation}\left(qr=sd.qr, rh=rh, rslope2=sd.rslope2_{r}, coeres=sd.coeres_{r}, f_{vent}=sd.f_{vent}, f_{diff}=f_{diff}, precr1=precr1, precr2=precr2\right) $$Rain evaporation (negative) / condensation (positive) rate, unlimited (HDC eq. 14).
$$ satdt = \frac{\mathrm{max}\left(qv, par.qmin\right) - qsat}{dtcld} $$Vapor excess over saturation per sub-step, (max(qv, qmin) - qsat)/dtcld (WSM6 satdt).
$$ prevp_{lim} = \mathrm{rain_evaporation_limiter}\left(prevp=prevp, qr=sd.qr, satdt=satdt, dt=dtcld\right) $$Rain evaporation/condensation rate after the kernel’s time-step limiters (WSM6 prevp as applied).
Raw .esm
Raw .esm JSON (this component)
{
"expression_template_imports": [
{
"ref": "./microphysics_templates.esm"
}
],
"subsystems": {
"wrf": {
"ref": "../../../lib/wrf_constants.esm"
},
"par": {
"ref": "./wsm6_parameters.esm"
},
"sd": {
"ref": "./hydrometeor_slopes.esm",
"bindings": {
"NLEV": "NLEV"
}
}
},
"variables": {
"qv_in": {
"type": "parameter",
"units": "kg/kg",
"shape": [
"lev"
],
"default": 0.0,
"description": "Coupling-target parameter (additive): receives the vapor mixing ratio from the upstream stage through a document coupling (EqWeFiC couplings/microphysics_column*.esm), where the mount-edge template library lowers `input_qv` to this name. Unused by the standalone inline tests, which lower `input_qv` to a dumped column profile instead."
},
"qc_in": {
"type": "parameter",
"units": "kg/kg",
"shape": [
"lev"
],
"default": 0.0,
"description": "Coupling-target parameter (additive): receives the cloud-water mixing ratio from the upstream stage through a document coupling (EqWeFiC couplings/microphysics_column*.esm), where the mount-edge template library lowers `input_qc` to this name. Unused by the standalone inline tests, which lower `input_qc` to a dumped column profile instead."
},
"qsat_in": {
"type": "parameter",
"units": "kg/kg",
"shape": [
"lev"
],
"default": 0.0,
"description": "Coupling-target parameter (additive): receives the start-of-sub-step saturation mixing ratio over water from the upstream stage through a document coupling (EqWeFiC couplings/microphysics_column*.esm), where the mount-edge template library lowers `input_qsat` to this name. Unused by the standalone inline tests, which lower `input_qsat` to a dumped column profile instead."
},
"rh_in": {
"type": "parameter",
"units": "1",
"shape": [
"lev"
],
"default": 0.0,
"description": "Coupling-target parameter (additive): receives the start-of-sub-step relative humidity over water from the upstream stage through a document coupling (EqWeFiC couplings/microphysics_column*.esm), where the mount-edge template library lowers `input_rh` to this name. Unused by the standalone inline tests, which lower `input_rh` to a dumped column profile instead."
},
"xl_in": {
"type": "parameter",
"units": "J/kg",
"shape": [
"lev"
],
"default": 0.0,
"description": "Coupling-target parameter (additive): receives the start-of-sub-step latent heat of vaporization from the upstream stage through a document coupling (EqWeFiC couplings/microphysics_column*.esm), where the mount-edge template library lowers `input_xl` to this name. Unused by the standalone inline tests, which lower `input_xl` to a dumped column profile instead."
},
"qv": {
"type": "unknown",
"units": "kg/kg",
"shape": [
"lev"
],
"description": "Water-vapor mixing ratio (WSM6 q)."
},
"qc": {
"type": "unknown",
"units": "kg/kg",
"shape": [
"lev"
],
"description": "Cloud-water mixing ratio."
},
"qsat": {
"type": "unknown",
"units": "kg/kg",
"shape": [
"lev"
],
"description": "Saturation mixing ratio over water at the start-of-step state (saturation.esm qsat_w)."
},
"rh": {
"type": "unknown",
"units": "1",
"shape": [
"lev"
],
"description": "Relative humidity with respect to water at the start-of-step state (saturation.esm rh_w)."
},
"xl": {
"type": "unknown",
"units": "J/kg",
"shape": [
"lev"
],
"description": "Latent heat of vaporization at the start-of-step temperature (saturation.esm xl)."
},
"dtcld": {
"type": "parameter",
"units": "s",
"default": 60.0,
"description": "Length of the WSM6 sub-time step; enters only the rate limiters."
},
"qc0": {
"type": "unknown",
"units": "kg/kg",
"description": "Autoconversion threshold (4/3) pi rho_w r0^3 N_c / rho0 (WSM6 qc0)."
},
"qck1": {
"type": "unknown",
"units": "1/s",
"description": "Autoconversion rate constant 0.104 g E_auto / (N_c rho_w)^(1/3) / mu rho0^(4/3) (WSM6 qck1)."
},
"pacrr": {
"type": "unknown",
"units": "1/(m^(19/5)*s)",
"description": "Accretion coefficient pi n0r a Gamma(3 + b) E_rc / 4 (WSM6 pacrr); units for b = 4/5."
},
"precr1": {
"type": "unknown",
"units": "1/m^4",
"description": "Rain evaporation coefficient of the non-ventilated term, 2 pi n0r a_v (WSM6 precr1)."
},
"precr2": {
"type": "unknown",
"units": "1/(m^(39/10)*s^(1/2))",
"description": "Rain evaporation coefficient of the ventilated term, 2 pi n0r b_v a^(1/2) Gamma(2.5 + b/2) (WSM6 precr2); units for b = 4/5."
},
"f_diff": {
"type": "unknown",
"units": "s/m^2",
"shape": [
"lev"
],
"description": "Diffusional-growth denominator rho xl^2/(ka r_v T^2) + 1/(qsat Dv) (WSM6 work1(:,:,1))."
},
"praut": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "Autoconversion rate of cloud water to rain, unlimited (HDC eq. 16)."
},
"praut_lim": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "Autoconversion rate after the kernel's time-step limiter min(praut, qc/dtcld) (WSM6 praut as applied)."
},
"pracw": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "Accretion rate of cloud water by rain, unlimited (HL eq. A40)."
},
"pracw_lim": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "Accretion rate after the kernel's time-step limiter min(pracw, qc/dtcld) (WSM6 pracw as applied)."
},
"prevp": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "Rain evaporation (negative) / condensation (positive) rate, unlimited (HDC eq. 14)."
},
"satdt": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "Vapor excess over saturation per sub-step, (max(qv, qmin) - qsat)/dtcld (WSM6 satdt)."
},
"prevp_lim": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "Rain evaporation/condensation rate after the kernel's time-step limiters (WSM6 prevp as applied)."
}
},
"equations": [
{
"lhs": "qv",
"rhs": {
"op": "input_qv",
"args": []
}
},
{
"lhs": "qc",
"rhs": {
"op": "input_qc",
"args": []
}
},
{
"lhs": "qsat",
"rhs": {
"op": "input_qsat",
"args": []
}
},
{
"lhs": "rh",
"rhs": {
"op": "input_rh",
"args": []
}
},
{
"lhs": "xl",
"rhs": {
"op": "input_xl",
"args": []
}
},
{
"lhs": "qc0",
"rhs": {
"op": "/",
"args": [
{
"op": "*",
"args": [
{
"op": "/",
"args": [
{
"op": "const",
"args": [],
"value": 4,
"units": "1"
},
{
"op": "const",
"args": [],
"value": 3,
"units": "1"
}
]
},
"wrf.piconst",
"wrf.rhowater",
{
"op": "^",
"args": [
"par.r0",
3
]
},
"par.xncr"
]
},
"wrf.rhoair0"
]
}
},
{
"lhs": "qck1",
"rhs": {
"op": "*",
"args": [
{
"op": "/",
"args": [
{
"op": "*",
"args": [
"par.autoconv_coef",
"par.g_autoconv",
"par.peaut"
]
},
{
"op": "*",
"args": [
{
"op": "^",
"args": [
{
"op": "*",
"args": [
"par.xncr",
"wrf.rhowater"
]
},
{
"op": "/",
"args": [
1,
3
]
}
]
},
"par.xmyu"
]
}
]
},
{
"op": "^",
"args": [
"wrf.rhoair0",
{
"op": "/",
"args": [
4,
3
]
}
]
}
]
}
},
{
"lhs": "pacrr",
"rhs": {
"op": "/",
"args": [
{
"op": "*",
"args": [
"wrf.piconst",
"par.n0r",
"par.avtr",
"par.g3pbr",
"par.eacrr"
]
},
{
"op": "const",
"args": [],
"value": 4,
"units": "1"
}
]
}
},
{
"lhs": "precr1",
"rhs": {
"op": "*",
"args": [
{
"op": "const",
"args": [],
"value": 2,
"units": "1"
},
"wrf.piconst",
"par.n0r",
"par.vent_a"
]
}
},
{
"lhs": "precr2",
"rhs": {
"op": "*",
"args": [
{
"op": "const",
"args": [],
"value": 2,
"units": "1"
},
"wrf.piconst",
"par.n0r",
"par.vent_b",
{
"op": "sqrt",
"args": [
"par.avtr"
]
},
"par.g5pbro2"
]
}
},
{
"lhs": "f_diff",
"rhs": {
"op": "apply_expression_template",
"args": [],
"name": "diffusional_growth_denominator",
"bindings": {
"L": "xl",
"T": "sd.T",
"rho": "sd.rho",
"ka": "sd.ka",
"r_v": "wrf.r_v",
"qsat": "qsat",
"Dv": "sd.Dv"
}
}
},
{
"lhs": "praut",
"rhs": {
"op": "apply_expression_template",
"args": [],
"name": "hdc_autoconversion",
"bindings": {
"qc": "qc",
"qc0": "qc0",
"qck1": "qck1"
}
}
},
{
"lhs": "praut_lim",
"rhs": {
"op": "apply_expression_template",
"args": [],
"name": "sink_rate_limiter",
"bindings": {
"rate": "praut",
"q": "qc",
"dt": "dtcld"
}
}
},
{
"lhs": "pracw",
"rhs": {
"op": "apply_expression_template",
"args": [],
"name": "accretion_of_cloud_by_rain",
"bindings": {
"qc": "qc",
"qr": "sd.qr",
"rslope3": "sd.rslope3_r",
"rslopeb": "sd.rslopeb_r",
"pacrr": "pacrr",
"denfac": "sd.denfac",
"qr_min": "par.qcrmin",
"qc_min": "par.qmin"
}
}
},
{
"lhs": "pracw_lim",
"rhs": {
"op": "apply_expression_template",
"args": [],
"name": "sink_rate_limiter",
"bindings": {
"rate": "pracw",
"q": "qc",
"dt": "dtcld"
}
}
},
{
"lhs": "prevp",
"rhs": {
"op": "apply_expression_template",
"args": [],
"name": "rain_evaporation",
"bindings": {
"qr": "sd.qr",
"rh": "rh",
"rslope2": "sd.rslope2_r",
"coeres": "sd.coeres_r",
"f_vent": "sd.f_vent",
"f_diff": "f_diff",
"precr1": "precr1",
"precr2": "precr2"
}
}
},
{
"lhs": "satdt",
"rhs": {
"op": "/",
"args": [
{
"op": "-",
"args": [
{
"op": "max",
"args": [
"qv",
"par.qmin"
]
},
"qsat"
]
},
"dtcld"
]
}
},
{
"lhs": "prevp_lim",
"rhs": {
"op": "apply_expression_template",
"args": [],
"name": "rain_evaporation_limiter",
"bindings": {
"prevp": "prevp",
"qr": "sd.qr",
"satdt": "satdt",
"dt": "dtcld"
}
}
}
],
"tests": [
{
"id": "qss_step250_row23_col24_mature_warm_rain",
"description": "Reference: WRF 4.8 em_quarter_ss idealized supercell (GNU real32 build, dx = 2 km, dt = 12 s, 40 layers, WSM6 only, no radiation/surface physics) dumped by the instrumented ctessum-claude/WRF fork (module_esm_dump with esm_dump_inner hooks inside mp_wsm6_run of the ctessum-claude/MMM-physics fork, commit 52cfbd7) and replayed through the real64 (kind_phys = real64) standalone kernels/wsm6_driver at the WRF step. The test is POINTWISE and step-free: the inputs are the evaluation state the kernel dumps immediately before its warm-rain block (t_rates, q_rates, qc_rates, qr_rates: the state after the sub-step's sedimentation, melting and freezing; den and p: kernel arguments; qsat_w, rh_w, xl: the start-of-sub-step saturation block, see saturation.esm), the expected values are the process rates the kernel dumps right after evaluating them (`<rate>_raw`: after each process's own time-step limiter, before the mass-conservation rescaling) and the intermediates rslope*, work1 (f_diff), work2 (f_vent), denfac and the mp_wsm6_init coefficients, all taken from the real64 replay. No small-dt replay is used because WSM6's increments are not rate x dt (EqWeFiC FORTRAN_BUGS.md note N3). Real64 replay vs real32 in-model dump (compare_dump.py): 1.5e-7 (praut), 8e-7 (pracw), 7.5e-6 (prevp), 3-4e-7 (rslope*), 1.5e-6 (work1), 3.6e-7 (work2); the real32 driver reproduces the dump bit-for-bit. Residual mismatch between this component and the real64 kernel comes from the kernel's default-real literals and the real32 WRF constants it receives (bvtr = 0.800000011920929, avtr = 841.9000244, den0 = 1.27999997, cpv = 1846.4000244, rv = 461.6000061, .104, 9.8, .55, .78, .31, 1.496e-6, 8.794e-5, 1.414e3), which this component takes at their nominal values from lib/wrf_constants.esm and wsm6_parameters.esm (EqWeFiC FORTRAN_BUGS.md note N2-style rounding); measured with zero tolerances over all four tests it is <= 4.1e-7 relative in the rates (praut; pracw 1.2e-7, prevp 2.1e-7), 1.9e-7 in the coefficients (qck1), 2e-7 of the column maximum in f_diff, 1e-7 in f_vent and <= 9e-8 in rslope*, denfac. Tolerances are set 5-10x above the measured residual: relative 1e-6 on the mp_wsm6_init coefficients and on every spot check, absolute Linf_error bounds on the whole columns at 1e-6 of each column's maximum. The unlimited rates praut, pracw, prevp are the physics and are spot-checked at layers where the kernel's limiter is provably inactive (there the dumped `<rate>_raw` equals the unlimited rate); the limited observeds praut_lim, pracw_lim, prevp_lim are compared with the dumped `<rate>_raw` over the whole column. Regime: supercell step 250 (t = 50 min), tile row j = 23, tile column i = 24 (the column with the strongest warm-rain rates): qc up to 2.4e-3, qr up to 1.3e-2 kg/kg, autoconversion active in layers 3-18 (qc > qc0), accretion and rain evaporation/condensation in layers 1-16 (rain present), rh_w 0.68-1.36 so prevp changes sign within the column, freezing level at layer 9. No limiter is active anywhere in the column (checked in the dump: no praut/pracw equals qc/dtcld and no prevp equals -qr/dtcld or satdt/2), so the whole `<rate>_raw` columns equal the unlimited rates.",
"parameter_overrides": {
"dtcld": 12.0
},
"expression_template_imports": [
{
"ref": "./tests/qss_step250_row23_col24_mature_warm_rain_inputs.esm"
}
],
"time_span": {
"start": 0.0,
"end": 1.0
},
"assertions": [
{
"variable": "sd.pidn0r",
"time": 0.0,
"expected": 25132741928.100586,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.rslope_r_max",
"time": 0.0,
"expected": 1.25e-05,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qc0",
"time": 0.0,
"expected": 0.0005026548609702604,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qck1",
"time": 0.0,
"expected": 6.773894126490344,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "pacrr",
"time": 0.0,
"expected": 24813389640.68711,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "precr1",
"time": 0.0,
"expected": 39207075.969729885,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "precr2",
"time": 0.0,
"expected": 825851896.7563319,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.denfac",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
1.074297648601964,
1.0988758165188706,
1.1288867811848777,
1.1602700614599697,
1.192123954468512,
1.2246820558855798,
1.2582500928449838,
1.292808506687401,
1.3283037231725008,
1.3645763776496205,
1.4020583602973977,
1.4396854385640094,
1.4835556358342181,
1.5248115440101326,
1.5664510609796232,
1.6091176379658874,
1.6525457933489218,
1.6967181474622186,
1.74166539824332,
1.787388938078431,
1.833815931787568,
1.8819464686130778,
1.930171827665902,
1.9789910276164668,
2.0287444851154315,
2.08004478930757,
2.1338844217674344,
2.192584031512916,
2.272919650733487,
2.4071314861423874,
2.517537815782692,
2.628772485136029,
2.7445896462038344,
2.862603538137479,
2.982749200059628,
3.1061754351938746,
3.2347614364631796,
3.3704631345827436,
3.515037802394403,
3.669399516419166
]
},
"k"
]
}
},
"tolerance": {
"abs": 4e-06,
"rel": 0.0
}
},
{
"variable": "sd.rslope_r",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
7.9906646804699e-05,
0.00010344421944512668,
0.00021317834431825756,
0.0003944255263410482,
0.0004749145060720375,
0.0005322665799138319,
0.0005865828066762028,
0.0006378598144903875,
0.000680213262012178,
0.0007167133495901135,
0.000748229217723808,
0.000731039049265215,
0.0005477001284392731,
0.0003818205211059693,
0.00010327801509185513,
5.158844364893619e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05
]
},
"k"
]
}
},
"tolerance": {
"abs": 1e-09,
"rel": 0.0
}
},
{
"variable": "sd.rslopeb_r",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
0.0005273103263606614,
0.0006482834490548203,
0.0011560973990689856,
0.0018913502902156607,
0.0021942813327791373,
0.0024038276134050246,
0.0025981452386019876,
0.0027783065045619247,
0.0029249337807164357,
0.003049835094343676,
0.0031566591719503065,
0.003098506584138366,
0.0024594286924326633,
0.0018428389041946107,
0.0006474500348220588,
0.0003715710671083134,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534
]
},
"k"
]
}
},
"tolerance": {
"abs": 3e-09,
"rel": 0.0
}
},
{
"variable": "sd.rslope2_r",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
6.385072203570913e-09,
1.0700706536611525e-08,
4.544500648627358e-08,
1.5557149582941292e-07,
2.2554378807764737e-07,
2.833077120931676e-07,
3.4407938908813156e-07,
4.068651429417116e-07,
4.626900818172478e-07,
5.136780254806803e-07,
5.598469622555817e-07,
5.344180915505894e-07,
2.999754306923963e-07,
1.4578691033763395e-07,
1.0666348401313457e-08,
2.661367518119465e-09,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10
]
},
"k"
]
}
},
"tolerance": {
"abs": 1e-12,
"rel": 0.0
}
},
{
"variable": "sd.rslope3_r",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
5.10209709393242e-13,
1.106926235191144e-12,
9.687891240276277e-12,
6.136136912618038e-11,
1.071140167125122e-10,
1.507952269790429e-10,
2.0183105377074944e-10,
2.5952292459940517e-10,
3.1472792985359166e-10,
3.6815989825309403e-10,
4.188938546135442e-10,
3.9068049355727353e-10,
1.6429658191885172e-10,
5.5664434075544614e-11,
1.101599291165836e-12,
1.3729580823761518e-13,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15
]
},
"k"
]
}
},
"tolerance": {
"abs": 1e-15,
"rel": 0.0
}
},
{
"variable": "f_diff",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
8026923.628296606,
8724937.277866924,
8862682.386295747,
8840272.999362536,
8896180.11765483,
9029443.909470104,
9205681.067335943,
9435431.52079011,
9739340.73215329,
10166408.14029887,
10686235.875643294,
11686565.685692739,
12306627.362419438,
12357103.654849898,
13752494.88233852,
15577013.497022197,
17987442.01666145,
21417462.378376856,
26307490.85644968,
33299710.65183302,
43937031.56645844,
59202770.64996356,
79919954.785101,
115186361.15481491,
173031421.44883773,
267062083.79733422,
409256740.2904048,
591973896.5522459,
518819066.56359154,
135112867.36483318,
76686559.57602045,
49289149.418583125,
33082964.099474166,
24305543.16126555,
19468250.79815123,
16628945.578797702,
14734741.231603855,
13245944.358569387,
11909106.520231215,
10719542.821695829
]
},
"k"
]
}
},
"tolerance": {
"abs": 1000.0,
"rel": 0.0
}
},
{
"variable": "sd.f_vent",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
215.66746749988326,
214.99770293889614,
212.99754010605017,
210.71883066670142,
208.55202995290898,
206.47645846783593,
204.43375007890464,
202.4288932846614,
200.47333917478738,
198.59808883035583,
196.73813657764694,
195.0666605339713,
192.95448778712415,
190.87965610040038,
189.33757212213962,
187.81505562441393,
186.35779808079897,
185.01291560347877,
183.76476594533966,
182.5988136845486,
181.52434655680216,
180.49965470159694,
179.47912823632174,
178.63969031128053,
177.89162032668648,
177.16837338433513,
176.34192828880916,
175.21225631432188,
172.1169989746095,
164.42380794185368,
159.77840085288665,
155.65967372473284,
151.74328181824455,
148.20338511239007,
145.01879197500634,
142.09679500102663,
139.32346863356622,
136.60782183194635,
133.89246707329647,
131.1778088005834
]
},
"k"
]
}
},
"tolerance": {
"abs": 0.0002,
"rel": 0.0
}
},
{
"variable": "praut_lim",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
0.0,
0.0,
1.9357958410801186e-07,
1.5774301493694098e-06,
3.3410524737266776e-06,
4.5624024655531545e-06,
4.776001900199129e-06,
3.925067850146925e-06,
2.668110856689126e-06,
1.6133035731154066e-06,
8.784625818746462e-07,
6.284418778649147e-07,
3.302129684531748e-07,
1.7435399076357076e-07,
1.745086051384306e-07,
1.9620485800765876e-07,
1.9953221741739934e-07,
1.6882265722717114e-07,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 2e-11,
"rel": 0.0
}
},
{
"variable": "pracw_lim",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
3.712819835883861e-15,
1.786532330414269e-12,
1.8341137124693437e-07,
4.800049279886456e-06,
1.3777336674382236e-05,
2.4946501079627984e-05,
3.7812017892275785e-05,
4.911112058600663e-05,
5.459983662964868e-05,
5.5146213362748744e-05,
5.142366138469022e-05,
4.187624920846814e-05,
1.0932496007256233e-05,
2.16952438039549e-06,
1.5502256262088853e-08,
1.1976954087040937e-09,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 1e-10,
"rel": 0.0
}
},
{
"variable": "prevp_lim",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
-1.919336376612395e-08,
-5.046321260634071e-09,
2.72013353462863e-08,
1.9365009457152554e-07,
4.049782907551879e-07,
6.894363749532956e-07,
1.0755427116322918e-06,
1.5630348696389676e-06,
2.0883337312921383e-06,
2.6345260559294498e-06,
3.1747321039452112e-06,
3.34692873339902e-06,
1.5919515457107215e-06,
4.817579702512617e-07,
1.9406031082072022e-08,
3.774408074586362e-09,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 5e-12,
"rel": 0.0
}
},
{
"variable": "praut",
"time": 0.0,
"coords": {
"lev": 3
},
"expected": 1.9357958410801186e-07,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "praut",
"time": 0.0,
"coords": {
"lev": 8
},
"expected": 3.925067850146925e-06,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "praut",
"time": 0.0,
"coords": {
"lev": 12
},
"expected": 6.284418778649147e-07,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "praut",
"time": 0.0,
"coords": {
"lev": 18
},
"expected": 1.6882265722717114e-07,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pracw",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 3.712819835883861e-15,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pracw",
"time": 0.0,
"coords": {
"lev": 5
},
"expected": 1.3777336674382236e-05,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pracw",
"time": 0.0,
"coords": {
"lev": 10
},
"expected": 5.5146213362748744e-05,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pracw",
"time": 0.0,
"coords": {
"lev": 16
},
"expected": 1.1976954087040937e-09,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "prevp",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": -1.919336376612395e-08,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "prevp",
"time": 0.0,
"coords": {
"lev": 4
},
"expected": 1.9365009457152554e-07,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "prevp",
"time": 0.0,
"coords": {
"lev": 9
},
"expected": 2.0883337312921383e-06,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "prevp",
"time": 0.0,
"coords": {
"lev": 16
},
"expected": 3.774408074586362e-09,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "sd.rslope_r",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 7.9906646804699e-05,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.rslope_r",
"time": 0.0,
"coords": {
"lev": 8
},
"expected": 0.0006378598144903875,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.rslope_r",
"time": 0.0,
"coords": {
"lev": 16
},
"expected": 5.158844364893619e-05,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.rslope_r",
"time": 0.0,
"coords": {
"lev": 30
},
"expected": 1.25e-05,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.rslopeb_r",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 0.0005273103263606614,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.rslopeb_r",
"time": 0.0,
"coords": {
"lev": 8
},
"expected": 0.0027783065045619247,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.rslopeb_r",
"time": 0.0,
"coords": {
"lev": 16
},
"expected": 0.0003715710671083134,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "f_diff",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 8026923.628296606,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "f_diff",
"time": 0.0,
"coords": {
"lev": 10
},
"expected": 10166408.14029887,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "f_diff",
"time": 0.0,
"coords": {
"lev": 20
},
"expected": 33299710.65183302,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "f_diff",
"time": 0.0,
"coords": {
"lev": 40
},
"expected": 10719542.821695829,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.f_vent",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 215.66746749988326,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.f_vent",
"time": 0.0,
"coords": {
"lev": 10
},
"expected": 198.59808883035583,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.f_vent",
"time": 0.0,
"coords": {
"lev": 20
},
"expected": 182.5988136845486,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.f_vent",
"time": 0.0,
"coords": {
"lev": 40
},
"expected": 131.1778088005834,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.denfac",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 1.074297648601964,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.denfac",
"time": 0.0,
"coords": {
"lev": 20
},
"expected": 1.787388938078431,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.denfac",
"time": 0.0,
"coords": {
"lev": 40
},
"expected": 3.669399516419166,
"tolerance": {
"rel": 1e-06
}
}
]
},
{
"id": "qss_step250_row22_col25_second_column",
"description": "Reference: WRF 4.8 em_quarter_ss idealized supercell (GNU real32 build, dx = 2 km, dt = 12 s, 40 layers, WSM6 only, no radiation/surface physics) dumped by the instrumented ctessum-claude/WRF fork (module_esm_dump with esm_dump_inner hooks inside mp_wsm6_run of the ctessum-claude/MMM-physics fork, commit 52cfbd7) and replayed through the real64 (kind_phys = real64) standalone kernels/wsm6_driver at the WRF step. The test is POINTWISE and step-free: the inputs are the evaluation state the kernel dumps immediately before its warm-rain block (t_rates, q_rates, qc_rates, qr_rates: the state after the sub-step's sedimentation, melting and freezing; den and p: kernel arguments; qsat_w, rh_w, xl: the start-of-sub-step saturation block, see saturation.esm), the expected values are the process rates the kernel dumps right after evaluating them (`<rate>_raw`: after each process's own time-step limiter, before the mass-conservation rescaling) and the intermediates rslope*, work1 (f_diff), work2 (f_vent), denfac and the mp_wsm6_init coefficients, all taken from the real64 replay. No small-dt replay is used because WSM6's increments are not rate x dt (EqWeFiC FORTRAN_BUGS.md note N3). Real64 replay vs real32 in-model dump (compare_dump.py): 1.5e-7 (praut), 8e-7 (pracw), 7.5e-6 (prevp), 3-4e-7 (rslope*), 1.5e-6 (work1), 3.6e-7 (work2); the real32 driver reproduces the dump bit-for-bit. Residual mismatch between this component and the real64 kernel comes from the kernel's default-real literals and the real32 WRF constants it receives (bvtr = 0.800000011920929, avtr = 841.9000244, den0 = 1.27999997, cpv = 1846.4000244, rv = 461.6000061, .104, 9.8, .55, .78, .31, 1.496e-6, 8.794e-5, 1.414e3), which this component takes at their nominal values from lib/wrf_constants.esm and wsm6_parameters.esm (EqWeFiC FORTRAN_BUGS.md note N2-style rounding); measured with zero tolerances over all four tests it is <= 4.1e-7 relative in the rates (praut; pracw 1.2e-7, prevp 2.1e-7), 1.9e-7 in the coefficients (qck1), 2e-7 of the column maximum in f_diff, 1e-7 in f_vent and <= 9e-8 in rslope*, denfac. Tolerances are set 5-10x above the measured residual: relative 1e-6 on the mp_wsm6_init coefficients and on every spot check, absolute Linf_error bounds on the whole columns at 1e-6 of each column's maximum. The unlimited rates praut, pracw, prevp are the physics and are spot-checked at layers where the kernel's limiter is provably inactive (there the dumped `<rate>_raw` equals the unlimited rate); the limited observeds praut_lim, pracw_lim, prevp_lim are compared with the dumped `<rate>_raw` over the whole column. Regime: supercell step 250, tile row j = 22, tile column i = 25: the strongest autoconversion of the reference run (praut up to 1.0e-5 kg/kg/s in layers 3-19), accretion up to 7.0e-5 and rain evaporation/condensation in layers 1-16, rh_w 0.70-1.44. No limiter active.",
"parameter_overrides": {
"dtcld": 12.0
},
"expression_template_imports": [
{
"ref": "./tests/qss_step250_row22_col25_second_column_inputs.esm"
}
],
"time_span": {
"start": 0.0,
"end": 1.0
},
"assertions": [
{
"variable": "sd.pidn0r",
"time": 0.0,
"expected": 25132741928.100586,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.rslope_r_max",
"time": 0.0,
"expected": 1.25e-05,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qc0",
"time": 0.0,
"expected": 0.0005026548609702604,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qck1",
"time": 0.0,
"expected": 6.773894126490344,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "pacrr",
"time": 0.0,
"expected": 24813389640.68711,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "precr1",
"time": 0.0,
"expected": 39207075.969729885,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "precr2",
"time": 0.0,
"expected": 825851896.7563319,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.denfac",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
1.074025297697386,
1.0987267483437506,
1.1289690560444792,
1.1603510611021222,
1.192350992337824,
1.2250040483265952,
1.258421320437587,
1.2926926614156569,
1.3278852262826213,
1.3638983686227832,
1.4011674906802092,
1.438910350795757,
1.4819530620592738,
1.523477806894931,
1.5653034081449397,
1.6082845578269638,
1.6522289248533488,
1.697133408840694,
1.7429764231246212,
1.7896871303839719,
1.8370840861737252,
1.8861539081703533,
1.9352169745712706,
1.9845217377577526,
2.0343709423457703,
2.085367242166731,
2.1369078569299558,
2.1911905199664905,
2.2597594029856896,
2.3871007159118562,
2.510083773249196,
2.629492764476209,
2.7489568614160484,
2.8676574462180784,
2.9863905756497466,
3.1075948183954445,
3.2342685104519178,
3.3689730209323296,
3.5135693464967437,
3.6689180513052677
]
},
"k"
]
}
},
"tolerance": {
"abs": 4e-06,
"rel": 0.0
}
},
{
"variable": "sd.rslope_r",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
0.0001235998623938123,
9.574795661677236e-05,
0.00013656219946635347,
0.00022475180416360406,
0.00032990292757093155,
0.0004131917715769635,
0.00048025755437094877,
0.0005308300854100411,
0.0005660842792845646,
0.0005977706522307166,
0.0006458337796417643,
0.0006513780237418175,
0.0004920813180136228,
0.00034371380881194347,
0.00015053090253255985,
6.276541872099981e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05
]
},
"k"
]
}
},
"tolerance": {
"abs": 1e-09,
"rel": 0.0
}
},
{
"variable": "sd.rslopeb_r",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
0.0007475054152246396,
0.0006094015627109753,
0.0008095885480018096,
0.0012060422044175957,
0.0016394904607455049,
0.001963004481439728,
0.00221400870661246,
0.0023986362025272927,
0.002525252656846689,
0.002637713566700722,
0.002806057507498271,
0.00282531219331701,
0.0022575088543431722,
0.001694172168763481,
0.0008751862519829711,
0.0004346866418082571,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534
]
},
"k"
]
}
},
"tolerance": {
"abs": 3e-09,
"rel": 0.0
}
},
{
"variable": "sd.rslope2_r",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
1.5276925983769335e-08,
9.167671196287321e-09,
1.864923432308811e-08,
5.0513373474795035e-08,
1.088359416198713e-07,
1.7072744009890957e-07,
2.306473185303648e-07,
2.817805795764315e-07,
3.204514112531249e-07,
3.573297526683363e-07,
4.1710127092636695e-07,
4.242933298137958e-07,
2.421440235380242e-07,
1.1813918236801323e-07,
2.2659552617267033e-08,
3.939497787222433e-09,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10
]
},
"k"
]
}
},
"tolerance": {
"abs": 1e-12,
"rel": 0.0
}
},
{
"variable": "sd.rslope3_r",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
1.888225949394345e-12,
8.77785783978952e-13,
2.546780457524324e-12,
1.1352971822850126e-11,
3.5905295765334535e-11,
7.054317343126836e-11,
1.1077011711961022e-10,
1.49577609123448e-10,
1.814025061849468e-10,
2.13601239313992e-10,
2.6937809029575913e-10,
2.763753506609455e-10,
1.1915455025171266e-10,
4.060606834163862e-11,
3.4109629064612353e-12,
2.472642281654682e-13,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15
]
},
"k"
]
}
},
"tolerance": {
"abs": 1e-15,
"rel": 0.0
}
},
{
"variable": "f_diff",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
8090063.467720749,
8781538.91144324,
8877591.728959419,
8869748.65339145,
8935489.489595287,
9086571.831618795,
9321551.082805023,
9647019.199903,
10077803.490531059,
10650120.443616102,
11317738.909417909,
12473147.038612567,
13387144.98696275,
13512006.360040346,
14981514.526179355,
16993945.485875603,
19492972.45739197,
22901663.798043083,
27629618.99680331,
34186358.17104824,
44103092.85720208,
58095553.77235058,
75942047.84966688,
106105818.88844089,
156093453.37821534,
240052136.76767537,
388248477.2643209,
631099845.6329187,
746996598.0217602,
218993570.386977,
90225070.8626191,
48388277.5402721,
30267637.449642397,
22047905.39329865,
18167709.223729122,
16151399.908548076,
14793457.750405848,
13527584.031027673,
12166017.156746767,
10795997.545564944
]
},
"k"
]
}
},
"tolerance": {
"abs": 1000.0,
"rel": 0.0
}
},
{
"variable": "sd.f_vent",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
215.79314433890104,
215.0877396843175,
213.00465475828636,
210.74287611205034,
208.57999392942895,
206.5155851916542,
204.52861233330188,
202.60629896746562,
200.74183357468416,
198.94699194533598,
197.14732894501742,
195.47623684539383,
193.338800449876,
191.3561811338405,
189.80841013509362,
188.25245917996023,
186.71619862037196,
185.26394884984785,
183.8928417336973,
182.59243957534682,
181.38964495661412,
180.2611509882808,
179.12072156877056,
178.1805830206925,
177.38252470291394,
176.6766754335836,
176.0917307632946,
175.4274261700719,
173.48556323838395,
166.2699414387448,
160.40587316519597,
155.59318109065765,
151.406241500313,
147.83526247306878,
144.76266829712074,
141.99406678167932,
139.34268469831076,
136.68593404921228,
133.96841784735756,
131.20215802851985
]
},
"k"
]
}
},
"tolerance": {
"abs": 0.0002,
"rel": 0.0
}
},
{
"variable": "praut_lim",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
0.0,
0.0,
2.1644457486470636e-07,
1.8282070564241106e-06,
4.707902061271937e-06,
7.678546272027564e-06,
9.601382769876943e-06,
1.026608762315614e-05,
9.877315337016933e-06,
9.01332121258206e-06,
6.697446775548392e-06,
5.055526945262356e-06,
2.906096830384476e-06,
1.3284117913776648e-06,
7.670560290149495e-07,
5.184366148630599e-07,
4.227306426057178e-07,
3.2447046455267913e-07,
2.007107254006031e-07,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 2e-11,
"rel": 0.0
}
},
{
"variable": "pracw_lim",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
1.5713017030890004e-15,
1.6297367753930926e-12,
3.5421773662809364e-08,
6.03311894083013e-07,
3.997697793983836e-06,
1.1915243748851273e-05,
2.3856791578943517e-05,
3.689515702468493e-05,
4.75955464893726e-05,
5.781407891439986e-05,
7.016068811270063e-05,
6.597775040018314e-05,
1.846374675016266e-05,
3.4707658937654375e-06,
1.2229255405812236e-07,
3.824820071294295e-09,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 1e-10,
"rel": 0.0
}
},
{
"variable": "prevp_lim",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
-5.3380300350291026e-08,
-2.6670253952367282e-09,
8.633837187583226e-09,
4.573833699189972e-08,
1.7106992653602842e-07,
4.031150848105375e-07,
7.397916955121329e-07,
1.1375949763902689e-06,
1.538593794888291e-06,
1.9594875092941618e-06,
2.569750250341392e-06,
2.9150727441379584e-06,
1.4004575928398127e-06,
4.2355065516858433e-07,
5.42714848562475e-08,
6.607388330064374e-09,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 5e-12,
"rel": 0.0
}
},
{
"variable": "praut",
"time": 0.0,
"coords": {
"lev": 3
},
"expected": 2.1644457486470636e-07,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "praut",
"time": 0.0,
"coords": {
"lev": 10
},
"expected": 9.01332121258206e-06,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "praut",
"time": 0.0,
"coords": {
"lev": 19
},
"expected": 2.007107254006031e-07,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pracw",
"time": 0.0,
"coords": {
"lev": 2
},
"expected": 1.6297367753930926e-12,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pracw",
"time": 0.0,
"coords": {
"lev": 8
},
"expected": 3.689515702468493e-05,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pracw",
"time": 0.0,
"coords": {
"lev": 16
},
"expected": 3.824820071294295e-09,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "prevp",
"time": 0.0,
"coords": {
"lev": 2
},
"expected": -2.6670253952367282e-09,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "prevp",
"time": 0.0,
"coords": {
"lev": 8
},
"expected": 1.1375949763902689e-06,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "prevp",
"time": 0.0,
"coords": {
"lev": 16
},
"expected": 6.607388330064374e-09,
"tolerance": {
"rel": 2e-06
}
}
]
},
{
"id": "qss_step200_row20_col27_early_storm_limiter_active",
"description": "Reference: WRF 4.8 em_quarter_ss idealized supercell (GNU real32 build, dx = 2 km, dt = 12 s, 40 layers, WSM6 only, no radiation/surface physics) dumped by the instrumented ctessum-claude/WRF fork (module_esm_dump with esm_dump_inner hooks inside mp_wsm6_run of the ctessum-claude/MMM-physics fork, commit 52cfbd7) and replayed through the real64 (kind_phys = real64) standalone kernels/wsm6_driver at the WRF step. The test is POINTWISE and step-free: the inputs are the evaluation state the kernel dumps immediately before its warm-rain block (t_rates, q_rates, qc_rates, qr_rates: the state after the sub-step's sedimentation, melting and freezing; den and p: kernel arguments; qsat_w, rh_w, xl: the start-of-sub-step saturation block, see saturation.esm), the expected values are the process rates the kernel dumps right after evaluating them (`<rate>_raw`: after each process's own time-step limiter, before the mass-conservation rescaling) and the intermediates rslope*, work1 (f_diff), work2 (f_vent), denfac and the mp_wsm6_init coefficients, all taken from the real64 replay. No small-dt replay is used because WSM6's increments are not rate x dt (EqWeFiC FORTRAN_BUGS.md note N3). Real64 replay vs real32 in-model dump (compare_dump.py): 1.5e-7 (praut), 8e-7 (pracw), 7.5e-6 (prevp), 3-4e-7 (rslope*), 1.5e-6 (work1), 3.6e-7 (work2); the real32 driver reproduces the dump bit-for-bit. Residual mismatch between this component and the real64 kernel comes from the kernel's default-real literals and the real32 WRF constants it receives (bvtr = 0.800000011920929, avtr = 841.9000244, den0 = 1.27999997, cpv = 1846.4000244, rv = 461.6000061, .104, 9.8, .55, .78, .31, 1.496e-6, 8.794e-5, 1.414e3), which this component takes at their nominal values from lib/wrf_constants.esm and wsm6_parameters.esm (EqWeFiC FORTRAN_BUGS.md note N2-style rounding); measured with zero tolerances over all four tests it is <= 4.1e-7 relative in the rates (praut; pracw 1.2e-7, prevp 2.1e-7), 1.9e-7 in the coefficients (qck1), 2e-7 of the column maximum in f_diff, 1e-7 in f_vent and <= 9e-8 in rslope*, denfac. Tolerances are set 5-10x above the measured residual: relative 1e-6 on the mp_wsm6_init coefficients and on every spot check, absolute Linf_error bounds on the whole columns at 1e-6 of each column's maximum. The unlimited rates praut, pracw, prevp are the physics and are spot-checked at layers where the kernel's limiter is provably inactive (there the dumped `<rate>_raw` equals the unlimited rate); the limited observeds praut_lim, pracw_lim, prevp_lim are compared with the dumped `<rate>_raw` over the whole column. Regime: supercell step 200 (t = 40 min), tile row j = 20, tile column i = 27: an early, weak warm-rain column (praut in layers 8-11 only, pracw up to 1.5e-7 in layers 6-15). Rain is present but below qcrmin in layers 1, 2 and 4 (0 < qr <= 1e-9), so there the inverse slope is held at rslope_max and rain evaporation is capped by the kernel's -qr/dtcld limiter (layers 1-5 are limiter-active in the dump); prevp_lim is checked over the whole column and at those layers explicitly, the unlimited prevp only at limiter-inactive layers.",
"parameter_overrides": {
"dtcld": 12.0
},
"expression_template_imports": [
{
"ref": "./tests/qss_step200_row20_col27_early_storm_limiter_active_inputs.esm"
}
],
"time_span": {
"start": 0.0,
"end": 1.0
},
"assertions": [
{
"variable": "sd.pidn0r",
"time": 0.0,
"expected": 25132741928.100586,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.rslope_r_max",
"time": 0.0,
"expected": 1.25e-05,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qc0",
"time": 0.0,
"expected": 0.0005026548609702604,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qck1",
"time": 0.0,
"expected": 6.773894126490344,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "pacrr",
"time": 0.0,
"expected": 24813389640.68711,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "precr1",
"time": 0.0,
"expected": 39207075.969729885,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "precr2",
"time": 0.0,
"expected": 825851896.7563319,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.denfac",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
1.0750203036195107,
1.1024424290355563,
1.1299036142992922,
1.157334391714791,
1.1860695348254628,
1.215399527824106,
1.2445859158273895,
1.2775546186387448,
1.310449903249298,
1.3432995581910092,
1.3785436363173034,
1.4166935638729212,
1.4564949379102992,
1.4971951471028861,
1.5386808475960996,
1.5806756773014847,
1.6231206263164528,
1.6671293363753246,
1.7127263147696359,
1.7590371364943087,
1.8066217926720392,
1.855911527705402,
1.9083092545765066,
1.9663640496654045,
2.0321830170759503,
2.1032550345830083,
2.1819460849979735,
2.270344336518286,
2.3609959322875285,
2.4529588901240698,
2.5463586146685633,
2.641394049992052,
2.7390498540526536,
2.8416113951110527,
2.951759414937571,
3.0716483885355927,
3.202381560908287,
3.344247490345262,
3.497268052320202,
3.6627145270031605
]
},
"k"
]
}
},
"tolerance": {
"abs": 4e-06,
"rel": 0.0
}
},
{
"variable": "sd.rslope_r",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
1.25e-05,
1.25e-05,
1.4287005368204459e-05,
1.25e-05,
2.1234395302315153e-05,
2.9404511314935513e-05,
0.00011988593107710556,
0.00016099935971568518,
0.0001720678323724581,
0.00013046322147922357,
5.7839865555198295e-05,
5.813531173971759e-05,
9.94264837931543e-05,
8.153689365069769e-05,
5.148463431639595e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05
]
},
"k"
]
}
},
"tolerance": {
"abs": 1e-09,
"rel": 0.0
}
},
{
"variable": "sd.rslopeb_r",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
0.00011954404638495534,
0.00011954404638495534,
0.000133031016193978,
0.00011954404638495534,
0.0001826551251580966,
0.00023699059910693606,
0.0007294819152408261,
0.0009235475783563429,
0.0009740016784817084,
0.000780531495721693,
0.00040717562279427483,
0.0004088386579556176,
0.0006280606972745851,
0.0005358994123222018,
0.0003709727887286696,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534
]
},
"k"
]
}
},
"tolerance": {
"abs": 3e-09,
"rel": 0.0
}
},
{
"variable": "sd.rslope2_r",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
1.5625e-10,
1.5625e-10,
2.0411852239110304e-10,
1.5625e-10,
4.508995438549839e-10,
8.646252856701706e-10,
1.4372636470224505e-08,
2.5920793828860594e-08,
2.960733893735634e-08,
1.702065215873694e-08,
3.345450047443414e-09,
3.3797144710741457e-09,
9.885625679470373e-09,
6.648265026205185e-09,
2.6506675706930153e-09,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10
]
},
"k"
]
}
},
"tolerance": {
"abs": 1e-12,
"rel": 0.0
}
},
{
"variable": "sd.rslope3_r",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
1.953125e-15,
1.953125e-15,
2.9162424251516512e-15,
1.953125e-15,
9.574579155850315e-15,
2.542388399566788e-14,
1.7230769052656286e-12,
4.173231209768839e-12,
5.094470633267582e-12,
2.2205691123061223e-12,
1.9350038096575883e-13,
1.964807543671302e-13,
9.828930014050509e-13,
5.42078878403345e-13,
1.364686505714595e-13,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15
]
},
"k"
]
}
},
"tolerance": {
"abs": 1e-15,
"rel": 0.0
}
},
{
"variable": "f_diff",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
8028755.057886114,
8333824.311371038,
8647775.752336368,
8958617.951863753,
9285382.856544988,
9872659.790045928,
10960844.380185355,
11595158.570640009,
12554413.058061466,
14021069.38172349,
15416313.82862994,
16470215.720915014,
17545762.877823524,
18977982.74577833,
20949700.957248982,
23815618.693494163,
27999624.87120814,
33198437.278835714,
39615783.8091453,
49075857.465912044,
62320581.400102615,
80192451.71858807,
100787779.5344526,
115739767.1936047,
115525067.84632443,
108191241.01576096,
90563076.82898295,
65867490.88836875,
50469045.523618914,
41529835.17538319,
36507218.383736305,
34124157.05041371,
33327870.50474309,
32734973.66793616,
31067216.816504516,
27806345.19512362,
23458770.089004576,
18957940.744431123,
14986748.287757155,
11625572.149860196
]
},
"k"
]
}
},
"tolerance": {
"abs": 1000.0,
"rel": 0.0
}
},
{
"variable": "sd.f_vent",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
215.63527112759914,
214.1715766474716,
212.55494269716348,
210.78402302516224,
208.9835178119438,
207.4951956890503,
206.4392914149101,
204.68811094651946,
203.10379242088226,
201.72284296989707,
200.11869322337444,
198.22616050324052,
196.2794948154758,
194.4128961843098,
192.64850078379916,
191.0283672641058,
189.5570294356823,
188.06342970468705,
186.55099020140216,
185.1817713634307,
183.86917331669034,
182.55574430803452,
181.07478341351563,
179.14703115751306,
176.59265582971324,
173.78072809190024,
170.52218776902382,
166.71309899088163,
163.163535841422,
159.94492422680602,
157.02439387849464,
154.3694282593483,
151.89563712719905,
149.44449981572748,
146.8644517179366,
144.0734022451641,
141.07831654399024,
137.9417701018318,
134.73773593287316,
131.4735667628829
]
},
"k"
]
}
},
"tolerance": {
"abs": 0.0002,
"rel": 0.0
}
},
{
"variable": "praut_lim",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
1.9272702978443584e-07,
5.680485946643456e-07,
4.214273290321954e-07,
1.7353291842808245e-07,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 2e-11,
"rel": 0.0
}
},
{
"variable": "pracw_lim",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
0.0,
0.0,
0.0,
0.0,
0.0,
6.88449156170289e-15,
2.748491602100046e-13,
7.129217251332897e-08,
1.4962344453906321e-07,
4.7138774208862334e-08,
1.5034490822789091e-09,
1.0241623226218556e-09,
6.031693974672861e-09,
2.512347697343544e-09,
3.473295471853768e-10,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 1e-10,
"rel": 0.0
}
},
{
"variable": "prevp_lim",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
-1.0259924402817779e-26,
-6.694481340582376e-13,
-8.70354728544243e-11,
-7.92960210142119e-12,
-4.679813645143914e-10,
-1.0179622179656236e-09,
-3.17362239002322e-09,
3.2767382721223283e-09,
5.6960147068556985e-09,
3.308759632994668e-09,
4.717566347522986e-10,
4.888994172957477e-10,
1.7597651332283274e-09,
1.013464354835134e-09,
2.999473816537237e-10,
1.0761152106690579e-11,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 5e-12,
"rel": 0.0
}
},
{
"variable": "praut",
"time": 0.0,
"coords": {
"lev": 8
},
"expected": 1.9272702978443584e-07,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "praut",
"time": 0.0,
"coords": {
"lev": 11
},
"expected": 1.7353291842808245e-07,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pracw",
"time": 0.0,
"coords": {
"lev": 6
},
"expected": 6.88449156170289e-15,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pracw",
"time": 0.0,
"coords": {
"lev": 15
},
"expected": 3.473295471853768e-10,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "prevp",
"time": 0.0,
"coords": {
"lev": 6
},
"expected": -1.0179622179656236e-09,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "prevp",
"time": 0.0,
"coords": {
"lev": 10
},
"expected": 3.308759632994668e-09,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "prevp",
"time": 0.0,
"coords": {
"lev": 16
},
"expected": 1.0761152106690579e-11,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "prevp_lim",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": -1.0259924402817779e-26,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "prevp_lim",
"time": 0.0,
"coords": {
"lev": 3
},
"expected": -8.70354728544243e-11,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "prevp_lim",
"time": 0.0,
"coords": {
"lev": 5
},
"expected": -4.679813645143914e-10,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "sd.rslope_r",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 1.25e-05,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.rslope_r",
"time": 0.0,
"coords": {
"lev": 4
},
"expected": 1.25e-05,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.rslope_r",
"time": 0.0,
"coords": {
"lev": 10
},
"expected": 0.00013046322147922357,
"tolerance": {
"rel": 1e-06
}
}
]
},
{
"id": "scm_call120_no_condensate_zero_rates",
"description": "Reference: WRF 4.8 em_quarter_ss idealized supercell (GNU real32 build, dx = 2 km, dt = 12 s, 40 layers, WSM6 only, no radiation/surface physics) dumped by the instrumented ctessum-claude/WRF fork (module_esm_dump with esm_dump_inner hooks inside mp_wsm6_run of the ctessum-claude/MMM-physics fork, commit 52cfbd7) and replayed through the real64 (kind_phys = real64) standalone kernels/wsm6_driver at the WRF step. The test is POINTWISE and step-free: the inputs are the evaluation state the kernel dumps immediately before its warm-rain block (t_rates, q_rates, qc_rates, qr_rates: the state after the sub-step's sedimentation, melting and freezing; den and p: kernel arguments; qsat_w, rh_w, xl: the start-of-sub-step saturation block, see saturation.esm), the expected values are the process rates the kernel dumps right after evaluating them (`<rate>_raw`: after each process's own time-step limiter, before the mass-conservation rescaling) and the intermediates rslope*, work1 (f_diff), work2 (f_vent), denfac and the mp_wsm6_init coefficients, all taken from the real64 replay. No small-dt replay is used because WSM6's increments are not rate x dt (EqWeFiC FORTRAN_BUGS.md note N3). Real64 replay vs real32 in-model dump (compare_dump.py): 1.5e-7 (praut), 8e-7 (pracw), 7.5e-6 (prevp), 3-4e-7 (rslope*), 1.5e-6 (work1), 3.6e-7 (work2); the real32 driver reproduces the dump bit-for-bit. Residual mismatch between this component and the real64 kernel comes from the kernel's default-real literals and the real32 WRF constants it receives (bvtr = 0.800000011920929, avtr = 841.9000244, den0 = 1.27999997, cpv = 1846.4000244, rv = 461.6000061, .104, 9.8, .55, .78, .31, 1.496e-6, 8.794e-5, 1.414e3), which this component takes at their nominal values from lib/wrf_constants.esm and wsm6_parameters.esm (EqWeFiC FORTRAN_BUGS.md note N2-style rounding); measured with zero tolerances over all four tests it is <= 4.1e-7 relative in the rates (praut; pracw 1.2e-7, prevp 2.1e-7), 1.9e-7 in the coefficients (qck1), 2e-7 of the column maximum in f_diff, 1e-7 in f_vent and <= 9e-8 in rslope*, denfac. Tolerances are set 5-10x above the measured residual: relative 1e-6 on the mp_wsm6_init coefficients and on every spot check, absolute Linf_error bounds on the whole columns at 1e-6 of each column's maximum. The unlimited rates praut, pracw, prevp are the physics and are spot-checked at layers where the kernel's limiter is provably inactive (there the dumped `<rate>_raw` equals the unlimited rate); the limited observeds praut_lim, pracw_lim, prevp_lim are compared with the dumped `<rate>_raw` over the whole column. Regime: the em_scm_xy single-column run (mp = 6, dt = 60 s, 59 layers) at call 120 (step 60, 20:00 UTC) has no liquid condensate anywhere (qc = qr = 0, qi <= 5e-5), so every warm-rain rate must be exactly zero, the inverse slope equals rslope_max in every layer, and only the state-dependent intermediates (denfac, f_diff, f_vent) carry information. The component's lev axis has 40 layers (the supercell size, esm-spec 6.6 tests cannot rebind a metaparameter), so this test uses the lowest 40 of the 59 SCM layers; the rates are pointwise, so the truncation is exact.",
"parameter_overrides": {
"dtcld": 60.0
},
"expression_template_imports": [
{
"ref": "./tests/scm_call120_no_condensate_zero_rates_inputs.esm"
}
],
"time_span": {
"start": 0.0,
"end": 1.0
},
"assertions": [
{
"variable": "sd.pidn0r",
"time": 0.0,
"expected": 25132741928.100586,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.rslope_r_max",
"time": 0.0,
"expected": 1.25e-05,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qc0",
"time": 0.0,
"expected": 0.0005026548609702604,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qck1",
"time": 0.0,
"expected": 6.773894126490344,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "pacrr",
"time": 0.0,
"expected": 24813389640.68711,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "precr1",
"time": 0.0,
"expected": 39207075.969729885,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "precr2",
"time": 0.0,
"expected": 825851896.7563319,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.denfac",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
1.0405973658526613,
1.0425709388950055,
1.0448538041574482,
1.0472789564529348,
1.049816155587038,
1.052456994040821,
1.0551994270508662,
1.0580445337593312,
1.0609945823697964,
1.064052070338877,
1.067219508937984,
1.0704977681791714,
1.0738806360326125,
1.077303463579879,
1.084140992328241,
1.093551664377981,
1.0991876781966248,
1.1049656396209935,
1.1109509161170106,
1.1171622723413854,
1.1236162338392661,
1.1303267727068882,
1.1373096727478578,
1.1445800887637476,
1.1521527727380338,
1.1600462822130808,
1.1678757941861255,
1.1760429783650443,
1.1845778643479985,
1.1935038844837065,
1.202850445054329,
1.2126435173640735,
1.2229155395837406,
1.2337016544377146,
1.2450392916678263,
1.2569666071225496,
1.2689077684003733,
1.2813285160161358,
1.294160708423875,
1.3065005309770057
]
},
"k"
]
}
},
"tolerance": {
"abs": 4e-06,
"rel": 0.0
}
},
{
"variable": "sd.rslope_r",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05,
1.25e-05
]
},
"k"
]
}
},
"tolerance": {
"abs": 1e-09,
"rel": 0.0
}
},
{
"variable": "sd.rslopeb_r",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534,
0.00011954404638495534
]
},
"k"
]
}
},
"tolerance": {
"abs": 3e-09,
"rel": 0.0
}
},
{
"variable": "sd.rslope2_r",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10,
1.5625e-10
]
},
"k"
]
}
},
"tolerance": {
"abs": 1e-12,
"rel": 0.0
}
},
{
"variable": "sd.rslope3_r",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15,
1.953125e-15
]
},
"k"
]
}
},
"tolerance": {
"abs": 1e-15,
"rel": 0.0
}
},
{
"variable": "f_diff",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
12517992.133937672,
12703791.310712745,
12861280.624327201,
13017864.416639041,
13179457.897916038,
13348713.256994095,
13527336.68612187,
13716784.584725967,
13918460.597531926,
14133837.424906842,
14364668.629377099,
14613172.963435967,
14883331.807364065,
15192998.794244168,
14319115.334942743,
12576160.64500912,
12437239.2155873,
12319882.903676461,
12208085.683908798,
12100099.395608619,
11995119.10488715,
11893308.852021435,
11794581.063923825,
11699417.653352609,
11608700.239315953,
11522451.078271609,
11459830.833936825,
11402850.02743076,
11351995.505405929,
11308225.297510203,
11271717.59567406,
11244201.543182738,
11226786.167405665,
11220910.118745424,
11228661.906597454,
11253120.58209607,
11423737.573184159,
11666138.799987303,
12023045.430579485,
12795345.650109466
]
},
"k"
]
}
},
"tolerance": {
"abs": 1000.0,
"rel": 0.0
}
},
{
"variable": "sd.f_vent",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
222.0768143962771,
222.0380488453342,
221.961422105995,
221.87300860143154,
221.77776810497807,
221.67740091479473,
221.57264781526675,
221.46385542448027,
221.35118965204023,
221.234768859336,
221.1147747497532,
220.9915203418611,
220.86632418934684,
220.74972039240632,
219.67966146156118,
217.66430151606926,
217.15822180729745,
216.6607335674825,
216.15493793097426,
215.63855751969587,
215.11019138771954,
214.569321873706,
214.0152343454284,
213.44762274502753,
212.8666259328099,
212.2713573416524,
211.66681580072242,
211.04689373610626,
210.41117200822973,
209.75928855938002,
209.09000761009835,
208.4034257952214,
207.69878187851677,
206.97543377717352,
206.2330188507215,
205.4717610959292,
204.80828092851536,
204.16027872300273,
203.55245527224776,
203.19940488955848
]
},
"k"
]
}
},
"tolerance": {
"abs": 0.0002,
"rel": 0.0
}
},
{
"variable": "praut_lim",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 2e-11,
"rel": 0.0
}
},
{
"variable": "pracw_lim",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 1e-10,
"rel": 0.0
}
},
{
"variable": "prevp_lim",
"time": 0.0,
"reduce": "Linf_error",
"expected": 0.0,
"reference": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "lev"
}
},
"expr": {
"op": "index",
"args": [
{
"op": "const",
"args": [],
"value": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 5e-12,
"rel": 0.0
}
},
{
"variable": "f_diff",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 12517992.133937672,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "f_diff",
"time": 0.0,
"coords": {
"lev": 20
},
"expected": 12100099.395608619,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "f_diff",
"time": 0.0,
"coords": {
"lev": 40
},
"expected": 12795345.650109466,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.f_vent",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 222.0768143962771,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.f_vent",
"time": 0.0,
"coords": {
"lev": 20
},
"expected": 215.63855751969587,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.f_vent",
"time": 0.0,
"coords": {
"lev": 40
},
"expected": 203.19940488955848,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.rslope_r",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 1.25e-05,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "sd.rslope_r",
"time": 0.0,
"coords": {
"lev": 40
},
"expected": 1.25e-05,
"tolerance": {
"rel": 1e-06
}
}
]
}
]
}