Skip to content

Commit 3cac95c

Browse files
committed
update
1 parent 237acd2 commit 3cac95c

9 files changed

Lines changed: 93 additions & 71 deletions

File tree

README.md

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -144,14 +144,7 @@ NeqSim also includes a `pvtsimulation` package for common PVT experiments (CCE/C
144144
- Documentation: `docs/pvt_simulation.md`
145145
- Direct Java access examples: `examples/pvtsimulation/README.md`
146146

147-
## Transient Multiphase Flow (Two-Fluid Model)
148-
149-
NeqSim includes a mechanistic **Two-Fluid Transient Multiphase Flow Model** for pipeline simulation.
150-
151-
- Jupyter notebook demo (direct Java access): `examples/jupyter/two_fluid_model.ipynb`
152-
- Upstream documentation (NeqSim Java): https://github.com/equinor/neqsim/blob/master/docs/wiki/two_fluid_model.md
153-
154-
### Prerequisites
147+
## Prerequisites
155148

156149
Java version 8 or higher ([Java JDK](https://adoptium.net/)) needs to be installed. The Python package [JPype](https://github.com/jpype-project/jpype) is used to connect Python and Java. Read the [installation requirements for Jpype](https://jpype.readthedocs.io/en/latest/install.html). Be aware that mixing 64 bit Python with 32 bit Java and vice versa crashes on import of the jpype module. The needed Python packages are listed in the [NeqSim Python dependencies page](https://github.com/equinor/neqsim-python/network/dependencies).
157150

docs/pvt_simulation.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,20 +33,18 @@ Other available simulations (direct Java access):
3333

3434
Many PVTsimulation methods expect Java `double[]`. With JPype you can pass:
3535

36-
- A Python list (often auto-converted), or
37-
- An explicit `double[]` using `jpype.types.JDouble[:]`
36+
- A Python list (auto-converted to `double[]` by JPype)
3837

3938
Example:
4039

4140
```python
42-
from jpype.types import JDouble
4341
from neqsim import jneqsim
4442

4543
pressures = [400.0, 300.0, 200.0]
4644
temperatures = [373.15, 373.15, 373.15]
4745

4846
cme = jneqsim.pvtsimulation.simulation.ConstantMassExpansion(oil)
49-
cme.setTemperaturesAndPressures(JDouble[:](temperatures), JDouble[:](pressures))
47+
cme.setTemperaturesAndPressures(temperatures, pressures)
5048
cme.runCalc()
5149
```
5250

examples/pvtsimulation/pvt_experiments_java_access.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@
2525

2626
from __future__ import annotations
2727

28-
from jpype.types import JDouble
29-
3028
from neqsim import jneqsim
3129
from neqsim.thermo import TPflash, fluid
3230

@@ -71,7 +69,7 @@ def main() -> None:
7169

7270
print("\n--- Constant Mass Expansion (CCE/CME) ---")
7371
cme = jneqsim.pvtsimulation.simulation.ConstantMassExpansion(oil.clone())
74-
cme.setTemperaturesAndPressures(JDouble[:](temperatures), JDouble[:](pressures))
72+
cme.setTemperaturesAndPressures(temperatures, pressures)
7573
cme.setTemperature(reservoir_temperature_k, "K")
7674
cme.runCalc()
7775
print("relativeVolume:", _as_list(cme.getRelativeVolume()))
@@ -84,7 +82,7 @@ def main() -> None:
8482

8583
print("\n--- Constant Volume Depletion (CVD) ---")
8684
cvd = jneqsim.pvtsimulation.simulation.ConstantVolumeDepletion(oil.clone())
87-
cvd.setPressures(JDouble[:](pressures))
85+
cvd.setPressures(pressures)
8886
cvd.setTemperature(reservoir_temperature_k, "K")
8987
cvd.runCalc()
9088
print("relativeVolume:", _as_list(cvd.getRelativeVolume()))
@@ -96,7 +94,7 @@ def main() -> None:
9694

9795
print("\n--- Differential Liberation (DL) ---")
9896
dl = jneqsim.pvtsimulation.simulation.DifferentialLiberation(oil.clone())
99-
dl.setPressures(JDouble[:](pressures + [1.01325]))
97+
dl.setPressures(pressures + [1.01325])
10098
dl.setTemperature(reservoir_temperature_k, "K")
10199
dl.runCalc()
102100
print("Bo [m3/Sm3]:", _as_list(dl.getBo()))
@@ -107,7 +105,7 @@ def main() -> None:
107105
sep_pressures = [50.0, 10.0, 1.01325]
108106
sep_temperatures = [313.15, 303.15, 293.15]
109107
sep = jneqsim.pvtsimulation.simulation.SeparatorTest(oil.clone())
110-
sep.setSeparatorConditions(JDouble[:](sep_temperatures), JDouble[:](sep_pressures))
108+
sep.setSeparatorConditions(sep_temperatures, sep_pressures)
111109
sep.runCalc()
112110
print("separator GOR [Sm3/Sm3]:", _as_list(sep.getGOR()))
113111
print("separator Bo [m3/Sm3]:", _as_list(sep.getBofactor()))
@@ -122,21 +120,21 @@ def main() -> None:
122120
swell = jneqsim.pvtsimulation.simulation.SwellingTest(oil.clone())
123121
swell.setInjectionGas(injection_gas)
124122
swell.setTemperature(reservoir_temperature_k, "K")
125-
swell.setCummulativeMolePercentGasInjected(JDouble[:](mol_percent_injected))
123+
swell.setCummulativeMolePercentGasInjected(mol_percent_injected)
126124
swell.runCalc()
127125
print("swell pressures [bara]:", _as_list(swell.getPressures()))
128126
print("relativeOilVolume [-]:", _as_list(swell.getRelativeOilVolume()))
129127

130128
print("\n--- Viscosity study ---")
131129
visc = jneqsim.pvtsimulation.simulation.ViscositySim(oil.clone())
132-
visc.setTemperaturesAndPressures(JDouble[:](temperatures), JDouble[:](pressures))
130+
visc.setTemperaturesAndPressures(temperatures, pressures)
133131
visc.runCalc()
134132
print("oilViscosity [Pa*s]:", _as_list(visc.getOilViscosity()))
135133
print("gasViscosity [Pa*s]:", _as_list(visc.getGasViscosity()))
136134

137135
print("\n--- GOR / Bo vs pressure ---")
138136
gor = jneqsim.pvtsimulation.simulation.GOR(oil.clone())
139-
gor.setTemperaturesAndPressures(JDouble[:](temperatures), JDouble[:](pressures))
137+
gor.setTemperaturesAndPressures(temperatures, pressures)
140138
gor.runCalc()
141139
print("GOR [Sm3/Sm3]:", _as_list(gor.getGOR()))
142140
print("Bo [m3/Sm3]:", _as_list(gor.getBofactor()))

examples/pvtsimulation/pvt_tuning_cme.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515

1616
from __future__ import annotations
1717

18-
from jpype.types import JDouble
19-
2018
from neqsim import jneqsim
2119
from neqsim.thermo import fluid
2220

@@ -56,7 +54,7 @@ def main() -> None:
5654

5755
cme = jneqsim.pvtsimulation.simulation.ConstantMassExpansion(oil)
5856
cme.setTemperature(temperature_k, "K")
59-
cme.setTemperaturesAndPressures(JDouble[:](temperatures), JDouble[:](pressures))
57+
cme.setTemperaturesAndPressures(temperatures, pressures)
6058

6159
cme.runCalc()
6260
rv_before = _as_list(cme.getRelativeVolume())

examples/pvtsimulation/pvt_tuning_cvd.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414

1515
from __future__ import annotations
1616

17-
from jpype.types import JDouble
18-
1917
from neqsim import jneqsim
2018
from neqsim.thermo import fluid
2119

@@ -53,7 +51,7 @@ def main() -> None:
5351

5452
cvd = jneqsim.pvtsimulation.simulation.ConstantVolumeDepletion(oil)
5553
cvd.setTemperature(temperature_k, "K")
56-
cvd.setTemperaturesAndPressures(JDouble[:](temperatures), JDouble[:](pressures))
54+
cvd.setTemperaturesAndPressures(temperatures, pressures)
5755

5856
cvd.runCalc()
5957
rv_before = _as_list(cvd.getRelativeVolume())

examples/pvtsimulation/pvt_tuning_viscosity.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414

1515
from __future__ import annotations
1616

17-
from jpype.types import JDouble
18-
1917
from neqsim import jneqsim
2018
from neqsim.thermo import fluid
2119

@@ -48,9 +46,7 @@ def main() -> None:
4846
exp_viscosity = [2.0e-4, 2.8e-4, 4.0e-4, 5.5e-4]
4947

5048
visc = jneqsim.pvtsimulation.simulation.ViscositySim(oil)
51-
visc.setTemperaturesAndPressures(
52-
JDouble[:](temperatures_k), JDouble[:](pressures_bara)
53-
)
49+
visc.setTemperaturesAndPressures(temperatures_k, pressures_bara)
5450
visc.runCalc()
5551
mu_before = _as_list(visc.getOilViscosity())
5652

src/neqsim/process/processTools.py

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,6 @@
162162
from typing import Any, Optional, List, Dict, Union
163163

164164
import pandas as pd
165-
from jpype.types import JDouble
166165
from jpype.types import *
167166

168167
from neqsim import jneqsim
@@ -174,6 +173,22 @@
174173
_YAML_SUFFIXES = {".yaml", ".yml"}
175174

176175

176+
def _as_float_list(values) -> list[float]:
177+
if values is None:
178+
return []
179+
if hasattr(values, "tolist"):
180+
values = values.tolist()
181+
return [float(v) for v in list(values)]
182+
183+
184+
def _as_float_matrix(values) -> list[list[float]]:
185+
if values is None:
186+
return []
187+
if hasattr(values, "tolist"):
188+
values = values.tolist()
189+
return [[float(v) for v in row] for row in list(values)]
190+
191+
177192
def _resolve_path_in_cwd(
178193
user_path: str,
179194
*,
@@ -4372,35 +4387,37 @@ def compressor(
43724387

43734388
def compressorChart(compressor, curveConditions, speed, flow, head, polyEff):
43744389
compressor.getCompressorChart().setCurves(
4375-
JDouble[:](curveConditions),
4376-
JDouble[:](speed),
4377-
JDouble[:][:](flow),
4378-
JDouble[:][:](head),
4379-
JDouble[:][:](polyEff),
4390+
_as_float_list(curveConditions),
4391+
_as_float_list(speed),
4392+
_as_float_matrix(flow),
4393+
_as_float_matrix(head),
4394+
_as_float_matrix(polyEff),
43804395
)
43814396

43824397

43834398
def pumpChart(pump, curveConditions, speed, flow, head, polyEff):
43844399
pump.getPumpChart().setCurves(
4385-
JDouble[:](curveConditions),
4386-
JDouble[:](speed),
4387-
JDouble[:][:](flow),
4388-
JDouble[:][:](head),
4389-
JDouble[:][:](polyEff),
4400+
_as_float_list(curveConditions),
4401+
_as_float_list(speed),
4402+
_as_float_matrix(flow),
4403+
_as_float_matrix(head),
4404+
_as_float_matrix(polyEff),
43904405
)
43914406

43924407

43934408
def compressorSurgeCurve(compressor, curveConditions, surgeflow, surgehead):
43944409
compressor.getCompressorChart().getSurgeCurve().setCurve(
4395-
JDouble[:](curveConditions), JDouble[:](surgeflow), JDouble[:](surgehead)
4410+
_as_float_list(curveConditions),
4411+
_as_float_list(surgeflow),
4412+
_as_float_list(surgehead),
43964413
)
43974414

43984415

43994416
def compressorStoneWallCurve(compressor, curveConditions, stoneWallflow, stoneWallHead):
44004417
compressor.getCompressorChart().getStoneWallCurve().setCurve(
4401-
JDouble[:](curveConditions),
4402-
JDouble[:](stoneWallflow),
4403-
JDouble[:](stoneWallHead),
4418+
_as_float_list(curveConditions),
4419+
_as_float_list(stoneWallflow),
4420+
_as_float_list(stoneWallHead),
44044421
)
44054422

44064423

@@ -4534,7 +4551,7 @@ def splitter(
45344551
spl = jneqsim.process.equipment.splitter.Splitter(name, teststream)
45354552
if splitfactors is not None and len(splitfactors) > 0:
45364553
spl.setSplitNumber(len(splitfactors))
4537-
spl.setSplitFactors(JDouble[:](splitfactors))
4554+
spl.setSplitFactors(_as_float_list(splitfactors))
45384555
_add_to_process(spl, process)
45394556
return spl
45404557

0 commit comments

Comments
 (0)