res2df 1.3.1__tar.gz → 1.3.2__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 (259) hide show
  1. {res2df-1.3.1 → res2df-1.3.2}/.github/workflows/codecov.yml +6 -0
  2. {res2df-1.3.1 → res2df-1.3.2}/.github/workflows/res2df.yml +6 -0
  3. {res2df-1.3.1 → res2df-1.3.2}/PKG-INFO +3 -2
  4. {res2df-1.3.1 → res2df-1.3.2}/res2df/csv2res.py +0 -15
  5. {res2df-1.3.1 → res2df-1.3.2}/res2df/fipreports.py +2 -2
  6. {res2df-1.3.1 → res2df-1.3.2}/res2df/grid.py +2 -2
  7. {res2df-1.3.1 → res2df-1.3.2}/res2df/gruptree.py +1 -1
  8. res2df-1.3.2/res2df/hook_implementations/forward_model_steps.py +138 -0
  9. {res2df-1.3.1 → res2df-1.3.2}/res2df/res2csv.py +0 -27
  10. {res2df-1.3.1 → res2df-1.3.2}/res2df/summary.py +5 -0
  11. {res2df-1.3.1 → res2df-1.3.2}/res2df/version.py +9 -4
  12. {res2df-1.3.1 → res2df-1.3.2}/res2df/vfp/_vfpinj.py +4 -2
  13. {res2df-1.3.1 → res2df-1.3.2}/res2df/vfp/_vfpprod.py +4 -2
  14. {res2df-1.3.1 → res2df-1.3.2}/res2df.egg-info/PKG-INFO +3 -2
  15. {res2df-1.3.1 → res2df-1.3.2}/res2df.egg-info/SOURCES.txt +1 -3
  16. {res2df-1.3.1 → res2df-1.3.2}/res2df.egg-info/entry_points.txt +1 -1
  17. {res2df-1.3.1 → res2df-1.3.2}/ruff.toml +1 -0
  18. {res2df-1.3.1 → res2df-1.3.2}/setup.cfg +0 -4
  19. {res2df-1.3.1 → res2df-1.3.2}/setup.py +1 -2
  20. {res2df-1.3.1 → res2df-1.3.2}/tests/test_ert_hooks.py +1 -35
  21. {res2df-1.3.1 → res2df-1.3.2}/tests/test_fipreports.py +94 -0
  22. res2df-1.3.2/tests/test_hook_implementations.py +33 -0
  23. {res2df-1.3.1 → res2df-1.3.2}/tests/test_summary.py +57 -0
  24. res2df-1.3.1/res2df/config_jobs/CSV2RES +0 -5
  25. res2df-1.3.1/res2df/config_jobs/RES2CSV +0 -16
  26. res2df-1.3.1/res2df/hook_implementations/jobs.py +0 -63
  27. res2df-1.3.1/tests/test_hook_implementations.py +0 -88
  28. {res2df-1.3.1 → res2df-1.3.2}/.codacy.yml +0 -0
  29. {res2df-1.3.1 → res2df-1.3.2}/.github/workflows/style.yml +0 -0
  30. {res2df-1.3.1 → res2df-1.3.2}/.github/workflows/typing.yml +0 -0
  31. {res2df-1.3.1 → res2df-1.3.2}/.gitignore +0 -0
  32. {res2df-1.3.1 → res2df-1.3.2}/.pre-commit-config.yaml +0 -0
  33. {res2df-1.3.1 → res2df-1.3.2}/CONTRIBUTING.md +0 -0
  34. {res2df-1.3.1 → res2df-1.3.2}/LICENSE +0 -0
  35. {res2df-1.3.1 → res2df-1.3.2}/README.md +0 -0
  36. {res2df-1.3.1 → res2df-1.3.2}/SECURITY.md +0 -0
  37. {res2df-1.3.1 → res2df-1.3.2}/ci/testkomodo.sh +0 -0
  38. {res2df-1.3.1 → res2df-1.3.2}/docs/_static/equinor-logo.png +0 -0
  39. {res2df-1.3.1 → res2df-1.3.2}/docs/_static/equinor-logo2.jpg +0 -0
  40. {res2df-1.3.1 → res2df-1.3.2}/docs/_static/equinor_logo.jpg +0 -0
  41. {res2df-1.3.1 → res2df-1.3.2}/docs/_static/equinor_logo_only.jpg +0 -0
  42. {res2df-1.3.1 → res2df-1.3.2}/docs/_templates/layout.html +0 -0
  43. {res2df-1.3.1 → res2df-1.3.2}/docs/conf.py +0 -0
  44. {res2df-1.3.1 → res2df-1.3.2}/docs/contribution.rst +0 -0
  45. {res2df-1.3.1 → res2df-1.3.2}/docs/csv2res.rst +0 -0
  46. {res2df-1.3.1 → res2df-1.3.2}/docs/glossary.rst +0 -0
  47. {res2df-1.3.1 → res2df-1.3.2}/docs/history.rst +0 -0
  48. {res2df-1.3.1 → res2df-1.3.2}/docs/index.rst +0 -0
  49. {res2df-1.3.1 → res2df-1.3.2}/docs/installation.rst +0 -0
  50. {res2df-1.3.1 → res2df-1.3.2}/docs/introduction.rst +0 -0
  51. {res2df-1.3.1 → res2df-1.3.2}/docs/res2csv.rst +0 -0
  52. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/compdat.csv +0 -0
  53. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/compdat.rst +0 -0
  54. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/equil-example.csv +0 -0
  55. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/equil.rst +0 -0
  56. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/fipnum.inc +0 -0
  57. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/fipreports-example.csv +0 -0
  58. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/fipreports-example.txt +0 -0
  59. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/fipreports.rst +0 -0
  60. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/grid.csv +0 -0
  61. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/grid.rst +0 -0
  62. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/gruptree.csv +0 -0
  63. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/gruptree.rst +0 -0
  64. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/gruptreenet.csv +0 -0
  65. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/images/injectoranalysis.png +0 -0
  66. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/images/multibranch-rftanalysis.png +0 -0
  67. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/nnc.csv +0 -0
  68. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/nnc.rst +0 -0
  69. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/outflow.csv +0 -0
  70. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/pillars-dyn1-stacked.csv +0 -0
  71. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/pillars-dyn1-unstacked.csv +0 -0
  72. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/pillars-example1.csv +0 -0
  73. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/pillars.rst +0 -0
  74. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/pvt.csv +0 -0
  75. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/pvt.rst +0 -0
  76. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/rft.rst +0 -0
  77. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/rft_columns.csv +0 -0
  78. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/satfunc.csv +0 -0
  79. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/satfunc.rst +0 -0
  80. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/summary.csv +0 -0
  81. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/summary.rst +0 -0
  82. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/trans-boundaries.csv +0 -0
  83. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/trans-group.csv +0 -0
  84. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/trans.rst +0 -0
  85. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/trans1.csv +0 -0
  86. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/wcon.csv +0 -0
  87. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/wcon.rst +0 -0
  88. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/well_connection_status.csv +0 -0
  89. {res2df-1.3.1 → res2df-1.3.2}/docs/usage/wellconnstatus.rst +0 -0
  90. {res2df-1.3.1 → res2df-1.3.2}/docs/usage.rst +0 -0
  91. {res2df-1.3.1 → res2df-1.3.2}/mypy.ini +0 -0
  92. {res2df-1.3.1 → res2df-1.3.2}/py.typed +0 -0
  93. {res2df-1.3.1 → res2df-1.3.2}/res2df/__init__.py +0 -0
  94. {res2df-1.3.1 → res2df-1.3.2}/res2df/__version__.py +0 -0
  95. {res2df-1.3.1 → res2df-1.3.2}/res2df/common.py +0 -0
  96. {res2df-1.3.1 → res2df-1.3.2}/res2df/compdat.py +0 -0
  97. {res2df-1.3.1 → res2df-1.3.2}/res2df/constants.py +0 -0
  98. {res2df-1.3.1 → res2df-1.3.2}/res2df/equil.py +0 -0
  99. {res2df-1.3.1 → res2df-1.3.2}/res2df/faults.py +0 -0
  100. {res2df-1.3.1 → res2df-1.3.2}/res2df/hook_implementations/__init__.py +0 -0
  101. {res2df-1.3.1 → res2df-1.3.2}/res2df/inferdims.py +0 -0
  102. {res2df-1.3.1 → res2df-1.3.2}/res2df/nnc.py +0 -0
  103. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/BRANPROP +0 -0
  104. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/COMPDAT +0 -0
  105. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/COMPLUMP +0 -0
  106. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/COMPSEGS +0 -0
  107. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/DENSITY +0 -0
  108. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/EQLDIMS +0 -0
  109. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/EQUIL +0 -0
  110. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/FAULTS +0 -0
  111. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/GRUPNET +0 -0
  112. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/GRUPTREE +0 -0
  113. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/NODEPROP +0 -0
  114. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/PBVD +0 -0
  115. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/PDVD +0 -0
  116. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/PVDG +0 -0
  117. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/PVDO +0 -0
  118. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/PVTG +0 -0
  119. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/PVTO +0 -0
  120. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/PVTW +0 -0
  121. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/ROCK +0 -0
  122. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/RSVD +0 -0
  123. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/RVVD +0 -0
  124. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/SGFN +0 -0
  125. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/SGOF +0 -0
  126. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/SGWFN +0 -0
  127. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/SLGOF +0 -0
  128. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/SOF2 +0 -0
  129. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/SOF3 +0 -0
  130. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/SWFN +0 -0
  131. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/SWOF +0 -0
  132. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/TABDIMS +0 -0
  133. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/VFPINJ +0 -0
  134. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/VFPPROD +0 -0
  135. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/WCONHIST +0 -0
  136. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/WCONINJE +0 -0
  137. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/WCONINJH +0 -0
  138. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/WCONPROD +0 -0
  139. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/WELOPEN +0 -0
  140. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/WELSEGS +0 -0
  141. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/WELSPECS +0 -0
  142. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/WLIST +0 -0
  143. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/WSEGAICD +0 -0
  144. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/WSEGSICD +0 -0
  145. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/WSEGVALV +0 -0
  146. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/readme +0 -0
  147. {res2df-1.3.1 → res2df-1.3.2}/res2df/opmkeywords/runmetoupdate.sh +0 -0
  148. {res2df-1.3.1 → res2df-1.3.2}/res2df/parameters.py +0 -0
  149. {res2df-1.3.1 → res2df-1.3.2}/res2df/pillars.py +0 -0
  150. {res2df-1.3.1 → res2df-1.3.2}/res2df/pvt.py +0 -0
  151. {res2df-1.3.1 → res2df-1.3.2}/res2df/res2csvlogger.py +0 -0
  152. {res2df-1.3.1 → res2df-1.3.2}/res2df/resdatafiles.py +0 -0
  153. {res2df-1.3.1 → res2df-1.3.2}/res2df/rft.py +0 -0
  154. {res2df-1.3.1 → res2df-1.3.2}/res2df/satfunc.py +0 -0
  155. {res2df-1.3.1 → res2df-1.3.2}/res2df/svg_color_keyword_names.txt +0 -0
  156. {res2df-1.3.1 → res2df-1.3.2}/res2df/trans.py +0 -0
  157. {res2df-1.3.1 → res2df-1.3.2}/res2df/vfp/__init__.py +0 -0
  158. {res2df-1.3.1 → res2df-1.3.2}/res2df/vfp/_vfp.py +0 -0
  159. {res2df-1.3.1 → res2df-1.3.2}/res2df/vfp/_vfpcommon.py +0 -0
  160. {res2df-1.3.1 → res2df-1.3.2}/res2df/vfp/_vfpdefs.py +0 -0
  161. {res2df-1.3.1 → res2df-1.3.2}/res2df/wcon.py +0 -0
  162. {res2df-1.3.1 → res2df-1.3.2}/res2df/wellcompletiondata.py +0 -0
  163. {res2df-1.3.1 → res2df-1.3.2}/res2df/wellconnstatus.py +0 -0
  164. {res2df-1.3.1 → res2df-1.3.2}/res2df.egg-info/dependency_links.txt +0 -0
  165. {res2df-1.3.1 → res2df-1.3.2}/res2df.egg-info/not-zip-safe +0 -0
  166. {res2df-1.3.1 → res2df-1.3.2}/res2df.egg-info/requires.txt +0 -0
  167. {res2df-1.3.1 → res2df-1.3.2}/res2df.egg-info/top_level.txt +0 -0
  168. {res2df-1.3.1 → res2df-1.3.2}/test_requirements.txt +0 -0
  169. {res2df-1.3.1 → res2df-1.3.2}/tests/__init__.py +0 -0
  170. {res2df-1.3.1 → res2df-1.3.2}/tests/conftest.py +0 -0
  171. {res2df-1.3.1 → res2df-1.3.2}/tests/data/eightcells/EIGHTCELLS.DATA +0 -0
  172. {res2df-1.3.1 → res2df-1.3.2}/tests/data/eightcells/EIGHTCELLS.EGRID +0 -0
  173. {res2df-1.3.1 → res2df-1.3.2}/tests/data/eightcells/EIGHTCELLS.INIT +0 -0
  174. {res2df-1.3.1 → res2df-1.3.2}/tests/data/eightcells/EIGHTCELLS.INSPEC +0 -0
  175. {res2df-1.3.1 → res2df-1.3.2}/tests/data/eightcells/EIGHTCELLS.PRT +0 -0
  176. {res2df-1.3.1 → res2df-1.3.2}/tests/data/eightcells/EIGHTCELLS.RFT +0 -0
  177. {res2df-1.3.1 → res2df-1.3.2}/tests/data/eightcells/EIGHTCELLS.RSSPEC +0 -0
  178. {res2df-1.3.1 → res2df-1.3.2}/tests/data/eightcells/EIGHTCELLS.SMSPEC +0 -0
  179. {res2df-1.3.1 → res2df-1.3.2}/tests/data/eightcells/EIGHTCELLS.UNRST +0 -0
  180. {res2df-1.3.1 → res2df-1.3.2}/tests/data/eightcells/EIGHTCELLS.UNSMRY +0 -0
  181. {res2df-1.3.1 → res2df-1.3.2}/tests/data/eightcells/eightcells_duplicated_summary_vector/EIGHTCELLS_DUPES.DATA +0 -0
  182. {res2df-1.3.1 → res2df-1.3.2}/tests/data/eightcells/eightcells_duplicated_summary_vector/EIGHTCELLS_DUPES.SMSPEC +0 -0
  183. {res2df-1.3.1 → res2df-1.3.2}/tests/data/eightcells/eightcells_duplicated_summary_vector/EIGHTCELLS_DUPES.UNSMRY +0 -0
  184. {res2df-1.3.1 → res2df-1.3.2}/tests/data/eightcells/zones.lyr +0 -0
  185. {res2df-1.3.1 → res2df-1.3.2}/tests/data/fipreports/TEST1.PRT +0 -0
  186. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/grid/reek.faults +0 -0
  187. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/grid/reek.grid +0 -0
  188. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/grid/reek.multflt +0 -0
  189. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/grid/reek.multz +0 -0
  190. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/grid/reek.perm +0 -0
  191. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/grid/reek.poro +0 -0
  192. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/props/let-sgof.txt +0 -0
  193. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/props/let-swof.txt +0 -0
  194. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/props/reek.endpoints +0 -0
  195. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/props/reek.pvt +0 -0
  196. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/props/reek.swatinit +0 -0
  197. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/props/sgof.txt +0 -0
  198. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/props/swof.inc +0 -0
  199. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/props/swof.txt +0 -0
  200. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/regions/reek.eqlnum +0 -0
  201. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/regions/reek.fipnum +0 -0
  202. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/schedule/op6_aicd1_gp.sch +0 -0
  203. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/schedule/op6_icd1_gp.sch +0 -0
  204. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/schedule/op6_valve1_gp.sch +0 -0
  205. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/schedule/reek_history.sch +0 -0
  206. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/solution/reek.equil +0 -0
  207. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/include/summary/reek.smry +0 -0
  208. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/model/2_R001_REEK-0-OPMFLOW.PRT +0 -0
  209. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/model/2_R001_REEK-0.DATA +0 -0
  210. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/model/2_R001_REEK-0.ECLEND +0 -0
  211. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/model/2_R001_REEK-0.EGRID +0 -0
  212. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/model/2_R001_REEK-0.INIT +0 -0
  213. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/model/2_R001_REEK-0.LOG +0 -0
  214. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/model/2_R001_REEK-0.PRT +0 -0
  215. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/model/2_R001_REEK-0.RFT +0 -0
  216. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/model/2_R001_REEK-0.SMSPEC +0 -0
  217. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/model/2_R001_REEK-0.UNRST +0 -0
  218. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/model/2_R001_REEK-0.UNSMRY +0 -0
  219. {res2df-1.3.1 → res2df-1.3.2}/tests/data/reek/eclipse/model/zones.lyr +0 -0
  220. {res2df-1.3.1 → res2df-1.3.2}/tests/data/timesteps/SHORT_STEP.DATA +0 -0
  221. {res2df-1.3.1 → res2df-1.3.2}/tests/data/timesteps/SHORT_STEP.SMSPEC +0 -0
  222. {res2df-1.3.1 → res2df-1.3.2}/tests/data/timesteps/SHORT_STEP.UNSMRY +0 -0
  223. {res2df-1.3.1 → res2df-1.3.2}/tests/data/timesteps/SHORT_STEP_LONG.DATA +0 -0
  224. {res2df-1.3.1 → res2df-1.3.2}/tests/data/timesteps/SHORT_STEP_LONG.SMSPEC +0 -0
  225. {res2df-1.3.1 → res2df-1.3.2}/tests/data/timesteps/SHORT_STEP_LONG.UNSMRY +0 -0
  226. {res2df-1.3.1 → res2df-1.3.2}/tests/data/timesteps/SHORT_STEP_WITH_TIMESTEP.DATA +0 -0
  227. {res2df-1.3.1 → res2df-1.3.2}/tests/data/timesteps/SHORT_STEP_WITH_TIMESTEP.SMSPEC +0 -0
  228. {res2df-1.3.1 → res2df-1.3.2}/tests/data/timesteps/SHORT_STEP_WITH_TIMESTEP.UNSMRY +0 -0
  229. {res2df-1.3.1 → res2df-1.3.2}/tests/data/timesteps/SHORT_STEP_WITH_TIMESTEP_LONG.DATA +0 -0
  230. {res2df-1.3.1 → res2df-1.3.2}/tests/data/timesteps/SHORT_STEP_WITH_TIMESTEP_LONG.SMSPEC +0 -0
  231. {res2df-1.3.1 → res2df-1.3.2}/tests/data/timesteps/SHORT_STEP_WITH_TIMESTEP_LONG.UNSMRY +0 -0
  232. {res2df-1.3.1 → res2df-1.3.2}/tests/test_common.py +0 -0
  233. {res2df-1.3.1 → res2df-1.3.2}/tests/test_compdat.py +0 -0
  234. {res2df-1.3.1 → res2df-1.3.2}/tests/test_eclfiles.py +0 -0
  235. {res2df-1.3.1 → res2df-1.3.2}/tests/test_equil.py +0 -0
  236. {res2df-1.3.1 → res2df-1.3.2}/tests/test_faults.py +0 -0
  237. {res2df-1.3.1 → res2df-1.3.2}/tests/test_grid.py +0 -0
  238. {res2df-1.3.1 → res2df-1.3.2}/tests/test_gruptree.py +0 -0
  239. {res2df-1.3.1 → res2df-1.3.2}/tests/test_inferdims.py +0 -0
  240. {res2df-1.3.1 → res2df-1.3.2}/tests/test_init.py +0 -0
  241. {res2df-1.3.1 → res2df-1.3.2}/tests/test_integration.py +0 -0
  242. {res2df-1.3.1 → res2df-1.3.2}/tests/test_logging.py +0 -0
  243. {res2df-1.3.1 → res2df-1.3.2}/tests/test_nnc.py +0 -0
  244. {res2df-1.3.1 → res2df-1.3.2}/tests/test_parameters.py +0 -0
  245. {res2df-1.3.1 → res2df-1.3.2}/tests/test_pillars.py +0 -0
  246. {res2df-1.3.1 → res2df-1.3.2}/tests/test_pvt.py +0 -0
  247. {res2df-1.3.1 → res2df-1.3.2}/tests/test_rft.py +0 -0
  248. {res2df-1.3.1 → res2df-1.3.2}/tests/test_satfunc.py +0 -0
  249. {res2df-1.3.1 → res2df-1.3.2}/tests/test_summary_restarts.py +0 -0
  250. {res2df-1.3.1 → res2df-1.3.2}/tests/test_trans.py +0 -0
  251. {res2df-1.3.1 → res2df-1.3.2}/tests/test_userapi.py +0 -0
  252. {res2df-1.3.1 → res2df-1.3.2}/tests/test_vfp.py +0 -0
  253. {res2df-1.3.1 → res2df-1.3.2}/tests/test_wcon.py +0 -0
  254. {res2df-1.3.1 → res2df-1.3.2}/tests/test_wellcompletiondata.py +0 -0
  255. {res2df-1.3.1 → res2df-1.3.2}/tests/test_wellconnstatus.py +0 -0
  256. {res2df-1.3.1 → res2df-1.3.2}/tests/test_welopen.py +0 -0
  257. {res2df-1.3.1 → res2df-1.3.2}/tests/test_wlist.py +0 -0
  258. {res2df-1.3.1 → res2df-1.3.2}/tests/test_zonemap.py +0 -0
  259. {res2df-1.3.1 → res2df-1.3.2}/types_requirements.txt +0 -0
@@ -16,6 +16,12 @@ jobs:
16
16
  PYTHON: '3.11'
17
17
 
18
18
  steps:
19
+
20
+ - name: Install Ubuntu dependencies
21
+ run: |
22
+ sudo apt-get update
23
+ sudo apt-get install libegl1
24
+
19
25
  - uses: actions/checkout@v4
20
26
 
21
27
  - name: Setup Python
@@ -28,6 +28,12 @@ jobs:
28
28
  install-ert: true
29
29
 
30
30
  steps:
31
+
32
+ - name: Install Ubuntu dependencies
33
+ run: |
34
+ sudo apt-get update
35
+ sudo apt-get install libegl1
36
+
31
37
  - name: Checkout commit locally
32
38
  uses: actions/checkout@v4
33
39
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: res2df
3
- Version: 1.3.1
3
+ Version: 1.3.2
4
4
  Summary: Convert reservoir simulator input and output to DataFrames
5
5
  Home-page: http://github.com/equinor/res2df
6
6
  Author: Håvard Berland
@@ -47,6 +47,7 @@ Dynamic: description
47
47
  Dynamic: description-content-type
48
48
  Dynamic: home-page
49
49
  Dynamic: license
50
+ Dynamic: license-file
50
51
  Dynamic: provides-extra
51
52
  Dynamic: requires-dist
52
53
  Dynamic: requires-python
@@ -19,21 +19,6 @@ from .summary import summary_reverse_main
19
19
  from .vfp import fill_reverse_parser as vfp_fill_reverse_parser
20
20
  from .vfp import vfp_reverse_main
21
21
 
22
- # String constants in use for generating ERT forward model documentation:
23
- DESCRIPTION: str = """Convert CSV files into include files. Uses the command
24
- line utility ``csv2res``. Run ``csv2res --help`` to see which subcommands are supported.
25
- No options other than the output file is possible when used directly as a forward model.
26
- When writing synthetic summary files, the ECLBASE with no filename suffix is expected
27
- as the OUTPUT argument."""
28
- CATEGORY: str = "utility.eclipse"
29
- EXAMPLES: str = (
30
- "``FORWARD_MODEL "
31
- "CSV2RES(<SUBCOMMAND>=equil, <CSVFILE>=equil.csv, "
32
- "<OUTPUT>=eclipse/include/equil.inc)``"
33
- "CSV2RES(<SUBCOMMAND>=summary, <CSVFILE>=summary-monthly.csv, "
34
- "<OUTPUT>=eclipse/model/MONTHLYSUMMARY)``"
35
- )
36
-
37
22
 
38
23
  def get_parser() -> argparse.ArgumentParser:
39
24
  """Make parser"""
@@ -66,10 +66,10 @@ def report_block_lineparser(line: str) -> tuple:
66
66
  (liquid_oil, vapour_oil, total_oil) = map(
67
67
  float_or_nan, colonsections[2].split()
68
68
  )
69
+ elif len(colonsections[2].split()) == 2:
70
+ (liquid_oil, total_oil) = map(float_or_nan, colonsections[2].split())
69
71
  elif len(colonsections[2].split()) == 1:
70
72
  total_oil = float_or_nan(colonsections[2])
71
- else:
72
- (liquid_oil, total_oil) = map(float_or_nan, colonsections[2].split())
73
73
 
74
74
  total_water = float_or_nan(colonsections[3])
75
75
 
@@ -726,9 +726,9 @@ def df2res(
726
726
  raise ValueError(f"Keyword {keyword} not found in grid dataframe")
727
727
  vector = np.zeros(global_size)
728
728
  vector[grid_df["GLOBAL_INDEX"].astype(int).values] = grid_df[keyword]
729
- if dtype == int:
729
+ if dtype is int:
730
730
  vector = vector.astype(int)
731
- if dtype == float:
731
+ if dtype is float:
732
732
  vector = vector.astype(float)
733
733
  if len(vector) != global_size:
734
734
  logger.warning(
@@ -340,7 +340,7 @@ def _add_to_tree_from_dict(
340
340
  _add_to_tree_from_dict(nested_dict=value, name=key, tree=tree, parent=name)
341
341
 
342
342
 
343
- def tree_from_dict(nested_dict: dict) -> treelib.Tree:
343
+ def tree_from_dict(nested_dict: dict) -> treelib.Tree | str:
344
344
  """Convert a dictionary to a treelib Tree.
345
345
 
346
346
  The treelib representation of the trees is used
@@ -0,0 +1,138 @@
1
+ import shutil
2
+
3
+ try:
4
+ from ert import ( # type: ignore
5
+ ForwardModelStepDocumentation,
6
+ ForwardModelStepJSON,
7
+ ForwardModelStepPlugin,
8
+ ForwardModelStepValidationError,
9
+ )
10
+ from ert import plugin as ert_plugin # type: ignore
11
+ except ModuleNotFoundError:
12
+ # ert is not installed, use dummy/transparent function decorator:
13
+ def ert_plugin(name: str = ""):
14
+ def decorator(func):
15
+ return func
16
+
17
+ return decorator
18
+
19
+ class ForwardModelStepDocumentation: # type: ignore
20
+ pass
21
+
22
+ class ForwardModelStepJSON: # type: ignore
23
+ pass
24
+
25
+ class ForwardModelStepPlugin: # type: ignore
26
+ pass
27
+
28
+ class ForwardModelStepValidationError: # type: ignore
29
+ pass
30
+
31
+
32
+ class Res2Csv(ForwardModelStepPlugin):
33
+ def __init__(self) -> None:
34
+ super().__init__(
35
+ name="RES2CSV",
36
+ command=[
37
+ shutil.which("res2csv"),
38
+ "<SUBCOMMAND>",
39
+ "--verbose",
40
+ "--output",
41
+ "<OUTPUT>",
42
+ *[f"<XARG{num + 1}>" for num in range(10)],
43
+ "--",
44
+ "<ECLBASE>",
45
+ ],
46
+ default_mapping={f"<XARG{num + 1}>": "" for num in range(10)},
47
+ )
48
+
49
+ def validate_pre_experiment(self, fm_json: ForwardModelStepJSON) -> None:
50
+ if fm_json["argList"][0] == "<SUBCOMMAND>":
51
+ raise ForwardModelStepValidationError(
52
+ "You must supply a value for SUBCOMMAND to RES2CSV"
53
+ )
54
+ if fm_json["argList"][3] == "<OUTPUT>":
55
+ raise ForwardModelStepValidationError(
56
+ "You must supply a value for OUTPUT to RES2CSV"
57
+ )
58
+
59
+ @staticmethod
60
+ def documentation() -> ForwardModelStepDocumentation | None:
61
+ return ForwardModelStepDocumentation(
62
+ description="""Convert reservoir simulator input and output files into CSV
63
+ files, with the command line utility ``res2csv``. Run ``res2csv --help`` to see
64
+ which subcommands are supported.
65
+
66
+ For supplying options to subcommands, you can use the arguments ``<XARGn>``
67
+ where ``n`` goes from 1 to 10.
68
+
69
+ For more documentation, see https://equinor.github.io/res2df/.
70
+ """,
71
+ category="utility.eclipse",
72
+ examples="""Outputting the EQUIL data from a .DATA file. This is implicitly
73
+ supplied in ERT configs::
74
+
75
+ FORWARD_MODEL RES2CSV(<SUBCOMMAND>=equil, <OUTPUT>=equil.csv)
76
+
77
+ For a yearly summary export of the realization, options have to be supplied
78
+ with the XARG options::
79
+
80
+ FORWARD_MODEL RES2CSV(<SUBCOMMAND>=summary, \
81
+ <OUTPUT>=yearly.csv, <XARG1>="--time_index", <XARG2>="yearly")
82
+
83
+ The quotes around double-dashed options are critical to avoid ERT taking for a
84
+ comment. For more options, use ``<XARG3>`` etc.
85
+ """,
86
+ )
87
+
88
+
89
+ class Csv2Res(ForwardModelStepPlugin):
90
+ def __init__(self) -> None:
91
+ super().__init__(
92
+ name="CSV2RES",
93
+ command=[
94
+ shutil.which("csv2res"),
95
+ "<SUBCOMMAND>",
96
+ "--verbose",
97
+ "--output",
98
+ "<OUTPUT>",
99
+ "<CSVFILE>",
100
+ ],
101
+ )
102
+
103
+ def validate_pre_experiment(self, fm_json: ForwardModelStepJSON) -> None:
104
+ if fm_json["argList"][0] == "<SUBCOMMAND>":
105
+ raise ForwardModelStepValidationError(
106
+ "You must supply a value for SUBCOMMAND to CSV2RES"
107
+ )
108
+ if fm_json["argList"][3] == "<OUTPUT>":
109
+ raise ForwardModelStepValidationError(
110
+ "You must supply a value for OUTPUT to CSV2RES"
111
+ )
112
+ if fm_json["argList"][4] == "<CSVFILE>":
113
+ raise ForwardModelStepValidationError(
114
+ "You must supply a value for CSVFILE to CSV2RES"
115
+ )
116
+
117
+ @staticmethod
118
+ def documentation() -> ForwardModelStepDocumentation | None:
119
+ return ForwardModelStepDocumentation(
120
+ description="""Convert CSV files into include files. Uses the command
121
+ line utility ``csv2res``. Run ``csv2res --help`` to see which subcommands are supported.
122
+ No options other than the output file is possible when used directly as a forward model.
123
+ When writing synthetic summary files, the ECLBASE with no filename suffix is expected
124
+ as the OUTPUT argument.""",
125
+ category="utility.eclipse",
126
+ examples=(
127
+ "``FORWARD_MODEL "
128
+ "CSV2RES(<SUBCOMMAND>=equil, <CSVFILE>=equil.csv, "
129
+ "<OUTPUT>=eclipse/include/equil.inc)``"
130
+ "CSV2RES(<SUBCOMMAND>=summary, <CSVFILE>=summary-monthly.csv, "
131
+ "<OUTPUT>=eclipse/model/MONTHLYSUMMARY)``"
132
+ ),
133
+ )
134
+
135
+
136
+ @ert_plugin(name="RES2CSV")
137
+ def installable_forward_model_steps() -> list[type[ForwardModelStepPlugin]]:
138
+ return [Res2Csv, Csv2Res]
@@ -12,33 +12,6 @@ from typing import Optional
12
12
 
13
13
  from .__version__ import __version__
14
14
 
15
- # String constants in use for generating ERT forward model documentation:
16
- DESCRIPTION: str = """Convert reservoir simulator input and output files into CSV files,
17
- with the command line utility ``res2csv``. Run ``res2csv --help`` to see
18
- which subcommands are supported.
19
-
20
- For supplying options to subcommands, you can use the arguments ``<XARGn>``
21
- where ``n`` goes from 1 to 10.
22
-
23
- For more documentation, see https://equinor.github.io/res2df/.
24
- """
25
- CATEGORY: str = "utility.eclipse"
26
- EXAMPLES: str = """
27
-
28
- Outputting the EQUIL data from a .DATA file. This is implicitly
29
- supplied in ERT configs::
30
-
31
- FORWARD_MODEL RES2CSV(<SUBCOMMAND>=equil, <OUTPUT>=equil.csv)
32
-
33
- For a yearly summary export of the realization, options have to be supplied
34
- with the XARG options::
35
-
36
- FORWARD_MODEL RES2CSV(<SUBCOMMAND>=summary, <OUTPUT>=yearly.csv, <XARG1>="--time_index", <XARG2>="yearly")
37
-
38
- The quotes around double-dashed options are critical to avoid ERT taking for a
39
- comment. For more options, use ``<XARG3>`` etc.
40
- """ # noqa
41
-
42
15
 
43
16
  def get_parser() -> argparse.ArgumentParser:
44
17
  """Make parser"""
@@ -814,6 +814,11 @@ def summary_main(args) -> None:
814
814
  paramfile=args.paramfile,
815
815
  datetime=False,
816
816
  )
817
+
818
+ if sum_df.empty:
819
+ logger.error("No data to write. The input file may be missing or invalid.")
820
+ return
821
+
817
822
  if args.arrow:
818
823
  sum_df = _df2pyarrow(sum_df)
819
824
 
@@ -1,8 +1,13 @@
1
- # file generated by setuptools_scm
1
+ # file generated by setuptools-scm
2
2
  # don't change, don't track in version control
3
+
4
+ __all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
5
+
3
6
  TYPE_CHECKING = False
4
7
  if TYPE_CHECKING:
5
- from typing import Tuple, Union
8
+ from typing import Tuple
9
+ from typing import Union
10
+
6
11
  VERSION_TUPLE = Tuple[Union[int, str], ...]
7
12
  else:
8
13
  VERSION_TUPLE = object
@@ -12,5 +17,5 @@ __version__: str
12
17
  __version_tuple__: VERSION_TUPLE
13
18
  version_tuple: VERSION_TUPLE
14
19
 
15
- __version__ = version = '1.3.1'
16
- __version_tuple__ = version_tuple = (1, 3, 1)
20
+ __version__ = version = '1.3.2'
21
+ __version_tuple__ = version_tuple = (1, 3, 2)
@@ -116,7 +116,8 @@ def basic_data(
116
116
  if no_interp_values != no_tab_records:
117
117
  raise ValueError(
118
118
  "Dimensions of interpolation ranges does "
119
- "not match number of tabulated records"
119
+ "not match number of tabulated records "
120
+ f"in vfp table {tableno}"
120
121
  )
121
122
 
122
123
  # Extract interpolation values and tabulated values (BHP values)
@@ -136,7 +137,8 @@ def basic_data(
136
137
  if len(bhp_values) != no_flow_values:
137
138
  raise ValueError(
138
139
  "Dimension of record of tabulated values "
139
- "does not match number of flow values"
140
+ "does not match number of flow values "
141
+ f"in vfp table {tableno}"
140
142
  )
141
143
  bhp_table.append(bhp_values)
142
144
 
@@ -141,7 +141,8 @@ def basic_data(
141
141
  if no_interp_values != no_tab_records:
142
142
  raise ValueError(
143
143
  "Dimensions of interpolation ranges "
144
- "does not match number of tabulated records"
144
+ "does not match number of tabulated records "
145
+ f"in vfp table {tableno}"
145
146
  )
146
147
 
147
148
  # Extract interpolation values and tabulated values (BHP values)
@@ -171,7 +172,8 @@ def basic_data(
171
172
  if len(bhp_values) != no_flow_values:
172
173
  raise ValueError(
173
174
  "Dimension of record of tabulated "
174
- "values does not match number of flow values"
175
+ "values does not match number of flow values "
176
+ f"in vfp table {tableno}"
175
177
  )
176
178
  bhp_table.append(bhp_values)
177
179
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: res2df
3
- Version: 1.3.1
3
+ Version: 1.3.2
4
4
  Summary: Convert reservoir simulator input and output to DataFrames
5
5
  Home-page: http://github.com/equinor/res2df
6
6
  Author: Håvard Berland
@@ -47,6 +47,7 @@ Dynamic: description
47
47
  Dynamic: description-content-type
48
48
  Dynamic: home-page
49
49
  Dynamic: license
50
+ Dynamic: license-file
50
51
  Dynamic: provides-extra
51
52
  Dynamic: requires-dist
52
53
  Dynamic: requires-python
@@ -105,10 +105,8 @@ res2df.egg-info/entry_points.txt
105
105
  res2df.egg-info/not-zip-safe
106
106
  res2df.egg-info/requires.txt
107
107
  res2df.egg-info/top_level.txt
108
- res2df/config_jobs/CSV2RES
109
- res2df/config_jobs/RES2CSV
110
108
  res2df/hook_implementations/__init__.py
111
- res2df/hook_implementations/jobs.py
109
+ res2df/hook_implementations/forward_model_steps.py
112
110
  res2df/opmkeywords/BRANPROP
113
111
  res2df/opmkeywords/COMPDAT
114
112
  res2df/opmkeywords/COMPLUMP
@@ -4,4 +4,4 @@ res2arrow = res2df.res2csv:main
4
4
  res2csv = res2df.res2csv:main
5
5
 
6
6
  [ert]
7
- res2df_jobs = res2df.hook_implementations.jobs
7
+ res2df_steps = res2df.hook_implementations.forward_model_steps
@@ -4,6 +4,7 @@ line-length = 88
4
4
 
5
5
  [lint]
6
6
  select = [
7
+ "E", # pycodestyle
7
8
  "W", # pycodestyle
8
9
  "I", # isort
9
10
  "B", # flake-8-bugbear
@@ -9,10 +9,6 @@ markers =
9
9
  integration: marks a test as an integration test
10
10
  requires_eclipse: A test that requires the Eclipse simulator
11
11
 
12
- [build_sphinx]
13
- all-files = 1
14
- warning-is-error = 1
15
-
16
12
  [rstcheck]
17
13
  ignore_directives = argparse,automodule
18
14
  ignore_messages = Hyperlink target .* is not referenced
@@ -67,7 +67,6 @@ setup(
67
67
  package_data={
68
68
  "res2df": [
69
69
  "opmkeywords/*",
70
- "config_jobs/*",
71
70
  "py.typed",
72
71
  "svg_color_keyword_names.txt",
73
72
  ]
@@ -79,7 +78,7 @@ setup(
79
78
  "res2csv=res2df.res2csv:main",
80
79
  "res2arrow=res2df.res2csv:main",
81
80
  ],
82
- "ert": ["res2df_jobs = res2df.hook_implementations.jobs"],
81
+ "ert": ["res2df_steps = res2df.hook_implementations.forward_model_steps"],
83
82
  },
84
83
  test_suite="tests",
85
84
  install_requires=REQUIREMENTS,
@@ -5,7 +5,6 @@ from pathlib import Path
5
5
  import pandas as pd
6
6
  import pytest
7
7
  import res2df
8
- from res2df.hook_implementations import jobs
9
8
 
10
9
  try:
11
10
  # pylint: disable=unused-import
@@ -108,42 +107,9 @@ def test_res2csv_through_ert(tmp_path):
108
107
  assert Path(subcommand + ".inc").is_file()
109
108
 
110
109
 
111
- @pytest.mark.skipif(not HAVE_ERT, reason="ERT is not installed")
112
- def test_job_documentation():
113
- """Test that for registered ERT forward models the documentation is non-empty"""
114
- if HAVE_ERT:
115
- assert (
116
- type(jobs.job_documentation("RES2CSV"))
117
- == ert.plugins.plugin_response.PluginResponse
118
- )
119
- assert (
120
- type(jobs.job_documentation("CSV2RES"))
121
- == ert.plugins.plugin_response.PluginResponse
122
- )
123
-
124
- else:
125
- assert jobs.job_documentation("RES2CSV") is None
126
- assert jobs.job_documentation("CSV2RES") is None
127
-
128
- assert jobs.job_documentation("foobar") is None
129
-
130
-
131
- def test_get_module_variable():
132
- """Test that we can robustly peek into jobs for metadata.
133
-
134
- This is independent whether ERT is installed or not
135
- """
136
- # pylint: disable=protected-access
137
- assert not jobs._get_module_variable_if_exists("foo", "bar")
138
- assert jobs._get_module_variable_if_exists(
139
- "res2df.res2csv", "DESCRIPTION"
140
- ).startswith("Convert reservoir simulator input and output")
141
- assert not jobs._get_module_variable_if_exists("res2df.res2csv", "NOPE")
142
-
143
-
144
110
  @pytest.mark.skipif(HAVE_ERT, reason="Tested only when ERT is not available")
145
111
  def test_no_erthooks():
146
112
  """Test that we can import the hook implementations even when ERT is unavailable."""
147
113
  # pylint: disable=redefined-outer-name, unused-import
148
114
  # pylint: disable=reimported, import-outside-toplevel
149
- from res2df.hook_implementations import jobs # noqa
115
+ from res2df.hook_implementations import forward_model_steps # noqa
@@ -226,6 +226,100 @@ def test_prtstring(tmp_path):
226
226
  pd.testing.assert_frame_equal(dframe, expected_dframe)
227
227
 
228
228
 
229
+ def test_gaswater_report(tmp_path):
230
+ """Two-phase gas water run"""
231
+ prtstring = """
232
+ =================================
233
+ : FIPNUM REPORT REGION 2 :
234
+ : PAV = 4045.00 BARSA:
235
+ : PORV= 27000000. RM3 :
236
+ :--------------- OIL SM3 ---------------:-- WAT SM3 -:--------------- GAS SM3 ---------------:
237
+ : LIQUID VAPOUR TOTAL : TOTAL : FREE DISSOLVED TOTAL :
238
+ :-------------------------:-------------------------------------------:----------------:-------------------------------------------:
239
+ :CURRENTLY IN PLACE : : 19135648. : 8457278. 8457278.:
240
+ :-------------------------:-------------------------------------------:----------------:-------------------------------------------:
241
+ :OUTFLOW TO OTHER REGIONS : : 0. : 0. 0.:
242
+ :OUTFLOW THROUGH WELLS : : 0. : 0.:
243
+ :MATERIAL BALANCE ERROR. : : 0. : 0.:
244
+ :-------------------------:-------------------------------------------:----------------:-------------------------------------------:
245
+ :ORIGINALLY IN PLACE : : 19135648. : 8457278. 8457278.:
246
+ :-------------------------:-------------------------------------------:----------------:-------------------------------------------:
247
+ ====================================================================================================================================
248
+ """ # noqa
249
+ os.chdir(tmp_path)
250
+ Path("FOO.PRT").write_text(prtstring, encoding="utf8")
251
+ dframe = fipreports.df("FOO.PRT").set_index("DATATYPE")
252
+ print(dframe.to_string())
253
+ assert dframe["REGION"].unique() == [2]
254
+ pd.testing.assert_frame_equal(
255
+ dframe.reset_index().drop(["DATE", "REGION"], axis="columns"),
256
+ pd.DataFrame(
257
+ [
258
+ {
259
+ "DATATYPE": "CURRENTLY IN PLACE",
260
+ "FIPNAME": "FIPNUM",
261
+ "TO_REGION": None,
262
+ "STOIIP_OIL": None,
263
+ "ASSOCIATEDOIL_GAS": None,
264
+ "STOIIP_TOTAL": None,
265
+ "WIIP_TOTAL": 19135648.0,
266
+ "GIIP_GAS": 8457278.0,
267
+ "ASSOCIATEDGAS_OIL": None,
268
+ "GIIP_TOTAL": 8457278.0,
269
+ },
270
+ {
271
+ "DATATYPE": "OUTFLOW TO OTHER REGIONS",
272
+ "FIPNAME": "FIPNUM",
273
+ "TO_REGION": None,
274
+ "STOIIP_OIL": None,
275
+ "ASSOCIATEDOIL_GAS": None,
276
+ "STOIIP_TOTAL": None,
277
+ "WIIP_TOTAL": 0.0,
278
+ "GIIP_GAS": 0.0,
279
+ "ASSOCIATEDGAS_OIL": None,
280
+ "GIIP_TOTAL": 0.0,
281
+ },
282
+ {
283
+ "DATATYPE": "OUTFLOW THROUGH WELLS",
284
+ "FIPNAME": "FIPNUM",
285
+ "TO_REGION": None,
286
+ "STOIIP_OIL": None,
287
+ "ASSOCIATEDOIL_GAS": None,
288
+ "STOIIP_TOTAL": None,
289
+ "WIIP_TOTAL": 0.0,
290
+ "GIIP_GAS": np.nan,
291
+ "ASSOCIATEDGAS_OIL": None,
292
+ "GIIP_TOTAL": 0.0,
293
+ },
294
+ {
295
+ "DATATYPE": "MATERIAL BALANCE ERROR.",
296
+ "FIPNAME": "FIPNUM",
297
+ "TO_REGION": None,
298
+ "STOIIP_OIL": None,
299
+ "ASSOCIATEDOIL_GAS": None,
300
+ "STOIIP_TOTAL": None,
301
+ "WIIP_TOTAL": 0.0,
302
+ "GIIP_GAS": np.nan,
303
+ "ASSOCIATEDGAS_OIL": None,
304
+ "GIIP_TOTAL": 0.0,
305
+ },
306
+ {
307
+ "DATATYPE": "ORIGINALLY IN PLACE",
308
+ "FIPNAME": "FIPNUM",
309
+ "TO_REGION": None,
310
+ "STOIIP_OIL": None,
311
+ "ASSOCIATEDOIL_GAS": None,
312
+ "STOIIP_TOTAL": None,
313
+ "WIIP_TOTAL": 19135648.0,
314
+ "GIIP_GAS": 8457278.0,
315
+ "ASSOCIATEDGAS_OIL": None,
316
+ "GIIP_TOTAL": 8457278.0,
317
+ },
318
+ ]
319
+ ),
320
+ )
321
+
322
+
229
323
  def test_drygas_report(tmp_path):
230
324
  """Excerpt from a two-phase gas water run"""
231
325
  prtstring = """
@@ -0,0 +1,33 @@
1
+ import pytest
2
+
3
+ try:
4
+ # pylint: disable=unused-import
5
+
6
+ import ert # noqa
7
+ except ImportError:
8
+ pytest.skip(
9
+ "ERT is not installed. Skipping hook implementations.",
10
+ allow_module_level=True,
11
+ )
12
+
13
+ import res2df.hook_implementations.forward_model_steps
14
+ from ert.plugins.plugin_manager import ErtPluginManager
15
+
16
+
17
+ def test_hooks_are_installed_in_erts_plugin_manager():
18
+ plugin_m = ErtPluginManager(
19
+ plugins=[res2df.hook_implementations.forward_model_steps]
20
+ )
21
+ available_fm_steps = [step().name for step in plugin_m.forward_model_steps]
22
+ assert "CSV2RES" in available_fm_steps
23
+ assert "RES2CSV" in available_fm_steps
24
+
25
+
26
+ def test_hook_implementations_have_docs_installed():
27
+ plugin_m = ErtPluginManager(
28
+ plugins=[res2df.hook_implementations.forward_model_steps]
29
+ )
30
+ for step_doc in [step().documentation() for step in plugin_m.forward_model_steps]:
31
+ assert step_doc.description
32
+ assert step_doc.category
33
+ assert step_doc.examples