pyrestoolbox 3.8.6__tar.gz → 3.8.7__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 (155) hide show
  1. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/.github/workflows/build-wheels.yml +4 -22
  2. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/.github/workflows/tests.yml +14 -11
  3. pyrestoolbox-3.8.7/Cargo.lock +409 -0
  4. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/Cargo.toml +3 -2
  5. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/PKG-INFO +1 -1
  6. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyproject.toml +1 -1
  7. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/changelist.rst +6 -0
  8. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/simtools.rst +1 -1
  9. pyrestoolbox-3.8.7/src/gwr.rs +605 -0
  10. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/lib.rs +1 -1
  11. pyrestoolbox-3.8.7/src/mpfloat.rs +242 -0
  12. pyrestoolbox-3.8.6/Cargo.lock +0 -230
  13. pyrestoolbox-3.8.6/src/bessel.rs +0 -202
  14. pyrestoolbox-3.8.6/src/gwr.rs +0 -653
  15. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/.github/complexity-baseline.json +0 -0
  16. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/.github/scripts/check_complexity.py +0 -0
  17. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/.gitignore +0 -0
  18. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/LICENSE +0 -0
  19. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/MANIFEST.in +0 -0
  20. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/README.rst +0 -0
  21. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/ResToolbox/privacy_policy.md +0 -0
  22. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/build_pure_python.py +0 -0
  23. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/clippy.toml +0 -0
  24. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/mcp/Dockerfile +0 -0
  25. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/mcp/README.md +0 -0
  26. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/mcp/pyproject.toml +0 -0
  27. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/mcp/pyrestoolbox_mcp/__init__.py +0 -0
  28. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/mcp/pyrestoolbox_mcp/serialize.py +0 -0
  29. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/mcp/pyrestoolbox_mcp/server.py +0 -0
  30. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/mcp/tests/test_server.py +0 -0
  31. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/__init__.py +0 -0
  32. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/_accelerator.py +0 -0
  33. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/__init__.py +0 -0
  34. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/_lib_dielectric.py +0 -0
  35. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/_lib_maoduan_viscosity.py +0 -0
  36. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/_lib_pitzer_params.py +0 -0
  37. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/_lib_salting_library.py +0 -0
  38. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/_lib_vle_engine.py +0 -0
  39. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/appelo_volumes.py +0 -0
  40. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/brine.py +0 -0
  41. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/iapws_viscosity.py +0 -0
  42. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/jones_dole_viscosity.py +0 -0
  43. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/kestin_nacl_viscosity.py +0 -0
  44. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/pr_vphi.py +0 -0
  45. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/viscosity_route.py +0 -0
  46. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/brine/vphi_route.py +0 -0
  47. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/classes/__init__.py +0 -0
  48. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/classes/classes.py +0 -0
  49. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/constants/__init__.py +0 -0
  50. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/constants/constants.py +0 -0
  51. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/dca/__init__.py +0 -0
  52. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/dca/dca.py +0 -0
  53. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/brine.rst +0 -0
  54. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/dca.rst +0 -0
  55. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/examples.ipynb +0 -0
  56. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/gas.rst +0 -0
  57. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/img/bot.png +0 -0
  58. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/img/bot_PVTO.png +0 -0
  59. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/img/bot_img.png +0 -0
  60. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/img/dry_gas.png +0 -0
  61. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/img/grid_sat_df.png +0 -0
  62. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/img/influence.png +0 -0
  63. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/img/properties_df.png +0 -0
  64. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/img/sgof.png +0 -0
  65. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/img/swof.png +0 -0
  66. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/index.rst +0 -0
  67. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/layer.rst +0 -0
  68. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/library.rst +0 -0
  69. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/matbal.rst +0 -0
  70. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/nodal.rst +0 -0
  71. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/nodal_examples.ipynb +0 -0
  72. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/nodal_hydrate_demo.ipynb +0 -0
  73. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/oil.rst +0 -0
  74. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/plyasunov.rst +0 -0
  75. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/recommend.rst +0 -0
  76. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/docs/sensitivity.rst +0 -0
  77. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/gas/__init__.py +0 -0
  78. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/gas/_hydrate.py +0 -0
  79. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/gas/gas.py +0 -0
  80. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/layer/__init__.py +0 -0
  81. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/layer/layer.py +0 -0
  82. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/library/__init__.py +0 -0
  83. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/library/component_library.xlsx +0 -0
  84. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/library/library.py +0 -0
  85. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/matbal/__init__.py +0 -0
  86. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/matbal/matbal.py +0 -0
  87. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/nodal/__init__.py +0 -0
  88. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/nodal/nodal.py +0 -0
  89. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/__init__.py +0 -0
  90. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/_compressibility.py +0 -0
  91. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/_constants.py +0 -0
  92. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/_correlations.py +0 -0
  93. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/_density.py +0 -0
  94. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/_harmonize.py +0 -0
  95. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/_pvt_class.py +0 -0
  96. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/_rate.py +0 -0
  97. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/_separator.py +0 -0
  98. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/_tables.py +0 -0
  99. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/oil/_utils.py +0 -0
  100. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/plyasunov/__init__.py +0 -0
  101. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/plyasunov/iapws_if97.py +0 -0
  102. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/plyasunov/plyasunov_model.py +0 -0
  103. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/plyasunov/water_properties.py +0 -0
  104. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/recommend/__init__.py +0 -0
  105. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/recommend/recommend.py +0 -0
  106. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/sensitivity/__init__.py +0 -0
  107. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/sensitivity/sensitivity.py +0 -0
  108. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/shared_fns/__init__.py +0 -0
  109. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/shared_fns/shared_fns.py +0 -0
  110. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/simtools/__init__.py +0 -0
  111. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/simtools/_aquifer.py +0 -0
  112. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/simtools/_decks.py +0 -0
  113. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/simtools/_pvt_tables.py +0 -0
  114. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/simtools/_relperm.py +0 -0
  115. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/simtools/_vfp.py +0 -0
  116. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/simtools/simtools.py +0 -0
  117. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/validate/__init__.py +0 -0
  118. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/pyrestoolbox/validate/validate.py +0 -0
  119. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/setup.cfg +0 -0
  120. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/setup.py +0 -0
  121. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/brine_visc/mod.rs +0 -0
  122. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/brine_visc/salt.rs +0 -0
  123. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/brine_visc/water.rs +0 -0
  124. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/critical_properties/mod.rs +0 -0
  125. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/dca/hyperbolic.rs +0 -0
  126. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/dca/mod.rs +0 -0
  127. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/dca/ransac.rs +0 -0
  128. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/gas_viscosity/mod.rs +0 -0
  129. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/matbal/mod.rs +0 -0
  130. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/matbal/objective.rs +0 -0
  131. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/oil/density.rs +0 -0
  132. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/oil/mod.rs +0 -0
  133. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/pseudopressure.rs +0 -0
  134. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/spycher_pruess/mod.rs +0 -0
  135. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/spycher_pruess/solubility.rs +0 -0
  136. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/vle/alpha.rs +0 -0
  137. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/vle/bip.rs +0 -0
  138. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/vle/components.rs +0 -0
  139. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/vle/eos.rs +0 -0
  140. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/vle/flash.rs +0 -0
  141. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/vle/fugacity.rs +0 -0
  142. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/vle/k_init.rs +0 -0
  143. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/vle/mod.rs +0 -0
  144. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/vle/rachford_rice.rs +0 -0
  145. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/vlp/constants.rs +0 -0
  146. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/vlp/friction.rs +0 -0
  147. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/vlp/holdup_bb.rs +0 -0
  148. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/vlp/holdup_gray.rs +0 -0
  149. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/vlp/holdup_wg.rs +0 -0
  150. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/vlp/ift.rs +0 -0
  151. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/vlp/march.rs +0 -0
  152. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/vlp/mod.rs +0 -0
  153. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/vlp/pvt_helpers.rs +0 -0
  154. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/vlp/static_column.rs +0 -0
  155. {pyrestoolbox-3.8.6 → pyrestoolbox-3.8.7}/src/zfactor/mod.rs +0 -0
@@ -27,18 +27,10 @@ jobs:
27
27
  python-version: "3.12"
28
28
 
29
29
  - name: Install Rust toolchain
30
- if: matrix.os != 'windows-latest'
31
30
  uses: dtolnay/rust-toolchain@stable
32
31
  with:
33
32
  targets: ${{ matrix.os == 'macos-14' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }}
34
33
 
35
- - name: Install Rust toolchain (Windows GNU)
36
- if: matrix.os == 'windows-latest'
37
- run: |
38
- rustup toolchain install stable-x86_64-pc-windows-gnu
39
- rustup default stable-x86_64-pc-windows-gnu
40
- shell: bash
41
-
42
34
  - name: Build wheels via cibuildwheel
43
35
  uses: pypa/cibuildwheel@v2.23
44
36
  env:
@@ -50,23 +42,12 @@ jobs:
50
42
  CIBW_SKIP: "*-win32 *-manylinux_i686 *-musllinux*"
51
43
  # maturin needs Rust in the build container
52
44
  CIBW_BEFORE_ALL_LINUX: >
53
- yum install -y m4 diffutils &&
54
45
  curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
55
46
  CIBW_ENVIRONMENT_LINUX: 'PATH="$HOME/.cargo/bin:$PATH"'
56
47
  # macOS: build native arch only per runner (no cross-compilation)
57
48
  CIBW_ARCHS_MACOS: "arm64"
58
49
  CIBW_ARCHS_LINUX: "x86_64"
59
50
  CIBW_ARCHS_WINDOWS: "AMD64"
60
- # Windows: use gnu target so GMP can build with MinGW GCC.
61
- # MSYS2 is pre-installed on windows-latest runners.
62
- CIBW_BEFORE_ALL_WINDOWS: >
63
- C:\msys64\usr\bin\pacman.exe -S --noconfirm
64
- mingw-w64-x86_64-gcc
65
- m4
66
- diffutils
67
- make
68
- CIBW_ENVIRONMENT_WINDOWS: >
69
- PATH="C:\\msys64\\mingw64\\bin;C:\\msys64\\usr\\bin;$PATH"
70
51
  # Rust cross-compile env for macOS x86_64 on arm64 runner
71
52
  CIBW_ENVIRONMENT_MACOS: >
72
53
  CARGO_BUILD_TARGET="aarch64-apple-darwin"
@@ -80,9 +61,10 @@ jobs:
80
61
  # missing OpenBLAS (this broke the v3.6.0 first build attempt - the
81
62
  # skip is load-bearing, do not remove it). Linux import + full-suite
82
63
  # coverage lives in .github/workflows/tests.yml instead.
83
- # Also skip macOS (MPFR symbol issue) and cp39 (dependency
84
- # ilt-inversion may not have matching wheels on PyPI yet).
85
- CIBW_TEST_SKIP: "*-manylinux* *-macosx* cp39-*"
64
+ # Also skip cp39 (dependency ilt-inversion may not have matching
65
+ # wheels on PyPI yet). macOS tests run again: the skip was for an
66
+ # MPFR symbol issue, and the crate no longer links GMP/MPFR.
67
+ CIBW_TEST_SKIP: "*-manylinux* cp39-*"
86
68
 
87
69
  - uses: actions/upload-artifact@v6
88
70
  with:
@@ -30,9 +30,18 @@ jobs:
30
30
  run: python3 -m pytest pyrestoolbox/tests/ -q
31
31
 
32
32
  # ── Full test suite with Rust extension (includes parity tests) ──────
33
+ # Linux plus macOS and Windows: the extension is pure Rust (astro-float), so
34
+ # every platform builds it with the default toolchain and runs the suite.
33
35
  test-with-rust:
34
- name: Rust-accelerated (parity tests)
35
- runs-on: ubuntu-latest
36
+ name: Rust-accelerated (parity tests)${{ matrix.os != 'ubuntu-latest' && format(' - {0}', matrix.os) || '' }}
37
+ runs-on: ${{ matrix.os }}
38
+ strategy:
39
+ fail-fast: false
40
+ matrix:
41
+ os: [ubuntu-latest, macos-14, windows-latest]
42
+ defaults:
43
+ run:
44
+ shell: bash
36
45
  steps:
37
46
  - uses: actions/checkout@v5
38
47
 
@@ -43,9 +52,6 @@ jobs:
43
52
  - name: Install Rust toolchain
44
53
  uses: dtolnay/rust-toolchain@stable
45
54
 
46
- - name: Install m4 (needed by gmp-mpfr-sys for the rug crate)
47
- run: sudo apt-get update -qq && sudo apt-get install -y -qq m4
48
-
49
55
  - name: Install dependencies
50
56
  run: pip install numpy scipy pandas tabulate openpyxl mpmath ilt-inversion pytest maturin
51
57
 
@@ -55,13 +61,13 @@ jobs:
55
61
  # Tests import the repo source tree, so the compiled extension must
56
62
  # live inside it for the Rust paths to load.
57
63
  - name: Copy extension into source tree
58
- run: unzip -o dist/*.whl "pyrestoolbox/_native*" -d .
64
+ run: python -c "import glob, zipfile; z = zipfile.ZipFile(glob.glob('dist/*.whl')[0]); [z.extract(n, '.') for n in z.namelist() if n.startswith('pyrestoolbox/_native')]"
59
65
 
60
66
  - name: Verify Rust extension loads
61
- run: python3 -c "from pyrestoolbox._accelerator import get_status; s = get_status(); print(s); assert s['rust_available'], s"
67
+ run: python -c "from pyrestoolbox._accelerator import get_status; s = get_status(); print(s); assert s['rust_available'], s"
62
68
 
63
69
  - name: Run full test suite (Rust + parity)
64
- run: python3 -m pytest pyrestoolbox/tests/ -q
70
+ run: python -m pytest pyrestoolbox/tests/ -q
65
71
 
66
72
  # ── MCP server (separate distribution in mcp/) on both SDK majors ────
67
73
  # The server picks FastMCP (1.x) or MCPServer (2.x) at import; test both so
@@ -117,9 +123,6 @@ jobs:
117
123
  with:
118
124
  components: clippy
119
125
 
120
- - name: Install m4 (needed by gmp-mpfr-sys for the rug crate)
121
- run: sudo apt-get update -qq && sudo apt-get install -y -qq m4
122
-
123
126
  - name: Clippy
124
127
  run: cargo clippy --all-targets -- -D warnings
125
128
 
@@ -0,0 +1,409 @@
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 4
4
+
5
+ [[package]]
6
+ name = "astro-float"
7
+ version = "0.9.6"
8
+ source = "registry+https://github.com/rust-lang/crates.io-index"
9
+ checksum = "2cf6ecd69dd6fbe3763187ff2fa2b0e475b79f04ed86f631a7bc6b04ede0355e"
10
+ dependencies = [
11
+ "astro-float-macro",
12
+ "astro-float-num",
13
+ ]
14
+
15
+ [[package]]
16
+ name = "astro-float-macro"
17
+ version = "0.4.6"
18
+ source = "registry+https://github.com/rust-lang/crates.io-index"
19
+ checksum = "9c007205ae7076600c8a59022866990afac02ff186f9031839f67ecce4df2146"
20
+ dependencies = [
21
+ "astro-float-num",
22
+ "proc-macro2",
23
+ "quote",
24
+ "syn 1.0.109",
25
+ ]
26
+
27
+ [[package]]
28
+ name = "astro-float-num"
29
+ version = "0.3.7"
30
+ source = "registry+https://github.com/rust-lang/crates.io-index"
31
+ checksum = "bc7f6a0312e8f5845f84241b21bd2394d49940b6bc333c6a84f992e6dc9ebb85"
32
+ dependencies = [
33
+ "itertools",
34
+ "lazy_static",
35
+ "rand",
36
+ "serde",
37
+ ]
38
+
39
+ [[package]]
40
+ name = "autocfg"
41
+ version = "1.5.0"
42
+ source = "registry+https://github.com/rust-lang/crates.io-index"
43
+ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
44
+
45
+ [[package]]
46
+ name = "cfg-if"
47
+ version = "1.0.4"
48
+ source = "registry+https://github.com/rust-lang/crates.io-index"
49
+ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
50
+
51
+ [[package]]
52
+ name = "crossbeam-deque"
53
+ version = "0.8.8"
54
+ source = "registry+https://github.com/rust-lang/crates.io-index"
55
+ checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a"
56
+ dependencies = [
57
+ "crossbeam-epoch",
58
+ "crossbeam-utils",
59
+ ]
60
+
61
+ [[package]]
62
+ name = "crossbeam-epoch"
63
+ version = "0.9.21"
64
+ source = "registry+https://github.com/rust-lang/crates.io-index"
65
+ checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d"
66
+ dependencies = [
67
+ "crossbeam-utils",
68
+ ]
69
+
70
+ [[package]]
71
+ name = "crossbeam-utils"
72
+ version = "0.8.23"
73
+ source = "registry+https://github.com/rust-lang/crates.io-index"
74
+ checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6"
75
+
76
+ [[package]]
77
+ name = "either"
78
+ version = "1.19.0"
79
+ source = "registry+https://github.com/rust-lang/crates.io-index"
80
+ checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be"
81
+
82
+ [[package]]
83
+ name = "getrandom"
84
+ version = "0.2.17"
85
+ source = "registry+https://github.com/rust-lang/crates.io-index"
86
+ checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
87
+ dependencies = [
88
+ "cfg-if",
89
+ "libc",
90
+ "wasi",
91
+ ]
92
+
93
+ [[package]]
94
+ name = "heck"
95
+ version = "0.5.0"
96
+ source = "registry+https://github.com/rust-lang/crates.io-index"
97
+ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
98
+
99
+ [[package]]
100
+ name = "indoc"
101
+ version = "2.0.7"
102
+ source = "registry+https://github.com/rust-lang/crates.io-index"
103
+ checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
104
+ dependencies = [
105
+ "rustversion",
106
+ ]
107
+
108
+ [[package]]
109
+ name = "itertools"
110
+ version = "0.10.5"
111
+ source = "registry+https://github.com/rust-lang/crates.io-index"
112
+ checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
113
+ dependencies = [
114
+ "either",
115
+ ]
116
+
117
+ [[package]]
118
+ name = "lazy_static"
119
+ version = "1.5.1"
120
+ source = "registry+https://github.com/rust-lang/crates.io-index"
121
+ checksum = "20870f649af7073d53e38067b2a84312175d56ea15217e1b15bc83506ec50afb"
122
+
123
+ [[package]]
124
+ name = "libc"
125
+ version = "0.2.184"
126
+ source = "registry+https://github.com/rust-lang/crates.io-index"
127
+ checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af"
128
+
129
+ [[package]]
130
+ name = "memoffset"
131
+ version = "0.9.1"
132
+ source = "registry+https://github.com/rust-lang/crates.io-index"
133
+ checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
134
+ dependencies = [
135
+ "autocfg",
136
+ ]
137
+
138
+ [[package]]
139
+ name = "once_cell"
140
+ version = "1.21.4"
141
+ source = "registry+https://github.com/rust-lang/crates.io-index"
142
+ checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
143
+
144
+ [[package]]
145
+ name = "portable-atomic"
146
+ version = "1.13.1"
147
+ source = "registry+https://github.com/rust-lang/crates.io-index"
148
+ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
149
+
150
+ [[package]]
151
+ name = "ppv-lite86"
152
+ version = "0.2.21"
153
+ source = "registry+https://github.com/rust-lang/crates.io-index"
154
+ checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
155
+ dependencies = [
156
+ "zerocopy",
157
+ ]
158
+
159
+ [[package]]
160
+ name = "proc-macro2"
161
+ version = "1.0.106"
162
+ source = "registry+https://github.com/rust-lang/crates.io-index"
163
+ checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
164
+ dependencies = [
165
+ "unicode-ident",
166
+ ]
167
+
168
+ [[package]]
169
+ name = "pyo3"
170
+ version = "0.23.5"
171
+ source = "registry+https://github.com/rust-lang/crates.io-index"
172
+ checksum = "7778bffd85cf38175ac1f545509665d0b9b92a198ca7941f131f85f7a4f9a872"
173
+ dependencies = [
174
+ "cfg-if",
175
+ "indoc",
176
+ "libc",
177
+ "memoffset",
178
+ "once_cell",
179
+ "portable-atomic",
180
+ "pyo3-build-config",
181
+ "pyo3-ffi",
182
+ "pyo3-macros",
183
+ "unindent",
184
+ ]
185
+
186
+ [[package]]
187
+ name = "pyo3-build-config"
188
+ version = "0.23.5"
189
+ source = "registry+https://github.com/rust-lang/crates.io-index"
190
+ checksum = "94f6cbe86ef3bf18998d9df6e0f3fc1050a8c5efa409bf712e661a4366e010fb"
191
+ dependencies = [
192
+ "once_cell",
193
+ "target-lexicon",
194
+ ]
195
+
196
+ [[package]]
197
+ name = "pyo3-ffi"
198
+ version = "0.23.5"
199
+ source = "registry+https://github.com/rust-lang/crates.io-index"
200
+ checksum = "e9f1b4c431c0bb1c8fb0a338709859eed0d030ff6daa34368d3b152a63dfdd8d"
201
+ dependencies = [
202
+ "libc",
203
+ "pyo3-build-config",
204
+ ]
205
+
206
+ [[package]]
207
+ name = "pyo3-macros"
208
+ version = "0.23.5"
209
+ source = "registry+https://github.com/rust-lang/crates.io-index"
210
+ checksum = "fbc2201328f63c4710f68abdf653c89d8dbc2858b88c5d88b0ff38a75288a9da"
211
+ dependencies = [
212
+ "proc-macro2",
213
+ "pyo3-macros-backend",
214
+ "quote",
215
+ "syn 2.0.117",
216
+ ]
217
+
218
+ [[package]]
219
+ name = "pyo3-macros-backend"
220
+ version = "0.23.5"
221
+ source = "registry+https://github.com/rust-lang/crates.io-index"
222
+ checksum = "fca6726ad0f3da9c9de093d6f116a93c1a38e417ed73bf138472cf4064f72028"
223
+ dependencies = [
224
+ "heck",
225
+ "proc-macro2",
226
+ "pyo3-build-config",
227
+ "quote",
228
+ "syn 2.0.117",
229
+ ]
230
+
231
+ [[package]]
232
+ name = "pyrestoolbox-native"
233
+ version = "3.8.7"
234
+ dependencies = [
235
+ "astro-float",
236
+ "pyo3",
237
+ "rayon",
238
+ ]
239
+
240
+ [[package]]
241
+ name = "quote"
242
+ version = "1.0.45"
243
+ source = "registry+https://github.com/rust-lang/crates.io-index"
244
+ checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
245
+ dependencies = [
246
+ "proc-macro2",
247
+ ]
248
+
249
+ [[package]]
250
+ name = "rand"
251
+ version = "0.8.8"
252
+ source = "registry+https://github.com/rust-lang/crates.io-index"
253
+ checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c"
254
+ dependencies = [
255
+ "libc",
256
+ "rand_chacha",
257
+ "rand_core",
258
+ ]
259
+
260
+ [[package]]
261
+ name = "rand_chacha"
262
+ version = "0.3.1"
263
+ source = "registry+https://github.com/rust-lang/crates.io-index"
264
+ checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
265
+ dependencies = [
266
+ "ppv-lite86",
267
+ "rand_core",
268
+ ]
269
+
270
+ [[package]]
271
+ name = "rand_core"
272
+ version = "0.6.4"
273
+ source = "registry+https://github.com/rust-lang/crates.io-index"
274
+ checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
275
+ dependencies = [
276
+ "getrandom",
277
+ ]
278
+
279
+ [[package]]
280
+ name = "rayon"
281
+ version = "1.12.0"
282
+ source = "registry+https://github.com/rust-lang/crates.io-index"
283
+ checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d"
284
+ dependencies = [
285
+ "either",
286
+ "rayon-core",
287
+ ]
288
+
289
+ [[package]]
290
+ name = "rayon-core"
291
+ version = "1.13.0"
292
+ source = "registry+https://github.com/rust-lang/crates.io-index"
293
+ checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91"
294
+ dependencies = [
295
+ "crossbeam-deque",
296
+ "crossbeam-utils",
297
+ ]
298
+
299
+ [[package]]
300
+ name = "rustversion"
301
+ version = "1.0.22"
302
+ source = "registry+https://github.com/rust-lang/crates.io-index"
303
+ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
304
+
305
+ [[package]]
306
+ name = "serde"
307
+ version = "1.0.229"
308
+ source = "registry+https://github.com/rust-lang/crates.io-index"
309
+ checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
310
+ dependencies = [
311
+ "serde_core",
312
+ ]
313
+
314
+ [[package]]
315
+ name = "serde_core"
316
+ version = "1.0.229"
317
+ source = "registry+https://github.com/rust-lang/crates.io-index"
318
+ checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
319
+ dependencies = [
320
+ "serde_derive",
321
+ ]
322
+
323
+ [[package]]
324
+ name = "serde_derive"
325
+ version = "1.0.229"
326
+ source = "registry+https://github.com/rust-lang/crates.io-index"
327
+ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
328
+ dependencies = [
329
+ "proc-macro2",
330
+ "quote",
331
+ "syn 3.0.9",
332
+ ]
333
+
334
+ [[package]]
335
+ name = "syn"
336
+ version = "1.0.109"
337
+ source = "registry+https://github.com/rust-lang/crates.io-index"
338
+ checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
339
+ dependencies = [
340
+ "proc-macro2",
341
+ "quote",
342
+ "unicode-ident",
343
+ ]
344
+
345
+ [[package]]
346
+ name = "syn"
347
+ version = "2.0.117"
348
+ source = "registry+https://github.com/rust-lang/crates.io-index"
349
+ checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
350
+ dependencies = [
351
+ "proc-macro2",
352
+ "quote",
353
+ "unicode-ident",
354
+ ]
355
+
356
+ [[package]]
357
+ name = "syn"
358
+ version = "3.0.9"
359
+ source = "registry+https://github.com/rust-lang/crates.io-index"
360
+ checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b"
361
+ dependencies = [
362
+ "proc-macro2",
363
+ "quote",
364
+ "unicode-ident",
365
+ ]
366
+
367
+ [[package]]
368
+ name = "target-lexicon"
369
+ version = "0.12.16"
370
+ source = "registry+https://github.com/rust-lang/crates.io-index"
371
+ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
372
+
373
+ [[package]]
374
+ name = "unicode-ident"
375
+ version = "1.0.24"
376
+ source = "registry+https://github.com/rust-lang/crates.io-index"
377
+ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
378
+
379
+ [[package]]
380
+ name = "unindent"
381
+ version = "0.2.4"
382
+ source = "registry+https://github.com/rust-lang/crates.io-index"
383
+ checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3"
384
+
385
+ [[package]]
386
+ name = "wasi"
387
+ version = "0.11.1+wasi-snapshot-preview1"
388
+ source = "registry+https://github.com/rust-lang/crates.io-index"
389
+ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
390
+
391
+ [[package]]
392
+ name = "zerocopy"
393
+ version = "0.8.63"
394
+ source = "registry+https://github.com/rust-lang/crates.io-index"
395
+ checksum = "e5fe1f8f1b06191a00962174c61aa5005e0bb391a6d80d07e24d115c01a92ed8"
396
+ dependencies = [
397
+ "zerocopy-derive",
398
+ ]
399
+
400
+ [[package]]
401
+ name = "zerocopy-derive"
402
+ version = "0.8.63"
403
+ source = "registry+https://github.com/rust-lang/crates.io-index"
404
+ checksum = "863ad3ac83293fb4d740aedbfdc9240dd8d1a50c1099acd76ce80ce7c7230c7f"
405
+ dependencies = [
406
+ "proc-macro2",
407
+ "quote",
408
+ "syn 2.0.117",
409
+ ]
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "pyrestoolbox-native"
3
- version = "3.8.6"
3
+ version = "3.8.7"
4
4
  edition = "2021"
5
5
  license = "GPL-3.0-or-later"
6
6
  description = "Rust acceleration extensions for pyResToolbox"
@@ -11,8 +11,9 @@ name = "_native"
11
11
  crate-type = ["cdylib"]
12
12
 
13
13
  [dependencies]
14
+ astro-float = "0.9.6"
14
15
  pyo3 = { version = "0.23", features = ["extension-module"] }
15
- rug = { version = "1", default-features = false, features = ["float"] }
16
+ rayon = "1.12.0"
16
17
 
17
18
  [profile.release]
18
19
  opt-level = 3
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyrestoolbox
3
- Version: 3.8.6
3
+ Version: 3.8.7
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.6"
7
+ version = "3.8.7"
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,9 @@
1
+ Changelist in 3.8.7:
2
+
3
+ - **SIMTOOLS: ``influence_tables`` Rust path runs on all CPU threads.** The Bessel evaluations, transform values and GWR accelerations are spread across threads (output identical at any thread count). On a 4-core, 8-thread machine the 126-point table takes 0.06 s at M=7 (0.19 s on one thread, 0.09 s for the 3.8.6 MPFR build) and 0.51 s at M=32 (1.81 s, 1.51 s). For comparison, gwr_inversion 2.0.0's built-in bounded radial transform takes 0.40 s at M=7 on one core and 0.15 s with ``workers=8``, at identical accuracy. ``RAYON_NUM_THREADS`` limits the thread count; see the ``influence_tables`` documentation.
4
+
5
+ - **PACKAGING: the Rust extension no longer needs a C toolchain, and macOS wheels are tested again.** The multiprecision arithmetic behind ``simtools.influence_tables`` moved from the ``rug`` crate (GMP and MPFR, compiled from C) to the pure-Rust ``astro-float`` crate. Windows wheels now build with the standard MSVC Rust toolchain instead of MinGW and MSYS2, building from the sdist needs only Rust (no ``m4``), and the macOS wheel import tests that were skipped for an MPFR linking issue run again. Results agree with the MPFR build to the last bit of f64 output at M of 18 and above, and to within 2.8e-10 (relative) at M=7 and 1.4e-13 at M=12, about four orders of magnitude below the inversion's own error. On one thread it is slower than the MPFR build, partly recovered by evaluating each argument's four Bessel functions from one set of power series and sharing the values at sqrt(s) across ReD: a 126-point table takes 0.19 s at the default M=7 against 0.09 s before (2.1x), narrowing to 1.2x at M=32 (1.81 vs 1.51 s).
6
+
1
7
  Changelist in 3.8.6:
2
8
 
3
9
  - **SIMTOOLS: ``influence_tables`` Rust path now holds the precision the inversion needs (results move).** The Rust Gaver-Wynn-Rho inversion evaluates the Van Everdingen-Hurst transform with its own MPFR Bessel functions, and those carried less precision than GWR needs (about 2.1M digits). The series-to-asymptotic switch was fixed at x = 25, where the asymptotic expansion is good to only about 22 digits; the K-series ran with half the guard bits its cancellation needs; pi in the asymptotic prefactors and Euler's constant in the K0 series were f64 or 50-digit constants; and the I1 asymptotic expansion had a sign error. The switch now depends on the working precision, the guard bits match the cancellation, all constants are MPFR, and the I1 sign is corrected. Against a reference converged to 1e-14, the worst point on a 126-point table (ReD 1.5-20, tD 0.01-200) is now 2.2e-5 at M=7 (was 4.5e-5), 1.4e-8 at M=12 (was 1.6e-4), 3.2e-11 at M=18 (was 6.7e-3) and 2e-16 at M=32 (ReD 1.5 at tD 0.044 returned 20.07 against 0.2175), the same convergence as the pure-Python path. At the default M=7 the README example table (ReD 1.5-1000) moves by up to 4.6e-5 relative (ReD 1.5, tD 0.027: 0.172801 to 0.172809), 6e-7 on average. Run time is unchanged or a little shorter (121 against 138 ms for that table at M=7).
@@ -152,7 +152,7 @@ pyrestoolbox.simtools.influence_tables
152
152
 
153
153
  Solves Van Everdingin & Hurst Constant Terminal Rate solution via inverse Laplace transform and optionally writes out ECLIPSE styled AQUTAB include file.
154
154
 
155
- The Rust extension (in every prebuilt wheel) does the inversion with no extra packages. Without it, the pure-Python fallback needs the optional ``aquifer`` extra (``ilt-inversion``, ``mpmath``, ``gmpy2``): ``pip install 'pyrestoolbox[aquifer]'``. Calling ``influence_tables`` on the pure-Python path without them raises ``ImportError``.
155
+ The Rust extension (in every prebuilt wheel) does the inversion with no extra packages, using all available CPU threads; set the environment variable ``RAYON_NUM_THREADS`` before importing pyrestoolbox to limit them (for example ``RAYON_NUM_THREADS=1`` when running several processes side by side). The result does not depend on the thread count. Without it, the pure-Python fallback needs the optional ``aquifer`` extra (``ilt-inversion``, ``mpmath``, ``gmpy2``): ``pip install 'pyrestoolbox[aquifer]'``. Calling ``influence_tables`` on the pure-Python path without them raises ``ImportError``.
156
156
 
157
157
  Returns a tuple of;
158
158
  1. Dimensionless time list