res2df 1.3.1__tar.gz → 1.3.3__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.3}/.github/workflows/codecov.yml +6 -0
- {res2df-1.3.1 → res2df-1.3.3}/.github/workflows/res2df.yml +6 -0
- {res2df-1.3.1 → res2df-1.3.3}/PKG-INFO +3 -2
- {res2df-1.3.1 → res2df-1.3.3}/res2df/csv2res.py +0 -15
- {res2df-1.3.1 → res2df-1.3.3}/res2df/fipreports.py +14 -15
- {res2df-1.3.1 → res2df-1.3.3}/res2df/grid.py +2 -2
- {res2df-1.3.1 → res2df-1.3.3}/res2df/gruptree.py +1 -1
- res2df-1.3.3/res2df/hook_implementations/forward_model_steps.py +138 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/res2csv.py +0 -27
- {res2df-1.3.1 → res2df-1.3.3}/res2df/summary.py +5 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/version.py +9 -4
- {res2df-1.3.1 → res2df-1.3.3}/res2df/vfp/_vfpinj.py +4 -2
- {res2df-1.3.1 → res2df-1.3.3}/res2df/vfp/_vfpprod.py +4 -2
- {res2df-1.3.1 → res2df-1.3.3}/res2df.egg-info/PKG-INFO +3 -2
- {res2df-1.3.1 → res2df-1.3.3}/res2df.egg-info/SOURCES.txt +1 -4
- {res2df-1.3.1 → res2df-1.3.3}/res2df.egg-info/entry_points.txt +1 -1
- {res2df-1.3.1 → res2df-1.3.3}/ruff.toml +1 -0
- {res2df-1.3.1 → res2df-1.3.3}/setup.cfg +0 -4
- {res2df-1.3.1 → res2df-1.3.3}/setup.py +1 -2
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/fipreports/TEST1.PRT +52 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_ert_hooks.py +1 -35
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_fipreports.py +98 -0
- res2df-1.3.3/tests/test_hook_implementations.py +33 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_summary.py +57 -0
- res2df-1.3.1/.codacy.yml +0 -2
- 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.3}/.github/workflows/style.yml +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/.github/workflows/typing.yml +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/.gitignore +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/.pre-commit-config.yaml +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/CONTRIBUTING.md +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/LICENSE +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/README.md +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/SECURITY.md +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/ci/testkomodo.sh +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/_static/equinor-logo.png +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/_static/equinor-logo2.jpg +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/_static/equinor_logo.jpg +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/_static/equinor_logo_only.jpg +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/_templates/layout.html +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/conf.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/contribution.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/csv2res.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/glossary.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/history.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/index.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/installation.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/introduction.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/res2csv.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/compdat.csv +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/compdat.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/equil-example.csv +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/equil.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/fipnum.inc +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/fipreports-example.csv +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/fipreports-example.txt +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/fipreports.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/grid.csv +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/grid.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/gruptree.csv +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/gruptree.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/gruptreenet.csv +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/images/injectoranalysis.png +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/images/multibranch-rftanalysis.png +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/nnc.csv +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/nnc.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/outflow.csv +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/pillars-dyn1-stacked.csv +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/pillars-dyn1-unstacked.csv +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/pillars-example1.csv +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/pillars.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/pvt.csv +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/pvt.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/rft.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/rft_columns.csv +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/satfunc.csv +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/satfunc.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/summary.csv +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/summary.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/trans-boundaries.csv +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/trans-group.csv +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/trans.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/trans1.csv +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/wcon.csv +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/wcon.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/well_connection_status.csv +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage/wellconnstatus.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/docs/usage.rst +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/mypy.ini +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/py.typed +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/__init__.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/__version__.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/common.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/compdat.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/constants.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/equil.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/faults.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/hook_implementations/__init__.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/inferdims.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/nnc.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/BRANPROP +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/COMPDAT +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/COMPLUMP +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/COMPSEGS +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/DENSITY +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/EQLDIMS +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/EQUIL +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/FAULTS +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/GRUPNET +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/GRUPTREE +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/NODEPROP +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/PBVD +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/PDVD +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/PVDG +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/PVDO +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/PVTG +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/PVTO +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/PVTW +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/ROCK +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/RSVD +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/RVVD +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/SGFN +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/SGOF +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/SGWFN +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/SLGOF +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/SOF2 +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/SOF3 +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/SWFN +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/SWOF +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/TABDIMS +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/VFPINJ +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/VFPPROD +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/WCONHIST +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/WCONINJE +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/WCONINJH +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/WCONPROD +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/WELOPEN +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/WELSEGS +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/WELSPECS +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/WLIST +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/WSEGAICD +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/WSEGSICD +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/WSEGVALV +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/readme +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/opmkeywords/runmetoupdate.sh +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/parameters.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/pillars.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/pvt.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/res2csvlogger.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/resdatafiles.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/rft.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/satfunc.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/svg_color_keyword_names.txt +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/trans.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/vfp/__init__.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/vfp/_vfp.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/vfp/_vfpcommon.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/vfp/_vfpdefs.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/wcon.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/wellcompletiondata.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df/wellconnstatus.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df.egg-info/dependency_links.txt +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df.egg-info/not-zip-safe +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df.egg-info/requires.txt +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/res2df.egg-info/top_level.txt +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/test_requirements.txt +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/__init__.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/conftest.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/eightcells/EIGHTCELLS.DATA +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/eightcells/EIGHTCELLS.EGRID +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/eightcells/EIGHTCELLS.INIT +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/eightcells/EIGHTCELLS.INSPEC +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/eightcells/EIGHTCELLS.PRT +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/eightcells/EIGHTCELLS.RFT +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/eightcells/EIGHTCELLS.RSSPEC +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/eightcells/EIGHTCELLS.SMSPEC +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/eightcells/EIGHTCELLS.UNRST +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/eightcells/EIGHTCELLS.UNSMRY +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/eightcells/eightcells_duplicated_summary_vector/EIGHTCELLS_DUPES.DATA +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/eightcells/eightcells_duplicated_summary_vector/EIGHTCELLS_DUPES.SMSPEC +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/eightcells/eightcells_duplicated_summary_vector/EIGHTCELLS_DUPES.UNSMRY +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/eightcells/zones.lyr +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/grid/reek.faults +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/grid/reek.grid +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/grid/reek.multflt +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/grid/reek.multz +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/grid/reek.perm +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/grid/reek.poro +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/props/let-sgof.txt +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/props/let-swof.txt +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/props/reek.endpoints +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/props/reek.pvt +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/props/reek.swatinit +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/props/sgof.txt +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/props/swof.inc +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/props/swof.txt +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/regions/reek.eqlnum +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/regions/reek.fipnum +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/schedule/op6_aicd1_gp.sch +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/schedule/op6_icd1_gp.sch +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/schedule/op6_valve1_gp.sch +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/schedule/reek_history.sch +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/solution/reek.equil +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/include/summary/reek.smry +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/model/2_R001_REEK-0-OPMFLOW.PRT +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/model/2_R001_REEK-0.DATA +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/model/2_R001_REEK-0.ECLEND +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/model/2_R001_REEK-0.EGRID +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/model/2_R001_REEK-0.INIT +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/model/2_R001_REEK-0.LOG +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/model/2_R001_REEK-0.PRT +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/model/2_R001_REEK-0.RFT +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/model/2_R001_REEK-0.SMSPEC +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/model/2_R001_REEK-0.UNRST +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/model/2_R001_REEK-0.UNSMRY +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/reek/eclipse/model/zones.lyr +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/timesteps/SHORT_STEP.DATA +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/timesteps/SHORT_STEP.SMSPEC +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/timesteps/SHORT_STEP.UNSMRY +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/timesteps/SHORT_STEP_LONG.DATA +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/timesteps/SHORT_STEP_LONG.SMSPEC +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/timesteps/SHORT_STEP_LONG.UNSMRY +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/timesteps/SHORT_STEP_WITH_TIMESTEP.DATA +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/timesteps/SHORT_STEP_WITH_TIMESTEP.SMSPEC +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/timesteps/SHORT_STEP_WITH_TIMESTEP.UNSMRY +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/timesteps/SHORT_STEP_WITH_TIMESTEP_LONG.DATA +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/timesteps/SHORT_STEP_WITH_TIMESTEP_LONG.SMSPEC +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/data/timesteps/SHORT_STEP_WITH_TIMESTEP_LONG.UNSMRY +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_common.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_compdat.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_eclfiles.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_equil.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_faults.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_grid.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_gruptree.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_inferdims.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_init.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_integration.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_logging.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_nnc.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_parameters.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_pillars.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_pvt.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_rft.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_satfunc.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_summary_restarts.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_trans.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_userapi.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_vfp.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_wcon.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_wellcompletiondata.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_wellconnstatus.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_welopen.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_wlist.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/tests/test_zonemap.py +0 -0
- {res2df-1.3.1 → res2df-1.3.3}/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.3
|
|
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
|
|
|
@@ -135,9 +135,6 @@ def df(prtfile: Union[str, ResdataFiles], fipname: str = "FIPNUM") -> pd.DataFra
|
|
|
135
135
|
".+" + fipname + r"\s+REPORT\s+REGION\s+(\d+)", re.IGNORECASE
|
|
136
136
|
)
|
|
137
137
|
|
|
138
|
-
# Flag for whether we are supposedly parsing a PRT file made by OPM Flow:
|
|
139
|
-
opm = False
|
|
140
|
-
|
|
141
138
|
with open(prtfile, encoding="utf-8") as prt_fh:
|
|
142
139
|
logger.info(
|
|
143
140
|
"Parsing file %s for blocks starting with %s REPORT REGION",
|
|
@@ -148,8 +145,6 @@ def df(prtfile: Union[str, ResdataFiles], fipname: str = "FIPNUM") -> pd.DataFra
|
|
|
148
145
|
matcheddate = re.match(ecl_datematcher, line)
|
|
149
146
|
if matcheddate is None:
|
|
150
147
|
matcheddate = re.match(opm_datematcher, line)
|
|
151
|
-
if matcheddate is not None:
|
|
152
|
-
opm = True
|
|
153
148
|
if matcheddate is not None:
|
|
154
149
|
newdate = datetime.date(
|
|
155
150
|
year=int(matcheddate.group(3)),
|
|
@@ -176,15 +171,19 @@ def df(prtfile: Union[str, ResdataFiles], fipname: str = "FIPNUM") -> pd.DataFra
|
|
|
176
171
|
# Skip if we are not on an interesting line.
|
|
177
172
|
continue
|
|
178
173
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
174
|
+
# The colons in the report block are not reliably included
|
|
175
|
+
# (differs by Eclipse version), even in the same PRT file. We
|
|
176
|
+
# insert them in fixed positions and hope for the best (if the
|
|
177
|
+
# ASCII table is actually dynamic with respect to content, this
|
|
178
|
+
# will fail)
|
|
179
|
+
line = line.strip()
|
|
180
|
+
if line[0] != ":":
|
|
181
|
+
line = ":" + line
|
|
182
|
+
# There should another colon somewhere between 25 - 27
|
|
183
|
+
# (depend on OPM/Eclipse version)
|
|
184
|
+
if ":" not in line[25:27] and len(line) > 26:
|
|
185
185
|
linechars = list(line)
|
|
186
|
-
linechars[
|
|
187
|
-
linechars[27] = ":"
|
|
186
|
+
linechars[26] = ":"
|
|
188
187
|
line = "".join(linechars)
|
|
189
188
|
|
|
190
189
|
records.append(
|
|
@@ -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.3'
|
|
21
|
+
__version_tuple__ = version_tuple = (1, 3, 3)
|
|
@@ -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.3
|
|
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
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
.codacy.yml
|
|
2
1
|
.gitignore
|
|
3
2
|
.pre-commit-config.yaml
|
|
4
3
|
CONTRIBUTING.md
|
|
@@ -105,10 +104,8 @@ res2df.egg-info/entry_points.txt
|
|
|
105
104
|
res2df.egg-info/not-zip-safe
|
|
106
105
|
res2df.egg-info/requires.txt
|
|
107
106
|
res2df.egg-info/top_level.txt
|
|
108
|
-
res2df/config_jobs/CSV2RES
|
|
109
|
-
res2df/config_jobs/RES2CSV
|
|
110
107
|
res2df/hook_implementations/__init__.py
|
|
111
|
-
res2df/hook_implementations/
|
|
108
|
+
res2df/hook_implementations/forward_model_steps.py
|
|
112
109
|
res2df/opmkeywords/BRANPROP
|
|
113
110
|
res2df/opmkeywords/COMPDAT
|
|
114
111
|
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,
|
|
@@ -222,3 +222,55 @@ Randomly generated data
|
|
|
222
222
|
OUTFLOW TO REGION 3 -87796. -87796.: 58859. : -0. -1594053. -1594053.
|
|
223
223
|
OUTFLOW TO REGION 8 0. 0.: 21859. : 0. 0. 0.
|
|
224
224
|
====================================================================================================================================
|
|
225
|
+
|
|
226
|
+
### Starting from OPM 2025.10, no space at the beginning of the line
|
|
227
|
+
|
|
228
|
+
**************************************************************************
|
|
229
|
+
BALANCE AT 0 DAYS *Drogon synthetic reservoir model *
|
|
230
|
+
REPORT 0 01 Jan 2018 * Flow version 2025.10-pre *
|
|
231
|
+
**************************************************************************
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
==================================================
|
|
235
|
+
: FIELD TOTALS :
|
|
236
|
+
: PAV = 300 BARSA :
|
|
237
|
+
: PORV = 512394984 RM3 :
|
|
238
|
+
: Pressure is weighted by hydrocarbon pore volume:
|
|
239
|
+
: Pore volumes are taken at reference conditions :
|
|
240
|
+
:--------------- OIL SM3 ------------------:-- WAT SM3 --:-------------- GAS SM3 ---------------:
|
|
241
|
+
: LIQUID VAPOUR TOTAL : TOTAL : FREE DISSOLVED TOTAL :
|
|
242
|
+
:-------------------------:-------------------------------------------:----------------:-------------------------------------------:
|
|
243
|
+
:CURRENTLY IN PLACE : 33773363 162535 33935898 : 444928115 : 1056474997 4805914695 5862389693 :
|
|
244
|
+
:-------------------------:-------------------------------------------:----------------:-------------------------------------------:
|
|
245
|
+
:ORIGINALLY IN PLACE : 33773363 162535 33935898 : 444928115 : 1056474997 4805914695 5862389693 :
|
|
246
|
+
====================================================================================================================================
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
==================================================
|
|
251
|
+
: FIPOPM REPORT REGION 1 :
|
|
252
|
+
: PAV = 300 BARSA :
|
|
253
|
+
: PORV = 82199852 RM3 :
|
|
254
|
+
:--------------- OIL SM3 ------------------:-- WAT SM3 --:-------------- GAS SM3 ---------------:
|
|
255
|
+
: LIQUID VAPOUR TOTAL : TOTAL : FREE DISSOLVED TOTAL :
|
|
256
|
+
:-------------------------:-------------------------------------------:----------------:-------------------------------------------:
|
|
257
|
+
:CURRENTLY IN PLACE : 311274 0 311274 : 79180976 : 0 43833585 43833585 :
|
|
258
|
+
:-------------------------:-------------------------------------------:----------------:-------------------------------------------:
|
|
259
|
+
:ORIGINALLY IN PLACE : 311274 0 311274 : 79180976 : 0 43833585 43833585 :
|
|
260
|
+
:-------------------------:-------------------------------------------:----------------:-------------------------------------------:
|
|
261
|
+
====================================================================================================================================
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
==================================================
|
|
266
|
+
: FIPOPM REPORT REGION 2 :
|
|
267
|
+
: PAV = 302 BARSA :
|
|
268
|
+
: PORV = 21191418 RM3 :
|
|
269
|
+
:--------------- OIL SM3 ------------------:-- WAT SM3 --:-------------- GAS SM3 ---------------:
|
|
270
|
+
: LIQUID VAPOUR TOTAL : TOTAL : FREE DISSOLVED TOTAL :
|
|
271
|
+
:-------------------------:-------------------------------------------:----------------:-------------------------------------------:
|
|
272
|
+
:CURRENTLY IN PLACE : 4893558 0 4893558 : 13735096 : 0 689110895 689110895 :
|
|
273
|
+
:-------------------------:-------------------------------------------:----------------:-------------------------------------------:
|
|
274
|
+
:ORIGINALLY IN PLACE : 4893558 0 4893558 : 13735096 : 0 689110895 689110895 :
|
|
275
|
+
:-------------------------:-------------------------------------------:----------------:-------------------------------------------:
|
|
276
|
+
====================================================================================================================================
|
|
@@ -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
|