WSM6Saturation
Thermodynamic state of a column as the WSM6 microphysics scheme evaluates it once per sub-time step (phys/physics_mmm/mp_wsm6.F90, the inlined fpvs block and the cpmcal/xlcal statement functions of mp_wsm6_run): saturation vapor pressure and mixing ratio over water and over ice from the integrated Clausius-Clapeyron relation with temperature-linear latent heats (lib/wrf_thermo.esm saturation_vapor_pressure_fpvs), the relative humidities, the latent heat of vaporization and the moist heat capacity. Layer index `lev` (WRF k, layer 1 at the surface); all fields are pointwise functions of the layer state, so no grid geometry is needed. The ice formula is used only below the triple point, above it the ice saturation equals the water saturation (the Fortran branch). The vapor pressure is capped at es_cap p and the saturation mixing ratio and relative humidity are floored at qmin, exactly as the kernel does. This model is a separate component from the process rates (warm_rain.esm) because WSM6 computes it from the temperature and vapor at the START of the sub-step and does not update it after sedimentation, melting and freezing have changed the temperature (EqWeFiC FORTRAN_BUGS.md note N4); the process-rate components therefore take qsat, rh and xl as inputs so that a consumer can bind either this model's outputs or, to reproduce the kernel, its start-of-step values. Consumer-supplied inputs: the column fields T (temperature), qv (vapor mixing ratio) and p (pressure) 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
Thermodynamic state of a column as the WSM6 microphysics scheme evaluates it once per sub-time step (phys/physics_mmm/mp_wsm6.F90, the inlined fpvs block and the cpmcal/xlcal statement functions of mp_wsm6_run): saturation vapor pressure and mixing ratio over water and over ice from the integrated Clausius-Clapeyron relation with temperature-linear latent heats (lib/wrf_thermo.esm saturation_vapor_pressure_fpvs), the relative humidities, the latent heat of vaporization and the moist heat capacity. Layer index lev (WRF k, layer 1 at the surface); all fields are pointwise functions of the layer state, so no grid geometry is needed. The ice formula is used only below the triple point, above it the ice saturation equals the water saturation (the Fortran branch). The vapor pressure is capped at es_cap p and the saturation mixing ratio and relative humidity are floored at qmin, exactly as the kernel does. This model is a separate component from the process rates (warm_rain.esm) because WSM6 computes it from the temperature and vapor at the START of the sub-step and does not update it after sedimentation, melting and freezing have changed the temperature (EqWeFiC FORTRAN_BUGS.md note N4); the process-rate components therefore take qsat, rh and xl as inputs so that a consumer can bind either this model’s outputs or, to reproduce the kernel, its start-of-step values. Consumer-supplied inputs: the column fields T (temperature), qv (vapor mixing ratio) and p (pressure) 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.
- NCAR/MMM-physics mp_wsm6.F90 at commit 550b5b4 (WRF 4.8 phys/physics_mmm submodule).
Parameters
| Name | Units | Default | Description |
|---|---|---|---|
T_in | K | 0.0 | Coupling-target parameter (additive): receives the temperature at which the saturation state is to be evaluated from the upstream stage through a document coupling (EqWeFiC couplings/microphysics_column*.esm), where the mount-edge template library lowers input_T to this name. Unused by the standalone inline tests, which lower input_T to a dumped column profile instead. |
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. |
p_in | Pa | 0.0 | Coupling-target parameter (additive): receives the pressure from the upstream stage through a document coupling (EqWeFiC couplings/microphysics_column*.esm), where the mount-edge template library lowers input_p to this name. Unused by the standalone inline tests, which lower input_p to a dumped column profile instead. |
Observed
| Name | Units | Default | Description |
|---|---|---|---|
T | K | Absolute temperature of each layer (WSM6 t). | |
qv | kg/kg | Water-vapor mixing ratio (WSM6 q). | |
p | Pa | Pressure. | |
ttp | K | Triple-point temperature t0c + ttp_offset. | |
xa | 1 | Power-law exponent of the water saturation vapor pressure, -(cpv - cliq)/r_v. | |
xb | 1 | Exponential coefficient of the water saturation vapor pressure, xa + xlv/(r_v ttp). | |
xai | 1 | Power-law exponent of the ice saturation vapor pressure, -(cpv - cice)/r_v. | |
xbi | 1 | Exponential coefficient of the ice saturation vapor pressure, xai + xls/(r_v ttp). | |
es_w | Pa | Saturation vapor pressure over water, capped at es_cap p. | |
qsat_w | kg/kg | Saturation mixing ratio over water, floored at qmin (WSM6 qsat(:,:,1)). | |
rh_w | 1 | Relative humidity with respect to water, qv/qsat_w floored at qmin (WSM6 rh(:,:,1)). | |
es_i | Pa | Saturation vapor pressure over ice below the triple point (over water above it), capped at es_cap p. | |
qsat_i | kg/kg | Saturation mixing ratio over ice, floored at qmin (WSM6 qsat(:,:,2)). | |
rh_i | 1 | Relative humidity with respect to ice, qv/qsat_i floored at qmin (WSM6 rh(:,:,2)). | |
xl | J/kg | Latent heat of vaporization at the layer temperature, xlv - (cliq - cpv)(T - t0c) (WSM6 xl = xlcal(t)). | |
cpm | J/(kg*K) | Moist heat capacity cp (1 - qv) + cpv qv with qv floored at qmin (WSM6 cpm = cpmcal(q)). |
Observed expressions
$$ T = \mathrm{input_T}\left(\right) $$Absolute temperature of each layer (WSM6 t).
$$ qv = \mathrm{input_qv}\left(\right) $$Water-vapor mixing ratio (WSM6 q).
$$ p = \mathrm{input_p}\left(\right) $$Pressure.
$$ ttp = wrf.svpt0 + par.ttp_{offset} $$Triple-point temperature t0c + ttp_offset.
$$ xa = \mathrm{fpvs_exponent_a}\left(c_{vapor}=wrf.cpv, c_{condensate}=wrf.cliq, r_{v}=wrf.r_{v}\right) $$Power-law exponent of the water saturation vapor pressure, -(cpv - cliq)/r_v.
$$ xb = \mathrm{fpvs_exponent_b}\left(xa=xa, L=wrf.xlv, r_{v}=wrf.r_{v}, ttp=ttp\right) $$Exponential coefficient of the water saturation vapor pressure, xa + xlv/(r_v ttp).
$$ xai = \mathrm{fpvs_exponent_a}\left(c_{vapor}=wrf.cpv, c_{condensate}=wrf.cice, r_{v}=wrf.r_{v}\right) $$Power-law exponent of the ice saturation vapor pressure, -(cpv - cice)/r_v.
$$ xbi = \mathrm{fpvs_exponent_b}\left(xa=xai, L=wrf.xls, r_{v}=wrf.r_{v}, ttp=ttp\right) $$Exponential coefficient of the ice saturation vapor pressure, xai + xls/(r_v ttp).
$$ es_{w} = \mathrm{min}\left(\mathrm{saturation_vapor_pressure_fpvs}\left(T=T, psat=wrf.psat, ttp=ttp, xa=xa, xb=xb\right), par.es_{cap} \cdot p\right) $$Saturation vapor pressure over water, capped at es_cap p.
$$ qsat_{w} = \mathrm{max}\left(\mathrm{saturation_mixing_ratio}\left(es=es_{w}, p=p, ep_{2}=wrf.ep_{2}\right), par.qmin\right) $$Saturation mixing ratio over water, floored at qmin (WSM6 qsat(:,:,1)).
$$ rh_{w} = \mathrm{max}\left(\frac{qv}{qsat_{w}}, par.qmin\right) $$Relative humidity with respect to water, qv/qsat_w floored at qmin (WSM6 rh(:,:,1)).
$$ es_{i} = \mathrm{min}\left(\mathrm{ifelse}\left(\mathrm{<}\left(T, ttp\right), \mathrm{saturation_vapor_pressure_fpvs}\left(T=T, psat=wrf.psat, ttp=ttp, xa=xai, xb=xbi\right), \mathrm{saturation_vapor_pressure_fpvs}\left(T=T, psat=wrf.psat, ttp=ttp, xa=xa, xb=xb\right)\right), par.es_{cap} \cdot p\right) $$Saturation vapor pressure over ice below the triple point (over water above it), capped at es_cap p.
$$ qsat_{i} = \mathrm{max}\left(\mathrm{saturation_mixing_ratio}\left(es=es_{i}, p=p, ep_{2}=wrf.ep_{2}\right), par.qmin\right) $$Saturation mixing ratio over ice, floored at qmin (WSM6 qsat(:,:,2)).
$$ rh_{i} = \mathrm{max}\left(\frac{qv}{qsat_{i}}, par.qmin\right) $$Relative humidity with respect to ice, qv/qsat_i floored at qmin (WSM6 rh(:,:,2)).
$$ xl = \mathrm{latent_heat_of_vaporization}\left(T=T, xlv=wrf.xlv, cliq=wrf.cliq, cpv=wrf.cpv, T_{ref}=wrf.svpt0\right) $$Latent heat of vaporization at the layer temperature, xlv - (cliq - cpv)(T - t0c) (WSM6 xl = xlcal(t)).
$$ cpm = \mathrm{moist_heat_capacity}\left(qv=\mathrm{max}\left(qv, par.qmin\right), cp=wrf.cp, cpv=wrf.cpv\right) $$Moist heat capacity cp (1 - qv) + cpv qv with qv floored at qmin (WSM6 cpm = cpmcal(q)).
Raw .esm
Raw .esm JSON (this component)
{
"expression_template_imports": [
{
"ref": "../../../lib/wrf_thermo.esm"
}
],
"subsystems": {
"wrf": {
"ref": "../../../lib/wrf_constants.esm"
},
"par": {
"ref": "./wsm6_parameters.esm"
}
},
"variables": {
"T_in": {
"type": "parameter",
"units": "K",
"shape": [
"lev"
],
"default": 0.0,
"description": "Coupling-target parameter (additive): receives the temperature at which the saturation state is to be evaluated from the upstream stage through a document coupling (EqWeFiC couplings/microphysics_column*.esm), where the mount-edge template library lowers `input_T` to this name. Unused by the standalone inline tests, which lower `input_T` to a dumped column profile instead."
},
"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."
},
"p_in": {
"type": "parameter",
"units": "Pa",
"shape": [
"lev"
],
"default": 0.0,
"description": "Coupling-target parameter (additive): receives the pressure from the upstream stage through a document coupling (EqWeFiC couplings/microphysics_column*.esm), where the mount-edge template library lowers `input_p` to this name. Unused by the standalone inline tests, which lower `input_p` to a dumped column profile instead."
},
"T": {
"type": "unknown",
"units": "K",
"shape": [
"lev"
],
"description": "Absolute temperature of each layer (WSM6 t)."
},
"qv": {
"type": "unknown",
"units": "kg/kg",
"shape": [
"lev"
],
"description": "Water-vapor mixing ratio (WSM6 q)."
},
"p": {
"type": "unknown",
"units": "Pa",
"shape": [
"lev"
],
"description": "Pressure."
},
"ttp": {
"type": "unknown",
"units": "K",
"description": "Triple-point temperature t0c + ttp_offset."
},
"xa": {
"type": "unknown",
"units": "1",
"description": "Power-law exponent of the water saturation vapor pressure, -(cpv - cliq)/r_v."
},
"xb": {
"type": "unknown",
"units": "1",
"description": "Exponential coefficient of the water saturation vapor pressure, xa + xlv/(r_v ttp)."
},
"xai": {
"type": "unknown",
"units": "1",
"description": "Power-law exponent of the ice saturation vapor pressure, -(cpv - cice)/r_v."
},
"xbi": {
"type": "unknown",
"units": "1",
"description": "Exponential coefficient of the ice saturation vapor pressure, xai + xls/(r_v ttp)."
},
"es_w": {
"type": "unknown",
"units": "Pa",
"shape": [
"lev"
],
"description": "Saturation vapor pressure over water, capped at es_cap p."
},
"qsat_w": {
"type": "unknown",
"units": "kg/kg",
"shape": [
"lev"
],
"description": "Saturation mixing ratio over water, floored at qmin (WSM6 qsat(:,:,1))."
},
"rh_w": {
"type": "unknown",
"units": "1",
"shape": [
"lev"
],
"description": "Relative humidity with respect to water, qv/qsat_w floored at qmin (WSM6 rh(:,:,1))."
},
"es_i": {
"type": "unknown",
"units": "Pa",
"shape": [
"lev"
],
"description": "Saturation vapor pressure over ice below the triple point (over water above it), capped at es_cap p."
},
"qsat_i": {
"type": "unknown",
"units": "kg/kg",
"shape": [
"lev"
],
"description": "Saturation mixing ratio over ice, floored at qmin (WSM6 qsat(:,:,2))."
},
"rh_i": {
"type": "unknown",
"units": "1",
"shape": [
"lev"
],
"description": "Relative humidity with respect to ice, qv/qsat_i floored at qmin (WSM6 rh(:,:,2))."
},
"xl": {
"type": "unknown",
"units": "J/kg",
"shape": [
"lev"
],
"description": "Latent heat of vaporization at the layer temperature, xlv - (cliq - cpv)(T - t0c) (WSM6 xl = xlcal(t))."
},
"cpm": {
"type": "unknown",
"units": "J/(kg*K)",
"shape": [
"lev"
],
"description": "Moist heat capacity cp (1 - qv) + cpv qv with qv floored at qmin (WSM6 cpm = cpmcal(q))."
}
},
"equations": [
{
"lhs": "T",
"rhs": {
"op": "input_T",
"args": []
}
},
{
"lhs": "qv",
"rhs": {
"op": "input_qv",
"args": []
}
},
{
"lhs": "p",
"rhs": {
"op": "input_p",
"args": []
}
},
{
"lhs": "ttp",
"rhs": {
"op": "+",
"args": [
"wrf.svpt0",
"par.ttp_offset"
]
}
},
{
"lhs": "xa",
"rhs": {
"op": "apply_expression_template",
"args": [],
"name": "fpvs_exponent_a",
"bindings": {
"c_vapor": "wrf.cpv",
"c_condensate": "wrf.cliq",
"r_v": "wrf.r_v"
}
}
},
{
"lhs": "xb",
"rhs": {
"op": "apply_expression_template",
"args": [],
"name": "fpvs_exponent_b",
"bindings": {
"xa": "xa",
"L": "wrf.xlv",
"r_v": "wrf.r_v",
"ttp": "ttp"
}
}
},
{
"lhs": "xai",
"rhs": {
"op": "apply_expression_template",
"args": [],
"name": "fpvs_exponent_a",
"bindings": {
"c_vapor": "wrf.cpv",
"c_condensate": "wrf.cice",
"r_v": "wrf.r_v"
}
}
},
{
"lhs": "xbi",
"rhs": {
"op": "apply_expression_template",
"args": [],
"name": "fpvs_exponent_b",
"bindings": {
"xa": "xai",
"L": "wrf.xls",
"r_v": "wrf.r_v",
"ttp": "ttp"
}
}
},
{
"lhs": "es_w",
"rhs": {
"op": "min",
"args": [
{
"op": "apply_expression_template",
"args": [],
"name": "saturation_vapor_pressure_fpvs",
"bindings": {
"T": "T",
"psat": "wrf.psat",
"ttp": "ttp",
"xa": "xa",
"xb": "xb"
}
},
{
"op": "*",
"args": [
"par.es_cap",
"p"
]
}
]
}
},
{
"lhs": "qsat_w",
"rhs": {
"op": "max",
"args": [
{
"op": "apply_expression_template",
"args": [],
"name": "saturation_mixing_ratio",
"bindings": {
"es": "es_w",
"p": "p",
"ep_2": "wrf.ep_2"
}
},
"par.qmin"
]
}
},
{
"lhs": "rh_w",
"rhs": {
"op": "max",
"args": [
{
"op": "/",
"args": [
"qv",
"qsat_w"
]
},
"par.qmin"
]
}
},
{
"lhs": "es_i",
"rhs": {
"op": "min",
"args": [
{
"op": "ifelse",
"args": [
{
"op": "<",
"args": [
"T",
"ttp"
]
},
{
"op": "apply_expression_template",
"args": [],
"name": "saturation_vapor_pressure_fpvs",
"bindings": {
"T": "T",
"psat": "wrf.psat",
"ttp": "ttp",
"xa": "xai",
"xb": "xbi"
}
},
{
"op": "apply_expression_template",
"args": [],
"name": "saturation_vapor_pressure_fpvs",
"bindings": {
"T": "T",
"psat": "wrf.psat",
"ttp": "ttp",
"xa": "xa",
"xb": "xb"
}
}
]
},
{
"op": "*",
"args": [
"par.es_cap",
"p"
]
}
]
}
},
{
"lhs": "qsat_i",
"rhs": {
"op": "max",
"args": [
{
"op": "apply_expression_template",
"args": [],
"name": "saturation_mixing_ratio",
"bindings": {
"es": "es_i",
"p": "p",
"ep_2": "wrf.ep_2"
}
},
"par.qmin"
]
}
},
{
"lhs": "rh_i",
"rhs": {
"op": "max",
"args": [
{
"op": "/",
"args": [
"qv",
"qsat_i"
]
},
"par.qmin"
]
}
},
{
"lhs": "xl",
"rhs": {
"op": "apply_expression_template",
"args": [],
"name": "latent_heat_of_vaporization",
"bindings": {
"T": "T",
"xlv": "wrf.xlv",
"cliq": "wrf.cliq",
"cpv": "wrf.cpv",
"T_ref": "wrf.svpt0"
}
}
},
{
"lhs": "cpm",
"rhs": {
"op": "apply_expression_template",
"args": [],
"name": "moist_heat_capacity",
"bindings": {
"qv": {
"op": "max",
"args": [
"qv",
"par.qmin"
]
},
"cp": "wrf.cp",
"cpv": "wrf.cpv"
}
}
}
],
"tests": [
{
"id": "qss_step250_row23_col24",
"description": "Reference: the start-of-sub-step saturation block of mp_wsm6_run (phys/physics_mmm/mp_wsm6.F90, ctessum-claude/MMM-physics fork 52cfbd7, instrumented) dumped in-model by the ctessum-claude/WRF fork and replayed through the real64 (kind_phys = real64) kernels/wsm6_driver at the WRF step; the block is evaluated once per sub-step from the kernel's input temperature, vapor and pressure (t, q, p), which are the inputs here (real32 values of the dump widened to real64, as the driver read them), and the expected qsat_w, rh_w, qsat_i, rh_i, xl and cpm are the replay's values (POINTWISE, step-free). Real64 replay vs real32 dump: qsat_w 1.3e-6, rh_w 1.6e-6, xl 5e-8, cpm 8e-8 relative. Residual mismatch between this component and the real64 kernel comes from the real32 WRF constants the kernel receives (cpv = 1846.4000244, rv = 461.6000061, psat = 610.78003, t0c = 273.1499939, ep2 = 0.62175041, cliq/cice exact) and its default-real literal 0.01 in ttp, which this component takes at their nominal values from lib/wrf_constants.esm; measured with zero tolerances it is <= 4.4e-7 of the column maximum in qsat_w/qsat_i (9e-9 kg/kg), 5.8e-7 in rh_w/rh_i (1.4e-6), 6e-9 in xl (0.016 J/kg, from t0c = 273.1499939), 3.4e-10 in cpm, and <= 1.1e-7 relative in the exponents xa, xb, xai, xbi. Tolerances are set 5-10x above the measured residual: relative 1e-6 spot checks, absolute Linf_error bounds at 1e-6 of each column's maximum. Regime: em_quarter_ss supercell step 250, tile row j = 23, column i = 24 (the warm_rain.esm reference column): T from 298 K at the surface to 203 K aloft, freezing level at layer 9, so both the water branch (T >= ttp: qsat_i = qsat_w) and the ice branch of the saturation formula are exercised; rh_w up to 1.55 (supersaturated updraft), qsat_w from 2e-2 down to 1.2e-5 kg/kg.",
"parameter_overrides": {},
"expression_template_imports": [
{
"ref": "./tests/qss_step250_row23_col24_inputs.esm"
}
],
"time_span": {
"start": 0.0,
"end": 1.0
},
"assertions": [
{
"variable": "ttp",
"time": 0.0,
"expected": 273.15999389648437,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "xa",
"time": 0.0,
"expected": 5.077122930237518,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "xb",
"time": 0.0,
"expected": 24.904127580002847,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "xai",
"time": 0.0,
"expected": 0.5623916207828671,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "xbi",
"time": 0.0,
"expected": 23.165176921515343,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qsat_w",
"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.020316704367985907,
0.015041824961129968,
0.013040368534004754,
0.011800647249968292,
0.010512740398254358,
0.009234118459619774,
0.008070424085944014,
0.007013120290817504,
0.006047018213555547,
0.0051442514044959505,
0.004352349819095923,
0.0034831287608678776,
0.002961700475146917,
0.0027391994969604887,
0.002193263262714586,
0.001732701806342092,
0.0013508928058398408,
0.001026433389631804,
0.0007611840370064592,
0.0005522549776705756,
0.0003872043852688496,
0.0002682562931990877,
0.00018716500456002682,
0.0001230110554443675,
7.803280822511055e-05,
4.839175905726575e-05,
3.0280373115636875e-05,
2.0026513421285417e-05,
2.1282600252324456e-05,
7.184427967135839e-05,
0.00011612059119745803,
0.00016710356834469972,
0.00023142122428946552,
0.00029382248500674365,
0.00034222713412039737,
0.00037305046069254915,
0.00039103768382082885,
0.00040316332516674005,
0.0004148827528101728,
0.00042558731300106956
]
},
"k"
]
}
},
"tolerance": {
"abs": 5e-08,
"rel": 0.0
}
},
{
"variable": "rh_w",
"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.6815425817897655,
0.951699721149855,
1.0419241081155481,
1.0580652114410276,
1.0742864323769294,
1.0946769740253295,
1.1162028842045109,
1.1384782966448788,
1.1611750946819146,
1.185097944291052,
1.2097497399147061,
1.2598503745242817,
1.291365395113019,
1.2381871643752003,
1.3141706905411694,
1.3640566635810496,
1.3885874476447757,
1.421686871012,
1.45816169562513,
1.480558404489876,
1.547148568885218,
1.3739814637578047,
1.03942073607896,
0.8522630857262385,
0.7202209656463332,
0.7794945922596512,
0.6541781420321074,
0.5836588700095051,
0.5514268285792273,
0.500193301128669,
0.3535451386775654,
0.27695132237234965,
0.22615164489602266,
0.20031799620097196,
0.1916513234595143,
0.194252166718507,
0.20344443375708424,
0.21589345625592313,
0.2293806706134887,
0.2441925540085328
]
},
"k"
]
}
},
"tolerance": {
"abs": 5e-06,
"rel": 0.0
}
},
{
"variable": "qsat_i",
"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.020316704367985907,
0.015041824961129968,
0.013040368534004754,
0.011800647249968292,
0.010512740398254358,
0.009234118459619774,
0.008070424085944014,
0.007013120290817504,
0.005960264401916312,
0.004913944006170228,
0.0040289422611049525,
0.003103897348464804,
0.002561521652860483,
0.002327726659595381,
0.0017984417373513508,
0.0013699990622594662,
0.00102937852595816,
0.0007523420625039342,
0.0005358473475679989,
0.00037298851369779815,
0.00025035529366560953,
0.0001660910358643979,
0.0001112335367147871,
6.988452865904442e-05,
4.231984800555517e-05,
2.505321183266298e-05,
1.500512737996692e-05,
9.556008285669237e-06,
1.0146409744070776e-05,
3.7527206906188094e-05,
6.278031879134699e-05,
9.264796035827971e-05,
0.00013118783681966063,
0.00016900476797442122,
0.00019816429929306794,
0.0002161135484004515,
0.00022579411161822812,
0.00023165018056174274,
0.00023713327184870665,
0.00024186472279393506
]
},
"k"
]
}
},
"tolerance": {
"abs": 5e-08,
"rel": 0.0
}
},
{
"variable": "rh_i",
"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.6815425817897655,
0.951699721149855,
1.0419241081155481,
1.0580652114410276,
1.0742864323769294,
1.0946769740253295,
1.1162028842045109,
1.1384782966448788,
1.178076419631831,
1.24064127648371,
1.3068576615007372,
1.4137777707326948,
1.4931115261210048,
1.4570618263181456,
1.6026776050833522,
1.72518617716559,
1.8222964108919824,
1.93963217894686,
2.0713537374434248,
2.192147260797448,
2.3928501840864906,
2.219139476575035,
1.7489616221304856,
1.5001572408529082,
1.3280025127832917,
1.5056398655397936,
1.32013262688277,
1.2231730911354104,
1.1566452624207046,
0.9575993093720591,
0.6539289909417381,
0.49952048644389835,
0.3989416382317433,
0.34826195817297373,
0.3309793106624692,
0.33531382378021013,
0.3523317751400029,
0.37574036633517266,
0.4013189854112273,
0.42968338546792834
]
},
"k"
]
}
},
"tolerance": {
"abs": 5e-06,
"rel": 0.0
}
},
{
"variable": "xl",
"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": [
2442588.7381346934,
2456270.489981912,
2463893.698313143,
2469804.193368759,
2476153.3266888484,
2482864.499287393,
2489604.9954940304,
2496389.2625498213,
2503274.231167063,
2510423.7559460998,
2517575.640917983,
2526225.032490477,
2532997.856187012,
2536977.7134941854,
2545034.0172127504,
2553222.348688729,
2561502.477362238,
2570178.438984504,
2579162.405773239,
2588349.814033244,
2597985.3370896056,
2607529.6351164,
2616525.045264391,
2626403.7754654363,
2636565.9076105505,
2646720.458530158,
2656288.93065338,
2664550.7857125774,
2664743.7135975305,
2644773.835839255,
2637240.3863571864,
2631728.4062876534,
2626864.0845915005,
2623668.7768428046,
2622201.523623226,
2622094.4209326915,
2622807.6282983087,
2623885.378177218,
2625034.577530481,
2626283.798995739
]
},
"k"
]
}
},
"tolerance": {
"abs": 0.1,
"rel": 0.0
}
},
{
"variable": "cpm",
"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": [
1016.157536351106,
1016.5520519423923,
1015.9389582305932,
1015.0118410633031,
1014.0081615716754,
1013.0102427194687,
1012.0840295969931,
1011.2219699408889,
1010.4115247358272,
1009.6325944702742,
1008.9328175230655,
1008.194443429247,
1007.7199624082405,
1007.3554231945052,
1006.9266272117927,
1006.4898336079975,
1006.0792636744784,
1005.7285568168538,
1005.4344495940801,
1005.1883759757181,
1005.0043509106248,
1004.810306815919,
1004.6637859137232,
1004.5882629309656,
1004.5473155091879,
1004.5317574072143,
1004.5166769940331,
1004.5098406765673,
1004.5098803675796,
1004.5302545423589,
1004.5345632545916,
1004.5389627578329,
1004.5440619242808,
1004.5495524939124,
1004.5552187772088,
1004.561009009543,
1004.5669768851152,
1004.573279250653,
1004.5801203284982,
1004.5874946729667
]
},
"k"
]
}
},
"tolerance": {
"abs": 0.0001,
"rel": 0.0
}
},
{
"variable": "qsat_w",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 0.020316704367985907,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qsat_w",
"time": 0.0,
"coords": {
"lev": 8
},
"expected": 0.007013120290817504,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qsat_w",
"time": 0.0,
"coords": {
"lev": 9
},
"expected": 0.006047018213555547,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qsat_w",
"time": 0.0,
"coords": {
"lev": 20
},
"expected": 0.0005522549776705756,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qsat_w",
"time": 0.0,
"coords": {
"lev": 30
},
"expected": 7.184427967135839e-05,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qsat_w",
"time": 0.0,
"coords": {
"lev": 40
},
"expected": 0.00042558731300106956,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "rh_w",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 0.6815425817897655,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "rh_w",
"time": 0.0,
"coords": {
"lev": 8
},
"expected": 1.1384782966448788,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "rh_w",
"time": 0.0,
"coords": {
"lev": 9
},
"expected": 1.1611750946819146,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "rh_w",
"time": 0.0,
"coords": {
"lev": 20
},
"expected": 1.480558404489876,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "rh_w",
"time": 0.0,
"coords": {
"lev": 30
},
"expected": 0.500193301128669,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "rh_w",
"time": 0.0,
"coords": {
"lev": 40
},
"expected": 0.2441925540085328,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qsat_i",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 0.020316704367985907,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qsat_i",
"time": 0.0,
"coords": {
"lev": 8
},
"expected": 0.007013120290817504,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qsat_i",
"time": 0.0,
"coords": {
"lev": 9
},
"expected": 0.005960264401916312,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qsat_i",
"time": 0.0,
"coords": {
"lev": 20
},
"expected": 0.00037298851369779815,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qsat_i",
"time": 0.0,
"coords": {
"lev": 30
},
"expected": 3.7527206906188094e-05,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qsat_i",
"time": 0.0,
"coords": {
"lev": 40
},
"expected": 0.00024186472279393506,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "rh_i",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 0.6815425817897655,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "rh_i",
"time": 0.0,
"coords": {
"lev": 9
},
"expected": 1.178076419631831,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "rh_i",
"time": 0.0,
"coords": {
"lev": 20
},
"expected": 2.192147260797448,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "rh_i",
"time": 0.0,
"coords": {
"lev": 40
},
"expected": 0.42968338546792834,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "xl",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 2442588.7381346934,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "xl",
"time": 0.0,
"coords": {
"lev": 9
},
"expected": 2503274.231167063,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "xl",
"time": 0.0,
"coords": {
"lev": 40
},
"expected": 2626283.798995739,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "cpm",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 1016.157536351106,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "cpm",
"time": 0.0,
"coords": {
"lev": 9
},
"expected": 1010.4115247358272,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "cpm",
"time": 0.0,
"coords": {
"lev": 40
},
"expected": 1004.5874946729667,
"tolerance": {
"rel": 1e-06
}
}
]
},
{
"id": "scm_call120_lowest_40_layers",
"description": "Reference: the start-of-sub-step saturation block of mp_wsm6_run (phys/physics_mmm/mp_wsm6.F90, ctessum-claude/MMM-physics fork 52cfbd7, instrumented) dumped in-model by the ctessum-claude/WRF fork and replayed through the real64 (kind_phys = real64) kernels/wsm6_driver at the WRF step; the block is evaluated once per sub-step from the kernel's input temperature, vapor and pressure (t, q, p), which are the inputs here (real32 values of the dump widened to real64, as the driver read them), and the expected qsat_w, rh_w, qsat_i, rh_i, xl and cpm are the replay's values (POINTWISE, step-free). Real64 replay vs real32 dump: qsat_w 1.3e-6, rh_w 1.6e-6, xl 5e-8, cpm 8e-8 relative. Residual mismatch between this component and the real64 kernel comes from the real32 WRF constants the kernel receives (cpv = 1846.4000244, rv = 461.6000061, psat = 610.78003, t0c = 273.1499939, ep2 = 0.62175041, cliq/cice exact) and its default-real literal 0.01 in ttp, which this component takes at their nominal values from lib/wrf_constants.esm; measured with zero tolerances it is <= 4.4e-7 of the column maximum in qsat_w/qsat_i (9e-9 kg/kg), 5.8e-7 in rh_w/rh_i (1.4e-6), 6e-9 in xl (0.016 J/kg, from t0c = 273.1499939), 3.4e-10 in cpm, and <= 1.1e-7 relative in the exponents xa, xb, xai, xbi. Tolerances are set 5-10x above the measured residual: relative 1e-6 spot checks, absolute Linf_error bounds at 1e-6 of each column's maximum. Regime: em_scm_xy single-column run (mp = 6, dt = 60 s) at call 120 (step 60, 20:00 UTC), column 1, lowest 40 of the 59 layers (the component's lev axis has 40 layers and esm-spec 6.6 tests cannot rebind a metaparameter; the fields are pointwise so the truncation is exact): an unsaturated continental column, T 284 K down to about 215 K, both saturation branches exercised, no condensate.",
"parameter_overrides": {},
"expression_template_imports": [
{
"ref": "./tests/scm_call120_lowest_40_layers_inputs.esm"
}
],
"time_span": {
"start": 0.0,
"end": 1.0
},
"assertions": [
{
"variable": "ttp",
"time": 0.0,
"expected": 273.15999389648437,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "xa",
"time": 0.0,
"expected": 5.077122930237518,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "xb",
"time": 0.0,
"expected": 24.904127580002847,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "xai",
"time": 0.0,
"expected": 0.5623916207828671,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "xbi",
"time": 0.0,
"expected": 23.165176921515343,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qsat_w",
"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.008403352325276094,
0.00811242243549885,
0.00786378358819789,
0.007624997859470242,
0.00738987276425134,
0.007156285737062582,
0.006923385888737541,
0.006690764507563764,
0.006458246821547319,
0.006225782483933178,
0.005993287984129618,
0.005760584154915414,
0.005526714689425756,
0.0052837771635198495,
0.0057374897194843386,
0.007045042816275265,
0.007074257558181414,
0.007079763670304125,
0.007076774375330278,
0.007066729849715678,
0.007050180998512127,
0.0070267153714384705,
0.006996201948512126,
0.006957927110318136,
0.006910790427536609,
0.006854622610026258,
0.006773768788332105,
0.006682923889735245,
0.0065816233250932344,
0.00646912633024862,
0.006345587283670819,
0.0062098062937119645,
0.006061400936002989,
0.005899933056694478,
0.0057247043146397775,
0.005534637889418066,
0.005234891870077765,
0.0049011243093332844,
0.004521486268631204,
0.0039734788838334655
]
},
"k"
]
}
},
"tolerance": {
"abs": 5e-08,
"rel": 0.0
}
},
{
"variable": "rh_w",
"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.38491910937769774,
0.37523887735670386,
0.3770629942960958,
0.3823462847773718,
0.3894485971580049,
0.3978000959277736,
0.40714287869611293,
0.417337501522974,
0.4282825224433344,
0.4398638289331575,
0.4518961538563143,
0.46397665722429127,
0.47500160291265225,
0.4796066716479975,
0.37427624480479976,
0.07434397556965218,
0.10392922011911712,
0.13586766141514842,
0.1687723289496038,
0.20273869915319845,
0.23787651564114579,
0.27432878314465314,
0.3122450351215815,
0.3518206594934232,
0.39329943723271343,
0.4367896415651809,
0.43025691201425664,
0.4227438788866453,
0.41533997524599486,
0.40805168685288895,
0.40082721739035143,
0.39369976700329057,
0.3866454274560117,
0.37964291975839554,
0.37268207953222743,
0.36576397903620295,
0.35407340696732104,
0.33898780708429543,
0.3212164538735483,
0.33043027677640546
]
},
"k"
]
}
},
"tolerance": {
"abs": 5e-06,
"rel": 0.0
}
},
{
"variable": "qsat_i",
"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.008403352325276094,
0.00811242243549885,
0.00786378358819789,
0.007624997859470242,
0.00738987276425134,
0.007156285737062582,
0.006923385888737541,
0.006690764507563764,
0.006458246821547319,
0.006225782483933178,
0.005993287984129618,
0.005760584154915414,
0.005526714689425756,
0.0052837771635198495,
0.0057374897194843386,
0.007045042816275265,
0.007074257558181414,
0.007079763670304125,
0.007076774375330278,
0.007066729849715678,
0.007050180998512127,
0.0070267153714384705,
0.006996201948512126,
0.006957927110318136,
0.006910790427536609,
0.006854622610026258,
0.006773768788332105,
0.006682923889735245,
0.0065816233250932344,
0.00646912633024862,
0.006345587283670819,
0.0062098062937119645,
0.006061400936002989,
0.005899933056694478,
0.005699113129322426,
0.0054671286742875545,
0.00511489893632399,
0.004729867345033708,
0.004300996644898766,
0.003701441393017127
]
},
"k"
]
}
},
"tolerance": {
"abs": 5e-08,
"rel": 0.0
}
},
{
"variable": "rh_i",
"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.38491910937769774,
0.37523887735670386,
0.3770629942960958,
0.3823462847773718,
0.3894485971580049,
0.3978000959277736,
0.40714287869611293,
0.417337501522974,
0.4282825224433344,
0.4398638289331575,
0.4518961538563143,
0.46397665722429127,
0.47500160291265225,
0.4796066716479975,
0.37427624480479976,
0.07434397556965218,
0.10392922011911712,
0.13586766141514842,
0.1687723289496038,
0.20273869915319845,
0.23787651564114579,
0.27432878314465314,
0.3122450351215815,
0.3518206594934232,
0.39329943723271343,
0.4367896415651809,
0.43025691201425664,
0.4227438788866453,
0.41533997524599486,
0.40805168685288895,
0.40082721739035143,
0.39369976700329057,
0.3866454274560117,
0.37964291975839554,
0.37435556379992774,
0.37028050692841774,
0.3623797894384354,
0.3512617290658036,
0.33768354299235737,
0.3547152549348009
]
},
"k"
]
}
},
"tolerance": {
"abs": 5e-06,
"rel": 0.0
}
},
{
"variable": "xl",
"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": [
2474725.9106636792,
2476168.5606608577,
2477470.099734213,
2478763.4138931036,
2480075.4665527754,
2481416.9143415354,
2482793.335897021,
2484208.7363949716,
2485666.334280178,
2487168.990392454,
2488720.066218581,
2490323.85301828,
2491989.791562937,
2493771.594120059,
2491383.3650433756,
2484878.10139044,
2485088.0155117884,
2485423.305937983,
2485811.736463722,
2486246.9417204186,
2486726.9191202037,
2487254.3864609003,
2487830.7741624154,
2488460.5165264606,
2489150.0504426174,
2489901.5930617414,
2490792.887705777,
2491755.6318241656,
2492794.7603655867,
2493917.0678245984,
2495125.343520019,
2496429.9579961747,
2497837.9918316044,
2499357.7414617687,
2501000.149598956,
2502779.878047213,
2505272.241693124,
2508097.3210093975,
2511387.787442405,
2516157.0219752416
]
},
"k"
]
}
},
"tolerance": {
"abs": 0.1,
"rel": 0.0
}
},
{
"variable": "cpm",
"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": [
1007.2232189896455,
1007.0628247386303,
1006.9963529422455,
1006.9544665779455,
1006.922967712087,
1006.896696702951,
1006.8731539019088,
1006.8508432833698,
1006.8286569415898,
1006.8055402882984,
1006.7801547020651,
1006.7502106678348,
1006.710154543438,
1006.6334881324142,
1006.3079012537543,
1004.940950602577,
1005.1189834794772,
1005.3098328381925,
1005.5055348221068,
1005.706189842529,
1005.9119273707512,
1006.1228719775627,
1006.339155290477,
1006.5609228544369,
1006.7882926735571,
1007.0206723750211,
1006.9536846536685,
1006.8785066234507,
1006.8014273940446,
1006.7223954121574,
1006.6413593205166,
1006.5582765827551,
1006.4730878047751,
1006.3857447656261,
1006.2961892473309,
1006.2043181433041,
1006.0604920032685,
1005.898750701957,
1005.7227552092268,
1005.6053791427108
]
},
"k"
]
}
},
"tolerance": {
"abs": 0.0001,
"rel": 0.0
}
},
{
"variable": "qsat_w",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 0.008403352325276094,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qsat_w",
"time": 0.0,
"coords": {
"lev": 10
},
"expected": 0.006225782483933178,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qsat_w",
"time": 0.0,
"coords": {
"lev": 20
},
"expected": 0.007066729849715678,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qsat_w",
"time": 0.0,
"coords": {
"lev": 40
},
"expected": 0.0039734788838334655,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "rh_w",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 0.38491910937769774,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "rh_w",
"time": 0.0,
"coords": {
"lev": 10
},
"expected": 0.4398638289331575,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "rh_w",
"time": 0.0,
"coords": {
"lev": 20
},
"expected": 0.20273869915319845,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "rh_w",
"time": 0.0,
"coords": {
"lev": 40
},
"expected": 0.33043027677640546,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qsat_i",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 0.008403352325276094,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qsat_i",
"time": 0.0,
"coords": {
"lev": 10
},
"expected": 0.006225782483933178,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qsat_i",
"time": 0.0,
"coords": {
"lev": 20
},
"expected": 0.007066729849715678,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "qsat_i",
"time": 0.0,
"coords": {
"lev": 40
},
"expected": 0.003701441393017127,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "xl",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 2474725.9106636792,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "xl",
"time": 0.0,
"coords": {
"lev": 40
},
"expected": 2516157.0219752416,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "cpm",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 1007.2232189896455,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "cpm",
"time": 0.0,
"coords": {
"lev": 40
},
"expected": 1005.6053791427108,
"tolerance": {
"rel": 1e-06
}
}
]
}
]
}