Source code for pychemengg.heattransfer.heatcommonmethods

# -*- coding: utf-8 -*-

# This file is part of pyChemEngg python package.
 
# PyChemEngg: A python-based framework to promote problem solving and critical
# thinking in chemical engineering.

# Copyright (c) 2021 Harvinder Singh Gill <profhsgill@gmail.com>

# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

"""Module contains functions commonly used in heat transfer.
"""

import numpy as np
from scipy import interpolate
from scipy.interpolate import interp1d
import bisect
import warnings
warnings.simplefilter('always')

__all__ = ["calc_LMTD", "calc_internalenergychange",
           "calc_overallheattransfercoefficient", "calc_Re"]

[docs]def calc_internalenergychange(mass=None, specificheat=None, deltaT=None): r"""To compute change in internal energy due to temperature change. Parameters ---------- mass : `int or float` Mass of object (solid, liquid or gas). specificheat : `int or float` Specific heat of object. deltaT : `int or float` Change in temperature of object. Returns ------- internal energy change: `int or float` Internal energy change due to change in temperature of object. Notes ----- The following formula is used: .. math:: \Delta U = mC_p\Delta T *where:* m = change in internal energy :math:`C_p` = specific heat :math:`\Delta T` = change in temperature :math:`\Delta U` = change in internal energy Examples -------- First import the module **heatcommonmethods**. >>> from pychemengg.heattransfer import heatcommonmethods as hcm >>> hcm.calc_internalenergychange(mass=4.686, specificheat=0.395, deltaT=150-100) 92.5485 References ---------- [1] G. F. Nellis and S. A. Klein, "Introduction to Engineering Heat Transfer", 1st Edition. Cambridge University Press, 2021. [2] Y. A. Cengel and A. J. Ghajar, "Heat And Mass Transfer Fundamentals and Applications", 6th Edition. New York, McGraw Hill Education, 2020. [3] T.L. Bergman, A. S. Lavine, F. P. Incropera, D. P. Dewitt, "Fundamentals of Heat and Mass Transfer", 7th Edition, John Wiley, 2011. """ return mass * specificheat * deltaT
[docs]def calc_Re(characteristic_length=None, velocity=None, density=None, viscosity=None): r"""To compute Reynolds number for flowing fluid. Parameters ---------- characteristic_length : `int or float` Relevant length for computing Reynolds number (see Notes). velocity : `int or float` Velocity of fluid. density : `int or float` Density of fluid. viscosity : `int or float` Viscosity of fluid. Returns ------- Reynolds number : `int or float` Reynolds number for a flowing fluid. Notes ----- The following formula is used: .. math:: Re = \frac {L_c V \rho} {\mu} *where:* :math:`L_c` *= characteristic length* for example: :math:`L_c` *= internal diameter of pipe/tube for fluid flowing* in a circular tube/pipe :math:`L_c` *= external diameter for fluid flowing outside a circular tube/pipe* :math:`L_c` *= hydraulic diameter for fluid flowing in a non-circular tube/pipe* *V = fluid velocity* :math:`\rho` *= density of fluid* :math:`\mu` *= viscosity of fluid* Examples -------- First import the module **heatcommonmethods**. >>> from pychemengg.heattransfer import heatcommonmethods as hcm >>> hcm.calc_Re(characteristic_length=0.015, velocity=6.43, density=1.059, viscosity=2.008e-5) 5086.680776892429 References ---------- [1] G. F. Nellis and S. A. Klein, "Introduction to Engineering Heat Transfer", 1st Edition. Cambridge University Press, 2021. [2] Y. A. Cengel and A. J. Ghajar, "Heat And Mass Transfer Fundamentals and Applications", 6th Edition. New York, McGraw Hill Education, 2020. [3] T.L. Bergman, A. S. Lavine, F. P. Incropera, D. P. Dewitt, "Fundamentals of Heat and Mass Transfer", 7th Edition, John Wiley, 2011. """ return characteristic_length * velocity * density / viscosity
[docs]def calc_Pr(viscosity=None, specificheat=None, thermalconductivity=None): r"""To compute Prandtl number for a fluid. Parameters ---------- viscosity : `int or float` Viscosity of fluid. specificheat : `int or float` Specific heat of fluid. thermalconductivity : `int or float` Thermal conductivity of fluid. Returns ------- Prandtl number : `int or float` Prandtl number for a fluid. Notes ----- The following formula is used: .. math:: Pr = \frac {\mu C_p} {k} *where:* :math:`\mu` *= viscosity of fluid* :math:`C_p` *= specific heat* *k = thermal conductivity* Examples -------- First import the module **heatcommonmethods**. >>> from pychemengg.heattransfer import heatcommonmethods as hcm >>> hcm.calc_Pr(viscosity=0.8374, specificheat=1880, thermalconductivity=0.145) 10857.324137931037 References ---------- [1] G. F. Nellis and S. A. Klein, "Introduction to Engineering Heat Transfer", 1st Edition. Cambridge University Press, 2021. [2] Y. A. Cengel and A. J. Ghajar, "Heat And Mass Transfer Fundamentals and Applications", 6th Edition. New York, McGraw Hill Education, 2020. [3] T.L. Bergman, A. S. Lavine, F. P. Incropera, D. P. Dewitt, "Fundamentals of Heat and Mass Transfer", 7th Edition, John Wiley, 2011. """ return viscosity * specificheat / thermalconductivity
[docs]def calc_LMTD(deltaT1=None, deltaT2=None): r"""To compute log mean temperature difference (LMTD) Parameters ---------- deltaT1 : `int or float` Temperature difference. deltaT2 : `int or float` Temperature difference. Returns ------- LMTD : `int or float` Reynolds number for a flowing fluid. Notes ----- The following formula is used. .. math:: LMTD = \cfrac {\Delta T_1 - \Delta T_2} {ln[ \Delta T_1 / \Delta T_2 } *where:* :math:`\Delta T_1` *= temperature difference #1* :math:`\Delta T_2` *= temperature difference #2* :math:`\Delta T_1` and :math:`\Delta T_2` vary on the type of problem under consideration Internal to this function, the temperature differences are converted into complex numbers to allow for the use of this function in situations where temperature must be iteratively solved using solvers such as 'fsolve' from scipy. The value that is returned is the real part. Examples -------- First import the module **heatcommonmethods**. >>> from pychemengg.heattransfer import heatcommonmethods as hcm >>> hcm.calc_LMTD(deltaT1=90-40, deltaT2=65-20) 47.456107905149494 References ---------- [1] G. F. Nellis and S. A. Klein, "Introduction to Engineering Heat Transfer", 1st Edition. Cambridge University Press, 2021. [2] Y. A. Cengel and A. J. Ghajar, "Heat And Mass Transfer Fundamentals and Applications", 6th Edition. New York, McGraw Hill Education, 2020. [3] T.L. Bergman, A. S. Lavine, F. P. Incropera, D. P. Dewitt, "Fundamentals of Heat and Mass Transfer", 7th Edition, John Wiley, 2011. """ if deltaT1 == deltaT2: LMTD = deltaT1 return LMTD else: deltaT1 = deltaT1 + 0j deltaT2 = deltaT2 + 0j LMTD = (deltaT1-deltaT2) / np.log(deltaT1/deltaT2) LMTD = LMTD.real return LMTD
[docs]def calc_overallheattransfercoefficient(inner_heattransfercoefficient=None, outer_heattransfercoefficient=None, inner_foulingfactor=None, outer_foulingfactor=None, resistanceof_wall=None, inner_area=None, outer_area=None, is_basedon_outerarea=False, is_basedon_innerarea=False): r"""To compute overall heat transfer coefficient (U) from resistance values Parameters ---------- inner_heattransfercoefficient : `int or float` Heat transfer coefficient on inside/oneside of object. outer_heattransfercoefficient : `int or float` Heat transfer coefficient on outside/otherside of object. inner_foulingfactor: `int or float` Fouling factor on inside/oneside of object. outer_foulingfactor: `int or float` Fouling factor on outside/otherside of object. resistanceof_wall: `int or float`, Resistance of conduction of object material (based on shape). inner_area: `int or float` Surface area of inside/oneside of object. outer_area: `int or float` Surface area of outside/otherside of object. is_basedon_outerarea : `bool`, default = False Specification whether overall heat transfer coefficient (U) is based on outside/oneside surface area. is_basedon_innerarea : `bool`, default = False Specification whether overall heat transfer coefficient (U) is based on inside/oneside surface area. Returns ------- Overall heat transfer coefficient (U) : `int or float` If 'is_basedon_innerarea == True' 'U' based on inner/oneside area is returned If 'is_basedon_outerarea == True' 'U' based on inner/oneside area is returned Notes ----- The following formula is used. .. math:: \frac{1}{U_iA_i} = \frac{1}{U_oA_o} = R_{convection, in} + R_{fouling, in} + R_{conduction} + R_{fouling, out} + R_{convection, out} *where:* :math:`U_i` *= overall heat transfer coefficient based on inner area* :math:`U_o` *= overall heat transfer coefficient based on outer area* :math:`A_i` *= inner surface area of heat transfer* :math:`A_o` *= outer area of heat transfer* :math:`R_{*}` *= resistance of conduction, convection or fouling* **What if some resistances are zero** *Simply leave their respective keywords at default value of 'None'.* See Also -------- pychemengg.heattransfer.steadystate.Slab.resistanceof_cond pychemengg.heattransfer.steadystate.Slab.resistanceof_conv pychemengg.heattransfer.steadystate.Slab.resistanceof_fouling pychemengg.heattransfer.steadystate.Cylinder.resistanceof_cond pychemengg.heattransfer.steadystate.Cylinder.resistanceof_conv pychemengg.heattransfer.steadystate.Cylinder.resistanceof_fouling pychemengg.heattransfer.steadystate.Sphere.resistanceof_cond pychemengg.heattransfer.steadystate.Sphere.resistanceof_conv pychemengg.heattransfer.steadystate.Sphere.resistanceof_fouling Examples -------- First import the module **heatcommonmethods**. >>> from pychemengg.heattransfer import heatcommonmethods as hcm >>> hcm.calc_overallheattransfercoefficient(inner_heattransfercoefficient=800, outer_heattransfercoefficient=1200, inner_foulingfactor=0.0004, outer_foulingfactor=0.0001, resistanceof_wall=0.0025, inner_area=0.0471, outer_area=0.0597, is_basedon_outerarea=True) 315.06138931035497 References ---------- [1] G. F. Nellis and S. A. Klein, "Introduction to Engineering Heat Transfer", 1st Edition. Cambridge University Press, 2021. [2] Y. A. Cengel and A. J. Ghajar, "Heat And Mass Transfer Fundamentals and Applications", 6th Edition. New York, McGraw Hill Education, 2020. [3] T.L. Bergman, A. S. Lavine, F. P. Incropera, D. P. Dewitt, "Fundamentals of Heat and Mass Transfer", 7th Edition, John Wiley, 2011. """ resistanceof_conv_inside = 1/(inner_heattransfercoefficient*inner_area) if inner_heattransfercoefficient is not None else 0 resistanceof_fouling_inside = inner_foulingfactor/inner_area if inner_foulingfactor is not None else 0 resistanceof_wall = resistanceof_wall if resistanceof_wall is not None else 0 resistanceof_conv_outside = 1/(outer_heattransfercoefficient*outer_area) if outer_heattransfercoefficient is not None else 0 resistanceof_fouling_outside = outer_foulingfactor/outer_area if outer_foulingfactor is not None else 0 U_times_area_inverse = (resistanceof_conv_inside + resistanceof_fouling_inside + resistanceof_wall + resistanceof_conv_outside + resistanceof_fouling_outside) if (is_basedon_outerarea==True) and (is_basedon_innerarea==False): return ((U_times_area_inverse)**(-1)) / outer_area if (is_basedon_outerarea==False) and (is_basedon_innerarea==True): return ((U_times_area_inverse)**(-1)) / inner_area