Class ClassicalNucleationTheory

java.lang.Object
neqsim.util.nucleation.ClassicalNucleationTheory

public class ClassicalNucleationTheory extends Object
General-purpose Classical Nucleation Theory (CNT) model for predicting particle formation from supersaturated vapors.

This class implements homogeneous nucleation theory to predict critical nucleus size, nucleation rate, particle growth by condensation, and coagulation loss. It is applicable to any substance undergoing vapor-to-solid or vapor-to-liquid phase transition including:

  • Elemental sulfur (S8) deposition in natural gas systems
  • Water ice nucleation in cryogenic processes
  • Wax crystallization from paraffinic oils
  • Hydrate particle formation
  • Metal oxide particle formation in combustion

The model uses the following physics:

  • Kelvin equation: critical nucleus radius from supersaturation
  • Becker-Doering CNT: nucleation rate with Zeldovich factor
  • Hertz-Knudsen: free-molecular condensation growth
  • Maxwell continuum: diffusion-limited condensation growth
  • Fuchs interpolation: transition regime bridging both growth limits
  • Smoluchowski coagulation: Brownian coagulation reducing particle number

Usage example for sulfur particle prediction:


ClassicalNucleationTheory cnt = ClassicalNucleationTheory.sulfurS8();
cnt.setTemperature(253.15); // -20 C
cnt.setSupersaturationRatio(100.0);
cnt.setGasViscosity(1.0e-5); // Pa.s
cnt.setGasDiffusivity(5.0e-6); // m2/s
cnt.setResidenceTime(2.0); // seconds
cnt.calculate();

double diameter_um = cnt.getMeanParticleDiameter() * 1e6;
double rate = cnt.getNucleationRate(); // particles per m3 per second

References:

  • Becker, R. and Doering, W. (1935). Ann. Phys. 416, 719-752.
  • Seinfeld, J.H. and Pandis, S.N. (2016). Atmospheric Chemistry and Physics, 3rd ed.
  • Friedlander, S.K. (2000). Smoke, Dust, and Haze, 2nd ed.
  • Fuchs, N.A. and Sutugin, A.G. (1971). Topics in Current Aerosol Research.
Version:
1.0
Author:
esol
  • Field Details

    • K_BOLTZMANN

      public static final double K_BOLTZMANN
      Boltzmann constant in J/K.
      See Also:
    • N_AVOGADRO

      public static final double N_AVOGADRO
      Avogadro's number in 1/mol.
      See Also:
    • R_GAS

      public static final double R_GAS
      Universal gas constant in J/(mol*K).
      See Also:
    • molecularWeight

      private double molecularWeight
      Molecular weight of the condensing species in kg/mol.
    • condensedPhaseDensity

      private double condensedPhaseDensity
      Density of the condensed phase (solid or liquid) in kg/m3.
    • surfaceTension

      private double surfaceTension
      Surface tension (surface free energy) of the condensed phase in N/m (= J/m2).
    • substanceName

      private String substanceName
      Name of the substance for reporting.
    • molecularVolume

      private double molecularVolume
      Molecular volume per molecule in m3. Derived from MW and density.
    • molecularMass

      private double molecularMass
      Mass per molecule in kg. Derived from MW.
    • stickingCoefficient

      private double stickingCoefficient
      Sticking (accommodation) coefficient for vapor molecules hitting the nucleus surface. Default 1.0 (every collision sticks). Typical range 0.01 to 1.0.
    • heterogeneous

      private boolean heterogeneous
      Whether to use heterogeneous nucleation (with contact angle correction).
    • contactAngleDegrees

      private double contactAngleDegrees
      Contact angle in degrees between the condensed phase and the substrate surface. Only used when heterogeneous = true. Range 0 to 180 degrees. 0 = complete wetting (no barrier), 180 = non-wetting (same as homogeneous).
    • contactAngleFactor

      private double contactAngleFactor
      Fletcher shape factor f(theta) that multiplies the homogeneous barrier. f(theta) = (2 - 3*cos(theta) + cos^3(theta)) / 4. Range: 0 (complete wetting) to 1 (non-wetting).
    • temperature

      private double temperature
      Temperature in K.
    • actualPartialPressure

      private double actualPartialPressure
      Actual partial pressure of the condensing species in Pa.
    • saturationPressure

      private double saturationPressure
      Saturation (equilibrium) vapor pressure of the condensed phase in Pa.
    • supersaturationRatio

      private double supersaturationRatio
      Supersaturation ratio S = p_actual / p_sat. Can be set directly instead of setting both pressures.
    • gasDiffusivity

      private double gasDiffusivity
      Diffusivity of the condensing vapor in the carrier gas in m2/s.
    • gasViscosity

      private double gasViscosity
      Dynamic viscosity of the carrier gas in Pa*s.
    • meanFreePath

      private double meanFreePath
      Mean free path of gas molecules in m. If not set, estimated from gas viscosity and conditions.
    • residenceTime

      private double residenceTime
      Residence time in the supersaturated zone in seconds.
    • totalPressure

      private double totalPressure
      Total pressure of the gas in Pa. Used for mean free path estimation.
    • carrierGasMolarMass

      private double carrierGasMolarMass
      Molar mass of the carrier gas in kg/mol. Used for mean free path estimation.
    • criticalRadius

      private double criticalRadius
      Critical nucleus radius in m.
    • criticalNucleusMolecules

      private double criticalNucleusMolecules
      Number of molecules in the critical nucleus.
    • freeEnergyBarrier

      private double freeEnergyBarrier
      Free energy barrier for nucleation in J.
    • dimensionlessFreeEnergyBarrier

      private double dimensionlessFreeEnergyBarrier
      Dimensionless free energy barrier (DeltaG* / kT).
    • zeldovichFactor

      private double zeldovichFactor
      Zeldovich non-equilibrium factor (dimensionless).
    • nucleationRate

      private double nucleationRate
      Homogeneous nucleation rate in particles/(m3*s).
    • growthRate

      private double growthRate
      Condensation growth rate in m/s (at critical radius).
    • growthRateFreeM

      private double growthRateFreeM
      Growth rate in free molecular regime in m/s.
    • growthRateContinuum

      private double growthRateContinuum
      Growth rate in continuum (diffusion-limited) regime in m/s.
    • coagulationKernel

      private double coagulationKernel
      Brownian coagulation kernel in m3/s (continuum regime).
    • meanParticleRadius

      private double meanParticleRadius
      Mean particle radius after residence time (incl. condensation + coagulation) in m.
    • meanParticleDiameter

      private double meanParticleDiameter
      Mean particle diameter after residence time in m.
    • particleNumberDensity

      private double particleNumberDensity
      Particle number density after residence time in particles/m3.
    • knudsenNumber

      private double knudsenNumber
      Knudsen number at the mean particle radius (dimensionless).
    • geometricStdDev

      private double geometricStdDev
      Estimated geometric standard deviation of the particle size distribution.
    • particleMassConcentration

      private double particleMassConcentration
      Mass concentration of particles in kg/m3.
    • calculated

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

    • ClassicalNucleationTheory

      public ClassicalNucleationTheory(double molecularWeight_kg_mol, double condensedDensity_kg_m3, double surfaceTension_N_m)
      Creates a ClassicalNucleationTheory model for a given substance.
      Parameters:
      molecularWeight_kg_mol - molecular weight of the condensing species in kg/mol
      condensedDensity_kg_m3 - density of the condensed (solid or liquid) phase in kg/m3
      surfaceTension_N_m - surface tension of the condensed phase in N/m
  • Method Details

    • sulfurS8

      public static ClassicalNucleationTheory sulfurS8()
      Creates a CNT model for elemental sulfur S8.

      Properties: MW = 256.52 g/mol, solid density = 2070 kg/m3, surface tension approx 0.060 N/m.

      Returns:
      ClassicalNucleationTheory configured for S8
    • waterIce

      public static ClassicalNucleationTheory waterIce()
      Creates a CNT model for water (ice nucleation from vapor).

      Properties: MW = 18.015 g/mol, ice density = 917 kg/m3, ice surface tension approx 0.106 N/m.

      Returns:
      ClassicalNucleationTheory configured for water/ice
    • paraffinWax

      public static ClassicalNucleationTheory paraffinWax()
      Creates a CNT model for a generic n-paraffin wax (e.g., C25H52 for wax nucleation).

      Properties: MW = 352.7 g/mol, solid density = 900 kg/m3, surface tension approx 0.025 N/m.

      Returns:
      ClassicalNucleationTheory configured for paraffin wax
    • naphthalene

      public static ClassicalNucleationTheory naphthalene()
      Creates a CNT model for naphthalene (C10H8) solid deposition.

      Properties: MW = 128.17 g/mol, solid density = 1145 kg/m3, surface tension approx 0.050 N/m.

      Returns:
      ClassicalNucleationTheory configured for naphthalene
    • fromThermoSystem

      public static ClassicalNucleationTheory fromThermoSystem(SystemInterface system, String componentName)
      Creates a CNT model from a NeqSim thermodynamic system for a specified condensable component.

      This factory method extracts physical properties from the EOS-based thermo system:

      • Temperature from the system temperature
      • Surface tension from interphase properties (if two phases exist)
      • Gas-phase transport properties (viscosity, diffusivity) from the gas phase
      • Total pressure for mean free path estimation
      • Supersaturation is estimated from the fugacity ratio if two phases are present

      The system should have been flashed (TPflash + initProperties) before calling this method.

      Parameters:
      system - the NeqSim thermodynamic system (should be flashed and initialized)
      componentName - the name of the condensable component (e.g., "n-heptane", "water")
      Returns:
      ClassicalNucleationTheory model populated from the EOS, or null if the component is not found
    • estimateCondensedDensity

      private static double estimateCondensedDensity(double mw, double tc, double pc, double temperature)
      Estimates condensed phase density from critical properties using a simplified Rackett equation.
      Parameters:
      mw - molecular weight in kg/mol
      tc - critical temperature in K
      pc - critical pressure in Pa
      temperature - actual temperature in K
      Returns:
      estimated liquid density in kg/m3
    • estimateSurfaceTension

      private static double estimateSurfaceTension(double tc, double pc, double temperature)
      Estimates surface tension from critical properties using the Eotvos correlation.
      Parameters:
      tc - critical temperature in K
      pc - critical pressure in Pa
      temperature - actual temperature in K
      Returns:
      estimated surface tension in N/m
    • setTemperature

      public void setTemperature(double temperatureKelvin)
      Sets the temperature.
      Parameters:
      temperatureKelvin - temperature in Kelvin
    • setPartialPressure

      public void setPartialPressure(double pressurePa)
      Sets the actual partial pressure of the condensing species.
      Parameters:
      pressurePa - partial pressure in Pa
    • setSaturationPressure

      public void setSaturationPressure(double pressurePa)
      Sets the saturation (equilibrium) vapor pressure over the condensed phase.
      Parameters:
      pressurePa - saturation vapor pressure in Pa
    • setSupersaturationRatio

      public void setSupersaturationRatio(double ratio)
      Sets the supersaturation ratio directly. If both partial pressure and saturation pressure are also set, this value takes precedence.
      Parameters:
      ratio - supersaturation ratio S = p_actual / p_sat (must be > 1 for nucleation)
    • setGasDiffusivity

      public void setGasDiffusivity(double diffusivity)
      Sets the diffusivity of the condensing vapor in the carrier gas.
      Parameters:
      diffusivity - gas-phase diffusivity in m2/s (typical 1e-6 to 1e-5)
    • setGasViscosity

      public void setGasViscosity(double viscosity)
      Sets the dynamic viscosity of the carrier gas.
      Parameters:
      viscosity - dynamic viscosity in Pa*s (typical 1e-5 for natural gas)
    • setMeanFreePath

      public void setMeanFreePath(double lambda)
      Sets the mean free path of gas molecules directly. If not set, it is estimated from gas viscosity and conditions.
      Parameters:
      lambda - mean free path in m (typical 5-100 nm at process conditions)
    • setResidenceTime

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

      public void setTotalPressure(double pressurePa)
      Sets the total gas pressure. Used for mean free path estimation if not explicitly set.
      Parameters:
      pressurePa - total pressure in Pa
    • setCarrierGasMolarMass

      public void setCarrierGasMolarMass(double molarMass)
      Sets the carrier gas molar mass. Used for mean free path estimation.
      Parameters:
      molarMass - carrier gas molar mass in kg/mol (e.g. 0.016 for methane)
    • setStickingCoefficient

      public void setStickingCoefficient(double alpha)
      Sets the sticking (accommodation) coefficient.
      Parameters:
      alpha - sticking coefficient (0 to 1). Default 1.0.
    • setSurfaceTension

      public void setSurfaceTension(double sigma)
      Sets the surface tension of the condensed phase.
      Parameters:
      sigma - surface tension in N/m
    • setSubstanceName

      public void setSubstanceName(String name)
      Sets the substance name for reporting.
      Parameters:
      name - substance name
    • setHeterogeneous

      public void setHeterogeneous(boolean isHeterogeneous)
      Sets whether to use heterogeneous nucleation. When true, the free energy barrier is multiplied by the contact angle factor f(theta), which reduces the barrier and increases the nucleation rate. This models nucleation on surfaces such as pipe walls, particulate impurities, or pre-existing droplets.
      Parameters:
      isHeterogeneous - true to enable heterogeneous nucleation
    • isHeterogeneous

      public boolean isHeterogeneous()
      Returns whether heterogeneous nucleation is enabled.
      Returns:
      true if heterogeneous nucleation is enabled
    • setContactAngle

      public void setContactAngle(double angleDegrees)
      Sets the contact angle for heterogeneous nucleation. The contact angle determines how much the free energy barrier is reduced relative to homogeneous nucleation.

      Also automatically enables heterogeneous mode if not already set.

      Parameters:
      angleDegrees - contact angle in degrees (0 to 180). 0 = complete wetting (no barrier), 90 = partial wetting (half barrier), 180 = non-wetting (same as homogeneous).
    • getContactAngle

      public double getContactAngle()
      Returns the contact angle in degrees.
      Returns:
      contact angle in degrees
    • getContactAngleFactor

      public double getContactAngleFactor()
      Returns the contact angle factor f(theta). This multiplies the homogeneous barrier to give the heterogeneous barrier.
      Returns:
      contact angle factor (0 to 1)
    • heterogeneousContactAngleFactor

      public static double heterogeneousContactAngleFactor(double angleDegrees)
      Computes the Fletcher shape factor for heterogeneous nucleation.

      f(theta) = (2 - 3*cos(theta) + cos^3(theta)) / 4

      This factor reduces the nucleation barrier when a substrate surface is present. Physical meaning:

      • f(0) = 0: complete wetting, no barrier, barrierless nucleation
      • f(90) = 0.5: partial wetting, half the homogeneous barrier
      • f(180) = 1.0: non-wetting, same as homogeneous nucleation
      Parameters:
      angleDegrees - contact angle in degrees (0 to 180)
      Returns:
      shape factor f(theta) in range [0, 1]
    • calculate

      public void calculate()
      Performs the full nucleation, growth, and coagulation calculation.

      Calculates in order:

      1. Supersaturation ratio (from pressures or direct setting)
      2. Critical nucleus radius (Kelvin equation)
      3. Free energy barrier and Zeldovich factor
      4. Homogeneous nucleation rate (Becker-Doering)
      5. Condensation growth rate (free-molecular and continuum with Fuchs interpolation)
      6. Brownian coagulation kernel (Smoluchowski)
      7. Particle size evolution over residence time
    • estimateMeanFreePath

      private double estimateMeanFreePath()
      Estimates the mean free path of gas molecules from kinetic theory.
      Returns:
      mean free path in m
    • calculateGrowthRates

      private void calculateGrowthRates()
      Calculates condensation growth rates in free-molecular and continuum regimes, with Fuchs interpolation for the transition regime.
    • fuchsSutuginCorrection

      private double fuchsSutuginCorrection(double kn)
      Calculates the Fuchs-Sutugin transition regime correction factor.

      The correction smoothly interpolates between free-molecular (Kn much greater than 1) and continuum (Kn much less than 1) regimes.

      Parameters:
      kn - Knudsen number (mean free path / particle radius)
      Returns:
      correction factor (approaches 1 in continuum, > 1 in free molecular)
    • calculateCoagulationKernel

      private void calculateCoagulationKernel()
      Calculates the Brownian coagulation kernel (Smoluchowski).
    • calculateParticleEvolution

      private void calculateParticleEvolution()
      Calculates particle size evolution over the residence time, including condensation growth and coagulation.
    • resetResults

      private void resetResults()
      Resets all calculated results to zero.
    • calculateParticleDiameter

      public double calculateParticleDiameter(double supersaturation, double residenceTimeSec)
      Calculates the mean particle diameter for a given supersaturation and residence time. This is a convenience method that sets both parameters and runs the calculation.
      Parameters:
      supersaturation - supersaturation ratio (S > 1)
      residenceTimeSec - residence time in seconds
      Returns:
      mean particle diameter in m
    • getMeanParticleDiameter

      public double getMeanParticleDiameter(String unit)
      Returns the mean particle diameter in the specified unit.
      Parameters:
      unit - size unit: "m", "mm", "um" (micrometres), "nm" (nanometres)
      Returns:
      mean particle diameter in the specified unit
    • getParticleSizePercentiles

      public double[] getParticleSizePercentiles()
      Returns particle sizes at the 10th, 50th, and 90th percentiles of the estimated lognormal size distribution.
      Returns:
      array [d10, d50, d90] in m
    • getFractionSmallerThan

      public double getFractionSmallerThan(double diameterM)
      Returns the fraction of particles smaller than a given diameter, assuming lognormal distribution.
      Parameters:
      diameterM - threshold diameter in m
      Returns:
      fraction (0 to 1) of particles smaller than the threshold
    • getFilterCaptureEfficiency

      public double getFilterCaptureEfficiency(double filterRatingM)
      Returns the fraction of particles larger than the filter rating. This indicates what fraction would be captured by a filter with the given rating.
      Parameters:
      filterRatingM - filter rating in m (e.g., 10e-6 for 10 um)
      Returns:
      capture fraction (0 to 1)
    • erf

      private static double erf(double x)
      Approximation of the error function using Abramowitz and Stegun formula 7.1.26.
      Parameters:
      x - input value
      Returns:
      erf(x)
    • getCondensedPhaseDensity

      public double getCondensedPhaseDensity()
      Returns the condensed phase density.
      Returns:
      condensed phase density in kg/m3
    • getCriticalRadius

      public double getCriticalRadius()
      Returns the critical nucleus radius.
      Returns:
      critical radius in m
    • getCriticalNucleusMolecules

      public double getCriticalNucleusMolecules()
      Returns the number of molecules in the critical nucleus.
      Returns:
      number of molecules in the critical cluster
    • getFreeEnergyBarrier

      public double getFreeEnergyBarrier()
      Returns the free energy barrier for nucleation.
      Returns:
      Gibbs free energy barrier in Joules
    • getDimensionlessFreeEnergyBarrier

      public double getDimensionlessFreeEnergyBarrier()
      Returns the dimensionless free energy barrier (Delta G* / kT).
      Returns:
      dimensionless barrier height
    • getZeldovichFactor

      public double getZeldovichFactor()
      Returns the Zeldovich non-equilibrium correction factor.
      Returns:
      Zeldovich factor (dimensionless)
    • getNucleationRate

      public double getNucleationRate()
      Returns the homogeneous nucleation rate.
      Returns:
      nucleation rate in particles/(m3*s)
    • getGrowthRate

      public double getGrowthRate()
      Returns the condensation growth rate at the critical radius.
      Returns:
      growth rate in m/s
    • getCoagulationKernel

      public double getCoagulationKernel()
      Returns the Brownian coagulation kernel.
      Returns:
      coagulation kernel in m3/s
    • getMeanParticleRadius

      public double getMeanParticleRadius()
      Returns the mean particle radius after residence time.
      Returns:
      mean particle radius in m
    • getMeanParticleDiameter

      public double getMeanParticleDiameter()
      Returns the mean particle diameter after residence time.
      Returns:
      mean particle diameter in m
    • getParticleNumberDensity

      public double getParticleNumberDensity()
      Returns the particle number density after residence time.
      Returns:
      number density in particles/m3
    • getKnudsenNumber

      public double getKnudsenNumber()
      Returns the Knudsen number at the mean particle radius.
      Returns:
      Knudsen number (dimensionless)
    • getGeometricStdDev

      public double getGeometricStdDev()
      Returns the estimated geometric standard deviation of the size distribution.
      Returns:
      geometric standard deviation
    • getSupersaturationRatio

      public double getSupersaturationRatio()
      Returns the supersaturation ratio used in the calculation.
      Returns:
      supersaturation ratio S
    • getParticleMassConcentration

      public double getParticleMassConcentration()
      Returns the particle mass concentration.
      Returns:
      mass concentration in kg/m3
    • isCalculated

      public boolean isCalculated()
      Returns whether the calculation has been performed.
      Returns:
      true if calculate() has been called successfully
    • 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 nucleation and particle results.
      Returns:
      JSON string
    • toString

      public String toString()
      Overrides:
      toString in class Object