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)

../../_images/energy_recovery_system.png

Figure 1. Schematic representation of an energy recovery system using a pressure exchanger.

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