💻 Fortran Source Code Library

Run calculations locally on your own machine. View code structure, read technical explanations, and download compilation packages including sample input files.

Heat Exchanger LMTD Sizer

Core Numerical Engine in Fortran 90 • 0 total downloads

heat_exchanger_lmtd.f90
! =========================================================================
! Source File: heat_exchanger_lmtd.f90
! =========================================================================

program heat_exchanger_lmtd
    implicit none

    double precision :: T_hi, T_ho, T_ci, T_co
    double precision :: m_h, m_c, Cp_h, Cp_c
    double precision :: U, A_req
    double precision :: Q_h, Q_c, Q
    double precision :: dT1, dT2, LMTD_pf, LMTD_cf
    double precision :: LMTD_used
    double precision :: C_h, C_c, C_min, C_max, C_r
    double precision :: eff
    double precision :: NTU
    integer :: config
    integer :: i
    character(len=20) :: config_name

    ! Read inputs
    read(*,*) config     ! 1=parallel flow, 2=counter flow
    read(*,*) T_hi       ! Hot fluid inlet temp [C]
    read(*,*) T_ho       ! Hot fluid outlet temp [C]
    read(*,*) T_ci       ! Cold fluid inlet temp [C]
    read(*,*) T_co       ! Cold fluid outlet temp [C]
    read(*,*) m_h        ! Hot fluid mass flow rate [kg/s]
    read(*,*) m_c        ! Cold fluid mass flow rate [kg/s]
    read(*,*) Cp_h       ! Hot fluid specific heat [J/kg.K]
    read(*,*) Cp_c       ! Cold fluid specific heat [J/kg.K]
    read(*,*) U          ! Overall heat transfer coefficient [W/m2.K]

    ! Configuration name
    if (config == 1) then
        config_name = 'Parallel Flow'
    else
        config_name = 'Counter Flow'
    end if

    ! Heat capacity rates
    C_h = m_h * Cp_h
    C_c = m_c * Cp_c

    if (C_h < C_c) then
        C_min = C_h
        C_max = C_c
    else
        C_min = C_c
        C_max = C_h
    end if
    C_r = C_min / C_max

    ! Heat transfer rates
    Q_h = C_h * (T_hi - T_ho)
    Q_c = C_c * (T_co - T_ci)
    Q = (Q_h + Q_c) / 2.0d0

    ! ============================================
    ! LMTD CALCULATION
    ! ============================================

    ! Parallel flow LMTD
    dT1 = T_hi - T_ci
    dT2 = T_ho - T_co
    if (abs(dT1 - dT2) < 1.0d-6) then
        LMTD_pf = dT1
    else if (dT1 > 0 .and. dT2 > 0) then
        LMTD_pf = (dT1 - dT2) / log(dT1 / dT2)
    else
        LMTD_pf = 0.0d0
    end if

    ! Counter flow LMTD
    dT1 = T_hi - T_co
    dT2 = T_ho - T_ci
    if (abs(dT1 - dT2) < 1.0d-6) then
        LMTD_cf = dT1
    else if (dT1 > 0 .and. dT2 > 0) then
        LMTD_cf = (dT1 - dT2) / log(dT1 / dT2)
    else
        LMTD_cf = 0.0d0
    end if

    ! Select LMTD based on configuration
    if (config == 1) then
        LMTD_used = LMTD_pf
    else
        LMTD_used = LMTD_cf
    end if

    ! Required area
    if (LMTD_used > 0 .and. U > 0) then
        A_req = Q / (U * LMTD_used)
    else
        A_req = 0.0d0
    end if

    ! Effectiveness
    if (C_min * (T_hi - T_ci) > 0) then
        eff = Q / (C_min * (T_hi - T_ci))
    else
        eff = 0.0d0
    end if

    ! NTU
    if (C_min > 0 .and. A_req > 0) then
        NTU = U * A_req / C_min
    else
        NTU = 0.0d0
    end if

    ! ============================================
    ! OUTPUT
    ! ============================================
    write(*,'(A)') '============================================================='
    write(*,'(A)') '   HEAT EXCHANGER ANALYSIS - LMTD METHOD'
    write(*,'(A)') '============================================================='
    write(*,*)
    write(*,'(A)') '--- CONFIGURATION -------------------------------------------'
    write(*,'(A,A)')        '  Flow Arrangement        = ', trim(config_name)
    write(*,*)
    write(*,'(A)') '--- INPUT PARAMETERS ----------------------------------------'
    write(*,'(A)') '  Hot Fluid:'
    write(*,'(A,F12.2,A)')  '    Inlet Temperature     = ', T_hi, ' C'
    write(*,'(A,F12.2,A)')  '    Outlet Temperature    = ', T_ho, ' C'
    write(*,'(A,F12.4,A)')  '    Mass Flow Rate        = ', m_h, ' kg/s'
    write(*,'(A,F12.2,A)')  '    Specific Heat         = ', Cp_h, ' J/kg.K'
    write(*,*)
    write(*,'(A)') '  Cold Fluid:'
    write(*,'(A,F12.2,A)')  '    Inlet Temperature     = ', T_ci, ' C'
    write(*,'(A,F12.2,A)')  '    Outlet Temperature    = ', T_co, ' C'
    write(*,'(A,F12.4,A)')  '    Mass Flow Rate        = ', m_c, ' kg/s'
    write(*,'(A,F12.2,A)')  '    Specific Heat         = ', Cp_c, ' J/kg.K'
    write(*,*)
    write(*,'(A,F12.2,A)')  '  Overall U               = ', U, ' W/m2.K'
    write(*,*)
    write(*,'(A)') '--- HEAT CAPACITY RATES -------------------------------------'
    write(*,'(A,F12.4,A)')  '  C_hot  = m_h x Cp_h    = ', C_h, ' W/K'
    write(*,'(A,F12.4,A)')  '  C_cold = m_c x Cp_c    = ', C_c, ' W/K'
    write(*,'(A,F12.4,A)')  '  C_min                   = ', C_min, ' W/K'
    write(*,'(A,F12.4,A)')  '  C_max                   = ', C_max, ' W/K'
    write(*,'(A,F12.4)')    '  C_r = C_min/C_max       = ', C_r
    write(*,*)
    write(*,'(A)') '--- ENERGY BALANCE ------------------------------------------'
    write(*,'(A,F12.4,A)')  '  Q_hot  = C_h(T_hi-T_ho)= ', Q_h, ' W'
    write(*,'(A,F12.4,A)')  '  Q_cold = C_c(T_co-T_ci)= ', Q_c, ' W'
    write(*,'(A,F12.4,A)')  '  Q (average)             = ', Q, ' W'
    write(*,'(A,F12.4,A)')  '  Energy Balance Error    = ', &
        abs(Q_h-Q_c)/max(Q_h,1.0d-10)*100, ' %'
    write(*,*)
    write(*,'(A)') '--- LMTD RESULTS --------------------------------------------'
    write(*,'(A,F12.4,A)')  '  LMTD (parallel flow)    = ', LMTD_pf, ' deg-C'
    write(*,'(A,F12.4,A)')  '  LMTD (counter flow)     = ', LMTD_cf, ' deg-C'
    write(*,'(A,F12.4,A)')  '  LMTD (used)             = ', LMTD_used, ' deg-C'
    write(*,*)
    write(*,'(A)') '--- DESIGN RESULTS ------------------------------------------'
    write(*,'(A,F12.4,A)')  '  Required Area (A)       = ', A_req, ' m2'
    write(*,'(A,F12.4)')    '  NTU = UA/C_min          = ', NTU
    write(*,'(A,F12.4,A)')  '  Effectiveness (e)       = ', eff*100, ' %'
    write(*,*)

    ! Temperature profiles for chart
    write(*,'(A)') '--- TEMPERATURE PROFILE ALONG EXCHANGER --------------------'
    write(*,'(A)') '  Position %    T_hot [C]    T_cold [C]'
    write(*,'(A)') '  --------------------------------------------------'

    do i = 0, 20
        if (config == 1) then
            ! Parallel flow: both fluids travel same direction
            write(*,'(F10.1,4X,F10.2,4X,F10.2)') dble(i)/20.0d0*100, &
                T_hi - (T_hi - T_ho) * dble(i)/20.0d0, &
                T_ci + (T_co - T_ci) * dble(i)/20.0d0
        else
            ! Counter flow: cold fluid travels opposite direction
            write(*,'(F10.1,4X,F10.2,4X,F10.2)') dble(i)/20.0d0*100, &
                T_hi - (T_hi - T_ho) * dble(i)/20.0d0, &
                T_co - (T_co - T_ci) * dble(i)/20.0d0
        end if
    end do

    write(*,*)
    write(*,'(A)') '--- FORMULAS USED -------------------------------------------'
    write(*,'(A)') '  Q = U x A x LMTD'
    write(*,'(A)') '  LMTD = (DT1 - DT2) / ln(DT1/DT2)'
    write(*,'(A)') '  Effectiveness = Q / Q_max = Q / (C_min x (T_hi - T_ci))'
    write(*,'(A)') '  NTU = U x A / C_min'

end program heat_exchanger_lmtd


Solver Description

Sizes heat exchangers using the Log-Mean Temperature Difference ($LMTD$) method. Evaluates capacity ratios ($C_r$), solves for total heat transfer rate ($Q = \dot{m} C_p \Delta T$), computes $\Delta T_{lm}$, and calculates the required surface area ($A$).

Key Numerical Methods & Architecture

  • Input Redirection: Reads parameters sequentially from standard input (`stdin`) using Fortran sequential read (`read(*,*)`), ensuring modular integration.
  • Modular Design: Formulated using pure mathematical routines, separation of equations from output formatting, and precise numerical solvers (e.g. bisection, Newton-Raphson).
  • Standard Compliant: Written in clean, standards-compliant Fortran 90 to ensure cross-compiler compatibility.

🛠️ Local Compilation

To test this code on your machine, compile the source code file(s) using a standard Fortran compiler (e.g., `gfortran`).

Compilation Command:

gfortran -ffree-line-length-none heat_exchanger_lmtd.f90 -o hx_lmtd

Execution Command:

Execute the program by feeding the sample input file into the program using stdin redirection:

hx_lmtd < input.txt

📥 Downloads & Local Files

Preview of the required input file (input.txt):

! Flow Configuration (1=Parallel Flow, 2=Counter-Flow)
2
! Hot Fluid Inlet Temp ($T_{hi}$) [°C]
120.0
! Hot Fluid Outlet Temp ($T_{ho}$) [°C]
70.0
! Cold Fluid Inlet Temp ($T_{ci}$) [°C]
20.0
! Cold Fluid Outlet Temp ($T_{co}$) [°C]
55.0
! Hot Fluid Mass Flow Rate (m_h) [kg/s]
1.5
! Hot Specific Heat ($C_{p,h}$) [J/kg-K]
4180.0
! Cold Fluid Mass Flow Rate (m_c) [kg/s]
2.0
! Cold Specific Heat ($C_{p,c}$) [J/kg-K]
4180.0
! Overall Heat Transfer Coefficient ($U$) [W/m²-K]
800.0