Class PedersenAsphalteneCharacterization
This class implements asphaltene characterization and precipitation modeling based on the methodology described by K.S. Pedersen (SPE-224534-MS, 2025). The key principle is that asphaltene precipitation can be successfully modeled using a classical cubic equation of state (SRK or PR) without requiring association terms.
Theoretical Background
Asphaltenes are characterized as heavy pseudo-components with specific critical properties derived from the same correlations used for C7+ characterization. The precipitation mechanism is modeled as a liquid-liquid phase split between an asphaltene-rich heavy phase and an asphaltene-lean light phase.
Key Features
- Uses Pedersen correlations for critical temperature, pressure, and acentric factor
- Treats asphaltene as a single heavy pseudo-component or multiple pseudo-components
- Models precipitation as liquid-liquid equilibrium (not solid precipitation)
- Compatible with standard SRK and PR equations of state
- Consistent with existing Pedersen C7+ characterization in NeqSim
Asphaltene Characterization
The asphaltene component is characterized using:
- Molecular weight: Typically 750-1500 g/mol (adjustable)
- Density: Typically 1.05-1.20 g/cm³ at standard conditions
- Critical properties: Calculated using Pedersen correlations for heavy fractions
References:
- Pedersen, K.S. (2025). "The Mechanisms Behind Asphaltene Precipitation – Successfully Handled by a Classical Cubic Equation of State." SPE-224534-MS, GOTECH, Dubai.
- Pedersen, K.S., Christensen, P.L. (2007). "Phase Behavior of Petroleum Reservoir Fluids." CRC Press.
- Pedersen, K.S., Fredenslund, A., Thomassen, P. (1989). "Properties of Oils and Natural Gases." Gulf Publishing.
- Version:
- 1.0
- Author:
- ESOL
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate doubleCalculated acentric factor.private doubleDensity of asphaltene at standard conditions (g/cm³).private doubleMolecular weight of asphaltene pseudo-component (g/mol).private doubleWeight fraction of asphaltene in the oil.private doubleCalculated boiling point (K).private doubleCalculated critical pressure (bar).private doubleCalculated critical temperature (K).static final doubleDefault asphaltene density at standard conditions (g/cm³).static final doubleDefault asphaltene molecular weight (g/mol).static final doubleDefault asphaltene weight fraction in heavy oil.static final doubleHeavy asphaltene molecular weight (g/mol) - for very heavy oils.private booleanFlag indicating whether asphaltene has been characterized.private doubleBinary interaction parameter adjustment for asphaltene-light components.private static final org.apache.logging.log4j.LoggerLogger object for class.static final doubleMaximum asphaltene molecular weight (g/mol).static final doubleMinimum asphaltene molecular weight (g/mol).private intNumber of asphaltene pseudo-components for distribution.private doubleMultiplier for acentric factor tuning.private doubleMultiplier for critical pressure tuning.private SystemInterfaceReference to the thermodynamic system.private doubleMultiplier for boiling point tuning.private doubleMultiplier for critical temperature tuning. -
Constructor Summary
ConstructorsConstructorDescriptionDefault constructor.PedersenAsphalteneCharacterization(double asphalteneMW, double asphalteneDensity, double asphalteneWeightFraction) Constructor with asphaltene properties.Constructor with system reference. -
Method Summary
Modifier and TypeMethodDescriptionaddAsphalteneToSystem(SystemInterface system, double moles) Adds the asphaltene component to the thermodynamic system.voidaddDistributedAsphaltene(SystemInterface system, double totalMoles, int numberOfComponents) Adds multiple asphaltene pseudo-components with distributed molecular weights.assessStability(double oilSolubilityParameter) Estimates stability based on solubility parameter difference.private voidCalculates the acentric factor using Pedersen correlation.private voidCalculates the boiling point using Søreide correlation.private voidCalculates the critical pressure using Pedersen correlation for heavy fractions.private voidCalculates the critical temperature using Pedersen correlation for heavy fractions.doublecalculateOnsetPressure(SystemInterface system, double startPressure, double endPressure) Calculates the asphaltene onset pressure at the given temperature.doublecalculateSolubilityParameter(double temperature) Estimates asphaltene solubility parameter at given conditions.voidCharacterizes the asphaltene component using Pedersen correlations.private intcountLiquidPhases(SystemInterface system) Counts the number of liquid phases in the system.doubleGets the calculated acentric factor.doubleGets the asphaltene density at standard conditions.doubleGets the asphaltene molecular weight.doubleGets the asphaltene weight fraction in the oil.doubleGets the calculated boiling point.doubleGets the calculated critical pressure.doubleGets the calculated critical temperature.doubleGets the binary interaction parameter adjustment.intGets the number of asphaltene pseudo-components used in distributed characterization.doubleGets the acentric factor tuning multiplier.doubleGets the critical pressure tuning multiplier.doubleGets the boiling point tuning multiplier.doubleGets the critical temperature tuning multiplier.booleanChecks if asphaltene has been characterized.static voidMain method demonstrating Pedersen's asphaltene TPflash.static booleanMarks asphaltene-rich liquid phases with PhaseType.LIQUID_ASPHALTENE.private doublerefineOnsetPressure(SystemInterface system, ThermodynamicOperations ops, double upperP, double lowerP) Refines the onset pressure using bisection.voidResets all tuning parameters to default values (1.0).voidsetAsphalteneDensity(double asphalteneDensity) Sets the asphaltene density at standard conditions.voidsetAsphalteneMW(double asphalteneMW) Sets the asphaltene molecular weight.voidsetAsphalteneWeightFraction(double asphalteneWeightFraction) Sets the asphaltene weight fraction in the oil.voidsetKijAdjustment(double kijAdjustment) Sets the binary interaction parameter adjustment for asphaltene-light component pairs.voidsetNumberOfAsphaltenePseudoComponents(int numberOfComponents) Sets the number of asphaltene pseudo-components for distributed characterization.voidsetOmegaMultiplier(double omegaMultiplier) Sets the acentric factor tuning multiplier.voidsetPcMultiplier(double pcMultiplier) Sets the critical pressure tuning multiplier.voidsetTbMultiplier(double tbMultiplier) Sets the boiling point tuning multiplier.voidsetTcMultiplier(double tcMultiplier) Sets the critical temperature tuning multiplier.voidsetTuningParameters(double tcMultiplier, double pcMultiplier, double omegaMultiplier) Sets all tuning parameters at once.toString()Returns a summary of the asphaltene characterization.static booleanTPflash(SystemInterface system) Performs a TPflash and automatically marks asphaltene-rich liquid phases.static booleanTPflash(SystemInterface system, double temperature, double pressure) Performs a TPflash at specified conditions and automatically marks asphaltene-rich phases.
-
Field Details
-
logger
private static final org.apache.logging.log4j.Logger loggerLogger object for class. -
DEFAULT_ASPHALTENE_MW
public static final double DEFAULT_ASPHALTENE_MWDefault asphaltene molecular weight (g/mol).- See Also:
-
DEFAULT_ASPHALTENE_DENSITY
public static final double DEFAULT_ASPHALTENE_DENSITYDefault asphaltene density at standard conditions (g/cm³).- See Also:
-
HEAVY_ASPHALTENE_MW
public static final double HEAVY_ASPHALTENE_MWHeavy asphaltene molecular weight (g/mol) - for very heavy oils.- See Also:
-
MIN_ASPHALTENE_MW
public static final double MIN_ASPHALTENE_MWMinimum asphaltene molecular weight (g/mol).- See Also:
-
MAX_ASPHALTENE_MW
public static final double MAX_ASPHALTENE_MWMaximum asphaltene molecular weight (g/mol).- See Also:
-
DEFAULT_ASPHALTENE_WEIGHT_FRACTION
public static final double DEFAULT_ASPHALTENE_WEIGHT_FRACTIONDefault asphaltene weight fraction in heavy oil.- See Also:
-
asphalteneMW
private double asphalteneMWMolecular weight of asphaltene pseudo-component (g/mol). -
asphalteneDensity
private double asphalteneDensityDensity of asphaltene at standard conditions (g/cm³). -
asphalteneWeightFraction
private double asphalteneWeightFractionWeight fraction of asphaltene in the oil. -
criticalTemperature
private double criticalTemperatureCalculated critical temperature (K). -
criticalPressure
private double criticalPressureCalculated critical pressure (bar). -
acentricFactor
private double acentricFactorCalculated acentric factor. -
boilingPoint
private double boilingPointCalculated boiling point (K). -
system
Reference to the thermodynamic system. -
numberOfAsphaltenePseudoComponents
private int numberOfAsphaltenePseudoComponentsNumber of asphaltene pseudo-components for distribution. -
isCharacterized
private boolean isCharacterizedFlag indicating whether asphaltene has been characterized. -
tcMultiplier
private double tcMultiplierMultiplier for critical temperature tuning. Default = 1.0 -
pcMultiplier
private double pcMultiplierMultiplier for critical pressure tuning. Default = 1.0 -
omegaMultiplier
private double omegaMultiplierMultiplier for acentric factor tuning. Default = 1.0 -
tbMultiplier
private double tbMultiplierMultiplier for boiling point tuning. Default = 1.0 -
kijAdjustment
private double kijAdjustmentBinary interaction parameter adjustment for asphaltene-light components.
-
-
Constructor Details
-
PedersenAsphalteneCharacterization
public PedersenAsphalteneCharacterization()Default constructor. -
PedersenAsphalteneCharacterization
Constructor with system reference.- Parameters:
system- the thermodynamic system
-
PedersenAsphalteneCharacterization
public PedersenAsphalteneCharacterization(double asphalteneMW, double asphalteneDensity, double asphalteneWeightFraction) Constructor with asphaltene properties.- Parameters:
asphalteneMW- molecular weight of asphaltene (g/mol)asphalteneDensity- density at standard conditions (g/cm³)asphalteneWeightFraction- weight fraction in the oil (0-1)
-
-
Method Details
-
characterize
public void characterize()Characterizes the asphaltene component using Pedersen correlations.Calculates critical temperature, critical pressure, acentric factor, and boiling point using the same correlations as for heavy petroleum fractions.
-
calculateBoilingPoint
private void calculateBoilingPoint()Calculates the boiling point using Søreide correlation.The Søreide correlation is suitable for heavy petroleum fractions and is used consistently with other Pedersen characterization methods in NeqSim.
-
calculateCriticalTemperature
private void calculateCriticalTemperature()Calculates the critical temperature using Pedersen correlation for heavy fractions.Uses the correlation form: Tc = a0*ρ + a1*ln(M) + a2*M + a3/M
-
calculateCriticalPressure
private void calculateCriticalPressure()Calculates the critical pressure using Pedersen correlation for heavy fractions.Uses the correlation form: Pc = exp(b0 + b1*ρ^b4 + b2/M + b3/M²)
-
calculateAcentricFactor
private void calculateAcentricFactor()Calculates the acentric factor using Pedersen correlation.For heavy components, uses the correlation: ω = c0 + c1*M + c2*ρ + c3/M
-
addAsphalteneToSystem
Adds the asphaltene component to the thermodynamic system.Creates a pseudo-component with the characterized properties and adds it to the system. The component is named "Asphaltene_PC" (following TBP naming convention) and is configured with the calculated critical properties.
Note: The mixing rule should be set AFTER calling this method, and init(0) should be called after setting the mixing rule.
- Parameters:
system- the thermodynamic system to add asphaltene tomoles- number of moles of asphaltene to add- Returns:
- the component name that was added (for reference)
-
addDistributedAsphaltene
public void addDistributedAsphaltene(SystemInterface system, double totalMoles, int numberOfComponents) Adds multiple asphaltene pseudo-components with distributed molecular weights.For more accurate modeling, the asphaltene can be represented as multiple pseudo-components with a distribution of molecular weights. This follows the same principle as C7+ characterization.
Note: The mixing rule should be set AFTER calling this method, and init(0) should be called after setting the mixing rule.
- Parameters:
system- the thermodynamic systemtotalMoles- total moles of asphaltenenumberOfComponents- number of pseudo-components (typically 2-5)
-
calculateOnsetPressure
public double calculateOnsetPressure(SystemInterface system, double startPressure, double endPressure) Calculates the asphaltene onset pressure at the given temperature.Uses the Pedersen approach of searching for liquid-liquid phase split conditions. The onset pressure is where a second liquid phase (asphaltene-rich) becomes stable.
- Parameters:
system- the thermodynamic system with asphaltene componentstartPressure- starting pressure for search (bar)endPressure- ending pressure for search (bar)- Returns:
- onset pressure in bar, or NaN if not found
-
countLiquidPhases
Counts the number of liquid phases in the system.- Parameters:
system- the thermodynamic system- Returns:
- number of liquid phases
-
TPflash
Performs a TPflash and automatically marks asphaltene-rich liquid phases.This is a convenience method that combines the TPflash operation with automatic detection and marking of asphaltene-rich liquid phases (PhaseType.LIQUID_ASPHALTENE). Use this method instead of calling TPflash directly when working with Pedersen's liquid-liquid asphaltene approach.
Example usage:
// Setup fluid with asphaltene PedersenAsphalteneCharacterization asphChar = new PedersenAsphalteneCharacterization(); asphChar.addAsphalteneToSystem(fluid, 0.05); fluid.setMixingRule("classic"); fluid.init(0); // Perform flash with automatic asphaltene detection boolean hasAsphaltene = PedersenAsphalteneCharacterization.TPflash(fluid); if (hasAsphaltene) { System.out.println("Asphaltene-rich phase detected!"); }- Parameters:
system- the thermodynamic system to flash- Returns:
- true if an asphaltene-rich liquid phase was detected
-
TPflash
Performs a TPflash at specified conditions and automatically marks asphaltene-rich phases.This is a convenience method that sets the temperature and pressure, performs a TPflash, and automatically marks asphaltene-rich liquid phases.
- Parameters:
system- the thermodynamic system to flashtemperature- temperature in Kelvinpressure- pressure in bar- Returns:
- true if an asphaltene-rich liquid phase was detected
-
markAsphalteneRichLiquidPhases
Marks asphaltene-rich liquid phases with PhaseType.LIQUID_ASPHALTENE.This method should be called after a flash calculation to identify and mark liquid phases that are rich in asphaltene components (> 50 mol% asphaltene). This is useful for the Pedersen liquid-liquid approach where asphaltene precipitation is modeled as a phase split between light and heavy liquid phases.
- Parameters:
system- the thermodynamic system to update- Returns:
- true if an asphaltene-rich liquid phase was found and marked
-
refineOnsetPressure
private double refineOnsetPressure(SystemInterface system, ThermodynamicOperations ops, double upperP, double lowerP) Refines the onset pressure using bisection.- Parameters:
system- the thermodynamic systemops- thermodynamic operations objectupperP- upper pressure bound (one phase)lowerP- lower pressure bound (two phases)- Returns:
- refined onset pressure
-
calculateSolubilityParameter
public double calculateSolubilityParameter(double temperature) Estimates asphaltene solubility parameter at given conditions.The solubility parameter approach provides insight into asphaltene stability. Precipitation occurs when the difference between asphaltene and oil solubility parameters exceeds a critical value.
- Parameters:
temperature- temperature in Kelvin- Returns:
- solubility parameter in (MPa)^0.5
-
assessStability
Estimates stability based on solubility parameter difference.- Parameters:
oilSolubilityParameter- oil phase solubility parameter in (MPa)^0.5- Returns:
- stability assessment string
-
getAsphalteneMW
public double getAsphalteneMW()Gets the asphaltene molecular weight.- Returns:
- molecular weight in g/mol
-
setAsphalteneMW
public void setAsphalteneMW(double asphalteneMW) Sets the asphaltene molecular weight.- Parameters:
asphalteneMW- molecular weight in g/mol
-
getAsphalteneDensity
public double getAsphalteneDensity()Gets the asphaltene density at standard conditions.- Returns:
- density in g/cm³
-
setAsphalteneDensity
public void setAsphalteneDensity(double asphalteneDensity) Sets the asphaltene density at standard conditions.- Parameters:
asphalteneDensity- density in g/cm³
-
getAsphalteneWeightFraction
public double getAsphalteneWeightFraction()Gets the asphaltene weight fraction in the oil.- Returns:
- weight fraction (0-1)
-
setAsphalteneWeightFraction
public void setAsphalteneWeightFraction(double asphalteneWeightFraction) Sets the asphaltene weight fraction in the oil.- Parameters:
asphalteneWeightFraction- weight fraction (0-1)
-
getCriticalTemperature
public double getCriticalTemperature()Gets the calculated critical temperature.- Returns:
- critical temperature in Kelvin
-
getCriticalPressure
public double getCriticalPressure()Gets the calculated critical pressure.- Returns:
- critical pressure in bar
-
getAcentricFactor
public double getAcentricFactor()Gets the calculated acentric factor.- Returns:
- acentric factor (dimensionless)
-
getBoilingPoint
public double getBoilingPoint()Gets the calculated boiling point.- Returns:
- boiling point in Kelvin
-
isCharacterized
public boolean isCharacterized()Checks if asphaltene has been characterized.- Returns:
- true if characterized
-
getNumberOfAsphaltenePseudoComponents
public int getNumberOfAsphaltenePseudoComponents()Gets the number of asphaltene pseudo-components used in distributed characterization.- Returns:
- number of pseudo-components
-
setNumberOfAsphaltenePseudoComponents
public void setNumberOfAsphaltenePseudoComponents(int numberOfComponents) Sets the number of asphaltene pseudo-components for distributed characterization.- Parameters:
numberOfComponents- number of pseudo-components (1-10)
-
getTcMultiplier
public double getTcMultiplier()Gets the critical temperature tuning multiplier.- Returns:
- Tc multiplier (default 1.0)
-
setTcMultiplier
public void setTcMultiplier(double tcMultiplier) Sets the critical temperature tuning multiplier.Use this to adjust the calculated critical temperature to match experimental onset pressures. Values typically range from 0.9 to 1.1.
- Parameters:
tcMultiplier- multiplier for critical temperature
-
getPcMultiplier
public double getPcMultiplier()Gets the critical pressure tuning multiplier.- Returns:
- Pc multiplier (default 1.0)
-
setPcMultiplier
public void setPcMultiplier(double pcMultiplier) Sets the critical pressure tuning multiplier.Use this to adjust the calculated critical pressure to match experimental data. Values typically range from 0.8 to 1.2.
- Parameters:
pcMultiplier- multiplier for critical pressure
-
getOmegaMultiplier
public double getOmegaMultiplier()Gets the acentric factor tuning multiplier.- Returns:
- omega multiplier (default 1.0)
-
setOmegaMultiplier
public void setOmegaMultiplier(double omegaMultiplier) Sets the acentric factor tuning multiplier.Use this to adjust the calculated acentric factor to match experimental data. The acentric factor strongly influences phase behavior predictions.
- Parameters:
omegaMultiplier- multiplier for acentric factor
-
getTbMultiplier
public double getTbMultiplier()Gets the boiling point tuning multiplier.- Returns:
- Tb multiplier (default 1.0)
-
setTbMultiplier
public void setTbMultiplier(double tbMultiplier) Sets the boiling point tuning multiplier.- Parameters:
tbMultiplier- multiplier for boiling point
-
getKijAdjustment
public double getKijAdjustment()Gets the binary interaction parameter adjustment.- Returns:
- kij adjustment value (default 0.0)
-
setKijAdjustment
public void setKijAdjustment(double kijAdjustment) Sets the binary interaction parameter adjustment for asphaltene-light component pairs.This adjustment is added to the default calculated binary interaction parameters between the asphaltene and lighter components. Positive values increase kij (reduce attraction), which can shift onset pressure to higher values.
- Parameters:
kijAdjustment- adjustment to add to binary interaction parameters
-
setTuningParameters
public void setTuningParameters(double tcMultiplier, double pcMultiplier, double omegaMultiplier) Sets all tuning parameters at once.Convenience method for applying multiple tuning parameters from experimental data fitting.
- Parameters:
tcMultiplier- critical temperature multiplierpcMultiplier- critical pressure multiplieromegaMultiplier- acentric factor multiplier
-
resetTuningParameters
public void resetTuningParameters()Resets all tuning parameters to default values (1.0). -
toString
-
main
Main method demonstrating Pedersen's asphaltene TPflash.- Parameters:
args- command line arguments (not used)
-