⚡ Fortran 90 / 2008 Double Precision
📥 386 Downloads

Gas Mixture Properties

Standalone, self-contained numerical routine. Verify algorithms, inspect boundary condition equations, or compile locally for batch parametric runs.

🔬

Solver Purpose & Physical Scope

Computes collective ideal gas mixture properties (molecular weight, specific heats, viscosity, conductivity) using Wilke's method and Wassilijewa mixing rules.

📂 Discipline: Tools Precision: IEEE-754 64-bit Real(`real(8)`) 📥 Total Downloads: 386 times 📄 Source File: gas_mixture.f90
📁 calcul/Tools / gas_mixture.f90
program gas_mixture
    implicit none
    integer::nsp,iostat_val,i,j,ns
    double precision::y(10),MW(10),Cp(10),mu(10),kk(10)
    double precision::y_sum,Mmix,Cp_mol,Cp_mass,mu_mix,k_mix
    double precision::phi_ij,num,den,R_mix,gamma_mix,rho_STP
    double precision::R_gas,y1_sw,mu_sw,k_sw,y_tmp(10)
    R_gas=8.314462d0
    read(*,*,iostat=iostat_val) nsp
    if(iostat_val/=0.or.nsp<2)then;write(*,*)'ERROR: Bad input.';stop;end if
    if(nsp>10)nsp=10
    do i=1,nsp
      read(*,*,iostat=iostat_val) y(i),MW(i),Cp(i),mu(i),kk(i)
      if(iostat_val/=0)then;write(*,*)'ERROR: Bad input line',i;stop;end if
    end do
    y_sum=0.0d0;do i=1,nsp;y_sum=y_sum+y(i);end do
    if(y_sum>0)then;do i=1,nsp;y(i)=y(i)/y_sum;end do;end if
    Mmix=0;Cp_mol=0
    do i=1,nsp;Mmix=Mmix+y(i)*MW(i);Cp_mol=Cp_mol+y(i)*Cp(i);end do
    Cp_mass=Cp_mol/Mmix*1000.0d0
    R_mix=R_gas/Mmix*1000.0d0
    gamma_mix=Cp_mass/(Cp_mass-R_mix)
    rho_STP=101325.0d0*Mmix/(R_gas*273.15d0*1000.0d0)
    mu_mix=0;k_mix=0
    do i=1,nsp
      num=y(i)*mu(i); den=0
      do j=1,nsp
        phi_ij=(1.0d0+sqrt(mu(i)/mu(j))*(MW(j)/MW(i))**0.25d0)**2 &
               /sqrt(8.0d0*(1.0d0+MW(i)/MW(j)))
        den=den+y(j)*phi_ij
      end do
      mu_mix=mu_mix+num/max(den,1.0d-30)
    end do
    do i=1,nsp
      num=y(i)*kk(i); den=0
      do j=1,nsp
        phi_ij=(1.0d0+sqrt(mu(i)/mu(j))*(MW(j)/MW(i))**0.25d0)**2 &
               /sqrt(8.0d0*(1.0d0+MW(i)/MW(j)))
        den=den+y(j)*phi_ij
      end do
      k_mix=k_mix+num/max(den,1.0d-30)
    end do
    write(*,'(A)')'============================================================'
    write(*,'(A)')'   GAS MIXTURE PROPERTIES (Wilke / Wassilijewa)'
    write(*,'(A)')'============================================================'
    write(*,*)
    write(*,'(A)')'--- INPUTS --------------------------------------------------'
    write(*,'(A,I4)')      '  Number of Species         = ',nsp
    write(*,'(A)')'  #   y_i       MW        Cp[J/molK]  mu[uPa.s]  k[W/mK]'
    write(*,'(A)')'  -----------------------------------------------------------'
    do i=1,nsp
      write(*,'(I4,2X,F8.4,2X,F8.2,4X,F8.2,4X,F8.2,4X,F8.4)') i,y(i),MW(i),Cp(i),mu(i),kk(i)
    end do
    write(*,*)
    write(*,'(A)')'--- MIXTURE PROPERTIES --------------------------------------'
    write(*,'(A,F12.4,A)') '  Molar Mass M_mix         = ',Mmix,' g/mol'
    write(*,'(A,F12.4,A)') '  Cp_mix (molar)            = ',Cp_mol,' J/(mol.K)'
    write(*,'(A,F12.2,A)') '  Cp_mix (mass)             = ',Cp_mass,' J/(kg.K)'
    write(*,'(A,F12.4,A)') '  Viscosity mu_mix          = ',mu_mix,' uPa.s'
    write(*,'(A,F12.6,A)') '  Conductivity k_mix        = ',k_mix,' W/(m.K)'
    write(*,'(A,F12.4,A)') '  Gas Constant R_mix        = ',R_mix,' J/(kg.K)'
    write(*,'(A,F12.4)')   '  Gamma (Cp/Cv) approx      = ',gamma_mix
    write(*,'(A,F12.4,A)') '  Density at STP            = ',rho_STP,' kg/m3'
    write(*,*)
    ns=20
    write(*,'(A)')'--- SWEEP: y(1) VARIATION -----------------------------------'
    write(*,'(A)')'  y(1)        mu_mix      k_mix'
    write(*,'(A)')'  -----------------------------------------------------------'
    do i=1,ns
      y1_sw=dble(i-1)/dble(ns-1)
      y_tmp=0;y_tmp(1)=y1_sw
      if(nsp>1)then
        den=0;do j=2,nsp;den=den+y(j);end do
        if(den>0)then;do j=2,nsp;y_tmp(j)=(1.0d0-y1_sw)*y(j)/den;end do
        else;y_tmp(2)=1.0d0-y1_sw;end if
      end if
      mu_sw=0;k_sw=0
      do j=1,nsp
        num=y_tmp(j)*mu(j);den=0
        do ns=1,nsp
          phi_ij=(1.0d0+sqrt(mu(j)/mu(ns))*(MW(ns)/MW(j))**0.25d0)**2 &
                 /sqrt(8.0d0*(1.0d0+MW(j)/MW(ns)))
          den=den+y_tmp(ns)*phi_ij
        end do
        mu_sw=mu_sw+num/max(den,1.0d-30)
      end do
      do j=1,nsp
        num=y_tmp(j)*kk(j);den=0
        do ns=1,nsp
          phi_ij=(1.0d0+sqrt(mu(j)/mu(ns))*(MW(ns)/MW(j))**0.25d0)**2 &
                 /sqrt(8.0d0*(1.0d0+MW(j)/MW(ns)))
          den=den+y_tmp(ns)*phi_ij
        end do
        k_sw=k_sw+num/max(den,1.0d-30)
      end do
      write(*,'(F8.4,4X,F10.4,4X,F10.6)') y1_sw,mu_sw,k_sw
    end do
    write(*,*)
    write(*,'(A)')'--- CORRELATIONS USED ---------------------------------------'
    write(*,'(A)')'  Wilke (1950): mu_mix = sum(yi*mui / sum(yj*phi_ij))'
    write(*,'(A)')'  Wassilijewa (1904): k_mix same form with conductivity.'
    write(*,'(A)')'  phi_ij = [1+sqrt(mui/muj)*(Mj/Mi)^0.25]^2 / sqrt(8(1+Mi/Mj))'
end program gas_mixture


💻 How to Compile & Run Locally

1. Compilation (GNU Fortran / Intel oneAPI):

gfortran -O3 gas_mixture.f90 -o gas_mixture

2. Execution with input.txt redirection:

gas_mixture < input.txt

📄 Sample input.txt File Structure

Sample Data:
2
0.79
28.01
29.1
17.8
0.0260
0.21
32.00
29.4
20.6
0.0267
Parameter Description:
Number of species in mixture (up to 10)
Species 1 mole fraction
Species 1 molar mass [g/mol]
Species 1 molar heat capacity Cp [J/mol-K]
Species 1 dynamic viscosity [uPa-s]
Species 1 thermal conductivity [W/m-K]
(Repeat inputs sequentially for each species)