Class PedersenAsphalteneCharacterization

java.lang.Object
neqsim.thermo.characterization.PedersenAsphalteneCharacterization

public class PedersenAsphalteneCharacterization extends Object
Pedersen's method for asphaltene precipitation using classical cubic equation of state.

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 Details

    • logger

      private static final org.apache.logging.log4j.Logger logger
      Logger object for class.
    • DEFAULT_ASPHALTENE_MW

      public static final double DEFAULT_ASPHALTENE_MW
      Default asphaltene molecular weight (g/mol).
      See Also:
    • DEFAULT_ASPHALTENE_DENSITY

      public static final double DEFAULT_ASPHALTENE_DENSITY
      Default asphaltene density at standard conditions (g/cm³).
      See Also:
    • HEAVY_ASPHALTENE_MW

      public static final double HEAVY_ASPHALTENE_MW
      Heavy asphaltene molecular weight (g/mol) - for very heavy oils.
      See Also:
    • MIN_ASPHALTENE_MW

      public static final double MIN_ASPHALTENE_MW
      Minimum asphaltene molecular weight (g/mol).
      See Also:
    • MAX_ASPHALTENE_MW

      public static final double MAX_ASPHALTENE_MW
      Maximum asphaltene molecular weight (g/mol).
      See Also:
    • DEFAULT_ASPHALTENE_WEIGHT_FRACTION

      public static final double DEFAULT_ASPHALTENE_WEIGHT_FRACTION
      Default asphaltene weight fraction in heavy oil.
      See Also:
    • asphalteneMW

      private double asphalteneMW
      Molecular weight of asphaltene pseudo-component (g/mol).
    • asphalteneDensity

      private double asphalteneDensity
      Density of asphaltene at standard conditions (g/cm³).
    • asphalteneWeightFraction

      private double asphalteneWeightFraction
      Weight fraction of asphaltene in the oil.
    • criticalTemperature

      private double criticalTemperature
      Calculated critical temperature (K).
    • criticalPressure

      private double criticalPressure
      Calculated critical pressure (bar).
    • acentricFactor

      private double acentricFactor
      Calculated acentric factor.
    • boilingPoint

      private double boilingPoint
      Calculated boiling point (K).
    • system

      private SystemInterface system
      Reference to the thermodynamic system.
    • numberOfAsphaltenePseudoComponents

      private int numberOfAsphaltenePseudoComponents
      Number of asphaltene pseudo-components for distribution.
    • isCharacterized

      private boolean isCharacterized
      Flag indicating whether asphaltene has been characterized.
    • tcMultiplier

      private double tcMultiplier
      Multiplier for critical temperature tuning. Default = 1.0
    • pcMultiplier

      private double pcMultiplier
      Multiplier for critical pressure tuning. Default = 1.0
    • omegaMultiplier

      private double omegaMultiplier
      Multiplier for acentric factor tuning. Default = 1.0
    • tbMultiplier

      private double tbMultiplier
      Multiplier for boiling point tuning. Default = 1.0
    • kijAdjustment

      private double kijAdjustment
      Binary interaction parameter adjustment for asphaltene-light components.
  • Constructor Details

    • PedersenAsphalteneCharacterization

      public PedersenAsphalteneCharacterization()
      Default constructor.
    • PedersenAsphalteneCharacterization

      public PedersenAsphalteneCharacterization(SystemInterface system)
      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

      public String addAsphalteneToSystem(SystemInterface system, double moles)
      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 to
      moles - 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 system
      totalMoles - total moles of asphaltene
      numberOfComponents - 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 component
      startPressure - starting pressure for search (bar)
      endPressure - ending pressure for search (bar)
      Returns:
      onset pressure in bar, or NaN if not found
    • countLiquidPhases

      private int countLiquidPhases(SystemInterface system)
      Counts the number of liquid phases in the system.
      Parameters:
      system - the thermodynamic system
      Returns:
      number of liquid phases
    • TPflash

      public static boolean TPflash(SystemInterface system)
      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

      public static boolean TPflash(SystemInterface system, double temperature, double pressure)
      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 flash
      temperature - temperature in Kelvin
      pressure - pressure in bar
      Returns:
      true if an asphaltene-rich liquid phase was detected
    • markAsphalteneRichLiquidPhases

      public static boolean markAsphalteneRichLiquidPhases(SystemInterface system)
      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 system
      ops - thermodynamic operations object
      upperP - 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

      public String assessStability(double oilSolubilityParameter)
      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 multiplier
      pcMultiplier - critical pressure multiplier
      omegaMultiplier - acentric factor multiplier
    • resetTuningParameters

      public void resetTuningParameters()
      Resets all tuning parameters to default values (1.0).
    • toString

      public String toString()
      Returns a summary of the asphaltene characterization.
      Overrides:
      toString in class Object
      Returns:
      characterization summary string
    • main

      public static void main(String[] args)
      Main method demonstrating Pedersen's asphaltene TPflash.
      Parameters:
      args - command line arguments (not used)