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:

arrhenius_mixing_viscosity.py
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

arrhenius_mixing_viscosity_output.txt
Binary mixture viscosity: 2.24 mPa·s
Ternary mixture viscosity: 3.84 mPa·s
Pure component viscosity: 1.00 mPa·s

arrhenius mixing plot.svg

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


Plot generation script

plot_arrhenius_mixing.py
#!/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")

Check out similar posts by category: Physics, Python