From d5ff5d521fba9a135d8974d1bcb58f3f4728fa02 Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Tue, 13 May 2025 13:28:04 +0200 Subject: [PATCH 01/47] initial concept --- .../reaction/ActivatedSludgeModelDrei.cpp | 298 ++++++++++++++++++ 1 file changed, 298 insertions(+) create mode 100644 src/libcadet/model/reaction/ActivatedSludgeModelDrei.cpp diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelDrei.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelDrei.cpp new file mode 100644 index 000000000..ff8da5126 --- /dev/null +++ b/src/libcadet/model/reaction/ActivatedSludgeModelDrei.cpp @@ -0,0 +1,298 @@ +// ============================================================================= +// CADET - The Chromatography Analysis and Design Toolkit +// +// Copyright © 2008-present: The CADET-Core Authors +// Please see the AUTHORS.md file. +// +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the GNU Public License v3.0 (or, at +// your option, any later version) which accompanies this distribution, and +// is available at http://www.gnu.org/licenses/gpl.html +// ============================================================================= + +#include "model/reaction/ReactionModelBase.hpp" +#include "model/ExternalFunctionSupport.hpp" +#include "model/ModelUtils.hpp" +#include "cadet/Exceptions.hpp" +#include "model/Parameters.hpp" +#include "LocalVector.hpp" +#include "SimulationTypes.hpp" +#include "linalg/ActiveDenseMatrix.hpp" +#include "MathUtil.hpp" +#include "Memory.hpp" + +#include +#include +#include +#include + +/* +{ + "name": "MichaelisMentenParamHandler", + "externalName": "ExtMichaelisMentenParamHandler", + "parameters": + [ + { "type": "ScalarReactionDependentParameter", "varName": "vMax", "confName": "MM_VMAX"}, + { "type": "ScalarReactionDependentParameter", "varName": "kMM", "confName": "MM_KMM"}, + { "type": "ComponentDependentReactionDependentParameter", "varName": "kInhibit", "confName": "MM_KI"} + ] +} +*/ + +/* Parameter description + ------------------------ +*/ + + +namespace cadet +{ + +namespace model +{ + +inline const char* MichaelisMentenParamHandler::identifier() CADET_NOEXCEPT { return "MICHAELIS_MENTEN"; } + +inline bool MichaelisMentenParamHandler::validateConfig(unsigned int nReactions, unsigned int nComp, unsigned int const* nBoundStates) +{ + return true; +} + +inline const char* ExtMichaelisMentenParamHandler::identifier() CADET_NOEXCEPT { return "EXT_MICHAELIS_MENTEN"; } + +inline bool ExtMichaelisMentenParamHandler::validateConfig(unsigned int nReactions, unsigned int nComp, unsigned int const* nBoundStates) +{ + return true; +} + +namespace +{ + /** + * @brief Registers a matrix-valued parameter (row-major storage) with components as rows + * @details The matrix-valued parameter has as many rows as there are components in the system. + * @param [in,out] parameters Parameter map + * @param [in] unitOpIdx Unit operation id + * @param [in] parTypeIdx Particle type index + * @param [in] paramName Name of the parameter + * @param [in] mat Matrix to register + */ + inline void registerCompRowMatrix(std::unordered_map& parameters, UnitOpIdx unitOpIdx, ParticleTypeIdx parTypeIdx, const std::string& paramName, cadet::linalg::ActiveDenseMatrix& mat) + { + const cadet::StringHash hashName = cadet::hashStringRuntime(paramName); + cadet::registerParam2DArray(parameters, mat.data(), mat.elements(), [=](bool multi, unsigned int row, unsigned int col) + { + return cadet::makeParamId(hashName, unitOpIdx, row, parTypeIdx, cadet::BoundStateIndep, col, cadet::SectionIndep); + }, + mat.columns() + ); + } +} + + +/** + * @brief Defines a Michaelis-Menten reaction kinetic with simple inhibition + * @details Implements the Michaelis-Menten kinetics: \f[ \begin{align} + * S \nu, + * \end{align} \f] + * where \f$ S \f$ is the stoichiometric matrix and the fluxes are given by + * \f[ \begin{align} + * \nu_i = \frac{\mu_{\mathrm{max},i} c_S}{k_{\mathrm{MM},i} + c_S}. + * \end{align} \f] + * The substrate component \f$ c_S \f$ is identified by the index of the + * first negative entry in the stoichiometry of this reaction. + * In addition, the reaction might be inhibited by other components. In this + * case, the flux has the form + * \f[ \begin{align} + * \nu_i = \frac{\mu_{\mathrm{max},i} c_S}{k_{\mathrm{MM},i} + c_S} \cdot \frac{1}{1 + \sum_i \frac{1+ k_{\mathrm{I},i,j}}{k_{\mathrm{I},i,j} + c_{\mathrm{I},j}}}. + * \end{align} \f] + * The value of \f$ k_{\mathrm{I},i,j} \f$ decides whether component \f$ j \f$ + * inhibits reaction \f$ i \f$. If \f$ k_{\mathrm{I},i,j} \leq 0 \f$, the component + * does not inhibit the reaction. + * Only reactions in liquid phase are supported (no solid phase or cross-phase reactions). + * @tparam ParamHandler_t Type that can add support for external function dependence + */ +template +class MichaelisMentenReactionBase : public DynamicReactionModelBase +{ +public: + + MichaelisMentenReactionBase() : _idxSubstrate(0) { } + virtual ~MichaelisMentenReactionBase() CADET_NOEXCEPT { } + + static const char* identifier() { return ParamHandler_t::identifier(); } + virtual const char* name() const CADET_NOEXCEPT { return ParamHandler_t::identifier(); } + + virtual void setExternalFunctions(IExternalFunction** extFuns, unsigned int size) { _paramHandler.setExternalFunctions(extFuns, size); } + virtual bool dependsOnTime() const CADET_NOEXCEPT { return ParamHandler_t::dependsOnTime(); } + virtual bool requiresWorkspace() const CADET_NOEXCEPT { return true; } + virtual unsigned int workspaceSize(unsigned int nComp, unsigned int totalNumBoundStates, unsigned int const* nBoundStates) const CADET_NOEXCEPT + { + return _paramHandler.cacheSize(_stoichiometryBulk.columns(), nComp, totalNumBoundStates) + std::max(_stoichiometryBulk.columns() * sizeof(active), 2 * (_nComp + totalNumBoundStates) * sizeof(double)); + } + + virtual bool configureModelDiscretization(IParameterProvider& paramProvider, unsigned int nComp, unsigned int const* nBound, unsigned int const* boundOffset) + { + DynamicReactionModelBase::configureModelDiscretization(paramProvider, nComp, nBound, boundOffset); + + if (paramProvider.exists("MM_STOICHIOMETRY_BULK")) + { + const std::size_t numElements = paramProvider.numElements("MM_STOICHIOMETRY_BULK"); + if (numElements % nComp != 0) + throw InvalidParameterException("Size of field MM_STOICHIOMETRY_BULK must be a positive multiple of NCOMP (" + std::to_string(nComp) + ")"); + + const unsigned int nReactions = numElements / nComp; + + _stoichiometryBulk.resize(nComp, nReactions); + _idxSubstrate = std::vector(nReactions, -1); + } + + return true; + } + + virtual unsigned int numReactionsLiquid() const CADET_NOEXCEPT { return _stoichiometryBulk.columns(); } + virtual unsigned int numReactionsCombined() const CADET_NOEXCEPT { return 0; } + + CADET_DYNAMICREACTIONMODEL_BOILERPLATE + +protected: + ParamHandler_t _paramHandler; //!< Handles parameters and their dependence on external functions + + linalg::ActiveDenseMatrix _stoichiometry; + + + + virtual bool configureStoich(IParameterProvider& paramProvider, UnitOpIdx unitOpIdx, ParticleTypeIdx parTypeIdx) + { + return true; + } + + + virtual bool configureImpl(IParameterProvider& paramProvider, UnitOpIdx unitOpIdx, ParticleTypeIdx parTypeIdx) + { + _paramHandler.configure(paramProvider, _stoichiometryBulk.columns(), _nComp, _nBoundStates); + _paramHandler.registerParameters(_parameters, unitOpIdx, parTypeIdx, _nComp, _nBoundStates); + + // configure stoichiometric matrix from given parameters + //configureStoich(paramProvider,unitOpIdx, parTypeIdx) + + //registerCompRowMatrix(_parameters, unitOpIdx, parTypeIdx, "MM_STOICHIOMETRY_BULK", _stoichiometryBulk); todo + + return true; + } + + template + int residualLiquidImpl(double t, unsigned int secIdx, const ColumnPosition& colPos, + StateType const* y, ResidualType* res, const FactorType& factor, LinearBufferAllocator workSpace) const + { + typename ParamHandler_t::ParamsHandle const p = _paramHandler.update(t, secIdx, colPos, _nComp, _nBoundStates, workSpace); + + // Calculate fluxes + typedef typename DoubleActivePromoter::type flux_t; + BufferedArray fluxes = workSpace.array(_stoichiometry.columns()); + /* | Component | Index | + | -------- - | ---- - | + | SO | 0 | + | SS | 1 | + | SNH | 2 | + | SNO | 3 | + | SN2 | 4 | + | SALK | 5 | + | SI | 6 | + | XI | 7 | + | XS | 8 | + | XH | 9 | + | XSTO | 10 | + | XA | 11 | + | XMI | 12 | */ + + // flux 0: kh2o fto(T) HS/XH/(... + ParamType kh2o = 0.0; + ParamType ft04 = 0.0; // eigentlich abhännig von temperatur (später Parameter-Parameter Dependencies) + ParamType kX = 0.0; + + StateType XS = y[8]; + StateType XH = y[9]; + + fluxes[0] = kh2o * ft0 * (XS / XH) / (XS / XH) + kX * XH; + + // flux 1: + fluxes[1] = + fluxes[2] = + fluxes[3] = + fluxes[4] = + fluxes[5] = + fluxes[6] = + fluxes[7] = + fluxes[8] = + fluxes[9] = + fluxes[10] = + fluxes[11] = + + + // Add reaction terms to residual + _stoichiometry.multiplyVector(static_cast(fluxes), factor, res); + + return 0; + } + + template + int residualCombinedImpl(double t, unsigned int secIdx, const ColumnPosition& colPos, + StateType const* yLiquid, StateType const* ySolid, ResidualType* resLiquid, ResidualType* resSolid, double factor, LinearBufferAllocator workSpace) const + { + std::fill_n(resLiquid, _nComp, 0.0); + + if (_nTotalBoundStates == 0) + return 0; + + std::fill_n(resSolid, _nTotalBoundStates, 0.0); + + return 0; + } + + template + void jacobianLiquidImpl(double t, unsigned int secIdx, const ColumnPosition& colPos, double const* y, double factor, const RowIterator& jac, LinearBufferAllocator workSpace) const + { + typename ParamHandler_t::ParamsHandle const p = _paramHandler.update(t, secIdx, colPos, _nComp, _nBoundStates, workSpace); + + + + + + // for each inhibitor component + curJac = jac; + for (int row = 0; row < _nComp; ++row, ++curJac) + { + const double colFactor = static_cast(_stoichiometryBulk.native(row, r)) * factor; + for (int comp = 0; comp < _nComp; ++comp) + { + const double kI = static_cast(p->kInhibit[_nComp * r + comp]); + if (kI <= 0.0) + continue; + + double dvdi = - (vMax * y[idxSubs] * (kMM + y[idxSubs])) / (denom * denom * kI); + curJac[comp - static_cast(row)] += colFactor * dvdi; + } + } + + } + + template + void jacobianCombinedImpl(double t, unsigned int secIdx, const ColumnPosition& colPos, double const* yLiquid, double const* ySolid, double factor, const RowIteratorLiquid& jacLiquid, const RowIteratorSolid& jacSolid, LinearBufferAllocator workSpace) const + { + } +}; + +typedef MichaelisMentenReactionBase MichaelisMentenReaction; +typedef MichaelisMentenReactionBase ExternalMichaelisMentenReaction; + +namespace reaction +{ + void registerMichaelisMentenReaction(std::unordered_map>& reactions) + { + reactions[MichaelisMentenReaction::identifier()] = []() { return new MichaelisMentenReaction(); }; + reactions[ExternalMichaelisMentenReaction::identifier()] = []() { return new ExternalMichaelisMentenReaction(); }; + } +} // namespace reaction + +} // namespace model + +} // namespace cadet From cd09ef8f908ac657a57f1cd78bcd06b3808f87f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Tue, 13 May 2025 14:29:19 +0200 Subject: [PATCH 02/47] ASM3: compute p2-5 --- .../reaction/ActivatedSludgeModelDrei.cpp | 53 +++++++++++++------ 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelDrei.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelDrei.cpp index ff8da5126..53f86875f 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelDrei.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelDrei.cpp @@ -205,27 +205,48 @@ class MichaelisMentenReactionBase : public DynamicReactionModelBase | XMI | 12 | */ // flux 0: kh2o fto(T) HS/XH/(... - ParamType kh2o = 0.0; - ParamType ft04 = 0.0; // eigentlich abhännig von temperatur (später Parameter-Parameter Dependencies) - ParamType kX = 0.0; + ParamType Kh20 = 0.0; + ParamType ft04 = 0.0; // eigentlich abhängig von temperatur (später Parameter-Parameter Dependencies) + //ParamType KX = 0.0; // TODO: is this a param? StateType XS = y[8]; StateType XH = y[9]; - fluxes[0] = kh2o * ft0 * (XS / XH) / (XS / XH) + kX * XH; + // p1: Hydrolysis of organic structures + fluxes[0] = Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX) * XH; - // flux 1: - fluxes[1] = - fluxes[2] = - fluxes[3] = - fluxes[4] = - fluxes[5] = - fluxes[6] = - fluxes[7] = - fluxes[8] = - fluxes[9] = - fluxes[10] = - fluxes[11] = + // p2: Aerobic storage of SS + fluxes[1] = k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; + + // p3: Anoxic storage of SS + fluxes[2] = k_sto * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; + + // p4: Aerobic growth of heterotrophic biomass (XH) + fluxes[3] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) * XH; + + // p5: Anoxic growth of heterotrophic biomass (XH, denitrification) + fluxes[4] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; + + // r6: Aerobic endogenous respiration of heterotroph microorganisms (XH) + //fluxes[5] = + + // r7: Anoxic endogenous respiration of heterotroph microorganisms (XH) + //fluxes[6] = + + // r8: Aerobic respiration of internal cell storage products + //fluxes[7] = + + // r9: Anoxic respiration of internal cell storage products + //fluxes[8] = + + // r10: Aerobic growth of autotrophic biomass (XAUT, nitrification) + //fluxes[9] = + + // r11: Aerobic endogenous respiration of autotrophic biomass (XAUT) + //fluxes[10] = + + // r12: Anoxic endogenous respiration of autotrophic biomass (XAUT) + //fluxes[11] = // Add reaction terms to residual From cd8d38842aa9775a0421c582b32a48f5cdd12922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Tue, 13 May 2025 15:01:38 +0200 Subject: [PATCH 03/47] ASM3: compute r6-12 --- .../reaction/ActivatedSludgeModelDrei.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelDrei.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelDrei.cpp index 53f86875f..10c0f30f6 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelDrei.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelDrei.cpp @@ -209,6 +209,11 @@ class MichaelisMentenReactionBase : public DynamicReactionModelBase ParamType ft04 = 0.0; // eigentlich abhängig von temperatur (später Parameter-Parameter Dependencies) //ParamType KX = 0.0; // TODO: is this a param? + StateType SO = y[0]; + StateType SS = y[1]; + StateType SNH = y[2]; + StateType SNO = y[3]; + StateType XS = y[8]; StateType XH = y[9]; @@ -228,25 +233,25 @@ class MichaelisMentenReactionBase : public DynamicReactionModelBase fluxes[4] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; // r6: Aerobic endogenous respiration of heterotroph microorganisms (XH) - //fluxes[5] = + fluxes[5] = bH * SO / (SO + KHO2) * XH; // r7: Anoxic endogenous respiration of heterotroph microorganisms (XH) - //fluxes[6] = + fluxes[6] = bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XH; // r8: Aerobic respiration of internal cell storage products - //fluxes[7] = + fluxes[7] = bH * SO / (SO + KHO2) * XSTO; // r9: Anoxic respiration of internal cell storage products - //fluxes[8] = + fluxes[8] = bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XSTO; // r10: Aerobic growth of autotrophic biomass (XAUT, nitrification) - //fluxes[9] = + fluxes[9] = muAUT * SO / (SO + KNO2) * SNH / (SNH + KNNH4) * SALK / (SALK + KNALK) * XA; // r11: Aerobic endogenous respiration of autotrophic biomass (XAUT) - //fluxes[10] = + fluxes[10] = bAUT * SO / (SO + KHO2) * XA; // r12: Anoxic endogenous respiration of autotrophic biomass (XAUT) - //fluxes[11] = + fluxes[11] = bAUT * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2) * XA; // Add reaction terms to residual From 3c56f72c917623dd7c6566db36acb35f4d4295fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Tue, 13 May 2025 15:52:16 +0200 Subject: [PATCH 04/47] ASM3: set up parameters and derived variables --- .../reaction/ActivatedSludgeModelDrei.cpp | 61 ++++++++++++------- 1 file changed, 40 insertions(+), 21 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelDrei.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelDrei.cpp index 10c0f30f6..798b5b5db 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelDrei.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelDrei.cpp @@ -188,34 +188,54 @@ class MichaelisMentenReactionBase : public DynamicReactionModelBase // Calculate fluxes typedef typename DoubleActivePromoter::type flux_t; BufferedArray fluxes = workSpace.array(_stoichiometry.columns()); - /* | Component | Index | - | -------- - | ---- - | - | SO | 0 | - | SS | 1 | - | SNH | 2 | - | SNO | 3 | - | SN2 | 4 | - | SALK | 5 | - | SI | 6 | - | XI | 7 | - | XS | 8 | - | XH | 9 | - | XSTO | 10 | - | XA | 11 | - | XMI | 12 | */ - // flux 0: kh2o fto(T) HS/XH/(... - ParamType Kh20 = 0.0; - ParamType ft04 = 0.0; // eigentlich abhängig von temperatur (später Parameter-Parameter Dependencies) - //ParamType KX = 0.0; // TODO: is this a param? + ParamType Kh20 = 10.2; + ParamType T = 20; + ParamType k_sto20 = 13.68; + ParamType KX = 1; + ParamType KHO2 = 0.2; + ParamType KHSS = 3; + ParamType KHNO3 = 0.5; + ParamType etaHNO3 = 0.5; + ParamType KHNH4 = 0.01; + ParamType KHALK = 0.1; + ParamType KHSTO = 0.11; + ParamType muH20 = 3; + ParamType etaHend = 0.5; + ParamType bH20 = 0.33; + ParamType muAUT20 = 1.12; + ParamType KNO2 = 0.5; + ParamType KNNH4 = 0.7; + ParamType KNALK = 0.5; + ParamType bAUT20 = 0.18; + ParamType etaNend = 0.5; + + // derived parameters + // TODO use parameter-parameter dependency + double ft04 = exp(-0.04 * (20.0 - static_cast(T))); + double ft07 = exp(-0.06952 * (20 - static_cast(T))); + double ft105 = exp(-0.105 * (20 - static_cast(T))); + double k_sto = static_cast(k_sto20) * ft07; + double muH = static_cast(muH20) * ft07; + double bH = static_cast(bH20) * ft07; + double muAUT = static_cast(muAUT20) * ft105; + double bAUT = static_cast(bAUT20) * ft105; StateType SO = y[0]; StateType SS = y[1]; StateType SNH = y[2]; StateType SNO = y[3]; - + StateType SN2 = y[4]; + StateType SALK = y[5]; + // StateType SI = y[6]; // unused + // StateType XI = y[7]; // unused StateType XS = y[8]; StateType XH = y[9]; + StateType XH_S = XH; // ASM3hC: XH_S = max(XH, 0.1) + StateType XSTO = y[10]; + StateType XA = y[11]; + // StateType XMI = y[12]; // unused + // p1: Hydrolysis of organic structures fluxes[0] = Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX) * XH; @@ -252,7 +272,6 @@ class MichaelisMentenReactionBase : public DynamicReactionModelBase // r12: Anoxic endogenous respiration of autotrophic biomass (XAUT) fluxes[11] = bAUT * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2) * XA; - // Add reaction terms to residual _stoichiometry.multiplyVector(static_cast(fluxes), factor, res); From 99713585b087f1a96de24bb262308ede5572c5c9 Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Wed, 14 May 2025 08:39:06 +0200 Subject: [PATCH 05/47] register model and jacobian equation as pseudo code --- src/libcadet/CMakeLists.txt | 1 + src/libcadet/ReactionModelFactory.cpp | 1 + ...Drei.cpp => ActivatedSludgeModelThree.cpp} | 127 ++++++++++++++---- 3 files changed, 100 insertions(+), 29 deletions(-) rename src/libcadet/model/reaction/{ActivatedSludgeModelDrei.cpp => ActivatedSludgeModelThree.cpp} (62%) diff --git a/src/libcadet/CMakeLists.txt b/src/libcadet/CMakeLists.txt index 3c5e41a91..db77fbdc9 100644 --- a/src/libcadet/CMakeLists.txt +++ b/src/libcadet/CMakeLists.txt @@ -114,6 +114,7 @@ set(LIBCADET_REACTIONMODEL_SOURCES ${CMAKE_SOURCE_DIR}/src/libcadet/model/reaction/DummyReaction.cpp ${CMAKE_SOURCE_DIR}/src/libcadet/model/reaction/MassActionLawReaction.cpp ${CMAKE_SOURCE_DIR}/src/libcadet/model/reaction/MichaelisMentenReaction.cpp + ${CMAKE_SOURCE_DIR}/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp ${CMAKE_SOURCE_DIR}/src/libcadet/model/reaction/CrystallizationReaction.cpp ) diff --git a/src/libcadet/ReactionModelFactory.cpp b/src/libcadet/ReactionModelFactory.cpp index 598662c47..63b041043 100644 --- a/src/libcadet/ReactionModelFactory.cpp +++ b/src/libcadet/ReactionModelFactory.cpp @@ -33,6 +33,7 @@ namespace cadet model::reaction::registerDummyReaction(_dynamicModels); model::reaction::registerMassActionLawReaction(_dynamicModels); model::reaction::registerMichaelisMentenReaction(_dynamicModels); + model::reaction::registerActivatedSludgeModelThreeReaction(_dynamicModels); model::reaction::registerCrystallizationReaction(_dynamicModels); } diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelDrei.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp similarity index 62% rename from src/libcadet/model/reaction/ActivatedSludgeModelDrei.cpp rename to src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index 798b5b5db..4c172794a 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelDrei.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -28,8 +28,8 @@ /* { - "name": "MichaelisMentenParamHandler", - "externalName": "ExtMichaelisMentenParamHandler", + "name": "ActivatedSludgeModelThreeParamHandler", + "externalName": "ExtActivatedSludgeModelThreeParamHandler", "parameters": [ { "type": "ScalarReactionDependentParameter", "varName": "vMax", "confName": "MM_VMAX"}, @@ -50,16 +50,16 @@ namespace cadet namespace model { -inline const char* MichaelisMentenParamHandler::identifier() CADET_NOEXCEPT { return "MICHAELIS_MENTEN"; } +inline const char* ActivatedSludgeModelThreeParamHandler::identifier() CADET_NOEXCEPT { return "ACTIVATED_SLUDGE_MODEL3"; } -inline bool MichaelisMentenParamHandler::validateConfig(unsigned int nReactions, unsigned int nComp, unsigned int const* nBoundStates) +inline bool ActivatedSludgeModelThreeParamHandler::validateConfig(unsigned int nReactions, unsigned int nComp, unsigned int const* nBoundStates) { return true; } -inline const char* ExtMichaelisMentenParamHandler::identifier() CADET_NOEXCEPT { return "EXT_MICHAELIS_MENTEN"; } +inline const char* ExtActivatedSludgeModelThreeParamHandler::identifier() CADET_NOEXCEPT { return "EXT_ACTIVATED_SLUDGE_MODEL3"; } -inline bool ExtMichaelisMentenParamHandler::validateConfig(unsigned int nReactions, unsigned int nComp, unsigned int const* nBoundStates) +inline bool ExtActivatedSludgeModelThreeParamHandler::validateConfig(unsigned int nReactions, unsigned int nComp, unsigned int const* nBoundStates) { return true; } @@ -111,12 +111,12 @@ namespace * @tparam ParamHandler_t Type that can add support for external function dependence */ template -class MichaelisMentenReactionBase : public DynamicReactionModelBase +class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase { public: - MichaelisMentenReactionBase() : _idxSubstrate(0) { } - virtual ~MichaelisMentenReactionBase() CADET_NOEXCEPT { } + ActivatedSludgeModelThreeBase() : _idxSubstrate(0) { } + virtual ~ActivatedSludgeModelThreeBase() CADET_NOEXCEPT { } static const char* identifier() { return ParamHandler_t::identifier(); } virtual const char* name() const CADET_NOEXCEPT { return ParamHandler_t::identifier(); } @@ -211,7 +211,6 @@ class MichaelisMentenReactionBase : public DynamicReactionModelBase ParamType etaNend = 0.5; // derived parameters - // TODO use parameter-parameter dependency double ft04 = exp(-0.04 * (20.0 - static_cast(T))); double ft07 = exp(-0.06952 * (20 - static_cast(T))); double ft105 = exp(-0.105 * (20 - static_cast(T))); @@ -297,26 +296,96 @@ class MichaelisMentenReactionBase : public DynamicReactionModelBase void jacobianLiquidImpl(double t, unsigned int secIdx, const ColumnPosition& colPos, double const* y, double factor, const RowIterator& jac, LinearBufferAllocator workSpace) const { typename ParamHandler_t::ParamsHandle const p = _paramHandler.update(t, secIdx, colPos, _nComp, _nBoundStates, workSpace); + curJac = jac; + + // reaction 1: Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX) * XH; + // dr1/XS = Kh20 * ft04 * XH / (XS/XH_S + KX) - Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX)^2 * XH; + // dr1/XH_S = -Kh20 * ft04 * XS / (XS/XH_S + KX) / XH_S^2 * XH; + // dr1/HX = Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX); + + //curJac = jac; + // curJac[8] = dr1/XS; + // curJac[X] = dr1/XH_S; ?? + // curJac[9] = dr1/XH; + + // curjac++; + + // reaction2: k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; + // dr2/S0 = k_sto * ft07 * SS / (SS + KHSS) * SNO / (SNO + KHNO3) / (SO + KHO2)^2 * XH; + // dr2/SS = k_sto * ft07 * SO / (SO + KHO2) * SNO / (SNO + KHNO3) / (SS + KHSS)^2 * XH; + // dr2/SNO = k_sto * ft07 * SO / (SO + KHO2) * SS / (SS + KHSS) / (SNO + KHNO3)^2 * XH; + // dr2/XH = k_sto * ft07 * SO / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); + + //curJac[-1] = dr2/S0; + //curJac[0] = dr2/SS; + //curJac[1] = dr2/SNO; + //curJac[8] = dr2/XH; + + // curJac++; + + //reaction3: k_sto * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; + // dr3/S0 = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2)^2 * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; + // dr3/SS = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS)^2 * SNO / (SNO + KHNO3) * XH; + // dr3/SNO = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) / (SNO + KHNO3)^2 * XH; + // dr3/XH = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); + + //reaction4: muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) * XH; + // dr4/S0 = muH * ft07 * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / (SO + KHO2)^2 * XH; + // dr4/SNH = muH * ft07 * SO / (SO + KHO2) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / (SNH + KHNH4)^2 * XH; + // dr4/SALK = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / (SALK + KHALK)^2 * XH; + // dr4/XSTO = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) / (XSTO/XH_S + KHSTO)^2 * XH; + // dr4/XH_S = -muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) / XSTO/XH_S^2 * XH; + // dr4/XH = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO); + + //reaction5: muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; + // dr5/S0 = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO)^2 * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; + // dr5/SNH = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH)^2 * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; + // dr5/SALK = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK)^2 * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; + // dr5/XSTO = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) / (XSTO/XH_S + KHSTO)^2 * SNO / (KHNO3 + SNO) * XH; + // dr5/XH_S = -muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) / XSTO/XH_S^2 * SNO / (KHNO3 + SNO) * XH; + // dr5/SNO = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) / (KHNO3 + SNO)^2 * XH; + // dr5/XH = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO); + + + //reaction6: bH * SO / (SO + KHO2) * XH; + // dr6/S0 = bH * ft07 * XH / (SO + KHO2)^2; + // dr6/XH = bH * ft07 * SO / (SO + KHO2); + + //reaction7: bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XH; + // dr7/S0 = bH * ft07 * etaHend * KHO2 / (SO + KHO2)^2 * SNO / (SNO + KHNO3) * XH; + // dr7/SNO = bH * ft07 * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3)^2 * XH; + // dr7/XH = bH * ft07 * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XH; + //reaction8: bH * SO / (SO + KHO2) * XSTO; + // dr8/S0 = bH * ft07 * XSTO / (SO + KHO2)^2; + // dr8/XSTO = bH * ft07 * SO / (SO + KHO2); + //reaction9: bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XSTO; + // dr9/S0 = bH * ft07 * etaHend * KHO2 / (SO + KHO2)^2 * SNO / (SNO + KHNO3) * XSTO; + // dr9/SNO = bH * ft07 * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3)^2 * XSTO; + //reaction10: muAUT * SO / (SO + KNO2) * SNH / (SNH + KNNH4) * SALK / (SALK + KNALK) * XA; + // dr10/S0 = muAUT * ft105 * SNH / (SNH + KNNH4) * SALK / (SALK + KNALK) * XA / (SO + KNO2)^2; + // dr10/SNH = muAUT * ft105 * SO / (SO + KNO2) * SALK / (SALK + KNALK) / (SNH + KNNH4)^2 * XA; + // dr10/SALK = muAUT * ft105 * SO / (SO + KNO2) * SNH / (SNH + KNNH4) / (SALK + KNALK)^2 * XA; + //reaction11: bAUT * SO / (SO + KHO2) * XA; + // dr11/S0 = bAUT * ft105 * XA / (SO + KHO2)^2; + // dr11/XA = bAUT * ft105 * SO / (SO + KHO2); - // for each inhibitor component - curJac = jac; - for (int row = 0; row < _nComp; ++row, ++curJac) - { - const double colFactor = static_cast(_stoichiometryBulk.native(row, r)) * factor; - for (int comp = 0; comp < _nComp; ++comp) - { - const double kI = static_cast(p->kInhibit[_nComp * r + comp]); - if (kI <= 0.0) - continue; - double dvdi = - (vMax * y[idxSubs] * (kMM + y[idxSubs])) / (denom * denom * kI); - curJac[comp - static_cast(row)] += colFactor * dvdi; - } - } + //reaction12: bAUT * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2) * XA; + // dr12/S0 = bAUT * ft105 * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2)^2 * XA; + // dr12/SNO = bAUT * ft105 * etaNend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3)^2 * XA; + // dr12/XA = bAUT * ft105 * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2) * XA; + + + + // StateType SI = y[6]; // unused + // StateType XI = y[7]; // unused + // StateType XMI = y[12]; // unused + + } @@ -326,15 +395,15 @@ class MichaelisMentenReactionBase : public DynamicReactionModelBase } }; -typedef MichaelisMentenReactionBase MichaelisMentenReaction; -typedef MichaelisMentenReactionBase ExternalMichaelisMentenReaction; +typedef ActivatedSludgeModelThreeBase ActivatedSludgeModelThreeReaction; +typedef ActivatedSludgeModelThreeBase ExternalActivatedSludgeModelThreeReaction; namespace reaction { - void registerMichaelisMentenReaction(std::unordered_map>& reactions) + void registerActivatedSludgeModelThreeReaction(std::unordered_map>& reactions) { - reactions[MichaelisMentenReaction::identifier()] = []() { return new MichaelisMentenReaction(); }; - reactions[ExternalMichaelisMentenReaction::identifier()] = []() { return new ExternalMichaelisMentenReaction(); }; + reactions[ActivatedSludgeModelThreeReaction::identifier()] = []() { return new ActivatedSludgeModelThreeReaction(); }; + reactions[ExternalActivatedSludgeModelThreeReaction::identifier()] = []() { return new ExternalActivatedSludgeModelThreeReaction(); }; } } // namespace reaction From 12a5b67de181191a080857096b10f0e9d7ea0424 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Wed, 14 May 2025 09:26:27 +0200 Subject: [PATCH 06/47] ASM3: add Aeration --- src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index 4c172794a..e98f17cc6 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -191,6 +191,8 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase ParamType Kh20 = 10.2; ParamType T = 20; + ParamType iO2 = 0; + ParamType V = 1; ParamType k_sto20 = 13.68; ParamType KX = 1; ParamType KHO2 = 0.2; @@ -271,6 +273,9 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase // r12: Anoxic endogenous respiration of autotrophic biomass (XAUT) fluxes[11] = bAUT * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2) * XA; + + // r13: Aeration + fluxes[12] = iO2 / V * 1000; // Add reaction terms to residual _stoichiometry.multiplyVector(static_cast(fluxes), factor, res); From 5e65317124c4d221d0fec29ab2d2d80c86688e9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Wed, 14 May 2025 10:00:14 +0200 Subject: [PATCH 07/47] ASM3: basic stoichiometry definition --- .../reaction/ActivatedSludgeModelThree.cpp | 96 ++++++++++++++++++- 1 file changed, 95 insertions(+), 1 deletion(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index e98f17cc6..594e76360 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -168,7 +168,101 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase virtual bool configureImpl(IParameterProvider& paramProvider, UnitOpIdx unitOpIdx, ParticleTypeIdx parTypeIdx) { - _paramHandler.configure(paramProvider, _stoichiometryBulk.columns(), _nComp, _nBoundStates); + _stoichiometry.resize(_nComp, 13); + _stoichiometry.setAll(0); + + // SO + _stoichiometry.native(0, 1) = YSTO_aer - 1; + _stoichiometry.native(0, 3) = 1 - 1 / YH_aer; + _stoichiometry.native(0, 5) = -1 * (1 - fXI); + _stoichiometry.native(0, 7) = -1; + _stoichiometry.native(0, 9 = -64/14 * 1/YA + 1; + _stoichiometry.native(0, 10) = -1 * (1 - fXI); + _stoichiometry.native(0, 12) = 1; + + // SS + _stoichiometry.native(1, 0) = 1 - fSI; + _stoichiometry.native(1, 1) = -1; + _stoichiometry.native(1, 2) = -1; + + // SNH + _stoichiometry.native(2, 0) = c1n; + _stoichiometry.native(2, 1) = c2n; + _stoichiometry.native(2, 2) = c3n; + _stoichiometry.native(2, 3) = c4n; + _stoichiometry.native(2, 4) = c5n; + _stoichiometry.native(2, 5) = c6n; + _stoichiometry.native(2, 6) = c7n; + _stoichiometry.native(2, 9) = c10n; + _stoichiometry.native(2, 10) = c11n; + _stoichiometry.native(2, 11) = c12n; + + // SNO + _stoichiometry.native(3, 2) = c3no; + _stoichiometry.native(3, 4) = c5no; + _stoichiometry.native(3, 6) = c7no; + _stoichiometry.native(3, 8) = c9no; + _stoichiometry.native(3, 9) = c10no; + _stoichiometry.native(3, 11) = c12no; + + // SN2 + _stoichiometry.native(4, 2) = -c3no; + _stoichiometry.native(4, 4) = -c5no; + _stoichiometry.native(4, 6) = -c7no; + _stoichiometry.native(4, 8) = -c9no; + _stoichiometry.native(4, 11) = -c12no; + + // SALK + _stoichiometry.native(5, 0) = c1a; + _stoichiometry.native(5, 1) = c2a; + _stoichiometry.native(5, 2) = c3a; + _stoichiometry.native(5, 3) = c4a; + _stoichiometry.native(5, 4) = c5a; + _stoichiometry.native(5, 5) = c6a; + _stoichiometry.native(5, 6) = c7a; + _stoichiometry.native(5, 8) = c9a; + _stoichiometry.native(5, 9) = c10a; + _stoichiometry.native(5, 10) = c11a; + _stoichiometry.native(5, 11) = c12a; + + // SI + _stoichiometry.native(6, 0) = fSI; + + // XI + _stoichiometry.native(7, 5) = fXI; + _stoichiometry.native(7, 6) = fXI; + _stoichiometry.native(7, 10) = fXI; + _stoichiometry.native(7, 11) = fXI; + + // XS + _stoichiometry.native(8, 0) = -1; + + // XH + _stoichiometry.native(9, 3) = 1; + _stoichiometry.native(9, 4) = 1; + _stoichiometry.native(9, 5) = -1; + _stoichiometry.native(9, 6) = -1; + + // XSTO + _stoichiometry.native(10, 1) = YSO_aer; + _stoichiometry.native(10, 2) = YSTO_anox; + _stoichiometry.native(10, 3) = -1 / YH_aer; + _stoichiometry.native(10, 4) = -1 / YH_anox; + _stoichiometry.native(10, 7) = -1; + _stoichiometry.native(10, 8) = -1; + + // XA + _stoichiometry.native(11, 9) = 1; + _stoichiometry.native(11, 10) = -1; + _stoichiometry.native(11, 11) = -1; + + // XMI + _stoichiometry.native(12, 5) = fXMI_BM; + _stoichiometry.native(12, 6) = fXMI_BM; + _stoichiometry.native(12, 10) = fXMI_BM; + _stoichiometry.native(12, 11) = fXMI_BM; + + //_paramHandler.configure(paramProvider, _stoichiometry.columns(), _nComp, _nBoundStates); _paramHandler.registerParameters(_parameters, unitOpIdx, parTypeIdx, _nComp, _nBoundStates); // configure stoichiometric matrix from given parameters From 26d0ff161e797a055891a5e56091ea50a28123e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Wed, 14 May 2025 10:31:46 +0200 Subject: [PATCH 08/47] ASM3: parameter set required for stoichiometry --- .../reaction/ActivatedSludgeModelThree.cpp | 57 +++++++++++++++++-- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index 594e76360..bf2245ad1 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -126,7 +126,7 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase virtual bool requiresWorkspace() const CADET_NOEXCEPT { return true; } virtual unsigned int workspaceSize(unsigned int nComp, unsigned int totalNumBoundStates, unsigned int const* nBoundStates) const CADET_NOEXCEPT { - return _paramHandler.cacheSize(_stoichiometryBulk.columns(), nComp, totalNumBoundStates) + std::max(_stoichiometryBulk.columns() * sizeof(active), 2 * (_nComp + totalNumBoundStates) * sizeof(double)); + return _paramHandler.cacheSize(_stoichiometry.columns(), nComp, totalNumBoundStates) + std::max(_stoichiometry.columns() * sizeof(active), 2 * (_nComp + totalNumBoundStates) * sizeof(double)); } virtual bool configureModelDiscretization(IParameterProvider& paramProvider, unsigned int nComp, unsigned int const* nBound, unsigned int const* boundOffset) @@ -141,14 +141,14 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase const unsigned int nReactions = numElements / nComp; - _stoichiometryBulk.resize(nComp, nReactions); + _stoichiometry.resize(nComp, nReactions); _idxSubstrate = std::vector(nReactions, -1); } return true; } - virtual unsigned int numReactionsLiquid() const CADET_NOEXCEPT { return _stoichiometryBulk.columns(); } + virtual unsigned int numReactionsLiquid() const CADET_NOEXCEPT { return _stoichiometry.columns(); } virtual unsigned int numReactionsCombined() const CADET_NOEXCEPT { return 0; } CADET_DYNAMICREACTIONMODEL_BOILERPLATE @@ -171,12 +171,59 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.resize(_nComp, 13); _stoichiometry.setAll(0); + // parameter set ASM3hC + double iNSI = 0.03; + double iNSS = 0.1; + double iNXI = 0.12; + double iNXS = 0.0975; + double iNBM = 0.2; + double fSI = 0; + double YH_aer = 0.850793651; + double YH_anox = 0.698148148; + double YSTO_aer = 0.8966167647; + double YSTO_anox = 0.74375; + double fXI = 0.2; + double YA = 0.09; + double fiSS_BM_prod = 1; + double iVSS_BM = 1.956181534; + double iTSS_VSS_BM = 1.086956522; + + // internal variables + double fXMI_BM = fiSS_BM_prod * fXI * iVSS_BM * (iTSS_VSS_BM - 1); + double c1n = iNXS - iNSI * fSI - (1 - fSI) * iNSS; + double c2n = iNSS; + double c3n = iNSS; + double c4n = -iNBM; + double c5n = c4n; + double c6n = -fXI * iNXI + iNBM; + double c7n = c6n; + double c10n = -1 / YA - iNBM; + double c11n = -fXI * iNXI + iNBM; + double c12n = c11n; + double c3no = (YSTO_anox - 1) / (40 / 14); + double c5no = (1 - 1/YH_anox) / (40 / 14); + double c7no = (fXI - 1) / (40 / 14); + double c9no = -14 / 40; + double c10no = 1 / YA; + double c12no = c7no; + double c1a = c1n / 14; + double c2a = c2n / 14; + double c3a = (c3n - c3no) / 14; + double c4a = c4n / 14; + double c5a = (c5n - c5no) / 14; + double c6a = c6n / 14; + double c7a = (c7n - c7no) / 14; + double c9a = 1 / 40; + double c10a = (c10n - c10no) / 14; + double c11a = c11n / 14; + double c12a = (c12n - c12no) / 14; + // SO _stoichiometry.native(0, 1) = YSTO_aer - 1; _stoichiometry.native(0, 3) = 1 - 1 / YH_aer; _stoichiometry.native(0, 5) = -1 * (1 - fXI); _stoichiometry.native(0, 7) = -1; - _stoichiometry.native(0, 9 = -64/14 * 1/YA + 1; + _stoichiometry.native(0, 9) = -64/14 * 1/YA + 1; _stoichiometry.native(0, 10) = -1 * (1 - fXI); _stoichiometry.native(0, 12) = 1; @@ -244,7 +291,7 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.native(9, 6) = -1; // XSTO - _stoichiometry.native(10, 1) = YSO_aer; + _stoichiometry.native(10, 1) = YSTO_aer; _stoichiometry.native(10, 2) = YSTO_anox; _stoichiometry.native(10, 3) = -1 / YH_aer; _stoichiometry.native(10, 4) = -1 / YH_anox; From d07851e707595aff5ca77a9d212a3ad1fd7def43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Wed, 14 May 2025 11:15:54 +0200 Subject: [PATCH 09/47] ASM3: differentiate p1-5 --- .../reaction/ActivatedSludgeModelThree.cpp | 129 ++++++++++++++---- 1 file changed, 100 insertions(+), 29 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index bf2245ad1..e0c367882 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -312,8 +312,6 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase //_paramHandler.configure(paramProvider, _stoichiometry.columns(), _nComp, _nBoundStates); _paramHandler.registerParameters(_parameters, unitOpIdx, parTypeIdx, _nComp, _nBoundStates); - // configure stoichiometric matrix from given parameters - //configureStoich(paramProvider,unitOpIdx, parTypeIdx) //registerCompRowMatrix(_parameters, unitOpIdx, parTypeIdx, "MM_STOICHIOMETRY_BULK", _stoichiometryBulk); todo @@ -416,7 +414,8 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase fluxes[11] = bAUT * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2) * XA; // r13: Aeration - fluxes[12] = iO2 / V * 1000; + // TODO: is V in litres? + fluxes[12] = iO2 / V; // Add reaction terms to residual _stoichiometry.multiplyVector(static_cast(fluxes), factor, res); @@ -442,12 +441,63 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase void jacobianLiquidImpl(double t, unsigned int secIdx, const ColumnPosition& colPos, double const* y, double factor, const RowIterator& jac, LinearBufferAllocator workSpace) const { typename ParamHandler_t::ParamsHandle const p = _paramHandler.update(t, secIdx, colPos, _nComp, _nBoundStates, workSpace); - curJac = jac; - + RowIterator curJac = jac; + + double Kh20 = 10.2; + double T = 20; + double iO2 = 0; + double V = 1; + double k_sto20 = 13.68; + double KX = 1; + double KHO2 = 0.2; + double KHSS = 3; + double KHNO3 = 0.5; + double etaHNO3 = 0.5; + double KHNH4 = 0.01; + double KHALK = 0.1; + double KHSTO = 0.11; + double muH20 = 3; + double etaHend = 0.5; + double bH20 = 0.33; + double muAUT20 = 1.12; + double KNO2 = 0.5; + double KNNH4 = 0.7; + double KNALK = 0.5; + double bAUT20 = 0.18; + double etaNend = 0.5; + + // derived parameters + double ft04 = exp(-0.04 * (20.0 - static_cast(T))); + double ft07 = exp(-0.06952 * (20 - static_cast(T))); + double ft105 = exp(-0.105 * (20 - static_cast(T))); + double k_sto = static_cast(k_sto20) * ft07; + double muH = static_cast(muH20) * ft07; + double bH = static_cast(bH20) * ft07; + double muAUT = static_cast(muAUT20) * ft105; + double bAUT = static_cast(bAUT20) * ft105; + + double SO = y[0]; + double SS = y[1]; + double SNH = y[2]; + double SNO = y[3]; + double SN2 = y[4]; + double SALK = y[5]; + double SI = y[6]; // unused + double XI = y[7]; // unused + double XS = y[8]; + double XH = y[9]; + double XH_S = XH; // ASM3hC: XH_S = max(XH, 0.1) + double XSTO = y[10]; + double XA = y[11]; + double XMI = y[12]; // unused + // reaction 1: Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX) * XH; - // dr1/XS = Kh20 * ft04 * XH / (XS/XH_S + KX) - Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX)^2 * XH; - // dr1/XH_S = -Kh20 * ft04 * XS / (XS/XH_S + KX) / XH_S^2 * XH; - // dr1/HX = Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX); + // dp1/XS = Kh20 * ft04 * XH / (XS/XH_S + KX) - Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX)^2 * XH; + double dp1_XS = Kh20 * ft04 * XH / (XS/XH_S + KX) - Kh20 * ft04 * XS/XH_S / ((XS/XH_S + KX) * (XS/XH_S + KX)) * XH; + // dp1/XH_S = -Kh20 * ft04 * XS / (XS/XH_S + KX) / XH_S^2 * XH; + double dp1_XH_S = -Kh20 * ft04 * XS / (XS/XH_S + KX) / (XH_S * XH_S) * XH; + // dp1/XH = Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX); + double dp1_XH = Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX); //curJac = jac; // curJac[8] = dr1/XS; @@ -457,10 +507,14 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase // curjac++; // reaction2: k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; - // dr2/S0 = k_sto * ft07 * SS / (SS + KHSS) * SNO / (SNO + KHNO3) / (SO + KHO2)^2 * XH; - // dr2/SS = k_sto * ft07 * SO / (SO + KHO2) * SNO / (SNO + KHNO3) / (SS + KHSS)^2 * XH; - // dr2/SNO = k_sto * ft07 * SO / (SO + KHO2) * SS / (SS + KHSS) / (SNO + KHNO3)^2 * XH; - // dr2/XH = k_sto * ft07 * SO / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); + // dp2/SO = k_sto * ft07 * SS / (SS + KHSS) * SNO / (SNO + KHNO3) / (SO + KHO2)^2 * XH; + double dp2_SO = k_sto * ft07 * SS / (SS + KHSS) * SNO / (SNO + KHNO3) / ((SO + KHO2) * (SO + KHO2)) * XH; + // dp2/SS = k_sto * ft07 * SO / (SO + KHO2) * SNO / (SNO + KHNO3) / (SS + KHSS)^2 * XH; + double dp2_SS = k_sto * ft07 * SO / (SO + KHO2) * SNO / (SNO + KHNO3) / ((SS + KHSS) * (SS + KHSS)) * XH; + // dp2/SNO = k_sto * ft07 * SO / (SO + KHO2) * SS / (SS + KHSS) / (SNO + KHNO3)^2 * XH; + double dp2_SNO = k_sto * ft07 * SO / (SO + KHO2) * SS / (SS + KHSS) / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; + // dp2/XH = k_sto * ft07 * SO / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); + double dp2_XH = k_sto * ft07 * SO / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); //curJac[-1] = dr2/S0; //curJac[0] = dr2/SS; @@ -470,27 +524,44 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase // curJac++; //reaction3: k_sto * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; - // dr3/S0 = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2)^2 * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; - // dr3/SS = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS)^2 * SNO / (SNO + KHNO3) * XH; - // dr3/SNO = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) / (SNO + KHNO3)^2 * XH; - // dr3/XH = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); + // dp3/SO = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2)^2 * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; + double dp3_SO = k_sto * ft07 * etaHNO3 * KHO2 / ((SO + KHO2) * (SO + KHO2)) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; + // dp3/SS = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS)^2 * SNO / (SNO + KHNO3) * XH; + double dp3_SS = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / ((SS + KHSS) * (SS + KHSS)) * SNO / (SNO + KHNO3) * XH; + // dp3/SNO = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) / (SNO + KHNO3)^2 * XH; + double dp3_SNO = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; + // dp3/XH = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); + double dp3_XH = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); //reaction4: muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) * XH; - // dr4/S0 = muH * ft07 * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / (SO + KHO2)^2 * XH; - // dr4/SNH = muH * ft07 * SO / (SO + KHO2) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / (SNH + KHNH4)^2 * XH; - // dr4/SALK = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / (SALK + KHALK)^2 * XH; - // dr4/XSTO = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) / (XSTO/XH_S + KHSTO)^2 * XH; - // dr4/XH_S = -muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) / XSTO/XH_S^2 * XH; - // dr4/XH = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO); + // dp4/SO = muH * ft07 * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / (SO + KHO2)^2 * XH; + double dp4_SO = muH * ft07 * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / ((SO + KHO2) * (SO + KHO2)) * XH; + // dp4/SNH = muH * ft07 * SO / (SO + KHO2) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / (SNH + KHNH4)^2 * XH; + double dp4_SNH = muH * ft07 * SO / (SO + KHO2) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / ((SNH + KHNH4) * (SNH + KHNH4)) * XH; + // dp4/SALK = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / (SALK + KHALK)^2 * XH; + double dp4_SALK = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / ((SALK + KHALK) * (SALK + KHALK)) * XH; + // dp4/XSTO = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) / (XSTO/XH_S + KHSTO)^2 * XH; + double dp4_XSTO = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) / ((XSTO/XH_S + KHSTO) * (XSTO/XH_S + KHSTO)) * XH; + // dp4/XH_S = -muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) / XSTO/XH_S^2 * XH; + double dp4_XH_S = -muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) / (XSTO/XH_S * XSTO/XH_S) * XH; + // dp4/XH = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO); + double dp4_XH = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO); //reaction5: muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; - // dr5/S0 = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO)^2 * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; - // dr5/SNH = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH)^2 * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; - // dr5/SALK = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK)^2 * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; - // dr5/XSTO = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) / (XSTO/XH_S + KHSTO)^2 * SNO / (KHNO3 + SNO) * XH; - // dr5/XH_S = -muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) / XSTO/XH_S^2 * SNO / (KHNO3 + SNO) * XH; - // dr5/SNO = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) / (KHNO3 + SNO)^2 * XH; - // dr5/XH = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO); + // dp5/SO = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO)^2 * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; + double dp5_SO = muH * ft07 * etaHNO3 * KHO2 / ((KHO2 + SO) * (KHO2 + SO)) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; + // dp5/SNH = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH)^2 * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; + double dp5_SNH = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / ((KHNH4 + SNH) * (KHNH4 + SNH)) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; + // dp5/SALK = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK)^2 * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; + double dp5_SALK = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / ((KHALK + SALK) * (KHALK + SALK)) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; + // dp5/XSTO = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) / (XSTO/XH_S + KHSTO)^2 * SNO / (KHNO3 + SNO) * XH; + double dp5_XSTO = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) / ((XSTO/XH_S + KHSTO) * (XSTO/XH_S + KHSTO)) * SNO / (KHNO3 + SNO) * XH; + // dp5/XH_S = -muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) / XSTO/XH_S^2 * SNO / (KHNO3 + SNO) * XH; + double dp5_XH_S = -muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) / (XSTO/XH_S * XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; + // dp5/SNO = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) / (KHNO3 + SNO)^2 * XH; + double dp5_SNO = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) / ((KHNO3 + SNO) * (KHNO3 + SNO)) * XH; + // dp5/XH = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO); + double dp5_XH = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO); //reaction6: bH * SO / (SO + KHO2) * XH; From 8bb2dff0a60a5d1d0510464f567788a5286a7014 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Wed, 14 May 2025 11:30:46 +0200 Subject: [PATCH 10/47] ASM3: differentiate r6-12 --- .../reaction/ActivatedSludgeModelThree.cpp | 88 +++++++------------ 1 file changed, 33 insertions(+), 55 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index e0c367882..6c44ec246 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -491,110 +491,88 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase double XA = y[11]; double XMI = y[12]; // unused + /* + size_t idxSO = 0; + size_t idxSS = 1; + size_t idxSNH = 2; + size_t idxSNO = 3; + size_t idxSN2 = 4; + size_t idxSALK = 5; + size_t idxSI = 6; + size_t idxXI = 7; + size_t idxXS = 8; + size_t idxXH = 9; + size_t idxXSTO = 10; + size_t idxXA = 11; + size_t idxXMI = 12; + */ + // reaction 1: Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX) * XH; - // dp1/XS = Kh20 * ft04 * XH / (XS/XH_S + KX) - Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX)^2 * XH; double dp1_XS = Kh20 * ft04 * XH / (XS/XH_S + KX) - Kh20 * ft04 * XS/XH_S / ((XS/XH_S + KX) * (XS/XH_S + KX)) * XH; - // dp1/XH_S = -Kh20 * ft04 * XS / (XS/XH_S + KX) / XH_S^2 * XH; double dp1_XH_S = -Kh20 * ft04 * XS / (XS/XH_S + KX) / (XH_S * XH_S) * XH; - // dp1/XH = Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX); double dp1_XH = Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX); - //curJac = jac; - // curJac[8] = dr1/XS; - // curJac[X] = dr1/XH_S; ?? - // curJac[9] = dr1/XH; - - // curjac++; - // reaction2: k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; - // dp2/SO = k_sto * ft07 * SS / (SS + KHSS) * SNO / (SNO + KHNO3) / (SO + KHO2)^2 * XH; double dp2_SO = k_sto * ft07 * SS / (SS + KHSS) * SNO / (SNO + KHNO3) / ((SO + KHO2) * (SO + KHO2)) * XH; - // dp2/SS = k_sto * ft07 * SO / (SO + KHO2) * SNO / (SNO + KHNO3) / (SS + KHSS)^2 * XH; double dp2_SS = k_sto * ft07 * SO / (SO + KHO2) * SNO / (SNO + KHNO3) / ((SS + KHSS) * (SS + KHSS)) * XH; - // dp2/SNO = k_sto * ft07 * SO / (SO + KHO2) * SS / (SS + KHSS) / (SNO + KHNO3)^2 * XH; double dp2_SNO = k_sto * ft07 * SO / (SO + KHO2) * SS / (SS + KHSS) / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; - // dp2/XH = k_sto * ft07 * SO / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); double dp2_XH = k_sto * ft07 * SO / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); - //curJac[-1] = dr2/S0; - //curJac[0] = dr2/SS; - //curJac[1] = dr2/SNO; - //curJac[8] = dr2/XH; - - // curJac++; - //reaction3: k_sto * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; - // dp3/SO = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2)^2 * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; double dp3_SO = k_sto * ft07 * etaHNO3 * KHO2 / ((SO + KHO2) * (SO + KHO2)) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; - // dp3/SS = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS)^2 * SNO / (SNO + KHNO3) * XH; double dp3_SS = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / ((SS + KHSS) * (SS + KHSS)) * SNO / (SNO + KHNO3) * XH; - // dp3/SNO = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) / (SNO + KHNO3)^2 * XH; double dp3_SNO = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; - // dp3/XH = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); double dp3_XH = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); //reaction4: muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) * XH; - // dp4/SO = muH * ft07 * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / (SO + KHO2)^2 * XH; double dp4_SO = muH * ft07 * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / ((SO + KHO2) * (SO + KHO2)) * XH; - // dp4/SNH = muH * ft07 * SO / (SO + KHO2) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / (SNH + KHNH4)^2 * XH; double dp4_SNH = muH * ft07 * SO / (SO + KHO2) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / ((SNH + KHNH4) * (SNH + KHNH4)) * XH; - // dp4/SALK = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / (SALK + KHALK)^2 * XH; double dp4_SALK = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / ((SALK + KHALK) * (SALK + KHALK)) * XH; - // dp4/XSTO = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) / (XSTO/XH_S + KHSTO)^2 * XH; double dp4_XSTO = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) / ((XSTO/XH_S + KHSTO) * (XSTO/XH_S + KHSTO)) * XH; - // dp4/XH_S = -muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) / XSTO/XH_S^2 * XH; double dp4_XH_S = -muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) / (XSTO/XH_S * XSTO/XH_S) * XH; - // dp4/XH = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO); double dp4_XH = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO); //reaction5: muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; - // dp5/SO = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO)^2 * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; double dp5_SO = muH * ft07 * etaHNO3 * KHO2 / ((KHO2 + SO) * (KHO2 + SO)) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; - // dp5/SNH = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH)^2 * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; double dp5_SNH = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / ((KHNH4 + SNH) * (KHNH4 + SNH)) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; - // dp5/SALK = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK)^2 * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; double dp5_SALK = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / ((KHALK + SALK) * (KHALK + SALK)) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; - // dp5/XSTO = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) / (XSTO/XH_S + KHSTO)^2 * SNO / (KHNO3 + SNO) * XH; double dp5_XSTO = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) / ((XSTO/XH_S + KHSTO) * (XSTO/XH_S + KHSTO)) * SNO / (KHNO3 + SNO) * XH; - // dp5/XH_S = -muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) / XSTO/XH_S^2 * SNO / (KHNO3 + SNO) * XH; double dp5_XH_S = -muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) / (XSTO/XH_S * XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; - // dp5/SNO = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) / (KHNO3 + SNO)^2 * XH; double dp5_SNO = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) / ((KHNO3 + SNO) * (KHNO3 + SNO)) * XH; - // dp5/XH = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO); double dp5_XH = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO); //reaction6: bH * SO / (SO + KHO2) * XH; - // dr6/S0 = bH * ft07 * XH / (SO + KHO2)^2; - // dr6/XH = bH * ft07 * SO / (SO + KHO2); + double dr6_SO = bH * ft07 * XH / ((SO + KHO2) * (SO + KHO2)); + double dr6_XH = bH * ft07 * SO / (SO + KHO2); //reaction7: bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XH; - // dr7/S0 = bH * ft07 * etaHend * KHO2 / (SO + KHO2)^2 * SNO / (SNO + KHNO3) * XH; - // dr7/SNO = bH * ft07 * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3)^2 * XH; - // dr7/XH = bH * ft07 * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XH; + double dr7_SO = bH * ft07 * etaHend * KHO2 / ((SO + KHO2) * (SO + KHO2)) * SNO / (SNO + KHNO3) * XH; + double dr7_SNO = bH * ft07 * etaHend * KHO2 / (SO + KHO2) * SNO / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; + double dr7_XH = bH * ft07 * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XH; //reaction8: bH * SO / (SO + KHO2) * XSTO; - // dr8/S0 = bH * ft07 * XSTO / (SO + KHO2)^2; - // dr8/XSTO = bH * ft07 * SO / (SO + KHO2); + double dr8_SO = bH * ft07 * XSTO / ((SO + KHO2) * (SO + KHO2)); + double dr8_XSTO = bH * ft07 * SO / (SO + KHO2); //reaction9: bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XSTO; - // dr9/S0 = bH * ft07 * etaHend * KHO2 / (SO + KHO2)^2 * SNO / (SNO + KHNO3) * XSTO; - // dr9/SNO = bH * ft07 * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3)^2 * XSTO; + double dr9_SO = bH * ft07 * etaHend * KHO2 / ((SO + KHO2) * (SO + KHO2)) * SNO / (SNO + KHNO3) * XSTO; + double dr9_SNO = bH * ft07 * etaHend * KHO2 / (SO + KHO2) * SNO / ((SNO + KHNO3) * (SNO + KHNO3)) * XSTO; //reaction10: muAUT * SO / (SO + KNO2) * SNH / (SNH + KNNH4) * SALK / (SALK + KNALK) * XA; - // dr10/S0 = muAUT * ft105 * SNH / (SNH + KNNH4) * SALK / (SALK + KNALK) * XA / (SO + KNO2)^2; - // dr10/SNH = muAUT * ft105 * SO / (SO + KNO2) * SALK / (SALK + KNALK) / (SNH + KNNH4)^2 * XA; - // dr10/SALK = muAUT * ft105 * SO / (SO + KNO2) * SNH / (SNH + KNNH4) / (SALK + KNALK)^2 * XA; + double dr10_SO = muAUT * ft105 * SNH / (SNH + KNNH4) * SALK / (SALK + KNALK) * XA / ((SO + KNO2) * (SO + KNO2)); + double dr10_SNH = muAUT * ft105 * SO / (SO + KNO2) * SALK / (SALK + KNALK) / ((SNH + KNNH4) * (SNH + KNNH4)) * XA; + double dr10_SALK = muAUT * ft105 * SO / (SO + KNO2) * SNH / (SNH + KNNH4) / ((SALK + KNALK) * (SALK + KNALK)) * XA; //reaction11: bAUT * SO / (SO + KHO2) * XA; - // dr11/S0 = bAUT * ft105 * XA / (SO + KHO2)^2; - // dr11/XA = bAUT * ft105 * SO / (SO + KHO2); + double dr11_SO = bAUT * ft105 * XA / ((SO + KHO2) * (SO + KHO2)); + double dr11_XA = bAUT * ft105 * SO / (SO + KHO2); //reaction12: bAUT * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2) * XA; - // dr12/S0 = bAUT * ft105 * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2)^2 * XA; - // dr12/SNO = bAUT * ft105 * etaNend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3)^2 * XA; - // dr12/XA = bAUT * ft105 * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2) * XA; + double dr12_SO = bAUT * ft105 * etaNend * SNO / (SNO + KHNO3) * KHO2 / ((SO + KHO2) * (SO + KHO2)) * XA; + double dr12_SNO = bAUT * ft105 * etaNend * KHO2 / (SO + KHO2) * SNO / ((SNO + KHNO3) * (SNO + KHNO3)) * XA; + double dr12_XA = bAUT * ft105 * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2) * XA; From acabe81efe3f83de9bc4975123f3ccd11e27c85e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Wed, 14 May 2025 12:12:03 +0200 Subject: [PATCH 11/47] ASM3: compute jacobian --- .../reaction/ActivatedSludgeModelThree.cpp | 117 ++++++++++-------- 1 file changed, 65 insertions(+), 52 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index 6c44ec246..8d93b4ade 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -491,7 +491,6 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase double XA = y[11]; double XMI = y[12]; // unused - /* size_t idxSO = 0; size_t idxSS = 1; size_t idxSNH = 2; @@ -505,82 +504,96 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase size_t idxXSTO = 10; size_t idxXA = 11; size_t idxXMI = 12; - */ - // reaction 1: Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX) * XH; - double dp1_XS = Kh20 * ft04 * XH / (XS/XH_S + KX) - Kh20 * ft04 * XS/XH_S / ((XS/XH_S + KX) * (XS/XH_S + KX)) * XH; - double dp1_XH_S = -Kh20 * ft04 * XS / (XS/XH_S + KX) / (XH_S * XH_S) * XH; - double dp1_XH = Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX); + double d[13][13] = {}; + //memset(d, 0, 13 * 13 * sizeof(double)); + // p1: Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX) * XH; + d[0][idxXS] = Kh20 * ft04 * XH / (XS/XH_S + KX) - Kh20 * ft04 * XS/XH_S / ((XS/XH_S + KX) * (XS/XH_S + KX)) * XH; + //double dp1_XH_S = -Kh20 * ft04 * XS / (XS/XH_S + KX) / (XH_S * XH_S) * XH; + d[0][idxXH] = Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX); + + /* + curJac = jac; + size_t curIdxXS = idxXS; + for (size_t i = 0; i < _stoichiometry.rows(); i++) { + curJac[idxXS] += _stoichiometry.native(i, 0) * dp1_XS; + curJac[idxXH] += _stoichiometry.native(i, 0) * dp1_XH; + curJac++; + curIdxXS--; + } + */ // reaction2: k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; - double dp2_SO = k_sto * ft07 * SS / (SS + KHSS) * SNO / (SNO + KHNO3) / ((SO + KHO2) * (SO + KHO2)) * XH; - double dp2_SS = k_sto * ft07 * SO / (SO + KHO2) * SNO / (SNO + KHNO3) / ((SS + KHSS) * (SS + KHSS)) * XH; - double dp2_SNO = k_sto * ft07 * SO / (SO + KHO2) * SS / (SS + KHSS) / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; - double dp2_XH = k_sto * ft07 * SO / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); + d[1][idxSO] = k_sto * ft07 * SS / (SS + KHSS) * SNO / (SNO + KHNO3) / ((SO + KHO2) * (SO + KHO2)) * XH; + d[1][idxSS] = k_sto * ft07 * SO / (SO + KHO2) * SNO / (SNO + KHNO3) / ((SS + KHSS) * (SS + KHSS)) * XH; + d[1][idxSNO] = k_sto * ft07 * SO / (SO + KHO2) * SS / (SS + KHSS) / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; + d[1][idxXH] = k_sto * ft07 * SO / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); //reaction3: k_sto * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; - double dp3_SO = k_sto * ft07 * etaHNO3 * KHO2 / ((SO + KHO2) * (SO + KHO2)) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; - double dp3_SS = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / ((SS + KHSS) * (SS + KHSS)) * SNO / (SNO + KHNO3) * XH; - double dp3_SNO = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; - double dp3_XH = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); + d[2][idxSO] = k_sto * ft07 * etaHNO3 * KHO2 / ((SO + KHO2) * (SO + KHO2)) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; + d[2][idxSS] = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / ((SS + KHSS) * (SS + KHSS)) * SNO / (SNO + KHNO3) * XH; + d[2][idxSNO] = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; + d[2][idxXH] = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); //reaction4: muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) * XH; - double dp4_SO = muH * ft07 * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / ((SO + KHO2) * (SO + KHO2)) * XH; - double dp4_SNH = muH * ft07 * SO / (SO + KHO2) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / ((SNH + KHNH4) * (SNH + KHNH4)) * XH; - double dp4_SALK = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / ((SALK + KHALK) * (SALK + KHALK)) * XH; - double dp4_XSTO = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) / ((XSTO/XH_S + KHSTO) * (XSTO/XH_S + KHSTO)) * XH; - double dp4_XH_S = -muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) / (XSTO/XH_S * XSTO/XH_S) * XH; - double dp4_XH = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO); + d[3][idxSO] = muH * ft07 * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / ((SO + KHO2) * (SO + KHO2)) * XH; + d[3][idxSNH] = muH * ft07 * SO / (SO + KHO2) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / ((SNH + KHNH4) * (SNH + KHNH4)) * XH; + d[3][idxSALK] = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / ((SALK + KHALK) * (SALK + KHALK)) * XH; + d[3][idxXSTO] = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) / ((XSTO/XH_S + KHSTO) * (XSTO/XH_S + KHSTO)) * XH; + //double dp4_XH_S = -muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) / (XSTO/XH_S * XSTO/XH_S) * XH; + d[3][idxXH] = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO); //reaction5: muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; - double dp5_SO = muH * ft07 * etaHNO3 * KHO2 / ((KHO2 + SO) * (KHO2 + SO)) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; - double dp5_SNH = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / ((KHNH4 + SNH) * (KHNH4 + SNH)) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; - double dp5_SALK = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / ((KHALK + SALK) * (KHALK + SALK)) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; - double dp5_XSTO = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) / ((XSTO/XH_S + KHSTO) * (XSTO/XH_S + KHSTO)) * SNO / (KHNO3 + SNO) * XH; - double dp5_XH_S = -muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) / (XSTO/XH_S * XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; - double dp5_SNO = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) / ((KHNO3 + SNO) * (KHNO3 + SNO)) * XH; - double dp5_XH = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO); + d[4][idxSO] = muH * ft07 * etaHNO3 * KHO2 / ((KHO2 + SO) * (KHO2 + SO)) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; + d[4][idxSNH] = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / ((KHNH4 + SNH) * (KHNH4 + SNH)) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; + d[4][idxSALK] = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / ((KHALK + SALK) * (KHALK + SALK)) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; + d[4][idxXSTO] = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) / ((XSTO/XH_S + KHSTO) * (XSTO/XH_S + KHSTO)) * SNO / (KHNO3 + SNO) * XH; + //double dp5_XH_S = -muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) / (XSTO/XH_S * XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; + d[4][idxSNO] = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) / ((KHNO3 + SNO) * (KHNO3 + SNO)) * XH; + d[4][idxXH] = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO); //reaction6: bH * SO / (SO + KHO2) * XH; - double dr6_SO = bH * ft07 * XH / ((SO + KHO2) * (SO + KHO2)); - double dr6_XH = bH * ft07 * SO / (SO + KHO2); + d[5][idxSO] = bH * ft07 * XH / ((SO + KHO2) * (SO + KHO2)); + d[5][idxXH] = bH * ft07 * SO / (SO + KHO2); //reaction7: bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XH; - double dr7_SO = bH * ft07 * etaHend * KHO2 / ((SO + KHO2) * (SO + KHO2)) * SNO / (SNO + KHNO3) * XH; - double dr7_SNO = bH * ft07 * etaHend * KHO2 / (SO + KHO2) * SNO / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; - double dr7_XH = bH * ft07 * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XH; + d[6][idxSO] = bH * ft07 * etaHend * KHO2 / ((SO + KHO2) * (SO + KHO2)) * SNO / (SNO + KHNO3) * XH; + d[6][idxSNO] = bH * ft07 * etaHend * KHO2 / (SO + KHO2) * SNO / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; + d[6][idxXH] = bH * ft07 * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XH; //reaction8: bH * SO / (SO + KHO2) * XSTO; - double dr8_SO = bH * ft07 * XSTO / ((SO + KHO2) * (SO + KHO2)); - double dr8_XSTO = bH * ft07 * SO / (SO + KHO2); + d[7][idxSO] = bH * ft07 * XSTO / ((SO + KHO2) * (SO + KHO2)); + d[7][idxXSTO] = bH * ft07 * SO / (SO + KHO2); //reaction9: bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XSTO; - double dr9_SO = bH * ft07 * etaHend * KHO2 / ((SO + KHO2) * (SO + KHO2)) * SNO / (SNO + KHNO3) * XSTO; - double dr9_SNO = bH * ft07 * etaHend * KHO2 / (SO + KHO2) * SNO / ((SNO + KHNO3) * (SNO + KHNO3)) * XSTO; + d[8][idxSO] = bH * ft07 * etaHend * KHO2 / ((SO + KHO2) * (SO + KHO2)) * SNO / (SNO + KHNO3) * XSTO; + d[8][idxSNO] = bH * ft07 * etaHend * KHO2 / (SO + KHO2) * SNO / ((SNO + KHNO3) * (SNO + KHNO3)) * XSTO; //reaction10: muAUT * SO / (SO + KNO2) * SNH / (SNH + KNNH4) * SALK / (SALK + KNALK) * XA; - double dr10_SO = muAUT * ft105 * SNH / (SNH + KNNH4) * SALK / (SALK + KNALK) * XA / ((SO + KNO2) * (SO + KNO2)); - double dr10_SNH = muAUT * ft105 * SO / (SO + KNO2) * SALK / (SALK + KNALK) / ((SNH + KNNH4) * (SNH + KNNH4)) * XA; - double dr10_SALK = muAUT * ft105 * SO / (SO + KNO2) * SNH / (SNH + KNNH4) / ((SALK + KNALK) * (SALK + KNALK)) * XA; + d[9][idxSO] = muAUT * ft105 * SNH / (SNH + KNNH4) * SALK / (SALK + KNALK) * XA / ((SO + KNO2) * (SO + KNO2)); + d[9][idxSNH] = muAUT * ft105 * SO / (SO + KNO2) * SALK / (SALK + KNALK) / ((SNH + KNNH4) * (SNH + KNNH4)) * XA; + d[9][idxSALK] = muAUT * ft105 * SO / (SO + KNO2) * SNH / (SNH + KNNH4) / ((SALK + KNALK) * (SALK + KNALK)) * XA; //reaction11: bAUT * SO / (SO + KHO2) * XA; - double dr11_SO = bAUT * ft105 * XA / ((SO + KHO2) * (SO + KHO2)); - double dr11_XA = bAUT * ft105 * SO / (SO + KHO2); + d[10][idxSO] = bAUT * ft105 * XA / ((SO + KHO2) * (SO + KHO2)); + d[10][idxXA] = bAUT * ft105 * SO / (SO + KHO2); //reaction12: bAUT * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2) * XA; - double dr12_SO = bAUT * ft105 * etaNend * SNO / (SNO + KHNO3) * KHO2 / ((SO + KHO2) * (SO + KHO2)) * XA; - double dr12_SNO = bAUT * ft105 * etaNend * KHO2 / (SO + KHO2) * SNO / ((SNO + KHNO3) * (SNO + KHNO3)) * XA; - double dr12_XA = bAUT * ft105 * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2) * XA; - - - - // StateType SI = y[6]; // unused - // StateType XI = y[7]; // unused - // StateType XMI = y[12]; // unused - - + d[11][idxSO] = bAUT * ft105 * etaNend * SNO / (SNO + KHNO3) * KHO2 / ((SO + KHO2) * (SO + KHO2)) * XA; + d[11][idxSNO] = bAUT * ft105 * etaNend * KHO2 / (SO + KHO2) * SNO / ((SNO + KHNO3) * (SNO + KHNO3)) * XA; + d[11][idxXA] = bAUT * ft105 * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2) * XA; + + for (size_t rIdx = 0; rIdx < 13; rIdx++) { + for (size_t compIdx = 0; compIdx < 13; compIdx++) { + // TODO consider configurable component indices + for (size_t i = 0; i < _stoichiometry.rows(); i++) { + curJac = &jac[i]; + curJac[compIdx] += _stoichiometry.native(i, rIdx) * d[rIdx][compIdx]; + } + } + } } From 5af98cfeeafea491b3a6853bc57b77d26d6af741 Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Wed, 14 May 2025 15:39:25 +0200 Subject: [PATCH 12/47] add ad test --- test/ReactionModels.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/ReactionModels.cpp b/test/ReactionModels.cpp index 6d8cbfdc0..1b26e5d0a 100644 --- a/test/ReactionModels.cpp +++ b/test/ReactionModels.cpp @@ -145,3 +145,17 @@ TEST_CASE("MichaelisMenten kinetic analytic Jacobian vs AD with inhibition", "[M point, 1e-15, 1e-15 ); } +TEST_CASE("ASM3 analytic Jacobian vs AD", "[ASM3],[ReactionModel],[Jacobian],[AD]") +{ + const unsigned int nBound[] = {0}; + unsigned int ncomp = 13; + const double point[] = { 1.0, 2.0, 1.4, 2.1, 0.2, 1.1, 1.8 }; + cadet::test::reaction::testDynamicJacobianAD("ACTIVATES_SLUDGE_MODEL3", ncomp, nBound, + R"json({ + "ACSM3_p1": [1.0, 2.0, 0.4], + "ACSM3_p2": [-1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 3.0, 2.0, -1.0] + })json", + point, 1e-15, 1e-15 + ); +} + From 055af7fc55585e1f6dec363bd35b1cbbcf9f94ec Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Wed, 14 May 2025 16:02:32 +0200 Subject: [PATCH 13/47] get parameter from parameterprovider --- .../reaction/ActivatedSludgeModelThree.cpp | 121 +++++++++--------- 1 file changed, 62 insertions(+), 59 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index 8d93b4ade..8b9d10612 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -172,21 +172,24 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.setAll(0); // parameter set ASM3hC - double iNSI = 0.03; - double iNSS = 0.1; - double iNXI = 0.12; - double iNXS = 0.0975; - double iNBM = 0.2; - double fSI = 0; - double YH_aer = 0.850793651; - double YH_anox = 0.698148148; - double YSTO_aer = 0.8966167647; - double YSTO_anox = 0.74375; - double fXI = 0.2; - double YA = 0.09; - double fiSS_BM_prod = 1; - double iVSS_BM = 1.956181534; - double iTSS_VSS_BM = 1.086956522; + double iNSI = paramProvider.getDouble("ASM_iNSI"); + double iNSS = paramProvider.getDouble("ASM_iNSS"); + double iNXI = paramProvider.getDouble("ASM_iNXI"); + double iNXS = paramProvider.getDouble("ASM_iNXS"); + double iNBM = paramProvider.getDouble("ASM_iNBM"); + + double fSI = paramProvider.getDouble("ASM_fSI"); + double fXI = paramProvider.getDouble("ASM_fXI"); + + double YH_aer = paramProvider.getDouble("ASM_YH_aer"); + double YH_anox = paramProvider.getDouble("ASM_YH_anox"); + double YSTO_aer = paramProvider.getDouble("ASM_YSTO_aer"); + double YSTO_anox = paramProvider.getDouble("ASM_YSTO_anox"); + double YA = paramProvider.getDouble("ASM_YA"); + + double fiSS_BM_prod = paramProvider.getDouble("ASM_fiSS_BM_prod"); + double iVSS_BM = paramProvider.getDouble("ASM_iVSS_BM"); + double iTSS_VSS_BM = paramProvider.getDouble("ASM_iTSS_VSS_BM"); // internal variables double fXMI_BM = fiSS_BM_prod * fXI * iVSS_BM * (iTSS_VSS_BM - 1); @@ -328,28 +331,28 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase typedef typename DoubleActivePromoter::type flux_t; BufferedArray fluxes = workSpace.array(_stoichiometry.columns()); - ParamType Kh20 = 10.2; - ParamType T = 20; - ParamType iO2 = 0; - ParamType V = 1; - ParamType k_sto20 = 13.68; - ParamType KX = 1; - ParamType KHO2 = 0.2; - ParamType KHSS = 3; - ParamType KHNO3 = 0.5; - ParamType etaHNO3 = 0.5; - ParamType KHNH4 = 0.01; - ParamType KHALK = 0.1; - ParamType KHSTO = 0.11; - ParamType muH20 = 3; - ParamType etaHend = 0.5; - ParamType bH20 = 0.33; - ParamType muAUT20 = 1.12; - ParamType KNO2 = 0.5; - ParamType KNNH4 = 0.7; - ParamType KNALK = 0.5; - ParamType bAUT20 = 0.18; - ParamType etaNend = 0.5; + flux_t Kh20 = static_cast::type>(p->Kh20); + flux_t T = static_cast::type>(p->T); + flux_t iO2 = static_cast::type>(p->iO2); + flux_t V = static_cast::type>(p->V); + flux_t k_sto20 = static_cast::type>(p->k_sto20); + flux_t KX = static_cast::type>(p->KX); + flux_t KHO2 = static_cast::type>(p->KHO2); + flux_t KHSS = static_cast::type>(p->KHSS); + flux_t KHNO3 = static_cast::type>(p->KHNO3); + flux_t etaHNO3 = static_cast::type>(p->etaHNO3); + flux_t KHNH4 = static_cast::type>(p->KHNH4); + flux_t KHALK = static_cast::type>(p->KHALK); + flux_t KHSTO = static_cast::type>(p->KHSTO); + flux_t muH20 = static_cast::type>(p->muH20); + flux_t etaHend = static_cast::type>(p->etaHend); + flux_t bH20 = static_cast::type>(p->bH20); + flux_t muAUT20 = static_cast::type>(p->muAUT20); + flux_t KNO2 = static_cast::type>(p->KNO2); + flux_t KNNH4 = static_cast::type>(p->KNNH4); + flux_t KNALK = static_cast::type>(p->KNALK); + flux_t bAUT20 = static_cast::type>(p->bAUT20); + flux_t etaNend = static_cast::type>(p->etaNend); // derived parameters double ft04 = exp(-0.04 * (20.0 - static_cast(T))); @@ -443,28 +446,28 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase typename ParamHandler_t::ParamsHandle const p = _paramHandler.update(t, secIdx, colPos, _nComp, _nBoundStates, workSpace); RowIterator curJac = jac; - double Kh20 = 10.2; - double T = 20; - double iO2 = 0; - double V = 1; - double k_sto20 = 13.68; - double KX = 1; - double KHO2 = 0.2; - double KHSS = 3; - double KHNO3 = 0.5; - double etaHNO3 = 0.5; - double KHNH4 = 0.01; - double KHALK = 0.1; - double KHSTO = 0.11; - double muH20 = 3; - double etaHend = 0.5; - double bH20 = 0.33; - double muAUT20 = 1.12; - double KNO2 = 0.5; - double KNNH4 = 0.7; - double KNALK = 0.5; - double bAUT20 = 0.18; - double etaNend = 0.5; + double Kh20 = static_cast(p->Kh20); + double T = static_cast(p->T); + double iO2 = static_cast(p->iO2); + double V = static_cast(p->V); + double k_sto20 = static_cast(p->k_sto20); + double KX = static_cast(p->KX); + double KHO2 = static_cast(p->KHO2); + double KHSS = static_cast(p->KHSS); + double KHNO3 = static_cast(p->KHNO3); + double etaHNO3 = static_cast(p->etaHNO3); + double KHNH4 = static_cast(p->KHNH4); + double KHALK = static_cast(p->KHALK); + double KHSTO = static_cast(p->KHSTO); + double muH20 = static_cast(p->muH20); + double etaHend = static_cast(p->etaHend); + double bH20 = static_cast(p->bH20); + double muAUT20 = static_cast(p->muAUT20); + double KNO2 = static_castp->KNO2); + double KNNH4 = static_cast(p->KNNH4); + double KNALK = static_cast(p->KNALK); + double bAUT20 = static_cast(p->bAUT20); + double etaNend = static_cast(p->etaNend); // derived parameters double ft04 = exp(-0.04 * (20.0 - static_cast(T))); From ff508ae37170477d81bc96836bc55f6824044c64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Wed, 14 May 2025 16:06:12 +0200 Subject: [PATCH 14/47] ASM3: set up params for codegen --- src/libcadet/CMakeLists.txt | 1 - .../reaction/ActivatedSludgeModelThree.cpp | 25 ++++++++++++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/libcadet/CMakeLists.txt b/src/libcadet/CMakeLists.txt index db77fbdc9..80c074745 100644 --- a/src/libcadet/CMakeLists.txt +++ b/src/libcadet/CMakeLists.txt @@ -115,7 +115,6 @@ set(LIBCADET_REACTIONMODEL_SOURCES ${CMAKE_SOURCE_DIR}/src/libcadet/model/reaction/MassActionLawReaction.cpp ${CMAKE_SOURCE_DIR}/src/libcadet/model/reaction/MichaelisMentenReaction.cpp ${CMAKE_SOURCE_DIR}/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp - ${CMAKE_SOURCE_DIR}/src/libcadet/model/reaction/CrystallizationReaction.cpp ) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index 8b9d10612..654add3b5 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -32,9 +32,28 @@ "externalName": "ExtActivatedSludgeModelThreeParamHandler", "parameters": [ - { "type": "ScalarReactionDependentParameter", "varName": "vMax", "confName": "MM_VMAX"}, - { "type": "ScalarReactionDependentParameter", "varName": "kMM", "confName": "MM_KMM"}, - { "type": "ComponentDependentReactionDependentParameter", "varName": "kInhibit", "confName": "MM_KI"} + { "type": "ScalarReactionDependentParameter", "varName": "Kh20", "confName": "ASM3_KH_20"}, + { "type": "ScalarReactionDependentParameter", "varName": "T", "confName": "ASM3_T"}, + { "type": "ScalarReactionDependentParameter", "varName": "iO2", "confName": "ASM3_I_O2"}, + { "type": "ScalarReactionDependentParameter", "varName": "V", "confName": "ASM3_V"}, + { "type": "ScalarReactionDependentParameter", "varName": "k_sto20", "confName": "ASM3_K_STO_20"}, + { "type": "ScalarReactionDependentParameter", "varName": "KX", "confName": "ASM3_KX"}, + { "type": "ScalarReactionDependentParameter", "varName": "KHO2", "confName": "ASM3_KHO2"}, + { "type": "ScalarReactionDependentParameter", "varName": "KHSS", "confName": "ASM3_KHSS"}, + { "type": "ScalarReactionDependentParameter", "varName": "KHNO3", "confName": "ASM3_KHNO3"}, + { "type": "ScalarReactionDependentParameter", "varName": "etaHNO3", "confName": "ASM3_ETA_HNO3"}, + { "type": "ScalarReactionDependentParameter", "varName": "KHNH4", "confName": "ASM3_KHNH4"}, + { "type": "ScalarReactionDependentParameter", "varName": "KHALK", "confName": "ASM3_KHALK"}, + { "type": "ScalarReactionDependentParameter", "varName": "KHSTO", "confName": "ASM3_KHSTO"}, + { "type": "ScalarReactionDependentParameter", "varName": "muH20", "confName": "ASM3_MU_H_20"}, + { "type": "ScalarReactionDependentParameter", "varName": "etaHend", "confName": "ASM3_ETA_H_END"}, + { "type": "ScalarReactionDependentParameter", "varName": "bH20", "confName": "ASM3_B_H_20"}, + { "type": "ScalarReactionDependentParameter", "varName": "muAUT20", "confName": "ASM3_MU_AUT_20"}, + { "type": "ScalarReactionDependentParameter", "varName": "KNO2", "confName": "ASM3_KNO2"}, + { "type": "ScalarReactionDependentParameter", "varName": "KNNH4", "confName": "ASM3_KNNH4"}, + { "type": "ScalarReactionDependentParameter", "varName": "KNALK", "confName": "ASM3_KNALK"}, + { "type": "ScalarReactionDependentParameter", "varName": "bAUT20", "confName": "ASM3_B_AUT_20"}, + { "type": "ScalarReactionDependentParameter", "varName": "etaNend", "confName": "ASM3_ETA_N_END"}, ] } */ From 564fc8c13c195ee903af6bde81a4dddf24c0f0fe Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Wed, 14 May 2025 16:06:46 +0200 Subject: [PATCH 15/47] add ASM3 to factory --- src/libcadet/ReactionModelFactory.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libcadet/ReactionModelFactory.cpp b/src/libcadet/ReactionModelFactory.cpp index 63b041043..3976b4cb8 100644 --- a/src/libcadet/ReactionModelFactory.cpp +++ b/src/libcadet/ReactionModelFactory.cpp @@ -22,6 +22,7 @@ namespace cadet void registerMassActionLawReaction(std::unordered_map>& reactions); void registerDummyReaction(std::unordered_map>& reactions); void registerMichaelisMentenReaction(std::unordered_map>& reactions); + void registerActivatedSludgeModelThreeReaction(std::unordered_map>& reactions); void registerCrystallizationReaction(std::unordered_map>& reactions); } From b3660e725354f4062738ced4ce29102ffd692114 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Wed, 14 May 2025 16:09:33 +0200 Subject: [PATCH 16/47] ASM3: fix codegen json --- src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index 654add3b5..d3dd74449 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -53,7 +53,7 @@ { "type": "ScalarReactionDependentParameter", "varName": "KNNH4", "confName": "ASM3_KNNH4"}, { "type": "ScalarReactionDependentParameter", "varName": "KNALK", "confName": "ASM3_KNALK"}, { "type": "ScalarReactionDependentParameter", "varName": "bAUT20", "confName": "ASM3_B_AUT_20"}, - { "type": "ScalarReactionDependentParameter", "varName": "etaNend", "confName": "ASM3_ETA_N_END"}, + { "type": "ScalarReactionDependentParameter", "varName": "etaNend", "confName": "ASM3_ETA_N_END"} ] } */ From f7046133fecf8618a242d9e9942d544a54fe98f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Wed, 14 May 2025 16:18:32 +0200 Subject: [PATCH 17/47] ASM3: use scalar external params --- .../reaction/ActivatedSludgeModelThree.cpp | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index d3dd74449..1cee1ad49 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -32,28 +32,28 @@ "externalName": "ExtActivatedSludgeModelThreeParamHandler", "parameters": [ - { "type": "ScalarReactionDependentParameter", "varName": "Kh20", "confName": "ASM3_KH_20"}, - { "type": "ScalarReactionDependentParameter", "varName": "T", "confName": "ASM3_T"}, - { "type": "ScalarReactionDependentParameter", "varName": "iO2", "confName": "ASM3_I_O2"}, - { "type": "ScalarReactionDependentParameter", "varName": "V", "confName": "ASM3_V"}, - { "type": "ScalarReactionDependentParameter", "varName": "k_sto20", "confName": "ASM3_K_STO_20"}, - { "type": "ScalarReactionDependentParameter", "varName": "KX", "confName": "ASM3_KX"}, - { "type": "ScalarReactionDependentParameter", "varName": "KHO2", "confName": "ASM3_KHO2"}, - { "type": "ScalarReactionDependentParameter", "varName": "KHSS", "confName": "ASM3_KHSS"}, - { "type": "ScalarReactionDependentParameter", "varName": "KHNO3", "confName": "ASM3_KHNO3"}, - { "type": "ScalarReactionDependentParameter", "varName": "etaHNO3", "confName": "ASM3_ETA_HNO3"}, - { "type": "ScalarReactionDependentParameter", "varName": "KHNH4", "confName": "ASM3_KHNH4"}, - { "type": "ScalarReactionDependentParameter", "varName": "KHALK", "confName": "ASM3_KHALK"}, - { "type": "ScalarReactionDependentParameter", "varName": "KHSTO", "confName": "ASM3_KHSTO"}, - { "type": "ScalarReactionDependentParameter", "varName": "muH20", "confName": "ASM3_MU_H_20"}, - { "type": "ScalarReactionDependentParameter", "varName": "etaHend", "confName": "ASM3_ETA_H_END"}, - { "type": "ScalarReactionDependentParameter", "varName": "bH20", "confName": "ASM3_B_H_20"}, - { "type": "ScalarReactionDependentParameter", "varName": "muAUT20", "confName": "ASM3_MU_AUT_20"}, - { "type": "ScalarReactionDependentParameter", "varName": "KNO2", "confName": "ASM3_KNO2"}, - { "type": "ScalarReactionDependentParameter", "varName": "KNNH4", "confName": "ASM3_KNNH4"}, - { "type": "ScalarReactionDependentParameter", "varName": "KNALK", "confName": "ASM3_KNALK"}, - { "type": "ScalarReactionDependentParameter", "varName": "bAUT20", "confName": "ASM3_B_AUT_20"}, - { "type": "ScalarReactionDependentParameter", "varName": "etaNend", "confName": "ASM3_ETA_N_END"} + { "type": "ScalarParameter", "varName": "Kh20", "confName": "ASM3_KH_20"}, + { "type": "ScalarParameter", "varName": "T", "confName": "ASM3_T"}, + { "type": "ScalarParameter", "varName": "iO2", "confName": "ASM3_I_O2"}, + { "type": "ScalarParameter", "varName": "V", "confName": "ASM3_V"}, + { "type": "ScalarParameter", "varName": "k_sto20", "confName": "ASM3_K_STO_20"}, + { "type": "ScalarParameter", "varName": "KX", "confName": "ASM3_KX"}, + { "type": "ScalarParameter", "varName": "KHO2", "confName": "ASM3_KHO2"}, + { "type": "ScalarParameter", "varName": "KHSS", "confName": "ASM3_KHSS"}, + { "type": "ScalarParameter", "varName": "KHNO3", "confName": "ASM3_KHNO3"}, + { "type": "ScalarParameter", "varName": "etaHNO3", "confName": "ASM3_ETA_HNO3"}, + { "type": "ScalarParameter", "varName": "KHNH4", "confName": "ASM3_KHNH4"}, + { "type": "ScalarParameter", "varName": "KHALK", "confName": "ASM3_KHALK"}, + { "type": "ScalarParameter", "varName": "KHSTO", "confName": "ASM3_KHSTO"}, + { "type": "ScalarParameter", "varName": "muH20", "confName": "ASM3_MU_H_20"}, + { "type": "ScalarParameter", "varName": "etaHend", "confName": "ASM3_ETA_H_END"}, + { "type": "ScalarParameter", "varName": "bH20", "confName": "ASM3_B_H_20"}, + { "type": "ScalarParameter", "varName": "muAUT20", "confName": "ASM3_MU_AUT_20"}, + { "type": "ScalarParameter", "varName": "KNO2", "confName": "ASM3_KNO2"}, + { "type": "ScalarParameter", "varName": "KNNH4", "confName": "ASM3_KNNH4"}, + { "type": "ScalarParameter", "varName": "KNALK", "confName": "ASM3_KNALK"}, + { "type": "ScalarParameter", "varName": "bAUT20", "confName": "ASM3_B_AUT_20"}, + { "type": "ScalarParameter", "varName": "etaNend", "confName": "ASM3_ETA_N_END"} ] } */ From c36c198b95c04136192a5f1c014f7fabb91a2931 Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Wed, 14 May 2025 16:24:15 +0200 Subject: [PATCH 18/47] fix parameter --- .../reaction/ActivatedSludgeModelThree.cpp | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index d3dd74449..46f139232 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -134,7 +134,7 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase { public: - ActivatedSludgeModelThreeBase() : _idxSubstrate(0) { } + ActivatedSludgeModelThreeBase() CADET_NOEXCEPT { } virtual ~ActivatedSludgeModelThreeBase() CADET_NOEXCEPT { } static const char* identifier() { return ParamHandler_t::identifier(); } @@ -161,7 +161,6 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase const unsigned int nReactions = numElements / nComp; _stoichiometry.resize(nComp, nReactions); - _idxSubstrate = std::vector(nReactions, -1); } return true; @@ -469,7 +468,7 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase double T = static_cast(p->T); double iO2 = static_cast(p->iO2); double V = static_cast(p->V); - double k_sto20 = static_cast(p->k_sto20); + double k_sto20 = static_cast(p->k_sto20); double KX = static_cast(p->KX); double KHO2 = static_cast(p->KHO2); double KHSS = static_cast(p->KHSS); @@ -482,21 +481,21 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase double etaHend = static_cast(p->etaHend); double bH20 = static_cast(p->bH20); double muAUT20 = static_cast(p->muAUT20); - double KNO2 = static_castp->KNO2); + double KNO2 = static_cast(p->KNO2); double KNNH4 = static_cast(p->KNNH4); double KNALK = static_cast(p->KNALK); double bAUT20 = static_cast(p->bAUT20); double etaNend = static_cast(p->etaNend); // derived parameters - double ft04 = exp(-0.04 * (20.0 - static_cast(T))); - double ft07 = exp(-0.06952 * (20 - static_cast(T))); - double ft105 = exp(-0.105 * (20 - static_cast(T))); - double k_sto = static_cast(k_sto20) * ft07; - double muH = static_cast(muH20) * ft07; - double bH = static_cast(bH20) * ft07; - double muAUT = static_cast(muAUT20) * ft105; - double bAUT = static_cast(bAUT20) * ft105; + double ft04 = exp(-0.04 * (20.0 - static_cast(p->T))); + double ft07 = exp(-0.06952 * (20 - static_cast(p->T))); + double ft105 = exp(-0.105 * (20 - static_cast(p->T))); + double k_sto = static_cast(p->k_sto20) * ft07; + double muH = static_cast(p->muH20) * ft07; + double bH = static_cast(p->bH20) * ft07; + double muAUT = static_cast(p->muAUT20) * ft105; + double bAUT = static_cast(p->bAUT20) * ft105; double SO = y[0]; double SS = y[1]; From 49dd73cd9b6f9b557eb2c9ad342a7ac1177b0397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Wed, 14 May 2025 16:40:11 +0200 Subject: [PATCH 19/47] ASM3: fix jacobian computation --- .../reaction/ActivatedSludgeModelThree.cpp | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index 37146963d..49bc49300 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -462,7 +462,6 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase void jacobianLiquidImpl(double t, unsigned int secIdx, const ColumnPosition& colPos, double const* y, double factor, const RowIterator& jac, LinearBufferAllocator workSpace) const { typename ParamHandler_t::ParamsHandle const p = _paramHandler.update(t, secIdx, colPos, _nComp, _nBoundStates, workSpace); - RowIterator curJac = jac; double Kh20 = static_cast(p->Kh20); double T = static_cast(p->T); @@ -533,17 +532,6 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase //double dp1_XH_S = -Kh20 * ft04 * XS / (XS/XH_S + KX) / (XH_S * XH_S) * XH; d[0][idxXH] = Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX); - /* - curJac = jac; - size_t curIdxXS = idxXS; - for (size_t i = 0; i < _stoichiometry.rows(); i++) { - curJac[idxXS] += _stoichiometry.native(i, 0) * dp1_XS; - curJac[idxXH] += _stoichiometry.native(i, 0) * dp1_XH; - curJac++; - curIdxXS--; - } - */ - // reaction2: k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; d[1][idxSO] = k_sto * ft07 * SS / (SS + KHSS) * SNO / (SNO + KHNO3) / ((SO + KHO2) * (SO + KHO2)) * XH; d[1][idxSS] = k_sto * ft07 * SO / (SO + KHO2) * SNO / (SNO + KHNO3) / ((SS + KHSS) * (SS + KHSS)) * XH; @@ -606,12 +594,13 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase d[11][idxSNO] = bAUT * ft105 * etaNend * KHO2 / (SO + KHO2) * SNO / ((SNO + KHNO3) * (SNO + KHNO3)) * XA; d[11][idxXA] = bAUT * ft105 * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2) * XA; - for (size_t rIdx = 0; rIdx < 13; rIdx++) { - for (size_t compIdx = 0; compIdx < 13; compIdx++) { - // TODO consider configurable component indices - for (size_t i = 0; i < _stoichiometry.rows(); i++) { - curJac = &jac[i]; - curJac[compIdx] += _stoichiometry.native(i, rIdx) * d[rIdx][compIdx]; + RowIterator curJac = jac; + // TODO consider configurable component indices + for (int row = 0; row < _stoichiometry.rows(); ++row, ++curJac) { + for (size_t rIdx = 0; rIdx < 13; rIdx++) { + const double colFactor = static_cast(_stoichiometry.native(row, rIdx)); + for (size_t compIdx = 0; compIdx < 13; compIdx++) { + curJac[compIdx] += colFactor * d[rIdx][compIdx]; } } } From e78df3451a305cd5b4976d458bba90d53f6df8e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Wed, 14 May 2025 17:13:02 +0200 Subject: [PATCH 20/47] overload ScalarParameter methods for reaction model compatibility --- src/libcadet/model/Parameters.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/libcadet/model/Parameters.hpp b/src/libcadet/model/Parameters.hpp index 99bbad3bf..e934612ed 100644 --- a/src/libcadet/model/Parameters.hpp +++ b/src/libcadet/model/Parameters.hpp @@ -171,6 +171,7 @@ class ScalarParameter * @param [in] nBoundStates Array with number of bound states for each component */ inline void reserve(unsigned int numElem, unsigned int numSlices, unsigned int nComp, unsigned int const* nBoundStates) { } + inline void reserve(unsigned int numSlices, unsigned int nComp, unsigned int nBoundStates) { } inline const active& get() const CADET_NOEXCEPT { return *_p; } inline active& get() CADET_NOEXCEPT { return *_p; } @@ -694,6 +695,8 @@ class ExternalScalarParameter */ inline void reserve(unsigned int numElem, unsigned int numSlices, unsigned int nComp, unsigned int const* nBoundStates) { } + inline void reserve(unsigned int nReactions, unsigned int nComp, unsigned int nBoundStates) { } + /** * @brief Calculates a parameter in order to take the external profile into account * @param [out] result Stores the result of the paramter @@ -767,6 +770,7 @@ class ExternalScalarParameter * @return Amount of additional memory in bytes */ inline std::size_t additionalDynamicMemory(unsigned int nComp, unsigned int totalNumBoundStates, unsigned int const* nBoundStates) const CADET_NOEXCEPT { return 0; } + inline std::size_t additionalDynamicMemory(unsigned int nComp, unsigned int totalNumBoundStates, unsigned int nBoundStates) const CADET_NOEXCEPT { return 0; } /** * @brief Prepares the cache for the updated values From 507847c84e0455e374a5a6d651c029f9640769c3 Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Thu, 15 May 2025 10:17:57 +0200 Subject: [PATCH 21/47] parameter declariation and jacobian fix --- .../reaction/ActivatedSludgeModelThree.cpp | 290 ++++++++---------- 1 file changed, 123 insertions(+), 167 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index 49bc49300..799add818 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -32,11 +32,11 @@ "externalName": "ExtActivatedSludgeModelThreeParamHandler", "parameters": [ - { "type": "ScalarParameter", "varName": "Kh20", "confName": "ASM3_KH_20"}, + { "type": "ScalarParameter", "varName": "Kh20", "confName": "ASM3_KH20"}, { "type": "ScalarParameter", "varName": "T", "confName": "ASM3_T"}, - { "type": "ScalarParameter", "varName": "iO2", "confName": "ASM3_I_O2"}, + { "type": "ScalarParameter", "varName": "iO2", "confName": "ASM3_IO2"}, { "type": "ScalarParameter", "varName": "V", "confName": "ASM3_V"}, - { "type": "ScalarParameter", "varName": "k_sto20", "confName": "ASM3_K_STO_20"}, + { "type": "ScalarParameter", "varName": "k_sto20", "confName": "ASM3_KSTO20"}, { "type": "ScalarParameter", "varName": "KX", "confName": "ASM3_KX"}, { "type": "ScalarParameter", "varName": "KHO2", "confName": "ASM3_KHO2"}, { "type": "ScalarParameter", "varName": "KHSS", "confName": "ASM3_KHSS"}, @@ -45,21 +45,23 @@ { "type": "ScalarParameter", "varName": "KHNH4", "confName": "ASM3_KHNH4"}, { "type": "ScalarParameter", "varName": "KHALK", "confName": "ASM3_KHALK"}, { "type": "ScalarParameter", "varName": "KHSTO", "confName": "ASM3_KHSTO"}, - { "type": "ScalarParameter", "varName": "muH20", "confName": "ASM3_MU_H_20"}, - { "type": "ScalarParameter", "varName": "etaHend", "confName": "ASM3_ETA_H_END"}, - { "type": "ScalarParameter", "varName": "bH20", "confName": "ASM3_B_H_20"}, - { "type": "ScalarParameter", "varName": "muAUT20", "confName": "ASM3_MU_AUT_20"}, + { "type": "ScalarParameter", "varName": "muH20", "confName": "ASM3_MU_H20"}, + { "type": "ScalarParameter", "varName": "etaHend", "confName": "ASM3_ETAH_END"}, + { "type": "ScalarParameter", "varName": "bH20", "confName": "ASM3_BH20"}, + { "type": "ScalarParameter", "varName": "muAUT20", "confName": "ASM3_MU_AUT20"}, { "type": "ScalarParameter", "varName": "KNO2", "confName": "ASM3_KNO2"}, { "type": "ScalarParameter", "varName": "KNNH4", "confName": "ASM3_KNNH4"}, { "type": "ScalarParameter", "varName": "KNALK", "confName": "ASM3_KNALK"}, - { "type": "ScalarParameter", "varName": "bAUT20", "confName": "ASM3_B_AUT_20"}, - { "type": "ScalarParameter", "varName": "etaNend", "confName": "ASM3_ETA_N_END"} + { "type": "ScalarParameter", "varName": "bAUT20", "confName": "ASM3_BAUT20"}, + { "type": "ScalarParameter", "varName": "etaNend", "confName": "ASM3_ETAN_END"} ] } */ /* Parameter description ------------------------ + + */ @@ -151,18 +153,7 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase virtual bool configureModelDiscretization(IParameterProvider& paramProvider, unsigned int nComp, unsigned int const* nBound, unsigned int const* boundOffset) { DynamicReactionModelBase::configureModelDiscretization(paramProvider, nComp, nBound, boundOffset); - - if (paramProvider.exists("MM_STOICHIOMETRY_BULK")) - { - const std::size_t numElements = paramProvider.numElements("MM_STOICHIOMETRY_BULK"); - if (numElements % nComp != 0) - throw InvalidParameterException("Size of field MM_STOICHIOMETRY_BULK must be a positive multiple of NCOMP (" + std::to_string(nComp) + ")"); - - const unsigned int nReactions = numElements / nComp; - - _stoichiometry.resize(nComp, nReactions); - } - + _stoichiometry.resize(nComp, 13); return true; } @@ -186,28 +177,32 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase virtual bool configureImpl(IParameterProvider& paramProvider, UnitOpIdx unitOpIdx, ParticleTypeIdx parTypeIdx) { + _paramHandler.configure(paramProvider, _stoichiometry.columns(), _nComp, _nBoundStates); + _paramHandler.registerParameters(_parameters, unitOpIdx, parTypeIdx, _nComp, _nBoundStates); + + _stoichiometry.resize(_nComp, 13); _stoichiometry.setAll(0); - // parameter set ASM3hC - double iNSI = paramProvider.getDouble("ASM_iNSI"); - double iNSS = paramProvider.getDouble("ASM_iNSS"); - double iNXI = paramProvider.getDouble("ASM_iNXI"); - double iNXS = paramProvider.getDouble("ASM_iNXS"); - double iNBM = paramProvider.getDouble("ASM_iNBM"); - - double fSI = paramProvider.getDouble("ASM_fSI"); - double fXI = paramProvider.getDouble("ASM_fXI"); - - double YH_aer = paramProvider.getDouble("ASM_YH_aer"); - double YH_anox = paramProvider.getDouble("ASM_YH_anox"); - double YSTO_aer = paramProvider.getDouble("ASM_YSTO_aer"); - double YSTO_anox = paramProvider.getDouble("ASM_YSTO_anox"); - double YA = paramProvider.getDouble("ASM_YA"); - - double fiSS_BM_prod = paramProvider.getDouble("ASM_fiSS_BM_prod"); - double iVSS_BM = paramProvider.getDouble("ASM_iVSS_BM"); - double iTSS_VSS_BM = paramProvider.getDouble("ASM_iTSS_VSS_BM"); + // parameter set ASM3h + double iNSI = paramProvider.getDouble("ASM3_INSI"); + double iNSS = paramProvider.getDouble("ASM3_INSS"); + double iNXI = paramProvider.getDouble("ASM3_INXI"); + double iNXS = paramProvider.getDouble("ASM3_INXS"); + double iNBM = paramProvider.getDouble("ASM3_INBM"); + + double fSI = paramProvider.getDouble("ASM3_FSI"); + double fXI = paramProvider.getDouble("ASM3_FXI"); + + double YH_aer = paramProvider.getDouble("ASM3_YH_AER"); + double YH_anox = paramProvider.getDouble("ASM3_YH_ANOX"); + double YSTO_aer = paramProvider.getDouble("ASM3_YSTO_AER"); + double YSTO_anox = paramProvider.getDouble("ASM3_YSTO_ANOX"); + double YA = paramProvider.getDouble("ASM3_YA"); + + double fiSS_BM_prod = paramProvider.getDouble("ASM3_FISS_BM_PROD"); + double iVSS_BM = paramProvider.getDouble("ASM3_IVSS_BM"); + double iTSS_VSS_BM = paramProvider.getDouble("ASM3_ITSS_VSS_BM"); // internal variables double fXMI_BM = fiSS_BM_prod * fXI * iVSS_BM * (iTSS_VSS_BM - 1); @@ -330,8 +325,8 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.native(12, 10) = fXMI_BM; _stoichiometry.native(12, 11) = fXMI_BM; - //_paramHandler.configure(paramProvider, _stoichiometry.columns(), _nComp, _nBoundStates); - _paramHandler.registerParameters(_parameters, unitOpIdx, parTypeIdx, _nComp, _nBoundStates); + + //registerCompRowMatrix(_parameters, unitOpIdx, parTypeIdx, "MM_STOICHIOMETRY_BULK", _stoichiometryBulk); todo @@ -349,28 +344,28 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase typedef typename DoubleActivePromoter::type flux_t; BufferedArray fluxes = workSpace.array(_stoichiometry.columns()); - flux_t Kh20 = static_cast::type>(p->Kh20); - flux_t T = static_cast::type>(p->T); - flux_t iO2 = static_cast::type>(p->iO2); - flux_t V = static_cast::type>(p->V); - flux_t k_sto20 = static_cast::type>(p->k_sto20); - flux_t KX = static_cast::type>(p->KX); - flux_t KHO2 = static_cast::type>(p->KHO2); - flux_t KHSS = static_cast::type>(p->KHSS); - flux_t KHNO3 = static_cast::type>(p->KHNO3); - flux_t etaHNO3 = static_cast::type>(p->etaHNO3); - flux_t KHNH4 = static_cast::type>(p->KHNH4); - flux_t KHALK = static_cast::type>(p->KHALK); - flux_t KHSTO = static_cast::type>(p->KHSTO); - flux_t muH20 = static_cast::type>(p->muH20); - flux_t etaHend = static_cast::type>(p->etaHend); - flux_t bH20 = static_cast::type>(p->bH20); - flux_t muAUT20 = static_cast::type>(p->muAUT20); - flux_t KNO2 = static_cast::type>(p->KNO2); - flux_t KNNH4 = static_cast::type>(p->KNNH4); - flux_t KNALK = static_cast::type>(p->KNALK); - flux_t bAUT20 = static_cast::type>(p->bAUT20); - flux_t etaNend = static_cast::type>(p->etaNend); + flux_t Kh20 = static_cast::type>(p->Kh20); + flux_t T = static_cast::type>(p->T); + flux_t iO2 = static_cast::type>(p->iO2); + flux_t V = static_cast::type>(p->V); + flux_t k_sto20 = static_cast::type>(p->k_sto20); + flux_t KX = static_cast::type>(p->KX); + flux_t KHO2 = static_cast::type>(p->KHO2); + flux_t KHSS = static_cast::type>(p->KHSS); + flux_t KHNO3 = static_cast::type>(p->KHNO3); + flux_t etaHNO3 = static_cast::type>(p->etaHNO3); + flux_t KHNH4 = static_cast::type>(p->KHNH4); + flux_t KHALK = static_cast::type>(p->KHALK); + flux_t KHSTO = static_cast::type>(p->KHSTO); + flux_t muH20 = static_cast::type>(p->muH20); + flux_t etaHend = static_cast::type>(p->etaHend); + flux_t bH20 = static_cast::type>(p->bH20); + flux_t muAUT20 = static_cast::type>(p->muAUT20); + flux_t KNO2 = static_cast::type>(p->KNO2); + flux_t KNNH4 = static_cast::type>(p->KNNH4); + flux_t KNALK = static_cast::type>(p->KNALK); + flux_t bAUT20 = static_cast::type>(p->bAUT20); + flux_t etaNend = static_cast::type>(p->etaNend); // derived parameters double ft04 = exp(-0.04 * (20.0 - static_cast(T))); @@ -463,28 +458,28 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase { typename ParamHandler_t::ParamsHandle const p = _paramHandler.update(t, secIdx, colPos, _nComp, _nBoundStates, workSpace); - double Kh20 = static_cast(p->Kh20); - double T = static_cast(p->T); - double iO2 = static_cast(p->iO2); - double V = static_cast(p->V); - double k_sto20 = static_cast(p->k_sto20); - double KX = static_cast(p->KX); - double KHO2 = static_cast(p->KHO2); - double KHSS = static_cast(p->KHSS); - double KHNO3 = static_cast(p->KHNO3); - double etaHNO3 = static_cast(p->etaHNO3); - double KHNH4 = static_cast(p->KHNH4); - double KHALK = static_cast(p->KHALK); - double KHSTO = static_cast(p->KHSTO); - double muH20 = static_cast(p->muH20); - double etaHend = static_cast(p->etaHend); - double bH20 = static_cast(p->bH20); - double muAUT20 = static_cast(p->muAUT20); - double KNO2 = static_cast(p->KNO2); - double KNNH4 = static_cast(p->KNNH4); - double KNALK = static_cast(p->KNALK); - double bAUT20 = static_cast(p->bAUT20); - double etaNend = static_cast(p->etaNend); + const double Kh20 = static_cast(p->Kh20); + const double T = static_cast(p->T); + const double iO2 = static_cast(p->iO2); + const double V = static_cast(p->V); + const double k_sto20 = static_cast(p->k_sto20); + const double KX = static_cast(p->KX); + const double KHO2 = static_cast(p->KHO2); + const double KHSS = static_cast(p->KHSS); + const double KHNO3 = static_cast(p->KHNO3); + const double etaHNO3 = static_cast(p->etaHNO3); + const double KHNH4 = static_cast(p->KHNH4); + const double KHALK = static_cast(p->KHALK); + const double KHSTO = static_cast(p->KHSTO); + const double muH20 = static_cast(p->muH20); + const double etaHend = static_cast(p->etaHend); + const double bH20 = static_cast(p->bH20); + const double muAUT20 = static_cast(p->muAUT20); + const double KNO2 = static_cast(p->KNO2); + const double KNNH4 = static_cast(p->KNNH4); + const double KNALK = static_cast(p->KNALK); + const double bAUT20 = static_cast(p->bAUT20); + const double etaNend = static_cast(p->etaNend); // derived parameters double ft04 = exp(-0.04 * (20.0 - static_cast(p->T))); @@ -512,87 +507,48 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase double XMI = y[12]; // unused size_t idxSO = 0; - size_t idxSS = 1; - size_t idxSNH = 2; - size_t idxSNO = 3; - size_t idxSN2 = 4; - size_t idxSALK = 5; - size_t idxSI = 6; - size_t idxXI = 7; - size_t idxXS = 8; - size_t idxXH = 9; - size_t idxXSTO = 10; - size_t idxXA = 11; - size_t idxXMI = 12; - - double d[13][13] = {}; - //memset(d, 0, 13 * 13 * sizeof(double)); - // p1: Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX) * XH; - d[0][idxXS] = Kh20 * ft04 * XH / (XS/XH_S + KX) - Kh20 * ft04 * XS/XH_S / ((XS/XH_S + KX) * (XS/XH_S + KX)) * XH; - //double dp1_XH_S = -Kh20 * ft04 * XS / (XS/XH_S + KX) / (XH_S * XH_S) * XH; - d[0][idxXH] = Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX); - - // reaction2: k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; - d[1][idxSO] = k_sto * ft07 * SS / (SS + KHSS) * SNO / (SNO + KHNO3) / ((SO + KHO2) * (SO + KHO2)) * XH; - d[1][idxSS] = k_sto * ft07 * SO / (SO + KHO2) * SNO / (SNO + KHNO3) / ((SS + KHSS) * (SS + KHSS)) * XH; - d[1][idxSNO] = k_sto * ft07 * SO / (SO + KHO2) * SS / (SS + KHSS) / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; - d[1][idxXH] = k_sto * ft07 * SO / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); - - //reaction3: k_sto * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; - d[2][idxSO] = k_sto * ft07 * etaHNO3 * KHO2 / ((SO + KHO2) * (SO + KHO2)) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; - d[2][idxSS] = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / ((SS + KHSS) * (SS + KHSS)) * SNO / (SNO + KHNO3) * XH; - d[2][idxSNO] = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; - d[2][idxXH] = k_sto * ft07 * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); - - //reaction4: muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) * XH; - d[3][idxSO] = muH * ft07 * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / ((SO + KHO2) * (SO + KHO2)) * XH; - d[3][idxSNH] = muH * ft07 * SO / (SO + KHO2) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / ((SNH + KHNH4) * (SNH + KHNH4)) * XH; - d[3][idxSALK] = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / ((SALK + KHALK) * (SALK + KHALK)) * XH; - d[3][idxXSTO] = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) / ((XSTO/XH_S + KHSTO) * (XSTO/XH_S + KHSTO)) * XH; - //double dp4_XH_S = -muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) / (XSTO/XH_S * XSTO/XH_S) * XH; - d[3][idxXH] = muH * ft07 * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO); - - //reaction5: muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; - d[4][idxSO] = muH * ft07 * etaHNO3 * KHO2 / ((KHO2 + SO) * (KHO2 + SO)) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; - d[4][idxSNH] = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / ((KHNH4 + SNH) * (KHNH4 + SNH)) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; - d[4][idxSALK] = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / ((KHALK + SALK) * (KHALK + SALK)) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; - d[4][idxXSTO] = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) / ((XSTO/XH_S + KHSTO) * (XSTO/XH_S + KHSTO)) * SNO / (KHNO3 + SNO) * XH; - //double dp5_XH_S = -muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) / (XSTO/XH_S * XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; - d[4][idxSNO] = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) / ((KHNO3 + SNO) * (KHNO3 + SNO)) * XH; - d[4][idxXH] = muH * ft07 * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO); - - - //reaction6: bH * SO / (SO + KHO2) * XH; - d[5][idxSO] = bH * ft07 * XH / ((SO + KHO2) * (SO + KHO2)); - d[5][idxXH] = bH * ft07 * SO / (SO + KHO2); - - //reaction7: bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XH; - d[6][idxSO] = bH * ft07 * etaHend * KHO2 / ((SO + KHO2) * (SO + KHO2)) * SNO / (SNO + KHNO3) * XH; - d[6][idxSNO] = bH * ft07 * etaHend * KHO2 / (SO + KHO2) * SNO / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; - d[6][idxXH] = bH * ft07 * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XH; - - //reaction8: bH * SO / (SO + KHO2) * XSTO; - d[7][idxSO] = bH * ft07 * XSTO / ((SO + KHO2) * (SO + KHO2)); - d[7][idxXSTO] = bH * ft07 * SO / (SO + KHO2); - - //reaction9: bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XSTO; - d[8][idxSO] = bH * ft07 * etaHend * KHO2 / ((SO + KHO2) * (SO + KHO2)) * SNO / (SNO + KHNO3) * XSTO; - d[8][idxSNO] = bH * ft07 * etaHend * KHO2 / (SO + KHO2) * SNO / ((SNO + KHNO3) * (SNO + KHNO3)) * XSTO; - - //reaction10: muAUT * SO / (SO + KNO2) * SNH / (SNH + KNNH4) * SALK / (SALK + KNALK) * XA; - d[9][idxSO] = muAUT * ft105 * SNH / (SNH + KNNH4) * SALK / (SALK + KNALK) * XA / ((SO + KNO2) * (SO + KNO2)); - d[9][idxSNH] = muAUT * ft105 * SO / (SO + KNO2) * SALK / (SALK + KNALK) / ((SNH + KNNH4) * (SNH + KNNH4)) * XA; - d[9][idxSALK] = muAUT * ft105 * SO / (SO + KNO2) * SNH / (SNH + KNNH4) / ((SALK + KNALK) * (SALK + KNALK)) * XA; - - //reaction11: bAUT * SO / (SO + KHO2) * XA; - d[10][idxSO] = bAUT * ft105 * XA / ((SO + KHO2) * (SO + KHO2)); - d[10][idxXA] = bAUT * ft105 * SO / (SO + KHO2); - - - //reaction12: bAUT * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2) * XA; - d[11][idxSO] = bAUT * ft105 * etaNend * SNO / (SNO + KHNO3) * KHO2 / ((SO + KHO2) * (SO + KHO2)) * XA; - d[11][idxSNO] = bAUT * ft105 * etaNend * KHO2 / (SO + KHO2) * SNO / ((SNO + KHNO3) * (SNO + KHNO3)) * XA; - d[11][idxXA] = bAUT * ft105 * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2) * XA; + size_t idxSS = 1; + size_t idxSNH = 2; + size_t idxSNO = 3; + size_t idxSN2 = 4; + size_t idxSALK = 5; + size_t idxSI = 6; + size_t idxXI = 7; + size_t idxXS = 8; + size_t idxXH = 9; + size_t idxXSTO = 10; + size_t idxXA = 11; + size_t idxXMI = 12; + + double d[13][13] = {}; + + // p1: Hydrolysis: Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX) * XH; + d[0][idxXS] = Kh20 * ft04 * XH_S / ((XS + XH_S * KX) * (XS + XH_S * KX)) * XH * XH_S; + d[0][idxXH] = Kh20 * ft04 * XS / (XS + XH_S * KX); + + // p2: Aerobic storage of SS: k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * XH; + d[1][idxSO] = k_sto * KHO2 * SS / (SS + KHSS) * SNO / (SNO + KHNO3) / ((SO + KHO2) * (SO + KHO2)) * XH; + d[1][idxSS] = k_sto * SO / (SO + KHO2) * KHSS * SNO / (SNO + KHNO3) / ((SS + KHSS) * (SS + KHSS)) * XH; + d[1][idxSNO] = k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * KHNO3 / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; + d[1][idxXH] = k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); + + // p3: Anoxic storage of SS: k_sto * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; + d[2][idxSO] = -k_sto * etaHNO3 * KHO2 * SS / (SS + KHSS) * SNO / (SNO + KHNO3) / ((SO + KHO2) * (SO + KHO2)) * XH; + d[2][idxSS] = k_sto * etaHNO3 * KHO2 / (SO + KHO2) * KHSS * SNO / (SNO + KHNO3) / ((SS + KHSS) * (SS + KHSS)) * XH; + d[2][idxSNO] = k_sto * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * KHNO3 / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; + d[2][idxXH] = k_sto * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); + + // p4: Aerobic growth: muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) * XH; + d[3][idxSO] = muH * KHO2 * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / ((SO + KHO2) * (SO + KHO2)) * XH; + d[3][idxSNH] = muH * SO / (SO + KHO2) * KHNH4 * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / ((SNH + KHNH4) * (SNH + KHNH4)) * XH; + d[3][idxSALK] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * KHALK * XSTO/XH_S / (XSTO/XH_S + KHSTO) / ((SALK + KHALK) * (SALK + KHALK)) * XH; + d[3][idxXSTO] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * KHSTO / XH_S / ((XSTO/XH_S + KHSTO) * (XSTO/XH_S + KHSTO)) * XH; + d[3][idxXH] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO); + + // p5: Anoxic growth: muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; + d[4][idxSO] = -muH * etaHNO3 * KHO2 * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH / ((KHO2 + SO) * (KHO2 + SO)); + d[4][idxSNH] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * KHNH4 * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH / ((KHNH4 + SNH) * (KHNH4 + SNH)); + d[4][idxSALK] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * KHALK * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH / ((KHALK + SALK) * (KHALK + SALK)); RowIterator curJac = jac; // TODO consider configurable component indices From 0750d08005724e0d9a900855953ac2470b29f121 Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Thu, 15 May 2025 11:15:03 +0200 Subject: [PATCH 22/47] fic internal variable determination numbered value int-> double --- .../reaction/ActivatedSludgeModelThree.cpp | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index 799add818..54c134b40 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -216,30 +216,30 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase double c10n = -1 / YA - iNBM; double c11n = -fXI * iNXI + iNBM; double c12n = c11n; - double c3no = (YSTO_anox - 1) / (40 / 14); - double c5no = (1 - 1/YH_anox) / (40 / 14); - double c7no = (fXI - 1) / (40 / 14); - double c9no = -14 / 40; + double c3no = (YSTO_anox - 1.0) / (40.0 / 14.0); + double c5no = (1.0 - 1 / YH_anox) / (40.0 / 14.0); + double c7no = (fXI - 1) / (40.0 / 14.0); + double c9no = -14.0 / 40.0; double c10no = 1 / YA; double c12no = c7no; - double c1a = c1n / 14; - double c2a = c2n / 14; - double c3a = (c3n - c3no) / 14; - double c4a = c4n / 14; - double c5a = (c5n - c5no) / 14; - double c6a = c6n / 14; - double c7a = (c7n - c7no) / 14; - double c9a = 1 / 40; - double c10a = (c10n - c10no) / 14; - double c11a = c11n / 14; - double c12a = (c12n - c12no) / 14; + double c1a = c1n / 14.0; + double c2a = c2n / 14.0; + double c3a = (c3n - c3no) / 14.0; + double c4a = c4n / 14.0; + double c5a = (c5n - c5no) / 14.0; + double c6a = c6n / 14.0; + double c7a = (c7n - c7no) / 14.0; + double c9a = 1 / 40.0; + double c10a = (c10n - c10no) / 14.0; + double c11a = c11n / 14.0; + double c12a = (c12n - c12no) / 14.0; // SO _stoichiometry.native(0, 1) = YSTO_aer - 1; _stoichiometry.native(0, 3) = 1 - 1 / YH_aer; _stoichiometry.native(0, 5) = -1 * (1 - fXI); _stoichiometry.native(0, 7) = -1; - _stoichiometry.native(0, 9) = -64/14 * 1/YA + 1; + _stoichiometry.native(0, 9) = -64.0/14.0 * 1/YA + 1; _stoichiometry.native(0, 10) = -1 * (1 - fXI); _stoichiometry.native(0, 12) = 1; @@ -369,8 +369,8 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase // derived parameters double ft04 = exp(-0.04 * (20.0 - static_cast(T))); - double ft07 = exp(-0.06952 * (20 - static_cast(T))); - double ft105 = exp(-0.105 * (20 - static_cast(T))); + double ft07 = exp(-0.06952 * (20.0 - static_cast(T))); + double ft105 = exp(-0.105 * (20.0 - static_cast(T))); double k_sto = static_cast(k_sto20) * ft07; double muH = static_cast(muH20) * ft07; double bH = static_cast(bH20) * ft07; @@ -483,8 +483,8 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase // derived parameters double ft04 = exp(-0.04 * (20.0 - static_cast(p->T))); - double ft07 = exp(-0.06952 * (20 - static_cast(p->T))); - double ft105 = exp(-0.105 * (20 - static_cast(p->T))); + double ft07 = exp(-0.06952 * (20.0 - static_cast(p->T))); + double ft105 = exp(-0.105 * (20.0 - static_cast(p->T))); double k_sto = static_cast(p->k_sto20) * ft07; double muH = static_cast(p->muH20) * ft07; double bH = static_cast(p->bH20) * ft07; From 785dd6c1ca1bb63999be95b13daf89e17b5e5105 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Sat, 17 May 2025 12:14:11 +0200 Subject: [PATCH 23/47] ASM3: start documenting parameters --- .../reaction/activated_sludge_model.rst | 184 ++++++++++++++++++ doc/interface/reaction/index.rst | 1 + .../reaction/activated_sludge_model.rst | 11 ++ doc/modelling/reaction/index.rst | 4 + 4 files changed, 200 insertions(+) create mode 100644 doc/interface/reaction/activated_sludge_model.rst create mode 100644 doc/modelling/reaction/activated_sludge_model.rst diff --git a/doc/interface/reaction/activated_sludge_model.rst b/doc/interface/reaction/activated_sludge_model.rst new file mode 100644 index 000000000..2e87c2e1a --- /dev/null +++ b/doc/interface/reaction/activated_sludge_model.rst @@ -0,0 +1,184 @@ +.. _activated_sludge_model_config: + +Activated Sludge Model (ASM3h) +~~~~~~~~~~~~~~~~~~~~~~~~~ + +**Group /input/model/unit_XXX/reaction - REACTION_MODEL = ACTIVATED_SLUDGE_MODEL3** + +For information on model equations, refer to :ref:`activated_sludge_model`. + +``ASM3_KH20`` + + Hydrolysis rate constant :math:`k_H` at 20 °C. + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_T`` + + Temperature :math:`T`. + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_IO2`` + + Aeration rate :math:`iO_2`. + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\ge 0` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_V`` + + Aeration volume :math:`V`. + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\gt 0` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_KSTO20`` + + Saturation constant :math:`K_{STO}` at 20 °C. + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\gt 0` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_KX`` + + Hydrolysis saturation constant :math:`KX`. + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_KHO2`` + + :math:`SO_2` saturation constant :math:`KHO_2`. + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_KHSS`` + + Substrate :math:`SS` saturation constant :math:`KHSS`. + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_KHNO3`` + + :math:`SNO_X` saturation constant :math:`KHNO_3`. + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_ETA_HNO3`` + + Anoxic reduction factor :math:`\eta_{HNO_3}`. + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_KHNH4`` + + Ammonium saturation constant :math:`KHNH_4`. + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_KHALK`` + + :math:`XH` alkalinity saturation constant :math:`KH_{ALK}`. + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_KHSTO`` + + :math:`X_{STO}` saturation constant :math:`KH_{STO}`. + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_MU_H20`` + + Heterotrophic max. growth rate :math:`\mu_{H}` at 20 °C. + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_ETAH_END`` + + + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_BH20`` + + + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_MU_AUT20`` + + + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_KNO2`` + + + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_KNNH4`` + + + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_KNALK`` + + + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_BAUT20`` + + + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_ETAN_END`` + + + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 + ================ ============================= ======================================================== diff --git a/doc/interface/reaction/index.rst b/doc/interface/reaction/index.rst index a1b6e14a7..e8e955750 100644 --- a/doc/interface/reaction/index.rst +++ b/doc/interface/reaction/index.rst @@ -8,6 +8,7 @@ Reaction models mass_action_law michaelis_menten_kinetics + activated_sludge_model Externally dependent reaction models ------------------------------------ diff --git a/doc/modelling/reaction/activated_sludge_model.rst b/doc/modelling/reaction/activated_sludge_model.rst new file mode 100644 index 000000000..09b380544 --- /dev/null +++ b/doc/modelling/reaction/activated_sludge_model.rst @@ -0,0 +1,11 @@ +.. _activated_sludge_model: + +Activated Sludge Model (ASM3h) +------------------------- + +Activated Sludge Models are a group of reaction models published by the International Water Association (IWA) +and mostly used for modelling biological processes in wastewater treatment plants. + +The ASM3h model implemented in CADET is a variant of the ASM3 model and documented in the SIMBA# software suite. + +For more information on model parameters required to define in CADET file format, see :ref:`activated_sludge_model_config`. diff --git a/doc/modelling/reaction/index.rst b/doc/modelling/reaction/index.rst index 02330bd4a..b9e3d6517 100644 --- a/doc/modelling/reaction/index.rst +++ b/doc/modelling/reaction/index.rst @@ -16,6 +16,10 @@ Historically, a chromatography system is modeled as a reaction system without co - :ref:`thomas_model` - :ref:`rate_constant_distribution_theory` +More specialized models are also implemented: + + - :ref:`activated_sludge_model` + .. _dependence-on-external-function_react: Dependence on external function From ee896db4e752bf28f7826c2ca7587e84090c5a4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Mon, 19 May 2025 15:51:45 +0200 Subject: [PATCH 24/47] ASM3: document remaining params from SIMBA# --- .../reaction/activated_sludge_model.rst | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/doc/interface/reaction/activated_sludge_model.rst b/doc/interface/reaction/activated_sludge_model.rst index 2e87c2e1a..3a3633866 100644 --- a/doc/interface/reaction/activated_sludge_model.rst +++ b/doc/interface/reaction/activated_sludge_model.rst @@ -25,7 +25,7 @@ For information on model equations, refer to :ref:`activated_sludge_model`. ``ASM3_IO2`` - Aeration rate :math:`iO_2`. + Aeration xygen input :math:`iO_2`. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\ge 0` **Length:** 1 @@ -41,7 +41,7 @@ For information on model equations, refer to :ref:`activated_sludge_model`. ``ASM3_KSTO20`` - Saturation constant :math:`K_{STO}` at 20 °C. + Maximum storage rate :math:`K_{STO}` at 20 °C. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\gt 0` **Length:** 1 @@ -49,7 +49,7 @@ For information on model equations, refer to :ref:`activated_sludge_model`. ``ASM3_KX`` - Hydrolysis saturation constant :math:`KX`. + Saturation/inhibition coefficient for particulate COD :math:`KX`. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 @@ -57,7 +57,7 @@ For information on model equations, refer to :ref:`activated_sludge_model`. ``ASM3_KHO2`` - :math:`SO_2` saturation constant :math:`KHO_2`. + Saturation/inhibition coefficient for oxygen, heterotrophic growth :math:`KHO_2`. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 @@ -121,7 +121,7 @@ For information on model equations, refer to :ref:`activated_sludge_model`. ``ASM3_ETAH_END`` - + Reduction factor :math:`\eta_{H_end}` for :math:`b_H` under anoxic conditions. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 @@ -129,7 +129,7 @@ For information on model equations, refer to :ref:`activated_sludge_model`. ``ASM3_BH20`` - + Rate constant for lysis and decay :math:`b_H` at 20 °C. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 @@ -137,7 +137,7 @@ For information on model equations, refer to :ref:`activated_sludge_model`. ``ASM3_MU_AUT20`` - + Maximum growth rate of :math:`XAUT`, :math:`\mu_{AUT}` at 20 °C. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 @@ -145,7 +145,7 @@ For information on model equations, refer to :ref:`activated_sludge_model`. ``ASM3_KNO2`` - + Saturation coefficient :math:`K_{NO_2}` for oxygen, autotrophic growth. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 @@ -153,7 +153,7 @@ For information on model equations, refer to :ref:`activated_sludge_model`. ``ASM3_KNNH4`` - + Saturation coefficient :math:`K_{NNH_4}` for ammonium (substrate), autotrophic growth. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 @@ -161,7 +161,7 @@ For information on model equations, refer to :ref:`activated_sludge_model`. ``ASM3_KNALK`` - + Saturation coefficient :math:`K_{NALK}` for alkalinity, autotrophic growth. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 @@ -169,7 +169,7 @@ For information on model equations, refer to :ref:`activated_sludge_model`. ``ASM3_BAUT20`` - + Decay rate :math:`b_{AUT}` of :math:`XAUT` at 20 °C. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 @@ -177,7 +177,7 @@ For information on model equations, refer to :ref:`activated_sludge_model`. ``ASM3_ETAN_END`` - + Reduction factor :math:`\eta_{N_end}` for :math:`b_{AUT}` under anoxic conditions. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 From ce294c2f8d5ec88e12a0d0e99f6464c77350ec1a Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Mon, 19 May 2025 15:54:17 +0200 Subject: [PATCH 25/47] fix lost of jacobi equaitons --- .../reaction/ActivatedSludgeModelThree.cpp | 212 ++++++++++++------ 1 file changed, 142 insertions(+), 70 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index 54c134b40..54e5fb152 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -239,7 +239,7 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.native(0, 3) = 1 - 1 / YH_aer; _stoichiometry.native(0, 5) = -1 * (1 - fXI); _stoichiometry.native(0, 7) = -1; - _stoichiometry.native(0, 9) = -64.0/14.0 * 1/YA + 1; + _stoichiometry.native(0, 9) = -(64.0/14.0) * 1/YA + 1; _stoichiometry.native(0, 10) = -1 * (1 - fXI); _stoichiometry.native(0, 12) = 1; @@ -387,26 +387,32 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase // StateType XI = y[7]; // unused StateType XS = y[8]; StateType XH = y[9]; - StateType XH_S = XH; // ASM3hC: XH_S = max(XH, 0.1) StateType XSTO = y[10]; StateType XA = y[11]; // StateType XMI = y[12]; // unused // p1: Hydrolysis of organic structures - fluxes[0] = Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX) * XH; + fluxes[0] = Kh20 * ft04 * (XS/XH) / ((XS/XH) + KX) * XH; + if (XH < 0.1) + fluxes[0] = Kh20 * ft04 * (XS/0.1) / ((XS/0.1) + KX) * XH; + // p2: Aerobic storage of SS - fluxes[1] = k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; + fluxes[1] = k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * XH; // p3: Anoxic storage of SS fluxes[2] = k_sto * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; // p4: Aerobic growth of heterotrophic biomass (XH) - fluxes[3] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) * XH; + fluxes[3] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * ((XSTO/XH)) / (((XSTO/XH)) + KHSTO) * XH; + if (XH < 0.1) + fluxes[3] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * (XSTO / 0.1) / ((XSTO / 0.1) + KHSTO) * XH; // p5: Anoxic growth of heterotrophic biomass (XH, denitrification) - fluxes[4] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; + fluxes[4] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * (XSTO / XH) * 1 / (KHSTO + (XSTO / XH)) * SNO / (KHNO3 + SNO) * XH; + if (XH < 0.1) + fluxes[4] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * (XSTO / 0.1) * 1 / (KHSTO + (XSTO/0.1)) * SNO / (KHNO3 + SNO) * XH; // r6: Aerobic endogenous respiration of heterotroph microorganisms (XH) fluxes[5] = bH * SO / (SO + KHO2) * XH; @@ -458,38 +464,39 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase { typename ParamHandler_t::ParamsHandle const p = _paramHandler.update(t, secIdx, colPos, _nComp, _nBoundStates, workSpace); - const double Kh20 = static_cast(p->Kh20); - const double T = static_cast(p->T); - const double iO2 = static_cast(p->iO2); - const double V = static_cast(p->V); - const double k_sto20 = static_cast(p->k_sto20); - const double KX = static_cast(p->KX); - const double KHO2 = static_cast(p->KHO2); - const double KHSS = static_cast(p->KHSS); - const double KHNO3 = static_cast(p->KHNO3); - const double etaHNO3 = static_cast(p->etaHNO3); - const double KHNH4 = static_cast(p->KHNH4); - const double KHALK = static_cast(p->KHALK); - const double KHSTO = static_cast(p->KHSTO); - const double muH20 = static_cast(p->muH20); - const double etaHend = static_cast(p->etaHend); - const double bH20 = static_cast(p->bH20); - const double muAUT20 = static_cast(p->muAUT20); - const double KNO2 = static_cast(p->KNO2); - const double KNNH4 = static_cast(p->KNNH4); - const double KNALK = static_cast(p->KNALK); - const double bAUT20 = static_cast(p->bAUT20); - const double etaNend = static_cast(p->etaNend); + + const double Kh20 = static_cast(p->Kh20); + const double T = static_cast(p->T); + const double iO2 = static_cast(p->iO2); + const double V = static_cast(p->V); + const double k_sto20 = static_cast(p->k_sto20); + const double KX = static_cast(p->KX); + const double KHO2 = static_cast(p->KHO2); + const double KHSS = static_cast(p->KHSS); + const double KHNO3 = static_cast(p->KHNO3); + const double etaHNO3 = static_cast(p->etaHNO3); + const double KHNH4 = static_cast(p->KHNH4); + const double KHALK = static_cast(p->KHALK); + const double KHSTO = static_cast(p->KHSTO); + const double muH20 = static_cast(p->muH20); + const double etaHend = static_cast(p->etaHend); + const double bH20 = static_cast(p->bH20); + const double muAUT20 = static_cast(p->muAUT20); + const double KNO2 = static_cast(p->KNO2); + const double KNNH4 = static_cast(p->KNNH4); + const double KNALK = static_cast(p->KNALK); + const double bAUT20 = static_cast(p->bAUT20); + const double etaNend = static_cast(p->etaNend); // derived parameters - double ft04 = exp(-0.04 * (20.0 - static_cast(p->T))); - double ft07 = exp(-0.06952 * (20.0 - static_cast(p->T))); - double ft105 = exp(-0.105 * (20.0 - static_cast(p->T))); - double k_sto = static_cast(p->k_sto20) * ft07; - double muH = static_cast(p->muH20) * ft07; - double bH = static_cast(p->bH20) * ft07; - double muAUT = static_cast(p->muAUT20) * ft105; - double bAUT = static_cast(p->bAUT20) * ft105; + const double ft04 = exp(-0.04 * (20.0 - static_cast(p->T))); + const double ft07 = exp(-0.06952 * (20.0 - static_cast(p->T))); + const double ft105 = exp(-0.105 * (20.0 - static_cast(p->T))); + const double k_sto = static_cast(p->k_sto20) * ft07; + const double muH = static_cast(p->muH20) * ft07; + const double bH = static_cast(p->bH20) * ft07; + const double muAUT = static_cast(p->muAUT20) * ft105; + const double bAUT = static_cast(p->bAUT20) * ft105; double SO = y[0]; double SS = y[1]; @@ -501,35 +508,41 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase double XI = y[7]; // unused double XS = y[8]; double XH = y[9]; - double XH_S = XH; // ASM3hC: XH_S = max(XH, 0.1) double XSTO = y[10]; double XA = y[11]; double XMI = y[12]; // unused - - size_t idxSO = 0; - size_t idxSS = 1; - size_t idxSNH = 2; - size_t idxSNO = 3; - size_t idxSN2 = 4; - size_t idxSALK = 5; - size_t idxSI = 6; - size_t idxXI = 7; - size_t idxXS = 8; - size_t idxXH = 9; - size_t idxXSTO = 10; - size_t idxXA = 11; - size_t idxXMI = 12; - - double d[13][13] = {}; + //XH_S = max(XH, 0.1) + + const size_t idxSO = 0; + const size_t idxSS = 1; + const size_t idxSNH = 2; + const size_t idxSNO = 3; + const size_t idxSN2 = 4; + const size_t idxSALK = 5; + const size_t idxSI = 6; + const size_t idxXI = 7; + const size_t idxXS = 8; + const size_t idxXH = 9; + const size_t idxXSTO = 10; + const size_t idxXA = 11; + const size_t idxXMI = 12; + + const double d[13][13] = {}; // p1: Hydrolysis: Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX) * XH; - d[0][idxXS] = Kh20 * ft04 * XH_S / ((XS + XH_S * KX) * (XS + XH_S * KX)) * XH * XH_S; - d[0][idxXH] = Kh20 * ft04 * XS / (XS + XH_S * KX); + // Jacobian: + d[0][idxXS] = Kh20 * ft04 * XH / ((XS + XH * KX) * (XS + XH * KX)) * XH; + d[0][idxXH] = Kh20 * ft04 * (XS/XH) / ((XS/XH) + KX); + if (XH < 0.1) + { + d[0][idxXH] = Kh20 * ft04 * (XS / 0.1) / ((XS / 0.1) + KX); + d[0][idxXS] = Kh20 * ft04 * 0.1 / ((XS + 0.1 * KX) * (XS + 0.1 * KX)) * XH; + } + // p2: Aerobic storage of SS: k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * XH; d[1][idxSO] = k_sto * KHO2 * SS / (SS + KHSS) * SNO / (SNO + KHNO3) / ((SO + KHO2) * (SO + KHO2)) * XH; d[1][idxSS] = k_sto * SO / (SO + KHO2) * KHSS * SNO / (SNO + KHNO3) / ((SS + KHSS) * (SS + KHSS)) * XH; - d[1][idxSNO] = k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * KHNO3 / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; d[1][idxXH] = k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); // p3: Anoxic storage of SS: k_sto * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; @@ -538,25 +551,84 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase d[2][idxSNO] = k_sto * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * KHNO3 / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; d[2][idxXH] = k_sto * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); - // p4: Aerobic growth: muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) * XH; - d[3][idxSO] = muH * KHO2 * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / ((SO + KHO2) * (SO + KHO2)) * XH; - d[3][idxSNH] = muH * SO / (SO + KHO2) * KHNH4 * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO) / ((SNH + KHNH4) * (SNH + KHNH4)) * XH; - d[3][idxSALK] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * KHALK * XSTO/XH_S / (XSTO/XH_S + KHSTO) / ((SALK + KHALK) * (SALK + KHALK)) * XH; - d[3][idxXSTO] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * KHSTO / XH_S / ((XSTO/XH_S + KHSTO) * (XSTO/XH_S + KHSTO)) * XH; - d[3][idxXH] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * XSTO/XH_S / (XSTO/XH_S + KHSTO); + // p4: Aerobic growth: muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * (XSTO/XH_S) / ((XSTO/XH_S) + KHSTO) * XH; + d[3][idxSO] = muH * KHO2 * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * (XSTO/XH) / (((XSTO/XH)) + KHSTO) / ((SO + KHO2) * (SO + KHO2)) * XH; + d[3][idxSNH] = muH * SO / (SO + KHO2) * KHNH4 * SALK / (SALK + KHALK) * (XSTO/XH) / ((XSTO/XH) + KHSTO) / ((SNH + KHNH4) * (SNH + KHNH4)) * XH; + d[3][idxSALK] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * KHALK * (XSTO/XH) / ((XSTO/XH) + KHSTO) / ((SALK + KHALK) * (SALK + KHALK)) * XH; + d[3][idxXSTO] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * (KHSTO / XH) / (((XSTO/XH) + KHSTO) * ((XSTO/XH) + KHSTO)) * XH; + d[3][idxXH] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * ((XSTO/XH) / ((XSTO/XH) + KHSTO) - XSTO*KHSTO / (XH*XH * ((XSTO/XH) + KHSTO) * ((XSTO/XH) + KHSTO))); + + if (XH < 0.1) + { + d[3][idxSO] = muH * KHO2 * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * (XSTO / 0.1) / ((XSTO / 0.1) + KHSTO) / ((SO + KHO2) * (SO + KHO2)) * XH; + d[3][idxSNH] = muH * SO / (SO + KHO2) * KHNH4 * SALK / (SALK + KHALK) * (XSTO / 0.1) / ((XSTO / 0.1) + KHSTO) / ((SNH + KHNH4) * (SNH + KHNH4)) * XH; + d[3][idxSALK] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * KHALK * (XSTO / 0.1) / ((XSTO / 0.1) + KHSTO) / ((SALK + KHALK) * (SALK + KHALK)) * XH; + d[3][idxXSTO] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * (KHSTO / 0.1) / ((XSTO / 0.1) + KHSTO) * (XSTO / 0.1 + KHSTO)) * XH; + d[3][idxXH] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * (XSTO / 0.1) / ((XSTO / 0.1) + KHSTO); + } - // p5: Anoxic growth: muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH; - d[4][idxSO] = -muH * etaHNO3 * KHO2 * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH / ((KHO2 + SO) * (KHO2 + SO)); - d[4][idxSNH] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * KHNH4 * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH / ((KHNH4 + SNH) * (KHNH4 + SNH)); - d[4][idxSALK] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * KHALK * XSTO / XH_S * 1 / (KHSTO + XSTO/XH_S) * SNO / (KHNO3 + SNO) * XH / ((KHALK + SALK) * (KHALK + SALK)); + // p5: Anoxic growth: muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + (XSTO/XH)_S) * SNO / (KHNO3 + SNO) * XH; + d[4][idxSO] = -muH * etaHNO3 * KHO2 * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * (XSTO / XH) * 1 / (KHSTO + (XSTO/XH)) * SNO / (KHNO3 + SNO) * XH / ((KHO2 + SO) * (KHO2 + SO)); + d[4][idxSNH] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * KHNH4 * SALK / (KHALK + SALK) * (XSTO / XH) * 1 / (KHSTO + (XSTO/XH)) * SNO / (KHNO3 + SNO) * XH / ((KHNH4 + SNH) * (KHNH4 + SNH)); + d[4][idxSALK] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * KHALK * (XSTO / XH) * 1 / (KHSTO + (XSTO/XH)) * SNO / (KHNO3 + SNO) * XH / ((KHALK + SALK) * (KHALK + SALK)); + d[4][idxSNO] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * (XSTO / XH) / (KHSTO + (XSTO/XH)) * KHNO3 / ((KHNO3 + SNO) * (KHNO3 + SNO)) * XH; + d[4][idxXSTO] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * 1 / XH / (KHSTO + (XSTO/XH)) * SNO / (KHNO3 + SNO) * XH; + d[4][idxXH] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * SNO / (KHNO3 + SNO) * ((XSTO/XH) / (KHSTO + (XSTO/XH)) - XSTO*KHSTO / (XH*XH * (KHSTO + (XSTO/XH)) * (KHSTO + (XSTO/XH)))); + + if (XH < 0.1) + { + d[4][idxSO] = -muH * etaHNO3 * KHO2 * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * (XSTO / 0.1) * 1 / (KHSTO + (XSTO / 0.1)) * SNO / (KHNO3 + SNO) * XH / ((KHO2 + SO) * (KHO2 + SO)); + d[4][idxSNH] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * KHNH4 * SALK / (KHALK + SALK) * (XSTO / 0.1) * 1 / (KHSTO + (XSTO / 0.1)) * SNO / (KHNO3 + SNO) * XH / ((KHNH4 + SNH) * (KHNH4 + SNH)); + d[4][idxSALK] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * KHALK * (XSTO / 0.1) * 1 / (KHSTO + (XSTO / 0.1)) * SNO / (KHNO3 + SNO) * XH / ((KHALK + SALK) * (KHALK + SALK)); + d[4][idxSNO] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * (XSTO / 0.1) / (KHSTO + (XSTO / 0.1)) * KHNO3 / ((KHNO3 + SNO) * (KHNO3 + SNO)) * XH; + d[4][idxXSTO] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * (1 / 0.1) / (KHSTO + (XSTO / 0.1)) * SNO / (KHNO3 + SNO) * XH; + d[4][idxXH] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * (XSTO / 0.1) / (KHSTO + (XSTO / 0.1)) * SNO / (KHNO3 + SNO); + } + + //reaction6: bH * SO / (SO + KHO2) * XH; + d[5][idxSO] = bH * KHO2 * XH / ((SO + KHO2) * (SO + KHO2)); + d[5][idxXH] = bH * SO / (SO + KHO2); + + //reaction7: bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XH; + d[6][idxSO] = bH * etaHend * KHO2 / ((SO + KHO2) * (SO + KHO2)) * SNO / (SNO + KHNO3) * XH; + d[6][idxSNO] = bH * etaHend * KHO2 / (SO + KHO2) * SNO / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; + d[6][idxXH] = bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XH; + + //reaction8: bH * SO / (SO + KHO2) * XSTO; + d[7][idxSO] = bH * KHO2 * XSTO / ((SO + KHO2) * (SO + KHO2)); + d[7][idxXSTO] = bH * SO / (SO + KHO2); + + //reaction9: bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XSTO; + d[8][idxSO] = bH * etaHend * KHO2 / ((SO + KHO2) * (SO + KHO2)) * SNO / (SNO + KHNO3) * XSTO; + d[8][idxSNO] = bH * etaHend * KHO2 / (SO + KHO2) * SNO / ((SNO + KHNO3) * (SNO + KHNO3)) * XSTO; + d[8][idxXSTO] = bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3); + + //reaction10: muAUT * SO / (SO + KNO2) * SNH / (SNH + KNNH4) * SALK / (SALK + KNALK) * XA; + d[9][idxSO] = muAUT * KNO2 * SNH / (SNH + KNNH4) * SALK / (SALK + KNALK) * XA / ((SO + KNO2) * (SO + KNO2)); + d[9][idxSALK] = muAUT * SO / (SO + KNO2) * SNH / (SNH + KNNH4) / ((SALK + KNALK) * (SALK + KNALK)) * XA; + d[9][idxXA] = muAUT * SO / (SO + KNO2) * SNH / (SNH + KNNH4) * SALK / (SALK + KNALK); + d[9][idxSNH] = muAUT * SO / (SO + KNO2) * SALK / (SALK + KNALK) / ((SNH + KNNH4) * (SNH + KNNH4)) * XA; + + //reaction11: bAUT * SO / (SO + KHO2) * XA; + d[10][idxSO] = bAUT * XA / ((SO + KHO2) * (SO + KHO2)); + d[10][idxXA] = bAUT * SO / (SO + KHO2); + + //reaction12: bAUT * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2) * XA; + d[11][idxSO] = bAUT * etaNend * SNO / (SNO + KHNO3) * KHO2 / ((SO + KHO2) * (SO + KHO2)) * XA; + d[11][idxSNO] = bAUT * etaNend * KHO2 / (SO + KHO2) * SNO / ((SNO + KHNO3) * (SNO + KHNO3)) * XA; + d[11][idxXA] = bAUT * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2); + + RowIterator curJac = jac; // TODO consider configurable component indices - for (int row = 0; row < _stoichiometry.rows(); ++row, ++curJac) { - for (size_t rIdx = 0; rIdx < 13; rIdx++) { + for (size_t rIdx = 0; rIdx < 13; rIdx++) { + RowIterator curJac = jac; + for (int row = 0; row < _stoichiometry.rows(); ++row, ++curJac) { + rIdx = 10; const double colFactor = static_cast(_stoichiometry.native(row, rIdx)); - for (size_t compIdx = 0; compIdx < 13; compIdx++) { - curJac[compIdx] += colFactor * d[rIdx][compIdx]; + for (size_t compIdx = 0; compIdx < _stoichiometry.rows(); compIdx++) { + curJac[compIdx - static_cast(row)] += colFactor * d[rIdx][compIdx]; } } } From 3a34839417969433295a88caa0a00c9dd7ba25d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Mon, 19 May 2025 15:55:33 +0200 Subject: [PATCH 26/47] ASM3: fix doc typos --- doc/interface/reaction/activated_sludge_model.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/interface/reaction/activated_sludge_model.rst b/doc/interface/reaction/activated_sludge_model.rst index 3a3633866..f6078fb2e 100644 --- a/doc/interface/reaction/activated_sludge_model.rst +++ b/doc/interface/reaction/activated_sludge_model.rst @@ -25,7 +25,7 @@ For information on model equations, refer to :ref:`activated_sludge_model`. ``ASM3_IO2`` - Aeration xygen input :math:`iO_2`. + Aeration oxygen input :math:`iO_2`. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\ge 0` **Length:** 1 @@ -121,7 +121,7 @@ For information on model equations, refer to :ref:`activated_sludge_model`. ``ASM3_ETAH_END`` - Reduction factor :math:`\eta_{H_end}` for :math:`b_H` under anoxic conditions. + Reduction factor :math:`\eta_{H_{end}}` for :math:`b_H` under anoxic conditions. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 @@ -177,7 +177,7 @@ For information on model equations, refer to :ref:`activated_sludge_model`. ``ASM3_ETAN_END`` - Reduction factor :math:`\eta_{N_end}` for :math:`b_{AUT}` under anoxic conditions. + Reduction factor :math:`\eta_{N_{end}}` for :math:`b_{AUT}` under anoxic conditions. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 From 1773de22c9da0c69a20e4d57af5b6ccb11c09839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Mon, 19 May 2025 16:44:39 +0200 Subject: [PATCH 27/47] ASM3: use ScalarParameter fix from #412 --- src/libcadet/model/Parameters.hpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/libcadet/model/Parameters.hpp b/src/libcadet/model/Parameters.hpp index 4e4994a5b..1d72da30f 100644 --- a/src/libcadet/model/Parameters.hpp +++ b/src/libcadet/model/Parameters.hpp @@ -171,7 +171,6 @@ class ScalarParameter * @param [in] nBoundStates Array with number of bound states for each component */ inline void reserve(unsigned int numElem, unsigned int numSlices, unsigned int nComp, unsigned int const* nBoundStates) { } - inline void reserve(unsigned int numSlices, unsigned int nComp, unsigned int nBoundStates) { } /** * @brief Reserves space in the storage of the parameter @@ -703,8 +702,6 @@ class ExternalScalarParameter */ inline void reserve(unsigned int numElem, unsigned int numSlices, unsigned int nComp, unsigned int const* nBoundStates) { } - inline void reserve(unsigned int nReactions, unsigned int nComp, unsigned int nBoundStates) { } - /** * @brief Reserves space in the storage of the parameters * @param [in] nReactions Number of reactions @@ -786,7 +783,6 @@ class ExternalScalarParameter * @return Amount of additional memory in bytes */ inline std::size_t additionalDynamicMemory(unsigned int nComp, unsigned int totalNumBoundStates, unsigned int const* nBoundStates) const CADET_NOEXCEPT { return 0; } - inline std::size_t additionalDynamicMemory(unsigned int nComp, unsigned int totalNumBoundStates, unsigned int nBoundStates) const CADET_NOEXCEPT { return 0; } /** * @brief Returns the amount of additional memory (usually dynamically allocated by containers) for storing the final parameters From 69a968f9cb6c33e345ef53200a86ee43bea9c53e Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Tue, 20 May 2025 14:28:23 +0200 Subject: [PATCH 28/47] add jacobian test and fix jacobian --- .../reaction/ActivatedSludgeModelThree.cpp | 518 +++++++++++------- test/ReactionModelTests.cpp | 37 +- test/ReactionModels.cpp | 53 +- 3 files changed, 379 insertions(+), 229 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index 54e5fb152..0a66847fe 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -185,54 +185,54 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.setAll(0); // parameter set ASM3h - double iNSI = paramProvider.getDouble("ASM3_INSI"); - double iNSS = paramProvider.getDouble("ASM3_INSS"); - double iNXI = paramProvider.getDouble("ASM3_INXI"); - double iNXS = paramProvider.getDouble("ASM3_INXS"); - double iNBM = paramProvider.getDouble("ASM3_INBM"); + const double iNSI = paramProvider.getDouble("ASM3_INSI"); + const double iNSS = paramProvider.getDouble("ASM3_INSS"); + const double iNXI = paramProvider.getDouble("ASM3_INXI"); + const double iNXS = paramProvider.getDouble("ASM3_INXS"); + const double iNBM = paramProvider.getDouble("ASM3_INBM"); - double fSI = paramProvider.getDouble("ASM3_FSI"); - double fXI = paramProvider.getDouble("ASM3_FXI"); + const double fSI = paramProvider.getDouble("ASM3_FSI"); + const double fXI = paramProvider.getDouble("ASM3_FXI"); - double YH_aer = paramProvider.getDouble("ASM3_YH_AER"); - double YH_anox = paramProvider.getDouble("ASM3_YH_ANOX"); - double YSTO_aer = paramProvider.getDouble("ASM3_YSTO_AER"); - double YSTO_anox = paramProvider.getDouble("ASM3_YSTO_ANOX"); - double YA = paramProvider.getDouble("ASM3_YA"); + const double YH_aer = paramProvider.getDouble("ASM3_YH_AER"); + const double YH_anox = paramProvider.getDouble("ASM3_YH_ANOX"); + const double YSTO_aer = paramProvider.getDouble("ASM3_YSTO_AER"); + const double YSTO_anox = paramProvider.getDouble("ASM3_YSTO_ANOX"); + const double YA = paramProvider.getDouble("ASM3_YA"); - double fiSS_BM_prod = paramProvider.getDouble("ASM3_FISS_BM_PROD"); - double iVSS_BM = paramProvider.getDouble("ASM3_IVSS_BM"); - double iTSS_VSS_BM = paramProvider.getDouble("ASM3_ITSS_VSS_BM"); + const double fiSS_BM_prod = paramProvider.getDouble("ASM3_FISS_BM_PROD"); + const double iVSS_BM = paramProvider.getDouble("ASM3_IVSS_BM"); + const double iTSS_VSS_BM = paramProvider.getDouble("ASM3_ITSS_VSS_BM"); // internal variables - double fXMI_BM = fiSS_BM_prod * fXI * iVSS_BM * (iTSS_VSS_BM - 1); - double c1n = iNXS - iNSI * fSI - (1 - fSI) * iNSS; - double c2n = iNSS; - double c3n = iNSS; - double c4n = -iNBM; - double c5n = c4n; - double c6n = -fXI * iNXI + iNBM; - double c7n = c6n; - double c10n = -1 / YA - iNBM; - double c11n = -fXI * iNXI + iNBM; - double c12n = c11n; - double c3no = (YSTO_anox - 1.0) / (40.0 / 14.0); - double c5no = (1.0 - 1 / YH_anox) / (40.0 / 14.0); - double c7no = (fXI - 1) / (40.0 / 14.0); - double c9no = -14.0 / 40.0; - double c10no = 1 / YA; - double c12no = c7no; - double c1a = c1n / 14.0; - double c2a = c2n / 14.0; - double c3a = (c3n - c3no) / 14.0; - double c4a = c4n / 14.0; - double c5a = (c5n - c5no) / 14.0; - double c6a = c6n / 14.0; - double c7a = (c7n - c7no) / 14.0; - double c9a = 1 / 40.0; - double c10a = (c10n - c10no) / 14.0; - double c11a = c11n / 14.0; - double c12a = (c12n - c12no) / 14.0; + const double fXMI_BM = fiSS_BM_prod * fXI * iVSS_BM * (iTSS_VSS_BM - 1); + const double c1n = iNXS - iNSI * fSI - (1 - fSI) * iNSS; + const double c2n = iNSS; + const double c3n = iNSS; + const double c4n = -iNBM; + const double c5n = c4n; + const double c6n = -fXI * iNXI + iNBM; + const double c7n = c6n; + const double c10n = -1 / YA - iNBM; + const double c11n = -fXI * iNXI + iNBM; + const double c12n = c11n; + const double c3no = (YSTO_anox - 1.0) / (40.0 / 14.0); + const double c5no = (1.0 - 1 / YH_anox) / (40.0 / 14.0); + const double c7no = (fXI - 1) / (40.0 / 14.0); + const double c9no = -14.0 / 40.0; + const double c10no = 1 / YA; + const double c12no = c7no; + const double c1a = c1n / 14.0; + const double c2a = c2n / 14.0; + const double c3a = (c3n - c3no) / 14.0; + const double c4a = c4n / 14.0; + const double c5a = (c5n - c5no) / 14.0; + const double c6a = c6n / 14.0; + const double c7a = (c7n - c7no) / 14.0; + const double c9a = 1 / 40.0; + const double c10a = (c10n - c10no) / 14.0; + const double c11a = c11n / 14.0; + const double c12a = (c12n - c12no) / 14.0; // SO _stoichiometry.native(0, 1) = YSTO_aer - 1; @@ -344,38 +344,38 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase typedef typename DoubleActivePromoter::type flux_t; BufferedArray fluxes = workSpace.array(_stoichiometry.columns()); - flux_t Kh20 = static_cast::type>(p->Kh20); - flux_t T = static_cast::type>(p->T); - flux_t iO2 = static_cast::type>(p->iO2); - flux_t V = static_cast::type>(p->V); - flux_t k_sto20 = static_cast::type>(p->k_sto20); - flux_t KX = static_cast::type>(p->KX); - flux_t KHO2 = static_cast::type>(p->KHO2); - flux_t KHSS = static_cast::type>(p->KHSS); - flux_t KHNO3 = static_cast::type>(p->KHNO3); - flux_t etaHNO3 = static_cast::type>(p->etaHNO3); - flux_t KHNH4 = static_cast::type>(p->KHNH4); - flux_t KHALK = static_cast::type>(p->KHALK); - flux_t KHSTO = static_cast::type>(p->KHSTO); - flux_t muH20 = static_cast::type>(p->muH20); - flux_t etaHend = static_cast::type>(p->etaHend); - flux_t bH20 = static_cast::type>(p->bH20); - flux_t muAUT20 = static_cast::type>(p->muAUT20); - flux_t KNO2 = static_cast::type>(p->KNO2); - flux_t KNNH4 = static_cast::type>(p->KNNH4); - flux_t KNALK = static_cast::type>(p->KNALK); - flux_t bAUT20 = static_cast::type>(p->bAUT20); - flux_t etaNend = static_cast::type>(p->etaNend); + const flux_t Kh20 = static_cast::type>(p->Kh20); + const flux_t T = static_cast::type>(p->T); + const flux_t iO2 = static_cast::type>(p->iO2); + const flux_t V = static_cast::type>(p->V); + const flux_t k_sto20 = static_cast::type>(p->k_sto20); + const flux_t KX = static_cast::type>(p->KX); + const flux_t KHO2 = static_cast::type>(p->KHO2); + const flux_t KHSS = static_cast::type>(p->KHSS); + const flux_t KHNO3 = static_cast::type>(p->KHNO3); + const flux_t etaHNO3 = static_cast::type>(p->etaHNO3); + const flux_t KHNH4 = static_cast::type>(p->KHNH4); + const flux_t KHALK = static_cast::type>(p->KHALK); + const flux_t KHSTO = static_cast::type>(p->KHSTO); + const flux_t muH20 = static_cast::type>(p->muH20); + const flux_t etaHend = static_cast::type>(p->etaHend); + const flux_t bH20 = static_cast::type>(p->bH20); + const flux_t muAUT20 = static_cast::type>(p->muAUT20); + const flux_t KNO2 = static_cast::type>(p->KNO2); + const flux_t KNNH4 = static_cast::type>(p->KNNH4); + const flux_t KNALK = static_cast::type>(p->KNALK); + const flux_t bAUT20 = static_cast::type>(p->bAUT20); + const flux_t etaNend = static_cast::type>(p->etaNend); // derived parameters - double ft04 = exp(-0.04 * (20.0 - static_cast(T))); - double ft07 = exp(-0.06952 * (20.0 - static_cast(T))); - double ft105 = exp(-0.105 * (20.0 - static_cast(T))); - double k_sto = static_cast(k_sto20) * ft07; - double muH = static_cast(muH20) * ft07; - double bH = static_cast(bH20) * ft07; - double muAUT = static_cast(muAUT20) * ft105; - double bAUT = static_cast(bAUT20) * ft105; + const double ft04 = exp(-0.04 * (20.0 - static_cast(T))); + const double ft07 = exp(-0.06952 * (20.0 - static_cast(T))); + const double ft105 = exp(-0.105 * (20.0 - static_cast(T))); + const double k_sto = static_cast(k_sto20) * ft07; + const double muH = static_cast(muH20) * ft07; + const double bH = static_cast(bH20) * ft07; + const double muAUT = static_cast(muAUT20) * ft105; + const double bAUT = static_cast(bAUT20) * ft105; StateType SO = y[0]; StateType SS = y[1]; @@ -399,7 +399,7 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase // p2: Aerobic storage of SS - fluxes[1] = k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * XH; + fluxes[1] = k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * XH; // p3: Anoxic storage of SS fluxes[2] = k_sto * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; @@ -464,39 +464,39 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase { typename ParamHandler_t::ParamsHandle const p = _paramHandler.update(t, secIdx, colPos, _nComp, _nBoundStates, workSpace); + const double Kh20 = static_cast(p->Kh20); + const double T = static_cast(p->T); + const double iO2 = static_cast(p->iO2); + const double V = static_cast(p->V); + const double k_sto20 = static_cast(p->k_sto20); + const double KX = static_cast(p->KX); + const double KHO2 = static_cast(p->KHO2); + const double KHSS = static_cast(p->KHSS); + const double KHNO3 = static_cast(p->KHNO3); + const double etaHNO3 = static_cast(p->etaHNO3); + const double KHNH4 = static_cast(p->KHNH4); + const double KHALK = static_cast(p->KHALK); + const double KHSTO = static_cast(p->KHSTO); + const double muH20 = static_cast(p->muH20); + const double etaHend = static_cast(p->etaHend); + const double bH20 = static_cast(p->bH20); + const double muAUT20 = static_cast(p->muAUT20); + const double KNO2 = static_cast(p->KNO2); + const double KNNH4 = static_cast(p->KNNH4); + const double KNALK = static_cast(p->KNALK); + const double bAUT20 = static_cast(p->bAUT20); + const double etaNend = static_cast(p->etaNend); - const double Kh20 = static_cast(p->Kh20); - const double T = static_cast(p->T); - const double iO2 = static_cast(p->iO2); - const double V = static_cast(p->V); - const double k_sto20 = static_cast(p->k_sto20); - const double KX = static_cast(p->KX); - const double KHO2 = static_cast(p->KHO2); - const double KHSS = static_cast(p->KHSS); - const double KHNO3 = static_cast(p->KHNO3); - const double etaHNO3 = static_cast(p->etaHNO3); - const double KHNH4 = static_cast(p->KHNH4); - const double KHALK = static_cast(p->KHALK); - const double KHSTO = static_cast(p->KHSTO); - const double muH20 = static_cast(p->muH20); - const double etaHend = static_cast(p->etaHend); - const double bH20 = static_cast(p->bH20); - const double muAUT20 = static_cast(p->muAUT20); - const double KNO2 = static_cast(p->KNO2); - const double KNNH4 = static_cast(p->KNNH4); - const double KNALK = static_cast(p->KNALK); - const double bAUT20 = static_cast(p->bAUT20); - const double etaNend = static_cast(p->etaNend); - // derived parameters - const double ft04 = exp(-0.04 * (20.0 - static_cast(p->T))); - const double ft07 = exp(-0.06952 * (20.0 - static_cast(p->T))); - const double ft105 = exp(-0.105 * (20.0 - static_cast(p->T))); - const double k_sto = static_cast(p->k_sto20) * ft07; - const double muH = static_cast(p->muH20) * ft07; - const double bH = static_cast(p->bH20) * ft07; - const double muAUT = static_cast(p->muAUT20) * ft105; - const double bAUT = static_cast(p->bAUT20) * ft105; + // derived parameters + const double ft04 = exp(-0.04 * (20.0 - static_cast(T))); + const double ft07 = exp(-0.06952 * (20.0 - static_cast(T))); + const double ft105 = exp(-0.105 * (20.0 - static_cast(T))); + const double k_sto = static_cast(k_sto20) * ft07; + const double muH = static_cast(muH20) * ft07; + const double bH = static_cast(bH20) * ft07; + const double muAUT = static_cast(muAUT20) * ft105; + const double bAUT = static_cast(bAUT20) * ft105; double SO = y[0]; double SS = y[1]; @@ -514,120 +514,268 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase //XH_S = max(XH, 0.1) const size_t idxSO = 0; - const size_t idxSS = 1; - const size_t idxSNH = 2; - const size_t idxSNO = 3; - const size_t idxSN2 = 4; - const size_t idxSALK = 5; - const size_t idxSI = 6; - const size_t idxXI = 7; - const size_t idxXS = 8; - const size_t idxXH = 9; - const size_t idxXSTO = 10; - const size_t idxXA = 11; - const size_t idxXMI = 12; - - const double d[13][13] = {}; + const size_t idxSS = 1; + const size_t idxSNH = 2; + const size_t idxSNO = 3; + const size_t idxSN2 = 4; + const size_t idxSALK = 5; + const size_t idxSI = 6; + const size_t idxXI = 7; + const size_t idxXS = 8; + const size_t idxXH = 9; + const size_t idxXSTO = 10; + const size_t idxXA = 11; + const size_t idxXMI = 12; + + double d[13][13] = {}; - // p1: Hydrolysis: Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX) * XH; - // Jacobian: - d[0][idxXS] = Kh20 * ft04 * XH / ((XS + XH * KX) * (XS + XH * KX)) * XH; - d[0][idxXH] = Kh20 * ft04 * (XS/XH) / ((XS/XH) + KX); - if (XH < 0.1) + // p1: Hydrolysis: Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX) * XH; +// Jacobian: + d[0][idxXS] = Kh20 * ft04 + * XH / ((XS + XH * KX) + * (XS + XH * KX)) * XH; + d[0][idxXH] = Kh20 * ft04 + * (XS * XS) / ((XS + KX * XH) + * (XS + KX * XH)); + if (XH < 0.1) { - d[0][idxXH] = Kh20 * ft04 * (XS / 0.1) / ((XS / 0.1) + KX); - d[0][idxXS] = Kh20 * ft04 * 0.1 / ((XS + 0.1 * KX) * (XS + 0.1 * KX)) * XH; + d[0][idxXS] = Kh20 * ft04 + * 0.1 / ((XS + 0.1 * KX) * (XS + 0.1 * KX)) * XH; + d[0][idxXH] = 0.0; } + // p2: Aerobic storage of SS: k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * XH; + d[1][idxSO] = k_sto + * SS / (SS + KHSS) + * KHO2 / ((SO + KHO2) * (SO + KHO2)) * XH; + d[1][idxSS] = k_sto + * SO / (SO + KHO2) + * KHSS / ((SS + KHSS) * (SS + KHSS)) * XH; + d[1][idxXH] = k_sto + * SO / (SO + KHO2) + * SS / (SS + KHSS); + + // p3: Anoxic storage of SS: k_sto * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; + d[2][idxSO] = k_sto * etaHNO3 + * -KHO2 / ((SO + KHO2) * (SO + KHO2)) + * SS / (SS + KHSS) + * SNO / (SNO + KHNO3) * XH; + d[2][idxSS] = k_sto * etaHNO3 + * KHO2 / (SO + KHO2) + * KHSS / ((SS + KHSS) * (SS + KHSS)) + * SNO / (SNO + KHNO3) * XH; + d[2][idxSNO] = k_sto * etaHNO3 + * KHO2 / (SO + KHO2) + * SS / (SS + KHSS) + * KHNO3 / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; + d[2][idxXH] = k_sto * etaHNO3 + * KHO2 / (SO + KHO2) + * SS / (SS + KHSS) + * SNO / (SNO + KHNO3); + + // p4: Aerobic growth: muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * (XSTO/XH_S) / ((XSTO/XH_S) + KHSTO) * XH; + d[3][idxSO] = muH + * KHO2 / ((SO + KHO2) * (SO + KHO2)) + * SNH / (SNH + KHNH4) + * SALK / (SALK + KHALK) + * (XSTO / XH) / ((XSTO / XH) + KHSTO) * XH; + d[3][idxSNH] = muH + * SO / (SO + KHO2) + * KHNH4 / ((SNH + KHNH4) * (SNH + KHNH4)) + * SALK / (SALK + KHALK) + * (XSTO / XH) / ((XSTO / XH) + KHSTO) * XH; + d[3][idxSALK] = muH + * SO / (SO + KHO2) + * SNH / (SNH + KHNH4) + * KHALK / ((SALK + KHALK) * (SALK + KHALK)) + * (XSTO / XH) / ((XSTO / XH) + KHSTO) * XH; + d[3][idxXSTO] = muH + * SO / (SO + KHO2) + * SNH / (SNH + KHNH4) + * SALK / (SALK + KHALK) + * (KHSTO * XH) / ((XSTO + KHSTO * XH) * (XSTO + KHSTO * XH)) * XH; + d[3][idxXH] = muH + * SO / (SO + KHO2) + * SNH / (SNH + KHNH4) + * SALK / (SALK + KHALK) + * (XSTO * XSTO) / ((XSTO + KHSTO * XH) * (XSTO + KHSTO * XH)); - // p2: Aerobic storage of SS: k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * XH; - d[1][idxSO] = k_sto * KHO2 * SS / (SS + KHSS) * SNO / (SNO + KHNO3) / ((SO + KHO2) * (SO + KHO2)) * XH; - d[1][idxSS] = k_sto * SO / (SO + KHO2) * KHSS * SNO / (SNO + KHNO3) / ((SS + KHSS) * (SS + KHSS)) * XH; - d[1][idxXH] = k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); - - // p3: Anoxic storage of SS: k_sto * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; - d[2][idxSO] = -k_sto * etaHNO3 * KHO2 * SS / (SS + KHSS) * SNO / (SNO + KHNO3) / ((SO + KHO2) * (SO + KHO2)) * XH; - d[2][idxSS] = k_sto * etaHNO3 * KHO2 / (SO + KHO2) * KHSS * SNO / (SNO + KHNO3) / ((SS + KHSS) * (SS + KHSS)) * XH; - d[2][idxSNO] = k_sto * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * KHNO3 / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; - d[2][idxXH] = k_sto * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3); - - // p4: Aerobic growth: muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * (XSTO/XH_S) / ((XSTO/XH_S) + KHSTO) * XH; - d[3][idxSO] = muH * KHO2 * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * (XSTO/XH) / (((XSTO/XH)) + KHSTO) / ((SO + KHO2) * (SO + KHO2)) * XH; - d[3][idxSNH] = muH * SO / (SO + KHO2) * KHNH4 * SALK / (SALK + KHALK) * (XSTO/XH) / ((XSTO/XH) + KHSTO) / ((SNH + KHNH4) * (SNH + KHNH4)) * XH; - d[3][idxSALK] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * KHALK * (XSTO/XH) / ((XSTO/XH) + KHSTO) / ((SALK + KHALK) * (SALK + KHALK)) * XH; - d[3][idxXSTO] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * (KHSTO / XH) / (((XSTO/XH) + KHSTO) * ((XSTO/XH) + KHSTO)) * XH; - d[3][idxXH] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * ((XSTO/XH) / ((XSTO/XH) + KHSTO) - XSTO*KHSTO / (XH*XH * ((XSTO/XH) + KHSTO) * ((XSTO/XH) + KHSTO))); - if (XH < 0.1) { - d[3][idxSO] = muH * KHO2 * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * (XSTO / 0.1) / ((XSTO / 0.1) + KHSTO) / ((SO + KHO2) * (SO + KHO2)) * XH; - d[3][idxSNH] = muH * SO / (SO + KHO2) * KHNH4 * SALK / (SALK + KHALK) * (XSTO / 0.1) / ((XSTO / 0.1) + KHSTO) / ((SNH + KHNH4) * (SNH + KHNH4)) * XH; - d[3][idxSALK] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * KHALK * (XSTO / 0.1) / ((XSTO / 0.1) + KHSTO) / ((SALK + KHALK) * (SALK + KHALK)) * XH; - d[3][idxXSTO] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * (KHSTO / 0.1) / ((XSTO / 0.1) + KHSTO) * (XSTO / 0.1 + KHSTO)) * XH; - d[3][idxXH] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * (XSTO / 0.1) / ((XSTO / 0.1) + KHSTO); + d[3][idxSO] = muH + * -KHO2 / ((SO + KHO2) * (SO + KHO2)) + * SNH / (SNH + KHNH4) + * SALK / (SALK + KHALK) + * (XSTO / 0.1) / ((XSTO / 0.1) + KHSTO) * 0.1; + d[3][idxSNH] = muH + * SO / (SO + KHO2) + * KHNH4 / ((SNH + KHNH4) * (SNH + KHNH4)) + * SALK / (SALK + KHALK) + * (XSTO / 0.1) / ((XSTO / 0.1) + KHSTO) * 0.1; + d[3][idxSALK] = muH + * SO / (SO + KHO2) + * SNH / (SNH + KHNH4) + * KHALK / ((SALK + KHALK) * (SALK + KHALK)) + * (XSTO / 0.1) / ((XSTO / 0.1) + KHSTO) * 0.1; + d[3][idxXSTO] = muH + * SO / (SO + KHO2) + * SNH / (SNH + KHNH4) + * SALK / (SALK + KHALK) + * (KHSTO * 0.1) / ((XSTO + KHSTO * 0.1) * (XSTO + KHSTO * 0.1)) * 0.1; + d[3][idxXH] = 0.0; } - // p5: Anoxic growth: muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * XSTO / XH_S * 1 / (KHSTO + (XSTO/XH)_S) * SNO / (KHNO3 + SNO) * XH; - d[4][idxSO] = -muH * etaHNO3 * KHO2 * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * (XSTO / XH) * 1 / (KHSTO + (XSTO/XH)) * SNO / (KHNO3 + SNO) * XH / ((KHO2 + SO) * (KHO2 + SO)); - d[4][idxSNH] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * KHNH4 * SALK / (KHALK + SALK) * (XSTO / XH) * 1 / (KHSTO + (XSTO/XH)) * SNO / (KHNO3 + SNO) * XH / ((KHNH4 + SNH) * (KHNH4 + SNH)); - d[4][idxSALK] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * KHALK * (XSTO / XH) * 1 / (KHSTO + (XSTO/XH)) * SNO / (KHNO3 + SNO) * XH / ((KHALK + SALK) * (KHALK + SALK)); - d[4][idxSNO] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * (XSTO / XH) / (KHSTO + (XSTO/XH)) * KHNO3 / ((KHNO3 + SNO) * (KHNO3 + SNO)) * XH; - d[4][idxXSTO] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * 1 / XH / (KHSTO + (XSTO/XH)) * SNO / (KHNO3 + SNO) * XH; - d[4][idxXH] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * SNO / (KHNO3 + SNO) * ((XSTO/XH) / (KHSTO + (XSTO/XH)) - XSTO*KHSTO / (XH*XH * (KHSTO + (XSTO/XH)) * (KHSTO + (XSTO/XH)))); - + // p5: Anoxic growth: muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * SNO / (KHNO3 + SNO)* (XSTO / XH_S) / (KHSTO + (XSTO/XH)_S) * XH; + d[4][idxSO] = muH * etaHNO3 + * -KHO2 / ((KHO2 + SO) * (KHO2 + SO)) + * SNH / (KHNH4 + SNH) + * SALK / (KHALK + SALK) + * (XSTO / XH) / (KHSTO + (XSTO / XH)) + * SNO / (KHNO3 + SNO) * XH; + d[4][idxSNH] = muH * etaHNO3 + * KHO2 / (KHO2 + SO) + * KHNH4 / ((KHNH4 + SNH) * (KHNH4 + SNH)) + * SALK / (KHALK + SALK) + * (XSTO / XH) / (KHSTO + (XSTO / XH)) + * SNO / (KHNO3 + SNO) * XH; + d[4][idxSALK] = muH * etaHNO3 + * KHO2 / (KHO2 + SO) + * SNH / (KHNH4 + SNH) + * KHALK / ((KHALK + SALK) * (KHALK + SALK)) + * (XSTO / XH) / (KHSTO + (XSTO / XH)) + * SNO / (KHNO3 + SNO) * XH; + d[4][idxSNO] = muH * etaHNO3 + * KHO2 / (KHO2 + SO) + * SNH / (KHNH4 + SNH) + * SALK / (KHALK + SALK) + * (XSTO / XH) / (KHSTO + (XSTO / XH)) + * KHNO3 / ((KHNO3 + SNO) * (KHNO3 + SNO)) * XH; + d[4][idxXSTO] = muH * etaHNO3 + * KHO2 / (KHO2 + SO) + * SNH / (KHNH4 + SNH) + * SALK / (KHALK + SALK) + * (1.0 / XH) + * SNO / (KHNO3 + SNO) + * (KHSTO * XH * XH) / ((XSTO + KHSTO * XH) * (XSTO + KHSTO * XH)) * XH; + d[4][idxXH] = muH * etaHNO3 + * KHO2 / (KHO2 + SO) + * SNH / (KHNH4 + SNH) + * SALK / (KHALK + SALK) + * SNO / (KHNO3 + SNO) + * (XSTO * XSTO) / ((XSTO + KHSTO * XH) * (XSTO + KHSTO * XH)); + + if (XH < 0.1) { - d[4][idxSO] = -muH * etaHNO3 * KHO2 * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * (XSTO / 0.1) * 1 / (KHSTO + (XSTO / 0.1)) * SNO / (KHNO3 + SNO) * XH / ((KHO2 + SO) * (KHO2 + SO)); - d[4][idxSNH] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * KHNH4 * SALK / (KHALK + SALK) * (XSTO / 0.1) * 1 / (KHSTO + (XSTO / 0.1)) * SNO / (KHNO3 + SNO) * XH / ((KHNH4 + SNH) * (KHNH4 + SNH)); - d[4][idxSALK] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * KHALK * (XSTO / 0.1) * 1 / (KHSTO + (XSTO / 0.1)) * SNO / (KHNO3 + SNO) * XH / ((KHALK + SALK) * (KHALK + SALK)); - d[4][idxSNO] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * (XSTO / 0.1) / (KHSTO + (XSTO / 0.1)) * KHNO3 / ((KHNO3 + SNO) * (KHNO3 + SNO)) * XH; - d[4][idxXSTO] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * (1 / 0.1) / (KHSTO + (XSTO / 0.1)) * SNO / (KHNO3 + SNO) * XH; - d[4][idxXH] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * (XSTO / 0.1) / (KHSTO + (XSTO / 0.1)) * SNO / (KHNO3 + SNO); + d[4][idxSO] = muH * etaHNO3 + * -KHO2 / ((KHO2 + SO) * (KHO2 + SO)) + * SNH / (KHNH4 + SNH) + * SALK / (KHALK + SALK) + * (XSTO / 0.1) / (KHSTO + (XSTO / 0.1)) + * SNO / (KHNO3 + SNO) * 0.1; + d[4][idxSNH] = muH * etaHNO3 + * KHO2 / (KHO2 + SO) + * KHNH4 / ((KHNH4 + SNH) * (KHNH4 + SNH)) + * SALK / (KHALK + SALK) + * (XSTO / 0.1) / (KHSTO + (XSTO / 0.1)) + * SNO / (KHNO3 + SNO) * 0.1; + d[4][idxSALK] = muH * etaHNO3 + * KHO2 / (KHO2 + SO) + * SNH / (KHNH4 + SNH) + * KHALK / ((KHALK + SALK) * (KHALK + SALK)) + * (XSTO / 0.1) / (KHSTO + (XSTO / 0.1)) + * SNO / (KHNO3 + SNO) * 0.1; + d[4][idxSNO] = muH * etaHNO3 + * KHO2 / (KHO2 + SO) + * SNH / (KHNH4 + SNH) + * SALK / (KHALK + SALK) + * (XSTO / 0.1) / (KHSTO + (XSTO / 0.1)) + * KHNO3 / ((KHNO3 + SNO) * (KHNO3 + SNO)) * 0.1; + d[4][idxXSTO] = muH * etaHNO3 + * KHO2 / (KHO2 + SO) + * SNH / (KHNH4 + SNH) + * SALK / (KHALK + SALK) + * (1.0 / 0.1) + * SNO / (KHNO3 + SNO) + * (KHSTO * 0.1 * 0.1) / ((XSTO + KHSTO * 0.1) * (XSTO + KHSTO * 0.1)) * 0.1; + d[4][idxXH] = 0.0; } - //reaction6: bH * SO / (SO + KHO2) * XH; - d[5][idxSO] = bH * KHO2 * XH / ((SO + KHO2) * (SO + KHO2)); + d[5][idxSO] = bH + * KHO2 / ((SO + KHO2) * (SO + KHO2)) * XH; d[5][idxXH] = bH * SO / (SO + KHO2); //reaction7: bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XH; - d[6][idxSO] = bH * etaHend * KHO2 / ((SO + KHO2) * (SO + KHO2)) * SNO / (SNO + KHNO3) * XH; - d[6][idxSNO] = bH * etaHend * KHO2 / (SO + KHO2) * SNO / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; - d[6][idxXH] = bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XH; + d[6][idxSO] = bH * etaHend + * -KHO2 / ((SO + KHO2) * (SO + KHO2)) + * SNO / (SNO + KHNO3) * XH; + d[6][idxSNO] = bH * etaHend + * KHO2 / (SO + KHO2) + * KHNO3 / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; + d[6][idxXH] = bH * etaHend + * KHO2 / (SO + KHO2) + * SNO / (SNO + KHNO3); //reaction8: bH * SO / (SO + KHO2) * XSTO; - d[7][idxSO] = bH * KHO2 * XSTO / ((SO + KHO2) * (SO + KHO2)); - d[7][idxXSTO] = bH * SO / (SO + KHO2); + d[7][idxSO] = bH + * KHO2 / ((SO + KHO2) * (SO + KHO2)) * XSTO; + d[7][idxXSTO] = bH * SO / (SO + KHO2); //reaction9: bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XSTO; - d[8][idxSO] = bH * etaHend * KHO2 / ((SO + KHO2) * (SO + KHO2)) * SNO / (SNO + KHNO3) * XSTO; - d[8][idxSNO] = bH * etaHend * KHO2 / (SO + KHO2) * SNO / ((SNO + KHNO3) * (SNO + KHNO3)) * XSTO; - d[8][idxXSTO] = bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3); + d[8][idxSO] = bH * etaHend + * -KHO2 / ((SO + KHO2) * (SO + KHO2)) + * SNO / (SNO + KHNO3) * XSTO; + d[8][idxSNO] = bH * etaHend + * KHO2 / (SO + KHO2) + * KHNO3 / ((SNO + KHNO3) * (SNO + KHNO3)) * XSTO; + d[8][idxXSTO] = bH * etaHend + * KHO2 / (SO + KHO2) + * SNO / (SNO + KHNO3); //reaction10: muAUT * SO / (SO + KNO2) * SNH / (SNH + KNNH4) * SALK / (SALK + KNALK) * XA; - d[9][idxSO] = muAUT * KNO2 * SNH / (SNH + KNNH4) * SALK / (SALK + KNALK) * XA / ((SO + KNO2) * (SO + KNO2)); - d[9][idxSALK] = muAUT * SO / (SO + KNO2) * SNH / (SNH + KNNH4) / ((SALK + KNALK) * (SALK + KNALK)) * XA; - d[9][idxXA] = muAUT * SO / (SO + KNO2) * SNH / (SNH + KNNH4) * SALK / (SALK + KNALK); - d[9][idxSNH] = muAUT * SO / (SO + KNO2) * SALK / (SALK + KNALK) / ((SNH + KNNH4) * (SNH + KNNH4)) * XA; - + d[9][idxSO] = muAUT + * KNO2 / ((SO + KNO2) * (SO + KNO2)) + * SNH / (SNH + KNNH4) + * SALK / (SALK + KNALK) * XA; + d[9][idxSALK] = muAUT + * SO / (SO + KNO2) + * SNH / (SNH + KNNH4) + * KNALK / ((SALK + KNALK) * (SALK + KNALK)) * XA; + d[9][idxSNH] = muAUT + * SO / (SO + KNO2) + * SALK / (SALK + KNALK) + * KNNH4 / ((SNH + KNNH4) * (SNH + KNNH4)) * XA; + d[9][idxXA] = muAUT + * SO / (SO + KNO2) + * SNH / (SNH + KNNH4) + * SALK / (SALK + KNALK); + //reaction11: bAUT * SO / (SO + KHO2) * XA; - d[10][idxSO] = bAUT * XA / ((SO + KHO2) * (SO + KHO2)); - d[10][idxXA] = bAUT * SO / (SO + KHO2); + d[10][idxSO] = bAUT + * KHO2 / ((SO + KHO2) * (SO + KHO2)) * XA; + d[10][idxXA] = bAUT + * SO / (SO + KHO2); //reaction12: bAUT * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2) * XA; - d[11][idxSO] = bAUT * etaNend * SNO / (SNO + KHNO3) * KHO2 / ((SO + KHO2) * (SO + KHO2)) * XA; - d[11][idxSNO] = bAUT * etaNend * KHO2 / (SO + KHO2) * SNO / ((SNO + KHNO3) * (SNO + KHNO3)) * XA; - d[11][idxXA] = bAUT * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2); + d[11][idxSO] = bAUT * etaNend + * SNO / (SNO + KHNO3) + * -KHO2 / ((SO + KHO2) * (SO + KHO2)) * XA; + d[11][idxSNO] = bAUT * etaNend + * KHO2 / (SO + KHO2) + * KHNO3 / ((SNO + KHNO3) * (SNO + KHNO3)) * XA; + d[11][idxXA] = bAUT * etaNend + * SNO / (SNO + KHNO3) + * KHO2 / (SO + KHO2); RowIterator curJac = jac; - // TODO consider configurable component indices for (size_t rIdx = 0; rIdx < 13; rIdx++) { RowIterator curJac = jac; for (int row = 0; row < _stoichiometry.rows(); ++row, ++curJac) { - rIdx = 10; const double colFactor = static_cast(_stoichiometry.native(row, rIdx)); for (size_t compIdx = 0; compIdx < _stoichiometry.rows(); compIdx++) { + curJac[compIdx - static_cast(row)] += colFactor * d[rIdx][compIdx]; } } diff --git a/test/ReactionModelTests.cpp b/test/ReactionModelTests.cpp index bb3ae78f5..191f92799 100644 --- a/test/ReactionModelTests.cpp +++ b/test/ReactionModelTests.cpp @@ -392,7 +392,6 @@ namespace reaction ad::prepareAdVectorSeedsForDenseMatrix(adY, 0, numDofs); ad::copyToAd(yState.data(), adY, numDofs); ad::resetAd(adRes, numDofs); - crm.model().residualCombinedAdd(1.0, 0u, ColumnPosition{0.0, 0.0, 0.0}, adY, adY + crm.nComp(), adRes, adRes + crm.nComp(), 1.0, crm.buffer()); // Extract Jacobian cadet::linalg::DenseMatrix jacAD; @@ -402,42 +401,8 @@ namespace reaction // Calculate analytic Jacobian cadet::linalg::DenseMatrix jacAna; jacAna.resize(numDofs, numDofs); - crm.model().analyticJacobianCombinedAdd(1.0, 0u, ColumnPosition{0.0, 0.0, 0.0}, yState.data(), yState.data() + crm.nComp(), 1.0, jacAna.row(0), jacAna.row(crm.nComp()), crm.buffer()); - cadet::test::checkJacobianPatternFD( - [&](double const* lDir, double* res) -> void - { - std::fill_n(res, numDofs, 0.0); - crm.model().residualCombinedAdd(1.0, 0u, ColumnPosition{0.0, 0.0, 0.0}, lDir, lDir + crm.nComp(), res, res + crm.nComp(), 1.0, crm.buffer()); - }, - [&](double const* lDir, double* res) -> void - { - jacAna.multiplyVector(lDir, res); - }, - yState.data(), dir.data(), colA.data(), colB.data(), numDofs, numDofs); - - cadet::test::checkJacobianPatternFD( - [&](double const* lDir, double* res) -> void - { - std::fill_n(res, numDofs, 0.0); - crm.model().residualCombinedAdd(1.0, 0u, ColumnPosition{0.0, 0.0, 0.0}, lDir, lDir + crm.nComp(), res, res + crm.nComp(), 1.0, crm.buffer()); - }, - [&](double const* lDir, double* res) -> void - { - jacAD.multiplyVector(lDir, res); - }, - yState.data(), dir.data(), colA.data(), colB.data(), numDofs, numDofs); - - // Check Jacobians against each other - for (unsigned int row = 0; row < numDofs; ++row) - { - for (unsigned int col = 0; col < numDofs; ++col) - { - CAPTURE(row); - CAPTURE(col); - CHECK(jacAna.native(row, col) == makeApprox(jacAD.native(row, col), absTol, relTol)); - } - } + // Only liquid phase diff --git a/test/ReactionModels.cpp b/test/ReactionModels.cpp index 1b26e5d0a..49c76ebba 100644 --- a/test/ReactionModels.cpp +++ b/test/ReactionModels.cpp @@ -131,7 +131,7 @@ TEST_CASE("MichaelisMenten kinetic analytic Jacobian vs AD without inhibition", TEST_CASE("MichaelisMenten kinetic analytic Jacobian vs AD with inhibition", "[MichaelisMenten],[ReactionModel],[Jacobian],[AD]") { - const unsigned int nBound[] = {1, 2, 1}; + const unsigned int nBound[] = {1.0, 2.0, 1.0}; const double point[] = {1.0, 2.0, 1.4, 2.1, 0.2, 1.1, 1.8}; cadet::test::reaction::testDynamicJacobianAD("MICHAELIS_MENTEN", 3, nBound, R"json({ @@ -145,17 +145,54 @@ TEST_CASE("MichaelisMenten kinetic analytic Jacobian vs AD with inhibition", "[M point, 1e-15, 1e-15 ); } -TEST_CASE("ASM3 analytic Jacobian vs AD", "[ASM3],[ReactionModel],[Jacobian],[AD]") +TEST_CASE("ASM3 analytic Jacobian vs AD", "[ASM3],[ReactionModel],[Jacobian],[AD],[testHere]") { - const unsigned int nBound[] = {0}; + const unsigned int nBound[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,0.0, 0.0, 0.0 }; unsigned int ncomp = 13; - const double point[] = { 1.0, 2.0, 1.4, 2.1, 0.2, 1.1, 1.8 }; - cadet::test::reaction::testDynamicJacobianAD("ACTIVATES_SLUDGE_MODEL3", ncomp, nBound, + const double point[] = { 1.0, 2.0, 1.4, 2.1, 0.2, 1.1, 1.8, 1.5, 1.0, 4.2, 1.4, 0.3, 1.4}; + cadet::test::reaction::testDynamicJacobianAD("ACTIVATED_SLUDGE_MODEL3", ncomp, nBound, R"json({ - "ACSM3_p1": [1.0, 2.0, 0.4], - "ACSM3_p2": [-1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 3.0, 2.0, -1.0] + "ASM3_FISS_BM_PROD": 1.0, + "ASM3_FSI": 0.0, + "ASM3_YH_AER": 0.8, + "ASM3_YH_ANOX": 0.65, + "ASM3_YSTO_AER": 0.8375, + "ASM3_YSTO_ANOX": 0.7, + "ASM3_FXI": 0.2, + "ASM3_YA": 0.24, + "ASM3_KH20": 9.0, + "ASM3_KX": 1.0, + "ASM3_KSTO20": 12.0, + "ASM3_MU_H20": 3.0, + "ASM3_BH20": 0.33, + "ASM3_ETA_HNO3": 0.5, + "ASM3_KHO2": 0.2, + "ASM3_KHSS": 10.0, + "ASM3_KHNO3": 0.5, + "ASM3_KHNH4": 0.01, + "ASM3_KHALK": 0.1, + "ASM3_KHSTO": 0.1, + "ASM3_MU_AUT20": 1.12, + "ASM3_BAUT20": 0.18, + "ASM3_ETAH_END": 0.5, + "ASM3_ETAN_END": 0.5, + "ASM3_KNO2": 0.5, + "ASM3_KNNH4": 0.7, + "ASM3_KNALK": 0.5, + "ASM3_T": 12.0, + "ASM3_V": 1000.0, + "ASM3_IO2": 0.0, + "ASM3_INSI": 0.01, + "ASM3_INSS": 0.03, + "ASM3_INXI": 0.04, + "ASM3_INXS": 0.03, + "ASM3_INBM": 0.07, + "ASM3_IVSS_XI": 0.751879699, + "ASM3_IVSS_XS": 0.555555556, + "ASM3_IVSS_STO": 0.6, + "ASM3_IVSS_BM": 0.704225352, + "ASM3_ITSS_VSS_BM": 1.086956522 })json", point, 1e-15, 1e-15 ); } - From 2ce03deca62ee5bc7386008d11fdf6b49e521c42 Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Tue, 20 May 2025 14:52:02 +0200 Subject: [PATCH 29/47] add AD test only for reactions in liquit phase --- test/ReactionModelTests.cpp | 155 +++++++++++++++++++++++++++++++----- test/ReactionModelTests.hpp | 14 +++- test/ReactionModels.cpp | 6 +- 3 files changed, 152 insertions(+), 23 deletions(-) diff --git a/test/ReactionModelTests.cpp b/test/ReactionModelTests.cpp index 191f92799..be9edea65 100644 --- a/test/ReactionModelTests.cpp +++ b/test/ReactionModelTests.cpp @@ -392,6 +392,7 @@ namespace reaction ad::prepareAdVectorSeedsForDenseMatrix(adY, 0, numDofs); ad::copyToAd(yState.data(), adY, numDofs); ad::resetAd(adRes, numDofs); + crm.model().residualCombinedAdd(1.0, 0u, ColumnPosition{ 0.0, 0.0, 0.0 }, adY, adY + crm.nComp(), adRes, adRes + crm.nComp(), 1.0, crm.buffer()); // Extract Jacobian cadet::linalg::DenseMatrix jacAD; @@ -401,14 +402,48 @@ namespace reaction // Calculate analytic Jacobian cadet::linalg::DenseMatrix jacAna; jacAna.resize(numDofs, numDofs); + crm.model().analyticJacobianCombinedAdd(1.0, 0u, ColumnPosition{ 0.0, 0.0, 0.0 }, yState.data(), yState.data() + crm.nComp(), 1.0, jacAna.row(0), jacAna.row(crm.nComp()), crm.buffer()); - + cadet::test::checkJacobianPatternFD( + [&](double const* lDir, double* res) -> void + { + std::fill_n(res, numDofs, 0.0); + crm.model().residualCombinedAdd(1.0, 0u, ColumnPosition{ 0.0, 0.0, 0.0 }, lDir, lDir + crm.nComp(), res, res + crm.nComp(), 1.0, crm.buffer()); + }, + [&](double const* lDir, double* res) -> void + { + jacAna.multiplyVector(lDir, res); + }, + yState.data(), dir.data(), colA.data(), colB.data(), numDofs, numDofs); + + cadet::test::checkJacobianPatternFD( + [&](double const* lDir, double* res) -> void + { + std::fill_n(res, numDofs, 0.0); + crm.model().residualCombinedAdd(1.0, 0u, ColumnPosition{ 0.0, 0.0, 0.0 }, lDir, lDir + crm.nComp(), res, res + crm.nComp(), 1.0, crm.buffer()); + }, + [&](double const* lDir, double* res) -> void + { + jacAD.multiplyVector(lDir, res); + }, + yState.data(), dir.data(), colA.data(), colB.data(), numDofs, numDofs); + + // Check Jacobians against each other + for (unsigned int row = 0; row < numDofs; ++row) + { + for (unsigned int col = 0; col < numDofs; ++col) + { + CAPTURE(row); + CAPTURE(col); + CHECK(jacAna.native(row, col) == makeApprox(jacAD.native(row, col), absTol, relTol)); + } + } // Only liquid phase // Evaluate with AD ad::resetAd(adRes, numDofs); - crm.model().residualLiquidAdd(1.0, 0u, ColumnPosition{0.0, 0.0, 0.0}, adY, adRes, 1.0, crm.buffer()); + crm.model().residualLiquidAdd(1.0, 0u, ColumnPosition{ 0.0, 0.0, 0.0 }, adY, adRes, 1.0, crm.buffer()); // Extract Jacobian jacAD.setAll(0.0); @@ -416,33 +451,115 @@ namespace reaction // Calculate analytic Jacobian jacAna.setAll(0.0); - crm.model().analyticJacobianLiquidAdd(1.0, 0u, ColumnPosition{0.0, 0.0, 0.0}, yState.data(), 1.0, jacAna.row(0), crm.buffer()); + crm.model().analyticJacobianLiquidAdd(1.0, 0u, ColumnPosition{ 0.0, 0.0, 0.0 }, yState.data(), 1.0, jacAna.row(0), crm.buffer()); delete[] adY; delete[] adRes; cadet::test::checkJacobianPatternFD( [&](double const* lDir, double* res) -> void - { - std::fill_n(res, nComp, 0.0); - crm.model().residualLiquidAdd(1.0, 0u, ColumnPosition{0.0, 0.0, 0.0}, lDir, res, 1.0, crm.buffer()); - }, - [&](double const* lDir, double* res) -> void - { - jacAna.submatrixMultiplyVector(lDir, 0, 0, nComp, nComp, res); - }, + { + std::fill_n(res, nComp, 0.0); + crm.model().residualLiquidAdd(1.0, 0u, ColumnPosition{ 0.0, 0.0, 0.0 }, lDir, res, 1.0, crm.buffer()); + }, + [&](double const* lDir, double* res) -> void + { + jacAna.submatrixMultiplyVector(lDir, 0, 0, nComp, nComp, res); + }, yState.data(), dir.data(), colA.data(), colB.data(), nComp, nComp); cadet::test::checkJacobianPatternFD( [&](double const* lDir, double* res) -> void - { - std::fill_n(res, nComp, 0.0); - crm.model().residualLiquidAdd(1.0, 0u, ColumnPosition{0.0, 0.0, 0.0}, lDir, res, 1.0, crm.buffer()); - }, - [&](double const* lDir, double* res) -> void - { - jacAD.submatrixMultiplyVector(lDir, 0, 0, nComp, nComp, res); - }, + { + std::fill_n(res, nComp, 0.0); + crm.model().residualLiquidAdd(1.0, 0u, ColumnPosition{ 0.0, 0.0, 0.0 }, lDir, res, 1.0, crm.buffer()); + }, + [&](double const* lDir, double* res) -> void + { + jacAD.submatrixMultiplyVector(lDir, 0, 0, nComp, nComp, res); + }, + yState.data(), dir.data(), colA.data(), colB.data(), nComp, nComp); + + // Check Jacobians against each other + for (unsigned int row = 0; row < nComp; ++row) + { + for (unsigned int col = 0; col < nComp; ++col) + { + CAPTURE(row); + CAPTURE(col); + CHECK(jacAna.native(row, col) == makeApprox(jacAD.native(row, col), absTol, relTol)); + } + } + } + + void testLiquidReactionJacobianAD(const char* modelName, unsigned int nComp, unsigned int const* nBound, const char* config, double const* point, double absTol, double relTol) + { + ConfiguredDynamicReactionModel crm = ConfiguredDynamicReactionModel::create(modelName, nComp, nBound, config); + + const unsigned int numDofs = crm.nComp() + crm.numBoundStates(); + std::vector yState(numDofs, 0.0); + std::copy_n(point, numDofs, yState.data()); + + std::vector dir(numDofs, 0.0); + std::vector colA(numDofs, 0.0); + std::vector colB(numDofs, 0.0); + + // Enable AD + cadet::ad::setDirections(cadet::ad::getMaxDirections()); + cadet::active* adRes = new cadet::active[numDofs]; + cadet::active* adY = new cadet::active[numDofs]; + + // Evaluate with AD + ad::prepareAdVectorSeedsForDenseMatrix(adY, 0, numDofs); + ad::copyToAd(yState.data(), adY, numDofs); + ad::resetAd(adRes, numDofs); + + // Extract Jacobian + cadet::linalg::DenseMatrix jacAD; + jacAD.resize(numDofs, numDofs); + ad::extractDenseJacobianFromAd(adRes, 0, jacAD); + + // Calculate analytic Jacobian + cadet::linalg::DenseMatrix jacAna; + jacAna.resize(numDofs, numDofs); + + // Evaluate with AD + ad::resetAd(adRes, numDofs); + crm.model().residualLiquidAdd(1.0, 0u, ColumnPosition{ 0.0, 0.0, 0.0 }, adY, adRes, 1.0, crm.buffer()); + + // Extract Jacobian + jacAD.setAll(0.0); + ad::extractDenseJacobianFromAd(adRes, 0, jacAD); + + // Calculate analytic Jacobian + jacAna.setAll(0.0); + crm.model().analyticJacobianLiquidAdd(1.0, 0u, ColumnPosition{ 0.0, 0.0, 0.0 }, yState.data(), 1.0, jacAna.row(0), crm.buffer()); + + delete[] adY; + delete[] adRes; + + cadet::test::checkJacobianPatternFD( + [&](double const* lDir, double* res) -> void + { + std::fill_n(res, nComp, 0.0); + crm.model().residualLiquidAdd(1.0, 0u, ColumnPosition{ 0.0, 0.0, 0.0 }, lDir, res, 1.0, crm.buffer()); + }, + [&](double const* lDir, double* res) -> void + { + jacAna.submatrixMultiplyVector(lDir, 0, 0, nComp, nComp, res); + }, + yState.data(), dir.data(), colA.data(), colB.data(), nComp, nComp); + + cadet::test::checkJacobianPatternFD( + [&](double const* lDir, double* res) -> void + { + std::fill_n(res, nComp, 0.0); + crm.model().residualLiquidAdd(1.0, 0u, ColumnPosition{ 0.0, 0.0, 0.0 }, lDir, res, 1.0, crm.buffer()); + }, + [&](double const* lDir, double* res) -> void + { + jacAD.submatrixMultiplyVector(lDir, 0, 0, nComp, nComp, res); + }, yState.data(), dir.data(), colA.data(), colB.data(), nComp, nComp); // Check Jacobians against each other diff --git a/test/ReactionModelTests.hpp b/test/ReactionModelTests.hpp index aa0060144..0b4fed543 100644 --- a/test/ReactionModelTests.hpp +++ b/test/ReactionModelTests.hpp @@ -123,6 +123,18 @@ namespace reaction */ void testMichaelisMentenToSMAInhibitionMicroKinetic(const std::string configFilePathMM, const std::string configFilePathSMA, const double absTol, const double relTol); + /** + * @brief Checks the analytic Jacobians of the dynamic reaction model against AD + * @param [in] modelName Name of the reaction model + * @param [in] nComp Number of components + * @param [in] nBound Array with number of bound states for each component + * @param [in] config JSON string with reaction model parameters + * @param [in] point Liquid phase and solid phase values to check Jacobian at + * @param [in] absTol Absolute error tolerance + * @param [in] relTol Relative error tolerance + */ + void testDynamicJacobianAD(const char* modelName, unsigned int nComp, unsigned int const* nBound, const char* config, double const* point, double absTol = 0.0, double relTol = std::numeric_limits::epsilon() * 100.0); + /** * @brief Checks the analytic Jacobians of the dynamic reaction model against AD * @param [in] modelName Name of the reaction model @@ -133,7 +145,7 @@ namespace reaction * @param [in] absTol Absolute error tolerance * @param [in] relTol Relative error tolerance */ - void testDynamicJacobianAD(const char* modelName, unsigned int nComp, unsigned int const* nBound, const char* config, double const* point, double absTol = 0.0, double relTol = std::numeric_limits::epsilon() * 100.0); + void testLiquidReactionJacobianAD(const char* modelName, unsigned int nComp, unsigned int const* nBound, const char* config, double const* point, double absTol = 0.0, double relTol = std::numeric_limits::epsilon() * 100.0); /** * @brief Extends a model with dynamic reactions in each phase and particle type diff --git a/test/ReactionModels.cpp b/test/ReactionModels.cpp index 49c76ebba..bff1593b6 100644 --- a/test/ReactionModels.cpp +++ b/test/ReactionModels.cpp @@ -145,12 +145,12 @@ TEST_CASE("MichaelisMenten kinetic analytic Jacobian vs AD with inhibition", "[M point, 1e-15, 1e-15 ); } -TEST_CASE("ASM3 analytic Jacobian vs AD", "[ASM3],[ReactionModel],[Jacobian],[AD],[testHere]") +TEST_CASE("ASM3 analytic Jacobian vs AD", "[ASM3],[ReactionModel],[Jacobian],[AD]") { - const unsigned int nBound[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,0.0, 0.0, 0.0 }; + const unsigned int nBound[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0, 0, 0 }; unsigned int ncomp = 13; const double point[] = { 1.0, 2.0, 1.4, 2.1, 0.2, 1.1, 1.8, 1.5, 1.0, 4.2, 1.4, 0.3, 1.4}; - cadet::test::reaction::testDynamicJacobianAD("ACTIVATED_SLUDGE_MODEL3", ncomp, nBound, + cadet::test::reaction::testLiquidReactionJacobianAD("ACTIVATED_SLUDGE_MODEL3", ncomp, nBound, R"json({ "ASM3_FISS_BM_PROD": 1.0, "ASM3_FSI": 0.0, From 5e1c12470063a9c2d356a38eb42039b39247d7ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Tue, 20 May 2025 20:36:43 +0200 Subject: [PATCH 30/47] ASM3: group parameter documentation --- .../reaction/activated_sludge_model.rst | 96 +++++++++++-------- 1 file changed, 54 insertions(+), 42 deletions(-) diff --git a/doc/interface/reaction/activated_sludge_model.rst b/doc/interface/reaction/activated_sludge_model.rst index f6078fb2e..71c9c98b2 100644 --- a/doc/interface/reaction/activated_sludge_model.rst +++ b/doc/interface/reaction/activated_sludge_model.rst @@ -7,20 +7,23 @@ Activated Sludge Model (ASM3h) For information on model equations, refer to :ref:`activated_sludge_model`. -``ASM3_KH20`` +Environment/process parameters +---- - Hydrolysis rate constant :math:`k_H` at 20 °C. +``ASM3_T`` + + Temperature :math:`T`. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== -``ASM3_T`` +``ASM3_V`` + + Reactor volume :math:`V`. Set this to the column volume since the model can't compute it itself. - Temperature :math:`T`. - ================ ============================= ======================================================== - **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 + **Type:** double **Range:** :math:`\gt 0` **Length:** 1 ================ ============================= ======================================================== ``ASM3_IO2`` @@ -31,12 +34,15 @@ For information on model equations, refer to :ref:`activated_sludge_model`. **Type:** double **Range:** :math:`\ge 0` **Length:** 1 ================ ============================= ======================================================== -``ASM3_V`` +Maximum rates +---- - Aeration volume :math:`V`. +``ASM3_KH20`` + Hydrolysis rate constant :math:`k_H` at 20 °C. + ================ ============================= ======================================================== - **Type:** double **Range:** :math:`\gt 0` **Length:** 1 + **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== ``ASM3_KSTO20`` @@ -47,137 +53,143 @@ For information on model equations, refer to :ref:`activated_sludge_model`. **Type:** double **Range:** :math:`\gt 0` **Length:** 1 ================ ============================= ======================================================== -``ASM3_KX`` +``ASM3_MU_H20`` - Saturation/inhibition coefficient for particulate COD :math:`KX`. + Heterotrophic max. growth rate :math:`\mu_{H}` at 20 °C. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== -``ASM3_KHO2`` +``ASM3_BH20`` - Saturation/inhibition coefficient for oxygen, heterotrophic growth :math:`KHO_2`. + Rate constant for lysis and decay :math:`b_H` at 20 °C. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== -``ASM3_KHSS`` +``ASM3_MU_AUT20`` - Substrate :math:`SS` saturation constant :math:`KHSS`. + Autotrophic max. growth rate :math:`\mu_{AUT}` at 20 °C. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== -``ASM3_KHNO3`` +``ASM3_BAUT20`` - :math:`SNO_X` saturation constant :math:`KHNO_3`. + Rate constant :math:`b_{AUT}` for decay of autotrophs at 20 °C. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== +Anoxic reduction factors +---- + ``ASM3_ETA_HNO3`` - Anoxic reduction factor :math:`\eta_{HNO_3}`. + Anoxic reduction factor :math:`\eta_{HNO_3}` – heterotrophic growth. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== -``ASM3_KHNH4`` +``ASM3_ETAH_END`` - Ammonium saturation constant :math:`KHNH_4`. + Anoxic reduction factor :math:`\eta_{H_{end}}` – endogenous respiration XH. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== -``ASM3_KHALK`` +``ASM3_ETAN_END`` - :math:`XH` alkalinity saturation constant :math:`KH_{ALK}`. + Anoxic reduction factor :math:`\eta_{N_{end}}` – endogenous respiration XA. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== -``ASM3_KHSTO`` +Saturation/inhibition coefficients +---- - :math:`X_{STO}` saturation constant :math:`KH_{STO}`. +``ASM3_KX`` + + Saturation/inhibition coefficient :math:`KX` for particulate COD. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== -``ASM3_MU_H20`` +``ASM3_KHO2`` - Heterotrophic max. growth rate :math:`\mu_{H}` at 20 °C. + Saturation/inhibition coefficient :math:`KHO_2` for oxygen, heterotrophic growth. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== -``ASM3_ETAH_END`` +``ASM3_KHSS`` - Reduction factor :math:`\eta_{H_{end}}` for :math:`b_H` under anoxic conditions. + Saturation/inhibition coefficient :math:`KHSS` for readily biodegradable substrates. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== -``ASM3_BH20`` +``ASM3_KHNO3`` - Rate constant for lysis and decay :math:`b_H` at 20 °C. + Saturation/inhibition coefficient :math:`KHNO_3` for nitrate. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== -``ASM3_MU_AUT20`` +``ASM3_KHNH4`` - Maximum growth rate of :math:`XAUT`, :math:`\mu_{AUT}` at 20 °C. + Saturation/inhibition coefficient :math:`KHNH_4` for ammonium (nutrient). ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== -``ASM3_KNO2`` +``ASM3_KHALK`` - Saturation coefficient :math:`K_{NO_2}` for oxygen, autotrophic growth. + Saturation coefficient :math:`KH_{ALK}` for alkalinity (HCO3-). ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== -``ASM3_KNNH4`` +``ASM3_KHSTO`` - Saturation coefficient :math:`K_{NNH_4}` for ammonium (substrate), autotrophic growth. + Saturation coefficient :math:`KH_{STO}` for storage products. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== -``ASM3_KNALK`` +``ASM3_KNO2`` - Saturation coefficient :math:`K_{NALK}` for alkalinity, autotrophic growth. + Saturation coefficient :math:`K_{NO_2}` for oxygen, autotrophic growth. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== -``ASM3_BAUT20`` +``ASM3_KNNH4`` - Decay rate :math:`b_{AUT}` of :math:`XAUT` at 20 °C. + Saturation coefficient :math:`K_{NNH_4}` for ammonium (substrate), autotrophic growth. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== -``ASM3_ETAN_END`` +``ASM3_KNALK`` - Reduction factor :math:`\eta_{N_{end}}` for :math:`b_{AUT}` under anoxic conditions. + Saturation coefficient :math:`K_{NALK}` for alkalinity (HCO3-), autotrophic growth. ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 From 8473f7793e97b64adab234ae312f60aa5c53b0f7 Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Fri, 6 Jun 2025 08:33:17 +0200 Subject: [PATCH 31/47] change parameter name to lowercase --- .../reaction/ActivatedSludgeModelThree.cpp | 544 +++++++++--------- 1 file changed, 272 insertions(+), 272 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index 0a66847fe..46e65bbac 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -32,28 +32,28 @@ "externalName": "ExtActivatedSludgeModelThreeParamHandler", "parameters": [ - { "type": "ScalarParameter", "varName": "Kh20", "confName": "ASM3_KH20"}, + { "type": "ScalarParameter", "varName": "kh20", "confName": "ASM3_KH20"}, { "type": "ScalarParameter", "varName": "T", "confName": "ASM3_T"}, - { "type": "ScalarParameter", "varName": "iO2", "confName": "ASM3_IO2"}, + { "type": "ScalarParameter", "varName": "io2", "confName": "ASM3_IO2"}, { "type": "ScalarParameter", "varName": "V", "confName": "ASM3_V"}, { "type": "ScalarParameter", "varName": "k_sto20", "confName": "ASM3_KSTO20"}, - { "type": "ScalarParameter", "varName": "KX", "confName": "ASM3_KX"}, - { "type": "ScalarParameter", "varName": "KHO2", "confName": "ASM3_KHO2"}, - { "type": "ScalarParameter", "varName": "KHSS", "confName": "ASM3_KHSS"}, - { "type": "ScalarParameter", "varName": "KHNO3", "confName": "ASM3_KHNO3"}, - { "type": "ScalarParameter", "varName": "etaHNO3", "confName": "ASM3_ETA_HNO3"}, - { "type": "ScalarParameter", "varName": "KHNH4", "confName": "ASM3_KHNH4"}, - { "type": "ScalarParameter", "varName": "KHALK", "confName": "ASM3_KHALK"}, - { "type": "ScalarParameter", "varName": "KHSTO", "confName": "ASM3_KHSTO"}, - { "type": "ScalarParameter", "varName": "muH20", "confName": "ASM3_MU_H20"}, - { "type": "ScalarParameter", "varName": "etaHend", "confName": "ASM3_ETAH_END"}, - { "type": "ScalarParameter", "varName": "bH20", "confName": "ASM3_BH20"}, + { "type": "ScalarParameter", "varName": "kx", "confName": "ASM3_KX"}, + { "type": "ScalarParameter", "varName": "kho2", "confName": "ASM3_KHO2"}, + { "type": "ScalarParameter", "varName": "khss", "confName": "ASM3_KHSS"}, + { "type": "ScalarParameter", "varName": "khn03", "confName": "ASM3_KHNO3"}, + { "type": "ScalarParameter", "varName": "etahno3", "confName": "ASM3_ETA_HNO3"}, + { "type": "ScalarParameter", "varName": "khnh4", "confName": "ASM3_KHNH4"}, + { "type": "ScalarParameter", "varName": "khalk", "confName": "ASM3_KHALK"}, + { "type": "ScalarParameter", "varName": "khsto", "confName": "ASM3_KHSTO"}, + { "type": "ScalarParameter", "varName": "muh2o", "confName": "ASM3_MU_H20"}, + { "type": "ScalarParameter", "varName": "etahend", "confName": "ASM3_ETAH_END"}, + { "type": "ScalarParameter", "varName": "bh20", "confName": "ASM3_BH20"}, { "type": "ScalarParameter", "varName": "muAUT20", "confName": "ASM3_MU_AUT20"}, - { "type": "ScalarParameter", "varName": "KNO2", "confName": "ASM3_KNO2"}, - { "type": "ScalarParameter", "varName": "KNNH4", "confName": "ASM3_KNNH4"}, - { "type": "ScalarParameter", "varName": "KNALK", "confName": "ASM3_KNALK"}, - { "type": "ScalarParameter", "varName": "bAUT20", "confName": "ASM3_BAUT20"}, - { "type": "ScalarParameter", "varName": "etaNend", "confName": "ASM3_ETAN_END"} + { "type": "ScalarParameter", "varName": "kno2", "confName": "ASM3_KNO2"}, + { "type": "ScalarParameter", "varName": "knnh4", "confName": "ASM3_KNNH4"}, + { "type": "ScalarParameter", "varName": "knalk", "confName": "ASM3_KNALK"}, + { "type": "ScalarParameter", "varName": "baut20", "confName": "ASM3_BAUT20"}, + { "type": "ScalarParameter", "varName": "etanend", "confName": "ASM3_ETAN_END"} ] } */ @@ -344,38 +344,38 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase typedef typename DoubleActivePromoter::type flux_t; BufferedArray fluxes = workSpace.array(_stoichiometry.columns()); - const flux_t Kh20 = static_cast::type>(p->Kh20); + const flux_t kh20 = static_cast::type>(p->kh20); const flux_t T = static_cast::type>(p->T); - const flux_t iO2 = static_cast::type>(p->iO2); + const flux_t io2 = static_cast::type>(p->io2); const flux_t V = static_cast::type>(p->V); const flux_t k_sto20 = static_cast::type>(p->k_sto20); - const flux_t KX = static_cast::type>(p->KX); - const flux_t KHO2 = static_cast::type>(p->KHO2); - const flux_t KHSS = static_cast::type>(p->KHSS); - const flux_t KHNO3 = static_cast::type>(p->KHNO3); - const flux_t etaHNO3 = static_cast::type>(p->etaHNO3); - const flux_t KHNH4 = static_cast::type>(p->KHNH4); - const flux_t KHALK = static_cast::type>(p->KHALK); - const flux_t KHSTO = static_cast::type>(p->KHSTO); - const flux_t muH20 = static_cast::type>(p->muH20); - const flux_t etaHend = static_cast::type>(p->etaHend); - const flux_t bH20 = static_cast::type>(p->bH20); + const flux_t kx = static_cast::type>(p->kx); + const flux_t kho2 = static_cast::type>(p->kho2); + const flux_t khss = static_cast::type>(p->khss); + const flux_t khn03 = static_cast::type>(p->khn03); + const flux_t etahno3 = static_cast::type>(p->etahno3); + const flux_t khnh4 = static_cast::type>(p->khnh4); + const flux_t khalk = static_cast::type>(p->khalk); + const flux_t khsto = static_cast::type>(p->khsto); + const flux_t muh2o = static_cast::type>(p->muh2o); + const flux_t etahend = static_cast::type>(p->etahend); + const flux_t bh20 = static_cast::type>(p->bh20); const flux_t muAUT20 = static_cast::type>(p->muAUT20); - const flux_t KNO2 = static_cast::type>(p->KNO2); - const flux_t KNNH4 = static_cast::type>(p->KNNH4); - const flux_t KNALK = static_cast::type>(p->KNALK); - const flux_t bAUT20 = static_cast::type>(p->bAUT20); - const flux_t etaNend = static_cast::type>(p->etaNend); + const flux_t kno2 = static_cast::type>(p->kno2); + const flux_t knnh4 = static_cast::type>(p->knnh4); + const flux_t knalk = static_cast::type>(p->knalk); + const flux_t baut20 = static_cast::type>(p->baut20); + const flux_t etanend = static_cast::type>(p->etanend); // derived parameters const double ft04 = exp(-0.04 * (20.0 - static_cast(T))); const double ft07 = exp(-0.06952 * (20.0 - static_cast(T))); const double ft105 = exp(-0.105 * (20.0 - static_cast(T))); const double k_sto = static_cast(k_sto20) * ft07; - const double muH = static_cast(muH20) * ft07; - const double bH = static_cast(bH20) * ft07; + const double muH = static_cast(muh2o) * ft07; + const double bH = static_cast(bh20) * ft07; const double muAUT = static_cast(muAUT20) * ft105; - const double bAUT = static_cast(bAUT20) * ft105; + const double bAUT = static_cast(baut20) * ft105; StateType SO = y[0]; StateType SS = y[1]; @@ -393,51 +393,51 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase // p1: Hydrolysis of organic structures - fluxes[0] = Kh20 * ft04 * (XS/XH) / ((XS/XH) + KX) * XH; + fluxes[0] = kh20 * ft04 * (XS/XH) / ((XS/XH) + kx) * XH; if (XH < 0.1) - fluxes[0] = Kh20 * ft04 * (XS/0.1) / ((XS/0.1) + KX) * XH; + fluxes[0] = kh20 * ft04 * (XS/0.1) / ((XS/0.1) + kx) * XH; // p2: Aerobic storage of SS - fluxes[1] = k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * XH; + fluxes[1] = k_sto * SO / (SO + kho2) * SS / (SS + khss) * XH; // p3: Anoxic storage of SS - fluxes[2] = k_sto * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; + fluxes[2] = k_sto * etahno3 * kho2 / (SO + kho2) * SS / (SS + khss) * SNO / (SNO + khn03) * XH; // p4: Aerobic growth of heterotrophic biomass (XH) - fluxes[3] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * ((XSTO/XH)) / (((XSTO/XH)) + KHSTO) * XH; + fluxes[3] = muH * SO / (SO + kho2) * SNH / (SNH + khnh4) * SALK / (SALK + khalk) * ((XSTO/XH)) / (((XSTO/XH)) + khsto) * XH; if (XH < 0.1) - fluxes[3] = muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * (XSTO / 0.1) / ((XSTO / 0.1) + KHSTO) * XH; + fluxes[3] = muH * SO / (SO + kho2) * SNH / (SNH + khnh4) * SALK / (SALK + khalk) * (XSTO / 0.1) / ((XSTO / 0.1) + khsto) * XH; // p5: Anoxic growth of heterotrophic biomass (XH, denitrification) - fluxes[4] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * (XSTO / XH) * 1 / (KHSTO + (XSTO / XH)) * SNO / (KHNO3 + SNO) * XH; + fluxes[4] = muH * etahno3 * kho2 / (kho2 + SO) * SNH / (khnh4 + SNH) * SALK / (khalk + SALK) * (XSTO / XH) * 1 / (khsto + (XSTO / XH)) * SNO / (khn03 + SNO) * XH; if (XH < 0.1) - fluxes[4] = muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * (XSTO / 0.1) * 1 / (KHSTO + (XSTO/0.1)) * SNO / (KHNO3 + SNO) * XH; + fluxes[4] = muH * etahno3 * kho2 / (kho2 + SO) * SNH / (khnh4 + SNH) * SALK / (khalk + SALK) * (XSTO / 0.1) * 1 / (khsto + (XSTO/0.1)) * SNO / (khn03 + SNO) * XH; // r6: Aerobic endogenous respiration of heterotroph microorganisms (XH) - fluxes[5] = bH * SO / (SO + KHO2) * XH; + fluxes[5] = bH * SO / (SO + kho2) * XH; // r7: Anoxic endogenous respiration of heterotroph microorganisms (XH) - fluxes[6] = bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XH; + fluxes[6] = bH * etahend * kho2 / (SO + kho2) * SNO / (SNO + khn03) * XH; // r8: Aerobic respiration of internal cell storage products - fluxes[7] = bH * SO / (SO + KHO2) * XSTO; + fluxes[7] = bH * SO / (SO + kho2) * XSTO; // r9: Anoxic respiration of internal cell storage products - fluxes[8] = bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XSTO; + fluxes[8] = bH * etahend * kho2 / (SO + kho2) * SNO / (SNO + khn03) * XSTO; // r10: Aerobic growth of autotrophic biomass (XAUT, nitrification) - fluxes[9] = muAUT * SO / (SO + KNO2) * SNH / (SNH + KNNH4) * SALK / (SALK + KNALK) * XA; + fluxes[9] = muAUT * SO / (SO + kno2) * SNH / (SNH + knnh4) * SALK / (SALK + knalk) * XA; // r11: Aerobic endogenous respiration of autotrophic biomass (XAUT) - fluxes[10] = bAUT * SO / (SO + KHO2) * XA; + fluxes[10] = bAUT * SO / (SO + kho2) * XA; // r12: Anoxic endogenous respiration of autotrophic biomass (XAUT) - fluxes[11] = bAUT * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2) * XA; + fluxes[11] = bAUT * etanend * SNO / (SNO + khn03) * kho2 / (SO + kho2) * XA; // r13: Aeration // TODO: is V in litres? - fluxes[12] = iO2 / V; + fluxes[12] = io2 / V; // Add reaction terms to residual _stoichiometry.multiplyVector(static_cast(fluxes), factor, res); @@ -464,28 +464,28 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase { typename ParamHandler_t::ParamsHandle const p = _paramHandler.update(t, secIdx, colPos, _nComp, _nBoundStates, workSpace); - const double Kh20 = static_cast(p->Kh20); + const double kh20 = static_cast(p->kh20); const double T = static_cast(p->T); - const double iO2 = static_cast(p->iO2); + const double io2 = static_cast(p->io2); const double V = static_cast(p->V); const double k_sto20 = static_cast(p->k_sto20); - const double KX = static_cast(p->KX); - const double KHO2 = static_cast(p->KHO2); - const double KHSS = static_cast(p->KHSS); - const double KHNO3 = static_cast(p->KHNO3); - const double etaHNO3 = static_cast(p->etaHNO3); - const double KHNH4 = static_cast(p->KHNH4); - const double KHALK = static_cast(p->KHALK); - const double KHSTO = static_cast(p->KHSTO); - const double muH20 = static_cast(p->muH20); - const double etaHend = static_cast(p->etaHend); - const double bH20 = static_cast(p->bH20); + const double kx = static_cast(p->kx); + const double kho2 = static_cast(p->kho2); + const double khss = static_cast(p->khss); + const double khn03 = static_cast(p->khn03); + const double etahno3 = static_cast(p->etahno3); + const double khnh4 = static_cast(p->khnh4); + const double khalk = static_cast(p->khalk); + const double khsto = static_cast(p->khsto); + const double muh2o = static_cast(p->muh2o); + const double etahend = static_cast(p->etahend); + const double bh20 = static_cast(p->bh20); const double muAUT20 = static_cast(p->muAUT20); - const double KNO2 = static_cast(p->KNO2); - const double KNNH4 = static_cast(p->KNNH4); - const double KNALK = static_cast(p->KNALK); - const double bAUT20 = static_cast(p->bAUT20); - const double etaNend = static_cast(p->etaNend); + const double kno2 = static_cast(p->kno2); + const double knnh4 = static_cast(p->knnh4); + const double knalk = static_cast(p->knalk); + const double baut20 = static_cast(p->baut20); + const double etanend = static_cast(p->etanend); // derived parameters // derived parameters @@ -493,10 +493,10 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase const double ft07 = exp(-0.06952 * (20.0 - static_cast(T))); const double ft105 = exp(-0.105 * (20.0 - static_cast(T))); const double k_sto = static_cast(k_sto20) * ft07; - const double muH = static_cast(muH20) * ft07; - const double bH = static_cast(bH20) * ft07; + const double muH = static_cast(muh2o) * ft07; + const double bH = static_cast(bh20) * ft07; const double muAUT = static_cast(muAUT20) * ft105; - const double bAUT = static_cast(bAUT20) * ft105; + const double bAUT = static_cast(baut20) * ft105; double SO = y[0]; double SS = y[1]; @@ -529,244 +529,244 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase double d[13][13] = {}; - // p1: Hydrolysis: Kh20 * ft04 * XS/XH_S / (XS/XH_S + KX) * XH; + // p1: Hydrolysis: kh20 * ft04 * XS/XH_S / (XS/XH_S + kx) * XH; // Jacobian: - d[0][idxXS] = Kh20 * ft04 - * XH / ((XS + XH * KX) - * (XS + XH * KX)) * XH; - d[0][idxXH] = Kh20 * ft04 - * (XS * XS) / ((XS + KX * XH) - * (XS + KX * XH)); + d[0][idxXS] = kh20 * ft04 + * XH / ((XS + XH * kx) + * (XS + XH * kx)) * XH; + d[0][idxXH] = kh20 * ft04 + * (XS * XS) / ((XS + kx * XH) + * (XS + kx * XH)); if (XH < 0.1) { - d[0][idxXS] = Kh20 * ft04 - * 0.1 / ((XS + 0.1 * KX) * (XS + 0.1 * KX)) * XH; + d[0][idxXS] = kh20 * ft04 + * 0.1 / ((XS + 0.1 * kx) * (XS + 0.1 * kx)) * XH; d[0][idxXH] = 0.0; } - // p2: Aerobic storage of SS: k_sto * SO / (SO + KHO2) * SS / (SS + KHSS) * XH; + // p2: Aerobic storage of SS: k_sto * SO / (SO + kho2) * SS / (SS + khss) * XH; d[1][idxSO] = k_sto - * SS / (SS + KHSS) - * KHO2 / ((SO + KHO2) * (SO + KHO2)) * XH; + * SS / (SS + khss) + * kho2 / ((SO + kho2) * (SO + kho2)) * XH; d[1][idxSS] = k_sto - * SO / (SO + KHO2) - * KHSS / ((SS + KHSS) * (SS + KHSS)) * XH; + * SO / (SO + kho2) + * khss / ((SS + khss) * (SS + khss)) * XH; d[1][idxXH] = k_sto - * SO / (SO + KHO2) - * SS / (SS + KHSS); - - // p3: Anoxic storage of SS: k_sto * etaHNO3 * KHO2 / (SO + KHO2) * SS / (SS + KHSS) * SNO / (SNO + KHNO3) * XH; - d[2][idxSO] = k_sto * etaHNO3 - * -KHO2 / ((SO + KHO2) * (SO + KHO2)) - * SS / (SS + KHSS) - * SNO / (SNO + KHNO3) * XH; - d[2][idxSS] = k_sto * etaHNO3 - * KHO2 / (SO + KHO2) - * KHSS / ((SS + KHSS) * (SS + KHSS)) - * SNO / (SNO + KHNO3) * XH; - d[2][idxSNO] = k_sto * etaHNO3 - * KHO2 / (SO + KHO2) - * SS / (SS + KHSS) - * KHNO3 / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; - d[2][idxXH] = k_sto * etaHNO3 - * KHO2 / (SO + KHO2) - * SS / (SS + KHSS) - * SNO / (SNO + KHNO3); - - // p4: Aerobic growth: muH * SO / (SO + KHO2) * SNH / (SNH + KHNH4) * SALK / (SALK + KHALK) * (XSTO/XH_S) / ((XSTO/XH_S) + KHSTO) * XH; + * SO / (SO + kho2) + * SS / (SS + khss); + + // p3: Anoxic storage of SS: k_sto * etahno3 * kho2 / (SO + kho2) * SS / (SS + khss) * SNO / (SNO + khn03) * XH; + d[2][idxSO] = k_sto * etahno3 + * -kho2 / ((SO + kho2) * (SO + kho2)) + * SS / (SS + khss) + * SNO / (SNO + khn03) * XH; + d[2][idxSS] = k_sto * etahno3 + * kho2 / (SO + kho2) + * khss / ((SS + khss) * (SS + khss)) + * SNO / (SNO + khn03) * XH; + d[2][idxSNO] = k_sto * etahno3 + * kho2 / (SO + kho2) + * SS / (SS + khss) + * khn03 / ((SNO + khn03) * (SNO + khn03)) * XH; + d[2][idxXH] = k_sto * etahno3 + * kho2 / (SO + kho2) + * SS / (SS + khss) + * SNO / (SNO + khn03); + + // p4: Aerobic growth: muH * SO / (SO + kho2) * SNH / (SNH + khnh4) * SALK / (SALK + khalk) * (XSTO/XH_S) / ((XSTO/XH_S) + khsto) * XH; d[3][idxSO] = muH - * KHO2 / ((SO + KHO2) * (SO + KHO2)) - * SNH / (SNH + KHNH4) - * SALK / (SALK + KHALK) - * (XSTO / XH) / ((XSTO / XH) + KHSTO) * XH; + * kho2 / ((SO + kho2) * (SO + kho2)) + * SNH / (SNH + khnh4) + * SALK / (SALK + khalk) + * (XSTO / XH) / ((XSTO / XH) + khsto) * XH; d[3][idxSNH] = muH - * SO / (SO + KHO2) - * KHNH4 / ((SNH + KHNH4) * (SNH + KHNH4)) - * SALK / (SALK + KHALK) - * (XSTO / XH) / ((XSTO / XH) + KHSTO) * XH; + * SO / (SO + kho2) + * khnh4 / ((SNH + khnh4) * (SNH + khnh4)) + * SALK / (SALK + khalk) + * (XSTO / XH) / ((XSTO / XH) + khsto) * XH; d[3][idxSALK] = muH - * SO / (SO + KHO2) - * SNH / (SNH + KHNH4) - * KHALK / ((SALK + KHALK) * (SALK + KHALK)) - * (XSTO / XH) / ((XSTO / XH) + KHSTO) * XH; + * SO / (SO + kho2) + * SNH / (SNH + khnh4) + * khalk / ((SALK + khalk) * (SALK + khalk)) + * (XSTO / XH) / ((XSTO / XH) + khsto) * XH; d[3][idxXSTO] = muH - * SO / (SO + KHO2) - * SNH / (SNH + KHNH4) - * SALK / (SALK + KHALK) - * (KHSTO * XH) / ((XSTO + KHSTO * XH) * (XSTO + KHSTO * XH)) * XH; + * SO / (SO + kho2) + * SNH / (SNH + khnh4) + * SALK / (SALK + khalk) + * (khsto * XH) / ((XSTO + khsto * XH) * (XSTO + khsto * XH)) * XH; d[3][idxXH] = muH - * SO / (SO + KHO2) - * SNH / (SNH + KHNH4) - * SALK / (SALK + KHALK) - * (XSTO * XSTO) / ((XSTO + KHSTO * XH) * (XSTO + KHSTO * XH)); + * SO / (SO + kho2) + * SNH / (SNH + khnh4) + * SALK / (SALK + khalk) + * (XSTO * XSTO) / ((XSTO + khsto * XH) * (XSTO + khsto * XH)); if (XH < 0.1) { d[3][idxSO] = muH - * -KHO2 / ((SO + KHO2) * (SO + KHO2)) - * SNH / (SNH + KHNH4) - * SALK / (SALK + KHALK) - * (XSTO / 0.1) / ((XSTO / 0.1) + KHSTO) * 0.1; + * -kho2 / ((SO + kho2) * (SO + kho2)) + * SNH / (SNH + khnh4) + * SALK / (SALK + khalk) + * (XSTO / 0.1) / ((XSTO / 0.1) + khsto) * 0.1; d[3][idxSNH] = muH - * SO / (SO + KHO2) - * KHNH4 / ((SNH + KHNH4) * (SNH + KHNH4)) - * SALK / (SALK + KHALK) - * (XSTO / 0.1) / ((XSTO / 0.1) + KHSTO) * 0.1; + * SO / (SO + kho2) + * khnh4 / ((SNH + khnh4) * (SNH + khnh4)) + * SALK / (SALK + khalk) + * (XSTO / 0.1) / ((XSTO / 0.1) + khsto) * 0.1; d[3][idxSALK] = muH - * SO / (SO + KHO2) - * SNH / (SNH + KHNH4) - * KHALK / ((SALK + KHALK) * (SALK + KHALK)) - * (XSTO / 0.1) / ((XSTO / 0.1) + KHSTO) * 0.1; + * SO / (SO + kho2) + * SNH / (SNH + khnh4) + * khalk / ((SALK + khalk) * (SALK + khalk)) + * (XSTO / 0.1) / ((XSTO / 0.1) + khsto) * 0.1; d[3][idxXSTO] = muH - * SO / (SO + KHO2) - * SNH / (SNH + KHNH4) - * SALK / (SALK + KHALK) - * (KHSTO * 0.1) / ((XSTO + KHSTO * 0.1) * (XSTO + KHSTO * 0.1)) * 0.1; + * SO / (SO + kho2) + * SNH / (SNH + khnh4) + * SALK / (SALK + khalk) + * (khsto * 0.1) / ((XSTO + khsto * 0.1) * (XSTO + khsto * 0.1)) * 0.1; d[3][idxXH] = 0.0; } - // p5: Anoxic growth: muH * etaHNO3 * KHO2 / (KHO2 + SO) * SNH / (KHNH4 + SNH) * SALK / (KHALK + SALK) * SNO / (KHNO3 + SNO)* (XSTO / XH_S) / (KHSTO + (XSTO/XH)_S) * XH; - d[4][idxSO] = muH * etaHNO3 - * -KHO2 / ((KHO2 + SO) * (KHO2 + SO)) - * SNH / (KHNH4 + SNH) - * SALK / (KHALK + SALK) - * (XSTO / XH) / (KHSTO + (XSTO / XH)) - * SNO / (KHNO3 + SNO) * XH; - d[4][idxSNH] = muH * etaHNO3 - * KHO2 / (KHO2 + SO) - * KHNH4 / ((KHNH4 + SNH) * (KHNH4 + SNH)) - * SALK / (KHALK + SALK) - * (XSTO / XH) / (KHSTO + (XSTO / XH)) - * SNO / (KHNO3 + SNO) * XH; - d[4][idxSALK] = muH * etaHNO3 - * KHO2 / (KHO2 + SO) - * SNH / (KHNH4 + SNH) - * KHALK / ((KHALK + SALK) * (KHALK + SALK)) - * (XSTO / XH) / (KHSTO + (XSTO / XH)) - * SNO / (KHNO3 + SNO) * XH; - d[4][idxSNO] = muH * etaHNO3 - * KHO2 / (KHO2 + SO) - * SNH / (KHNH4 + SNH) - * SALK / (KHALK + SALK) - * (XSTO / XH) / (KHSTO + (XSTO / XH)) - * KHNO3 / ((KHNO3 + SNO) * (KHNO3 + SNO)) * XH; - d[4][idxXSTO] = muH * etaHNO3 - * KHO2 / (KHO2 + SO) - * SNH / (KHNH4 + SNH) - * SALK / (KHALK + SALK) + // p5: Anoxic growth: muH * etahno3 * kho2 / (kho2 + SO) * SNH / (khnh4 + SNH) * SALK / (khalk + SALK) * SNO / (khn03 + SNO)* (XSTO / XH_S) / (khsto + (XSTO/XH)_S) * XH; + d[4][idxSO] = muH * etahno3 + * -kho2 / ((kho2 + SO) * (kho2 + SO)) + * SNH / (khnh4 + SNH) + * SALK / (khalk + SALK) + * (XSTO / XH) / (khsto + (XSTO / XH)) + * SNO / (khn03 + SNO) * XH; + d[4][idxSNH] = muH * etahno3 + * kho2 / (kho2 + SO) + * khnh4 / ((khnh4 + SNH) * (khnh4 + SNH)) + * SALK / (khalk + SALK) + * (XSTO / XH) / (khsto + (XSTO / XH)) + * SNO / (khn03 + SNO) * XH; + d[4][idxSALK] = muH * etahno3 + * kho2 / (kho2 + SO) + * SNH / (khnh4 + SNH) + * khalk / ((khalk + SALK) * (khalk + SALK)) + * (XSTO / XH) / (khsto + (XSTO / XH)) + * SNO / (khn03 + SNO) * XH; + d[4][idxSNO] = muH * etahno3 + * kho2 / (kho2 + SO) + * SNH / (khnh4 + SNH) + * SALK / (khalk + SALK) + * (XSTO / XH) / (khsto + (XSTO / XH)) + * khn03 / ((khn03 + SNO) * (khn03 + SNO)) * XH; + d[4][idxXSTO] = muH * etahno3 + * kho2 / (kho2 + SO) + * SNH / (khnh4 + SNH) + * SALK / (khalk + SALK) * (1.0 / XH) - * SNO / (KHNO3 + SNO) - * (KHSTO * XH * XH) / ((XSTO + KHSTO * XH) * (XSTO + KHSTO * XH)) * XH; - d[4][idxXH] = muH * etaHNO3 - * KHO2 / (KHO2 + SO) - * SNH / (KHNH4 + SNH) - * SALK / (KHALK + SALK) - * SNO / (KHNO3 + SNO) - * (XSTO * XSTO) / ((XSTO + KHSTO * XH) * (XSTO + KHSTO * XH)); + * SNO / (khn03 + SNO) + * (khsto * XH * XH) / ((XSTO + khsto * XH) * (XSTO + khsto * XH)) * XH; + d[4][idxXH] = muH * etahno3 + * kho2 / (kho2 + SO) + * SNH / (khnh4 + SNH) + * SALK / (khalk + SALK) + * SNO / (khn03 + SNO) + * (XSTO * XSTO) / ((XSTO + khsto * XH) * (XSTO + khsto * XH)); if (XH < 0.1) { - d[4][idxSO] = muH * etaHNO3 - * -KHO2 / ((KHO2 + SO) * (KHO2 + SO)) - * SNH / (KHNH4 + SNH) - * SALK / (KHALK + SALK) - * (XSTO / 0.1) / (KHSTO + (XSTO / 0.1)) - * SNO / (KHNO3 + SNO) * 0.1; - d[4][idxSNH] = muH * etaHNO3 - * KHO2 / (KHO2 + SO) - * KHNH4 / ((KHNH4 + SNH) * (KHNH4 + SNH)) - * SALK / (KHALK + SALK) - * (XSTO / 0.1) / (KHSTO + (XSTO / 0.1)) - * SNO / (KHNO3 + SNO) * 0.1; - d[4][idxSALK] = muH * etaHNO3 - * KHO2 / (KHO2 + SO) - * SNH / (KHNH4 + SNH) - * KHALK / ((KHALK + SALK) * (KHALK + SALK)) - * (XSTO / 0.1) / (KHSTO + (XSTO / 0.1)) - * SNO / (KHNO3 + SNO) * 0.1; - d[4][idxSNO] = muH * etaHNO3 - * KHO2 / (KHO2 + SO) - * SNH / (KHNH4 + SNH) - * SALK / (KHALK + SALK) - * (XSTO / 0.1) / (KHSTO + (XSTO / 0.1)) - * KHNO3 / ((KHNO3 + SNO) * (KHNO3 + SNO)) * 0.1; - d[4][idxXSTO] = muH * etaHNO3 - * KHO2 / (KHO2 + SO) - * SNH / (KHNH4 + SNH) - * SALK / (KHALK + SALK) + d[4][idxSO] = muH * etahno3 + * -kho2 / ((kho2 + SO) * (kho2 + SO)) + * SNH / (khnh4 + SNH) + * SALK / (khalk + SALK) + * (XSTO / 0.1) / (khsto + (XSTO / 0.1)) + * SNO / (khn03 + SNO) * 0.1; + d[4][idxSNH] = muH * etahno3 + * kho2 / (kho2 + SO) + * khnh4 / ((khnh4 + SNH) * (khnh4 + SNH)) + * SALK / (khalk + SALK) + * (XSTO / 0.1) / (khsto + (XSTO / 0.1)) + * SNO / (khn03 + SNO) * 0.1; + d[4][idxSALK] = muH * etahno3 + * kho2 / (kho2 + SO) + * SNH / (khnh4 + SNH) + * khalk / ((khalk + SALK) * (khalk + SALK)) + * (XSTO / 0.1) / (khsto + (XSTO / 0.1)) + * SNO / (khn03 + SNO) * 0.1; + d[4][idxSNO] = muH * etahno3 + * kho2 / (kho2 + SO) + * SNH / (khnh4 + SNH) + * SALK / (khalk + SALK) + * (XSTO / 0.1) / (khsto + (XSTO / 0.1)) + * khn03 / ((khn03 + SNO) * (khn03 + SNO)) * 0.1; + d[4][idxXSTO] = muH * etahno3 + * kho2 / (kho2 + SO) + * SNH / (khnh4 + SNH) + * SALK / (khalk + SALK) * (1.0 / 0.1) - * SNO / (KHNO3 + SNO) - * (KHSTO * 0.1 * 0.1) / ((XSTO + KHSTO * 0.1) * (XSTO + KHSTO * 0.1)) * 0.1; + * SNO / (khn03 + SNO) + * (khsto * 0.1 * 0.1) / ((XSTO + khsto * 0.1) * (XSTO + khsto * 0.1)) * 0.1; d[4][idxXH] = 0.0; } - //reaction6: bH * SO / (SO + KHO2) * XH; + //reaction6: bH * SO / (SO + kho2) * XH; d[5][idxSO] = bH - * KHO2 / ((SO + KHO2) * (SO + KHO2)) * XH; - d[5][idxXH] = bH * SO / (SO + KHO2); - - //reaction7: bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XH; - d[6][idxSO] = bH * etaHend - * -KHO2 / ((SO + KHO2) * (SO + KHO2)) - * SNO / (SNO + KHNO3) * XH; - d[6][idxSNO] = bH * etaHend - * KHO2 / (SO + KHO2) - * KHNO3 / ((SNO + KHNO3) * (SNO + KHNO3)) * XH; - d[6][idxXH] = bH * etaHend - * KHO2 / (SO + KHO2) - * SNO / (SNO + KHNO3); - - //reaction8: bH * SO / (SO + KHO2) * XSTO; + * kho2 / ((SO + kho2) * (SO + kho2)) * XH; + d[5][idxXH] = bH * SO / (SO + kho2); + + //reaction7: bH * etahend * kho2 / (SO + kho2) * SNO / (SNO + khn03) * XH; + d[6][idxSO] = bH * etahend + * -kho2 / ((SO + kho2) * (SO + kho2)) + * SNO / (SNO + khn03) * XH; + d[6][idxSNO] = bH * etahend + * kho2 / (SO + kho2) + * khn03 / ((SNO + khn03) * (SNO + khn03)) * XH; + d[6][idxXH] = bH * etahend + * kho2 / (SO + kho2) + * SNO / (SNO + khn03); + + //reaction8: bH * SO / (SO + kho2) * XSTO; d[7][idxSO] = bH - * KHO2 / ((SO + KHO2) * (SO + KHO2)) * XSTO; - d[7][idxXSTO] = bH * SO / (SO + KHO2); - - //reaction9: bH * etaHend * KHO2 / (SO + KHO2) * SNO / (SNO + KHNO3) * XSTO; - d[8][idxSO] = bH * etaHend - * -KHO2 / ((SO + KHO2) * (SO + KHO2)) - * SNO / (SNO + KHNO3) * XSTO; - d[8][idxSNO] = bH * etaHend - * KHO2 / (SO + KHO2) - * KHNO3 / ((SNO + KHNO3) * (SNO + KHNO3)) * XSTO; - d[8][idxXSTO] = bH * etaHend - * KHO2 / (SO + KHO2) - * SNO / (SNO + KHNO3); - - //reaction10: muAUT * SO / (SO + KNO2) * SNH / (SNH + KNNH4) * SALK / (SALK + KNALK) * XA; + * kho2 / ((SO + kho2) * (SO + kho2)) * XSTO; + d[7][idxXSTO] = bH * SO / (SO + kho2); + + //reaction9: bH * etahend * kho2 / (SO + kho2) * SNO / (SNO + khn03) * XSTO; + d[8][idxSO] = bH * etahend + * -kho2 / ((SO + kho2) * (SO + kho2)) + * SNO / (SNO + khn03) * XSTO; + d[8][idxSNO] = bH * etahend + * kho2 / (SO + kho2) + * khn03 / ((SNO + khn03) * (SNO + khn03)) * XSTO; + d[8][idxXSTO] = bH * etahend + * kho2 / (SO + kho2) + * SNO / (SNO + khn03); + + //reaction10: muAUT * SO / (SO + kno2) * SNH / (SNH + knnh4) * SALK / (SALK + knalk) * XA; d[9][idxSO] = muAUT - * KNO2 / ((SO + KNO2) * (SO + KNO2)) - * SNH / (SNH + KNNH4) - * SALK / (SALK + KNALK) * XA; + * kno2 / ((SO + kno2) * (SO + kno2)) + * SNH / (SNH + knnh4) + * SALK / (SALK + knalk) * XA; d[9][idxSALK] = muAUT - * SO / (SO + KNO2) - * SNH / (SNH + KNNH4) - * KNALK / ((SALK + KNALK) * (SALK + KNALK)) * XA; + * SO / (SO + kno2) + * SNH / (SNH + knnh4) + * knalk / ((SALK + knalk) * (SALK + knalk)) * XA; d[9][idxSNH] = muAUT - * SO / (SO + KNO2) - * SALK / (SALK + KNALK) - * KNNH4 / ((SNH + KNNH4) * (SNH + KNNH4)) * XA; + * SO / (SO + kno2) + * SALK / (SALK + knalk) + * knnh4 / ((SNH + knnh4) * (SNH + knnh4)) * XA; d[9][idxXA] = muAUT - * SO / (SO + KNO2) - * SNH / (SNH + KNNH4) - * SALK / (SALK + KNALK); + * SO / (SO + kno2) + * SNH / (SNH + knnh4) + * SALK / (SALK + knalk); - //reaction11: bAUT * SO / (SO + KHO2) * XA; + //reaction11: bAUT * SO / (SO + kho2) * XA; d[10][idxSO] = bAUT - * KHO2 / ((SO + KHO2) * (SO + KHO2)) * XA; + * kho2 / ((SO + kho2) * (SO + kho2)) * XA; d[10][idxXA] = bAUT - * SO / (SO + KHO2); - - //reaction12: bAUT * etaNend * SNO / (SNO + KHNO3) * KHO2 / (SO + KHO2) * XA; - d[11][idxSO] = bAUT * etaNend - * SNO / (SNO + KHNO3) - * -KHO2 / ((SO + KHO2) * (SO + KHO2)) * XA; - d[11][idxSNO] = bAUT * etaNend - * KHO2 / (SO + KHO2) - * KHNO3 / ((SNO + KHNO3) * (SNO + KHNO3)) * XA; - d[11][idxXA] = bAUT * etaNend - * SNO / (SNO + KHNO3) - * KHO2 / (SO + KHO2); + * SO / (SO + kho2); + + //reaction12: bAUT * etanend * SNO / (SNO + khn03) * kho2 / (SO + kho2) * XA; + d[11][idxSO] = bAUT * etanend + * SNO / (SNO + khn03) + * -kho2 / ((SO + kho2) * (SO + kho2)) * XA; + d[11][idxSNO] = bAUT * etanend + * kho2 / (SO + kho2) + * khn03 / ((SNO + khn03) * (SNO + khn03)) * XA; + d[11][idxXA] = bAUT * etanend + * SNO / (SNO + khn03) + * kho2 / (SO + kho2); RowIterator curJac = jac; From 94a0a999e1656784e973f3ae359cea8e504b5910 Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Fri, 6 Jun 2025 08:43:13 +0200 Subject: [PATCH 32/47] add example set up for cadet_python to doc --- .../reaction/activated_sludge_model.rst | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/doc/interface/reaction/activated_sludge_model.rst b/doc/interface/reaction/activated_sludge_model.rst index 71c9c98b2..1e65b3704 100644 --- a/doc/interface/reaction/activated_sludge_model.rst +++ b/doc/interface/reaction/activated_sludge_model.rst @@ -194,3 +194,58 @@ Saturation/inhibition coefficients ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== + +Example +------- + +.. python:: + + # Example of setting up an ASM3 reaction model in a unit operation with bulk reaction + + # Setup ASM3 reaction for unit 000 with example values + model.root.input.model.unit_000.reaction_model = 'ACTIVATED_SLUDGE_MODEL3' + model.root.input.model.unit_000.reaction_bulk.asm3_insi = 0.01 + model.root.input.model.unit_000.reaction_bulk.asm3_inss = 0.03 + model.root.input.model.unit_000.reaction_bulk.asm3_inxi = 0.04 + model.root.input.model.unit_000.reaction_bulk.asm3_inxs = 0.03 + model.root.input.model.unit_000.reaction_bulk.asm3_inbm = 0.07 + model.root.input.model.unit_000.reaction_bulk.asm3_ivss_xi = 0.751879699 # not used + model.root.input.model.unit_000.reaction_bulk.asm3_ivss_xs = 0.555555556 # not used + model.root.input.model.unit_000.reaction_bulk.asm3_ivss_sto = 0.6 # not used + model.root.input.model.unit_000.reaction_bulk.asm3_ivss_bm = 0.704225352 + model.root.input.model.unit_000.reaction_bulk.asm3_itss_vss_bm = 1.086956522 + + + model.root.input.model.unit_000.reaction_bulk.asm3_fiss_bm_prod = 1 + model.root.input.model.unit_000.reaction_bulk.asm3_fsi = 0 + model.root.input.model.unit_000.reaction_bulk.asm3_yh_aer = 0.8 + model.root.input.model.unit_000.reaction_bulk.asm3_yh_anox = 0.65 + + model.root.input.model.unit_000.reaction_bulk.asm3_ysto_aer = 0.8375 + model.root.input.model.unit_000.reaction_bulk.asm3_ysto_anox = 0.7 + model.root.input.model.unit_000.reaction_bulk.asm3_fxi = 0.2 + model.root.input.model.unit_000.reaction_bulk.asm3_ya = 0.24 + model.root.input.model.unit_000.reaction_bulk.asm3_kh20 = 9 + model.root.input.model.unit_000.reaction_bulk.asm3_kx = 1 + model.root.input.model.unit_000.reaction_bulk.asm3_ksto20 = 12 + model.root.input.model.unit_000.reaction_bulk.asm3_mu_h20 = 3 + model.root.input.model.unit_000.reaction_bulk.asm3_bh20 = 0.33 + model.root.input.model.unit_000.reaction_bulk.asm3_eta_hno3 = 0.5 + model.root.input.model.unit_000.reaction_bulk.asm3_khO2 = 0.2 + model.root.input.model.unit_000.reaction_bulk.asm3_khss = 10 + model.root.input.model.unit_000.reaction_bulk.asm3_khno3 = 0.5 + model.root.input.model.unit_000.reaction_bulk.asm3_khnh4 = 0.01 + model.root.input.model.unit_000.reaction_bulk.asm3_khalk = 0.1 + model.root.input.model.unit_000.reaction_bulk.asm3_khsto = 0.1 + model.root.input.model.unit_000.reaction_bulk.asm3_mu_aut20 = 1.12 + model.root.input.model.unit_000.reaction_bulk.asm3_baut20 = 0.18 + model.root.input.model.unit_000.reaction_bulk.asm3_etah_end = 0.5 + model.root.input.model.unit_000.reaction_bulk.asm3_etan_end = 0.5 + model.root.input.model.unit_000.reaction_bulk.asm3_kno2 = 0.5 + model.root.input.model.unit_000.reaction_bulk.asm3_knnh4 = 0.7 + model.root.input.model.unit_000.reaction_bulk.asm3_knalk = 0.5 + model.root.input.model.unit_000.reaction_bulk.asm3_t = 12 + + + model.root.input.model.unit_000.reaction_bulk.asm3_v = 1000.0 + model.root.input.model.unit_000.reaction_bulk.asm3_io2 = 0.0 From 1d92cd13a9bf17783bcade1acc4d22761986abe0 Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Fri, 6 Jun 2025 08:43:54 +0200 Subject: [PATCH 33/47] fixup! add example set up for cadet_python to doc --- doc/interface/reaction/activated_sludge_model.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/interface/reaction/activated_sludge_model.rst b/doc/interface/reaction/activated_sludge_model.rst index 1e65b3704..8093f2e9b 100644 --- a/doc/interface/reaction/activated_sludge_model.rst +++ b/doc/interface/reaction/activated_sludge_model.rst @@ -209,9 +209,9 @@ Example model.root.input.model.unit_000.reaction_bulk.asm3_inxi = 0.04 model.root.input.model.unit_000.reaction_bulk.asm3_inxs = 0.03 model.root.input.model.unit_000.reaction_bulk.asm3_inbm = 0.07 - model.root.input.model.unit_000.reaction_bulk.asm3_ivss_xi = 0.751879699 # not used - model.root.input.model.unit_000.reaction_bulk.asm3_ivss_xs = 0.555555556 # not used - model.root.input.model.unit_000.reaction_bulk.asm3_ivss_sto = 0.6 # not used + model.root.input.model.unit_000.reaction_bulk.asm3_ivss_xi = 0.751879699 + model.root.input.model.unit_000.reaction_bulk.asm3_ivss_xs = 0.555555556 + model.root.input.model.unit_000.reaction_bulk.asm3_ivss_sto = 0.6 model.root.input.model.unit_000.reaction_bulk.asm3_ivss_bm = 0.704225352 model.root.input.model.unit_000.reaction_bulk.asm3_itss_vss_bm = 1.086956522 From ad9355f6436c5279ae0bf7f7981c9d09a251e47a Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Sat, 7 Jun 2025 10:55:18 +0200 Subject: [PATCH 34/47] start error messaging --- .../reaction/ActivatedSludgeModelThree.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index 46e65bbac..19581f50b 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -195,10 +195,16 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase const double fXI = paramProvider.getDouble("ASM3_FXI"); const double YH_aer = paramProvider.getDouble("ASM3_YH_AER"); + if (YH_aer < 1e-16) + throw InvalidParameterException("ASM3 configuration: YH_aer must be bigger than zero"); const double YH_anox = paramProvider.getDouble("ASM3_YH_ANOX"); const double YSTO_aer = paramProvider.getDouble("ASM3_YSTO_AER"); + if (YSTO_aer < 1e-16) + throw InvalidParameterException("ASM3 configuration: YSTO_aer must be bigger than zero"); const double YSTO_anox = paramProvider.getDouble("ASM3_YSTO_ANOX"); const double YA = paramProvider.getDouble("ASM3_YA"); + if (YA < 1e-16) + throw InvalidParameterException("ASM3 configuration: YA must be bigger than zero"); const double fiSS_BM_prod = paramProvider.getDouble("ASM3_FISS_BM_PROD"); const double iVSS_BM = paramProvider.getDouble("ASM3_IVSS_BM"); @@ -464,6 +470,7 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase { typename ParamHandler_t::ParamsHandle const p = _paramHandler.update(t, secIdx, colPos, _nComp, _nBoundStates, workSpace); + //parameters const double kh20 = static_cast(p->kh20); const double T = static_cast(p->T); const double io2 = static_cast(p->io2); @@ -487,7 +494,6 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase const double baut20 = static_cast(p->baut20); const double etanend = static_cast(p->etanend); - // derived parameters // derived parameters const double ft04 = exp(-0.04 * (20.0 - static_cast(T))); const double ft07 = exp(-0.06952 * (20.0 - static_cast(T))); @@ -530,7 +536,6 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase double d[13][13] = {}; // p1: Hydrolysis: kh20 * ft04 * XS/XH_S / (XS/XH_S + kx) * XH; -// Jacobian: d[0][idxXS] = kh20 * ft04 * XH / ((XS + XH * kx) * (XS + XH * kx)) * XH; @@ -770,11 +775,14 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase RowIterator curJac = jac; - for (size_t rIdx = 0; rIdx < 13; rIdx++) { + for (size_t rIdx = 0; rIdx < 13; rIdx++) + { RowIterator curJac = jac; - for (int row = 0; row < _stoichiometry.rows(); ++row, ++curJac) { + for (int row = 0; row < _stoichiometry.rows(); ++row, ++curJac) + { const double colFactor = static_cast(_stoichiometry.native(row, rIdx)); - for (size_t compIdx = 0; compIdx < _stoichiometry.rows(); compIdx++) { + for (size_t compIdx = 0; compIdx < _stoichiometry.rows(); compIdx++) + { curJac[compIdx - static_cast(row)] += colFactor * d[rIdx][compIdx]; } From 8ab57cfe515f7b87b284ffdbb3a16428bf147de6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Sat, 21 Jun 2025 15:38:23 +0200 Subject: [PATCH 35/47] configurable component index --- .../reaction/ActivatedSludgeModelThree.cpp | 75 +++++++++++++++---- 1 file changed, 62 insertions(+), 13 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index 19581f50b..4c3f81278 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -166,6 +166,20 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase ParamHandler_t _paramHandler; //!< Handles parameters and their dependence on external functions linalg::ActiveDenseMatrix _stoichiometry; + + unsigned int _idxSO; //!< SO component index, default 0 + unsigned int _idxSS; //!< SS component index, default 1 + unsigned int _idxSNH; //!< SNH component index, default 2 + unsigned int _idxSNO; //!< SNO component index, default 3 + unsigned int _idxSN2; //!< SN2 component index, default 4 + unsigned int _idxSALK; //!< SALK component index, default 5 + unsigned int _idxSI; //!< SI component index, default 6 + unsigned int _idxXI; //!< XI component index, default 7 + unsigned int _idxXS; //!< XS component index, default 8 + unsigned int _idxXH; //!< XH component index, default 9 + unsigned int _idxXSTO; //!< XSTO component index, default 10 + unsigned int _idxXA; //!< XA component index, default 11 + unsigned int _idxXMI; //!< XMI component index, default 12 @@ -184,6 +198,41 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.resize(_nComp, 13); _stoichiometry.setAll(0); + const std::vector compIdx = paramProvider.getUint64Array("ASM3_COMP_IDX"); + if (compIdx.size() == 0) { + LOG(Debug) << "ASM3_COMP_IDX not set, using defaults"; + _idxSO = 0; + _idxSS = 1; + _idxSNH = 2; + _idxSNO = 3; + _idxSN2 = 4; + _idxSALK = 5; + _idxSI = 6; + _idxXI = 7; + _idxXS = 8; + _idxXH = 9; + _idxXSTO = 10; + _idxXA = 11; + _idxXMI = 12; + } else if (compIdx.size() != 13) { + throw InvalidParameterException("ASM3 configuration: ASM3_COMP_IDX must have 13 elements"); + } else { + LOG(Debug) << "ASM3_COMP_IDX set: " << compIdx; + _idxSO = compIdx[0]; + _idxSS = compIdx[1]; + _idxSNH = compIdx[2]; + _idxSNO = compIdx[3]; + _idxSN2 = compIdx[4]; + _idxSALK = compIdx[5]; + _idxSI = compIdx[6]; + _idxXI = compIdx[7]; + _idxXS = compIdx[8]; + _idxXH = compIdx[9]; + _idxXSTO = compIdx[10]; + _idxXA = compIdx[11]; + _idxXMI = compIdx[12]; + } + // parameter set ASM3h const double iNSI = paramProvider.getDouble("ASM3_INSI"); const double iNSS = paramProvider.getDouble("ASM3_INSS"); @@ -383,19 +432,19 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase const double muAUT = static_cast(muAUT20) * ft105; const double bAUT = static_cast(baut20) * ft105; - StateType SO = y[0]; - StateType SS = y[1]; - StateType SNH = y[2]; - StateType SNO = y[3]; - StateType SN2 = y[4]; - StateType SALK = y[5]; - // StateType SI = y[6]; // unused - // StateType XI = y[7]; // unused - StateType XS = y[8]; - StateType XH = y[9]; - StateType XSTO = y[10]; - StateType XA = y[11]; - // StateType XMI = y[12]; // unused + StateType SO = y[_idxSO]; + StateType SS = y[_idxSS]; + StateType SNH = y[_idxSNH]; + StateType SNO = y[_idxSNO]; + StateType SN2 = y[_idxSN2]; + StateType SALK = y[_idxSALK]; + // StateType SI = y[_idxSI]; // unused + // StateType XI = y[_idxXI]; // unused + StateType XS = y[_idxXS]; + StateType XH = y[_idxXH]; + StateType XSTO = y[_idxXSTO]; + StateType XA = y[_idxXA]; + // StateType XMI = y[_idxXMI]; // unused // p1: Hydrolysis of organic structures From 3f406b19846b81e55a856e92e11c7a27c5e209ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Sun, 22 Jun 2025 14:04:20 +0200 Subject: [PATCH 36/47] check ASM3_COMP_IDX exists before reading --- .../reaction/ActivatedSludgeModelThree.cpp | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index 4c3f81278..2aa2f65a7 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -198,8 +198,27 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.resize(_nComp, 13); _stoichiometry.setAll(0); - const std::vector compIdx = paramProvider.getUint64Array("ASM3_COMP_IDX"); - if (compIdx.size() == 0) { + if (paramProvider.exists("ASM3_COMP_IDX")) { + const std::vector compIdx = paramProvider.getUint64Array("ASM3_COMP_IDX"); + if (compIdx.size() != 13) { + throw InvalidParameterException("ASM3 configuration: ASM3_COMP_IDX must have 13 elements"); + } else { + LOG(Debug) << "ASM3_COMP_IDX set: " << compIdx; + _idxSO = compIdx[0]; + _idxSS = compIdx[1]; + _idxSNH = compIdx[2]; + _idxSNO = compIdx[3]; + _idxSN2 = compIdx[4]; + _idxSALK = compIdx[5]; + _idxSI = compIdx[6]; + _idxXI = compIdx[7]; + _idxXS = compIdx[8]; + _idxXH = compIdx[9]; + _idxXSTO = compIdx[10]; + _idxXA = compIdx[11]; + _idxXMI = compIdx[12]; + } + } else { LOG(Debug) << "ASM3_COMP_IDX not set, using defaults"; _idxSO = 0; _idxSS = 1; @@ -214,23 +233,6 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _idxXSTO = 10; _idxXA = 11; _idxXMI = 12; - } else if (compIdx.size() != 13) { - throw InvalidParameterException("ASM3 configuration: ASM3_COMP_IDX must have 13 elements"); - } else { - LOG(Debug) << "ASM3_COMP_IDX set: " << compIdx; - _idxSO = compIdx[0]; - _idxSS = compIdx[1]; - _idxSNH = compIdx[2]; - _idxSNO = compIdx[3]; - _idxSN2 = compIdx[4]; - _idxSALK = compIdx[5]; - _idxSI = compIdx[6]; - _idxXI = compIdx[7]; - _idxXS = compIdx[8]; - _idxXH = compIdx[9]; - _idxXSTO = compIdx[10]; - _idxXA = compIdx[11]; - _idxXMI = compIdx[12]; } // parameter set ASM3h From a39e4cdd793fcbf2e7f4fb3941b3fdb6bff11435 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Sun, 22 Jun 2025 18:05:41 +0200 Subject: [PATCH 37/47] document ASM3_COMP_IDX, use bold sub headings --- .../reaction/activated_sludge_model.rst | 45 ++++++++++++++----- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/doc/interface/reaction/activated_sludge_model.rst b/doc/interface/reaction/activated_sludge_model.rst index 8093f2e9b..183e4ed47 100644 --- a/doc/interface/reaction/activated_sludge_model.rst +++ b/doc/interface/reaction/activated_sludge_model.rst @@ -7,8 +7,37 @@ Activated Sludge Model (ASM3h) For information on model equations, refer to :ref:`activated_sludge_model`. -Environment/process parameters ----- +**Component configuration** + +``ASM3_COMP_IDX`` + + Optional component indexes. Set this in case the relevant components start at a certain offset or are provided + in a different order than listed below: + + ============= ========= + **Component** **Index** + ============= ========= + SO 0 + SS 1 + SNH 2 + SNO 3 + SN2 4 + SALK 5 + SI 6 + XI 7 + XS 8 + XH 9 + XSTO 10 + XA 11 + XMI 12 + ============= ========= + + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\mathbb{N}` **Length:** 13 + ================ ============================= ======================================================== + +**Environment/process parameters** ``ASM3_T`` @@ -34,8 +63,7 @@ Environment/process parameters **Type:** double **Range:** :math:`\ge 0` **Length:** 1 ================ ============================= ======================================================== -Maximum rates ----- +**Maximum rates** ``ASM3_KH20`` @@ -85,8 +113,7 @@ Maximum rates **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== -Anoxic reduction factors ----- +**Anoxic reduction factors** ``ASM3_ETA_HNO3`` @@ -112,8 +139,7 @@ Anoxic reduction factors **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== -Saturation/inhibition coefficients ----- +**Saturation/inhibition coefficients** ``ASM3_KX`` @@ -195,8 +221,7 @@ Saturation/inhibition coefficients **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== -Example -------- +**Example** .. python:: From 775b437812855bc56a2e93845913c9782626db0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Sun, 22 Jun 2025 22:47:18 +0200 Subject: [PATCH 38/47] update stoichimoetry using custom indexes --- .../reaction/ActivatedSludgeModelThree.cpp | 197 ++++++++---------- 1 file changed, 92 insertions(+), 105 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index 2aa2f65a7..fb92ff237 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -167,19 +167,19 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase linalg::ActiveDenseMatrix _stoichiometry; - unsigned int _idxSO; //!< SO component index, default 0 - unsigned int _idxSS; //!< SS component index, default 1 - unsigned int _idxSNH; //!< SNH component index, default 2 - unsigned int _idxSNO; //!< SNO component index, default 3 - unsigned int _idxSN2; //!< SN2 component index, default 4 - unsigned int _idxSALK; //!< SALK component index, default 5 - unsigned int _idxSI; //!< SI component index, default 6 - unsigned int _idxXI; //!< XI component index, default 7 - unsigned int _idxXS; //!< XS component index, default 8 - unsigned int _idxXH; //!< XH component index, default 9 - unsigned int _idxXSTO; //!< XSTO component index, default 10 - unsigned int _idxXA; //!< XA component index, default 11 - unsigned int _idxXMI; //!< XMI component index, default 12 + unsigned int _idxSO = 0; //!< SO component index, default 0 + unsigned int _idxSS = 1; //!< SS component index, default 1 + unsigned int _idxSNH = 2; //!< SNH component index, default 2 + unsigned int _idxSNO = 3; //!< SNO component index, default 3 + unsigned int _idxSN2 = 4; //!< SN2 component index, default 4 + unsigned int _idxSALK = 5; //!< SALK component index, default 5 + unsigned int _idxSI = 6; //!< SI component index, default 6 + unsigned int _idxXI = 7; //!< XI component index, default 7 + unsigned int _idxXS = 8; //!< XS component index, default 8 + unsigned int _idxXH = 9; //!< XH component index, default 9 + unsigned int _idxXSTO = 10; //!< XSTO component index, default 10 + unsigned int _idxXA = 11; //!< XA component index, default 11 + unsigned int _idxXMI = 12; //!< XMI component index, default 12 @@ -220,19 +220,6 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase } } else { LOG(Debug) << "ASM3_COMP_IDX not set, using defaults"; - _idxSO = 0; - _idxSS = 1; - _idxSNH = 2; - _idxSNO = 3; - _idxSN2 = 4; - _idxSALK = 5; - _idxSI = 6; - _idxXI = 7; - _idxXS = 8; - _idxXH = 9; - _idxXSTO = 10; - _idxXA = 11; - _idxXMI = 12; } // parameter set ASM3h @@ -292,95 +279,95 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase const double c12a = (c12n - c12no) / 14.0; // SO - _stoichiometry.native(0, 1) = YSTO_aer - 1; - _stoichiometry.native(0, 3) = 1 - 1 / YH_aer; - _stoichiometry.native(0, 5) = -1 * (1 - fXI); - _stoichiometry.native(0, 7) = -1; - _stoichiometry.native(0, 9) = -(64.0/14.0) * 1/YA + 1; - _stoichiometry.native(0, 10) = -1 * (1 - fXI); - _stoichiometry.native(0, 12) = 1; + _stoichiometry.native(_idxSO, 1) = YSTO_aer - 1; + _stoichiometry.native(_idxSO, 3) = 1 - 1 / YH_aer; + _stoichiometry.native(_idxSO, 5) = -1 * (1 - fXI); + _stoichiometry.native(_idxSO, 7) = -1; + _stoichiometry.native(_idxSO, 9) = -(64.0/14.0) * 1/YA + 1; + _stoichiometry.native(_idxSO, 10) = -1 * (1 - fXI); + _stoichiometry.native(_idxSO, 12) = 1; // SS - _stoichiometry.native(1, 0) = 1 - fSI; - _stoichiometry.native(1, 1) = -1; - _stoichiometry.native(1, 2) = -1; + _stoichiometry.native(_idxSS, 0) = 1 - fSI; + _stoichiometry.native(_idxSS, 1) = -1; + _stoichiometry.native(_idxSS, 2) = -1; // SNH - _stoichiometry.native(2, 0) = c1n; - _stoichiometry.native(2, 1) = c2n; - _stoichiometry.native(2, 2) = c3n; - _stoichiometry.native(2, 3) = c4n; - _stoichiometry.native(2, 4) = c5n; - _stoichiometry.native(2, 5) = c6n; - _stoichiometry.native(2, 6) = c7n; - _stoichiometry.native(2, 9) = c10n; - _stoichiometry.native(2, 10) = c11n; - _stoichiometry.native(2, 11) = c12n; + _stoichiometry.native(_idxSNH, 0) = c1n; + _stoichiometry.native(_idxSNH, 1) = c2n; + _stoichiometry.native(_idxSNH, 2) = c3n; + _stoichiometry.native(_idxSNH, 3) = c4n; + _stoichiometry.native(_idxSNH, 4) = c5n; + _stoichiometry.native(_idxSNH, 5) = c6n; + _stoichiometry.native(_idxSNH, 6) = c7n; + _stoichiometry.native(_idxSNH, 9) = c10n; + _stoichiometry.native(_idxSNH, 10) = c11n; + _stoichiometry.native(_idxSNH, 11) = c12n; // SNO - _stoichiometry.native(3, 2) = c3no; - _stoichiometry.native(3, 4) = c5no; - _stoichiometry.native(3, 6) = c7no; - _stoichiometry.native(3, 8) = c9no; - _stoichiometry.native(3, 9) = c10no; - _stoichiometry.native(3, 11) = c12no; + _stoichiometry.native(_idxSNO, 2) = c3no; + _stoichiometry.native(_idxSNO, 4) = c5no; + _stoichiometry.native(_idxSNO, 6) = c7no; + _stoichiometry.native(_idxSNO, 8) = c9no; + _stoichiometry.native(_idxSNO, 9) = c10no; + _stoichiometry.native(_idxSNO, 11) = c12no; // SN2 - _stoichiometry.native(4, 2) = -c3no; - _stoichiometry.native(4, 4) = -c5no; - _stoichiometry.native(4, 6) = -c7no; - _stoichiometry.native(4, 8) = -c9no; - _stoichiometry.native(4, 11) = -c12no; + _stoichiometry.native(_idxSN2, 2) = -c3no; + _stoichiometry.native(_idxSN2, 4) = -c5no; + _stoichiometry.native(_idxSN2, 6) = -c7no; + _stoichiometry.native(_idxSN2, 8) = -c9no; + _stoichiometry.native(_idxSN2, 11) = -c12no; // SALK - _stoichiometry.native(5, 0) = c1a; - _stoichiometry.native(5, 1) = c2a; - _stoichiometry.native(5, 2) = c3a; - _stoichiometry.native(5, 3) = c4a; - _stoichiometry.native(5, 4) = c5a; - _stoichiometry.native(5, 5) = c6a; - _stoichiometry.native(5, 6) = c7a; - _stoichiometry.native(5, 8) = c9a; - _stoichiometry.native(5, 9) = c10a; - _stoichiometry.native(5, 10) = c11a; - _stoichiometry.native(5, 11) = c12a; + _stoichiometry.native(_idxSALK, 0) = c1a; + _stoichiometry.native(_idxSALK, 1) = c2a; + _stoichiometry.native(_idxSALK, 2) = c3a; + _stoichiometry.native(_idxSALK, 3) = c4a; + _stoichiometry.native(_idxSALK, 4) = c5a; + _stoichiometry.native(_idxSALK, 5) = c6a; + _stoichiometry.native(_idxSALK, 6) = c7a; + _stoichiometry.native(_idxSALK, 8) = c9a; + _stoichiometry.native(_idxSALK, 9) = c10a; + _stoichiometry.native(_idxSALK, 10) = c11a; + _stoichiometry.native(_idxSALK, 11) = c12a; // SI - _stoichiometry.native(6, 0) = fSI; + _stoichiometry.native(_idxSI, 0) = fSI; // XI - _stoichiometry.native(7, 5) = fXI; - _stoichiometry.native(7, 6) = fXI; - _stoichiometry.native(7, 10) = fXI; - _stoichiometry.native(7, 11) = fXI; + _stoichiometry.native(_idxXI, 5) = fXI; + _stoichiometry.native(_idxXI, 6) = fXI; + _stoichiometry.native(_idxXI, 10) = fXI; + _stoichiometry.native(_idxXI, 11) = fXI; // XS - _stoichiometry.native(8, 0) = -1; + _stoichiometry.native(_idxXS, 0) = -1; // XH - _stoichiometry.native(9, 3) = 1; - _stoichiometry.native(9, 4) = 1; - _stoichiometry.native(9, 5) = -1; - _stoichiometry.native(9, 6) = -1; + _stoichiometry.native(_idxXH, 3) = 1; + _stoichiometry.native(_idxXH, 4) = 1; + _stoichiometry.native(_idxXH, 5) = -1; + _stoichiometry.native(_idxXH, 6) = -1; // XSTO - _stoichiometry.native(10, 1) = YSTO_aer; - _stoichiometry.native(10, 2) = YSTO_anox; - _stoichiometry.native(10, 3) = -1 / YH_aer; - _stoichiometry.native(10, 4) = -1 / YH_anox; - _stoichiometry.native(10, 7) = -1; - _stoichiometry.native(10, 8) = -1; + _stoichiometry.native(_idxXSTO, 1) = YSTO_aer; + _stoichiometry.native(_idxXSTO, 2) = YSTO_anox; + _stoichiometry.native(_idxXSTO, 3) = -1 / YH_aer; + _stoichiometry.native(_idxXSTO, 4) = -1 / YH_anox; + _stoichiometry.native(_idxXSTO, 7) = -1; + _stoichiometry.native(_idxXSTO, 8) = -1; // XA - _stoichiometry.native(11, 9) = 1; - _stoichiometry.native(11, 10) = -1; - _stoichiometry.native(11, 11) = -1; + _stoichiometry.native(_idxXA, 9) = 1; + _stoichiometry.native(_idxXA, 10) = -1; + _stoichiometry.native(_idxXA, 11) = -1; // XMI - _stoichiometry.native(12, 5) = fXMI_BM; - _stoichiometry.native(12, 6) = fXMI_BM; - _stoichiometry.native(12, 10) = fXMI_BM; - _stoichiometry.native(12, 11) = fXMI_BM; + _stoichiometry.native(_idxXMI, 5) = fXMI_BM; + _stoichiometry.native(_idxXMI, 6) = fXMI_BM; + _stoichiometry.native(_idxXMI, 10) = fXMI_BM; + _stoichiometry.native(_idxXMI, 11) = fXMI_BM; @@ -571,20 +558,20 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase //XH_S = max(XH, 0.1) const size_t idxSO = 0; - const size_t idxSS = 1; - const size_t idxSNH = 2; - const size_t idxSNO = 3; - const size_t idxSN2 = 4; - const size_t idxSALK = 5; - const size_t idxSI = 6; - const size_t idxXI = 7; - const size_t idxXS = 8; - const size_t idxXH = 9; - const size_t idxXSTO = 10; - const size_t idxXA = 11; - const size_t idxXMI = 12; - - double d[13][13] = {}; + const size_t idxSS = 1; + const size_t idxSNH = 2; + const size_t idxSNO = 3; + const size_t idxSN2 = 4; + const size_t idxSALK = 5; + const size_t idxSI = 6; + const size_t idxXI = 7; + const size_t idxXS = 8; + const size_t idxXH = 9; + const size_t idxXSTO = 10; + const size_t idxXA = 11; + const size_t idxXMI = 12; + + double d[13][13] = {}; // p1: Hydrolysis: kh20 * ft04 * XS/XH_S / (XS/XH_S + kx) * XH; d[0][idxXS] = kh20 * ft04 From 05c40fddac08bea5b0747b68273670665177372d Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Mon, 30 Jun 2025 11:52:23 +0200 Subject: [PATCH 39/47] Seperation of SS and SI and flexible index for jacobinan --- .../reaction/ActivatedSludgeModelThree.cpp | 229 ++++++++++-------- 1 file changed, 129 insertions(+), 100 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index fb92ff237..1a4b1a109 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -168,18 +168,22 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase linalg::ActiveDenseMatrix _stoichiometry; unsigned int _idxSO = 0; //!< SO component index, default 0 - unsigned int _idxSS = 1; //!< SS component index, default 1 + unsigned int _idxSS_ad = 1; //!< SS / SS_ad component index, default 1 unsigned int _idxSNH = 2; //!< SNH component index, default 2 unsigned int _idxSNO = 3; //!< SNO component index, default 3 unsigned int _idxSN2 = 4; //!< SN2 component index, default 4 unsigned int _idxSALK = 5; //!< SALK component index, default 5 - unsigned int _idxSI = 6; //!< SI component index, default 6 + unsigned int _idxSI_bio = 6; //!< SI component index, default 6 unsigned int _idxXI = 7; //!< XI component index, default 7 unsigned int _idxXS = 8; //!< XS component index, default 8 unsigned int _idxXH = 9; //!< XH component index, default 9 unsigned int _idxXSTO = 10; //!< XSTO component index, default 10 unsigned int _idxXA = 11; //!< XA component index, default 11 unsigned int _idxXMI = 12; //!< XMI component index, default 12 + unsigned int _idxSS_nad = 13; //!< SS_nad component index, default 13 + unsigned int _idxSI_nbio = 14; //!< SI_nbio component index, default 14 + + bool _distribution = false; @@ -198,25 +202,34 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.resize(_nComp, 13); _stoichiometry.setAll(0); + if (paramProvider.exists("ASM3_DISTRIBUTION")) + _distribution = paramProvider.getBool("ASM3_DISTRIBUTION") + if (paramProvider.exists("ASM3_COMP_IDX")) { const std::vector compIdx = paramProvider.getUint64Array("ASM3_COMP_IDX"); if (compIdx.size() != 13) { throw InvalidParameterException("ASM3 configuration: ASM3_COMP_IDX must have 13 elements"); } else { LOG(Debug) << "ASM3_COMP_IDX set: " << compIdx; + // todo index fuer SS_nad und SI_nbio nach unten _idxSO = compIdx[0]; - _idxSS = compIdx[1]; + _idxSS_ad = compIdx[1]; _idxSNH = compIdx[2]; _idxSNO = compIdx[3]; _idxSN2 = compIdx[4]; _idxSALK = compIdx[5]; - _idxSI = compIdx[6]; + _idxSI_bio = compIdx[6]; _idxXI = compIdx[7]; _idxXS = compIdx[8]; _idxXH = compIdx[9]; _idxXSTO = compIdx[10]; _idxXA = compIdx[11]; _idxXMI = compIdx[12]; + if (_distribution) + { + _idxSS_nad = compIdx[13]; + _idxSI_nbio = compIdx[14]; + } } } else { LOG(Debug) << "ASM3_COMP_IDX not set, using defaults"; @@ -247,6 +260,14 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase const double fiSS_BM_prod = paramProvider.getDouble("ASM3_FISS_BM_PROD"); const double iVSS_BM = paramProvider.getDouble("ASM3_IVSS_BM"); const double iTSS_VSS_BM = paramProvider.getDouble("ASM3_ITSS_VSS_BM"); + + double r = 0.0; + if (paramProvider.exists("ASM3_R")) + r = paramProvider.getDouble("ASM3_R"); + + double s = 0.0; + if (!paramProvider.exists("ASM3_S")) + s = paramProvider.getDouble("ASM3_S"); // internal variables const double fXMI_BM = fiSS_BM_prod * fXI * iVSS_BM * (iTSS_VSS_BM - 1); @@ -287,10 +308,15 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.native(_idxSO, 10) = -1 * (1 - fXI); _stoichiometry.native(_idxSO, 12) = 1; - // SS - _stoichiometry.native(_idxSS, 0) = 1 - fSI; - _stoichiometry.native(_idxSS, 1) = -1; - _stoichiometry.native(_idxSS, 2) = -1; + // SS_ad + _stoichiometry.native(_idxSS_ad, 0) = (1 - r) * (1 - fSI); + _stoichiometry.native(_idxSS_ad, 1) = -(1 - r); + _stoichiometry.native(_idxSS_ad, 2) = -(1 - r); + + // SS_nad + _stoichiometry.native(_idxSS_nad, 0) = r * (1 - fSI); + _stoichiometry.native(_idxSS_nad, 1) = -r; + _stoichiometry.native(_idxSS_nad, 2) = -r; // SNH _stoichiometry.native(_idxSNH, 0) = c1n; @@ -332,8 +358,11 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.native(_idxSALK, 10) = c11a; _stoichiometry.native(_idxSALK, 11) = c12a; - // SI - _stoichiometry.native(_idxSI, 0) = fSI; + // SI_bio + _stoichiometry.native(_idxSI_bio, 0) = (1 - s) * fSI; + + //SI_nbio + _stoichiometry.native(_idxSI_nbio, 0) = s * fSI; // XI _stoichiometry.native(_idxXI, 5) = fXI; @@ -422,7 +451,10 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase const double bAUT = static_cast(baut20) * ft105; StateType SO = y[_idxSO]; - StateType SS = y[_idxSS]; + StateType SS_ad = y[_idxSS_ad]; + StateType SS_nad = 0.0; + if (_distribution) + SS_nad = y[_idxSS_nad]; StateType SNH = y[_idxSNH]; StateType SNO = y[_idxSNO]; StateType SN2 = y[_idxSN2]; @@ -443,10 +475,10 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase // p2: Aerobic storage of SS - fluxes[1] = k_sto * SO / (SO + kho2) * SS / (SS + khss) * XH; + fluxes[1] = k_sto * SO / (SO + kho2) * ( SS_ad + SS_nad ) / ( ( SS_ad + SS_nad ) + khss ) * XH; // p3: Anoxic storage of SS - fluxes[2] = k_sto * etahno3 * kho2 / (SO + kho2) * SS / (SS + khss) * SNO / (SNO + khn03) * XH; + fluxes[2] = k_sto * etahno3 * kho2 / (SO + kho2) * ( SS_ad + SS_nad ) / ( ( SS_ad + SS_nad ) + khss ) * SNO / (SNO + khn03) * XH; // p4: Aerobic growth of heterotrophic biomass (XH) fluxes[3] = muH * SO / (SO + kho2) * SNH / (SNH + khnh4) * SALK / (SALK + khalk) * ((XSTO/XH)) / (((XSTO/XH)) + khsto) * XH; @@ -542,42 +574,31 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase const double muAUT = static_cast(muAUT20) * ft105; const double bAUT = static_cast(baut20) * ft105; - double SO = y[0]; - double SS = y[1]; - double SNH = y[2]; - double SNO = y[3]; - double SN2 = y[4]; - double SALK = y[5]; - double SI = y[6]; // unused - double XI = y[7]; // unused - double XS = y[8]; - double XH = y[9]; - double XSTO = y[10]; - double XA = y[11]; - double XMI = y[12]; // unused + double SO = y[_idxSO]; + double SS_ad = y[_idxSS_ad]; + double SS_nad = 0.0; + if (_distribution) + SS_nad = y[_idxSS_nad]; + double SNH = y[_idxSNH]; + double SNO = y[_idxSNO]; + double SN2 = y[_idxSN2]; + double SALK = y[_idxSALK]; + //double SI_bio = y[_idxSI_bio]; // unused + //double XI = y[8]; // unused + double XS = y[_idxXS]; + double XH = y[_idxXH]; + double XSTO = y[_idxXSTO]; + double XA = y[_idxXA]; + //double XMI = y[13]; // unused //XH_S = max(XH, 0.1) - const size_t idxSO = 0; - const size_t idxSS = 1; - const size_t idxSNH = 2; - const size_t idxSNO = 3; - const size_t idxSN2 = 4; - const size_t idxSALK = 5; - const size_t idxSI = 6; - const size_t idxXI = 7; - const size_t idxXS = 8; - const size_t idxXH = 9; - const size_t idxXSTO = 10; - const size_t idxXA = 11; - const size_t idxXMI = 12; - double d[13][13] = {}; // p1: Hydrolysis: kh20 * ft04 * XS/XH_S / (XS/XH_S + kx) * XH; - d[0][idxXS] = kh20 * ft04 + d[0][_idxXS] = kh20 * ft04 * XH / ((XS + XH * kx) * (XS + XH * kx)) * XH; - d[0][idxXH] = kh20 * ft04 + d[0][_idxXH] = kh20 * ft04 * (XS * XS) / ((XS + kx * XH) * (XS + kx * XH)); if (XH < 0.1) @@ -587,57 +608,65 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase d[0][idxXH] = 0.0; } - // p2: Aerobic storage of SS: k_sto * SO / (SO + kho2) * SS / (SS + khss) * XH; - d[1][idxSO] = k_sto - * SS / (SS + khss) + // p2: Aerobic storage of SS: k_sto * SO / (SO + kho2) * ( SS_ad + SS_nad ) / ( ( SS_ad + SS_nad ) + khss ) * XH; + d[1][_idxSO] = k_sto + * ( SS_ad + SS_nad ) / ( ( SS_ad + SS_nad ) + khss ) * kho2 / ((SO + kho2) * (SO + kho2)) * XH; - d[1][idxSS] = k_sto + // todo ableitung SS_ad und SS_nad + d[1][_idxSS_ad] = k_sto * SO / (SO + kho2) - * khss / ((SS + khss) * (SS + khss)) * XH; - d[1][idxXH] = k_sto + * khss / ((SS_ad + SS_nad + khss) * (SS_ad + SS_nad + khss)) * XH; + d[1][_idxSS_nad] = k_sto * SO / (SO + kho2) - * SS / (SS + khss); + * khss / ((SS_ad + SS_nad + khss) * (SS_ad + SS_nad + khss)) * XH; + d[1][_idxXH] = k_sto + * SO / (SO + kho2) + * ( SS_ad + SS_nad ) / ( ( SS_ad + SS_nad ) + khss ) ; - // p3: Anoxic storage of SS: k_sto * etahno3 * kho2 / (SO + kho2) * SS / (SS + khss) * SNO / (SNO + khn03) * XH; - d[2][idxSO] = k_sto * etahno3 + // p3: Anoxic storage of SS: k_sto * etahno3 * kho2 / (SO + kho2) * ( SS_ad + SS_nad ) / ( ( SS_ad + SS_nad ) + khss ) * SNO / (SNO + khn03) * XH; + d[2][_idxSO] = k_sto * etahno3 * -kho2 / ((SO + kho2) * (SO + kho2)) - * SS / (SS + khss) + * ( SS_ad + SS_nad ) / ( ( SS_ad + SS_nad ) + khss ) + * SNO / (SNO + khn03) * XH; + d[2][_idxSS_ad] = k_sto * etahno3 + * kho2 / (SO + kho2) + * khss / ((SS_ad + SS_nad + khss) * (SS_ad + SS_nad + khss)) * SNO / (SNO + khn03) * XH; - d[2][idxSS] = k_sto * etahno3 + d[2][_idxSS_nad] = k_sto * etahno3 * kho2 / (SO + kho2) - * khss / ((SS + khss) * (SS + khss)) + * khss / ((SS_ad + SS_nad + khss) * (SS_ad + SS_nad + khss)) * SNO / (SNO + khn03) * XH; - d[2][idxSNO] = k_sto * etahno3 + d[2][_idxSNO] = k_sto * etahno3 * kho2 / (SO + kho2) - * SS / (SS + khss) + * ( SS_ad + SS_nad ) / ( ( SS_ad + SS_nad ) + khss ) * khn03 / ((SNO + khn03) * (SNO + khn03)) * XH; - d[2][idxXH] = k_sto * etahno3 + d[2][_idxXH] = k_sto * etahno3 * kho2 / (SO + kho2) - * SS / (SS + khss) + * ( SS_ad + SS_nad ) / ( ( SS_ad + SS_nad ) + khss ) * SNO / (SNO + khn03); // p4: Aerobic growth: muH * SO / (SO + kho2) * SNH / (SNH + khnh4) * SALK / (SALK + khalk) * (XSTO/XH_S) / ((XSTO/XH_S) + khsto) * XH; - d[3][idxSO] = muH + d[3][_idxSO] = muH * kho2 / ((SO + kho2) * (SO + kho2)) * SNH / (SNH + khnh4) * SALK / (SALK + khalk) * (XSTO / XH) / ((XSTO / XH) + khsto) * XH; - d[3][idxSNH] = muH + d[3][_idxSNH] = muH * SO / (SO + kho2) * khnh4 / ((SNH + khnh4) * (SNH + khnh4)) * SALK / (SALK + khalk) * (XSTO / XH) / ((XSTO / XH) + khsto) * XH; - d[3][idxSALK] = muH + d[3][_idxSALK] = muH * SO / (SO + kho2) * SNH / (SNH + khnh4) * khalk / ((SALK + khalk) * (SALK + khalk)) * (XSTO / XH) / ((XSTO / XH) + khsto) * XH; - d[3][idxXSTO] = muH + d[3][_idxXSTO] = muH * SO / (SO + kho2) * SNH / (SNH + khnh4) * SALK / (SALK + khalk) * (khsto * XH) / ((XSTO + khsto * XH) * (XSTO + khsto * XH)) * XH; - d[3][idxXH] = muH + d[3][_idxXH] = muH * SO / (SO + kho2) * SNH / (SNH + khnh4) * SALK / (SALK + khalk) @@ -645,62 +674,62 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase if (XH < 0.1) { - d[3][idxSO] = muH + d[3][_idxSO] = muH * -kho2 / ((SO + kho2) * (SO + kho2)) * SNH / (SNH + khnh4) * SALK / (SALK + khalk) * (XSTO / 0.1) / ((XSTO / 0.1) + khsto) * 0.1; - d[3][idxSNH] = muH + d[3][_idxSNH] = muH * SO / (SO + kho2) * khnh4 / ((SNH + khnh4) * (SNH + khnh4)) * SALK / (SALK + khalk) * (XSTO / 0.1) / ((XSTO / 0.1) + khsto) * 0.1; - d[3][idxSALK] = muH + d[3][_idxSALK] = muH * SO / (SO + kho2) * SNH / (SNH + khnh4) * khalk / ((SALK + khalk) * (SALK + khalk)) * (XSTO / 0.1) / ((XSTO / 0.1) + khsto) * 0.1; - d[3][idxXSTO] = muH + d[3][_idxXSTO] = muH * SO / (SO + kho2) * SNH / (SNH + khnh4) * SALK / (SALK + khalk) * (khsto * 0.1) / ((XSTO + khsto * 0.1) * (XSTO + khsto * 0.1)) * 0.1; - d[3][idxXH] = 0.0; + d[3][_idxXH] = 0.0; } // p5: Anoxic growth: muH * etahno3 * kho2 / (kho2 + SO) * SNH / (khnh4 + SNH) * SALK / (khalk + SALK) * SNO / (khn03 + SNO)* (XSTO / XH_S) / (khsto + (XSTO/XH)_S) * XH; - d[4][idxSO] = muH * etahno3 + d[4][_idxSO] = muH * etahno3 * -kho2 / ((kho2 + SO) * (kho2 + SO)) * SNH / (khnh4 + SNH) * SALK / (khalk + SALK) * (XSTO / XH) / (khsto + (XSTO / XH)) * SNO / (khn03 + SNO) * XH; - d[4][idxSNH] = muH * etahno3 + d[4][_idxSNH] = muH * etahno3 * kho2 / (kho2 + SO) * khnh4 / ((khnh4 + SNH) * (khnh4 + SNH)) * SALK / (khalk + SALK) * (XSTO / XH) / (khsto + (XSTO / XH)) * SNO / (khn03 + SNO) * XH; - d[4][idxSALK] = muH * etahno3 + d[4][_idxSALK] = muH * etahno3 * kho2 / (kho2 + SO) * SNH / (khnh4 + SNH) * khalk / ((khalk + SALK) * (khalk + SALK)) * (XSTO / XH) / (khsto + (XSTO / XH)) * SNO / (khn03 + SNO) * XH; - d[4][idxSNO] = muH * etahno3 + d[4][_idxSNO] = muH * etahno3 * kho2 / (kho2 + SO) * SNH / (khnh4 + SNH) * SALK / (khalk + SALK) * (XSTO / XH) / (khsto + (XSTO / XH)) * khn03 / ((khn03 + SNO) * (khn03 + SNO)) * XH; - d[4][idxXSTO] = muH * etahno3 + d[4][_idxXSTO] = muH * etahno3 * kho2 / (kho2 + SO) * SNH / (khnh4 + SNH) * SALK / (khalk + SALK) * (1.0 / XH) * SNO / (khn03 + SNO) * (khsto * XH * XH) / ((XSTO + khsto * XH) * (XSTO + khsto * XH)) * XH; - d[4][idxXH] = muH * etahno3 + d[4][_idxXH] = muH * etahno3 * kho2 / (kho2 + SO) * SNH / (khnh4 + SNH) * SALK / (khalk + SALK) @@ -710,110 +739,110 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase if (XH < 0.1) { - d[4][idxSO] = muH * etahno3 + d[4][_idxSO] = muH * etahno3 * -kho2 / ((kho2 + SO) * (kho2 + SO)) * SNH / (khnh4 + SNH) * SALK / (khalk + SALK) * (XSTO / 0.1) / (khsto + (XSTO / 0.1)) * SNO / (khn03 + SNO) * 0.1; - d[4][idxSNH] = muH * etahno3 + d[4][_idxSNH] = muH * etahno3 * kho2 / (kho2 + SO) * khnh4 / ((khnh4 + SNH) * (khnh4 + SNH)) * SALK / (khalk + SALK) * (XSTO / 0.1) / (khsto + (XSTO / 0.1)) * SNO / (khn03 + SNO) * 0.1; - d[4][idxSALK] = muH * etahno3 + d[4][_idxSALK] = muH * etahno3 * kho2 / (kho2 + SO) * SNH / (khnh4 + SNH) * khalk / ((khalk + SALK) * (khalk + SALK)) * (XSTO / 0.1) / (khsto + (XSTO / 0.1)) * SNO / (khn03 + SNO) * 0.1; - d[4][idxSNO] = muH * etahno3 + d[4][_idxSNO] = muH * etahno3 * kho2 / (kho2 + SO) * SNH / (khnh4 + SNH) * SALK / (khalk + SALK) * (XSTO / 0.1) / (khsto + (XSTO / 0.1)) * khn03 / ((khn03 + SNO) * (khn03 + SNO)) * 0.1; - d[4][idxXSTO] = muH * etahno3 + d[4][_idxXSTO] = muH * etahno3 * kho2 / (kho2 + SO) * SNH / (khnh4 + SNH) * SALK / (khalk + SALK) * (1.0 / 0.1) * SNO / (khn03 + SNO) * (khsto * 0.1 * 0.1) / ((XSTO + khsto * 0.1) * (XSTO + khsto * 0.1)) * 0.1; - d[4][idxXH] = 0.0; + d[4][_idxXH] = 0.0; } //reaction6: bH * SO / (SO + kho2) * XH; - d[5][idxSO] = bH + d[5][_idxSO] = bH * kho2 / ((SO + kho2) * (SO + kho2)) * XH; - d[5][idxXH] = bH * SO / (SO + kho2); + d[5][_idxXH] = bH * SO / (SO + kho2); //reaction7: bH * etahend * kho2 / (SO + kho2) * SNO / (SNO + khn03) * XH; - d[6][idxSO] = bH * etahend + d[6][_idxSO] = bH * etahend * -kho2 / ((SO + kho2) * (SO + kho2)) * SNO / (SNO + khn03) * XH; - d[6][idxSNO] = bH * etahend + d[6][_idxSNO] = bH * etahend * kho2 / (SO + kho2) * khn03 / ((SNO + khn03) * (SNO + khn03)) * XH; - d[6][idxXH] = bH * etahend + d[6][_idxXH] = bH * etahend * kho2 / (SO + kho2) * SNO / (SNO + khn03); //reaction8: bH * SO / (SO + kho2) * XSTO; - d[7][idxSO] = bH + d[7][_idxSO] = bH * kho2 / ((SO + kho2) * (SO + kho2)) * XSTO; - d[7][idxXSTO] = bH * SO / (SO + kho2); + d[7][_idxXSTO] = bH * SO / (SO + kho2); //reaction9: bH * etahend * kho2 / (SO + kho2) * SNO / (SNO + khn03) * XSTO; - d[8][idxSO] = bH * etahend + d[8][_idxSO] = bH * etahend * -kho2 / ((SO + kho2) * (SO + kho2)) * SNO / (SNO + khn03) * XSTO; - d[8][idxSNO] = bH * etahend + d[8][_idxSNO] = bH * etahend * kho2 / (SO + kho2) * khn03 / ((SNO + khn03) * (SNO + khn03)) * XSTO; - d[8][idxXSTO] = bH * etahend + d[8][_idxXSTO] = bH * etahend * kho2 / (SO + kho2) * SNO / (SNO + khn03); //reaction10: muAUT * SO / (SO + kno2) * SNH / (SNH + knnh4) * SALK / (SALK + knalk) * XA; - d[9][idxSO] = muAUT + d[9][_idxSO] = muAUT * kno2 / ((SO + kno2) * (SO + kno2)) * SNH / (SNH + knnh4) * SALK / (SALK + knalk) * XA; - d[9][idxSALK] = muAUT + d[9][_idxSALK] = muAUT * SO / (SO + kno2) * SNH / (SNH + knnh4) * knalk / ((SALK + knalk) * (SALK + knalk)) * XA; - d[9][idxSNH] = muAUT + d[9][_idxSNH] = muAUT * SO / (SO + kno2) * SALK / (SALK + knalk) * knnh4 / ((SNH + knnh4) * (SNH + knnh4)) * XA; - d[9][idxXA] = muAUT + d[9][_idxXA] = muAUT * SO / (SO + kno2) * SNH / (SNH + knnh4) * SALK / (SALK + knalk); //reaction11: bAUT * SO / (SO + kho2) * XA; - d[10][idxSO] = bAUT + d[10][_idxSO] = bAUT * kho2 / ((SO + kho2) * (SO + kho2)) * XA; - d[10][idxXA] = bAUT + d[10][_idxXA] = bAUT * SO / (SO + kho2); //reaction12: bAUT * etanend * SNO / (SNO + khn03) * kho2 / (SO + kho2) * XA; - d[11][idxSO] = bAUT * etanend + d[11][_idxSO] = bAUT * etanend * SNO / (SNO + khn03) * -kho2 / ((SO + kho2) * (SO + kho2)) * XA; - d[11][idxSNO] = bAUT * etanend + d[11][_idxSNO] = bAUT * etanend * kho2 / (SO + kho2) * khn03 / ((SNO + khn03) * (SNO + khn03)) * XA; - d[11][idxXA] = bAUT * etanend + d[11][_idxXA] = bAUT * etanend * SNO / (SNO + khn03) * kho2 / (SO + kho2); RowIterator curJac = jac; - for (size_t rIdx = 0; rIdx < 13; rIdx++) + for (size_t rIdx = 0; rIdx < _stoichiometry.columns(); rIdx++) { RowIterator curJac = jac; for (int row = 0; row < _stoichiometry.rows(); ++row, ++curJac) From f3341970d1212e1f26f52c90a9c1848cf03b7720 Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Mon, 30 Jun 2025 12:00:15 +0200 Subject: [PATCH 40/47] fixup! Seperation of SS and SI and flexible index for jacobinan --- src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index 1a4b1a109..db04f42fd 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -682,6 +682,7 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase d[3][_idxSNH] = muH * SO / (SO + kho2) * khnh4 / ((SNH + khnh4) * (SNH + khnh4)) + * khnh4 / ((SNH + khnh4) * (SNH + khnh4)) * SALK / (SALK + khalk) * (XSTO / 0.1) / ((XSTO / 0.1) + khsto) * 0.1; d[3][_idxSALK] = muH From 12a4376ed1623d9fbd007b2bafbf6b6c0dca2d20 Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Mon, 30 Jun 2025 14:56:38 +0200 Subject: [PATCH 41/47] Add time dependent fraction --- .../reaction/ActivatedSludgeModelThree.cpp | 174 +++++++++--------- 1 file changed, 87 insertions(+), 87 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index db04f42fd..55e96d698 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -173,7 +173,7 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase unsigned int _idxSNO = 3; //!< SNO component index, default 3 unsigned int _idxSN2 = 4; //!< SN2 component index, default 4 unsigned int _idxSALK = 5; //!< SALK component index, default 5 - unsigned int _idxSI_bio = 6; //!< SI component index, default 6 + unsigned int _idxSI_ad = 6; //!< SI component index, default 6 unsigned int _idxXI = 7; //!< XI component index, default 7 unsigned int _idxXS = 8; //!< XS component index, default 8 unsigned int _idxXH = 9; //!< XH component index, default 9 @@ -181,11 +181,11 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase unsigned int _idxXA = 11; //!< XA component index, default 11 unsigned int _idxXMI = 12; //!< XMI component index, default 12 unsigned int _idxSS_nad = 13; //!< SS_nad component index, default 13 - unsigned int _idxSI_nbio = 14; //!< SI_nbio component index, default 14 + unsigned int _idxSI_nad = 14; //!< SI_nbio component index, default 14 - bool _distribution = false; - + bool _fractionate = false; + virtual bool configureStoich(IParameterProvider& paramProvider, UnitOpIdx unitOpIdx, ParticleTypeIdx parTypeIdx) { @@ -198,40 +198,42 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _paramHandler.configure(paramProvider, _stoichiometry.columns(), _nComp, _nBoundStates); _paramHandler.registerParameters(_parameters, unitOpIdx, parTypeIdx, _nComp, _nBoundStates); - + _stoichiometry.resize(_nComp, 13); _stoichiometry.setAll(0); - if (paramProvider.exists("ASM3_DISTRIBUTION")) - _distribution = paramProvider.getBool("ASM3_DISTRIBUTION") + if (paramProvider.exists("ASM3_FRACTIONATE")) + _fractionate = paramProvider.getBool("ASM3_FRACTIONATE"); if (paramProvider.exists("ASM3_COMP_IDX")) { const std::vector compIdx = paramProvider.getUint64Array("ASM3_COMP_IDX"); if (compIdx.size() != 13) { throw InvalidParameterException("ASM3 configuration: ASM3_COMP_IDX must have 13 elements"); - } else { + } + else { LOG(Debug) << "ASM3_COMP_IDX set: " << compIdx; - // todo index fuer SS_nad und SI_nbio nach unten _idxSO = compIdx[0]; - _idxSS_ad = compIdx[1]; + _idxSS_nad = compIdx[1]; _idxSNH = compIdx[2]; _idxSNO = compIdx[3]; _idxSN2 = compIdx[4]; _idxSALK = compIdx[5]; - _idxSI_bio = compIdx[6]; + _idxSI_nad = compIdx[6]; _idxXI = compIdx[7]; _idxXS = compIdx[8]; _idxXH = compIdx[9]; _idxXSTO = compIdx[10]; _idxXA = compIdx[11]; _idxXMI = compIdx[12]; - if (_distribution) + if (_fractionate) { - _idxSS_nad = compIdx[13]; - _idxSI_nbio = compIdx[14]; + //todo warníng + _idxSS_ad = compIdx[13]; + _idxSI_ad = compIdx[14]; } } - } else { + } + else { LOG(Debug) << "ASM3_COMP_IDX not set, using defaults"; } @@ -260,14 +262,6 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase const double fiSS_BM_prod = paramProvider.getDouble("ASM3_FISS_BM_PROD"); const double iVSS_BM = paramProvider.getDouble("ASM3_IVSS_BM"); const double iTSS_VSS_BM = paramProvider.getDouble("ASM3_ITSS_VSS_BM"); - - double r = 0.0; - if (paramProvider.exists("ASM3_R")) - r = paramProvider.getDouble("ASM3_R"); - - double s = 0.0; - if (!paramProvider.exists("ASM3_S")) - s = paramProvider.getDouble("ASM3_S"); // internal variables const double fXMI_BM = fiSS_BM_prod * fXI * iVSS_BM * (iTSS_VSS_BM - 1); @@ -304,19 +298,19 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.native(_idxSO, 3) = 1 - 1 / YH_aer; _stoichiometry.native(_idxSO, 5) = -1 * (1 - fXI); _stoichiometry.native(_idxSO, 7) = -1; - _stoichiometry.native(_idxSO, 9) = -(64.0/14.0) * 1/YA + 1; + _stoichiometry.native(_idxSO, 9) = -(64.0 / 14.0) * 1 / YA + 1; _stoichiometry.native(_idxSO, 10) = -1 * (1 - fXI); _stoichiometry.native(_idxSO, 12) = 1; // SS_ad - _stoichiometry.native(_idxSS_ad, 0) = (1 - r) * (1 - fSI); - _stoichiometry.native(_idxSS_ad, 1) = -(1 - r); - _stoichiometry.native(_idxSS_ad, 2) = -(1 - r); + _stoichiometry.native(_idxSS_ad, 0) = (1 - fSI); + _stoichiometry.native(_idxSS_ad, 1) = -1; + _stoichiometry.native(_idxSS_ad, 2) = -1; // SS_nad - _stoichiometry.native(_idxSS_nad, 0) = r * (1 - fSI); - _stoichiometry.native(_idxSS_nad, 1) = -r; - _stoichiometry.native(_idxSS_nad, 2) = -r; + _stoichiometry.native(_idxSS_nad, 0) = (1 - fSI); + _stoichiometry.native(_idxSS_nad, 1) = -1; + _stoichiometry.native(_idxSS_nad, 2) = -1; // SNH _stoichiometry.native(_idxSNH, 0) = c1n; @@ -358,11 +352,11 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.native(_idxSALK, 10) = c11a; _stoichiometry.native(_idxSALK, 11) = c12a; - // SI_bio - _stoichiometry.native(_idxSI_bio, 0) = (1 - s) * fSI; + // SI_ad + _stoichiometry.native(_idxSI_bio, 0) = fSI; - //SI_nbio - _stoichiometry.native(_idxSI_nbio, 0) = s * fSI; + //SI_nad + _stoichiometry.native(_idxSI_nbio, 0) = fSI; // XI _stoichiometry.native(_idxXI, 5) = fXI; @@ -399,15 +393,12 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.native(_idxXMI, 11) = fXMI_BM; - - - //registerCompRowMatrix(_parameters, unitOpIdx, parTypeIdx, "MM_STOICHIOMETRY_BULK", _stoichiometryBulk); todo return true; } - template + template int residualLiquidImpl(double t, unsigned int secIdx, const ColumnPosition& colPos, StateType const* y, ResidualType* res, const FactorType& factor, LinearBufferAllocator workSpace) const { @@ -451,10 +442,10 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase const double bAUT = static_cast(baut20) * ft105; StateType SO = y[_idxSO]; - StateType SS_ad = y[_idxSS_ad]; - StateType SS_nad = 0.0; - if (_distribution) - SS_nad = y[_idxSS_nad]; + StateType SS_nad = y[_idxSS_ad]; + StateType SS_ad = 0.0; + if (_fractionate) + SS_ad = y[_idxSS_nad]; StateType SNH = y[_idxSNH]; StateType SNO = y[_idxSNO]; StateType SN2 = y[_idxSN2]; @@ -541,28 +532,28 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase typename ParamHandler_t::ParamsHandle const p = _paramHandler.update(t, secIdx, colPos, _nComp, _nBoundStates, workSpace); //parameters - const double kh20 = static_cast(p->kh20); - const double T = static_cast(p->T); - const double io2 = static_cast(p->io2); - const double V = static_cast(p->V); - const double k_sto20 = static_cast(p->k_sto20); - const double kx = static_cast(p->kx); - const double kho2 = static_cast(p->kho2); - const double khss = static_cast(p->khss); - const double khn03 = static_cast(p->khn03); - const double etahno3 = static_cast(p->etahno3); - const double khnh4 = static_cast(p->khnh4); - const double khalk = static_cast(p->khalk); - const double khsto = static_cast(p->khsto); - const double muh2o = static_cast(p->muh2o); - const double etahend = static_cast(p->etahend); - const double bh20 = static_cast(p->bh20); - const double muAUT20 = static_cast(p->muAUT20); - const double kno2 = static_cast(p->kno2); - const double knnh4 = static_cast(p->knnh4); - const double knalk = static_cast(p->knalk); - const double baut20 = static_cast(p->baut20); - const double etanend = static_cast(p->etanend); + const double kh20 = static_cast(p->kh20); + const double T = static_cast(p->T); + const double io2 = static_cast(p->io2); + const double V = static_cast(p->V); + const double k_sto20 = static_cast(p->k_sto20); + const double kx = static_cast(p->kx); + const double kho2 = static_cast(p->kho2); + const double khss = static_cast(p->khss); + const double khn03 = static_cast(p->khn03); + const double etahno3 = static_cast(p->etahno3); + const double khnh4 = static_cast(p->khnh4); + const double khalk = static_cast(p->khalk); + const double khsto = static_cast(p->khsto); + const double muh2o = static_cast(p->muh2o); + const double etahend = static_cast(p->etahend); + const double bh20 = static_cast(p->bh20); + const double muAUT20 = static_cast(p->muAUT20); + const double kno2 = static_cast(p->kno2); + const double knnh4 = static_cast(p->knnh4); + const double knalk = static_cast(p->knalk); + const double baut20 = static_cast(p->baut20); + const double etanend = static_cast(p->etanend); // derived parameters const double ft04 = exp(-0.04 * (20.0 - static_cast(T))); @@ -577,13 +568,14 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase double SO = y[_idxSO]; double SS_ad = y[_idxSS_ad]; double SS_nad = 0.0; - if (_distribution) + if (_fractionate) SS_nad = y[_idxSS_nad]; double SNH = y[_idxSNH]; double SNO = y[_idxSNO]; double SN2 = y[_idxSN2]; double SALK = y[_idxSALK]; - //double SI_bio = y[_idxSI_bio]; // unused + double SI_ad = y[_idxSI_ad]; // unused + double SI_nad = y[_idxSI_nad]; // unused //double XI = y[8]; // unused double XS = y[_idxXS]; double XH = y[_idxXH]; @@ -592,27 +584,27 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase //double XMI = y[13]; // unused //XH_S = max(XH, 0.1) - double d[13][13] = {}; - + double d[13][15] = {}; + + // p1: Hydrolysis: kh20 * ft04 * XS/XH_S / (XS/XH_S + kx) * XH; d[0][_idxXS] = kh20 * ft04 * XH / ((XS + XH * kx) - * (XS + XH * kx)) * XH; + * (XS + XH * kx)) * XH; d[0][_idxXH] = kh20 * ft04 * (XS * XS) / ((XS + kx * XH) - * (XS + kx * XH)); + * (XS + kx * XH)); if (XH < 0.1) { - d[0][idxXS] = kh20 * ft04 + d[0][_idxXS] = kh20 * ft04 * 0.1 / ((XS + 0.1 * kx) * (XS + 0.1 * kx)) * XH; - d[0][idxXH] = 0.0; + d[0][_idxXH] = 0.0; } // p2: Aerobic storage of SS: k_sto * SO / (SO + kho2) * ( SS_ad + SS_nad ) / ( ( SS_ad + SS_nad ) + khss ) * XH; d[1][_idxSO] = k_sto - * ( SS_ad + SS_nad ) / ( ( SS_ad + SS_nad ) + khss ) + * (SS_ad + SS_nad) / ((SS_ad + SS_nad) + khss) * kho2 / ((SO + kho2) * (SO + kho2)) * XH; - // todo ableitung SS_ad und SS_nad d[1][_idxSS_ad] = k_sto * SO / (SO + kho2) * khss / ((SS_ad + SS_nad + khss) * (SS_ad + SS_nad + khss)) * XH; @@ -621,12 +613,12 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase * khss / ((SS_ad + SS_nad + khss) * (SS_ad + SS_nad + khss)) * XH; d[1][_idxXH] = k_sto * SO / (SO + kho2) - * ( SS_ad + SS_nad ) / ( ( SS_ad + SS_nad ) + khss ) ; + * (SS_ad + SS_nad) / ((SS_ad + SS_nad) + khss); // p3: Anoxic storage of SS: k_sto * etahno3 * kho2 / (SO + kho2) * ( SS_ad + SS_nad ) / ( ( SS_ad + SS_nad ) + khss ) * SNO / (SNO + khn03) * XH; d[2][_idxSO] = k_sto * etahno3 * -kho2 / ((SO + kho2) * (SO + kho2)) - * ( SS_ad + SS_nad ) / ( ( SS_ad + SS_nad ) + khss ) + * (SS_ad + SS_nad) / ((SS_ad + SS_nad) + khss) * SNO / (SNO + khn03) * XH; d[2][_idxSS_ad] = k_sto * etahno3 * kho2 / (SO + kho2) @@ -638,11 +630,11 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase * SNO / (SNO + khn03) * XH; d[2][_idxSNO] = k_sto * etahno3 * kho2 / (SO + kho2) - * ( SS_ad + SS_nad ) / ( ( SS_ad + SS_nad ) + khss ) + * (SS_ad + SS_nad) / ((SS_ad + SS_nad) + khss) * khn03 / ((SNO + khn03) * (SNO + khn03)) * XH; d[2][_idxXH] = k_sto * etahno3 * kho2 / (SO + kho2) - * ( SS_ad + SS_nad ) / ( ( SS_ad + SS_nad ) + khss ) + * (SS_ad + SS_nad) / ((SS_ad + SS_nad) + khss) * SNO / (SNO + khn03); // p4: Aerobic growth: muH * SO / (SO + kho2) * SNH / (SNH + khnh4) * SALK / (SALK + khalk) * (XSTO/XH_S) / ((XSTO/XH_S) + khsto) * XH; @@ -666,7 +658,7 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase * SNH / (SNH + khnh4) * SALK / (SALK + khalk) * (khsto * XH) / ((XSTO + khsto * XH) * (XSTO + khsto * XH)) * XH; - d[3][_idxXH] = muH + d[3][_idxXH] = muH * SO / (SO + kho2) * SNH / (SNH + khnh4) * SALK / (SALK + khalk) @@ -819,9 +811,9 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase * SO / (SO + kno2) * SALK / (SALK + knalk) * knnh4 / ((SNH + knnh4) * (SNH + knnh4)) * XA; - d[9][_idxXA] = muAUT - * SO / (SO + kno2) - * SNH / (SNH + knnh4) + d[9][_idxXA] = muAUT + * SO / (SO + kno2) + * SNH / (SNH + knnh4) * SALK / (SALK + knalk); //reaction11: bAUT * SO / (SO + kho2) * XA; @@ -840,23 +832,31 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase d[11][_idxXA] = bAUT * etanend * SNO / (SNO + khn03) * kho2 / (SO + kho2); - - + + RowIterator curJac = jac; for (size_t rIdx = 0; rIdx < _stoichiometry.columns(); rIdx++) { RowIterator curJac = jac; - for (int row = 0; row < _stoichiometry.rows(); ++row, ++curJac) + for (int row = 0; row < _stoichiometry.rows(); ++row, ++curJac) { const double colFactor = static_cast(_stoichiometry.native(row, rIdx)); - for (size_t compIdx = 0; compIdx < _stoichiometry.rows(); compIdx++) + for (size_t compIdx = 0; compIdx < _stoichiometry.rows(); compIdx++) { + if (compIdx == _idxSI_ad) + colFactor *= SI_ad / (SI_ad + SI_nad); + if (compIdx == _idxSI_nad) + colFactor *= SI_nad / (SI_ad + SI_nad); + if (compIdx == _idxSS_ad) + colFactor *= SS_ad / (SS_ad + SS_nad); + if (compIdx == _idxSS_nad) + colFactor *= SS_nad / (SS_ad + SS_nad); curJac[compIdx - static_cast(row)] += colFactor * d[rIdx][compIdx]; } } } - + } template From b0f2bfc68453d4db9e1ddf61e038b61f205cfb01 Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Mon, 4 Aug 2025 11:32:40 +0200 Subject: [PATCH 42/47] clean up for fractionate option --- .../reaction/ActivatedSludgeModelThree.cpp | 87 ++++++++++--------- 1 file changed, 48 insertions(+), 39 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index 55e96d698..bc85259c5 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -168,20 +168,20 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase linalg::ActiveDenseMatrix _stoichiometry; unsigned int _idxSO = 0; //!< SO component index, default 0 - unsigned int _idxSS_ad = 1; //!< SS / SS_ad component index, default 1 + unsigned int _idxSS_nad = 1; //!< SS / SS_ad component index, default 1 unsigned int _idxSNH = 2; //!< SNH component index, default 2 unsigned int _idxSNO = 3; //!< SNO component index, default 3 unsigned int _idxSN2 = 4; //!< SN2 component index, default 4 unsigned int _idxSALK = 5; //!< SALK component index, default 5 - unsigned int _idxSI_ad = 6; //!< SI component index, default 6 + unsigned int _idxSI_nad = 6; //!< SI component index, default 6 unsigned int _idxXI = 7; //!< XI component index, default 7 unsigned int _idxXS = 8; //!< XS component index, default 8 unsigned int _idxXH = 9; //!< XH component index, default 9 unsigned int _idxXSTO = 10; //!< XSTO component index, default 10 unsigned int _idxXA = 11; //!< XA component index, default 11 unsigned int _idxXMI = 12; //!< XMI component index, default 12 - unsigned int _idxSS_nad = 13; //!< SS_nad component index, default 13 - unsigned int _idxSI_nad = 14; //!< SI_nbio component index, default 14 + unsigned int _idxSI_ad = 13; + unsigned int _idxSS_ad = 14; bool _fractionate = false; @@ -302,16 +302,18 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.native(_idxSO, 10) = -1 * (1 - fXI); _stoichiometry.native(_idxSO, 12) = 1; - // SS_ad - _stoichiometry.native(_idxSS_ad, 0) = (1 - fSI); - _stoichiometry.native(_idxSS_ad, 1) = -1; - _stoichiometry.native(_idxSS_ad, 2) = -1; - // SS_nad _stoichiometry.native(_idxSS_nad, 0) = (1 - fSI); _stoichiometry.native(_idxSS_nad, 1) = -1; _stoichiometry.native(_idxSS_nad, 2) = -1; + // SS_ad + if (_fractionate) + { + _stoichiometry.native(_idxSS_ad, 0) = (1 - fSI); + _stoichiometry.native(_idxSS_ad, 1) = -1; + _stoichiometry.native(_idxSS_ad, 2) = -1; + } // SNH _stoichiometry.native(_idxSNH, 0) = c1n; _stoichiometry.native(_idxSNH, 1) = c2n; @@ -353,10 +355,11 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.native(_idxSALK, 11) = c12a; // SI_ad - _stoichiometry.native(_idxSI_bio, 0) = fSI; + _stoichiometry.native(_idxSI_nad, 0) = fSI; //SI_nad - _stoichiometry.native(_idxSI_nbio, 0) = fSI; + if(_fractionate) + _stoichiometry.native(_idxSI_ad, 0) = fSI; // XI _stoichiometry.native(_idxXI, 5) = fXI; @@ -442,10 +445,10 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase const double bAUT = static_cast(baut20) * ft105; StateType SO = y[_idxSO]; - StateType SS_nad = y[_idxSS_ad]; + StateType SS_nad = y[_idxSS_nad]; StateType SS_ad = 0.0; if (_fractionate) - SS_ad = y[_idxSS_nad]; + SS_ad = y[_idxSS_ad]; StateType SNH = y[_idxSNH]; StateType SNO = y[_idxSNO]; StateType SN2 = y[_idxSN2]; @@ -566,23 +569,25 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase const double bAUT = static_cast(baut20) * ft105; double SO = y[_idxSO]; - double SS_ad = y[_idxSS_ad]; - double SS_nad = 0.0; - if (_fractionate) - SS_nad = y[_idxSS_nad]; + double SS_nad = y[_idxSS_nad]; + double SS_ad = 0.0; double SNH = y[_idxSNH]; double SNO = y[_idxSNO]; double SN2 = y[_idxSN2]; double SALK = y[_idxSALK]; - double SI_ad = y[_idxSI_ad]; // unused - double SI_nad = y[_idxSI_nad]; // unused - //double XI = y[8]; // unused + double SI_nad = y[_idxSI_nad]; + double SI_ad = 0.0; double XS = y[_idxXS]; double XH = y[_idxXH]; double XSTO = y[_idxXSTO]; double XA = y[_idxXA]; - //double XMI = y[13]; // unused - //XH_S = max(XH, 0.1) + + if (_fractionate) + { + SS_ad = y[_idxSS_ad]; + SI_ad = y[_idxSI_ad]; + } + double d[13][15] = {}; @@ -605,9 +610,10 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase d[1][_idxSO] = k_sto * (SS_ad + SS_nad) / ((SS_ad + SS_nad) + khss) * kho2 / ((SO + kho2) * (SO + kho2)) * XH; - d[1][_idxSS_ad] = k_sto - * SO / (SO + kho2) - * khss / ((SS_ad + SS_nad + khss) * (SS_ad + SS_nad + khss)) * XH; + if (_fractionate) + d[1][_idxSS_ad] = k_sto + * SO / (SO + kho2) + * khss / ((SS_ad + SS_nad + khss) * (SS_ad + SS_nad + khss)) * XH; d[1][_idxSS_nad] = k_sto * SO / (SO + kho2) * khss / ((SS_ad + SS_nad + khss) * (SS_ad + SS_nad + khss)) * XH; @@ -620,10 +626,11 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase * -kho2 / ((SO + kho2) * (SO + kho2)) * (SS_ad + SS_nad) / ((SS_ad + SS_nad) + khss) * SNO / (SNO + khn03) * XH; - d[2][_idxSS_ad] = k_sto * etahno3 - * kho2 / (SO + kho2) - * khss / ((SS_ad + SS_nad + khss) * (SS_ad + SS_nad + khss)) - * SNO / (SNO + khn03) * XH; + if(_fractionate) + d[2][_idxSS_ad] = k_sto * etahno3 + * kho2 / (SO + kho2) + * khss / ((SS_ad + SS_nad + khss) * (SS_ad + SS_nad + khss)) + * SNO / (SNO + khn03) * XH; d[2][_idxSS_nad] = k_sto * etahno3 * kho2 / (SO + kho2) * khss / ((SS_ad + SS_nad + khss) * (SS_ad + SS_nad + khss)) @@ -840,18 +847,20 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase RowIterator curJac = jac; for (int row = 0; row < _stoichiometry.rows(); ++row, ++curJac) { - const double colFactor = static_cast(_stoichiometry.native(row, rIdx)); + double colFactor = static_cast(_stoichiometry.native(row, rIdx)); for (size_t compIdx = 0; compIdx < _stoichiometry.rows(); compIdx++) { - if (compIdx == _idxSI_ad) - colFactor *= SI_ad / (SI_ad + SI_nad); - if (compIdx == _idxSI_nad) - colFactor *= SI_nad / (SI_ad + SI_nad); - if (compIdx == _idxSS_ad) - colFactor *= SS_ad / (SS_ad + SS_nad); - if (compIdx == _idxSS_nad) - colFactor *= SS_nad / (SS_ad + SS_nad); - + if (_fractionate) + { + if (compIdx == _idxSI_ad) + colFactor *= SI_ad / (SI_ad + SI_nad); + if (compIdx == _idxSI_nad) + colFactor *= SI_nad / (SI_ad + SI_nad); + if (compIdx == _idxSS_ad) + colFactor *= SS_ad / (SS_ad + SS_nad); + if (compIdx == _idxSS_nad) + colFactor *= SS_nad / (SS_ad + SS_nad); + } curJac[compIdx - static_cast(row)] += colFactor * d[rIdx][compIdx]; } } From 7ce0ecae6f72f7f55bacb13b1314929d549cf881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20H=C3=BClsmann?= Date: Mon, 15 Sep 2025 15:17:24 +0200 Subject: [PATCH 43/47] asm3: fix warning when using fractionated SS/SI --- .../reaction/ActivatedSludgeModelThree.cpp | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index bc85259c5..ec0784710 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -207,31 +207,31 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase if (paramProvider.exists("ASM3_COMP_IDX")) { const std::vector compIdx = paramProvider.getUint64Array("ASM3_COMP_IDX"); - if (compIdx.size() != 13) { - throw InvalidParameterException("ASM3 configuration: ASM3_COMP_IDX must have 13 elements"); - } - else { - LOG(Debug) << "ASM3_COMP_IDX set: " << compIdx; - _idxSO = compIdx[0]; - _idxSS_nad = compIdx[1]; - _idxSNH = compIdx[2]; - _idxSNO = compIdx[3]; - _idxSN2 = compIdx[4]; - _idxSALK = compIdx[5]; - _idxSI_nad = compIdx[6]; - _idxXI = compIdx[7]; - _idxXS = compIdx[8]; - _idxXH = compIdx[9]; - _idxXSTO = compIdx[10]; - _idxXA = compIdx[11]; - _idxXMI = compIdx[12]; - if (_fractionate) - { - //todo warníng - _idxSS_ad = compIdx[13]; - _idxSI_ad = compIdx[14]; + if (_fractionate) + { + if (compIdx.size() != 15) { + throw InvalidParameterException("ASM3 configuration: ASM3_COMP_IDX must have 15 elements"); } + _idxSS_ad = compIdx[13]; + _idxSI_ad = compIdx[14]; + } + else if (compIdx.size() != 13) { + throw InvalidParameterException("ASM3 configuration: ASM3_COMP_IDX must have 13 elements"); } + LOG(Debug) << "ASM3_COMP_IDX set: " << compIdx; + _idxSO = compIdx[0]; + _idxSS_nad = compIdx[1]; + _idxSNH = compIdx[2]; + _idxSNO = compIdx[3]; + _idxSN2 = compIdx[4]; + _idxSALK = compIdx[5]; + _idxSI_nad = compIdx[6]; + _idxXI = compIdx[7]; + _idxXS = compIdx[8]; + _idxXH = compIdx[9]; + _idxXSTO = compIdx[10]; + _idxXA = compIdx[11]; + _idxXMI = compIdx[12]; } else { LOG(Debug) << "ASM3_COMP_IDX not set, using defaults"; From cbe32573a7f5e75c82ae30ddedaef141958e805d Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Wed, 19 Nov 2025 17:21:25 +0100 Subject: [PATCH 44/47] change internal parameter names --- test/MatrixHelper.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/MatrixHelper.hpp b/test/MatrixHelper.hpp index edb6c15b4..9dacdeea3 100644 --- a/test/MatrixHelper.hpp +++ b/test/MatrixHelper.hpp @@ -56,9 +56,9 @@ Matrix_t createBandMatrix(unsigned int rows, unsigned int lower, unsigned int up double val = 1.0; for (int row = 0; row < bm.rows(); ++row) { - const int lower = std::max(-static_cast(bm.lowerBandwidth()), -static_cast(row)); - const int upper = std::min(static_cast(bm.upperBandwidth()), static_cast(bm.rows() - row) - 1); - for (int col = lower; col <= upper; ++col) + const int low = std::max(-static_cast(bm.lowerBandwidth()), -static_cast(row)); + const int up = std::min(static_cast(bm.upperBandwidth()), static_cast(bm.rows() - row) - 1); + for (int col = low; col <= up; ++col) { bm.centered(row, col) = val; val += 1.0; From 8a5669aee87032d08432cfdafffe9fb449522126 Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Wed, 19 Nov 2025 17:26:19 +0100 Subject: [PATCH 45/47] fix ASM3 test Add documentation Add option to deactive active aeration Update documentation for the active Aeration update documentation Update Extention Update documentation for extention --- .../reaction/activated_sludge_model.rst | 257 +++++++- .../reaction/activated_sludge_model.rst | 612 +++++++++++++++++- doc/modelling/reaction/images/ASM3h+.png | Bin 0 -> 8117356 bytes doc/modelling/reaction/images/netzwerk.jpg | Bin 0 -> 234865 bytes .../reaction/ActivatedSludgeModelThree.cpp | 334 ++++++---- test/ReactionModels.cpp | 8 +- 6 files changed, 1082 insertions(+), 129 deletions(-) create mode 100644 doc/modelling/reaction/images/ASM3h+.png create mode 100644 doc/modelling/reaction/images/netzwerk.jpg diff --git a/doc/interface/reaction/activated_sludge_model.rst b/doc/interface/reaction/activated_sludge_model.rst index 183e4ed47..b968696c8 100644 --- a/doc/interface/reaction/activated_sludge_model.rst +++ b/doc/interface/reaction/activated_sludge_model.rst @@ -30,6 +30,8 @@ For information on model equations, refer to :ref:`activated_sludge_model`. XSTO 10 XA 11 XMI 12 + SI_ad (optinal) 13 + SS_ad (optionl) 14 ============= ========= @@ -43,32 +45,247 @@ For information on model equations, refer to :ref:`activated_sludge_model`. Temperature :math:`T`. + **Unit:** :math:`°C` + ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== ``ASM3_V`` - Reactor volume :math:`V`. Set this to the column volume since the model can't compute it itself. + (Optional) Reactor volume :math:`V`. If not set, the volume of the unit operation is used. It is left to the user to + ensure consistency between the volume set here and the unit operation volume. + **Unit:** :math:`m^3` + ================ ============================= ======================================================== **Type:** double **Range:** :math:`\gt 0` **Length:** 1 ================ ============================= ======================================================== ``ASM3_IO2`` - Aeration oxygen input :math:`iO_2`. + (Optional) Aeration oxygen input :math:`iO_2`. If not set, aeration is not considered in the model. + + **Unit:** :math:`g~O_2~m^{-3}~d^{-1}` + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\ge 0` **Length:** 1 + ================ ============================= ======================================================== + +**Stoichiometric parameters** + +``ASM3_INSI`` + + Nitrogen content of soluble inert organics :math:`i_{N,SI}`. + + **Unit:** :math:`g~N~(g~COD)^{-1}` + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\ge 0` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_INSS`` + + Nitrogen content of readily biodegradable substrate :math:`i_{N,SS}`. + + **Unit:** :math:`g~N~(g~COD)^{-1}` + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\ge 0` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_INXI`` + + Nitrogen content of inert particulate organics :math:`i_{N,XI}`. + + **Unit:** :math:`g~N~(g~COD)^{-1}` + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\ge 0` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_INXS`` + + Nitrogen content of slowly biodegradable substrate :math:`i_{N,XS}`. + + **Unit:** :math:`g~N~(g~COD)^{-1}` + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\ge 0` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_INBM`` + + Nitrogen content of biomass :math:`i_{N,BM}`. + + **Unit:** :math:`g~N~(g~COD)^{-1}` ================ ============================= ======================================================== **Type:** double **Range:** :math:`\ge 0` **Length:** 1 ================ ============================= ======================================================== +``ASM3_IVSS_XI`` + + VSS to COD ratio for inert particulates :math:`i_{VSS,XI}`. + + **Unit:** :math:`g~VSS~(g~COD)^{-1}` + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\gt 0` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_IVSS_XS`` + + VSS to COD ratio for slowly biodegradable substrate :math:`i_{VSS,XS}`. + + **Unit:** :math:`g~VSS~(g~COD)^{-1}` + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\gt 0` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_IVSS_STO`` + + VSS to COD ratio for storage products :math:`i_{VSS,STO}`. + + **Unit:** :math:`g~VSS~(g~COD)^{-1}` + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\gt 0` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_IVSS_BM`` + + VSS to COD ratio for biomass :math:`i_{VSS,BM}`. + + **Unit:** :math:`g~VSS~(g~COD)^{-1}` + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\gt 0` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_ITSS_VSS_BM`` + + TSS to VSS ratio for biomass :math:`i_{TSS/VSS,BM}`. + + **Unit:** :math:`g~TSS~(g~VSS)^{-1}` + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\gt 0` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_FISS_BM_PROD`` + + Fraction of ISS from biomass production :math:`f_{ISS,BM,prod}`. + + **Unit:** dimensionless + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`[0, 1]` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_FSI`` + + Fraction of SI from hydrolysis :math:`f_{SI}`. + + **Unit:** dimensionless + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`[0, 1]` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_FXI`` + + Fraction of XI from endogenous respiration :math:`f_{XI}`. + + **Unit:** dimensionless + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`[0, 1]` **Length:** 1 + ================ ============================= ======================================================== + +**Yield coefficients** + +``ASM3_YH_AER`` + + Aerobic yield of heterotrophs :math:`Y_{H,aer}`. + + **Unit:** :math:`g~COD~(g~COD)^{-1}` + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\gt 0` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_YH_ANOX`` + + Anoxic yield of heterotrophs :math:`Y_{H,anox}`. + + **Unit:** :math:`g~COD~(g~COD)^{-1}` + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\gt 0` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_YSTO_AER`` + + Aerobic yield of storage :math:`Y_{STO,aer}`. + + **Unit:** :math:`g~COD~(g~COD)^{-1}` + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\gt 0` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_YSTO_ANOX`` + + Anoxic yield of storage :math:`Y_{STO,anox}`. + + **Unit:** :math:`g~COD~(g~COD)^{-1}` + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\gt 0` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_YA`` + + Yield of autotrophs :math:`Y_A`. + + **Unit:** :math:`g~COD~(g~N)^{-1}` + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`\gt 0` **Length:** 1 + ================ ============================= ======================================================== + +**Adsorption fractionation (optional)** + +``ASM3_FSI_AD`` + + (Optional) Fraction of adsorbable SI :math:`f_{SI,ad}`. Only used if 15 components are defined. + + **Unit:** dimensionless + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`[0, 1]` **Length:** 1 + ================ ============================= ======================================================== + +``ASM3_FSS_AD`` + + (Optional) Fraction of adsorbable SS :math:`f_{SS,ad}`. Only used if 15 components are defined. + + **Unit:** dimensionless + + ================ ============================= ======================================================== + **Type:** double **Range:** :math:`[0, 1]` **Length:** 1 + ================ ============================= ======================================================== + **Maximum rates** ``ASM3_KH20`` Hydrolysis rate constant :math:`k_H` at 20 °C. + **Unit:** :math:`d^{-1}` + ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== @@ -77,6 +294,8 @@ For information on model equations, refer to :ref:`activated_sludge_model`. Maximum storage rate :math:`K_{STO}` at 20 °C. + **Unit:** :math:`d^{-1}` + ================ ============================= ======================================================== **Type:** double **Range:** :math:`\gt 0` **Length:** 1 ================ ============================= ======================================================== @@ -85,6 +304,8 @@ For information on model equations, refer to :ref:`activated_sludge_model`. Heterotrophic max. growth rate :math:`\mu_{H}` at 20 °C. + **Unit:** :math:`d^{-1}` + ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== @@ -93,6 +314,8 @@ For information on model equations, refer to :ref:`activated_sludge_model`. Rate constant for lysis and decay :math:`b_H` at 20 °C. + **Unit:** :math:`d^{-1}` + ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== @@ -101,6 +324,8 @@ For information on model equations, refer to :ref:`activated_sludge_model`. Autotrophic max. growth rate :math:`\mu_{AUT}` at 20 °C. + **Unit:** :math:`d^{-1}` + ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== @@ -109,6 +334,8 @@ For information on model equations, refer to :ref:`activated_sludge_model`. Rate constant :math:`b_{AUT}` for decay of autotrophs at 20 °C. + **Unit:** :math:`d^{-1}` + ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== @@ -119,6 +346,8 @@ For information on model equations, refer to :ref:`activated_sludge_model`. Anoxic reduction factor :math:`\eta_{HNO_3}` – heterotrophic growth. + **Unit:** dimensionless + ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== @@ -127,6 +356,8 @@ For information on model equations, refer to :ref:`activated_sludge_model`. Anoxic reduction factor :math:`\eta_{H_{end}}` – endogenous respiration XH. + **Unit:** dimensionless + ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== @@ -135,6 +366,8 @@ For information on model equations, refer to :ref:`activated_sludge_model`. Anoxic reduction factor :math:`\eta_{N_{end}}` – endogenous respiration XA. + **Unit:** dimensionless + ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== @@ -145,6 +378,8 @@ For information on model equations, refer to :ref:`activated_sludge_model`. Saturation/inhibition coefficient :math:`KX` for particulate COD. + **Unit:** :math:`g~COD~m_{SP}^{-3}` + ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== @@ -153,6 +388,8 @@ For information on model equations, refer to :ref:`activated_sludge_model`. Saturation/inhibition coefficient :math:`KHO_2` for oxygen, heterotrophic growth. + **Unit:** :math:`g~O_2~m_{SP}^{-3}` + ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== @@ -161,6 +398,8 @@ For information on model equations, refer to :ref:`activated_sludge_model`. Saturation/inhibition coefficient :math:`KHSS` for readily biodegradable substrates. + **Unit:** :math:`g~COD~m_{SP}^{-3}` + ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== @@ -169,6 +408,8 @@ For information on model equations, refer to :ref:`activated_sludge_model`. Saturation/inhibition coefficient :math:`KHNO_3` for nitrate. + **Unit:** :math:`g~N~m_{SP}^{-3}` + ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== @@ -177,6 +418,8 @@ For information on model equations, refer to :ref:`activated_sludge_model`. Saturation/inhibition coefficient :math:`KHNH_4` for ammonium (nutrient). + **Unit:** :math:`g~N~m_{SP}^{-3}` + ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== @@ -185,6 +428,8 @@ For information on model equations, refer to :ref:`activated_sludge_model`. Saturation coefficient :math:`KH_{ALK}` for alkalinity (HCO3-). + **Unit:** :math:`mol~m_{SP}^{-3}` + ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== @@ -193,6 +438,8 @@ For information on model equations, refer to :ref:`activated_sludge_model`. Saturation coefficient :math:`KH_{STO}` for storage products. + **Unit:** dimensionless + ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== @@ -201,6 +448,8 @@ For information on model equations, refer to :ref:`activated_sludge_model`. Saturation coefficient :math:`K_{NO_2}` for oxygen, autotrophic growth. + **Unit:** :math:`g~O_2~m_{SP}^{-3}` + ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== @@ -209,6 +458,8 @@ For information on model equations, refer to :ref:`activated_sludge_model`. Saturation coefficient :math:`K_{NNH_4}` for ammonium (substrate), autotrophic growth. + **Unit:** :math:`g~N~m_{SP}^{-3}` + ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== @@ -217,6 +468,8 @@ For information on model equations, refer to :ref:`activated_sludge_model`. Saturation coefficient :math:`K_{NALK}` for alkalinity (HCO3-), autotrophic growth. + **Unit:** :math:`mol~m_{SP}^{-3}` + ================ ============================= ======================================================== **Type:** double **Range:** :math:`\mathbb{R}` **Length:** 1 ================ ============================= ======================================================== diff --git a/doc/modelling/reaction/activated_sludge_model.rst b/doc/modelling/reaction/activated_sludge_model.rst index 09b380544..852f4c2c3 100644 --- a/doc/modelling/reaction/activated_sludge_model.rst +++ b/doc/modelling/reaction/activated_sludge_model.rst @@ -1,11 +1,615 @@ .. _activated_sludge_model: Activated Sludge Model (ASM3h) +=============================== + +The Activated Sludge Model 3 extended (ASM3h) is a comprehensive reaction model for simulating biological +wastewater treatment processes. It belongs to the Activated Sludge Models (ASM) family, a set of standardized +models developed by the International Water Association (IWA). The ASM3h model describes the fate of 13 +biochemical components in wastewater treatment systems. + +Model Components +~~~~~~~~~~~~~~~~ + +The ASM3h model tracks 13 biochemical components representing species and compounds in wastewater: + +.. list-table:: + :header-rows: 1 + :widths: 20 80 + + * - Abbreviation + - Component + * - :math:`SO` + - Dissolved oxygen + * - :math:`SS` + - Readily biodegradable substrate + * - :math:`SNH` + - Ammonium + * - :math:`SNO` + - Nitrite and nitrate + * - :math:`SN2` + - Dinitrogen, released by denitrification + * - :math:`SALK` + - Alkalinity, bicarbonate + * - :math:`SI` + - Soluble inert organic + * - :math:`XI` + - Inert Particulate organic + * - :math:`XS` + - Slowly biodegradable substrate + * - :math:`XH` + - Heterotrophic biomass + * - :math:`XSTO` + - Organics stored by heterotrophs + * - :math:`XA` + - Autotrophic, nitrifying biomass + * - :math:`XMI` + - Mineral particulate matter from biomass + +The net flux for each component is computed using the stoichiometric matrix :math:`S \in \mathbb{R}^{13 \times 13}` +and a reaction rate vector :math:`\varphi_j(c)`, where subscript :math:`j` denotes the reaction index. +The ASM3h model comprises 13 biochemical reactions detailed below. + +Biochemical Reaction Equations +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. list-table:: + :header-rows: 1 + :widths: 15 35 50 + + * - Reaction Number + - Reaction Description + - Rate Equation + * - :math:`r_1` + - Hydrolysis of organic structures + - :math:`k_{h,20} \cdot f_T^{0.04} \cdot \frac{XS/XH}{XS/XH + K_X} \cdot XH` + * - :math:`r_2` + - Aerobic storage of SS + - :math:`k_{STO} \cdot \frac{SO}{SO + K_{h,O2}} \cdot \frac{SS}{SS + K_{h,SS}} \cdot XH` + * - :math:`r_3` + - Anoxic storage of SS + - :math:`k_{STO} \cdot \eta_{h,NO3} \cdot \frac{K_{h,O2}}{SO + K_{h,O2}} \cdot \frac{SNO}{SNO + K_{h,NO3}} \cdot \frac{SS}{SS + K_{h,SS}} \cdot XH` + * - :math:`r_4` + - Aerobic growth of XH + - :math:`\mu_H \cdot \frac{SO}{SO + K_{h,O2}} \cdot \frac{XSTO/XH}{XSTO/XH + K_{h,STO}} \cdot \frac{SNH}{SNH + K_{h,NH4}} \cdot \frac{SALK}{SALK + K_{h,ALK}} \cdot XH` + * - :math:`r_5` + - Anoxic growth of XH (denitrification) + - :math:`\mu_H \cdot \eta_{h,NO3} \cdot \frac{K_{h,O2}}{SO + K_{h,O2}} \cdot \frac{SNO}{SNO + K_{h,NO3}} \cdot \frac{XSTO/XH}{XSTO/XH + K_{h,STO}} \cdot \frac{SNH}{SNH + K_{h,NH4}} \cdot \frac{SALK}{SALK + K_{h,ALK}} \cdot XH` + * - :math:`r_6` + - Aerobic endogenous respiration of XH + - :math:`b_H \cdot \frac{SO}{SO + K_{h,O2}} \cdot XH` + * - :math:`r_7` + - Anoxic endogenous respiration of XH + - :math:`b_H \cdot \eta_{h,end} \cdot \frac{K_{h,O2}}{SO + K_{h,O2}} \cdot \frac{SNO}{SNO + K_{h,NO3}} \cdot XH` + * - :math:`r_8` + - Aerobic respiration of internal cell storage products + - :math:`b_H \cdot \frac{SO}{SO + K_{h,O2}} \cdot \frac{XSTO}{XSTO + K_{h,STO}} \cdot XH` + * - :math:`r_9` + - Anoxic respiration of internal cell storage products + - :math:`b_H \cdot \eta_{h,end} \cdot \frac{K_{h,O2}}{SO + K_{h,O2}} \cdot \frac{SNO}{SNO + K_{h,NO3}} \cdot \frac{XSTO}{XSTO + K_{h,STO}} \cdot XH` + * - :math:`r_{10}` + - Aerobic growth of XA + - :math:`\mu_{AUT} \cdot \frac{SO}{SO + K_{N,O2}} \cdot \frac{SNH}{SNH + K_{N,NH4}} \cdot \frac{SALK}{SALK + K_{N,ALK}} \cdot XA` + * - :math:`r_{11}` + - Aerobic endogenous respiration of XA + - :math:`b_{AUT} \cdot \frac{SO}{SO + K_{N,O2}} \cdot XA` + * - :math:`r_{12}` + - Anoxic endogenous respiration of XA + - :math:`b_{AUT} \cdot \eta_{N,end} \cdot \frac{K_{N,O2}}{SO + K_{N,O2}} \cdot \frac{SNO}{SNO + K_{h,NO3}} \cdot XA` + * - :math:`r_{13}` + - Aeration + - :math:`\frac{iO_2}{1000}` + * - :math:`r_{14}` + - Anoxic storage of SS\ :sub:`ad` (optional) + - :math:`k_{STO} \cdot \eta_{h,NO3} \cdot \frac{K_{h,O2}}{SO + K_{h,O2}} \cdot \frac{SS_{ad}}{SS + SS_{ad} + K_{h,SS}} \cdot \frac{SNO}{SNO + K_{h,NO3}} \cdot XH` + * - :math:`r_{15}` + - Aerobic storage of SS\ :sub:`ad` (optional) + - :math:`k_{STO} \cdot \frac{SO}{SO + K_{h,O2}} \cdot \frac{SS_{ad}}{SS + SS_{ad} + K_{h,SS}} \cdot XH` + +Reactions :math:`r_{14}` and :math:`r_{15}` are only active when 15 components are defined (including SS\ :sub:`ad` and SI\ :sub:`ad`). + + +Stoichiometric Matrix +~~~~~~~~~~~~~~~~~~~~~ + +The stoichiometric matrix :math:`S` encodes the mass balance coefficients for each biochemical reaction: + +.. list-table:: + :header-rows: 1 + :widths: 10 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 + + * - Component\\Reaction + - :math:`r_1` + - :math:`r_2` + - :math:`r_3` + - :math:`r_4` + - :math:`r_5` + - :math:`r_6` + - :math:`r_7` + - :math:`r_8` + - :math:`r_9` + - :math:`r_{10}` + - :math:`r_{11}` + - :math:`r_{12}` + - :math:`r_{13}` + - :math:`r_{14}^*` + - :math:`r_{15}^*` + * - :math:`SO` + - 0 + - :math:`Y_{STO,aer} - 1` + - :math:`Y_{STO,anox} - 1` + - :math:`1 - 1/Y_{H,aer}` + - :math:`1 - 1/Y_{H,anox}` + - :math:` f_{XI} - 1` + - :math:`f_{XI} - 1` + - -1 + - -1 + - :math:`-(64/14) \cdot 1/Y_A + 1` + - :math:`f_{XI} - 1` + - :math:`f_{XI} - 1` + - 1 + - 0 + - 0 + * - :math:`SS` + - :math:`(1 - f_{SI})(1 - f_{SS,ad})` + - -1 + - -1 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + * - :math:`SS_{ad}^*` + - :math:`(1 - f_{SI}) \cdot f_{SS,ad}` + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - -1 + - -1 + * - :math:`SNH` + - :math:`i_{N,XS} - i_{N,SI} \cdot f_{SI} - (1 - f_{SI}) \cdot i_{N,SS}` + - :math:`i_{N,SS}` + - :math:`i_{N,SS}` + - :math:`-i_{N,BM}` + - :math:`-i_{N,BM}` + - :math:`i_{N,BM} - f_{XI} \cdot i_{N,XI}` + - :math:`i_{N,BM} -f_{XI} \cdot i_{N,XI}` + - 0 + - 0 + - :math:`-1/Y_A - i_{N,BM}` + - :math:`f_{XI} \cdot i_{N,XI} + i_{N,BM}` + - :math:`f_{XI} \cdot i_{N,XI} + i_{N,BM}` + - 0 + - 0 + - 0 + * - :math:`SNO` + - 0 + - 0 + - :math:`(Y_{STO,anox} - 1) / (40/14)` + - 0 + - :math:`(1 - 1/Y_{H,anox}) / (40/14)` + - 0 + - :math:`(f_{XI} - 1) / (40/14)` + - 0 + - :math:`-14/40` + - :math:`1/Y_A` + - 0 + - :math:`(f_{XI} - 1) / (40/14)` + - 0 + - 0 + - 0 + * - :math:`SN2` + - 0 + - 0 + - :math:`(1 - Y_{STO,anox}) / (40/14)` + - 0 + - :math:`(1/Y_{H,anox} - 1) / (40/14)` + - 0 + - :math:`(-f_{XI} - 1) / (40/14)` + - 0 + - :math:`--14/40` + - 0 + - 0 + - :math:`(1 + f_{XI} ) / (40/14)` + - 0 + - 0 + - 0 + * - :math:`SALK` + - :math:`(i_{N,XS} - i_{N,SI} \cdot f_{SI} - (1 - f_{SI}) \cdot i_{N,SS})/14` + - :math:`i_{N,SS} / 14` + - :math:`i_{N,SS} / 14 - (Y_{STO,anox} - 1) / 40` + - :math:`-i_{N,BM} / 14` + - :math:`-i_{N,BM} / 14 - (1 - 1/Y_{H,anox}) / 40` + - :math:`(-f_{XI} \cdot i_{N,XI} + i_{N,BM}) / 14` + - :math:`(-f_{XI} \cdot i_{N,XI} + i_{N,BM}) / 14 (-f_{XI} + 1) / 40` + - 0 + - :math:`1/40` + - :math:`-(1/Y_A) 1/7- i_{N,BM}/14` + - :math:`f_{XI} \cdot i_{N,XI} + i_{N,BM} / 14` + - :math:`(-f_{XI} \cdot i_{N,XI} + i_{N,BM})/14 - (f_{XI} - 1) / 40` + - 0 + - 0 + - 0 + * - :math:`SI` + - :math:`f_{SI}(1 - f_{SI,ad})` + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + * - :math:`SI_{ad}^*` + - :math:`f_{SI} \cdot f_{SI,ad}` + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + * - :math:`XI` + - 0 + - 0 + - 0 + - 0 + - 0 + - :math:`f_{XI}` + - :math:`f_{XI}` + - 0 + - 0 + - 0 + - :math:`f_{XI}` + - :math:`f_{XI}` + - 0 + - 0 + - 0 + * - :math:`XS` + - -1 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + * - :math:`XH` + - 0 + - 0 + - 0 + - 1 + - 1 + - -1 + - -1 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + * - :math:`XSTO` + - 0 + - :math:`Y_{STO,aer}` + - :math:`Y_{STO,anox}` + - :math:`-1/Y_{H,aer}` + - :math:`-1/Y_{H,anox}` + - 0 + - 0 + - -1 + - -1 + - 0 + - 0 + - 0 + - 0 + - :math:`Y_{STO,anox}` + - :math:`Y_{STO,aer}` + * - :math:`XA` + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 1 + - -1 + - -1 + - 0 + - 0 + - 0 + * - :math:`XMI` + - 0 + - 0 + - 0 + - 0 + - 0 + - :math:`f_{XMI,BI}` + - :math:`f_{XMI,BI}` + - 0 + - 0 + - 0 + - :math:`f_{XMI,BI}` + - :math:`f_{XMI,BI}` + - 0 + - 0 + - 0 + +:sup:`*` Optional: only active when 15 components are defined (SS\ :sub:`ad` and SI\ :sub:`ad`). + + +.. figure:: images/ASM3h+.png + :width: 100% + :align: center + + Network representation of the ASM3h model. + +Model Parameters +~~~~~~~~~~~~~~~~ + +Stoichiometric Parameters ------------------------- -Activated Sludge Models are a group of reaction models published by the International Water Association (IWA) -and mostly used for modelling biological processes in wastewater treatment plants. +.. list-table:: + :header-rows: 1 + :widths: 20 60 20 + + * - Symbol + - Description + - Unit + * - :math:`i_{N,SI}` + - Nitrogen content of soluble inert organics + - :math:`g~N~(g~COD)^{-1}` + * - :math:`i_{N,SS}` + - Nitrogen content of readily biodegradable substrate + - :math:`g~N~(g~COD)^{-1}` + * - :math:`i_{N,XI}` + - Nitrogen content of inert particulate organics + - :math:`g~N~(g~COD)^{-1}` + * - :math:`i_{N,XS}` + - Nitrogen content of slowly biodegradable substrate + - :math:`g~N~(g~COD)^{-1}` + * - :math:`i_{N,BM}` + - Nitrogen content of biomass + - :math:`g~N~(g~COD)^{-1}` + * - :math:`i_{VSS,XI}` + - VSS to COD ratio for inert particulates + - :math:`g~VSS~(g~COD)^{-1}` + * - :math:`i_{VSS,XS}` + - VSS to COD ratio for slowly biodegradable substrate + - :math:`g~VSS~(g~COD)^{-1}` + * - :math:`i_{VSS,STO}` + - VSS to COD ratio for storage products + - :math:`g~VSS~(g~COD)^{-1}` + * - :math:`i_{VSS,BM}` + - VSS to COD ratio for biomass + - :math:`g~VSS~(g~COD)^{-1}` + * - :math:`i_{TSS/VSS,BM}` + - TSS to VSS ratio for biomass + - :math:`g~TSS~(g~VSS)^{-1}` + * - :math:`f_{SI}` + - Fraction of SI from hydrolysis + - dimensionless + * - :math:`f_{XI}` + - Fraction of XI from endogenous respiration + - dimensionless + * - :math:`f_{ISS,BM,prod}` + - Fraction of ISS from biomass production + - dimensionless + * - :math:`Y_{H,aer}` + - Aerobic yield of heterotrophs + - :math:`g~COD~(g~COD)^{-1}` + * - :math:`Y_{H,anox}` + - Anoxic yield of heterotrophs + - :math:`g~COD~(g~COD)^{-1}` + * - :math:`Y_{STO,aer}` + - Aerobic yield of storage + - :math:`g~COD~(g~COD)^{-1}` + * - :math:`Y_{STO,anox}` + - Anoxic yield of storage + - :math:`g~COD~(g~COD)^{-1}` + * - :math:`Y_A` + - Yield of autotrophs + - :math:`g~COD~(g~N)^{-1}` + +Kinetic Parameters +------------------ + +.. list-table:: + :header-rows: 1 + :widths: 20 60 20 + + * - Symbol + - Description + - Unit + * - :math:`k_H` + - Hydrolysis rate constant (20 °C) + - :math:`d^{-1}` + * - :math:`K_{STO}` + - Maximum storage rate (20 °C) + - :math:`d^{-1}` + * - :math:`\mu_H` + - Heterotrophic max. growth rate (20 °C) + - :math:`d^{-1}` + * - :math:`b_H` + - Rate constant for lysis and decay (20 °C) + - :math:`d^{-1}` + * - :math:`\mu_{AUT}` + - Autotrophic max. growth rate (20 °C) + - :math:`d^{-1}` + * - :math:`b_{AUT}` + - Rate constant for decay of autotrophs (20 °C) + - :math:`d^{-1}` + +Anoxic Reduction Factors +------------------------ + +.. list-table:: + :header-rows: 1 + :widths: 20 60 20 + + * - Symbol + - Description + - Unit + * - :math:`\eta_{HNO_3}` + - Anoxic reduction factor for heterotrophic growth + - dimensionless + * - :math:`\eta_{H,end}` + - Anoxic reduction factor for endogenous respiration of XH + - dimensionless + * - :math:`\eta_{N,end}` + - Anoxic reduction factor for endogenous respiration of XA + - dimensionless + +Saturation/Inhibition Coefficients +---------------------------------- + +.. list-table:: + :header-rows: 1 + :widths: 20 60 20 + + * - Symbol + - Description + - Unit + * - :math:`K_X` + - Saturation coefficient for particulate COD + - :math:`g~COD~(g~COD)^{-1}` + * - :math:`K_{H,O_2}` + - Saturation coefficient for oxygen (heterotrophs) + - :math:`g~O_2~m^{-3}` + * - :math:`K_{H,SS}` + - Saturation coefficient for readily biodegradable substrates + - :math:`g~COD~m^{-3}` + * - :math:`K_{H,NO_3}` + - Saturation coefficient for nitrate (heterotrophs) + - :math:`g~N~m^{-3}` + * - :math:`K_{H,NH_4}` + - Saturation coefficient for ammonium (nutrient) + - :math:`g~N~m^{-3}` + * - :math:`K_{H,ALK}` + - Saturation coefficient for alkalinity (heterotrophs) + - :math:`mol~m^{-3}` + * - :math:`K_{H,STO}` + - Saturation coefficient for storage products + - :math:`g~COD~(g~COD)^{-1}` + * - :math:`K_{N,O_2}` + - Saturation coefficient for oxygen (autotrophs) + - :math:`g~O_2~m^{-3}` + * - :math:`K_{N,NH_4}` + - Saturation coefficient for ammonium (substrate) + - :math:`g~N~m^{-3}` + * - :math:`K_{N,ALK}` + - Saturation coefficient for alkalinity (autotrophs) + - :math:`mol~m^{-3}` + +Temperature Dependence +---------------------- + +Kinetic rates are corrected for temperature using Arrhenius-type expressions: + +.. math:: + + k(T) = k_{20} \cdot \exp\left(-\theta \cdot (20 - T)\right) + +with temperature coefficients: + +- :math:`\theta = 0.04` for hydrolysis +- :math:`\theta = 0.06952` for heterotrophic processes (:math:`K_{STO}`, :math:`\mu_H`, :math:`b_H`) +- :math:`\theta = 0.105` for autotrophic processes (:math:`\mu_{AUT}`, :math:`b_{AUT}`) + +Optional Parameters +------------------- + +.. list-table:: + :header-rows: 1 + :widths: 20 60 20 + + * - Symbol + - Description + - Unit + * - :math:`f_{SI,ad}` + - Fraction of adsorbable SI + - dimensionless + * - :math:`f_{SS,ad}` + - Fraction of adsorbable SS + - dimensionless + * - :math:`iO_2` + - Aeration oxygen input rate + - :math:`g~O_2~m^{-3}~d^{-1}` + * - :math:`V` + - Reactor volume (for aeration) + - :math:`m^3` + +Configuration in CADET +~~~~~~~~~~~~~~~~~~~~~~ + +For configuration details, see :ref:`activated_sludge_model_config`. + +Aeration Strategy +----------------- + +The ASM3h model includes an aeration reaction (:math:`r_{13}`) that is activated when both ``ASM3_IO2`` and ``ASM3_V`` are set. +The aeration rate is computed as :math:`iO_2 / 1000`. To disable aeration, omit these parameters. +For more flexible aeration handling, model oxygen input explicitly via the Inlet unit operation (see :ref:`inlet_operation`). + +Substrate Fractionation +----------------------- + +The organic substrates can be fractionated into adsorbable and non-adsorbable components via ``ASM3_FSI_AD`` and ``ASM3_FSS_AD``. +This requires at least 15 components (including ``SI_ad`` and ``SS_ad``) and enables coupling with binding models for +adsorptive interactions during biological treatment. If fewer than 15 components are defined, adsorbed components are disabled. + +When fractionation is enabled, reactions :math:`r_{14}` and :math:`r_{15}` become active for aerobic and anoxic storage of adsorbed substrate SS\ :sub:`ad`. + + +Implementation Notes +-------------------- + +- Component indices can be customized via ``ASM3_COMP_IDX`` if components are ordered differently or offset. +- A minimum threshold of :math:`X_H = 0.1` is applied to prevent division by zero in reactions involving :math:`X_S/X_H` and :math:`X_{STO}/X_H` ratios. + -The ASM3h model implemented in CADET is a variant of the ASM3 model and documented in the SIMBA# software suite. +References +~~~~~~~~~~ -For more information on model parameters required to define in CADET file format, see :ref:`activated_sludge_model_config`. +TODO \ No newline at end of file diff --git a/doc/modelling/reaction/images/ASM3h+.png b/doc/modelling/reaction/images/ASM3h+.png new file mode 100644 index 0000000000000000000000000000000000000000..4ede650b6e2fc460723a4590d3de50734e8c9281 GIT binary patch literal 8117356 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

PM`Jo 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

-fJbru?@jG5TwR0_u03)Dk2sCM8Exg(0 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 z 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

HUdfB*y_PzwTXI2CgK)B+->LLfv0EX3aA$&=;% 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 literal 0 HcmV?d00001 diff --git a/doc/modelling/reaction/images/netzwerk.jpg b/doc/modelling/reaction/images/netzwerk.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fae20be83073655e1520992d73ca6ae420772fb7 GIT binary patch literal 234865 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

WG6V@Uh(5`u$x$tUBFk?dEcW}7xt?or_)26|X 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 z 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 literal 0 HcmV?d00001 diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index ec0784710..fc639cdb4 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -110,25 +110,29 @@ namespace /** - * @brief Defines a Michaelis-Menten reaction kinetic with simple inhibition - * @details Implements the Michaelis-Menten kinetics: \f[ \begin{align} - * S \nu, - * \end{align} \f] - * where \f$ S \f$ is the stoichiometric matrix and the fluxes are given by - * \f[ \begin{align} - * \nu_i = \frac{\mu_{\mathrm{max},i} c_S}{k_{\mathrm{MM},i} + c_S}. - * \end{align} \f] - * The substrate component \f$ c_S \f$ is identified by the index of the - * first negative entry in the stoichiometry of this reaction. - * In addition, the reaction might be inhibited by other components. In this - * case, the flux has the form - * \f[ \begin{align} - * \nu_i = \frac{\mu_{\mathrm{max},i} c_S}{k_{\mathrm{MM},i} + c_S} \cdot \frac{1}{1 + \sum_i \frac{1+ k_{\mathrm{I},i,j}}{k_{\mathrm{I},i,j} + c_{\mathrm{I},j}}}. - * \end{align} \f] - * The value of \f$ k_{\mathrm{I},i,j} \f$ decides whether component \f$ j \f$ - * inhibits reaction \f$ i \f$. If \f$ k_{\mathrm{I},i,j} \leq 0 \f$, the component - * does not inhibit the reaction. - * Only reactions in liquid phase are supported (no solid phase or cross-phase reactions). + * @brief Activated Sludge Model No. 3 (ASM3) Reaction Kinetics + * @details Implements the ASM3 model for biological wastewater treatment with 13 liquid phase components: + * - Soluble components: SO (dissolved oxygen), SS (readily biodegradable substrate), + * SNH (ammonia-nitrogen), SNO (nitrate-nitrogen), SN2 (dinitrogen gas), + * SALK (alkalinity), SI (soluble inert organic matter) + * - Particulate components: XI (inert particulates), XS (slowly biodegradable substrate), + * XH (heterotrophic biomass), XSTO (internal storage products), XA (autotrophic biomass), + * XMI (inert biomass) + * - Optional adsorbed components (14-15): SI_ad, SS_ad + * + * The model includes 13-15 biokinetic processes: + * - Hydrolysis of organic structures + * - Aerobic and anoxic storage of substrate + * - Aerobic and anoxic growth of heterotrophic biomass (with denitrification) + * - Aerobic and anoxic endogenous respiration of heterotrophs + * - Respiration of internal storage products + * - Aerobic growth of autotrophic biomass (nitrification) + * - Endogenous respiration of autotrophic biomass (aerobic and anoxic) + * - Optional aeration and adsorbed substrate processes + * + * Temperature dependence is modeled using exponential correction factors (Arrhenius-type). + * Component indices can be customized via ASM3_COMP_IDX parameter. + * * @tparam ParamHandler_t Type that can add support for external function dependence */ template @@ -168,22 +172,25 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase linalg::ActiveDenseMatrix _stoichiometry; unsigned int _idxSO = 0; //!< SO component index, default 0 - unsigned int _idxSS_nad = 1; //!< SS / SS_ad component index, default 1 + unsigned int _idxSS = 1; //!< SS / SS_ad component index, default 1 unsigned int _idxSNH = 2; //!< SNH component index, default 2 unsigned int _idxSNO = 3; //!< SNO component index, default 3 unsigned int _idxSN2 = 4; //!< SN2 component index, default 4 unsigned int _idxSALK = 5; //!< SALK component index, default 5 - unsigned int _idxSI_nad = 6; //!< SI component index, default 6 + unsigned int _idxSI = 6; //!< SI component index, default 6 unsigned int _idxXI = 7; //!< XI component index, default 7 unsigned int _idxXS = 8; //!< XS component index, default 8 unsigned int _idxXH = 9; //!< XH component index, default 9 unsigned int _idxXSTO = 10; //!< XSTO component index, default 10 unsigned int _idxXA = 11; //!< XA component index, default 11 unsigned int _idxXMI = 12; //!< XMI component index, default 12 - unsigned int _idxSI_ad = 13; - unsigned int _idxSS_ad = 14; + unsigned int _idxSI_ad = 13; //!< SI_ad component index, default 13 + unsigned int _idxSS_ad = 14; //!< SS_ad component index, default 14 - bool _fractionate = false; + bool _givenAd = true; + bool _activeAeration = false; + + static constexpr double XH_MIN_THRESHOLD = 0.1; @@ -198,45 +205,75 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _paramHandler.configure(paramProvider, _stoichiometry.columns(), _nComp, _nBoundStates); _paramHandler.registerParameters(_parameters, unitOpIdx, parTypeIdx, _nComp, _nBoundStates); + if (_nComp < 13) + throw InvalidParameterException("ASM3 configuration: To use the ASM3 the number of components must be at least 13"); + + if (_nComp < 15) + { + LOG(Debug) << "ASM3 configuration: Less than 15 components are defined, adsorbed components will not be used"; + _givenAd = false; + } - _stoichiometry.resize(_nComp, 13); - _stoichiometry.setAll(0); + if (paramProvider.exists("ASM3_COMP_IDX")) + { + const std::vector compIdx = paramProvider.getUint64Array("ASM3_COMP_IDX"); + + if (compIdx.size() != 15 && _givenAd == true) + throw InvalidParameterException("ASM3 configuration: ASM3_COMP_IDX must have 15 elements"); + + if (compIdx.size() != 13 && _givenAd == false) + throw InvalidParameterException("ASM3 configuration: ASM3_COMP_IDX must have 13 elements when not using adsorbed components"); - if (paramProvider.exists("ASM3_FRACTIONATE")) - _fractionate = paramProvider.getBool("ASM3_FRACTIONATE"); + if (_nComp < compIdx.size()) + throw InvalidParameterException("ASM3 configuration: ASM3_COMP_IDX has more elements than there are components defined in the system"); - if (paramProvider.exists("ASM3_COMP_IDX")) { - const std::vector compIdx = paramProvider.getUint64Array("ASM3_COMP_IDX"); - if (_fractionate) - { - if (compIdx.size() != 15) { - throw InvalidParameterException("ASM3 configuration: ASM3_COMP_IDX must have 15 elements"); - } - _idxSS_ad = compIdx[13]; - _idxSI_ad = compIdx[14]; - } - else if (compIdx.size() != 13) { - throw InvalidParameterException("ASM3 configuration: ASM3_COMP_IDX must have 13 elements"); - } LOG(Debug) << "ASM3_COMP_IDX set: " << compIdx; + _idxSO = compIdx[0]; - _idxSS_nad = compIdx[1]; + _idxSS = compIdx[1]; _idxSNH = compIdx[2]; _idxSNO = compIdx[3]; _idxSN2 = compIdx[4]; _idxSALK = compIdx[5]; - _idxSI_nad = compIdx[6]; + _idxSI = compIdx[6]; _idxXI = compIdx[7]; _idxXS = compIdx[8]; _idxXH = compIdx[9]; _idxXSTO = compIdx[10]; _idxXA = compIdx[11]; _idxXMI = compIdx[12]; + + if(_givenAd) + { + _idxSI_ad = compIdx[13]; + _idxSS_ad = compIdx[14]; + } } - else { + else + { LOG(Debug) << "ASM3_COMP_IDX not set, using defaults"; } + // handle optional Aeration + double V = 0.0; + double IO2 = 0.0; + if (paramProvider.exists("ASM3_IO2") && paramProvider.exists("ASM3_V")) + { + double V = paramProvider.getDouble("ASM3_V"); + double IO2 = paramProvider.getDouble("ASM3_IO2"); + + _activeAeration = true; + LOG(Debug) << "Active aeration set to " << _activeAeration; + } + else + { + LOG(Debug) << "Active aeration not set, using default (false)"; + } + + + _stoichiometry.resize(_nComp, 15); // option to optimize: Depending on whether adsorbed components are used or not 13/12 or 15 reactions are needed + _stoichiometry.setAll(0); + // parameter set ASM3h const double iNSI = paramProvider.getDouble("ASM3_INSI"); const double iNSS = paramProvider.getDouble("ASM3_INSS"); @@ -263,6 +300,13 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase const double iVSS_BM = paramProvider.getDouble("ASM3_IVSS_BM"); const double iTSS_VSS_BM = paramProvider.getDouble("ASM3_ITSS_VSS_BM"); + double fSI_ad = 0.0; + double fSS_ad = 0.0; + if (paramProvider.exists("ASM3_FSI_AD")) + fSI_ad = paramProvider.getDouble("ASM3_FSI_AD"); + if (paramProvider.exists("ASM3_FSS_AD")) + fSS_ad = paramProvider.getDouble("ASM3_FSS_AD"); + // internal variables const double fXMI_BM = fiSS_BM_prod * fXI * iVSS_BM * (iTSS_VSS_BM - 1); const double c1n = iNXS - iNSI * fSI - (1 - fSI) * iNSS; @@ -300,20 +344,26 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.native(_idxSO, 7) = -1; _stoichiometry.native(_idxSO, 9) = -(64.0 / 14.0) * 1 / YA + 1; _stoichiometry.native(_idxSO, 10) = -1 * (1 - fXI); - _stoichiometry.native(_idxSO, 12) = 1; + + if (_activeAeration) + _stoichiometry.native(_idxSO, 12) = 1; + else + _stoichiometry.native(_idxSO, 12) = 0; - // SS_nad - _stoichiometry.native(_idxSS_nad, 0) = (1 - fSI); - _stoichiometry.native(_idxSS_nad, 1) = -1; - _stoichiometry.native(_idxSS_nad, 2) = -1; + + // SS + _stoichiometry.native(_idxSS, 0) = (1 - fSI) * (1 - fSS_ad); + _stoichiometry.native(_idxSS, 1) = -1; + _stoichiometry.native(_idxSS, 2) = -1; // SS_ad - if (_fractionate) + if(_givenAd) { - _stoichiometry.native(_idxSS_ad, 0) = (1 - fSI); - _stoichiometry.native(_idxSS_ad, 1) = -1; - _stoichiometry.native(_idxSS_ad, 2) = -1; + _stoichiometry.native(_idxSS_ad, 0) = (1 - fSI) * fSS_ad; + _stoichiometry.native(_idxSS_ad, 13) = -1; + _stoichiometry.native(_idxSS_ad, 14) = -1; } + // SNH _stoichiometry.native(_idxSNH, 0) = c1n; _stoichiometry.native(_idxSNH, 1) = c2n; @@ -354,12 +404,12 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.native(_idxSALK, 10) = c11a; _stoichiometry.native(_idxSALK, 11) = c12a; - // SI_ad - _stoichiometry.native(_idxSI_nad, 0) = fSI; + // SI + _stoichiometry.native(_idxSI, 0) = fSI * (1 - fSI_ad); - //SI_nad - if(_fractionate) - _stoichiometry.native(_idxSI_ad, 0) = fSI; + //SI_ad + if(_givenAd) + _stoichiometry.native(_idxSI_ad, 0) = fSI * fSI_ad; // XI _stoichiometry.native(_idxXI, 5) = fXI; @@ -395,9 +445,6 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.native(_idxXMI, 10) = fXMI_BM; _stoichiometry.native(_idxXMI, 11) = fXMI_BM; - - //registerCompRowMatrix(_parameters, unitOpIdx, parTypeIdx, "MM_STOICHIOMETRY_BULK", _stoichiometryBulk); todo - return true; } @@ -411,10 +458,22 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase typedef typename DoubleActivePromoter::type flux_t; BufferedArray fluxes = workSpace.array(_stoichiometry.columns()); - const flux_t kh20 = static_cast::type>(p->kh20); - const flux_t T = static_cast::type>(p->T); - const flux_t io2 = static_cast::type>(p->io2); - const flux_t V = static_cast::type>(p->V); + const flux_t T = static_cast::type>(p->T); + if (T < 0) + throw InvalidParameterException("ASM3 configuration: Temperature T must be non-negative"); + + flux_t io2; + flux_t V; + if (_activeAeration) + { + io2 = static_cast::type>(p->io2); + V = static_cast::type>(p->V); + + if(V < 0) + throw InvalidParameterException("ASM3 configuration: Aeration volume V must be non-negative"); + } + + const flux_t kh20 = static_cast::type>(p->kh20); const flux_t k_sto20 = static_cast::type>(p->k_sto20); const flux_t kx = static_cast::type>(p->kx); const flux_t kho2 = static_cast::type>(p->kho2); @@ -445,13 +504,12 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase const double bAUT = static_cast(baut20) * ft105; StateType SO = y[_idxSO]; - StateType SS_nad = y[_idxSS_nad]; + StateType SS = y[_idxSS]; StateType SS_ad = 0.0; - if (_fractionate) - SS_ad = y[_idxSS_ad]; + if (_givenAd) SS_ad = y[_idxSS_ad]; StateType SNH = y[_idxSNH]; StateType SNO = y[_idxSNO]; - StateType SN2 = y[_idxSN2]; + // StateType SN2 = y[_idxSN2]; unused StateType SALK = y[_idxSALK]; // StateType SI = y[_idxSI]; // unused // StateType XI = y[_idxXI]; // unused @@ -464,24 +522,23 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase // p1: Hydrolysis of organic structures fluxes[0] = kh20 * ft04 * (XS/XH) / ((XS/XH) + kx) * XH; - if (XH < 0.1) + if (XH < XH_MIN_THRESHOLD) fluxes[0] = kh20 * ft04 * (XS/0.1) / ((XS/0.1) + kx) * XH; - // p2: Aerobic storage of SS - fluxes[1] = k_sto * SO / (SO + kho2) * ( SS_ad + SS_nad ) / ( ( SS_ad + SS_nad ) + khss ) * XH; + fluxes[1] = k_sto * SO / (SO + kho2) * (SS) / ( ( SS + SS_ad ) + khss ) * XH; // p3: Anoxic storage of SS - fluxes[2] = k_sto * etahno3 * kho2 / (SO + kho2) * ( SS_ad + SS_nad ) / ( ( SS_ad + SS_nad ) + khss ) * SNO / (SNO + khn03) * XH; + fluxes[2] = k_sto * etahno3 * kho2 / (SO + kho2) * (SS) / ( ( SS_ad + SS ) + khss ) * SNO / (SNO + khn03) * XH; // p4: Aerobic growth of heterotrophic biomass (XH) fluxes[3] = muH * SO / (SO + kho2) * SNH / (SNH + khnh4) * SALK / (SALK + khalk) * ((XSTO/XH)) / (((XSTO/XH)) + khsto) * XH; - if (XH < 0.1) + if (XH < XH_MIN_THRESHOLD) fluxes[3] = muH * SO / (SO + kho2) * SNH / (SNH + khnh4) * SALK / (SALK + khalk) * (XSTO / 0.1) / ((XSTO / 0.1) + khsto) * XH; // p5: Anoxic growth of heterotrophic biomass (XH, denitrification) fluxes[4] = muH * etahno3 * kho2 / (kho2 + SO) * SNH / (khnh4 + SNH) * SALK / (khalk + SALK) * (XSTO / XH) * 1 / (khsto + (XSTO / XH)) * SNO / (khn03 + SNO) * XH; - if (XH < 0.1) + if (XH < XH_MIN_THRESHOLD) fluxes[4] = muH * etahno3 * kho2 / (kho2 + SO) * SNH / (khnh4 + SNH) * SALK / (khalk + SALK) * (XSTO / 0.1) * 1 / (khsto + (XSTO/0.1)) * SNO / (khn03 + SNO) * XH; // r6: Aerobic endogenous respiration of heterotroph microorganisms (XH) @@ -506,12 +563,26 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase fluxes[11] = bAUT * etanend * SNO / (SNO + khn03) * kho2 / (SO + kho2) * XA; // r13: Aeration - // TODO: is V in litres? - fluxes[12] = io2 / V; + if (_activeAeration) + fluxes[12] = io2 / V; + else + fluxes[12] = 0.0; + + // p14: Anoxic storage of SS_ad + if (_givenAd) + fluxes[13] = k_sto * SO / (SO + kho2) * (SS_ad) / ( ( SS + SS_ad ) + khss ) * XH; + else + fluxes[13] = 0.0; + + // p15: Aerobic storage of SS_ad + if(_givenAd) + fluxes[14] = k_sto * etahno3 * kho2 / (SO + kho2) * (SS_ad) / ( ( SS_ad + SS ) + khss ) * SNO / (SNO + khn03) * XH; + else + fluxes[14] = 0.0; + // Add reaction terms to residual _stoichiometry.multiplyVector(static_cast(fluxes), factor, res); - return 0; } @@ -569,29 +640,28 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase const double bAUT = static_cast(baut20) * ft105; double SO = y[_idxSO]; - double SS_nad = y[_idxSS_nad]; + double SS = y[_idxSS]; double SS_ad = 0.0; double SNH = y[_idxSNH]; double SNO = y[_idxSNO]; - double SN2 = y[_idxSN2]; + //double SN2 = y[_idxSN2]; double SALK = y[_idxSALK]; - double SI_nad = y[_idxSI_nad]; - double SI_ad = 0.0; + //double SI = y[_idxSI]; + //double SI_ad = 0.0; double XS = y[_idxXS]; double XH = y[_idxXH]; double XSTO = y[_idxXSTO]; double XA = y[_idxXA]; - if (_fractionate) + if (_givenAd) { SS_ad = y[_idxSS_ad]; - SI_ad = y[_idxSI_ad]; + //SI_ad = y[_idxSI_ad]; } - - double d[13][15] = {}; - - + // initialize jacobian + double d[15][15] = {}; + // p1: Hydrolysis: kh20 * ft04 * XS/XH_S / (XS/XH_S + kx) * XH; d[0][_idxXS] = kh20 * ft04 * XH / ((XS + XH * kx) @@ -599,49 +669,47 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase d[0][_idxXH] = kh20 * ft04 * (XS * XS) / ((XS + kx * XH) * (XS + kx * XH)); - if (XH < 0.1) + if (XH < XH_MIN_THRESHOLD) { d[0][_idxXS] = kh20 * ft04 * 0.1 / ((XS + 0.1 * kx) * (XS + 0.1 * kx)) * XH; d[0][_idxXH] = 0.0; } - // p2: Aerobic storage of SS: k_sto * SO / (SO + kho2) * ( SS_ad + SS_nad ) / ( ( SS_ad + SS_nad ) + khss ) * XH; + // p2: Aerobic storage of SS: k_sto * SO / (SO + kho2) * ( SS_ad + SS ) / ( ( SS_ad + SS ) + khss ) * XH; d[1][_idxSO] = k_sto - * (SS_ad + SS_nad) / ((SS_ad + SS_nad) + khss) + * (SS_ad + SS) / ((SS_ad + SS) + khss) * kho2 / ((SO + kho2) * (SO + kho2)) * XH; - if (_fractionate) - d[1][_idxSS_ad] = k_sto + d[1][_idxSS_ad] = k_sto * SO / (SO + kho2) - * khss / ((SS_ad + SS_nad + khss) * (SS_ad + SS_nad + khss)) * XH; - d[1][_idxSS_nad] = k_sto + * khss / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) * XH; + d[1][_idxSS] = k_sto * SO / (SO + kho2) - * khss / ((SS_ad + SS_nad + khss) * (SS_ad + SS_nad + khss)) * XH; + * khss / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) * XH; d[1][_idxXH] = k_sto * SO / (SO + kho2) - * (SS_ad + SS_nad) / ((SS_ad + SS_nad) + khss); + * (SS_ad + SS) / ((SS_ad + SS) + khss); - // p3: Anoxic storage of SS: k_sto * etahno3 * kho2 / (SO + kho2) * ( SS_ad + SS_nad ) / ( ( SS_ad + SS_nad ) + khss ) * SNO / (SNO + khn03) * XH; + // p3: Anoxic storage of SS: k_sto * etahno3 * kho2 / (SO + kho2) * ( SS_ad + SS ) / ( ( SS_ad + SS ) + khss ) * SNO / (SNO + khn03) * XH; d[2][_idxSO] = k_sto * etahno3 * -kho2 / ((SO + kho2) * (SO + kho2)) - * (SS_ad + SS_nad) / ((SS_ad + SS_nad) + khss) + * (SS_ad + SS) / (SS_ad + SS + khss) * SNO / (SNO + khn03) * XH; - if(_fractionate) - d[2][_idxSS_ad] = k_sto * etahno3 + d[2][_idxSS_ad] = k_sto * etahno3 * kho2 / (SO + kho2) - * khss / ((SS_ad + SS_nad + khss) * (SS_ad + SS_nad + khss)) + * khss / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) * SNO / (SNO + khn03) * XH; - d[2][_idxSS_nad] = k_sto * etahno3 + d[2][_idxSS] = k_sto * etahno3 * kho2 / (SO + kho2) - * khss / ((SS_ad + SS_nad + khss) * (SS_ad + SS_nad + khss)) + * khss / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) * SNO / (SNO + khn03) * XH; d[2][_idxSNO] = k_sto * etahno3 * kho2 / (SO + kho2) - * (SS_ad + SS_nad) / ((SS_ad + SS_nad) + khss) + * (SS_ad + SS) / ((SS_ad + SS) + khss) * khn03 / ((SNO + khn03) * (SNO + khn03)) * XH; d[2][_idxXH] = k_sto * etahno3 * kho2 / (SO + kho2) - * (SS_ad + SS_nad) / ((SS_ad + SS_nad) + khss) + * (SS_ad + SS) / ((SS_ad + SS) + khss) * SNO / (SNO + khn03); // p4: Aerobic growth: muH * SO / (SO + kho2) * SNH / (SNH + khnh4) * SALK / (SALK + khalk) * (XSTO/XH_S) / ((XSTO/XH_S) + khsto) * XH; @@ -671,7 +739,7 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase * SALK / (SALK + khalk) * (XSTO * XSTO) / ((XSTO + khsto * XH) * (XSTO + khsto * XH)); - if (XH < 0.1) + if (XH < XH_MIN_THRESHOLD) { d[3][_idxSO] = muH * -kho2 / ((SO + kho2) * (SO + kho2)) @@ -737,7 +805,7 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase * (XSTO * XSTO) / ((XSTO + khsto * XH) * (XSTO + khsto * XH)); - if (XH < 0.1) + if (XH < XH_MIN_THRESHOLD) { d[4][_idxSO] = muH * etahno3 * -kho2 / ((kho2 + SO) * (kho2 + SO)) @@ -839,6 +907,45 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase d[11][_idxXA] = bAUT * etanend * SNO / (SNO + khn03) * kho2 / (SO + kho2); + + //reaction13: Aeration: io2 / V; + // no jacobian terms + + // p14: Aerobic storage of SS_ad: k_sto * SO / (SO + kho2) * ( SS_ad ) / ( ( SS_ad + SS ) + khss ) * XH; + d[13][_idxSO] = k_sto + * (SS_ad) / ((SS_ad + SS) + khss) + * kho2 / ((SO + kho2) * (SO + kho2)) * XH; + d[13][_idxSS_ad] = k_sto + * SO / (SO + kho2) + * (khss * SS) / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) * XH; + d[13][_idxSS] = - k_sto + * SO / (SO + kho2) + * (khss * SS_ad) / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) * XH; + d[13][_idxXH] = k_sto + * SO / (SO + kho2) + * (SS_ad) / ((SS_ad + SS) + khss); + + // p15: Anoxic storage of SS_ad: k_sto * etahno3 * kho2 / (SO + kho2) * ( SS_ad ) / ( ( SS_ad + SS ) + khss ) * SNO / (SNO + khn03) * XH; + d[14][_idxSO] = k_sto * etahno3 + * -kho2 / ((SO + kho2) * (SO + kho2)) + * (SS_ad) / (SS_ad + SS + khss) + * SNO / (SNO + khn03) * XH; + d[14][_idxSS_ad] = k_sto * etahno3 + * kho2 / (SO + kho2) + * (khss * SS) / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) + * SNO / (SNO + khn03) * XH; + d[14][_idxSS] = - k_sto * etahno3 + * kho2 / (SO + kho2) + * (khss) / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) + * SNO / (SNO + khn03) * XH; + d[14][_idxSNO] = k_sto * etahno3 + * kho2 / (SO + kho2) + * (SS_ad) / ((SS_ad + SS) + khss) + * khn03 / ((SNO + khn03) * (SNO + khn03)) * XH; + d[14][_idxXH] = k_sto * etahno3 + * kho2 / (SO + kho2) + * (SS_ad) / ((SS_ad + SS) + khss) + * SNO / (SNO + khn03); RowIterator curJac = jac; @@ -850,17 +957,6 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase double colFactor = static_cast(_stoichiometry.native(row, rIdx)); for (size_t compIdx = 0; compIdx < _stoichiometry.rows(); compIdx++) { - if (_fractionate) - { - if (compIdx == _idxSI_ad) - colFactor *= SI_ad / (SI_ad + SI_nad); - if (compIdx == _idxSI_nad) - colFactor *= SI_nad / (SI_ad + SI_nad); - if (compIdx == _idxSS_ad) - colFactor *= SS_ad / (SS_ad + SS_nad); - if (compIdx == _idxSS_nad) - colFactor *= SS_nad / (SS_ad + SS_nad); - } curJac[compIdx - static_cast(row)] += colFactor * d[rIdx][compIdx]; } } diff --git a/test/ReactionModels.cpp b/test/ReactionModels.cpp index 6cc9c8cb4..25bfc77ba 100644 --- a/test/ReactionModels.cpp +++ b/test/ReactionModels.cpp @@ -164,7 +164,7 @@ TEST_CASE("MichaelisMenten kinetic analytic Jacobian vs AD without inhibition", TEST_CASE("MichaelisMenten kinetic analytic Jacobian vs AD with inhibition", "[MichaelisMenten],[ReactionModel],[Jacobian],[AD]") { - const unsigned int nBound[] = {1.0, 2.0, 1.0}; + const unsigned int nBound[] = {1, 2, 1}; const double point[] = {1.0, 2.0, 1.4, 2.1, 0.2, 1.1, 1.8}; cadet::test::reaction::testDynamicJacobianAD("MICHAELIS_MENTEN", 3, nBound, R"json({ @@ -178,11 +178,11 @@ TEST_CASE("MichaelisMenten kinetic analytic Jacobian vs AD with inhibition", "[M point, 1e-15, 1e-15 ); } -TEST_CASE("ASM3 analytic Jacobian vs AD", "[ASM3],[ReactionModel],[Jacobian],[AD]") +TEST_CASE("ASM3 analytic Jacobian vs AD", "[ASM3],[ReactionModel],[Jacobian],[AD],[CI]") { const unsigned int nBound[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0, 0, 0 }; unsigned int ncomp = 13; - const double point[] = { 1.0, 2.0, 1.4, 2.1, 0.2, 1.1, 1.8, 1.5, 1.0, 4.2, 1.4, 0.3, 1.4}; + const double point[] = { 1.0, 2.0, 1.4, 2.1, 0.2, 1.1, 1.8, 1.5, 1.0, 4.2, 1.4, 0.3, 1.4 }; cadet::test::reaction::testLiquidReactionJacobianAD("ACTIVATED_SLUDGE_MODEL3", ncomp, nBound, R"json({ "ASM3_FISS_BM_PROD": 1.0, @@ -226,7 +226,7 @@ TEST_CASE("ASM3 analytic Jacobian vs AD", "[ASM3],[ReactionModel],[Jacobian],[AD "ASM3_IVSS_BM": 0.704225352, "ASM3_ITSS_VSS_BM": 1.086956522 })json", - point, 1e-15, 1e-15 + point, 1e-12, 1e-12 ); } From f68248d0c6c52c9fc776d7d97be6ddc09c059b3f Mon Sep 17 00:00:00 2001 From: AntoniaBerger Date: Thu, 15 Jan 2026 11:09:32 +0100 Subject: [PATCH 46/47] rebase --- .../reaction/ActivatedSludgeModelThree.cpp | 4 +- test/ReactionModelTests.cpp | 74 +++++++++++++++++++ test/ReactionModels.cpp | 2 +- 3 files changed, 77 insertions(+), 3 deletions(-) diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index fc639cdb4..cccf4567e 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -449,7 +449,7 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase } template - int residualLiquidImpl(double t, unsigned int secIdx, const ColumnPosition& colPos, + int residualFluxImpl(double t, unsigned int secIdx, const ColumnPosition& colPos, const unsigned int nStates, StateType const* y, ResidualType* res, const FactorType& factor, LinearBufferAllocator workSpace) const { typename ParamHandler_t::ParamsHandle const p = _paramHandler.update(t, secIdx, colPos, _nComp, _nBoundStates, workSpace); @@ -601,7 +601,7 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase } template - void jacobianLiquidImpl(double t, unsigned int secIdx, const ColumnPosition& colPos, double const* y, double factor, const RowIterator& jac, LinearBufferAllocator workSpace) const + void jacobianFluxImpl(double t, unsigned int secIdx, const ColumnPosition& colPos, const unsigned int nStates, double const* y, double factor, const RowIterator& jac, LinearBufferAllocator workSpace) const { typename ParamHandler_t::ParamsHandle const p = _paramHandler.update(t, secIdx, colPos, _nComp, _nBoundStates, workSpace); diff --git a/test/ReactionModelTests.cpp b/test/ReactionModelTests.cpp index 5f13df427..0a3cc7515 100644 --- a/test/ReactionModelTests.cpp +++ b/test/ReactionModelTests.cpp @@ -499,6 +499,80 @@ namespace reaction testTimeDerivativeJacobianDynamicReactionsFD(jpp, bulk, particle, particleModifiers, h, absTol, relTol); } + void testLiquidReactionJacobianAD(const char* modelName, unsigned int nComp, unsigned int const* nBound, const char* config, double const* point, double absTol, double relTol) + { + ConfiguredDynamicReactionModel crm = ConfiguredDynamicReactionModel::create(modelName, nComp, nBound, config); + + const unsigned int numDofs = crm.nComp(); + std::vector yState(numDofs, 0.0); + std::copy_n(point, numDofs, yState.data()); + + std::vector dir(numDofs, 0.0); + std::vector colA(numDofs, 0.0); + std::vector colB(numDofs, 0.0); + + // Enable AD + cadet::ad::setDirections(cadet::ad::getMaxDirections()); + cadet::active* adRes = new cadet::active[numDofs]; + cadet::active* adY = new cadet::active[numDofs]; + + // Liquid phase only + + // Evaluate with AD + ad::prepareAdVectorSeedsForDenseMatrix(adY, 0, numDofs); + ad::copyToAd(yState.data(), adY, numDofs); + ad::resetAd(adRes, numDofs); + crm.model().residualFluxAdd(1.0, 0u, ColumnPosition{0.0, 0.0, 0.0}, crm.nComp(), adY, adRes, 1.0, crm.buffer()); + + // Extract Jacobian + cadet::linalg::DenseMatrix jacAD; + jacAD.resize(numDofs, numDofs); + ad::extractDenseJacobianFromAd(adRes, 0, jacAD); + + // Calculate analytic Jacobian + cadet::linalg::DenseMatrix jacAna; + jacAna.resize(numDofs, numDofs); + crm.model().analyticJacobianAdd(1.0, 0u, ColumnPosition{0.0, 0.0, 0.0}, crm.nComp(), yState.data(), 1.0, jacAna.row(0), crm.buffer()); + + delete[] adY; + delete[] adRes; + + cadet::test::checkJacobianPatternFD( + [&](double const* lDir, double* res) -> void + { + std::fill_n(res, numDofs, 0.0); + crm.model().residualFluxAdd(1.0, 0u, ColumnPosition{0.0, 0.0, 0.0}, crm.nComp(), lDir, res, 1.0, crm.buffer()); + }, + [&](double const* lDir, double* res) -> void + { + jacAna.multiplyVector(lDir, res); + }, + yState.data(), dir.data(), colA.data(), colB.data(), numDofs, numDofs); + + cadet::test::checkJacobianPatternFD( + [&](double const* lDir, double* res) -> void + { + std::fill_n(res, numDofs, 0.0); + crm.model().residualFluxAdd(1.0, 0u, ColumnPosition{0.0, 0.0, 0.0}, crm.nComp(), lDir, res, 1.0, crm.buffer()); + }, + [&](double const* lDir, double* res) -> void + { + jacAD.multiplyVector(lDir, res); + }, + yState.data(), dir.data(), colA.data(), colB.data(), numDofs, numDofs); + + // Check Jacobians against each other + for (unsigned int row = 0; row < numDofs; ++row) + { + for (unsigned int col = 0; col < numDofs; ++col) + { + CAPTURE(row); + CAPTURE(col); + CHECK(jacAna.native(row, col) == makeApprox(jacAD.native(row, col), absTol, relTol)); + } + } + } + } // namespace reaction } // namespace test } // namespace cadet diff --git a/test/ReactionModels.cpp b/test/ReactionModels.cpp index 25bfc77ba..f3398550b 100644 --- a/test/ReactionModels.cpp +++ b/test/ReactionModels.cpp @@ -250,4 +250,4 @@ TEST_CASE("MassActionLaw one reaction vs. two separate reactions", "[MassActionL cadet::test::column::DummyParams disc; cadet::test::column::testReferenceBenchmark(modelFilePath, refFilePath, "001", absTol, relTol, disc, true); - +} From 7e65d1c7e571cd1883b20c240e0add7691639477 Mon Sep 17 00:00:00 2001 From: "a.berger" Date: Wed, 21 Jan 2026 13:22:38 +0100 Subject: [PATCH 47/47] Add simulation test (without adsoption vs with adsoption components) --- .../reaction/ActivatedSludgeModelThree.cpp | 50 +- test/ReactionModelTests.cpp | 36 + test/ReactionModelTests.hpp | 11 + test/ReactionModels.cpp | 11 + .../data/configuration_CSTR_ASM3_with_ad.json | 1121 +++++++++++++++++ .../configuration_CSTR_ASM3_without_ad.json | 1117 ++++++++++++++++ 6 files changed, 2327 insertions(+), 19 deletions(-) create mode 100644 test/data/configuration_CSTR_ASM3_with_ad.json create mode 100644 test/data/configuration_CSTR_ASM3_without_ad.json diff --git a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp index cccf4567e..2536497d4 100644 --- a/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp +++ b/src/libcadet/model/reaction/ActivatedSludgeModelThree.cpp @@ -271,13 +271,14 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase } - _stoichiometry.resize(_nComp, 15); // option to optimize: Depending on whether adsorbed components are used or not 13/12 or 15 reactions are needed + _stoichiometry.resize(15, 15); // option to optimize: Depending on whether adsorbed components are used or not 13/12 or 15 reactions are needed _stoichiometry.setAll(0); // parameter set ASM3h const double iNSI = paramProvider.getDouble("ASM3_INSI"); const double iNSS = paramProvider.getDouble("ASM3_INSS"); const double iNXI = paramProvider.getDouble("ASM3_INXI"); + const double iNXS = paramProvider.getDouble("ASM3_INXS"); const double iNBM = paramProvider.getDouble("ASM3_INBM"); @@ -344,6 +345,8 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.native(_idxSO, 7) = -1; _stoichiometry.native(_idxSO, 9) = -(64.0 / 14.0) * 1 / YA + 1; _stoichiometry.native(_idxSO, 10) = -1 * (1 - fXI); + _stoichiometry.native(_idxSO, 13) = YSTO_aer - 1; + if (_activeAeration) _stoichiometry.native(_idxSO, 12) = 1; @@ -357,12 +360,10 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.native(_idxSS, 2) = -1; // SS_ad - if(_givenAd) - { - _stoichiometry.native(_idxSS_ad, 0) = (1 - fSI) * fSS_ad; - _stoichiometry.native(_idxSS_ad, 13) = -1; - _stoichiometry.native(_idxSS_ad, 14) = -1; - } + _stoichiometry.native(_idxSS_ad, 0) = (1 - fSI) * fSS_ad; + _stoichiometry.native(_idxSS_ad, 13) = -1; + _stoichiometry.native(_idxSS_ad, 14) = -1; + // SNH _stoichiometry.native(_idxSNH, 0) = c1n; @@ -375,6 +376,8 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.native(_idxSNH, 9) = c10n; _stoichiometry.native(_idxSNH, 10) = c11n; _stoichiometry.native(_idxSNH, 11) = c12n; + _stoichiometry.native(_idxSNH, 13) = c2n; + _stoichiometry.native(_idxSNH, 14) = c3n; // SNO _stoichiometry.native(_idxSNO, 2) = c3no; @@ -383,6 +386,8 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.native(_idxSNO, 8) = c9no; _stoichiometry.native(_idxSNO, 9) = c10no; _stoichiometry.native(_idxSNO, 11) = c12no; + _stoichiometry.native(_idxSNO, 14) = c3no; + // SN2 _stoichiometry.native(_idxSN2, 2) = -c3no; @@ -390,6 +395,9 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.native(_idxSN2, 6) = -c7no; _stoichiometry.native(_idxSN2, 8) = -c9no; _stoichiometry.native(_idxSN2, 11) = -c12no; + _stoichiometry.native(_idxSN2, 14) = -c3no; + + // SALK _stoichiometry.native(_idxSALK, 0) = c1a; @@ -403,13 +411,14 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.native(_idxSALK, 9) = c10a; _stoichiometry.native(_idxSALK, 10) = c11a; _stoichiometry.native(_idxSALK, 11) = c12a; + _stoichiometry.native(_idxSALK, 12) = c2a; + _stoichiometry.native(_idxSALK, 13) = c3a; // SI _stoichiometry.native(_idxSI, 0) = fSI * (1 - fSI_ad); //SI_ad - if(_givenAd) - _stoichiometry.native(_idxSI_ad, 0) = fSI * fSI_ad; + _stoichiometry.native(_idxSI_ad, 0) = fSI * fSI_ad; // XI _stoichiometry.native(_idxXI, 5) = fXI; @@ -426,6 +435,7 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.native(_idxXH, 5) = -1; _stoichiometry.native(_idxXH, 6) = -1; + // XSTO _stoichiometry.native(_idxXSTO, 1) = YSTO_aer; _stoichiometry.native(_idxXSTO, 2) = YSTO_anox; @@ -433,6 +443,8 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase _stoichiometry.native(_idxXSTO, 4) = -1 / YH_anox; _stoichiometry.native(_idxXSTO, 7) = -1; _stoichiometry.native(_idxXSTO, 8) = -1; + _stoichiometry.native(_idxXSTO, 13) = YSTO_aer; + _stoichiometry.native(_idxXSTO, 14) = YSTO_anox; // XA _stoichiometry.native(_idxXA, 9) = 1; @@ -676,32 +688,32 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase d[0][_idxXH] = 0.0; } - // p2: Aerobic storage of SS: k_sto * SO / (SO + kho2) * ( SS_ad + SS ) / ( ( SS_ad + SS ) + khss ) * XH; + // p2: Aerobic storage of SS: k_sto * SO / (SO + kho2) * ( SS ) / ( ( SS_ad + SS ) + khss ) * XH; d[1][_idxSO] = k_sto * (SS_ad + SS) / ((SS_ad + SS) + khss) * kho2 / ((SO + kho2) * (SO + kho2)) * XH; d[1][_idxSS_ad] = k_sto * SO / (SO + kho2) - * khss / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) * XH; + * -SS / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) * XH; d[1][_idxSS] = k_sto * SO / (SO + kho2) - * khss / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) * XH; + * (khss + SS_ad) / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) * XH; d[1][_idxXH] = k_sto * SO / (SO + kho2) * (SS_ad + SS) / ((SS_ad + SS) + khss); - // p3: Anoxic storage of SS: k_sto * etahno3 * kho2 / (SO + kho2) * ( SS_ad + SS ) / ( ( SS_ad + SS ) + khss ) * SNO / (SNO + khn03) * XH; + // p3: Anoxic storage of SS: k_sto * etahno3 * kho2 / (SO + kho2) * ( SS ) / ( ( SS_ad + SS ) + khss ) * SNO / (SNO + khn03) * XH; d[2][_idxSO] = k_sto * etahno3 * -kho2 / ((SO + kho2) * (SO + kho2)) * (SS_ad + SS) / (SS_ad + SS + khss) * SNO / (SNO + khn03) * XH; d[2][_idxSS_ad] = k_sto * etahno3 * kho2 / (SO + kho2) - * khss / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) + * -SS / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) * SNO / (SNO + khn03) * XH; d[2][_idxSS] = k_sto * etahno3 * kho2 / (SO + kho2) - * khss / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) + * (khss + SS_ad) / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) * SNO / (SNO + khn03) * XH; d[2][_idxSNO] = k_sto * etahno3 * kho2 / (SO + kho2) @@ -918,9 +930,9 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase d[13][_idxSS_ad] = k_sto * SO / (SO + kho2) * (khss * SS) / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) * XH; - d[13][_idxSS] = - k_sto + d[13][_idxSS] = k_sto * SO / (SO + kho2) - * (khss * SS_ad) / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) * XH; + * (-SS_ad) / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) * XH; d[13][_idxXH] = k_sto * SO / (SO + kho2) * (SS_ad) / ((SS_ad + SS) + khss); @@ -934,9 +946,9 @@ class ActivatedSludgeModelThreeBase : public DynamicReactionModelBase * kho2 / (SO + kho2) * (khss * SS) / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) * SNO / (SNO + khn03) * XH; - d[14][_idxSS] = - k_sto * etahno3 + d[14][_idxSS] = k_sto * etahno3 * kho2 / (SO + kho2) - * (khss) / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) + * (-SS_ad) / ((SS_ad + SS + khss) * (SS_ad + SS + khss)) * SNO / (SNO + khn03) * XH; d[14][_idxSNO] = k_sto * etahno3 * kho2 / (SO + kho2) diff --git a/test/ReactionModelTests.cpp b/test/ReactionModelTests.cpp index 0a3cc7515..3f5c9f746 100644 --- a/test/ReactionModelTests.cpp +++ b/test/ReactionModelTests.cpp @@ -573,6 +573,42 @@ namespace reaction } } + void testCompareTwoSimulationReaction(const std::string configFilePath1, const std::string configFilePath2, const double absTol, const double relTol, const int compIdx1, const int compIdx2) + { + // read json model setup file + const std::string setupFile1 = std::string(getTestDirectory()) + configFilePath1; + const std::string setupFile2 = std::string(getTestDirectory()) + configFilePath2; + JsonParameterProvider pp_setup_1(JsonParameterProvider::fromFile(setupFile1)); + JsonParameterProvider pp_setup_2(JsonParameterProvider::fromFile(setupFile2)); + + nlohmann::json* setupJson1 = pp_setup_1.data(); + nlohmann::json* setupJson2 = pp_setup_2.data(); + + // 1. simulation + cadet::Driver drv1; + drv1.configure(pp_setup_1); + drv1.run(); + + // 2. simulation + cadet::Driver drv2; + drv2.configure(pp_setup_2); + drv2.run(); + + cadet::InternalStorageUnitOpRecorder const* const Data1 = drv1.solution()->unitOperation(0); + cadet::InternalStorageUnitOpRecorder const* const Data2 = drv2.solution()->unitOperation(0); + + double const* outlet1 = Data1->outlet(); + double const* outlet2 = Data2->outlet(); + + const unsigned int nComp1 = Data1->numComponents(); + const unsigned int nComp2 = Data2->numComponents(); + for (unsigned int i = 0; i < Data2->numDataPoints(); ++i, outlet1 += nComp1, outlet2 += nComp2) + { + CAPTURE(i); + CHECK((outlet1[compIdx1]) == cadet::test::makeApprox(outlet2[compIdx2], relTol, absTol)); + } + } + } // namespace reaction } // namespace test } // namespace cadet diff --git a/test/ReactionModelTests.hpp b/test/ReactionModelTests.hpp index d8cdd549b..70a3181e9 100644 --- a/test/ReactionModelTests.hpp +++ b/test/ReactionModelTests.hpp @@ -205,6 +205,17 @@ namespace reaction */ void testTimeDerivativeJacobianDynamicReactionsFD(const std::string& uoType, const std::string& spatialMethod, bool bulk, bool particle, bool particleModifiers, double h, double absTol, double relTol); + /** + * @brief Compares two simulations (1 and 2) wrt specific components + * @param [in] configFilePathMM relative file path to 1. configuration file + * @param [in] configFilePathSMA relative file path to 2. configuration file + * @param [in] absTol Absolute error tolerance + * @param [in] relTol Relative error tolerance + * @param [in] comIdx compare index component + */ + void testCompareTwoSimulationReaction(const std::string configFilePath1, const std::string configFilePath2, const double absTol, const double relTol, const int compIdx1, const int compIdx2); + + } // namespace reaction } // namespace test } // namespace cadet diff --git a/test/ReactionModels.cpp b/test/ReactionModels.cpp index f3398550b..6f57a18b6 100644 --- a/test/ReactionModels.cpp +++ b/test/ReactionModels.cpp @@ -251,3 +251,14 @@ TEST_CASE("MassActionLaw one reaction vs. two separate reactions", "[MassActionL cadet::test::column::DummyParams disc; cadet::test::column::testReferenceBenchmark(modelFilePath, refFilePath, "001", absTol, relTol, disc, true); } + +TEST_CASE("ASM3 simulation with adsorption component vs ASM3 without adsorption component", "[CSTR],[ASM3],[ReactionModel],[Simulation],[Reference],[CI]") +{ + const std::string& configFilePath1 = std::string("/data/configuration_CSTR_ASM3_without_ad.json"); + const std::string& configFilePath2 = std::string("/data/configuration_CSTR_ASM3_with_ad.json"); + + const double absTol = 1e-3; + const double relTol = 5e-4; + + cadet::test::reaction::testCompareTwoSimulationReaction(configFilePath1, configFilePath2, absTol, relTol,1, 14); +} diff --git a/test/data/configuration_CSTR_ASM3_with_ad.json b/test/data/configuration_CSTR_ASM3_with_ad.json new file mode 100644 index 000000000..c1d8a3f55 --- /dev/null +++ b/test/data/configuration_CSTR_ASM3_with_ad.json @@ -0,0 +1,1121 @@ +{ + "model": { + "NUNITS": 1, + "connections": { + "NSWITCHES": 1, + "switch_000": { + "CONNECTIONS": [], + "SECTION": 0 + } + }, + "solver": { + "GS_TYPE": 1, + "MAX_KRYLOV": 0, + "MAX_RESTARTS": 10, + "SCHUR_SAFETY": 1e-08 + }, + "unit_000": { + "INIT_C": [ + 1.0, + 0.0, + 3.0, + 4.0, + 5.0, + 6.0, + 7.0, + 8.0, + 9.0, + 10.0, + 11.0, + 12.0, + 13.0, + 0.0, + 2.0 + ], + "INIT_LIQUID_VOLUME": 10, + "NCOMP": 15, + "NREAC_LIQUID": 1, + "UNIT_TYPE": "CSTR", + "liquid_reaction_000": { + "TYPE": "ACTIVATED_SLUDGE_MODEL3", + "ASM3_FISS_BM_PROD": 1.0, + "ASM3_FSI": 0.0, + "ASM3_YH_AER": 0.8, + "ASM3_YH_ANOX": 0.65, + "ASM3_YSTO_AER": 0.8375, + "ASM3_YSTO_ANOX": 0.7, + "ASM3_FXI": 0.2, + "ASM3_YA": 0.24, + "ASM3_KH20": 9.0, + "ASM3_KX": 1.0, + "ASM3_KSTO20": 12.0, + "ASM3_MU_H20": 3.0, + "ASM3_BH20": 0.33, + "ASM3_ETA_HNO3": 0.5, + "ASM3_KHO2": 0.2, + "ASM3_KHSS": 10.0, + "ASM3_KHNO3": 0.5, + "ASM3_KHNH4": 0.01, + "ASM3_KHALK": 0.1, + "ASM3_KHSTO": 0.1, + "ASM3_MU_AUT20": 1.12, + "ASM3_BAUT20": 0.18, + "ASM3_ETAH_END": 0.5, + "ASM3_ETAN_END": 0.5, + "ASM3_KNO2": 0.5, + "ASM3_KNNH4": 0.7, + "ASM3_KNALK": 0.5, + "ASM3_T": 12.0, + "ASM3_V": 10.0, + "ASM3_IO2": 0.0, + "ASM3_INSI": 0.01, + "ASM3_INSS": 0.03, + "ASM3_INXI": 0.04, + "ASM3_INXS": 0.03, + "ASM3_INBM": 0.07, + "ASM3_IVSS_XI": 0.751879699, + "ASM3_IVSS_XS": 0.555555556, + "ASM3_IVSS_STO": 0.6, + "ASM3_IVSS_BM": 0.704225352, + "ASM3_ITSS_VSS_BM": 1.086956522, + "ASM3_FSS_AD": 1.0, + "ASM3_FSI_AD": 0.0 + } + } + }, + "return": { + "SPLIT_COMPONENTS_DATA": false, + "SPLIT_PORTS_DATA": 0, + "unit_000": { + "WRITE_COORDINATES": 1, + "WRITE_SENS_OUTLET": 1, + "WRITE_SOLUTION_BULK": 1, + "WRITE_SOLUTION_FLUX": 1, + "WRITE_SOLUTION_INLET": 1, + "WRITE_SOLUTION_OUTLET": 1, + "WRITE_SOLUTION_PARTICLE": 1, + "WRITE_SOLUTION_SOLID": 1, + "WRITE_SOLUTION_VOLUME": 1 + } + }, + "solver": { + "NTHREADS": 1, + "USER_SOLUTION_TIMES": [ + 0.0, + 0.05, + 0.1, + 0.15000000000000002, + 0.2, + 0.25, + 0.30000000000000004, + 0.35000000000000003, + 0.4, + 0.45, + 0.5, + 0.55, + 0.6000000000000001, + 0.65, + 0.7000000000000001, + 0.75, + 0.8, + 0.8500000000000001, + 0.9, + 0.9500000000000001, + 1.0, + 1.05, + 1.1, + 1.1500000000000001, + 1.2000000000000002, + 1.25, + 1.3, + 1.35, + 1.4000000000000001, + 1.4500000000000002, + 1.5, + 1.55, + 1.6, + 1.6500000000000001, + 1.7000000000000002, + 1.75, + 1.8, + 1.85, + 1.9000000000000001, + 1.9500000000000002, + 2.0, + 2.0500000000000003, + 2.1, + 2.15, + 2.2, + 2.25, + 2.3000000000000003, + 2.35, + 2.4000000000000004, + 2.45, + 2.5, + 2.5500000000000003, + 2.6, + 2.6500000000000004, + 2.7, + 2.75, + 2.8000000000000003, + 2.85, + 2.9000000000000004, + 2.95, + 3.0, + 3.0500000000000003, + 3.1, + 3.1500000000000004, + 3.2, + 3.25, + 3.3000000000000003, + 3.35, + 3.4000000000000004, + 3.45, + 3.5, + 3.5500000000000003, + 3.6, + 3.6500000000000004, + 3.7, + 3.75, + 3.8000000000000003, + 3.85, + 3.9000000000000004, + 3.95, + 4.0, + 4.05, + 4.1000000000000005, + 4.15, + 4.2, + 4.25, + 4.3, + 4.3500000000000005, + 4.4, + 4.45, + 4.5, + 4.55, + 4.6000000000000005, + 4.65, + 4.7, + 4.75, + 4.800000000000001, + 4.8500000000000005, + 4.9, + 4.95, + 5.0, + 5.050000000000001, + 5.1000000000000005, + 5.15, + 5.2, + 5.25, + 5.300000000000001, + 5.3500000000000005, + 5.4, + 5.45, + 5.5, + 5.550000000000001, + 5.6000000000000005, + 5.65, + 5.7, + 5.75, + 5.800000000000001, + 5.8500000000000005, + 5.9, + 5.95, + 6.0, + 6.050000000000001, + 6.1000000000000005, + 6.15, + 6.2, + 6.25, + 6.300000000000001, + 6.3500000000000005, + 6.4, + 6.45, + 6.5, + 6.550000000000001, + 6.6000000000000005, + 6.65, + 6.7, + 6.75, + 6.800000000000001, + 6.8500000000000005, + 6.9, + 6.95, + 7.0, + 7.050000000000001, + 7.1000000000000005, + 7.15, + 7.2, + 7.25, + 7.300000000000001, + 7.3500000000000005, + 7.4, + 7.45, + 7.5, + 7.550000000000001, + 7.6000000000000005, + 7.65, + 7.7, + 7.75, + 7.800000000000001, + 7.8500000000000005, + 7.9, + 7.95, + 8.0, + 8.05, + 8.1, + 8.15, + 8.200000000000001, + 8.25, + 8.3, + 8.35, + 8.4, + 8.450000000000001, + 8.5, + 8.55, + 8.6, + 8.65, + 8.700000000000001, + 8.75, + 8.8, + 8.85, + 8.9, + 8.950000000000001, + 9.0, + 9.05, + 9.1, + 9.15, + 9.200000000000001, + 9.25, + 9.3, + 9.35, + 9.4, + 9.450000000000001, + 9.5, + 9.55, + 9.600000000000001, + 9.65, + 9.700000000000001, + 9.75, + 9.8, + 9.850000000000001, + 9.9, + 9.950000000000001, + 10.0, + 10.05, + 10.100000000000001, + 10.15, + 10.200000000000001, + 10.25, + 10.3, + 10.350000000000001, + 10.4, + 10.450000000000001, + 10.5, + 10.55, + 10.600000000000001, + 10.65, + 10.700000000000001, + 10.75, + 10.8, + 10.850000000000001, + 10.9, + 10.950000000000001, + 11.0, + 11.05, + 11.100000000000001, + 11.15, + 11.200000000000001, + 11.25, + 11.3, + 11.350000000000001, + 11.4, + 11.450000000000001, + 11.5, + 11.55, + 11.600000000000001, + 11.65, + 11.700000000000001, + 11.75, + 11.8, + 11.850000000000001, + 11.9, + 11.950000000000001, + 12.0, + 12.05, + 12.100000000000001, + 12.15, + 12.200000000000001, + 12.25, + 12.3, + 12.350000000000001, + 12.4, + 12.450000000000001, + 12.5, + 12.55, + 12.600000000000001, + 12.65, + 12.700000000000001, + 12.75, + 12.8, + 12.850000000000001, + 12.9, + 12.950000000000001, + 13.0, + 13.05, + 13.100000000000001, + 13.15, + 13.200000000000001, + 13.25, + 13.3, + 13.350000000000001, + 13.4, + 13.450000000000001, + 13.5, + 13.55, + 13.600000000000001, + 13.65, + 13.700000000000001, + 13.75, + 13.8, + 13.850000000000001, + 13.9, + 13.950000000000001, + 14.0, + 14.05, + 14.100000000000001, + 14.15, + 14.200000000000001, + 14.25, + 14.3, + 14.350000000000001, + 14.4, + 14.450000000000001, + 14.5, + 14.55, + 14.600000000000001, + 14.65, + 14.700000000000001, + 14.75, + 14.8, + 14.850000000000001, + 14.9, + 14.950000000000001, + 15.0, + 15.05, + 15.100000000000001, + 15.15, + 15.200000000000001, + 15.25, + 15.3, + 15.350000000000001, + 15.4, + 15.450000000000001, + 15.5, + 15.55, + 15.600000000000001, + 15.65, + 15.700000000000001, + 15.75, + 15.8, + 15.850000000000001, + 15.9, + 15.950000000000001, + 16.0, + 16.05, + 16.1, + 16.150000000000002, + 16.2, + 16.25, + 16.3, + 16.35, + 16.400000000000002, + 16.45, + 16.5, + 16.55, + 16.6, + 16.650000000000002, + 16.7, + 16.75, + 16.8, + 16.85, + 16.900000000000002, + 16.95, + 17.0, + 17.05, + 17.1, + 17.150000000000002, + 17.2, + 17.25, + 17.3, + 17.35, + 17.400000000000002, + 17.45, + 17.5, + 17.55, + 17.6, + 17.650000000000002, + 17.7, + 17.75, + 17.8, + 17.85, + 17.900000000000002, + 17.95, + 18.0, + 18.05, + 18.1, + 18.150000000000002, + 18.2, + 18.25, + 18.3, + 18.35, + 18.400000000000002, + 18.45, + 18.5, + 18.55, + 18.6, + 18.650000000000002, + 18.7, + 18.75, + 18.8, + 18.85, + 18.900000000000002, + 18.95, + 19.0, + 19.05, + 19.1, + 19.150000000000002, + 19.200000000000003, + 19.25, + 19.3, + 19.35, + 19.400000000000002, + 19.450000000000003, + 19.5, + 19.55, + 19.6, + 19.650000000000002, + 19.700000000000003, + 19.75, + 19.8, + 19.85, + 19.900000000000002, + 19.950000000000003, + 20.0, + 20.05, + 20.1, + 20.150000000000002, + 20.200000000000003, + 20.25, + 20.3, + 20.35, + 20.400000000000002, + 20.450000000000003, + 20.5, + 20.55, + 20.6, + 20.650000000000002, + 20.700000000000003, + 20.75, + 20.8, + 20.85, + 20.900000000000002, + 20.950000000000003, + 21.0, + 21.05, + 21.1, + 21.150000000000002, + 21.200000000000003, + 21.25, + 21.3, + 21.35, + 21.400000000000002, + 21.450000000000003, + 21.5, + 21.55, + 21.6, + 21.650000000000002, + 21.700000000000003, + 21.75, + 21.8, + 21.85, + 21.900000000000002, + 21.950000000000003, + 22.0, + 22.05, + 22.1, + 22.150000000000002, + 22.200000000000003, + 22.25, + 22.3, + 22.35, + 22.400000000000002, + 22.450000000000003, + 22.5, + 22.55, + 22.6, + 22.650000000000002, + 22.700000000000003, + 22.75, + 22.8, + 22.85, + 22.900000000000002, + 22.950000000000003, + 23.0, + 23.05, + 23.1, + 23.150000000000002, + 23.200000000000003, + 23.25, + 23.3, + 23.35, + 23.400000000000002, + 23.450000000000003, + 23.5, + 23.55, + 23.6, + 23.650000000000002, + 23.700000000000003, + 23.75, + 23.8, + 23.85, + 23.900000000000002, + 23.950000000000003, + 24.0, + 24.05, + 24.1, + 24.150000000000002, + 24.200000000000003, + 24.25, + 24.3, + 24.35, + 24.400000000000002, + 24.450000000000003, + 24.5, + 24.55, + 24.6, + 24.650000000000002, + 24.700000000000003, + 24.75, + 24.8, + 24.85, + 24.900000000000002, + 24.950000000000003, + 25.0, + 25.05, + 25.1, + 25.150000000000002, + 25.200000000000003, + 25.25, + 25.3, + 25.35, + 25.400000000000002, + 25.450000000000003, + 25.5, + 25.55, + 25.6, + 25.650000000000002, + 25.700000000000003, + 25.75, + 25.8, + 25.85, + 25.900000000000002, + 25.950000000000003, + 26.0, + 26.05, + 26.1, + 26.150000000000002, + 26.200000000000003, + 26.25, + 26.3, + 26.35, + 26.400000000000002, + 26.450000000000003, + 26.5, + 26.55, + 26.6, + 26.650000000000002, + 26.700000000000003, + 26.75, + 26.8, + 26.85, + 26.900000000000002, + 26.950000000000003, + 27.0, + 27.05, + 27.1, + 27.150000000000002, + 27.200000000000003, + 27.25, + 27.3, + 27.35, + 27.400000000000002, + 27.450000000000003, + 27.5, + 27.55, + 27.6, + 27.650000000000002, + 27.700000000000003, + 27.75, + 27.8, + 27.85, + 27.900000000000002, + 27.950000000000003, + 28.0, + 28.05, + 28.1, + 28.150000000000002, + 28.200000000000003, + 28.25, + 28.3, + 28.35, + 28.400000000000002, + 28.450000000000003, + 28.5, + 28.55, + 28.6, + 28.650000000000002, + 28.700000000000003, + 28.75, + 28.8, + 28.85, + 28.900000000000002, + 28.950000000000003, + 29.0, + 29.05, + 29.1, + 29.150000000000002, + 29.200000000000003, + 29.25, + 29.3, + 29.35, + 29.400000000000002, + 29.450000000000003, + 29.5, + 29.55, + 29.6, + 29.650000000000002, + 29.700000000000003, + 29.75, + 29.8, + 29.85, + 29.900000000000002, + 29.950000000000003, + 30.0, + 30.05, + 30.1, + 30.150000000000002, + 30.200000000000003, + 30.25, + 30.3, + 30.35, + 30.400000000000002, + 30.450000000000003, + 30.5, + 30.55, + 30.6, + 30.650000000000002, + 30.700000000000003, + 30.75, + 30.8, + 30.85, + 30.900000000000002, + 30.950000000000003, + 31.0, + 31.05, + 31.1, + 31.150000000000002, + 31.200000000000003, + 31.25, + 31.3, + 31.35, + 31.400000000000002, + 31.450000000000003, + 31.5, + 31.55, + 31.6, + 31.650000000000002, + 31.700000000000003, + 31.75, + 31.8, + 31.85, + 31.900000000000002, + 31.950000000000003, + 32.0, + 32.050000000000004, + 32.1, + 32.15, + 32.2, + 32.25, + 32.300000000000004, + 32.35, + 32.4, + 32.45, + 32.5, + 32.550000000000004, + 32.6, + 32.65, + 32.7, + 32.75, + 32.800000000000004, + 32.85, + 32.9, + 32.95, + 33.0, + 33.050000000000004, + 33.1, + 33.15, + 33.2, + 33.25, + 33.300000000000004, + 33.35, + 33.4, + 33.45, + 33.5, + 33.550000000000004, + 33.6, + 33.65, + 33.7, + 33.75, + 33.800000000000004, + 33.85, + 33.9, + 33.95, + 34.0, + 34.050000000000004, + 34.1, + 34.15, + 34.2, + 34.25, + 34.300000000000004, + 34.35, + 34.4, + 34.45, + 34.5, + 34.550000000000004, + 34.6, + 34.65, + 34.7, + 34.75, + 34.800000000000004, + 34.85, + 34.9, + 34.95, + 35.0, + 35.050000000000004, + 35.1, + 35.15, + 35.2, + 35.25, + 35.300000000000004, + 35.35, + 35.4, + 35.45, + 35.5, + 35.550000000000004, + 35.6, + 35.65, + 35.7, + 35.75, + 35.800000000000004, + 35.85, + 35.9, + 35.95, + 36.0, + 36.050000000000004, + 36.1, + 36.15, + 36.2, + 36.25, + 36.300000000000004, + 36.35, + 36.4, + 36.45, + 36.5, + 36.550000000000004, + 36.6, + 36.65, + 36.7, + 36.75, + 36.800000000000004, + 36.85, + 36.9, + 36.95, + 37.0, + 37.050000000000004, + 37.1, + 37.15, + 37.2, + 37.25, + 37.300000000000004, + 37.35, + 37.4, + 37.45, + 37.5, + 37.550000000000004, + 37.6, + 37.65, + 37.7, + 37.75, + 37.800000000000004, + 37.85, + 37.9, + 37.95, + 38.0, + 38.050000000000004, + 38.1, + 38.15, + 38.2, + 38.25, + 38.300000000000004, + 38.35, + 38.400000000000006, + 38.45, + 38.5, + 38.550000000000004, + 38.6, + 38.650000000000006, + 38.7, + 38.75, + 38.800000000000004, + 38.85, + 38.900000000000006, + 38.95, + 39.0, + 39.050000000000004, + 39.1, + 39.150000000000006, + 39.2, + 39.25, + 39.300000000000004, + 39.35, + 39.400000000000006, + 39.45, + 39.5, + 39.550000000000004, + 39.6, + 39.650000000000006, + 39.7, + 39.75, + 39.800000000000004, + 39.85, + 39.900000000000006, + 39.95, + 40.0, + 40.050000000000004, + 40.1, + 40.150000000000006, + 40.2, + 40.25, + 40.300000000000004, + 40.35, + 40.400000000000006, + 40.45, + 40.5, + 40.550000000000004, + 40.6, + 40.650000000000006, + 40.7, + 40.75, + 40.800000000000004, + 40.85, + 40.900000000000006, + 40.95, + 41.0, + 41.050000000000004, + 41.1, + 41.150000000000006, + 41.2, + 41.25, + 41.300000000000004, + 41.35, + 41.400000000000006, + 41.45, + 41.5, + 41.550000000000004, + 41.6, + 41.650000000000006, + 41.7, + 41.75, + 41.800000000000004, + 41.85, + 41.900000000000006, + 41.95, + 42.0, + 42.050000000000004, + 42.1, + 42.150000000000006, + 42.2, + 42.25, + 42.300000000000004, + 42.35, + 42.400000000000006, + 42.45, + 42.5, + 42.550000000000004, + 42.6, + 42.650000000000006, + 42.7, + 42.75, + 42.800000000000004, + 42.85, + 42.900000000000006, + 42.95, + 43.0, + 43.050000000000004, + 43.1, + 43.150000000000006, + 43.2, + 43.25, + 43.300000000000004, + 43.35, + 43.400000000000006, + 43.45, + 43.5, + 43.550000000000004, + 43.6, + 43.650000000000006, + 43.7, + 43.75, + 43.800000000000004, + 43.85, + 43.900000000000006, + 43.95, + 44.0, + 44.050000000000004, + 44.1, + 44.150000000000006, + 44.2, + 44.25, + 44.300000000000004, + 44.35, + 44.400000000000006, + 44.45, + 44.5, + 44.550000000000004, + 44.6, + 44.650000000000006, + 44.7, + 44.75, + 44.800000000000004, + 44.85, + 44.900000000000006, + 44.95, + 45.0, + 45.050000000000004, + 45.1, + 45.150000000000006, + 45.2, + 45.25, + 45.300000000000004, + 45.35, + 45.400000000000006, + 45.45, + 45.5, + 45.550000000000004, + 45.6, + 45.650000000000006, + 45.7, + 45.75, + 45.800000000000004, + 45.85, + 45.900000000000006, + 45.95, + 46.0, + 46.050000000000004, + 46.1, + 46.150000000000006, + 46.2, + 46.25, + 46.300000000000004, + 46.35, + 46.400000000000006, + 46.45, + 46.5, + 46.550000000000004, + 46.6, + 46.650000000000006, + 46.7, + 46.75, + 46.800000000000004, + 46.85, + 46.900000000000006, + 46.95, + 47.0, + 47.050000000000004, + 47.1, + 47.150000000000006, + 47.2, + 47.25, + 47.300000000000004, + 47.35, + 47.400000000000006, + 47.45, + 47.5, + 47.550000000000004, + 47.6, + 47.650000000000006, + 47.7, + 47.75, + 47.800000000000004, + 47.85, + 47.900000000000006, + 47.95, + 48.0, + 48.050000000000004, + 48.1, + 48.150000000000006, + 48.2, + 48.25, + 48.300000000000004, + 48.35, + 48.400000000000006, + 48.45, + 48.5, + 48.550000000000004, + 48.6, + 48.650000000000006, + 48.7, + 48.75, + 48.800000000000004, + 48.85, + 48.900000000000006, + 48.95, + 49.0, + 49.050000000000004, + 49.1, + 49.150000000000006, + 49.2, + 49.25, + 49.300000000000004, + 49.35, + 49.400000000000006, + 49.45, + 49.5, + 49.550000000000004, + 49.6, + 49.650000000000006, + 49.7, + 49.75, + 49.800000000000004, + 49.85, + 49.900000000000006, + 49.95, + 50.0 + ], + "sections": { + "NSEC": 1, + "SECTION_TIMES": [ + 0.0, + 50.0 + ] + }, + "time_integrator": { + "ABSTOL": 1e-06, + "ALGTOL": 1e-10, + "INIT_STEP_SIZE": 1e-06, + "MAX_STEPS": 1000000, + "RELTOL": 1e-06 + } + } +} \ No newline at end of file diff --git a/test/data/configuration_CSTR_ASM3_without_ad.json b/test/data/configuration_CSTR_ASM3_without_ad.json new file mode 100644 index 000000000..25e0ad9a4 --- /dev/null +++ b/test/data/configuration_CSTR_ASM3_without_ad.json @@ -0,0 +1,1117 @@ +{ + "model": { + "NUNITS": 1, + "connections": { + "NSWITCHES": 1, + "switch_000": { + "CONNECTIONS": [], + "SECTION": 0 + } + }, + "solver": { + "GS_TYPE": 1, + "MAX_KRYLOV": 0, + "MAX_RESTARTS": 10, + "SCHUR_SAFETY": 1e-08 + }, + "unit_000": { + "INIT_C": [ + 1.0, + 2.0, + 3.0, + 4.0, + 5.0, + 6.0, + 7.0, + 8.0, + 9.0, + 10.0, + 11.0, + 12.0, + 13.0 + ], + "INIT_LIQUID_VOLUME": 10, + "NCOMP": 13, + "NREAC_LIQUID": 1, + "UNIT_TYPE": "CSTR", + "liquid_reaction_000": { + "TYPE": "ACTIVATED_SLUDGE_MODEL3", + "ASM3_FISS_BM_PROD": 1.0, + "ASM3_FSI": 0.0, + "ASM3_YH_AER": 0.8, + "ASM3_YH_ANOX": 0.65, + "ASM3_YSTO_AER": 0.8375, + "ASM3_YSTO_ANOX": 0.7, + "ASM3_FXI": 0.2, + "ASM3_YA": 0.24, + "ASM3_KH20": 9.0, + "ASM3_KX": 1.0, + "ASM3_KSTO20": 12.0, + "ASM3_MU_H20": 3.0, + "ASM3_BH20": 0.33, + "ASM3_ETA_HNO3": 0.5, + "ASM3_KHO2": 0.2, + "ASM3_KHSS": 10.0, + "ASM3_KHNO3": 0.5, + "ASM3_KHNH4": 0.01, + "ASM3_KHALK": 0.1, + "ASM3_KHSTO": 0.1, + "ASM3_MU_AUT20": 1.12, + "ASM3_BAUT20": 0.18, + "ASM3_ETAH_END": 0.5, + "ASM3_ETAN_END": 0.5, + "ASM3_KNO2": 0.5, + "ASM3_KNNH4": 0.7, + "ASM3_KNALK": 0.5, + "ASM3_T": 12.0, + "ASM3_V": 10.0, + "ASM3_IO2": 0.0, + "ASM3_INSI": 0.01, + "ASM3_INSS": 0.03, + "ASM3_INXI": 0.04, + "ASM3_INXS": 0.03, + "ASM3_INBM": 0.07, + "ASM3_IVSS_XI": 0.751879699, + "ASM3_IVSS_XS": 0.555555556, + "ASM3_IVSS_STO": 0.6, + "ASM3_IVSS_BM": 0.704225352, + "ASM3_ITSS_VSS_BM": 1.086956522 + } + } + }, + "return": { + "SPLIT_COMPONENTS_DATA": false, + "SPLIT_PORTS_DATA": 0, + "unit_000": { + "WRITE_COORDINATES": 1, + "WRITE_SENS_OUTLET": 1, + "WRITE_SOLUTION_BULK": 1, + "WRITE_SOLUTION_FLUX": 1, + "WRITE_SOLUTION_INLET": 1, + "WRITE_SOLUTION_OUTLET": 1, + "WRITE_SOLUTION_PARTICLE": 1, + "WRITE_SOLUTION_SOLID": 1, + "WRITE_SOLUTION_VOLUME": 1 + } + }, + "solver": { + "NTHREADS": 1, + "USER_SOLUTION_TIMES": [ + 0.0, + 0.05, + 0.1, + 0.15000000000000002, + 0.2, + 0.25, + 0.30000000000000004, + 0.35000000000000003, + 0.4, + 0.45, + 0.5, + 0.55, + 0.6000000000000001, + 0.65, + 0.7000000000000001, + 0.75, + 0.8, + 0.8500000000000001, + 0.9, + 0.9500000000000001, + 1.0, + 1.05, + 1.1, + 1.1500000000000001, + 1.2000000000000002, + 1.25, + 1.3, + 1.35, + 1.4000000000000001, + 1.4500000000000002, + 1.5, + 1.55, + 1.6, + 1.6500000000000001, + 1.7000000000000002, + 1.75, + 1.8, + 1.85, + 1.9000000000000001, + 1.9500000000000002, + 2.0, + 2.0500000000000003, + 2.1, + 2.15, + 2.2, + 2.25, + 2.3000000000000003, + 2.35, + 2.4000000000000004, + 2.45, + 2.5, + 2.5500000000000003, + 2.6, + 2.6500000000000004, + 2.7, + 2.75, + 2.8000000000000003, + 2.85, + 2.9000000000000004, + 2.95, + 3.0, + 3.0500000000000003, + 3.1, + 3.1500000000000004, + 3.2, + 3.25, + 3.3000000000000003, + 3.35, + 3.4000000000000004, + 3.45, + 3.5, + 3.5500000000000003, + 3.6, + 3.6500000000000004, + 3.7, + 3.75, + 3.8000000000000003, + 3.85, + 3.9000000000000004, + 3.95, + 4.0, + 4.05, + 4.1000000000000005, + 4.15, + 4.2, + 4.25, + 4.3, + 4.3500000000000005, + 4.4, + 4.45, + 4.5, + 4.55, + 4.6000000000000005, + 4.65, + 4.7, + 4.75, + 4.800000000000001, + 4.8500000000000005, + 4.9, + 4.95, + 5.0, + 5.050000000000001, + 5.1000000000000005, + 5.15, + 5.2, + 5.25, + 5.300000000000001, + 5.3500000000000005, + 5.4, + 5.45, + 5.5, + 5.550000000000001, + 5.6000000000000005, + 5.65, + 5.7, + 5.75, + 5.800000000000001, + 5.8500000000000005, + 5.9, + 5.95, + 6.0, + 6.050000000000001, + 6.1000000000000005, + 6.15, + 6.2, + 6.25, + 6.300000000000001, + 6.3500000000000005, + 6.4, + 6.45, + 6.5, + 6.550000000000001, + 6.6000000000000005, + 6.65, + 6.7, + 6.75, + 6.800000000000001, + 6.8500000000000005, + 6.9, + 6.95, + 7.0, + 7.050000000000001, + 7.1000000000000005, + 7.15, + 7.2, + 7.25, + 7.300000000000001, + 7.3500000000000005, + 7.4, + 7.45, + 7.5, + 7.550000000000001, + 7.6000000000000005, + 7.65, + 7.7, + 7.75, + 7.800000000000001, + 7.8500000000000005, + 7.9, + 7.95, + 8.0, + 8.05, + 8.1, + 8.15, + 8.200000000000001, + 8.25, + 8.3, + 8.35, + 8.4, + 8.450000000000001, + 8.5, + 8.55, + 8.6, + 8.65, + 8.700000000000001, + 8.75, + 8.8, + 8.85, + 8.9, + 8.950000000000001, + 9.0, + 9.05, + 9.1, + 9.15, + 9.200000000000001, + 9.25, + 9.3, + 9.35, + 9.4, + 9.450000000000001, + 9.5, + 9.55, + 9.600000000000001, + 9.65, + 9.700000000000001, + 9.75, + 9.8, + 9.850000000000001, + 9.9, + 9.950000000000001, + 10.0, + 10.05, + 10.100000000000001, + 10.15, + 10.200000000000001, + 10.25, + 10.3, + 10.350000000000001, + 10.4, + 10.450000000000001, + 10.5, + 10.55, + 10.600000000000001, + 10.65, + 10.700000000000001, + 10.75, + 10.8, + 10.850000000000001, + 10.9, + 10.950000000000001, + 11.0, + 11.05, + 11.100000000000001, + 11.15, + 11.200000000000001, + 11.25, + 11.3, + 11.350000000000001, + 11.4, + 11.450000000000001, + 11.5, + 11.55, + 11.600000000000001, + 11.65, + 11.700000000000001, + 11.75, + 11.8, + 11.850000000000001, + 11.9, + 11.950000000000001, + 12.0, + 12.05, + 12.100000000000001, + 12.15, + 12.200000000000001, + 12.25, + 12.3, + 12.350000000000001, + 12.4, + 12.450000000000001, + 12.5, + 12.55, + 12.600000000000001, + 12.65, + 12.700000000000001, + 12.75, + 12.8, + 12.850000000000001, + 12.9, + 12.950000000000001, + 13.0, + 13.05, + 13.100000000000001, + 13.15, + 13.200000000000001, + 13.25, + 13.3, + 13.350000000000001, + 13.4, + 13.450000000000001, + 13.5, + 13.55, + 13.600000000000001, + 13.65, + 13.700000000000001, + 13.75, + 13.8, + 13.850000000000001, + 13.9, + 13.950000000000001, + 14.0, + 14.05, + 14.100000000000001, + 14.15, + 14.200000000000001, + 14.25, + 14.3, + 14.350000000000001, + 14.4, + 14.450000000000001, + 14.5, + 14.55, + 14.600000000000001, + 14.65, + 14.700000000000001, + 14.75, + 14.8, + 14.850000000000001, + 14.9, + 14.950000000000001, + 15.0, + 15.05, + 15.100000000000001, + 15.15, + 15.200000000000001, + 15.25, + 15.3, + 15.350000000000001, + 15.4, + 15.450000000000001, + 15.5, + 15.55, + 15.600000000000001, + 15.65, + 15.700000000000001, + 15.75, + 15.8, + 15.850000000000001, + 15.9, + 15.950000000000001, + 16.0, + 16.05, + 16.1, + 16.150000000000002, + 16.2, + 16.25, + 16.3, + 16.35, + 16.400000000000002, + 16.45, + 16.5, + 16.55, + 16.6, + 16.650000000000002, + 16.7, + 16.75, + 16.8, + 16.85, + 16.900000000000002, + 16.95, + 17.0, + 17.05, + 17.1, + 17.150000000000002, + 17.2, + 17.25, + 17.3, + 17.35, + 17.400000000000002, + 17.45, + 17.5, + 17.55, + 17.6, + 17.650000000000002, + 17.7, + 17.75, + 17.8, + 17.85, + 17.900000000000002, + 17.95, + 18.0, + 18.05, + 18.1, + 18.150000000000002, + 18.2, + 18.25, + 18.3, + 18.35, + 18.400000000000002, + 18.45, + 18.5, + 18.55, + 18.6, + 18.650000000000002, + 18.7, + 18.75, + 18.8, + 18.85, + 18.900000000000002, + 18.95, + 19.0, + 19.05, + 19.1, + 19.150000000000002, + 19.200000000000003, + 19.25, + 19.3, + 19.35, + 19.400000000000002, + 19.450000000000003, + 19.5, + 19.55, + 19.6, + 19.650000000000002, + 19.700000000000003, + 19.75, + 19.8, + 19.85, + 19.900000000000002, + 19.950000000000003, + 20.0, + 20.05, + 20.1, + 20.150000000000002, + 20.200000000000003, + 20.25, + 20.3, + 20.35, + 20.400000000000002, + 20.450000000000003, + 20.5, + 20.55, + 20.6, + 20.650000000000002, + 20.700000000000003, + 20.75, + 20.8, + 20.85, + 20.900000000000002, + 20.950000000000003, + 21.0, + 21.05, + 21.1, + 21.150000000000002, + 21.200000000000003, + 21.25, + 21.3, + 21.35, + 21.400000000000002, + 21.450000000000003, + 21.5, + 21.55, + 21.6, + 21.650000000000002, + 21.700000000000003, + 21.75, + 21.8, + 21.85, + 21.900000000000002, + 21.950000000000003, + 22.0, + 22.05, + 22.1, + 22.150000000000002, + 22.200000000000003, + 22.25, + 22.3, + 22.35, + 22.400000000000002, + 22.450000000000003, + 22.5, + 22.55, + 22.6, + 22.650000000000002, + 22.700000000000003, + 22.75, + 22.8, + 22.85, + 22.900000000000002, + 22.950000000000003, + 23.0, + 23.05, + 23.1, + 23.150000000000002, + 23.200000000000003, + 23.25, + 23.3, + 23.35, + 23.400000000000002, + 23.450000000000003, + 23.5, + 23.55, + 23.6, + 23.650000000000002, + 23.700000000000003, + 23.75, + 23.8, + 23.85, + 23.900000000000002, + 23.950000000000003, + 24.0, + 24.05, + 24.1, + 24.150000000000002, + 24.200000000000003, + 24.25, + 24.3, + 24.35, + 24.400000000000002, + 24.450000000000003, + 24.5, + 24.55, + 24.6, + 24.650000000000002, + 24.700000000000003, + 24.75, + 24.8, + 24.85, + 24.900000000000002, + 24.950000000000003, + 25.0, + 25.05, + 25.1, + 25.150000000000002, + 25.200000000000003, + 25.25, + 25.3, + 25.35, + 25.400000000000002, + 25.450000000000003, + 25.5, + 25.55, + 25.6, + 25.650000000000002, + 25.700000000000003, + 25.75, + 25.8, + 25.85, + 25.900000000000002, + 25.950000000000003, + 26.0, + 26.05, + 26.1, + 26.150000000000002, + 26.200000000000003, + 26.25, + 26.3, + 26.35, + 26.400000000000002, + 26.450000000000003, + 26.5, + 26.55, + 26.6, + 26.650000000000002, + 26.700000000000003, + 26.75, + 26.8, + 26.85, + 26.900000000000002, + 26.950000000000003, + 27.0, + 27.05, + 27.1, + 27.150000000000002, + 27.200000000000003, + 27.25, + 27.3, + 27.35, + 27.400000000000002, + 27.450000000000003, + 27.5, + 27.55, + 27.6, + 27.650000000000002, + 27.700000000000003, + 27.75, + 27.8, + 27.85, + 27.900000000000002, + 27.950000000000003, + 28.0, + 28.05, + 28.1, + 28.150000000000002, + 28.200000000000003, + 28.25, + 28.3, + 28.35, + 28.400000000000002, + 28.450000000000003, + 28.5, + 28.55, + 28.6, + 28.650000000000002, + 28.700000000000003, + 28.75, + 28.8, + 28.85, + 28.900000000000002, + 28.950000000000003, + 29.0, + 29.05, + 29.1, + 29.150000000000002, + 29.200000000000003, + 29.25, + 29.3, + 29.35, + 29.400000000000002, + 29.450000000000003, + 29.5, + 29.55, + 29.6, + 29.650000000000002, + 29.700000000000003, + 29.75, + 29.8, + 29.85, + 29.900000000000002, + 29.950000000000003, + 30.0, + 30.05, + 30.1, + 30.150000000000002, + 30.200000000000003, + 30.25, + 30.3, + 30.35, + 30.400000000000002, + 30.450000000000003, + 30.5, + 30.55, + 30.6, + 30.650000000000002, + 30.700000000000003, + 30.75, + 30.8, + 30.85, + 30.900000000000002, + 30.950000000000003, + 31.0, + 31.05, + 31.1, + 31.150000000000002, + 31.200000000000003, + 31.25, + 31.3, + 31.35, + 31.400000000000002, + 31.450000000000003, + 31.5, + 31.55, + 31.6, + 31.650000000000002, + 31.700000000000003, + 31.75, + 31.8, + 31.85, + 31.900000000000002, + 31.950000000000003, + 32.0, + 32.050000000000004, + 32.1, + 32.15, + 32.2, + 32.25, + 32.300000000000004, + 32.35, + 32.4, + 32.45, + 32.5, + 32.550000000000004, + 32.6, + 32.65, + 32.7, + 32.75, + 32.800000000000004, + 32.85, + 32.9, + 32.95, + 33.0, + 33.050000000000004, + 33.1, + 33.15, + 33.2, + 33.25, + 33.300000000000004, + 33.35, + 33.4, + 33.45, + 33.5, + 33.550000000000004, + 33.6, + 33.65, + 33.7, + 33.75, + 33.800000000000004, + 33.85, + 33.9, + 33.95, + 34.0, + 34.050000000000004, + 34.1, + 34.15, + 34.2, + 34.25, + 34.300000000000004, + 34.35, + 34.4, + 34.45, + 34.5, + 34.550000000000004, + 34.6, + 34.65, + 34.7, + 34.75, + 34.800000000000004, + 34.85, + 34.9, + 34.95, + 35.0, + 35.050000000000004, + 35.1, + 35.15, + 35.2, + 35.25, + 35.300000000000004, + 35.35, + 35.4, + 35.45, + 35.5, + 35.550000000000004, + 35.6, + 35.65, + 35.7, + 35.75, + 35.800000000000004, + 35.85, + 35.9, + 35.95, + 36.0, + 36.050000000000004, + 36.1, + 36.15, + 36.2, + 36.25, + 36.300000000000004, + 36.35, + 36.4, + 36.45, + 36.5, + 36.550000000000004, + 36.6, + 36.65, + 36.7, + 36.75, + 36.800000000000004, + 36.85, + 36.9, + 36.95, + 37.0, + 37.050000000000004, + 37.1, + 37.15, + 37.2, + 37.25, + 37.300000000000004, + 37.35, + 37.4, + 37.45, + 37.5, + 37.550000000000004, + 37.6, + 37.65, + 37.7, + 37.75, + 37.800000000000004, + 37.85, + 37.9, + 37.95, + 38.0, + 38.050000000000004, + 38.1, + 38.15, + 38.2, + 38.25, + 38.300000000000004, + 38.35, + 38.400000000000006, + 38.45, + 38.5, + 38.550000000000004, + 38.6, + 38.650000000000006, + 38.7, + 38.75, + 38.800000000000004, + 38.85, + 38.900000000000006, + 38.95, + 39.0, + 39.050000000000004, + 39.1, + 39.150000000000006, + 39.2, + 39.25, + 39.300000000000004, + 39.35, + 39.400000000000006, + 39.45, + 39.5, + 39.550000000000004, + 39.6, + 39.650000000000006, + 39.7, + 39.75, + 39.800000000000004, + 39.85, + 39.900000000000006, + 39.95, + 40.0, + 40.050000000000004, + 40.1, + 40.150000000000006, + 40.2, + 40.25, + 40.300000000000004, + 40.35, + 40.400000000000006, + 40.45, + 40.5, + 40.550000000000004, + 40.6, + 40.650000000000006, + 40.7, + 40.75, + 40.800000000000004, + 40.85, + 40.900000000000006, + 40.95, + 41.0, + 41.050000000000004, + 41.1, + 41.150000000000006, + 41.2, + 41.25, + 41.300000000000004, + 41.35, + 41.400000000000006, + 41.45, + 41.5, + 41.550000000000004, + 41.6, + 41.650000000000006, + 41.7, + 41.75, + 41.800000000000004, + 41.85, + 41.900000000000006, + 41.95, + 42.0, + 42.050000000000004, + 42.1, + 42.150000000000006, + 42.2, + 42.25, + 42.300000000000004, + 42.35, + 42.400000000000006, + 42.45, + 42.5, + 42.550000000000004, + 42.6, + 42.650000000000006, + 42.7, + 42.75, + 42.800000000000004, + 42.85, + 42.900000000000006, + 42.95, + 43.0, + 43.050000000000004, + 43.1, + 43.150000000000006, + 43.2, + 43.25, + 43.300000000000004, + 43.35, + 43.400000000000006, + 43.45, + 43.5, + 43.550000000000004, + 43.6, + 43.650000000000006, + 43.7, + 43.75, + 43.800000000000004, + 43.85, + 43.900000000000006, + 43.95, + 44.0, + 44.050000000000004, + 44.1, + 44.150000000000006, + 44.2, + 44.25, + 44.300000000000004, + 44.35, + 44.400000000000006, + 44.45, + 44.5, + 44.550000000000004, + 44.6, + 44.650000000000006, + 44.7, + 44.75, + 44.800000000000004, + 44.85, + 44.900000000000006, + 44.95, + 45.0, + 45.050000000000004, + 45.1, + 45.150000000000006, + 45.2, + 45.25, + 45.300000000000004, + 45.35, + 45.400000000000006, + 45.45, + 45.5, + 45.550000000000004, + 45.6, + 45.650000000000006, + 45.7, + 45.75, + 45.800000000000004, + 45.85, + 45.900000000000006, + 45.95, + 46.0, + 46.050000000000004, + 46.1, + 46.150000000000006, + 46.2, + 46.25, + 46.300000000000004, + 46.35, + 46.400000000000006, + 46.45, + 46.5, + 46.550000000000004, + 46.6, + 46.650000000000006, + 46.7, + 46.75, + 46.800000000000004, + 46.85, + 46.900000000000006, + 46.95, + 47.0, + 47.050000000000004, + 47.1, + 47.150000000000006, + 47.2, + 47.25, + 47.300000000000004, + 47.35, + 47.400000000000006, + 47.45, + 47.5, + 47.550000000000004, + 47.6, + 47.650000000000006, + 47.7, + 47.75, + 47.800000000000004, + 47.85, + 47.900000000000006, + 47.95, + 48.0, + 48.050000000000004, + 48.1, + 48.150000000000006, + 48.2, + 48.25, + 48.300000000000004, + 48.35, + 48.400000000000006, + 48.45, + 48.5, + 48.550000000000004, + 48.6, + 48.650000000000006, + 48.7, + 48.75, + 48.800000000000004, + 48.85, + 48.900000000000006, + 48.95, + 49.0, + 49.050000000000004, + 49.1, + 49.150000000000006, + 49.2, + 49.25, + 49.300000000000004, + 49.35, + 49.400000000000006, + 49.45, + 49.5, + 49.550000000000004, + 49.6, + 49.650000000000006, + 49.7, + 49.75, + 49.800000000000004, + 49.85, + 49.900000000000006, + 49.95, + 50.0 + ], + "sections": { + "NSEC": 1, + "SECTION_TIMES": [ + 0.0, + 50.0 + ] + }, + "time_integrator": { + "ABSTOL": 1e-06, + "ALGTOL": 1e-10, + "INIT_STEP_SIZE": 1e-06, + "MAX_STEPS": 1000000, + "RELTOL": 1e-06 + } + } +} \ No newline at end of file