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

Packed Bed Absorption

Core Numerical Engine in Fortran 90 • 55 total downloads

absorption_packed_bed.f90
! =========================================================================
! Source File: absorption_packed_bed.f90
! =========================================================================

program absorption_packed_bed
    implicit none
    integer :: i, n_points, iostat_val
    double precision :: y_in, y_out_t, x_in, m, G, L, KGa, area, packingFactor
    double precision :: LG, Aabs, x_out, y_star_bottom, y_star_top, removal
    double precision :: NTU, HTU, Z, Nstage, Gflux, y, x, ystar, drive, ntu_cum, dy, y_hi, y_lo
    double precision :: minL, pinch_top, pinch_bottom

    read(*,*,iostat=iostat_val) y_in
    if (iostat_val /= 0) then
        write(*,*) 'ERROR: Invalid inlet gas composition input.'
        stop
    end if
    read(*,*,iostat=iostat_val) y_out_t
    read(*,*,iostat=iostat_val) x_in
    read(*,*,iostat=iostat_val) m
    read(*,*,iostat=iostat_val) G
    read(*,*,iostat=iostat_val) L
    read(*,*,iostat=iostat_val) KGa
    read(*,*,iostat=iostat_val) area
    read(*,*,iostat=iostat_val) packingFactor
    if (iostat_val /= 0) then
        write(*,*) 'ERROR: Failed to read all absorber inputs.'
        stop
    end if

    if (y_in <= 0.0d0 .or. y_in >= 1.0d0 .or. y_out_t < 0.0d0 .or. y_out_t >= y_in) then
        write(*,*) 'ERROR: Require 0 <= y_out < y_in < 1.'
        stop
    end if
    if (x_in < 0.0d0 .or. x_in >= 1.0d0 .or. m <= 0.0d0) then
        write(*,*) 'ERROR: Liquid inlet composition and Henry slope are invalid.'
        stop
    end if
    if (G <= 0.0d0 .or. L <= 0.0d0 .or. KGa <= 0.0d0 .or. area <= 0.0d0) then
        write(*,*) 'ERROR: G, L, KGa, and column area must be positive.'
        stop
    end if
    if (packingFactor <= 0.0d0) packingFactor = 1.0d0

    LG = L/G
    Aabs = L/(m*G)
    x_out = x_in + G/L * (y_in - y_out_t)
    y_star_top = m*x_in
    y_star_bottom = m*x_out
    pinch_top = y_out_t - y_star_top
    pinch_bottom = y_in - y_star_bottom
    if (pinch_top <= 0.0d0 .or. pinch_bottom <= 0.0d0) then
        write(*,*) 'ERROR: Pinch detected. Increase L/G or reduce target removal.'
        stop
    end if

    removal = (y_in - y_out_t)/y_in * 100.0d0
    NTU = integrate_ntu(y_in, y_out_t, x_in, m, G, L)
    Gflux = G/area
    HTU = Gflux / KGa * packingFactor
    Z = NTU * HTU

    if (abs(Aabs - 1.0d0) < 1.0d-8) then
        Nstage = (y_in - y_out_t) / max(1.0d-12, (y_out_t - y_star_top))
    else
        ! Practical Kremser-style estimate using end-point driving force ratio.
        Nstage = log((y_in - y_star_bottom)/(y_out_t - y_star_top)) / log(Aabs)
        if (Nstage < 0.0d0) Nstage = abs(Nstage)
    end if
    if (Nstage < 0.0d0 .or. Nstage /= Nstage) Nstage = NTU

    minL = m*G*(y_in - y_out_t)/max(1.0d-12, y_in - m*x_in)

    write(*,'(A)') '============================================================'
    write(*,'(A)') '   ABSORPTION COLUMN DESIGN - PACKED BED ENGINE'
    write(*,'(A)') '============================================================'
    write(*,*)
    write(*,'(A)') '--- INPUTS --------------------------------------------------'
    write(*,'(A,ES12.4)')   '  Gas Inlet y_in           = ', y_in
    write(*,'(A,ES12.4)')   '  Outlet Gas y_out         = ', y_out_t
    write(*,'(A,ES12.4)')   '  Lean Liquid x_in         = ', x_in
    write(*,'(A,ES12.4)')   '  Henry Slope (m)          = ', m
    write(*,'(A,ES12.4,A)') '  Gas Molar Flow (G)       = ', G, ' mol/s'
    write(*,'(A,ES12.4,A)') '  Liquid Molar Flow (L)    = ', L, ' mol/s'
    write(*,'(A,ES12.4,A)') '  Volumetric K_Ga          = ', KGa, ' mol/m3.s'
    write(*,'(A,ES12.4,A)') '  Column Area              = ', area, ' m2'
    write(*,*)
    write(*,'(A)') '--- EQUILIBRIUM / OPERATING LINE ---------------------------'
    write(*,'(A,ES12.4)')   '  L/G Ratio                = ', LG
    write(*,'(A,ES12.4)')   '  Absorption Factor        = ', Aabs
    write(*,'(A,ES12.4)')   '  Outlet Liquid x_out      = ', x_out
    write(*,'(A,ES12.4)')   '  y*_top                   = ', y_star_top
    write(*,'(A,ES12.4)')   '  y*_bottom                = ', y_star_bottom
    write(*,'(A,ES12.4,A)') '  Minimum Liquid Flow      = ', minL, ' mol/s'
    write(*,*)
    write(*,'(A)') '--- DESIGN RESULTS ------------------------------------------'
    write(*,'(A,ES12.4)')   '  Theoretical Stages       = ', Nstage
    write(*,'(A,ES12.4)')   '  Overall Gas NTU          = ', NTU
    write(*,'(A,ES12.4,A)') '  Overall Gas HTU          = ', HTU, ' m'
    write(*,'(A,ES12.4,A)') '  Column Height            = ', Z, ' m'
    write(*,'(A,ES12.4,A)') '  Removal Efficiency       = ', removal, ' percent'
    write(*,*)

    write(*,'(A)') '--- COLUMN PROFILE ------------------------------------------'
    write(*,'(A)') '  z/H          y_gas         x_liq         y_star        driving       NTU_cum'
    write(*,'(A)') '  ---------------------------------------------------------------------------'
    n_points = 60
    ntu_cum = 0.0d0
    do i = 0, n_points-1
        y = y_out_t + (y_in - y_out_t)*dble(i)/dble(n_points-1)
        x = x_in + G/L*(y - y_out_t)
        ystar = m*x
        drive = y - ystar
        if (i > 0) then
            y_hi = y_out_t + (y_in - y_out_t)*dble(i)/dble(n_points-1)
            y_lo = y_out_t + (y_in - y_out_t)*dble(i-1)/dble(n_points-1)
            dy = y_hi - y_lo
            ntu_cum = ntu_cum + dy / max(1.0d-12, drive)
        end if
        write(*,'(F10.5,2X,ES12.4,2X,ES12.4,2X,ES12.4,2X,ES12.4,2X,ES12.4)') &
            dble(i)/dble(n_points-1), y, x, ystar, drive, ntu_cum
    end do
    write(*,*)
    write(*,'(A)') '--- CORRELATIONS USED ---------------------------------------'
    write(*,'(A)') '  Henry law: y* = m x.'
    write(*,'(A)') '  Operating line: x = x_in + (G/L)(y - y_out).'
    write(*,'(A)') '  NTU_OG = integral dy/(y - y*) from y_out to y_in.'
    write(*,'(A)') '  HTU_OG = G_molar_flux / K_Ga; Z = NTU_OG * HTU_OG.'
    write(*,'(A)') '  Kremser-style stage estimate based on absorption factor A = L/(mG).'

contains
    double precision function integrate_ntu(yin, yout, xin, mh, Gf, Lf)
        implicit none
        double precision, intent(in) :: yin, yout, xin, mh, Gf, Lf
        integer :: j, N
        double precision :: y, x, yst, f, sumv, dy, w
        N = 2000
        dy = (yin - yout)/dble(N)
        sumv = 0.0d0
        do j = 0, N
            y = yout + dy*dble(j)
            x = xin + Gf/Lf*(y - yout)
            yst = mh*x
            f = 1.0d0/max(1.0d-12, y - yst)
            if (j == 0 .or. j == N) then
                w = 0.5d0
            else
                w = 1.0d0
            end if
            sumv = sumv + w*f
        end do
        integrate_ntu = sumv*dy
    end function integrate_ntu
end program absorption_packed_bed


Solver Description

Size packed-bed gas absorption columns using Henry's law equilibrium, Kremser theoretical-stage estimate, and the NTU-HTU height method.

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

Execution Command:

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

absorption_packed_bed < input.txt

📥 Downloads & Local Files

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

! Inlet gas solute mole fraction y_in
0.10
! Target outlet gas mole fraction y_out
0.02
! Lean solvent inlet mole fraction x_in
0.0
! Henry slope m = y*/x
1.25
! Gas molar flow G [mol/s]
1.0
! Liquid molar flow L [mol/s]
2.2
! Volumetric gas-side coefficient K_Ga [mol/m3-s]
0.08
! Column cross-sectional area A [m2]
0.25
! Packing safety factor
1.0