💻 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.

Turbulent Prandtl Number Solver

Core Numerical Engine in Fortran 90 • 29 total downloads

turbulent_prandtl.f90
! =========================================================================
! Source File: turbulent_prandtl.f90
! =========================================================================

program turbulent_prandtl
    implicit none
    double precision :: nu_t, alpha_t_in, Pr_t_in
    double precision :: rho, mu, cp_val, k_cond, U_mean, dTdy, dudy
    double precision :: nu, alpha_mol, Pr_mol
    double precision :: Pr_t, alpha_t, nut_ratio
    double precision :: Pr_t_KC, Pr_t_JR, Pr_t_K94, Pr_t_RA, Pr_t_Ceb, Pr_t_const
    double precision :: q_lam, q_turb, q_total, k_eff, keff_ratio
    double precision :: ra_factor
    double precision :: x, arg
    integer :: i, n_pts, ios

    double precision :: nr, p1, p2, p3, p4, p5, p6, ker, ar

    read(*,*,iostat=ios) nu_t;       if(ios/=0)then;write(*,*)'ERROR: Invalid nu_t.';stop;end if
    read(*,*,iostat=ios) alpha_t_in;  if(ios/=0)then;write(*,*)'ERROR: Invalid alpha_t.';stop;end if
    read(*,*,iostat=ios) Pr_t_in;     if(ios/=0)then;write(*,*)'ERROR: Invalid Pr_t.';stop;end if
    read(*,*,iostat=ios) rho;         if(ios/=0)then;write(*,*)'ERROR: Invalid rho.';stop;end if
    read(*,*,iostat=ios) mu;          if(ios/=0)then;write(*,*)'ERROR: Invalid mu.';stop;end if
    read(*,*,iostat=ios) cp_val;      if(ios/=0)then;write(*,*)'ERROR: Invalid cp.';stop;end if
    read(*,*,iostat=ios) k_cond;      if(ios/=0)then;write(*,*)'ERROR: Invalid k_cond.';stop;end if
    read(*,*,iostat=ios) U_mean;      if(ios/=0)then;write(*,*)'ERROR: Invalid U_mean.';stop;end if
    read(*,*,iostat=ios) dTdy;        if(ios/=0)then;write(*,*)'ERROR: Invalid dTdy.';stop;end if
    read(*,*,iostat=ios) dudy;        if(ios/=0)then;write(*,*)'ERROR: Invalid dudy.';stop;end if

    if(nu_t<=0d0)then;write(*,*)'ERROR: nu_t must be > 0.';stop;end if
    if(rho<=0d0)then;write(*,*)'ERROR: rho must be > 0.';stop;end if
    if(mu<=0d0)then;write(*,*)'ERROR: mu must be > 0.';stop;end if
    if(cp_val<=0d0)then;write(*,*)'ERROR: cp must be > 0.';stop;end if
    if(k_cond<=0d0)then;write(*,*)'ERROR: k_cond must be > 0.';stop;end if

    nu = mu / rho
    alpha_mol = k_cond / (rho * cp_val)
    Pr_mol = nu / alpha_mol

    nut_ratio = nu_t / nu

    ! Determine Pr_t and alpha_t
    if (Pr_t_in > 0d0) then
        Pr_t = Pr_t_in
        alpha_t = nu_t / Pr_t
    else if (alpha_t_in > 0d0) then
        alpha_t = alpha_t_in
        Pr_t = nu_t / alpha_t
    else
        Pr_t = 0.85d0
        alpha_t = nu_t / Pr_t
    end if

    ! 6 correlations for Pr_t
    ! 1. Kays & Crawford (simplified)
    x = nut_ratio
    if (x > 0.1d0) then
        arg = 5.165d0 / x
        if (arg > 500d0) arg = 500d0
        Pr_t_KC = 1d0 / (0.5882d0 + 0.228d0*x - 0.0441d0*x*x*(1d0-exp(-arg)))
        if (Pr_t_KC < 0.5d0) Pr_t_KC = 0.85d0
        if (Pr_t_KC > 3.0d0) Pr_t_KC = 0.85d0
    else
        Pr_t_KC = 0.85d0
    end if

    ! 2. Jischa & Rieke (1979): Pr_t = 0.85 + 0.015/Pr
    Pr_t_JR = 0.85d0 + 0.015d0 / Pr_mol

    ! 3. Kays (1994): Pr_t = 0.85 + 0.7/(Pr*(nu_t/nu))
    if (Pr_mol * nut_ratio > 1d-10) then
        Pr_t_K94 = 0.85d0 + 0.7d0 / (Pr_mol * nut_ratio)
    else
        Pr_t_K94 = 0.85d0
    end if

    ! 4. Reynolds analogy: Pr_t = 1.0
    Pr_t_RA = 1.0d0

    ! 5. Cebeci: near wall ~1.0, outer ~0.9 (average)
    Pr_t_Ceb = 0.9d0

    ! 6. Constant = 0.85 (standard CFD default)
    Pr_t_const = 0.85d0

    ! Heat transfer
    q_lam  = -k_cond * dTdy
    q_turb = -rho * cp_val * alpha_t * dTdy
    q_total = q_lam + q_turb
    k_eff = k_cond + rho * cp_val * alpha_t
    keff_ratio = k_eff / k_cond

    ! Reynolds analogy factor
    if (Pr_t > 0d0) then
        ra_factor = 1d0 / Pr_t
    else
        ra_factor = 1d0
    end if

    ! Output
    write(*,'(A)') '============================================================'
    write(*,'(A)') '   TURBULENT PRANDTL NUMBER (Pr_t) CALCULATOR'
    write(*,'(A)') '============================================================'
    write(*,*)

    write(*,'(A)') '--- INPUT CONDITIONS ----------------------------------------'
    write(*,'(A,ES14.6,A)') '  nu_t (eddy viscosity)   = ', nu_t, ' m2/s'
    write(*,'(A,ES14.6,A)') '  Density (rho)           = ', rho, ' kg/m3'
    write(*,'(A,ES14.6,A)') '  Dyn. Viscosity (mu)     = ', mu, ' Pa.s'
    write(*,'(A,F12.4,A)')  '  Spec. Heat (cp)         = ', cp_val, ' J/kg.K'
    write(*,'(A,F12.6,A)')  '  Conductivity (k)        = ', k_cond, ' W/m.K'
    write(*,'(A,F12.4,A)')  '  U_mean                  = ', U_mean, ' m/s'
    write(*,'(A,F12.4,A)')  '  dT/dy                   = ', dTdy, ' K/m'
    write(*,'(A,F12.4,A)')  '  du/dy                   = ', dudy, ' 1/s'
    write(*,*)

    write(*,'(A)') '--- MOLECULAR PROPERTIES ------------------------------------'
    write(*,'(A,ES14.6,A)') '  Kinematic Visc (nu)     = ', nu, ' m2/s'
    write(*,'(A,ES14.6,A)') '  Thermal Diffus (alpha)  = ', alpha_mol, ' m2/s'
    write(*,'(A,F12.4)')    '  Prandtl Number (Pr)     = ', Pr_mol
    write(*,'(A,F14.4)')    '  nu_t / nu               = ', nut_ratio
    write(*,*)

    write(*,'(A)') '--- TURBULENT PRANDTL NUMBER --------------------------------'
    write(*,'(A,F12.6)')    '  Pr_t (used)             = ', Pr_t
    write(*,'(A,ES14.6,A)') '  alpha_t = nu_t/Pr_t     = ', alpha_t, ' m2/s'
    write(*,'(A,F12.4)')    '  alpha_t / alpha          = ', alpha_t / alpha_mol
    write(*,*)

    write(*,'(A)') '--- Pr_t CORRELATIONS (6 models) ----------------------------'
    write(*,'(A,F12.6)')    '  Kays-Crawford           = ', Pr_t_KC
    write(*,'(A,F12.6)')    '  Jischa-Rieke            = ', Pr_t_JR
    write(*,'(A,F12.6)')    '  Kays (1994)             = ', Pr_t_K94
    write(*,'(A,F12.6)')    '  Reynolds analogy         = ', Pr_t_RA
    write(*,'(A,F12.6)')    '  Cebeci                  = ', Pr_t_Ceb
    write(*,'(A,F12.6)')    '  Constant (default)      = ', Pr_t_const
    write(*,*)

    write(*,'(A)') '--- HEAT TRANSFER -------------------------------------------'
    write(*,'(A,ES14.6,A)') '  q_laminar               = ', q_lam, ' W/m2'
    write(*,'(A,ES14.6,A)') '  q_turbulent             = ', q_turb, ' W/m2'
    write(*,'(A,ES14.6,A)') '  q_total                 = ', q_total, ' W/m2'
    write(*,'(A,ES14.6,A)') '  k_eff (effective cond)  = ', k_eff, ' W/m.K'
    write(*,'(A,F14.4)')    '  k_eff / k               = ', keff_ratio
    write(*,*)

    write(*,'(A)') '--- REYNOLDS ANALOGY ----------------------------------------'
    write(*,'(A,F12.6)')    '  2*St/Cf = 1/Pr_t        = ', ra_factor
    if (abs(ra_factor - 1d0) < 0.05d0) then
        write(*,'(A)')      '  Status: FULL REYNOLDS ANALOGY (Pr_t ~ 1)'
    else
        write(*,'(A)')      '  Status: MODIFIED REYNOLDS ANALOGY'
    end if
    write(*,*)

    ! Profile sweep
    write(*,'(A)') '--- PROFILE vs nu_t/nu --------------------------------------'
    write(*,'(A)') '  nut/nu    Pr_t(KC)    Pr_t(JR)    Pr_t(K94)   keff/k      at/a'
    write(*,'(A)') '  ------------------------------------------------------------------'

    n_pts = 40
    do i = 1, n_pts
        nr = 1d0 + (999d0) * dble(i-1) / dble(n_pts-1)

        ! KC
        if (nr > 0.1d0) then
            arg = 5.165d0 / nr
            if (arg > 500d0) arg = 500d0
            p1 = 1d0 / (0.5882d0 + 0.228d0*nr - 0.0441d0*nr*nr*(1d0-exp(-arg)))
            if (p1 < 0.5d0 .or. p1 > 3d0) p1 = 0.85d0
        else
            p1 = 0.85d0
        end if

        ! JR
        p2 = 0.85d0 + 0.015d0 / Pr_mol

        ! K94
        if (Pr_mol * nr > 1d-10) then
            p3 = 0.85d0 + 0.7d0 / (Pr_mol * nr)
        else
            p3 = 0.85d0
        end if

        ! k_eff/k
        ker = 1d0 + Pr_mol * nr / p1

        ! alpha_t / alpha
        ar = nr / p1

        write(*,'(F10.2,2X,F10.4,2X,F10.4,2X,F10.4,2X,F10.2,2X,F10.2)') &
            nr, p1, p2, p3, ker, ar
    end do

    write(*,*)
    write(*,'(A)') '--- EQUATIONS USED ------------------------------------------'
    write(*,'(A)') '  Pr_t = nu_t / alpha_t = epsilon_m / epsilon_H'
    write(*,'(A)') '  Jischa-Rieke: Pr_t = 0.85 + 0.015/Pr'
    write(*,'(A)') '  Kays (1994): Pr_t = 0.85 + 0.7/(Pr*nu_t/nu)'
    write(*,'(A)') '  k_eff = k * (1 + Pr*nu_t/(Pr_t*nu))'
    write(*,'(A)') '  q_turb = -rho*cp*alpha_t*dT/dy'
    write(*,'(A)') '  2*St/Cf = 1/Pr_t  (Reynolds analogy)'
    write(*,'(A)') '============================================================'

end program turbulent_prandtl


Solver Description

Calculate turbulent Prandtl number (Prt) profiles and eddy diffusivity ratios for heat transfer closure.

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 turbulent_prandtl.f90 -o turbulent_prandtl

Execution Command:

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

turbulent_prandtl < input.txt

📥 Downloads & Local Files

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

! nut_i\nat_i\nprt_i\n[kg/m]\n[Pas]\ncp [J/kgK]\nk_i\nU_i\ndT_i\ndu_i
5e-3
! Parameter 2
0
! Parameter 3
0
! Parameter 4
1.225
! Parameter 5
1.789e-5
! Parameter 6
1006
! Parameter 7
0.0262
! Parameter 8
30
! Parameter 9
100
! Parameter 10
500