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