#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''Pychemqt, Chemical Engineering Process simulator
Copyright (C) 2009-2025, Juan José Gómez Romera <jjgomera@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Helically coiled tubes have many applications in engineering. Examples of it
use include compact heat exchanger, steam generators, distillation, or chemical
reactors...
In curved pipes, the more rapidly flowing central parts of the flow are forced
outwards by centrifugal action, while the slower parts along the wall are
forced inwards where the pressusre is less, and a secondary flow takes place
at right angles to the main flow. If the curvature is significant, the axial
velocity distribution is entirely altered by the secondary flow, and a
considerable increase in resistance an heat transfer is observed.
The heat transfer and pressure losses depend on the Dean number
:math:`De = Re (d_i/D_c)^{0.5}`
There is many literature about the flow in curved pipes, here is implemented
some of more relevant correlation for friction factor and nusselt number.
'''
from functools import partial
from math import atan, exp, log, log10, pi, tan
from scipy.optimize import fsolve
from tools.qt import QtCore, QtWidgets, translate
from equipment.widget.gui import ToolGui, CallableEntity
from lib.adimensional import Dean, Helical, Germano
from lib.friction import f_friccion
from lib.heatTransfer import h_tubeside_turbulent_Dittus_Boelter
from lib.unidades import Length
from lib.utilities import refDoc
from UI.widgets import Entrada_con_unidades
__doi__ = {
1:
{"autor": "El-Genk, M.S., Timothy, M.S.",
"title": "A Review and Correlations for Convection Heat Transfer and "
"Pressure Losses in Toroidal and Helically Coiled Tubes",
"ref": "Heat Transfer Eng. 38(5) (2017) 447-474",
"doi": "10.1080/01457632.2016.1194693"},
2:
{"autor": "",
"title": "Perry's Chemical Engineers' Handbook 9th Edition",
"ref": "McGraw-Hill (2019)",
"doi": ""},
3:
{"autor": "Schmidt, E.F.",
"title": "Wärmeübergand und Druckverlust in Rohrschlangen",
"ref": "Chemie Ingenieur Technik 39(13) (1967) 781-789",
"doi": "10.1002/cite.330391302"},
4:
{"autor": "Ito, H.",
"title": "Friction Factors for Turbulent Flow in Curved Pipes",
"ref": "J. Basic Eng. 81 (1959) 123-134",
"doi": "10.1115/1.4008390"},
5:
{"autor": "Kubair, V., Kuloor, N.R.",
"title": "Heat Transfer to Newtonian Fluids in Coiled Pipes in "
"Laminar Flow",
"ref": "Int. J. Heat Mass Transfer 9 (1966) 63-75",
"doi": "10.1016/0017-9310(66)90057-3"},
6:
{"autor": "Srinivasan, P.S., Nandapurkar, S.S., Holland, F.A.",
"title": "Pressure Drop and Heat Transfer in Coils",
"ref": "Chem. Eng. 218 (1968) 113-119",
"doi": ""},
7:
{"autor": "Kutateladze, S.S., Borishanskii, V.M. ",
"title": "A Concise Encyclopedia of Heat Transfer",
"ref": "Pergamon Press (1966)",
"doi": ""},
8:
{"autor": "White, C.M.",
"title": "Streamline Flow through Curved Pipes",
"ref": "Proc. R .Soc. London A 123 (1929) 645-663",
"doi": "10.1098/rspa.1929.0089"},
9:
{"autor": "Mori, Y., Nakayama, W.",
"title": "Study on Forced Convective Heat Transfer in Curved Pipes "
"(1st Report, Laminar Region)",
"ref": "Int. J. Heat Mass Transfer 8(1) (1965) 67-82",
"doi": "10.1016/0017-9310(65)90098-0"},
10:
{"autor": "Mori, Y., Nakayama, W.",
"title": "Study on Forced Convective Heat Transfer in Curved Pipes "
"(2nd Report, Turbulent Region)",
"ref": "Int. J. Heat Mass Transfer 10(1) (1967) 37-59",
"doi": "10.1016/0017-9310(67)90182-2"},
11:
{"autor": "Hart, J., Ellenberger, J., Hamersma, P.J.",
"title": "Single- and Two-Phase Flow Through Helically Coiled Tubes",
"ref": "Chem. Eng. Sci. 43(4) (1988) 775-783",
"doi": "10.1016/0009-2509(88)80072-1"},
12:
{"autor": "Ju, H., Huang, Z., Xu, Y., Duan, B, Yu, Y.",
"title": "Hydraulic Performance of Small Bending Radius Helical "
"Coil-Pipe",
"ref": "J. Nuclear Sci. Eng. 38(10) (2001) 826-831",
"doi": "10.1080/18811248.2001.9715102"},
13:
{"autor": "Mishra, P., Gupta, S.N.",
"title": "Momentum Transfer in Curved Pipes. 1. Newtonian Fluids",
"ref": "Ind. Eng. Chem. Process Des. Dev. 18(1) (1979) 130-137",
"doi": "10.1021_i260069a017"},
14:
{"autor": "Czop, V., Barbier, D., Dong, S.",
"title": "Pressure drop, void fraction and shear stress measurements "
"in an adiabatic two-phase flow in a coiled tube",
"ref": "Nuclear Eng. Design 149 (1994) 323-333",
"doi": "10.1016/0029-5493(94)90298-4"},
15:
{"autor": "Xin, R.C., Ebadian, M.A. ",
"title": "The Effects of Prandtl Numbers on Local and Average "
"Convective Heat Transfer Characteristics in Helical Pipes",
"ref": "J. Heat Transfer 119(3) (1997) 467-73",
"doi": "10.1115/1.2824120"},
16:
{"autor": "Seban R.A., McLaughlin, E.F.",
"title": "Heat Transfer in Tube Coils with Laminar and Turbulent Flow",
"ref": "Int. J. Heat Mass Transfer 6() (1963) 387-395",
"doi": "10.1016/0017-9310(63)90100-5"},
17:
{"autor": "Manlapaz, R.L., Churchill, S.W.",
"title": "Fully Developed Laminar Flow in a Helically Coiled Tube of "
"Finite Pitch",
"ref": "Chem. Eng. Communications 7 (1980) 57-78",
"doi": "10.1080/00986448008912549"},
18:
{"autor": "Prasad, B.V.S.S.S., Das, D.H., Prabhaker, A.K.",
"title": "Pressure Drop, Heat Transfer and Performance of a "
"Helically Coiled Tubular Exchanger",
"ref": "Heat Recovery Systems & CHP 9(3) (1989) 249-256",
"doi": "10.1016/0890-4332(89)90008-2"},
19:
{"autor": "Liu, S., Masliyah, J.H.",
"title": "Axially invariant laminar flow in helical pipes with a "
"finite pitch",
"ref": "J. Fluid Mech. 251 (1993) 315-353",
"doi": "10.1017/S002211209300343X"},
20:
{"autor": "Seth, K.K., Stahel, E.P.",
"title": "Heat Transfer from Helical Coils Immersed in Agitated "
"Vessels",
"ref": "Ind. Eng. Chem. 61(6) (1969) 39-49",
"doi": "10.1021/ie50714a007"},
21:
{"autor": "Ali, S.",
"title": "Pressure drop correlations for flow through regular "
"helical coil tubes",
"ref": "Fluid Dyn. Research 28 (2001) 295-310",
"doi": "10.1016/s0169-5983(00)00034-4"},
22:
{"autor": "Guo, L., Feng, Z, Chen, X.",
"title": "An experimental investigation of the frictional pressure "
"drop of steam–water two-phase flow in helical coils",
"ref": "Int. J. Heat Mass Transfer 44(14) (2001): 2601-2610",
"doi": "10.1016/S0017-9310(00)00312-4"},
23:
{"autor": "Ito, H.",
"title": "Laminar Flow in Curved Pipes",
"ref": "Z. Angew. Math. Mech. 11 (1969) 653-663",
"doi": "10.1002/zamm.19690491104"},
24:
{"autor": "Tarbell, J.M., Samuels, M.R.",
"title": "Momentum and Heat Transfer in Helical Coils",
"ref": "Chem. Eng. J. 5(2) (1973) 117-127",
"doi": "10.1016/0300-9467(73)80002-4"},
25:
{"autor": "Mandal, M. M., Nigam, K.D.P.",
"title": "Experimental Study on Pressure Drop and Heat Transfer of "
"Turbulent Flow in Tube in Tube Helical Heat Exchanger",
"ref": "Ind. Eng. Chem. Res. 48(20) (2009) 9318-9324",
"doi": "10.1021/ie9002393"},
26:
{"autor": "Ciencolini, A., Santini, L.",
"title": "An experimental investigation regarding the laminar to "
"turbulent flow transition in helically coiled pipes",
"ref": "Exp. Thermal Fluid Sci. 30 (2006) 367-380",
"doi": "10.1016/j.expthermflusci.2005.08.005"},
27:
{"autor": "Adler, M.",
"title": "Strömung in gekrümmten Rohren",
"ref": "Z. Angew. Math. Mech. 14(5) 257-275",
"doi": "10.1002/zamm.19340140502"},
28:
{"autor": "Barua, S.N.",
"title": "On Secondary Flow in Stationary Curved Pipes",
"ref": "Quart. J. Mech. Appl. Math. 16(1) (1963) 61-77",
"doi": "10.1093/qjmam_16.1.61"},
29:
{"autor": "Pimenta, T.A., Campos, J.B.L.M.",
"title": "Friction losses of Newtonian and non-Newtonian fluids "
"flowing in laminar regime in a helical coil",
"ref": "Exp. Thermal Fluid Sci. 36 (2012) 194-204",
"doi": "10.1016/j.expthermflusci.2011.09.013"},
30:
{"autor": "Yanase, S., Goto, N., Yamamoto, K.",
"title": "Dual solutions of the flow through a curved tube",
"ref": "Fluid Dyn. Research 5 (1989) 191-201",
"doi": "10.1016/0169-5983(89)90021-x"},
31:
{"autor": "Dennis, S.C.R.",
"title": "Calculation of the steady flow through a curved tube "
"using a new finite-difference method",
"ref": "J. Fluid Mech. 99(3) (1980) 449-467",
"doi": "10.1017/S0022112080000705"},
32:
{"autor": "Van Dyke, M.",
"title": "Extended Stokes series: laminar flow through a loosely "
"coiled pipe",
"ref": "J. Fluid Mech. 86(1) 129-145",
"doi": "10.1017/S0022112078001032"},
33:
{"autor": "Collins, W.M., Dennis, S.C.R.",
"title": "The Steady Motion of a Viscous Fluid in a Curved Tube",
"ref": "Q. J. Mech. Appl. Math. 28(2) (1975) 133-156",
"doi": "10.1093/qjmam_28.2.133"},
34:
{"autor": "Dean, W.R.",
"title": "The stream-line motion of fluid in a curved pipe "
"(Second paper)",
"ref": "London Edinburgh Dublin Phil. Mag. J. Sci. Serie 7 5(30) "
"(1928) 673-695",
"doi": "10.1080/14786440408564513"},
35:
{"autor": "Abushammala, O., Hreiz, R., Lamaître, C., Favre, E.",
"title": "Laminar flow friction factor in highly curved helical "
"pipes: Numerical investigation, predictive correlation "
"and experimental validation using a 3D-printed model",
"ref": "Chem. Eng. Sci. 207(7) (2019) 1030-1039",
"doi": "10.1016/j.ces.2019.07.018"},
36:
{"autor": "Kalb, C.E., Seader, J.D.",
"title": "Heat and Mass Transfer Phenomena for Viscous Flow in "
"Curved Circular Tubes",
"ref": "Int. J. Heat Mass TRansfer 15() (1972) 801-817",
"doi": "10.1016/0017-9310(72)90122-6"},
37:
{"autor": "Dravid, A.N., Smith, K.A., Merrill, E.W., Brian, P.L.T.",
"title": "Effect of Secondary Fluid Motion on Laminar Flow Heat "
"Transfer in Helically Coiled Tubes",
"ref": "AIChE J. 17(5) (1971) 1114-1122",
"doi": "10.1002/aic.690170517"},
38:
{"autor": "Janssen, L.A.M., Hoogendoorn, C.J.",
"title": "Laminar Convective Heat Transfer in Helical Coiled Tubes",
"ref": "Int. J. Heat Mass Transfer 21(9) (1978) 1197-1206",
"doi": "10.1016/0017-9310(78)90138-2"},
39:
{"autor": "Manlapaz, R.L., Churchill, S.W.",
"title": "Fully Developed Laminar Convection From a Helical Coil",
"ref": "Chem. Eng. Commun. 9 (1981) 185-200",
"doi": "10.1080/00986448108911023"},
40:
{"autor": "Salimpour, M.R.",
"title": "Heat transfer coefficients of shell and coiled tube heat "
"exchangers",
"ref": "Exp. Thermal Fluid Sci. 33(2) (2009) 203-207",
"doi": "10.1016/j.expthermflusci.2008.07.015"},
41:
{"autor": "Pimenta, T.A., Campos, J.B.L.M.",
"title": "Heat transfer coefficients from Newtonian and non-Newtonian"
" fluids flowing in laminar regime in a helical coil",
"ref": "Int. J. Heat Mass Transfer 58 (2013) 676-690",
"doi": "10.1016/j.ijheatmasstransfer.2012.10.078"},
42:
{"autor": "Pawar, S.S., Sunnapwar, V.K.",
"title": "Studies on convective heat transfer through helical coils",
"ref": "Heat Mass Transfer 49(12) (2013) 1741-1754",
"doi": "10.1007/s00231-013-1210-3"},
43:
{"autor": "Hardik, B.K., Baburajan, P.K., Prabhu, S.V.",
"title": "Local heat transfer coefficient in helical coils with "
"single phase flow",
"ref": "Int. J. Heat Mass Transf. 89 (2015) 522-538",
"doi": "10.1016/j.ijheatmasstransfer.2015.05.069"},
44:
{"autor": "Rogers, G.F.C., Mayhew, Y.R.",
"title": "Heat Transfer and Pressure Loss in Helically Coiled Tubes "
"with Turbulent Flow",
"ref": "Int. J. Heat Mass Transfer 7(11) (1964) 1207-1216",
"doi": "10.1016/0017-9310(64)90062-6"},
45:
{"autor": "Pawar, S.S., Sunnapwar, V.K.",
"title": "Experimental studies on heat transfer to Newtonian and "
"non-Newtonian fluids in helical coils with laminar and "
"turbulent flow",
"ref": "Exp. Thermal Fluid Sci. 44 (2013) 792-804",
"doi": "10.1016/j.expthermflusci.2012.09.024"},
46:
{"autor": "Mori, Y., Nakayama, W.",
"title": "Study on Forced Convective Heat Transfer in Curved Pipes "
"(3rd Report, Theoretical Analysis under the Condition of "
"Uniform Wall Temperature and Practical Formulae)",
"ref": "Int. J. Heat Mass Transfer 10(5) (1967) 681-695",
"doi": "10.1016_0017-9310(67)90113-5"},
47:
{"autor": "Shchukin, V.K.",
"title": "Correlation of Experimental Data on Heat Transfer in "
"Curved Pipes",
"ref": "Teploenergetika 16(2) (1969) 72-76",
"doi": ""},
48:
{"autor": "Guo, L., Chen, X., Feng, Z., Bai, B.",
"title": "Transie:nt convective heat transfer in a helical coiled "
"tube with pulsatile fully developed turbulent flow",
"ref": "Int. J. Heat Mass Transfer 41() (1998) 2867-2875",
"doi": "10.1016/s0017-9310(98)80003-3"},
49:
{"autor": "Ghobadi, M., Muzychka, Y.S.",
"title": "A Review of Heat Transfer and Pressure Drop Correlations "
"for Laminar Flow in Curved Circular Ducts",
"ref": "Heat Transfer Eng. 37(10) (2016) 815-839",
"doi": "10.1080/01457632.2015.1089735"},
50:
{"autor": "Jayakumar, J.S., Mahajani, S.M., Mandal, J.C., Vijayan, "
"P.K., Bhoi, R.",
"title": "Experimental and CFD estimation of heat transfer in "
"helically coiled heat exchangers",
"ref": "Chem. Eng. Res. Design 86(3) (2008) 221-232",
"doi": "10.1016/j.cherd.2007.10.021"},
51:
{"autor": "Yildiz, C., Biçer, Y., Pehlivan, D.",
"title": "Heat Transfer and Pressure Drop in a Heat Exchanger with "
"a Helical Pipe Containing Inside Springs",
"ref": "Energy Convers. Management 38(6) (1997) 619-624",
"doi": "10.1016/S0196-8904(96)00040-4"},
52:
{"autor": "Wu, Z., Li, K., Zhang, K., Tian, W.",
"title": "Single-phase flow heat transfer characteristics in helical "
"coils with large coil diameters",
"ref": "Appl. Thermal Eng. 266 (2025) 125776",
"doi": "10.1016/j.applthermaleng.2025.125776"},
53:
{"autor": "Acharya, N., Sen, M., Chang, H.-C.",
"title": "Analysis of heat transfer enhancement in coiled-tube heat "
"exchangers",
"ref": "Int. J. Heat Mass Transfer 44(17) (2001) 3189-3199",
"doi": "10.1016/S0017-9310(01)00002-3"},
54:
{"autor": "Akiyama, M., Chen g, K.C.",
"title": "Boundary Vorticity Method for Lamniar Forced Convection "
"Heat Transfer in Curved Pipes",
"ref": "Int. J. Heat Mass Transfer 14(10) (1971) 1659-1675",
"doi": "10.1016/0017-9310(71)90075-5"},
55:
{"autor": "Moawed, M.",
"title": "Experimental study of forced convection from helical "
"coiled tubes with different parameters",
"ref": "Energy Conv. Management 52(2) (2011) 1150-1156",
"doi": "10.1016/j.enconman.2010.09.009"},
56:
{"autor": "Rainieri, S., Bozzoli, F., Cattani, L., Pagliarini, G.",
"title": "Compound convective heat transfer enhancement in helically "
"coiled wall corrugated tubes",
"ref": "Int. J. Heat Mass Transfer 59 (2013) 353-362",
"doi": "10.1016/j.ijheatmasstransfer.2012.12.037"},
57:
{"autor": "Jha, R.K., Raja Rao, M.",
"title": "Heat Transfer Through Coiled Tubes in Agitated Vessels",
"ref": "Int. J. Heat Mass Transfer 10(3) (1967) 395-397",
"doi": "10.1016/0017-9310(67)90155-x "},
58:
{"autor": "Gupta, R., Wanchoo, R.K., Jafar Ali, T.R.M.",
"title": "Laminar Flow in Helical Coils: A Parametric Study",
"ref": "Ind. Eng. Chem. Res. 50(2) (2011) 1150-1157",
"doi": "10.1021/ie101752z"},
59:
{"autor": "Hasson, D.",
"title": "Streamline flow resistance in coils",
"ref": "Res. Corresp. 1 S1 (1955).",
"doi": ""},
60:
{"autor": "Zhao, H., Li, X., Wu, X.",
"title": "New friction factor equations developed for turbulent "
"flow in rough helical tubes",
"ref": "Int. J. Heat Mass Transfer 95 (2016) 525-534",
"doi": "10.1016/j.ijheatmasstransfer.2015.12.035"},
61:
{"autor": "Das, S.K.",
"title": "Water Flow Through Helical Coils in Turbulent Condition",
"ref": "Can. J. Chem. Eng. 71 (1993) 971-973",
"doi": "10.1002/cjce.5450710620"},
62:
{"autor": "Kalb, C.E., Seader, J.D.",
"title": "Fully Developed Viscous-Flow Heat Transfer in Curved "
"Circular Tubes with Uniform Wall Temperature",
"ref": "AIChE J. 20(2) (1974) 340-346",
"doi": "10.1002/aic.690200220"},
63:
{"autor": "Naphon, P., Wongwises, S.",
"title": "An Experimental Study on the In-Tube Convective Heat "
"Transfer Coefficients in a Spiral Coil Heat Exchanger",
"ref": "Int. Comm. Heat Mass Transfer 29(6) (2002) 797-809",
"doi": "10.1016/s0735-1933(02)00370-6"},
64:
{"autor": "Zheng, X., Lu, X., Gao, Y., Jin, D., Hu, Y., Hu, Y., Mao, Y.",
"title": "Experimental study on friction pressure drop and "
"circumferential heat transfer characteristics in helical "
"tubes",
"ref": "Front. Energy Res. 11 (2023) 1204850.",
"doi": "10.3389/fenrg.2023.1204850"},
65:
{"autor": "Zhao, H., Li, X., Wu, Y., Wu, X.",
"title": "Friction factor and Nusselt number correlations for forced"
"convection in helical tubes",
"ref": "Int. J. Heat Mass Transfer 155 (2020) 119759",
"doi": "10.1016/j.ijheatmasstransfer.2020.119759"},
66:
{"autor": "Jeschke, H.",
"title": "Wärmeübergang und Druckverlust in Rohrschlangen",
"ref": "VDI Z. 69 (1925) 24-28",
"doi": ""},
67:
{"autor": "Ayuob, S., Mahmood, M., Ahmad, N., Waqas, A., Saeed, H., "
"Sajid, M.B.",
"title": "Development and validation of Nusselt number correlations "
"for a helical coil based energy storage integrated with "
"solar water heating system",
"ref": "J. Energy Storage 55 (2022) 105777",
"doi": "10.1016/j.est.2022.105777"},
68:
{"autor": "Berg, R.R., Bonilla, C.F.",
"title": "Heating of fluids in coils",
"ref": "NY Academic Sciences 13 (1950) 12-18",
"doi": "10.1111_j.2164-0947.1950.tb00976.x "},
69:
{"autor": "Rao, M.V.R., Sadasividu, D.",
"title": "Pressure drop studies in helical coils",
"ref": "Indian J. Tech. 12 (1974) 473-474",
"doi": ""}}
# TODO: Add two phase correlation
# For this is necessary add a stream as input parameter to get the necessary
# properties for its calculation
# Critical Reynolds number correlations
[docs]
@refDoc(__doi__, [3])
def Rec_Schmidt(di, Dc):
r"""Calculates critical Reynolds to define transition between laminar and
turbulent flow using using the correlation of Schmidt (1967)
.. math::
Re_c = 2300 \left(1+8.6\left(\frac{di}{Dc}\right)^{0.45}\right)
Parameters
----------
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Rec : float
Critical reynolds number, [-]
"""
# Eq 14
Rec = 2300*(1+8.6*(di/Dc)**0.45)
return Rec
[docs]
@refDoc(__doi__, [4])
def Rec_Ito(di, Dc):
r"""Calculates critical Reynolds to define transition between laminar and
turbulent flow using using the correlation of Ito (1959)
.. math::
Re_c = 2x10^4 \left(\frac{di}{Dc}\right)^{0.32}
Parameters
----------
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Rec : float
Critical reynolds number, [-]
"""
# Eq 11
Rec = 2e4*(di/Dc)**0.32
return Rec
[docs]
@refDoc(__doi__, [5])
def Rec_Kubair(di, Dc):
r"""Calculates critical Reynolds to define transition between laminar and
turbulent flow using using the correlation of Kubair-Kuloor (1966)
.. math::
Re_c = 1.273x10^4 \left(\frac{di}{Dc}\right)^{0.2}
Parameters
----------
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Rec : float
Critical reynolds number, [-]
"""
Rec = 1.273e4*(di/Dc)**0.2
return Rec
[docs]
@refDoc(__doi__, [6, 1, 2])
def Rec_Srinivasan(di, Dc):
r"""Calculates critical Reynolds to define transition between laminar and
turbulent flow using using the correlation of Srinivasan (1968) as shown in
[1]_. Recomended method by [2]_.
.. math::
Re_c = 2100 \left(1 + 12\sqrt{\frac{d_i}{D_c}}\right)
Parameters
----------
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Rec : float
Critical reynolds number, [-]
"""
Rec = 2100 * (1 + 12*(di/Dc)**0.5)
return Rec
[docs]
@refDoc(__doi__, [7])
def Rec_Kutateladze(di, Dc):
r"""Calculates critical Reynolds to define transition between laminar and
turbulent flow using using the correlation of Kutateladze (1966).
.. math::
Re_c = 2300 + 10500 \left(\frac{d_i}{D_c}\right)^{0.3}
Parameters
----------
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Rec : float
Critical reynolds number, [-]
"""
# Eq 7.26
Rec = 2300 + 10500*(di/Dc)**0.3
return Rec
[docs]
@refDoc(__doi__, [20])
def Rec_SethStahel(di, Dc):
r"""Calculates critical Reynolds to define transition between laminar and
turbulent flow using using the correlation of Seth-Stahel (1969).
.. math::
Re_c = 1900 \left(1 + 8 \sqrt{\frac{d_i}{D_c}}\right)
Parameters
----------
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Rec : float
Critical reynolds number, [-]
"""
# Eq 32
Rec = 1900 * (1 + 8*(di/Dc)**0.5)
return Rec
[docs]
@refDoc(__doi__, [26])
def Rec_Cioncolini(di, Dc):
r"""Calculates critical Reynolds to define transition between laminar and
turbulent flow using using the correlation of Cioncolini-Santini (2006).
.. math::
Re_c = 30,000 \left(\frac{d_i}{D_c}\right)^{0.47}
Parameters
----------
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Rec : float
Critical reynolds number, [-]
"""
# Eq 13
Rec = 30000 * (di/Dc)**0.47
return Rec
# Friction factor correlations
[docs]
@refDoc(__doi__, [3])
def f_Schmidt(Re, di, Dc):
"""Calculate friction factor for internal flow of a helical coil using
the correlation of Schmidt (1967)
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
"""
Rec = Rec_Schmidt(di, Dc)
if Re < Rec:
# Laminar flow, Eq 15
f = 16/Re * (1+0.14*(di/Dc)**0.97*Re**(1-0.644*(di/Dc)**0.312))
elif Re < 2.2e4:
# Eq 16
f = 0.3164/Re**0.25 * (1+2.88e4/Re*(di/Dc)**0.62)
else:
# Eq 17
f = 0.3164/Re**0.25 * (1+0.0823*(1+di/Dc)*(di/Dc)**0.53*Re**0.25)
return f
[docs]
@refDoc(__doi__, [9, 10])
def f_MoriNakayama(Re, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of Mori-Nakayama (1965).
.. math::
\frac{f_c}{f_s}=\left(\frac{0.108De^{0.5}}{1-3.253 De^{-0.5}}\right)
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
"""
Rec = Rec_Ito(di, Dc)
# Limit between both turbulent phases, Eq. 43
Re_ = 6.5e5 * (di/Dc)**0.5
if Re < Rec:
# Laminar flow
De = Dean(Re, di, Dc)
fd = f_friccion(Re)
fI = 0.108*De**0.5 # Eq 1.33
fII = fI / (1-3.253/De**0.5) # Eq 1.34
f = fII * fd
elif Re < Re_:
# Low turbulent region, # Eq 40 from [10]_
f = 0.3/(Re*(di/Dc)**2)**0.2*(1+0.112/(Re*(di/Dc)**2)**0.2)/(di/Dc)**0.5
else:
# Hith turbulent region, # Eq 41 from [10]_
f = 0.192/(Re*(di/Dc)**2.5)**(1/6) * \
(1+0.068/(Re*(di/Dc)**2.5)**(1/6)) / (di/Dc)**0.5
return f
[docs]
@refDoc(__doi__, [12])
def f_Ju(Re, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil using
the method of Ju et al. (2001).
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
"""
Rec = Rec_Srinivasan(di, Dc)
De = Dean(Re, di, Dc)
fd = f_friccion(Re)
if De < 11.6:
# Laminar flow, Eq 12, straight tube correlation
f = fd
elif Re < Rec:
# Laminar with big vortex, Eq. 13
f = fd * (1 + 0.015*Re**0.75*(di/Dc)**0.4)
else:
# Turbulent flow, Eq 14
f = fd * (1 + 0.011*Re**0.23*(di/Dc)**0.14)
return f
[docs]
@refDoc(__doi__, [13])
def f_MishraGupta(Re, di, Dc, p):
r"""Calculates friction factor for internal flow of a helical coil using
the method of Mishra-Gupta (1979).
.. math::
\frac{f_c}{f_s} = 1 - \left(1-\left(\frac{11.6}{De}\right)^{0.45}
\right)^{\frac{1}{0.45}}
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
p : float
Pitch for twist of 2π radians (360º), [m]
Returns
-------
f : float
Friction factor, [-]
"""
Rec = Rec_Ito(di, Dc)
fd = f_friccion(Re)
if Re < Rec:
# Laminar flow, Eq 5.
He = Helical(Re, di, Dc, p)
f = fd * (1 + 0.033*log10(He)**4)
else:
# Turbulent flow, Eq 10.
f = fd + 0.03*(di/Dc)**0.5
return f
[docs]
@refDoc(__doi__, [18])
def f_Prasad(Re, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil using
the method of Prasad et al. (1989).
For laminar flow use a modified Write correlation:
.. math::
\frac{f}{f_s} = \frac{1}{1-\left(1-\left(\frac{B}{De}\right)^{0.45}
\right)^{\frac{1}{0.45}}}
For turbulent flow use a modified Ito correlation:
.. math::
\frac{f}{f_s} = 1 +
0.18\left(Re \left(\frac{d_i}{D_c}\right)^2\right)^{0.25}
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
"""
Rec = Rec_Ito(di, Dc)
fd = f_friccion(Re)
if Re < Rec:
# Laminar flow
De = Dean(Re, di, Dc)
if De < 500:
B = 11.6
else:
B = 6
f = fd / (1-(1-(B/De)**0.45)**(1/0.45))
else:
# Turbulent flow
f = fd * (1+0.18*(Re*(di/Dc)**2)**0.25)
return f
[docs]
@refDoc(__doi__, [21])
def f_Ali(Re, di, Dc, p):
r"""Calculates friction factor for internal flow of a helical coil using
the method of Ali (2001).
Define four flow regime fitted with the correlation:
.. math::
f = Eu\frac{d}{L}=\alpha\left(\frac{d_i}{D_{eq}}\right)^{0.15}Re^{\beta}
with the equivalent diameter of coil:
.. math::
D_{eq} = \sqrt{\frac{p^2+\left(\pi D\right)^2}{pi}}
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
p : float
Pitch for twist of 2π radians (360º), [m]
Returns
-------
f : float
Friction factor, [-]
"""
# Equivalent diameter of coil
Deq = ((p**2 + (pi*Dc)**2)/pi)**0.5
if Re < 500:
# Low Laminar flow, Eq 15
f = 21.88 * (di/Deq)**0.15 / Re**0.9
elif Re < 6300:
# Laminar flow, Eq 16
f = 5.25 * (di/Deq)**0.15 / Re**(2/3)
elif Re < 10000:
# Mixed flow, Eq 17
f = 0.56 * (di/Deq)**0.15 / Re**(2/5)
else:
# Turbulent flow, Eq 18
f = 0.09 * (di/Deq)**0.15 / Re**(1/5)
return f
[docs]
@refDoc(__doi__, [1])
def f_ElGenkSchriener(Re, di, Dc, p):
r"""Calculates friction factor for internal flow of a helical coil using
the method of ElGenk-Schriener (2017).
.. math::
\frac{f_c}{f_s} = 1 + 0.00325 De_m
where modified Dean number is defined as:
.. math::
De_m = De^{0.86} \delta^{0.09} \left(\frac{d_i}{D_c}\right)^{-0.38}
δ is the curvature defined as:
.. math::
\delta = \frac{d_i/D_c}{1+4\pi^2 \tan^2 \alpha}
α is the helix angle:
.. math::
\alpha = \tan^{-1}{\frac{p}{\pi D}}
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
p : float
Pitch for twist of 2π radians (360º), [m]
Returns
-------
f : float
Friction factor, [-]
"""
# Helix angle
alpha = atan(p/pi/Dc)
# Curvature
delta = (di/Dc)/(1+4*pi**2*tan(alpha)**2)
De = Dean(Re, di, Dc)
fd = f_friccion(Re)
# Modified Dean number
Dem = De**0.86 * delta**0.09 / (di/Dc)**0.38
# Eq 50
f = fd * (1+0.00325*Dem)
return f
[docs]
@refDoc(__doi__, [6, 49])
def f_Srinivasan(Re, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil using
the method of Srinivasan (1968) as explain in [49]_.
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
"""
De = Dean(Re, di, Dc)
fd = f_friccion(Re)
if De < 30:
f = fd
elif De < 300:
f = fd * 0.419 * De**0.275
else:
f = fd * 0.1125 * De**0.5
return f
[docs]
@refDoc(__doi__, [23, 4])
def f_Ito(Re, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil using
the method of Ito (1969).
For laminar flow:
.. math::
\frac{f_c}{f_s} = 0.1033 De^{0.5} \left(\left(1+\frac{1.729}{De}\right)
^{0.5} - \frac{1.315}{De^{0.5}}\right)^{-3}
For turbulent flow:
.. math::
f_c = 4 \left(0.029 sqrt{\frac{d_i}{D_c}} + 0.304 Re^{-0.25}\right)
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
"""
Rec = Rec_Ito(di, Dc)
if Re < Rec:
# Laminar flow, Eq 57 from [23]_
De = Dean(Re, di, Dc)
fd = f_friccion(Re)
f = fd * 0.1033 * De**0.5 / ((1+1.729/De)**0.5 - 1.315/De**0.5)**3
else:
# Turbulent flow, Eq 2 from [4]_
f = 0.029*(di/Dc)**0.5 + 0.304/Re**0.25
return f
[docs]
@refDoc(__doi__, [69, 21])
def f_RaoSadasivudu(Re, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil using
the method of Rao-Sadasivudu (1974) as show in Ali [21]_.
Several correlation for different Reynolds number range
.. math::
f_c = 1.55 \exp{14.12 \frac{d_i}{D_c}} Re^{-1}, Re < 1200
.. math::
f_c = 1.55 \exp{14.12 \frac{d_i}{D_c}} Re^{-0.64}, 1200 < Re < Re_c
.. math::
f_c = 0.0382 \exp{11.17 \frac{d_i}{D_c}} Re^{-0.2}, Re_c < Re < 27000
.. math::
f_c = 0.01065 \frac{d_i^{0.94}}{D_c^{0.1}} Re^{-0.2}, Re > 27000
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
"""
Rec = Rec_Ito(di, Dc)
if Re < 1200:
f = 1.55 * exp(14.12*di/Dc) / Re
elif Re < Rec:
f = 1.55 * exp(14.12*di/Dc) / Re**0.64
elif Re < 27000:
f = 0.0382 * exp(11.17*di/Dc) / Re**0.2
else:
# Turbulent flow
f = 0.01065 * di**0.94 / Dc**0.1 / Re**0.2
return 4*f
[docs]
@refDoc(__doi__, [8])
def f_laminar_White(Re, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of White (1929).
.. math::
\frac{f_c}{f_s} = 1 - \left(1-\left(\frac{11.6}{De}\right)^{0.45}
\right)^{\frac{1}{0.45}}
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
"""
De = Dean(Re, di, Dc)
fd = f_friccion(Re)
if De > 11.6:
C = 1 - (1 - (11.6/De)**0.45)**(1/0.45)
else:
C = 1
return fd/C
[docs]
@refDoc(__doi__, [11, 2])
def f_laminar_Hart(Re, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of Hart (1988).
.. math::
\frac{f_c}{f_s} = 1 + 0.09 \frac{De^{1.5}}{70+De}
Recomended method in [2]_ for friction factor in laminar flow.
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
"""
De = Dean(Re, di, Dc)
fd = f_friccion(Re)
f = 1 + 0.09 * De**1.5 / (70+De)
return f * fd
[docs]
@refDoc(__doi__, [17])
def f_laminar_ManlapazChurchill(Re, di, Dc, p):
r"""Calculates friction factor in laminar regimen for internal flow of a
helical coil using the method of Manlapaz-Churchill (1980).
.. math::
\frac{f_c}{f_{s,L}} = \left[\left(1 -
\frac{0.18}{\left(1+\left(\frac{35}{De}\right)^2\right)^{1/2}}\right)^m
+ \left(1+\frac{d_i}{3 D_c}\right)^2 \frac{De}{88.33}\right]^{1/2}
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
p : float
Pitch for twist of 2π radians (360º), [m]
Returns
-------
f : float
Friction factor, [-]
"""
fd = f_friccion(Re)
De = Dean(Re, di, Dc)
if De <= 20:
m = 2
elif De <= 40:
m = 1
else:
m = 0
if p:
# Eq 25
X = De*(1/(1+(p/Dc/2/pi)**2))**0.5
else:
X = De
# Eq 29
f = fd * ((1-0.18/(1+(35/X)**2)**0.5)**m + (1+di/Dc/3)**2*X/88.33)**0.5
return f
[docs]
@refDoc(__doi__, [19])
def f_laminar_LiuMasliyah(Re, di, Dc, p):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of Liu-Masliyah (1993).
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
p : float
Pitch for twist of 2π radians (360º), [m]
Returns
-------
f : float
Friction factor, [-]
"""
Rc = Dc/di
De = Dean(Re, di, Dc)
# Curvature ratio, Eq 10
l = Rc/(Rc**2+(p/2/pi)**2)
# Torsion, Eq 11
nu = (p/2/pi)/(Rc**2+(p/2/pi)**2)
# Eq 43
f = (16 + (0.378*De*l**0.25 + 12.1)*De**0.5*l**0.5*nu**2) / Re * \
(1+((0.0908+0.0233*l**0.5)*De**0.5-0.132*l**0.5+0.37*l-0.2)/(1+49/De))
return f
[docs]
@refDoc(__doi__, [24])
def f_laminar_TarbellSamuels(Re, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of Tarbell-Samuels (1973).
.. math::
\frac{f_c}{f_s} = 1 + \left(
8.279e^{-4} + \frac{7.964e{-3}}{d_i/D_c}\right) Re - 2.096e-7 Re^2
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
"""
fd = f_friccion(Re)
# Eq 27
f = fd * (1 + (8.279e-4 + 7.964e-3/(Dc/di))*Re - 2.096e-7*Re**2)
return f
[docs]
@refDoc(__doi__, [27])
def f_laminar_Adler(Re, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of Adler (1934).
.. math::
\frac{f_c}{f_s} = 0.1064 \sqrt{De}
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
"""
De = Dean(Re, di, Dc)
fd = f_friccion(Re)
# Eq 29
f = fd * 0.1064*De**0.5
return f
[docs]
@refDoc(__doi__, [28])
def f_laminar_Barua(Re, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of Barua (1963).
.. math::
\frac{f_c}{f_s} = 0.509 + 0.0918 \sqrt{De}
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
"""
De = Dean(Re, di, Dc)
fd = f_friccion(Re)
# Eq 29
f = fd * (0.509 + 0.0918*De**0.5)
return f
[docs]
@refDoc(__doi__, [29])
def f_laminar_PimentaCampos(Re, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of Pimenta-Campos (2012)
.. math::
\frac{f_c}{f_s} = 1 + \frac{0.028 De^{1.68}}{70+De}
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
"""
De = Dean(Re, di, Dc)
fd = f_friccion(Re)
# Eq 10
f = fd * (1 + 0.028*De**1.68/(70+De))
return f
[docs]
@refDoc(__doi__, [30])
def f_laminar_Yanase(Re, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of Yanase et al. (1989)
.. math::
\frac{f_c}{f_s} = 0.557 + 0.0938 \sqrt{De}
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
"""
De = Dean(Re, di, Dc)
fd = f_friccion(Re)
# Eq 18
f = fd * (0.557 + 0.0938*De**0.5)
return f
[docs]
@refDoc(__doi__, [31])
def f_laminar_Dennis(Re, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of Dennis (1980)
.. math::
\frac{f_c}{f_s} = 0.388 + 0.1015 \sqrt{De}
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
"""
De = Dean(Re, di, Dc)
fd = f_friccion(Re)
# Eq 18
f = fd * (0.388 + 0.1015*De**0.5)
return f
[docs]
@refDoc(__doi__, [32])
def f_laminar_vanDyke(Re, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of Van Dyke (1978)
.. math::
\frac{f_c}{f_s} = 0.47136 De^{0.25}
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
"""
De = Dean(Re, di, Dc)
fd = f_friccion(Re)
# Eq 7.6
f = fd * 0.47136 * De**0.25
return f
[docs]
@refDoc(__doi__, [33])
def f_laminar_CollinsDennis(Re, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of Collins-Dennis (1975)
.. math::
\frac{f_c}{f_s} = 0.38036 + 0.1028 \sqrt{De}
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
"""
De = Dean(Re, di, Dc)
fd = f_friccion(Re)
# Eq 34
f = fd * (0.38036 + 0.1028*De**0.5)
return f
[docs]
@refDoc(__doi__, [34])
def f_laminar_Dean(Re, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of Dean (1928)
.. math::
\frac{f_c}{f_s} = 0.38036 + 0.1028 \sqrt{De}
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
Notes
-----
Correlation only valid for De < 20
"""
De = Dean(Re, di, Dc)
if De > 20:
raise ValueError("Input out of range")
fd = f_friccion(Re)
# Eq 29
# The K parameter in original paper really is 2*De²
f = fd * (1 - 0.03058*(De**2/288)**2 + 0.01195*(De**2/288)**4)
return f
[docs]
@refDoc(__doi__, [35])
def f_laminar_Abushammala(Re, di, Dc, p):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of Abushammala et al. (2019)
.. math::
f_c = f_s + A B e^{-C}
with:
.. math::
A = p_1 D \left(\frac{D}{Re}\right)^{p_2}
.. math::
B = \left(\frac{D_c}{2 d_i} + \frac{2 d_i}{D_c}\right)^{p_3}
.. math::
C = p_4 D \frac{p}{d_i} \left(\frac{D_c}{2 d_i}\right)^{-p_5}
.. math::
D = \left(\left(\frac{D_c}{2 d_i}\right)^{-p6} \left(1 + \left(
\frac{p/d_i}{2 \pi D_c/2/d_i}\right)^2\right)\right)^{-p_7}
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
p : float
Pitch for twist of 2π radians (360º), [m]
Returns
-------
f : float
Friction factor, [-]
Notes
-----
Correlation only valid for De < 20
"""
Rh = Dc/2/di
ph = p/di
fd = f_friccion(Re)
# Table 3, parameters
if Re < 400:
p = (1.98, 4.07e-1, 8.49e-1, 8.71e-2, 8.91e-1, 2.31, 3.67e-1)
else:
p = (2.88, 3.82e-1, 9.16e-3, 2.48e-3, 2.62, 1.1, 3.23e-1)
# Eq 7
D = (Rh**-p[5]*(1+(ph/2/pi/Rh)**2))**-p[6]
C = p[3]*D*ph*Rh**-p[4]
B = (Rh+1/Rh)**p[2]
A = p[0]*D*(D/Re)**p[1]
f = fd + A*B*exp(-C)/4
return f
[docs]
@refDoc(__doi__, [58])
def f_laminar_Gupta(Re, di, Dc, p):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of Gupta et al. (2011)
.. math::
f_c = f_s \left(1 + a Gn^b\right)
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
p : float
Pitch for twist of 2π radians (360º), [m]
Returns
-------
f : float
Friction factor, [-]
"""
Gn = Germano(Re, di, Dc, p)
fd = f_friccion(Re)
if Gn <= 70:
f = fd * (1 + 0.903 * Gn**0.227)
else:
f = fd * (1 + 0.525 * Gn**0.516)
return f
[docs]
@refDoc(__doi__, [59, 21])
def f_laminar_Hasson(Re, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of Hasson (1955) as shown in [21]_.
.. math::
\frac{f_c}{f_s} = 0.556 + 0.0969 \sqrt{De}
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
"""
De = Dean(Re, di, Dc)
fd = f_friccion(Re)
f = fd * (0.556 + 0.0969*De**0.5)
return f
[docs]
@refDoc(__doi__, [14])
def f_turbulent_Czop(Re, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil in
turbulent flow using the method of Czop (1994).
.. math::
f_c = \frac{0.096}{De^{-0.1517}}
The paper give this correlation for single phase flow. Give too
correlations for two phase flow.
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
"""
De = Dean(Re, di, Dc)
# Eq 9
f = 0.096 / De**0.1517
return f
[docs]
@refDoc(__doi__, [22])
def f_turbulent_Guo(Re, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil in
turbulent flow using the method of Guo et al. (2001).
.. math::
f_c = 2.552 Re^{-0.15} \left(\frac{d_i}{D_c}\right)^{0.51}
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
"""
# Eq 20
# Convert fanning friction factor
f = 2.552/4 / Re**0.15 * (di/Dc)**0.51
return f
[docs]
@refDoc(__doi__, [25])
def f_turbulent_MandalNigam(Re, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil in
turbulent flow using the method of Mandal-Nigam (2009).
.. math::
\frac{f_c}{f_s} = 1 + 0.03{De}^{0.27}
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
f : float
Friction factor, [-]
"""
De = Dean(Re, di, Dc)
fd = f_friccion(Re)
# Eq 11
f = fd * (1 + 0.03*De**0.27)
return f
[docs]
@refDoc(__doi__, [60])
def f_turbulent_Zhao(Re, do, Dc, eD):
r"""Calculates friction factor for internal flow of a helical coil in
turbulent flow using the method of Zhao et al. (2016).
.. math::
\frac{1}{f_c^{0.5}} = 0.923 \ln \left(\frac{0.104\epsilon}{f_c}
\left(\frac{d_o}{D_c}\right)^{0.5} + \frac{1.142}{f_c^{1.5}Re}
\left(\frac{d_o}{D_c}\right)^{0.5}\right)
Parameters
----------
Re : float
Reynolds number, [-]
do : float
External diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
eD : float
Relative roughness, [-]
Returns
-------
f : float
Friction factor, [-]
"""
# Implicit equation so need iteration
def fc(f):
# Eq 50
return 1/f**0.5 - 0.923*log(
0.104*eD/f*(do/Dc)**0.5 + 1.142/f**1.5/Re*(do/Dc)**0.5)
fo = f_Schmidt(Re, do, Dc)
f = fsolve(fc, fo)[0]
return f
[docs]
@refDoc(__doi__, [61])
def f_turbulent_Das(Re, di, Dc, p, eD):
r"""Calculates friction factor for internal flow of a helical coil in
turbulent flow using the method of Das (1993).
.. math::
f_c - f_{cs} = 17.5782 Re^{-0.3137} \left(\frac{d_i}{D_c}\right)
^{0.3621} \left(\frac{\epsilon}{D_c}\right)^{0.6885}
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Internal diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
p : float
Pitch for twist of 2π radians (360º), [m]
eD : float
Relative roughness, [-]
Returns
-------
f : float
Friction factor, [-]
"""
fcs = f_MishraGupta(Re, di, Dc, p)
# Eq 6
f = fcs + 4*17.5782 * Re**-0.3137 * (di/Dc)**0.3621 * eD**0.6885
return f
[docs]
@refDoc(__doi__, [64])
def f_turbulent_Zheng(Re, di, Dc, p):
r"""Calculates friction factor for internal flow of a helical coil in
turbulent flow using the method of Zheng et al. (2023).
.. math::
f_c = \frac{0.0791}{Re^{0.25} + \frac{81858}{Re^{1.54}}
\left(\frac{d_i}{D_{cm}}\right)^{0.48}
D_cm is defined as:
.. math::
D_{cm} = D_c \left(1+\tan{\alpha}\right)
α is the helix angle:
.. math::
\alpha = \tan^{-1}{\frac{p}{\pi D_c}}
Parameters
----------
Re : float
Reynolds number, [-]
di : float
Internal diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
p : float
Pitch for twist of 2π radians (360º), [m]
Returns
-------
f : float
Friction factor, [-]
"""
# Helix angle
alpha = atan(p/pi/Dc)
Dcm = Dc * (1+tan(alpha))
# Eq 14
f = 0.0791/Re**0.25 + 81858/Re**1.54 * (di/Dcm)**0.48
return f
# Heat Transfer coefficient correlations
[docs]
@refDoc(__doi__, [3])
def Nu_Schmidt(Re, Pr, di, Dc):
r"""Calculates Nusselt number for internal flow of a helical coil using the
correlation of Schmidt (1967)
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
Rec = Rec_Schmidt(di, Dc)
if Re < Rec:
# Laminar flow, Eq 18
Nu = 3.65 + Pr**(1/3) * 0.08*(1+0.8*(di/Dc)**0.9) \
* Re**(0.5+0.2903*(di/Dc)**0.194)
elif Re < 2.2e4:
# Eq 21
Nu = 0.023 * Pr**(1/3) * (1+14.8*(1+di/Dc)*(di/Dc)**(1/3)) \
* Re**(0.8-0.22*(di/Dc)**0.1)
else:
# Eq 22
Nu = 0.023 * (1+3.6*(1-di/Dc)*(di/Dc)**0.8) * Re**0.8 * Pr**(1/3)
return Nu
[docs]
@refDoc(__doi__, [9, 10, 46])
def Nu_MoriNakayama(Re, Pr, di, Dc, simple=False):
r"""Calculates Nusselt number for internal flow of a helical coil in
laminar flow using the method of Mori-Nakayama (1965).
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
Rec = Rec_Ito(di, Dc)
if Re < Rec:
# Laminar flow
De = Dean(Re, di, Dc)
if Pr >= 1:
# Eq 2.15
Z = 2/11*(1+(1+77/4/Pr**2)**0.5)
else:
# Eq 2.18
Z = (2+(10/Pr**2-1)**0.5)/5
if simple:
# Simplified formulae from [46]_
# Eq 55
Nu = 0.864/Z * De**0.5 * (1+2.35/De**0.5)
else:
# Eq 2.23
NuI = 0.1979*De**0.5/Z
if Pr >= 1:
# Eq 2.24
f = 1 + 37.05/Z * (1/40 - 17/120*Z + (1/10/Z+13/30)/10/Pr)*De**-0.5
else:
# Eq 2.25
f = 1 - 37.05/Z * (Z**2/12 + 1/24 - 1/120/Z
- (4/3*Z - 1/3/Z + 1/15/Z**2)/20/Pr)*De**-0.5
Nu = 48/11 * NuI/f
else:
# Turbulent flow
if Pr < 10:
# Eq 91 in [10]_, for gases
Nu = Pr/(26.2*(Pr**(2/3)-0.074)) * Re**0.8 * (di/Dc)**0.1 * \
(1+0.098/(Re*(di/Dc)**2)**0.2)
else:
# Eq 94 in [10], for liquids
Nu = Re**(5/6)/41*(di/Dc)**(1/12)*(1+0.061/(Re*(di/Dc)**2.5)**(1/6))
return Nu
[docs]
@refDoc(__doi__, [15])
def Nu_XinEbadian(Re, Pr, di, Dc):
r"""Calculates Nusselt number for internal flow of a helical coil using the
correlation of Xin-Ebadian (1997)
For laminar flow:
.. math::
Nu = \left(2.153 + 0.318 \left(Re \frac{d_i}{D_c}\right)^{0.643}\right)
Pr^{0.177}
For turbulent flow:
.. math::
Nu = 0.00619 Re^{0.92} Pr^{0.4} \left(1 + 3.455 \frac{d_i}{D_c}\right)
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
# Laminar flow
if Re < 5000:
De = Re*(di/Dc)**0.5
# Eq 5
Nu = (2.153+0.318*De**0.643) * Pr**0.177
else:
# Eq 6
Nu = 0.00619 * Re**0.92 * Pr**0.4 * (1+3.455*di/Dc)
return Nu
[docs]
@refDoc(__doi__, [16])
def Nu_SebanMcLaughlin(Re, Pr, di, Dc):
r"""Calculates Nusselt number for internal flow of a helical coil using the
correlation of Seban-McLaughlin (1963)
For laminar flow:
.. math::
Nu = 1.04 \left(\frac{Re}{1-\left(1-\left(1-\frac{11.6}{De}\right)
^{0.45}\right)^{1/0.45}}\right)^{1/3} Pr^{1/3}
For turbulent flow:
.. math::
Nu = 0.023 Re^{0.85} Pr^{0.4} \left(\frac{d_i}{D_c}\right)^{0.1}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
Rec = Rec_Ito(di, Dc)
if Re < Rec:
# Laminar flow
# Use Whie correlation for friction factor
f = f_laminar_White(Re, di, Dc)
# Eq 3
Nu = 0.13*(f/8*Re**2)**(1/3)*Pr**(1/3)
else:
# Use friction factor for a straight tube given in paper
fs = 0.023 / Re**0.2
# Eq 4, Friction factor
f = fs * (Re*(di/Dc)**2)**0.05
# Eq 6
Nu = f * Re * Pr**0.4
return Nu
[docs]
@refDoc(__doi__, [18])
def Nu_Prasad(Re, Pr, di, Dc):
r"""Calculates nusselt number for internal flow of a helical coil using
the method of Prasad et al. (1989).
For laminar flow:
.. math::
Nu = 0.25 \left(\frac{f}{8} Re^2\right)^{1/3} Pr^{1/3}
For turbulent flow:
.. math::
Nu = \frac{f}{8} Re
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
Rec = Rec_Ito(di, Dc)
f = f_Prasad(Re, di, Dc)
if Re < Rec:
# Laminar flow
Nu = 0.25 * (f/8*Re**2)**(1/3) * Pr
else:
# Turbulent flow
Nu = f/8 * Re
return Nu
[docs]
@refDoc(__doi__, [42, 45])
def Nu_PawarSunnapwar(Re, Pr, di, Dc):
r"""Calculates nusselt number for internal flow at constant heat flux
boundary condition of a helical coil using the method of Pawar-Sunnapwar
(2013).
For laminar flow:
.. math::
Nu = 0.02198 Re^{0.9314} Pr^{0.4} \left(\frac{d_i}{D_c}\right)^{0.391}
For turbulent flow:
.. math::
Nu = 0.0472 De^{0.8346} Pr^{0.4}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
Rec = Rec_Ito(di, Dc)
if Re < Rec:
# Laminar flow, Eq 23 in [42]_
Nu = 0.02198 * Re**0.9314 * Pr**0.4 * (di/Dc)**0.391
else:
# Turbulent flow, Eq 16 in [45]_
De = Dean(Re, di, Dc)
Nu = 0.0472 * De**0.8346 * Pr**0.4
return Nu
[docs]
@refDoc(__doi__, [1])
def Nu_ElGenkSchriener(Re, Pr, di, Dc, p):
r"""Calculates nusselt number for internal flow of a helical coil using
the method of ElGenk-Schriener (2017).
For fluids with Pr < 15:
.. math::
Nu_c = 3.66 + 0.014 Re_m^{0.86} Pr^{0.4}
For fluids with Pr > 15:
.. math::
Nu_c = 3.66 + 0.02 Re_m^{0.7} Pr^{0.4}
using a modified Reynolds number:
.. math::
Re_m = Re \left(1+3.4 \delta\right)
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
p : float
Pitch for twist of 2π radians (360º), [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
# Helix angle
alpha = atan(p/pi/Dc)
# Curvature
delta = (di/Dc)/(1+4*pi**2*tan(alpha)**2)
Rem = Re * (1+3.4*delta)
if Pr < 15:
# Eq 51
Nu = 3.66 + 0.014*Rem**0.86*Pr**0.4
else:
# Eq 52
Nu = 3.66 + 0.02*Rem**0.7*Pr**0.4
return Nu
[docs]
@refDoc(__doi__, [65])
def Nu_Zhou(Re, Pr, di, Dc):
r"""Calculates nusselt number for internal flow of a helical coil using
the method of Zhou et al. (2020).
For laminar regimen:
.. math::
Nu = 0.0254 f Re^{1.197} Pr^{0.159}
For turbulent regimen:
.. math::
Nu = 0.013 Re^{0.93} Pr^{0.4} \left(\frac{d_i}{D_c}\right)^{0.177}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
if di/Dc < 0.001:
# Eq 20
Rec = 2300
else:
Rec = Rec_Ito(di, Dc)
if Re < Rec:
# Laminar regimen, Eq 22
f = f_Ito(Re, di, Dc)
Nu = 0.0254 * f * Re**1.197 * Pr**0.159
else:
# Turbulent regimen, Eq 23
Nu = 0.013 * Re**0.93 * Pr**0.4 * (di/Dc)**0.4
return Nu
[docs]
@refDoc(__doi__, [36, 62])
def Nu_laminar_KalbSeader(Re, Pr, di, Dc, boundary=0):
r"""Calculates nusselt number for internal flow of a helical coil in
laminar flow using the method of Kalb-Seader (1972).
At constant heat flux boundary condition:
For Pr < 0.05:
.. math::
Nu = 3.31 De^{0.115} Pr^{0.0108}
For Pr > 0.7
.. math::
Nu = 0.913 De^{0.476} Pr^{0.2}
At uniform wall temperature boundary condition:
.. math::
Nu = 0.836 De^{0.5} Pr^{0.1}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
boundary : int
Index of boundary condition
0 - Constant heat flux
1 - Uniform wall temperature
Returns
-------
Nu : float
Nusselt number, [-]
"""
De = Dean(Re, di, Dc)
if boundary == 0:
# Constant heat flux, [36]_
if Pr < 0.5:
# Eq 22
Nu = 3.31 * De**0.115 * Pr**0.0108
else:
# Eq 23
Nu = 0.913 * De**0.476 * Pr**0.2
else:
# Uniform wall temperature, [62]_, Eq 11
Nu = 0.836 * De**0.5 * Pr**0.1
return Nu
[docs]
@refDoc(__doi__, [37])
def Nu_laminar_Dravid(Re, Pr, di, Dc):
r"""Calculates nusselt number for internal flow at constant heat flux
boundary condition of a helical coil in laminar flow using the method of
Dravid et al. (1971).
.. math::
Nu = \left(0.76 + 0.65 De^{0.5}\right) Pr^{0.175}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
De = Dean(Re, di, Dc)
# Eq 23
Nu = (0.76 + 0.65*De**0.5) * Pr**0.175
return Nu
[docs]
@refDoc(__doi__, [38])
def Nu_laminar_JanssenHoogendoorn(Re, Pr, di, Dc, f):
r"""Calculates nusselt number for internal flow at constant heat flux
boundary condition of a helical coil in laminar flow using the method of
Janssen-Hoogendoorn (1978).
.. math::
Nu = 0.6166 \left(f Re^2\right)^{0.26} Pr^{1/6}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
f : float
Friction factor, [-]
Returns
-------
Nu : float
Nusselt number, [-]
"""
De = Dean(Re, di, Dc)
if De > 20:
# Eq 19
# The original equation use the Darcy-Weisbach friction factor, so
# convert to Fanning:
# 0.43*4**0.26
Nu = 0.6166 * (f*Re**2)**0.26 * Pr**(1/6)
else:
# Eq 22
Nu = 1.7 * (De**2*Pr)**(1/6)
return Nu
[docs]
@refDoc(__doi__, [39])
def Nu_laminar_ManlapazChurchill(Re, Pr, di, Dc, p):
r"""Calculates nusselt number for internal flow at constant heat flux
boundary condition of a helical coil in laminar flow using the method of
Manlapaz-Churchill (1981).
.. math::
Nu = \left(\left(3.657 + \frac{4.343}{\left(1+\frac{957}{Pr He^2}
\right)^2}\right)^3 + 1.158 \left(\frac{He}{1+\frac{0.477}{Pr}}\right)
^{1.5}\right)^{1/3}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
p : float, optional
Pitch for twist of 2π radians (360º), [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
De = Dean(Re, di, Dc)
He = De/(1+(p/2/pi/di)**2)**0.5
# Eq 39, Uniform wall temperature
Nu = ((3.657 + 4.343/(1+957/Pr/He**2)**2)**3
+ 1.158*(He/(1+0.477/Pr))**1.5)**(1/3)
# Paper give too a correlation for uniform heat flux
return Nu
[docs]
@refDoc(__doi__, [40])
def Nu_laminar_Salimpour(Re, Pr, di, Dc, p):
r"""Calculates nusselt number for internal flow at constant heat flux
boundary condition of a helical coil in laminar flow using the method of
Salimpour (2009).
.. math::
Nu = 0.152De^{0.431}Pr^{1.06}\left(\frac{b}{2 \pi D_c}\right)^{-0.277}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
p : float, optional
Pitch for twist of 2π radians (360º), [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
De = Dean(Re, di, Dc)
# Eq 5
Nu = 0.152 * De**0.431 * Pr**1.06 * (2*pi*di/p)**0.277
return Nu
[docs]
@refDoc(__doi__, [41])
def Nu_laminar_PimentaCampos(Re, Pr, di, Dc):
r"""Calculates nusselt number for internal flow at constant heat flux
boundary condition of a helical coil in laminar flow using the method of
Pimenta-Campos (2013).
.. math::
Nu = \left(0.5 De^{0.481} - 0.465\right) Pr^{0.367}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
De = Dean(Re, di, Dc)
# Eq 38
Nu = (0.5*De**0.481 - 0.465) * Pr**0.367
return Nu
[docs]
@refDoc(__doi__, [43])
def Nu_laminar_Hardik(Re, Pr, di, Dc):
r"""Calculates nusselt number for internal flow at constant heat flux
boundary condition of a helical coil in laminar flow using the method of
Hardik et al. (2015).
.. math::
Nu = 0.0456 Re^{0.8} Pr^{0.4} \left(\frac{d_i}{D_c}\right)^{0.16}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
# Eq 22
Nu = 0.0456 * (di/Dc)**0.16 * Re**0.8 * Pr**0.4
return Nu
[docs]
@refDoc(__doi__, [53])
def Nu_laminar_Acharya(Re, Pr, di, Dc, AA=False):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of Acharya et al. (2001)
For Pr > 1:
.. math::
Nu = 0.67 Re^{0.5} Pr^{0.21} \left(\frac{d_i}{D_c}\right)^{0.13}
For Pr ≤ 1:
.. math::
Nu = 0.69 Re^{0.5} Pr^{0.43} \left(\frac{d_i}{D_c}\right)^{0.13}
Include too correlations for alternate axis coil geometric configuration
For Pr > 1:
.. math::
Nu = 0.7 Re^{0.5} Pr^{0.3} \left(\frac{d_i}{D_c}\right)^{0.18}
For Pr ≤ 1:
.. math::
Nu = 0.7 Re^{0.5} Pr^{0.375} \left(\frac{d_i}{D_c}\right)^{0.18}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
AA : boolean
Set alternalte axis configuraiton for helical coil
Returns
-------
Nu : float
Nusselt number, [-]
"""
if AA:
if Pr <= 1:
# Eq 15
Nu = 0.7 * Re**0.5 * Pr**0.375 * (di/Dc)**0.18
else:
# Eq 16
Nu = 0.7 * Re**0.5 * Pr**0.3 * (di/Dc)**0.18
else:
if Pr <= 1:
# Eq 17
Nu = 0.69 * Re**0.5 * Pr**0.43 * (di/Dc)**0.13
else:
# Eq 18
Nu = 0.67 * Re**0.5 * Pr**0.21 * (di/Dc)**0.13
return Nu
[docs]
@refDoc(__doi__, [54])
def Nu_laminar_AkiyamaCheng(Re, Pr, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of Akiyama-Cheng (1971)
.. math::
\frac{Nu}{Nu_o} = 0.181 Q
\left(1 - 0.839Q^{-1} + 35.4Q^{-2} - 207Q^{-3} + 419Q^{-4}\right)
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
De = Dean(Re, di, Dc)
Q = (De**2*Pr)**0.25
# Eq 20
Nur = 0.181*Q*(1 - 0.839/Q + 35.4/Q**2 -207/Q**3 + 419/Q**4)
return Nur * 48/11
[docs]
@refDoc(__doi__, [55])
def Nu_laminar_Moawed(Re, do, Dc, p):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of Moawed (2011)
.. math::
Nu = 0.0345 Re^{0.48} \left(\frac{D_c}{d_o}\right)^{0.914}
\left(\frac{p}{d_o}\right)^{0.281}
Parameters
----------
Re : float
Reynolds number, [-]
do : float
Outer diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
p : float, optional
Pitch for twist of 2π radians (360º), [m]
This correlation use external diameter of pipe, without Prandtl dependence
Returns
-------
Nu : float
Nusselt number, [-]
"""
# Eq 8
Nu = 0.0345 * Re**0.48 * (Dc/do)**0.914 * (p/do)**0.281
return Nu
[docs]
@refDoc(__doi__, [63])
def Nu_laminar_NaphonWongwises(Re, Pr, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil with a
spiral configuration in laminar flow using the method of Naphon-Wongwises
(2002)
.. math::
Nu = 27.358 De^{0.287} Pr^{-0.949}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
De = Dean(Re, di, Dc)
# Eq 14
Nu = 27.358 * De**0.287 / Pr**0.949
return Nu
[docs]
@refDoc(__doi__, [56])
def Nu_laminar_Rainieri(Re, Pr, di, Dc, corrugated):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of Rainieri et al. (2013)
.. math::
Nu = 1.168 De^{0.47} Pr^{0.16}
For corrugated helical pipe:
.. math::
Nu = 0.0191 De^{1.36} Pr^{0.2}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
corrugated : float, optional
Use correlation for corrugated wall tube
Returns
-------
Nu : float
Nusselt number, [-]
"""
De = Dean(Re, di, Dc)
if corrugated:
# Eq 11
Nu = 0.0191 * De**1.36 * Pr**0.2
else:
# Eq 10
Nu = 1.168 * De**0.47 * Pr**0.16
return Nu
[docs]
@refDoc(__doi__, [67])
def Nu_laminar_Ayuob(Re, Pr, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of Ayuob et al. (2022)
.. math::
Nu = 0.1868 M^{0.6958} Pr^{0.4} \left(\frac{d_i}{D_c}\right)^{0.1703}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
# Eq 8
M = Re**0.64/0.26/(di/Dc)**0.18
if M > 2100:
raise ValueError("Input out of range")
# Eq 19
Nu = 0.1868 * M**0.6958 * Pr**0.4 * (di/Dc)**0.1703
return Nu
[docs]
@refDoc(__doi__, [68])
def Nu_laminar_BergBonilla(Re, Pr, di, Dc):
r"""Calculates friction factor for internal flow of a helical coil in
laminar flow using the method of Berg-Bonilla (1950)
.. math::
Nu = \left(0.0000229 + 0.000636 \frac{d_i}{D_c}\right) Re^{1.29} Pr
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
# Eq 5
Nu = (0.000029 + 0.000636 * di/Dc) * Re**1.29 * Pr
return Nu
[docs]
@refDoc(__doi__, [25])
def Nu_turbulent_MandalNigam(Re, Pr, di, Dc):
r"""Calculates nusselt number for internal flow of a helical coil in
turbulent flow using the method of Mandal-Nigam (2009).
.. math::
Nu = 0.55 De^{0.637} Pr^{0.4}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
De = Dean(Re, di, Dc)
# Eq 13
Nu = 0.55 * De**0.637 * Pr**0.4
return Nu
[docs]
@refDoc(__doi__, [44])
def Nu_turbulent_RogersMayhew(Re, Pr, di, Dc):
r"""Calculates nusselt number for internal flow of a helical coil in
turbulent flow using the method of Rogers-Mayhew (1964).
.. math::
Nu = 0.023 Re^{0.85} Pr^{0.4} \left(\frac{d_i}{D_c}\right)^{0.1}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
# Eq 12
Nu = 0.023 * Re**0.85 * Pr**0.4 * (di/Dc)**0.1
return Nu
[docs]
@refDoc(__doi__, [44, 1])
def Nu_turbulent_Shchukin(Re, Pr, di, Dc):
r"""Calculates nusselt number for internal flow of a helical coil in
turbulent flow using the method of Shchukin (1969) as show in [1]_
For math:`Re (d_i/D_c)^2 < 20`
.. math::
Nu = 0.0316 Re^{0.8} Pr^{0.4} \left(\frac{d_i}{D_c}\right)^{0.05}
For math:`Re (d_i/D_c)^2 > 20`
.. math::
Nu = 0.0266 Re^{0.85} Pr^{0.4} \left(\frac{d_i}{D_c}\right)^{0.15}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
if Re*(di/Dc)**2 < 20:
Nu = 0.0316 * Re**0.8 * Pr**0.4 * (di/Dc)**0.05
else:
Nu = 0.0266 * Re**0.85 * Pr**0.4 * (di/Dc)**0.15
return Nu
[docs]
@refDoc(__doi__, [48])
def Nu_turbulent_Guo(Re, Pr):
r"""Calculates nusselt number for internal flow of a helical coil in
turbulent flow using the method of Guo (1998).
.. math::
Nu = 0.023 Re^{0.58} Pr^{0.4}
This correlation don't include any helical coil geometrical parameters
dependence.
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
Returns
-------
Nu : float
Nusselt number, [-]
"""
# Eq 12
Nu = 0.328 * Re**0.58 * Pr**0.4
return Nu
[docs]
@refDoc(__doi__, [50])
def Nu_turbulent_Jayakumar(Re, Pr, di, Dc):
r"""Calculates nusselt number for internal flow of a helical coil in
turbulent flow using the method of Jayakumar et al. (2008)
.. math::
Nu = 0.025 De^{0.9112} Pr^{0.4}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
De = Dean(Re, di, Dc)
# Eq 8
Nu = 0.025 * De**0.9112 * Pr**0.4
return Nu
[docs]
@refDoc(__doi__, [51])
def Nu_turbulent_Yildiz(Re, Pr, di, Dc):
r"""Calculates nusselt number for internal flow of a helical coil in
turbulent flow using the method of Yildiz et al. (1997)
.. math::
Nu = 0.0551 De^{0.864} Pr^{0.4}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
De = Dean(Re, di, Dc)
# Eq 5
Nu = 0.0551 * De**0.864 * Pr**0.4
return Nu
[docs]
@refDoc(__doi__, [52])
def Nu_turbulent_Wu(Re, Pr, di, Dc):
r"""Calculates nusselt number for internal flow of a helical coil in
turbulent flow using the method of Wu et al. (2025)
.. math::
Nu = 0.023 Re^{0.759} Pr^{0.4} \left(\frac{d_i}{D_c}\right)^{-0.079}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
# Eq 26
Nu = 0.023 * Re**0.759 * Pr**0.4 / (di/Dc)**0.079
return Nu
[docs]
@refDoc(__doi__, [57])
def Nu_turbulent_JhaRajaRao(Re, Pr, di, Dc):
r"""Calculates nusselt number for internal flow of a helical coil in
turbulent flow using the method of Jha et al. (1967)
.. math::
\frac{Nu}{Nu_s} = 1 + 3.46 \frac{d_i}{D_c}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
Nus = h_tubeside_turbulent_Dittus_Boelter(Re, Pr, True)
# Eq 4
Nu = Nus * (1 + 3.46 * di/Dc)
return Nu
[docs]
@refDoc(__doi__, [66, 65])
def Nu_turbulent_Jeschke(Re, Pr, di, Dc):
r"""Calculates nusselt number for internal flow of a helical coil in
turbulent flow using the method of Jeschke (1925) as shown in [66]_
.. math::
Nu = \left(0.039+0.138 \frac{d_i}{D_c}\right) \left(Re Pr\right)^{0.76}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
Nu = (0.039 + 0.138 * di/Dc) * (Re*Pr)**0.76
return Nu
[docs]
@refDoc(__doi__, [64])
def Nu_turbulent_Zheng(Re, Pr, di, Dc, p):
r"""Calculates friction factor for internal flow of a helical coil in
turbulent flow using the method of Zheng et al. (2023).
.. math::
f_c = \frac{0.0791}{Re^{0.25} + \frac{81858}{Re^{1.54}}
\left(\frac{d_i}{D_{cm}}\right)^{0.48}
D_cm is defined as:
.. math::
D_{cm} = D_c \left(1+\tan{\alpha}\right)
α is the helix angle:
.. math::
\alpha = \tan^{-1}{\frac{p}{\pi D_c}}
Parameters
----------
Re : float
Reynolds number, [-]
Pr : float
Prandtl number, [-]
di : float
Internal diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
p : float
Pitch for twist of 2π radians (360º), [m]
Returns
-------
Nu : float
Nusselt number, [-]
"""
# Helix angle
alpha = atan(p/pi/Dc)
Dcm = Dc * (1+tan(alpha))
# Eq 20
Nu = 0.052 * Re**0.77 * Pr**0.4 * (di/Dcm)**0.092
return Nu
[docs]
class HelicalCoil(CallableEntity):
"""Helical coil tube used as anhancing heat transfer equipment.
Parameters
----------
di : float
Inner diameter of the pipe, [m]
Dc : float
Diameter of the helix, [m]
p : float, optional
Pitch for twist of 2π radians (360º), [m]
boundary : int, optional
Set boundary condition in correlation with several implmented
0 - Constant heat flux
1 - Uniform wall temperature
MoriSimple : boolean, optional
Use Simple correlation for Mori-Nakayama nusselt number correlation
AA : boolean, optional
Use alternate axis configuration for Acharya nusselt number correlation
corrugated : boolean, optional
Use Rainieri correlation for corrugated wall
eD : float, optional
Relative roughness of pipe, used in Zhao correlation for turbulent
friction factor, [-]
"""
TEXT_REYNOLDS_CRITICAL = (
"Ito (1959)",
"Schmidt (1967)",
"Kubair-Kuloor (1966)",
"Srinivasan (1968)",
"Kutateladze (1966)",
"Seth-Stahel (1969)",
"Cioncolini-Santini (2006)")
TEXT_LAMINAR_FRICTION = (
"Schmidt (1967)",
"White (1929)",
"Mori-Nakayama (1965)",
"Hart (1988)",
"Ju (2001)",
"Mishra-Gupta (1979)",
"Manlapaz-Churchill (1980)",
"Prasad (1989)",
"Liu-Masliyah (1993)",
"Ali (2001)",
"Ito (1969)",
"Tarbell-Samuels (1973)",
"Pimenta-Campos (2012)",
"Adler (1934)",
"Barua (1963)",
"Yanase (1989)",
"Dennis (1980)",
"van Dyke (1978)",
"Collins-Dennis (1975)",
"Dean (1928)",
"Abushammala (2019)",
"ElGenk-Schriener (2017)",
"Srinivasan (1968)",
"Gupta (2011)",
"Hasson (1955)",
"Rao-Sadasivudu (1974)")
TEXT_TURBULENT_FRICTION = (
"Schmidt (1967)",
"Mori-Nakayama (1965)",
"Ju (2001)",
"Mishra-Gupta (1979)",
"Czop (1994)",
"Prasad (1989)",
"Ali (2001)",
"Guo (2001)",
"Mandal-Nigam (2009)",
"ElGenk-Schriener (2017)",
"Srinivasan (1968)",
"Ito (1959)",
"Zhao (2016)",
"Das (1993)",
"Zheng (2023)",
"Rao-Sadasivudu (1974)")
TEXT_LAMINAR_HEAT = (
"Schmidt (1967)",
"Xin-Ebadian (1997)",
"Mori-Nakayama (1965)",
"Seban-McLaughlin (1963)",
"Prasad (1989)",
"Kalb-Seader (1972)",
"Dravid (1971)",
"Janssen-Hoogendoorn (1978)",
"Manlapaz-Churchill (1981)",
"Salimpour (2009)",
"Pimenta-Campos (2013)",
"Pawar-Sunnapwar (2013)",
"Hardik (2015)",
"ElGenk-Schriener (2017)",
"Acharya (2001)",
"Akiyama-Cheng (1971)",
"Moawed (2011)",
"Rainieri (2013)",
"Naphon-Wongwises (2002)",
"Zhou (2020)",
"Ayuob (2022)",
"Berg-Bonilla (1950)")
TEXT_TURBULENT_HEAT = (
"Schmidt (1967)",
"Xin-Ebadian (1997)",
"Mori-Nakayama (1965)",
"Seban-McLaughlin (1963)",
"Prasad (1989)",
"Mandal-Nigam (2009)",
"Rogers-Mayhew (1964)",
"Pawar-Sunnapwar (2013)",
"ElGenk-Schriener (2017)",
"Shchukin (1969)",
"Guo (1998)",
"Jayakumar (2008)",
"Yildiz (1997)",
"Wu (2025)",
"Jha (1967)",
"Zheng (2023)",
"Zhou (2020)",
"Jeschke (1925)")
TEXT_BOUNDARY = (
translate("equipment", "Constant heat flux"),
translate("equipment", "Uniform wall temperature"))
status = 0
msg = ""
kw = {
"methodReCritic": 0,
"methodFrictionLaminar": 0,
"methodFrictionTurbulent": 0,
"methodHeatLaminar": 0,
"methodHeatTurbulent": 0,
"di": 0,
"Dc": 0,
"p": 0,
"MoriSimple": False,
"AA": False,
"corrugated": False,
"eD": 0,
"boundary": 0,
}
valueChanged = QtCore.pyqtSignal(object)
inputChanged = QtCore.pyqtSignal(object)
@property
def isCalculable(self):
"""Check if all input are defined"""
if not self.kw["di"]:
self.msg = translate("equipment", "undefined internal diameter")
self.status = 0
return False
if not self.kw["Dc"]:
self.msg = translate("equipment", "undefined diameter of helix")
self.status = 0
return False
self.msg = ""
self.status = 1
return True
[docs]
def calculo(self):
"""Definition of twisted tape inserts for annuli sections"""
self.di = self.kw["di"]
self.Dc = self.kw["Dc"]
self.valueChanged.emit(self)
@property
def ReCritical(self):
"""Calculate critical Reynolds number to define transition of regimen
flow from laminar to turbulent"""
if self.kw["methodReCritic"] == 1:
# Schmidt (1967)
Rec = Rec_Schmidt(self.di, self.Dc)
elif self.kw["methodReCritic"] == 2:
# Kubair-Kuloor (1966)
Rec = Rec_Kubair(self.di, self.Dc)
elif self.kw["methodReCritic"] == 2:
# Srinivasan (1968)
Rec = Rec_Srinivasan(self.di, self.Dc)
elif self.kw["methodReCritic"] == 3:
# Kutateladze (1966)
Rec = Rec_Kutateladze(self.di, self.Dc)
elif self.kw["methodReCritic"] == 4:
# Seth-Stahel (1969)
Rec = Rec_SethStahel(self.di, self.Dc)
elif self.kw["methodReCritic"] == 5:
# Cioncolini-Santini (2006)
Rec = Rec_Cioncolini(self.di, self.Dc)
else:
# Ito (1959)
Rec = Rec_Ito(self.di, self.Dc)
return Rec
[docs]
def Nu(self, Re, Pr):
"""Calculate nusselt number"""
msg = ""
Rec = self.ReCritical
if Re < Rec:
# Laminar flow
if self.kw["methodHeatLaminar"] == 1:
# Xin-Ebadian (1997)
Nu = Nu_XinEbadian(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatLaminar"] == 2:
# Mori-Nakayama (1965)
Nu = Nu_MoriNakayama(
Re, Pr, self.di, self.Dc, self.kw["MoriSimple"])
elif self.kw["methodHeatLaminar"] == 3:
# Seban-McLaughlin (1963)
Nu = Nu_SebanMcLaughlin(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatLaminar"] == 4:
# Prasad (1989)
Nu = Nu_Prasad(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatLaminar"] == 5:
# Kalb-Seader (1972)
Nu = Nu_laminar_KalbSeader(
Re, Pr, self.di, self.Dc, self.kw["boundary"])
elif self.kw["methodHeatLaminar"] == 6:
# Dravid (1971)
Nu = Nu_laminar_Dravid(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatLaminar"] == 7:
# Janssen-Hoogendoorn (1978)
f = self.f(Re)
Nu = Nu_laminar_JanssenHoogendoorn(Re, Pr, self.di, self.Dc, f)
elif self.kw["methodHeatLaminar"] == 8:
# Manlapaz-Churchill (1981)
Nu = Nu_laminar_ManlapazChurchill(
Re, Pr, self.di, self.Dc, self.kw["p"])
elif self.kw["methodHeatLaminar"] == 9:
# Salimpour (2009)
if self.kw["p"]:
Nu = Nu_laminar_Salimpour(
Re, Pr, self.di, self.Dc, self.kw["p"])
else:
Nu = Nu_Schmidt(Re, Pr, self.di, self.Dc)
msg = "Helical pitch undefined, using Schmidt correlation"
msg += "instead."
elif self.kw["methodHeatLaminar"] == 10:
# Pimenta-Campos (2013)
Nu = Nu_laminar_PimentaCampos(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatLaminar"] == 11:
# Pawar-Sunnapwar (2013)
Nu = Nu_PawarSunnapwar(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatLaminar"] == 12:
# Hardik (2015)
Nu = Nu_laminar_Hardik(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatLaminar"] == 13:
# ElGenk-Schriener (2017)
Nu = Nu_ElGenkSchriener(Re, Pr, self.di, self.Dc, self.kw["p"])
elif self.kw["methodHeatLaminar"] == 14:
# Acharya (2001)
Nu = Nu_laminar_Acharya(
Re, Pr, self.di, self.Dc, self.kw["AA"])
elif self.kw["methodHeatLaminar"] == 15:
# Akiyama-Cheng (1971)
Nu = Nu_laminar_AkiyamaCheng(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatLaminar"] == 16:
# Moawed (2011)
if self.kw["p"]:
Nu = Nu_laminar_Moawed(Re, self.di, self.Dc, self.kw["p"])
else:
Nu = Nu_Schmidt(Re, Pr, self.di, self.Dc)
msg = "Helical pitch undefined, using Schmidt correlation"
msg += "instead."
elif self.kw["methodHeatLaminar"] == 17:
# Rainieri (2013)
Nu = Nu_laminar_Rainieri(
Re, Pr, self.di, self.Dc, self.kw["corrugated"])
elif self.kw["methodHeatLaminar"] == 18:
# Naphon-Wongwises (2002)
Nu = Nu_laminar_NaphonWongwises(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatLaminar"] == 19:
# Zhou (2020)
Nu = Nu_Zhou(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatLaminar"] == 20:
# Ayuob (2022)
try:
Nu = Nu_laminar_Ayuob(Re, Pr, self.di, self.Dc)
except ValueError:
Nu = Nu_Schmidt(Re, Pr, self.di, self.Dc)
msg = "Ayuob correlation out of range, using Schmidt instead"
elif self.kw["methodHeatLaminar"] == 21:
# Berg-Bonilla (1950)
Nu = Nu_laminar_BergBonilla(Re, Pr, self.di, self.Dc)
else:
# Schmidt (1967)
Nu = Nu_Schmidt(Re, Pr, self.di, self.Dc)
else:
# Turbulent flow
if self.kw["methodHeatTurbulent"] == 1:
# Xin-Ebadian (1997)
Nu = Nu_XinEbadian(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatTurbulent"] == 2:
# Mori-Nakayama (1965)
Nu = Nu_MoriNakayama(
Re, Pr, self.di, self.Dc, self.kw["MoriSimple"])
elif self.kw["methodHeatTurbulent"] == 3:
# Seban-McLaughlin (1963)
Nu = Nu_SebanMcLaughlin(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatTurbulent"] == 4:
# Prasad (1989)
Nu = Nu_Prasad(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatTurbulent"] == 5:
# Mandal-Nigam (2009)
Nu = Nu_turbulent_MandalNigam(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatTurbulent"] == 6:
# Rogers-Mayhew (1964)
Nu = Nu_turbulent_RogersMayhew(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatTurbulent"] == 7:
# Pawar-Sunnapwar (2013)
Nu = Nu_PawarSunnapwar(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatTurbulent"] == 8:
# ElGenk-Schriener (2017)
Nu = Nu_ElGenkSchriener(Re, Pr, self.di, self.Dc, self.kw["p"])
elif self.kw["methodHeatTurbulent"] == 9:
# Shchukin (1969)
Nu = Nu_turbulent_Shchukin(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatTurbulent"] == 10:
# Guo (1998)
Nu = Nu_turbulent_Guo(Re, Pr)
elif self.kw["methodHeatTurbulent"] == 11:
# Jayakumar (2008)
Nu = Nu_turbulent_Jayakumar(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatTurbulent"] == 12:
# Yildiz (1997)
Nu = Nu_turbulent_Yildiz(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatTurbulent"] == 13:
# Wu (2025)
Nu = Nu_turbulent_Wu(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatTurbulent"] == 14:
# Jha (1967)
Nu = Nu_turbulent_JhaRajaRao(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatTurbulent"] == 15:
# Zheng (2023)
Nu = Nu_turbulent_Zheng(Re, Pr, self.di, self.Dc, self.kw["p"])
elif self.kw["methodHeatTurbulent"] == 16:
# Zhou (2020)
Nu = Nu_Zhou(Re, Pr, self.di, self.Dc)
elif self.kw["methodHeatTurbulent"] == 17:
# Jeschke (1925)
Nu = Nu_turbulent_Jeschke(Re, Pr, self.di, self.Dc)
else:
# Schmidt (1967)
Nu = Nu_Schmidt(Re, Pr, self.di, self.Dc)
if msg:
self.status = 3
self.msg = translate("equipment", msg)
self.inputChanged.emit(self)
return Nu
[docs]
def f(self, Re):
"""Calculate friction factor"""
msg = ""
Rec = self.ReCritical
if Re < Rec:
# Laminar flow
if self.kw["methodFrictionLaminar"] == 1:
# White (1929)
f = f_laminar_White(Re, self.di, self.Dc)
elif self.kw["methodFrictionLaminar"] == 2:
# Mori-Nakayama (1965)
f = f_MoriNakayama(Re, self.di, self.Dc)
elif self.kw["methodFrictionLaminar"] == 3:
# Hart (1988)
f = f_laminar_Hart(Re, self.di, self.Dc)
elif self.kw["methodFrictionLaminar"] == 4:
# Ju (2001)
f = f_Ju(Re, self.di, self.Dc)
elif self.kw["methodFrictionLaminar"] == 5:
# Mishra-Gupta (1979)
f = f_MishraGupta(Re, self.di, self.Dc, self.kw["p"])
elif self.kw["methodFrictionLaminar"] == 6:
# Manlapaz-Churchill (1980)
f = f_laminar_ManlapazChurchill(
Re, self.di, self.Dc, self.kw["p"])
if not self.kw["p"]:
msg = "Helical pitch undefined, using Manlapaz correlation"
msg += "with Dean number"
elif self.kw["methodFrictionLaminar"] == 7:
# Prasad (1989)
f = f_Prasad(Re, self.di, self.Dc)
elif self.kw["methodFrictionLaminar"] == 8:
# Liu-Masliyah (1993)
f = f_laminar_LiuMasliyah(Re, self.di, self.Dc, self.kw["p"])
elif self.kw["methodFrictionLaminar"] == 9:
# Ali (2001)
f = f_Ali(Re, self.di, self.Dc, self.kw["p"])
elif self.kw["methodFrictionLaminar"] == 10:
# Ito (1969)
f = f_Ito(Re, self.di, self.Dc)
elif self.kw["methodFrictionLaminar"] == 11:
# Tarbell-Samuels (1973)
f = f_laminar_TarbellSamuels(Re, self.di, self.Dc)
elif self.kw["methodFrictionLaminar"] == 12:
# Pimenta-Campos (2012)
f = f_laminar_PimentaCampos(Re, self.di, self.Dc)
elif self.kw["methodFrictionLaminar"] == 13:
# Adler (1934)
f = f_laminar_Adler(Re, self.di, self.Dc)
elif self.kw["methodFrictionLaminar"] == 14:
# Barua (1963)
f = f_laminar_Barua(Re, self.di, self.Dc)
elif self.kw["methodFrictionLaminar"] == 15:
# Yanase (1989)
f = f_laminar_Yanase(Re, self.di, self.Dc)
elif self.kw["methodFrictionLaminar"] == 16:
# Dennis (1980)
f = f_laminar_Dennis(Re, self.di, self.Dc)
elif self.kw["methodFrictionLaminar"] == 17:
# Van Dyke (1978)
f = f_laminar_vanDyke(Re, self.di, self.Dc)
elif self.kw["methodFrictionLaminar"] == 18:
# Collins-Dennis (1975)
f = f_laminar_CollinsDennis(Re, self.di, self.Dc)
elif self.kw["methodFrictionLaminar"] == 19:
# Dean (1928)
try:
f = f_laminar_Dean(Re, self.di, self.Dc)
except ValueError:
f = f_Schmidt(Re, self.di, self.Dc)
msg = "Dean correlation out of range, using Schmidt instead"
elif self.kw["methodFrictionLaminar"] == 20:
# Abushammala (2019)
f = f_laminar_Abushammala(Re, self.di, self.Dc, self.kw["p"])
elif self.kw["methodFrictionLaminar"] == 21:
# ElGenk-Schriener (2017)
f = f_ElGenkSchriener(Re, self.di, self.Dc, self.kw["p"])
elif self.kw["methodFrictionLaminar"] == 22:
# Srinivasan (1968)
f = f_Srinivasan(Re, self.di, self.Dc)
elif self.kw["methodFrictionLaminar"] == 23:
# Gupta (2011)
if self.kw["p"]:
f = f_laminar_Gupta(Re, self.di, self.Dc, self.kw["p"])
else:
f = f_Schmidt(Re, self.di, self.Dc)
msg = "Helical pitch undefined, using Schmidt correlation"
elif self.kw["methodFrictionLaminar"] == 24:
# Hasson (1955)
f = f_laminar_Hasson(Re, self.di, self.Dc)
elif self.kw["methodFrictionLaminar"] == 25:
# Rao-Sadasivudu (1974)
f = f_RaoSadasivudu(Re, self.di, self.Dc)
else:
# Schmidt (1967)
f = f_Schmidt(Re, self.di, self.Dc)
else:
# Turbulent flow
if self.kw["methodFrictionTurbulent"] == 1:
# Mori-Nakayama (1965)
f = f_MoriNakayama(Re, self.di, self.Dc)
elif self.kw["methodFrictionTurbulent"] == 2:
# Ju (2001)
f = f_Ju(Re, self.di, self.Dc)
elif self.kw["methodFrictionTurbulent"] == 3:
# Mishra-Gupta (1979)
f = f_MishraGupta(Re, self.di, self.Dc, self.kw["p"])
elif self.kw["methodFrictionTurbulent"] == 4:
# Czop (1994)
f = f_turbulent_Czop(Re, self.di, self.Dc)
elif self.kw["methodFrictionTurbulent"] == 5:
# Prasad (1989)
f = f_Prasad(Re, self.di, self.Dc)
elif self.kw["methodFrictionTurbulent"] == 6:
# Ali (2001)
f = f_Ali(Re, self.di, self.Dc, self.kw["p"])
elif self.kw["methodFrictionTurbulent"] == 7:
# Guo (2001)
f = f_turbulent_Guo(Re, self.di, self.Dc)
elif self.kw["methodFrictionTurbulent"] == 8:
# Mandal-Nigam (2009)
f = f_turbulent_MandalNigam(Re, self.di, self.Dc)
elif self.kw["methodFrictionTurbulent"] == 9:
# ElGenk-Schriener (2017)
f = f_ElGenkSchriener(Re, self.di, self.Dc, self.kw["p"])
elif self.kw["methodFrictionTurbulent"] == 10:
# Srinivasan (1968)
f = f_Srinivasan(Re, self.di, self.Dc)
elif self.kw["methodFrictionTurbulent"] == 11:
# Ito (1959)
f = f_Ito(Re, self.di, self.Dc)
elif self.kw["methodFrictionTurbulent"] == 12:
# Zhao (2016)
f = f_turbulent_Zhao(Re, self.di, self.Dc, self.kw["eD"])
elif self.kw["methodFrictionTurbulent"] == 13:
# Das (1993)
f = f_turbulent_Das(
Re, self.di, self.Dc, self.kw["p"], self.kw["eD"])
elif self.kw["methodFrictionTurbulent"] == 14:
# Zheng (2023)
f = f_turbulent_Zheng(Re, self.di, self.Dc, self.kw["p"])
elif self.kw["methodFrictionTurbulent"] == 15:
# Rao-Sadasivudu (1974)
f = f_RaoSadasivudu(Re, self.di, self.Dc)
else:
# Schmidt (1967)
f = f_Schmidt(Re, self.di, self.Dc)
if msg:
self.status = 3
self.msg = translate("equipment", msg)
self.inputChanged.emit(self)
return f
[docs]
class UI_Helical(ToolGui):
"""Helical coil dialog"""
title = translate("equipment", "Use helical coil")
[docs]
def loadUI(self):
"""Add widget"""
self.Entity = HelicalCoil()
lyt = self.wdg.layout()
groupMethods = QtWidgets.QWidget()
lytM = QtWidgets.QGridLayout(groupMethods)
lytM.addItem(QtWidgets.QSpacerItem(
20, 20, QtWidgets.QSizePolicy.Policy.Fixed,
QtWidgets.QSizePolicy.Policy.Fixed), 1, 0)
lbl = QtWidgets.QLabel(self.tr("Laminar Flow"))
lbl.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter
| QtCore.Qt.AlignmentFlag.AlignVCenter)
lytM.addWidget(lbl, 1, 2)
lbl = QtWidgets.QLabel(self.tr("Turbulent Flow"))
lbl.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter
| QtCore.Qt.AlignmentFlag.AlignVCenter)
lytM.addWidget(lbl, 1, 3)
lytM.addWidget(QtWidgets.QLabel(
self.tr("Friction factor method")), 2, 1)
self.methodFrictionLaminar = QtWidgets.QComboBox()
for method in HelicalCoil.TEXT_LAMINAR_FRICTION:
self.methodFrictionLaminar.addItem(method)
self.methodFrictionLaminar.currentIndexChanged.connect(
partial(self.changeParams, "methodFrictionLaminar"))
lytM.addWidget(self.methodFrictionLaminar, 2, 2)
self.methodFrictionTurbulent = QtWidgets.QComboBox()
for method in HelicalCoil.TEXT_TURBULENT_FRICTION:
self.methodFrictionTurbulent.addItem(method)
self.methodFrictionTurbulent.currentIndexChanged.connect(
partial(self.changeParams, "methodFrictionTurbulent"))
self.methodFrictionTurbulent.currentTextChanged.connect(
self.setVisibleMod)
lytM.addWidget(self.methodFrictionTurbulent, 2, 3)
lytM.addWidget(QtWidgets.QLabel(
self.tr("Heat transfer method")), 3, 1)
self.methodHeatLaminar = QtWidgets.QComboBox()
for method in HelicalCoil.TEXT_LAMINAR_HEAT:
self.methodHeatLaminar.addItem(method)
self.methodHeatLaminar.currentIndexChanged.connect(
partial(self.changeParams, "methodHeatLaminar"))
self.methodHeatLaminar.currentTextChanged.connect(self.setVisibleMod)
lytM.addWidget(self.methodHeatLaminar, 3, 2)
self.methodHeatTurbulent = QtWidgets.QComboBox()
for method in HelicalCoil.TEXT_TURBULENT_HEAT:
self.methodHeatTurbulent.addItem(method)
self.methodHeatTurbulent.currentIndexChanged.connect(
partial(self.changeParams, "methodHeatTurbulent"))
lytM.addWidget(self.methodHeatTurbulent, 3, 3)
lytM.addItem(QtWidgets.QSpacerItem(
10, 10, QtWidgets.QSizePolicy.Policy.Fixed,
QtWidgets.QSizePolicy.Policy.Fixed), 4, 1)
lyt.addWidget(groupMethods, 1, 1, 1, 3)
lytH = QtWidgets.QHBoxLayout()
lytH.addWidget(QtWidgets.QLabel(
self.tr("Critical Reynolds correlation")))
self.methodReCritic = QtWidgets.QComboBox()
for method in HelicalCoil.TEXT_REYNOLDS_CRITICAL:
self.methodReCritic.addItem(method)
self.methodReCritic.currentIndexChanged.connect(
partial(self.changeParams, "methodReCritic"))
lytH.addWidget(self.methodReCritic)
lytH.addItem(QtWidgets.QSpacerItem(
20, 20, QtWidgets.QSizePolicy.Policy.Expanding,
QtWidgets.QSizePolicy.Policy.Fixed))
lyt.addLayout(lytH, 2, 1, 1, 2)
lyt.addItem(QtWidgets.QSpacerItem(
20, 20, QtWidgets.QSizePolicy.Policy.Fixed,
QtWidgets.QSizePolicy.Policy.Fixed), 3, 1)
lyt.addWidget(QtWidgets.QLabel(self.tr("Pipe internal diameter")), 4, 1)
self.di = Entrada_con_unidades(Length, "PipeDiameter")
self.di.valueChanged.connect(partial(self.changeParams, "di"))
lyt.addWidget(self.di, 4, 2)
lyt.addWidget(QtWidgets.QLabel(self.tr("Helical coil diameter")), 5, 1)
self.Dc = Entrada_con_unidades(Length)
self.Dc.valueChanged.connect(partial(self.changeParams, "Dc"))
lyt.addWidget(self.Dc, 5, 2)
lyt.addWidget(QtWidgets.QLabel(self.tr("Helical pitch")), 6, 1)
self.p = Entrada_con_unidades(Length)
self.p.valueChanged.connect(partial(self.changeParams, "p"))
lyt.addWidget(self.p, 6, 2)
lyt.addWidget(QtWidgets.QLabel(self.tr("Boundary condition")), 7, 1)
self.boundary = QtWidgets.QComboBox()
for method in HelicalCoil.TEXT_BOUNDARY:
self.boundary.addItem(method)
self.boundary.currentIndexChanged.connect(
partial(self.changeParams, "boundary"))
lyt.addWidget(self.boundary, 7, 2)
# Mori-Nakayama additional parameters
self.MoriSimple = QtWidgets.QCheckBox(self.tr(
"Use simple correlation for laminar nusselt number"))
self.MoriSimple.toggled.connect(
partial(self.changeParams, "MoriSimple"))
lyt.addWidget(self.MoriSimple, 8, 1, 1, 2)
# Acharya additional parameters
self.AA = QtWidgets.QCheckBox(self.tr(
"Use alternate axis geometric configuration"))
self.AA.toggled.connect(partial(self.changeParams, "AA"))
lyt.addWidget(self.AA, 9, 1, 1, 2)
# Rainieri additional parameters
self.corrugated = QtWidgets.QCheckBox(self.tr(
"Use alternate correlation for corrugated pipe"))
self.corrugated.toggled.connect(
partial(self.changeParams, "corrugated"))
lyt.addWidget(self.corrugated, 10, 1, 1, 2)
# eD additional parameters
self.groupeD = QtWidgets.QWidget()
lytg = QtWidgets.QHBoxLayout(self.groupeD)
lytg.addWidget(QtWidgets.QLabel(self.tr("Relalive roughness")))
self.eD = Entrada_con_unidades(float)
self.eD.valueChanged.connect(partial(self.changeParams, "eD"))
lytg.addWidget(self.eD)
lyt.addWidget(self.groupeD, 11, 1, 1, 2)
self.Entity.valueChanged.connect(self.valueChanged.emit)
self.Entity.inputChanged.connect(self.populate)
self.setVisibleMod()
[docs]
def setVisibleMod(self):
"""Enable widget with special parameters for selected method"""
# Mori-Nakayama
self.MoriSimple.setVisible(
self.methodHeatLaminar.currentText() == "Mori-Nakayama (1965)")
# Acharya
self.AA.setVisible(
self.methodHeatLaminar.currentText() == "Acharya (2001)")
# Rainieri
self.corrugated.setVisible(
self.methodHeatLaminar.currentText() == "Rainieri (2013)")
# Zhao, Das
self.groupeD.setVisible(
self.methodFrictionTurbulent.currentText() in (
"Zhao (2016)", "Das (1993)"))
# Boundary condition
self.boundary.setEnabled(
self.methodHeatLaminar.currentText() == "Kalb-Seader (1972)")
[docs]
class Dialog(QtWidgets.QDialog):
"""Component list config dialog"""
[docs]
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle(self.tr("Twisted-tape insert"))
layout = QtWidgets.QVBoxLayout(self)
self.datos = UI_Helical()
layout.addWidget(self.datos)
self.buttonBox = QtWidgets.QDialogButtonBox(
QtWidgets.QDialogButtonBox.StandardButton.Cancel
| QtWidgets.QDialogButtonBox.StandardButton.Ok)
self.buttonBox.accepted.connect(self.accept)
self.buttonBox.rejected.connect(self.reject)
layout.addWidget(self.buttonBox)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Dialog = Dialog()
Dialog.show()
sys.exit(app.exec())