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