💻 Fortran Source Code Library
Run calculations locally on your own machine. View code structure, read technical explanations, and download compilation packages including sample input files.
Hydraulic Jump Conjugate Depth Solver
Core Numerical Engine in Fortran 90 • 0 total downloads
hydraulic_jump.f90
! =========================================================================
! Source File: hydraulic_jump.f90
! =========================================================================
! ============================================================
! ThermoFluidCalc — Hydraulic Jump Calculator
! Solve for conjugate state y2, energy loss, jump length, etc.
! Supports: rectangular horizontal channel
! ============================================================
program hydraulic_jump
implicit none
real(8), parameter :: g = 9.81d0
real(8), parameter :: PI = 3.141592653589793d0
real(8), parameter :: RHO = 1000.0d0
real(8), parameter :: NU = 1.0d-6
real(8) :: y1, b, flow_val, y2
integer :: input_mode
real(8) :: V1, V2, Q, q_width, Fr1, Fr2, E1, E2, h_L, efficiency
real(8) :: h_j, L_j, P_loss, Re1, Re2
character(len=20) :: mode_name, regime1, regime2
character(len=60) :: jump_class, energy_diss_desc
! Read inputs
read(*,*) y1 ! Upstream depth [m]
read(*,*) b ! Channel width [m]
read(*,*) input_mode ! 1 = Given V1, 2 = Given Q, 3 = Given Fr1
read(*,*) flow_val ! Flow rate parameter value
! Validate geometry
if (y1 <= 0.0d0 .or. b <= 0.0d0) then
write(*,'(A)') "ERROR: Upstream depth y1 and width b must be positive."
stop
end if
! Compute flow state depending on input mode
select case (input_mode)
case (1)
mode_name = 'Upstream Velocity V1'
V1 = flow_val
Q = V1 * y1 * b
Fr1 = V1 / sqrt(g * y1)
case (2)
mode_name = 'Total Discharge Q'
Q = flow_val
V1 = Q / (y1 * b)
Fr1 = V1 / sqrt(g * y1)
case (3)
mode_name = 'Upstream Froude Fr1'
Fr1 = flow_val
V1 = Fr1 * sqrt(g * y1)
Q = V1 * y1 * b
case default
write(*,'(A)') "ERROR: Invalid input mode."
stop
end select
! Verify that the flow is supercritical (Fr1 > 1.0)
if (Fr1 <= 1.0d0) then
write(*,'(A,F10.4)') "ERROR: Upstream flow must be supercritical (Fr1 > 1.0). Current Fr1 = ", Fr1
stop
end if
! Compute downstream conjugate state
y2 = (y1 / 2.0d0) * (-1.0d0 + sqrt(1.0d0 + 8.0d0 * Fr1**2))
V2 = Q / (y2 * b)
Fr2 = V2 / sqrt(g * y2)
q_width = Q / b
! Specific Energy
E1 = y1 + V1**2 / (2.0d0 * g)
E2 = y2 + V2**2 / (2.0d0 * g)
h_L = E1 - E2
efficiency = (E2 / E1) * 100.0d0
h_j = y2 - y1
! Power dissipated
P_loss = RHO * g * Q * h_L / 1000.0d0 ! in kW
! Reynolds Numbers
Re1 = V1 * y1 / NU
Re2 = V2 * y2 / NU
! Jump length and classification
if (Fr1 <= 1.7d0) then
jump_class = 'Undular Jump'
energy_diss_desc = 'Very low energy dissipation (< 5%)'
L_j = 4.0d0 * y2
else if (Fr1 <= 2.5d0) then
jump_class = 'Weak Jump'
energy_diss_desc = 'Low energy dissipation (5% to 15%)'
L_j = 4.0d0 * y2 + (Fr1 - 1.7d0)/(2.5d0 - 1.7d0) * 1.0d0 * y2
else if (Fr1 <= 4.5d0) then
jump_class = 'Oscillating Jump'
energy_diss_desc = 'Moderate energy dissipation (15% to 45%)'
L_j = 5.0d0 * y2 + (Fr1 - 2.5d0)/(4.5d0 - 2.5d0) * 1.1d0 * y2
else if (Fr1 <= 9.0d0) then
jump_class = 'Steady Jump'
energy_diss_desc = 'High energy dissipation (45% to 70%)'
L_j = 6.1d0 * y2
else
jump_class = 'Strong Jump'
energy_diss_desc = 'Very high energy dissipation (> 70%)'
L_j = 6.1d0 * y2 - (Fr1 - 9.0d0)/(20.0d0 - 9.0d0) * 0.5d0 * y2
if (L_j < 5.6d0 * y2) L_j = 5.6d0 * y2
end if
! Regime descriptors
regime1 = 'Supercritical (Fr>1)'
if (Fr2 < 1.0d0) then
regime2 = 'Subcritical (Fr<1)'
else
regime2 = 'Critical (Fr=1)'
end if
! === OUTPUT ASCII REPORT ===
write(*,'(A)') '============================================================'
write(*,'(A)') ' HYDRAULIC JUMP CALCULATOR'
write(*,'(A)') '============================================================'
write(*,*)
write(*,'(A)') '--- INPUT CONFIGURATION ---'
write(*,'(A,F12.4,A)') ' Channel Width (b) = ', b, ' m'
write(*,'(A,A)') ' Input Selection Mode = ', trim(mode_name)
write(*,'(A,F12.4,A)') ' Upstream Depth (y1) = ', y1, ' m'
select case (input_mode)
case (1)
write(*,'(A,F12.4,A)') ' Upstream Velocity (V1) = ', V1, ' m/s'
case (2)
write(*,'(A,F12.4,A)') ' Total Discharge (Q) = ', Q, ' m3/s'
case (3)
write(*,'(A,F12.4)') ' Upstream Froude (Fr1) = ', Fr1
end select
write(*,*)
write(*,'(A)') '--- CONJUGATE STATE PROPERTIES ---'
write(*,'(A,F12.4,A)') ' Upstream Depth (y1) = ', y1, ' m'
write(*,'(A,F12.4,A)') ' Downstream Depth (y2) = ', y2, ' m'
write(*,'(A,F12.4,A)') ' Upstream Velocity (V1) = ', V1, ' m/s'
write(*,'(A,F12.4,A)') ' Downstream Velocity (V2)= ', V2, ' m/s'
write(*,'(A,F12.4)') ' Upstream Froude (Fr1) = ', Fr1
write(*,'(A,F12.4)') ' Downstream Froude (Fr2) = ', Fr2
write(*,'(A,A)') ' Upstream Flow Regime = ', trim(regime1)
write(*,'(A,A)') ' Downstream Flow Regime = ', trim(regime2)
write(*,'(A,F12.4,A)') ' Total Discharge (Q) = ', Q, ' m3/s'
write(*,'(A,F12.4,A)') ' Discharge per Width (q) = ', q_width, ' m2/s'
write(*,'(A,ES12.4)') ' Upstream Reynolds (Re1) = ', Re1
write(*,'(A,ES12.4)') ' Downstream Reynolds(Re2)= ', Re2
write(*,*)
write(*,'(A)') '--- JUMP HYDRAULICS & LOSSES ---'
write(*,'(A,F12.4,A)') ' Upstream Energy (E1) = ', E1, ' m'
write(*,'(A,F12.4,A)') ' Downstream Energy (E2) = ', E2, ' m'
write(*,'(A,F12.4,A)') ' Energy Head Loss (h_L) = ', h_L, ' m'
write(*,'(A,F12.2,A)') ' Jump Efficiency (E2/E1) = ', efficiency, ' %'
write(*,'(A,F12.4,A)') ' Jump Height (y2 - y1) = ', h_j, ' m'
write(*,'(A,F12.4,A)') ' Estimated Jump Length = ', L_j, ' m'
write(*,'(A,F12.4,A)') ' Power Dissipated = ', P_loss, ' kW'
write(*,*)
write(*,'(A)') '--- FLOW REGIME CLASSIFICATION ---'
write(*,'(A,A)') ' Jump Classification = ', trim(jump_class)
write(*,'(A,A)') ' Energy Dissipation = ', trim(energy_diss_desc)
write(*,*)
write(*,'(A)') '--- EQUATIONS USED ---'
write(*,'(A)') ' Conjugate Depth: y2 = (y1/2) * [-1 + sqrt(1 + 8*Fr1^2)]'
write(*,'(A)') ' Specific Energy: E = y + V^2 / (2g)'
write(*,'(A)') ' Head Loss: h_L = E1 - E2 = (y2 - y1)^3 / (4 * y1 * y2)'
write(*,'(A)') ' Power Dissipated: P = rho * g * Q * h_L'
write(*,'(A)') '============================================================'
end program hydraulic_jump
Solver Description
Analyzes hydraulic jumps in open channels. Computes upstream Froude number ($Fr_1$), solves momentum conservation equations for conjugate downstream depth ($y_2$), and calculates head loss ($E_L$) and jump efficiency.
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 -ffree-line-length-none hydraulic_jump.f90 -o hydraulic_jump_calc
Execution Command:
Execute the program by feeding the sample input file into the program using stdin redirection:
hydraulic_jump_calc < input.txt
📥 Downloads & Local Files
Preview of the required input file (input.txt):
! Channel Geometry (1=Rectangular, 2=Trapezoidal, 3=Triangular)
1
! Channel Width ($b$) [m]
4.0
! Flow Rate ($Q$) [m³/s]
12.0
! Upstream Depth ($y_1$) [m]
0.5
1
! Channel Width ($b$) [m]
4.0
! Flow Rate ($Q$) [m³/s]
12.0
! Upstream Depth ($y_1$) [m]
0.5