Derive Pot's L/Td from the Sud doc instead of a fixed server default
Sud now parses top-level L/Td fields from sude/*.json (defaulting to 0.2/30, matching the old hardcoded server constants), and derive_plant_params() returns them alongside M/C - constant for the whole brew, unlike M/C which vary per step with grain/water mass. All sude/*.json docs gain explicit L/Td fields. Callers (tasks/sud.py, SudForecastEstimator, demo_sud.py) switch from the narrow set_thermal_params(M, C)/set_model_params(M, C) to the full set_plant_params(params)/set_model_plant_params(params), since derive_plant_params() now always returns all four keys; both narrow setters are removed as dead code. Caught along the way: Pot.set_plant_params() unconditionally rebuilt the Delay ring buffer, which was harmless when only ever called once at construction - but now running on every Sud step change, it was wiping in-flight delayed power at each step boundary. Fixed to only rebuild when Td actually changes; verified this restores the exact original forecast result for sud_0010.json. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DkkuG48uHFCGKe6dPSERFk
This commit is contained in:
+8
-6
@@ -57,13 +57,15 @@ class SudTask(ATask):
|
||||
|
||||
def apply_plant_params(self, step):
|
||||
"""Keeps the real plant's and the controller's internal model's
|
||||
lumped (M, C) in sync with the step's grain_mass/water_mass, since
|
||||
those vary over the course of a brew (malt going in, water boiling
|
||||
off) - mirrors demo_sud.py's apply_plant_params()."""
|
||||
plant params in sync with this Sud's own doc - L/Td come straight
|
||||
from it (constant for the whole brew), while M/C also fold in the
|
||||
step's grain_mass/water_mass, which vary over the brew's course
|
||||
(malt going in, water boiling off) - mirrors demo_sud.py's
|
||||
apply_plant_params()."""
|
||||
params = self.sud.derive_plant_params(step.get('grain_mass', 0), step.get('water_mass', 0))
|
||||
self.pot.set_thermal_params(params['M'], params['C'])
|
||||
if hasattr(self.tc, 'set_model_params'):
|
||||
self.tc.set_model_params(params['M'], params['C'])
|
||||
self.pot.set_plant_params(params)
|
||||
if hasattr(self.tc, 'set_model_plant_params'):
|
||||
self.tc.set_model_plant_params(params)
|
||||
|
||||
def apply_stirrer(self, phase):
|
||||
stirrer_cfg = phase.get('stirrer', {})
|
||||
|
||||
Reference in New Issue
Block a user