feat(simulation): district moisture spatial gradient (T-1080)
moisture_q was a single body constant (derive_moisture_q took only &BodyParams → 80 for every one of 2048 ocean-world districts), so vegetation/terrain/ecotones were uniform — "nothing to fuzz" (the T-1080 believability bug). - district_profile.rs: derive_moisture_q is now a body ceiling (hydrosphere+atmosphere) × per-district gradient — latitude (equator wet → pole dry), elevation (orographic/ rain-shadow), continentality (100 − ocean_fraction_q). Integer/D-010, no new plumbing (elev_q/ocean_fraction_q/latitude_deg already reach build_district_profile). Mirrors D-240's temperature model. Coefficients in ClimateConstants + climate_constants.toml [moisture_gradient] (provisional; Q-123 calibrates). Tuned so a wet body stays mostly green with drier patches and a frozen body clamps mostly barren. + gradient unit test. - region_profile.rs: region-tier moisture gets the region-latitude gradient (elevation/ continentality are district-scale). - Propagates to precipitation_class / vegetation_class / morphology_zone (all read moisture_q). D-239 §2 amended. Believability golden regenerated. Probe (Arbour @ yolo): moisture_q distinct 1 → 49 (spread 0 → 48); 5/7 → 6/7 criteria. Edict (frozen): moisture 0..20 ×21 — gradient within its low ceiling. Remaining fail (vegetation-present) is the metric dividing by all-sampled incl. water on a 2/3-ocean world — a Q-123 calibration concern, not a climate defect. clippy --all-targets -D warnings clean; 1580 lib tests + harnesses pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -84,3 +84,16 @@ ice = 0.85 # frozen surface — slight moderation
|
||||
subsurface_liquid = 0.9
|
||||
subsurface = 0.95 # buried water — minimal surface effect
|
||||
subsurface_ice = 0.95
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
[moisture_gradient]
|
||||
# Per-district moisture spatial gradient (T-1080, D-239 §2). Integer points
|
||||
# subtracted from the body's hydrosphere moisture *ceiling* so the field varies
|
||||
# across the body instead of being a single constant (the bug: moisture_q = 80 for
|
||||
# every district -> uniform vegetation/terrain). Wet at coast/lowland/tropics, drier
|
||||
# toward interior/highland/poles. Provisional magnitudes — Q-123 calibrates. Mirrors
|
||||
# the embedded ClimateConstants::default(); not yet loaded at runtime (TOML wiring is
|
||||
# T-1032), kept in sync by hand like the other tables.
|
||||
lat_penalty = 20 # lost equator->pole (x |latitude|/90)
|
||||
elev_penalty = 15 # lost low->high elevation (x elev_q/100, rain-shadow)
|
||||
continental_penalty = 20 # lost coast->interior (x (100 - ocean_fraction_q)/100)
|
||||
|
||||
Reference in New Issue
Block a user