From a106276ca6657ef1d6bca4e2b63d5e1d9f8b16df Mon Sep 17 00:00:00 2001 From: "p.vanderwilt" Date: Fri, 7 Nov 2025 11:59:24 +0100 Subject: [PATCH] Add additional ASM constants, add other sensor handling, fix bug in kla model --- src/reaction_modules/asm3_class Koch.js | 2 ++ src/reaction_modules/asm3_class.js | 2 ++ src/specificClass.js | 20 +++++++++++++++----- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/reaction_modules/asm3_class Koch.js b/src/reaction_modules/asm3_class Koch.js index 0742afa..741c3e7 100644 --- a/src/reaction_modules/asm3_class Koch.js +++ b/src/reaction_modules/asm3_class Koch.js @@ -2,6 +2,8 @@ const math = require('mathjs'); const ASM_CONSTANTS = { S_O_INDEX: 0, + S_NH_INDEX: 3, + S_NO_INDEX: 5, NUM_SPECIES: 13 }; diff --git a/src/reaction_modules/asm3_class.js b/src/reaction_modules/asm3_class.js index dc519db..db39890 100644 --- a/src/reaction_modules/asm3_class.js +++ b/src/reaction_modules/asm3_class.js @@ -2,6 +2,8 @@ const math = require('mathjs'); const ASM_CONSTANTS = { S_O_INDEX: 0, + S_NH_INDEX: 3, + S_NO_INDEX: 5, NUM_SPECIES: 13 }; diff --git a/src/specificClass.js b/src/specificClass.js index 12ba0da..05a6075 100644 --- a/src/specificClass.js +++ b/src/specificClass.js @@ -320,14 +320,14 @@ class Reactor_PFR extends Reactor { const advection = math.multiply(-1 * math.sum(this.Fs) / (this.A*this.d_x), this.D_op, this.extendedState); const reaction = this.extendedState.map((state_slice) => this.asm.compute_dC(state_slice, this.temperature)); const transfer = Array.from(Array(this.n_x+2*BC_PADDING), () => new Array(ASM_CONSTANTS.NUM_SPECIES).fill(0)); - + if (isNaN(this.kla)) { // calculate OTR if kla is not NaN, otherwise use externally calculated OTR for (let i = BC_PADDING+1; i < BC_PADDING+this.n_x - 1; i++) { transfer[i][ASM_CONSTANTS.S_O_INDEX] = this.OTR * this.n_x/(this.n_x-2); } } else { - for (let i = BC_PADDING+1; i < BC_PADDING+this.n_x - 1; i++) { - transfer[i][ASM_CONSTANTS.S_O_INDEX] = this._calcOTR(this.extendedState[i][ASM_CONSTANTS.S_O_INDEX], this.temperature) * this.n_x/(this.n_x-2); + for (let i = BC_PADDING+1; i < BC_PADDING+this.n_x - 1; i++) { + transfer[i][ASM_CONSTANTS.S_O_INDEX] = this._calcOTR(this.extendedState[i][ASM_CONSTANTS.S_O_INDEX], this.temperature); } } @@ -349,10 +349,19 @@ class Reactor_PFR extends Reactor { } _updateMeasurement(measurementType, value, position, context) { + const grid_pos = Math.round(context.distance / this.config.length * this.n_x); + + // naive approach for reconciling measurements and simulation + // could benefit from Kalman filter? switch(measurementType) { case "quantity (oxygen)": - const grid_pos = Math.round(context.distance / this.config.length * this.n_x); - this.state[grid_pos][0] = value; // naive approach for reconciling measurements and simulation + this.state[grid_pos][ASM_CONSTANTS.S_O_INDEX] = value; + break; + case "quantity (ammonium)": + this.state[grid_pos][ASM_CONSTANTS.S_NH_INDEX] = value; + break; + case "quantity (nox)": + this.state[grid_pos][ASM_CONSTANTS.S_NO_INDEX] = value; break; default: super._updateMeasurement(measurementType, value, position, context); @@ -375,6 +384,7 @@ class Reactor_PFR extends Reactor { const BC_C_in = math.multiply(1 / math.sum(this.Fs), [this.Fs], this.Cs_in)[0]; const BC_dispersion_term = this.D*this.A/(math.sum(this.Fs)*this.d_x); this.extendedState[BC_PADDING] = math.multiply(1/(1+BC_dispersion_term), math.add(BC_C_in, math.multiply(BC_dispersion_term, this.extendedState[BC_PADDING+1]))); + // Numerical boundary condition this.extendedState[BC_PADDING-1] = math.add(math.multiply(2, this.extendedState[BC_PADDING]), math.multiply(-2, this.extendedState[BC_PADDING+2]), this.extendedState[BC_PADDING+3]); } else { // Neumann BC (no flux)