💻 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.
Natural Convection Buoyancy Solver
Core Numerical Engine in Fortran 90 • 0 total downloads
! =========================================================================
! Source File: natural_convection.f90
! =========================================================================
program natural_convection
implicit none
! Inputs
integer :: geom_type
double precision :: dim1, dim2
double precision :: T_s, T_inf
double precision :: rho, mu, k_f, Pr, Cp, beta
! Constants
double precision, parameter :: g = 9.80665d0
double precision, parameter :: PI = 3.141592653589793d0
! Physical properties
double precision :: nu, L_c, A_s, T_f, dT
double precision :: Gr, Ra, Nu_avg, h_avg, Q
! Local profile variables
integer :: i, n_points
double precision :: x, dx, local_Ra, local_Gr, local_Nu, local_h, local_delta
character(len=50) :: geom_name
integer :: iostat_val
! Read inputs
read(*,*,iostat=iostat_val) geom_type
if (iostat_val /= 0) then
write(*,*) 'ERROR: Invalid geometry type input.'
stop
end if
read(*,*,iostat=iostat_val) dim1
read(*,*,iostat=iostat_val) dim2
read(*,*,iostat=iostat_val) T_s
read(*,*,iostat=iostat_val) T_inf
read(*,*,iostat=iostat_val) rho
read(*,*,iostat=iostat_val) mu
read(*,*,iostat=iostat_val) k_f
read(*,*,iostat=iostat_val) Pr
read(*,*,iostat=iostat_val) Cp
read(*,*,iostat=iostat_val) beta
if (iostat_val /= 0) then
write(*,*) 'ERROR: Failed to read all convection parameters.'
stop
end if
! Basic validations
if (dim1 <= 0.0d0) then
write(*,*) 'ERROR: Dimension 1 must be positive.'
stop
end if
if (rho <= 0.0d0 .or. mu <= 0.0d0 .or. k_f <= 0.0d0 .or. Pr <= 0.0d0 .or. Cp <= 0.0d0) then
write(*,*) 'ERROR: Fluid properties must be positive.'
stop
end if
! Compute film temperature and kinematic viscosity
T_f = (T_s + T_inf) / 2.0d0
nu = mu / rho
dT = abs(T_s - T_inf)
! Setup Geometry parameters
select case (geom_type)
case (1)
geom_name = "Vertical Plate"
L_c = dim1
A_s = dim1 * dim2
case (2)
geom_name = "Horizontal Plate (Upper Hot / Lower Cold)"
if (dim2 <= 0.0d0) dim2 = dim1 ! Default to square if W is zero
L_c = (dim1 * dim2) / (2.0d0 * (dim1 + dim2))
A_s = dim1 * dim2
case (3)
geom_name = "Horizontal Plate (Lower Hot / Upper Cold)"
if (dim2 <= 0.0d0) dim2 = dim1
L_c = (dim1 * dim2) / (2.0d0 * (dim1 + dim2))
A_s = dim1 * dim2
case (4)
geom_name = "Horizontal Cylinder"
if (dim2 <= 0.0d0) dim2 = 1.0d0 ! Default to 1m length
L_c = dim1
A_s = PI * dim1 * dim2
case (5)
geom_name = "Sphere"
L_c = dim1
A_s = PI * dim1**2
case default
write(*,*) 'ERROR: Invalid geometry type selected.'
stop
end select
! Grashof and Rayleigh numbers
Gr = (g * beta * dT * L_c**3) / (nu**2)
Ra = Gr * Pr
! Nusselt Number Calculations
select case (geom_type)
case (1)
! Churchill and Chu (1975) for Vertical Plate (All Ra)
Nu_avg = (0.825d0 + (0.387d0 * Ra**(1.0d0/6.0d0)) / &
((1.0d0 + (0.492d0/Pr)**(9.0d0/16.0d0))**(8.0d0/27.0d0)))**2
case (2)
! Horizontal Plate (Upper Hot / Lower Cold)
if (Ra < 1.0d4) then
Nu_avg = 0.54d0 * Ra**0.25d0 ! Extrapolated/lower-laminar
else if (Ra <= 1.0d7) then
Nu_avg = 0.54d0 * Ra**0.25d0
else if (Ra <= 1.0d11) then
Nu_avg = 0.15d0 * Ra**(1.0d0/3.0d0)
else
Nu_avg = 0.15d0 * Ra**(1.0d0/3.0d0) ! Extrapolated/upper-turbulent
end if
case (3)
! Horizontal Plate (Lower Hot / Upper Cold)
! Valid for 10^5 to 10^11
Nu_avg = 0.27d0 * Ra**0.25d0
case (4)
! Churchill and Chu (1975) for Horizontal Cylinder (Ra <= 10^12)
Nu_avg = (0.60d0 + (0.387d0 * Ra**(1.0d0/6.0d0)) / &
((1.0d0 + (0.559d0/Pr)**(9.0d0/16.0d0))**(8.0d0/27.0d0)))**2
case (5)
! Churchill (1983) for Sphere (Ra <= 10^11 and Pr >= 0.7)
Nu_avg = 2.0d0 + (0.589d0 * Ra**0.25d0) / &
((1.0d0 + (0.469d0/Pr)**(9.0d0/16.0d0))**(4.0d0/9.0d0))
end select
! Average heat transfer coefficient
h_avg = Nu_avg * k_f / L_c
! Heat transfer rate
Q = h_avg * A_s * dT
! Output results
write(*,'(A)') '============================================================'
write(*,'(A)') ' NATURAL CONVECTION HEAT TRANSFER ENGINE'
write(*,'(A)') '============================================================'
write(*,*)
write(*,'(A,A)') ' Geometry Name = ', trim(geom_name)
write(*,'(A,I2)') ' Geometry Type Code = ', geom_type
write(*,'(A,F12.4,A)') ' Characteristic Length = ', L_c, ' m'
write(*,'(A,F12.4,A)') ' Surface Area (As) = ', A_s, ' m2'
write(*,'(A,F12.2,A)') ' Surface Temperature = ', T_s, ' deg-C'
write(*,'(A,F12.2,A)') ' Ambient Temperature = ', T_inf, ' deg-C'
write(*,'(A,F12.2,A)') ' Film Temperature = ', T_f, ' deg-C'
write(*,*)
write(*,'(A)') '--- FLUID PROPERTIES ----------------------------------------'
write(*,'(A,ES12.4,A)') ' Density (rho) = ', rho, ' kg/m3'
write(*,'(A,ES12.4,A)') ' Dynamic Viscosity (mu) = ', mu, ' Pa.s'
write(*,'(A,ES12.4,A)') ' Kinematic Viscosity (nu) = ', nu, ' m2/s'
write(*,'(A,F12.4,A)') ' Thermal Conductivity = ', k_f, ' W/m.K'
write(*,'(A,F12.4)') ' Prandtl Number (Pr) = ', Pr
write(*,'(A,F12.2,A)') ' Specific Heat (Cp) = ', Cp, ' J/kg.K'
write(*,'(A,ES12.4,A)') ' Expansion Coeff (beta) = ', beta, ' 1/K'
write(*,*)
write(*,'(A)') '--- CONVECTION RESULTS --------------------------------------'
write(*,'(A,ES12.4)') ' Grashof Number (Gr) = ', Gr
write(*,'(A,ES12.4)') ' Rayleigh Number (Ra) = ', Ra
write(*,'(A,F12.4)') ' Average Nusselt Number = ', Nu_avg
write(*,'(A,F12.4,A)') ' Average h = ', h_avg, ' W/m2.K'
write(*,'(A,F12.4,A)') ' Heat Transfer Rate (Q) = ', Q, ' W'
write(*,*)
! ============================================
! LOCAL PROFILE DATA (along coordinate x)
! ============================================
write(*,'(A)') '--- LOCAL PROFILE ALONG SURFACE ----------------------------'
write(*,'(A)') ' x [m] Ra_x Nu_x h_x [W/m2.K] d [mm]'
write(*,'(A)') ' ----------------------------------------------------------'
n_points = 40
dx = L_c / dble(n_points)
do i = 1, n_points
x = dble(i) * dx
local_Gr = (g * beta * dT * x**3) / (nu**2)
local_Ra = local_Gr * Pr
if (dT <= 1.0d-10 .or. local_Gr <= 1.0d-10) then
local_Nu = 0.0d0
local_delta = 0.0d0
else
if (local_Ra < 1.0d9) then
! Laminar boundary layer correlations
local_Nu = 0.508d0 * (Pr / (0.952d0 + Pr))**0.25d0 * local_Ra**0.25d0
local_delta = 3.93d0 * x * ((0.952d0 + Pr) / (Pr**2 * local_Gr))**0.25d0
else
! Turbulent boundary layer approximations
local_Nu = 0.0292d0 * local_Ra**0.4d0
local_delta = 0.15d0 * x * local_Ra**(-0.1d0)
end if
end if
if (x > 0.0d0) then
local_h = local_Nu * k_f / x
else
local_h = 0.0d0
end if
write(*,'(F8.4,2X,ES12.4,2X,F10.2,4X,F10.4,4X,F10.4)') &
x, local_Ra, local_Nu, local_h, local_delta*1000.0d0
end do
write(*,*)
write(*,'(A)') '--- CORRELATIONS USED ---------------------------------------'
select case (geom_type)
case (1)
write(*,'(A)') ' Vertical Plate: Churchill and Chu (1975) Correlation'
case (2)
write(*,'(A)') ' Horizontal Plate (Upper Hot): Nu = 0.54 Ra^0.25 (lam), Nu = 0.15 Ra^(1/3) (turb)'
case (3)
write(*,'(A)') ' Horizontal Plate (Lower Hot): Nu = 0.27 Ra^0.25'
case (4)
write(*,'(A)') ' Horizontal Cylinder: Churchill and Chu (1975) Correlation'
case (5)
write(*,'(A)') ' Sphere: Churchill (1983) Correlation'
end select
write(*,'(A)') ' Boundary Layer: Laminar similarity solutions for natural convection.'
end program natural_convection
Solver Description
Analyzes natural convection heat transfer. Solves Grashof ($Gr$) and Rayleigh ($Ra$) numbers, selects appropriate Nusselt correlations (such as Churchill-Chu for vertical plates), and calculates convective coefficient ($h$) and buoyancy-induced heat loss ($Q$).
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:
Execution Command:
Execute the program by feeding the sample input file into the program using stdin redirection:
📥 Downloads & Local Files
Preview of the required input file (input.txt):
1
! Characteristic Dimension ($L$ or $D$) [m]
0.3
! Surface Temp ($T_s$) [°C]
60.0
! Ambient Temp ($T_\infty$) [°C]
20.0
! Fluid Density ($\rho$) [kg/m³]
1.164
! Fluid Viscosity ($\mu$) [Pa-s]
1.9e-5
! Fluid Conductivity ($k$) [W/m-K]
0.026
! Prandtl Number ($Pr$)
0.707
! Specific Heat ($C_p$) [J/kg-K]
1007.0
! Volumetric Expansion Coefficient ($\beta$) [1/K]
0.0031