subscript 1.4.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.4.0 → subscript-1.6.0}/.github/workflows/codecov.yml +4 -2
- {subscript-1.4.0 → subscript-1.6.0}/.github/workflows/subscript.yml +1 -0
- {subscript-1.4.0 → subscript-1.6.0}/PKG-INFO +2 -2
- {subscript-1.4.0 → subscript-1.6.0}/README.md +1 -1
- {subscript-1.4.0 → subscript-1.6.0}/docs/overview.rst +0 -1
- subscript-1.6.0/docs/scripts/grav_subs_maps.rst +10 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/summaryplot.rst +1 -1
- {subscript-1.4.0 → subscript-1.6.0}/pyproject.toml +1 -1
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/bjobsusers/bjobsusers.py +31 -24
- {subscript-1.4.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.4.0 → subscript-1.6.0}/src/subscript/eclcompress/allowlist.py +13 -0
- {subscript-1.4.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.4.0 → subscript-1.6.0}/src/subscript/interp_relperm/interp_relperm.py +25 -9
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/restartthinner/restartthinner.py +3 -3
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/version.py +2 -2
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/welltest_dpds/welltest_dpds.py +1 -14
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript.egg-info/PKG-INFO +2 -2
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript.egg-info/SOURCES.txt +12 -5
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript.egg-info/entry_points.txt +1 -1
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_bjobsusers.py +9 -9
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_check_swatinit.py +1 -1
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_check_swatinit_simulators.py +1 -1
- {subscript-1.4.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.4.0 → subscript-1.6.0}/tests/test_hook_implementations.py +1 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_interp_relperm.py +116 -0
- {subscript-1.4.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.4.0/docs/scripts/runrms.rst +0 -8
- subscript-1.4.0/src/subscript/runrms/runrms.py +0 -871
- subscript-1.4.0/tests/test_runrms.py +0 -307
- subscript-1.4.0/tests/testdata_runrms/runrms.yml +0 -65
- {subscript-1.4.0 → subscript-1.6.0}/.github/workflows/publish.yml +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/.gitignore +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/.pylintrc +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/LICENSE +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/SECURITY.md +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/ci/testkomodo.sh +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/Makefile +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/_static/equinor-logo.png +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/_static/equinor-logo2.jpg +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/_static/equinor-logo2.png +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/_static/equinor_logo.jpg +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/_static/equinor_logo_only.jpg +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/_templates/layout.html +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/conf.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/contributing.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/history.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/index.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/make.bat +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/bjobsusers.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/casegen_upcars.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/check_swatinit.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/convert_grid_format.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/csv2ofmvol.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/csv_merge.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/csv_stack.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/eclcompress.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/ecldiff2roff.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/fmu_copy_revision.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/fmuobs.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/images/Pack_sim_overview.png +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/images/Summaryplot-ensemble.png +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/images/Summaryplot-ert.png +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/images/Summaryplot-normalizeexample.png +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/images/Workflow_sector2fluxnum.png +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/images/casegen_upcars_geometry.png +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/images/check_swatinit_scatter.png +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/images/check_swatinit_volplot.png +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/images/ecl-swat-initialization.png +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/images/make_check_swatinit_images.sh +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/images/resinsight_wells_project_example.png +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/interp_relperm.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/merge_rft_ertobs.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/merge_unrst_files.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/ofmvol2csv.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/pack_sim.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/params2csv.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/presentvalue.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/prtvol2csv.csv +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/prtvol2csv.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/restartthinner.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/ri_wellmod.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/rmsecl_volumetrics.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/runeclipse.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/sector2fluxnum.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/sunsch.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/sw_model_utilities.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/vfp2csv.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/scripts/welltest_dpds.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/docs/usage.rst +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/setup.cfg +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/bjobsusers/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/casegen_upcars/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/casegen_upcars/casegen_upcars.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/casegen_upcars/model.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/casegen_upcars/udf.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/casegen_upcars/udf_arg_parser.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/check_swatinit/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/check_swatinit/constants.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/check_swatinit/pillarmodel.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/check_swatinit/plotter.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/config_jobs/CASEGEN_UPCARS +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/config_jobs/CHECK_SWATINIT +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/config_jobs/CSV2OFMVOL +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/config_jobs/CSV_STACK +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/config_jobs/ECLCOMPRESS +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/config_jobs/ECLDIFF2ROFF +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/config_jobs/ECLGRID2ROFF +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/config_jobs/ECLINIT2ROFF +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/config_jobs/ECLRST2ROFF +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/config_jobs/INTERP_RELPERM +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/config_jobs/MERGE_RFT_ERTOBS +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/config_jobs/MERGE_UNRST_FILES +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/config_jobs/OFMVOL2CSV +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/config_jobs/PARAMS2CSV +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/config_jobs/PRTVOL2CSV +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/config_jobs/RI_WELLMOD +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/config_jobs/SUNSCH +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/config_jobs/WELLTEST_DPDS +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/convert_grid_format/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/convert_grid_format/convert_grid_format.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/csv2ofmvol/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/csv2ofmvol/csv2ofmvol.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/csv_merge/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/csv_merge/csv_merge.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/csv_stack/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/csv_stack/csv_stack.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/eclcompress/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/ecldiff2roff/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/ecldiff2roff/ecldiff2roff.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/eclgrid2roff/eclgrid2roff.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/eclinit2roff/eclinit2roff.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/eclrst2roff/eclrst2roff.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/fmu_copy_revision/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/fmu_copy_revision/fmu_copy_revision.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/fmuobs/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/fmuobs/fmuobs.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/fmuobs/parsers.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/fmuobs/util.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/fmuobs/writers.py +0 -0
- {subscript-1.4.0/src/subscript/hook_implementations → subscript-1.6.0/src/subscript/grav_subs_maps}/__init__.py +0 -0
- {subscript-1.4.0/src/subscript/interp_relperm → subscript-1.6.0/src/subscript/hook_implementations}/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/hook_implementations/jobs.py +0 -0
- {subscript-1.4.0/src/subscript/merge_rft_ertobs → subscript-1.6.0/src/subscript/interp_relperm}/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/legacy/duf +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/legacy/eclmanual +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/legacy/ertwatch +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/legacy/list_rms_usage +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/legacy/nosim +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/legacy/runeclipse +0 -0
- {subscript-1.4.0/src/subscript/merge_unrst_files → subscript-1.6.0/src/subscript/merge_rft_ertobs}/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/merge_rft_ertobs/merge_rft_ertobs.py +0 -0
- {subscript-1.4.0/src/subscript/ofmvol2csv → subscript-1.6.0/src/subscript/merge_unrst_files}/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/merge_unrst_files/merge_unrst_files.py +0 -0
- {subscript-1.4.0/src/subscript/pack_sim → subscript-1.6.0/src/subscript/ofmvol2csv}/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/ofmvol2csv/ofmvol2csv.py +0 -0
- {subscript-1.4.0/src/subscript/params2csv → subscript-1.6.0/src/subscript/pack_sim}/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/pack_sim/pack_sim.py +0 -0
- {subscript-1.4.0/src/subscript/presentvalue → subscript-1.6.0/src/subscript/params2csv}/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/params2csv/params2csv.py +0 -0
- {subscript-1.4.0/src/subscript/prtvol2csv → subscript-1.6.0/src/subscript/presentvalue}/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/presentvalue/presentvalue.py +0 -0
- {subscript-1.4.0/src/subscript/restartthinner → subscript-1.6.0/src/subscript/prtvol2csv}/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/prtvol2csv/prtvol2csv.py +0 -0
- {subscript-1.4.0/src/subscript/ri_wellmod → subscript-1.6.0/src/subscript/restartthinner}/__init__.py +0 -0
- {subscript-1.4.0/src/subscript/rmsecl_volumetrics → subscript-1.6.0/src/subscript/ri_wellmod}/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/ri_wellmod/ri_wellmod.py +0 -0
- {subscript-1.4.0/src/subscript/runrms → subscript-1.6.0/src/subscript/rmsecl_volumetrics}/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/rmsecl_volumetrics/rmsecl_volumetrics.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/sector2fluxnum/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/sector2fluxnum/completions.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/sector2fluxnum/datafile_obj.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/sector2fluxnum/flux_obj.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/sector2fluxnum/flux_util.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/sector2fluxnum/fluxfile_obj.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/sector2fluxnum/sector2fluxnum.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/summaryplot/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/summaryplot/summaryplot.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/sunsch/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/sunsch/sunsch.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/sunsch/time_vector.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/sw_model_utilities/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/sw_model_utilities/sw_model_utilities.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/vfp2csv/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/vfp2csv/vfp2csv.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript/welltest_dpds/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript.egg-info/dependency_links.txt +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript.egg-info/requires.txt +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/src/subscript.egg-info/top_level.txt +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/__init__.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/conftest.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/grid/reek.faults +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/grid/reek.grid +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/grid/reek.multflt +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/grid/reek.multz +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/grid/reek.perm +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/grid/reek.poro +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/let-sgof.txt +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/let-swof.txt +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/reek.endpoints +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/reek.pvt +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/reek.swatinit +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/sgof.txt +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/swof.inc +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/props/swof.txt +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/regions/reek.eqlnum +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/regions/reek.fipnum +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/schedule/reek_history.sch +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/solution/reek.equil +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/include/summary/reek.smry +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.DATA +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.ECLEND +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.EGRID +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.INIT +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.LOG +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.PRT +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.RFT +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.SMSPEC +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.UNRST +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.UNSMRY +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/eclipse/model/parameters.txt +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/parameters.txt +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/rms/README +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/rms/reek.rms10.1.3/.master +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/reek/rms/reek.rms11.1.0/.master +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/vfp/GasProd.VFP +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/vfp/pd2.VFP +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/welltest/eclipse/model/DROGON_DST_PLT-0.SMSPEC +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/data/welltest/eclipse/model/DROGON_DST_PLT-0.UNSMRY +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_casegen_upcars.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_convert_grid_format.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_csv2ofmvol.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_csv_merge.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_csv_stack.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_docs.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_ecldiff2roff.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_fmu_copy_revision.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_fmuobs.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_fmuobs_parsers.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_fmuobs_writers.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_merge_rft_ertobs.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_merge_unrst_files.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_ofmvol2csv.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_pack_sim.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_params2csv.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_presentvalue.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_prtvol2csv.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_restartthinner.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_ri_wellmod.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_rmsecl_volumetrics.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_sector2fluxnum.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_subscriptlogger.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_summaryplot.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_sw_model_utilities.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_vfp2csv.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/test_welltest_dpds.py +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_casegen_upcars/demo_large_scale.yaml +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_casegen_upcars/demo_small_scale.yaml +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_casegen_upcars/dump_value.tmpl +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_casegen_upcars/upcars_eclipse_ref_lg.tmpl +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_casegen_upcars/upcars_eclipse_ref_ss.tmpl +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_eclcompress/permxyz.grdecl +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_fmuobs/drogon_wbhp_rft_wct_gor_tracer_4d.obs +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_fmuobs/ert-doc.csv +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_fmuobs/ert-doc.obs +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_fmuobs/ert-doc.yml +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_fmuobs/fmu-ensemble-obs.yml +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_fmuobs/hist_obs_wells.txt +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_fmuobs/ri-obs.csv +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_interp_relperm/cfg.yml +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_interp_relperm/sgof_base.inc +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_interp_relperm/sgof_opt.inc +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_interp_relperm/sgof_pes.inc +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_interp_relperm/swof_base.inc +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_interp_relperm/swof_opt.inc +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_interp_relperm/swof_pes.inc +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/gendata_rft.csv +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A2.obs +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A2.txt +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A3.obs +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A3.txt +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A4.txt +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A4_1.obs +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A5.obs +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A5.txt +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A6.obs +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A6.txt +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_merge_rft_ertobs/drogon/rft/well_date_rft.txt +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_merge_unrst_files/HIST.UNRST +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_merge_unrst_files/PRED.UNRST +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_ofmvol2csv/fileA.vol +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_ofmvol2csv/fileB.vol +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_ofmvol2csv/fileC.vol +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_ofmvol2csv/ofm_example.vol +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/drogon_include/grid/drogon.grid.grdecl +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/drogon_include/grid/drogon.ntg.grdecl +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/drogon_include/grid/drogon.perm.grdecl +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/drogon_trajectories/rft_wells.dat +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/drogon_trajectories/wells.dat +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/drogon_wells_noicd.rsp +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/reek_trajectories/reek_wells.dat +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_ri_wellmod/ri_reek_wells.rsp +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/DUMPFLUX_TEST.DATA +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/DUMPFLUX_TEST.EGRID +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/DUMPFLUX_TEST.FLUX +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/OUT_COARSE.FLUX +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/TEST.DATA +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/TEST.EGRID +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/TEST.INIT +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_sector2fluxnum/TEST.UNRST +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_sunsch/config.yml +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_sunsch/emptyinit.sch +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_sunsch/foo1.sch +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_sunsch/footemplate.sch +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_sunsch/initwithdates.sch +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_sunsch/merge2.sch +0 -0
- {subscript-1.4.0 → subscript-1.6.0}/tests/testdata_sunsch/mergeme.sch +0 -0
- {subscript-1.4.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 }}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: subscript
|
|
3
|
-
Version: 1.
|
|
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
|
|
@@ -768,7 +768,7 @@ pip install subscript
|
|
|
768
768
|
## Usage
|
|
769
769
|
|
|
770
770
|
As a collection of utilities subscript has many different invocations and
|
|
771
|
-
|
|
771
|
+
use cases. A complete overview can be found in the
|
|
772
772
|
[documentation](https://equinor.github.io/subscript)
|
|
773
773
|
for a complete overview.
|
|
774
774
|
|
|
@@ -30,7 +30,7 @@ pip install subscript
|
|
|
30
30
|
## Usage
|
|
31
31
|
|
|
32
32
|
As a collection of utilities subscript has many different invocations and
|
|
33
|
-
|
|
33
|
+
use cases. A complete overview can be found in the
|
|
34
34
|
[documentation](https://equinor.github.io/subscript)
|
|
35
35
|
for a complete overview.
|
|
36
36
|
|
|
@@ -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"
|
|
@@ -107,7 +108,6 @@ prtvol2csv = "subscript.prtvol2csv.prtvol2csv:main"
|
|
|
107
108
|
restartthinner = "subscript.restartthinner.restartthinner:main"
|
|
108
109
|
ri_wellmod = "subscript.ri_wellmod.ri_wellmod:main"
|
|
109
110
|
rmsecl_volumetrics = "subscript.rmsecl_volumetrics.rmsecl_volumetrics:main"
|
|
110
|
-
runrms = "subscript.runrms.runrms:main"
|
|
111
111
|
sector2fluxnum = "subscript.sector2fluxnum.sector2fluxnum:main"
|
|
112
112
|
summaryplot = "subscript.summaryplot.summaryplot:main"
|
|
113
113
|
sw_model_utilities = "subscript.sw_model_utilities.sw_model_utilities:main"
|
|
@@ -11,7 +11,7 @@ from subscript import __version__
|
|
|
11
11
|
DESCRIPTION = """
|
|
12
12
|
Print list of users running on cluster, sorted by number of jobs.
|
|
13
13
|
|
|
14
|
-
This is statistics derived from the system command `bjobs` and `
|
|
14
|
+
This is statistics derived from the system command `bjobs` and `pinky`.
|
|
15
15
|
"""
|
|
16
16
|
|
|
17
17
|
|
|
@@ -77,55 +77,62 @@ def get_jobs(status: str, bjobs_function: Callable) -> pd.DataFrame:
|
|
|
77
77
|
)
|
|
78
78
|
|
|
79
79
|
|
|
80
|
-
def
|
|
81
|
-
"""Call the system utility '
|
|
80
|
+
def call_pinky(username: str) -> str:
|
|
81
|
+
"""Call the system utility 'pinky' on a specific username
|
|
82
82
|
|
|
83
83
|
Returns:
|
|
84
|
-
Unicode string with the first line of output from '
|
|
84
|
+
Unicode string with the first line of output from 'pinky'
|
|
85
85
|
Example return value::
|
|
86
86
|
|
|
87
|
-
Login: foobert
|
|
87
|
+
Login name: foobert In real life: Foo Barrer (FOO BAR COM)"
|
|
88
88
|
"""
|
|
89
|
-
cmd = f"
|
|
90
|
-
|
|
89
|
+
cmd = f"pinky -l {username} | head -n 1"
|
|
90
|
+
pinky_output = None
|
|
91
91
|
try:
|
|
92
92
|
with open(os.devnull, "w", encoding="utf8") as devnull:
|
|
93
|
-
|
|
93
|
+
pinky_output = (
|
|
94
94
|
subprocess.check_output(cmd, shell=True, stderr=devnull)
|
|
95
95
|
.strip()
|
|
96
96
|
.decode("utf-8")
|
|
97
97
|
)
|
|
98
98
|
except AttributeError:
|
|
99
99
|
pass
|
|
100
|
-
if
|
|
101
|
-
return
|
|
102
|
-
# When
|
|
103
|
-
return f"Login: {username}
|
|
100
|
+
if pinky_output:
|
|
101
|
+
return pinky_output
|
|
102
|
+
# When pinky fails, return something similar and usable
|
|
103
|
+
return f"Login name: {username} In real life: ?? ()"
|
|
104
104
|
|
|
105
105
|
|
|
106
|
-
def userinfo(username: str,
|
|
106
|
+
def userinfo(username: str, pinky_function: Callable) -> str:
|
|
107
107
|
"""Get information on a user based on the username
|
|
108
108
|
|
|
109
109
|
Args:
|
|
110
110
|
username: user shortname/loginname
|
|
111
|
-
|
|
112
|
-
from the system
|
|
111
|
+
pinky_function: Function handle that can provide output
|
|
112
|
+
from the system pinky program (/usr/bin/pinky).
|
|
113
113
|
The output must be a Unicode string
|
|
114
114
|
|
|
115
115
|
Returns:
|
|
116
|
-
str: String with full user name, organization from
|
|
116
|
+
str: String with full user name, organization from pinky output and
|
|
117
117
|
the shortname
|
|
118
118
|
"""
|
|
119
|
-
|
|
120
|
-
rex_with_org = re.compile(
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
119
|
+
pinky_output = pinky_function(username)
|
|
120
|
+
rex_with_org = re.compile(
|
|
121
|
+
r".*Login name:\s+(.*)\s+In real life:\s+(.*)\s+\((.*)\).*"
|
|
122
|
+
)
|
|
123
|
+
rex_no_org = re.compile(r".*Login name:\s+(.*)\s+In real life:\s+(.*)")
|
|
124
|
+
if rex_with_org.match(pinky_output):
|
|
125
|
+
matches = rex_with_org.match(pinky_output).groups() # type: ignore
|
|
126
|
+
fullname = matches[1].strip()
|
|
124
127
|
org = matches[2].strip()
|
|
128
|
+
elif rex_no_org.match(pinky_output):
|
|
129
|
+
matches = rex_no_org.match(pinky_output).groups() # type: ignore
|
|
130
|
+
fullname = matches[1].strip()
|
|
131
|
+
org = ""
|
|
125
132
|
else:
|
|
126
|
-
|
|
133
|
+
fullname = username
|
|
127
134
|
org = ""
|
|
128
|
-
|
|
135
|
+
|
|
129
136
|
return f"{fullname} ({org}) ({username})"
|
|
130
137
|
|
|
131
138
|
|
|
@@ -138,7 +145,7 @@ def show_status(status: str = "RUN", title: str = "Running", umax: int = 10) ->
|
|
|
138
145
|
print(
|
|
139
146
|
count[0],
|
|
140
147
|
userinfo( # lgtm [py/clear-text-logging-sensitive-data]
|
|
141
|
-
str(user),
|
|
148
|
+
str(user), call_pinky
|
|
142
149
|
),
|
|
143
150
|
)
|
|
144
151
|
print("- - - - - - - - - - -")
|
|
@@ -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
|
|
|
@@ -42,6 +42,7 @@ ALLOWLIST_KEYWORDS = {
|
|
|
42
42
|
"EXTREPGL",
|
|
43
43
|
"FIP",
|
|
44
44
|
"FIPNUM",
|
|
45
|
+
"FLUXNUM",
|
|
45
46
|
"GASADCO",
|
|
46
47
|
"GASADEC",
|
|
47
48
|
"GASCONC",
|
|
@@ -66,6 +67,10 @@ ALLOWLIST_KEYWORDS = {
|
|
|
66
67
|
"IONROCK",
|
|
67
68
|
"ISTNUM",
|
|
68
69
|
"KRNUMMF",
|
|
70
|
+
"KRO",
|
|
71
|
+
"KRORG",
|
|
72
|
+
"KRORW",
|
|
73
|
+
"KRW",
|
|
69
74
|
"LANGMPL",
|
|
70
75
|
"LANGMULC",
|
|
71
76
|
"LANGMULT",
|
|
@@ -100,6 +105,7 @@ ALLOWLIST_KEYWORDS = {
|
|
|
100
105
|
"LX",
|
|
101
106
|
"LY",
|
|
102
107
|
"LZ",
|
|
108
|
+
"MINPVV",
|
|
103
109
|
"MISCNUM",
|
|
104
110
|
"MLANG",
|
|
105
111
|
"MLANGSLV",
|
|
@@ -161,6 +167,8 @@ ALLOWLIST_KEYWORDS = {
|
|
|
161
167
|
"SATNUM",
|
|
162
168
|
"SFOAM",
|
|
163
169
|
"SGAS",
|
|
170
|
+
"SGCR",
|
|
171
|
+
"SGL",
|
|
164
172
|
"SGLPC",
|
|
165
173
|
"SGWCR",
|
|
166
174
|
"SKRO",
|
|
@@ -169,11 +177,16 @@ ALLOWLIST_KEYWORDS = {
|
|
|
169
177
|
"SKRW",
|
|
170
178
|
"SKRWR",
|
|
171
179
|
"SOCRS",
|
|
180
|
+
"SOGCR",
|
|
172
181
|
"SOLVCONC",
|
|
173
182
|
"SOLVFRAC",
|
|
174
183
|
"SOLWNUM",
|
|
175
184
|
"SORBFRAC",
|
|
176
185
|
"SORBPRES",
|
|
186
|
+
"SOWCR",
|
|
187
|
+
"SWCR",
|
|
188
|
+
"SWL",
|
|
189
|
+
"SWU",
|
|
177
190
|
"SPOLY",
|
|
178
191
|
"SSGCR",
|
|
179
192
|
"SSGL",
|
|
@@ -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()
|