💻 Fortran Source Code Library

We currently offer 172 open-source, production-grade Fortran codes for offline testing. Run calculations locally on your own machine, view code structure, read technical explanations, and download compilation packages including sample input files.

Flow Across Banks of Tubes

Core Numerical Engine in Fortran 90 • 22 total downloads

tube_banks.f90
! =========================================================================
! Source File: tube_banks.f90
! =========================================================================

program tube_banks
  implicit none
  double precision :: D,ST,SL,V,Tinf,Ts,rho,mu,k,Pr,cp
  double precision :: Vmax,AT,AD,SD2,Re_max,Nu,h,dP_row,dP
  double precision :: C1,m1,C2,Vs,Res,Nus,hs,dPs
  double precision :: STD,SLD,chi,f_z
  double precision :: C2_tab(8),N_tab(8)
  integer :: config,Nrows,ftype,i,j
  data N_tab/1d0,2d0,3d0,5d0,7d0,10d0,13d0,20d0/
  data C2_tab/0.64d0,0.76d0,0.84d0,0.92d0,0.95d0,0.97d0,0.99d0,1.0d0/
  read(*,*) config
  read(*,*) Nrows
  read(*,*) D
  read(*,*) ST
  read(*,*) SL
  read(*,*) V
  read(*,*) Tinf
  read(*,*) Ts
  read(*,*) ftype
  read(*,*) rho,mu,k,Pr,cp
  if(ftype==1) then; rho=1.177d0; mu=1.85d-5; k=0.0263d0; Pr=0.71d0; cp=1007d0
  elseif(ftype==2) then; rho=997d0; mu=8.9d-4; k=0.613d0; Pr=6.13d0; cp=4180d0
  elseif(ftype==3) then; rho=870d0; mu=0.05d0; k=0.14d0; Pr=500d0; cp=2000d0
  endif
  STD = ST/D; SLD = SL/D
  AT = ST - D
  if(config==1) then
    Vmax = V * ST / AT
  else
    SD2 = sqrt(SL*SL + (ST/2d0)*(ST/2d0))
    AD = SD2 - D
    if(AD < AT) then
      Vmax = V * ST / (2d0*AD)
    else
      Vmax = V * ST / AT
    endif
  endif
  Re_max = rho*Vmax*D/mu
  ! Zukauskas C1,m
  if(config==1) then
    if(Re_max<100d0) then; C1=0.9d0; m1=0.4d0
    elseif(Re_max<1000d0) then; C1=0.52d0; m1=0.5d0
    elseif(Re_max<2d5) then; C1=0.27d0; m1=0.63d0
    else; C1=0.033d0; m1=0.8d0; endif
  else
    if(Re_max<500d0) then; C1=1.04d0; m1=0.4d0
    elseif(Re_max<1000d0) then; C1=0.71d0; m1=0.5d0
    elseif(Re_max<2d5) then; C1=0.35d0; m1=0.6d0
    else; C1=0.031d0; m1=0.8d0; endif
  endif
  ! Row correction C2
  C2 = 1.0d0
  if(Nrows < 20) then
    do j=1,7
      if(dble(Nrows)>=N_tab(j) .and. dble(Nrows)<N_tab(j+1)) then
        C2 = C2_tab(j) + (C2_tab(j+1)-C2_tab(j)) &
           *(dble(Nrows)-N_tab(j))/(N_tab(j+1)-N_tab(j))
        exit
      endif
    enddo
    if(Nrows<=1) C2=C2_tab(1)
  endif
  Nu = C1 * C2 * Re_max**m1 * Pr**0.36d0
  h = Nu * k / D
  ! Pressure drop (simplified Zukauskas)
  chi = 1.0d0
  if(config==1) then
    f_z = (0.25d0 + 0.1175d0/(STD-1d0)**1.08d0) * Re_max**(-0.16d0)
  else
    f_z = (0.25d0 + 0.1372d0/(STD-1d0)**1.13d0) * Re_max**(-0.16d0)
  endif
  dP_row = chi * f_z * rho * Vmax*Vmax / 2d0
  dP = dble(Nrows) * dP_row

  write(*,'(A)') '============================================'
  write(*,'(A)') '  FLOW ACROSS BANKS OF TUBES'
  write(*,'(A)') '============================================'
  write(*,'(A)') ''
  write(*,'(A)') '--- INPUTS ---'
  if(config==1) then
    write(*,'(A)') '  Configuration           = INLINE'
  else
    write(*,'(A)') '  Configuration           = STAGGERED'
  endif
  write(*,'(A,I6)')       '  Number of Rows N        = ',Nrows
  write(*,'(A,F10.4,A)')  '  Tube Diameter D         = ',D,' m'
  write(*,'(A,F10.4,A)')  '  Transverse Pitch S_T    = ',ST,' m'
  write(*,'(A,F10.4,A)')  '  Longitudinal Pitch S_L  = ',SL,' m'
  write(*,'(A,F10.3,A)')  '  Approach Velocity V     = ',V,' m/s'
  write(*,'(A,F10.2,A)')  '  T_inf                   = ',Tinf,' C'
  write(*,'(A,F10.2,A)')  '  T_surface               = ',Ts,' C'
  write(*,'(A)') ''
  write(*,'(A)') '--- GEOMETRY ---'
  write(*,'(A,F8.3)')     '  S_T / D                 = ',STD
  write(*,'(A,F8.3)')     '  S_L / D                 = ',SLD
  write(*,'(A,F10.3,A)')  '  Maximum Velocity V_max  = ',Vmax,' m/s'
  write(*,'(A)') ''
  write(*,'(A)') '--- RESULTS ---'
  write(*,'(A,ES14.4)')   '  Reynolds Re_max         = ',Re_max
  write(*,'(A,F10.4)')    '  C1 (Zukauskas)          = ',C1
  write(*,'(A,F10.4)')    '  m  (Zukauskas)          = ',m1
  write(*,'(A,F10.4)')    '  C2 (row correction)     = ',C2
  write(*,'(A,F12.2)')    '  Nusselt Number Nu       = ',Nu
  write(*,'(A,F12.4,A)')  '  Convection Coeff h      = ',h,' W/m2K'
  write(*,'(A,F12.2,A)')  '  Pressure Drop dP        = ',dP,' Pa'
  write(*,'(A,F12.2,A)')  '  dP per row              = ',dP_row,' Pa'
  write(*,'(A)') ''
  write(*,'(A)') '--- VELOCITY SWEEP ---'
  write(*,'(A)') '  V[m/s]   Vmax[m/s]  Re_max       Nu        h[W/m2K]  dP[Pa]'
  write(*,'(A)') '  -----------------------------------------------------------------'
  do i=1,25
    Vs = 0.5d0 + (V*4d0-0.5d0)*dble(i-1)/24d0
    if(config==1) then
      Res = rho*Vs*ST/AT*D/mu
    else
      if(AD<AT) then
        Res = rho*Vs*ST/(2d0*AD)*D/mu
      else
        Res = rho*Vs*ST/AT*D/mu
      endif
    endif
    if(config==1) then
      if(Res<100d0) then; C1=0.9d0;m1=0.4d0
      elseif(Res<1000d0) then; C1=0.52d0;m1=0.5d0
      elseif(Res<2d5) then; C1=0.27d0;m1=0.63d0
      else; C1=0.033d0;m1=0.8d0; endif
    else
      if(Res<500d0) then; C1=1.04d0;m1=0.4d0
      elseif(Res<1000d0) then; C1=0.71d0;m1=0.5d0
      elseif(Res<2d5) then; C1=0.35d0;m1=0.6d0
      else; C1=0.031d0;m1=0.8d0; endif
    endif
    Nus = C1*C2*Res**m1*Pr**0.36d0
    hs = Nus*k/D
    if(config==1) then
      dPs=dble(Nrows)*(0.25d0+0.1175d0/(STD-1d0)**1.08d0)*Res**(-0.16d0)*rho*(Vs*ST/AT)**2/2d0
    else
      dPs=dble(Nrows)*(0.25d0+0.1372d0/(STD-1d0)**1.13d0)*Res**(-0.16d0)*rho*(Vs*ST/AT)**2/2d0
    endif
    write(*,'(2X,F7.2,3X,F8.2,3X,ES10.3,2X,F9.2,2X,F10.3,2X,F10.2)') &
      Vs,Vs*ST/AT,Res,Nus,hs,dPs
  enddo
  write(*,'(A)') ''
  write(*,'(A)') '--- CORRELATIONS ---'
  write(*,'(A)') '  Zukauskas: Nu = C1*C2*Re_max^m * Pr^0.36 * (Pr/Pr_s)^0.25'
  write(*,'(A)') '  Ref: Incropera Ch.7 Eq.7.58, Kothandaraman Ch.8 Sec.8.6'
end program tube_banks


Solver Description

Models cross-flow convection and pressure drop across tube bundles (aligned or staggered configurations). Computes average heat transfer coefficients using Zukauskas correlation with row-count and pitch ratio corrections.

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 -O3 tube_banks.f90 -o tube_banks

Execution Command:

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

tube_banks < input.txt

📥 Downloads & Local Files

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

! Configuration (1=Inline, 2=Staggered)
1
! Number of tube rows Nr
10
! Tube outer diameter D [m]
0.025
! Transverse pitch St [m]
0.05
! Longitudinal pitch Sl [m]
0.05
! Inlet velocity V [m/s]
5.0
! Inlet fluid temperature Tinf [C]
25.0
! Tube surface temperature Ts [C]
100.0
! Fluid type (1=Air, 2=Water, 3=Oil)
1