Skip to the content.

title: “Characterization Package” description: “Petroleum TBP, plus-fraction, assay, lumping, asphaltene, and pseudo-component characterization in NeqSim.” —

The neqsim.thermo.characterization package converts petroleum assay, TBP, and plus-fraction information into pseudo-components suitable for NeqSim equations of state and process calculations.

Main workflows

Workflow Primary API Use
Pre-binned TBP fractions SystemInterface.addTBPfraction(...) Add a petroleum cut from moles, molar mass, and specific gravity
Plus fraction SystemInterface.addPlusFraction(...) + Characterise Represent and split a C7+/C20+ heavy end
Refinery assay OilAssayCharacterisation Convert assay data, export, split, re-lump, re-ingest and recharacterize an auditable TBP cut table, with invertible recovery/cut-point queries and conservative target-grid resampling
Assay blend screening RefineryAssayBlend Combine whole-assay SG/API and optional sulfur/nitrogen on an explicit mass basis
TBP property model selection Characterise.setTBPModel(...) Select Pedersen, Lee-Kesler, Riazi-Daubert, Twu, Cavett, Standing, and related models
Lumping Characterise.configureLumping() Reduce a detailed heavy-end slate while preserving configured grouping rules
Common-slate characterization PseudoComponentCombiner Align multiple characterized fluids to a shared pseudo-component definition
Wax/asphaltene characterization wax/asphaltene classes Specialized heavy-phase workflows

Critical unit contract

addTBPfraction and addPlusFraction use kg/mol for molar mass. Petroleum examples therefore use values such as 0.096 kg/mol for a roughly C7 cut, not 96.0.

The density argument is the petroleum specific gravity/relative-density numeric value. Current system APIs also accept density values above 1.5 as kg/m3 and normalize them internally, but unit-explicit refinery-assay helpers are preferred when importing assay tables.

import neqsim.thermo.system.SystemInterface;
import neqsim.thermo.system.SystemSrkEos;

SystemInterface fluid = new SystemSrkEos(373.15, 100.0);
fluid.addComponent("methane", 0.70);
fluid.addComponent("ethane", 0.10);
fluid.addComponent("propane", 0.08);
fluid.addComponent("n-butane", 0.05);

// name, moles, molar mass [kg/mol], specific gravity [-]
fluid.addTBPfraction("C7", 0.04, 0.096, 0.727);
fluid.addPlusFraction("C20+", 0.03, 0.400, 0.90);

Refinery assay characterization

For crude/petroleum assays, use OilAssayCharacterisation rather than manually converting every volume cut to moles. The assay API provides:

See Refinery Assay and TBP Cut Characterization for the complete contract and the refinery campaign gap matrix. Independent public-data bookkeeping evidence is tracked in DOE Big Hill Sweet refinery assay validation, whole-assay density/API evidence in DOE/OEDI COA bulk density qualification, per-cut characterization evidence in DOE Big Hill Watson-factor qualification, terminal representative-temperature evidence in DOE Big Hill terminal-Watson qualification, composition-resolved light-end evidence in DOE Big Hill light-end qualification, PIANO aggregate molar-mass evidence in DOE Big Hill C5-175 degF qualification, assay-quality evidence in DOE Big Hill sulfur qualification and DOE Big Hill nitrogen qualification, terminal-boundary evidence in DOE Big Hill terminal-cut qualification, the atmospheric process-integration gate in DOE Big Hill atmospheric fractionation qualification, and the connected material/energy boundary in DOE Big Hill atmospheric-to-vacuum workflow.

The qualified inputs are assembled into one reusable reference composition by DOE Big Hill Sweet complete modeled assay slate.

A second public operating case is retained by Al-Diwiniya atmospheric operating reference. Its 2-60 liquid-vol% partial TBP curve, plant configuration, product rates, and draw temperatures remain explicitly separate from the complete DOE modeled slate. The source fixed its HYSYS product rates, so those values are operating specifications rather than independent yield-validation evidence.

Sarir atmospheric validation reference adds a CC BY 4.0, complete-range TBP case with 34-tray operating data, numeric product ASTM D86 endpoints, and plant product rates that remain independent validation targets.

Persistent PR covolume tuning

ComponentPR.setOmegaB(value) sets a positive, finite, dimensionless per-component coefficient in $b_i = \Omega_{B,i} R T_{c,i}/P_{c,i}$. With SI $R$, $T_c$ in K and $P_c$ in Pa, this gives $b_i$ in m³/mol. NeqSim uses bara internally; multiply the existing internal getb() value by $10^{-5}$ to obtain m³/mol. The ordinary PR default remains exactly 0.077803333. Set the coefficient on the component in every allocated phase (getMaxNumberOfPhases()), then call fluid.init(0) before flashing or reading updated properties. This is the same phase-ownership requirement as other component-property tuning. The public methods are callable from Java and JPype’s ComponentPR wrapper. The older setb(...) call changes only transient storage and is still replaced by component initialization; use setOmegaB(...) for persistent tuning.

hasOmegaBOverride() reports whether tuning is active and getOmegaBOverride() returns the supplied value, or NaN when unset. getOmegaB() returns the active coefficient, including the default. clearOmegaBOverride() removes tuning; initialize again to rebuild the cached covolume. The override survives repeated initialization, flashes, fluid cloning, and Java serialization. Older serialized PR components without this field keep the default because zero represents an unset override.

The storage belongs to PR components rather than all EOS components. BNS retains its supplied constructor coefficient when no override is active, and resetting returns to that coefficient. PR-based CPA components reject setOmegaB with UnsupportedOperationException: their covolumes belong to the association parameterization. SRK is outside this API’s scope. No flash calls or fitting iterations are added to the normal initialization path.

E300 exports explicit PR coefficients in OMEGAB; reload them with the opt-in EclipseFluidReadWrite.readWithPrOmegaB(...) reader. Ordinary E300 readers retain their historical coefficient behavior. JSON fluid files preserve explicit PR overrides in optional omegaB component fields. Diagnostic fluid.toJson() output is not a reloadable fluid definition. Retain coefficient provenance, fit conditions and uncertainty separately: supplying a number does not validate an assay or reproduce a paper whose other tuning inputs are missing. The text formats do not reproduce the specialized BNS or CPA model from these coefficients; the supported tuning round trip here is ordinary PR/PR1978.

Regressions: ComponentPrOmegaBTest checks the analytical coefficient, initialization, flash, invalid input, reset, clone/serialization and BNS/CPA boundaries; PrOmegaBFluidRoundTripTest checks the text-persistence contract.

TBP fraction models

TBP models estimate the properties needed to represent petroleum pseudo-components in an EOS. Available implementations include standard Pedersen SRK/PR variants, Lee-Kesler, Riazi-Daubert, Twu, Cavett, and Standing. Pedersen estimation rejects molecular weights at or above 1120 g/mol (1.120 kg/mol at the system API); the explicit PedersenSRKHeavyOil and PedersenPRHeavyOil property models are unavailable at every molecular weight. The RiaziDaubert fallback inherits the same upper boundary. These paths throw UnsupportedOperationException rather than constructing an unphysical component. The seven-argument addTBPfraction overload accepts independently validated critical properties for heavier cuts; see TBP Fraction Models for units and limitations.

SystemInterface fluid = new SystemSrkEos(350.0, 50.0);
fluid.getCharacterization().setTBPModel("PedersenSRK");
fluid.addTBPfraction("C7", 0.05, 0.096, 0.727);
fluid.addTBPfraction("C10", 0.04, 0.134, 0.782);
fluid.addTBPfraction("C12+", 0.15, 0.250, 0.85);

For equations, model selection boundaries, and references, see:

Lumping configuration

After plus-fraction splitting, lumping can reduce the number of pseudo-components for faster process calculations.

// Preserve lighter TBP fractions and lump the heavier range.
fluid.getCharacterization().configureLumping()
    .model("PVTlumpingModel")
    .plusFractionGroups(5)
    .build();

// Target a total number of pseudo-components.
fluid.getCharacterization().configureLumping()
    .model("standard")
    .totalPseudoComponents(6)
    .build();

// Match user-defined grouping boundaries.
fluid.getCharacterization().configureLumping()
    .customBoundaries(6, 7, 10, 15, 20)
    .build();

// Keep the detailed SCN representation.
fluid.getCharacterization().configureLumping()
    .noLumping()
    .build();
Model Behaviour Typical use
PVTlumpingModel Preserves configured lighter TBP fractions and lumps the plus fraction PVT/process workflows that retain light-cut detail
standard Lumps the characterized heavy range to a requested total Smaller simulation slates
custom boundaries Uses explicit carbon-number/group boundaries Matching an external/reference characterization
no lumping Retains the generated detailed representation Detailed characterization studies

Common pseudo-component slates

When several reservoir or process fluids need to be mixed consistently, use PseudoComponentCombiner rather than assuming independently generated pseudo-components have identical meaning.

See Fluid Characterization Combining for common-slate and reference-slate workflows.

Asphaltene and wax workflows

NeqSim also contains specialized heavy-phase characterization used by wax and asphaltene calculations. These are separate from the refinery-assay bookkeeping API because they introduce additional phase-model assumptions and validation requirements.

See:

Validation guidance

Characterization validation should distinguish three layers:

  1. Bookkeeping: units, cut yields, composition/mass closure, component identity, splitting/lumping conservation.
  2. Property correlations: boiling point, molecular weight, density, critical properties, acentric factor, and applicability ranges.
  3. Process behaviour: flash, phase envelope, distillation/fractionation, and product-yield agreement for representative fluids.

A bookkeeping regression does not by itself validate a petroleum-property correlation, and a property match does not by itself establish refinery column performance. The refinery campaign in issue #3305 uses these layers as separate quality gates.