π» 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.
Venturi & Nozzle Flow Meter
Core Numerical Engine in Fortran 90 β’ 22 total downloads
venturi_nozzle.f90
! =========================================================================
! Source File: venturi_nozzle.f90
! =========================================================================
program venturi_nozzle
implicit none
integer :: i, iter, iostat_val
double precision :: Dpipe, Dthroat, rho, mu, deltaP, gamma_exp, Cd_user
double precision :: beta, A2, E_approach, Cd, Q, mdot, V2, Re_D, Re_throat, nu
double precision :: Cd_prev, Q_prev, dP_i, Q_i, Re_i, Cd_i
double precision, parameter :: PI = 3.141592653589793d0
read(*,*,iostat=iostat_val) Dpipe
if (iostat_val /= 0) then
write(*,*) 'ERROR: Invalid pipe diameter input.'
stop
end if
read(*,*,iostat=iostat_val) Dthroat
read(*,*,iostat=iostat_val) rho
read(*,*,iostat=iostat_val) mu
read(*,*,iostat=iostat_val) deltaP
read(*,*,iostat=iostat_val) gamma_exp
read(*,*,iostat=iostat_val) Cd_user
if (iostat_val /= 0) then
write(*,*) 'ERROR: Failed to read all venturi inputs.'
stop
end if
if (Dpipe <= 0.0d0 .or. Dthroat <= 0.0d0) then
write(*,*) 'ERROR: Pipe and throat diameters must be positive.'
stop
end if
if (Dthroat >= Dpipe) then
write(*,*) 'ERROR: Throat diameter must be smaller than pipe diameter.'
stop
end if
if (rho <= 0.0d0 .or. mu <= 0.0d0 .or. deltaP < 0.0d0) then
write(*,*) 'ERROR: Density, viscosity must be positive; deltaP non-negative.'
stop
end if
if (gamma_exp <= 0.0d0 .or. gamma_exp > 1.0d0) gamma_exp = 1.0d0
beta = Dthroat / Dpipe
A2 = PI / 4.0d0 * Dthroat**2
E_approach = 1.0d0 / sqrt(1.0d0 - beta**4)
nu = mu / rho
! Iterate for Cd and Q
if (Cd_user > 0.01d0) then
Cd = Cd_user
else
Cd = 0.995d0
end if
do iter = 1, 100
Cd_prev = Cd
Q = Cd * gamma_exp * E_approach * A2 * sqrt(2.0d0 * deltaP / rho)
V2 = Q / A2
Re_D = rho * (Q / (PI/4.0d0*Dpipe**2)) * Dpipe / mu
Re_throat = rho * V2 * Dthroat / mu
if (Cd_user > 0.01d0) then
Cd = Cd_user
else
Cd = venturi_cd(Re_D, beta)
end if
if (abs(Cd - Cd_prev) < 1.0d-10) exit
end do
Q = Cd * gamma_exp * E_approach * A2 * sqrt(2.0d0 * deltaP / rho)
mdot = rho * Q
V2 = Q / A2
Re_D = rho * (Q / (PI/4.0d0*Dpipe**2)) * Dpipe / mu
Re_throat = rho * V2 * Dthroat / mu
write(*,'(A)') '============================================================'
write(*,'(A)') ' VENTURI & NOZZLE FLOW METER ENGINE'
write(*,'(A)') '============================================================'
write(*,*)
write(*,'(A)') '--- GEOMETRY ------------------------------------------------'
write(*,'(A,ES12.4,A)') ' Pipe Diameter = ', Dpipe, ' m'
write(*,'(A,ES12.4,A)') ' Throat Diameter = ', Dthroat, ' m'
write(*,'(A,ES12.4)') ' Beta Ratio = ', beta
write(*,'(A,ES12.4,A)') ' Throat Area = ', A2, ' m2'
write(*,'(A,ES12.4)') ' Approach Velocity Factor = ', E_approach
write(*,*)
write(*,'(A)') '--- FLOW RESULTS --------------------------------------------'
write(*,'(A,ES12.4)') ' Discharge Coefficient Cd = ', Cd
write(*,'(A,ES12.4)') ' Expansion Factor = ', gamma_exp
write(*,'(A,ES12.4,A)') ' Volume Flow Q = ', Q, ' m3/s'
write(*,'(A,ES12.4,A)') ' Mass Flow = ', mdot, ' kg/s'
write(*,'(A,ES12.4,A)') ' Throat Velocity = ', V2, ' m/s'
write(*,'(A,ES12.4)') ' Re (pipe) = ', Re_D
write(*,'(A,ES12.4)') ' Re (throat) = ', Re_throat
write(*,'(A,ES12.4,A)') ' Differential Pressure = ', deltaP, ' Pa'
write(*,*)
write(*,'(A)') '--- CD VS RE SWEEP ------------------------------------------'
write(*,'(A)') ' Re_D Cd'
write(*,'(A)') ' -------------------------------------------'
do i = 1, 50
Re_i = 1.0d3 * (1.0d7/1.0d3)**(dble(i-1)/49.0d0)
Cd_i = venturi_cd(Re_i, beta)
write(*,'(ES12.4,2X,ES12.4)') Re_i, Cd_i
end do
write(*,*)
write(*,'(A)') '--- Q VS DELTAP SWEEP ---------------------------------------'
write(*,'(A)') ' deltaP[Pa] Q[m3/s]'
write(*,'(A)') ' -------------------------------------------'
do i = 1, 40
dP_i = max(deltaP, 100.0d0) * 0.05d0 * dble(i)
Q_i = Cd * gamma_exp * E_approach * A2 * sqrt(2.0d0*dP_i/rho)
write(*,'(ES12.4,2X,ES12.4)') dP_i, Q_i
end do
write(*,*)
write(*,'(A)') '--- CORRELATIONS USED ---------------------------------------'
write(*,'(A)') ' Q = Cd * gamma * E * A2 * sqrt(2 deltaP / rho).'
write(*,'(A)') ' E = 1/sqrt(1 - beta^4); beta = D_throat/D_pipe.'
write(*,'(A)') ' Cd = simplified Reader-Harris/Gallagher for venturi.'
contains
double precision function venturi_cd(Re_in, beta_in)
implicit none
double precision, intent(in) :: Re_in, beta_in
! Simplified ISO 5167 venturi Cd correlation
double precision :: base
base = 0.9858d0 - 0.196d0 * beta_in**4.5d0
if (Re_in > 2.0d5) then
venturi_cd = base
else if (Re_in > 1.0d4) then
venturi_cd = base - 0.005d0 * (2.0d5 - Re_in) / 1.9d5
else
venturi_cd = base - 0.01d0
end if
if (venturi_cd < 0.90d0) venturi_cd = 0.90d0
if (venturi_cd > 1.00d0) venturi_cd = 1.00d0
end function venturi_cd
end program venturi_nozzle
Solver Description
Calculate volume and mass flow rates through venturi and nozzle meters using ISO 5167 correlations and differential pressure.
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 venturi_nozzle.f90 -o venturi_nozzle
Execution Command:
Execute the program by feeding the sample input file into the program using stdin redirection:
venturi_nozzle < input.txt
π₯ Downloads & Local Files
Preview of the required input file (input.txt):
! Pipe diameter D [m]\nThroat diameter d [m]\nDensity ΓΒ [kg/mΓΒ³]\nViscosity ΓΒΌ [PaΓΒ·s]\nPipe diameter D [m]\nExpansion factor ΓΒ³\nOverride Cd (0 = auto)
0.0
! Parameter 2
0.0
! Parameter 3
0.0
! Parameter 4
0.0
! Parameter 5
0.0
! Parameter 6
0.0
! Parameter 7
0.0
0.0
! Parameter 2
0.0
! Parameter 3
0.0
! Parameter 4
0.0
! Parameter 5
0.0
! Parameter 6
0.0
! Parameter 7
0.0