subscript 1.3.0__tar.gz → 1.4.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.3.0 → subscript-1.4.0}/.github/workflows/codecov.yml +2 -2
- {subscript-1.3.0 → subscript-1.4.0}/.github/workflows/publish.yml +2 -2
- {subscript-1.3.0 → subscript-1.4.0}/.github/workflows/subscript.yml +2 -2
- {subscript-1.3.0 → subscript-1.4.0}/PKG-INFO +1 -2
- {subscript-1.3.0 → subscript-1.4.0}/pyproject.toml +0 -1
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/casegen_upcars/model.py +3 -3
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/csv_stack/csv_stack.py +1 -1
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/fmuobs/writers.py +7 -4
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/interp_relperm/interp_relperm.py +2 -2
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/params2csv/params2csv.py +98 -47
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/presentvalue/presentvalue.py +2 -2
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/prtvol2csv/prtvol2csv.py +5 -1
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/version.py +2 -2
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript.egg-info/PKG-INFO +1 -2
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript.egg-info/requires.txt +0 -1
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_params2csv.py +118 -13
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_ri_wellmod.py +18 -3
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_welltest_dpds.py +2 -2
- {subscript-1.3.0 → subscript-1.4.0}/.gitignore +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/.pylintrc +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/LICENSE +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/README.md +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/SECURITY.md +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/ci/testkomodo.sh +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/Makefile +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/_static/equinor-logo.png +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/_static/equinor-logo2.jpg +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/_static/equinor-logo2.png +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/_static/equinor_logo.jpg +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/_static/equinor_logo_only.jpg +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/_templates/layout.html +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/conf.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/contributing.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/history.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/index.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/make.bat +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/overview.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/bjobsusers.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/casegen_upcars.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/check_swatinit.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/convert_grid_format.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/csv2ofmvol.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/csv_merge.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/csv_stack.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/eclcompress.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/ecldiff2roff.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/fmu_copy_revision.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/fmuobs.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/images/Pack_sim_overview.png +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/images/Summaryplot-ensemble.png +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/images/Summaryplot-ert.png +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/images/Summaryplot-normalizeexample.png +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/images/Workflow_sector2fluxnum.png +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/images/casegen_upcars_geometry.png +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/images/check_swatinit_scatter.png +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/images/check_swatinit_volplot.png +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/images/ecl-swat-initialization.png +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/images/make_check_swatinit_images.sh +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/images/resinsight_wells_project_example.png +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/interp_relperm.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/merge_rft_ertobs.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/merge_unrst_files.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/ofmvol2csv.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/pack_sim.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/params2csv.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/presentvalue.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/prtvol2csv.csv +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/prtvol2csv.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/restartthinner.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/ri_wellmod.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/rmsecl_volumetrics.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/runeclipse.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/runrms.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/sector2fluxnum.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/summaryplot.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/sunsch.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/sw_model_utilities.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/vfp2csv.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/scripts/welltest_dpds.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/docs/usage.rst +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/setup.cfg +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/bjobsusers/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/bjobsusers/bjobsusers.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/casegen_upcars/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/casegen_upcars/casegen_upcars.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/casegen_upcars/udf.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/casegen_upcars/udf_arg_parser.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/check_swatinit/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/check_swatinit/check_swatinit.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/check_swatinit/constants.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/check_swatinit/pillarmodel.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/check_swatinit/plotter.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/config_jobs/CASEGEN_UPCARS +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/config_jobs/CHECK_SWATINIT +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/config_jobs/CSV2OFMVOL +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/config_jobs/CSV_STACK +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/config_jobs/ECLCOMPRESS +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/config_jobs/ECLDIFF2ROFF +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/config_jobs/ECLGRID2ROFF +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/config_jobs/ECLINIT2ROFF +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/config_jobs/ECLRST2ROFF +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/config_jobs/INTERP_RELPERM +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/config_jobs/MERGE_RFT_ERTOBS +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/config_jobs/MERGE_UNRST_FILES +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/config_jobs/OFMVOL2CSV +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/config_jobs/PARAMS2CSV +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/config_jobs/PRTVOL2CSV +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/config_jobs/RI_WELLMOD +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/config_jobs/SUNSCH +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/config_jobs/WELLTEST_DPDS +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/convert_grid_format/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/convert_grid_format/convert_grid_format.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/csv2ofmvol/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/csv2ofmvol/csv2ofmvol.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/csv_merge/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/csv_merge/csv_merge.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/csv_stack/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/eclcompress/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/eclcompress/allowlist.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/eclcompress/eclcompress.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/ecldiff2roff/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/ecldiff2roff/ecldiff2roff.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/eclgrid2roff/eclgrid2roff.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/eclinit2roff/eclinit2roff.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/eclrst2roff/eclrst2roff.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/fmu_copy_revision/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/fmu_copy_revision/fmu_copy_revision.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/fmuobs/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/fmuobs/fmuobs.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/fmuobs/parsers.py +1 -1
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/fmuobs/util.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/hook_implementations/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/hook_implementations/jobs.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/interp_relperm/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/legacy/duf +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/legacy/eclmanual +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/legacy/ertwatch +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/legacy/list_rms_usage +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/legacy/nosim +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/legacy/runeclipse +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/merge_rft_ertobs/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/merge_rft_ertobs/merge_rft_ertobs.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/merge_unrst_files/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/merge_unrst_files/merge_unrst_files.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/ofmvol2csv/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/ofmvol2csv/ofmvol2csv.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/pack_sim/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/pack_sim/pack_sim.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/params2csv/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/presentvalue/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/prtvol2csv/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/restartthinner/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/restartthinner/restartthinner.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/ri_wellmod/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/ri_wellmod/ri_wellmod.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/rmsecl_volumetrics/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/rmsecl_volumetrics/rmsecl_volumetrics.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/runrms/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/runrms/runrms.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/sector2fluxnum/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/sector2fluxnum/completions.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/sector2fluxnum/datafile_obj.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/sector2fluxnum/flux_obj.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/sector2fluxnum/flux_util.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/sector2fluxnum/fluxfile_obj.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/sector2fluxnum/sector2fluxnum.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/summaryplot/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/summaryplot/summaryplot.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/sunsch/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/sunsch/sunsch.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/sunsch/time_vector.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/sw_model_utilities/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/sw_model_utilities/sw_model_utilities.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/vfp2csv/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/vfp2csv/vfp2csv.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/welltest_dpds/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript/welltest_dpds/welltest_dpds.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript.egg-info/SOURCES.txt +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript.egg-info/dependency_links.txt +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript.egg-info/entry_points.txt +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/src/subscript.egg-info/top_level.txt +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/__init__.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/conftest.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/include/grid/reek.faults +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/include/grid/reek.grid +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/include/grid/reek.multflt +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/include/grid/reek.multz +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/include/grid/reek.perm +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/include/grid/reek.poro +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/include/props/let-sgof.txt +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/include/props/let-swof.txt +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/include/props/reek.endpoints +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/include/props/reek.pvt +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/include/props/reek.swatinit +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/include/props/sgof.txt +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/include/props/swof.inc +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/include/props/swof.txt +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/include/regions/reek.eqlnum +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/include/regions/reek.fipnum +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/include/schedule/reek_history.sch +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/include/solution/reek.equil +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/include/summary/reek.smry +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.DATA +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.ECLEND +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.EGRID +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.INIT +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.LOG +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.PRT +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.RFT +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.SMSPEC +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.UNRST +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/model/2_R001_REEK-0.UNSMRY +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/eclipse/model/parameters.txt +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/parameters.txt +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/rms/README +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/rms/reek.rms10.1.3/.master +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/reek/rms/reek.rms11.1.0/.master +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/vfp/GasProd.VFP +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/vfp/pd2.VFP +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/welltest/eclipse/model/DROGON_DST_PLT-0.SMSPEC +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/data/welltest/eclipse/model/DROGON_DST_PLT-0.UNSMRY +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_bjobsusers.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_casegen_upcars.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_check_swatinit.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_check_swatinit_simulators.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_convert_grid_format.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_csv2ofmvol.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_csv_merge.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_csv_stack.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_docs.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_eclcompress.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_ecldiff2roff.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_fmu_copy_revision.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_fmuobs.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_fmuobs_parsers.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_fmuobs_writers.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_hook_implementations.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_interp_relperm.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_merge_rft_ertobs.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_merge_unrst_files.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_ofmvol2csv.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_pack_sim.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_presentvalue.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_prtvol2csv.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_restartthinner.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_rmsecl_volumetrics.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_runrms.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_sector2fluxnum.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_subscriptlogger.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_summaryplot.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_sunsch.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_sw_model_utilities.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/test_vfp2csv.py +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_casegen_upcars/demo_large_scale.yaml +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_casegen_upcars/demo_small_scale.yaml +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_casegen_upcars/dump_value.tmpl +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_casegen_upcars/upcars_eclipse_ref_lg.tmpl +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_casegen_upcars/upcars_eclipse_ref_ss.tmpl +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_eclcompress/permxyz.grdecl +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_fmuobs/drogon_wbhp_rft_wct_gor_tracer_4d.obs +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_fmuobs/ert-doc.csv +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_fmuobs/ert-doc.obs +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_fmuobs/ert-doc.yml +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_fmuobs/fmu-ensemble-obs.yml +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_fmuobs/hist_obs_wells.txt +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_fmuobs/ri-obs.csv +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_interp_relperm/cfg.yml +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_interp_relperm/sgof_base.inc +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_interp_relperm/sgof_opt.inc +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_interp_relperm/sgof_pes.inc +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_interp_relperm/swof_base.inc +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_interp_relperm/swof_opt.inc +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_interp_relperm/swof_pes.inc +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_merge_rft_ertobs/drogon/gendata_rft.csv +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A2.obs +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A2.txt +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A3.obs +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A3.txt +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A4.txt +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A4_1.obs +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A5.obs +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A5.txt +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A6.obs +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_merge_rft_ertobs/drogon/rft/R_A6.txt +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_merge_rft_ertobs/drogon/rft/well_date_rft.txt +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_merge_unrst_files/HIST.UNRST +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_merge_unrst_files/PRED.UNRST +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_ofmvol2csv/fileA.vol +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_ofmvol2csv/fileB.vol +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_ofmvol2csv/fileC.vol +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_ofmvol2csv/ofm_example.vol +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_ri_wellmod/drogon_include/grid/drogon.grid.grdecl +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_ri_wellmod/drogon_include/grid/drogon.ntg.grdecl +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_ri_wellmod/drogon_include/grid/drogon.perm.grdecl +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_ri_wellmod/drogon_trajectories/rft_wells.dat +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_ri_wellmod/drogon_trajectories/wells.dat +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_ri_wellmod/drogon_wells_noicd.rsp +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_ri_wellmod/reek_trajectories/reek_wells.dat +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_ri_wellmod/ri_reek_wells.rsp +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_runrms/runrms.yml +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_sector2fluxnum/DUMPFLUX_TEST.DATA +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_sector2fluxnum/DUMPFLUX_TEST.EGRID +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_sector2fluxnum/DUMPFLUX_TEST.FLUX +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_sector2fluxnum/OUT_COARSE.FLUX +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_sector2fluxnum/TEST.DATA +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_sector2fluxnum/TEST.EGRID +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_sector2fluxnum/TEST.INIT +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_sector2fluxnum/TEST.UNRST +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_sunsch/config.yml +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_sunsch/emptyinit.sch +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_sunsch/foo1.sch +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_sunsch/footemplate.sch +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_sunsch/initwithdates.sch +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_sunsch/merge2.sch +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_sunsch/mergeme.sch +0 -0
- {subscript-1.3.0 → subscript-1.4.0}/tests/testdata_sunsch/options3.sch +0 -0
|
@@ -16,12 +16,12 @@ jobs:
|
|
|
16
16
|
|
|
17
17
|
steps:
|
|
18
18
|
- name: Checkout
|
|
19
|
-
uses: actions/checkout@
|
|
19
|
+
uses: actions/checkout@v4
|
|
20
20
|
with:
|
|
21
21
|
fetch-depth: 0
|
|
22
22
|
|
|
23
23
|
- name: Set up Python 3.8
|
|
24
|
-
uses: actions/setup-python@
|
|
24
|
+
uses: actions/setup-python@v5
|
|
25
25
|
with:
|
|
26
26
|
python-version: 3.8
|
|
27
27
|
|
|
@@ -26,12 +26,12 @@ jobs:
|
|
|
26
26
|
|
|
27
27
|
steps:
|
|
28
28
|
- name: Checkout commit locally
|
|
29
|
-
uses: actions/checkout@
|
|
29
|
+
uses: actions/checkout@v4
|
|
30
30
|
with:
|
|
31
31
|
fetch-depth: 0
|
|
32
32
|
|
|
33
33
|
- name: Set up Python ${{ matrix.python-version }}
|
|
34
|
-
uses: actions/setup-python@
|
|
34
|
+
uses: actions/setup-python@v5
|
|
35
35
|
with:
|
|
36
36
|
python-version: ${{ matrix.python-version }}
|
|
37
37
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: subscript
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.4.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
|
|
@@ -713,7 +713,6 @@ Requires-Dist: scipy
|
|
|
713
713
|
Requires-Dist: seaborn
|
|
714
714
|
Requires-Dist: segyio
|
|
715
715
|
Requires-Dist: shapely
|
|
716
|
-
Requires-Dist: urllib3<2
|
|
717
716
|
Requires-Dist: xlrd
|
|
718
717
|
Requires-Dist: xtgeo
|
|
719
718
|
Provides-Extra: tests
|
|
@@ -950,7 +950,7 @@ Initializing model
|
|
|
950
950
|
low=near_fracture_vug_fraction_dist[0],
|
|
951
951
|
high=near_fracture_vug_fraction_dist[1],
|
|
952
952
|
size=1,
|
|
953
|
-
)
|
|
953
|
+
)[0]
|
|
954
954
|
* self._total_matrix_cells
|
|
955
955
|
)
|
|
956
956
|
)
|
|
@@ -1020,7 +1020,7 @@ Initializing model
|
|
|
1020
1020
|
low=near_streak_vug_fraction_dist[0],
|
|
1021
1021
|
high=near_streak_vug_fraction_dist[1],
|
|
1022
1022
|
size=1,
|
|
1023
|
-
)
|
|
1023
|
+
)[0]
|
|
1024
1024
|
* self._total_matrix_cells
|
|
1025
1025
|
)
|
|
1026
1026
|
)
|
|
@@ -1077,7 +1077,7 @@ Initializing model
|
|
|
1077
1077
|
low=random_vug_fraction_dist[0],
|
|
1078
1078
|
high=random_vug_fraction_dist[1],
|
|
1079
1079
|
size=1,
|
|
1080
|
-
)
|
|
1080
|
+
)[0]
|
|
1081
1081
|
* self._total_matrix_cells
|
|
1082
1082
|
)
|
|
1083
1083
|
)
|
|
@@ -319,7 +319,7 @@ def csv_stack(
|
|
|
319
319
|
# the rows that emerged from the stacking. If you use the
|
|
320
320
|
# 'all' pivottype, then you will get some NaN-values in the
|
|
321
321
|
# MultiIndex columns that are intentional.
|
|
322
|
-
dframe[nostackcolumnnames] = dframe[nostackcolumnnames].
|
|
322
|
+
dframe[nostackcolumnnames] = dframe[nostackcolumnnames].ffill()
|
|
323
323
|
|
|
324
324
|
dframe = dframe.reset_index()
|
|
325
325
|
|
|
@@ -291,10 +291,13 @@ def convert_dframe_date_to_str(dframe: pd.DataFrame) -> pd.DataFrame:
|
|
|
291
291
|
"""
|
|
292
292
|
if "DATE" in dframe:
|
|
293
293
|
dframe = dframe.copy()
|
|
294
|
-
dframe["DATE"] =
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
294
|
+
dframe["DATE"] = (
|
|
295
|
+
dframe["DATE"]
|
|
296
|
+
.astype(str)
|
|
297
|
+
.replace(["NaT", "NaN", "nan"], np.nan)
|
|
298
|
+
.infer_objects()
|
|
299
|
+
)
|
|
300
|
+
|
|
298
301
|
return dframe
|
|
299
302
|
|
|
300
303
|
|
|
@@ -186,7 +186,7 @@ def make_wateroilgas(dframe: pd.DataFrame, delta_s: float) -> pyscal.WaterOilGas
|
|
|
186
186
|
.sort_index()
|
|
187
187
|
.dropna(how="all")
|
|
188
188
|
.interpolate(method="index")
|
|
189
|
-
.
|
|
189
|
+
.bfill()
|
|
190
190
|
.round(8)
|
|
191
191
|
.drop_duplicates()
|
|
192
192
|
.reset_index()
|
|
@@ -197,7 +197,7 @@ def make_wateroilgas(dframe: pd.DataFrame, delta_s: float) -> pyscal.WaterOilGas
|
|
|
197
197
|
.sort_index()
|
|
198
198
|
.dropna(how="all")
|
|
199
199
|
.interpolate(method="index")
|
|
200
|
-
.
|
|
200
|
+
.bfill()
|
|
201
201
|
.round(8)
|
|
202
202
|
.drop_duplicates()
|
|
203
203
|
.reset_index()
|
|
@@ -4,11 +4,13 @@ data, ensuring labels for each value matches).
|
|
|
4
4
|
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
7
9
|
import argparse
|
|
8
10
|
import logging
|
|
9
|
-
import re
|
|
10
11
|
import shutil
|
|
11
12
|
from glob import glob
|
|
13
|
+
from pathlib import Path
|
|
12
14
|
|
|
13
15
|
import pandas as pd
|
|
14
16
|
from ert.config import ErtScript
|
|
@@ -27,7 +29,7 @@ parameters.txt is a text file with <key> <value> on each line
|
|
|
27
29
|
In the CSV file, each individual parameter file will be represented by one data row.
|
|
28
30
|
The order of parameters in each text file is not conserved.
|
|
29
31
|
|
|
30
|
-
The original filename for each file is written to the column
|
|
32
|
+
The original filename for each file is written to the column 'filename'.
|
|
31
33
|
Beware if you have that as a <key> in the text files.
|
|
32
34
|
"""
|
|
33
35
|
|
|
@@ -55,15 +57,31 @@ The `filename` column can be renamed by adding an argument <FILENAMECOLUMN> to t
|
|
|
55
57
|
# The following string is used for the ERT workflow documentation, note
|
|
56
58
|
# the very subtle difference in variable name.
|
|
57
59
|
WORKFLOW_EXAMPLE = """
|
|
58
|
-
Add a file named e.g. ``ert/bin/workflows/
|
|
60
|
+
Add a file named e.g. ``ert/bin/workflows/wf_params2csv_iter0`` with the contents::
|
|
61
|
+
|
|
59
62
|
MAKE_DIRECTORY <SCRATCH>/<USER>/<CASE_DIR>/share/results/tables
|
|
60
63
|
PARAMS2CSV "--verbose" "-o" <SCRATCH>/<USER>/<CASE_DIR>/share/results/tables/parameters_iter-0.csv <SCRATCH>/<USER>/<CASE_DIR>/realization-*/iter-0/parameters.txt
|
|
61
64
|
|
|
62
65
|
Add to your ERT config to have the workflow loaded upon launching::
|
|
63
66
|
|
|
64
|
-
LOAD_WORKFLOW ../bin/workflows/
|
|
67
|
+
LOAD_WORKFLOW ../bin/workflows/wf_params2csv_iter0
|
|
68
|
+
|
|
69
|
+
It is then possible to run the workflow either through ERT CLI or GUI.
|
|
70
|
+
|
|
71
|
+
Wildcards can be used to extract parameters from multiple iterations,
|
|
72
|
+
this is done in the example below. Note also the use of ``HOOK_WORKFLOW`` to automatically
|
|
73
|
+
run the workflow when all realizations have finished.
|
|
74
|
+
|
|
75
|
+
Add a file named e.g. ``ert/bin/workflows/wf_params2csv_hist`` with the contents::
|
|
76
|
+
|
|
77
|
+
MAKE_DIRECTORY <SCRATCH>/<USER>/<CASE_DIR>/share/results/tables
|
|
78
|
+
PARAMS2CSV "--verbose" "-o" <SCRATCH>/<USER>/<CASE_DIR>/share/results/tables/parameters_hist.csv <SCRATCH>/<USER>/<CASE_DIR>/realization-*/iter-*/parameters.txt
|
|
79
|
+
|
|
80
|
+
Add to your ERT config to have the workflow automatically executed on successful runs::
|
|
81
|
+
|
|
82
|
+
LOAD_WORKFLOW ../bin/workflows/wf_params2csv_hist
|
|
83
|
+
HOOK_WORKFLOW wf_params2csv_hist POST_SIMULATION
|
|
65
84
|
|
|
66
|
-
It is then possible to run the workflow either through ERT CLI or GUI.
|
|
67
85
|
""" # noqa
|
|
68
86
|
|
|
69
87
|
|
|
@@ -153,26 +171,33 @@ def params2csv_main(args: argparse.Namespace) -> None:
|
|
|
153
171
|
if args.verbose:
|
|
154
172
|
logger.setLevel(logging.INFO)
|
|
155
173
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
174
|
+
possible_metadata_columns = [
|
|
175
|
+
"ENSEMBLESET",
|
|
176
|
+
"REAL",
|
|
177
|
+
"ENSEMBLE",
|
|
178
|
+
"ITER",
|
|
179
|
+
args.filenamecolumnname,
|
|
159
180
|
]
|
|
160
181
|
|
|
161
|
-
|
|
182
|
+
# Expand wildcards if not being expanded
|
|
183
|
+
paramfile_paths = [
|
|
184
|
+
Path(path) for pattern in args.parameterfile for path in sorted(glob(pattern))
|
|
185
|
+
]
|
|
162
186
|
|
|
163
|
-
|
|
164
|
-
for
|
|
165
|
-
|
|
166
|
-
paramtable = pd.read_csv(parameterfilename, header=None, sep=r"\s+")
|
|
167
|
-
parsedfiles = parsedfiles + 1
|
|
168
|
-
except IOError:
|
|
187
|
+
dfs = []
|
|
188
|
+
for parameterfilename in paramfile_paths:
|
|
189
|
+
if not parameterfilename.exists():
|
|
169
190
|
logger.warning("%s not found, skipping..", parameterfilename)
|
|
170
191
|
continue
|
|
171
192
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
193
|
+
paramtable = pd.read_csv(
|
|
194
|
+
parameterfilename,
|
|
195
|
+
names=["key", "value"],
|
|
196
|
+
header=None,
|
|
197
|
+
usecols=[0, 1],
|
|
198
|
+
sep=r"\s+",
|
|
199
|
+
)
|
|
200
|
+
|
|
176
201
|
paramtable.drop_duplicates(
|
|
177
202
|
"key", keep="last", inplace=True
|
|
178
203
|
) # if key is repeated, keep the last one.
|
|
@@ -185,28 +210,28 @@ def params2csv_main(args: argparse.Namespace) -> None:
|
|
|
185
210
|
parameterfilename,
|
|
186
211
|
)
|
|
187
212
|
else:
|
|
188
|
-
transposed
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
"Iter",
|
|
206
|
-
re.match(iterregex, parameterfilename).group(1), # type: ignore
|
|
207
|
-
)
|
|
213
|
+
transposed[args.filenamecolumnname] = str(parameterfilename)
|
|
214
|
+
|
|
215
|
+
path_metadata = get_metadata_from_path(parameterfilename.resolve())
|
|
216
|
+
if path_metadata is not None:
|
|
217
|
+
case_folder, iter_folder, iteration, real = path_metadata
|
|
218
|
+
transposed["ENSEMBLESET"] = case_folder
|
|
219
|
+
transposed["ENSEMBLE"] = iter_folder
|
|
220
|
+
transposed["ITER"] = iteration
|
|
221
|
+
transposed["REAL"] = real
|
|
222
|
+
dfs.append(transposed)
|
|
223
|
+
|
|
224
|
+
if not dfs:
|
|
225
|
+
raise ValueError("No parameterfiles was found, check the input path provided")
|
|
226
|
+
ens = pd.concat(dfs)
|
|
227
|
+
|
|
228
|
+
metadata_columns = [col for col in possible_metadata_columns if col in ens]
|
|
229
|
+
parameter_columns = [col for col in ens.columns if col not in metadata_columns]
|
|
208
230
|
|
|
209
|
-
|
|
231
|
+
# reorder dataframe and sort by ensemble and realization if present
|
|
232
|
+
ens = ens[metadata_columns + parameter_columns]
|
|
233
|
+
if "REAL" in metadata_columns:
|
|
234
|
+
ens = ens.sort_values(["ENSEMBLE", "REAL"])
|
|
210
235
|
|
|
211
236
|
if args.clean:
|
|
212
237
|
# Users wants the script to write back to parameters.txt a
|
|
@@ -214,23 +239,21 @@ def params2csv_main(args: argparse.Namespace) -> None:
|
|
|
214
239
|
# parameters is equal in an entire ensemble, and so that
|
|
215
240
|
# duplicate keys are removed Parameters only existing in some
|
|
216
241
|
# realizations will be NaN-padded in the others.
|
|
217
|
-
|
|
218
|
-
ensidx = ens.reset_index().drop(["index", "filename"], axis=1)
|
|
219
|
-
for row in list(ensidx.index.values):
|
|
220
|
-
paramfile = ensfilenames.loc[row]
|
|
242
|
+
for paramfile, realdf in ens.groupby(args.filenamecolumnname):
|
|
221
243
|
shutil.copyfile(paramfile, paramfile + ".backup")
|
|
222
244
|
logger.info("Writing to %s", paramfile)
|
|
223
|
-
|
|
245
|
+
realdf = realdf[parameter_columns].transpose()
|
|
246
|
+
realdf.to_csv(paramfile, sep=" ", na_rep="NaN", header=False)
|
|
224
247
|
|
|
225
248
|
# Drop constant columns:
|
|
226
249
|
if not args.keepconstantcolumns:
|
|
227
|
-
for col in
|
|
250
|
+
for col in parameter_columns:
|
|
228
251
|
if len(ens[col].unique()) == 1:
|
|
229
252
|
del ens[col]
|
|
230
253
|
logger.warning("Dropping constant column %s", col)
|
|
231
254
|
|
|
232
255
|
ens.to_csv(args.output, index=False)
|
|
233
|
-
logger.info("%s parameterfiles written to %s",
|
|
256
|
+
logger.info("%s parameterfiles written to %s", len(dfs), args.output)
|
|
234
257
|
|
|
235
258
|
|
|
236
259
|
def main() -> None:
|
|
@@ -251,5 +274,33 @@ def legacy_ertscript_workflow(config) -> None:
|
|
|
251
274
|
workflow.category = CATEGORY
|
|
252
275
|
|
|
253
276
|
|
|
277
|
+
def get_metadata_from_path(paramfile: Path) -> tuple[str, str, int, int] | None:
|
|
278
|
+
"""Get some metadata from the Path object"""
|
|
279
|
+
|
|
280
|
+
real_path = get_realization_path(paramfile)
|
|
281
|
+
if not real_path:
|
|
282
|
+
return None
|
|
283
|
+
|
|
284
|
+
real = get_number_from_folder(real_path.stem)
|
|
285
|
+
case_folder = real_path.parent.stem
|
|
286
|
+
|
|
287
|
+
# if real folder is direct parent to runpath, there is no iter
|
|
288
|
+
iter_folder = paramfile.parent.stem if real_path != paramfile.parent else "iter-0"
|
|
289
|
+
iteration = (
|
|
290
|
+
get_number_from_folder(iter_folder) if iter_folder.startswith("iter-") else 0
|
|
291
|
+
)
|
|
292
|
+
return case_folder, iter_folder, iteration, real
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
def get_realization_path(path: Path) -> Path | None:
|
|
296
|
+
"""Retrive the realization path, return None if not found"""
|
|
297
|
+
return next((p for p in path.parents if p.stem.startswith("realization-")), None)
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def get_number_from_folder(foldername: str) -> int:
|
|
301
|
+
"""Retrive the integer after the '-' from the folder name"""
|
|
302
|
+
return int(foldername.split("-")[-1])
|
|
303
|
+
|
|
304
|
+
|
|
254
305
|
if __name__ == "__main__":
|
|
255
306
|
main()
|
|
@@ -369,13 +369,13 @@ def calc_presentvalue_df(
|
|
|
369
369
|
prodecon = pd.concat([summary_df, econ_df], axis=1, sort=True)
|
|
370
370
|
prodecon[["oilprice", "gasprice", "usdtonok", "discountrate"]] = prodecon[
|
|
371
371
|
["oilprice", "gasprice", "usdtonok", "discountrate"]
|
|
372
|
-
].
|
|
372
|
+
].ffill()
|
|
373
373
|
# Avoid ffilling costs...
|
|
374
374
|
# There could be situations where we need to bfill prices as well,
|
|
375
375
|
# if the user provided a econtable
|
|
376
376
|
prodecon[["oilprice", "gasprice", "usdtonok", "discountrate"]] = prodecon[
|
|
377
377
|
["oilprice", "gasprice", "usdtonok", "discountrate"]
|
|
378
|
-
].
|
|
378
|
+
].bfill()
|
|
379
379
|
prodecon.fillna(value=0, inplace=True) # Zero-pad other data (costs)
|
|
380
380
|
|
|
381
381
|
prodecon["deltayears"] = prodecon.index - discountto
|
|
@@ -323,7 +323,11 @@ def prtvol2df(
|
|
|
323
323
|
and add REGION and ZONE parameter.
|
|
324
324
|
"""
|
|
325
325
|
# Concatenate dataframes horizontally. Both are/must be indexed by FIPNUM:
|
|
326
|
-
volumes =
|
|
326
|
+
volumes = (
|
|
327
|
+
pd.concat([simvolumes_df, resvolumes_df], axis=1)
|
|
328
|
+
.apply(pd.to_numeric)
|
|
329
|
+
.fillna(value=0.0)
|
|
330
|
+
)
|
|
327
331
|
|
|
328
332
|
if fipmapper is not None:
|
|
329
333
|
if fipmapper.has_fip2region:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: subscript
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.4.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
|
|
@@ -713,7 +713,6 @@ Requires-Dist: scipy
|
|
|
713
713
|
Requires-Dist: seaborn
|
|
714
714
|
Requires-Dist: segyio
|
|
715
715
|
Requires-Dist: shapely
|
|
716
|
-
Requires-Dist: urllib3<2
|
|
717
716
|
Requires-Dist: xlrd
|
|
718
717
|
Requires-Dist: xtgeo
|
|
719
718
|
Provides-Extra: tests
|
|
@@ -15,6 +15,15 @@ except ImportError:
|
|
|
15
15
|
HAVE_ERT = False
|
|
16
16
|
|
|
17
17
|
|
|
18
|
+
ERT_CONFIG_WF = [
|
|
19
|
+
"QUEUE_SYSTEM LOCAL",
|
|
20
|
+
"NUM_REALIZATIONS 1",
|
|
21
|
+
"RUNPATH <CONFIG_PATH>",
|
|
22
|
+
"",
|
|
23
|
+
"LOAD_WORKFLOW wf_params2csv",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
|
|
18
27
|
def test_main(tmp_path, mocker):
|
|
19
28
|
"""Test invocation from command line"""
|
|
20
29
|
os.chdir(tmp_path)
|
|
@@ -165,7 +174,7 @@ def test_ert_workflow(tmp_path):
|
|
|
165
174
|
f"real\t{i}", encoding="utf8"
|
|
166
175
|
)
|
|
167
176
|
|
|
168
|
-
Path("
|
|
177
|
+
Path("wf_params2csv").write_text(
|
|
169
178
|
(
|
|
170
179
|
'PARAMS2CSV "-o" <CONFIG_PATH>/parameters.csv '
|
|
171
180
|
"<CONFIG_PATH>/realization-*/iter-0/parameters.txt"
|
|
@@ -173,20 +182,116 @@ def test_ert_workflow(tmp_path):
|
|
|
173
182
|
)
|
|
174
183
|
|
|
175
184
|
ert_config_fname = "test_params2csv.ert"
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
"NUM_REALIZATIONS 1",
|
|
179
|
-
"RUNPATH <CONFIG_PATH>",
|
|
180
|
-
"",
|
|
181
|
-
"LOAD_WORKFLOW PARAMS2CSV_ITER0",
|
|
182
|
-
]
|
|
183
|
-
Path(ert_config_fname).write_text("\n".join(ert_config), encoding="utf8")
|
|
184
|
-
subprocess.run(
|
|
185
|
-
["ert", "workflow", "PARAMS2CSV_ITER0", ert_config_fname], check=True
|
|
186
|
-
)
|
|
185
|
+
Path(ert_config_fname).write_text("\n".join(ERT_CONFIG_WF), encoding="utf8")
|
|
186
|
+
subprocess.run(["ert", "workflow", "wf_params2csv", ert_config_fname], check=True)
|
|
187
187
|
|
|
188
188
|
dframe = pd.read_csv("parameters.csv")
|
|
189
189
|
assert not dframe.empty
|
|
190
|
-
assert "
|
|
190
|
+
assert "REAL" in dframe
|
|
191
191
|
assert "real" in dframe
|
|
192
192
|
assert len(dframe.index) == realizations
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
@pytest.mark.integration
|
|
196
|
+
@pytest.mark.skipif(not HAVE_ERT, reason="Requires ERT to be installed")
|
|
197
|
+
def test_ert_workflow_multiple_iter(tmp_path):
|
|
198
|
+
"""
|
|
199
|
+
Test that PARAMS2CSV can be run as an ERT workflow/plugin on
|
|
200
|
+
multiple iterations.
|
|
201
|
+
"""
|
|
202
|
+
os.chdir(tmp_path)
|
|
203
|
+
|
|
204
|
+
realizations = 3
|
|
205
|
+
for i in range(realizations):
|
|
206
|
+
Path(f"realization-{i}/iter-0").mkdir(parents=True)
|
|
207
|
+
Path(f"realization-{i}/iter-0/parameters.txt").write_text(
|
|
208
|
+
f"myparam\t{i}", encoding="utf8"
|
|
209
|
+
)
|
|
210
|
+
Path(f"realization-{i}/iter-1").mkdir(parents=True)
|
|
211
|
+
Path(f"realization-{i}/iter-1/parameters.txt").write_text(
|
|
212
|
+
f"myparam\t{i}", encoding="utf8"
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
Path("wf_params2csv").write_text(
|
|
216
|
+
(
|
|
217
|
+
'PARAMS2CSV "-o" <CONFIG_PATH>/parameters.csv '
|
|
218
|
+
"<CONFIG_PATH>/realization-*/iter-*/parameters.txt"
|
|
219
|
+
)
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
ert_config_fname = "test_params2csv.ert"
|
|
223
|
+
Path(ert_config_fname).write_text("\n".join(ERT_CONFIG_WF), encoding="utf8")
|
|
224
|
+
subprocess.run(["ert", "workflow", "wf_params2csv", ert_config_fname], check=True)
|
|
225
|
+
|
|
226
|
+
dframe = pd.read_csv("parameters.csv")
|
|
227
|
+
assert not dframe.empty
|
|
228
|
+
assert "myparam" in dframe
|
|
229
|
+
assert set(dframe["REAL"].unique()) == {0, 1, 2}
|
|
230
|
+
assert set(dframe["ENSEMBLESET"].unique()) == {tmp_path.stem}
|
|
231
|
+
assert set(dframe["ENSEMBLE"].unique()) == {"iter-0", "iter-1"}
|
|
232
|
+
assert set(dframe["ITER"].unique()) == {0, 1}
|
|
233
|
+
assert len(dframe.index) == realizations * 2
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
@pytest.mark.integration
|
|
237
|
+
@pytest.mark.skipif(not HAVE_ERT, reason="Requires ERT to be installed")
|
|
238
|
+
def test_ert_workflow_pred_params(tmp_path):
|
|
239
|
+
"""Test that PARAMS2CSV can be run on folders not starting with iter"""
|
|
240
|
+
os.chdir(tmp_path)
|
|
241
|
+
|
|
242
|
+
realizations = 3
|
|
243
|
+
for i in range(realizations):
|
|
244
|
+
Path(f"realization-{i}/pred").mkdir(parents=True)
|
|
245
|
+
Path(f"realization-{i}/pred/parameters.txt").write_text(
|
|
246
|
+
f"myparam\t{i}", encoding="utf8"
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
Path("wf_params2csv").write_text(
|
|
250
|
+
(
|
|
251
|
+
'PARAMS2CSV "-o" <CONFIG_PATH>/parameters.csv '
|
|
252
|
+
"<CONFIG_PATH>/realization-*/pred/parameters.txt"
|
|
253
|
+
)
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
ert_config_fname = "test_params2csv.ert"
|
|
257
|
+
Path(ert_config_fname).write_text("\n".join(ERT_CONFIG_WF), encoding="utf8")
|
|
258
|
+
subprocess.run(["ert", "workflow", "wf_params2csv", ert_config_fname], check=True)
|
|
259
|
+
|
|
260
|
+
dframe = pd.read_csv("parameters.csv")
|
|
261
|
+
assert not dframe.empty
|
|
262
|
+
assert "myparam" in dframe
|
|
263
|
+
assert set(dframe["REAL"].unique()) == {0, 1, 2}
|
|
264
|
+
assert set(dframe["ENSEMBLE"].unique()) == {"pred"}
|
|
265
|
+
assert set(dframe["ITER"].unique()) == {0}
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
@pytest.mark.integration
|
|
269
|
+
@pytest.mark.skipif(not HAVE_ERT, reason="Requires ERT to be installed")
|
|
270
|
+
def test_ert_workflow_no_iter_folder(tmp_path):
|
|
271
|
+
"""Test that PARAMS2CSV can be run on cases without iteration folders"""
|
|
272
|
+
os.chdir(tmp_path)
|
|
273
|
+
|
|
274
|
+
realizations = 3
|
|
275
|
+
for i in range(realizations):
|
|
276
|
+
Path(f"realization-{i}").mkdir(parents=True)
|
|
277
|
+
Path(f"realization-{i}/parameters.txt").write_text(
|
|
278
|
+
f"myparam\t{i}", encoding="utf8"
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
Path("wf_params2csv").write_text(
|
|
282
|
+
(
|
|
283
|
+
'PARAMS2CSV "-o" <CONFIG_PATH>/parameters.csv '
|
|
284
|
+
"<CONFIG_PATH>/realization-*/parameters.txt"
|
|
285
|
+
)
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
ert_config_fname = "test_params2csv.ert"
|
|
289
|
+
Path(ert_config_fname).write_text("\n".join(ERT_CONFIG_WF), encoding="utf8")
|
|
290
|
+
subprocess.run(["ert", "workflow", "wf_params2csv", ert_config_fname], check=True)
|
|
291
|
+
|
|
292
|
+
dframe = pd.read_csv("parameters.csv")
|
|
293
|
+
assert not dframe.empty
|
|
294
|
+
assert "myparam" in dframe
|
|
295
|
+
assert set(dframe["REAL"].unique()) == {0, 1, 2}
|
|
296
|
+
assert set(dframe["ENSEMBLE"].unique()) == {"iter-0"}
|
|
297
|
+
assert set(dframe["ITER"].unique()) == {0}
|
|
@@ -5,11 +5,9 @@ from pathlib import Path
|
|
|
5
5
|
import pytest
|
|
6
6
|
from subscript.ri_wellmod import ri_wellmod
|
|
7
7
|
|
|
8
|
-
pytestmark = pytest.mark.xfail()
|
|
9
|
-
|
|
10
8
|
SCRIPTNAME = "ri_wellmod"
|
|
11
9
|
DATAPATH = Path(__file__).parent / "testdata_ri_wellmod"
|
|
12
|
-
RI_DEV = "/project/res/
|
|
10
|
+
RI_DEV = "/project/res/bin/resinsightdev"
|
|
13
11
|
|
|
14
12
|
try:
|
|
15
13
|
# pylint: disable=unused-import
|
|
@@ -62,6 +60,14 @@ def file_contains(filename, string_to_find):
|
|
|
62
60
|
return filetext.find(string_to_find) >= 0
|
|
63
61
|
|
|
64
62
|
|
|
63
|
+
def github_online_runner():
|
|
64
|
+
gh_runner = os.getenv("GITHUB_ACTIONS") == "true"
|
|
65
|
+
|
|
66
|
+
# we still want to run tests on github actions local (komodo) runners
|
|
67
|
+
local_gh_runner = "f_scout_ci" in str(os.getenv("RUNNER_NAME"))
|
|
68
|
+
return gh_runner and not local_gh_runner
|
|
69
|
+
|
|
70
|
+
|
|
65
71
|
@pytest.mark.integration
|
|
66
72
|
def test_integration():
|
|
67
73
|
"""Test that endpoint is installed"""
|
|
@@ -85,6 +91,9 @@ def test_main_initcase(tmp_path, mocker):
|
|
|
85
91
|
assert Path(outfile).exists() and file_contains(outfile, "A4")
|
|
86
92
|
|
|
87
93
|
|
|
94
|
+
@pytest.mark.skipif(
|
|
95
|
+
github_online_runner(), reason="Cannot test on github online runner"
|
|
96
|
+
)
|
|
88
97
|
@pytest.mark.skipif(
|
|
89
98
|
not has_resinsight(),
|
|
90
99
|
reason="Could not find a ResInsight executable",
|
|
@@ -232,6 +241,9 @@ def test_ert_forward_model(tmp_path):
|
|
|
232
241
|
|
|
233
242
|
|
|
234
243
|
# REEK TESTS
|
|
244
|
+
@pytest.mark.skipif(
|
|
245
|
+
github_online_runner(), reason="Cannot test on github online runner"
|
|
246
|
+
)
|
|
235
247
|
@pytest.mark.skipif(
|
|
236
248
|
not has_resinsight(), reason="Could not find a ResInsight executable"
|
|
237
249
|
)
|
|
@@ -248,6 +260,9 @@ def test_main_initcase_reek(tmp_path, mocker):
|
|
|
248
260
|
assert Path(outfile).exists() and file_contains(outfile, "OP_1")
|
|
249
261
|
|
|
250
262
|
|
|
263
|
+
@pytest.mark.skipif(
|
|
264
|
+
github_online_runner(), reason="Cannot test on github online runner"
|
|
265
|
+
)
|
|
251
266
|
@pytest.mark.skipif(
|
|
252
267
|
not has_resinsight(), reason="Could not find a ResInsight executable"
|
|
253
268
|
)
|
|
@@ -70,8 +70,8 @@ def test_main(tmp_path, mocker):
|
|
|
70
70
|
suptimew = pd.read_csv("spt.csv")
|
|
71
71
|
# pylint: disable=no-member
|
|
72
72
|
# (false positive)
|
|
73
|
-
assert suptimew.iloc[0
|
|
74
|
-
assert suptimew.iloc[-1
|
|
73
|
+
assert suptimew.iloc[0, 0] == pytest.approx(-9.87037983)
|
|
74
|
+
assert suptimew.iloc[-1, 0] == pytest.approx(-0.65693308)
|
|
75
75
|
Path("welltest_output.csv").unlink()
|
|
76
76
|
|
|
77
77
|
# test --genobs_resultfile
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|