Reverse Osmosis with Energy Recovery
Introduction
This flowsheet represents a reverse osmosis (RO) with energy recovery device (ERD). The flowsheet is similar to the desalination block of the full-scale seawater RO treatment facility flowsheet, but includes a demonstration for optimization of the process. The user can select between pressure exchanger ERD, pump-as-turbine ERD, or no ERD.
Implementation
This flowsheet uses several different modeling features available in WaterTAP, including:
- Costing packages:
- Property models:
- Unit models:
The demonstration file itself contains several core functions that are used to build, specify, initialize, solve, and (optionally) optimize the model, as well as helper functions that group these core functions together for convenience or to display results.
Creating and instantiating the model using
build()
:This function will create the core components and structure of the flowsheet including unit, property, and costing models. Different components will be added depending on the type of ERD used (dictated by the
erd_type
argument). AnArc
is used to connect the different component flows to one another and default scaling factors are set.Specify the operating conditions with
set_operating_conditions()
:Influent component flows and RO pump operating pressures are set with this function. The user can set via keyword arguments the volumetric flow rate (
flow_vol
), mass fraction of NaCl (salt_mass_conc
), a target fractional mass-based water recoverywater_recovery
, and a fractional over pressure (over_pressure
). Over pressure is the fractional increase in pressure over of the brine osmotic pressure to use as the an initial guess for the RO operating pressure as determined by the helper functioncalculate_operating_pressure
. Initial values for relevant RO membrane parameters are provided in the Flowsheet Specifications section. After the RO unit is initialized, the area is unfixed and the mass-based recovery is fixed to the user provided value.Calculating the RO operating pressure with
calculate_operating_pressure()
:This helper functions takes in the RO feed state block and will calculate the needed operating pressure to achieve the desired mass-based water recovery.
Initialize entire system with
initialize_system()
:After the model is built and specified, this function will initialize the feed, RO, and costing blocks. Depending on the
erd_type
different helper functions are used to initialize the relevant ERD-related unit models.Optionally optimize the system with
optimize_set_up()
:The model is fully defined and can be solved with the provided
solve()
function after the user passes the model throughinitialize_system()
. This function is provided as a demonstration of how the system could be optimized the minimize the levelized cost of water (LCOW). The optimization routine proceeds as follows:An
Objectve
is placed on the flowsheet set to minimize theLCOW
expression in the costing package.Operating pressure for the RO booster pump is unfixed and realistic bounds are placed on the pressure.
Similarly, the RO membrane area is unfixed and bounds are placed on the membrane area.
To ensure the product water is still of acceptable quality, a
Constraint
is placed on the effluent concentration of the RO to be less than 500 mg/L.Additionally, there is a minimum water flux placed on the RO model to be over 2.8e-4 kg/m \(\text{}^2\)/s.
There are other helper functions, like display_system()
, display_design()
, and display_state()
, that
are used to print out the results of the model solve. The main()
function is an example of building, specifying,
initializing, and optimizing an RO-ERD system with WaterTAP.
Figure 1 presents the process flow diagram if erd_type == pressure_exchanger
.

Figure 1: Process flow for RO with pressure exchanger ERD.
Figure 2 presents the process flow diagram if erd_type == pump_as_turbine
.

Figure 2: Process flow for RO with pump-as-turbine ERD.
Figure 3 presents the process flow diagram with no ERD (i.e., erd_type == no_ERD
).

Figure 3: Process flow for RO without ERD.
Degrees of Freedom
The degrees of freedom (DOF) for the flowsheet can change depending on model configuration options.
For either pump_as_turbine
or pressure_exchanger
as erd_type
, there are 15 DOF. Running
the model with no_ERD
results in 13 DOF.
Influent conditions (component flows, temperature, pressure)
RO membrane properties
RO operating pressure
Pump and ERD efficiencies
Passing any model build to the provided function set_operating_conditions()
will result in a model with zero DOF.
Flowsheet Specifications
The influent and operating conditions for the different flowsheet configurations are presented in the following table,
including the different build options for erd_type
:
Description |
Default Value |
Units |
---|---|---|
Influent Conditions |
||
Volumetric flow rate |
1e-3 |
\(\text{m}^3/\text{s}\) |
TDS mass fraction |
0.035 |
\(\text{dimensionless}\) |
Temperature |
298 |
\(\text{K}\) |
Pressure |
101325 |
\(\text{Pa}\) |
Desalination |
||
RO water permeability coefficient |
4.2e-12 |
\(\text{m/Pa/s}\) |
RO salt permeability coefficient |
3.5e-8 |
\(\text{m/s}\) |
RO spacer porosity |
0.85 |
\(\text{dimensionless}\) |
RO channel height |
1e-3 |
\(\text{m}\) |
RO membrane width per stage |
5 |
\(\text{m}\) |
RO total membrane area per stage |
50 |
\(\text{m}^2\) |
RO permeate side pressure |
101325 |
\(\text{Pa}\) |
Pump 1 efficiency |
0.8 |
\(\text{dimensionless}\) |
Pump 1 operating pressure |
70e5 |
\(\text{Pa}\) |
if |
||
Pressure exchanger efficiency |
0.95 |
\(\text{dimensionless}\) |
Pump 2 efficiency |
0.8 |
\(\text{dimensionless}\) |
if |
||
Energy recovery device pump efficiency |
0.95 |
\(\text{dimensionless}\) |
Energy recovery device permeate side pressure |
101325 |
\(\text{Pa}\) |
Code Documentation
watertap.examples.flowsheets.RO_with_energy_recovery