Nanofiltration (ZO)

This nanofiltration (NF) unit model
  • is a zero-order model that enables the user to specify performance in terms of membrane solvent flux and solute/ion rejection

  • supports a single liquid phase only

  • supports steady-state only

  • assumes isothermal conditions

Degrees of Freedom

The zero-order NF model has at least 7 degrees of freedom that should be fixed for the unit to be fully specified. Typically, the following variables are fixed:

  • solvent mass flow rate at the inlet

  • inlet temperature

  • inlet pressure

  • solvent volumetric flux of the membrane

  • permeate pressure

There are 2 degrees of freedom for each solute in a given property model:

  • solute rejection of the membrane

  • solute mass flow rate at the inlet

Note, when a set of solutes comprises ions and includes more than one ion pair, the solute rejection of one ion could be left unfixed to satisfy an electroneutrality constraint. In this case, the last degree of freedom can be eliminated by fixing another variable such as volumetric recovery rate or membrane area.

Model Structure

This NF model consists of 1 ControlVolume0DBlock for the feed-side of the membrane and 1 StateBlock (properties_permeate) for the permeate exiting the NF membrane module. The feed-side includes 2 StateBlocks (properties_in and properties_out) which are used for mass and momentum balances.

Sets

Description

Symbol

Indices

Time

\(t\)

[0]

Phases

\(p\)

[‘Liq’]

Components

\(j\)

[‘H2O’, ‘Solute’]*

*Solute depends on the imported property model, and more than one solute can be provided; ions can be represented as solutes in a given property model to be recognized by this NF model.

Variables

Description

Symbol

Variable Name

Index

Units

Mass density of solvent

\(\rho_{solvent}\)

dens_solvent

[p]

\(\text{kg/}\text{m}^3\)

Solvent volumetric flux across membrane

\(J_{solv}\)

flux_vol_solvent

[t, j]

\(\text{m}^3\text{/m}^2\text{/s}\)

Membrane area

\(A_m\)

area

None

\(\text{m}^2\)

Component recovery rate

\(R_j\)

recovery_mass_phase_comp

[t, p, j]

\(\text{dimensionless}\)

Volumetric recovery rate

\(R_{vol}\)

recovery_vol_phase

[t, p]

\(\text{dimensionless}\)

Observed solute rejection

\(r_j\)

rejection_phase_comp

[t, p, j]

\(\text{dimensionless}\)

Mass transfer to permeate

\(M_p\)

mass_transfer_phase_comp

[t, p, j]

\(\text{kg/s}\)

Equations

Description

Equation

Solvent mass transfer

\(M_{p, solv} = A_m J_{solv} \rho_{solvent}\)

Component recovery rate

\(R_j = \frac{M_{p,j}}{M_{f,in,j}}\)

Volumetric recovery rate

\(R_{vol} = \frac{Q_{p}}{Q_{f,in}}\)

Observed solute rejection

\(r_j = 1 - \frac{C_{p}}{C_{f,in}}\)

Class Documentation

class watertap.unit_models.nanofiltration_ZO.NanofiltrationData(component)[source]

Zero order nanofiltration model based on specified water flux and ion rejection. Default data from Table 9 in Labban et al. (2017) https://doi.org/10.1016/j.memsci.2016.08.062

build()[source]

General build method for UnitModelBlockData. This method calls a number of sub-methods which automate the construction of expected attributes of unit models.

Inheriting models should call super().build.

Parameters

None

Returns

None

initialize_build(state_args=None, outlvl=0, solver=None, optarg=None)[source]

General wrapper for pressure changer initialization routines

Keyword Arguments
  • state_args – a dict of arguments to be passed to the property package(s) to provide an initial state for initialization (see documentation of the specific property package) (default = {}).

  • outlvl – sets output level of initialization routine

  • optarg – solver options dictionary object (default=None)

  • solver – str indicating which solver to use during initialization (default = None)

Returns: None

class watertap.unit_models.nanofiltration_ZO.NanofiltrationZO(*args, **kwds)
Parameters
  • rule (function) – A rule function or None. Default rule calls build().

  • concrete (bool) – If True, make this a toplevel model. Default - False.

  • ctype (class) – Pyomo ctype of the block. Default - pyomo.environ.Block

  • default (dict) –

    Default ProcessBlockData config

    Keys
    dynamic

    Indicates whether this model will be dynamic or not, default = False. NF units do not support dynamic behavior.

    has_holdup

    Indicates whether holdup terms should be constructed or not. default - False. NF units do not have defined volume, thus this must be False.

    material_balance_type

    Indicates what type of mass balance should be constructed, default - MaterialBalanceType.useDefault. Valid values: { MaterialBalanceType.useDefault - refer to property package for default balance type **MaterialBalanceType.none - exclude material balances, MaterialBalanceType.componentPhase - use phase component balances, MaterialBalanceType.componentTotal - use total component balances, MaterialBalanceType.elementTotal - use total element balances, MaterialBalanceType.total - use total material balance.}

    energy_balance_type

    Indicates what type of energy balance should be constructed, default - EnergyBalanceType.useDefault. Valid values: { EnergyBalanceType.useDefault - refer to property package for default balance type **EnergyBalanceType.none - exclude energy balances, EnergyBalanceType.enthalpyTotal - single enthalpy balance for material, EnergyBalanceType.enthalpyPhase - enthalpy balances for each phase, EnergyBalanceType.energyTotal - single energy balance for material, EnergyBalanceType.energyPhase - energy balances for each phase.}

    momentum_balance_type

    Indicates what type of momentum balance should be constructed, default - MomentumBalanceType.pressureTotal. Valid values: { MomentumBalanceType.none - exclude momentum balances, MomentumBalanceType.pressureTotal - single pressure balance for material, MomentumBalanceType.pressurePhase - pressure balances for each phase, MomentumBalanceType.momentumTotal - single momentum balance for material, MomentumBalanceType.momentumPhase - momentum balances for each phase.}

    has_pressure_change

    Indicates whether terms for pressure change should be constructed, default - False. Valid values: { True - include pressure change terms, False - exclude pressure change terms.}

    property_package

    Property parameter object used to define property calculations, default - useDefault. Valid values: { useDefault - use default package from parent model or flowsheet, PhysicalParameterObject - a PhysicalParameterBlock object.}

    property_package_args

    A ConfigBlock with arguments to be passed to a property block(s) and used when constructing these, default - None. Valid values: { see property package for documentation.}

  • initialize (dict) – ProcessBlockData config for individual elements. Keys are BlockData indexes and values are dictionaries described under the “default” argument above.

  • idx_map (function) – Function to take the index of a BlockData element and return the index in the initialize dict from which to read arguments. This can be provided to overide the default behavior of matching the BlockData index exactly to the index in initialize.

Returns

(NanofiltrationZO) New instance