Heat Exchanger - Constant Pinch Model

Model description

Usage of a pinch point to model a Heat Exchanger (HEX) is typically done when modelling a phase-changing HEX. This approach is usually applied for evaporators and condensers. The pinch point corresponds to the location of the HEX where the temperature difference between the two fluids implied in the HEX is minimal. One of the two fluids is expected to be phase-changing. After phase-changing, the subcooling or superheating of the fluid is to be considered. The following assumptions are made:

  • Steady-state operation

  • No pressure drops

  • No heat losses to the ambient

  • Counterflow configuration

The model performs a discretisation of the HEX in one to three zones corresponding to the potential phases encountered by the phase-changing fluid in the HEX length, namely:

  • Superheated vapor zone

  • Two-phase zone

  • Subcooled liquid zone

The pinch point temperature difference (\(\Delta T_{pp}\)) is the minimum temperature difference that can be seen between the two fluids in the HEX. It is located relatively to the phase-changing fluid as being either at the HEX inlet, two-phase zone inlet or at the HEX outlet. The schematic representation of these possible locations can be found in the figure below. The other fluid is considered as remaning in the same phase in the HEX.

Schematic representation of  the possible pinch point location in the HEX.

The model takes as input the fluids conditions at the supply of both sides of the HEX, namely the fluid type, its pressure and its specific enthalpy (mass-based). The fluids are identified as hot (“H”) and cold (“C”). The model parameters are:

  • The pinch point temperature difference: “Pinch”

  • The superheating (if evaporator) or subcooling (if condenser): “Delta_T_sh_sc”

  • The HEX type, i.e. evaporator or condenser: “HX_type”

The outputs of the model are the fluids conditions at the exhaust of the HEX (pressure and specific enthalpy for both hot and cold sides) and the HEX heat duty.

Class description

class component.heat_exchanger.hex_cstpinch.HexCstPinch[source]

Component: Heat Exchanger with constant pinch point.

Description:

Simulates a Heat Exchanger with a constant pinch point. The Pinch Point is understood as being the location on the heat exchanger length where the temperature difference between the hot and the cold fluid is minimal.

Assumptions:

  • Steady-state operation

  • No pressure drops considered

  • No loss to the ambient considered.

Connectors:

su_H (MassConnector): Mass connector for the hot suction side. su_C (MassConnector): Mass connector for the cold suction side.

ex_H (MassConnector): Mass connector for the hot exhaust side. ex_C (MassConnector): Mass connector for the cold exhaust side.

Q (HeatConnector): Heat connector for the heat transfer between the fluids

Parameters:

Pinch: Pinch point temperature difference [K] or [°C]

Delta_T_sh_sc: Superheating or subcooling, depending if the HEX is an evaporator (superheating) or a condenser (subcooling)

HX_type: HX type, i.e. evaporator or condenser

Inputs:

fluid_C: Cold suction side fluid. [-]

h_su_C: Cold suction side enthalpy. [J/kg]

P_su_C: Cold suction side pressure. [Pa]

m_dot_C: Cold suction side mass flow rate. [kg/s]

fluid_H: Hot suction side fluid. [-]

h_su_H: Hot suction side enthalpy. [J/kg]

P_su_H: Hot suction side pressure. [Pa]

m_dot_H: Hot suction side mass flow rate. [kg/s]

Outputs:

h_ex_C: Cold exhaust side enthalpy. [J/kg]

P_ex_C: Cold exhaust side pressure. [Pa]

h_ex_H: Hot exhaust side enthalpy. [J/kg]

P_ex_H: Hot exhaust side pressure. [Pa]

Q_dot: Heat Exchanger’s heat duty. [W]

Example of use


from labothappy.component.heat_exchanger.hex_cstpinch import HexCstPinch

# from simulation_model import HXPinchCst
import numpy as np

from CoolProp.CoolProp import PropsSI

case_test = 'COND_C5'

"Evaporator test"

if case_test == 'EVAP_C5':

    # # # Exo ORC M&S
    EVAP = HexCstPinch()
    
    EVAP.set_inputs(
        fluid_C = 'Cyclopentane',
        T_su_C = 110+273.15,
        P_su_C = 831.8*1e3,
        m_dot_C = 51.03,
    
        fluid_H = 'Water', #Oil
        T_su_H = 145+273.15,
        P_su_H = 5*1e5,
        m_dot_H = 400,
    )
    
    EVAP.set_parameters(**{
        'Pinch': 4,
        'Delta_T_sh_sc': 10,
        'HX_type': 'evaporator'
    })
    
    EVAP.solve()
    EVAP.print_results()
    EVAP.print_states_connectors()
    EVAP.plot_disc()
    
    fig = EVAP.plot_Ts(choose_HX_side='C')
    fig.show()
    
    EVAP.equivalent_effectiveness()

elif case_test == 'EVAP_HP_ZORLU':

    # # # Exo ORC M&S
    EVAP = HexCstPinch()
    
    EVAP.set_inputs(
        fluid_C = 'Cyclopentane',
        h_su_C = 166132,
        P_su_C = 493215,
        m_dot_C = 19.99,
    
        fluid_H = 'Water',
        T_su_H = 113.1+273.15,
        P_su_H = 189*1e3,
        m_dot_H = 497.6,
    )
    
    EVAP.set_parameters(**{
        'Pinch': 3,
        'Delta_T_sh_sc': 1,
        'HX_type': 'evaporator'
    })
    
    EVAP.solve()
    EVAP.print_results()
    EVAP.print_states_connectors()
    EVAP.plot_disc()
    
    fig = EVAP.plot_Ts(choose_HX_side='C')
    fig.show()
    
    EVAP.equivalent_effectiveness()

elif case_test == 'EVAP_C3':

    # Exo ORC M&S
    EVAP = HexCstPinch()
    
    EVAP.set_inputs(
        fluid_C = 'Propane',
        T_su_C = 15+273.15,
        P_su_C = 793237,
        m_dot_C = 0.1,
    
        fluid_H = 'Water', #Oil
        T_su_H = 25+273.15,
        P_su_H = 3*1e5,
        m_dot_H = 2,
    )
    
    EVAP.set_parameters(**{
        'Pinch': 4,
        'Delta_T_sh_sc': 1,
        'HX_type': 'evaporator',
        # 'DP_c' : 10*1e3,
        # 'DP_h' : 10*1e3,
    })
    
    EVAP.solve()
    EVAP.print_results()
    EVAP.print_states_connectors()
    EVAP.plot_disc()
    
    # EVAP.equivalent_effectiveness()

# elif case_test == 'COND_C5':

#     "Condenser test"
    
#     COND = HexCstPinch()
    
#     COND.set_inputs(
#         fluid_H = 'Cyclopentane',
#         T_su_H = 45+273.15,
#         P_su_H = 71.82*1e3,
#         m_dot_H = 34.51,
        
#         fluid_C = 'Water',
#         T_su_C = 24+273.15,
#         P_su_C = 1e5,
#         m_dot_C = 900
#     )
    
#     COND.set_parameters(**{
#         'Pinch': 3,
#         'Delta_T_sh_sc': 1,
#         'HX_type': 'condenser',
#         # 'DP_c' : 30*1e3,
#         # 'DP_h' : 15*1e3,
#     })
    
#     COND.solve()
    
#     COND.print_results()
#     COND.print_states_connectors()
#     COND.plot_disc()
    
#     # COND.equivalent_effectiveness()
   
elif case_test == 'COND_C5':

    "Condenser test"
    
    COND = HexCstPinch()
    
    T_in = 301.1500000038572
    
    P_su_H, h_su_H = PropsSI(('P','H'), 'T', T_in, 'Q', 0.98, 'Cyclopentane')
    
    COND.set_inputs(
        fluid_H = 'Cyclopentane',
        h_su_H = h_su_H,
        P_su_H = P_su_H,
        m_dot_H = 34.51,
        
        fluid_C = 'Water',
        T_su_C = 24+273.15,
        P_su_C = 1e5,
        m_dot_C = 900
    )
    
    COND.set_parameters(**{
        'Pinch': 3,
        'Delta_T_sh_sc': 1,
        'HX_type': 'condenser',
        # 'DP_c' : 30*1e3,
        # 'DP_h' : 15*1e3,
    })
    
    COND.solve()
    
    # COND.print_results()
    # COND.print_states_connectors()
    COND.plot_disc()
    
    # COND.equivalent_effectiveness()
    
    
elif case_test == 'COND_CO2':

    COND = HexCstPinch()
    
    COND.set_inputs(
        fluid_H = 'CO2',
        T_su_H = 30+273.15,
        P_su_H = 55*1e5,
        m_dot_H = 30,
        
        fluid_C = 'Water',
        T_su_C = 15+273.15,
        P_su_C = 5*1e5,
        m_dot_C = 100
    )
    
    COND.set_parameters(**{
        'Pinch': 5,
        'Delta_T_sh_sc': 0.1,
        'HX_type': 'condenser',
        # 'DP_c' : 10*1e3,
        # 'DP_h' : 10*1e3,
    })
    
    
    COND.solve()
    
    COND.print_results()
    COND.print_states_connectors()
    COND.plot_disc()
    
    # COND.equivalent_effectiveness()
    

References

/