- 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
.. index:: pair: watertap.unit_models.reverse_osmosis_0D;reverse_osmosis_0D
.. currentmodule:: 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 1 MembraneChannel0DBlock for the feed-side, a StateBlock indexed by time and space for the permeate-side (permeate_side[t, x]), and a StateBlock for the final permeate at the outlet (mixed_permeate).
- 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 mixed_permeate). 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] | \text{m/Pa/s} |
Solute permeability coefficient | B | B_comp | [t, j] | \text{m/s} |
Mass density of solvent | \rho_{solvent} | dens_solvent | [p] | \text{kg/}\text{m}^3 |
Mass flux across membrane | J | flux_mass_phase_comp | [t, x, p, j] | \text{kg/s}\text{/m}^2 |
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} |
Over-pressure ratio | P_{f,out}/\Delta \pi_{out} | over_pressure_ratio | [t] | \text{dimensionless} |
Mass transfer to permeate | M_p | mass_transfer_phase_comp | [t, p, j] | \text{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 | \Delta P | deltaP | [t] | \text{Pa} |
if concentration_polarization_type
is set to ConcentrationPolarizationType.fixed
:
Description | Symbol | Variable Name | Index | Units |
---|---|---|---|---|
Concentration polarization modulus | CP_{mod} | feed_side.cp_modulus | [t, j] | \text{dimensionless} |
if concentration_polarization_type
is set to ConcentrationPolarizationType.calculated
:
Description | Symbol | Variable Name | Index | Units |
---|---|---|---|---|
Mass transfer coefficient in feed channel | k_f | feed_side.K | [t, x, j] | \text{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 | h_{ch} | feed_side.channel_height | None | \text{m} |
Hydraulic diameter | d_h | feed_side.dh | None | \text{m} |
Spacer porosity | \epsilon_{sp} | feed_side.spacer_porosity | None | \text{dimensionless} |
Reynolds number | Re | feed_side.N_Re | [t, x] | \text{dimensionless} |
if mass_transfer_coefficient
is set to MassTransferCoefficient.calculated
:
Description | Symbol | Variable Name | Index | Units |
---|---|---|---|---|
Schmidt number | Sc | feed_side.N_Sc_comp | [t, x, j] | \text{dimensionless} |
Sherwood number | Sh | feed_side.N_Sh_comp | [t, x, j] | \text{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 | \text{m} |
Membrane width | W | width | None | \text{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 | (\frac{\Delta P}{\Delta x})_{avg} | feed_side.dP_dx | [t] | \text{Pa/m} |
if pressure_change_type
is set to PressureChangeType.calculated
:
Description | Symbol | Variable Name | Index | Units |
---|---|---|---|---|
Feed-channel velocity | v_f | feed_side.velocity | [t, x] | \text{m/s} |
Friction factor | f | feed_side.friction_factor_darcy | [t, x] | \text{dimensionless} |
Pressure drop per unit length of feed channel at inlet/outlet | \Delta P/\Delta x | feed_side.dP_dx | [t, x] | \text{Pa/m} |
Description | Equation |
---|---|
Solvent flux across membrane | J_{solvent} = \rho_{solvent} A(P_{f} - P_p - (\pi_{f}-\pi_{p})) |
Solute flux across membrane | J_{solute} = B(C_{f} - C_{p}) |
Average flux across membrane | J_{avg, j} = \frac{1}{2}\sum_{x} J_{x, j} |
Permeate mass flow by component j | M_{p, j} = A_m J_{avg,j} |
Permeate-side solute mass fraction | X_{x, j} = \frac{J_{x, j}}{\sum_{x} J_{x, j}} |
Feed-side membrane-interface solute concentration | C_{interface} = CP_{mod}C_{bulk}=C_{bulk}\exp(\frac{J_{solvent}}{k_f})-\frac{J_{solute}}{J_{solvent}}(\exp(\frac{J_{solvent}}{k_f})-1) |
Concentration polarization modulus | CP_{mod} = C_{interface}/C_{bulk} |
Mass transfer coefficient | k_f = \frac{D Sh}{d_h} |
Sherwood number | Sh = 0.46 (Re Sc)^{0.36} |
Schmidt number | Sc = \frac{\mu}{\rho D} |
Reynolds number | Re = \frac{\rho v_f d_h}{\mu} |
Hydraulic diameter | d_h = \frac{4\epsilon_{sp}}{2/h_{ch} + (1-\epsilon_{sp})8/h_{ch}} |
Cross-sectional area | A_c = h_{ch}W\epsilon_{sp} |
Membrane area | A_m = LW |
Pressure drop | \Delta P = (\frac{\Delta P}{\Delta x})_{avg}L |
Feed-channel velocity | v_f = Q_f/A_c |
Friction factor | f = 0.42+\frac{189.3}{Re} |
Pressure drop per unit length | \frac{\Delta P}{\Delta x} = \frac{1}{2d_h}f\rho v_f^{2} |
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,mix}}{C_{f,in}} |