How to compute Arrhenius mixing viscosity in Python using UliEngineering
You can easily compute mixture viscosity using the Arrhenius (logarithmic) mixing rule with the UliEngineering Python library:
from UliEngineering.Physics.Viscosity import arrhenius_mixing_viscosity
from UliEngineering.EngineerIO import *
# Compute mixture viscosity for binary mixture
mole_fractions = [0.5, 0.5]
viscosities = [1e-3, 5e-3] # Pa·s
eta_mix = arrhenius_mixing_viscosity(mole_fractions, viscosities)
print(f"Binary mixture viscosity: {format_value(eta_mix, 'Pa·s')}")
# Compute mixture viscosity for ternary mixture
mole_fractions = [0.3, 0.3, 0.4]
viscosities = [1e-3, 5e-3, 10e-3] # Pa·s
eta_mix = arrhenius_mixing_viscosity(mole_fractions, viscosities)
print(f"Ternary mixture viscosity: {format_value(eta_mix, 'Pa·s')}")
# Compute mixture viscosity for pure component
mole_fractions = [1.0, 0.0]
viscosities = [1e-3, 5e-3] # Pa·s
eta_mix = arrhenius_mixing_viscosity(mole_fractions, viscosities)
print(f"Pure component viscosity: {format_value(eta_mix, 'Pa·s')}")Example output
Binary mixture viscosity: 2.24 mPa·s
Ternary mixture viscosity: 3.84 mPa·s
Pure component viscosity: 1.00 mPa·sThe Arrhenius mixing rule is given by:
$$ \ln(\eta_{mix}) = \sum_{i} x_i \ln(\eta_i) $$where $\eta_{mix}$ is the mixture viscosity, $x_i$ is the mole fraction of component $i$, and $\eta_i$ is the viscosity of component $i$.
This can also be expressed as:
$$ \eta_{mix} = \exp\left(\sum_{i} x_i \ln(\eta_i)\right) = \prod_{i} \eta_i^{x_i} $$The Arrhenius mixing rule is a logarithmic mixing rule that provides good estimates for mixture viscosity when the components have similar molecular structures. It is particularly useful for ideal mixtures and is commonly applied in petroleum engineering, polymer science, and chemical engineering.
The plot above shows how the mixture viscosity varies as the composition changes for a ternary mixture. The mixture viscosity follows a logarithmic (geometric mean) interpolation between the pure component viscosities. Notice that the mixture viscosity is always between the minimum and maximum component viscosities.
This mixing rule assumes ideal mixing behavior and may not be accurate for strongly non-ideal mixtures or when there are significant molecular interactions between components.
Related posts
- How to compute Andrade viscosity in Python using UliEngineering
- How to compute VFT viscosity in Python using UliEngineering
- How to compute Sutherland gas viscosity in Python using UliEngineering
Plot generation script
#!/usr/bin/env python3
import matplotlib.pyplot as plt
import numpy as np
import sys
sys.path.insert(0, '/home/uli/dev/UliEngineering')
from UliEngineering.Physics.Viscosity import arrhenius_mixing_viscosity
# Create plot
plt.figure(figsize=(10, 6))
# Component viscosities (in Pa·s)
viscosities = [1e-3, 5e-3, 10e-3] # Water-like, medium, high
# Calculate mixture viscosity for different compositions
n_points = 100
results = []
for i in range(n_points + 1):
# Vary composition from 100% component 0 to 100% component 2
x1 = i / n_points
x2 = (1 - x1) / 2
x3 = (1 - x1) / 2
fractions = [x1, x2, x3]
eta_mix = arrhenius_mixing_viscosity(fractions, viscosities) * 1000 # Convert to mPa·s
results.append(eta_mix)
plt.plot(np.linspace(0, 100, n_points + 1), results, color='blue', linewidth=2, label='Mixture viscosity')
# Also plot the individual component viscosities as horizontal lines
for i, eta in enumerate(viscosities):
plt.axhline(y=eta * 1000, color=['green', 'orange', 'red'][i], linestyle='--',
linewidth=2, label=f'Component {i+1} ({eta*1000:.1f} mPa·s)')
plt.xlabel('Component 1 Mole Fraction (%)', fontsize=12)
plt.ylabel('Mixture Viscosity (mPa·s)', fontsize=12)
plt.title('Arrhenius Mixing Rule for Ternary Mixture', fontsize=14, fontweight='bold')
plt.legend(loc='upper right', fontsize=10)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('arrhenius_mixing_plot.svg', format='svg', dpi=300)
print("Plot saved to arrhenius_mixing_plot.svg")