rel=1e-5) == value( model.fs.unit.outlet.flow_mass_comp[t, j]) assert pytest.approx(93.21, rel=1e-5) == value(model.fs.unit.electricity[0]) assert pytest.approx(25.27007, rel=1e-5) == value(model.fs.unit.lift_height[0]) @pytest.mark.component def test_report(self, model): model.fs.unit.report() db = Database() params = db._get_technology("water_pumping_station") class TestPumpZOsubtype: @pytest.fixture(scope="class") def model(self): m = ConcreteModel() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock(default={"solute_list": ["foo"]}) m.fs.unit = WaterPumpingStationZO(default={ "property_package": m.fs.params, "database": db })
def test_conservation(self, model): for j in model.fs.params.component_list: assert 1e-6 >= abs( value(model.fs.unit.inlet.flow_mass_comp[0, j] + sum(model.fs.unit.generation_rxn_comp[0, r, j] for r in model.fs.unit.reaction_set) - model.fs.unit.treated.flow_mass_comp[0, j] - model.fs.unit.byproduct.flow_mass_comp[0, j])) @pytest.mark.component def test_report(self, model): model.fs.unit.report() db = Database() params = db._get_technology("anaerobic_mbr_mec") class Test_AnMBRMEC_ZO_subtype: @pytest.fixture(scope="class") def model(self): m = ConcreteModel() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock( default={"solute_list": ["cod", "nonbiodegradable_cod"]}) m.fs.unit = AnaerobicMBRMECZO(default={ "property_package": m.fs.params, "database": db })
for j in model.fs.params.component_list: assert 1e-6 >= abs( value( model.fs.unit.inlet.flow_mass_comp[0, j] - model.fs.unit.treated.flow_mass_comp[0, j] - model.fs.unit.byproduct.flow_mass_comp[0, j] ) ) @pytest.mark.component def test_report(self, model): model.fs.unit.report() db = Database() params = db._get_technology("aeration_basin") class Test_AerationBasin_ZOsubtype: @pytest.fixture(scope="class") def model(self): m = ConcreteModel() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock(default={"solute_list": ["viruses_enteric"]}) m.fs.unit = AerationBasinZO( default={"property_package": m.fs.params, "database": db} ) return m
@pytest.mark.skipif(solver is None, reason="Solver not available") @pytest.mark.component def test_conservation(self, model): for j in model.fs.params.component_list: assert 1e-6 >= abs( value(model.fs.unit.inlet.flow_mass_comp[0, j] - model.fs.unit.treated.flow_mass_comp[0, j] - model.fs.unit.byproduct.flow_mass_comp[0, j])) @pytest.mark.component def test_report(self, model): model.fs.unit.report() db = Database() params = db._get_technology("brine_concentrator") class Testbrine_concentratorZOsubtype: @pytest.fixture(scope="class") def model(self): m = ConcreteModel() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock(default={"solute_list": ["tds"]}) m.fs.unit = BrineConcentratorZO(default={ "property_package": m.fs.params, "database": db })
Solute Removal [foo] : 0.0000 : True : (0, None) ------------------------------------------------------------------------------------ Stream Table Inlet Treated Volumetric Flowrate 10.005 10.004 Mass Concentration H2O 999.50 999.59 Mass Concentration bod 0.099950 0.0099959 Mass Concentration foo 0.39980 0.39984 ==================================================================================== """ assert output in stream.getvalue() db = Database() params = db._get_technology("fixed_bed") class TestIXZOsubtype: @pytest.fixture(scope="class") def model(self): m = ConcreteModel() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock(default={"solute_list": ["bod"]}) m.fs.unit = FixedBedZO( default={"property_package": m.fs.params, "database": db} ) return m
assert pytest.approx(value(model.fs.unit.inlet.flow_mass_comp[t, j]), rel=1e-5) == value( model.fs.unit.outlet.flow_mass_comp[t, j]) assert pytest.approx(45284.831999, rel=1e-5) == value(model.fs.unit.tank_volume[0]) @pytest.mark.component def test_report(self, model): model.fs.unit.report() db = Database() params = db._get_technology("storage_tank") @pytest.mark.parametrize("subtype", [k for k in params.keys() if k != "default"]) def test_costing(subtype): m = ConcreteModel() m.db = Database() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock( default={"solute_list": ["sulfur", "toc", "tss"]}) m.fs.costing = ZeroOrderCosting()
------------------------------------------------------------------------------------ Stream Table Inlet Treated Byproduct Volumetric Flowrate 0.013000 0.011159 0.0018414 Mass Concentration H2O 769.23 896.17 4.3445e-07 Mass Concentration viruses_enteric 76.923 9.0424 488.27 Mass Concentration tss 76.923 5.1700 511.73 Mass Concentration foo 76.923 89.617 4.3445e-07 ==================================================================================== """ assert output in stream.getvalue() db = Database() params = db._get_technology("secondary_treatment_wwtp") class Test_SecondaryTreatmentWWTPZOsubtype: @pytest.fixture(scope="class") def model(self): m = ConcreteModel() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock( default={"solute_list": ["viruses_enteric"]}) m.fs.unit = SecondaryTreatmentWWTPZO(default={ "property_package": m.fs.params, "database": db })
------------------------------------------------------------------------------------ Stream Table Inlet Outlet Volumetric Flowrate 1.0060 1.0060 Mass Concentration H2O 994.04 994.04 Mass Concentration sulfur 0.99404 0.99404 Mass Concentration toc 1.9881 1.9881 Mass Concentration tss 2.9821 2.9821 ==================================================================================== """ assert output == stream.getvalue() db = Database() params = db._get_technology("chemical_addition") class TestPumpZOsubtype: @pytest.fixture(scope="class") def model(self): m = ConcreteModel() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock( default={"solute_list": ["sulfur", "toc", "tss"]}) return m @pytest.mark.parametrize("subtype", [k for k in params.keys()]) @pytest.mark.component
Mass Concentration tss 0.99206 0.49889 86.547 Mass Concentration nonvolatile_toc 0.99206 0.39911 103.86 Mass Concentration toc 0.99206 0.29081 122.64 Mass Concentration eeq 0.99206 0.11973 152.32 Mass Concentration viruses_enteric 0.99206 0.0099778 171.36 Mass Concentration total_coliforms_fecal_ecoli 0.99206 0.0011993 172.89 Mass Concentration cryptosporidium 0.99206 9.9788e-05 173.08 Mass Concentration foo 0.99206 0.99778 1.7309e-06 ==================================================================================== """ assert output in stream.getvalue() db = Database() params = db._get_technology("mbr") class TestMBRZOsubtype: @pytest.fixture(scope="class") def model(self): m = ConcreteModel() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock( default={ "solute_list": [ "tss", "nonvolatile_toc", "toc", "eeq", "viruses_enteric", "total_coliforms_fecal_ecoli", "cryptosporidium" ] })
------------------------------------------------------------------------------------ Stream Table Inlet Outlet Volumetric Flowrate 1.0060 1.0060 Mass Concentration H2O 994.04 994.04 Mass Concentration sulfur 0.99404 0.99404 Mass Concentration toc 1.9881 1.9881 Mass Concentration tss 2.9821 2.9821 ==================================================================================== """ assert output == stream.getvalue() db = Database() params = db._get_technology("pump") class TestPumpZOsubtype: @pytest.fixture(scope="class") def model(self): m = ConcreteModel() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock( default={"solute_list": ["sulfur", "toc", "tss"]}) m.fs.unit = PumpZO(default={ "property_package": m.fs.params, "database": db })
def test_solution(self, model): for t, j in model.fs.unit.inlet.flow_mass_comp: assert pytest.approx( value(model.fs.unit.inlet.flow_mass_comp[t, j]), rel=1e-5 ) == value(model.fs.unit.outlet.flow_mass_comp[t, j]) assert pytest.approx(216000.036, abs=1e-5) == value(model.fs.unit.total_mass[0]) assert pytest.approx(0.0, abs=1e-5) == value(model.fs.unit.electricity[0]) @pytest.mark.component def test_report(self, model): model.fs.unit.report() db = Database() params = db._get_technology("landfill") class TestLandfillZOsubtype: @pytest.fixture(scope="class") def model(self): m = ConcreteModel() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock( default={"solute_list": ["sulfur", "toc", "tss"]} ) m.fs.unit = LandfillZO( default={"property_package": m.fs.params, "database": db} )
Water Recovery : 0.98610 : True : (1e-08, 1.0000001) ------------------------------------------------------------------------------------ Stream Table Inlet Treated Byproduct Volumetric Flowrate 0.013000 0.0098640 0.0031360 Mass Concentration H2O 769.23 999.70 44.324 Mass Concentration phosphates 230.77 0.30414 955.68 ==================================================================================== """ assert output in stream.getvalue() db = Database() params = db._get_technology("sedimentation") class TestSedimentationZOsubtype: @pytest.fixture(scope="class") def model(self): m = ConcreteModel() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock(default={"solute_list": ["tds", "tss"]}) m.fs.unit = SedimentationZO( default={"property_package": m.fs.params, "database": db} ) return m
for j in model.fs.params.component_list: assert 1e-6 >= abs( value( model.fs.unit.inlet.flow_mass_comp[0, j] - model.fs.unit.outlet.flow_mass_comp[0, j] ) ) @pytest.mark.component def test_report(self, model): model.fs.unit.report() db = Database() params = db._get_technology("surface_discharge") @pytest.mark.parametrize("subtype", [k for k in params.keys()]) def test_costing(subtype): m = ConcreteModel() m.db = Database() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock( default={"solute_list": ["toc", "nitrate", "sulfate", "bar"]} ) m.fs.costing = ZeroOrderCosting() m.fs.unit = SurfaceDischargeZO( default={ "property_package": m.fs.params,
------------------------------------------------------------------------------------ Stream Table Inlet Treated Byproduct Volumetric Flowrate 0.013000 0.011509 0.0014910 Mass Concentration H2O 769.23 868.80 0.67069 Mass Concentration viruses_enteric 76.923 0.86889 663.98 Mass Concentration tss 76.923 43.444 335.35 Mass Concentration foo 76.923 86.889 5.3655e-07 ==================================================================================== """ assert output in stream.getvalue() db = Database() params = db._get_technology("conventional_activated_sludge") class Test_CASZOsubtype: @pytest.fixture(scope="class") def model(self): m = ConcreteModel() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock( default={"solute_list": ["viruses_enteric"]}) m.fs.unit = CASZO(default={ "property_package": m.fs.params, "database": db })
------------------------------------------------------------------------------------ Stream Table Inlet Treated Byproduct Volumetric Flowrate 10.003 9.6018 0.40117 Mass Concentration H2O 999.70 999.81 997.08 Mass Concentration tss 0.099970 0.0031244 2.4179 Mass Concentration nonvolatile_toc 0.099970 0.083317 0.49854 Mass Concentration foo 0.099970 0.10415 2.4927e-08 ==================================================================================== """ assert output in stream.getvalue() db = Database() params = db._get_technology("gac") class TestGACZOsubtype: @pytest.fixture(scope="class") def model(self): m = ConcreteModel() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock( default={"solute_list": ["tss", "nonvolatile_toc"]}) m.fs.unit = GACZO(default={ "property_package": m.fs.params, "database": db })
------------------------------------------------------------------------------------ Stream Table Inlet Treated Byproduct Volumetric Flowrate 10.004 9.5011 0.50285 Mass Concentration H2O 999.60 999.88 994.33 Mass Concentration nitrate 0.099960 0.0052625 1.8892 Mass Concentration tss 0.099960 0.0052625 1.8892 Mass Concentration toc 0.099960 0.0052625 1.8892 Mass Concentration foo 0.099960 0.10525 1.9887e-08 ==================================================================================== """ assert output in stream.getvalue() db = Database() params = db._get_technology("backwash_solids_handling") class TestIXZOsubtype: @pytest.fixture(scope="class") def model(self): m = ConcreteModel() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock(default={"solute_list": ["nitrate"]}) m.fs.unit = BackwashSolidsHandlingZO(default={ "property_package": m.fs.params, "database": db })
------------------------------------------------------------------------------------ Stream Table Inlet Treated Byproduct Volumetric Flowrate 0.012000 0.011500 0.00050000 Mass Concentration H2O 833.33 869.57 1.6000e-06 Mass Concentration nonbiodegradable_cod 83.333 43.478 1000.0 Mass Concentration foo 83.333 86.957 1.6000e-06 ==================================================================================== """ assert output in stream.getvalue() db = Database() params = db._get_technology("vfa_recovery") class Test_VFARecovery_ZOsubtype: @pytest.fixture(scope="class") def model(self): m = ConcreteModel() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock( default={"solute_list": ["nonbiodegradable_cod"]}) m.fs.unit = VFARecoveryZO(default={ "property_package": m.fs.params, "database": db })
Inlet Outlet Volumetric Flowrate 0.16330 0.16330 Mass Concentration H2O 734.84 734.84 Mass Concentration toc 6.1237 6.1237 Mass Concentration nitrate 12.247 12.247 Mass Concentration sulfate 1.8371 1.8371 Mass Concentration bar 244.95 244.95 Mass Concentration crux 0.0030618 0.0030618 ==================================================================================== """ assert output in stream.getvalue() db = Database() params = db._get_technology("well_field") @pytest.mark.parametrize("subtype", [k for k in params.keys()]) def test_costing(subtype): m = ConcreteModel() m.db = Database() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock( default={"solute_list": ["toc", "nitrate", "sulfate", "bar", "crux"]}) m.fs.costing = ZeroOrderCosting() m.fs.unit = WellFieldZO( default={ "property_package": m.fs.params, "database": m.db,
Solute Removal [tds] : 0.90000 : True : (0, None) ------------------------------------------------------------------------------------ Stream Table Inlet Treated Volumetric Flowrate 10.005 10.004 Mass Concentration H2O 999.50 999.59 Mass Concentration tds 0.099950 0.0099959 Mass Concentration foo 0.39980 0.39984 ==================================================================================== """ assert output in stream.getvalue() db = Database() params = db._get_technology("ion_exchange") class TestIXZOsubtype: @pytest.fixture(scope="class") def model(self): m = ConcreteModel() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock( default={"solute_list": ["tds"]}) m.fs.unit = IonExchangeZO(default={ "property_package": m.fs.params, "database": db})
m.fs.costing.electrodialysis_reversal.capital_b_parameter, Var) assert isinstance(m.fs.costing.electrodialysis_reversal.reference_state, Var) assert isinstance(m.fs.unit1.costing.capital_cost, Var) assert isinstance(m.fs.unit1.costing.capital_cost_constraint, Constraint) assert_units_consistent(m.fs) assert degrees_of_freedom(m.fs.unit1) == 0 assert m.fs.unit1.electricity[0] in m.fs.costing._registered_flows[ "electricity"] db = Database() params = db._get_technology("electrodialysis_reversal") @pytest.mark.unit def test_no_tds_in_solute_list_error(): m = ConcreteModel() m.fs = FlowsheetBlock(default={"dynamic": False}) m.fs.params = WaterParameterBlock(default={"solute_list": ["foo"]}) with pytest.raises( KeyError, match="TDS must be included in the solute list for determining" " electricity intensity and power consumption of the electrodialysis " "reversal unit.", ): m.fs.unit = ElectrodialysisReversalZO(default={