- This reverse osmosis (RO) unit model
- is 0-dimensional
- supports a single liquid phase only
- supports steady-state only
- is based on the solution-diffusion model and film theory
- assumes isothermal conditions
pair: watertap.unit_models.reverse_osmosis_0D;reverse_osmosis_0D
watertap.unit_models.reverse_osmosis_0D
Aside from the inlet feed state variables (i.e. temperature, pressure, component flowrates), the RO model has at least 4 degrees of freedom that should be fixed for the unit to be fully specified.
- Typically, the following variables are fixed, in addition to state variables at the inlet:
- membrane water permeability, A
- membrane salt permeability, B
- permeate pressure
- membrane area
On the other hand, configuring the RO unit to calculate concentration polarization effects, mass transfer coefficient, and pressure drop would result in 3 additional degrees of freedom. In this case, in addition to the previously fixed variables, we typically fix the following variables to fully specify the unit:
- feed-spacer porosity
- feed-channel height
- membrane length or membrane width or inlet Reynolds number
This RO model consists of 2 ControlVolume0DBlocks: one for the feed-side and one for the permeate-side.
- The feed-side includes 2 StateBlocks (properties_in and properties_out) which are used for mass, energy, and momentum balances, and 2 additional StateBlocks for the conditions at the membrane interface (properties_interface_in and properties_interface_out).
- The permeate-side includes 3 StateBlocks (properties_in, properties_out, and properties_mixed). The inlet and outlet StateBlocks are used to only determine the permeate solute concentration for solvent and solute flux at the feed-side inlet and outlet, while the mixed StateBlock is used for mass balance based on the average flux.
Description | Symbol | Indices |
---|---|---|
Time | t | [0] |
Inlet/outlet | x | ['in', 'out'] |
Phases | p | ['Liq'] |
Components | j | ['H2O', 'NaCl']* |
*Solute depends on the imported property model; example shown here is for the NaCl property model.
Description | Symbol | Variable Name | Index | Units |
---|---|---|---|---|
Solvent permeability coefficient | A | A_comp | [t, j] | m/Pa/s |
Solute permeability coefficient | B | B_comp | [t, j] | m/s |
Mass density of solvent | ρsolvent | dens_solvent | [p] | kg/m3 |
Mass flux across membrane | J | flux_mass_phase_comp | [t, x, p, j] | kg/s/m2 |
Membrane area | Am | area | None | m2 |
Component recovery rate | Rj | recovery_mass_phase_comp | [t, p, j] | dimensionless |
Volumetric recovery rate | Rvol | recovery_vol_phase | [t, p] | dimensionless |
Observed solute rejection | rj | rejection_phase_comp | [t, p, j] | dimensionless |
Over-pressure ratio | Pf, out/Δπout | over_pressure_ratio | [t] | dimensionless |
Mass transfer to permeate | Mp | mass_transfer_phase_comp | [t, p, j] | kg/s |
The following variables are only built when specific configuration key-value pairs are selected.
if has_pressure_change
is set to True
:
Description | Symbol | Variable Name | Index | Units |
---|---|---|---|---|
Pressure drop | ΔP | deltaP | [t] | Pa |
if concentration_polarization_type
is set to ConcentrationPolarizationType.fixed
:
Description | Symbol | Variable Name | Index | Units |
---|---|---|---|---|
Concentration polarization modulus | CPmod | cp_modulus | [t, j] | dimensionless |
if concentration_polarization_type
is set to ConcentrationPolarizationType.calculated
:
Description | Symbol | Variable Name | Index | Units |
---|---|---|---|---|
Mass transfer coefficient in feed channel | kf | Kf | [t, x, j] | m/s |
if mass_transfer_coefficient
is set to MassTransferCoefficient.calculated
or pressure_change_type
is set to PressureChangeType.calculated
:
Description | Symbol | Variable Name | Index | Units |
---|---|---|---|---|
Feed-channel height | hch | channel_height | None | m |
Hydraulic diameter | dh | dh | None | m |
Spacer porosity | ϵsp | spacer_porosity | None | dimensionless |
Reynolds number | Re | N_Re | [t, x] | dimensionless |
if mass_transfer_coefficient
is set to MassTransferCoefficient.calculated
:
Description | Symbol | Variable Name | Index | Units |
---|---|---|---|---|
Schmidt number | Sc | N_Sc | [t, x] | dimensionless |
Sherwood number | Sh | N_Sh | [t, x] | dimensionless |
if mass_transfer_coefficient
is set to MassTransferCoefficient.calculated
or pressure_change_type
is NOT set to PressureChangeType.fixed_per_stage
:
Description | Symbol | Variable Name | Index | Units |
---|---|---|---|---|
Membrane length | L | length | None | m |
Membrane width | W | width | None | m |
if pressure_change_type
is set to PressureChangeType.fixed_per_unit_length
:
Description | Symbol | Variable Name | Index | Units |
---|---|---|---|---|
Average pressure drop per unit length of feed channel | dP_dx | [t] | Pa/m |
if pressure_change_type
is set to PressureChangeType.calculated
:
Description | Symbol | Variable Name | Index | Units |
---|---|---|---|---|
Feed-channel velocity | vf | velocity | [t, x] | m/s |
Friction factor | f | friction_factor_darcy | [t, x] | dimensionless |
Pressure drop per unit length of feed channel at inlet/outlet | ΔP/Δx | dP_dx | [t, x] | Pa/m |
Description | Equation |
---|---|
Solvent flux across membrane | Jsolvent = ρsolventA(Pf − Pp − (πf − πp)) |
Solute flux across membrane | Jsolute = B(Cf − Cp) |
Average flux across membrane | |
Permeate mass flow by component j | Mp, j = AmJavg, j |
Permeate-side solute mass fraction | |
Feed-side membrane-interface solute concentration | |
Concentration polarization modulus | CPmod = Cinterface/Cbulk |
Mass transfer coefficient | |
Sherwood number | Sh = 0.46(ReSc)0.36 |
Schmidt number | |
Reynolds number | |
Hydraulic diameter | |
Cross-sectional area | Ac = hchWϵsp |
Membrane area | Am = LW |
Pressure drop | |
Feed-channel velocity | vf = Qf/Ac |
Friction factor | |
Pressure drop per unit length | |
Component recovery rate | |
Volumetric recovery rate | |
Observed solute rejection |
watertap.unit_models.reverse_osmosis_0D