nx_arrhenius.nx
buildroot/runtime/nx_arrhenius.nx
about
nx_arrhenius.nx -- Arrhenius rate-vs-temperature primitive.
license_tier: PUBLIC_DOMAIN_PHYSICS
genealogy_id: arrhenius_1889_aktivieringsenergi + van_hoff_1884_kinetics
+ ellis_roberts_1980_seed_viability_eq_uses_arrhenius_form
+ nishi_q10_fixed_point_substrate_2026
The canonical chemical-kinetics + biological-rate primitive.
⚠INTENDED consumers, NOT current ones. This header used to read "Used by:"
and list the four lanes below. As of 2026-07-25 NOTHING in the tree imports
this file except its own cross-check gate -- the list was a design intent
that read like an inventory of live dependents, which is how a dead
primitive keeps looking load-bearing. Corrected to say what is true:
- Seed viability decay (Ellis-Roberts 1980 σ-equation) [planned]
- Soil microbial respiration rate (Lloyd & Taylor 1994) [planned]
- Indoor-greenhouse climate-effect modeling (greenhouse plant
growth rates per Q10 biological rule of thumb) [planned]
- Reservoir nutrient solution chemistry kinetics [planned]
- Any temperature-dependent rate the substrate needs to model
The zero-consumer state is also why the reciprocal-precision defect fixed
below survived: nothing called it, so nothing noticed it always returned
"temperature has no effect". A primitive with no gate AND no callers is
not a capability, it is an unverified intention.
===== The equation ===============================================
k(T) = A * exp(-Ea / (R * T))
where:
k(T) = rate constant at absolute temperature T
A = pre-exponential factor (frequency factor)
Ea = activation energy [J / mol]
R = universal gas constant = 8.314 J/(mol*K)
T = absolute temperature [Kelvin]
In practice the substrate cares about RATE RATIOS more than absolute
rate constants:
dependencies 2 imports · 0 importers
imports: nx_syscalls.nxnx_exp.nx
imported by: nobody (leaf or entry point)
structs
| none |
consts
| 80 | const NX_ARRH_R_J_PER_MOL_K_Q10: i64 = 8514 |
| 84 | const NX_ARRH_Q10_ONE: i64 = 1024 |
| 88 | const NX_ARRH_KELVIN_OFFSET_Q10: i64 = 279706 |
| 92 | const NX_ARRH_T_FREEZER_Q10: i64 = 261177 // -18°C = 255.15 K (long-term seed storage) |
| 93 | const NX_ARRH_T_FRIDGE_Q10: i64 = 283802 // 4°C = 277.15 K |
| 94 | const NX_ARRH_T_ROOM_Q10: i64 = 304586 // 25°C = 298.15 K (lab reference) |
| 95 | const NX_ARRH_T_WARM_Q10: i64 = 314978 // 35°C = 308.15 K (accelerated-aging tests) |
| 96 | const NX_ARRH_T_HOT_Q10: i64 = 325370 // 45°C = 318.15 K |
| 99 | const NX_ARRH_EA_SEED_DECAY_TYPICAL_Q10: i64 = 92160000 // ~90 kJ/mol (orthodox seed) |
| 100 | const NX_ARRH_EA_SEED_DECAY_OILSEED_Q10: i64 = 107520000 // ~105 kJ/mol (oilseed, lipid) |
| 101 | const NX_ARRH_EA_SOIL_RESPIRATION_Q10: i64 = 66560000 // ~65 kJ/mol (Lloyd-Taylor) |
| 105 | const NX_ARRH_OK: i64 = 0 |
| 106 | const NX_ARRH_ERR_BAD_TEMP: i64 = -1 // T <= 0 K (invalid) |
| 107 | const NX_ARRH_ERR_BAD_EA: i64 = -2 // Ea < 0 (invalid) |
functions
| 115 | func nx_arrh_celsius_to_kelvin_q10(c_q10: i64) -> i64 called by 1: nx_arrh_rate_ratio_celsius_q10 |
| 119 | func nx_arrh_kelvin_to_celsius_q10(k_q10: i64) -> i64 |
| 140 | func nx_arrh_rate_ratio_q10(ea_j_per_mol_q10: i64, t1_kelvin_q10: i64, t2_kelvin_q10: i64) -> i64 |
| 186 | func nx_arrh_rate_ratio_celsius_q10(ea_j_per_mol_q10: i64, t1_c_q10: i64, t2_c_q10: i64) -> i64 |
| 208 | func nx_arrh_biological_q10_coefficient(ea_j_per_mol_q10: i64, t_ref_kelvin_q10: i64) -> i64 calls 1: nx_arrh_rate_ratio_q10 |
| 226 | func nx_arrh_harrington_longevity_multiplier_q10(t1_c_q10: i64, t2_c_q10: i64) -> i64 calls 1: nx_arrh_rate_ratio_celsius_q10 |