예제 #1
0
    def model(self):
        m = ConcreteModel()
        m.db = Database()

        m.fs = FlowsheetBlock(default={"dynamic": False})
        m.fs.params = WaterParameterBlock(default={"solute_list": ["tss"]})

        m.fs.unit = CoagulationFlocculationZO(default={
            "property_package": m.fs.params,
            "database": m.db
        })

        m.fs.unit.inlet.flow_mass_comp[0, "H2O"].fix(10)
        m.fs.unit.inlet.flow_mass_comp[0, "tss"].fix(3)

        return m
def test_no_subtype():
    m = ConcreteModel()
    m.db = Database()

    m.fs = FlowsheetBlock(default={"dynamic": False})
    m.fs.params = WaterParameterBlock(
        default={"solute_list": ["sulfur", "toc", "tss"]})

    with pytest.raises(ConfigurationError,
                       match="fs.unit - zero-order chemical addition "
                       "operations require the process_subtype configuration "
                       "argument to be set"):
        m.fs.unit = ChemicalAdditionZO(default={
            "property_package": m.fs.params,
            "database": m.db
        })
예제 #3
0
def test_clinoptilolite_no_ammonium_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="ammonium_as_nitrogen should be defined in "
            "solute_list for this subtype.",
    ):
        m.fs.unit = IonExchangeZO(
            default={
                "property_package": m.fs.params,
                "database": db,
                "process_subtype": "clinoptilolite",
            })
예제 #4
0
    def test_toc_in_solute_list(self):
        model = ConcreteModel()
        model.db = Database()

        model.fs = FlowsheetBlock(default={"dynamic": False})
        model.fs.params = WaterParameterBlock(default={
            "solute_list": ["cryptosporidium", "giardia_lamblia", "eeq"]
        })
        with pytest.raises(
                ConfigurationError,
                match="TOC must be in solute list for Ozonation or Ozone/AOP",
        ):
            model.fs.unit = OzoneAOPZO(default={
                "property_package": model.fs.params,
                "database": model.db
            })
예제 #5
0
def test_ffCOD_not_in_solute_list():
    model = ConcreteModel()
    model.db = Database()

    model.fs = FlowsheetBlock(default={"dynamic": False})
    model.fs.params = WaterParameterBlock(default={"solute_list": ["cod"]})
    with pytest.raises(
            ValueError,
            match=
            "nonbiodegradable_cod must be included in the solute list since"
            " this unit model converts cod to nonbiodegradable_cod.",
    ):
        model.fs.unit = AnaerobicMBRMECZO(default={
            "property_package": model.fs.params,
            "database": model.db
        })
예제 #6
0
    def model(self):
        m = ConcreteModel()
        m.db = Database()

        m.fs = FlowsheetBlock(default={"dynamic": False})
        m.fs.params = WaterParameterBlock(default={"solute_list": ["foo"]})

        m.fs.unit = MunicipalWWTPZO(default={
            "property_package": m.fs.params,
            "database": m.db
        })

        m.fs.unit.inlet.flow_mass_comp[0, "H2O"].fix(1000)
        m.fs.unit.inlet.flow_mass_comp[0, "foo"].fix(1)

        return m
예제 #7
0
    def model(self):
        m = ConcreteModel()
        m.db = Database()

        m.fs = FlowsheetBlock(default={"dynamic": False})
        m.fs.params = WaterParameterBlock(default={"solute_list": ["nitrate"]})

        m.fs.unit = ConstructedWetlandsZO(default={
            "property_package": m.fs.params,
            "database": m.db
        })

        m.fs.unit.inlet.flow_mass_comp[0, "H2O"].fix(10)
        m.fs.unit.inlet.flow_mass_comp[0, "nitrate"].fix(1)

        return m
예제 #8
0
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,
            "process_subtype": subtype,
        }
    )

    m.fs.unit.inlet.flow_mass_comp[0, "H2O"].fix(120)
    m.fs.unit.inlet.flow_mass_comp[0, "toc"].fix(1)
    m.fs.unit.inlet.flow_mass_comp[0, "nitrate"].fix(2)
    m.fs.unit.inlet.flow_mass_comp[0, "sulfate"].fix(0.3)
    m.fs.unit.inlet.flow_mass_comp[0, "bar"].fix(40)
    m.fs.unit.inlet.flow_mass_comp[0, "crux"].fix(0.0005)

    m.fs.unit.load_parameters_from_database()

    assert degrees_of_freedom(m.fs.unit) == 0
    m.fs.unit.costing = UnitModelCostingBlock(
        default={"flowsheet_costing_block": m.fs.costing}
    )
    assert_units_consistent(m.fs)
    assert degrees_of_freedom(m.fs.unit) == 0
    initialization_tester(m)
    _ = solver.solve(m)

    assert isinstance(m.fs.unit.costing.capital_cost_constraint, Constraint)

    if subtype == "default":
        assert pytest.approx(1.665893, rel=1e-5) == value(
            m.fs.unit.costing.capital_cost
        )
    if subtype == "emwd":
        assert pytest.approx(47.921893, rel=1e-5) == value(
            m.fs.unit.costing.capital_cost
        )

    assert m.fs.unit.electricity[0] in m.fs.costing._registered_flows["electricity"]
예제 #9
0
def test_phosphorus_capture_phosphate_tss_in_solute_list_error():
    m = ConcreteModel()
    m.fs = FlowsheetBlock(default={"dynamic": False})
    m.fs.params = WaterParameterBlock(default={"solute_list": ["tss", "phosphates"]})

    with pytest.raises(
        KeyError,
        match="tss and phosphates cannot both be defined in the "
        "solute_list. Please choose one.",
    ):
        m.fs.unit = SedimentationZO(
            default={
                "property_package": m.fs.params,
                "database": db,
                "process_subtype": "phosphorus_capture",
            }
        )
예제 #10
0
def test_phosphorus_capture_no_tss_or_phosphate_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="One of the following should be specified in the solute_list: "
        "tss or phosphates.",
    ):
        m.fs.unit = SedimentationZO(
            default={
                "property_package": m.fs.params,
                "database": db,
                "process_subtype": "phosphorus_capture",
            }
        )
예제 #11
0
    def model(self):
        m = ConcreteModel()
        m.db = Database()

        m.fs = FlowsheetBlock(default={"dynamic": False})
        m.fs.params = WaterParameterBlock(
            default={"solute_list": ["viruses_enteric", "bod"]})

        m.fs.unit = AerationBasinZO(default={
            "property_package": m.fs.params,
            "database": m.db})

        m.fs.unit.inlet.flow_mass_comp[0, "H2O"].fix(10)
        m.fs.unit.inlet.flow_mass_comp[0, "viruses_enteric"].fix(1)
        m.fs.unit.inlet.flow_mass_comp[0, "bod"].fix(1)

        return m
예제 #12
0
def test_no_NH4_N_in_solute_list_error():
    m = ConcreteModel()
    m.db = Database()
    m.db._get_technology("mabr")
    m.fs = FlowsheetBlock(default={"dynamic": False})
    m.fs.params = WaterParameterBlock(default={"solute_list": ["foo"]})

    with pytest.raises(
            ValueError,
            match="fs.unit - key_reactant ammonium_as_nitrogen for reaction "
            "ammonium_to_nitrate is not in the component list used by the "
            "assigned property package.",
    ):
        m.fs.unit = MABRZO(default={
            "property_package": m.fs.params,
            "database": m.db
        })
예제 #13
0
    def model(self):
        m = ConcreteModel()
        m.db = Database()

        m.fs = FlowsheetBlock(default={"dynamic": False})
        m.fs.params = WaterParameterBlock(
            default={"solute_list": ["carbon_dioxide"]})

        m.fs.unit = DecarbonatorZO(default={
            "property_package": m.fs.params,
            "database": m.db
        })

        m.fs.unit.inlet.flow_mass_comp[0, "H2O"].fix(10)
        m.fs.unit.inlet.flow_mass_comp[0, "carbon_dioxide"].fix(1)

        return m
예제 #14
0
def test_costing():
    m = ConcreteModel()
    m.db = Database()

    m.fs = FlowsheetBlock(default={"dynamic": False})

    m.fs.params = WaterParameterBlock(
        default={"solute_list": ["viruses_enteric", "toc", "cryptosporidium"]})

    m.fs.costing = ZeroOrderCosting()

    m.fs.unit1 = UVAOPZO(default={
        "property_package": m.fs.params,
        "database": m.db
    })

    m.fs.unit1.inlet.flow_mass_comp[0, "H2O"].fix(10000)
    m.fs.unit1.inlet.flow_mass_comp[0, "viruses_enteric"].fix(1)
    m.fs.unit1.inlet.flow_mass_comp[0, "toc"].fix(2)
    m.fs.unit1.inlet.flow_mass_comp[0, "cryptosporidium"].fix(3)
    m.fs.unit1.load_parameters_from_database(use_default_removal=True)

    assert degrees_of_freedom(m.fs.unit1) == 0

    m.fs.unit1.costing = UnitModelCostingBlock(
        default={"flowsheet_costing_block": m.fs.costing})

    assert isinstance(m.fs.unit1.chemical_flow_mass, Var)
    assert isinstance(m.fs.costing.uv_aop, Block)
    assert isinstance(m.fs.costing.uv_aop.uv_capital_a_parameter, Var)
    assert isinstance(m.fs.costing.uv_aop.uv_capital_b_parameter, Var)
    assert isinstance(m.fs.costing.uv_aop.uv_capital_c_parameter, Var)
    assert isinstance(m.fs.costing.uv_aop.uv_capital_d_parameter, Var)
    assert isinstance(m.fs.costing.uv_aop.aop_capital_a_parameter, Var)
    assert isinstance(m.fs.costing.uv_aop.aop_capital_b_parameter, 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"]
    assert str(m.fs.costing._registered_flows["hydrogen_peroxide"][0]) == str(
        m.fs.unit1.chemical_flow_mass[0])
def test_costing(subtype):
    print(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()

    m.fs.unit1 = ChemicalAdditionZO(
        default={
            "property_package": m.fs.params,
            "database": m.db,
            "process_subtype": subtype,
        })

    m.fs.unit1.inlet.flow_mass_comp[0, "H2O"].fix(10000)
    m.fs.unit1.inlet.flow_mass_comp[0, "sulfur"].fix(1)
    m.fs.unit1.inlet.flow_mass_comp[0, "toc"].fix(2)
    m.fs.unit1.inlet.flow_mass_comp[0, "tss"].fix(3)
    m.fs.unit1.load_parameters_from_database(use_default_removal=True)
    assert degrees_of_freedom(m.fs.unit1) == 0

    m.fs.unit1.costing = UnitModelCostingBlock(
        default={"flowsheet_costing_block": m.fs.costing})

    assert isinstance(m.fs.costing.chemical_addition, Block)
    assert isinstance(m.fs.costing.chemical_addition.capital_a_parameter, Var)
    assert isinstance(m.fs.costing.chemical_addition.capital_b_parameter, 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"]

    assert str(m.fs.unit1.chemical_dosage[0] *
               m.fs.unit1.properties[0].flow_vol /
               m.fs.unit1.ratio_in_solution) == str(
                   m.fs.costing._registered_flows[subtype][0])
예제 #16
0
    def model(self):
        m = ConcreteModel()
        m.db = Database()

        m.fs = FlowsheetBlock(default={"dynamic": False})
        m.fs.params = WaterParameterBlock(
            default={"solute_list": ["oil_and_grease"]})

        m.fs.unit = TrampOilTankZO(default={
            "property_package": m.fs.params,
            "database": m.db
        })

        m.fs.unit.inlet.flow_mass_comp[0, "H2O"].fix(1e-5)
        m.fs.unit.inlet.flow_mass_comp[0, "oil_and_grease"].fix(10)

        return m
예제 #17
0
    def model(self):
        m = ConcreteModel()
        m.db = Database()

        m.fs = FlowsheetBlock(default={"dynamic": False})
        m.fs.params = WaterParameterBlock(default={"solute_list": ["cod"]})

        m.fs.unit = CofermentationZO(default={
            "property_package": m.fs.params,
            "database": m.db
        })
        m.fs.feed1 = FeedZO(default={
            "property_package": m.fs.params,
        })
        m.fs.feed2 = FeedZO(default={
            "property_package": m.fs.params,
        })

        m.fs.feed1.flow_vol[0].fix(
            value(
                pyunits.convert(32.1 * pyunits.L / pyunits.day,
                                to_units=pyunits.m**3 / pyunits.s)))
        m.fs.feed1.conc_mass_comp[0, "cod"].fix(
            value(
                pyunits.convert(
                    69781.93146 * pyunits.mg / pyunits.L,
                    to_units=pyunits.kg / pyunits.m**3,
                )))

        m.fs.feed2.flow_vol[0].fix(
            value(
                pyunits.convert(3.21 * pyunits.L / pyunits.day,
                                to_units=pyunits.m**3 / pyunits.s)))
        m.fs.feed2.conc_mass_comp[0, "cod"].fix(
            value(
                pyunits.convert(1e4 * pyunits.mg / pyunits.L,
                                to_units=pyunits.kg / pyunits.m**3)))

        m.fs.feed1_to_coferm = Arc(source=m.fs.feed1.outlet,
                                   destination=m.fs.unit.inlet1)
        m.fs.feed2_to_coferm = Arc(source=m.fs.feed2.outlet,
                                   destination=m.fs.unit.inlet2)

        TransformationFactory("network.expand_arcs").apply_to(m)

        return m
예제 #18
0
    def model(self):
        m = ConcreteModel()
        m.db = Database()

        m.fs = FlowsheetBlock(default={"dynamic": False})
        m.fs.params = WaterParameterBlock(
            default={"solute_list": ["nitrogen"]})

        m.fs.unit = PhotothermalMembraneZO(default={
            "property_package": m.fs.params,
            "database": m.db
        })

        m.fs.unit.inlet.flow_mass_comp[0, "H2O"].fix(120)
        m.fs.unit.inlet.flow_mass_comp[0, "nitrogen"].fix(1)

        return m
예제 #19
0
    def model(self):
        m = ConcreteModel()
        m.db = Database()

        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": m.db
        })

        m.fs.unit.inlet.flow_mass_comp[0, "H2O"].fix(10)
        m.fs.unit.inlet.flow_mass_comp[0, "nonbiodegradable_cod"].fix(1)

        return m
예제 #20
0
def test_COD_not_in_solute_list():
    model = ConcreteModel()
    model.db = Database()

    model.fs = FlowsheetBlock(default={"dynamic": False})
    model.fs.params = WaterParameterBlock(
        default={"solute_list": ["nonbiodegradable_cod"]})
    with pytest.raises(
            ValueError,
            match=
            "fs.unit - key_reactant cod for reaction cod_to_nonbiodegradable_cod "
            "is not in the component list used by the assigned property package.",
    ):
        model.fs.unit = AnaerobicMBRMECZO(default={
            "property_package": model.fs.params,
            "database": model.db
        })
예제 #21
0
    def model(self):
        m = ConcreteModel()
        m.db = Database()

        m.fs = FlowsheetBlock(default={"dynamic": False})
        m.fs.params = WaterParameterBlock(default={
            "solute_list": ["calcium", "magnesium", "foo", "sulfate"]})

        m.fs.unit = StaticMixerZO(default={"property_package": m.fs.params,
                                           "database": m.db})

        m.fs.unit.inlet.flow_mass_comp[0, "H2O"].fix(42)
        m.fs.unit.inlet.flow_mass_comp[0, "calcium"].fix(3)
        m.fs.unit.inlet.flow_mass_comp[0, "magnesium"].fix(0.1)
        m.fs.unit.inlet.flow_mass_comp[0, "foo"].fix(0.003)
        m.fs.unit.inlet.flow_mass_comp[0, "sulfate"].fix(4)

        return m
예제 #22
0
    def model(self):
        m = ConcreteModel()

        m.db = Database()

        m.fs = FlowsheetBlock(default={"dynamic": False})
        m.fs.params = WaterParameterBlock(
            default={"solute_list": ["total_coliforms_fecal_ecoli", "viruses_enteric"]}
        )

        m.fs.unit = ChlorinationZO(
            default={"property_package": m.fs.params, "database": m.db}
        )

        m.fs.unit.inlet.flow_mass_comp[0, "H2O"].fix(100)
        m.fs.unit.inlet.flow_mass_comp[0, "total_coliforms_fecal_ecoli"].fix(1)
        m.fs.unit.inlet.flow_mass_comp[0, "viruses_enteric"].fix(1)
        return m
예제 #23
0
    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"
                ]
            })

        m.fs.unit = MBRZO(default={
            "property_package": m.fs.params,
            "database": db
        })

        return m
예제 #24
0
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()

    m.fs.unit1 = SecondaryTreatmentWWTPZO(
        default={
            "property_package": m.fs.params,
            "database": m.db,
            "process_subtype": subtype,
        })

    m.fs.unit1.inlet.flow_mass_comp[0, "H2O"].fix(10000)
    m.fs.unit1.inlet.flow_mass_comp[0, "sulfur"].fix(1)
    m.fs.unit1.inlet.flow_mass_comp[0, "toc"].fix(2)
    m.fs.unit1.inlet.flow_mass_comp[0, "tss"].fix(3)
    m.fs.unit1.load_parameters_from_database(use_default_removal=True)
    assert degrees_of_freedom(m.fs.unit1) == 0

    m.fs.unit1.costing = UnitModelCostingBlock(
        default={"flowsheet_costing_block": m.fs.costing})

    assert isinstance(m.fs.costing.secondary_treatment_wwtp, Block)
    assert isinstance(
        m.fs.costing.secondary_treatment_wwtp.capital_a_parameter, Var)
    assert isinstance(
        m.fs.costing.secondary_treatment_wwtp.capital_b_parameter, Var)
    assert isinstance(m.fs.costing.secondary_treatment_wwtp.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"]
예제 #25
0
def test_costing():
    m = ConcreteModel()
    m.db = Database()
    m.fs = FlowsheetBlock(default={"dynamic": False})
    m.fs.params = WaterParameterBlock(
        default={
            "solute_list": [
                "nitrogen",
                "phosphates",
                "bioconcentrated_phosphorous",
                "nitrous_oxide",
            ]
        }
    )
    m.fs.costing = ZeroOrderCosting()
    m.fs.unit = CANDOPZO(default={"property_package": m.fs.params, "database": m.db})

    m.fs.unit.inlet.flow_mass_comp[0, "H2O"].fix(120)
    m.fs.unit.inlet.flow_mass_comp[0, "nitrogen"].fix(1)
    m.fs.unit.inlet.flow_mass_comp[0, "phosphates"].fix(1)
    m.fs.unit.inlet.flow_mass_comp[0, "bioconcentrated_phosphorous"].fix(0)
    m.fs.unit.inlet.flow_mass_comp[0, "nitrous_oxide"].fix(0)
    m.fs.unit.load_parameters_from_database(use_default_removal=True)

    assert degrees_of_freedom(m.fs.unit) == 0

    m.fs.unit.costing = UnitModelCostingBlock(
        default={"flowsheet_costing_block": m.fs.costing}
    )

    assert isinstance(m.fs.costing.CANDO_P, Block)
    assert isinstance(m.fs.costing.CANDO_P.sizing_parameter, Var)
    assert isinstance(m.fs.costing.CANDO_P.sizing_cost, Var)

    assert isinstance(m.fs.unit.costing.capital_cost, Var)
    assert isinstance(m.fs.unit.costing.capital_cost_constraint, Constraint)

    assert_units_consistent(m.fs)
    assert degrees_of_freedom(m.fs.unit) == 0
    initialization_tester(m)

    assert pytest.approx(42.651167, rel=1e-5) == value(m.fs.unit.costing.capital_cost)

    assert m.fs.unit.electricity[0] in m.fs.costing._registered_flows["electricity"]
    def model(self):
        m = ConcreteModel()
        m.db = Database()

        m.fs = FlowsheetBlock(default={"dynamic": False})
        m.fs.params = WaterParameterBlock(
            default={"solute_list": ["oil_and_grease", "oily_matter", "tss"]})

        m.fs.unit = PrimarySeparatorZO(default={
            "property_package": m.fs.params,
            "database": m.db
        })

        m.fs.unit.inlet.flow_mass_comp[0, "H2O"].fix(10)
        m.fs.unit.inlet.flow_mass_comp[0, "oil_and_grease"].fix(1)
        m.fs.unit.inlet.flow_mass_comp[0, "oily_matter"].fix(1)
        m.fs.unit.inlet.flow_mass_comp[0, "tss"].fix(1)

        return m
    def model(self):
        m = ConcreteModel()
        m.db = Database()

        m.fs = FlowsheetBlock(default={"dynamic": False})
        m.fs.params = WaterParameterBlock(
            default={"solute_list": ["bod", "nitrate", "tss"]}
        )

        m.fs.unit = PumpElectricityZO(
            default={"property_package": m.fs.params, "database": m.db}
        )

        m.fs.unit.inlet.flow_mass_comp[0, "H2O"].fix(1e-5)
        m.fs.unit.inlet.flow_mass_comp[0, "bod"].fix(10)
        m.fs.unit.inlet.flow_mass_comp[0, "nitrate"].fix(20)
        m.fs.unit.inlet.flow_mass_comp[0, "tss"].fix(30)

        return m
예제 #28
0
    def model(self):
        m = ConcreteModel()
        m.db = Database()

        m.fs = FlowsheetBlock(default={"dynamic": False})
        m.fs.params = WaterParameterBlock(
            default={"solute_list": ["cod", "methane"]})

        source_file = os.path.join(
            os.path.dirname(os.path.abspath(__file__)),
            "..",
            "..",
            "..",
            "examples",
            "flowsheets",
            "case_studies",
            "wastewater_resource_recovery",
            "metab",
            "metab_global_costing.yaml",
        )
        m.fs.costing = ZeroOrderCosting(
            default={"case_study_definition": source_file})

        m.fs.unit = MetabZO(
            default={
                "property_package": m.fs.params,
                "database": m.db,
                "process_subtype": "methane",
            })

        m.fs.unit.inlet.flow_mass_comp[0, "H2O"].fix(1)
        m.fs.unit.inlet.flow_mass_comp[0, "cod"].fix(0.01)
        m.fs.unit.inlet.flow_mass_comp[0, "methane"].fix(0)

        m.db.get_unit_operation_parameters("metab")
        m.fs.unit.load_parameters_from_database(use_default_removal=True)

        m.fs.unit.costing = UnitModelCostingBlock(
            default={"flowsheet_costing_block": m.fs.costing})

        m.fs.costing.cost_process()

        return m
    def model(self):
        m = ConcreteModel()
        m.db = Database()

        m.fs = FlowsheetBlock(default={"dynamic": False})
        m.fs.params = WaterParameterBlock(
            default={"solute_list": ["bod", "oil_and_grease", "tss"]})

        m.fs.unit = DissolvedAirFlotationZO(default={
            "property_package": m.fs.params,
            "database": m.db
        })

        m.fs.unit.inlet.flow_mass_comp[0, "H2O"].fix(10)
        m.fs.unit.inlet.flow_mass_comp[0, "bod"].fix(1)
        m.fs.unit.inlet.flow_mass_comp[0, "oil_and_grease"].fix(3)
        m.fs.unit.inlet.flow_mass_comp[0, "tss"].fix(1)

        return m
    def model(self):
        m = ConcreteModel()
        m.db = Database()

        m.fs = FlowsheetBlock(default={"dynamic": False})
        m.fs.params = WaterParameterBlock(
            default={"solute_list": ["tss", "sulfate", "foo", "bar"]})

        m.fs.unit = IntrusionMitigationZO(default={
            "property_package": m.fs.params,
            "database": m.db})

        m.fs.unit.inlet.flow_mass_comp[0, "H2O"].fix(123)
        m.fs.unit.inlet.flow_mass_comp[0, "tss"].fix(4)
        m.fs.unit.inlet.flow_mass_comp[0, "sulfate"].fix(0.005)
        m.fs.unit.inlet.flow_mass_comp[0, "foo"].fix(0.67)
        m.fs.unit.inlet.flow_mass_comp[0, "bar"].fix(8.9)

        return m