💻 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.
Mach Angle Calculator
Core Numerical Engine in Fortran 90 • 22 total downloads
mach_angle.f90
! =========================================================================
! Source File: mach_angle.f90
! =========================================================================
program mach_angle
implicit none
! =================================================================
! Mach Angle / Mach Cone Calculator
! Reads: M, gamma, p1 [Pa], T1 [K], R_gas [J/kg.K], x_dist [m]
! =================================================================
! Constants
double precision, parameter :: PI = 3.141592653589793d0
double precision, parameter :: DEG2RAD = PI / 180.0d0
double precision, parameter :: RAD2DEG = 180.0d0 / PI
! Inputs
double precision :: M, gamma, p1, T1, R_gas, x_dist
! Derived quantities
double precision :: rho1, a1, u1
double precision :: gp1, gm1
! Mach angle
double precision :: mu_rad, mu_deg, full_cone_deg
double precision :: sin_mu, cos_mu, tan_mu
! Cone geometry at distance x
double precision :: cone_radius, cone_diameter, zone_area
! Stagnation conditions
double precision :: T0, p0, rho0
! Disturbance analysis
double precision :: t_sound_1m, dist_source_1m, ratio_dist
! Profile sweep
integer :: i, n_points
double precision :: dM, M_cur, mu_cur, sin_cur, tan_cur, cos_cur
double precision :: p_p0_cur, T_T0_cur, M_sweep_max
integer :: iostat_val
! -----------------------------------------------------------------
! Read inputs
! -----------------------------------------------------------------
read(*,*,iostat=iostat_val) M
if (iostat_val /= 0) then
write(*,*) 'ERROR: Invalid Mach number input.'
stop
end if
read(*,*,iostat=iostat_val) gamma
if (iostat_val /= 0) then
write(*,*) 'ERROR: Invalid specific heat ratio input.'
stop
end if
read(*,*,iostat=iostat_val) p1
if (iostat_val /= 0) then
write(*,*) 'ERROR: Invalid pressure input.'
stop
end if
read(*,*,iostat=iostat_val) T1
if (iostat_val /= 0) then
write(*,*) 'ERROR: Invalid temperature input.'
stop
end if
read(*,*,iostat=iostat_val) R_gas
if (iostat_val /= 0) then
write(*,*) 'ERROR: Invalid gas constant input.'
stop
end if
read(*,*,iostat=iostat_val) x_dist
if (iostat_val /= 0) then
write(*,*) 'ERROR: Invalid distance input.'
stop
end if
! -----------------------------------------------------------------
! Validate inputs
! -----------------------------------------------------------------
if (M < 1.0d0) then
write(*,*) 'ERROR: Mach number must be >= 1.0 for a Mach cone to exist.'
stop
end if
if (gamma <= 1.0d0) then
write(*,*) 'ERROR: Specific heat ratio gamma must be > 1.0.'
stop
end if
if (p1 <= 0.0d0) then
write(*,*) 'ERROR: Pressure must be positive.'
stop
end if
if (T1 <= 0.0d0) then
write(*,*) 'ERROR: Temperature must be positive.'
stop
end if
if (R_gas <= 0.0d0) then
write(*,*) 'ERROR: Gas constant must be positive.'
stop
end if
if (x_dist < 0.0d0) then
write(*,*) 'ERROR: Distance must be >= 0.'
stop
end if
! -----------------------------------------------------------------
! Convenience
! -----------------------------------------------------------------
gp1 = gamma + 1.0d0
gm1 = gamma - 1.0d0
! -----------------------------------------------------------------
! Flow state
! -----------------------------------------------------------------
rho1 = p1 / (R_gas * T1)
a1 = sqrt(gamma * R_gas * T1)
u1 = M * a1
! -----------------------------------------------------------------
! Stagnation conditions
! -----------------------------------------------------------------
T0 = T1 * (1.0d0 + 0.5d0 * gm1 * M**2)
p0 = p1 * (1.0d0 + 0.5d0 * gm1 * M**2) ** (gamma / gm1)
rho0 = rho1 * (1.0d0 + 0.5d0 * gm1 * M**2) ** (1.0d0 / gm1)
! -----------------------------------------------------------------
! Mach angle
! -----------------------------------------------------------------
mu_rad = asin(1.0d0 / M)
mu_deg = mu_rad * RAD2DEG
full_cone_deg = 2.0d0 * mu_deg
sin_mu = sin(mu_rad)
cos_mu = cos(mu_rad)
tan_mu = tan(mu_rad)
! -----------------------------------------------------------------
! Cone geometry at distance x
! -----------------------------------------------------------------
if (x_dist > 0.0d0) then
cone_radius = x_dist * tan_mu
cone_diameter = 2.0d0 * cone_radius
zone_area = PI * cone_radius**2
else
cone_radius = 0.0d0
cone_diameter = 0.0d0
zone_area = 0.0d0
end if
! -----------------------------------------------------------------
! Disturbance analysis
! -----------------------------------------------------------------
t_sound_1m = 1.0d0 / a1 ! time for sound to travel 1 m
dist_source_1m = u1 * t_sound_1m ! distance source moves in that time
ratio_dist = a1 / u1 ! = 1/M = sin(mu)
! -----------------------------------------------------------------
! Print results
! -----------------------------------------------------------------
write(*,'(A)') '============================================================'
write(*,'(A)') ' MACH ANGLE / MACH CONE CALCULATOR'
write(*,'(A)') '============================================================'
write(*,*)
write(*,'(A)') '--- FLOW CONDITIONS -----------------------------------------'
write(*,'(A,F12.4)') ' Mach Number (M) = ', M
write(*,'(A,F12.6)') ' Specific Heat Ratio (g) = ', gamma
write(*,'(A,F12.2,A)') ' Gas Constant (R) = ', R_gas, ' J/kg.K'
write(*,'(A,ES14.6,A)') ' Static Pressure (p) = ', p1, ' Pa'
write(*,'(A,F12.2,A)') ' Static Temperature (T) = ', T1, ' K'
write(*,'(A,F12.4,A)') ' Density (rho) = ', rho1, ' kg/m3'
write(*,'(A,F12.4,A)') ' Speed of Sound (a) = ', a1, ' m/s'
write(*,'(A,F12.4,A)') ' Flow Velocity (u) = ', u1, ' m/s'
write(*,*)
write(*,'(A)') '--- STAGNATION CONDITIONS -----------------------------------'
write(*,'(A,ES14.6,A)') ' Total Pressure p0 = ', p0, ' Pa'
write(*,'(A,F12.2,A)') ' Total Temperature T0 = ', T0, ' K'
write(*,'(A,F12.4,A)') ' Total Density rho0 = ', rho0, ' kg/m3'
write(*,*)
write(*,'(A)') '--- MACH ANGLE RESULTS --------------------------------------'
write(*,'(A,F12.4,A)') ' Mach Angle (mu) = ', mu_deg, ' deg'
write(*,'(A,F12.8,A)') ' Mach Angle (mu) = ', mu_rad, ' rad'
write(*,'(A,F12.4,A)') ' Full Cone Angle (2*mu) = ', full_cone_deg, ' deg'
write(*,'(A,F12.8)') ' sin(mu) = 1/M = ', sin_mu
write(*,'(A,F12.8)') ' cos(mu) = ', cos_mu
write(*,'(A,F12.8)') ' tan(mu) = ', tan_mu
write(*,*)
write(*,'(A)') '--- MACH CONE GEOMETRY --------------------------------------'
write(*,'(A,F12.4,A)') ' Reference Distance (x) = ', x_dist, ' m'
write(*,'(A,F12.6,A)') ' Cone Radius at x = ', cone_radius, ' m'
write(*,'(A,F12.6,A)') ' Cone Diameter at x = ', cone_diameter, ' m'
write(*,'(A,F12.6,A)') ' Zone of Action Area = ', zone_area, ' m2'
write(*,*)
write(*,'(A)') '--- DISTURBANCE PROPAGATION ---------------------------------'
write(*,'(A,ES14.6,A)') ' Time for sound (1 m) = ', t_sound_1m, ' s'
write(*,'(A,F12.4,A)') ' Source travel (in t) = ', dist_source_1m, ' m'
write(*,'(A,F12.6)') ' Ratio a/u = sin(mu) = ', ratio_dist
write(*,*)
! -----------------------------------------------------------------
! Profile sweep: M from 1.0 to M_sweep_max
! -----------------------------------------------------------------
M_sweep_max = max(M * 2.0d0, 10.0d0)
if (M_sweep_max < 2.0d0) M_sweep_max = 10.0d0
write(*,'(A)') '--- MACH ANGLE PROFILE vs MACH NUMBER -----------------------'
write(*,'(A)') ' M mu [deg] sin(mu) tan(mu)' // &
' cos(mu) p/p0 T/T0'
write(*,'(A)') ' ----------------------------------------------------------' // &
'----------------------------'
n_points = 40
dM = (M_sweep_max - 1.0d0) / dble(n_points)
do i = 0, n_points
M_cur = 1.0d0 + dble(i) * dM
if (M_cur < 1.0d0) M_cur = 1.0d0
mu_cur = asin(1.0d0 / M_cur) * RAD2DEG
sin_cur = 1.0d0 / M_cur
cos_cur = sqrt(1.0d0 - sin_cur**2)
if (cos_cur > 1.0d-15) then
tan_cur = sin_cur / cos_cur
else
tan_cur = 0.0d0
end if
T_T0_cur = 1.0d0 / (1.0d0 + 0.5d0 * gm1 * M_cur**2)
p_p0_cur = T_T0_cur ** (gamma / gm1)
write(*,'(F8.4,2X,F11.4,2X,F11.8,2X,F11.8,2X,F11.8,2X,F11.8,2X,F11.8)') &
M_cur, mu_cur, sin_cur, tan_cur, cos_cur, p_p0_cur, T_T0_cur
end do
write(*,*)
write(*,'(A)') '--- EQUATIONS USED ------------------------------------------'
write(*,'(A)') ' mu = asin(1/M) (Mach angle)'
write(*,'(A)') ' sin(mu) = 1/M = a/u (wave-speed ratio)'
write(*,'(A)') ' tan(mu) = 1/sqrt(M^2-1) (cone radius/distance)'
write(*,'(A)') ' Cone radius at x: r = x * tan(mu)'
write(*,'(A)') ' Full cone angle: 2*mu'
write(*,'(A)') '============================================================'
end program mach_angle
Solver Description
Compute Mach angle for supersonic flows. Features interactive shock angle vector visualizations.
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 mach_angle.f90 -o mach_angle
Execution Command:
Execute the program by feeding the sample input file into the program using stdin redirection:
mach_angle < input.txt
📥 Downloads & Local Files
Preview of the required input file (input.txt):
! Mach Number ($M$)\nSpecific Heat Ratio ($\gamma$)\nStatic Pressure ($p$) [Pa]\nStatic Temperature ($T$) [K]\nGas Preset\nxdist
2.0
! Parameter 2
0.0
! Parameter 3
0.0
! Parameter 4
0.0
! Parameter 5
0.0
! Parameter 6
0.0
2.0
! Parameter 2
0.0
! Parameter 3
0.0
! Parameter 4
0.0
! Parameter 5
0.0
! Parameter 6
0.0