"""Stage `fields` and shared zone modifiers."""
from __future__ import annotations
import numpy as np
from .config import MASK_DEFAULTS, params
def gravity_mod(cfg, m_gravity):
M = params(cfg, "masks", MASK_DEFAULTS)
return np.clip(1.0 + M["gravity_range"] * np.asarray(m_gravity, dtype=np.float64), 0.05, None)
def o2_mod(cfg, m_o2):
M = params(cfg, "masks", MASK_DEFAULTS)
return np.clip(1.0 + M["o2_range"] * np.asarray(m_o2, dtype=np.float64), 0.0, None)
def pressure(p0_bar, z_m, scale_height_m):
"""Air pressure at ground height z (bar): sea-level pressure p0 falling with height (below 0 m: p0)."""
return p0_bar * np.exp(-np.maximum(np.asarray(z_m, dtype=np.float64), 0.0) / scale_height_m)
def plant_height(g_planet, gravity_g):
"""How much taller plants grow than under the planet's normal gravity (height limit ∝ 1 / g)."""
return g_planet / np.asarray(gravity_g, dtype=np.float64)
def run(ctx) -> dict:
pl = ctx.cfg["planet"]
zs, m_o2, m_g = ctx.need("z_surface_m", "m_o2_zones", "m_gravity_zones")
p = pressure(pl["sea_level_pressure_bar"], zs, pl["scale_height_km"] * 1000.0)
o2 = pl["o2_fraction"] * o2_mod(ctx.cfg, m_o2)
return {"po2_bar": o2 * p, "gravity_g": pl["gravity_g"] * gravity_mod(ctx.cfg, m_g), "pressure_bar": p,
"o2_fraction": o2, "fire_reactivity": np.ones(len(p)), # zone events (eras) set other values
"plant_height_x": plant_height(pl["gravity_g"], pl["gravity_g"] * gravity_mod(ctx.cfg, m_g))}