pyrestoolbox 3.8.0__tar.gz → 3.8.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/Cargo.lock +1 -1
  2. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/Cargo.toml +1 -1
  3. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/PKG-INFO +1 -1
  4. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyproject.toml +1 -1
  5. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/changelist.rst +4 -0
  6. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/nodal/nodal.py +10 -1
  7. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/vlp/march.rs +4 -1
  8. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/.github/complexity-baseline.json +0 -0
  9. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/.github/scripts/check_complexity.py +0 -0
  10. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/.github/workflows/build-wheels.yml +0 -0
  11. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/.github/workflows/tests.yml +0 -0
  12. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/.gitignore +0 -0
  13. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/LICENSE +0 -0
  14. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/MANIFEST.in +0 -0
  15. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/README.rst +0 -0
  16. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/ResToolbox/privacy_policy.md +0 -0
  17. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/build_pure_python.py +0 -0
  18. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/clippy.toml +0 -0
  19. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/mcp/Dockerfile +0 -0
  20. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/mcp/README.md +0 -0
  21. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/mcp/pyproject.toml +0 -0
  22. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/mcp/pyrestoolbox_mcp/__init__.py +0 -0
  23. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/mcp/pyrestoolbox_mcp/serialize.py +0 -0
  24. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/mcp/pyrestoolbox_mcp/server.py +0 -0
  25. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/mcp/tests/test_server.py +0 -0
  26. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/__init__.py +0 -0
  27. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/_accelerator.py +0 -0
  28. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/brine/__init__.py +0 -0
  29. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/brine/_lib_dielectric.py +0 -0
  30. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/brine/_lib_maoduan_viscosity.py +0 -0
  31. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/brine/_lib_pitzer_params.py +0 -0
  32. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/brine/_lib_salting_library.py +0 -0
  33. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/brine/_lib_vle_engine.py +0 -0
  34. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/brine/appelo_volumes.py +0 -0
  35. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/brine/brine.py +0 -0
  36. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/brine/iapws_viscosity.py +0 -0
  37. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/brine/jones_dole_viscosity.py +0 -0
  38. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/brine/kestin_nacl_viscosity.py +0 -0
  39. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/brine/pr_vphi.py +0 -0
  40. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/brine/viscosity_route.py +0 -0
  41. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/brine/vphi_route.py +0 -0
  42. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/classes/__init__.py +0 -0
  43. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/classes/classes.py +0 -0
  44. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/constants/__init__.py +0 -0
  45. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/constants/constants.py +0 -0
  46. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/dca/__init__.py +0 -0
  47. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/dca/dca.py +0 -0
  48. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/brine.rst +0 -0
  49. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/dca.rst +0 -0
  50. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/examples.ipynb +0 -0
  51. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/gas.rst +0 -0
  52. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/img/bot.png +0 -0
  53. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/img/bot_PVTO.png +0 -0
  54. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/img/bot_img.png +0 -0
  55. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/img/dry_gas.png +0 -0
  56. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/img/grid_sat_df.png +0 -0
  57. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/img/influence.png +0 -0
  58. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/img/properties_df.png +0 -0
  59. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/img/sgof.png +0 -0
  60. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/img/swof.png +0 -0
  61. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/index.rst +0 -0
  62. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/layer.rst +0 -0
  63. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/library.rst +0 -0
  64. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/matbal.rst +0 -0
  65. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/nodal.rst +0 -0
  66. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/nodal_examples.ipynb +0 -0
  67. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/nodal_hydrate_demo.ipynb +0 -0
  68. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/oil.rst +0 -0
  69. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/plyasunov.rst +0 -0
  70. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/recommend.rst +0 -0
  71. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/sensitivity.rst +0 -0
  72. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/docs/simtools.rst +0 -0
  73. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/gas/__init__.py +0 -0
  74. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/gas/_hydrate.py +0 -0
  75. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/gas/gas.py +0 -0
  76. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/layer/__init__.py +0 -0
  77. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/layer/layer.py +0 -0
  78. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/library/__init__.py +0 -0
  79. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/library/component_library.xlsx +0 -0
  80. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/library/library.py +0 -0
  81. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/matbal/__init__.py +0 -0
  82. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/matbal/matbal.py +0 -0
  83. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/nodal/__init__.py +0 -0
  84. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/oil/__init__.py +0 -0
  85. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/oil/_compressibility.py +0 -0
  86. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/oil/_constants.py +0 -0
  87. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/oil/_correlations.py +0 -0
  88. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/oil/_density.py +0 -0
  89. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/oil/_harmonize.py +0 -0
  90. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/oil/_pvt_class.py +0 -0
  91. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/oil/_rate.py +0 -0
  92. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/oil/_separator.py +0 -0
  93. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/oil/_tables.py +0 -0
  94. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/oil/_utils.py +0 -0
  95. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/plyasunov/__init__.py +0 -0
  96. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/plyasunov/iapws_if97.py +0 -0
  97. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/plyasunov/plyasunov_model.py +0 -0
  98. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/plyasunov/water_properties.py +0 -0
  99. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/recommend/__init__.py +0 -0
  100. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/recommend/recommend.py +0 -0
  101. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/sensitivity/__init__.py +0 -0
  102. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/sensitivity/sensitivity.py +0 -0
  103. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/shared_fns/__init__.py +0 -0
  104. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/shared_fns/shared_fns.py +0 -0
  105. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/simtools/__init__.py +0 -0
  106. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/simtools/_aquifer.py +0 -0
  107. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/simtools/_decks.py +0 -0
  108. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/simtools/_pvt_tables.py +0 -0
  109. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/simtools/_relperm.py +0 -0
  110. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/simtools/_vfp.py +0 -0
  111. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/simtools/simtools.py +0 -0
  112. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/validate/__init__.py +0 -0
  113. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/pyrestoolbox/validate/validate.py +0 -0
  114. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/setup.cfg +0 -0
  115. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/setup.py +0 -0
  116. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/bessel.rs +0 -0
  117. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/brine_visc/mod.rs +0 -0
  118. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/brine_visc/salt.rs +0 -0
  119. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/brine_visc/water.rs +0 -0
  120. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/critical_properties/mod.rs +0 -0
  121. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/dca/hyperbolic.rs +0 -0
  122. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/dca/mod.rs +0 -0
  123. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/dca/ransac.rs +0 -0
  124. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/gas_viscosity/mod.rs +0 -0
  125. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/gwr.rs +0 -0
  126. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/lib.rs +0 -0
  127. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/matbal/mod.rs +0 -0
  128. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/matbal/objective.rs +0 -0
  129. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/oil/density.rs +0 -0
  130. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/oil/mod.rs +0 -0
  131. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/pseudopressure.rs +0 -0
  132. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/spycher_pruess/mod.rs +0 -0
  133. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/spycher_pruess/solubility.rs +0 -0
  134. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/vle/alpha.rs +0 -0
  135. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/vle/bip.rs +0 -0
  136. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/vle/components.rs +0 -0
  137. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/vle/eos.rs +0 -0
  138. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/vle/flash.rs +0 -0
  139. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/vle/fugacity.rs +0 -0
  140. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/vle/k_init.rs +0 -0
  141. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/vle/mod.rs +0 -0
  142. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/vle/rachford_rice.rs +0 -0
  143. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/vlp/constants.rs +0 -0
  144. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/vlp/friction.rs +0 -0
  145. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/vlp/holdup_bb.rs +0 -0
  146. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/vlp/holdup_gray.rs +0 -0
  147. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/vlp/holdup_wg.rs +0 -0
  148. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/vlp/ift.rs +0 -0
  149. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/vlp/mod.rs +0 -0
  150. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/vlp/pvt_helpers.rs +0 -0
  151. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/vlp/static_column.rs +0 -0
  152. {pyrestoolbox-3.8.0 → pyrestoolbox-3.8.1}/src/zfactor/mod.rs +0 -0
@@ -152,7 +152,7 @@ dependencies = [
152
152
 
153
153
  [[package]]
154
154
  name = "pyrestoolbox-native"
155
- version = "3.8.0"
155
+ version = "3.8.1"
156
156
  dependencies = [
157
157
  "pyo3",
158
158
  "rug",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "pyrestoolbox-native"
3
- version = "3.8.0"
3
+ version = "3.8.1"
4
4
  edition = "2021"
5
5
  license = "GPL-3.0-or-later"
6
6
  description = "Rust acceleration extensions for pyResToolbox"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyrestoolbox
3
- Version: 3.8.0
3
+ Version: 3.8.1
4
4
  Classifier: Programming Language :: Python :: 3
5
5
  Classifier: Programming Language :: Rust
6
6
  Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "pyrestoolbox"
7
- version = "3.8.0"
7
+ version = "3.8.1"
8
8
  description = "pyResToolbox - A collection of Reservoir Engineering Utilities"
9
9
  license = {text = "GPL-3.0-or-later"}
10
10
  authors = [{name = "Mark W. Burgoyne", email = "mark.w.burgoyne@gmail.com"}]
@@ -1,3 +1,7 @@
1
+ Changelist in 3.8.1:
2
+
3
+ - **NODAL: condensate that drops out in the tubing is treated as a saturated light liquid, not a dead oil.** The gas VLP marches gave dropped-out condensate the Beggs-Robinson dead-oil viscosity (Rs = 0), which is 2-5 times too viscous for a liquid in equilibrium with gas (up to about 16 cP at low temperature) and made the Woldesemayat-Ghajar BHP with dropout exceed the no-dropout value. The dropped liquid now takes the Beggs-Robinson live-oil viscosity at the Standing (1947) solution GOR at local pressure and temperature, with the bubble point at the local pressure (0.25-1.6 cP for 45-55 API condensate), in Python and Rust. Only gas wells with ``pr`` supplied (condensate dropout on) are affected; for 5 MMscf/d with CGR 10, 10 bbl/d water and 3000 psia reservoir pressure (6000 ft tubing), BHP moves from 877.6 to 850.4 psia for WG and from 635.6 to 652.9 psia for HB (its holdup correlation runs through the liquid viscosity number), with Gray and BB within 0.4%. With dropout on, WG BHP is now below the no-dropout value, as it should be with less liquid in the tubing.
4
+
1
5
  Changelist in 3.8.0:
2
6
 
3
7
  - **NODAL: water viscosity in the VLP marches comes from the library's brine model (documented values move).** The marches used a private water-viscosity formula that evaluated a natural-log fit in degC as a base-10 fit in degF, so water viscosity was 12-30x too low (0.054 cP at 100 degF against 0.68; floored at 0.01 cP above about 200 degF), understating liquid friction and holdup in every method. Both the Python and Rust marches now use the same gas-free brine viscosity ``brine_props`` reports (IAPWS-2008 water with IF97 density, Jones-Dole NaCl ratio, Kestin pressure factor), with the salinity taken from ``wsg`` via McCain's gamma_w = 1 + 0.695e-6 ppm; Rust carries a port of that chain matching Python to 1e-14. Wells without water are unchanged. With water the change is modest for small water rates (the documented gas examples with 10 bbl/d move by -0.1 to -45.6 psi; WG moves most because realistic viscosity puts the liquid Reynolds number below Chisholm's laminar threshold) and larger with more water (5 MMscf/d with 500 bbl/d: HB +9%, WG +5%). The pure-Python march is slower (about 15 ms per ``fbhp`` against 3); the Rust path is about 0.2-0.3 ms.
@@ -1048,8 +1048,17 @@ def _condensate_dropout(cgr, qg_mmscfd, p_avg, pr, osg, qw_bwpd, wsg):
1048
1048
 
1049
1049
 
1050
1050
  def _condensate_vis(pr, cgr_local, gsg, api, temp_f, p_avg, oil_vis):
1051
+ """Viscosity (cP) of condensate dropped out in the tubing.
1052
+
1053
+ The dropped liquid is in equilibrium with the gas at the local pressure, so
1054
+ it is a saturated live liquid: Beggs-Robinson live-oil viscosity at the
1055
+ Standing (1947) solution GOR at local p and T, with Pb = p. Before 3.8.1 it
1056
+ was given the dead-oil viscosity (Rs = 0), 2-5x too viscous for a light
1057
+ condensate (up to ~16 cP at low temperature).
1058
+ """
1051
1059
  if pr > 14.7 and cgr_local > 0.01:
1052
- return _oil_viscosity_full(gsg, api, temp_f, rsb=0.0, pb=14.7,
1060
+ rs_sat = _standing_rs(gsg, p_avg, temp_f, api)
1061
+ return _oil_viscosity_full(gsg, api, temp_f, rsb=rs_sat, pb=p_avg,
1053
1062
  press_psia=p_avg)
1054
1063
  return oil_vis
1055
1064
 
@@ -86,8 +86,11 @@ fn condensate_vis(
86
86
  pr: f64, cgr_local: f64, gsg: f64, api: f64, temp_f: f64,
87
87
  p_avg: f64, oil_vis: f64,
88
88
  ) -> f64 {
89
+ // Dropped condensate is a saturated live liquid: Beggs-Robinson at the
90
+ // Standing solution GOR at local p, T with Pb = p (mirrors Python _condensate_vis)
89
91
  if pr > 14.7 && cgr_local > 0.01 {
90
- oil_viscosity_full(gsg, api, temp_f, 0.0, 14.7, p_avg, 1.0, 1.0)
92
+ let rs_sat = standing_rs(gsg, p_avg, temp_f, api);
93
+ oil_viscosity_full(gsg, api, temp_f, rs_sat, p_avg, p_avg, 1.0, 1.0)
91
94
  } else {
92
95
  oil_vis
93
96
  }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes