Skip to main content

NeqSim is a tool for thermodynamic and process calculations

Project description

NeqSim Logo NeqSim Python

Python interface to the NeqSim engine — fluid properties, process simulation, and PVT analysis from Python and Jupyter notebooks.

Tests Publish PyPI Python License

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.9+ 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

🧪 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:


⚙️ 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.


📚 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

Apache-2.0

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

neqsim-3.15.0.tar.gz (52.9 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

neqsim-3.15.0-py3-none-any.whl (52.4 MB view details)

Uploaded Python 3

File details

Details for the file neqsim-3.15.0.tar.gz.

File metadata

  • Download URL: neqsim-3.15.0.tar.gz
  • Upload date:
  • Size: 52.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for neqsim-3.15.0.tar.gz
Algorithm Hash digest
SHA256 6a620748175a8455a8285d8d2775f15c76465a4ec9c714212747d77bbc875fd2
MD5 a43155f0afc2d27658eb4f90a2b0ffcf
BLAKE2b-256 69a3b688cae59c4ddf6a364f960507fa43a156f336c832c50371676d4b43f75e

See more details on using hashes here.

Provenance

The following attestation bundles were made for neqsim-3.15.0.tar.gz:

Publisher: publish-to-test-pypi.yml on equinor/neqsim-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file neqsim-3.15.0-py3-none-any.whl.

File metadata

  • Download URL: neqsim-3.15.0-py3-none-any.whl
  • Upload date:
  • Size: 52.4 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for neqsim-3.15.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ac913ac0e6efc878b449e007a74aee14f6bbd1005c324b48eda8f78b4d43a831
MD5 8caa1f8ce022fa164fbf3b94b45e56b7
BLAKE2b-256 7c47fcab9b9fd4bf50e284c3706dc9f0fc4229412542c8b4d75a7a68af7a2ed6

See more details on using hashes here.

Provenance

The following attestation bundles were made for neqsim-3.15.0-py3-none-any.whl:

Publisher: publish-to-test-pypi.yml on equinor/neqsim-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page