Files
reactor/reactor.html

240 lines
10 KiB
HTML

<script src="/reactor/menu.js"></script>
<script type="text/javascript">
RED.nodes.registerType("reactor", {
category: "EVOLV",
color: "#c4cce0",
defaults: {
name: { value: "" },
reactor_type: { value: "CSTR", required: true },
volume: { value: 0., required: true },
length: { value: 0.},
resolution_L: { value: 0.},
kla: { value: null },
S_O_init: { value: 0., required: true },
S_I_init: { value: 30., required: true },
S_S_init: { value: 100., required: true },
S_NH_init: { value: 16., required: true },
S_N2_init: { value: 0., required: true },
S_NO_init: { value: 0., required: true },
S_HCO_init: { value: 5., required: true },
X_I_init: { value: 25., required: true },
X_S_init: { value: 75., required: true },
X_H_init: { value: 30., required: true },
X_STO_init: { value: 0., required: true },
X_A_init: { value: 0.001, required: true },
X_TS_init: { value: 125.0009, required: true },
timeStep: { value: 1, required: true },
enableLog: { value: false },
logLevel: { value: "error" },
positionVsParent: { value: "" }
},
inputs: 1,
outputs: 3,
inputLabels: ["input"],
outputLabels: ["process", "dbase", "parent"],
icon: "font-awesome/fa-recycle",
label: function() {
return this.name || "Reactor";
},
oneditprepare: function() {
// wait for the menu scripts to load
const waitForMenuData = () => {
if (window.EVOLV?.nodes?.reactor?.initEditor) {
window.EVOLV.nodes.reactor.initEditor(this);
} else {
setTimeout(waitForMenuData, 50);
}
};
waitForMenuData();
$("#node-input-volume").typedInput({
type:"num",
types:["num"]
});
$("#node-input-length").typedInput({
type:"num",
types:["num"]
});
$("#node-input-resolution_L").typedInput({
type:"num",
types:["num"]
});
$("#node-input-kla").typedInput({
type:"num",
types:["num"]
});
$(".concentrations").typedInput({
type:"num",
types:["num"]
});
$("#node-input-reactor_type").typedInput({
types: [
{
value: "CSTR",
options: [
{ value: "CSTR", label: "CSTR"},
{ value: "PFR", label: "PFR"}
]
}
]
})
$("#node-input-reactor_type").on("change", function() {
const type = $("#node-input-reactor_type").typedInput("value");
if (type === "CSTR") {
$(".PFR").hide();
} else {
$(".PFR").show();
}
});
$("#node-input-timeStep").typedInput({
type:"num",
types:["num"]
})
// Set initial visibility on dialog open
const initialType = $("#node-input-reactor_type").typedInput("value");
if (initialType === "CSTR") {
$(".PFR").hide();
} else {
$(".PFR").show();
}
const updateDx = () => {
const length = parseFloat($("#node-input-length").val()) || 0;
const resolution = parseFloat($("#node-input-resolution_L").val()) || 1;
const dx = resolution > 0 ? (length / resolution).toFixed(6) : "N/A";
$("#dx-output").text(dx + " m");
};
// Set up event listeners for real-time updates
$("#node-input-length, #node-input-resolution_L").on("change keyup", updateDx);
// Initial calculation
updateDx();
},
oneditsave: function() {
// save logger fields
if (window.EVOLV?.nodes?.reactor?.loggerMenu?.saveEditor) {
window.EVOLV.nodes.reactor.loggerMenu.saveEditor(this);
}
// save position field
if (window.EVOLV?.nodes?.measurement?.positionMenu?.saveEditor) {
window.EVOLV.nodes.rotatingMachine.positionMenu.saveEditor(this);
}
let volume = parseFloat($("#node-input-volume").typedInput("value"));
if (isNaN(volume) || volume <= 0) {
RED.notify("Fluid volume not set correctly", {type: "error"});
}
}
});
</script>
<script type="text/html" data-template-name="reactor">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
<h2> Reactor properties </h2>
<div class="form-row">
<label for="node-input-reactor_type"><i class="fa fa-tag"></i> Reactor type</label>
<input type="text" id="node-input-reactor_type">
</div>
<div class="form-row">
<label for="node-input-volume"><i class="fa fa-tag"></i> Fluid volume [m3]</label>
<input type="text" id="node-input-volume" placeholder="m3">
</div>
<div class="form-row PFR">
<label for="node-input-length"><i class="fa fa-tag"></i> Reactor length [m]</label>
<input type="text" id="node-input-length" placeholder="m">
</div>
<h2> Simulation parameters </h2>
<div class="form-row">
<label for="node-input-timeStep"><i class="fa fa-tag"></i> Time step [s]</label>
<input type="text" id="node-input-timeStep" placeholder="s">
</div>
<div class="form-row PFR">
<label for="node-input-resolution_L"><i class="fa fa-tag"></i> Spatial resolution</label>
<input type="text" id="node-input-resolution_L" placeholder="#">
</div>
<div class="form-row PFR">
<label for="node-input-dx"><i class="fa fa-tag"></i> Δx (length / resolution) [m]</label>
<span id="dx-output" style="display: inline-block; padding: 8px; font-weight: bold;">--</span>
</div>
<h3> Internal mass transfer calculation (optional) </h3>
<div class="form-row">
<label for="node-input-kla"><i class="fa fa-tag"></i> kLa [d-1]</label>
<input type="text" id="node-input-kla" placeholder="d-1">
</div>
<h2> Dissolved components </h2>
<div class="form-row">
<label for="node-input-S_O_init"><i class="fa fa-tag"></i> Initial dissolved oxygen [g O2 m-3]</label>
<input type="text" id="node-input-S_O_init" class="concentrations">
</div>
<div class="form-row">
<label for="node-input-S_I_init"><i class="fa fa-tag"></i> Initial soluble inert organics [g COD m-3]</label>
<input type="text" id="node-input-S_I_init" class="concentrations">
</div>
<div class="form-row">
<label for="node-input-S_S_init"><i class="fa fa-tag"></i> Initial readily biodegrable substrates [g COD m-3]</label>
<input type="text" id="node-input-S_S_init" class="concentrations">
</div>
<div class="form-row">
<label for="node-input-S_NH_init"><i class="fa fa-tag"></i> Initial ammonium / ammonia [g N m-3]</label>
<input type="text" id="node-input-S_NH_init" class="concentrations">
</div>
<div class="form-row">
<label for="node-input-S_N2_init"><i class="fa fa-tag"></i> Initial dinitrogen, released by denitrification [g N m-3]</label>
<input type="text" id="node-input-S_N2_init" class="concentrations">
</div>
<div class="form-row">
<label for="node-input-S_NO_init"><i class="fa fa-tag"></i> Initial nitrite + nitrate [g N m-3]</label>
<input type="text" id="node-input-S_NO_init" class="concentrations">
</div>
<div class="form-row">
<label for="node-input-S_HCO_init"><i class="fa fa-tag"></i> Initial alkalinity, bicarbonate [mole HCO3- m-3]</label>
<input type="text" id="node-input-S_HCO_init" class="concentrations">
</div>
<h2> Particulate components </h2>
<div class="form-row">
<label for="node-input-X_I_init"><i class="fa fa-tag"></i> Initial inert particulate organics [g COD m-3]</label>
<input type="text" id="node-input-X_I_init" class="concentrations">
</div>
<div class="form-row">
<label for="node-input-X_S_init"><i class="fa fa-tag"></i> Initial slowly biodegrable substrates [g COD m-3]</label>
<input type="text" id="node-input-X_S_init" class="concentrations">
</div>
<div class="form-row">
<label for="node-input-X_H_init"><i class="fa fa-tag"></i> Initial heterotrophic biomass [g COD m-3]</label>
<input type="text" id="node-input-X_H_init" class="concentrations">
</div>
<div class="form-row">
<label for="node-input-X_STO_init"><i class="fa fa-tag"></i> Initial Organics stored by heterotrophs [g COD m-3]</label>
<input type="text" id="node-input-X_STO_init" class="concentrations">
</div>
<div class="form-row">
<label for="node-input-X_A_init"><i class="fa fa-tag"></i> Initial autotrophic, nitrifying biomass [g COD m-3]</label>
<input type="text" id="node-input-X_A_init" class="concentrations">
</div>
<div class="form-row">
<label for="node-input-X_TS_init"><i class="fa fa-tag"></i> Initial total suspended solids [g TSS m-3]</label>
<input type="text" id="node-input-X_TS_init" class="concentrations">
</div>
<!-- Logger fields injected here -->
<div id="logger-fields-placeholder"></div>
<!-- Position fields will be injected here -->
<div id="position-fields-placeholder"></div>
</script>
<script type="text/html" data-help-name="reactor">
<p>New reactor node</p>
</script>