NeqSim is a tool for thermodynamic and process calculations
Project description
NeqSim Python
Python interface to the NeqSim engine — fluid properties, process simulation, and PVT analysis from Python and Jupyter notebooks.
Quick Start · Process Simulation · PVT Simulation · Examples · Docs · Community
What is NeqSim Python?
NeqSim Python is part of the NeqSim project — a Python interface to the NeqSim Java library for estimation of fluid behavior and process design for oil and gas production. For an introduction see Introduction to Process Modelling with NeqSim in Python.
It provides Python toolboxes such as thermoTools and processTools that streamline the use of NeqSim, plus direct access to the full Java API via the jneqsim gateway.
| Capability | What you get |
|---|---|
| Thermodynamics | 60+ EOS models (SRK, PR, CPA, GERG-2008, …), flash calculations, phase envelopes |
| Physical properties | Density, viscosity, thermal conductivity, surface tension |
| Process simulation | 33+ equipment types — separators, compressors, heat exchangers, valves, pumps, reactors |
| PVT simulation | CME, CVD, differential liberation, separator tests, swelling, viscosity |
| Pipeline & flow | Steady-state multiphase pipe flow (Beggs & Brill), pipe networks |
🚀 Quick Start
Install
| pip (requires Java 17+) | conda (Java included) |
pip install neqsim
|
conda install -c conda-forge neqsim
|
Prerequisites: Python 3.10+ and Java 17+ (NeqSim 3.15+ requires Java 17 or higher; earlier NeqSim releases required Java 11+). The conda package automatically installs OpenJDK — no separate Java setup needed. For pip, install Java from Adoptium.
Try it now
from neqsim.thermo import fluid, TPflash, printFrame
# Create a natural gas fluid
fl = fluid('srk')
fl.addComponent('methane', 0.85)
fl.addComponent('ethane', 0.10)
fl.addComponent('propane', 0.05)
fl.setTemperature(25.0, 'C')
fl.setPressure(60.0, 'bara')
fl.setMixingRule('classic')
TPflash(fl)
printFrame(fl)
print(f"Gas density: {fl.getPhase('gas').getDensity('kg/m3'):.2f} kg/m3")
print(f"Gas viscosity: {fl.getPhase('gas').getViscosity('kg/msec'):.6f} kg/(m*s)")
print(f"Z-factor: {fl.getPhase('gas').getZ():.4f}")
🔧 Process Simulation
NeqSim Python provides multiple ways to build process simulations:
1. Python Wrappers — recommended for beginners & notebooks
Simple functions with a global process — great for prototyping:
from neqsim.thermo import fluid
from neqsim.process import stream, compressor, separator, runProcess, clearProcess
clearProcess()
feed = fluid('srk')
feed.addComponent('methane', 0.9)
feed.addComponent('ethane', 0.1)
feed.setTemperature(30.0, 'C')
feed.setPressure(50.0, 'bara')
feed.setTotalFlowRate(10.0, 'MSm3/day')
inlet = stream('inlet', feed)
sep = separator('separator', inlet)
comp = compressor('compressor', sep.getGasOutStream(), pres=100.0)
runProcess()
print(f"Compressor power: {comp.getPower()/1e6:.2f} MW")
2. ProcessContext — recommended for production code
Context manager with explicit process control — supports multiple independent processes:
from neqsim.thermo import fluid
from neqsim.process import ProcessContext
feed = fluid('srk')
feed.addComponent('methane', 0.9)
feed.addComponent('ethane', 0.1)
feed.setTemperature(30.0, 'C')
feed.setPressure(50.0, 'bara')
with ProcessContext("Compression Train") as ctx:
inlet = ctx.stream('inlet', feed)
sep = ctx.separator('separator', inlet)
comp = ctx.compressor('compressor', sep.getGasOutStream(), pres=100.0)
ctx.run()
print(f"Compressor power: {comp.getPower()/1e6:.2f} MW")
3. ProcessBuilder — fluent API for configuration-driven design
Chainable builder pattern:
from neqsim.thermo import fluid
from neqsim.process import ProcessBuilder
feed = fluid('srk')
feed.addComponent('methane', 0.9)
feed.addComponent('ethane', 0.1)
feed.setTemperature(30.0, 'C')
feed.setPressure(50.0, 'bara')
process = (ProcessBuilder("Compression Train")
.add_stream('inlet', feed)
.add_separator('separator', 'inlet')
.add_compressor('compressor', 'separator', pressure=100.0)
.run())
print(f"Compressor power: {process.get('compressor').getPower()/1e6:.2f} MW")
4. Direct Java Access — full control via jneqsim
Explicit process management using the Java API — for advanced features see the NeqSim Java repo:
from neqsim import jneqsim
from neqsim.thermo import fluid
feed = fluid('srk')
feed.addComponent('methane', 0.9)
feed.addComponent('ethane', 0.1)
feed.setTemperature(30.0, 'C')
feed.setPressure(50.0, 'bara')
# Create equipment using Java classes
inlet = jneqsim.process.equipment.stream.Stream('inlet', feed)
sep = jneqsim.process.equipment.separator.Separator('separator', inlet)
comp = jneqsim.process.equipment.compressor.Compressor('compressor', sep.getGasOutStream())
comp.setOutletPressure(100.0)
# Create and run process explicitly
process = jneqsim.process.processmodel.ProcessSystem()
process.add(inlet)
process.add(sep)
process.add(comp)
process.run()
print(f"Compressor power: {comp.getPower()/1e6:.2f} MW")
Choosing an Approach
| Use Case | Recommended Approach |
|---|---|
| Learning & prototyping | Python wrappers |
| Jupyter notebooks | Python wrappers |
| Production applications | ProcessContext |
| Multiple parallel processes | ProcessContext |
| Configuration-driven design | ProcessBuilder |
| Advanced Java features | Direct Java access |
The
jneqsimgateway is the first-class path for the long tail. Only a curated subset of NeqSim's ~2500 Java classes has hand-written Python wrappers. Mechanical design, safety, field development, automation, and most specialized equipment are used directly throughjneqsim— no wrapper needed.
🔎 Discovering the Full API
Direct jneqsim access is powerful but hard to explore (a JPackage has no
autocomplete). The neqsim.discovery module scans the API at runtime so you can
list, search, and inspect every class from Python:
from neqsim import discovery
discovery.list_equipment() # every process-equipment class
discovery.list_packages('process') # sub-packages of neqsim.process
discovery.find_classes('scrubber') # search the whole API by keyword
print(discovery.describe('Compressor')) # constructors + methods via reflection
Compressor = discovery.get_class('Compressor') # JClass by simple or full name
For IDE autocomplete and type checking across the entire Java API, generate type
stubs (already packaged as jneqsim-stubs, regenerate with
python scripts/generate_stubs.py) and point your editor at src. An offline
API manifest (python scripts/generate_api_manifest.py) lets discovery list,
search, and describe classes instantly and JVM-free.
Typed, validated flowsheets (optional)
With pip install "neqsim[schema]" you can build flowsheets from typed
pydantic models — autocomplete and validation
before the JVM runs:
from neqsim.process.schema import ProcessModel, Fluid, Unit
model = ProcessModel(
fluid=Fluid(eos="srk", components={"methane": 0.9, "ethane": 0.1}),
process=[
Unit(type="Stream", name="feed",
properties={"flowRate": [50000.0, "kg/hr"], "pressure": [50.0, "bara"]}),
Unit(type="Separator", name="HP Sep", inlet="feed"),
],
)
result = model.run() # validates, builds, and runs
Component-name helpers
from neqsim.thermo.components import find_components, suggest_component
find_components("glycol") # search the component database
suggest_component("methan") # ['methane', 'methanol', ...] — catch typos
Rich Jupyter display
Streams and processes render as HTML tables in notebooks automatically (just display the object) — no extra call needed.
Results to pandas
One helper turns any process into a tidy stream table (works for every equipment type, because it walks the flowsheet's streams):
from neqsim.process import stream_table, equipment_table, runProcess
runProcess()
stream_table() # one row per stream: flow, T, P, phases, density, molar mass
equipment_table() # one row per unit: name, type, inlet/outlet counts
stream_table(my_process) # or pass an explicit ProcessSystem / ProcessContext
🧪 PVT Simulation
NeqSim includes a pvtsimulation package for common PVT experiments (CCE/CME, CVD, differential liberation, separator tests, swelling, viscosity, etc.) and tuning workflows.
📂 Examples
Explore ready-to-run examples in the examples folder:
- Process simulation — processApproaches.py (all four approaches)
- Flash calculations, phase envelopes, hydrate prediction
- Compressor trains, heat exchangers, separation processes
- Jupyter notebooks in examples/jupyter/
- Google Colab examples
⚙️ Technical Notes
JPype bridges Python and Java. See the JPype installation guide for platform-specific details. Ensure Python and Java are both 64-bit (or both 32-bit) — mixing architectures will crash on import.
The full list of Python dependencies is on the dependencies page.
JVM Startup Control
By default, import neqsim starts the JVM immediately. This can be tuned via environment variables:
| Variable | Default | Purpose |
|---|---|---|
NEQSIM_JVM_AUTOSTART |
1 |
Set to 0/false/no to disable automatic JVM startup on import. Call init_jvm() explicitly before using jneqsim. |
NEQSIM_JVM_ARGS |
(none) | Extra JVM startup arguments (space separated), appended after the default -Xrs. |
NEQSIM_JVM_MAX_HEAP |
(none) | Max JVM heap size, e.g. 2g — passed as -Xmx2g. |
import os
os.environ["NEQSIM_JVM_AUTOSTART"] = "0" # must be set before `import neqsim`
from neqsim.neqsimpython import init_jvm, is_jvm_started
print(is_jvm_started()) # False
init_jvm(jvm_args=["-Xrs"]) # start explicitly, e.g. with custom args
print(is_jvm_started()) # True
init_jvm() is safe to call multiple times — it is a no-op if the JVM is already running.
🏗️ Contributing
We welcome contributions — bug fixes, new examples, documentation improvements, and more.
- CONTRIBUTING.md — Code of conduct and PR process
- NeqSim Python Wiki — Guides and usage patterns
📚 Documentation & Resources
| Resource | Link |
|---|---|
| NeqSim homepage | equinor.github.io/neqsimhome |
| Python wiki | neqsim-python/wiki |
| JavaDoc API | JavaDoc |
| Discussion forum | GitHub Discussions |
| NeqSim Java | equinor/neqsim |
| MATLAB binding | equinor/neqsimmatlab |
| Releases | GitHub Releases |
Versioning
NeqSim uses SemVer for versioning.
Authors
Even Solbraa (esolbraa@gmail.com), Marlene Louise Lund
NeqSim development was initiated at NTNU. A number of master and PhD students have contributed — we greatly acknowledge their contributions.
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file neqsim-3.16.0.tar.gz.
File metadata
- Download URL: neqsim-3.16.0.tar.gz
- Upload date:
- Size: 53.3 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5b30fb7710d606d07470f9c9d43b3add84577ececa3432a7ee7e67a9a00ae0bd
|
|
| MD5 |
14b77484b8846759660d6f60c2854a0c
|
|
| BLAKE2b-256 |
14becf2ff05fa8aa2751bd3404621dd43617dfc09284647ff02c9f5bd9bf0035
|
Provenance
The following attestation bundles were made for neqsim-3.16.0.tar.gz:
Publisher:
publish-to-test-pypi.yml on equinor/neqsim-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
neqsim-3.16.0.tar.gz -
Subject digest:
5b30fb7710d606d07470f9c9d43b3add84577ececa3432a7ee7e67a9a00ae0bd - Sigstore transparency entry: 2138982197
- Sigstore integration time:
-
Permalink:
equinor/neqsim-python@e2160649da54bd416a8ff3731750e50936067167 -
Branch / Tag:
refs/heads/master - Owner: https://github.com/equinor
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-test-pypi.yml@e2160649da54bd416a8ff3731750e50936067167 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file neqsim-3.16.0-py3-none-any.whl.
File metadata
- Download URL: neqsim-3.16.0-py3-none-any.whl
- Upload date:
- Size: 52.8 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
273b9249dadbad30fa0dce99ba6a6ae1ed54dd6fcd7b3ad4dd7ebc386339a455
|
|
| MD5 |
624954cce8666b100055321022ac646a
|
|
| BLAKE2b-256 |
2ce92a376976b771928501918f68ccf8dad05c2247cbff1a51934d6df054608d
|
Provenance
The following attestation bundles were made for neqsim-3.16.0-py3-none-any.whl:
Publisher:
publish-to-test-pypi.yml on equinor/neqsim-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
neqsim-3.16.0-py3-none-any.whl -
Subject digest:
273b9249dadbad30fa0dce99ba6a6ae1ed54dd6fcd7b3ad4dd7ebc386339a455 - Sigstore transparency entry: 2138982246
- Sigstore integration time:
-
Permalink:
equinor/neqsim-python@e2160649da54bd416a8ff3731750e50936067167 -
Branch / Tag:
refs/heads/master - Owner: https://github.com/equinor
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-test-pypi.yml@e2160649da54bd416a8ff3731750e50936067167 -
Trigger Event:
workflow_dispatch
-
Statement type: