Beispiel #1
0
def build_components(m, has_bypass=True):
    # build flowsheet
    property_models.build_prop(m, base="ion")
    pretrt_port = pretreatment_NF.build_pretreatment_NF(m,
                                                        NF_type="ZO",
                                                        NF_base="ion",
                                                        has_bypass=has_bypass)

    property_models.build_prop(m, base="TDS")
    translator_block.build_tb(m,
                              base_inlet="ion",
                              base_outlet="TDS",
                              name_str="tb_pretrt_to_desal")

    # Arc to translator block
    m.fs.s_pretrt_tb = Arc(source=pretrt_port["out"],
                           destination=m.fs.tb_pretrt_to_desal.inlet)

    property_models.build_prop(m, base="eNRTL")
    gypsum_saturation_index.build(m, section="pretreatment")

    m.fs.NF.area.fix(175)
    if has_bypass:
        m.fs.splitter.split_fraction[0, "bypass"].fix(0.50)

        m.fs.removal_Ca = Expression(
            expr=(
                m.fs.feed.properties[0].flow_mass_phase_comp["Liq", "Ca"] -
                m.fs.mixer.mixed_state[0].flow_mass_phase_comp["Liq", "Ca"]) /
            m.fs.feed.properties[0].flow_mass_phase_comp["Liq", "Ca"])
        m.fs.removal_Mg = Expression(
            expr=(
                m.fs.feed.properties[0].flow_mass_phase_comp["Liq", "Mg"] -
                m.fs.mixer.mixed_state[0].flow_mass_phase_comp["Liq", "Mg"]) /
            m.fs.feed.properties[0].flow_mass_phase_comp["Liq", "Mg"])
Beispiel #2
0
def build_components(m, has_bypass=True):
    # build flowsheet
    property_models.build_prop(m, base='ion')
    pretrt_port = pretreatment_NF.build_pretreatment_NF(m,
                                                        NF_type='ZO',
                                                        NF_base='ion',
                                                        has_bypass=has_bypass)

    property_models.build_prop(m, base='TDS')
    translator_block.build_tb(m,
                              base_inlet='ion',
                              base_outlet='TDS',
                              name_str='tb_pretrt_to_desal')

    # Arc to translator block
    m.fs.s_pretrt_tb = Arc(source=pretrt_port['out'],
                           destination=m.fs.tb_pretrt_to_desal.inlet)

    property_models.build_prop(m, base='eNRTL')
    gypsum_saturation_index.build(m, section='pretreatment')

    m.fs.NF.area.fix(175)
    if has_bypass:
        m.fs.splitter.split_fraction[0, 'bypass'].fix(0.50)

        m.fs.removal_Ca = Expression(
            expr=(
                m.fs.feed.properties[0].flow_mass_phase_comp['Liq', 'Ca'] -
                m.fs.mixer.mixed_state[0].flow_mass_phase_comp['Liq', 'Ca']) /
            m.fs.feed.properties[0].flow_mass_phase_comp['Liq', 'Ca'])
        m.fs.removal_Mg = Expression(
            expr=(
                m.fs.feed.properties[0].flow_mass_phase_comp['Liq', 'Mg'] -
                m.fs.mixer.mixed_state[0].flow_mass_phase_comp['Liq', 'Mg']) /
            m.fs.feed.properties[0].flow_mass_phase_comp['Liq', 'Mg'])
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 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 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)
Beispiel #7
0
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