Version: dev

OneHourFuelMoisture

1-hour timelag dead fuel moisture content per the NFDRS (Cohen & Deeming 1985), page 3. Migrated from WildlandFire.jl@126976f2 src/nfdrs.jl:149 (`OneHourFuelMoisture` @component). Observed-only: EMCPRM, MC10, use_fuel_sticks, is_raining are inputs (parameters); MC1 is the algebraic output.

.esm schema
1.0.0
Source
components/wildland_fire/nfdrs/moisture_1h.esm

Description

1-hour timelag dead fuel moisture content per the NFDRS (Cohen & Deeming 1985), page 3. Migrated from WildlandFire.jl@126976f2 src/nfdrs.jl:149 (OneHourFuelMoisture @component). Observed-only: EMCPRM, MC10, use_fuel_sticks, is_raining are inputs (parameters); MC1 is the algebraic output.

Reference

_source_ref: WildlandFire.jl@126976f2508ceacca6c486b21ae6da5b168c6f46:src/nfdrs.jl:149 Upstream OneHourFuelMoisture is an MTK @component whose inputs (EMCPRM, MC10, use_fuel_sticks, is_raining) are @parameters and whose single output (MC1) is a time-indexed @variable with one algebraic equation — a nested ifelse that selects between three branches per Cohen & Deeming 1985 page 3:

  • is_raining > 0.5 ⇒ MC1 = 0.35 (35% saturation)
  • else use_fuel_sticks > 0.5 ⇒ MC1 = (4*EMCPRM + MC10)/5 (with-sticks branch)
  • else ⇒ MC1 = 1.03*EMCPRM (without-sticks branch)

The rain branch dominates over fuel-sticks dispatch (outer ifelse). The dispatch threshold (0.5) is encoded as a strict > comparison so any value > 0.5 selects the corresponding branch. Defaults are 0.0 for both flags so the standalone component selects the without-sticks branch by default and is well-posed without overrides.

Tolerance rationale (model-level rel=1e-12): observed-only algebraic system (no ODE integration); the equation is a nested ifelse over polynomial expressions in float64 — float64 roundoff is at the ULP level (~1e-15). 1e-12 is comfortably above that and below any plausible physical-discrimination scale on dimensionless moisture-fraction outputs._

Parameters

NameUnitsDefaultDescription
EMCPRM10.1Equilibrium moisture content at the fuel-atmosphere interface (dimensionless fraction). Default 0.10 = 10% moisture, mid-range NFDRS value.
MC1010.110-hour fuel moisture content (dimensionless fraction). Coupled input from TenHourFuelMoisture when fuel sticks are used. Default 0.10 = 10%.
use_fuel_sticks10.0Flag: 1 if 1-hour fuel sticks are used, 0 otherwise (dimensionless). Threshold against 0.5 selects branch. With sticks, MC1 is a weighted blend of EMCPRM and MC10.
is_raining10.0Flag: 1 if raining at observation time, 0 otherwise (dimensionless). Threshold against 0.5 selects branch. Rain branch dominates: MC1 pinned to 0.35 regardless of sticks/EMCPRM.

Observed

NameUnitsDefaultDescription
MC111-hour fuel moisture content (dimensionless fraction).

Observed expressions

$$ MC1 = \mathrm{ifelse}\left(\mathrm{>}\left(is_{raining}, 0.5\right), 0.35, \mathrm{ifelse}\left(\mathrm{>}\left(use_{fuel\,sticks}, 0.5\right), \frac{4.0 \cdot EMCPRM + MC10}{5.0}, 1.03 \cdot EMCPRM\right)\right) $$

1-hour fuel moisture content (dimensionless fraction).

Analyses

no_sticks_typical_day

Typical NFDRS station without 1-hour fuel sticks: EMCPRM = 0.10 (10% interface EMC), no rain. Output MC1 = 1.03 * 0.10 = 0.103, the standard scaling that boosts atmospheric EMC by 3% to account for the shorter timelag of 1-hour fuels (Cohen & Deeming 1985 p.3).

Time span: 0.0 → 1.0

with_sticks_typical_day

NFDRS station equipped with 1-hour fuel sticks: EMCPRM = 0.10, MC10 = 0.10 (typical 10-hour state). With sticks the 1-hour fuel moisture is a 4:1 weighted blend toward EMCPRM, MC1 = (4*0.10 + 0.10)/5 = 0.10. Compare to the no-sticks branch (MC1 = 0.103) — with sticks the output is slightly damped by the MC10 contribution.

Time span: 0.0 → 1.0

rainy_observation

Wet observation: precipitation at the observation time pins MC1 to the saturation default of 35% (Cohen & Deeming 1985 p.4). All other inputs are ignored. This is the operational fallback when accurate fuel-moisture measurement is impossible due to wet conditions.

Time span: 0.0 → 1.0

Raw .esm

Raw .esm JSON (this component)
{
  "reference": {
    "notes": "source_ref: WildlandFire.jl@126976f2508ceacca6c486b21ae6da5b168c6f46:src/nfdrs.jl:149\nUpstream `OneHourFuelMoisture` is an MTK `@component` whose inputs (EMCPRM, MC10, use_fuel_sticks, is_raining) are `@parameters` and whose single output (MC1) is a time-indexed `@variable` with one algebraic equation — a nested `ifelse` that selects between three branches per Cohen & Deeming 1985 page 3:\n  - is_raining > 0.5  ⇒ MC1 = 0.35 (35% saturation)\n  - else use_fuel_sticks > 0.5  ⇒ MC1 = (4*EMCPRM + MC10)/5 (with-sticks branch)\n  - else  ⇒ MC1 = 1.03*EMCPRM (without-sticks branch)\n\nThe rain branch dominates over fuel-sticks dispatch (outer ifelse). The dispatch threshold (0.5) is encoded as a strict `>` comparison so any value > 0.5 selects the corresponding branch. Defaults are 0.0 for both flags so the standalone component selects the without-sticks branch by default and is well-posed without overrides.\n\nTolerance rationale (model-level rel=1e-12): observed-only algebraic system (no ODE integration); the equation is a nested `ifelse` over polynomial expressions in float64 — float64 roundoff is at the ULP level (~1e-15). 1e-12 is comfortably above that and below any plausible physical-discrimination scale on dimensionless moisture-fraction outputs."
  },
  "tolerance": {
    "rel": 1e-12
  },
  "variables": {
    "EMCPRM": {
      "type": "parameter",
      "units": "1",
      "default": 0.1,
      "description": "Equilibrium moisture content at the fuel-atmosphere interface (dimensionless fraction). Default 0.10 = 10% moisture, mid-range NFDRS value."
    },
    "MC10": {
      "type": "parameter",
      "units": "1",
      "default": 0.1,
      "description": "10-hour fuel moisture content (dimensionless fraction). Coupled input from `TenHourFuelMoisture` when fuel sticks are used. Default 0.10 = 10%."
    },
    "use_fuel_sticks": {
      "type": "parameter",
      "units": "1",
      "default": 0.0,
      "description": "Flag: 1 if 1-hour fuel sticks are used, 0 otherwise (dimensionless). Threshold against 0.5 selects branch. With sticks, MC1 is a weighted blend of EMCPRM and MC10."
    },
    "is_raining": {
      "type": "parameter",
      "units": "1",
      "default": 0.0,
      "description": "Flag: 1 if raining at observation time, 0 otherwise (dimensionless). Threshold against 0.5 selects branch. Rain branch dominates: MC1 pinned to 0.35 regardless of sticks/EMCPRM."
    },
    "MC1": {
      "type": "unknown",
      "units": "1",
      "description": "1-hour fuel moisture content (dimensionless fraction)."
    }
  },
  "equations": [
    {
      "lhs": "MC1",
      "rhs": {
        "op": "ifelse",
        "args": [
          {
            "op": ">",
            "args": [
              "is_raining",
              0.5
            ]
          },
          0.35,
          {
            "op": "ifelse",
            "args": [
              {
                "op": ">",
                "args": [
                  "use_fuel_sticks",
                  0.5
                ]
              },
              {
                "op": "/",
                "args": [
                  {
                    "op": "+",
                    "args": [
                      {
                        "op": "*",
                        "args": [
                          4.0,
                          "EMCPRM"
                        ]
                      },
                      "MC10"
                    ]
                  },
                  5.0
                ]
              },
              {
                "op": "*",
                "args": [
                  1.03,
                  "EMCPRM"
                ]
              }
            ]
          }
        ]
      }
    }
  ],
  "tests": [
    {
      "id": "no_rain_no_sticks_emcprm10",
      "description": "No rain, no fuel sticks, EMCPRM = 0.10 (10% interface EMC). Selects the without-sticks branch: MC1 = 1.03 * EMCPRM = 0.103.",
      "parameter_overrides": {
        "is_raining": 0.0,
        "use_fuel_sticks": 0.0,
        "EMCPRM": 0.1
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "MC1",
          "time": 0.0,
          "expected": 0.103
        }
      ]
    },
    {
      "id": "no_rain_no_sticks_emcprm05",
      "description": "No rain, no sticks; EMCPRM = 0.05 (dry interface). MC1 = 1.03 * 0.05 = 0.0515.",
      "parameter_overrides": {
        "is_raining": 0.0,
        "use_fuel_sticks": 0.0,
        "EMCPRM": 0.05
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "MC1",
          "time": 0.0,
          "expected": 0.0515
        }
      ]
    },
    {
      "id": "no_rain_no_sticks_emcprm30",
      "description": "No rain, no sticks; EMCPRM = 0.30 (humid interface). MC1 = 1.03 * 0.30 = 0.309.",
      "parameter_overrides": {
        "is_raining": 0.0,
        "use_fuel_sticks": 0.0,
        "EMCPRM": 0.3
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "MC1",
          "time": 0.0,
          "expected": 0.309
        }
      ]
    },
    {
      "id": "no_rain_with_sticks_typical",
      "description": "No rain, with fuel sticks, EMCPRM = 0.10, MC10 = 0.10. With-sticks branch: MC1 = (4*0.10 + 0.10)/5 = 0.50/5 = 0.10.",
      "parameter_overrides": {
        "is_raining": 0.0,
        "use_fuel_sticks": 1.0,
        "EMCPRM": 0.1,
        "MC10": 0.1
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "MC1",
          "time": 0.0,
          "expected": 0.1
        }
      ]
    },
    {
      "id": "no_rain_with_sticks_dry_emcprm",
      "description": "No rain, with sticks, EMCPRM = 0.05, MC10 = 0.05. MC1 = (4*0.05 + 0.05)/5 = 0.25/5 = 0.05.",
      "parameter_overrides": {
        "is_raining": 0.0,
        "use_fuel_sticks": 1.0,
        "EMCPRM": 0.05,
        "MC10": 0.05
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "MC1",
          "time": 0.0,
          "expected": 0.05
        }
      ]
    },
    {
      "id": "no_rain_with_sticks_humid",
      "description": "No rain, with sticks, EMCPRM = 0.20, MC10 = 0.15. MC1 = (4*0.20 + 0.15)/5 = 0.95/5 = 0.19. Exercises the EMCPRM-dominant weighting (4:1 ratio).",
      "parameter_overrides": {
        "is_raining": 0.0,
        "use_fuel_sticks": 1.0,
        "EMCPRM": 0.2,
        "MC10": 0.15
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "MC1",
          "time": 0.0,
          "expected": 0.19
        }
      ]
    },
    {
      "id": "no_rain_with_sticks_diverging",
      "description": "No rain, with sticks, EMCPRM = 0.30, MC10 = 0.10 (diverging inputs). MC1 = (4*0.30 + 0.10)/5 = 1.30/5 = 0.26. Confirms the 4:1 EMCPRM-dominant blend.",
      "parameter_overrides": {
        "is_raining": 0.0,
        "use_fuel_sticks": 1.0,
        "EMCPRM": 0.3,
        "MC10": 0.1
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "MC1",
          "time": 0.0,
          "expected": 0.26
        }
      ]
    },
    {
      "id": "raining_no_sticks",
      "description": "Rain branch (is_raining = 1.0): MC1 pinned to 0.35 regardless of EMCPRM. Without-sticks dispatch ignored.",
      "parameter_overrides": {
        "is_raining": 1.0,
        "use_fuel_sticks": 0.0,
        "EMCPRM": 0.1
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "MC1",
          "time": 0.0,
          "expected": 0.35
        }
      ]
    },
    {
      "id": "raining_dominates_sticks",
      "description": "Rain branch dominates over fuel-sticks branch (outer ifelse). is_raining = 1, use_fuel_sticks = 1, EMCPRM = 0.05, MC10 = 0.05 — without rain MC1 would be 0.05; with rain it pins to 0.35.",
      "parameter_overrides": {
        "is_raining": 1.0,
        "use_fuel_sticks": 1.0,
        "EMCPRM": 0.05,
        "MC10": 0.05
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "MC1",
          "time": 0.0,
          "expected": 0.35
        }
      ]
    },
    {
      "id": "raining_dominates_extreme_emcprm",
      "description": "Rain branch dominates even at extreme EMCPRM = 0.50 (humid). MC1 = 0.35, NOT 1.03 * 0.50 = 0.515.",
      "parameter_overrides": {
        "is_raining": 1.0,
        "use_fuel_sticks": 0.0,
        "EMCPRM": 0.5
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "MC1",
          "time": 0.0,
          "expected": 0.35
        }
      ]
    },
    {
      "id": "dispatch_is_raining_below_threshold",
      "description": "is_raining = 0.4 (below 0.5 threshold) selects the no-rain branch. EMCPRM = 0.10, no sticks ⇒ MC1 = 1.03 * 0.10 = 0.103.",
      "parameter_overrides": {
        "is_raining": 0.4,
        "use_fuel_sticks": 0.0,
        "EMCPRM": 0.1
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "MC1",
          "time": 0.0,
          "expected": 0.103
        }
      ]
    },
    {
      "id": "dispatch_is_raining_above_threshold",
      "description": "is_raining = 0.6 (above 0.5 threshold) selects the rain branch. EMCPRM override should be ignored. MC1 = 0.35.",
      "parameter_overrides": {
        "is_raining": 0.6,
        "use_fuel_sticks": 0.0,
        "EMCPRM": 0.99
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "MC1",
          "time": 0.0,
          "expected": 0.35
        }
      ]
    },
    {
      "id": "dispatch_use_fuel_sticks_below_threshold",
      "description": "use_fuel_sticks = 0.4 (below 0.5 threshold) selects the without-sticks branch. EMCPRM = 0.15, MC10 override should not affect output. MC1 = 1.03 * 0.15 = 0.1545.",
      "parameter_overrides": {
        "is_raining": 0.0,
        "use_fuel_sticks": 0.4,
        "EMCPRM": 0.15,
        "MC10": 0.99
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "MC1",
          "time": 0.0,
          "expected": 0.1545
        }
      ]
    },
    {
      "id": "dispatch_use_fuel_sticks_above_threshold",
      "description": "use_fuel_sticks = 0.6 (above 0.5 threshold) selects the with-sticks branch. EMCPRM = 0.10, MC10 = 0.20 ⇒ MC1 = (4*0.10 + 0.20)/5 = 0.60/5 = 0.12.",
      "parameter_overrides": {
        "is_raining": 0.0,
        "use_fuel_sticks": 0.6,
        "EMCPRM": 0.1,
        "MC10": 0.2
      },
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "assertions": [
        {
          "variable": "MC1",
          "time": 0.0,
          "expected": 0.12
        }
      ]
    }
  ],
  "analyses": [
    {
      "id": "no_sticks_typical_day",
      "description": "Typical NFDRS station without 1-hour fuel sticks: EMCPRM = 0.10 (10% interface EMC), no rain. Output MC1 = 1.03 * 0.10 = 0.103, the standard scaling that boosts atmospheric EMC by 3% to account for the shorter timelag of 1-hour fuels (Cohen & Deeming 1985 p.3).",
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "parameters": {
        "is_raining": 0.0,
        "use_fuel_sticks": 0.0,
        "EMCPRM": 0.1
      }
    },
    {
      "id": "with_sticks_typical_day",
      "description": "NFDRS station equipped with 1-hour fuel sticks: EMCPRM = 0.10, MC10 = 0.10 (typical 10-hour state). With sticks the 1-hour fuel moisture is a 4:1 weighted blend toward EMCPRM, MC1 = (4*0.10 + 0.10)/5 = 0.10. Compare to the no-sticks branch (MC1 = 0.103) — with sticks the output is slightly damped by the MC10 contribution.",
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "parameters": {
        "is_raining": 0.0,
        "use_fuel_sticks": 1.0,
        "EMCPRM": 0.1,
        "MC10": 0.1
      }
    },
    {
      "id": "rainy_observation",
      "description": "Wet observation: precipitation at the observation time pins MC1 to the saturation default of 35% (Cohen & Deeming 1985 p.4). All other inputs are ignored. This is the operational fallback when accurate fuel-moisture measurement is impossible due to wet conditions.",
      "time_span": {
        "start": 0.0,
        "end": 1.0
      },
      "parameters": {
        "is_raining": 1.0,
        "use_fuel_sticks": 0.0,
        "EMCPRM": 0.1
      }
    }
  ]
}