WSM6IceDeposition
Vapor-exchange and conversion process rates of the ice phase of the WRF single-moment 6-class microphysics scheme (WSM6; Hong and Lim 2006; Hong, Dudhia and Chen 2004), transcribed from the cold-rain block of mp_wsm6_run in phys/physics_mmm/mp_wsm6.F90 (WRF 4.8, NCAR/MMM-physics): deposition/sublimation of vapor on cloud ice (pidep, HDC eq. 9), snow (psdep, HDC eq. 14) and graupel (pgdep, HL A21) below 0 C; ice nucleation from vapor (pigen, HDC eqs. 7-8); aggregation of ice to snow (psaut, HDC eq. 12) and of snow to graupel (pgaut, LFO eq. 37); and evaporation of melting snow (psevp, HL A35) and graupel (pgevp, HL A25) above 0 C. The UNLIMITED rates are the physics: pidep = 4 D_i N_i (rh_i - 1)/F_i, psdep/pgdep/psevp/pgevp the ventilated diffusional growth (rh - 1)(c1 lambda^-2 + c2 f_v coeres)/F, pgaut = alpha2(T) max(0, qs - qs0). Two processes are instantaneous adjustments that the kernel writes as rates: nucleation relaxes the ice content to the target q_i0(T) = 4.92e-11 N_i0(T)^1.33/rho and ice-to-snow aggregation removes the excess of q_i over q_imax = 2.08e22 D_max^8/rho; here the physical quantities are the targets q_i0 and q_imax (observeds qi_nucleation_target, qi_max) and the rates pigen, psaut carry the sub-step dtcld as a parameter (EqWeFiC FORTRAN_BUGS.md N3). WSM6 limits the deposition processes SEQUENTIALLY against the vapor budget: after the rain evaporation prevp of the warm-rain block (an INPUT here, from warm_rain.esm), each of pidep, psdep, pgdep may take at most half the supersaturation over ice per sub-step (satdt/2) and at most what the earlier processes left (supice), a sublimating species may not lose more than it holds, and once the running sum of the limited rates reaches satdt the flag ifsat closes the remaining processes and the nucleation; that chain is transcribed pointwise as the <rate>_lim observeds and the ifsat_* indicators, all time-step artefacts kept apart from the physics. The saturation state over water and ice (qsat_w, rh_w, qsat_i, rh_i, xl) is an INPUT from saturation.esm evaluated at the start of the sub-step (EqWeFiC FORTRAN_BUGS.md N4); the size distributions, N_i, D_i come from hydrometeor_slopes.esm mounted as subsystem `sd`; the deposition coefficients precs1/2, precg1/2, the transport properties of air, the ventilation factor and the ventilation moments live there too; the diffusional-growth denominators over water and ice are computed here with the same template as warm_rain.esm. Constants: wsm6_parameters.esm (`par`), lib/wrf_constants.esm (`wrf`). Consumer-supplied inputs are the rewrite-target ops `input_<name>` lowered in the inline tests through a per-test template library extracted from kernel dumps of the instrumented WRF fork ctessum-claude/WRF, commit e42a269 (v4.8.0-2-ge42a269e). 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
Vapor-exchange and conversion process rates of the ice phase of the WRF single-moment 6-class microphysics scheme (WSM6; Hong and Lim 2006; Hong, Dudhia and Chen 2004), transcribed from the cold-rain block of mp_wsm6_run in phys/physics_mmm/mp_wsm6.F90 (WRF 4.8, NCAR/MMM-physics): deposition/sublimation of vapor on cloud ice (pidep, HDC eq. 9), snow (psdep, HDC eq. 14) and graupel (pgdep, HL A21) below 0 C; ice nucleation from vapor (pigen, HDC eqs. 7-8); aggregation of ice to snow (psaut, HDC eq. 12) and of snow to graupel (pgaut, LFO eq. 37); and evaporation of melting snow (psevp, HL A35) and graupel (pgevp, HL A25) above 0 C. The UNLIMITED rates are the physics: pidep = 4 D_i N_i (rh_i - 1)/F_i, psdep/pgdep/psevp/pgevp the ventilated diffusional growth (rh - 1)(c1 lambda^-2 + c2 f_v coeres)/F, pgaut = alpha2(T) max(0, qs - qs0). Two processes are instantaneous adjustments that the kernel writes as rates: nucleation relaxes the ice content to the target q_i0(T) = 4.92e-11 N_i0(T)^1.33/rho and ice-to-snow aggregation removes the excess of q_i over q_imax = 2.08e22 D_max^8/rho; here the physical quantities are the targets q_i0 and q_imax (observeds qi_nucleation_target, qi_max) and the rates pigen, psaut carry the sub-step dtcld as a parameter (EqWeFiC FORTRAN_BUGS.md N3). WSM6 limits the deposition processes SEQUENTIALLY against the vapor budget: after the rain evaporation prevp of the warm-rain block (an INPUT here, from warm_rain.esm), each of pidep, psdep, pgdep may take at most half the supersaturation over ice per sub-step (satdt/2) and at most what the earlier processes left (supice), a sublimating species may not lose more than it holds, and once the running sum of the limited rates reaches satdt the flag ifsat closes the remaining processes and the nucleation; that chain is transcribed pointwise as the sd; the deposition coefficients precs1/2, precg1/2, the transport properties of air, the ventilation factor and the ventilation moments live there too; the diffusional-growth denominators over water and ice are computed here with the same template as warm_rain.esm. Constants: wsm6_parameters.esm (par), lib/wrf_constants.esm (wrf). Consumer-supplied inputs are the rewrite-target ops input_<name> lowered in the inline tests through a per-test template library extracted from kernel dumps of the instrumented WRF fork ctessum-claude/WRF, commit e42a269 (v4.8.0-2-ge42a269e). 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., 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 (eqs. 7-9, 12-14).
- 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 (appendix A eqs. A4, A21, A25, A35, eq. 50).
- Lin, Y.-L., R. D. Farley, and H. D. Orville (1983). Bulk parameterization of the snow field in a cloud model. J. Climate Appl. Meteor. 22, 1065-1092 (eqs. 37, 46).
- Rutledge, S. A., and P. V. Hobbs (1983). The mesoscale and microscale structure and organization of clouds and precipitation in midlatitude cyclones. VIII. J. Atmos. Sci. 40, 1185-1206 (eq. A27).
- NCAR/MMM-physics mp_wsm6.F90 at commit 550b5b4 (WRF 4.8 phys/physics_mmm submodule), cold-rain block lines 1142-1245; diffac, venfac helper functions.
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. |
qsat_w_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_w to this name. Unused by the standalone inline tests, which lower input_qsat_w to a dumped column profile instead. |
rh_w_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_w to this name. Unused by the standalone inline tests, which lower input_rh_w to a dumped column profile instead. |
qsat_i_in | kg/kg | 0.0 | Coupling-target parameter (additive): receives the start-of-sub-step saturation mixing ratio over ice from the upstream stage through a document coupling (EqWeFiC couplings/microphysics_column*.esm), where the mount-edge template library lowers input_qsat_i to this name. Unused by the standalone inline tests, which lower input_qsat_i to a dumped column profile instead. |
rh_i_in | 1 | 0.0 | Coupling-target parameter (additive): receives the start-of-sub-step relative humidity over ice from the upstream stage through a document coupling (EqWeFiC couplings/microphysics_column*.esm), where the mount-edge template library lowers input_rh_i to this name. Unused by the standalone inline tests, which lower input_rh_i 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. |
prevp_in | kg/kg/s | 0.0 | Coupling-target parameter (additive): receives the rain evaporation rate that opens WSM6’s sequential vapor budget from the upstream stage through a document coupling (EqWeFiC couplings/microphysics_column*.esm), where the mount-edge template library lowers input_prevp to this name. Unused by the standalone inline tests, which lower input_prevp to a dumped column profile instead. |
dtcld | s | 60.0 | Length of the WSM6 sub-time step; enters the limiters and the adjustment rates only. |
Observed
| Name | Units | Default | Description |
|---|---|---|---|
qv | kg/kg | Water-vapor mixing ratio (WSM6 q). | |
qsat_w | kg/kg | Saturation mixing ratio over water at the start-of-step state (saturation.esm). | |
rh_w | 1 | Relative humidity over water at the start-of-step state (saturation.esm). | |
qsat_i | kg/kg | Saturation mixing ratio over ice at the start-of-step state (saturation.esm). | |
rh_i | 1 | Relative humidity over ice at the start-of-step state (saturation.esm). | |
xl | J/kg | Latent heat of vaporization at the start-of-step temperature (saturation.esm). | |
prevp | kg/kg/s | Rain evaporation/condensation rate as applied by the kernel (warm_rain.esm prevp_lim); the first entry of the sequential vapor budget. | |
roqimax | kg/m^3 | Maximum ice content rho q_imax = 2.08e22 D_max^8 before aggregation to snow (WSM6 roqimax). | |
supcol | K | Supercooling T0 - T (WSM6 supcol). | |
supsat | kg/kg | Supersaturation over ice, max(qv, qmin) - qsat_i (WSM6 supsat). | |
satdt | kg/kg/s | Supersaturation over ice per sub-step, supsat/dtcld (WSM6 satdt). | |
f_diff_w | s/m^2 | Diffusional-growth denominator over water, rho xl^2/(ka r_v T^2) + 1/(qsat_w Dv) (WSM6 work1(:,:,1)). | |
f_diff_i | s/m^2 | Diffusional-growth denominator over ice with the sublimation enthalpy xls (WSM6 work1(:,:,2)). | |
pidep | kg/kg/s | Deposition (positive) / sublimation of vapor on cloud ice below 0 C (HDC 9), unlimited; zero without ice or above 0 C. | |
supice_i | kg/kg/s | Vapor budget left for cloud ice after rain evaporation, satdt - prevp (WSM6 supice before pidep). | |
pidep_lim | kg/kg/s | pidep after the sequential saturation limiter (WSM6 pidep as applied). | |
ifsat_i | 1 | 1 where |prevp + pidep_lim| >= |satdt| has closed the vapor budget (WSM6 ifsat after pidep), else 0. | |
psdep | kg/kg/s | Deposition / sublimation of vapor on snow below 0 C (HDC 14), n0s(T)/n0s (rh_i - 1)(precs1 lambda_s^-2 + precs2 f_v coeres_s)/F_i, unlimited. | |
supice_s | kg/kg/s | Vapor budget left for snow, satdt - prevp - pidep_lim. | |
psdep_lim | kg/kg/s | psdep after the sequential saturation limiter; zero where ifsat_i has closed the budget (WSM6 psdep as applied). | |
ifsat_s | 1 | 1 where the budget is closed after psdep (WSM6 ifsat after psdep). | |
pgdep | kg/kg/s | Deposition / sublimation of vapor on graupel below 0 C (HL A21, LFO 46), unlimited. | |
supice_g | kg/kg/s | Vapor budget left for graupel, satdt - prevp - pidep_lim - psdep_lim. | |
pgdep_lim | kg/kg/s | pgdep after the sequential saturation limiter; zero where ifsat_s has closed the budget (WSM6 pgdep as applied). | |
ifsat_g | 1 | 1 where the budget is closed after pgdep (WSM6 ifsat after pgdep). | |
supice_n | kg/kg/s | Vapor budget left for nucleation, satdt - prevp - pidep_lim - psdep_lim - pgdep_lim. | |
qi_nucleation_target | kg/kg | Ice mixing ratio the nucleation relaxes towards, q_i0(T) = 4.92e-11 (1e3 exp(0.1 (T0 - T)))^1.33/rho (HDC 7-8; WSM6 roqi0/den). | |
pigen | kg/kg/s | Ice nucleation rate max(0, (q_i0 - q_i)/dtcld) below 0 C where supersaturated over ice (HL 50, HDC 7-8): an adjustment written as a rate, so it scales with 1/dtcld. | |
pigen_lim | kg/kg/s | pigen after the vapor-budget limiter min(pigen, satdt, supice_n); zero where ifsat_g has closed the budget (WSM6 pigen as applied). | |
qi_max | kg/kg | Maximum ice mixing ratio before aggregation to snow, roqimax/rho (HDC 13; WSM6 qimax). | |
psaut | kg/kg/s | Aggregation of cloud ice to snow, max(0, (q_i - q_imax)/dtcld) below 0 C (HDC 12): an adjustment written as a rate (WSM6 psaut, no further limiter). | |
pgaut | kg/kg/s | Aggregation of snow to graupel below 0 C, 1e-3 exp(-0.09 (T0 - T)) max(0, qs - qs0) (LFO 37, HL A4), unlimited. | |
pgaut_lim | kg/kg/s | pgaut after the limiter min(pgaut, qs/dtcld). | |
psevp | kg/kg/s | Evaporation of melting snow above 0 C where subsaturated over water (HL A35, RH83 A27), n0s(T)/n0s (rh_w - 1)(precs1 lambda_s^-2 + precs2 f_v coeres_s)/F_w (negative), unlimited. | |
psevp_lim | kg/kg/s | psevp after the limiter min(max(psevp, -qs/dtcld), 0). | |
pgevp | kg/kg/s | Evaporation of melting graupel above 0 C where subsaturated over water (HL A25, RH84 A19), unlimited. | |
pgevp_lim | kg/kg/s | pgevp after the limiter min(max(pgevp, -qg/dtcld), 0). |
Observed expressions
$$ qv = \mathrm{input_qv}\left(\right) $$Water-vapor mixing ratio (WSM6 q).
$$ qsat_{w} = \mathrm{input_qsat_w}\left(\right) $$Saturation mixing ratio over water at the start-of-step state (saturation.esm).
$$ rh_{w} = \mathrm{input_rh_w}\left(\right) $$Relative humidity over water at the start-of-step state (saturation.esm).
$$ qsat_{i} = \mathrm{input_qsat_i}\left(\right) $$Saturation mixing ratio over ice at the start-of-step state (saturation.esm).
$$ rh_{i} = \mathrm{input_rh_i}\left(\right) $$Relative humidity over ice at the start-of-step state (saturation.esm).
$$ xl = \mathrm{input_xl}\left(\right) $$Latent heat of vaporization at the start-of-step temperature (saturation.esm).
$$ prevp = \mathrm{input_prevp}\left(\right) $$Rain evaporation/condensation rate as applied by the kernel (warm_rain.esm prevp_lim); the first entry of the sequential vapor budget.
$$ roqimax = par.roqimax_{coef} \cdot par.dimax^{par.roqimax_{exp}} $$Maximum ice content rho q_imax = 2.08e22 D_max^8 before aggregation to snow (WSM6 roqimax).
$$ supcol = wrf.svpt0 - sd.T $$Supercooling T0 - T (WSM6 supcol).
$$ supsat = \mathrm{max}\left(qv, par.qmin\right) - qsat_{i} $$Supersaturation over ice, max(qv, qmin) - qsat_i (WSM6 supsat).
$$ satdt = \frac{supsat}{dtcld} $$Supersaturation over ice per sub-step, supsat/dtcld (WSM6 satdt).
$$ f_{diff\,w} = \mathrm{diffusional_growth_denominator}\left(L=xl, T=sd.T, rho=sd.rho, ka=sd.ka, r_{v}=wrf.r_{v}, qsat=qsat_{w}, Dv=sd.Dv\right) $$Diffusional-growth denominator over water, rho xl^2/(ka r_v T^2) + 1/(qsat_w Dv) (WSM6 work1(:,:,1)).
$$ f_{diff\,i} = \mathrm{diffusional_growth_denominator}\left(L=wrf.xls, T=sd.T, rho=sd.rho, ka=sd.ka, r_{v}=wrf.r_{v}, qsat=qsat_{i}, Dv=sd.Dv\right) $$Diffusional-growth denominator over ice with the sublimation enthalpy xls (WSM6 work1(:,:,2)).
$$ pidep = \mathrm{ifelse}\left(\mathrm{and}\left(\mathrm{>}\left(supcol, 0\right), \mathrm{>}\left(sd.qi, 0\right)\right), \mathrm{ice_deposition_rate}\left(D=sd.D_{i}, xni=sd.xni, rh_{i}=rh_{i}, f_{diff\,i}=f_{diff\,i}\right), 0\right) $$Deposition (positive) / sublimation of vapor on cloud ice below 0 C (HDC 9), unlimited; zero without ice or above 0 C.
$$ supice_{i} = satdt - prevp $$Vapor budget left for cloud ice after rain evaporation, satdt - prevp (WSM6 supice before pidep).
$$ pidep_{lim} = \mathrm{ifelse}\left(\mathrm{and}\left(\mathrm{>}\left(supcol, 0\right), \mathrm{>}\left(sd.qi, 0\right)\right), \mathrm{saturation_limited_deposition}\left(rate=pidep, satdt=satdt, supice=supice_{i}, q=sd.qi, dt=dtcld\right), 0\right) $$pidep after the sequential saturation limiter (WSM6 pidep as applied).
$$ ifsat_{i} = \mathrm{ifelse}\left(\mathrm{and}\left(\mathrm{>}\left(supcol, 0\right), \mathrm{>}\left(sd.qi, 0\right), \mathrm{>=}\left(\left|prevp + pidep_{lim}\right|, \left|satdt\right|\right)\right), \mathrm{const}\left(\right), \mathrm{const}\left(\right)\right) $$1 where |prevp + pidep_lim| >= |satdt| has closed the vapor budget (WSM6 ifsat after pidep), else 0.
$$ psdep = \mathrm{ifelse}\left(\mathrm{and}\left(\mathrm{>}\left(supcol, 0\right), \mathrm{>}\left(sd.qs, 0\right)\right), sd.n0sfac \cdot \mathrm{ventilated_diffusional_growth}\left(rh=rh_{i}, rslope2=sd.rslope2_{s}, coeres=sd.coeres_{s}, f_{vent}=sd.f_{vent}, f_{diff}=f_{diff\,i}, c1=sd.precs1, c2=sd.precs2\right), 0\right) $$Deposition / sublimation of vapor on snow below 0 C (HDC 14), n0s(T)/n0s (rh_i - 1)(precs1 lambda_s^-2 + precs2 f_v coeres_s)/F_i, unlimited.
$$ supice_{s} = supice_{i} - pidep_{lim} $$Vapor budget left for snow, satdt - prevp - pidep_lim.
$$ psdep_{lim} = \mathrm{ifelse}\left(\mathrm{and}\left(\mathrm{>}\left(supcol, 0\right), \mathrm{>}\left(sd.qs, 0\right), ifsat_{i} = 0\right), \mathrm{saturation_limited_deposition}\left(rate=psdep, satdt=satdt, supice=supice_{s}, q=sd.qs, dt=dtcld\right), 0\right) $$psdep after the sequential saturation limiter; zero where ifsat_i has closed the budget (WSM6 psdep as applied).
$$ ifsat_{s} = \mathrm{ifelse}\left(\mathrm{or}\left(ifsat_{i} = 1, \mathrm{and}\left(\mathrm{>}\left(supcol, 0\right), \mathrm{>}\left(sd.qs, 0\right), \mathrm{>=}\left(\left|prevp + pidep_{lim} + psdep_{lim}\right|, \left|satdt\right|\right)\right)\right), \mathrm{const}\left(\right), \mathrm{const}\left(\right)\right) $$1 where the budget is closed after psdep (WSM6 ifsat after psdep).
$$ pgdep = \mathrm{ifelse}\left(\mathrm{and}\left(\mathrm{>}\left(supcol, 0\right), \mathrm{>}\left(sd.qg, 0\right)\right), \mathrm{ventilated_diffusional_growth}\left(rh=rh_{i}, rslope2=sd.rslope2_{g}, coeres=sd.coeres_{g}, f_{vent}=sd.f_{vent}, f_{diff}=f_{diff\,i}, c1=sd.precg1, c2=sd.precg2\right), 0\right) $$Deposition / sublimation of vapor on graupel below 0 C (HL A21, LFO 46), unlimited.
$$ supice_{g} = supice_{s} - psdep_{lim} $$Vapor budget left for graupel, satdt - prevp - pidep_lim - psdep_lim.
$$ pgdep_{lim} = \mathrm{ifelse}\left(\mathrm{and}\left(\mathrm{>}\left(supcol, 0\right), \mathrm{>}\left(sd.qg, 0\right), ifsat_{s} = 0\right), \mathrm{saturation_limited_deposition}\left(rate=pgdep, satdt=satdt, supice=supice_{g}, q=sd.qg, dt=dtcld\right), 0\right) $$pgdep after the sequential saturation limiter; zero where ifsat_s has closed the budget (WSM6 pgdep as applied).
$$ ifsat_{g} = \mathrm{ifelse}\left(\mathrm{or}\left(ifsat_{s} = 1, \mathrm{and}\left(\mathrm{>}\left(supcol, 0\right), \mathrm{>}\left(sd.qg, 0\right), \mathrm{>=}\left(\left|prevp + pidep_{lim} + psdep_{lim} + pgdep_{lim}\right|, \left|satdt\right|\right)\right)\right), \mathrm{const}\left(\right), \mathrm{const}\left(\right)\right) $$1 where the budget is closed after pgdep (WSM6 ifsat after pgdep).
$$ supice_{n} = supice_{g} - pgdep_{lim} $$Vapor budget left for nucleation, satdt - prevp - pidep_lim - psdep_lim - pgdep_lim.
$$ qi_{nucleation\,target} = \mathrm{ice_nucleation_target}\left(T=sd.T, t0=wrf.svpt0, rho=sd.rho, n_{coef}=par.xni0_{coef}, n_{exp}=par.xni0_{exp}, m_{coef}=par.roqi0_{coef}, m_{exp}=par.roqi0_{exp}\right) $$Ice mixing ratio the nucleation relaxes towards, q_i0(T) = 4.92e-11 (1e3 exp(0.1 (T0 - T)))^1.33/rho (HDC 7-8; WSM6 roqi0/den).
$$ pigen = \mathrm{ifelse}\left(\mathrm{and}\left(\mathrm{>}\left(supcol, 0\right), \mathrm{>}\left(supsat, 0\right)\right), \mathrm{adjustment_towards_target_rate}\left(q_{target}=qi_{nucleation\,target}, q=\mathrm{max}\left(sd.qi, 0\right), dt=dtcld\right), 0\right) $$Ice nucleation rate max(0, (q_i0 - q_i)/dtcld) below 0 C where supersaturated over ice (HL 50, HDC 7-8): an adjustment written as a rate, so it scales with 1/dtcld.
$$ pigen_{lim} = \mathrm{ifelse}\left(\mathrm{and}\left(\mathrm{>}\left(supcol, 0\right), \mathrm{>}\left(supsat, 0\right), ifsat_{g} = 0\right), \mathrm{min}\left(pigen, satdt, supice_{n}\right), 0\right) $$pigen after the vapor-budget limiter min(pigen, satdt, supice_n); zero where ifsat_g has closed the budget (WSM6 pigen as applied).
$$ qi_{max} = \frac{roqimax}{sd.rho} $$Maximum ice mixing ratio before aggregation to snow, roqimax/rho (HDC 13; WSM6 qimax).
$$ psaut = \mathrm{ifelse}\left(\mathrm{and}\left(\mathrm{>}\left(supcol, 0\right), \mathrm{>}\left(sd.qi, 0\right)\right), \mathrm{excess_conversion_rate}\left(q=sd.qi, q_{max}=qi_{max}, dt=dtcld\right), 0\right) $$Aggregation of cloud ice to snow, max(0, (q_i - q_imax)/dtcld) below 0 C (HDC 12): an adjustment written as a rate (WSM6 psaut, no further limiter).
$$ pgaut = \mathrm{ifelse}\left(\mathrm{and}\left(\mathrm{>}\left(supcol, 0\right), \mathrm{>}\left(sd.qs, 0\right)\right), \mathrm{snow_to_graupel_aggregation}\left(qs=sd.qs, qs0=par.qs0, T=sd.T, t0=wrf.svpt0, coef=par.pgaut_{coef}, expn=par.pgaut_{exp}\right), 0\right) $$Aggregation of snow to graupel below 0 C, 1e-3 exp(-0.09 (T0 - T)) max(0, qs - qs0) (LFO 37, HL A4), unlimited.
$$ pgaut_{lim} = \mathrm{sink_rate_limiter}\left(rate=pgaut, q=sd.qs, dt=dtcld\right) $$pgaut after the limiter min(pgaut, qs/dtcld).
$$ psevp = \mathrm{ifelse}\left(\mathrm{and}\left(\mathrm{<}\left(supcol, 0\right), \mathrm{>}\left(sd.qs, 0\right), \mathrm{<}\left(rh_{w}, 1\right)\right), sd.n0sfac \cdot \mathrm{ventilated_diffusional_growth}\left(rh=rh_{w}, rslope2=sd.rslope2_{s}, coeres=sd.coeres_{s}, f_{vent}=sd.f_{vent}, f_{diff}=f_{diff\,w}, c1=sd.precs1, c2=sd.precs2\right), 0\right) $$Evaporation of melting snow above 0 C where subsaturated over water (HL A35, RH83 A27), n0s(T)/n0s (rh_w - 1)(precs1 lambda_s^-2 + precs2 f_v coeres_s)/F_w (negative), unlimited.
$$ psevp_{lim} = \mathrm{negative_sink_limiter}\left(rate=psevp, q=sd.qs, dt=dtcld\right) $$psevp after the limiter min(max(psevp, -qs/dtcld), 0).
$$ pgevp = \mathrm{ifelse}\left(\mathrm{and}\left(\mathrm{<}\left(supcol, 0\right), \mathrm{>}\left(sd.qg, 0\right), \mathrm{<}\left(rh_{w}, 1\right)\right), \mathrm{ventilated_diffusional_growth}\left(rh=rh_{w}, rslope2=sd.rslope2_{g}, coeres=sd.coeres_{g}, f_{vent}=sd.f_{vent}, f_{diff}=f_{diff\,w}, c1=sd.precg1, c2=sd.precg2\right), 0\right) $$Evaporation of melting graupel above 0 C where subsaturated over water (HL A25, RH84 A19), unlimited.
$$ pgevp_{lim} = \mathrm{negative_sink_limiter}\left(rate=pgevp, q=sd.qg, dt=dtcld\right) $$pgevp after the limiter min(max(pgevp, -qg/dtcld), 0).
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."
},
"qsat_w_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_w` to this name. Unused by the standalone inline tests, which lower `input_qsat_w` to a dumped column profile instead."
},
"rh_w_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_w` to this name. Unused by the standalone inline tests, which lower `input_rh_w` to a dumped column profile instead."
},
"qsat_i_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 ice from the upstream stage through a document coupling (EqWeFiC couplings/microphysics_column*.esm), where the mount-edge template library lowers `input_qsat_i` to this name. Unused by the standalone inline tests, which lower `input_qsat_i` to a dumped column profile instead."
},
"rh_i_in": {
"type": "parameter",
"units": "1",
"shape": [
"lev"
],
"default": 0.0,
"description": "Coupling-target parameter (additive): receives the start-of-sub-step relative humidity over ice from the upstream stage through a document coupling (EqWeFiC couplings/microphysics_column*.esm), where the mount-edge template library lowers `input_rh_i` to this name. Unused by the standalone inline tests, which lower `input_rh_i` 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."
},
"prevp_in": {
"type": "parameter",
"units": "kg/kg/s",
"shape": [
"lev"
],
"default": 0.0,
"description": "Coupling-target parameter (additive): receives the rain evaporation rate that opens WSM6's sequential vapor budget from the upstream stage through a document coupling (EqWeFiC couplings/microphysics_column*.esm), where the mount-edge template library lowers `input_prevp` to this name. Unused by the standalone inline tests, which lower `input_prevp` to a dumped column profile instead."
},
"qv": {
"type": "unknown",
"units": "kg/kg",
"shape": [
"lev"
],
"description": "Water-vapor mixing ratio (WSM6 q)."
},
"qsat_w": {
"type": "unknown",
"units": "kg/kg",
"shape": [
"lev"
],
"description": "Saturation mixing ratio over water at the start-of-step state (saturation.esm)."
},
"rh_w": {
"type": "unknown",
"units": "1",
"shape": [
"lev"
],
"description": "Relative humidity over water at the start-of-step state (saturation.esm)."
},
"qsat_i": {
"type": "unknown",
"units": "kg/kg",
"shape": [
"lev"
],
"description": "Saturation mixing ratio over ice at the start-of-step state (saturation.esm)."
},
"rh_i": {
"type": "unknown",
"units": "1",
"shape": [
"lev"
],
"description": "Relative humidity over ice at the start-of-step state (saturation.esm)."
},
"xl": {
"type": "unknown",
"units": "J/kg",
"shape": [
"lev"
],
"description": "Latent heat of vaporization at the start-of-step temperature (saturation.esm)."
},
"prevp": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "Rain evaporation/condensation rate as applied by the kernel (warm_rain.esm prevp_lim); the first entry of the sequential vapor budget."
},
"dtcld": {
"type": "parameter",
"units": "s",
"default": 60.0,
"description": "Length of the WSM6 sub-time step; enters the limiters and the adjustment rates only."
},
"roqimax": {
"type": "unknown",
"units": "kg/m^3",
"description": "Maximum ice content rho q_imax = 2.08e22 D_max^8 before aggregation to snow (WSM6 roqimax)."
},
"supcol": {
"type": "unknown",
"units": "K",
"shape": [
"lev"
],
"description": "Supercooling T0 - T (WSM6 supcol)."
},
"supsat": {
"type": "unknown",
"units": "kg/kg",
"shape": [
"lev"
],
"description": "Supersaturation over ice, max(qv, qmin) - qsat_i (WSM6 supsat)."
},
"satdt": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "Supersaturation over ice per sub-step, supsat/dtcld (WSM6 satdt)."
},
"f_diff_w": {
"type": "unknown",
"units": "s/m^2",
"shape": [
"lev"
],
"description": "Diffusional-growth denominator over water, rho xl^2/(ka r_v T^2) + 1/(qsat_w Dv) (WSM6 work1(:,:,1))."
},
"f_diff_i": {
"type": "unknown",
"units": "s/m^2",
"shape": [
"lev"
],
"description": "Diffusional-growth denominator over ice with the sublimation enthalpy xls (WSM6 work1(:,:,2))."
},
"pidep": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "Deposition (positive) / sublimation of vapor on cloud ice below 0 C (HDC 9), unlimited; zero without ice or above 0 C."
},
"supice_i": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "Vapor budget left for cloud ice after rain evaporation, satdt - prevp (WSM6 supice before pidep)."
},
"pidep_lim": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "pidep after the sequential saturation limiter (WSM6 pidep as applied)."
},
"ifsat_i": {
"type": "unknown",
"units": "1",
"shape": [
"lev"
],
"description": "1 where |prevp + pidep_lim| >= |satdt| has closed the vapor budget (WSM6 ifsat after pidep), else 0."
},
"psdep": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "Deposition / sublimation of vapor on snow below 0 C (HDC 14), n0s(T)/n0s (rh_i - 1)(precs1 lambda_s^-2 + precs2 f_v coeres_s)/F_i, unlimited."
},
"supice_s": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "Vapor budget left for snow, satdt - prevp - pidep_lim."
},
"psdep_lim": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "psdep after the sequential saturation limiter; zero where ifsat_i has closed the budget (WSM6 psdep as applied)."
},
"ifsat_s": {
"type": "unknown",
"units": "1",
"shape": [
"lev"
],
"description": "1 where the budget is closed after psdep (WSM6 ifsat after psdep)."
},
"pgdep": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "Deposition / sublimation of vapor on graupel below 0 C (HL A21, LFO 46), unlimited."
},
"supice_g": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "Vapor budget left for graupel, satdt - prevp - pidep_lim - psdep_lim."
},
"pgdep_lim": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "pgdep after the sequential saturation limiter; zero where ifsat_s has closed the budget (WSM6 pgdep as applied)."
},
"ifsat_g": {
"type": "unknown",
"units": "1",
"shape": [
"lev"
],
"description": "1 where the budget is closed after pgdep (WSM6 ifsat after pgdep)."
},
"supice_n": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "Vapor budget left for nucleation, satdt - prevp - pidep_lim - psdep_lim - pgdep_lim."
},
"qi_nucleation_target": {
"type": "unknown",
"units": "kg/kg",
"shape": [
"lev"
],
"description": "Ice mixing ratio the nucleation relaxes towards, q_i0(T) = 4.92e-11 (1e3 exp(0.1 (T0 - T)))^1.33/rho (HDC 7-8; WSM6 roqi0/den)."
},
"pigen": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "Ice nucleation rate max(0, (q_i0 - q_i)/dtcld) below 0 C where supersaturated over ice (HL 50, HDC 7-8): an adjustment written as a rate, so it scales with 1/dtcld."
},
"pigen_lim": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "pigen after the vapor-budget limiter min(pigen, satdt, supice_n); zero where ifsat_g has closed the budget (WSM6 pigen as applied)."
},
"qi_max": {
"type": "unknown",
"units": "kg/kg",
"shape": [
"lev"
],
"description": "Maximum ice mixing ratio before aggregation to snow, roqimax/rho (HDC 13; WSM6 qimax)."
},
"psaut": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "Aggregation of cloud ice to snow, max(0, (q_i - q_imax)/dtcld) below 0 C (HDC 12): an adjustment written as a rate (WSM6 psaut, no further limiter)."
},
"pgaut": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "Aggregation of snow to graupel below 0 C, 1e-3 exp(-0.09 (T0 - T)) max(0, qs - qs0) (LFO 37, HL A4), unlimited."
},
"pgaut_lim": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "pgaut after the limiter min(pgaut, qs/dtcld)."
},
"psevp": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "Evaporation of melting snow above 0 C where subsaturated over water (HL A35, RH83 A27), n0s(T)/n0s (rh_w - 1)(precs1 lambda_s^-2 + precs2 f_v coeres_s)/F_w (negative), unlimited."
},
"psevp_lim": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "psevp after the limiter min(max(psevp, -qs/dtcld), 0)."
},
"pgevp": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "Evaporation of melting graupel above 0 C where subsaturated over water (HL A25, RH84 A19), unlimited."
},
"pgevp_lim": {
"type": "unknown",
"units": "kg/kg/s",
"shape": [
"lev"
],
"description": "pgevp after the limiter min(max(pgevp, -qg/dtcld), 0)."
}
},
"equations": [
{
"lhs": "qv",
"rhs": {
"op": "input_qv",
"args": []
}
},
{
"lhs": "qsat_w",
"rhs": {
"op": "input_qsat_w",
"args": []
}
},
{
"lhs": "rh_w",
"rhs": {
"op": "input_rh_w",
"args": []
}
},
{
"lhs": "qsat_i",
"rhs": {
"op": "input_qsat_i",
"args": []
}
},
{
"lhs": "rh_i",
"rhs": {
"op": "input_rh_i",
"args": []
}
},
{
"lhs": "xl",
"rhs": {
"op": "input_xl",
"args": []
}
},
{
"lhs": "prevp",
"rhs": {
"op": "input_prevp",
"args": []
}
},
{
"lhs": "roqimax",
"rhs": {
"op": "*",
"args": [
"par.roqimax_coef",
{
"op": "^",
"args": [
"par.dimax",
"par.roqimax_exp"
]
}
]
}
},
{
"lhs": "supcol",
"rhs": {
"op": "-",
"args": [
"wrf.svpt0",
"sd.T"
]
}
},
{
"lhs": "supsat",
"rhs": {
"op": "-",
"args": [
{
"op": "max",
"args": [
"qv",
"par.qmin"
]
},
"qsat_i"
]
}
},
{
"lhs": "satdt",
"rhs": {
"op": "/",
"args": [
"supsat",
"dtcld"
]
}
},
{
"lhs": "f_diff_w",
"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_w",
"Dv": "sd.Dv"
}
}
},
{
"lhs": "f_diff_i",
"rhs": {
"op": "apply_expression_template",
"args": [],
"name": "diffusional_growth_denominator",
"bindings": {
"L": "wrf.xls",
"T": "sd.T",
"rho": "sd.rho",
"ka": "sd.ka",
"r_v": "wrf.r_v",
"qsat": "qsat_i",
"Dv": "sd.Dv"
}
}
},
{
"lhs": "pidep",
"rhs": {
"op": "ifelse",
"args": [
{
"op": "and",
"args": [
{
"op": ">",
"args": [
"supcol",
0
]
},
{
"op": ">",
"args": [
"sd.qi",
0
]
}
]
},
{
"op": "apply_expression_template",
"args": [],
"name": "ice_deposition_rate",
"bindings": {
"D": "sd.D_i",
"xni": "sd.xni",
"rh_i": "rh_i",
"f_diff_i": "f_diff_i"
}
},
0
]
}
},
{
"lhs": "supice_i",
"rhs": {
"op": "-",
"args": [
"satdt",
"prevp"
]
}
},
{
"lhs": "pidep_lim",
"rhs": {
"op": "ifelse",
"args": [
{
"op": "and",
"args": [
{
"op": ">",
"args": [
"supcol",
0
]
},
{
"op": ">",
"args": [
"sd.qi",
0
]
}
]
},
{
"op": "apply_expression_template",
"args": [],
"name": "saturation_limited_deposition",
"bindings": {
"rate": "pidep",
"satdt": "satdt",
"supice": "supice_i",
"q": "sd.qi",
"dt": "dtcld"
}
},
0
]
}
},
{
"lhs": "ifsat_i",
"rhs": {
"op": "ifelse",
"args": [
{
"op": "and",
"args": [
{
"op": ">",
"args": [
"supcol",
0
]
},
{
"op": ">",
"args": [
"sd.qi",
0
]
},
{
"op": ">=",
"args": [
{
"op": "abs",
"args": [
{
"op": "+",
"args": [
"prevp",
"pidep_lim"
]
}
]
},
{
"op": "abs",
"args": [
"satdt"
]
}
]
}
]
},
{
"op": "const",
"args": [],
"value": 1,
"units": "1"
},
{
"op": "const",
"args": [],
"value": 0,
"units": "1"
}
]
}
},
{
"lhs": "psdep",
"rhs": {
"op": "ifelse",
"args": [
{
"op": "and",
"args": [
{
"op": ">",
"args": [
"supcol",
0
]
},
{
"op": ">",
"args": [
"sd.qs",
0
]
}
]
},
{
"op": "*",
"args": [
"sd.n0sfac",
{
"op": "apply_expression_template",
"args": [],
"name": "ventilated_diffusional_growth",
"bindings": {
"rh": "rh_i",
"rslope2": "sd.rslope2_s",
"coeres": "sd.coeres_s",
"f_vent": "sd.f_vent",
"f_diff": "f_diff_i",
"c1": "sd.precs1",
"c2": "sd.precs2"
}
}
]
},
0
]
}
},
{
"lhs": "supice_s",
"rhs": {
"op": "-",
"args": [
"supice_i",
"pidep_lim"
]
}
},
{
"lhs": "psdep_lim",
"rhs": {
"op": "ifelse",
"args": [
{
"op": "and",
"args": [
{
"op": ">",
"args": [
"supcol",
0
]
},
{
"op": ">",
"args": [
"sd.qs",
0
]
},
{
"op": "==",
"args": [
"ifsat_i",
0
]
}
]
},
{
"op": "apply_expression_template",
"args": [],
"name": "saturation_limited_deposition",
"bindings": {
"rate": "psdep",
"satdt": "satdt",
"supice": "supice_s",
"q": "sd.qs",
"dt": "dtcld"
}
},
0
]
}
},
{
"lhs": "ifsat_s",
"rhs": {
"op": "ifelse",
"args": [
{
"op": "or",
"args": [
{
"op": "==",
"args": [
"ifsat_i",
1
]
},
{
"op": "and",
"args": [
{
"op": ">",
"args": [
"supcol",
0
]
},
{
"op": ">",
"args": [
"sd.qs",
0
]
},
{
"op": ">=",
"args": [
{
"op": "abs",
"args": [
{
"op": "+",
"args": [
"prevp",
"pidep_lim",
"psdep_lim"
]
}
]
},
{
"op": "abs",
"args": [
"satdt"
]
}
]
}
]
}
]
},
{
"op": "const",
"args": [],
"value": 1,
"units": "1"
},
{
"op": "const",
"args": [],
"value": 0,
"units": "1"
}
]
}
},
{
"lhs": "pgdep",
"rhs": {
"op": "ifelse",
"args": [
{
"op": "and",
"args": [
{
"op": ">",
"args": [
"supcol",
0
]
},
{
"op": ">",
"args": [
"sd.qg",
0
]
}
]
},
{
"op": "apply_expression_template",
"args": [],
"name": "ventilated_diffusional_growth",
"bindings": {
"rh": "rh_i",
"rslope2": "sd.rslope2_g",
"coeres": "sd.coeres_g",
"f_vent": "sd.f_vent",
"f_diff": "f_diff_i",
"c1": "sd.precg1",
"c2": "sd.precg2"
}
},
0
]
}
},
{
"lhs": "supice_g",
"rhs": {
"op": "-",
"args": [
"supice_s",
"psdep_lim"
]
}
},
{
"lhs": "pgdep_lim",
"rhs": {
"op": "ifelse",
"args": [
{
"op": "and",
"args": [
{
"op": ">",
"args": [
"supcol",
0
]
},
{
"op": ">",
"args": [
"sd.qg",
0
]
},
{
"op": "==",
"args": [
"ifsat_s",
0
]
}
]
},
{
"op": "apply_expression_template",
"args": [],
"name": "saturation_limited_deposition",
"bindings": {
"rate": "pgdep",
"satdt": "satdt",
"supice": "supice_g",
"q": "sd.qg",
"dt": "dtcld"
}
},
0
]
}
},
{
"lhs": "ifsat_g",
"rhs": {
"op": "ifelse",
"args": [
{
"op": "or",
"args": [
{
"op": "==",
"args": [
"ifsat_s",
1
]
},
{
"op": "and",
"args": [
{
"op": ">",
"args": [
"supcol",
0
]
},
{
"op": ">",
"args": [
"sd.qg",
0
]
},
{
"op": ">=",
"args": [
{
"op": "abs",
"args": [
{
"op": "+",
"args": [
"prevp",
"pidep_lim",
"psdep_lim",
"pgdep_lim"
]
}
]
},
{
"op": "abs",
"args": [
"satdt"
]
}
]
}
]
}
]
},
{
"op": "const",
"args": [],
"value": 1,
"units": "1"
},
{
"op": "const",
"args": [],
"value": 0,
"units": "1"
}
]
}
},
{
"lhs": "supice_n",
"rhs": {
"op": "-",
"args": [
"supice_g",
"pgdep_lim"
]
}
},
{
"lhs": "qi_nucleation_target",
"rhs": {
"op": "apply_expression_template",
"args": [],
"name": "ice_nucleation_target",
"bindings": {
"T": "sd.T",
"t0": "wrf.svpt0",
"rho": "sd.rho",
"n_coef": "par.xni0_coef",
"n_exp": "par.xni0_exp",
"m_coef": "par.roqi0_coef",
"m_exp": "par.roqi0_exp"
}
}
},
{
"lhs": "pigen",
"rhs": {
"op": "ifelse",
"args": [
{
"op": "and",
"args": [
{
"op": ">",
"args": [
"supcol",
0
]
},
{
"op": ">",
"args": [
"supsat",
0
]
}
]
},
{
"op": "apply_expression_template",
"args": [],
"name": "adjustment_towards_target_rate",
"bindings": {
"q_target": "qi_nucleation_target",
"q": {
"op": "max",
"args": [
"sd.qi",
0
]
},
"dt": "dtcld"
}
},
0
]
}
},
{
"lhs": "pigen_lim",
"rhs": {
"op": "ifelse",
"args": [
{
"op": "and",
"args": [
{
"op": ">",
"args": [
"supcol",
0
]
},
{
"op": ">",
"args": [
"supsat",
0
]
},
{
"op": "==",
"args": [
"ifsat_g",
0
]
}
]
},
{
"op": "min",
"args": [
"pigen",
"satdt",
"supice_n"
]
},
0
]
}
},
{
"lhs": "qi_max",
"rhs": {
"op": "/",
"args": [
"roqimax",
"sd.rho"
]
}
},
{
"lhs": "psaut",
"rhs": {
"op": "ifelse",
"args": [
{
"op": "and",
"args": [
{
"op": ">",
"args": [
"supcol",
0
]
},
{
"op": ">",
"args": [
"sd.qi",
0
]
}
]
},
{
"op": "apply_expression_template",
"args": [],
"name": "excess_conversion_rate",
"bindings": {
"q": "sd.qi",
"q_max": "qi_max",
"dt": "dtcld"
}
},
0
]
}
},
{
"lhs": "pgaut",
"rhs": {
"op": "ifelse",
"args": [
{
"op": "and",
"args": [
{
"op": ">",
"args": [
"supcol",
0
]
},
{
"op": ">",
"args": [
"sd.qs",
0
]
}
]
},
{
"op": "apply_expression_template",
"args": [],
"name": "snow_to_graupel_aggregation",
"bindings": {
"qs": "sd.qs",
"qs0": "par.qs0",
"T": "sd.T",
"t0": "wrf.svpt0",
"coef": "par.pgaut_coef",
"expn": "par.pgaut_exp"
}
},
0
]
}
},
{
"lhs": "pgaut_lim",
"rhs": {
"op": "apply_expression_template",
"args": [],
"name": "sink_rate_limiter",
"bindings": {
"rate": "pgaut",
"q": "sd.qs",
"dt": "dtcld"
}
}
},
{
"lhs": "psevp",
"rhs": {
"op": "ifelse",
"args": [
{
"op": "and",
"args": [
{
"op": "<",
"args": [
"supcol",
0
]
},
{
"op": ">",
"args": [
"sd.qs",
0
]
},
{
"op": "<",
"args": [
"rh_w",
1
]
}
]
},
{
"op": "*",
"args": [
"sd.n0sfac",
{
"op": "apply_expression_template",
"args": [],
"name": "ventilated_diffusional_growth",
"bindings": {
"rh": "rh_w",
"rslope2": "sd.rslope2_s",
"coeres": "sd.coeres_s",
"f_vent": "sd.f_vent",
"f_diff": "f_diff_w",
"c1": "sd.precs1",
"c2": "sd.precs2"
}
}
]
},
0
]
}
},
{
"lhs": "psevp_lim",
"rhs": {
"op": "apply_expression_template",
"args": [],
"name": "negative_sink_limiter",
"bindings": {
"rate": "psevp",
"q": "sd.qs",
"dt": "dtcld"
}
}
},
{
"lhs": "pgevp",
"rhs": {
"op": "ifelse",
"args": [
{
"op": "and",
"args": [
{
"op": "<",
"args": [
"supcol",
0
]
},
{
"op": ">",
"args": [
"sd.qg",
0
]
},
{
"op": "<",
"args": [
"rh_w",
1
]
}
]
},
{
"op": "apply_expression_template",
"args": [],
"name": "ventilated_diffusional_growth",
"bindings": {
"rh": "rh_w",
"rslope2": "sd.rslope2_g",
"coeres": "sd.coeres_g",
"f_vent": "sd.f_vent",
"f_diff": "f_diff_w",
"c1": "sd.precg1",
"c2": "sd.precg2"
}
},
0
]
}
},
{
"lhs": "pgevp_lim",
"rhs": {
"op": "apply_expression_template",
"args": [],
"name": "negative_sink_limiter",
"bindings": {
"rate": "pgevp",
"q": "sd.qg",
"dt": "dtcld"
}
}
}
],
"tests": [
{
"id": "qss_step250_row23_col24_mixed_phase_deposition",
"description": "Reference: WRF 4.8 em_quarter_ss idealized supercell (GNU real32 build, dx = 2 km, dt = 12 s, 40 layers, WSM6 only) 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. POINTWISE and step-free: the inputs are the state at which the kernel evaluates its process rates (t_rates, q/qi/qr/qs/qg_rates after the sub-step's sedimentation, melting, freezing and slope update; den, p; the start-of-sub-step saturation block qsat_w/rh_w/qsat_i/rh_i/xl, see saturation.esm; and the applied rain evaporation prevp_raw of the warm-rain block), the expected values the rates the kernel dumps right after evaluating them (`<rate>_raw`, after the sequential vapor-budget limiters, before the mass-conservation rescaling) and the mp_wsm6_init coefficients, from the real64 replay. No small-dt replay because WSM6's increments are not rate x dt (EqWeFiC FORTRAN_BUGS.md N3). Real64 replay vs real32 dump: <= 1e-5 relative in these rates (pidep 1.0 relative only in the near-zero threshold layer 33/34 where a branch flips). Residual esm-vs-real64 mismatch from the kernel's default-real literals and real32 WRF constants (EqWeFiC FORTRAN_BUGS.md N2), measured with zero tolerances: pidep 4.8e-8, psdep 1.1e-7, pgdep 0, pgaut 7e-8 of the column maximum; pigen 7.7e-7 because it is the small difference of the nucleation target and the ice content, each carrying the 1e-7 rounding of 4.92e-11, 1.33 and 0.1 (hence rel 5e-6 on its spot checks and Linf 3e-6 of column maximum); psaut up to 1.4e-5 relative on its spot checks because it is the small difference of qi and qimax = roqimax/rho, and roqimax = 2.08e22 dimax^8 carries a 4.3e-7 rounding from the real32 dimax (hence rel 5e-5 on the psaut spot checks; its Linf bound is unaffected). Tolerances otherwise 1e-6 relative on coefficients, absolute Linf bounds on the limited whole columns at 1e-6 of each column's maximum, relative 2e-6 spot checks of the UNLIMITED rates at layers where the dumped rate lies strictly inside every limiter bound (below 0.8 of min(|satdt/2|, |supice|, q/dtcld)). Regime: supercell step 250 (t = 50 min), row j = 23, column i = 24: freezing level at layer 9; ice 9-39, snow 6-33, graupel 1-33; supersaturated over ice (satdt > 0) in layers 3-29, subsaturated above, so pidep/psdep/pgdep change sign near layer 30 and sublimate above; nucleation active 9-29, ice-to-snow aggregation 21-24 (where qi > qimax), snow-to-graupel aggregation 16-28; the vapor budget never closes (ifsat = 0 everywhere); above 0 C the column is saturated over water, so psevp = pgevp = 0.",
"parameter_overrides": {
"dtcld": 12.0
},
"expression_template_imports": [
{
"ref": "./tests/qss_step250_row23_col24_mixed_phase_deposition_inputs.esm"
}
],
"time_span": {
"start": 0.0,
"end": 1.0
},
"assertions": [
{
"variable": "roqimax",
"time": 0.0,
"expected": 8.125003470069448e-05,
"tolerance": {
"rel": 1e-06
}
},
{
"variable": "f_diff_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": [
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": "f_diff_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": [
10275300.088215007,
10925345.474037053,
10975329.369210271,
10860717.881558683,
10831196.067758035,
10884288.053027276,
10983383.828876572,
11139098.526182823,
11433819.018711753,
11954994.240828032,
12617401.959911112,
13910629.828729544,
14795867.14185319,
14967900.595213952,
16942632.69206691,
19608694.995676655,
23242128.59263491,
28564152.597323656,
36399313.91016357,
47995768.679111466,
66270435.72542983,
93543351.66386664,
132013593.75132234,
199825581.18014842,
315606213.15879345,
511846729.282323,
821335154.6633476,
1235601623.4535604,
1083582645.0307744,
255791219.8953991,
139575157.61136842,
87042762.7929738,
56823012.45866942,
40938663.8856523,
32446647.0178245,
27623783.433471188,
24505548.894618,
22097956.278372586,
19935115.44557102,
18012802.17324353
]
},
"k"
]
}
},
"tolerance": {
"abs": 2500.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.0003,
"rel": 0.0
}
},
{
"variable": "pidep_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,
1.1930109236815955e-08,
2.28574139862502e-08,
3.461378064729597e-08,
5.9243107839179676e-08,
1.1625612487355555e-07,
1.4467709750730005e-07,
2.517412971619394e-07,
3.966163449305895e-07,
5.585125965378093e-07,
7.758725566681301e-07,
1.0280163877903762e-06,
1.6244525825820097e-06,
3.072902399896806e-06,
1.5890028389893405e-06,
5.941313780669165e-07,
2.3581414599175201e-07,
8.727633839513325e-08,
6.58350383836281e-08,
2.040824717897305e-08,
6.628514960812435e-09,
2.7164161737183354e-09,
-4.3203071677696023e-10,
-8.834599612475459e-11,
-8.397110218947372e-12,
0.0,
-1.4823807253158012e-19,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 3e-12,
"rel": 0.0
}
},
{
"variable": "psdep_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,
1.755678587109673e-09,
3.735882011396122e-09,
7.117128815645085e-09,
2.2613595200731562e-08,
3.446293624650492e-07,
6.843733874339553e-07,
1.373276575634138e-06,
2.1339844099655616e-06,
2.7816149498985254e-06,
3.3743665700511196e-06,
3.8020555619086673e-06,
3.919757449844434e-06,
4.1950496218075595e-06,
3.2597723457243653e-06,
1.6999558970964606e-06,
8.955760362645541e-07,
4.3740060541277166e-07,
4.857048356104619e-07,
2.0015128520247442e-07,
8.886016283451657e-08,
3.779011309630713e-08,
-6.737549327650434e-09,
-6.669918092829754e-10,
-1.2033346200557298e-10,
-3.763661917321538e-22,
-1.0507307505923628e-21,
-1.9145302469227045e-25,
-3.1117608873105738e-37,
-2.0074301150685167e-41,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 4e-12,
"rel": 0.0
}
},
{
"variable": "pgdep_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,
1.0678130474100017e-08,
3.081146272066622e-08,
1.0545110340457697e-07,
6.326536575449655e-07,
2.571348592447746e-06,
3.1802964637781364e-06,
3.7364932384168867e-06,
3.8118154657801654e-06,
3.4434299881515366e-06,
3.0666245692528678e-06,
2.6060696110904774e-06,
2.0754360218886724e-06,
1.647710895375247e-06,
9.500709216129087e-07,
3.8285602094948565e-07,
1.5554451067447527e-07,
5.911061528582378e-08,
5.0916791404734055e-08,
1.758157905699995e-08,
6.095291718008026e-09,
2.1731230790799863e-09,
-4.958224155700323e-10,
-8.068738472086677e-11,
-4.8916617550217896e-11,
0.0,
-3.057826162715589e-19,
-3.776939419483038e-19,
-4.325646254174921e-34,
-5.856839477265805e-31,
-6.9655767419632415e-40,
-3.1712645416288503e-40,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 4e-12,
"rel": 0.0
}
},
{
"variable": "pigen_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,
3.675872821832641e-08,
4.044940219873888e-08,
7.783234129077986e-08,
1.4291096975649348e-07,
1.5891116211012256e-07,
1.746734063826214e-07,
2.9771778639235446e-07,
4.879118102246498e-07,
8.775100903073286e-07,
1.6237891324243953e-06,
3.182157112198267e-06,
3.6085823646727695e-06,
0.0,
1.1075165437634007e-05,
4.265527544988627e-06,
1.62583639310369e-06,
5.72963814775361e-07,
4.5320188980181545e-07,
1.6216145896650142e-07,
7.613635615569611e-08,
8.976926573322458e-08,
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": 3e-11,
"rel": 0.0
}
},
{
"variable": "psaut",
"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,
1.5161369974584578e-05,
8.50396274058469e-06,
3.6869346725521425e-06,
6.415887136701758e-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
]
},
"k"
]
}
},
"tolerance": {
"abs": 2e-11,
"rel": 0.0
}
},
{
"variable": "pgaut_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,
1.09061364132696e-08,
3.089716151870192e-08,
3.7688765116362814e-08,
3.589556898722078e-08,
2.9818893120149764e-08,
2.587290519185709e-08,
2.1311543822324992e-08,
1.6405650714204293e-08,
1.1587227453693448e-08,
7.663245871338603e-09,
4.956533882349148e-09,
3.0002876940791353e-09,
1.264638818671403e-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
]
},
"k"
]
}
},
"tolerance": {
"abs": 4e-14,
"rel": 0.0
}
},
{
"variable": "psevp_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": 0,
"rel": 0.0
}
},
{
"variable": "pgevp_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": 0,
"rel": 0.0
}
},
{
"variable": "ifsat_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.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
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": 0,
"rel": 0.0
}
},
{
"variable": "ifsat_g",
"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": 0,
"rel": 0.0
}
},
{
"variable": "pidep",
"time": 0.0,
"coords": {
"lev": 9
},
"expected": 1.1930109236815955e-08,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pidep",
"time": 0.0,
"coords": {
"lev": 16
},
"expected": 3.966163449305895e-07,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pidep",
"time": 0.0,
"coords": {
"lev": 24
},
"expected": 2.3581414599175201e-07,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pidep",
"time": 0.0,
"coords": {
"lev": 31
},
"expected": -8.834599612475459e-11,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "psdep",
"time": 0.0,
"coords": {
"lev": 9
},
"expected": 1.755678587109673e-09,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "psdep",
"time": 0.0,
"coords": {
"lev": 16
},
"expected": 2.1339844099655616e-06,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "psdep",
"time": 0.0,
"coords": {
"lev": 24
},
"expected": 8.955760362645541e-07,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "psdep",
"time": 0.0,
"coords": {
"lev": 30
},
"expected": -6.737549327650434e-09,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pgdep",
"time": 0.0,
"coords": {
"lev": 9
},
"expected": 1.0678130474100017e-08,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pgdep",
"time": 0.0,
"coords": {
"lev": 16
},
"expected": 3.8118154657801654e-06,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pgdep",
"time": 0.0,
"coords": {
"lev": 24
},
"expected": 1.5554451067447527e-07,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pgdep",
"time": 0.0,
"coords": {
"lev": 32
},
"expected": -4.8916617550217896e-11,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pigen",
"time": 0.0,
"coords": {
"lev": 9
},
"expected": 3.675872821832641e-08,
"tolerance": {
"rel": 5e-06
}
},
{
"variable": "pigen",
"time": 0.0,
"coords": {
"lev": 14
},
"expected": 1.746734063826214e-07,
"tolerance": {
"rel": 5e-06
}
},
{
"variable": "pigen",
"time": 0.0,
"coords": {
"lev": 20
},
"expected": 3.6085823646727695e-06,
"tolerance": {
"rel": 5e-06
}
},
{
"variable": "psaut",
"time": 0.0,
"coords": {
"lev": 21
},
"expected": 1.5161369974584578e-05,
"tolerance": {
"rel": 5e-05
}
},
{
"variable": "psaut",
"time": 0.0,
"coords": {
"lev": 22
},
"expected": 8.50396274058469e-06,
"tolerance": {
"rel": 5e-05
}
},
{
"variable": "psaut",
"time": 0.0,
"coords": {
"lev": 23
},
"expected": 3.6869346725521425e-06,
"tolerance": {
"rel": 5e-05
}
},
{
"variable": "psaut",
"time": 0.0,
"coords": {
"lev": 24
},
"expected": 6.415887136701758e-07,
"tolerance": {
"rel": 5e-05
}
},
{
"variable": "pgaut",
"time": 0.0,
"coords": {
"lev": 16
},
"expected": 1.09061364132696e-08,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pgaut",
"time": 0.0,
"coords": {
"lev": 22
},
"expected": 2.1311543822324992e-08,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pgaut",
"time": 0.0,
"coords": {
"lev": 28
},
"expected": 1.264638818671403e-09,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pidep",
"time": 0.0,
"coords": {
"lev": 1
},
"expected": 0.0,
"tolerance": {
"abs": 0,
"rel": 0.0
}
},
{
"variable": "pidep",
"time": 0.0,
"coords": {
"lev": 8
},
"expected": 0.0,
"tolerance": {
"abs": 0,
"rel": 0.0
}
}
]
},
{
"id": "qss_step250_row22_col25_mixed_phase_deposition",
"description": "Same reference chain and tolerance reasoning as qss_step250_row23_col24_mixed_phase_deposition, tile row j = 22 (call 9982), column i = 25: the strongest nucleation column of the run (pigen 21 layers, up to 1.3e-5 kg/kg/s) with ice-to-snow aggregation in layers 21-24 and snow-to-graupel aggregation 15-29; the vapor budget never closes. Measured residuals: pidep 4.8e-8, psdep 1.1e-7, pigen 7.2e-7, pgaut 6.9e-8 of column maximum.",
"parameter_overrides": {
"dtcld": 12.0
},
"expression_template_imports": [
{
"ref": "./tests/qss_step250_row22_col25_mixed_phase_deposition_inputs.esm"
}
],
"time_span": {
"start": 0.0,
"end": 1.0
},
"assertions": [
{
"variable": "pidep_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,
1.6493773174614253e-08,
3.845179246453918e-08,
5.8827354209818195e-08,
9.188355726593647e-08,
1.6157697136683683e-07,
1.946305503867547e-07,
3.021625396282328e-07,
4.580197183705498e-07,
6.186234218040911e-07,
8.394685733347795e-07,
1.0761749514399841e-06,
1.8590897029201696e-06,
3.855865152597546e-06,
2.130372090118657e-06,
8.665052441810188e-07,
3.433172313763905e-07,
1.0840251640466675e-07,
1.1510576304557073e-07,
3.831332692396314e-08,
1.1394048998877825e-08,
4.462887022936078e-09,
1.6036610441218115e-09,
-1.029766109102279e-09,
-1.416469997765122e-13,
-9.195682806413483e-13,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 4e-12,
"rel": 0.0
}
},
{
"variable": "psdep_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,
1.7856865456177923e-09,
5.172892481224201e-09,
1.778260090468922e-08,
6.71735184713936e-08,
4.600923326569122e-07,
1.1727458430062028e-06,
2.0896469957598904e-06,
3.077225809931299e-06,
3.7807747913760886e-06,
4.411648477096971e-06,
4.934835733249843e-06,
5.091016546037744e-06,
5.541900715047055e-06,
4.712237424544724e-06,
2.8484205511845124e-06,
1.4619356983045001e-06,
5.715670372929771e-07,
8.515614084367974e-07,
3.310247572736137e-07,
1.2741514505950846e-07,
7.5371526939796e-08,
2.3104178781074813e-08,
-5.933451922878888e-10,
-1.1641427245861862e-12,
-4.069704967439004e-13,
-7.601494558946204e-28,
-5.663581293312802e-44,
-3.1871727824450978e-40,
-6.17019599681657e-39,
-4.882731079042204e-41,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 6e-12,
"rel": 0.0
}
},
{
"variable": "pgdep_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,
9.262541189723276e-09,
2.9552161398396094e-08,
1.3252276665618462e-07,
7.393563462597988e-07,
2.6434692627388565e-06,
3.059752677683444e-06,
3.4923798294312543e-06,
3.6994914044160474e-06,
3.3790644197543783e-06,
3.084891099639566e-06,
2.729860887579166e-06,
2.2841099325965732e-06,
1.945990360430003e-06,
1.2819945323643767e-06,
6.217253804183859e-07,
2.544141413047798e-07,
8.0085569691661e-08,
1.0010636178076797e-07,
3.5906293204571005e-08,
1.1324055851623312e-08,
4.082763352621579e-09,
1.5448899184044272e-09,
-5.594436015638971e-11,
-6.258241935509158e-11,
-3.3363997553216528e-12,
0.0,
-2.2234442536131104e-19,
0.0,
-1.9544399925406294e-32,
-4.307678856818064e-30,
-1.0731182595135048e-30,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 4e-12,
"rel": 0.0
}
},
{
"variable": "pigen_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,
3.867038938375611e-08,
2.8671580754551563e-08,
6.340322601766163e-08,
1.3991395378834387e-07,
1.6618179809350562e-07,
2.002141922177924e-07,
3.888272698766411e-07,
6.811661633117547e-07,
1.2059446778397685e-06,
2.0896401084877653e-06,
3.957651349393301e-06,
3.4308198118412306e-06,
0.0,
1.258271048968263e-05,
5.61478316437404e-06,
2.028719784258172e-06,
5.515008920558329e-07,
6.363492836104587e-07,
2.568051371450796e-07,
1.0469704020900734e-07,
7.344246657654804e-08,
1.4055086134432898e-07,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 4e-11,
"rel": 0.0
}
},
{
"variable": "psaut",
"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,
2.101193443491071e-05,
1.1808198952406024e-05,
4.11489172060814e-06,
1.5540986876314549e-06,
0.0,
0.0,
0.0,
0.0,
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": 3e-11,
"rel": 0.0
}
},
{
"variable": "pgaut_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,
1.5453935888636158e-08,
4.7701072753719544e-08,
5.887865995105126e-08,
5.986815799703023e-08,
5.4598147905640183e-08,
4.49960771401692e-08,
3.8243070091954045e-08,
3.139961956395399e-08,
2.4889600442468976e-08,
1.8187155178967195e-08,
1.2164584704715027e-08,
7.941906946366242e-09,
4.764353380552319e-09,
2.2523647000335427e-09,
3.968086158413469e-10,
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": 6e-14,
"rel": 0.0
}
},
{
"variable": "ifsat_g",
"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": 0,
"rel": 0.0
}
},
{
"variable": "pidep",
"time": 0.0,
"coords": {
"lev": 9
},
"expected": 1.6493773174614253e-08,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pidep",
"time": 0.0,
"coords": {
"lev": 20
},
"expected": 1.8590897029201696e-06,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pidep",
"time": 0.0,
"coords": {
"lev": 31
},
"expected": -1.029766109102279e-09,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "psdep",
"time": 0.0,
"coords": {
"lev": 9
},
"expected": 1.7856865456177923e-09,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "psdep",
"time": 0.0,
"coords": {
"lev": 20
},
"expected": 5.091016546037744e-06,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "psdep",
"time": 0.0,
"coords": {
"lev": 31
},
"expected": -5.933451922878888e-10,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pgdep",
"time": 0.0,
"coords": {
"lev": 9
},
"expected": 9.262541189723276e-09,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pgdep",
"time": 0.0,
"coords": {
"lev": 20
},
"expected": 2.2841099325965732e-06,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pgdep",
"time": 0.0,
"coords": {
"lev": 32
},
"expected": -6.258241935509158e-11,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pigen",
"time": 0.0,
"coords": {
"lev": 9
},
"expected": 3.867038938375611e-08,
"tolerance": {
"rel": 5e-06
}
},
{
"variable": "pigen",
"time": 0.0,
"coords": {
"lev": 15
},
"expected": 3.888272698766411e-07,
"tolerance": {
"rel": 5e-06
}
},
{
"variable": "pigen",
"time": 0.0,
"coords": {
"lev": 20
},
"expected": 3.4308198118412306e-06,
"tolerance": {
"rel": 5e-06
}
},
{
"variable": "psaut",
"time": 0.0,
"coords": {
"lev": 21
},
"expected": 2.101193443491071e-05,
"tolerance": {
"rel": 5e-05
}
},
{
"variable": "psaut",
"time": 0.0,
"coords": {
"lev": 24
},
"expected": 1.5540986876314549e-06,
"tolerance": {
"rel": 5e-05
}
},
{
"variable": "pgaut",
"time": 0.0,
"coords": {
"lev": 15
},
"expected": 1.5453935888636158e-08,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pgaut",
"time": 0.0,
"coords": {
"lev": 22
},
"expected": 3.139961956395399e-08,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pgaut",
"time": 0.0,
"coords": {
"lev": 29
},
"expected": 3.968086158413469e-10,
"tolerance": {
"rel": 2e-06
}
}
]
},
{
"id": "qss_step200_row20_col20_evaporating_melting_precipitation",
"description": "Same reference chain and tolerance reasoning, early storm: step 200 (t = 40 min), row j = 20 (call 7980), column i = 20. Layer 8 lies just above 0 C and is subsaturated over water (rh_w < 1) while holding melting snow and graupel, so the evaporation of melting precipitation is active there: psevp = -3.0e-11 and pgevp = -5.3e-9 kg/kg/s, both unlimited; the deposition terms are weak (pgdep up to 1.1e-7) and there is no nucleation or aggregation. Measured residuals: pidep 3.2e-8, psdep 5.4e-8, pgdep/psevp/pgevp 0 of column maximum.",
"parameter_overrides": {
"dtcld": 12.0
},
"expression_template_imports": [
{
"ref": "./tests/qss_step200_row20_col20_evaporating_melting_precipitation_inputs.esm"
}
],
"time_span": {
"start": 0.0,
"end": 1.0
},
"assertions": [
{
"variable": "psevp_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,
-2.955285967961742e-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,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 3e-17,
"rel": 0.0
}
},
{
"variable": "pgevp_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,
-5.264681984078256e-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,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 5e-15,
"rel": 0.0
}
},
{
"variable": "psevp",
"time": 0.0,
"coords": {
"lev": 8
},
"expected": -2.955285967961742e-11,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pgevp",
"time": 0.0,
"coords": {
"lev": 8
},
"expected": -5.264681984078256e-09,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pidep_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,
-3.652312484120788e-23,
-5.6471709859772455e-12,
-1.4846270752723e-11,
-9.726800246986012e-11,
-2.1259203978487095e-10,
-5.945821586575083e-11,
-2.840871461878142e-11,
-1.019788564291706e-11,
-3.3911804235707477e-09,
-4.9489733190087295e-09,
-2.746583994280339e-09,
-4.8150451861957185e-12,
-1.2203746357076503e-12,
-3.9870610120190206e-14,
-1.1828778144647048e-14,
-2.237295084260541e-15,
-2.623674033103585e-13,
-3.2689108441837117e-11,
-8.672884325434198e-12,
-6.496175816079268e-22,
-1.2649338050932174e-20,
-1.8216359194136064e-23,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 5e-15,
"rel": 0.0
}
},
{
"variable": "psdep_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,
-6.231894183732195e-10,
-9.598336602855428e-09,
-2.1637908924258846e-08,
-2.416774008795367e-08,
-2.4535546592413834e-08,
-2.3007608858053432e-08,
-1.369167892833271e-08,
-5.395430562784874e-09,
-2.6370783656775815e-11,
-1.42900940866186e-11,
-6.5811570168510065e-12,
-2.633323181001309e-13,
-1.155154172995072e-13,
-2.0981737885424027e-13,
-6.2296443523574435e-12,
-6.310371861802584e-10,
-4.731197266384059e-10,
-1.9781867167627602e-10,
-2.035047566851892e-12,
-2.5969538930893642e-24,
-3.5123243369656603e-22,
-8.777776277730837e-21,
-3.430647839284567e-28,
-1.9029633145531016e-42,
-4.670994881082723e-46,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 3e-14,
"rel": 0.0
}
},
{
"variable": "pgdep_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,
-4.454685316197319e-08,
-1.0166758478540424e-07,
-1.132988458924616e-07,
-9.174091131975763e-08,
-5.6710854389290556e-08,
-3.830602087341023e-08,
-1.9920056765966697e-08,
-5.227933280658468e-09,
-7.724028905704327e-11,
-3.844065414202272e-11,
-1.931281077481662e-11,
-8.813809652558619e-13,
-8.936201975628276e-13,
-2.3965075264408743e-12,
-2.8270162966506064e-12,
-1.3625055670896548e-11,
-8.168279229245697e-11,
-6.066726756688704e-11,
-4.239176663360431e-11,
-1.902208465180821e-15,
-1.2871429692489164e-15,
-2.7892643562761234e-16,
-5.0031705544893595e-20,
-1.2627086146964678e-25,
-4.077720108025435e-33,
-2.7424111596068832e-40,
-2.9590752571659052e-43,
0.0,
0.0,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 2e-13,
"rel": 0.0
}
},
{
"variable": "pigen_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": 0,
"rel": 0.0
}
},
{
"variable": "psaut",
"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": 0,
"rel": 0.0
}
},
{
"variable": "pgaut_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": 0,
"rel": 0.0
}
},
{
"variable": "pgdep",
"time": 0.0,
"coords": {
"lev": 9
},
"expected": -4.454685316197319e-08,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pgdep",
"time": 0.0,
"coords": {
"lev": 13
},
"expected": -5.6710854389290556e-08,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pgdep",
"time": 0.0,
"coords": {
"lev": 17
},
"expected": -7.724028905704327e-11,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pgdep",
"time": 0.0,
"coords": {
"lev": 25
},
"expected": -8.168279229245697e-11,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "psdep",
"time": 0.0,
"coords": {
"lev": 10
},
"expected": -9.598336602855428e-09,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "psdep",
"time": 0.0,
"coords": {
"lev": 14
},
"expected": -2.3007608858053432e-08,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "psdep",
"time": 0.0,
"coords": {
"lev": 24
},
"expected": -6.310371861802584e-10,
"tolerance": {
"rel": 2e-06
}
}
]
},
{
"id": "scm_call120_thin_cirrus_layers_20_to_59",
"description": "Reference: WRF 4.8 em_scm_xy single-column run (GNU real32 build, dt = 60 s, 59 layers, mp = 6, sfclay = 1, slab, YSU) at call 120 (step 60, 20:00 UTC), replayed through the real64 kernels/wsm6_driver; WRF layers 20-59 mapped onto lev 1-40 (esm-spec 6.6 tests cannot rebind NLEV, and the only condensate, cloud ice qi <= 5e-5, sits in WRF layers 50-59). Ice-only regime with no precipitation: cloud-ice deposition is active in WRF layers 51-57 (lev 32-38, up to 3.3e-8 kg/kg/s, all unlimited), nucleation in WRF layers 54-55 (lev 35-36, 1.2e-9, LIMITED by the vapor budget: the unlimited adjustment rate is 1e4 times larger, so the applied pigen_lim is what is spot-checked); every snow/graupel process and the aggregations are exactly zero. Same tolerance reasoning as the supercell tests; residuals pidep 3.2e-8, pigen 1.8e-9 of column maximum.",
"parameter_overrides": {
"dtcld": 60.0
},
"expression_template_imports": [
{
"ref": "./tests/scm_call120_thin_cirrus_layers_20_to_59_inputs.esm"
}
],
"time_span": {
"start": 0.0,
"end": 1.0
},
"assertions": [
{
"variable": "pidep_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,
-1.401298464324817e-45,
-2.3401684354224445e-43,
-5.755553182521321e-41,
-1.5469070514411773e-38,
-4.55418386078679e-36,
-1.4725813482515573e-33,
-5.244398519620994e-31,
-2.063587584621368e-28,
-9.003122380846279e-26,
-7.162568187053127e-21,
-6.349660720617891e-16,
-1.873184798934019e-09,
-3.2997212336046964e-08,
-2.1763614874464703e-08,
-6.772874508937259e-10,
6.96354829403848e-11,
1.7833772823876315e-11,
-6.6606387511655175e-12,
-2.7003559888949013e-12,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 3e-14,
"rel": 0.0
}
},
{
"variable": "pigen_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,
1.2273537477855275e-09,
6.070128172977736e-10,
0.0,
0.0,
0.0,
0.0
]
},
"k"
]
}
},
"tolerance": {
"abs": 5e-15,
"rel": 0.0
}
},
{
"variable": "psdep_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": 0,
"rel": 0.0
}
},
{
"variable": "pgdep_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": 0,
"rel": 0.0
}
},
{
"variable": "psaut",
"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": 0,
"rel": 0.0
}
},
{
"variable": "pgaut_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": 0,
"rel": 0.0
}
},
{
"variable": "psevp_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": 0,
"rel": 0.0
}
},
{
"variable": "pgevp_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": 0,
"rel": 0.0
}
},
{
"variable": "pidep",
"time": 0.0,
"coords": {
"lev": 32
},
"expected": -3.2997212336046964e-08,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pidep",
"time": 0.0,
"coords": {
"lev": 35
},
"expected": 6.96354829403848e-11,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pidep",
"time": 0.0,
"coords": {
"lev": 38
},
"expected": -2.7003559888949013e-12,
"tolerance": {
"rel": 2e-06
}
},
{
"variable": "pigen_lim",
"time": 0.0,
"coords": {
"lev": 35
},
"expected": 1.2273537477855275e-09,
"tolerance": {
"rel": 5e-06
}
},
{
"variable": "pigen_lim",
"time": 0.0,
"coords": {
"lev": 36
},
"expected": 6.070128172977736e-10,
"tolerance": {
"rel": 5e-06
}
}
]
}
]
}