Class MulticomponentNucleation

java.lang.Object
neqsim.util.nucleation.MulticomponentNucleation

public class MulticomponentNucleation extends Object
Multicomponent nucleation model for predicting droplet formation from supersaturated multicomponent gas mixtures.

This class handles the common case in natural gas processing where multiple heavy hydrocarbon components co-condense simultaneously. Two approaches are supported:

  • Pseudocomponent method: Lumps all condensable components into a single effective species with mole-fraction-weighted properties (MW, density, surface tension). This is the default and most robust approach.
  • Independent nucleation: Treats each condensable component independently and sums nucleation rates. Less rigorous but useful for identifying the dominant nucleating species.

The model requires a flashed and initialized NeqSim thermodynamic system with at least one gas phase and one liquid phase. Components are classified as "condensable" if their liquid mole fraction exceeds a threshold.

Usage:


// Flash the system first
ThermodynamicOperations ops = new ThermodynamicOperations(system);
ops.TPflash();
system.initProperties();

// Create multicomponent nucleation model
MulticomponentNucleation mcn = new MulticomponentNucleation(system);
mcn.setHeterogeneous(true, 60.0); // pipe wall nucleation
mcn.setResidenceTime(0.5);
mcn.calculate();

double totalRate = mcn.getTotalNucleationRate();
double diameter = mcn.getMeanParticleDiameter();
String dominant = mcn.getDominantComponent();

References:

  • Reiss, H. (1950). The kinetics of phase transitions in binary systems. J. Chem. Phys. 18, 840-848.
  • Stauffer, D. (1976). Kinetic theory of two-component nucleation. J. Aerosol Sci. 7, 319-333.
  • Wilemski, G. (1984). Composition of the critical nucleus in multicomponent vapor nucleation. J. Chem. Phys. 80, 1370-1372.
Version:
1.0
Author:
esol
  • Field Details

    • system

      private SystemInterface system
      The NeqSim thermodynamic system (must be flashed and initialized).
    • mode

      Nucleation approach mode.
    • condensableThreshold

      private double condensableThreshold
      Minimum liquid mole fraction to classify a component as condensable.
    • heterogeneous

      private boolean heterogeneous
      Whether to use heterogeneous nucleation.
    • contactAngleDegrees

      private double contactAngleDegrees
      Contact angle for heterogeneous nucleation in degrees.
    • residenceTime

      private double residenceTime
      Residence time in seconds.
    • condensableIndices

      private List<Integer> condensableIndices
      List of condensable component indices.
    • condensableNames

      private List<String> condensableNames
      List of condensable component names.
    • componentSupersaturations

      private List<Double> componentSupersaturations
      Per-component supersaturation ratios.
    • componentNucleationRates

      private List<Double> componentNucleationRates
      Per-component nucleation rates (independent mode).
    • componentCondensationFractions

      private List<Double> componentCondensationFractions
      Per-component condensation fractions (mole-fraction contribution to condensation).
    • pseudoCNT

      private ClassicalNucleationTheory pseudoCNT
      The pseudocomponent CNT model (used in PSEUDOCOMPONENT mode).
    • componentCNTs

      private List<ClassicalNucleationTheory> componentCNTs
      Per-component CNT models (used in INDEPENDENT mode).
    • totalNucleationRate

      private double totalNucleationRate
      Total nucleation rate in particles/(m3*s).
    • meanParticleDiameter

      private double meanParticleDiameter
      Mean particle diameter in m.
    • dominantComponent

      private String dominantComponent
      Name of the dominant condensing component.
    • effectiveMW

      private double effectiveMW
      Effective pseudocomponent molecular weight in kg/mol.
    • effectiveDensity

      private double effectiveDensity
      Effective pseudocomponent density in kg/m3.
    • effectiveSurfaceTension

      private double effectiveSurfaceTension
      Effective pseudocomponent surface tension in N/m.
    • effectiveSupersaturation

      private double effectiveSupersaturation
      Effective supersaturation ratio.
    • calculated

      private boolean calculated
      Whether calculation has been performed.
  • Constructor Details

    • MulticomponentNucleation

      public MulticomponentNucleation(SystemInterface system)
      Creates a multicomponent nucleation model from a NeqSim thermodynamic system.

      The system must have been flashed (TPflash) and properties initialized (initProperties) before calling this constructor. The system should have at least two phases (gas + liquid) for meaningful nucleation analysis.

      Parameters:
      system - the NeqSim thermodynamic system
  • Method Details

    • setMode

      public void setMode(MulticomponentNucleation.NucleationMode mode)
      Sets the nucleation approach mode.
      Parameters:
      mode - PSEUDOCOMPONENT or INDEPENDENT
    • getMode

      Gets the current nucleation approach mode.
      Returns:
      the nucleation mode
    • setCondensableThreshold

      public void setCondensableThreshold(double threshold)
      Sets the minimum liquid mole fraction threshold for classifying a component as condensable.
      Parameters:
      threshold - minimum liquid mole fraction (default 1e-6)
    • setHeterogeneous

      public void setHeterogeneous(boolean isHeterogeneous, double angleDegrees)
      Enables or disables heterogeneous nucleation with a specified contact angle.
      Parameters:
      isHeterogeneous - true to enable heterogeneous nucleation
      angleDegrees - contact angle in degrees (0 to 180)
    • setResidenceTime

      public void setResidenceTime(double timeSeconds)
      Sets the residence time in the supersaturated zone.
      Parameters:
      timeSeconds - residence time in seconds
    • calculate

      public void calculate()
      Performs the multicomponent nucleation calculation.

      Steps:

      1. Identify condensable components from gas-liquid fugacity comparison
      2. Compute per-component supersaturation from fugacity ratio
      3. Either create pseudocomponent (PSEUDOCOMPONENT mode) or per-component CNT models (INDEPENDENT mode)
      4. Run nucleation calculations
      5. Determine dominant component and total nucleation rate
    • identifyCondensableComponents

      private void identifyCondensableComponents()
      Identifies condensable components by comparing fugacities between gas and liquid phases.
    • calculatePseudocomponent

      private void calculatePseudocomponent()
      Calculates nucleation using the pseudocomponent approach.

      Creates an effective single component with mole-fraction-weighted properties from all condensable components, then delegates to ClassicalNucleationTheory.

    • calculateIndependent

      private void calculateIndependent()
      Calculates nucleation treating each condensable component independently.

      Creates separate CNT models for each condensable component and sums the nucleation rates. The mean particle diameter is taken from the dominant component.

    • findDominantComponent

      private void findDominantComponent()
      Finds the dominant condensing component (highest supersaturation ratio).
    • resetResults

      private void resetResults()
      Resets all calculated results.
    • getTotalNucleationRate

      public double getTotalNucleationRate()
      Returns the total nucleation rate summed over all condensable components.
      Returns:
      total nucleation rate in particles/(m3*s)
    • getMeanParticleDiameter

      public double getMeanParticleDiameter()
      Returns the mean particle diameter.
      Returns:
      mean particle diameter in m
    • getDominantComponent

      public String getDominantComponent()
      Returns the name of the dominant condensing component.
      Returns:
      dominant component name
    • getNumberOfCondensableComponents

      public int getNumberOfCondensableComponents()
      Returns the number of condensable components identified.
      Returns:
      number of condensable components
    • getCondensableComponentNames

      public List<String> getCondensableComponentNames()
      Returns the list of condensable component names.
      Returns:
      list of component names
    • getComponentSupersaturations

      public List<Double> getComponentSupersaturations()
      Returns the per-component supersaturation ratios.
      Returns:
      list of supersaturation ratios
    • getComponentCondensationFractions

      public List<Double> getComponentCondensationFractions()
      Returns the per-component condensation fractions (mole fraction contributions).
      Returns:
      list of condensation fractions (sum to 1.0)
    • getComponentNucleationRates

      public List<Double> getComponentNucleationRates()
      Returns the per-component nucleation rates (INDEPENDENT mode only).
      Returns:
      list of nucleation rates in particles/(m3*s)
    • getEffectiveMW

      public double getEffectiveMW()
      Returns the effective pseudocomponent molecular weight.
      Returns:
      effective MW in kg/mol
    • getEffectiveDensity

      public double getEffectiveDensity()
      Returns the effective pseudocomponent condensed-phase density.
      Returns:
      effective density in kg/m3
    • getEffectiveSupersaturation

      public double getEffectiveSupersaturation()
      Returns the effective pseudocomponent supersaturation ratio.
      Returns:
      effective supersaturation ratio
    • getEffectiveSurfaceTension

      public double getEffectiveSurfaceTension()
      Returns the effective pseudocomponent surface tension.
      Returns:
      effective surface tension in N/m
    • getPseudocomponentCNT

      public ClassicalNucleationTheory getPseudocomponentCNT()
      Returns the pseudocomponent CNT model (PSEUDOCOMPONENT mode only).
      Returns:
      the pseudocomponent CNT model, or null if not available
    • isCalculated

      public boolean isCalculated()
      Returns whether the calculation has been performed.
      Returns:
      true if calculated
    • toMap

      public Map<String,Object> toMap()
      Returns all results as a Map for serialization.
      Returns:
      map of result names to values
    • toJson

      public String toJson()
      Returns a JSON report of all results.
      Returns:
      JSON string
    • toString

      public String toString()
      Overrides:
      toString in class Object