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

Kolmogorov Turbulence Scales

Core Numerical Engine in Fortran 90 • 28 total downloads

kolmogorov_scales.f90
! =========================================================================
! Source File: kolmogorov_scales.f90
! =========================================================================

program kolmogorov_scales
    implicit none
    double precision, parameter :: C_mu = 0.09d0, C_K = 1.5d0

    double precision :: eps_in, nu_in, rho, mu, k_tke, U_mean, L_dom
    double precision :: nu, eps, u_rms
    double precision :: eta, tau_eta, u_eta
    double precision :: lam_g, lam_iso, Re_lam
    double precision :: L_int, T_int, u_int
    double precision :: L_eta, L_lam, lam_eta
    double precision :: Re_L, Re_dom
    double precision :: N_grid, N_time, E_L, E_eta
    integer :: i, n_pts, ios
    double precision :: ec, etc, ttc, lmc, Lc, rlc, nc

    read(*,*,iostat=ios) eps_in;  if(ios/=0)then;write(*,*)'ERROR: Invalid epsilon.';stop;end if
    read(*,*,iostat=ios) nu_in;   if(ios/=0)then;write(*,*)'ERROR: Invalid nu.';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) k_tke;   if(ios/=0)then;write(*,*)'ERROR: Invalid k.';stop;end if
    read(*,*,iostat=ios) U_mean;  if(ios/=0)then;write(*,*)'ERROR: Invalid U_mean.';stop;end if
    read(*,*,iostat=ios) L_dom;   if(ios/=0)then;write(*,*)'ERROR: Invalid L_domain.';stop;end if

    if(eps_in<=0d0)then;write(*,*)'ERROR: epsilon must be > 0.';stop;end if
    if(k_tke<=0d0)then;write(*,*)'ERROR: k must be > 0.';stop;end if

    if (nu_in > 0d0) then
        nu = nu_in
    else
        if(rho<=0d0.or.mu<=0d0)then;write(*,*)'ERROR: Need nu>0 or rho,mu>0.';stop;end if
        nu = mu / rho
    end if
    eps = eps_in

    ! Kolmogorov scales
    eta     = (nu**3 / eps)**0.25d0
    tau_eta = sqrt(nu / eps)
    u_eta   = (nu * eps)**0.25d0

    ! RMS velocity
    u_rms = sqrt(2d0 * k_tke / 3d0)

    ! Taylor microscale
    lam_g   = sqrt(10d0 * nu * k_tke / eps)
    lam_iso = sqrt(15d0 * nu * u_rms**2 / eps)
    Re_lam  = u_rms * lam_g / nu

    ! Integral scales
    L_int = k_tke**1.5d0 / eps
    T_int = k_tke / eps
    u_int = u_rms

    ! Scale ratios
    L_eta   = L_int / eta
    L_lam   = L_int / lam_g
    lam_eta = lam_g / eta

    ! Reynolds numbers
    Re_L   = u_rms * L_int / nu
    if (L_dom > 0d0 .and. U_mean > 0d0) then
        Re_dom = U_mean * L_dom / nu
    else
        Re_dom = 0d0
    end if

    ! DNS estimation
    N_grid = L_eta**3
    N_time = T_int / tau_eta

    ! Energy
    E_L  = u_rms**2
    E_eta = sqrt(nu * eps)

    ! Output
    write(*,'(A)') '============================================================'
    write(*,'(A)') '   KOLMOGOROV SCALES CALCULATOR'
    write(*,'(A)') '============================================================'
    write(*,*)

    write(*,'(A)') '--- INPUT CONDITIONS ----------------------------------------'
    write(*,'(A,ES14.6,A)') '  epsilon (dissipation)   = ', eps, ' m2/s3'
    write(*,'(A,ES14.6,A)') '  Kinematic Visc (nu)     = ', nu, ' m2/s'
    write(*,'(A,ES14.6,A)') '  k (TKE)                 = ', k_tke, ' m2/s2'
    write(*,'(A,F12.4,A)')  '  u_rms = sqrt(2k/3)      = ', u_rms, ' m/s'
    write(*,'(A,F12.4,A)')  '  U_mean                  = ', U_mean, ' m/s'
    write(*,'(A,F12.4,A)')  '  L_domain                = ', L_dom, ' m'
    write(*,*)

    write(*,'(A)') '--- KOLMOGOROV SCALES (smallest) ----------------------------'
    write(*,'(A,ES14.6,A)') '  eta (length)            = ', eta, ' m'
    write(*,'(A,ES14.6,A)') '  tau_eta (time)          = ', tau_eta, ' s'
    write(*,'(A,ES14.6,A)') '  u_eta (velocity)        = ', u_eta, ' m/s'
    write(*,'(A,F12.4)')    '  Re_eta (= 1 by def.)    = ', u_eta * eta / nu
    write(*,*)

    write(*,'(A)') '--- TAYLOR MICROSCALE ---------------------------------------'
    write(*,'(A,ES14.6,A)') '  lambda (general)        = ', lam_g, ' m'
    write(*,'(A,ES14.6,A)') '  lambda (isotropic)      = ', lam_iso, ' m'
    write(*,'(A,F14.4)')    '  Re_lambda               = ', Re_lam
    write(*,*)

    write(*,'(A)') '--- INTEGRAL SCALES (largest) -------------------------------'
    write(*,'(A,ES14.6,A)') '  L_int = k^3/2 / eps     = ', L_int, ' m'
    write(*,'(A,ES14.6,A)') '  T_int = k / eps          = ', T_int, ' s'
    write(*,'(A,F12.6,A)')  '  u_int ~ u_rms           = ', u_int, ' m/s'
    write(*,*)

    write(*,'(A)') '--- SCALE RATIOS --------------------------------------------'
    write(*,'(A,ES14.6)')   '  L / eta                 = ', L_eta
    write(*,'(A,F14.4)')    '  L / lambda              = ', L_lam
    write(*,'(A,F14.4)')    '  lambda / eta             = ', lam_eta
    write(*,'(A,ES14.6)')   '  T_int / tau_eta          = ', T_int / tau_eta
    write(*,'(A,F14.4)')    '  u_int / u_eta            = ', u_int / u_eta
    write(*,*)

    write(*,'(A)') '--- REYNOLDS NUMBERS ----------------------------------------'
    write(*,'(A,ES14.6)')   '  Re_L = u_rms*L/nu       = ', Re_L
    write(*,'(A,F14.4)')    '  Re_lambda               = ', Re_lam
    write(*,'(A,ES14.6)')   '  Re_domain               = ', Re_dom
    write(*,*)

    write(*,'(A)') '--- DNS ESTIMATION ------------------------------------------'
    write(*,'(A,ES14.6)')   '  N_grid ~ (L/eta)^3      = ', N_grid
    write(*,'(A,F14.2)')    '  (L/eta)^(1/3) per dim   = ', L_eta
    write(*,'(A,ES14.6)')   '  N_timesteps ~ T/tau_eta  = ', T_int / tau_eta
    write(*,'(A,ES14.6)')   '  Total cost ~ N*Nt       = ', N_grid * T_int / tau_eta
    write(*,*)

    write(*,'(A)') '--- ENERGY CASCADE ------------------------------------------'
    write(*,'(A,ES14.6,A)') '  E_L ~ u_rms^2           = ', E_L, ' m2/s2'
    write(*,'(A,ES14.6,A)') '  E_eta ~ sqrt(nu*eps)    = ', E_eta, ' m2/s2'
    write(*,'(A,F12.4)')    '  Kolmogorov constant C_K  = ', C_K
    write(*,'(A)')          '  E(kappa) = C_K * eps^(2/3) * kappa^(-5/3)'
    write(*,*)

    ! Profile
    write(*,'(A)') '--- PROFILE vs DISSIPATION RATE -----------------------------'
    write(*,'(A)') '  epsilon      eta          tau_eta      lambda       L_int        Re_lam      (L/eta)'
    write(*,'(A)') '  ---------------------------------------------------------------------------------'

    n_pts = 40
    do i = 1, n_pts
        ec = eps / 100d0 * 10d0**(3d0 * dble(i-1) / dble(n_pts-1))
        etc = (nu**3 / ec)**0.25d0
        ttc = sqrt(nu / ec)
        lmc = sqrt(10d0 * nu * k_tke / ec)
        Lc  = k_tke**1.5d0 / ec
        rlc = u_rms * lmc / nu
        nc  = Lc / etc

        write(*,'(ES12.4,2X,ES12.4,2X,ES12.4,2X,ES12.4,2X,ES12.4,2X,F10.2,2X,ES12.4)') &
            ec, etc, ttc, lmc, Lc, rlc, nc
    end do

    write(*,*)
    write(*,'(A)') '--- EQUATIONS USED ------------------------------------------'
    write(*,'(A)') "  eta = (nu^3/eps)^(1/4)     (Kolmogorov length)"
    write(*,'(A)') "  tau_eta = (nu/eps)^(1/2)   (Kolmogorov time)"
    write(*,'(A)') "  u_eta = (nu*eps)^(1/4)     (Kolmogorov velocity)"
    write(*,'(A)') "  lambda = sqrt(10*nu*k/eps)  (Taylor microscale)"
    write(*,'(A)') "  L = k^(3/2) / eps           (integral scale)"
    write(*,'(A)') "  Re_lambda = u_rms*lambda/nu"
    write(*,'(A)') "  N_dns ~ (L/eta)^3 ~ Re_L^(9/4)"
    write(*,'(A)') '============================================================'

end program kolmogorov_scales


Solver Description

Compute Kolmogorov length, time, and velocity scales for direct numerical simulation (DNS) mesh grids.

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

Execution Command:

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

kolmogorov_scales < input.txt

📥 Downloads & Local Files

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

! eps_i\n[m/s]\n[kg/m]\n[Pas]\nk [m/s]\nU_i\nL_i
100
! Parameter 2
0
! Parameter 3
1.225
! Parameter 4
1.789e-5
! Parameter 5
2.5
! Parameter 6
30
! Parameter 7
0.5