Files
generalFunctions/src/configs/reactor.json
znetsixe 4f715e8ad6 fix(reactor schema): timeStep unit was "h" but engine treats input as seconds
reactor.json declared `timeStep.unit = "h"` and `default = 0.001`, but:

- reactor.html labels the field [s] and defaults to 1.
- baseEngine.js line 40 converts via (1/86400) — seconds-per-day —
  meaning the engine internally treats the input as seconds.

A reader trusting the schema would have entered an hours value; the
engine would then have run the integrator at 1/3600× the intended step,
silently producing wrong rates.

Schema now matches the actual contract: `unit = "s"`, `default = 1`,
`min = 0.001` (1 ms minimum). Description block calls out the
seconds→days conversion so future readers don't need to dig.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 13:01:02 +02:00

203 lines
6.2 KiB
JSON

{
"general": {
"name": {
"default": "Reactor",
"rules": {
"type": "string",
"description": "A human-readable name for this reactor."
}
},
"id": {
"default": null,
"rules": {
"type": "string",
"nullable": true,
"description": "Unique identifier for this reactor node."
}
},
"unit": {
"default": null,
"rules": {
"type": "string",
"nullable": true,
"description": "Default measurement unit."
}
},
"logging": {
"logLevel": {
"default": "info",
"rules": {
"type": "enum",
"values": [
{ "value": "debug", "description": "Verbose diagnostic messages." },
{ "value": "info", "description": "General informational messages." },
{ "value": "warn", "description": "Warning messages." },
{ "value": "error", "description": "Error level messages only." }
]
}
},
"enabled": {
"default": true,
"rules": {
"type": "boolean",
"description": "Enable or disable logging."
}
}
}
},
"functionality": {
"softwareType": {
"default": "reactor",
"rules": {
"type": "string",
"description": "Software type identifier for parent-child registration."
}
},
"role": {
"default": "Biological reactor for wastewater treatment",
"rules": {
"type": "string",
"description": "Describes the functional role of this node."
}
},
"positionVsParent": {
"default": "atEquipment",
"rules": {
"type": "enum",
"values": [
{ "value": "upstream", "description": "Upstream of parent equipment." },
{ "value": "atEquipment", "description": "At equipment level." },
{ "value": "downstream", "description": "Downstream of parent equipment." }
]
}
}
},
"reactor": {
"reactor_type": {
"default": "CSTR",
"rules": {
"type": "enum",
"values": [
{ "value": "CSTR", "description": "Continuous Stirred Tank Reactor - fully mixed." },
{ "value": "PFR", "description": "Plug Flow Reactor - spatial gradient along length." }
]
}
},
"volume": {
"default": 1000,
"rules": {
"type": "number",
"min": 0,
"unit": "m3",
"description": "Reactor volume in cubic meters."
}
},
"length": {
"default": 10,
"rules": {
"type": "number",
"min": 0,
"unit": "m",
"description": "Reactor length (relevant for PFR spatial discretization)."
}
},
"resolution_L": {
"default": 10,
"rules": {
"type": "integer",
"min": 1,
"description": "Number of spatial segments for PFR discretization."
}
},
"alpha": {
"default": 0.5,
"rules": {
"type": "number",
"min": 0,
"max": 1,
"description": "Dispersion coefficient alpha (0 = plug flow, 1 = fully mixed)."
}
},
"n_inlets": {
"default": 1,
"rules": {
"type": "integer",
"min": 1,
"description": "Number of inlet points along the reactor."
}
},
"kla": {
"default": 0,
"rules": {
"type": "number",
"min": 0,
"unit": "1/h",
"description": "Oxygen mass transfer coefficient (KLa)."
}
},
"timeStep": {
"default": 1,
"rules": {
"type": "number",
"min": 0.001,
"unit": "s",
"description": "Integration time step in seconds. The kinetics engine converts to days internally (timeStep / 86400) before each ASM Euler step; the HTML editor labels this field [s] and tests assume seconds. Do not change the unit without updating baseEngine.js line 40 in the reactor submodule."
}
}
},
"initialState": {
"S_O": {
"default": 0,
"rules": { "type": "number", "unit": "mg/L", "description": "Initial dissolved oxygen concentration." }
},
"S_I": {
"default": 30,
"rules": { "type": "number", "unit": "mg/L", "description": "Initial inert soluble COD." }
},
"S_S": {
"default": 70,
"rules": { "type": "number", "unit": "mg/L", "description": "Initial readily biodegradable substrate." }
},
"S_NH": {
"default": 25,
"rules": { "type": "number", "unit": "mg/L", "description": "Initial ammonium nitrogen." }
},
"S_N2": {
"default": 0,
"rules": { "type": "number", "unit": "mg/L", "description": "Initial dinitrogen (N2)." }
},
"S_NO": {
"default": 0,
"rules": { "type": "number", "unit": "mg/L", "description": "Initial nitrate and nitrite nitrogen." }
},
"S_HCO": {
"default": 5,
"rules": { "type": "number", "unit": "mmol/L", "description": "Initial alkalinity (bicarbonate)." }
},
"X_I": {
"default": 1000,
"rules": { "type": "number", "unit": "mg/L", "description": "Initial inert particulate COD." }
},
"X_S": {
"default": 100,
"rules": { "type": "number", "unit": "mg/L", "description": "Initial slowly biodegradable substrate." }
},
"X_H": {
"default": 2000,
"rules": { "type": "number", "unit": "mg/L", "description": "Initial heterotrophic biomass." }
},
"X_STO": {
"default": 0,
"rules": { "type": "number", "unit": "mg/L", "description": "Initial stored COD in biomass." }
},
"X_A": {
"default": 200,
"rules": { "type": "number", "unit": "mg/L", "description": "Initial autotrophic biomass." }
},
"X_TS": {
"default": 3500,
"rules": { "type": "number", "unit": "mg/L", "description": "Initial total suspended solids." }
}
}
}