πŸ’» 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.

Moody Diagram Explorer

Core Numerical Engine in Fortran 90 β€’ 29 total downloads

moody_diagram.f90
! =========================================================================
! Source File: moody_diagram.f90
! =========================================================================

program moody_diagram
    implicit none
    integer :: i, iostat_val
    double precision :: Re, epsD, D, rho, mu, f_cw, f_sj, V, dPperL, nu
    double precision :: re_i, f_lam_i, f_cw_i, f_smooth_i
    character(len=80) :: regime

    read(*,*,iostat=iostat_val) Re
    if (iostat_val /= 0) then
        write(*,*) 'ERROR: Invalid Reynolds number input.'
        stop
    end if
    read(*,*,iostat=iostat_val) epsD
    read(*,*,iostat=iostat_val) D
    read(*,*,iostat=iostat_val) rho
    read(*,*,iostat=iostat_val) mu
    if (iostat_val /= 0) then
        write(*,*) 'ERROR: Failed to read all Moody diagram inputs.'
        stop
    end if
    if (Re <= 0.0d0) then
        write(*,*) 'ERROR: Reynolds number must be positive.'
        stop
    end if
    if (epsD < 0.0d0) then
        write(*,*) 'ERROR: Relative roughness cannot be negative.'
        stop
    end if

    if (Re < 2300.0d0) then
        f_cw = 64.0d0/Re
        f_sj = f_cw
        regime = 'Laminar flow (Re < 2300)'
    else if (Re < 4000.0d0) then
        f_cw = colebrook_solve(Re, epsD)
        f_sj = swamee_jain(Re, epsD)
        regime = 'Transition zone (2300 < Re < 4000)'
    else
        f_cw = colebrook_solve(Re, epsD)
        f_sj = swamee_jain(Re, epsD)
        if (epsD < 1.0d-8) then
            regime = 'Turbulent - hydraulically smooth'
        else
            regime = 'Turbulent - rough wall'
        end if
    end if

    V = 0.0d0
    dPperL = 0.0d0
    if (D > 0.0d0 .and. rho > 0.0d0 .and. mu > 0.0d0) then
        nu = mu/rho
        V = Re*nu/D
        dPperL = f_cw*rho*V*V/(2.0d0*D)
    end if

    write(*,'(A)') '============================================================'
    write(*,'(A)') '   MOODY DIAGRAM EXPLORER ENGINE'
    write(*,'(A)') '============================================================'
    write(*,*)
    write(*,'(A)') '--- OPERATING POINT -----------------------------------------'
    write(*,'(A,ES12.4)')   '  Reynolds Number          = ', Re
    write(*,'(A,ES12.4)')   '  Relative Roughness       = ', epsD
    write(*,'(A,A)')        '  Flow Regime              = ', trim(regime)
    write(*,*)
    write(*,'(A)') '--- FRICTION FACTOR RESULTS ---------------------------------'
    write(*,'(A,ES12.6)')   '  Colebrook-White f        = ', f_cw
    write(*,'(A,ES12.6)')   '  Swamee-Jain f            = ', f_sj
    if (f_cw > 0.0d0) then
        write(*,'(A,ES12.4,A)') '  Swamee-Jain Error        = ', &
            abs(f_sj-f_cw)/f_cw*100.0d0, ' percent'
    end if
    write(*,*)
    write(*,'(A)') '--- PIPE FLOW ESTIMATES -------------------------------------'
    write(*,'(A,ES12.4,A)') '  Pipe Diameter            = ', D, ' m'
    write(*,'(A,ES12.4,A)') '  Fluid Density            = ', rho, ' kg/m3'
    write(*,'(A,ES12.4,A)') '  Dynamic Viscosity        = ', mu, ' Pa.s'
    write(*,'(A,ES12.4,A)') '  Bulk Velocity            = ', V, ' m/s'
    write(*,'(A,ES12.4,A)') '  Pressure Drop per Length = ', dPperL, ' Pa/m'
    write(*,*)

    write(*,'(A)') '--- MOODY CURVE DATA ----------------------------------------'
    write(*,'(A)') '  Re             f_laminar     f_colebrook   f_smooth'
    write(*,'(A)') '  ----------------------------------------------------------'
    do i=1,200
        re_i = 500.0d0 * (1.0d8/500.0d0)**(dble(i-1)/199.0d0)
        if (re_i < 2300.0d0) then
            f_lam_i = 64.0d0/re_i
            f_cw_i = 0.0d0
            f_smooth_i = 0.0d0
        else
            f_lam_i = 0.0d0
            f_cw_i = colebrook_solve(re_i, epsD)
            f_smooth_i = colebrook_solve(re_i, 0.0d0)
        end if
        write(*,'(ES12.4,2X,ES12.4,2X,ES12.4,2X,ES12.4)') &
            re_i, f_lam_i, f_cw_i, f_smooth_i
    end do
    write(*,*)
    write(*,'(A)') '--- CORRELATIONS USED ---------------------------------------'
    write(*,'(A)') '  Colebrook-White: 1/sqrt(f) = -2 log10(epsD/3.7 + 2.51/(Re*sqrt(f))).'
    write(*,'(A)') '  Swamee-Jain: f = 0.25/[log10(epsD/3.7 + 5.74/Re^0.9)]^2.'
    write(*,'(A)') '  Laminar: f = 64/Re.'

contains
    double precision function colebrook_solve(Re_in, eD)
        implicit none
        double precision, intent(in) :: Re_in, eD
        integer :: it
        double precision :: f, rhs
        f = swamee_jain(Re_in, eD)
        do it=1,80
            rhs = -2.0d0*log10(eD/3.7d0 + 2.51d0/(Re_in*sqrt(f)))
            f = 1.0d0/(rhs*rhs)
        end do
        colebrook_solve = f
    end function colebrook_solve

    double precision function swamee_jain(Re_in, eD)
        implicit none
        double precision, intent(in) :: Re_in, eD
        double precision :: v
        v = log10(eD/3.7d0 + 5.74d0/(Re_in**0.9d0))
        swamee_jain = 0.25d0/(v*v)
    end function swamee_jain
end program moody_diagram

Solver Description

Interactive Moody diagram. Compute Colebrook-White and Swamee-Jain friction factors, identify flow regimes, and plot custom operating points.

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

Execution Command:

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

moody_diagram < input.txt

πŸ“₯ Downloads & Local Files

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

! Reynolds Number Re\nRelative roughness Ρ/D\nPipe diameter D [m]\nFluid density ρ [kg/m³]\nDynamic viscosity μ [Pa·s]
0.0
! Parameter 2
0.0
! Parameter 3
0.0
! Parameter 4
0.0
! Parameter 5
0.0