FuelMoistureWRFFire
Dead and live fuel moisture of the five WRF-SFIRE moisture classes (1-h, 10-h, 100-h, 1000-h dead fuel and live fuel) for one fire-grid cell, as advanced by fire_behavior's Advance_moisture_classes and averaged by Average_moisture_classes (physics/fmc_wrffire_mod.F90; Mandel et al. 2014). From the step-mean 2 m temperature, humidity and surface pressure the relative humidity follows Murphy & Koop (2005) eq. 10; without rain the Van Wagner & Pickett (1972) drying and wetting equilibrium moisture contents bracket the class moisture, which relaxes with its class time lag towards the nearer bracket (a class already between them does not move); with rain above 0.05 mm/h both brackets become the saturation moisture 2.5 and the rate is the wetting lag scaled by 1 - exp(-r/8 mm/h). Every coefficient and class table is a FireBehaviorParameters (par) entry. The physics is the time-lag ODE d m_k/dt = (equi_k - m_k)/tau_k (dfmc_dt); fire_behavior integrates it exactly over its moisture step (exponential form, or the 2nd-order Taylor form when the step covers less than 1 % of the lag), reproduced as fmc_new so the Fortran step can be tested. The cell's ground fuel moisture fmc_g is the load-weighted mean of the classes (Anderson13FuelTable w_1h .. w_live). The assimilation adjustments deltae/deltas (fmep) and their decay are transcribed; the fmc_gc initialisation branches (from the equilibrium or from the namelist) are the consumer's initial condition and are not transcribed. The EarthSciModels wildland_fire/nfdrs moisture components (NFDRS 1-h/10-h/100-h/1000-h models) are a different formulation and are not reused. Tests: cells of the instrumented test7 run with the moisture model on (fmoist_run, fmoist_freq = 1, dt_moisture = 0.5 s, so every class is in the Taylor branch; the 10 s case has no rain, so the wetting branch is transcribed but untested), real32, rel 1e-5.
Description
Dead and live fuel moisture of the five WRF-SFIRE moisture classes (1-h, 10-h, 100-h, 1000-h dead fuel and live fuel) for one fire-grid cell, as advanced by fire_behavior’s Advance_moisture_classes and averaged by Average_moisture_classes (physics/fmc_wrffire_mod.F90; Mandel et al. 2014). From the step-mean 2 m temperature, humidity and surface pressure the relative humidity follows Murphy & Koop (2005) eq. 10; without rain the Van Wagner & Pickett (1972) drying and wetting equilibrium moisture contents bracket the class moisture, which relaxes with its class time lag towards the nearer bracket (a class already between them does not move); with rain above 0.05 mm/h both brackets become the saturation moisture 2.5 and the rate is the wetting lag scaled by 1 - exp(-r/8 mm/h). Every coefficient and class table is a FireBehaviorParameters (par) entry. The physics is the time-lag ODE d m_k/dt = (equi_k - m_k)/tau_k (dfmc_dt); fire_behavior integrates it exactly over its moisture step (exponential form, or the 2nd-order Taylor form when the step covers less than 1 % of the lag), reproduced as fmc_new so the Fortran step can be tested. The cell’s ground fuel moisture fmc_g is the load-weighted mean of the classes (Anderson13FuelTable w_1h .. w_live). The assimilation adjustments deltae/deltas (fmep) and their decay are transcribed; the fmc_gc initialisation branches (from the equilibrium or from the namelist) are the consumer’s initial condition and are not transcribed. The EarthSciModels wildland_fire/nfdrs moisture components (NFDRS 1-h/10-h/100-h/1000-h models) are a different formulation and are not reused. Tests: cells of the instrumented test7 run with the moisture model on (fmoist_run, fmoist_freq = 1, dt_moisture = 0.5 s, so every class is in the Taylor branch; the 10 s case has no rain, so the wetting branch is transcribed but untested), real32, rel 1e-5.
Reference
- NCAR Community Fire Behavior Model (fire_behavior), develop @ eb77580, physics/fmc_wrffire_mod.F90 Advance_moisture_classes / Average_moisture_classes; instrumented fork ctessum-claude/fire_behavior branch earthsciml-instrumented.
- Mandel, J., Amram, S., Beezley, J.D., Kelman, G., Kochanski, A.K., Kondratenko, V.Y., Lynn, B.H., Regev, B., Vejmelka, M. (2014). Recent advances and applications of WRF-SFIRE. Nat. Hazards Earth Syst. Sci. 14, 2829-2845 (fuel moisture model).
- Van Wagner, C.E., Pickett, T.L. (1972/1985). Equations and FORTRAN program for the Canadian Forest Fire Weather Index System; Viney (1991) eqs 7-8 (equilibrium moisture content fits).
- Murphy, D.M., Koop, T. (2005). Review of the vapour pressures of ice and supercooled water for atmospheric applications. Q.J.R. Meteorol. Soc. 131, 1539-1565, eq. 10.
Parameters
| Name | Units | Default | Description |
|---|---|---|---|
rain | mm | 0.0 | Accumulated rain at the end of the moisture step (fire_rain, mm). |
rain_old | mm | 0.0 | Accumulated rain at the previous moisture step. |
t2 | K | 300.0 | 2 m temperature now. |
t2_old | K | 300.0 | 2 m temperature at the previous moisture step. |
q2 | kg/kg | 0.005 | 2 m specific humidity now. |
q2_old | kg/kg | 0.005 | 2 m specific humidity at the previous moisture step. |
psfc | Pa | 85000.0 | Surface pressure now. |
psfc_old | Pa | 85000.0 | Surface pressure at the previous moisture step. |
dt_moisture | s | 0.5 | Moisture model time step (time since the previous moisture update). |
deltae | 1 | 0.0 | Assimilated adjustment of the drying/wetting equilibria, fmep(1) (0 without data assimilation). |
deltas | 1 | 0.0 | Assimilated adjustment of the rain saturation moisture, fmep(2). |
Observed
| Name | Units | Default | Description |
|---|---|---|---|
rain_int | mm/h | Rain intensity from the accumulated rain difference over the moisture step, 3600 (rain - rain_old) / dt_moisture mm/h; 0 if dt_moisture = 0. | |
pw | Pa | Water vapour pressure q p/(eps + (1 - eps) q), eps = 0.622. | |
pws | Pa | Saturation vapour pressure over water, Murphy & Koop (2005) eq. 10. | |
rh | 1 | Relative humidity pw/pws (the diagnostic rh_fire; not capped). | |
rh_c | 1 | Relative humidity capped at 1 for the equilibrium fits (CHECK_RH = .false.). | |
hpct | 1 | Relative humidity in per cent, 100 rh_c. | |
emc_drying_pct | 1 | Van Wagner & Pickett equilibrium moisture for drying (desorption), per cent: 0.942 H^0.679 + 0.000499 e^{0.1 H} + 0.18 (21.1 + 273.15 - T)(1 - e^{-0.115 H}). | |
emc_wetting_pct | 1 | Equilibrium moisture for adsorption, per cent: 0.618 H^0.753 + 0.000454 e^{0.1 H} + 0.18 (21.1 + 273.15 - T)(1 - e^{-0.115 H}). | |
drying_lag_h | h | Drying time lag of each class (par.fmc_drying_lag_1 .. _5: 1, 10, 100, 1000 h and 1e9 h for 1-h, 10-h, 100-h, 1000-h, live). | |
wetting_lag_h | h | Wetting time lag of each class in rain (par.fmc_wetting_lag_1 .. _5: 1.4, 14, 140, 1400 h and 1e9 h). | |
saturation_moisture | 1 | Saturation moisture content reached in rain (2.5 for every class). | |
saturation_rain | mm/h | Rain intensity scale of the wetting rate (8 mm/h for every class). | |
rain_threshold | mm/h | Rain intensity below which a class sees no rain (0.05 mm/h). | |
r | mm/h | Excess rain intensity rain_int - rain_threshold of each class. | |
raining | 1 | 1 where r > 0 (wetting model active), else 0 (drying model). | |
emc_d | 1 | Upper equilibrium: in rain saturation_moisture + deltas; otherwise max(max(d, w) + deltae, 0). | |
emc_w | 1 | Lower equilibrium: in rain saturation_moisture + deltas; otherwise max(min(d, w) + deltae, 0). | |
rlag | 1/s | Inverse time lag of each class: 1/(3600 drying_lag) when dry, 1/(3600 wetting_lag) (1 - exp(-r/saturation_rain)) in rain. | |
fmc_old | 1 | Moisture content of each class at the start of the step (fmc_gc). | |
equi | 1 | Equilibrium the class relaxes towards: fmc_old clipped into [emc_w, emc_d] (a class already between the two equilibria does not move). | |
dfmc_dt | 1/s | Time-lag ODE of the class moisture: d fmc/dt = (equi - fmc) rlag, evaluated at fmc_old (Mandel et al. 2014 eq. 6). This is the physics; fire_behavior integrates it over dt_moisture with the exact exponential (or its 2nd-order Taylor form when dt rlag < 0.01), see fmc_new. | |
change | 1 | dt_moisture rlag, the fraction of the time lag covered by the step. | |
fmc_new | 1 | Moisture content after the step as fire_behavior computes it: fmc_old + (equi - fmc_old)(change (1 - change/2)) for change < TOL, else fmc_old + (equi - fmc_old)(1 - exp(-change)) – the exact solution of dfmc_dt over the step (Taylor form to 2nd order). | |
fmc_lag_h | h | Diagnostic time lag 1/(3600 rlag) (fmc_lag). | |
fmep_decay | 1 | Factor by which the assimilated adjustments fmep decay over the step: 1 - c (1 - c/2) for c = dt/(3600 FMEP_DECAY_TLAG) < TOL, else exp(-c). | |
class_weight | 1 | Load fraction of each moisture class for the cell’s fuel category (Anderson13FuelTable w_1h .. w_live). | |
fmc_g | 1 | Ground fuel moisture of the cell after the step, the class-weighted mean sum_k w_k fmc_new_k (Average_moisture_classes). | |
t_mean | K | Step-mean 2 m temperature (t2_old + t2)/2 (second-order averaging of the forcing). Named t_mean because t is the time variable. | |
p_mean | Pa | Step-mean surface pressure. | |
q_mean | kg/kg | Step-mean 2 m specific humidity. |
Observed expressions
$$ rain_{int} = \mathrm{ifelse}\left(\mathrm{>}\left(dt_{moisture}, 0.0\right), par.s_{per\,h} \cdot \frac{rain - rain_{old}}{dt_{moisture}}, 0.0 \cdot par.unit_{rain\,rate}\right) $$Rain intensity from the accumulated rain difference over the moisture step, 3600 (rain - rain_old) / dt_moisture mm/h; 0 if dt_moisture = 0.
$$ pw = \frac{q_{mean} \cdot p_{mean}}{par.fmc_{eps\,mw} + \left(1.0 - par.fmc_{eps\,mw}\right) \cdot q_{mean}} $$Water vapour pressure q p/(eps + (1 - eps) q), eps = 0.622.
$$ pws = par.unit_{pressure} \cdot e^{par.mk_{c0} + \frac{par.mk_{c1}}{\frac{t_{mean}}{par.unit_{kelvin}}} + par.mk_{c2} \cdot \ln\left(\frac{t_{mean}}{par.unit_{kelvin}}\right) + par.mk_{c3} \cdot \frac{t_{mean}}{par.unit_{kelvin}} + \mathrm{tanh}\left(par.mk_{c\,tanh} \cdot \left(\frac{t_{mean}}{par.unit_{kelvin}} - par.mk_{t\,tanh}\right)\right) \cdot \left(par.mk_{c4} + \frac{par.mk_{c5}}{\frac{t_{mean}}{par.unit_{kelvin}}} + par.mk_{c6} \cdot \ln\left(\frac{t_{mean}}{par.unit_{kelvin}}\right) + par.mk_{c7} \cdot \frac{t_{mean}}{par.unit_{kelvin}}\right)} $$Saturation vapour pressure over water, Murphy & Koop (2005) eq. 10.
$$ rh = \frac{pw}{pws} $$Relative humidity pw/pws (the diagnostic rh_fire; not capped).
$$ rh_{c} = \mathrm{min}\left(rh, 1.0\right) $$Relative humidity capped at 1 for the equilibrium fits (CHECK_RH = .false.).
$$ hpct = 100.0 \cdot rh_{c} $$Relative humidity in per cent, 100 rh_c.
$$ emc_{drying\,pct} = par.vwp_{drying\,c1} \cdot hpct^{par.vwp_{drying\,p1}} + par.vwp_{drying\,c2} \cdot e^{par.vwp_{exp\,rh} \cdot hpct} + par.vwp_{temp\,coef} \cdot \left(par.t_{ref\,vwp} - \frac{t_{mean}}{par.unit_{kelvin}}\right) \cdot \left(1.0 - e^{\left(-par.vwp_{temp\,rh}\right) \cdot hpct}\right) $$Van Wagner & Pickett equilibrium moisture for drying (desorption), per cent: 0.942 H^0.679 + 0.000499 e^{0.1 H} + 0.18 (21.1 + 273.15 - T)(1 - e^{-0.115 H}).
$$ emc_{wetting\,pct} = par.vwp_{wetting\,c1} \cdot hpct^{par.vwp_{wetting\,p1}} + par.vwp_{wetting\,c2} \cdot e^{par.vwp_{exp\,rh} \cdot hpct} + par.vwp_{temp\,coef} \cdot \left(par.t_{ref\,vwp} - \frac{t_{mean}}{par.unit_{kelvin}}\right) \cdot \left(1.0 - e^{\left(-par.vwp_{temp\,rh}\right) \cdot hpct}\right) $$Equilibrium moisture for adsorption, per cent: 0.618 H^0.753 + 0.000454 e^{0.1 H} + 0.18 (21.1 + 273.15 - T)(1 - e^{-0.115 H}).
$$ drying_{lag\,h} = \mathrm{makearray}\left(\right) $$_Drying time lag of each class (par.fmc_drying_lag_1 .. 5: 1, 10, 100, 1000 h and 1e9 h for 1-h, 10-h, 100-h, 1000-h, live).
$$ wetting_{lag\,h} = \mathrm{makearray}\left(\right) $$_Wetting time lag of each class in rain (par.fmc_wetting_lag_1 .. 5: 1.4, 14, 140, 1400 h and 1e9 h).
$$ saturation_{moisture} = \mathrm{faq}\left(\right) $$Saturation moisture content reached in rain (2.5 for every class).
$$ saturation_{rain} = \mathrm{faq}\left(\right) $$Rain intensity scale of the wetting rate (8 mm/h for every class).
$$ rain_{threshold} = \mathrm{faq}\left(\right) $$Rain intensity below which a class sees no rain (0.05 mm/h).
$$ r = rain_{int} - rain_{threshold} $$Excess rain intensity rain_int - rain_threshold of each class.
$$ raining = \mathrm{ifelse}\left(\mathrm{>}\left(r, 0.0\right), 1.0, 0.0\right) $$1 where r > 0 (wetting model active), else 0 (drying model).
$$ emc_{d} = \mathrm{ifelse}\left(\mathrm{>}\left(r, 0.0\right), saturation_{moisture} + deltas, \mathrm{max}\left(0.01 \cdot \mathrm{max}\left(emc_{drying\,pct}, emc_{wetting\,pct}\right) + deltae, 0.0\right)\right) $$Upper equilibrium: in rain saturation_moisture + deltas; otherwise max(max(d, w) + deltae, 0).
$$ emc_{w} = \mathrm{ifelse}\left(\mathrm{>}\left(r, 0.0\right), saturation_{moisture} + deltas, \mathrm{max}\left(0.01 \cdot \mathrm{min}\left(emc_{drying\,pct}, emc_{wetting\,pct}\right) + deltae, 0.0\right)\right) $$Lower equilibrium: in rain saturation_moisture + deltas; otherwise max(min(d, w) + deltae, 0).
$$ rlag = \mathrm{ifelse}\left(\mathrm{>}\left(r, 0.0\right), \frac{1.0}{par.s_{per\,h} \cdot wetting_{lag\,h}} \cdot \left(1.0 - e^{\frac{-r}{saturation_{rain}}}\right), \frac{1.0}{par.s_{per\,h} \cdot drying_{lag\,h}}\right) $$Inverse time lag of each class: 1/(3600 drying_lag) when dry, 1/(3600 wetting_lag) (1 - exp(-r/saturation_rain)) in rain.
$$ fmc_{old} = \mathrm{input_fmc_old}\left(\right) $$Moisture content of each class at the start of the step (fmc_gc).
$$ equi = \mathrm{max}\left(\mathrm{min}\left(fmc_{old}, emc_{d}\right), emc_{w}\right) $$Equilibrium the class relaxes towards: fmc_old clipped into [emc_w, emc_d] (a class already between the two equilibria does not move).
$$ dfmc_{dt} = \left(equi - fmc_{old}\right) \cdot rlag $$Time-lag ODE of the class moisture: d fmc/dt = (equi - fmc) rlag, evaluated at fmc_old (Mandel et al. 2014 eq. 6). This is the physics; fire_behavior integrates it over dt_moisture with the exact exponential (or its 2nd-order Taylor form when dt rlag < 0.01), see fmc_new.
$$ change = dt_{moisture} \cdot rlag $$dt_moisture rlag, the fraction of the time lag covered by the step.
$$ fmc_{new} = \mathrm{ifelse}\left(\mathrm{<}\left(change, par.fmc_{tol}\right), fmc_{old} + \left(equi - fmc_{old}\right) \cdot change \cdot \left(1.0 - 0.5 \cdot change\right), fmc_{old} + \left(equi - fmc_{old}\right) \cdot \left(1.0 - e^{-change}\right)\right) $$Moisture content after the step as fire_behavior computes it: fmc_old + (equi - fmc_old)(change (1 - change/2)) for change < TOL, else fmc_old + (equi - fmc_old)(1 - exp(-change)) – the exact solution of dfmc_dt over the step (Taylor form to 2nd order).
$$ fmc_{lag\,h} = \frac{1.0}{par.s_{per\,h} \cdot rlag} $$Diagnostic time lag 1/(3600 rlag) (fmc_lag).
$$ fmep_{decay} = \mathrm{ifelse}\left(\mathrm{<}\left(\frac{dt_{moisture}}{par.fmep_{decay\,tlag\,h} \cdot par.s_{per\,h}}, par.fmc_{tol}\right), 1.0 - \frac{dt_{moisture}}{par.fmep_{decay\,tlag\,h} \cdot par.s_{per\,h}} \cdot \left(1.0 - 0.5 \cdot \frac{dt_{moisture}}{par.fmep_{decay\,tlag\,h} \cdot par.s_{per\,h}}\right), e^{-\frac{dt_{moisture}}{par.fmep_{decay\,tlag\,h} \cdot par.s_{per\,h}}}\right) $$Factor by which the assimilated adjustments fmep decay over the step: 1 - c (1 - c/2) for c = dt/(3600 FMEP_DECAY_TLAG) < TOL, else exp(-c).
$$ class_{weight} = \mathrm{input_class_weight}\left(\right) $$Load fraction of each moisture class for the cell’s fuel category (Anderson13FuelTable w_1h .. w_live).
$$ fmc_{g} = \mathrm{faq}\left(\right) $$Ground fuel moisture of the cell after the step, the class-weighted mean sum_k w_k fmc_new_k (Average_moisture_classes).
$$ t_{mean} = 0.5 \cdot \left(t2_{old} + t2\right) $$Step-mean 2 m temperature (t2_old + t2)/2 (second-order averaging of the forcing). Named t_mean because t is the time variable.
Step-mean surface pressure.
$$ q_{mean} = 0.5 \cdot \left(q2_{old} + q2\right) $$Step-mean 2 m specific humidity.
Raw .esm
Raw .esm JSON (this component)
{
"subsystems": {
"par": {
"ref": "./fire_behavior_parameters.esm"
}
},
"variables": {
"rain": {
"type": "parameter",
"units": "mm",
"default": 0.0,
"description": "Accumulated rain at the end of the moisture step (fire_rain, mm)."
},
"rain_old": {
"type": "parameter",
"units": "mm",
"default": 0.0,
"description": "Accumulated rain at the previous moisture step."
},
"t2": {
"type": "parameter",
"units": "K",
"default": 300.0,
"description": "2 m temperature now."
},
"t2_old": {
"type": "parameter",
"units": "K",
"default": 300.0,
"description": "2 m temperature at the previous moisture step."
},
"q2": {
"type": "parameter",
"units": "kg/kg",
"default": 0.005,
"description": "2 m specific humidity now."
},
"q2_old": {
"type": "parameter",
"units": "kg/kg",
"default": 0.005,
"description": "2 m specific humidity at the previous moisture step."
},
"psfc": {
"type": "parameter",
"units": "Pa",
"default": 85000.0,
"description": "Surface pressure now."
},
"psfc_old": {
"type": "parameter",
"units": "Pa",
"default": 85000.0,
"description": "Surface pressure at the previous moisture step."
},
"dt_moisture": {
"type": "parameter",
"units": "s",
"default": 0.5,
"description": "Moisture model time step (time since the previous moisture update)."
},
"deltae": {
"type": "parameter",
"units": "1",
"default": 0.0,
"description": "Assimilated adjustment of the drying/wetting equilibria, fmep(1) (0 without data assimilation)."
},
"deltas": {
"type": "parameter",
"units": "1",
"default": 0.0,
"description": "Assimilated adjustment of the rain saturation moisture, fmep(2)."
},
"rain_int": {
"type": "unknown",
"units": "mm/h",
"description": "Rain intensity from the accumulated rain difference over the moisture step, 3600 (rain - rain_old) / dt_moisture mm/h; 0 if dt_moisture = 0."
},
"pw": {
"type": "unknown",
"units": "Pa",
"description": "Water vapour pressure q p/(eps + (1 - eps) q), eps = 0.622."
},
"pws": {
"type": "unknown",
"units": "Pa",
"description": "Saturation vapour pressure over water, Murphy & Koop (2005) eq. 10."
},
"rh": {
"type": "unknown",
"units": "1",
"description": "Relative humidity pw/pws (the diagnostic rh_fire; not capped)."
},
"rh_c": {
"type": "unknown",
"units": "1",
"description": "Relative humidity capped at 1 for the equilibrium fits (CHECK_RH = .false.)."
},
"hpct": {
"type": "unknown",
"units": "1",
"description": "Relative humidity in per cent, 100 rh_c."
},
"emc_drying_pct": {
"type": "unknown",
"units": "1",
"description": "Van Wagner & Pickett equilibrium moisture for drying (desorption), per cent: 0.942 H^0.679 + 0.000499 e^{0.1 H} + 0.18 (21.1 + 273.15 - T)(1 - e^{-0.115 H})."
},
"emc_wetting_pct": {
"type": "unknown",
"units": "1",
"description": "Equilibrium moisture for adsorption, per cent: 0.618 H^0.753 + 0.000454 e^{0.1 H} + 0.18 (21.1 + 273.15 - T)(1 - e^{-0.115 H})."
},
"drying_lag_h": {
"type": "unknown",
"units": "h",
"description": "Drying time lag of each class (par.fmc_drying_lag_1 .. _5: 1, 10, 100, 1000 h and 1e9 h for 1-h, 10-h, 100-h, 1000-h, live).",
"shape": [
"fmc_class"
]
},
"wetting_lag_h": {
"type": "unknown",
"units": "h",
"description": "Wetting time lag of each class in rain (par.fmc_wetting_lag_1 .. _5: 1.4, 14, 140, 1400 h and 1e9 h).",
"shape": [
"fmc_class"
]
},
"saturation_moisture": {
"type": "unknown",
"units": "1",
"description": "Saturation moisture content reached in rain (2.5 for every class).",
"shape": [
"fmc_class"
]
},
"saturation_rain": {
"type": "unknown",
"units": "mm/h",
"description": "Rain intensity scale of the wetting rate (8 mm/h for every class).",
"shape": [
"fmc_class"
]
},
"rain_threshold": {
"type": "unknown",
"units": "mm/h",
"description": "Rain intensity below which a class sees no rain (0.05 mm/h).",
"shape": [
"fmc_class"
]
},
"r": {
"type": "unknown",
"units": "mm/h",
"description": "Excess rain intensity rain_int - rain_threshold of each class.",
"shape": [
"fmc_class"
]
},
"raining": {
"type": "unknown",
"units": "1",
"description": "1 where r > 0 (wetting model active), else 0 (drying model).",
"shape": [
"fmc_class"
]
},
"emc_d": {
"type": "unknown",
"units": "1",
"description": "Upper equilibrium: in rain saturation_moisture + deltas; otherwise max(max(d, w) + deltae, 0).",
"shape": [
"fmc_class"
]
},
"emc_w": {
"type": "unknown",
"units": "1",
"description": "Lower equilibrium: in rain saturation_moisture + deltas; otherwise max(min(d, w) + deltae, 0).",
"shape": [
"fmc_class"
]
},
"rlag": {
"type": "unknown",
"units": "1/s",
"description": "Inverse time lag of each class: 1/(3600 drying_lag) when dry, 1/(3600 wetting_lag) (1 - exp(-r/saturation_rain)) in rain.",
"shape": [
"fmc_class"
]
},
"fmc_old": {
"type": "unknown",
"units": "1",
"description": "Moisture content of each class at the start of the step (fmc_gc).",
"shape": [
"fmc_class"
]
},
"equi": {
"type": "unknown",
"units": "1",
"description": "Equilibrium the class relaxes towards: fmc_old clipped into [emc_w, emc_d] (a class already between the two equilibria does not move).",
"shape": [
"fmc_class"
]
},
"dfmc_dt": {
"type": "unknown",
"units": "1/s",
"description": "Time-lag ODE of the class moisture: d fmc/dt = (equi - fmc) rlag, evaluated at fmc_old (Mandel et al. 2014 eq. 6). This is the physics; fire_behavior integrates it over dt_moisture with the exact exponential (or its 2nd-order Taylor form when dt rlag < 0.01), see fmc_new.",
"shape": [
"fmc_class"
]
},
"change": {
"type": "unknown",
"units": "1",
"description": "dt_moisture rlag, the fraction of the time lag covered by the step.",
"shape": [
"fmc_class"
]
},
"fmc_new": {
"type": "unknown",
"units": "1",
"description": "Moisture content after the step as fire_behavior computes it: fmc_old + (equi - fmc_old)(change (1 - change/2)) for change < TOL, else fmc_old + (equi - fmc_old)(1 - exp(-change)) -- the exact solution of dfmc_dt over the step (Taylor form to 2nd order).",
"shape": [
"fmc_class"
]
},
"fmc_lag_h": {
"type": "unknown",
"units": "h",
"description": "Diagnostic time lag 1/(3600 rlag) (fmc_lag).",
"shape": [
"fmc_class"
]
},
"fmep_decay": {
"type": "unknown",
"units": "1",
"description": "Factor by which the assimilated adjustments fmep decay over the step: 1 - c (1 - c/2) for c = dt/(3600 FMEP_DECAY_TLAG) < TOL, else exp(-c)."
},
"class_weight": {
"type": "unknown",
"units": "1",
"description": "Load fraction of each moisture class for the cell's fuel category (Anderson13FuelTable w_1h .. w_live).",
"shape": [
"fmc_class"
]
},
"fmc_g": {
"type": "unknown",
"units": "1",
"description": "Ground fuel moisture of the cell after the step, the class-weighted mean sum_k w_k fmc_new_k (Average_moisture_classes)."
},
"t_mean": {
"type": "unknown",
"units": "K",
"description": "Step-mean 2 m temperature (t2_old + t2)/2 (second-order averaging of the forcing). Named t_mean because `t` is the time variable."
},
"p_mean": {
"type": "unknown",
"units": "Pa",
"description": "Step-mean surface pressure."
},
"q_mean": {
"type": "unknown",
"units": "kg/kg",
"description": "Step-mean 2 m specific humidity."
}
},
"equations": [
{
"lhs": "rain_int",
"rhs": {
"op": "ifelse",
"args": [
{
"op": ">",
"args": [
"dt_moisture",
0.0
]
},
{
"op": "*",
"args": [
"par.s_per_h",
{
"op": "/",
"args": [
{
"op": "-",
"args": [
"rain",
"rain_old"
]
},
"dt_moisture"
]
}
]
},
{
"op": "*",
"args": [
0.0,
"par.unit_rain_rate"
]
}
]
}
},
{
"lhs": "t_mean",
"rhs": {
"op": "*",
"args": [
0.5,
{
"op": "+",
"args": [
"t2_old",
"t2"
]
}
]
}
},
{
"lhs": "p_mean",
"rhs": {
"op": "*",
"args": [
0.5,
{
"op": "+",
"args": [
"psfc_old",
"psfc"
]
}
]
}
},
{
"lhs": "q_mean",
"rhs": {
"op": "*",
"args": [
0.5,
{
"op": "+",
"args": [
"q2_old",
"q2"
]
}
]
}
},
{
"lhs": "pw",
"rhs": {
"op": "/",
"args": [
{
"op": "*",
"args": [
"q_mean",
"p_mean"
]
},
{
"op": "+",
"args": [
"par.fmc_eps_mw",
{
"op": "*",
"args": [
{
"op": "-",
"args": [
1.0,
"par.fmc_eps_mw"
]
},
"q_mean"
]
}
]
}
]
}
},
{
"lhs": "pws",
"rhs": {
"op": "*",
"args": [
"par.unit_pressure",
{
"op": "exp",
"args": [
{
"op": "+",
"args": [
"par.mk_c0",
{
"op": "/",
"args": [
"par.mk_c1",
{
"op": "/",
"args": [
"t_mean",
"par.unit_kelvin"
]
}
]
},
{
"op": "*",
"args": [
"par.mk_c2",
{
"op": "log",
"args": [
{
"op": "/",
"args": [
"t_mean",
"par.unit_kelvin"
]
}
]
}
]
},
{
"op": "*",
"args": [
"par.mk_c3",
{
"op": "/",
"args": [
"t_mean",
"par.unit_kelvin"
]
}
]
},
{
"op": "*",
"args": [
{
"op": "tanh",
"args": [
{
"op": "*",
"args": [
"par.mk_c_tanh",
{
"op": "-",
"args": [
{
"op": "/",
"args": [
"t_mean",
"par.unit_kelvin"
]
},
"par.mk_t_tanh"
]
}
]
}
]
},
{
"op": "+",
"args": [
"par.mk_c4",
{
"op": "/",
"args": [
"par.mk_c5",
{
"op": "/",
"args": [
"t_mean",
"par.unit_kelvin"
]
}
]
},
{
"op": "*",
"args": [
"par.mk_c6",
{
"op": "log",
"args": [
{
"op": "/",
"args": [
"t_mean",
"par.unit_kelvin"
]
}
]
}
]
},
{
"op": "*",
"args": [
"par.mk_c7",
{
"op": "/",
"args": [
"t_mean",
"par.unit_kelvin"
]
}
]
}
]
}
]
}
]
}
]
}
]
}
},
{
"lhs": "rh",
"rhs": {
"op": "/",
"args": [
"pw",
"pws"
]
}
},
{
"lhs": "rh_c",
"rhs": {
"op": "min",
"args": [
"rh",
1.0
]
}
},
{
"lhs": "hpct",
"rhs": {
"op": "*",
"args": [
100.0,
"rh_c"
]
}
},
{
"lhs": "emc_drying_pct",
"rhs": {
"op": "+",
"args": [
{
"op": "*",
"args": [
"par.vwp_drying_c1",
{
"op": "^",
"args": [
"hpct",
"par.vwp_drying_p1"
]
}
]
},
{
"op": "*",
"args": [
"par.vwp_drying_c2",
{
"op": "exp",
"args": [
{
"op": "*",
"args": [
"par.vwp_exp_rh",
"hpct"
]
}
]
}
]
},
{
"op": "*",
"args": [
"par.vwp_temp_coef",
{
"op": "-",
"args": [
"par.t_ref_vwp",
{
"op": "/",
"args": [
"t_mean",
"par.unit_kelvin"
]
}
]
},
{
"op": "-",
"args": [
1.0,
{
"op": "exp",
"args": [
{
"op": "*",
"args": [
{
"op": "-",
"args": [
"par.vwp_temp_rh"
]
},
"hpct"
]
}
]
}
]
}
]
}
]
}
},
{
"lhs": "emc_wetting_pct",
"rhs": {
"op": "+",
"args": [
{
"op": "*",
"args": [
"par.vwp_wetting_c1",
{
"op": "^",
"args": [
"hpct",
"par.vwp_wetting_p1"
]
}
]
},
{
"op": "*",
"args": [
"par.vwp_wetting_c2",
{
"op": "exp",
"args": [
{
"op": "*",
"args": [
"par.vwp_exp_rh",
"hpct"
]
}
]
}
]
},
{
"op": "*",
"args": [
"par.vwp_temp_coef",
{
"op": "-",
"args": [
"par.t_ref_vwp",
{
"op": "/",
"args": [
"t_mean",
"par.unit_kelvin"
]
}
]
},
{
"op": "-",
"args": [
1.0,
{
"op": "exp",
"args": [
{
"op": "*",
"args": [
{
"op": "-",
"args": [
"par.vwp_temp_rh"
]
},
"hpct"
]
}
]
}
]
}
]
}
]
}
},
{
"lhs": "drying_lag_h",
"rhs": {
"op": "makearray",
"args": [],
"regions": [
[
[
1,
1
]
],
[
[
2,
2
]
],
[
[
3,
3
]
],
[
[
4,
4
]
],
[
[
5,
5
]
]
],
"values": [
"par.fmc_drying_lag_1",
"par.fmc_drying_lag_2",
"par.fmc_drying_lag_3",
"par.fmc_drying_lag_4",
"par.fmc_drying_lag_5"
]
}
},
{
"lhs": "wetting_lag_h",
"rhs": {
"op": "makearray",
"args": [],
"regions": [
[
[
1,
1
]
],
[
[
2,
2
]
],
[
[
3,
3
]
],
[
[
4,
4
]
],
[
[
5,
5
]
]
],
"values": [
"par.fmc_wetting_lag_1",
"par.fmc_wetting_lag_2",
"par.fmc_wetting_lag_3",
"par.fmc_wetting_lag_4",
"par.fmc_wetting_lag_5"
]
}
},
{
"lhs": "saturation_moisture",
"rhs": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "fmc_class"
}
},
"expr": "par.fmc_saturation_moisture"
}
},
{
"lhs": "saturation_rain",
"rhs": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "fmc_class"
}
},
"expr": "par.fmc_saturation_rain"
}
},
{
"lhs": "rain_threshold",
"rhs": {
"op": "faq",
"output_idx": [
"k"
],
"args": [],
"ranges": {
"k": {
"from": "fmc_class"
}
},
"expr": "par.fmc_rain_threshold"
}
},
{
"lhs": "r",
"rhs": {
"op": "-",
"args": [
"rain_int",
"rain_threshold"
]
}
},
{
"lhs": "raining",
"rhs": {
"op": "ifelse",
"args": [
{
"op": ">",
"args": [
"r",
0.0
]
},
1.0,
0.0
]
}
},
{
"lhs": "emc_d",
"rhs": {
"op": "ifelse",
"args": [
{
"op": ">",
"args": [
"r",
0.0
]
},
{
"op": "+",
"args": [
"saturation_moisture",
"deltas"
]
},
{
"op": "max",
"args": [
{
"op": "+",
"args": [
{
"op": "*",
"args": [
0.01,
{
"op": "max",
"args": [
"emc_drying_pct",
"emc_wetting_pct"
]
}
]
},
"deltae"
]
},
0.0
]
}
]
}
},
{
"lhs": "emc_w",
"rhs": {
"op": "ifelse",
"args": [
{
"op": ">",
"args": [
"r",
0.0
]
},
{
"op": "+",
"args": [
"saturation_moisture",
"deltas"
]
},
{
"op": "max",
"args": [
{
"op": "+",
"args": [
{
"op": "*",
"args": [
0.01,
{
"op": "min",
"args": [
"emc_drying_pct",
"emc_wetting_pct"
]
}
]
},
"deltae"
]
},
0.0
]
}
]
}
},
{
"lhs": "rlag",
"rhs": {
"op": "ifelse",
"args": [
{
"op": ">",
"args": [
"r",
0.0
]
},
{
"op": "*",
"args": [
{
"op": "/",
"args": [
1.0,
{
"op": "*",
"args": [
"par.s_per_h",
"wetting_lag_h"
]
}
]
},
{
"op": "-",
"args": [
1.0,
{
"op": "exp",
"args": [
{
"op": "/",
"args": [
{
"op": "-",
"args": [
"r"
]
},
"saturation_rain"
]
}
]
}
]
}
]
},
{
"op": "/",
"args": [
1.0,
{
"op": "*",
"args": [
"par.s_per_h",
"drying_lag_h"
]
}
]
}
]
}
},
{
"lhs": "fmc_old",
"rhs": {
"op": "input_fmc_old",
"args": []
}
},
{
"lhs": "equi",
"rhs": {
"op": "max",
"args": [
{
"op": "min",
"args": [
"fmc_old",
"emc_d"
]
},
"emc_w"
]
}
},
{
"lhs": "dfmc_dt",
"rhs": {
"op": "*",
"args": [
{
"op": "-",
"args": [
"equi",
"fmc_old"
]
},
"rlag"
]
}
},
{
"lhs": "change",
"rhs": {
"op": "*",
"args": [
"dt_moisture",
"rlag"
]
}
},
{
"lhs": "fmc_new",
"rhs": {
"op": "ifelse",
"args": [
{
"op": "<",
"args": [
"change",
"par.fmc_tol"
]
},
{
"op": "+",
"args": [
"fmc_old",
{
"op": "*",
"args": [
{
"op": "-",
"args": [
"equi",
"fmc_old"
]
},
"change",
{
"op": "-",
"args": [
1.0,
{
"op": "*",
"args": [
0.5,
"change"
]
}
]
}
]
}
]
},
{
"op": "+",
"args": [
"fmc_old",
{
"op": "*",
"args": [
{
"op": "-",
"args": [
"equi",
"fmc_old"
]
},
{
"op": "-",
"args": [
1.0,
{
"op": "exp",
"args": [
{
"op": "-",
"args": [
"change"
]
}
]
}
]
}
]
}
]
}
]
}
},
{
"lhs": "fmc_lag_h",
"rhs": {
"op": "/",
"args": [
1.0,
{
"op": "*",
"args": [
"par.s_per_h",
"rlag"
]
}
]
}
},
{
"lhs": "fmep_decay",
"rhs": {
"op": "ifelse",
"args": [
{
"op": "<",
"args": [
{
"op": "/",
"args": [
"dt_moisture",
{
"op": "*",
"args": [
"par.fmep_decay_tlag_h",
"par.s_per_h"
]
}
]
},
"par.fmc_tol"
]
},
{
"op": "-",
"args": [
1.0,
{
"op": "*",
"args": [
{
"op": "/",
"args": [
"dt_moisture",
{
"op": "*",
"args": [
"par.fmep_decay_tlag_h",
"par.s_per_h"
]
}
]
},
{
"op": "-",
"args": [
1.0,
{
"op": "*",
"args": [
0.5,
{
"op": "/",
"args": [
"dt_moisture",
{
"op": "*",
"args": [
"par.fmep_decay_tlag_h",
"par.s_per_h"
]
}
]
}
]
}
]
}
]
}
]
},
{
"op": "exp",
"args": [
{
"op": "-",
"args": [
{
"op": "/",
"args": [
"dt_moisture",
{
"op": "*",
"args": [
"par.fmep_decay_tlag_h",
"par.s_per_h"
]
}
]
}
]
}
]
}
]
}
},
{
"lhs": "class_weight",
"rhs": {
"op": "input_class_weight",
"args": []
}
},
{
"lhs": "fmc_g",
"rhs": {
"op": "faq",
"output_idx": [],
"args": [],
"ranges": {
"k": {
"from": "fmc_class"
}
},
"expr": {
"op": "*",
"args": [
{
"op": "index",
"args": [
"class_weight",
"k"
]
},
{
"op": "index",
"args": [
"fmc_new",
"k"
]
}
]
}
}
}
],
"tests": [
{
"id": "moisture_run_step20_short_grass_dry_air",
"description": "Reference: NCAR fire_behavior (develop @ eb77580, default real32 build, gfortran 13.3 -O2 in the EqWeFiC container) running its test7 case (80x80 fire cells of 25 m, dt = 0.5 s, num_tiles = 1), dumped in-model by the ctessum-claude/fire_behavior fork (branch earthsciml-instrumented, commit c9dda02, based on NCAR fire_behavior eb77580, three commits before v1.0.0; -DESM_DUMP=ON; summary output bit-identical to the uninstrumented build). Single-precision source: rel 1e-5 (the tolerance contract for a single-precision reference), abs 1e-7 where a value is exactly 0 or 1. Regime: moisture run (namelist fmoist_run = .true., fmoist_freq = 1: the moisture model advances every 0.5 s step), fmc dump at step 20, cell (i,j) = (40, 40) (Anderson category 1); dry, hot afternoon air (rh 0.08-0.11, T 310-320 K), no rain, so every class is in the drying branch with change = dt rlag << TOL (2nd-order Taylor step); the dead classes sit at the drying equilibrium, the live class relaxes from 0.30 with its 1e9 h lag. Class inputs (fmc_gc before the step) and the category's class weights (fmc_avg dump) are injected as fmc_class-shaped fields.",
"parameter_overrides": {
"rain": 0.0,
"rain_old": 0.0,
"t2": 310.29180908203125,
"t2_old": 310.29180908203125,
"q2": 0.0052487109787762165,
"q2_old": 0.0052487109787762165,
"psfc": 84570.015625,
"psfc_old": 84570.015625,
"dt_moisture": 0.5,
"deltae": 0.0,
"deltas": 0.0
},
"expression_template_imports": [
{
"ref": "./tests/moisture_run_step20_short_grass_dry_air_inputs.esm"
}
],
"time_span": {
"start": 0,
"end": 1
},
"tolerance": {
"rel": 1e-05
},
"assertions": [
{
"variable": "rain_int",
"time": 0.0,
"expected": 0.0,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "t_mean",
"time": 0.0,
"expected": 310.29180908203125,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "p_mean",
"time": 0.0,
"expected": 84570.015625,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "q_mean",
"time": 0.0,
"expected": 0.0052487109787762165,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "pw",
"time": 0.0,
"expected": 711.3701171875,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "pws",
"time": 0.0,
"expected": 6330.513671875,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "rh",
"time": 0.0,
"expected": 0.11237162351608276,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "emc_d",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 0.027761340141296387,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_d",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 0.027761340141296387,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_d",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 0.027761340141296387,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_d",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 0.027761340141296387,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_d",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 0.027761340141296387,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_w",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 0.017275290563702583,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_w",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 0.017275290563702583,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_w",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 0.017275290563702583,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_w",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 0.017275290563702583,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_w",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 0.017275290563702583,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "rlag",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 0.00027777778450399637,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "rlag",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 2.7777778086601757e-05,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "rlag",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 2.7777778086601757e-06,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "rlag",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 2.7777778655035945e-07,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "rlag",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 2.7777777365615985e-13,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "equi",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 0.02374621480703354,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "equi",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 0.02374621480703354,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "equi",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 0.02374621480703354,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "equi",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 0.02374621480703354,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "equi",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 0.027761340141296387,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "change",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 0.00013888889225199819,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "change",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 1.3888889043300878e-05,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "change",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 1.3888889043300878e-06,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "change",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 1.3888889327517973e-07,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "change",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 1.3888888682807993e-13,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_new",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 0.02374621480703354,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_new",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 0.02374621480703354,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_new",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 0.02374621480703354,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_new",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 0.02374621480703354,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_new",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 0.30000001192092896,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_lag_h",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 1.0,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_lag_h",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 10.0,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_lag_h",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 100.0,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_lag_h",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 999.9999389648438,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_lag_h",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 1000000000.0,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "r",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": -0.05000000074505806,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "r",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": -0.05000000074505806,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "r",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": -0.05000000074505806,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "r",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": -0.05000000074505806,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "r",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": -0.05000000074505806,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_g",
"time": 0.0,
"expected": 0.02374621480703354,
"tolerance": {
"rel": 1e-05
}
}
]
},
{
"id": "moisture_run_step20_timber_grass_understory",
"description": "Reference: NCAR fire_behavior (develop @ eb77580, default real32 build, gfortran 13.3 -O2 in the EqWeFiC container) running its test7 case (80x80 fire cells of 25 m, dt = 0.5 s, num_tiles = 1), dumped in-model by the ctessum-claude/fire_behavior fork (branch earthsciml-instrumented, commit c9dda02, based on NCAR fire_behavior eb77580, three commits before v1.0.0; -DESM_DUMP=ON; summary output bit-identical to the uninstrumented build). Single-precision source: rel 1e-5 (the tolerance contract for a single-precision reference), abs 1e-7 where a value is exactly 0 or 1. Regime: moisture run (namelist fmoist_run = .true., fmoist_freq = 1: the moisture model advances every 0.5 s step), fmc dump at step 20, cell (i,j) = (18, 64) (Anderson category 2); dry, hot afternoon air (rh 0.08-0.11, T 310-320 K), no rain, so every class is in the drying branch with change = dt rlag << TOL (2nd-order Taylor step); the dead classes sit at the drying equilibrium, the live class relaxes from 0.30 with its 1e9 h lag. Class inputs (fmc_gc before the step) and the category's class weights (fmc_avg dump) are injected as fmc_class-shaped fields.",
"parameter_overrides": {
"rain": 0.0,
"rain_old": 0.0,
"t2": 318.25555419921875,
"t2_old": 318.25555419921875,
"q2": 0.005505851469933987,
"q2_old": 0.005505851469933987,
"psfc": 84605.171875,
"psfc_old": 84605.171875,
"dt_moisture": 0.5,
"deltae": 0.0,
"deltas": 0.0
},
"expression_template_imports": [
{
"ref": "./tests/moisture_run_step20_timber_grass_understory_inputs.esm"
}
],
"time_span": {
"start": 0,
"end": 1
},
"tolerance": {
"rel": 1e-05
},
"assertions": [
{
"variable": "rain_int",
"time": 0.0,
"expected": 0.0,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "t_mean",
"time": 0.0,
"expected": 318.25555419921875,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "p_mean",
"time": 0.0,
"expected": 84605.171875,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "q_mean",
"time": 0.0,
"expected": 0.005505851469933987,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "pw",
"time": 0.0,
"expected": 746.4149169921875,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "pws",
"time": 0.0,
"expected": 9646.5673828125,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "rh",
"time": 0.0,
"expected": 0.07737621665000916,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "emc_d",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 0.012341680005192757,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_d",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 0.012341680005192757,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_d",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 0.012341680005192757,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_d",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 0.012341680005192757,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_d",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 0.012341680005192757,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_w",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 0.003394970903173089,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_w",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 0.003394970903173089,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_w",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 0.003394970903173089,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_w",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 0.003394970903173089,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_w",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 0.003394970903173089,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "rlag",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 0.00027777778450399637,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "rlag",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 2.7777778086601757e-05,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "rlag",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 2.7777778086601757e-06,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "rlag",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 2.7777778655035945e-07,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "rlag",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 2.7777777365615985e-13,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "equi",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 0.012341680005192757,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "equi",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 0.012341680005192757,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "equi",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 0.012341680005192757,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "equi",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 0.012341680005192757,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "equi",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 0.012341680005192757,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "change",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 0.00013888889225199819,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "change",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 1.3888889043300878e-05,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "change",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 1.3888889043300878e-06,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "change",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 1.3888889327517973e-07,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "change",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 1.3888888682807993e-13,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_new",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 0.023829618468880653,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_new",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 0.023833200335502625,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_new",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 0.023833557963371277,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_new",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 0.02383359521627426,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_new",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 0.30000001192092896,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_lag_h",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 1.0,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_lag_h",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 10.0,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_lag_h",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 100.0,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_lag_h",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 999.9999389648438,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_lag_h",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 1000000000.0,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "r",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": -0.05000000074505806,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "r",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": -0.05000000074505806,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "r",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": -0.05000000074505806,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "r",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": -0.05000000074505806,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "r",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": -0.05000000074505806,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_g",
"time": 0.0,
"expected": 0.058352306485176086,
"tolerance": {
"rel": 1e-05
}
}
]
},
{
"id": "moisture_run_step20_brush",
"description": "Reference: NCAR fire_behavior (develop @ eb77580, default real32 build, gfortran 13.3 -O2 in the EqWeFiC container) running its test7 case (80x80 fire cells of 25 m, dt = 0.5 s, num_tiles = 1), dumped in-model by the ctessum-claude/fire_behavior fork (branch earthsciml-instrumented, commit c9dda02, based on NCAR fire_behavior eb77580, three commits before v1.0.0; -DESM_DUMP=ON; summary output bit-identical to the uninstrumented build). Single-precision source: rel 1e-5 (the tolerance contract for a single-precision reference), abs 1e-7 where a value is exactly 0 or 1. Regime: moisture run (namelist fmoist_run = .true., fmoist_freq = 1: the moisture model advances every 0.5 s step), fmc dump at step 20, cell (i,j) = (4, 53) (Anderson category 5); dry, hot afternoon air (rh 0.08-0.11, T 310-320 K), no rain, so every class is in the drying branch with change = dt rlag << TOL (2nd-order Taylor step); the dead classes sit at the drying equilibrium, the live class relaxes from 0.30 with its 1e9 h lag. Class inputs (fmc_gc before the step) and the category's class weights (fmc_avg dump) are injected as fmc_class-shaped fields.",
"parameter_overrides": {
"rain": 0.0,
"rain_old": 0.0,
"t2": 310.3646240234375,
"t2_old": 310.3646240234375,
"q2": 0.005284447688609362,
"q2_old": 0.005284447688609362,
"psfc": 84633.6796875,
"psfc_old": 84633.6796875,
"dt_moisture": 0.5,
"deltae": 0.0,
"deltas": 0.0
},
"expression_template_imports": [
{
"ref": "./tests/moisture_run_step20_brush_inputs.esm"
}
],
"time_span": {
"start": 0,
"end": 1
},
"tolerance": {
"rel": 1e-05
},
"assertions": [
{
"variable": "rain_int",
"time": 0.0,
"expected": 0.0,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "t_mean",
"time": 0.0,
"expected": 310.3646240234375,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "p_mean",
"time": 0.0,
"expected": 84633.6796875,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "q_mean",
"time": 0.0,
"expected": 0.005284447688609362,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "pw",
"time": 0.0,
"expected": 716.7372436523438,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "pws",
"time": 0.0,
"expected": 6355.61767578125,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "rh",
"time": 0.0,
"expected": 0.11277224123477936,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "emc_d",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 0.027747519314289093,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_d",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 0.027747519314289093,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_d",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 0.027747519314289093,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_d",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 0.027747519314289093,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_d",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 0.027747519314289093,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_w",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 0.017246181145310402,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_w",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 0.017246181145310402,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_w",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 0.017246181145310402,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_w",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 0.017246181145310402,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "emc_w",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 0.017246181145310402,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "rlag",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 0.00027777778450399637,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "rlag",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 2.7777778086601757e-05,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "rlag",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 2.7777778086601757e-06,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "rlag",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 2.7777778655035945e-07,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "rlag",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 2.7777777365615985e-13,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "equi",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 0.023851914331316948,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "equi",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 0.023851914331316948,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "equi",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 0.023851914331316948,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "equi",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 0.023851914331316948,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "equi",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 0.027747519314289093,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "change",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 0.00013888889225199819,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "change",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 1.3888889043300878e-05,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "change",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 1.3888889043300878e-06,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "change",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 1.3888889327517973e-07,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "change",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 1.3888888682807993e-13,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_new",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 0.023851914331316948,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_new",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 0.023851914331316948,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_new",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 0.023851914331316948,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_new",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 0.023851914331316948,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_new",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 0.30000001192092896,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_lag_h",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 1.0,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_lag_h",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 10.0,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_lag_h",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 100.0,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_lag_h",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 999.9999389648438,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_lag_h",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 1000000000.0,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "r",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": -0.05000000074505806,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "r",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": -0.05000000074505806,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "r",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": -0.05000000074505806,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "r",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": -0.05000000074505806,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "r",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": -0.05000000074505806,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_g",
"time": 0.0,
"expected": 0.18165084719657898,
"tolerance": {
"rel": 1e-05
}
}
]
},
{
"id": "zero_length_step_brush",
"description": "Regime: a moisture step of zero length (dt_moisture = 0, which Advance_fmc_model produces when the moisture model is called twice at the same time) with 1 mm of accumulated rain since the previous step. Advance_moisture_classes then takes rain_int = 0 instead of dividing by the step, so no class is wetted, change = dt_moisture rlag = 0 and every class keeps its moisture. The expected values follow from the Fortran's branch structure rather than from a dump: rain_int = 0, r = 0 - 0.05 mm/h, change = 0, fmc_new = fmc_old, fmc_g = sum_k w_k fmc_old_k and fmep_decay = 1. The forcing, class moistures and class weights are those of moisture_run_step20_brush.",
"parameter_overrides": {
"rain": 1.0,
"rain_old": 0.0,
"t2": 310.3646240234375,
"t2_old": 310.3646240234375,
"q2": 0.005284447688609362,
"q2_old": 0.005284447688609362,
"psfc": 84633.6796875,
"psfc_old": 84633.6796875,
"dt_moisture": 0.0,
"deltae": 0.0,
"deltas": 0.0
},
"expression_template_imports": [
{
"ref": "./tests/moisture_run_step20_brush_inputs.esm"
}
],
"time_span": {
"start": 0,
"end": 1
},
"tolerance": {
"rel": 1e-05
},
"assertions": [
{
"variable": "rain_int",
"time": 0.0,
"expected": 0.0,
"tolerance": {
"abs": 1e-12
}
},
{
"variable": "r",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": -0.05000000074505806,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "r",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": -0.05000000074505806,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "r",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": -0.05000000074505806,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "r",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": -0.05000000074505806,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "r",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": -0.05000000074505806,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "change",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 0.0,
"tolerance": {
"abs": 1e-12
}
},
{
"variable": "change",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 0.0,
"tolerance": {
"abs": 1e-12
}
},
{
"variable": "change",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 0.0,
"tolerance": {
"abs": 1e-12
}
},
{
"variable": "change",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 0.0,
"tolerance": {
"abs": 1e-12
}
},
{
"variable": "change",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 0.0,
"tolerance": {
"abs": 1e-12
}
},
{
"variable": "fmc_new",
"time": 0.0,
"coords": {
"fmc_class": 1
},
"expected": 0.023851914331316948,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_new",
"time": 0.0,
"coords": {
"fmc_class": 2
},
"expected": 0.023851914331316948,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_new",
"time": 0.0,
"coords": {
"fmc_class": 3
},
"expected": 0.023851914331316948,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_new",
"time": 0.0,
"coords": {
"fmc_class": 4
},
"expected": 0.023851914331316948,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_new",
"time": 0.0,
"coords": {
"fmc_class": 5
},
"expected": 0.30000001192092896,
"tolerance": {
"rel": 1e-05,
"abs": 1e-09
}
},
{
"variable": "fmc_g",
"time": 0.0,
"expected": 0.18165083536009144,
"tolerance": {
"rel": 1e-05
}
},
{
"variable": "fmep_decay",
"time": 0.0,
"expected": 1.0,
"tolerance": {
"abs": 1e-12
}
}
]
}
]
}