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 })
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", })
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 })
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 })
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
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
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"]
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", } )
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", } )
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
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 })
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
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])
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
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
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
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
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 })
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
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
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
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"]
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
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