diff --git a/watertap/examples/flowsheets/case_studies/activated_sludge/ASM2D_flowsheet.py b/watertap/examples/flowsheets/case_studies/activated_sludge/ASM2D_flowsheet.py index 21ba1242d6..cbe63e5090 100644 --- a/watertap/examples/flowsheets/case_studies/activated_sludge/ASM2D_flowsheet.py +++ b/watertap/examples/flowsheets/case_studies/activated_sludge/ASM2D_flowsheet.py @@ -18,7 +18,7 @@ """ # Some more information about this module -__author__ = "Alejandro Garciadiego, Andrew Lee" +__author__ = "Alejandro Garciadiego, Andrew Lee, Adam Atia" import pyomo.environ as pyo from pyomo.network import Arc, SequentialDecomposition @@ -49,6 +49,7 @@ from watertap.property_models.activated_sludge.asm2d_reactions import ( ASM2dReactionParameterBlock, ) +from idaes.models.unit_models.mixer import MomentumMixingType from watertap.core.util.initialization import check_solve @@ -56,15 +57,6 @@ _log = idaeslog.getLogger(__name__) -def automate_rescale_variables(m): - for var, sv in iscale.badly_scaled_var_generator(m): - if iscale.get_scaling_factor(var) is None: - continue - sf = iscale.get_scaling_factor(var) - iscale.set_scaling_factor(var, sf / sv) - iscale.calculate_scaling_factors(m) - - def build_flowsheet(): m = pyo.ConcreteModel() @@ -76,7 +68,11 @@ def build_flowsheet(): # Feed water stream m.fs.FeedWater = Feed(property_package=m.fs.props) # Mixer for feed water and recycled sludge - m.fs.MX1 = Mixer(property_package=m.fs.props, inlet_list=["feed_water", "recycle"]) + m.fs.MX1 = Mixer( + property_package=m.fs.props, + inlet_list=["feed_water", "recycle"], + momentum_mixing_type=MomentumMixingType.equality, + ) # First reactor (anoxic) - standard CSTR m.fs.R1 = CSTR(property_package=m.fs.props, reaction_package=m.fs.rxn_props) # First reactor (anoxic) - standard CSTR @@ -108,7 +104,11 @@ def build_flowsheet(): split_basis=SplittingType.componentFlow, ) # Mixing sludge recycle and R5 underflow - m.fs.MX2 = Mixer(property_package=m.fs.props, inlet_list=["clarifier", "reactor"]) + m.fs.MX2 = Mixer( + property_package=m.fs.props, + inlet_list=["reactor", "clarifier"], + momentum_mixing_type=MomentumMixingType.equality, + ) # Sludge separator m.fs.SP2 = Separator(property_package=m.fs.props, outlet_list=["waste", "recycle"]) # Product Blocks @@ -117,6 +117,8 @@ def build_flowsheet(): # Recycle pressure changer - use a simple isothermal unit for now m.fs.P1 = PressureChanger(property_package=m.fs.props) + m.fs.mixers = (m.fs.MX1, m.fs.MX2) + # Link units m.fs.stream1 = Arc(source=m.fs.FeedWater.outlet, destination=m.fs.MX1.feed_water) m.fs.stream2 = Arc(source=m.fs.MX1.outlet, destination=m.fs.R1.inlet) @@ -273,6 +275,8 @@ def mass_transfer_R7(self, t): m.fs.P1.outlet.pressure.fix(101325) # Check degrees of freedom + for mx in m.fs.mixers: + mx.pressure_equality_constraints[0.0, 2].deactivate() assert degrees_of_freedom(m) == 0 def scale_variables(m): @@ -389,12 +393,15 @@ def scale_variables(m): seq.set_guesses_for(m.fs.R3.inlet, tear_guesses) def function(unit): - unit.initialize(outlvl=idaeslog.INFO, optarg={"bound_push": 1e-8}) - badly_scaled_vars = list(iscale.badly_scaled_var_generator(unit)) - if len(badly_scaled_vars) > 0: - automate_rescale_variables(unit) + unit.initialize(outlvl=idaeslog.INFO) + # badly_scaled_vars = list(iscale.badly_scaled_var_generator(unit)) + # if len(badly_scaled_vars) > 0: + # automate_rescale_variables(unit) seq.run(m, function) + for mx in m.fs.mixers: + mx.pressure_equality_constraints[0.0, 2].deactivate() + assert degrees_of_freedom(m) == 0 solver = get_solver() results = solver.solve(m, tee=False) diff --git a/watertap/examples/flowsheets/case_studies/activated_sludge/tests/test_asm2d_flowsheet.py b/watertap/examples/flowsheets/case_studies/activated_sludge/tests/test_asm2d_flowsheet.py index 6265e83b44..67458d53d8 100644 --- a/watertap/examples/flowsheets/case_studies/activated_sludge/tests/test_asm2d_flowsheet.py +++ b/watertap/examples/flowsheets/case_studies/activated_sludge/tests/test_asm2d_flowsheet.py @@ -57,7 +57,7 @@ def test_results(self, model): assert value(model.fs.Treated.temperature[0]) == pytest.approx(298.15, rel=1e-4) assert value(model.fs.Treated.pressure[0]) == pytest.approx(101325, rel=1e-4) assert value(model.fs.Treated.conc_mass_comp[0, "S_A"]) == pytest.approx( - 5.4560e-5, rel=1e-4 + 5.4560e-5, rel=1e-3 ) assert value(model.fs.Treated.conc_mass_comp[0, "S_F"]) == pytest.approx( 2.5736e-3, rel=1e-2