Viscosity Models
This guide documents the viscosity calculation methods available in NeqSim for gas, liquid, and multiphase systems.
Table of Contents
Overview
Viscosity describes a fluid’s resistance to flow. NeqSim provides several viscosity models suitable for different applications:
Units:
- Default output: Pa·s (Pascal-seconds)
- Alternative: cP (centipoise), where 1 cP = 0.001 Pa·s
Setting a viscosity model:
fluid.initPhysicalProperties();
fluid.getPhase("gas").getPhysicalProperties().setViscosityModel("friction theory");
fluid.getPhase("oil").getPhysicalProperties().setViscosityModel("LBC");
Available Models
LBC (Lohrenz-Bray-Clark)
The Lohrenz-Bray-Clark (1964) method is widely used in reservoir simulation. It combines a dilute gas correlation with a dense fluid polynomial correction.
Class: LBCViscosityMethod
Equation: \(\eta = \eta^* + \frac{(\eta_r - 0.0001)^4}{\xi}\)
where:
- $\eta^*$ is the dilute gas viscosity
- $\eta_r$ is a function of reduced density
- $\xi$ is the inverse viscosity parameter
The dense fluid contribution uses a polynomial: \(\eta_r = a_0 + a_1\rho_r + a_2\rho_r^2 + a_3\rho_r^3 + a_4\rho_r^4\)
Default parameters: {0.10230, 0.023364, 0.058533, -0.040758, 0.0093324}
Applicable phases: Gas, Oil
Best for:
- Reservoir simulation
- Light to medium oils
- Systems where tuning to lab data is available
Usage:
fluid.getPhase("oil").getPhysicalProperties().setViscosityModel("LBC");
Friction Theory
The Quiñones-Cisneros and Firoozabadi (2000) friction theory relates viscosity to the repulsive and attractive pressure contributions from the equation of state.
Class: FrictionTheoryViscosityMethod
Equation: \(\eta = \eta_0 + \kappa_a P_a + \kappa_{aa} P_a^2 + \kappa_r P_r + \kappa_{rr} P_r^2\)
where:
- $\eta_0$ is the dilute gas viscosity (Chung low-density term + Wilke mixture rule)
- $P_a$ is the attractive pressure from EoS
- $P_r$ is the repulsive pressure from EoS
- $\kappa$ are friction coefficients (EoS-dependent)
Applicable phases: Gas, Oil (any EoS-based phase)
Best for:
- Wide pressure/temperature ranges
- Near-critical conditions
- When using SRK or PR EoS
Automatic EoS detection: The method automatically selects SRK or PR constants based on the phase type.
Implementation notes in NeqSim (2026 update):
- SRK and PR friction constants are selected automatically.
- The dilute-gas baseline now uses Wilke mixing, which is the standard state-of-practice for mixture dilute viscosities.
- The Chung correction factor $F_c$ includes acentric factor, dipole moment, and component viscosity correction term to better handle polar species.
- If friction theory is called for a non-EoS phase, NeqSim falls back to total pressure as repulsive contribution and zero attractive contribution, with a warning in logs.
Usage:
fluid.getPhase("oil").getPhysicalProperties().setViscosityModel("friction theory");
Custom constants (for other EoS):
FrictionTheoryViscosityMethod viscModel =
(FrictionTheoryViscosityMethod) fluid.getPhase("oil")
.getPhysicalProperties().getViscosityModel();
// Set custom friction theory constants
viscModel.setFrictionTheoryConstants(kapac, kaprc, kaprrc, kapa, kapr, kaprr);
PFCT (Pedersen)
The Pedersen Friction Corresponding States Theory uses methane as a reference fluid with shape factors for mixture calculations.
The model can be selected with either "PFCT" or "CSP". The "CSP" alias is intended for PVT workflows and external reports that label the Pedersen/PFCT viscosity model as CSP viscosity.
Classes:
PFCTViscosityMethodMod86- Standard Pedersen method (1987)PFCTViscosityMethodHeavyOil- Extended for heavy oils
Equation: \(\eta_{mix} = \eta_{ref} \cdot \frac{f_\eta \cdot \alpha_{mix}}{\alpha_0}\)
where:
- $\eta_{ref}$ is the reference fluid (methane) viscosity
- $f_\eta$ is the shape factor ratio
- $\alpha$ are molecular weight correction factors
Applicable phases: Gas, Oil
Best for:
- Petroleum mixtures with characterized fractions
- Heavy oil systems (use
"PFCT-Heavy-Oil") - Wide-range predictions
- PVT viscosity matching with four CSP correction factors
Usage:
// Standard Pedersen
fluid.getPhase("oil").getPhysicalProperties().setViscosityModel("PFCT");
// Equivalent CSP alias
fluid.getPhase("oil").getPhysicalProperties().setViscosityModel("CSP");
// Heavy oil variant
fluid.getPhase("oil").getPhysicalProperties().setViscosityModel("PFCT-Heavy-Oil");
Chung Method
The Chung method (1984, 1988) is a corresponding states method for dilute gas and dense fluid viscosity.
Class: ChungViscosityMethod
Equation (dilute gas): \(\eta_0 = \frac{40.785 F_c \sqrt{M T}}{\Omega_v V_c^{2/3}}\)
where:
- $F_c$ is the correction factor for polar/associating fluids
- $\Omega_v$ is the collision integral
- $V_c$ is critical volume
- $M$ is molar mass
Applicable phases: Primarily gas phase
Best for:
- Dilute gas mixtures
- Polar gases
- As baseline for other methods
Usage:
fluid.getPhase("gas").getPhysicalProperties().setViscosityModel("Chung");
Polynomial Correlation
Uses component-specific polynomial coefficients from the database.
Class: Viscosity (liquid), GasViscosity (gas)
Equation: \(\ln(\eta) = A + \frac{B}{T} + C\ln(T) + DT\)
where A, B, C, D are component-specific parameters from COMP database.
Database columns: LIQVISC1, LIQVISC2, LIQVISC3, LIQVISC4
Applicable phases: Primarily liquid
Best for:
- Pure components with available parameters
- Simple mixtures with mixing rules
Usage:
fluid.getPhase("oil").getPhysicalProperties().setViscosityModel("polynom");
Reference Fluid Methods
Specialized high-accuracy methods for specific fluids:
Methane (Reference)
Class: MethaneViscosityMethod
- Uses Setzmann & Wagner reference equation
- High accuracy for pure methane
- Used as reference in PFCT calculations
CO₂
Class: CO2ViscosityMethod
- Fenghour et al. correlation
- Covers gas, liquid, and supercritical regions
Hydrogen
Classes: MuznyViscosityMethod, MuznyModViscosityMethod
- High-accuracy hydrogen viscosity
- Important for hydrogen energy applications
Usage:
fluid.getPhase("gas").getPhysicalProperties().setViscosityModel("MethaneModel");
fluid.getPhase("gas").getPhysicalProperties().setViscosityModel("CO2Model");
fluid.getPhase("gas").getPhysicalProperties().setViscosityModel("Muzny");
Model Selection Guide
| Application | Recommended Model | Notes |
|---|---|---|
| Reservoir simulation | LBC | Tunable, industry standard |
| Wide P-T range | Friction Theory | Good near critical |
| Heavy oils | PFCT-Heavy-Oil | Extended for high MW |
| Characterized crudes | PFCT | Works with pseudo-components |
| Gas processing | Chung | Good for gases |
| Pure CO₂ | CO2Model | High accuracy |
| Pure H₂ | Muzny | Reference accuracy |
| Aqueous systems | Salt Water | Water correlation |
Tuning Parameters
LBC Parameter Tuning
The LBC method is commonly tuned to match laboratory viscosity data:
// Get current parameters
LBCViscosityMethod lbc = (LBCViscosityMethod)
fluid.getPhase("oil").getPhysicalProperties().getViscosityModel();
// Set all 5 parameters
double[] params = {0.1023, 0.023364, 0.058533, -0.040758, 0.0093324};
fluid.getPhase("oil").getPhysicalProperties().setLbcParameters(params);
// Or tune individual parameters
fluid.getPhase("oil").getPhysicalProperties().setLbcParameter(0, 0.105);
Tuning procedure:
- Measure viscosity at multiple P-T conditions
- Run flash and calculate properties
- Adjust parameters to minimize error
- Validate at other conditions
CSP PFCT Parameter Tuning
The PFCT/CSP viscosity model exposes four dimensionless CSP correction factors. All factors default to 1.0, preserving the historical NeqSim calculation unless a user supplies tuned values. External PVT tools may report fitted vectors such as 0.6232, 1.1507, 1.0000, 1.0000; these can be supplied directly as the four-value CSP viscosity parameter vector.
| Index | Regression parameter | Corrected PFCT term |
|---|---|---|
| 0 | VISCOSITY_CSP_1 |
Critical-temperature scaling exponent |
| 1 | VISCOSITY_CSP_2 |
Critical-pressure scaling exponent |
| 2 | VISCOSITY_CSP_3 |
Molar-mass scaling exponent |
| 3 | VISCOSITY_CSP_4 |
Alpha/molecular-weight correction exponent |
Use PhysicalProperties.setCspViscosityParameters(double[]) to set all four parameters, setCspViscosityParameter(int, double) to tune one parameter, and getCspViscosityParameters() to read the active values. The longer setCspViscosityCorrectionFactors and getCspViscosityCorrectionFactors names are equivalent aliases.
For automated fitting, add viscosity measurements to PVTRegression with addViscosityData(...), then register RegressionParameter.VISCOSITY_CSP_1 through VISCOSITY_CSP_4 individually or call addCspViscosityRegressionParameters() to fit all four together. Viscosity observations are expected in Pa s and can target gas, oil, liquid, aqueous, or water phases.
Usage Examples
Basic Viscosity Calculation
import neqsim.thermo.system.SystemSrkEos;
import neqsim.thermodynamicoperations.ThermodynamicOperations;
// Create and flash fluid
SystemInterface fluid = new SystemSrkEos(350.0, 150.0);
fluid.addComponent("methane", 0.70);
fluid.addComponent("ethane", 0.10);
fluid.addComponent("propane", 0.05);
fluid.addComponent("n-heptane", 0.10);
fluid.addComponent("n-decane", 0.05);
fluid.setMixingRule("classic");
ThermodynamicOperations ops = new ThermodynamicOperations(fluid);
ops.TPflash();
// Initialize physical properties
fluid.initPhysicalProperties();
// Get viscosities
double gasVisc = fluid.getPhase("gas").getViscosity("cP");
double oilVisc = fluid.getPhase("oil").getViscosity("cP");
System.out.println("Gas viscosity: " + gasVisc + " cP");
System.out.println("Oil viscosity: " + oilVisc + " cP");
Comparing Viscosity Models
String[] models = {"LBC", "friction theory", "PFCT"};
for (String model : models) {
SystemInterface fluid = createFluid();
ops.TPflash();
fluid.initPhysicalProperties();
fluid.getPhase("oil").getPhysicalProperties().setViscosityModel(model);
fluid.initPhysicalProperties();
double visc = fluid.getPhase("oil").getViscosity("cP");
System.out.println(model + ": " + visc + " cP");
}
Viscosity vs Temperature
SystemInterface baseFluid = createFluid();
baseFluid.initPhysicalProperties();
double[] temps = {300, 320, 340, 360, 380, 400}; // K
for (double T : temps) {
SystemInterface fluid = baseFluid.clone();
fluid.setTemperature(T, "K");
ThermodynamicOperations ops = new ThermodynamicOperations(fluid);
ops.TPflash();
fluid.initPhysicalProperties();
double visc = fluid.getPhase("oil").getViscosity("cP");
System.out.println("T=" + (T-273.15) + "°C: " + visc + " cP");
}
Mathematical Details
Dilute Gas Viscosity (Chapman-Enskog)
For dilute gases, viscosity is calculated from kinetic theory:
\[\eta_0 = \frac{5}{16} \frac{\sqrt{\pi m k_B T}}{\pi \sigma^2 \Omega^{(2,2)*}}\]where:
- $m$ is molecular mass
- $\sigma$ is Lennard-Jones diameter
- $\Omega^{(2,2)*}$ is the collision integral
Mixing Rules
Most models use molar fraction-weighted mixing:
\[\eta_{mix} = \exp\left(\sum_i x_i \ln \eta_i\right)\]or the more rigorous:
\[\eta_{mix} = \frac{\sum_i x_i \sqrt{M_i} \eta_i}{\sum_i x_i \sqrt{M_i}}\]References
- Lohrenz, J., Bray, B.G., Clark, C.R. (1964). Calculating Viscosities of Reservoir Fluids from Their Compositions. JPT.
- Quiñones-Cisneros, S.E., Firoozabadi, A. (2000). One Parameter Friction Theory. AIChE J.
- Pedersen, K.S., et al. (1987). Viscosity of Crude Oils. Chem. Eng. Sci.
- Chung, T.H., et al. (1988). Generalized Multiparameter Correlation for Nonpolar and Polar Fluid Transport Properties. I&EC Res.