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.
- {subscript-1.5.0 → subscript-1.6.0}/.github/workflows/codecov.yml +4 -2
- {subscript-1.5.0 → subscript-1.6.0}/.github/workflows/subscript.yml +1 -0
- {subscript-1.5.0 → subscript-1.6.0}/PKG-INFO +1 -1
- subscript-1.6.0/docs/scripts/grav_subs_maps.rst +10 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/summaryplot.rst +1 -1
- {subscript-1.5.0 → subscript-1.6.0}/pyproject.toml +1 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/check_swatinit/check_swatinit.py +1 -1
- subscript-1.6.0/src/subscript/config_jobs/GRAV_SUBS_MAPS +9 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/eclcompress/eclcompress.py +2 -2
- subscript-1.6.0/src/subscript/grav_subs_maps/grav_subs_maps.py +324 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/interp_relperm/interp_relperm.py +25 -9
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/restartthinner/restartthinner.py +3 -3
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/version.py +2 -2
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/welltest_dpds/welltest_dpds.py +1 -14
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript.egg-info/PKG-INFO +1 -1
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript.egg-info/SOURCES.txt +12 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript.egg-info/entry_points.txt +1 -0
- subscript-1.6.0/tests/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_check_swatinit.py +1 -1
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_check_swatinit_simulators.py +1 -1
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_eclcompress.py +23 -0
- subscript-1.6.0/tests/test_grav_subs_maps.py +184 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_hook_implementations.py +1 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_interp_relperm.py +116 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_sunsch.py +2 -19
- subscript-1.6.0/tests/testdata_gravity/HIST.EGRID +0 -0
- subscript-1.6.0/tests/testdata_gravity/HIST.INIT +0 -0
- subscript-1.6.0/tests/testdata_gravity/HIST.UNRST +0 -0
- subscript-1.6.0/tests/testdata_gravity/grav_subs_maps_hist.yml +12 -0
- subscript-1.6.0/tests/testdata_gravity/grav_subs_points.yml +16 -0
- subscript-1.6.0/tests/testdata_gravity/seabed.gri +0 -0
- subscript-1.6.0/tests/testdata_gravity/station_coordinates.txt +12 -0
- {subscript-1.5.0 → subscript-1.6.0}/.github/workflows/publish.yml +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/.gitignore +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/.pylintrc +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/LICENSE +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/README.md +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/SECURITY.md +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/ci/testkomodo.sh +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/Makefile +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/_static/equinor-logo.png +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/_static/equinor-logo2.jpg +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/_static/equinor-logo2.png +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/_static/equinor_logo.jpg +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/_static/equinor_logo_only.jpg +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/_templates/layout.html +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/conf.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/contributing.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/history.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/index.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/make.bat +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/overview.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/bjobsusers.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/casegen_upcars.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/check_swatinit.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/convert_grid_format.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/csv2ofmvol.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/csv_merge.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/csv_stack.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/eclcompress.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/ecldiff2roff.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/fmu_copy_revision.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/fmuobs.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/Pack_sim_overview.png +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/Summaryplot-ensemble.png +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/Summaryplot-ert.png +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/Summaryplot-normalizeexample.png +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/Workflow_sector2fluxnum.png +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/casegen_upcars_geometry.png +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/check_swatinit_scatter.png +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/check_swatinit_volplot.png +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/ecl-swat-initialization.png +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/make_check_swatinit_images.sh +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/images/resinsight_wells_project_example.png +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/interp_relperm.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/merge_rft_ertobs.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/merge_unrst_files.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/ofmvol2csv.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/pack_sim.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/params2csv.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/presentvalue.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/prtvol2csv.csv +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/prtvol2csv.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/restartthinner.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/ri_wellmod.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/rmsecl_volumetrics.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/runeclipse.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/sector2fluxnum.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/sunsch.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/sw_model_utilities.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/vfp2csv.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/scripts/welltest_dpds.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/docs/usage.rst +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/setup.cfg +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/bjobsusers/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/bjobsusers/bjobsusers.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/casegen_upcars/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/casegen_upcars/casegen_upcars.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/casegen_upcars/model.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/casegen_upcars/udf.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/casegen_upcars/udf_arg_parser.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/check_swatinit/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/check_swatinit/constants.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/check_swatinit/pillarmodel.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/check_swatinit/plotter.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/CASEGEN_UPCARS +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/CHECK_SWATINIT +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/CSV2OFMVOL +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/CSV_STACK +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/ECLCOMPRESS +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/ECLDIFF2ROFF +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/ECLGRID2ROFF +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/ECLINIT2ROFF +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/ECLRST2ROFF +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/INTERP_RELPERM +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/MERGE_RFT_ERTOBS +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/MERGE_UNRST_FILES +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/OFMVOL2CSV +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/PARAMS2CSV +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/PRTVOL2CSV +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/RI_WELLMOD +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/SUNSCH +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/config_jobs/WELLTEST_DPDS +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/convert_grid_format/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/convert_grid_format/convert_grid_format.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/csv2ofmvol/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/csv2ofmvol/csv2ofmvol.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/csv_merge/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/csv_merge/csv_merge.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/csv_stack/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/csv_stack/csv_stack.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/eclcompress/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/eclcompress/allowlist.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/ecldiff2roff/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/ecldiff2roff/ecldiff2roff.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/eclgrid2roff/eclgrid2roff.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/eclinit2roff/eclinit2roff.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/eclrst2roff/eclrst2roff.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/fmu_copy_revision/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/fmu_copy_revision/fmu_copy_revision.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/fmuobs/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/fmuobs/fmuobs.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/fmuobs/parsers.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/fmuobs/util.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/fmuobs/writers.py +0 -0
- {subscript-1.5.0/src/subscript/hook_implementations → subscript-1.6.0/src/subscript/grav_subs_maps}/__init__.py +0 -0
- {subscript-1.5.0/src/subscript/interp_relperm → subscript-1.6.0/src/subscript/hook_implementations}/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/hook_implementations/jobs.py +0 -0
- {subscript-1.5.0/src/subscript/merge_rft_ertobs → subscript-1.6.0/src/subscript/interp_relperm}/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/legacy/duf +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/legacy/eclmanual +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/legacy/ertwatch +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/legacy/list_rms_usage +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/legacy/nosim +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/legacy/runeclipse +0 -0
- {subscript-1.5.0/src/subscript/merge_unrst_files → subscript-1.6.0/src/subscript/merge_rft_ertobs}/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/merge_rft_ertobs/merge_rft_ertobs.py +0 -0
- {subscript-1.5.0/src/subscript/ofmvol2csv → subscript-1.6.0/src/subscript/merge_unrst_files}/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/merge_unrst_files/merge_unrst_files.py +0 -0
- {subscript-1.5.0/src/subscript/pack_sim → subscript-1.6.0/src/subscript/ofmvol2csv}/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/ofmvol2csv/ofmvol2csv.py +0 -0
- {subscript-1.5.0/src/subscript/params2csv → subscript-1.6.0/src/subscript/pack_sim}/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/pack_sim/pack_sim.py +0 -0
- {subscript-1.5.0/src/subscript/presentvalue → subscript-1.6.0/src/subscript/params2csv}/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/params2csv/params2csv.py +0 -0
- {subscript-1.5.0/src/subscript/prtvol2csv → subscript-1.6.0/src/subscript/presentvalue}/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/presentvalue/presentvalue.py +0 -0
- {subscript-1.5.0/src/subscript/restartthinner → subscript-1.6.0/src/subscript/prtvol2csv}/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/prtvol2csv/prtvol2csv.py +0 -0
- {subscript-1.5.0/src/subscript/ri_wellmod → subscript-1.6.0/src/subscript/restartthinner}/__init__.py +0 -0
- {subscript-1.5.0/src/subscript/rmsecl_volumetrics → subscript-1.6.0/src/subscript/ri_wellmod}/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/ri_wellmod/ri_wellmod.py +0 -0
- {subscript-1.5.0/src/subscript/sector2fluxnum → subscript-1.6.0/src/subscript/rmsecl_volumetrics}/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/rmsecl_volumetrics/rmsecl_volumetrics.py +0 -0
- {subscript-1.5.0/src/subscript/summaryplot → subscript-1.6.0/src/subscript/sector2fluxnum}/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/sector2fluxnum/completions.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/sector2fluxnum/datafile_obj.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/sector2fluxnum/flux_obj.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/sector2fluxnum/flux_util.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/sector2fluxnum/fluxfile_obj.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/sector2fluxnum/sector2fluxnum.py +0 -0
- {subscript-1.5.0/src/subscript/sunsch → subscript-1.6.0/src/subscript/summaryplot}/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/summaryplot/summaryplot.py +0 -0
- {subscript-1.5.0/src/subscript/sw_model_utilities → subscript-1.6.0/src/subscript/sunsch}/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/sunsch/sunsch.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/sunsch/time_vector.py +0 -0
- {subscript-1.5.0/src/subscript/vfp2csv → subscript-1.6.0/src/subscript/sw_model_utilities}/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/sw_model_utilities/sw_model_utilities.py +0 -0
- {subscript-1.5.0/src/subscript/welltest_dpds → subscript-1.6.0/src/subscript/vfp2csv}/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript/vfp2csv/vfp2csv.py +0 -0
- {subscript-1.5.0/tests → subscript-1.6.0/src/subscript/welltest_dpds}/__init__.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript.egg-info/dependency_links.txt +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript.egg-info/requires.txt +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/src/subscript.egg-info/top_level.txt +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/conftest.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/grid/reek.faults +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/grid/reek.grid +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/grid/reek.multflt +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/grid/reek.multz +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/grid/reek.perm +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/grid/reek.poro +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/let-sgof.txt +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/let-swof.txt +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/reek.endpoints +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/reek.pvt +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/reek.swatinit +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/sgof.txt +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/swof.inc +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/swof.txt +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/regions/reek.eqlnum +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/regions/reek.fipnum +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/schedule/reek_history.sch +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/solution/reek.equil +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/summary/reek.smry +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.DATA +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.ECLEND +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.EGRID +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.INIT +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.LOG +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.PRT +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.RFT +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.SMSPEC +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.UNRST +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.UNSMRY +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/parameters.txt +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/parameters.txt +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/rms/README +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/rms/reek.rms10.1.3/.master +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/reek/rms/reek.rms11.1.0/.master +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/vfp/GasProd.VFP +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/vfp/pd2.VFP +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/welltest/eclipse/model/DROGON_DST_PLT-0.SMSPEC +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/data/welltest/eclipse/model/DROGON_DST_PLT-0.UNSMRY +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_bjobsusers.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_casegen_upcars.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_convert_grid_format.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_csv2ofmvol.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_csv_merge.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_csv_stack.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_docs.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_ecldiff2roff.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_fmu_copy_revision.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_fmuobs.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_fmuobs_parsers.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_fmuobs_writers.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_merge_rft_ertobs.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_merge_unrst_files.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_ofmvol2csv.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_pack_sim.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_params2csv.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_presentvalue.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_prtvol2csv.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_restartthinner.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_ri_wellmod.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_rmsecl_volumetrics.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_sector2fluxnum.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_subscriptlogger.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_summaryplot.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_sw_model_utilities.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_vfp2csv.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/test_welltest_dpds.py +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_casegen_upcars/demo_large_scale.yaml +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_casegen_upcars/demo_small_scale.yaml +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_casegen_upcars/dump_value.tmpl +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_casegen_upcars/upcars_eclipse_ref_lg.tmpl +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_casegen_upcars/upcars_eclipse_ref_ss.tmpl +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_eclcompress/permxyz.grdecl +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_fmuobs/drogon_wbhp_rft_wct_gor_tracer_4d.obs +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_fmuobs/ert-doc.csv +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_fmuobs/ert-doc.obs +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_fmuobs/ert-doc.yml +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_fmuobs/fmu-ensemble-obs.yml +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_fmuobs/hist_obs_wells.txt +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_fmuobs/ri-obs.csv +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_interp_relperm/cfg.yml +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_interp_relperm/sgof_base.inc +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_interp_relperm/sgof_opt.inc +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_interp_relperm/sgof_pes.inc +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_interp_relperm/swof_base.inc +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_interp_relperm/swof_opt.inc +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_interp_relperm/swof_pes.inc +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/gendata_rft.csv +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A2.obs +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A2.txt +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A3.obs +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A3.txt +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A4.txt +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A4_1.obs +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A5.obs +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A5.txt +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A6.obs +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A6.txt +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/well_date_rft.txt +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_unrst_files/HIST.UNRST +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_merge_unrst_files/PRED.UNRST +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ofmvol2csv/fileA.vol +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ofmvol2csv/fileB.vol +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ofmvol2csv/fileC.vol +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ofmvol2csv/ofm_example.vol +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/drogon_include/grid/drogon.grid.grdecl +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/drogon_include/grid/drogon.ntg.grdecl +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/drogon_include/grid/drogon.perm.grdecl +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/drogon_trajectories/rft_wells.dat +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/drogon_trajectories/wells.dat +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/drogon_wells_noicd.rsp +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/reek_trajectories/reek_wells.dat +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/ri_reek_wells.rsp +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/DUMPFLUX_TEST.DATA +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/DUMPFLUX_TEST.EGRID +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/DUMPFLUX_TEST.FLUX +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/OUT_COARSE.FLUX +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/TEST.DATA +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/TEST.EGRID +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/TEST.INIT +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/TEST.UNRST +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sunsch/config.yml +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sunsch/emptyinit.sch +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sunsch/foo1.sch +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sunsch/footemplate.sch +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sunsch/initwithdates.sch +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sunsch/merge2.sch +0 -0
- {subscript-1.5.0 → subscript-1.6.0}/tests/testdata_sunsch/mergeme.sch +0 -0
- {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
|
-
|
|
51
|
-
|
|
51
|
+
uses: codecov/codecov-action@v4
|
|
52
|
+
with:
|
|
53
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
@@ -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 `
|
|
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
|
|
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
|
|
|
@@ -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
|
|
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(
|
|
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
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
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
|
-
|
|
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
|
|
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(
|
|
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
|
|
33
|
+
These have varying suffixes due through the history of resdata Makefiles.
|
|
34
34
|
|
|
35
|
-
Depending on
|
|
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
|
|
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")
|
|
@@ -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
|
-
|
|
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():
|
|
@@ -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
|
|
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,
|
|
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])
|