πŸ’» 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.

Ideal Gas State Solver

Core Numerical Engine in Fortran 90 β€’ 0 total downloads

ideal_gas_calculator.f90
! =========================================================================
! Source File: ideal_gas_calculator.f90
! =========================================================================

ο»Ώprogram ideal_gas_calculator
    implicit none
    
    double precision :: P, V, T, n, m, M_mol, R_u, R_spec
    double precision :: rho, Cp, Cv, gamma_g, a_sound
    integer :: solve_for  ! 1=P, 2=V, 3=T, 4=n
    integer :: gas_type   ! 1=air, 2=N2, 3=O2, 4=CO2, 5=H2, 6=He, 7=CH4, 8=custom
    character(len=30) :: gas_name, solve_name
    double precision :: pi
    
    ! Additional calculations
    double precision :: P2, V2, T2
    double precision :: W_iso, W_adia, Q_iso
    integer :: i
    
    pi = 3.14159265358979d0
    R_u = 8.314d0  ! Universal gas constant [J/(mol.K)]
    
    ! Read inputs
    read(*,*) solve_for
    read(*,*) gas_type
    
    ! Set gas properties
    select case(gas_type)
    case(1)
        gas_name = 'Air'
        M_mol = 28.97d-3  ! kg/mol
        gamma_g = 1.4d0
        Cp = 1005.0d0
    case(2)
        gas_name = 'Nitrogen (N2)'
        M_mol = 28.014d-3
        gamma_g = 1.4d0
        Cp = 1040.0d0
    case(3)
        gas_name = 'Oxygen (O2)'
        M_mol = 31.998d-3
        gamma_g = 1.395d0
        Cp = 918.0d0
    case(4)
        gas_name = 'Carbon Dioxide (CO2)'
        M_mol = 44.01d-3
        gamma_g = 1.289d0
        Cp = 844.0d0
    case(5)
        gas_name = 'Hydrogen (H2)'
        M_mol = 2.016d-3
        gamma_g = 1.41d0
        Cp = 14307.0d0
    case(6)
        gas_name = 'Helium (He)'
        M_mol = 4.003d-3
        gamma_g = 1.667d0
        Cp = 5193.0d0
    case(7)
        gas_name = 'Methane (CH4)'
        M_mol = 16.043d-3
        gamma_g = 1.32d0
        Cp = 2226.0d0
    case default
        gas_name = 'Custom Gas'
        read(*,*) M_mol
        M_mol = M_mol * 1.0d-3  ! Convert g/mol to kg/mol
        read(*,*) gamma_g
        Cp = gamma_g * R_u / (M_mol * (gamma_g - 1.0d0))
    end select
    
    R_spec = R_u / M_mol
    Cv = Cp / gamma_g
    
    ! Read known values and solve
    select case(solve_for)
    case(1)  ! Solve for P
        solve_name = 'Pressure (P)'
        read(*,*) V    ! m3
        read(*,*) T    ! K
        read(*,*) n    ! mol
        P = n * R_u * T / V
        m = n * M_mol
    case(2)  ! Solve for V
        solve_name = 'Volume (V)'
        read(*,*) P    ! Pa
        read(*,*) T    ! K
        read(*,*) n    ! mol
        V = n * R_u * T / P
        m = n * M_mol
    case(3)  ! Solve for T
        solve_name = 'Temperature (T)'
        read(*,*) P    ! Pa
        read(*,*) V    ! m3
        read(*,*) n    ! mol
        T = P * V / (n * R_u)
        m = n * M_mol
    case(4)  ! Solve for n
        solve_name = 'Amount (n)'
        read(*,*) P    ! Pa
        read(*,*) V    ! m3
        read(*,*) T    ! K
        n = P * V / (R_u * T)
        m = n * M_mol
    end select
    
    ! Density
    rho = P / (R_spec * T)
    
    ! Speed of sound
    a_sound = sqrt(gamma_g * R_spec * T)
    
    ! ============================================
    ! OUTPUT
    ! ============================================
    write(*,'(A)') '============================================================'
    write(*,'(A)') '   IDEAL GAS LAW CALCULATOR'
    write(*,'(A)') '============================================================'
    write(*,*)
    write(*,'(A,A)')        '  Solving for             = ', trim(solve_name)
    write(*,'(A,A)')        '  Gas                     = ', trim(gas_name)
    write(*,*)
    write(*,'(A)') '--- GAS PROPERTIES ---'
    write(*,'(A,F12.4,A)')  '  Molar Mass (M)          = ', M_mol*1000, ' g/mol'
    write(*,'(A,F12.4,A)')  '  Gas Constant (R)        = ', R_spec, ' J/(kg.K)'
    write(*,'(A,F12.4)')    '  Specific Heat Ratio (gamma) = ', gamma_g
    write(*,'(A,F12.2,A)')  '  Cp                      = ', Cp, ' J/(kg.K)'
    write(*,'(A,F12.2,A)')  '  Cv                      = ', Cv, ' J/(kg.K)'
    write(*,*)
    write(*,'(A)') '--- STATE VARIABLES ---'
    write(*,'(A,F12.2,A)')  '  Pressure (P)            = ', P, ' Pa'
    write(*,'(A,F12.4,A)')  '  Pressure                = ', P/1000, ' kPa'
    write(*,'(A,F12.6,A)')  '  Pressure                = ', P/101325, ' atm'
    write(*,'(A,F12.6,A)')  '  Pressure                = ', P/1.0d5, ' bar'
    write(*,*)
    write(*,'(A,ES12.4,A)') '  Volume (V)              = ', V, ' m3'
    write(*,'(A,F12.4,A)')  '  Volume                  = ', V*1000, ' L'
    write(*,*)
    write(*,'(A,F12.2,A)')  '  Temperature (T)         = ', T, ' K'
    write(*,'(A,F12.2,A)')  '  Temperature             = ', T-273.15d0, ' deg-C'
    write(*,'(A,F12.2,A)')  '  Temperature             = ', T*1.8d0-459.67d0, ' deg-F'
    write(*,*)
    write(*,'(A,F12.6,A)')  '  Amount (n)              = ', n, ' mol'
    write(*,'(A,F12.6,A)')  '  Mass (m)                = ', m, ' kg'
    write(*,'(A,F12.4,A)')  '  Mass                    = ', m*1000, ' g'
    write(*,*)
    write(*,'(A)') '--- DERIVED PROPERTIES ---'
    write(*,'(A,F12.4,A)')  '  Density (rho)             = ', rho, ' kg/m3'
    write(*,'(A,F12.4,A)')  '  Specific Volume (v)     = ', 1.0d0/rho, ' m3/kg'
    write(*,'(A,F12.2,A)')  '  Speed of Sound (a)      = ', a_sound, ' m/s'
    write(*,*)
    
    ! Process calculations
    write(*,'(A)') '--- PROCESS CALCULATIONS ---'
    write(*,'(A)') '  (For expansion/compression from current state)'
    write(*,*)
    
    ! Isothermal compression/expansion to 2x pressure
    P2 = 2.0d0 * P
    V2 = n * R_u * T / P2
    W_iso = n * R_u * T * log(V / V2)  ! work done BY the gas
    Q_iso = W_iso  ! For isothermal: Q = W
    
    write(*,'(A)') '  Isothermal Process (T = const, P -> 2P):'
    write(*,'(A,F12.4,A)')  '    Final Volume           = ', V2*1000, ' L'
    write(*,'(A,F12.4,A)')  '    Work done by gas       = ', W_iso, ' J'
    write(*,'(A,F12.4,A)')  '    Heat transfer          = ', Q_iso, ' J'
    write(*,*)
    
    ! Isentropic compression to 2x pressure
    T2 = T * (P2/P)**((gamma_g-1.0d0)/gamma_g)
    V2 = n * R_u * T2 / P2
    W_adia = n * Cv * M_mol * (T - T2)  ! work done BY gas (negative for compression)
    
    write(*,'(A)') '  Isentropic Process (s = const, P -> 2P):'
    write(*,'(A,F12.2,A)')  '    Final Temperature      = ', T2, ' K'
    write(*,'(A,F12.4,A)')  '    Final Volume           = ', V2*1000, ' L'
    write(*,'(A,F12.4,A)')  '    Work done by gas       = ', W_adia, ' J'
    write(*,'(A)')          '    Heat transfer          =  0 J (adiabatic)'
    write(*,*)
    
    ! P-V data for chart
    write(*,'(A)') '--- P-V DIAGRAM DATA ---'
    write(*,'(A)') '  V [L]       P_iso [kPa]   P_isen [kPa]'
    write(*,'(A)') '  ---'
    
    do i = 1, 25
        V2 = V * (0.4d0 + dble(i-1) * 1.6d0 / 24.0d0)
        
        ! Isothermal: PV = nRT -> P = nRT/V
        P2 = n * R_u * T / V2
        
        ! Isentropic: PV^gamma = const -> P = P1(V1/V2)^gamma
        T2 = P * V**gamma_g / V2**gamma_g
        
        write(*,'(F10.4,2X,F12.4,4X,F12.4)') V2*1000, P2/1000, T2/1000
    end do
    
    write(*,*)
    write(*,'(A)') '--- EQUATION USED ---'
    write(*,'(A)') '  PV = nRT (ideal gas law)'
    write(*,'(A)') '  R_universal = 8.314 J/(mol.K)'
    write(*,'(A)') '  Assumptions: ideal gas behavior, no intermolecular forces'
    
end program ideal_gas_calculator


Solver Description

Resolves thermodynamic states for various engineering gases using the ideal gas equation of state $PV = m R_{specific} T$. Includes internal specific gas constant databases and automatically solves for whichever state variable is marked with $-1$.

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 -ffree-line-length-none ideal_gas_calculator.f90 -o ideal_gas_calc

Execution Command:

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

ideal_gas_calc < input.txt

πŸ“₯ Downloads & Local Files

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

! Gas Preset (1=Air, 2=He, 3=N2, 4=O2, 5=CO2, 6=H2)
1
! Pressure ($P$) [kPa] (or -1 if solving for P)
101.325
! Temperature ($T$) [K] (or -1 if solving for T)
298.15
! Volume ($V$) [mΒ³] (or -1 if solving for V)
1.0
! Mass ($m$) [kg] (or -1 if solving for m)
-1