💻 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.
Binary Diffusivity Estimator
Core Numerical Engine in Fortran 90 • 69 total downloads
binary_diffusivity.f90
! =========================================================================
! Source File: binary_diffusivity.f90
! =========================================================================
program binary_diffusivity
implicit none
integer :: mode, i, n_points, iostat_val
double precision :: T_C, T_K, P_atm, MA, MB, sigmaA, sigmaB, epsA, epsB
double precision :: VA, mu_cP, phi, rho, D_cm2s, D_m2s, Sc
double precision :: sigmaAB, epsAB, Tstar, OmegaD, Tprof_C, Tprof_K, Dprof_cm2s, Dprof_m2s
character(len=80) :: method_name
read(*,*,iostat=iostat_val) mode
if (iostat_val /= 0) then
write(*,*) 'ERROR: Invalid model selection input.'
stop
end if
read(*,*,iostat=iostat_val) T_C
read(*,*,iostat=iostat_val) P_atm
read(*,*,iostat=iostat_val) MA
read(*,*,iostat=iostat_val) MB
read(*,*,iostat=iostat_val) sigmaA
read(*,*,iostat=iostat_val) sigmaB
read(*,*,iostat=iostat_val) epsA
read(*,*,iostat=iostat_val) epsB
read(*,*,iostat=iostat_val) VA
read(*,*,iostat=iostat_val) mu_cP
read(*,*,iostat=iostat_val) phi
read(*,*,iostat=iostat_val) rho
if (iostat_val /= 0) then
write(*,*) 'ERROR: Failed to read all binary diffusivity parameters.'
stop
end if
T_K = T_C + 273.15d0
if (T_K <= 0.0d0) then
write(*,*) 'ERROR: Temperature must be above absolute zero.'
stop
end if
if (MA <= 0.0d0 .or. MB <= 0.0d0) then
write(*,*) 'ERROR: Molecular weights must be positive.'
stop
end if
if (mode == 1) then
if (P_atm <= 0.0d0 .or. sigmaA <= 0.0d0 .or. sigmaB <= 0.0d0 .or. epsA <= 0.0d0 .or. epsB <= 0.0d0) then
write(*,*) 'ERROR: Gas pressure, sigma, and epsilon/k inputs must be positive.'
stop
end if
method_name = 'Chapman-Enskog gas diffusion'
call gas_diffusivity(T_K, P_atm, MA, MB, sigmaA, sigmaB, epsA, epsB, D_cm2s, sigmaAB, epsAB, Tstar, OmegaD)
D_m2s = D_cm2s * 1.0d-4
Sc = 0.0d0
else if (mode == 2) then
if (VA <= 0.0d0 .or. mu_cP <= 0.0d0 .or. phi <= 0.0d0) then
write(*,*) 'ERROR: Liquid molar volume, viscosity, and association factor must be positive.'
stop
end if
method_name = 'Wilke-Chang liquid diffusion'
D_cm2s = 7.4d-8 * sqrt(phi * MB) * T_K / (mu_cP * VA**0.6d0)
D_m2s = D_cm2s * 1.0d-4
if (rho > 0.0d0) then
Sc = (mu_cP * 1.0d-3) / (rho * D_m2s)
else
Sc = 0.0d0
end if
sigmaAB = 0.0d0; epsAB = 0.0d0; Tstar = 0.0d0; OmegaD = 0.0d0
else
write(*,*) 'ERROR: Invalid model. Use 1 for gas or 2 for liquid.'
stop
end if
write(*,'(A)') '============================================================'
write(*,'(A)') ' BINARY DIFFUSIVITY ESTIMATOR ENGINE'
write(*,'(A)') '============================================================'
write(*,*)
write(*,'(A,A)') ' Method = ', trim(method_name)
write(*,'(A,F12.4,A)') ' Temperature = ', T_C, ' deg-C'
write(*,'(A,F12.4,A)') ' Temperature (K) = ', T_K, ' K'
write(*,'(A,F12.6,A)') ' Pressure (atm) = ', P_atm, ' atm'
write(*,*)
write(*,'(A)') '--- SPECIES / MOLECULAR INPUTS -----------------------------'
write(*,'(A,F12.4,A)') ' Molecular Weight A = ', MA, ' g/mol'
write(*,'(A,F12.4,A)') ' Molecular Weight B = ', MB, ' g/mol'
if (mode == 1) then
write(*,'(A,F12.4,A)') ' sigma_A = ', sigmaA, ' Angstrom'
write(*,'(A,F12.4,A)') ' sigma_B = ', sigmaB, ' Angstrom'
write(*,'(A,F12.4,A)') ' epsilon/k_A = ', epsA, ' K'
write(*,'(A,F12.4,A)') ' epsilon/k_B = ', epsB, ' K'
write(*,'(A,F12.4,A)') ' sigma_AB = ', sigmaAB, ' Angstrom'
write(*,'(A,F12.4,A)') ' epsilon/k_AB = ', epsAB, ' K'
write(*,'(A,F12.4)') ' Reduced Temperature T* = ', Tstar
write(*,'(A,F12.4)') ' Collision Integral = ', OmegaD
else
write(*,'(A,F12.4,A)') ' Solute Molar Volume VA = ', VA, ' cm3/mol'
write(*,'(A,F12.4,A)') ' Solvent Viscosity = ', mu_cP, ' cP'
write(*,'(A,F12.4)') ' Association Factor phi = ', phi
write(*,'(A,F12.4,A)') ' Liquid Density = ', rho, ' kg/m3'
end if
write(*,*)
write(*,'(A)') '--- DIFFUSIVITY RESULTS -------------------------------------'
write(*,'(A,ES12.4,A)') ' Binary Diffusivity (D_AB) = ', D_m2s, ' m2/s'
write(*,'(A,ES12.4,A)') ' D_AB [cm2/s] = ', D_cm2s, ' cm2/s'
if (mode == 2 .and. Sc > 0.0d0) write(*,'(A,ES12.4)') ' Schmidt Number (Sc) = ', Sc
write(*,*)
write(*,'(A)') '--- PARAMETRIC PROFILE --------------------------------------'
write(*,'(A)') ' T_C [C] P [atm] D_AB [m2/s] D_AB [cm2/s]'
write(*,'(A)') ' ----------------------------------------------------------'
n_points = 40
do i = 1, n_points
Tprof_C = max(-250.0d0, T_C - 50.0d0 + 100.0d0 * dble(i-1) / dble(n_points-1))
Tprof_K = Tprof_C + 273.15d0
if (mode == 1) then
call gas_diffusivity(Tprof_K, P_atm, MA, MB, sigmaA, sigmaB, epsA, epsB, Dprof_cm2s, sigmaAB, epsAB, Tstar, OmegaD)
else
Dprof_cm2s = 7.4d-8 * sqrt(phi * MB) * Tprof_K / (mu_cP * VA**0.6d0)
end if
Dprof_m2s = Dprof_cm2s * 1.0d-4
write(*,'(F9.3,2X,F10.5,2X,ES12.4,2X,ES12.4)') Tprof_C, P_atm, Dprof_m2s, Dprof_cm2s
end do
write(*,*)
write(*,'(A)') '--- CORRELATIONS USED ---------------------------------------'
if (mode == 1) then
write(*,'(A)') ' Chapman-Enskog: D_AB = 0.001858 T^(3/2) sqrt(1/MA+1/MB)/(P sigma_AB^2 Omega_D) [cm2/s]'
write(*,'(A)') ' sigma_AB = (sigma_A + sigma_B)/2; epsilon_AB/k = sqrt(epsilon_A/k * epsilon_B/k)'
write(*,'(A)') ' Omega_D uses the Neufeld et al. collision-integral fit.'
else
write(*,'(A)') ' Wilke-Chang: D_AB = 7.4E-8 sqrt(phi MB) T/(mu_B VA^0.6) [cm2/s]'
write(*,'(A)') ' Intended for dilute solutes diffusing in liquid solvents.'
end if
contains
subroutine gas_diffusivity(TK, Patm, M1, M2, sig1, sig2, eps1, eps2, Dcm, sigAB, epsAB, Tst, Om)
implicit none
double precision, intent(in) :: TK, Patm, M1, M2, sig1, sig2, eps1, eps2
double precision, intent(out) :: Dcm, sigAB, epsAB, Tst, Om
sigAB = 0.5d0 * (sig1 + sig2)
epsAB = sqrt(eps1 * eps2)
Tst = TK / epsAB
Om = collision_integral(Tst)
Dcm = 0.001858d0 * TK**1.5d0 * sqrt(1.0d0/M1 + 1.0d0/M2) / (Patm * sigAB**2 * Om)
end subroutine gas_diffusivity
double precision function collision_integral(Ts)
implicit none
double precision, intent(in) :: Ts
collision_integral = 1.06036d0 / Ts**0.15610d0 + 0.19300d0 / exp(0.47635d0*Ts) + &
1.03587d0 / exp(1.52996d0*Ts) + 1.76474d0 / exp(3.89411d0*Ts)
end function collision_integral
end program binary_diffusivity
Solver Description
Estimate binary diffusion coefficient D_AB for gas pairs using Chapman-Enskog and dilute solutes in liquids using Wilke-Chang.
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 binary_diffusivity.f90 -o binary_diffusivity
Execution Command:
Execute the program by feeding the sample input file into the program using stdin redirection:
binary_diffusivity < input.txt
📥 Downloads & Local Files
Preview of the required input file (input.txt):
! Diffusion Model (1=Gas, 2=Liquid)
1
! Temperature T [C]
25.0
! Pressure P [atm] (Gas only)
1.0
! Solute Molecular Weight MA [g/mol]
18.015
! Solvent Molecular Weight MB [g/mol]
28.97
! Solute Lennard-Jones Parameter sigmaA [A]
2.641
! Solvent Lennard-Jones Parameter sigmaB [A]
3.711
! Solute Energy Parameter epsA/k [K]
809.1
! Solvent Energy Parameter epsB/k [K]
78.6
! Solute Molar Volume VA [cm3/mol] (Liquid only)
18.0
! Solvent Viscosity muB [cP] (Liquid only)
1.0
! Association Factor phi (Liquid only)
1.0
! Liquid Density rho [kg/m3] (Liquid only)
1.184
1
! Temperature T [C]
25.0
! Pressure P [atm] (Gas only)
1.0
! Solute Molecular Weight MA [g/mol]
18.015
! Solvent Molecular Weight MB [g/mol]
28.97
! Solute Lennard-Jones Parameter sigmaA [A]
2.641
! Solvent Lennard-Jones Parameter sigmaB [A]
3.711
! Solute Energy Parameter epsA/k [K]
809.1
! Solvent Energy Parameter epsB/k [K]
78.6
! Solute Molar Volume VA [cm3/mol] (Liquid only)
18.0
! Solvent Viscosity muB [cP] (Liquid only)
1.0
! Association Factor phi (Liquid only)
1.0
! Liquid Density rho [kg/m3] (Liquid only)
1.184