💻 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.

Blackbody Radiation Solver

Core Numerical Engine in Fortran 90 • 36 total downloads

blackbody_radiation.f90
! =========================================================================
! Source File: blackbody_radiation.f90
! =========================================================================

program blackbody_radiation
    implicit none

    ! Inputs
    integer :: mode
    double precision :: T1_C, T2_C
    double precision :: Area, F12

    ! Constants
    double precision, parameter :: SIGMA = 5.670374d-8
    double precision, parameter :: WIEN_CONST = 2897.8d0
    double precision, parameter :: C1 = 3.74177d8   ! W.um^4 / m^2
    double precision, parameter :: C2 = 14387.8d0   ! um.K

    ! Calculated properties
    double precision :: T1_K, T2_K
    double precision :: Eb1, Eb2
    double precision :: lambda_max1, lambda_max2
    double precision :: Q12, F_eff

    ! Wavelength profile variables
    integer :: i, n_points
    double precision :: lambda, d_lambda, max_lambda
    double precision :: Eb_lam1, Eb_lam2
    double precision :: exp_term1, exp_term2
    integer :: iostat_val

    ! Read inputs
    read(*,*,iostat=iostat_val) mode
    if (iostat_val /= 0) then
        write(*,*) 'ERROR: Invalid calculation mode.'
        stop
    end if

    read(*,*,iostat=iostat_val) T1_C
    read(*,*,iostat=iostat_val) T2_C
    read(*,*,iostat=iostat_val) Area
    read(*,*,iostat=iostat_val) F12
    if (iostat_val /= 0) then
        write(*,*) 'ERROR: Failed to read calculation parameters.'
        stop
    end if

    ! Valider temperatures
    T1_K = T1_C + 273.15d0
    T2_K = T2_C + 273.15d0

    if (T1_K <= 0.0d0 .or. T2_K <= 0.0d0) then
        write(*,*) 'ERROR: Temperatures must be above absolute zero.'
        stop
    end if

    if (Area <= 0.0d0) then
        write(*,*) 'ERROR: Area must be positive.'
        stop
    end if

    if (F12 < 0.0d0 .or. F12 > 1.0d0) then
        write(*,*) 'ERROR: View factor must be between 0.0 and 1.0.'
        stop
    end if

    ! Determine effective view factor based on geometry mode
    ! 1 = Basic Blackbody (no exchange)
    ! 2 = Infinite Parallel Plates (F12 = 1.0)
    ! 3 = Finite Parallel Plates (F12 custom)
    ! 4 = Concentric Cylinders (F12 = 1.0)
    ! 5 = Concentric Spheres (F12 = 1.0)
    select case (mode)
    case (1)
        F_eff = 0.0d0
    case (2, 4, 5)
        F_eff = 1.0d0
    case (3)
        F_eff = F12
    case default
        write(*,*) 'ERROR: Invalid geometry mode selected.'
        stop
    end select

    ! Calculate total emissive power (Stefan-Boltzmann)
    Eb1 = SIGMA * T1_K**4
    Eb2 = SIGMA * T2_K**4

    ! Calculate peak wavelength (Wien's Law)
    lambda_max1 = WIEN_CONST / T1_K
    lambda_max2 = WIEN_CONST / T2_K

    ! Calculate radiative heat exchange
    Q12 = Area * F_eff * SIGMA * (T1_K**4 - T2_K**4)

    ! Output results
    write(*,'(A)') '============================================================'
    write(*,'(A)') '      BLACKBODY RADIATION ANALYSIS ENGINE'
    write(*,'(A)') '============================================================'
    write(*,*)
    write(*,'(A,I2)')         '  Mode Code               = ', mode
    write(*,'(A,F12.2,A)')  '  Temperature 1 (T1)      = ', T1_C, ' deg-C'
    write(*,'(A,F12.2,A)')  '  Temperature 2 (T2)      = ', T2_C, ' deg-C'
    write(*,'(A,F12.2,A)')  '  Temperature 1 (T1_K)    = ', T1_K, ' K'
    write(*,'(A,F12.2,A)')  '  Temperature 2 (T2_K)    = ', T2_K, ' K'
    write(*,'(A,F12.4,A)')  '  Surface Area (A1)       = ', Area, ' m2'
    write(*,'(A,F12.4)')    '  Effective View Factor   = ', F_eff
    write(*,*)
    write(*,'(A)') '--- STEFAN-BOLTZMANN & WIEN RESULTS ------------------------'
    write(*,'(A,ES12.4,A)') '  T1 Emissive Power (Eb1) = ', Eb1, ' W/m2'
    write(*,'(A,ES12.4,A)') '  T2 Emissive Power (Eb2) = ', Eb2, ' W/m2'
    write(*,'(A,F12.4,A)')  '  T1 Peak Wavelength      = ', lambda_max1, ' um'
    write(*,'(A,F12.4,A)')  '  T2 Peak Wavelength      = ', lambda_max2, ' um'
    write(*,'(A,ES12.4,A)') '  Net Heat Transfer (Q12) = ', Q12, ' W'
    write(*,*)

    ! =======================================================
    ! PLANCK SPECTRAL DISTRIBUTION DATA
    ! =======================================================
    write(*,'(A)') '--- PLANCK SPECTRAL DISTRIBUTION ---------------------------'
    write(*,'(A)') '  lambda [um]   Eb_lambda1 [W/m2.um]   Eb_lambda2 [W/m2.um]'
    write(*,'(A)') '  ----------------------------------------------------------'

    ! Adapt max wavelength to temperatures to show a nice curve
    ! For cold temperatures, peak is at longer wavelengths.
    max_lambda = 3.0d0 * max(lambda_max1, lambda_max2)
    if (max_lambda < 15.0d0) max_lambda = 15.0d0
    if (max_lambda > 50.0d0) max_lambda = 50.0d0

    n_points = 60
    d_lambda = max_lambda / dble(n_points)

    do i = 1, n_points
        lambda = dble(i) * d_lambda
        
        ! Curve 1
        exp_term1 = C2 / (lambda * T1_K)
        if (exp_term1 > 80.0d0) then
            Eb_lam1 = 0.0d0
        else
            Eb_lam1 = C1 / (lambda**5 * (exp(exp_term1) - 1.0d0))
        end if

        ! Curve 2
        exp_term2 = C2 / (lambda * T2_K)
        if (exp_term2 > 80.0d0) then
            Eb_lam2 = 0.0d0
        else
            Eb_lam2 = C1 / (lambda**5 * (exp(exp_term2) - 1.0d0))
        end if

        write(*,'(F10.4,4X,ES15.6,4X,ES15.6)') lambda, Eb_lam1, Eb_lam2
    end do

    write(*,*)
    write(*,'(A)') '--- THEORY REFERENCE ----------------------------------------'
    write(*,'(A)') '  Stefan-Boltzmann constant sigma = 5.670374e-8 W/m2.K4'
    write(*,'(A)') '  Planck constants: C1 = 3.74177e8 W.um4/m2, C2 = 14387.8 um.K'
    write(*,'(A)') '  Peak wavelength matches Wien Displacement constant = 2897.8 um.K'

end program blackbody_radiation


Solver Description

A blackbody represents an ideal emitter and absorber of radiation. Its spectral distribution is governed by Planck's Law:

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 blackbody_radiation.f90 -o blackbody_radiation

Execution Command:

Execute the program by feeding the sample input file into the program using stdin redirection:

blackbody_radiation < input.txt

📥 Downloads & Local Files

Preview of the required input file (input.txt):

! Calculation Mode (1=Net exchange, 2=Spectral distribution)
1
! Surface 1 Temperature T1 [K]
1000.0
! Surface 2 Temperature T2 [K]
300.0
! Surface Area [m2]
1.0
! View Factor F12
1.0