💻 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.
Cylinders & Spheres Conduction
Core Numerical Engine in Fortran 90 • 33 total downloads
! =========================================================================
! Source File: heat_conduction_cylinders_spheres.f90
! =========================================================================
program steady_heat_conduction_cylinders_spheres
implicit none
! Variable declarations
integer :: n_layers, i, n_nodes, j, geometry_type
real(8) :: T_inner, T_outer, Q, R_total, T_interface
real(8), allocatable :: r_inner(:), r_outer(:), k(:), R(:), T(:)
real(8) :: r_val, dr_val, length_cyl, heat_flux, r_mid
real(8) :: surface_inner, surface_outer
character(len=50) :: filename
character(len=20) :: geometry_name
! Read geometry type: 1 = Cylinder, 2 = Sphere
read *, geometry_type
if (geometry_type == 1) then
geometry_name = "CYLINDER"
read *, length_cyl ! Length for cylinder
else
geometry_name = "SPHERE"
length_cyl = 1.0d0 ! Not used for sphere
end if
! Read number of layers
read *, n_layers
! Allocate arrays
allocate(r_inner(n_layers))
allocate(r_outer(n_layers))
allocate(k(n_layers))
allocate(R(n_layers))
allocate(T(0:n_layers))
! Read layer properties (inner radius, outer radius, conductivity)
do i = 1, n_layers
read *, r_inner(i)
read *, r_outer(i)
read *, k(i)
end do
! Read boundary temperatures
read *, T_inner
read *, T_outer
! Calculate thermal resistances
R_total = 0.0d0
do i = 1, n_layers
if (geometry_type == 1) then
! Cylindrical resistance: R = ln(r_o/r_i) / (2*pi*k*L)
R(i) = log(r_outer(i) / r_inner(i)) / (2.0d0 * 3.14159265358979d0 * k(i) * length_cyl)
else
! Spherical resistance: R = (1/r_i - 1/r_o) / (4*pi*k)
R(i) = (1.0d0/r_inner(i) - 1.0d0/r_outer(i)) / (4.0d0 * 3.14159265358979d0 * k(i))
end if
R_total = R_total + R(i)
end do
! Calculate heat transfer rate
Q = (T_inner - T_outer) / R_total
! Calculate interface temperatures
T(0) = T_inner
T(n_layers) = T_outer
do i = 1, n_layers - 1
T(i) = T_inner - (T_inner - T_outer) * sum(R(1:i)) / R_total
end do
! Calculate surface areas
if (geometry_type == 1) then
surface_inner = 2.0d0 * 3.14159265358979d0 * r_inner(1) * length_cyl
surface_outer = 2.0d0 * 3.14159265358979d0 * r_outer(n_layers) * length_cyl
else
surface_inner = 4.0d0 * 3.14159265358979d0 * r_inner(1)**2
surface_outer = 4.0d0 * 3.14159265358979d0 * r_outer(n_layers)**2
end if
! Display results
print *, '========================================='
print *, 'STEADY STATE THERMAL CONDUCTION'
print *, 'GEOMETRY: ', trim(geometry_name)
print *, '========================================='
print *, ''
print *, 'INPUT PARAMETERS:'
print *, '----------------------------------------'
if (geometry_type == 1) then
print '(A,F10.4,A)', ' Cylinder Length: ', length_cyl, ' m'
print '(A,F10.4,A)', ' Inner Radius: ', r_inner(1), ' m'
print '(A,F10.4,A)', ' Outer Radius: ', r_outer(n_layers), ' m'
else
print '(A,F10.4,A)', ' Inner Radius: ', r_inner(1), ' m'
print '(A,F10.4,A)', ' Outer Radius: ', r_outer(n_layers), ' m'
end if
print '(A,F10.2,A)', ' Inner Temperature: ', T_inner, ' °C'
print '(A,F10.2,A)', ' Outer Temperature: ', T_outer, ' °C'
print '(A,F10.2,A)', ' Temperature Difference: ', (T_inner - T_outer), ' °C'
print '(A,I3)', ' Number of Layers: ', n_layers
print *, ''
print *, '========================================='
print *, 'MAIN RESULTS'
print *, '========================================='
print *, ''
print '(A,F12.6,A)', ' Total Thermal Resistance: ', R_total, ' K/W'
print '(A,F12.2,A)', ' Total Heat Flux (Q): ', Q, ' W'
print '(A,F12.4,A)', ' Inner Surface Area: ', surface_inner, ' m²'
print '(A,F12.4,A)', ' Outer Surface Area: ', surface_outer, ' m²'
print '(A,F12.2,A)', ' Inner Surface Heat Flux: ', Q/surface_inner, ' W/m²'
print '(A,F12.2,A)', ' Outer Surface Heat Flux: ', Q/surface_outer, ' W/m²'
print *, ''
print *, '========================================='
print *, 'LAYER ANALYSIS'
print *, '========================================='
print *, ''
do i = 1, n_layers
r_mid = (r_inner(i) + r_outer(i)) / 2.0d0
print '(A,I2,A)', ' === Layer ', i, ' ==='
print '(A,F10.4,A)', ' Inner Radius (r_i): ', r_inner(i), ' m'
print '(A,F10.4,A)', ' ', r_inner(i)*1000, ' mm'
print '(A,F10.4,A)', ' Outer Radius (r_o): ', r_outer(i), ' m'
print '(A,F10.4,A)', ' ', r_outer(i)*1000, ' mm'
print '(A,F10.4,A)', ' Thickness (r_o - r_i): ', (r_outer(i)-r_inner(i)), ' m'
print '(A,F10.4,A)', ' ', (r_outer(i)-r_inner(i))*1000, ' mm'
print '(A,F10.4,A)', ' Conductivity (k): ', k(i), ' W/m·K'
print '(A,F10.6,A)', ' Resistance (R): ', R(i), ' K/W'
print '(A,F8.2,A)', ' % of Total Resistance: ', (R(i)/R_total)*100, ' %'
print '(A,F10.2,A)', ' Inner Temperature: ', T(i-1), ' °C'
print '(A,F10.2,A)', ' Outer Temperature: ', T(i), ' °C'
print '(A,F10.2,A)', ' Temperature Drop: ', (T(i-1) - T(i)), ' °C'
print *, ''
end do
print *, '========================================='
print *, 'INTERFACE TEMPERATURES'
print *, '========================================='
print *, ''
print '(A,F10.2,A)', ' Inner Surface (T0): ', T(0), ' °C'
do i = 1, n_layers - 1
print '(A,I2,A,I2,A,F10.2,A)', ' Interface layer ', i, '-', i+1, ': ', T(i), ' °C'
end do
print '(A,F10.2,A)', ' Outer Surface (Tn): ', T(n_layers), ' °C'
print *, ''
! Generate temperature profile data file
filename = 'temperature_profile.dat'
open(unit=10, file=filename, status='replace')
write(10, '(A)') '# Radius(m) Temperature(°C) Layer'
do i = 1, n_layers
n_nodes = 50
dr_val = (r_outer(i) - r_inner(i)) / real(n_nodes, 8)
do j = 0, n_nodes
r_val = r_inner(i) + j * dr_val
if (geometry_type == 1) then
! Cylindrical temperature distribution
if (abs(r_outer(i) - r_inner(i)) > 1.0d-10) then
T_interface = T(i-1) - (T(i-1) - T(i)) * &
log(r_val/r_inner(i)) / log(r_outer(i)/r_inner(i))
else
T_interface = T(i-1)
end if
else
! Spherical temperature distribution
if (abs(r_outer(i) - r_inner(i)) > 1.0d-10) then
T_interface = T(i-1) - (T(i-1) - T(i)) * &
(1.0d0/r_inner(i) - 1.0d0/r_val) / &
(1.0d0/r_inner(i) - 1.0d0/r_outer(i))
else
T_interface = T(i-1)
end if
end if
write(10, '(F12.6,2X,F12.4,2X,I3)') r_val, T_interface, i
end do
end do
close(10)
print *, '========================================='
print *, 'DATA FILE'
print *, '========================================='
print *, ''
print *, ' Temperature profile saved in:'
print *, ' ', trim(filename)
print *, ''
print *, ' Format: Radius(m) Temperature(°C) Layer'
print *, ''
! Additional performance metrics
print *, '========================================='
print *, 'PERFORMANCE METRICS'
print *, '========================================='
print *, ''
! Find the layer with maximum resistance (bottleneck)
i = maxloc(R, dim=1)
print '(A,I2)', ' Limiting Layer (max resistance): Layer ', i
print '(A,F10.6,A)', ' Resistance of this layer: ', R(i), ' K/W'
print *, ''
! Calculate overall heat transfer coefficient
print '(A,F10.4,A)', ' U-Coefficient (inner basis): ', 1.0d0/(R_total*surface_inner), ' W/m²·K'
print '(A,F10.4,A)', ' U-Coefficient (outer basis): ', 1.0d0/(R_total*surface_outer), ' W/m²·K'
print *, ''
! Energy loss calculations
print *, 'ENERGY LOSSES (estimates):'
print '(A,F12.2,A)', ' Per hour: ', Q * 3600.0d0 / 1000.0d0, ' kJ/h'
print '(A,F12.2,A)', ' Per day: ', Q * 86400.0d0 / 1000.0d0, ' kJ/day'
print '(A,F12.2,A)', ' ', Q * 24.0d0 / 1000.0d0, ' kWh/day'
print '(A,F12.2,A)', ' Per year: ', Q * 8760.0d0 / 1000.0d0, ' kWh/year'
print *, ''
! Volume calculations
if (geometry_type == 1) then
print *, 'VOLUMETRIC CHARACTERISTICS:'
print '(A,F12.6,A)', ' Inner Volume: ', &
3.14159265358979d0 * r_inner(1)**2 * length_cyl, ' m³'
print '(A,F12.6,A)', ' Outer Volume: ', &
3.14159265358979d0 * r_outer(n_layers)**2 * length_cyl, ' m³'
print '(A,F12.6,A)', ' Wall Volume: ', &
3.14159265358979d0 * (r_outer(n_layers)**2 - r_inner(1)**2) * length_cyl, ' m³'
else
print *, 'VOLUMETRIC CHARACTERISTICS:'
print '(A,F12.6,A)', ' Inner Volume: ', &
(4.0d0/3.0d0) * 3.14159265358979d0 * r_inner(1)**3, ' m³'
print '(A,F12.6,A)', ' Outer Volume: ', &
(4.0d0/3.0d0) * 3.14159265358979d0 * r_outer(n_layers)**3, ' m³'
print '(A,F12.6,A)', ' Wall Volume: ', &
(4.0d0/3.0d0) * 3.14159265358979d0 * &
(r_outer(n_layers)**3 - r_inner(1)**3), ' m³'
end if
print *, ''
print *, '========================================='
print *, 'END OF CALCULATION'
print *, '========================================='
! Cleanup
deallocate(r_inner, r_outer, k, R, T)
end program steady_heat_conduction_cylinders_spheres
Solver Description
Heat conduction through multilayer cylinders (e.g., pipes) and spheres in the radial direction is governed by radial formulations of Fourier's Law. The thermal resistance for each layer is defined as:
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
! Length L [m] (for Cylinder)
10.0
! Number of layers
2
! Layer 1 inner radius [m]
0.05
! Layer 1 outer radius [m]
0.07
! Layer 1 thermal conductivity [W/m-K]
0.5
! Layer 2 inner radius [m]
0.07
! Layer 2 outer radius [m]
0.1
! Layer 2 thermal conductivity [W/m-K]
0.04
! Inner surface temp [°C]
200.0
! Outer surface temp [°C]
40.0