def build_components(m, pretrt_type="NF", **kwargs): kwargs_desalination = { k: kwargs[k] for k in ( "has_desal_feed", "is_twostage", "has_ERD", "RO_type", "RO_base", "RO_level", ) } desal_port = desalination.build_desalination(m, **kwargs_desalination) m.fs.s_tb_desal = Arc(source=m.fs.tb_pretrt_to_desal.outlet, destination=desal_port["in"]) if pretrt_type == "softening": property_models.build_prop(m, base="eNRTL") gypsum_saturation_index.build(m, section="desalination", pretrt_type=pretrt_type, **kwargs) m.fs.RO.area.fix(80) m.fs.pump_RO.control_volume.properties_out[0].pressure.fix(60e5) if kwargs["is_twostage"]: m.fs.RO2.area.fix(20) m.fs.pump_RO2.control_volume.properties_out[0].pressure.fix(90e5) # touch some properties used in optimization if kwargs["is_twostage"]: product_water_sb = m.fs.mixer_permeate.mixed_state[0] else: product_water_sb = m.fs.RO.mixed_permeate[0] feed_flow_vol = 0.0009769808 # value of feed flowrate using the seawater property package with 1 kg/s mass flowrate m.fs.system_recovery = Expression(expr=product_water_sb.flow_vol / feed_flow_vol) # RO recovery m.fs.RO_recovery = Var( initialize=0.5, bounds=(0.01, 0.99), doc="Total volumetric water recovery for RO", ) m.fs.eq_RO_recovery = Constraint( expr=m.fs.RO_recovery == product_water_sb.flow_vol / m.fs.tb_pretrt_to_desal.properties_out[0].flow_vol) # annual water production m.fs.treated_flow_vol = Expression(expr=product_water_sb.flow_vol) costing.build_costing(m, **kwargs) return desal_port
def solve_SepRO(base="TDS"): m = ConcreteModel() m.fs = FlowsheetBlock(default={"dynamic": False}) property_models.build_prop(m, base=base) build_SepRO(m, base=base) property_models.specify_feed(m.fs.RO.mixed_state[0], base=base) check_dof(m) calculate_scaling_factors(m) solve_block(m) m.fs.RO.inlet.display() m.fs.RO.permeate.display() m.fs.RO.retentate.display() return m
def solve_SepNF(base="ion"): m = ConcreteModel() m.fs = FlowsheetBlock(default={"dynamic": False}) property_models.build_prop(m, base=base) build_SepNF(m, base=base) property_models.specify_feed(m.fs.NF.mixed_state[0], base=base) m.fs.NF.mixed_state[0].mass_frac_phase_comp # touching for tests check_dof(m) calculate_scaling_factors(m) solve_block(m) m.fs.NF.inlet.display() m.fs.NF.permeate.display() m.fs.NF.retentate.display() return m
def solve_ZONF(base="ion"): m = ConcreteModel() m.fs = FlowsheetBlock(default={"dynamic": False}) property_models.build_prop(m, base=base) build_ZONF(m, base=base) property_models.specify_feed(m.fs.NF.feed_side.properties_in[0], base="ion") check_dof(m) calculate_scaling_factors(m) solve_block(m) m.fs.NF.inlet.display() m.fs.NF.permeate.display() m.fs.NF.retentate.display() return m
def test_build_and_scale_translator_block(): tb_kwargs_list = [ { "base_inlet": "ion", "base_outlet": "TDS", "name_str": "tb_pretrt_to_desal" }, { "base_inlet": "salt", "base_outlet": "TDS", "name_str": "tb_pretrt_to_desal" }, ] for kwargs in tb_kwargs_list: m = ConcreteModel() m.fs = FlowsheetBlock(default={"dynamic": False}) property_models.build_prop(m, base=kwargs["base_inlet"]) property_models.build_prop(m, base=kwargs["base_outlet"]) translator_block.build_tb(m, **kwargs) assert hasattr(m.fs, kwargs["name_str"]) check_scaling(m, **kwargs)
def build(m, **kwargs): """ build an RO """ assert not kwargs["has_desal_feed"] property_models.build_prop(m, base="ion") feed_block.build_feed(m, base="ion") property_models.build_prop(m, base=kwargs["RO_base"]) translator_block.build_tb( m, base_inlet="ion", base_outlet=kwargs["RO_base"], name_str="tb_pretrt_to_desal", ) m.fs.s_pretrt_tb = Arc(source=m.fs.feed.outlet, destination=m.fs.tb_pretrt_to_desal.inlet) property_models.build_prop(m, base="eNRTL") desal_port = build_components(m, **kwargs)
def build_flowsheet_mvp_NF(m, **kwargs): """ Build a flowsheet with NF pretreatment and RO. """ # set up keyword arguments for the sections of treatment train kwargs_pretreatment = { k: kwargs[k] for k in ( "has_bypass", "NF_type", "NF_base", ) } kwargs_desalination = { k: kwargs[k] for k in ( "has_desal_feed", "is_twostage", "has_ERD", "RO_type", "RO_base", "RO_level", ) } # build flowsheet property_models.build_prop(m, base="ion") pretrt_port = pretreatment_NF.build_pretreatment_NF(m, **kwargs_pretreatment) property_models.build_prop(m, base=kwargs["RO_base"]) desal_port = desalination.build_desalination(m, **kwargs_desalination) property_models.build_prop(m, base="eNRTL") translator_block.build_tb( m, base_inlet=kwargs["NF_base"], base_outlet=kwargs["RO_base"], name_str="tb_pretrt_to_desal", ) # set up Arcs between pretreatment and desalination m.fs.s_pretrt_tb = Arc( source=pretrt_port["out"], destination=m.fs.tb_pretrt_to_desal.inlet ) m.fs.s_tb_desal = Arc( source=m.fs.tb_pretrt_to_desal.outlet, destination=desal_port["in"] ) # add gypsum saturation index calculations gypsum_saturation_index.build(m, section="desalination", **kwargs_desalination) gypsum_saturation_index.build(m, section="pretreatment", **kwargs_desalination) # new initialization if kwargs["NF_type"] == "ZO": m.fs.NF.area.fix(175) if kwargs["has_bypass"]: m.fs.splitter.split_fraction[0, "bypass"].fix(0.50) m.fs.RO.area.fix(80) m.fs.pump_RO.control_volume.properties_out[0].pressure.fix(60e5) if kwargs["is_twostage"]: m.fs.RO2.area.fix(20) m.fs.pump_RO2.control_volume.properties_out[0].pressure.fix(90e5) # touch some properties used in optimization if kwargs["is_twostage"]: product_water_sb = m.fs.mixer_permeate.mixed_state[0] RO_waste_sb = m.fs.RO2.feed_side.properties[0, 1] else: product_water_sb = m.fs.RO.mixed_permeate[0] RO_waste_sb = m.fs.RO.feed_side.properties[0, 1] # NOTE: Building the costing here means it gets # initialized during the simulation phase. # This helps model stability. m.fs.feed.properties[0].flow_vol m.fs.feed.properties[0].conc_mol_phase_comp["Liq", "Ca"] m.fs.tb_pretrt_to_desal.properties_in[0].flow_vol m.fs.tb_pretrt_to_desal.properties_in[0].conc_mol_phase_comp["Liq", "Ca"] product_water_sb.flow_vol RO_waste_sb.flow_vol m.fs.system_recovery = Expression( expr=product_water_sb.flow_vol / m.fs.feed.properties[0].flow_vol ) m.fs.total_work = Expression( expr=m.fs.pump_RO.work_mechanical[0] + (m.fs.pump_RO2.work_mechanical[0] if kwargs["is_twostage"] else 0.0) ) # annual water production m.fs.treated_flow_vol = Expression(expr=product_water_sb.flow_vol) costing.build_costing(m, **kwargs) return m