modelSTHX_BellDelaware
Information
The Bell-Delaware shell and tube heat exchanger model is based on the method presented by Edward S. Gaddis and Volker Gnielinski in the VDI Heat Atlas 2nd Edition (2010). This method is based off of the extensive work performed at the University of Delaware. The Bell-Delaware method consists of breaking down the pressure drop (dP) model into various sections of the heat exchanger (see Figure 1) while the heat transfer correlation model is more of a lumped parameter type approach. The traditional Bell-Delaware method employs diagrams while the Gaddis Gnielinski version has translated the information to equations. The tube side of the shell and tube heat exchanger is independent of the Bell-Delaware method and thus can be exchanged with any appropriate pipe model, dP model, and/or heat transfer model.
Figure 1: Pressure drop model breakdown into repeated sections
Notes:
- The pipe models for nozzle_a/b do NOT account for long lengths where dP_friction may be important. For this reason a nozzle_pipe has been added to nozzle_a/b which enables long entrance regions to have frictional dP and static head contributions to be accounted.
- Variables noted in the literature are the same as in this model. They have been kept identical as possible as to facililate reference to the source material to improve error catching, ability to reference the source material, and interpretation of the results.
- Figures identifying each of the variables is given below. If additional information is needed, the source material provides two excellent examples.
Application:
This method was developed for use with single phase (shell side - oil/water), cylindrical, single baffle segmented, shell and tube heat exchangers. The range of reported validity (+/- 35%) for the pressure drop and heat transfer correlation models are as follows:
Pressure Drop Model (pgs. 1092 - 1105):
1 < Re < 5*10^4
3 <= Pr <= 10^3
0.2 <= S/D_i <= 1.0
0.15 <= H/D_i <= 0.4
R_B <= 0.5
1.2 <= t/d_o <= 2.0
D_i/d_o > 10
f_L >= 0.4
f_B >= 0.4
Heat Transfer Model (pgs. 731 - 741)
10 < Re_psil < 10^5
3 < Pr < 10^3
0.2 <= S/D_i <= 1
R_G <= 0.8
R_L <= 0.8
R_B <= 0.5
1.2 <= t/d_o <= 2.2
f_w >= 0.3
Figure 2: Definition of S_1, S_2, d_o, and n_MR.
Note: In these examples ->
n_tubes = a) 69, b) 73, and c) 73. (n_bs assumed = 0)
n_MRE = a) 7, b) 9, and c) 13.
n_W_tubes = a) 12, b) 7, and c) 12. (n_W_bs assumed = 0)
n_RW = a) 2, b) 2, and c) 2.
Figure 3: Definition of e and e_1 ( a, b, and L_E are internall calculated).
S_1, S_2, and d_o are identical to what is presented in Figure 2.
Note: nes for these examples are a) 8, b) 8, c) 10.
Figure 4: Definition of d_N, S_E, and S. Specific values are just examples. In this example n_B = 8 and nPasses = 2.
Note: S_E_a/d_N_a is tubesheet to baffle spacing/nozzle diameter on the port_a side.
S_E_b/d_N_b is tubesheet to baffle spacing/nozzle diameter on the port_b side.
height_ab_shell is evenly distributed between windows as a simple means of capturing static pressure.
In this example height_ab_shell = D_i while nozzle elevation changes can be assigned with height_ab_nozzle_a/b.
Figure 5: Definition of H, D_i, D_l, and D_B. Specific values are just examples.
Note: D_BE is not shown as it is often equal to D_B for most heat exchanger layouts.
DB is the diameter of a circle, which touches the outermost tubes in the space between the upper and lower edges of adjacent baffles
D_BE is the diameter of a circle, which touches the outermost tubes of all tubes in the shell of the heat exchanger
Parameters
| Type | Name | Default | Description |
|---|---|---|---|
| Real | nParallel | 1 | # of identical parallel STHXs |
| Real | n_T | n_tubes + n_bs | Total # of tubes (including blind and support) |
| Real | n_W | n_W_tubes + n_W_bs | Total # of tubes in both the upper and lower window (including blind and support) |
| SI.Length | r_inner | 0.5*d_o - th_tube | Inner radius of tube |
| Integer | nNodes_intTotal | nNodes_endCross + (nb - 1)*(nNodes_window + nNodes_centerCross) + nNodes_window + nNodes_endCross | Total number of nodes internal to the shell (i.e., not including nozzles and entry pipes) |
| Integer | nNodes_Total | nNodes_entryPipe_a + nNodes_nozzle + nNodes_intTotal + nNodes_nozzle + nNodes_entryPipe_b | Total number of nodes in the shell-side (i.e., including nozzles and entry pipes) |
| Shell Parameters | |||
| Boolean | isGas | false | true if Medium is a gas |
| Real | np | 0 | Gas specific exponential correction factor (e.g., air = 0; N2 = 0.12) |
| SI.Length | height_a_shell | 0 | Shell Elevation at port_a: Reference value only. No impact on calculations. |
| SI.Length | dheight_entryPipe_a | 0 | Height(shell inlet nozzle midpoint) - Shell Height(port_a) |
| SI.Length | dheight_shell | 0 | Height(shell outlet nozzle midpoint) - Height(shell inlet nozzle midpoint) |
| SI.Length | dheight_entryPipe_b | 0 | Shell Height(port_b) - Height(shell outlet nozzle midpoint) |
| Shell Side Part 1 › General Shell Parameters | |||
| Boolean | counterCurrent | true | Swap temperature and flux vector order |
| Boolean | toggleStaggered | true | true = staggered grid type; false = in-line |
| Real | n_tubes | 1 | Total # of heat transfer tubes (n_T = n_bs + n_tubes) |
| Real | n_bs | 0 | Total # of blind and support rods |
| SI.Length | DB | D_i | Tube bundle diameter |
| SI.Length | D_BE | DB | Diameter of circle that touches outermost tubes |
| SI.Length | d_o | Outer diameter of tubes | |
| SI.Length | e1 | 0 | Space between tubes and shell |
| Real | nes | # of shortest connections connecting neighboring tubes | |
| Shell Side Part 1 › Cross Flow Section Parameters | |||
| SI.Length | D_i | Inside shell diameter | |
| Real | n_MR | # of main resistances in cross flow path | |
| Real | n_MRE | # of main resistances in end cross flow path | |
| Shell Side Part 1 › Window Section Parameters | |||
| Real | n_W_tubes | Total # of heat transfer tubes in both the upper and lower window | |
| Real | n_W_bs | 0 | Total # of blind and support rods in uppper and lower window |
| Real | n_RW | # of tube rows in a window section | |
| Real | n_s | 0 | # of pairs of sealing strips |
| Shell Side Part 2 › Baffle Parameters | |||
| Integer | nb | 2 | # of baffles |
| SI.Length | H | D_i/5 | Height of baffle cut |
| SI.Length | D_l | D_i | Baffle Diameter |
| SI.Length | d_B | d_o | Diameter of holes in baffles |
| SI.Length | s1 | Tube to tube pitch parallel to baffel edge | |
| SI.Length | s2 | Tube to tube pitch perpindicular to baffel edge | |
| SI.Length | S | Baffle spacing between baffles | |
| SI.Length | S_E_a | S | port a baffle spacing between the heat exchanger sheets and adjacent baffles |
| SI.Length | S_E_b | S | port b baffle spacing between the heat exchanger sheets and adjacent baffles |
| SI.Length | th_B | 0 | Baffle thickness |
| Shell Side Part 2 › Entry/Exit Region Parameters | |||
| SI.Length | d_N_a | Nozzle a diameter | |
| SI.Length | d_N_b | Nozzle b diameter | |
| SI.Length | length_entryPipe_a | 0.001 | Length of entryPipe_a |
| SI.Length | length_entryPipe_b | 0.001 | Length of entryPipe_b |
| SI.Height | roughness_entryPipe_a | 2.5e-5 | Avg. height of surface asperities |
| SI.Height | roughness_entryPipe_b | 2.5e-5 | Avg. height of surface asperities |
| Tube Parameters | |||
| Real | nPasses | 1 | Number of tube passes through the shell |
| SI.Length | th_tube | 0.001 | Tube wall thickness |
| Integer | nRadial | 3 | Nodes in radial direction in tube wall |
| SI.Height | roughness_tube | 2.5e-5 | Average height of the inner tube surface asperities |
| SI.Length | height_a_tube | 0 | Tube Elevation at port_a: Reference value only. No impact on calculations. |
| SI.Length | dheight_tube | 0 | Tube Height(port_b) - Height(port_a) |
| Assumptions | |||
| Boolean | allowFlowReversal | system.allowFlowReversal | = true to allow flow reversal, false restricts to design direction (port_a -> port_b) |
| Assumptions › Shell Dynamics | |||
| Modelica.Fluid.Types.Dynamics | energyDynamics_shell | system.energyDynamics | Formulation of energy balances |
| Modelica.Fluid.Types.Dynamics | massDynamics_shell | system.massDynamics | Formulation of mass balances |
| Modelica.Fluid.Types.Dynamics | momentumDynamics_shell | system.momentumDynamics | Formulation of momentum balances |
| Assumptions › Tube Dynamics | |||
| Modelica.Fluid.Types.Dynamics | energyDynamics_tube | system.energyDynamics | Formulation of energy balances |
| Modelica.Fluid.Types.Dynamics | massDynamics_tube | system.massDynamics | Formulation of mass balances |
| Modelica.Fluid.Types.Dynamics | momentumDynamics_tube | system.momentumDynamics | Formulation of momentum balances |
| Assumptions › Tube Wall Dynamics | |||
| Modelica.Fluid.Types.Dynamics | energyDynamics_wall | system.energyDynamics | Formulation of energy balances |
| Shell Initialization › Start Value: Pressure | |||
| SI.AbsolutePressure | p_a_start_shell | system.p_start | Pressure at port a |
| SI.AbsolutePressure | p_b_start_shell | p_a_start_shell | Pressure at port b |
| Medium_shell.AbsolutePressure | ps_start_shell | linspace(p_a_start_shell, p_b_start_shell, nNodes_Total) | Pressures {port_a,...,port_b} |
| Shell Initialization › Start Value: Temperature | |||
| Boolean | use_Ts_start_shell | true | Use T_start if true, otherwise h_start |
| Modelica.Media.Interfaces.Types.Temperature | T_a_start_shell | system.T_start | Temperature at port a |
| Modelica.Media.Interfaces.Types.Temperature | T_b_start_shell | shell.T_a_start | Temperature at port b |
| Medium_shell.Temperature | Ts_start_shell | if use_Ts_start_shell then cat(1, fill(T_a_start_shell, nNodes_entryPipe_a + nNodes_nozzle), linspace(T_a_start_shell, T_b_start_shell, nNodes_intTotal), fill(T_b_start_shell, nNodes_entryPipe_b + nNodes_nozzle)) else {Medium_shell.temperature_phX(ps_start_shell[i], hs_start_shell[i], X_start_shell) for i in 1:nNodes_Total} | Temperatures {a,...,b} |
| Shell Initialization › Start Value: Specific Enthalpy | |||
| Modelica.Media.Interfaces.Types.SpecificEnthalpy | h_a_start_shell | Medium_shell.specificEnthalpy_pTX(shell.p_a_start, shell.T_a_start, shell.X_start) | Specific enthalpy at port a |
| Modelica.Media.Interfaces.Types.SpecificEnthalpy | h_b_start_shell | Medium_shell.specificEnthalpy_pTX(shell.p_b_start, shell.T_b_start, shell.X_start) | Specific enthalpy at port b |
| Medium_shell.SpecificEnthalpy | hs_start_shell | if use_Ts_start_shell then {Medium_shell.specificEnthalpy_pTX(ps_start_shell[i], Ts_start_shell[i], X_start_shell) for i in 1:nNodes_Total} else cat(1, fill(h_a_start_shell, nNodes_entryPipe_a + nNodes_nozzle), linspace(h_a_start_shell, h_b_start_shell, nNodes_intTotal), fill(h_b_start_shell, nNodes_entryPipe_b + nNodes_nozzle)) | Specific enthalpies {a,...,b} |
| Shell Initialization › Start Value: Mass Fractions | |||
| Modelica.Media.Interfaces.Types.MassFraction[Medium_shell.nX] | X_start_shell | Medium_shell.X_default | Mass fractions m_i/m |
| Shell Initialization › Start Value: Trace Substances | |||
| Modelica.Media.Interfaces.Types.ExtraProperty[Medium_shell.nC] | C_start_shell | fill(0, Medium_shell.nC) | Trace substances |
| Shell Initialization › Start Value: Mass Flow Rate | |||
| SI.MassFlowRate | m_flow_start_shell | system.m_flow_start | Mass flow rate |
| Tube Initialization › Start Value: Absolute Pressure | |||
| Modelica.Media.Interfaces.Types.AbsolutePressure | p_a_start_tube | system.p_start | Pressure at port a |
| Modelica.Media.Interfaces.Types.AbsolutePressure | p_b_start_tube | tube.p_a_start | Pressure at port b |
| Modelica.Media.Interfaces.Types.AbsolutePressure[tube.nV] | ps_start_tube | if tube.nV > 1 then linspace(tube.p_a_start, tube.p_b_start, tube.nV) else {(tube.p_a_start + tube.p_b_start)/2} | Pressures {port_a,...,port_b} |
| Tube Initialization › Start Value: Temperature | |||
| Boolean | use_Ts_start_tube | true | Use T_start if true, otherwise h_start |
| Modelica.Media.Interfaces.Types.Temperature | T_a_start_tube | system.T_start | Temperature at port a |
| Modelica.Media.Interfaces.Types.Temperature | T_b_start_tube | tube.T_a_start | Temperature at port b |
| Modelica.Media.Interfaces.Types.Temperature[tube.nV] | Ts_start_tube | if tube.use_Ts_start then if tube.nV > 1 then linspace(tube.T_a_start, tube.T_b_start, tube.nV) else {(tube.T_a_start + tube.T_b_start)/2} else {Medium_tube.temperature_phX(tube.ps_start[i], tube.hs_start[i], tube.Xs_start) for i in 1:tube.nV} | Temperatures {port_a,...,port_b} |
| Tube Initialization › Start Value: Specific Enthalpy | |||
| Modelica.Media.Interfaces.Types.SpecificEnthalpy | h_a_start_tube | Medium_tube.specificEnthalpy_pTX(tube.p_a_start, tube.T_a_start, tube.Xs_start) | Specific enthalpy at port a |
| Modelica.Media.Interfaces.Types.SpecificEnthalpy | h_b_start_tube | Medium_tube.specificEnthalpy_pTX(tube.p_b_start, tube.T_b_start, tube.Xs_start) | Specific enthalpy at port b |
| Modelica.Media.Interfaces.Types.SpecificEnthalpy[tube.nV] | hs_start_tube | if tube.use_Ts_start then {Medium_tube.specificEnthalpy_pTX(tube.ps_start[i], tube.Ts_start[i], tube.Xs_start) for i in 1:tube.nV} else if tube.nV > 1 then linspace(tube.h_a_start, tube.h_b_start, tube.nV) else {(tube.h_a_start + tube.h_b_start)/2} | Specific enthalpies {port_a,...,port_b} |
| Tube Initialization › Start Value: Mass Fractions | |||
| Modelica.Media.Interfaces.Types.MassFraction[Medium_tube.nX] | Xs_start_tube | Medium_tube.X_default | Mass fractions m_i/m |
| Tube Initialization › Start Value: Trace Substances | |||
| Modelica.Media.Interfaces.Types.ExtraProperty[Medium_tube.nC] | Cs_start_tube | fill(0, Medium_tube.nC) | Trace substances |
| Tube Initialization › Start Value: Mass Flow Rate | |||
| Modelica.Media.Interfaces.PartialMedium.MassFlowRate | m_flow_a_start_tube | system.m_flow_start | Mass flow rate at port_a |
| Modelica.Media.Interfaces.PartialMedium.MassFlowRate | m_flow_b_start_tube | -tube.m_flow_a_start | Mass flow rate at port_b |
| Modelica.Media.Interfaces.PartialMedium.MassFlowRate[tube.nV + 1] | m_flows_start_tube | linspace(tube.m_flow_a_start, -tube.m_flow_b_start, tube.nV + 1) | Mass flow rates {port_a,...,port_b} |
| Advanced | |||
| Integer | nNodes_entryPipe_a | 1 | Number of discrete flow volumes in entryPipe_a |
| Integer | nNodes_entryPipe_b | 1 | Number of discrete flow volumes in entryPipe_a |
| Integer | nNodes_nozzle | 1 | Number of discrete flow volumes in each nozzle |
| Integer | nNodes_endCross | 1 | Number of discrete flow volumes in each endCross segment |
| Integer | nNodes_window | 1 | Number of discrete flow volumes in each window segment |
| Integer | nNodes_centerCross | 1 | Number of discrete flow volumes in each centerCross segment |
| Modelica.Fluid.Types.ModelStructure | modelStructure_shell | Modelica.Fluid.Types.ModelStructure.av_b | Determines whether flow or volume models are present at the ports |
| Modelica.Fluid.Types.ModelStructure | modelStructure_tube | Modelica.Fluid.Types.ModelStructure.av_b | Set ports as flow or volume models |
Connectors
| Type | Name | Default | Description |
|---|---|---|---|
| Modelica.Fluid.Interfaces.FluidPort_a | port_a_tube | ||
| Modelica.Fluid.Interfaces.FluidPort_b | port_b_tube | ||
| Modelica.Fluid.Interfaces.FluidPort_a | port_a_shell | ||
| Modelica.Fluid.Interfaces.FluidPort_b | port_b_shell |
Components
Contents
| Name | Description |
|---|---|
| Tube side medium | |
| Tube wall material | |
| Shell side medium | |