Pressure Exchanger
- This pressure exchanger unit model:
is 0-dimensional
is isothermal
supports a single liquid phase only
supports steady-state only
assumes no mixing or leakage between the low and high pressure side
assumes equal flowrates on both sides
Degrees of Freedom
Generally, pressure exchangers are not used in isolation and are part of an energy recovery system that includes a mixer, splitter, and a booster pump, as shown in Figure 1. This energy recovery system only adds one degree of freedom to the overall model.
- Typically, the following variables are fixed to fully specify the energy recovery system:
the pressure exchanger efficiency (efficiency_pressure_exchanger located on the pressure exchanger unit model)
the booster pump efficiency (efficiency_pump located on the pump unit model)
- Where the system is also subject to following constraints:
volumetric flowrate is equal on both sides of the pressure exchanger (constraint is included in pressure exchanger unit model)
booster pump matches the high pressure pump outlet pressure (constraint must be added by the user or at the mixer with the equality momentum mixing type option)
Model Structure
The pressure exchanger model consists of 2 ControlVolume0DBlocks: one for the low-pressure side and high-pressure side.
Sets
Description |
Symbol |
Indices |
---|---|---|
Time |
\(t\) |
[0] |
Phases |
\(p\) |
[‘Liq’] |
Components |
\(j\) |
[‘H2O’, ‘NaCl’]* |
*Solute depends on the imported property package; example shown here is for the NaCl property model.
Variables
The pressure exchanger unit model includes the following variables:
Description |
Symbol |
Variable Name |
Index |
Units |
Pyomo Type |
---|---|---|---|---|---|
Efficiency |
\(\eta\) |
efficiency_pressure_exchanger |
[t] |
\(\text{dimensionless}\) |
Var |
Each control volume (i.e. low_presssure_side, and high_pressure_side) has the following variables of interest:
Description |
Symbol |
Variable Name |
Index |
Units |
Pyomo Type |
---|---|---|---|---|---|
Pressure change |
\(ΔP\) |
deltaP |
[t] |
* |
Var |
Work |
\(W\) |
work |
[t] |
* |
Expression |
*Units depends on the imported property package
Each property block on both control volumes (i.e. properties_in and properties_out) has the following variables of interest:
Description |
Symbol |
Variable Name |
Index |
Units |
Pyomo Type |
---|---|---|---|---|---|
Volumetric flowrate |
\(Q\) |
flow_vol |
None |
* |
Var |
Temperature |
\(T\) |
temperature |
[t] |
* |
Var |
Pressure |
\(P\) |
pressure |
[t] |
* |
Var |
*Units depends on the imported property package
Equations
Description |
Equation |
---|---|
Mass balance for each side |
\(M_{out, j} = M_{in, j}\) |
Momentum balance for each side |
\(P_{out} = P_{in} + ΔP\) |
Isothermal assumption for each side |
\(T_{out} = T_{in}\) |
Equal volumetric flowrate* |
\(Q_{LPS} = Q_{HPS}\) |
Pressure transfer* |
\(ΔP_{LPS} = - \eta ΔP_{HPS}\) |
* LPS stands for low pressure side, HPS stands for high pressure side
Class Documentation
- class proteuslib.unit_models.pressure_exchanger.PressureExchanger(*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. Pressure exchangers do not support dynamic behavior.
- has_holdup
Indicates whether holdup terms should be constructed or not. default - False. Pressure exchangers 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.}
- 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
(PressureExchanger) New instance
- class proteuslib.unit_models.pressure_exchanger.PressureExchangerData(component)[source]
Standard Pressure Exchanger Unit Model Class: - steady state only
- 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(state_args=None, routine=None, outlvl=0, solver=None, optarg=None)[source]
General wrapper for pressure exchanger initialization routine
- Keyword Arguments
routine – str stating which initialization routine to execute * None - currently no specialized routine for Pressure exchanger unit
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 (default=idaeslog.NOTSET)
optarg – solver options dictionary object, if None provided an empty dictionary will be used (default=None)
solver – solver object or string indicating which solver to use during initialization, if None provided the default solver will be used (default = None)
Returns: None