subscript 1.5.0__tar.gz → 1.6.0__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 (324) hide show
  1. {subscript-1.5.0 → subscript-1.6.0}/.github/workflows/codecov.yml +4 -2
  2. {subscript-1.5.0 → subscript-1.6.0}/.github/workflows/subscript.yml +1 -0
  3. {subscript-1.5.0 → subscript-1.6.0}/PKG-INFO +1 -1
  4. subscript-1.6.0/docs/scripts/grav_subs_maps.rst +10 -0
  5. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/summaryplot.rst +1 -1
  6. {subscript-1.5.0 → subscript-1.6.0}/pyproject.toml +1 -0
  7. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/check_swatinit/check_swatinit.py +1 -1
  8. subscript-1.6.0/src/subscript/config_jobs/GRAV_SUBS_MAPS +9 -0
  9. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/eclcompress/eclcompress.py +2 -2
  10. subscript-1.6.0/src/subscript/grav_subs_maps/grav_subs_maps.py +324 -0
  11. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/interp_relperm/interp_relperm.py +25 -9
  12. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/restartthinner/restartthinner.py +3 -3
  13. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/version.py +2 -2
  14. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/welltest_dpds/welltest_dpds.py +1 -14
  15. {subscript-1.5.0 → subscript-1.6.0}/src/subscript.egg-info/PKG-INFO +1 -1
  16. {subscript-1.5.0 → subscript-1.6.0}/src/subscript.egg-info/SOURCES.txt +12 -0
  17. {subscript-1.5.0 → subscript-1.6.0}/src/subscript.egg-info/entry_points.txt +1 -0
  18. subscript-1.6.0/tests/__init__.py +0 -0
  19. {subscript-1.5.0 → subscript-1.6.0}/tests/test_check_swatinit.py +1 -1
  20. {subscript-1.5.0 → subscript-1.6.0}/tests/test_check_swatinit_simulators.py +1 -1
  21. {subscript-1.5.0 → subscript-1.6.0}/tests/test_eclcompress.py +23 -0
  22. subscript-1.6.0/tests/test_grav_subs_maps.py +184 -0
  23. {subscript-1.5.0 → subscript-1.6.0}/tests/test_hook_implementations.py +1 -0
  24. {subscript-1.5.0 → subscript-1.6.0}/tests/test_interp_relperm.py +116 -0
  25. {subscript-1.5.0 → subscript-1.6.0}/tests/test_sunsch.py +2 -19
  26. subscript-1.6.0/tests/testdata_gravity/HIST.EGRID +0 -0
  27. subscript-1.6.0/tests/testdata_gravity/HIST.INIT +0 -0
  28. subscript-1.6.0/tests/testdata_gravity/HIST.UNRST +0 -0
  29. subscript-1.6.0/tests/testdata_gravity/grav_subs_maps_hist.yml +12 -0
  30. subscript-1.6.0/tests/testdata_gravity/grav_subs_points.yml +16 -0
  31. subscript-1.6.0/tests/testdata_gravity/seabed.gri +0 -0
  32. subscript-1.6.0/tests/testdata_gravity/station_coordinates.txt +12 -0
  33. {subscript-1.5.0 → subscript-1.6.0}/.github/workflows/publish.yml +0 -0
  34. {subscript-1.5.0 → subscript-1.6.0}/.gitignore +0 -0
  35. {subscript-1.5.0 → subscript-1.6.0}/.pylintrc +0 -0
  36. {subscript-1.5.0 → subscript-1.6.0}/LICENSE +0 -0
  37. {subscript-1.5.0 → subscript-1.6.0}/README.md +0 -0
  38. {subscript-1.5.0 → subscript-1.6.0}/SECURITY.md +0 -0
  39. {subscript-1.5.0 → subscript-1.6.0}/ci/testkomodo.sh +0 -0
  40. {subscript-1.5.0 → subscript-1.6.0}/docs/Makefile +0 -0
  41. {subscript-1.5.0 → subscript-1.6.0}/docs/_static/equinor-logo.png +0 -0
  42. {subscript-1.5.0 → subscript-1.6.0}/docs/_static/equinor-logo2.jpg +0 -0
  43. {subscript-1.5.0 → subscript-1.6.0}/docs/_static/equinor-logo2.png +0 -0
  44. {subscript-1.5.0 → subscript-1.6.0}/docs/_static/equinor_logo.jpg +0 -0
  45. {subscript-1.5.0 → subscript-1.6.0}/docs/_static/equinor_logo_only.jpg +0 -0
  46. {subscript-1.5.0 → subscript-1.6.0}/docs/_templates/layout.html +0 -0
  47. {subscript-1.5.0 → subscript-1.6.0}/docs/conf.py +0 -0
  48. {subscript-1.5.0 → subscript-1.6.0}/docs/contributing.rst +0 -0
  49. {subscript-1.5.0 → subscript-1.6.0}/docs/history.rst +0 -0
  50. {subscript-1.5.0 → subscript-1.6.0}/docs/index.rst +0 -0
  51. {subscript-1.5.0 → subscript-1.6.0}/docs/make.bat +0 -0
  52. {subscript-1.5.0 → subscript-1.6.0}/docs/overview.rst +0 -0
  53. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/bjobsusers.rst +0 -0
  54. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/casegen_upcars.rst +0 -0
  55. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/check_swatinit.rst +0 -0
  56. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/convert_grid_format.rst +0 -0
  57. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/csv2ofmvol.rst +0 -0
  58. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/csv_merge.rst +0 -0
  59. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/csv_stack.rst +0 -0
  60. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/eclcompress.rst +0 -0
  61. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/ecldiff2roff.rst +0 -0
  62. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/fmu_copy_revision.rst +0 -0
  63. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/fmuobs.rst +0 -0
  64. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/Pack_sim_overview.png +0 -0
  65. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/Summaryplot-ensemble.png +0 -0
  66. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/Summaryplot-ert.png +0 -0
  67. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/Summaryplot-normalizeexample.png +0 -0
  68. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/Workflow_sector2fluxnum.png +0 -0
  69. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/casegen_upcars_geometry.png +0 -0
  70. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/check_swatinit_scatter.png +0 -0
  71. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/check_swatinit_volplot.png +0 -0
  72. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/ecl-swat-initialization.png +0 -0
  73. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/make_check_swatinit_images.sh +0 -0
  74. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/resinsight_wells_project_example.png +0 -0
  75. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/interp_relperm.rst +0 -0
  76. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/merge_rft_ertobs.rst +0 -0
  77. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/merge_unrst_files.rst +0 -0
  78. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/ofmvol2csv.rst +0 -0
  79. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/pack_sim.rst +0 -0
  80. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/params2csv.rst +0 -0
  81. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/presentvalue.rst +0 -0
  82. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/prtvol2csv.csv +0 -0
  83. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/prtvol2csv.rst +0 -0
  84. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/restartthinner.rst +0 -0
  85. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/ri_wellmod.rst +0 -0
  86. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/rmsecl_volumetrics.rst +0 -0
  87. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/runeclipse.rst +0 -0
  88. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/sector2fluxnum.rst +0 -0
  89. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/sunsch.rst +0 -0
  90. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/sw_model_utilities.rst +0 -0
  91. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/vfp2csv.rst +0 -0
  92. {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/welltest_dpds.rst +0 -0
  93. {subscript-1.5.0 → subscript-1.6.0}/docs/usage.rst +0 -0
  94. {subscript-1.5.0 → subscript-1.6.0}/setup.cfg +0 -0
  95. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/__init__.py +0 -0
  96. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/bjobsusers/__init__.py +0 -0
  97. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/bjobsusers/bjobsusers.py +0 -0
  98. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/casegen_upcars/__init__.py +0 -0
  99. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/casegen_upcars/casegen_upcars.py +0 -0
  100. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/casegen_upcars/model.py +0 -0
  101. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/casegen_upcars/udf.py +0 -0
  102. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/casegen_upcars/udf_arg_parser.py +0 -0
  103. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/check_swatinit/__init__.py +0 -0
  104. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/check_swatinit/constants.py +0 -0
  105. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/check_swatinit/pillarmodel.py +0 -0
  106. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/check_swatinit/plotter.py +0 -0
  107. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/CASEGEN_UPCARS +0 -0
  108. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/CHECK_SWATINIT +0 -0
  109. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/CSV2OFMVOL +0 -0
  110. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/CSV_STACK +0 -0
  111. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/ECLCOMPRESS +0 -0
  112. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/ECLDIFF2ROFF +0 -0
  113. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/ECLGRID2ROFF +0 -0
  114. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/ECLINIT2ROFF +0 -0
  115. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/ECLRST2ROFF +0 -0
  116. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/INTERP_RELPERM +0 -0
  117. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/MERGE_RFT_ERTOBS +0 -0
  118. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/MERGE_UNRST_FILES +0 -0
  119. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/OFMVOL2CSV +0 -0
  120. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/PARAMS2CSV +0 -0
  121. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/PRTVOL2CSV +0 -0
  122. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/RI_WELLMOD +0 -0
  123. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/SUNSCH +0 -0
  124. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/WELLTEST_DPDS +0 -0
  125. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/convert_grid_format/__init__.py +0 -0
  126. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/convert_grid_format/convert_grid_format.py +0 -0
  127. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/csv2ofmvol/__init__.py +0 -0
  128. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/csv2ofmvol/csv2ofmvol.py +0 -0
  129. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/csv_merge/__init__.py +0 -0
  130. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/csv_merge/csv_merge.py +0 -0
  131. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/csv_stack/__init__.py +0 -0
  132. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/csv_stack/csv_stack.py +0 -0
  133. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/eclcompress/__init__.py +0 -0
  134. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/eclcompress/allowlist.py +0 -0
  135. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/ecldiff2roff/__init__.py +0 -0
  136. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/ecldiff2roff/ecldiff2roff.py +0 -0
  137. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/eclgrid2roff/eclgrid2roff.py +0 -0
  138. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/eclinit2roff/eclinit2roff.py +0 -0
  139. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/eclrst2roff/eclrst2roff.py +0 -0
  140. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/fmu_copy_revision/__init__.py +0 -0
  141. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/fmu_copy_revision/fmu_copy_revision.py +0 -0
  142. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/fmuobs/__init__.py +0 -0
  143. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/fmuobs/fmuobs.py +0 -0
  144. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/fmuobs/parsers.py +0 -0
  145. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/fmuobs/util.py +0 -0
  146. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/fmuobs/writers.py +0 -0
  147. {subscript-1.5.0/src/subscript/hook_implementations → subscript-1.6.0/src/subscript/grav_subs_maps}/__init__.py +0 -0
  148. {subscript-1.5.0/src/subscript/interp_relperm → subscript-1.6.0/src/subscript/hook_implementations}/__init__.py +0 -0
  149. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/hook_implementations/jobs.py +0 -0
  150. {subscript-1.5.0/src/subscript/merge_rft_ertobs → subscript-1.6.0/src/subscript/interp_relperm}/__init__.py +0 -0
  151. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/legacy/duf +0 -0
  152. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/legacy/eclmanual +0 -0
  153. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/legacy/ertwatch +0 -0
  154. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/legacy/list_rms_usage +0 -0
  155. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/legacy/nosim +0 -0
  156. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/legacy/runeclipse +0 -0
  157. {subscript-1.5.0/src/subscript/merge_unrst_files → subscript-1.6.0/src/subscript/merge_rft_ertobs}/__init__.py +0 -0
  158. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/merge_rft_ertobs/merge_rft_ertobs.py +0 -0
  159. {subscript-1.5.0/src/subscript/ofmvol2csv → subscript-1.6.0/src/subscript/merge_unrst_files}/__init__.py +0 -0
  160. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/merge_unrst_files/merge_unrst_files.py +0 -0
  161. {subscript-1.5.0/src/subscript/pack_sim → subscript-1.6.0/src/subscript/ofmvol2csv}/__init__.py +0 -0
  162. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/ofmvol2csv/ofmvol2csv.py +0 -0
  163. {subscript-1.5.0/src/subscript/params2csv → subscript-1.6.0/src/subscript/pack_sim}/__init__.py +0 -0
  164. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/pack_sim/pack_sim.py +0 -0
  165. {subscript-1.5.0/src/subscript/presentvalue → subscript-1.6.0/src/subscript/params2csv}/__init__.py +0 -0
  166. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/params2csv/params2csv.py +0 -0
  167. {subscript-1.5.0/src/subscript/prtvol2csv → subscript-1.6.0/src/subscript/presentvalue}/__init__.py +0 -0
  168. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/presentvalue/presentvalue.py +0 -0
  169. {subscript-1.5.0/src/subscript/restartthinner → subscript-1.6.0/src/subscript/prtvol2csv}/__init__.py +0 -0
  170. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/prtvol2csv/prtvol2csv.py +0 -0
  171. {subscript-1.5.0/src/subscript/ri_wellmod → subscript-1.6.0/src/subscript/restartthinner}/__init__.py +0 -0
  172. {subscript-1.5.0/src/subscript/rmsecl_volumetrics → subscript-1.6.0/src/subscript/ri_wellmod}/__init__.py +0 -0
  173. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/ri_wellmod/ri_wellmod.py +0 -0
  174. {subscript-1.5.0/src/subscript/sector2fluxnum → subscript-1.6.0/src/subscript/rmsecl_volumetrics}/__init__.py +0 -0
  175. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/rmsecl_volumetrics/rmsecl_volumetrics.py +0 -0
  176. {subscript-1.5.0/src/subscript/summaryplot → subscript-1.6.0/src/subscript/sector2fluxnum}/__init__.py +0 -0
  177. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/sector2fluxnum/completions.py +0 -0
  178. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/sector2fluxnum/datafile_obj.py +0 -0
  179. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/sector2fluxnum/flux_obj.py +0 -0
  180. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/sector2fluxnum/flux_util.py +0 -0
  181. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/sector2fluxnum/fluxfile_obj.py +0 -0
  182. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/sector2fluxnum/sector2fluxnum.py +0 -0
  183. {subscript-1.5.0/src/subscript/sunsch → subscript-1.6.0/src/subscript/summaryplot}/__init__.py +0 -0
  184. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/summaryplot/summaryplot.py +0 -0
  185. {subscript-1.5.0/src/subscript/sw_model_utilities → subscript-1.6.0/src/subscript/sunsch}/__init__.py +0 -0
  186. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/sunsch/sunsch.py +0 -0
  187. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/sunsch/time_vector.py +0 -0
  188. {subscript-1.5.0/src/subscript/vfp2csv → subscript-1.6.0/src/subscript/sw_model_utilities}/__init__.py +0 -0
  189. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/sw_model_utilities/sw_model_utilities.py +0 -0
  190. {subscript-1.5.0/src/subscript/welltest_dpds → subscript-1.6.0/src/subscript/vfp2csv}/__init__.py +0 -0
  191. {subscript-1.5.0 → subscript-1.6.0}/src/subscript/vfp2csv/vfp2csv.py +0 -0
  192. {subscript-1.5.0/tests → subscript-1.6.0/src/subscript/welltest_dpds}/__init__.py +0 -0
  193. {subscript-1.5.0 → subscript-1.6.0}/src/subscript.egg-info/dependency_links.txt +0 -0
  194. {subscript-1.5.0 → subscript-1.6.0}/src/subscript.egg-info/requires.txt +0 -0
  195. {subscript-1.5.0 → subscript-1.6.0}/src/subscript.egg-info/top_level.txt +0 -0
  196. {subscript-1.5.0 → subscript-1.6.0}/tests/conftest.py +0 -0
  197. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/grid/reek.faults +0 -0
  198. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/grid/reek.grid +0 -0
  199. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/grid/reek.multflt +0 -0
  200. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/grid/reek.multz +0 -0
  201. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/grid/reek.perm +0 -0
  202. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/grid/reek.poro +0 -0
  203. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/let-sgof.txt +0 -0
  204. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/let-swof.txt +0 -0
  205. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/reek.endpoints +0 -0
  206. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/reek.pvt +0 -0
  207. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/reek.swatinit +0 -0
  208. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/sgof.txt +0 -0
  209. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/swof.inc +0 -0
  210. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/swof.txt +0 -0
  211. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/regions/reek.eqlnum +0 -0
  212. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/regions/reek.fipnum +0 -0
  213. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/schedule/reek_history.sch +0 -0
  214. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/solution/reek.equil +0 -0
  215. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/summary/reek.smry +0 -0
  216. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.DATA +0 -0
  217. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.ECLEND +0 -0
  218. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.EGRID +0 -0
  219. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.INIT +0 -0
  220. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.LOG +0 -0
  221. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.PRT +0 -0
  222. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.RFT +0 -0
  223. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.SMSPEC +0 -0
  224. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.UNRST +0 -0
  225. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.UNSMRY +0 -0
  226. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/parameters.txt +0 -0
  227. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/parameters.txt +0 -0
  228. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/rms/README +0 -0
  229. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/rms/reek.rms10.1.3/.master +0 -0
  230. {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/rms/reek.rms11.1.0/.master +0 -0
  231. {subscript-1.5.0 → subscript-1.6.0}/tests/data/vfp/GasProd.VFP +0 -0
  232. {subscript-1.5.0 → subscript-1.6.0}/tests/data/vfp/pd2.VFP +0 -0
  233. {subscript-1.5.0 → subscript-1.6.0}/tests/data/welltest/eclipse/model/DROGON_DST_PLT-0.SMSPEC +0 -0
  234. {subscript-1.5.0 → subscript-1.6.0}/tests/data/welltest/eclipse/model/DROGON_DST_PLT-0.UNSMRY +0 -0
  235. {subscript-1.5.0 → subscript-1.6.0}/tests/test_bjobsusers.py +0 -0
  236. {subscript-1.5.0 → subscript-1.6.0}/tests/test_casegen_upcars.py +0 -0
  237. {subscript-1.5.0 → subscript-1.6.0}/tests/test_convert_grid_format.py +0 -0
  238. {subscript-1.5.0 → subscript-1.6.0}/tests/test_csv2ofmvol.py +0 -0
  239. {subscript-1.5.0 → subscript-1.6.0}/tests/test_csv_merge.py +0 -0
  240. {subscript-1.5.0 → subscript-1.6.0}/tests/test_csv_stack.py +0 -0
  241. {subscript-1.5.0 → subscript-1.6.0}/tests/test_docs.py +0 -0
  242. {subscript-1.5.0 → subscript-1.6.0}/tests/test_ecldiff2roff.py +0 -0
  243. {subscript-1.5.0 → subscript-1.6.0}/tests/test_fmu_copy_revision.py +0 -0
  244. {subscript-1.5.0 → subscript-1.6.0}/tests/test_fmuobs.py +0 -0
  245. {subscript-1.5.0 → subscript-1.6.0}/tests/test_fmuobs_parsers.py +0 -0
  246. {subscript-1.5.0 → subscript-1.6.0}/tests/test_fmuobs_writers.py +0 -0
  247. {subscript-1.5.0 → subscript-1.6.0}/tests/test_merge_rft_ertobs.py +0 -0
  248. {subscript-1.5.0 → subscript-1.6.0}/tests/test_merge_unrst_files.py +0 -0
  249. {subscript-1.5.0 → subscript-1.6.0}/tests/test_ofmvol2csv.py +0 -0
  250. {subscript-1.5.0 → subscript-1.6.0}/tests/test_pack_sim.py +0 -0
  251. {subscript-1.5.0 → subscript-1.6.0}/tests/test_params2csv.py +0 -0
  252. {subscript-1.5.0 → subscript-1.6.0}/tests/test_presentvalue.py +0 -0
  253. {subscript-1.5.0 → subscript-1.6.0}/tests/test_prtvol2csv.py +0 -0
  254. {subscript-1.5.0 → subscript-1.6.0}/tests/test_restartthinner.py +0 -0
  255. {subscript-1.5.0 → subscript-1.6.0}/tests/test_ri_wellmod.py +0 -0
  256. {subscript-1.5.0 → subscript-1.6.0}/tests/test_rmsecl_volumetrics.py +0 -0
  257. {subscript-1.5.0 → subscript-1.6.0}/tests/test_sector2fluxnum.py +0 -0
  258. {subscript-1.5.0 → subscript-1.6.0}/tests/test_subscriptlogger.py +0 -0
  259. {subscript-1.5.0 → subscript-1.6.0}/tests/test_summaryplot.py +0 -0
  260. {subscript-1.5.0 → subscript-1.6.0}/tests/test_sw_model_utilities.py +0 -0
  261. {subscript-1.5.0 → subscript-1.6.0}/tests/test_vfp2csv.py +0 -0
  262. {subscript-1.5.0 → subscript-1.6.0}/tests/test_welltest_dpds.py +0 -0
  263. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_casegen_upcars/demo_large_scale.yaml +0 -0
  264. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_casegen_upcars/demo_small_scale.yaml +0 -0
  265. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_casegen_upcars/dump_value.tmpl +0 -0
  266. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_casegen_upcars/upcars_eclipse_ref_lg.tmpl +0 -0
  267. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_casegen_upcars/upcars_eclipse_ref_ss.tmpl +0 -0
  268. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_eclcompress/permxyz.grdecl +0 -0
  269. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_fmuobs/drogon_wbhp_rft_wct_gor_tracer_4d.obs +0 -0
  270. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_fmuobs/ert-doc.csv +0 -0
  271. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_fmuobs/ert-doc.obs +0 -0
  272. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_fmuobs/ert-doc.yml +0 -0
  273. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_fmuobs/fmu-ensemble-obs.yml +0 -0
  274. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_fmuobs/hist_obs_wells.txt +0 -0
  275. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_fmuobs/ri-obs.csv +0 -0
  276. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_interp_relperm/cfg.yml +0 -0
  277. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_interp_relperm/sgof_base.inc +0 -0
  278. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_interp_relperm/sgof_opt.inc +0 -0
  279. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_interp_relperm/sgof_pes.inc +0 -0
  280. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_interp_relperm/swof_base.inc +0 -0
  281. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_interp_relperm/swof_opt.inc +0 -0
  282. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_interp_relperm/swof_pes.inc +0 -0
  283. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/gendata_rft.csv +0 -0
  284. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A2.obs +0 -0
  285. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A2.txt +0 -0
  286. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A3.obs +0 -0
  287. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A3.txt +0 -0
  288. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A4.txt +0 -0
  289. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A4_1.obs +0 -0
  290. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A5.obs +0 -0
  291. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A5.txt +0 -0
  292. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A6.obs +0 -0
  293. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A6.txt +0 -0
  294. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/well_date_rft.txt +0 -0
  295. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_unrst_files/HIST.UNRST +0 -0
  296. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_unrst_files/PRED.UNRST +0 -0
  297. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ofmvol2csv/fileA.vol +0 -0
  298. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ofmvol2csv/fileB.vol +0 -0
  299. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ofmvol2csv/fileC.vol +0 -0
  300. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ofmvol2csv/ofm_example.vol +0 -0
  301. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/drogon_include/grid/drogon.grid.grdecl +0 -0
  302. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/drogon_include/grid/drogon.ntg.grdecl +0 -0
  303. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/drogon_include/grid/drogon.perm.grdecl +0 -0
  304. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/drogon_trajectories/rft_wells.dat +0 -0
  305. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/drogon_trajectories/wells.dat +0 -0
  306. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/drogon_wells_noicd.rsp +0 -0
  307. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/reek_trajectories/reek_wells.dat +0 -0
  308. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/ri_reek_wells.rsp +0 -0
  309. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/DUMPFLUX_TEST.DATA +0 -0
  310. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/DUMPFLUX_TEST.EGRID +0 -0
  311. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/DUMPFLUX_TEST.FLUX +0 -0
  312. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/OUT_COARSE.FLUX +0 -0
  313. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/TEST.DATA +0 -0
  314. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/TEST.EGRID +0 -0
  315. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/TEST.INIT +0 -0
  316. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/TEST.UNRST +0 -0
  317. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sunsch/config.yml +0 -0
  318. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sunsch/emptyinit.sch +0 -0
  319. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sunsch/foo1.sch +0 -0
  320. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sunsch/footemplate.sch +0 -0
  321. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sunsch/initwithdates.sch +0 -0
  322. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sunsch/merge2.sch +0 -0
  323. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sunsch/mergeme.sch +0 -0
  324. {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sunsch/options3.sch +0 -0
@@ -27,6 +27,7 @@ jobs:
27
27
  run: |
28
28
  sudo apt-get install software-properties-common
29
29
  sudo apt-add-repository ppa:opm/ppa
30
+ sudo apt-add-repository ppa:opm/testing
30
31
  sudo apt-get update
31
32
  sudo apt-get install mpi-default-bin
32
33
  sudo apt-get install libopm-simulators-bin
@@ -47,5 +48,6 @@ jobs:
47
48
  pytest tests --disable-warnings --cov=subscript --cov-report=xml
48
49
 
49
50
  - name: Upload coverage to Codecov
50
- run: |
51
- bash <(curl -s https://codecov.io/bash)
51
+ uses: codecov/codecov-action@v4
52
+ with:
53
+ token: ${{ secrets.CODECOV_TOKEN }}
@@ -39,6 +39,7 @@ jobs:
39
39
  run: |
40
40
  sudo apt-get install software-properties-common
41
41
  sudo apt-add-repository ppa:opm/ppa
42
+ sudo apt-add-repository ppa:opm/testing
42
43
  sudo apt-get update
43
44
  sudo apt-get install mpi-default-bin
44
45
  sudo apt-get install libopm-simulators-bin
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: subscript
3
- Version: 1.5.0
3
+ Version: 1.6.0
4
4
  Summary: Equinor's collection of subsurface reservoir modelling scripts
5
5
  Author-email: Equinor <rnyb@equinor.com>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -0,0 +1,10 @@
1
+
2
+ GRAV_SUBS_MAPS
3
+ ==============
4
+
5
+ .. argparse::
6
+ :module: subscript.grav_subs_maps.grav_subs_maps
7
+ :func: get_parser
8
+ :prog: grav_subs_maps
9
+
10
+
@@ -3,7 +3,7 @@ SUMMARYPLOT
3
3
  ===========
4
4
 
5
5
  ``summaryplot`` is a command line utility to generate plots from Eclipse
6
- simulations, based on `libecl <http://github.com/equinor/libecl>`_
6
+ simulations, based on `resdata <http://github.com/equinor/resdata>`_
7
7
  for processing Eclipse output files and
8
8
  `matplotlib <http://matplotlib.sourceforge.net>`_ for plotting.
9
9
 
@@ -96,6 +96,7 @@ eclcompress = "subscript.eclcompress.eclcompress:main"
96
96
  ecldiff2roff = "subscript.ecldiff2roff.ecldiff2roff:main"
97
97
  fmu_copy_revision = "subscript.fmu_copy_revision.fmu_copy_revision:main"
98
98
  fmuobs = "subscript.fmuobs.fmuobs:main"
99
+ grav_subs_maps = "subscript.grav_subs_maps.grav_subs_maps:main"
99
100
  interp_relperm = "subscript.interp_relperm.interp_relperm:main"
100
101
  merge_rft_ertobs = "subscript.merge_rft_ertobs.merge_rft_ertobs:main"
101
102
  merge_unrst_files = "subscript.merge_unrst_files.merge_unrst_files:main"
@@ -326,7 +326,7 @@ def qc_flag(qc_frame: pd.DataFrame) -> pd.DataFrame:
326
326
 
327
327
  contact = "OWC" if "OWC" in qc_frame else "GWC"
328
328
 
329
- # Eclipse and libecl does not calculate cell centres to the same decimals.
329
+ # Eclipse and resdata does not calculate cell centres to the same decimals.
330
330
  # Add some tolerance when testing towards fluid contacts.
331
331
  contacttolerance = 1e-4
332
332
 
@@ -0,0 +1,9 @@
1
+ EXECUTABLE grav_subs_maps
2
+
3
+ DEFAULT <ROOT_PATH> "./"
4
+
5
+ ARGLIST "--configfile" <GRAVMAPS_CONFIG> "--root-path" <ROOT_PATH> "--outputdir" <OUTPUT_DIR> <UNRST_FILE>
6
+
7
+ MIN_ARG 2
8
+ MAX_ARG 4
9
+ ARG_TYPE 0 STRING
@@ -312,7 +312,7 @@ def find_keyword_sets(filelines: List[str]) -> List[Tuple[int, int]]:
312
312
  /
313
313
 
314
314
  we are not able to detect anything but the first record (line) without
315
- having a full Eclipse parser (OPM). This means we we only compress the
315
+ having a full Eclipse parser (OPM). This means we only compress the
316
316
  first line. These type of keywords are not important to compress, and we
317
317
  could just as well avoid compressing them altogether.
318
318
 
@@ -336,7 +336,7 @@ def find_keyword_sets(filelines: List[str]) -> List[Tuple[int, int]]:
336
336
  continue
337
337
  # Remove embracing quotes if in a multi-keyword
338
338
  keyword = line.split(" ")[0].strip("'")
339
- if keyword in ALLOWLIST_KEYWORDS:
339
+ if (keyword in ALLOWLIST_KEYWORDS) or keyword.startswith("FIP"):
340
340
  kwstart = lineidx
341
341
  if "/" in line:
342
342
  keywordsets.append((kwstart, lineidx))
@@ -0,0 +1,324 @@
1
+ import argparse
2
+ import logging
3
+ import os
4
+ import sys
5
+ from datetime import date
6
+ from pathlib import Path
7
+ from typing import Any, Dict, List, Optional
8
+
9
+ import xtgeo
10
+ import yaml
11
+ from pydantic import BaseModel, Field, FilePath, field_validator
12
+ from resdata.gravimetry import ResdataGrav, ResdataSubsidence
13
+ from resdata.grid import Grid
14
+ from resdata.resfile import ResdataFile
15
+ from typing_extensions import Annotated
16
+
17
+ import subscript
18
+
19
+ logger = subscript.getLogger(__name__)
20
+
21
+ # Constant for subsidence modelling, not influencing results
22
+ # since subsidence is calculated from porevolume change
23
+ # therefore defaulted
24
+ DUMMY_YOUNGS = 0.5
25
+
26
+ PREFIX_GRAVSURF = "all--delta_gravity_"
27
+ PREFIX_SUBSSURF = "all--subsidence"
28
+
29
+ DESCRIPTION = """
30
+ Modelling maps of gravity change and subsidence from flow
31
+ simulation output (EGRID, INIT and UNRST files).
32
+
33
+ The script reads flow simulation results and a yaml configuration file specifying input
34
+ and calculation parameters. Output is surfaces in irap binary format.
35
+ """
36
+
37
+ EPILOGUE = """
38
+ .. code-block:: yaml
39
+
40
+ # Example config file for grav_subs_maps
41
+
42
+ input:
43
+ diffdates:
44
+ - [2020-07-01, 2018-01-01] # Difference date to model. Must exist in UNRST file.
45
+ seabed_map: seabed.gri # Path to file with seabed, irap binary format.
46
+ # Also used as map template
47
+
48
+ calculations:
49
+ poisson_ratio: 0.45 # For subsidence calulcations, used in Geertsma model
50
+ coarsening: 8 # Coarsening factor for maps to speed up calculations
51
+ phases: ['gas', 'oil','water', 'total'] # One map for each phase specified
52
+
53
+ """
54
+
55
+ CATEGORY = "modelling.reservoir"
56
+
57
+ EXAMPLES = """
58
+ .. code-block:: console
59
+
60
+ FORWARD_MODEL GRAV_SUBS_MAPS(<UNRST_FILE>=<ECLBASE>.UNRST, <GRAV_CONFIG>=grav_subs_maps.yml, <ROOT_PATH>=<CONFIG_PATH>, <OUTPUTDIR>=share/results/maps)
61
+
62
+
63
+ where ``ECLBASE`` is already defined in your ERT config, pointing to the flowsimulator
64
+ basename relative to ``RUNPATH``, grav_subs_maps.yml is a YAML file defining
65
+ the inputs and modelling parameters and ``OUTPUTDIR`` is the path to the output folder.
66
+ ``ROOT_PATH`` is optinal and defaulted to "./". This is the rooth path assumed for
67
+ relative paths in the yml config.
68
+
69
+ The directory to export maps to must exist.
70
+ """ # noqa
71
+
72
+
73
+ class GravInput(BaseModel):
74
+ diffdates: List[List[date]]
75
+ seabed_map: FilePath
76
+
77
+
78
+ class GravCalc(BaseModel):
79
+ poisson_ratio: Annotated[float, Field(strict=True, ge=0, le=0.5)]
80
+ coarsening: Optional[Annotated[int, Field(strict=True, ge=1)]] = None
81
+ phases: List[str]
82
+
83
+ @field_validator("phases")
84
+ @classmethod
85
+ def check_phases(cls, phases: List[str]) -> List[str]:
86
+ allowed_phases = ["oil", "gas", "water", "total"]
87
+ for item in phases:
88
+ assert item in allowed_phases, f"allowed phases are {str(allowed_phases)}"
89
+ return phases
90
+
91
+
92
+ class GravMapsConfig(BaseModel):
93
+ input: GravInput
94
+ calculations: GravCalc
95
+
96
+
97
+ def get_parser() -> argparse.ArgumentParser:
98
+ """Function to create the argument parser that is going to be served to the user.
99
+
100
+ Returns:
101
+ argparse.ArgumentParser: The argument parser to be served
102
+
103
+ """
104
+ parser = argparse.ArgumentParser(
105
+ prog="grav_subs_maps.py",
106
+ description=DESCRIPTION,
107
+ epilog=EPILOGUE,
108
+ formatter_class=argparse.RawTextHelpFormatter,
109
+ )
110
+
111
+ parser.add_argument("UNRSTfile", type=str, help="Path to flowsimulator UNRST file")
112
+ parser.add_argument(
113
+ "-c",
114
+ "-C",
115
+ "--configfile",
116
+ type=str,
117
+ help="Name of YAML config file",
118
+ required=True,
119
+ )
120
+ parser.add_argument(
121
+ "-r",
122
+ "--root-path",
123
+ type=str,
124
+ default="./",
125
+ help=("Root path assumed for relative paths" " in config file."),
126
+ )
127
+ parser.add_argument(
128
+ "-o",
129
+ "--outputdir",
130
+ type=str,
131
+ help="Path to directory for output maps. Directory must exist.",
132
+ default="./",
133
+ )
134
+ parser.add_argument(
135
+ "--version",
136
+ action="version",
137
+ version="%(prog)s (subscript version " + subscript.__version__ + ")",
138
+ )
139
+ return parser
140
+
141
+
142
+ def main() -> None:
143
+ """Invocated from the command line, parsing command line arguments"""
144
+ parser = get_parser()
145
+ args = parser.parse_args()
146
+
147
+ logger.setLevel(logging.INFO)
148
+
149
+ # parse the config file
150
+ if not Path(args.configfile).exists():
151
+ sys.exit("No such file:" + args.configfile)
152
+ config = yaml.safe_load(Path(args.configfile).read_text(encoding="utf8"))
153
+
154
+ # cfg = GravMapsConfig.model_validate(config).model_dump()
155
+
156
+ if not Path(args.outputdir).exists():
157
+ sys.exit("Output folder does not exist:" + args.outputdir)
158
+ if not Path(args.UNRSTfile).exists():
159
+ sys.exit("UNRST file does not exist:" + args.UNRSTfile)
160
+
161
+ main_gravmaps(args.UNRSTfile, config, Path(args.root_path), Path(args.outputdir))
162
+
163
+
164
+ def prepend_root_path_to_relative_files(
165
+ cfg: Dict[str, Any], root_path: Path
166
+ ) -> Dict[str, Any]:
167
+ """Prepend root_path to relative files found paths in a configuration
168
+ dictionary.
169
+
170
+ Note: This function is before prior to validation of the configuration!
171
+
172
+ Will look for filename in the key "input["seabed_map"]"
173
+
174
+ Args:
175
+ cfg: grav_subs_maps configuration dictionary
176
+ root_path: An relative or absolute path to be prepended
177
+
178
+ Returns:
179
+ Modified configuration for interp_relperm
180
+ """
181
+ if (
182
+ "input" in cfg
183
+ and "seabed_map" in cfg["input"]
184
+ and not os.path.isabs(cfg["input"]["seabed_map"])
185
+ ):
186
+ cfg["input"]["seabed_map"] = str(root_path / Path(cfg["input"]["seabed_map"]))
187
+ return cfg
188
+
189
+
190
+ def main_gravmaps(
191
+ unrst_file: str,
192
+ config: Dict[str, Any],
193
+ root_path: Optional[Path],
194
+ output_folder: Path,
195
+ ) -> None:
196
+ """
197
+ Process a configuration, model gravity and subsidence surfaces and write to disk.
198
+
199
+ Args:
200
+ resdata: Path to flow simulation UNRST file
201
+ config: Configuration for modelling
202
+ """
203
+
204
+ if root_path is not None:
205
+ config = prepend_root_path_to_relative_files(config, root_path)
206
+
207
+ cfg = GravMapsConfig.model_validate(config).model_dump()
208
+
209
+ # Read inputs and calculation parameters
210
+ input_diffdates = cfg["input"]["diffdates"]
211
+ map_template = cfg["input"]["seabed_map"]
212
+ coarsening = cfg["calculations"]["coarsening"]
213
+ phases = cfg["calculations"]["phases"]
214
+ poisson_ratio = cfg["calculations"]["poisson_ratio"]
215
+
216
+ # Read seabed map and coarsen
217
+ seabed = xtgeo.surface_from_file(map_template)
218
+ seabed.coarsen(coarsening)
219
+
220
+ if isinstance(unrst_file, str):
221
+ restart_file = unrst_file[:-6] + ".UNRST"
222
+ egrid_file = unrst_file[:-6] + ".EGRID"
223
+ init_file = unrst_file[:-6] + ".INIT"
224
+ grid = Grid(egrid_file)
225
+ init = ResdataFile(init_file)
226
+ rest = ResdataFile(restart_file)
227
+
228
+ restart_index = {}
229
+
230
+ # From restart datetime format to YYYYMMDD as key
231
+ for i, restart_date in enumerate(rest.dates):
232
+ restart_index[restart_date.strftime("%Y%m%d")] = i
233
+
234
+ diffdates = []
235
+ # Convert dates from datetime format to strings
236
+ logger.info("Will do modelling for diffdates: ")
237
+ for diffdate in input_diffdates:
238
+ diff = [diffdate[0].strftime("%Y%m%d"), diffdate[1].strftime("%Y%m%d")]
239
+ diffdates.append(diff)
240
+ logger.info(f"{diffdate[0]}_{diffdate[1]}")
241
+
242
+ grav = ResdataGrav(grid, init)
243
+ subsidence = ResdataSubsidence(grid, init)
244
+
245
+ added_dates = []
246
+
247
+ for diffdate in diffdates:
248
+ for singledate in diffdate: # base and monitor
249
+ rsb = rest.restartView(0)
250
+ if singledate not in added_dates:
251
+ if singledate in restart_index:
252
+ rsb = rest.restartView(restart_index[singledate])
253
+ grav.add_survey_RFIP(singledate, rsb)
254
+ subsidence.add_survey_PRESSURE(singledate, rsb)
255
+ added_dates.append(singledate)
256
+ else:
257
+ logger.error(
258
+ f"Date {singledate} specified but not found in UNRST file."
259
+ )
260
+ sys.exit(1)
261
+ phase_code = {"oil": 1, "gas": 2, "water": 4, "total": 7}
262
+
263
+ # Gravity
264
+ for diffdate in diffdates:
265
+ for phase in phases:
266
+ logger.info(
267
+ f"Calculating delta gravity map from {phase} "
268
+ f"for {diffdate[0]}_{diffdate[1]}"
269
+ )
270
+ dgsim = seabed.copy()
271
+ df_dgsim = dgsim.get_dataframe()
272
+ dgsim_series = []
273
+ for index, row in df_dgsim.iterrows():
274
+ dgsim_series.append(
275
+ grav.eval(
276
+ diffdate[1],
277
+ diffdate[0],
278
+ (row["X_UTME"], row["Y_UTMN"], row["VALUES"]),
279
+ phase_mask=phase_code[phase],
280
+ )
281
+ )
282
+ dgsim.values = dgsim_series
283
+ filename = (
284
+ PREFIX_GRAVSURF
285
+ + phase
286
+ + "--"
287
+ + diffdate[0]
288
+ + "_"
289
+ + diffdate[1]
290
+ + ".gri"
291
+ )
292
+ dgsim.to_file(os.path.join(output_folder, filename))
293
+
294
+ # Subsidence
295
+ for diffdate in diffdates:
296
+ logger.info(f"Calculating subsidence map for {diffdate[0]}_{diffdate[1]}")
297
+ dzsim = seabed.copy()
298
+ df_dzsim = dzsim.get_dataframe()
299
+ dzsim_series = []
300
+ for index, row in df_dzsim.iterrows():
301
+ dzsim_series.append(
302
+ subsidence.eval_geertsma_rporv(
303
+ diffdate[1],
304
+ diffdate[0],
305
+ (row["X_UTME"], row["Y_UTMN"], row["VALUES"]),
306
+ DUMMY_YOUNGS,
307
+ poisson_ratio,
308
+ row["VALUES"],
309
+ )
310
+ )
311
+
312
+ dzsim.values = [i * 100 for i in dzsim_series] # From m to cms
313
+
314
+ filename = PREFIX_SUBSSURF + "--" + diffdate[0] + "_" + diffdate[1] + ".gri"
315
+ dzsim.to_file(os.path.join(output_folder, filename))
316
+
317
+ logger.info(
318
+ "Done; All gravity and subsidence maps written to folder: %s",
319
+ str(output_folder),
320
+ )
321
+
322
+
323
+ if __name__ == "__main__":
324
+ main()
@@ -167,7 +167,10 @@ def make_wateroilgas(dframe: pd.DataFrame, delta_s: float) -> pyscal.WaterOilGas
167
167
  The data must be restricted to only one SATNUM.
168
168
  """
169
169
  dframe = dframe.copy() # Copy since we will modify it.
170
- wog = pyscal.WaterOilGas(swl=dframe["SW"].min(), h=delta_s)
170
+ wog = pyscal.WaterOilGas(
171
+ swl=dframe["SW"].min() if "SW" in dframe.columns else 1.0 - dframe["SG"].max(),
172
+ h=delta_s,
173
+ )
171
174
  if "PCOW" not in dframe:
172
175
  dframe = dframe.assign(PCOW=0)
173
176
  if "PCOG" not in dframe:
@@ -191,6 +194,7 @@ def make_wateroilgas(dframe: pd.DataFrame, delta_s: float) -> pyscal.WaterOilGas
191
194
  .drop_duplicates()
192
195
  .reset_index()
193
196
  )
197
+ wog.wateroil.add_fromtable(wo_dframe)
194
198
  go_dframe = (
195
199
  dframe[["SG", "KRG", "KROG", "PCOG"]]
196
200
  .set_index("SG")
@@ -202,23 +206,33 @@ def make_wateroilgas(dframe: pd.DataFrame, delta_s: float) -> pyscal.WaterOilGas
202
206
  .drop_duplicates()
203
207
  .reset_index()
204
208
  )
209
+ wog.gasoil.add_fromtable(go_dframe)
205
210
  else:
206
- wo_dframe = dframe[["SW", "KRW", "KROW", "PCOW"]].dropna().reset_index()
207
- go_dframe = dframe[["SG", "KRG", "KROG", "PCOG"]].dropna().reset_index()
208
-
209
- wog.wateroil.add_fromtable(wo_dframe)
210
- wog.gasoil.add_fromtable(go_dframe)
211
+ if {"SW", "KRW", "KROW", "PCOW"}.issubset(dframe.columns):
212
+ wog.wateroil.add_fromtable(
213
+ dframe[["SW", "KRW", "KROW", "PCOW"]].dropna().reset_index()
214
+ )
215
+ else:
216
+ wog.wateroil = None
217
+ if {"SG", "KRG", "KROG", "PCOG"}.issubset(dframe.columns):
218
+ wog.gasoil.add_fromtable(
219
+ dframe[["SG", "KRG", "KROG", "PCOG"]].dropna().reset_index()
220
+ )
221
+ else:
222
+ wog.gasoil = None
211
223
 
212
224
  # socr can for floating point reasons become estimated to be larger than
213
225
  # sorw, which means we are in an oil paleo zone setting. This is not
214
226
  # supported by interp_relperm. Reset the property to ensure interpolation
215
227
  # is not affected:
216
- wog.wateroil.socr = wog.wateroil.sorw
228
+ if wog.wateroil:
229
+ wog.wateroil.socr = wog.wateroil.sorw
217
230
 
218
231
  # If sgro > 0, it is a gas condensate object, which cannot be
219
232
  # mixed with non-gas condensate (during interpolation). Avoid pitfalls
220
233
  # in the estimated sgro by always setting it to zero:
221
- wog.gasoil.sgro = 0.0
234
+ if wog.gasoil:
235
+ wog.gasoil.sgro = 0.0
222
236
  return wog
223
237
 
224
238
 
@@ -248,7 +262,9 @@ def make_interpolant(
248
262
  high = make_wateroilgas(high_df.loc[satnum], delta_s)
249
263
  rec = pyscal.SCALrecommendation(low, base, high, "SATNUM " + str(satnum), h=delta_s)
250
264
 
251
- return rec.interpolate(interp_param["param_w"], interp_param["param_g"], h=delta_s)
265
+ return rec.interpolate(
266
+ interp_param.get("param_w", 0.0), interp_param.get("param_g", 0), h=delta_s
267
+ )
252
268
 
253
269
 
254
270
  def get_parser() -> argparse.ArgumentParser:
@@ -30,9 +30,9 @@ written to the same filename (keeping the original is optional)
30
30
  def find_resdata_app(toolname: str) -> str:
31
31
  """Locate path of apps in resdata.
32
32
 
33
- These have varying suffixes due through the history of libecl Makefiles.
33
+ These have varying suffixes due through the history of resdata Makefiles.
34
34
 
35
- Depending on libecl-version, it has the .x or the .c.x suffix
35
+ Depending on resdata-version, it has the .x or the .c.x suffix
36
36
  We prefer .x.
37
37
 
38
38
  Returns:
@@ -75,7 +75,7 @@ def rd_repacker(rstfilename: str, slicerstindices: list, quiet: bool) -> None:
75
75
  modify the original filename.
76
76
  """
77
77
  out = " >/dev/null" if quiet else ""
78
- # Error early if libecl tools are not available
78
+ # Error early if resdata tools are not available
79
79
  try:
80
80
  find_resdata_app("rd_unpack")
81
81
  find_resdata_app("rd_pack")
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '1.5.0'
16
- __version_tuple__ = version_tuple = (1, 5, 0)
15
+ __version__ = version = '1.6.0'
16
+ __version_tuple__ = version_tuple = (1, 6, 0)
@@ -7,7 +7,6 @@ from pathlib import Path
7
7
  import numpy as np
8
8
  import pandas as pd
9
9
  from resdata.summary import Summary
10
- from scipy.interpolate import interp1d
11
10
 
12
11
  from subscript import __version__
13
12
 
@@ -419,19 +418,7 @@ def genobs_vec(filen, vec, time):
419
418
  dframe = pd.read_csv(filen, sep="\t")
420
419
  obs_time = dframe["dTime"][1:None].dropna().to_numpy(dtype=float)
421
420
 
422
- gen_data = np.zeros(len(obs_time))
423
-
424
- interp = interp1d(time, vec)
425
-
426
- for idx, timepoint in enumerate(obs_time):
427
- if timepoint < time[0]:
428
- gen_data[idx] = vec[0]
429
- elif timepoint > time[-1]:
430
- gen_data[idx] = vec[-1]
431
- else:
432
- gen_data[idx] = interp(timepoint)
433
-
434
- return gen_data
421
+ return np.interp(obs_time, time, vec)
435
422
 
436
423
 
437
424
  def main():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: subscript
3
- Version: 1.5.0
3
+ Version: 1.6.0
4
4
  Summary: Equinor's collection of subsurface reservoir modelling scripts
5
5
  Author-email: Equinor <rnyb@equinor.com>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -33,6 +33,7 @@ docs/scripts/eclcompress.rst
33
33
  docs/scripts/ecldiff2roff.rst
34
34
  docs/scripts/fmu_copy_revision.rst
35
35
  docs/scripts/fmuobs.rst
36
+ docs/scripts/grav_subs_maps.rst
36
37
  docs/scripts/interp_relperm.rst
37
38
  docs/scripts/merge_rft_ertobs.rst
38
39
  docs/scripts/merge_unrst_files.rst
@@ -92,6 +93,7 @@ src/subscript/config_jobs/ECLDIFF2ROFF
92
93
  src/subscript/config_jobs/ECLGRID2ROFF
93
94
  src/subscript/config_jobs/ECLINIT2ROFF
94
95
  src/subscript/config_jobs/ECLRST2ROFF
96
+ src/subscript/config_jobs/GRAV_SUBS_MAPS
95
97
  src/subscript/config_jobs/INTERP_RELPERM
96
98
  src/subscript/config_jobs/MERGE_RFT_ERTOBS
97
99
  src/subscript/config_jobs/MERGE_UNRST_FILES
@@ -124,6 +126,8 @@ src/subscript/fmuobs/fmuobs.py
124
126
  src/subscript/fmuobs/parsers.py
125
127
  src/subscript/fmuobs/util.py
126
128
  src/subscript/fmuobs/writers.py
129
+ src/subscript/grav_subs_maps/__init__.py
130
+ src/subscript/grav_subs_maps/grav_subs_maps.py
127
131
  src/subscript/hook_implementations/__init__.py
128
132
  src/subscript/hook_implementations/jobs.py
129
133
  src/subscript/interp_relperm/__init__.py
@@ -189,6 +193,7 @@ tests/test_fmu_copy_revision.py
189
193
  tests/test_fmuobs.py
190
194
  tests/test_fmuobs_parsers.py
191
195
  tests/test_fmuobs_writers.py
196
+ tests/test_grav_subs_maps.py
192
197
  tests/test_hook_implementations.py
193
198
  tests/test_interp_relperm.py
194
199
  tests/test_merge_rft_ertobs.py
@@ -259,6 +264,13 @@ tests/testdata_fmuobs/ert-doc.yml
259
264
  tests/testdata_fmuobs/fmu-ensemble-obs.yml
260
265
  tests/testdata_fmuobs/hist_obs_wells.txt
261
266
  tests/testdata_fmuobs/ri-obs.csv
267
+ tests/testdata_gravity/HIST.EGRID
268
+ tests/testdata_gravity/HIST.INIT
269
+ tests/testdata_gravity/HIST.UNRST
270
+ tests/testdata_gravity/grav_subs_maps_hist.yml
271
+ tests/testdata_gravity/grav_subs_points.yml
272
+ tests/testdata_gravity/seabed.gri
273
+ tests/testdata_gravity/station_coordinates.txt
262
274
  tests/testdata_interp_relperm/cfg.yml
263
275
  tests/testdata_interp_relperm/sgof_base.inc
264
276
  tests/testdata_interp_relperm/sgof_opt.inc
@@ -10,6 +10,7 @@ eclcompress = subscript.eclcompress.eclcompress:main
10
10
  ecldiff2roff = subscript.ecldiff2roff.ecldiff2roff:main
11
11
  fmu_copy_revision = subscript.fmu_copy_revision.fmu_copy_revision:main
12
12
  fmuobs = subscript.fmuobs.fmuobs:main
13
+ grav_subs_maps = subscript.grav_subs_maps.grav_subs_maps:main
13
14
  interp_relperm = subscript.interp_relperm.interp_relperm:main
14
15
  merge_rft_ertobs = subscript.merge_rft_ertobs.merge_rft_ertobs:main
15
16
  merge_unrst_files = subscript.merge_unrst_files.merge_unrst_files:main
File without changes
@@ -713,7 +713,7 @@ def test_reek(tmp_path, mocker):
713
713
  assert Path("volplot.png").exists()
714
714
 
715
715
  # pylint: disable=no-member # false positive on Pandas dataframe
716
- # Check that we never get -1e20 from libecl in any data:
716
+ # Check that we never get -1e20 from resdata in any data:
717
717
  assert np.isclose(qc_frame.select_dtypes("number").min().min(), -7097, atol=1)
718
718
  assert np.isclose(qc_frame.select_dtypes("number").max().max(), 5938824, atol=1)
719
719
 
@@ -469,7 +469,7 @@ def test_swatinit_less_than_1_below_contact(simulator, tmp_path):
469
469
  assert np.isclose(qc_frame["PC_SCALING"][0], 1.0)
470
470
  assert np.isclose(qc_frame["PC"], 0)
471
471
  else:
472
- # E100 will not report a PPCW in this case, libecl gives -1e20,
472
+ # E100 will not report a PPCW in this case, resdata gives -1e20,
473
473
  # which becomes a NaN through res2df and then NaN columns are dropped.
474
474
  if "PPCW" in qc_frame:
475
475
  assert pd.isnull(qc_frame["PPCW"][0])