Skip to content

Commit

Permalink
Merge branch 'add_aggs_asm1' into bsm2_optimization
Browse files Browse the repository at this point in the history
  • Loading branch information
adam-a-a committed Dec 8, 2023
2 parents baf77e2 + b86c80f commit b81772a
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 10 deletions.
29 changes: 20 additions & 9 deletions watertap/property_models/activated_sludge/asm1_properties.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,16 +125,12 @@ def build(self):
doc="Reference temperature",
units=pyo.units.K,
)
#TODO: f_p exists on the rxn parameter block and duplicating here temporarily; consolidate
self.f_p = pyo.Var(
initialize=0.08,
units=pyo.units.dimensionless,
domain=pyo.PositiveReals,
doc="Fraction of biomass yielding particulate products, f_p",
)
self.f_p.fix()

#TODO: i_xb and i_xp exist on rxn param block, duplicating temporarily; consolidate later
self.i_xb = pyo.Var(
initialize=0.08,
units=pyo.units.dimensionless,
Expand All @@ -147,8 +143,22 @@ def build(self):
domain=pyo.PositiveReals,
doc="Mass fraction of N per COD in particulates, i_xp",
)
self.i_xb.fix()
self.i_xp.fix()
self.COD_to_SS = pyo.Var(
initialize=0.75,
units=pyo.units.dimensionless,
domain=pyo.PositiveReals,
doc="Conversion factor applied for TSS calculation",
)
self.BOD5_factor = pyo.Var(
["raw", "effluent"],
initialize={"raw": 0.65, "effluent": 0.25},
units=pyo.units.dimensionless,
domain=pyo.PositiveReals,
doc="Conversion factor for BOD5",
)
# Fix Vars that are treated as Params
for v in self.component_objects(pyo.Var):
v.fix()

@classmethod
def define_metadata(cls, obj):
Expand Down Expand Up @@ -387,19 +397,20 @@ def energy_density_expression(self):

def _TSS(self):
tss = self.conc_mass_comp["X_S"] + self.conc_mass_comp["X_I"] + self.conc_mass_comp["X_BH"] + self.conc_mass_comp["X_BA"] + self.conc_mass_comp["X_P"]
return 0.75*tss
return self.params.COD_to_SS * tss

self.TSS = pyo.Expression(
rule=_TSS,
doc="Total suspended solids (TSS)",
)

def _BOD5(self):
def _BOD5(self, i):
bod5 = self.conc_mass_comp["X_S"] + self.conc_mass_comp["X_S"] + (1-self.params.f_p)*(self.conc_mass_comp["X_BH"] + self.conc_mass_comp["X_BA"])
#TODO: 0.25 should be a parameter instead as it changes by influent/effluent
return 0.25*bod5
return self.params.BOD5_factor[i]*bod5

self.BOD5 = pyo.Expression(
["raw", "effluent"],
rule=_BOD5,
doc="Five-day Biological Oxygen Demand (BOD5)",
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,18 @@ def test_build(self, model):
"X_ND",
]
assert value(model.props[1].conc_mass_comp[i]) == 0.1

assert isinstance(model.props[1].params.f_p, Var)
assert value(model.props[1].params.f_p) == 0.08
assert isinstance(model.props[1].params.i_xb, Var)
assert value(model.props[1].params.i_xb) == 0.08
assert isinstance(model.props[1].params.i_xp, Var)
assert value(model.props[1].params.i_xp) == 0.06
assert isinstance(model.props[1].params.COD_to_SS, Var)
assert value(model.props[1].params.COD_to_SS) == 0.75
assert isinstance(model.props[1].params.BOD5_factor, Var)
assert value(model.props[1].params.BOD5_factor["raw"]) == 0.65
assert value(model.props[1].params.BOD5_factor["effluent"]) == 0.25

assert isinstance(model.props[1].material_flow_expression, Expression)
for j in model.params.component_list:
Expand Down Expand Up @@ -325,6 +337,7 @@ def check_units(self, model):
def test_expressions(self, model):
assert value(model.props[1].TSS) == 0.375
assert value(model.props[1].COD) == pytest.approx(0.7999, rel=1e-3)
assert value(model.props[1].BOD5) == 0.096
assert value(model.props[1].BOD5["effluent"]) == 0.096
assert value(model.props[1].BOD5["raw"]) == 0.096 *0.65/0.25
assert value(model.props[1].TKN) == pytest.approx(0.328, rel=1e-3)
assert value(model.props[1].Total_N) == pytest.approx(0.428, rel=1e-3)

0 comments on commit b81772a

Please sign in to comment.