Compare commits

..

2 Commits

Author SHA1 Message Date
Bård Skaflestad
bcc96eda2c Merge pull request #2432 from goncalvesmachadoc/welltemp_output
Fix Well Temperature Output
2021-04-19 08:37:29 +02:00
Joakim Hove
75b81a16a5 Merge pull request #2429 from blattms/fix-compile-g++10.2
Include stdexcept header to fix compilation with g++-10
2021-04-19 08:37:23 +02:00
573 changed files with 11862 additions and 65281 deletions

View File

@@ -42,13 +42,11 @@ set(OPM_PROJECT_EXTRA_CODE_INTREE "#ENABLE_ECL_INPUT is needed by opm-common-pre
if(ENABLE_ECL_OUTPUT)
set(OPM_PROJECT_EXTRA_CODE_INSTALLED "${OPM_PROJECT_EXTRA_CODE_INSTALLED}
set(COMPARE_ECL_COMMAND ${CMAKE_INSTALL_PREFIX}/bin${${name}_VER_DIR}/compareECL)
set(OPM_PACK_COMMAND ${CMAKE_INSTALL_PREFIX}/bin${${name}_VER_DIR}/opmpack)
set(RST_DECK_COMMAND ${CMAKE_INSTALL_PREFIX}/bin${${name}_VER_DIR}/rst_deck)")
set(OPM_PACK_COMMAND ${CMAKE_INSTALL_PREFIX}/bin${${name}_VER_DIR}/opmpack)")
set(OPM_PROJECT_EXTRA_CODE_INTREE "${OPM_PROJECT_EXTRA_CODE_INTREE}
set(COMPARE_ECL_COMMAND ${PROJECT_BINARY_DIR}/bin/compareECL)
set(OPM_PACK_COMMAND ${PROJECT_BINARY_DIR}/bin/opmpack)
set(RST_DECK_COMMAND ${PROJECT_BINARY_DIR}/bin/rst_deck)")
set(OPM_PACK_COMMAND ${PROJECT_BINARY_DIR}/bin/opmpack)")
endif()
# project information is in dune.module. Read this file and set variables.
@@ -109,7 +107,8 @@ macro (config_hook)
set(HAVE_ECL_OUTPUT 1)")
endif()
find_package(Boost COMPONENTS filesystem regex system unit_test_framework)
# Configure boost targets for old cmake
include(cmake/Modules/BoostTargets.cmake)
if (HAVE_DYNAMIC_BOOST_TEST)
set_target_properties(Boost::unit_test_framework PROPERTIES INTERFACE_COMPILE_DEFINITIONS BOOST_TEST_DYN_LINK=1)
@@ -301,20 +300,15 @@ if(ENABLE_ECL_INPUT)
${PROJECT_BINARY_DIR}/tests
)
foreach(test test_EclIO test_EGrid test_ERft test_ERst test_ESmry test_EInit test_ExtESmry)
foreach(test test_EclIO test_EGrid test_ERft test_ERst test_ESmry test_EInit)
opm_add_test(${test} CONDITION ENABLE_ECL_INPUT AND Boost_UNIT_TEST_FRAMEWORK_FOUND
LIBRARIES ${_libs}
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/tests)
endforeach()
endif()
# Install build system files and documentation
install(DIRECTORY cmake
DESTINATION share/opm USE_SOURCE_PERMISSIONS
PATTERN "OPM-CMake.md" EXCLUDE)
install(FILES cmake/OPM-CMake.md
DESTINATION ${CMAKE_INSTALL_DOCDIR})
# Install build system files
install(DIRECTORY cmake DESTINATION share/opm USE_SOURCE_PERMISSIONS)
# Install tab completion skeleton
install(FILES etc/opm_bash_completion.sh.in DESTINATION share/opm/etc)
@@ -327,17 +321,7 @@ if (OPM_ENABLE_PYTHON)
else()
set(PYTHON_PACKAGE_PATH "site-packages")
endif()
if(PYTHON_VERSION_MAJOR)
set(PY_MAJOR ${PYTHON_VERSION_MAJOR})
else()
set(PY_MAJOR ${Python3_VERSION_MAJOR})
endif()
if(PYTHON_VERSION_MINOR)
set(PY_MINOR ${PYTHON_VERSION_MINOR})
else()
set(PY_MINOR ${Python3_VERSION_MINOR})
endif()
set(PYTHON_INSTALL_PREFIX "lib/python${PY_MAJOR}.${PY_MINOR}/${PYTHON_PACKAGE_PATH}" CACHE STRING "Subdirectory to install Python modules in")
set(PYTHON_INSTALL_PREFIX "lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/${PYTHON_PACKAGE_PATH}" CACHE STRING "Subdirectory to install Python modules in")
make_directory(${PROJECT_BINARY_DIR}/python)
get_target_property(_opmcommon_include_dirs opmcommon INCLUDE_DIRECTORIES)

View File

@@ -46,8 +46,6 @@ if(ENABLE_ECL_INPUT)
src/opm/io/eclipse/SummaryNode.cpp
src/opm/json/JsonObject.cpp
src/opm/parser/eclipse/Deck/Deck.cpp
src/opm/parser/eclipse/Deck/DeckTree.cpp
src/opm/parser/eclipse/Deck/FileDeck.cpp
src/opm/parser/eclipse/Deck/DeckItem.cpp
src/opm/parser/eclipse/Deck/DeckValue.cpp
src/opm/parser/eclipse/Deck/DeckKeyword.cpp
@@ -81,14 +79,12 @@ if(ENABLE_ECL_INPUT)
src/opm/parser/eclipse/EclipseState/Grid/Fault.cpp
src/opm/parser/eclipse/EclipseState/Grid/FaultFace.cpp
src/opm/parser/eclipse/EclipseState/Grid/GridDims.cpp
src/opm/parser/eclipse/EclipseState/Grid/MapAxes.cpp
src/opm/parser/eclipse/EclipseState/Grid/MULTREGTScanner.cpp
src/opm/parser/eclipse/EclipseState/Grid/NNC.cpp
src/opm/parser/eclipse/EclipseState/Grid/Operate.cpp
src/opm/parser/eclipse/EclipseState/Grid/PinchMode.cpp
src/opm/parser/eclipse/EclipseState/Grid/SatfuncPropertyInitializers.cpp
src/opm/parser/eclipse/EclipseState/Grid/setKeywordBox.cpp
src/opm/parser/eclipse/EclipseState/Grid/TranCalculator.cpp
src/opm/parser/eclipse/EclipseState/Grid/TransMult.cpp
src/opm/parser/eclipse/EclipseState/InitConfig/Equil.cpp
src/opm/parser/eclipse/EclipseState/InitConfig/FoamConfig.cpp
@@ -96,7 +92,6 @@ if(ENABLE_ECL_INPUT)
src/opm/parser/eclipse/EclipseState/IOConfig/IOConfig.cpp
src/opm/parser/eclipse/EclipseState/Runspec.cpp
src/opm/parser/eclipse/EclipseState/TracerConfig.cpp
src/opm/parser/eclipse/EclipseState/MICPpara.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Action/ActionAST.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Action/ActionContext.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Action/ActionResult.cpp
@@ -107,7 +102,6 @@ if(ENABLE_ECL_INPUT)
src/opm/parser/eclipse/EclipseState/Schedule/Action/ActionValue.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Action/ASTNode.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Action/Condition.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Action/Enums.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Action/State.cpp
src/opm/parser/eclipse/EclipseState/Schedule/ArrayDimChecker.cpp
src/opm/parser/eclipse/EclipseState/Schedule/eval_uda.cpp
@@ -130,7 +124,6 @@ if(ENABLE_ECL_INPUT)
src/opm/parser/eclipse/EclipseState/Schedule/MSW/AICD.cpp
src/opm/parser/eclipse/EclipseState/Schedule/MSW/SICD.cpp
src/opm/parser/eclipse/EclipseState/Schedule/MSW/Valve.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Network/Balance.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Network/Branch.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Network/ExtNetwork.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Network/Node.cpp
@@ -143,8 +136,7 @@ if(ENABLE_ECL_INPUT)
src/opm/parser/eclipse/EclipseState/Schedule/ScheduleState.cpp
src/opm/parser/eclipse/EclipseState/Schedule/ScheduleTypes.cpp
src/opm/parser/eclipse/EclipseState/Schedule/SummaryState.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Tuning.cpp
src/opm/parser/eclipse/EclipseState/Schedule/WriteRestartFileEvents.cpp
src/opm/parser/eclipse/EclipseState/Schedule/TimeMap.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Well/Connection.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Well/injection.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Well/PAvg.cpp
@@ -159,7 +151,6 @@ if(ENABLE_ECL_INPUT)
src/opm/parser/eclipse/EclipseState/Schedule/Well/WellEconProductionLimits.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Well/WellFoamProperties.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Well/WellInjectionProperties.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Well/WellMICPProperties.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Well/WellPolymerProperties.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Well/WellBrineProperties.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Well/WellTracerProperties.cpp
@@ -171,13 +162,10 @@ if(ENABLE_ECL_INPUT)
src/opm/parser/eclipse/EclipseState/SimulationConfig/SimulationConfig.cpp
src/opm/parser/eclipse/EclipseState/SimulationConfig/ThresholdPressure.cpp
src/opm/parser/eclipse/EclipseState/SummaryConfig/SummaryConfig.cpp
src/opm/parser/eclipse/EclipseState/Tables/Aqudims.cpp
src/opm/parser/eclipse/EclipseState/Tables/ColumnSchema.cpp
src/opm/parser/eclipse/EclipseState/Tables/DenT.cpp
src/opm/parser/eclipse/EclipseState/Tables/Eqldims.cpp
src/opm/parser/eclipse/EclipseState/Tables/JFunc.cpp
src/opm/parser/eclipse/EclipseState/Tables/PvtxTable.cpp
src/opm/parser/eclipse/EclipseState/Tables/Regdims.cpp
src/opm/parser/eclipse/EclipseState/Tables/SimpleTable.cpp
src/opm/parser/eclipse/EclipseState/Tables/PolyInjTables.cpp
src/opm/parser/eclipse/EclipseState/Tables/StandardCond.cpp
@@ -194,7 +182,6 @@ if(ENABLE_ECL_INPUT)
src/opm/parser/eclipse/EclipseState/Tables/BrineDensityTable.cpp
src/opm/parser/eclipse/EclipseState/Tables/RwgsaltTable.cpp
src/opm/parser/eclipse/EclipseState/Tables/SolventDensityTable.cpp
src/opm/parser/eclipse/EclipseState/Tables/Tabdims.cpp
src/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQASTNode.cpp
src/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQParams.cpp
src/opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQParser.cpp
@@ -242,7 +229,6 @@ if(ENABLE_ECL_INPUT)
python/cxx/eclipse_config.cpp
python/cxx/eclipse_grid.cpp
python/cxx/eclipse_state.cpp
python/cxx/emodel_util.cpp
python/cxx/export.cpp
python/cxx/group.cpp
python/cxx/log.cpp
@@ -284,32 +270,24 @@ if(ENABLE_ECL_OUTPUT)
src/opm/io/eclipse/ERst.cpp
src/opm/io/eclipse/ERsm.cpp
src/opm/io/eclipse/ESmry.cpp
src/opm/io/eclipse/ExtESmry.cpp
src/opm/io/eclipse/ESmry_write_rsm.cpp
src/opm/io/eclipse/OutputStream.cpp
src/opm/io/eclipse/ExtSmryOutput.cpp
src/opm/io/eclipse/RestartFileView.cpp
src/opm/io/eclipse/SummaryNode.cpp
src/opm/io/eclipse/rst/action.cpp
src/opm/io/eclipse/rst/aquifer.cpp
src/opm/io/eclipse/rst/connection.cpp
src/opm/io/eclipse/rst/group.cpp
src/opm/io/eclipse/rst/header.cpp
src/opm/io/eclipse/rst/udq.cpp
src/opm/io/eclipse/rst/segment.cpp
src/opm/io/eclipse/rst/state.cpp
src/opm/io/eclipse/rst/well.cpp
src/opm/output/eclipse/ActiveIndexByColumns.cpp
src/opm/output/eclipse/AggregateActionxData.cpp
src/opm/output/eclipse/AggregateAquiferData.cpp
src/opm/output/eclipse/AggregateConnectionData.cpp
src/opm/output/eclipse/AggregateGroupData.cpp
src/opm/output/eclipse/AggregateNetworkData.cpp
src/opm/output/eclipse/AggregateMSWData.cpp
src/opm/output/eclipse/AggregateUDQData.cpp
src/opm/output/eclipse/AggregateWellData.cpp
src/opm/output/eclipse/AggregateWListData.cpp
src/opm/output/eclipse/CreateActionRSTDims.cpp
src/opm/output/eclipse/CreateActionxDims.cpp
src/opm/output/eclipse/CreateDoubHead.cpp
src/opm/output/eclipse/CreateInteHead.cpp
src/opm/output/eclipse/CreateLogiHead.cpp
@@ -325,16 +303,13 @@ if(ENABLE_ECL_OUTPUT)
src/opm/output/eclipse/Inplace.cpp
src/opm/output/eclipse/Summary.cpp
src/opm/output/eclipse/Tables.cpp
src/opm/output/eclipse/UDQDims.cpp
src/opm/output/eclipse/RegionCache.cpp
src/opm/output/eclipse/RestartValue.cpp
src/opm/output/eclipse/WriteInit.cpp
src/opm/output/eclipse/WriteRFT.cpp
src/opm/output/eclipse/WriteRPT.cpp
src/opm/output/eclipse/report/WELSPECS.cpp
src/opm/output/data/Aquifer.cpp
src/opm/output/data/Solution.cpp
src/opm/utility/EModel.cpp
)
endif()
@@ -343,7 +318,6 @@ list (APPEND TEST_SOURCE_FILES
tests/test_calculateCellVol.cpp
tests/test_cmp.cpp
tests/test_cubic.cpp
tests/test_FileSystem.cpp
tests/test_messagelimiter.cpp
tests/test_nonuniformtablelinear.cpp
tests/test_OpmInputError_format.cpp
@@ -358,7 +332,6 @@ if(ENABLE_ECL_INPUT)
tests/rst_test.cpp
tests/test_ERsm.cpp
tests/test_GuideRate.cpp
tests/test_RestartFileView.cpp
tests/parser/ACTIONX.cpp
tests/parser/ADDREGTests.cpp
tests/parser/AquiferTests.cpp
@@ -383,7 +356,6 @@ if(ENABLE_ECL_INPUT)
tests/parser/ImportTests.cpp
tests/parser/InitConfigTest.cpp
tests/parser/IOConfigTests.cpp
tests/parser/MICPTests.cpp
tests/parser/MessageLimitTests.cpp
tests/parser/MultiRegTests.cpp
tests/parser/MultisegmentWellTests.cpp
@@ -418,6 +390,7 @@ if(ENABLE_ECL_INPUT)
tests/parser/TableManagerTests.cpp
tests/parser/TableSchemaTests.cpp
tests/parser/ThresholdPressureTest.cpp
tests/parser/TimeMapTest.cpp
tests/parser/TracerTests.cpp
tests/parser/TransMultTests.cpp
tests/parser/TuningTests.cpp
@@ -428,18 +401,15 @@ if(ENABLE_ECL_INPUT)
tests/parser/WellTracerTests.cpp
tests/parser/WellTests.cpp
tests/parser/WLIST.cpp
tests/parser/WriteRestartFileEventsTests.cpp
tests/parser/WTEST.cpp)
endif()
if(ENABLE_ECL_OUTPUT)
list (APPEND TEST_SOURCE_FILES
tests/test_ActiveIndexByColumns.cpp
tests/test_AggregateActionxData.cpp
tests/test_AggregateAquiferData.cpp
tests/test_AggregateWellData.cpp
tests/test_AggregateGroupData.cpp
tests/test_AggregateNetworkData.cpp
tests/test_AggregateWListData.cpp
tests/test_AggregateMSWData.cpp
tests/test_AggregateConnectionData.cpp
tests/test_AggregateUDQData.cpp
@@ -474,8 +444,6 @@ list (APPEND TEST_DATA_FILES
)
if(ENABLE_ECL_OUTPUT)
list (APPEND TEST_DATA_FILES
tests/GDFILE_NO_ACTNUM.DATA
tests/EGRID_NO_ACTNUM.FEGRID
tests/BASE_SIM.DATA
tests/BASE_SIM_THPRES.DATA
tests/RESTART_SIM.DATA
@@ -487,21 +455,13 @@ if(ENABLE_ECL_OUTPUT)
tests/summary_deck_non_constant_porosity.DATA
tests/SUMMARY_EFF_FAC.DATA
tests/SPE1CASE1.DATA
tests/SPE1CASE1_RPTONLY.DATA
tests/SPE1CASE1_SUMTHIN.DATA
tests/SPE1CASE1.SMSPEC
tests/SPE1CASE1A.SMSPEC
tests/SPE1CASE1B.DATA
tests/props_spe1case1b.inc
tests/SPE9_CP_PACKED.DATA
tests/SOFR_TEST.DATA
tests/UDQ_BASE.DATA
tests/UDQ_RESTART.DATA
tests/UDQ_ACTIONX.X0007
tests/UDQ_ACTIONX.DATA
tests/UDQ_ACTIONX_RESTART.DATA
tests/UDQ_TEST_WCONPROD_IUAD-2.DATA
tests/9_4C_WINJ_GINJ_UDQ_MSW-UDARATE_TEST_PACK.DATA
tests/UDQ_ACTIONX_TEST1.DATA
tests/UDQ_ACTIONX_TEST1_U.DATA
tests/TEST_AGGREGATE_MSW.DATA
@@ -512,17 +472,13 @@ if(ENABLE_ECL_OUTPUT)
tests/include_grid_3x5x4.grdecl
tests/SPE1CASE2.DATA
tests/SPE1CASE2_RESTART.DATA
tests/SPE1CASE2_RESTART_SKIPREST.DATA
tests/SPE1CASE2.X0060
tests/PYACTION.DATA
tests/0A4_GRCTRL_LRAT_LRAT_GGR_BASE_MODEL2_MSW_ALL.DATA
tests/MOD4_TEST_IGRP-DATA.DATA
tests/2_WLIFT_MODEL5_NOINC.DATA
tests/TEST_NETWORK_ALL.DATA
tests/TEST_WLIST.DATA
tests/act1.py
tests/MSW.DATA
tests/MSW_2WELSEGS.DATA
tests/EXIT_TEST.DATA
tests/action_syntax_error.py
tests/action_missing_run.py
@@ -557,21 +513,15 @@ if(ENABLE_ECL_INPUT)
tests/SPE1CASE1A.UNSMRY
tests/SPE1CASE1_RST60.SMSPEC
tests/SPE1CASE1_RST60.UNSMRY
tests/SPE1CASE1_RST60.ESMRY
tests/MODEL2_RESTART.DATA
tests/restart/MODEL2.UNRST
tests/UDQ_WCONPROD.DATA
tests/UDQ_WCONPROD_GRID.grdecl
tests/UDQ_WCONPROD_RESTART.DATA
tests/UDQ_WCONPROD.X0006
)
list (APPEND EXAMPLE_SOURCE_FILES
examples/opmi.cpp
examples/opmpack.cpp
examples/opmhash.cpp
examples/rst_deck.cpp
examples/wellgraph.cpp
examples/make_ext_smry.cpp
examples/make_lodsmry.cpp
)
endif()
@@ -584,8 +534,7 @@ if(ENABLE_ECL_INPUT)
examples/opmi.cpp
examples/opmpack.cpp
examples/opmhash.cpp
examples/rst_deck.cpp
examples/make_esmry.cpp
examples/make_lodsmry.cpp
)
endif()
@@ -673,11 +622,9 @@ if(ENABLE_ECL_INPUT)
opm/parser/eclipse/EclipseState/Grid/EclipseGrid.hpp
opm/parser/eclipse/EclipseState/Grid/BoxManager.hpp
opm/parser/eclipse/EclipseState/Grid/FaceDir.hpp
opm/parser/eclipse/EclipseState/Grid/MapAxes.hpp
opm/parser/eclipse/EclipseState/Grid/MinpvMode.hpp
opm/parser/eclipse/EclipseState/EndpointScaling.hpp
opm/parser/eclipse/EclipseState/TracerConfig.hpp
opm/parser/eclipse/EclipseState/MICPpara.hpp
opm/parser/eclipse/EclipseState/Tables/DenT.hpp
opm/parser/eclipse/EclipseState/Tables/SimpleTable.hpp
opm/parser/eclipse/EclipseState/Tables/StandardCond.hpp
@@ -777,16 +724,15 @@ if(ENABLE_ECL_INPUT)
opm/parser/eclipse/EclipseState/Schedule/Action/Actions.hpp
opm/parser/eclipse/EclipseState/Schedule/Action/ActionX.hpp
opm/parser/eclipse/EclipseState/Schedule/Action/Condition.hpp
opm/parser/eclipse/EclipseState/Schedule/Action/Enums.hpp
opm/parser/eclipse/EclipseState/Schedule/Action/ASTNode.hpp
opm/parser/eclipse/EclipseState/Schedule/Action/PyAction.hpp
opm/parser/eclipse/EclipseState/Schedule/Action/State.hpp
opm/parser/eclipse/EclipseState/Schedule/ArrayDimChecker.hpp
opm/parser/eclipse/EclipseState/Schedule/GasLiftOpt.hpp
opm/parser/eclipse/EclipseState/Schedule/Network/Balance.hpp
opm/parser/eclipse/EclipseState/Schedule/Network/Branch.hpp
opm/parser/eclipse/EclipseState/Schedule/Network/ExtNetwork.hpp
opm/parser/eclipse/EclipseState/Schedule/Network/Node.hpp
opm/parser/eclipse/EclipseState/Schedule/TimeMap.hpp
opm/parser/eclipse/EclipseState/Schedule/VFPInjTable.hpp
opm/parser/eclipse/EclipseState/Schedule/VFPProdTable.hpp
opm/parser/eclipse/EclipseState/Schedule/Well/Connection.hpp
@@ -804,7 +750,6 @@ if(ENABLE_ECL_INPUT)
opm/parser/eclipse/EclipseState/Schedule/Well/WellFoamProperties.hpp
opm/parser/eclipse/EclipseState/Schedule/Well/WellBrineProperties.hpp
opm/parser/eclipse/EclipseState/Schedule/Well/WellInjectionProperties.hpp
opm/parser/eclipse/EclipseState/Schedule/Well/WellMICPProperties.hpp
opm/parser/eclipse/EclipseState/Schedule/Well/WellPolymerProperties.hpp
opm/parser/eclipse/EclipseState/Schedule/Well/WellProductionProperties.hpp
opm/parser/eclipse/EclipseState/Schedule/Well/WellTracerProperties.hpp
@@ -820,7 +765,6 @@ if(ENABLE_ECL_INPUT)
opm/parser/eclipse/EclipseState/Schedule/ScheduleState.hpp
opm/parser/eclipse/EclipseState/Schedule/ScheduleTypes.hpp
opm/parser/eclipse/EclipseState/Schedule/Tuning.hpp
opm/parser/eclipse/EclipseState/Schedule/WriteRestartFileEvents.hpp
opm/parser/eclipse/EclipseState/Schedule/Group/GPMaint.hpp
opm/parser/eclipse/EclipseState/Schedule/Group/GTNode.hpp
opm/parser/eclipse/EclipseState/Schedule/Group/Group.hpp
@@ -862,9 +806,7 @@ if(ENABLE_ECL_INPUT)
opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQFunctionTable.hpp
opm/parser/eclipse/Deck/DeckItem.hpp
opm/parser/eclipse/Deck/Deck.hpp
opm/parser/eclipse/Deck/FileDeck.hpp
opm/parser/eclipse/Deck/DeckSection.hpp
opm/parser/eclipse/Deck/DeckTree.hpp
opm/parser/eclipse/Deck/DeckOutput.hpp
opm/parser/eclipse/Deck/DeckValue.hpp
opm/parser/eclipse/Deck/DeckKeyword.hpp
@@ -886,20 +828,14 @@ if(ENABLE_ECL_OUTPUT)
opm/io/eclipse/ERst.hpp
opm/io/eclipse/ERsm.hpp
opm/io/eclipse/ESmry.hpp
opm/io/eclipse/ExtESmry.hpp
opm/io/eclipse/PaddedOutputString.hpp
opm/io/eclipse/OutputStream.hpp
opm/io/eclipse/ExtSmryOutput.hpp
opm/io/eclipse/RestartFileView.hpp
opm/io/eclipse/SummaryNode.hpp
opm/io/eclipse/rst/action.hpp
opm/io/eclipse/rst/aquifer.hpp
opm/io/eclipse/rst/connection.hpp
opm/io/eclipse/rst/group.hpp
opm/io/eclipse/rst/header.hpp
opm/io/eclipse/rst/segment.hpp
opm/io/eclipse/rst/state.hpp
opm/io/eclipse/rst/udq.hpp
opm/io/eclipse/rst/well.hpp
opm/output/data/Aquifer.hpp
opm/output/data/Cells.hpp
@@ -907,7 +843,6 @@ if(ENABLE_ECL_OUTPUT)
opm/output/data/Groups.hpp
opm/output/data/Solution.hpp
opm/output/data/Wells.hpp
opm/output/eclipse/VectorItems/action.hpp
opm/output/eclipse/VectorItems/aquifer.hpp
opm/output/eclipse/VectorItems/connection.hpp
opm/output/eclipse/VectorItems/group.hpp
@@ -919,14 +854,12 @@ if(ENABLE_ECL_OUTPUT)
opm/output/eclipse/VectorItems/well.hpp
opm/output/eclipse/ActiveIndexByColumns.hpp
opm/output/eclipse/AggregateActionxData.hpp
opm/output/eclipse/AggregateAquiferData.hpp
opm/output/eclipse/AggregateGroupData.hpp
opm/output/eclipse/AggregateNetworkData.hpp
opm/output/eclipse/AggregateConnectionData.hpp
opm/output/eclipse/AggregateMSWData.hpp
opm/output/eclipse/AggregateUDQData.hpp
opm/output/eclipse/AggregateWellData.hpp
opm/output/eclipse/AggregateWListData.hpp
opm/output/eclipse/DoubHEAD.hpp
opm/output/eclipse/EclipseGridInspector.hpp
opm/output/eclipse/EclipseIO.hpp
@@ -940,14 +873,12 @@ if(ENABLE_ECL_OUTPUT)
opm/output/eclipse/Inplace.hpp
opm/output/eclipse/Summary.hpp
opm/output/eclipse/Tables.hpp
opm/output/eclipse/UDQDims.hpp
opm/output/eclipse/WindowedArray.hpp
opm/output/eclipse/WriteInit.hpp
opm/output/eclipse/WriteRFT.hpp
opm/output/eclipse/WriteRPT.hpp
opm/output/eclipse/WriteRestartHelpers.hpp
opm/output/OutputWriter.hpp
opm/utility/EModel.hpp
)
endif()

View File

@@ -18,13 +18,13 @@ set(_testdir ${PROJECT_SOURCE_DIR}/tests/parser/data)
opm_add_test(ParserTests
SOURCES tests/parser/ParserTests.cpp
LIBRARIES ${TEST_LIBS}
TEST_ARGS -- ${_testdir}/)
TEST_ARGS ${_testdir}/)
list(APPEND EXTRA_TESTS ParserTests)
opm_add_test(ParserIncludeTests
SOURCES tests/parser/ParserIncludeTests.cpp
LIBRARIES ${TEST_LIBS}
TEST_ARGS -- ${_testdir}/parser/)
TEST_ARGS ${_testdir}/parser/)
target_compile_definitions(ParserIncludeTests PRIVATE
-DHAVE_CASE_SENSITIVE_FILESYSTEM=${HAVE_CASE_SENSITIVE_FILESYSTEM})
list(APPEND EXTRA_TESTS ParserIncludeTests)
@@ -32,13 +32,13 @@ list(APPEND EXTRA_TESTS ParserIncludeTests)
opm_add_test(PvtxTableTests
SOURCES tests/parser/PvtxTableTests.cpp
LIBRARIES ${TEST_LIBS}
TEST_ARGS -- ${_testdir}/integration_tests/)
TEST_ARGS ${_testdir}/integration_tests/)
list(APPEND EXTRA_TESTS PvtxTableTests)
opm_add_test(EclipseStateTests
SOURCES tests/parser/EclipseStateTests.cpp
LIBRARIES ${TEST_LIBS}
TEST_ARGS -- ${_testdir}/integration_tests/)
TEST_ARGS ${_testdir}/integration_tests/)
list(APPEND EXTRA_TESTS EclipseStateTests)
foreach (test BoxTest
@@ -55,7 +55,7 @@ foreach (test BoxTest
opm_add_test(${test}
SOURCES tests/parser/integration/${test}.cpp
LIBRARIES ${TEST_LIBS}
TEST_ARGS -- ${_testdir}/integration_tests/)
TEST_ARGS ${_testdir}/integration_tests/)
list(APPEND EXTRA_TESTS ${test})
endforeach ()
@@ -69,11 +69,6 @@ opm_add_test( rst_msw
LIBRARIES ${TEST_LIBS}
TEST_ARGS tests/MSW.DATA tests/MSW_RESTART.DATA )
add_test( NAME rst_deck_test
COMMAND ${PROJECT_SOURCE_DIR}/tests/rst_test_driver.sh ${PROJECT_BINARY_DIR}/bin/rst_deck ${PROJECT_BINARY_DIR}/bin/opmhash
${PROJECT_SOURCE_DIR}/tests/SPE1CASE2_INCLUDE.DATA)
# opm-tests dependent tests
if(HAVE_OPM_TESTS)
opm_add_test(parse_write ONLY_COMPILE
@@ -118,17 +113,8 @@ if(HAVE_OPM_TESTS)
opm_add_test("SPE9_CP_GROUP2" NO_COMPILE EXE_NAME parse_write TEST_ARGS "${OPM_TESTS_ROOT}/spe9group/SPE9_CP_GROUP.DATA")
set_property(TEST NORNE_ATW2013
PROPERTY ENVIRONMENT "OPM_ERRORS_IGNORE=PARSE_RANDOM_SLASH")
add_test( NAME rst_deck_test_norne
COMMAND ${PROJECT_SOURCE_DIR}/tests/rst_test_driver.sh ${CMAKE_BINARY_DIR}/bin/rst_deck ${CMAKE_BINARY_DIR}/bin/opmhash
${OPM_TESTS_ROOT}/norne/NORNE_ATW2013.DATA)
set_property(TEST rst_deck_test_norne
PROPERTY ENVIRONMENT "OPM_ERRORS_IGNORE=PARSE_RANDOM_SLASH")
endif()
# JSON tests
opm_add_test(jsonTests
SOURCES tests/json/jsonTests.cpp

View File

@@ -1,7 +1,6 @@
set(genkw_SOURCES src/opm/json/JsonObject.cpp
src/opm/parser/eclipse/Parser/createDefaultKeywordList.cpp
src/opm/parser/eclipse/Deck/UDAValue.cpp
src/opm/parser/eclipse/Deck/DeckTree.cpp
src/opm/parser/eclipse/Deck/DeckValue.cpp
src/opm/parser/eclipse/Deck/Deck.cpp
src/opm/parser/eclipse/Deck/DeckItem.cpp

View File

@@ -0,0 +1,49 @@
# make targets for boost if find module did not do the job
if(NOT TARGET Boost::system)
add_library(Boost::system UNKNOWN IMPORTED)
set_target_properties(Boost::system PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${Boost_INCLUDE_DIRS}"
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${Boost_INCLUDE_DIRS}"
IMPORTED_LOCATION "${Boost_SYSTEM_LIBRARY}"
IMPORTED_LOCATION_DEBUG "${Boost_SYSTEM_LIBRARY_DEBUG}"
IMPORTED_LOCATION_RELEASE "${Boost_SYSTEM_LIBRARY_RELEASE}"
)
endif()
if(NOT TARGET Boost::filesystem)
add_library(Boost::filesystem UNKNOWN IMPORTED)
set_target_properties(Boost::filesystem PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${Boost_INCLUDE_DIRS}"
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${Boost_INCLUDE_DIRS}"
INTERFACE_COMPILE_DEFINITIONS BOOST_FILESYSTEM_VERSION=3
INTERFACE_LINK_LIBRARIES "${boost_system}"
IMPORTED_LOCATION "${Boost_FILESYSTEM_LIBRARY}"
IMPORTED_LOCATION_DEBUG "${Boost_FILESYSTEM_LIBRARY_DEBUG}"
IMPORTED_LOCATION_RELEASE "${Boost_FILESYSTEM_LIBRARY_RELEASE}"
)
endif()
if(NOT TARGET Boost::regex)
add_library(Boost::regex UNKNOWN IMPORTED)
set_target_properties(Boost::regex PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${Boost_INCLUDE_DIRS}"
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${Boost_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${boost_system}"
IMPORTED_LOCATION "${Boost_REGEX_LIBRARY}"
IMPORTED_LOCATION_DEBUG "${Boost_REGEX_LIBRARY_DEBUG}"
IMPORTED_LOCATION_RELEASE "${Boost_REGEX_LIBRARY_RELEASE}"
)
endif()
if(NOT TARGET Boost::unit_test_framework)
add_library(Boost::unit_test_framework UNKNOWN IMPORTED)
set_target_properties(Boost::unit_test_framework PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${Boost_INCLUDE_DIRS}"
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${Boost_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${boost_system}"
IMPORTED_LOCATION "${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}"
IMPORTED_LOCATION_DEBUG "${Boost_UNIT_TEST_FRAMEWORK_LIBRARY_DEBUG}"
IMPORTED_LOCATION_RELEASE "${Boost_UNIT_TEST_FRAMEWORK_LIBRARY_RELEASE}"
)
endif()

View File

@@ -1,31 +0,0 @@
# - Find the GNU Multiprecision library.
#
# Will define the following imported target for usage:
# - GMP::gmp Target for linking/compiling with C library
# - GMP::gmpxx Target for linking/compiling with C++ library
find_path(GMP_INCLUDE_DIR gmp.h)
find_library(GMP_LIBRARY gmp)
find_path(GMPXX_INCLUDE_DIR gmpxx.h)
find_library(GMPXX_LIBRARY gmpxx)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(GMP
DEFAULT_MSG
GMPXX_LIBRARY GMPXX_INCLUDE_DIR GMP_INCLUDE_DIR GMP_LIBRARY)
if(GMP_FOUND)
if(NOT TARGET GMP::gmp)
add_library(GMP::gmp UNKNOWN IMPORTED GLOBAL)
set_target_properties(GMP::gmp PROPERTIES
IMPORTED_LOCATION ${GMP_LIBRARY}
INTERFACE_INCLUDE_DIRECTORIES ${GMP_INCLUDE_DIR})
endif()
if(NOT TARGET GMP::gmpxx)
add_library(GMP::gmpxx UNKNOWN IMPORTED GLOBAL)
set_target_properties(GMP::gmpxx PROPERTIES
IMPORTED_LOCATION ${GMPXX_LIBRARY}
INTERFACE_INCLUDE_DIRECTORIES ${GMPXX_INCLUDE_DIR}
TARGET_LINK_LIBRARIES GMP::gmp)
endif()
endif()

View File

@@ -8,11 +8,7 @@
# HAVE_METIS - like METIS_FOUND, but for the inclusion in config.h
# METIS_INCLUDE_DIRS - incude paths to use libMETIS
# METIS_LIBRARIES - Link these to use libMETIS
# METIS::METIS - Imported metis target needed for DUNE 2.8.0
# METIS_API_VERSION - The METIS api version scotch is supporting.
set(METIS_API_VERSION 0 CACHE STRING
"METIS API version provided by METIS or scotch-metis library")
set(METIS_SEARCH_PATH "/usr" "/usr/local" "/opt" "/opt/local")
set(METIS_NO_DEFAULT_PATH "")
if(METIS_ROOT)
@@ -39,27 +35,9 @@ find_library(METIS_LIBRARIES
${METIS_NO_DEFAULT_PATH})
set (METIS_FOUND FALSE)
if (METIS_INCLUDE_DIRS OR METIS_LIBRARIES)
set(METIS_FOUND TRUE)
set(HAVE_METIS TRUE)
file(READ "${METIS_INCLUDE_DIRS}/metis.h" metisheader)
string(REGEX MATCH "#define METIS_VER_MAJOR[ ]+([0-9]+)" METIS_MAJOR_VERSION ${metisheader})
if(NOT METIS_API_VERSION AND METIS_MAJOR_VERSION)
# string(REGEX REPLACE ".*#define METIS_VER_MAJOR[ ]+([0-9]+).*" "\\1"
# METIS_MAJOR_VERSION "${metisheader}")
if(METIS_MAJOR_VERSION GREATER_EQUAL 3 AND METIS_MAJOR_VERSION LESS 5)
set(METIS_API_VERSION "3")
else()
set(METIS_API_VERSION "${METIS_MAJOR_VERSION}")
endif()
endif()
add_library(METIS::METIS UNKNOWN IMPORTED)
set_target_properties(METIS::METIS PROPERTIES
IMPORTED_LOCATION ${METIS_LIBRARIES}
INTERFACE_INCLUDE_DIRECTORIES ${METIS_INCLUDE_DIRS}
INTERFACE_COMPILE_DEFINITIONS METIS_API_VERSION=${METIS_API_VERSION})
endif()
# print a message to indicate status of this package

View File

@@ -70,20 +70,6 @@ if(PTSCOTCH_FOUND)
set(PTSCOCH_LINK_FLAGS "${DUNE_MPI_LINK_FLAGS}"
CACHE STRING "PT-Scotch link flags")
set(HAVE_PTSCOTCH 1)
if(NOT TARGET PTScotch::Scotch)
add_library(PTScotch::Scotch UNKNOWN IMPORTED GLOBAL)
set_target_properties(PTScotch::Scotch PROPERTIES
IMPORTED_LOCATION "${SCOTCH_LIBRARY}"
INCLUDE_DIRECTORIES "${PTSCOTCH_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${PTSCOTCHERR_LIBRARY}")
endif()
if(NOT TARGET PTScotch::PTScotch)
add_library(PTScotch::PTScotch UNKNOWN IMPORTED GLOBAL)
set_target_properties(PTScotch::PTScotch PROPERTIES
IMPORTED_LOCATION "${PTSCOTCH_LIBRARY}"
INCLUDE_DIRECTORIES "${PTSCOTCH_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "PTScotch::Scotch;${MPI_DUNE_LIBRARIES}")
endif()
# log result
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
"Determing location of PT-Scotch succeded:\n"

View File

@@ -102,13 +102,6 @@ if(PARMETIS_FOUND)
"Include directory: ${PARMETIS_INCLUDE_DIRS}\n"
"Library directory: ${PARMETIS_LIBRARIES}\n\n")
if(NOT TARGET ParMETIS::ParMETIS)
add_library(ParMETIS::ParMETIS UNKNOWN IMPORTED GLOBAL)
set_target_properties(ParMETIS::ParMETIS PROPERTIES
IMPORTED_LOCATION ${PARMETIS_LIBRARY}
INCLUDE_DIRECTORIES "${PARMETIS_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${METIS_LIBRARIES};${MPI_C_LIBRARIES}")
endif()
endif(PARMETIS_FOUND)
mark_as_advanced(PARMETIS_INCLUDE_DIRS PARMETIS_LIBRARIES HAVE_PARMETIS)

View File

@@ -34,11 +34,6 @@ int main(void){
if (QUADMATH_FOUND)
set(QUADMATH_LIBRARIES "quadmath")
set(HAVE_QUAD "${QUADMATH_FOUND}")
add_library(QuadMath::QuadMath INTERFACE IMPORTED)
set_target_properties(QuadMath::QuadMath PROPERTIES
INTERFACE_LINK_LIBRARIES quadmath
INTERFACE_COMPILE_DEFINITIONS _GLIBCXX_USE_FLOAT128
INTERFACE_COMPILE_OPTIONS $<$<CXX_COMPILER_ID:GNU>:-fext-numeric-literals>)
endif()
endif()

View File

@@ -280,32 +280,6 @@ if (SuiteSparse_LIBRARIES)
list (REVERSE SuiteSparse_LIBRARIES)
endif (SuiteSparse_LIBRARIES)
if(SuiteSparse_FOUND)
if(NOT TARGET SuiteSparse::SuiteSparse)
add_library(SuiteSparse::SuiteSparse INTERFACE IMPORTED GLOBAL)
set_property(TARGET SuiteSparse::SuiteSparse PROPERTY
INTERFACE_INCLUDE_DIRECTORIES ${SuiteSparse_INCLUDE_DIRS})
if(config_LIBRARY)
set_property(TARGET SuiteSparse::SuiteSparse PROPERTY
INTERFACE_LINK_LIBRARIES ${config_LIBRARY})
endif()
endif()
foreach(_module ${SuiteSparse_MODULES})
string (TOUPPER ${_module} _MODULE)
if(SuiteSparse_${_MODULE}_FOUND)
if(NOT TARGET SuiteSparse::${_module})
message(STATUS "Creating target SuitSparse::${_module}")
add_library(SuiteSparse::${_module} UNKNOWN IMPORTED GLOBAL)
set_target_properties(SuiteSparse::${_module} PROPERTIES
IMPORTED_LOCATION ${${_MODULE}_LIBRARY}
INCLUDE_DIRECTORIES ${${_MODULE}_INCLUDE_DIRS}
INTERFACE_LINK_LIBRARIES "${config_LIBRARY}")
target_link_libraries(SuiteSparse::SuiteSparse
INTERFACE SuiteSparse::${_module})
endif()
endif()
endforeach(_module)
endif()
# print a message to indicate status of this package
include (FindPackageHandleStandardArgs)
find_package_handle_standard_args (SuiteSparse

View File

@@ -180,16 +180,6 @@ if(SUPERLU_FOUND)
if (SUPERLU_BLAS_LIBRARY)
list(APPEND SUPERLU_LIBRARIES ${SUPERLU_BLAS_LIBRARY})
endif()
if(NOT TARGET SuperLU::SuperLU)
add_library(SuperLU::SuperLU UNKNOWN IMPORTED GLOBAL)
set_target_properties(SuperLU::SuperLU PROPERTIES
IMPORTED_LOCATION ${SUPERLU_LIBRARY}
INCLUDE_DIRECTORIES ${SUPERLU_INCLUDE_DIRS})
if(SUPERLU_BLAS_LIBRARY)
set_property(TARGET SuperLU::SuperLU PROPERTY
INTERFACE_LINK_LIBRARIES ${SUPERLU_BLAS_LIBRARY})
endif()
endif()
endif()
cmake_pop_check_state()

View File

@@ -1,34 +0,0 @@
# Poor man's FindTBB that will create the CMake targets
# used by DUNE.
# If the TBB version is new enough it will ship its own
# TBBConfig.cmake and we are good
find_package(TBB QUIET CONFIG)
if(NOT TBB_FOUND)
# Fall back to using pkgconfig
find_package(PkgConfig QUIET)
if (PKG_CONFIG_FOUND)
pkg_check_modules(PkgConfigTBB IMPORTED_TARGET GLOBAL tbb QUIET)
if(NOT TARGET PkgConfig::PkgConfigTBB)
# workaround bug in old FindPkgConfig.cmake which adds
# pkgcfg_lib_PkgConfigTBB_atomic-NOTFOUND because it cannot
# find the atomic lib of the compiler (not in platforms default
# library path. It will therefore not create the target and we
# try that manually.
string(REPLACE ";pkgcfg_lib_PkgConfigTBB_atomic-NOTFOUND" "" _find_tbb_libs "${PkgConfigTBB_LINK_LIBRARIES}")
if(_find_tbb_libs)
add_library(PkgConfig::PkgConfigTBB INTERFACE IMPORTED GLOBAL)
set_property(TARGET PkgConfig::PkgConfigTBB PROPERTY
INTERFACE_LINK_LIBRARIES "${_find_tbb_libs}")
endif()
endif()
if(TARGET PkgConfig::PkgConfigTBB)
if(NOT TARGET TBB::tbb)
message(STATUS "Found TBB library using pkg config")
add_library(TBB::tbb ALIAS PkgConfig::PkgConfigTBB)
endif()
endif()
endif(PKG_CONFIG_FOUND)
else()
message(STATUS "Found TBB library using config mode")
endif(NOT TBB_FOUND)

View File

@@ -19,9 +19,7 @@ find_opm_package (
"BLAS REQUIRED;
LAPACK REQUIRED;
CxaDemangle;
MPI;
TBB;
GMP
MPI
"
# header to search for
"dune/common/fvector.hh"

View File

@@ -24,8 +24,7 @@ find_opm_package (
dune-alugrid;
ZLIB;
ZOLTAN;
METIS;
Quadmath
METIS
"
# header to search for
"dune/fem/space/shapefunctionset/legendre.hh"

View File

@@ -1,16 +1,6 @@
# Installs bash tab completion for a product
macro(opm_add_bash_completion binary)
option(USE_BASH_COMPLETIONS_DIR
"Whether to use the new bash completion dir (/usr/share/bash-completion/completions) with load on demand"
OFF)
if(USE_BASH_COMPLETIONS_DIR)
set(_BASH_COMPLETION_FILE ${binary})
set(_BASH_COMPLETION_INSTALL_DIR ${CMAKE_INSTALL_DATAROOTDIR}/bash-completion/completions)
else()
set(_BASH_COMPLETION_FILE ${binary}_bash_completion.sh)
set(_BASH_COMPLETION_INSTALL_DIR ${CMAKE_INSTALL_SYSCONFDIR}/bash_completion.d)
endif()
set(PRODUCT ${binary})
configure_file(${OPM_MACROS_ROOT}/etc/opm_bash_completion.sh.in ${_BASH_COMPLETION_FILE} @ONLY)
install(FILES ${PROJECT_BINARY_DIR}/${_BASH_COMPLETION_FILE} DESTINATION ${_BASH_COMPLETION_INSTALL_DIR})
configure_file(${OPM_MACROS_ROOT}/etc/opm_bash_completion.sh.in ${binary}_bash_completion.sh @ONLY)
install(FILES ${PROJECT_BINARY_DIR}/${binary}_bash_completion.sh DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/bash_completion.d)
endmacro()

View File

@@ -130,18 +130,9 @@ macro (find_and_append_package_to prefix name)
# and the likes which is only done via opm_find_package
if ( (NOT DEFINED ${name}_FOUND AND NOT DEFINED ${NAME}_FOUND )
OR _search_components GREATER -1)
string(REGEX MATCH "(opm)-.*" _is_opm ${name})
string(REGEX MATCH "(opm)-.*" _is_opm ${name})
if(NOT _is_opm)
# When using Boost >= 1.70 and e.g. CMake 3.18 we need to make sure that
# subsequent searches are using config mode too. Otherwise the library
# list will be completely messed up. We use a set Boost_Dir to detect that
# previous searches were done using config mode.
if("${name}" STREQUAL "Boost" AND Boost_DIR)
set(_CONFIG_MODE CONFIG)
else()
set(_CONFIG_MODE "")
endif()
find_package (${name} ${ARGN} ${_CONFIG_MODE})
find_package (${name} ${ARGN})
else()
if(${name}_DIR)
find_package (${name} ${${prefix}_VERSION_MAJOR}.${${prefix}_VERSION_MINOR} ${ARGN} NO_MODULE PATHS ${${name}_DIR} NO_DEFAULT_PATH)

View File

@@ -138,9 +138,14 @@ endif ()
# Compiler standard version needs to be requested here as prereqs is included
# before OpmLibMain and some tests need/use CXX_STANDARD_VERSION (e.g. pybind11)
# Languages and global compiler settings
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
if(CMAKE_VERSION VERSION_LESS 3.8)
message(WARNING "CMake version does not support c++17, guessing -std=c++17")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
else()
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
endif()
# quadmath must be explicitly enabled
# This needs to be in OpmInit as prereqs is called before OpmLibMain is included.

View File

@@ -1,11 +1,4 @@
# When using Boost >= 1.70 and e.g. CMake 3.18 we need to make sure that
# subsequent searches are using config mode too. Otherwise the library
# list will be completely messed up. We use a set Boost_Dir to detect that
# previous searches were done using config mode.
if(Boost_DIR)
set(_Boost_CONFIG_MODE CONFIG)
endif()
find_package (Boost 1.44.0 COMPONENTS unit_test_framework QUIET ${_Boost_CONFIG_MODE})
find_package (Boost 1.44.0 COMPONENTS unit_test_framework QUIET)
if (Boost_UNIT_TEST_FRAMEWORK_FOUND)
# setup to do a test compile

View File

@@ -63,9 +63,9 @@ if (CXX_COMPAT_GCC)
# use these options for release builds - full optimization
add_options (ALL_LANGUAGES "${_prof_RELEASE}" ${_opt_rel} ${_opt_flags})
option(WITH_NDEBUG "Disable asserts in release mode" OFF)
if(NOT WITH_NDEBUG)
add_options (ALL_LANGUAGES "${_prof_RELEASE}" -UNDEBUG)
option(WITH_NDEBUG "Disable asserts in release mode" ON)
if(WITH_NDEBUG)
add_options (ALL_LANGUAGES "${_prof_RELEASE}" -DNDEBUG)
endif()
else ()

View File

@@ -816,7 +816,7 @@ HTML_COLORSTYLE_GAMMA = 80
# page will contain the date and time when the page was generated. Setting
# this to NO can help when comparing the output of multiple runs.
HTML_TIMESTAMP = NO
HTML_TIMESTAMP = YES
# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
# documentation will contain sections that can be hidden and shown after the

View File

@@ -93,16 +93,6 @@ if(NOT @opm-project_NAME@_FOUND)
# this is the contents of config.h as far as our probes can tell:
# Require correct CMake standard. Needed for user modules as
# some software will add incompatible compile switches like
# -std=gnu++11 otherwise when search for (I guess because of
# imported targets using INTERFACE_COMPILE_FEATURES), and will
# break compilation because of missing c++17 features.
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD @CMAKE_CXX_STANDARD@)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
endif()
# The settings in this block do not mix well with the DEST_PREFIX
# setting.
@@ -114,7 +104,6 @@ if(NOT @opm-project_NAME@_FOUND)
@OPM_PROJECT_EXTRA_CODE@
# end extra code
include(OpmPackage)
include(@opm-project_NAME@-prereqs)
endif()
endif()

2
debian/changelog vendored
View File

@@ -1,4 +1,4 @@
opm-common (2021.10-rc2-1~focal) focal; urgency=medium
opm-common (2019.04-pre~xenial) xenial; urgency=medium
* New release

View File

@@ -153,7 +153,7 @@ we currently have five different categories:
To infer the number of records in the keyword based on an
internal calculation is not supported, hence for these keywords
size is given as unknown, and the keywords are terminated when the
size is given as unkown, and the keywords are terminated when the
next valid keyword is found:
{"name" : "VFPPROD" , "size" : "UNKNOWN", ....

View File

@@ -1,7 +0,0 @@
.TH RST_DECK
.SH NAME
rst_deck \- Create a version of deck ready for restart

View File

@@ -5,8 +5,8 @@
Module: opm-common
Description: Open Porous Media Initiative shared infrastructure
Version: 2021.10-rc2
Label: 2021.10-rc2
Version: 2021.04-pre
Label: 2021.04-pre
Maintainer: opm@opm-project.org
MaintainerName: OPM community
Url: http://opm-project.org

View File

@@ -39,7 +39,7 @@ static void printHelp() {
std::cout << "\nThis program create one or more lodsmry files, designed for effective load on the demand. \n"
<< "These files are created with input from the smspec and unsmry file. \n"
<< "\nIn addition, the program takes these options (which must be given before the arguments):\n\n"
<< "-f if ESMRY file exist, this will be replaced. Default behaviour is that existing file is kept.\n"
<< "-f if LODSMRY file exist, this will be replaced. Default behaviour is that existing file is kept.\n"
<< "-n Maximum number of threads to be used if mulitple files should be created.\n"
<< "-h Print help and exit.\n\n";
}
@@ -48,9 +48,7 @@ static void printHelp() {
int main(int argc, char **argv) {
int c = 0;
#ifdef _OPENMP
int max_threads = -1;
#endif
int max_threads [[maybe_unused]] = -1;
bool force = false;
while ((c = getopt(argc, argv, "fn:h")) != -1) {
@@ -62,11 +60,7 @@ int main(int argc, char **argv) {
printHelp();
return 0;
case 'n':
#ifdef _OPENMP
max_threads = atoi(optarg);
#else
std::cerr << "OpenMP is disabled - using single thread only\n";
#endif
break;
default:
return EXIT_FAILURE;
@@ -95,21 +89,21 @@ int main(int argc, char **argv) {
for (int f = argOffset; f < argc; f ++){
Opm::filesystem::path inputFileName = argv[f];
Opm::filesystem::path esmryFileName = inputFileName.parent_path() / inputFileName.stem();
esmryFileName = esmryFileName += ".ESMRY";
Opm::filesystem::path lodFileName = inputFileName.parent_path() / inputFileName.stem();
lodFileName = lodFileName += ".LODSMRY";
if (Opm::EclIO::fileExists(esmryFileName) && (force))
remove (esmryFileName);
if (Opm::EclIO::fileExists(lodFileName) && (force))
remove (lodFileName);
Opm::EclIO::ESmry smryFile(argv[f]);
if (!smryFile.make_esmry_file()){
if (!smryFile.make_lodsmry_file()){
std::cout << "\n! Warning, smspec already have one lod file, existing kept use option -f to replace this" << std::endl;
}
}
auto lap1 = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds1 = lap1-lap0;
std::cout << "\nruntime for creating " << (argc-argOffset) << " ESMRY files: " << elapsed_seconds1.count() << " seconds\n" << std::endl;
std::cout << "\nruntime for creating " << (argc-argOffset) << " LODSMRY files: " << elapsed_seconds1.count() << " seconds\n" << std::endl;
return 0;
}

View File

@@ -20,8 +20,6 @@
#include <vector>
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <fmt/format.h>
#include <opm/parser/eclipse/Parser/Parser.hpp>
@@ -51,7 +49,7 @@ struct keyword {
};
std::vector<keyword> load_deck(const std::string& deck_file) {
std::vector<keyword> load_deck(const char * deck_file) {
Opm::ParseContext parseContext;
Opm::ErrorGuard errors;
Opm::Parser parser;
@@ -75,7 +73,7 @@ std::vector<keyword> load_deck(const std::string& deck_file) {
}
std::size_t make_deck_hash(const std::vector<keyword>& keywords) {
std::size_t deck_hash(const std::vector<keyword>& keywords) {
std::stringstream ss;
for (const auto& kw : keywords)
ss << kw.content_hash;
@@ -84,14 +82,14 @@ std::size_t make_deck_hash(const std::vector<keyword>& keywords) {
}
void print_keywords(const std::vector<keyword>& keywords, std::size_t deck_hash, bool location_info) {
void print_keywords(const std::vector<keyword>& keywords, bool location_info) {
for (const auto& kw : keywords) {
if (location_info)
fmt::print("{:8s} : {}:{} {} \n", kw.name, kw.filename, kw.line_number, kw.content_hash);
else
fmt::print("{:8s} : {} \n", kw.name, kw.content_hash);
}
fmt::print("\n{:8s} : {}\n", "Total", deck_hash);
fmt::print("\n{:8s} : {}\n", "Total", deck_hash(keywords));
}
@@ -120,12 +118,6 @@ Options:
-l : Add filename and linenumber information to each keyword.
-s : Short form - only print the hash of the complete deck.
-S : Silent form - will not print any deck output.
It is possible to add multiple deck arguments, they are then scanned repeatedly,
and the decks are compared. In the case of multiple deck arguments the exit
status of the program will be zero if all are equal and nonzero in case of
differences.
)";
std::cerr << help_text << std::endl;
@@ -137,11 +129,10 @@ int main(int argc, char** argv) {
int arg_offset = 1;
bool location_info = false;
bool short_form = false;
bool silent = false;
while (true) {
int c;
c = getopt(argc, argv, "lsS");
c = getopt(argc, argv, "ls");
if (c == -1)
break;
@@ -152,53 +143,16 @@ int main(int argc, char** argv) {
case 's':
short_form = true;
break;
case 'S':
silent = true;
break;
}
}
arg_offset = optind;
if (arg_offset >= argc)
print_help_and_exit();
std::vector<std::pair<std::string, std::size_t>> deck_hash_table;
for (int iarg = arg_offset; iarg < argc; iarg++) {
const std::string deck_file = argv[iarg];
auto keywords = load_deck(deck_file);
auto deck_hash = make_deck_hash(keywords);
deck_hash_table.emplace_back(deck_file, deck_hash);
if (silent)
continue;
if (short_form)
std::cout << deck_hash << std::endl;
else
print_keywords(keywords, deck_hash, location_info);
}
if (deck_hash_table.size() > 1) {
bool equal = true;
const auto& [first_deck, first_hash] = deck_hash_table[0];
for (std::size_t index = 1; index < deck_hash_table.size(); index++) {
const auto& [deck, hash] = deck_hash_table[index];
if (first_hash != hash)
equal = false;
if (silent)
continue;
fmt::print("{} {} {}\n",
first_deck,
(first_hash == hash) ? "==" : "!=",
deck);
}
if (equal)
std::exit(EXIT_SUCCESS);
else
std::exit(EXIT_FAILURE);
}
auto keywords = load_deck(argv[arg_offset]);
if (short_form)
std::cout << deck_hash(keywords) << std::endl;
else
print_keywords(keywords, location_info);
}

View File

@@ -1,271 +0,0 @@
/*
Copyright 2021 Statoil ASA.
This file is part of the Open Porous Media project (OPM).
OPM is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OPM is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <getopt.h>
#include <fmt/format.h>
#include <unordered_set>
#include <opm/parser/eclipse/Deck/DeckKeyword.hpp>
#include <opm/common/utility/FileSystem.hpp>
#include <opm/parser/eclipse/Units/UnitSystem.hpp>
#include <opm/parser/eclipse/Parser/ParserKeywords/I.hpp>
#include <opm/parser/eclipse/Parser/ParserKeywords/P.hpp>
#include <opm/parser/eclipse/Parser/ParserKeywords/G.hpp>
#include <opm/parser/eclipse/Parser/ParserKeywords/R.hpp>
#include <opm/parser/eclipse/Parser/ParserKeywords/S.hpp>
#include <opm/parser/eclipse/Parser/Parser.hpp>
#include <opm/parser/eclipse/Parser/ErrorGuard.hpp>
#include <opm/parser/eclipse/Parser/ParseContext.hpp>
#include <opm/parser/eclipse/Parser/InputErrorAction.hpp>
#include <opm/parser/eclipse/Deck/Deck.hpp>
#include <opm/parser/eclipse/Deck/FileDeck.hpp>
namespace fs = Opm::filesystem;
const std::unordered_set<std::string> remove_from_solution = {"EQUIL", "PRESSURE", "SWAT", "SGAS"};
void print_help_and_exit(const std::optional<std::string> error_msg = {}) {
if (error_msg.has_value()) {
std::cerr << "Error:" << std::endl;
std::cerr << error_msg.value() << std::endl;
std::cerr << "------------------------------------------------------" << std::endl;
}
std::string keep_keywords;
for (const auto& kw : Opm::FileDeck::rst_keep_in_solution)
keep_keywords += kw + " ";
const std::string help_text = fmt::format(R"(
The rst_deck program will load a simulation deck and parameters for a restart
and reformat the deck to become a restart deck. Before the updated deck is
output the program will update the SOLUTION and SCHEDULE sections. All keywords
from the SOLUTION section will be cleared out(1) and a RESTART keyword will be
inserted. In the SCHEDULE section the program can either remove all keywords up
until the restart date, or alternatively insert SKIPREST immediately following
the SCHEDULE keyword(2).
When creating the updated restart deck the program can either link to unmodified
include files with INCLUDE statements, create a copy of deck structure in an
alternative location or create one large file with all keywords in the same
file. Apart from the alterations to support restart the output deck will be
equivalent to the input deck, but formatting is not retained and comments have
been stripped away.
Arguments:
1. The data file we are starting with.
2. The basename of the restart file - with an optional path prefix and a :N to
restart from step N(3). A restart step value of 0 is interpreted as a dry run
- a deck which has not been set up for restart will be written out.
3. Basename of the restart deck we create, can optionally contain a path prefix;
the path will be created if it does not already exist. This argument is
optional, if it is not provided the program will dump a restart deck on
stdout. If the argument corresponds to an existing directory the restart case
will get the same name as the base case.
Options:
-s: Manipulate the SCHEDULE section by inserting a SKIPREST keyword immediately
following the SCHEDULE keyword. If the -s option is not used the SCHEDULE
section will be modified by removing all keywords until we reach the restart
date. NB: Currently the -s option is required
-m: [share|inline|copy] The restart deck can reuse the unmodified include files
from the base case, this is mode 'share' and is the default. With mode
'inline' the restart deck will be one long file and with mode 'copy' the
file structure of the base case will be retained. The default if no -m
option is given is the 'share' mode.
In the case of 'share' and 'copy' the correct path to include files will be
negotiated based on the path given to the output case in the third argument.
If the restart deck is passed to stdout the include files will be resolved
based on output in cwd.
Example:
rst_deck /path/to/history/HISTORY.DATA rst/HISTORY:30 /path/to/rst/RESTART -s
1: The program has a compiled list of keywords which will be retained in the
SOLUTION section. The current value of that list is: {}
2: Current version of the program *only* supports the SKIPREST option, and the
-s option is required.
3: The second argument is treated purely as a string and inserted verbatim into
the updated restart deck. In a future version we might interpret the second
argument as a file path and check the content and also do filesystem
manipulations from it.
)", keep_keywords);
std::cerr << help_text << std::endl;
if (error_msg.has_value())
std::exit(EXIT_FAILURE);
std::exit(EXIT_SUCCESS);
}
struct options {
std::string input_deck;
std::pair<std::string, int> restart;
std::optional<std::string> target;
Opm::FileDeck::OutputMode mode{Opm::FileDeck::OutputMode::SHARE};
bool skiprest{false};
};
Opm::FileDeck load_deck(const options& opt) {
Opm::ParseContext parseContext(Opm::InputError::WARN);
Opm::ErrorGuard errors;
Opm::Parser parser;
/* Use the same default ParseContext as flow. */
parseContext.update(Opm::ParseContext::PARSE_RANDOM_SLASH, Opm::InputError::IGNORE);
parseContext.update(Opm::ParseContext::PARSE_MISSING_DIMS_KEYWORD, Opm::InputError::WARN);
parseContext.update(Opm::ParseContext::SUMMARY_UNKNOWN_WELL, Opm::InputError::WARN);
parseContext.update(Opm::ParseContext::SUMMARY_UNKNOWN_GROUP, Opm::InputError::WARN);
auto deck = parser.parseFile(opt.input_deck, parseContext, errors);
return Opm::FileDeck{ deck };
}
Opm::FileDeck::OutputMode mode(const std::string& mode_arg) {
if (mode_arg == "inline")
return Opm::FileDeck::OutputMode::INLINE;
if (mode_arg == "share")
return Opm::FileDeck::OutputMode::SHARE;
if (mode_arg == "copy")
return Opm::FileDeck::OutputMode::COPY;
print_help_and_exit(fmt::format("Mode argument: \'{}\' not recognized. Valid options are inline|share|copy", mode_arg));
return Opm::FileDeck::OutputMode::INLINE;
}
std::pair<std::string, std::size_t> split_restart(const std::string& restart_base) {
auto sep_pos = restart_base.rfind(':');
if (sep_pos == std::string::npos)
print_help_and_exit(fmt::format("Expected restart argument on the form: BASE:NUMBER - e.g. HISTORY:60"));
return std::make_pair(restart_base.substr(0, sep_pos), std::stoi(restart_base.substr(sep_pos + 1)));
}
options load_options(int argc, char **argv) {
options opt;
while (true) {
int c;
c = getopt(argc, argv, "hm:s");
if (c == -1)
break;
switch(c) {
case 'm':
opt.mode = mode(optarg);
break;
case 's':
opt.skiprest = true;
break;
case 'h':
print_help_and_exit();
break;
}
}
auto arg_offset = optind;
if (arg_offset >= argc)
print_help_and_exit();
opt.input_deck = argv[arg_offset];
opt.restart = split_restart(argv[arg_offset + 1]);
if ((argc - arg_offset) >= 3) {
opt.target = argv[arg_offset + 2];
if (opt.mode == Opm::FileDeck::OutputMode::COPY) {
auto target = fs::path(opt.target.value()).parent_path();
if (fs::exists(target)) {
auto input = fs::path(opt.input_deck).parent_path();
if (fs::equivalent(target, input))
opt.mode = Opm::FileDeck::OutputMode::SHARE;
}
}
} else {
if (opt.mode == Opm::FileDeck::OutputMode::COPY)
print_help_and_exit("When writing output to stdout you must use inline|share mode");
}
return opt;
}
void update_solution(const options& opt, Opm::FileDeck& file_deck)
{
if (opt.restart.second == 0)
return;
const auto solution = file_deck.find("SOLUTION");
if (!solution.has_value())
print_help_and_exit(fmt::format("Could not find SOLUTION section in input deck: {}", opt.input_deck));
auto summary = file_deck.find("SUMMARY");
if (!summary.has_value())
print_help_and_exit(fmt::format("Could not find SUMMARY section in input deck: {}", opt.input_deck));
file_deck.rst_solution(opt.restart.first, opt.restart.second);
}
void update_schedule(const options& opt, Opm::FileDeck& file_deck)
{
if (opt.restart.second == 0)
return;
if (opt.skiprest)
file_deck.insert_skiprest();
}
int main(int argc, char** argv) {
auto options = load_options(argc, argv);
auto file_deck = load_deck(options);
update_solution(options, file_deck);
update_schedule(options, file_deck);
if (!options.target.has_value())
file_deck.dump_stdout(fs::current_path(), options.mode);
else {
std::string target = options.target.value();
if (fs::is_directory(target))
file_deck.dump( fs::absolute(target), fs::path(options.input_deck).filename(), options.mode );
else {
auto target_path = fs::path( fs::absolute(options.target.value()) );
file_deck.dump( fs::absolute(target_path.parent_path()), target_path.filename(), options.mode );
}
}
}

View File

@@ -20,7 +20,6 @@
#include <fstream>
#include <iomanip>
#include <chrono>
#include <sstream>
#include <opm/parser/eclipse/Parser/Parser.hpp>
#include <opm/parser/eclipse/Parser/ParseContext.hpp>

View File

@@ -222,12 +222,8 @@ function build_downstreams {
# $1 = Name of main module
function build_module_full {
PY_MAJOR=`python3 --version | awk -F ' ' '{print $2}' | awk -F '.' '{print $1}'`
PY_MINOR=`python3 --version | awk -F ' ' '{print $2}' | awk -F '.' '{print $2}'`
for configuration in ${!configurations[@]}
do
export PYTHONPATH="$WORKSPACE/$configuration/install/lib/python$PY_MAJOR.$PY_MINOR/dist-packages"
# Build upstream modules
build_upstreams

View File

@@ -14,9 +14,6 @@ then
if ! test -d $WORKSPACE/deps/opm-tests
then
cp $OPM_TESTS_ROOT_PREDEFINED $WORKSPACE/deps/opm-tests -R
pushd $WORKSPACE/deps/opm-tests
echo "opm-tests revision: `git rev-parse HEAD`"
popd
fi
else
# We need a full repo checkout
@@ -32,9 +29,6 @@ else
if ! test -d $WORKSPACE/deps/opm-tests
then
cp $OPM_TESTS_ROOT $WORKSPACE/deps/opm-tests -R
pushd $WORKSPACE/deps/opm-tests
echo "opmt-tests-revision: `git rev-parse HEAD`"
popd
fi
fi
OPM_TESTS_ROOT=$WORKSPACE/deps/opm-tests

View File

@@ -37,14 +37,14 @@ do
prnumber=${rev//[!0-9]/}
BRANCH_NAME="${BRANCH_NAME}_${repo}_$prnumber"
test -n "$REASON" && REASON+=" "
REASON+="PR https://github.com/OPM/$repo/pull/$prnumber\n"
REASON+="https://github.com/OPM/$repo/pull/$prnumber\n"
fi
done
# Do the commit
export REASON
export BRANCH_NAME
$WORKSPACE/deps/opm-simulators/tests/update_reference_data.sh $OPM_TESTS_ROOT $WORKSPACE/$configuration/build-opm-simulators $WORKSPACE/$configuration/install/bin/convertECL
$WORKSPACE/deps/opm-simulators/tests/update_reference_data.sh $OPM_TESTS_ROOT
if test $? -eq 5
then
echo "No tests failed - no data to update. Exiting"
@@ -90,7 +90,7 @@ fi
if [ -n "$DATA_PR" ]
then
curl -d "{ \"body\": \"Existing PR https://github.com/OPM/opm-tests/pull/$DATA_PR was updated\" }" -H "Authorization: token ${GH_TOKEN}" -X POST https://api.github.com/repos/OPM/$MAIN_REPO/issues/$PRNUMBER/comments
curl -d "{ \"body\": \"Existing PR https://github.com/OPM/opm-tests/pull/$DATA_PR was updated\" }" -X POST https://api.github.com/repos/OPM/$MAIN_REPO/issues/$PRNUMBER/comments?access_token=$GH_TOKEN
else
git-open-pull -u jenkins4opm --base-account OPM --base-repo opm-tests -r /tmp/cmsg $BRANCH_NAME
fi

View File

@@ -27,7 +27,6 @@ class Parser;
class Python;
class SummaryState;
class UDQState;
class WellTestState;
namespace Action {
class State;
@@ -49,10 +48,10 @@ public:
void post_step(Schedule& schedule, Action::State& action_state, SummaryState& st, data::Solution& sol, data::Wells& well_data, data::GroupAndNetworkValues& group_nwrk_data, size_t report_step, const time_point& sim_time);
private:
void run_step(const Schedule& schedule, Action::State& action_state, WellTestState& wtest_state, SummaryState& st, UDQState& udq_state, data::Solution& sol, data::Wells& well_data, data::GroupAndNetworkValues& group_nwrk_data, size_t report_step, EclipseIO& io) const;
void run_step(const Schedule& schedule, Action::State& action_state, WellTestState& wtest_state, SummaryState& st, UDQState& udq_state, data::Solution& sol, data::Wells& well_data, data::GroupAndNetworkValues& group_nwrk_data, size_t report_step, double dt, EclipseIO& io) const;
void output(Action::State& action_state, WellTestState& wtest_state, SummaryState& st, const UDQState& udq_state, size_t report_step, bool substep, double seconds_elapsed, const data::Solution& sol, const data::Wells& well_data, const data::GroupAndNetworkValues& group_data, EclipseIO& io) const;
void simulate(const Schedule& schedule, WellTestState& wtest_state, const SummaryState& st, data::Solution& sol, data::Wells& well_data, data::GroupAndNetworkValues& group_nwrk_data, size_t report_step, double seconds_elapsed, double time_step) const;
void run_step(const Schedule& schedule, Action::State& action_state, SummaryState& st, UDQState& udq_state, data::Solution& sol, data::Wells& well_data, data::GroupAndNetworkValues& group_nwrk_data, size_t report_step, EclipseIO& io) const;
void run_step(const Schedule& schedule, Action::State& action_state, SummaryState& st, UDQState& udq_state, data::Solution& sol, data::Wells& well_data, data::GroupAndNetworkValues& group_nwrk_data, size_t report_step, double dt, EclipseIO& io) const;
void output(Action::State& action_state, SummaryState& st, const UDQState& udq_state, size_t report_step, bool substep, double seconds_elapsed, const data::Solution& sol, const data::Wells& well_data, const data::GroupAndNetworkValues& group_data, EclipseIO& io) const;
void simulate(const Schedule& schedule, const SummaryState& st, data::Solution& sol, data::Wells& well_data, data::GroupAndNetworkValues& group_nwrk_data, size_t report_step, double seconds_elapsed, double time_step) const;
EclipseState state;
std::map<std::string, std::map<data::Rates::opt, std::function<well_rate_function>>> well_rates;

View File

@@ -18,7 +18,6 @@
*/
#include <iostream>
#include <utility>
#include <opm/output/eclipse/Inplace.hpp>
#include <opm/output/eclipse/EclipseIO.hpp>
@@ -34,7 +33,6 @@
#include <opm/parser/eclipse/EclipseState/Schedule/Action/State.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQState.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQConfig.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Well/WellTestState.hpp>
#include <opm/parser/eclipse/Parser/Parser.hpp>
#include <opm/parser/eclipse/Parser/ParseContext.hpp>
#include <opm/parser/eclipse/Parser/ErrorGuard.hpp>
@@ -51,7 +49,6 @@ void msim::run(Schedule& schedule, EclipseIO& io, bool report_only) {
data::Solution sol;
SummaryState st(TimeService::from_time_t(schedule.getStartTime()));
UDQState udq_state(schedule.getUDQConfig(0).params().undefinedValue());
WellTestState wtest_state;
Action::State action_state;
Python python;
@@ -60,10 +57,10 @@ void msim::run(Schedule& schedule, EclipseIO& io, bool report_only) {
data::Wells well_data;
data::GroupAndNetworkValues group_nwrk_data;
if (report_only)
run_step(schedule, action_state, wtest_state, st, udq_state, sol, well_data, group_nwrk_data, report_step, io);
run_step(schedule, action_state, st, udq_state, sol, well_data, group_nwrk_data, report_step, io);
else {
double time_step = std::min(week, 0.5*schedule.stepLength(report_step - 1));
run_step(schedule, action_state, wtest_state, st, udq_state, sol, well_data, group_nwrk_data, report_step, time_step, io);
run_step(schedule, action_state, st, udq_state, sol, well_data, group_nwrk_data, report_step, time_step, io);
}
auto sim_time = TimeService::from_time_t( schedule.simTime(report_step) );
post_step(schedule, action_state, st, sol, well_data, group_nwrk_data, report_step, sim_time);
@@ -97,12 +94,12 @@ void msim::post_step(Schedule& schedule, Action::State& action_state, SummarySta
void msim::run_step(const Schedule& schedule, Action::State& action_state, WellTestState& wtest_state, SummaryState& st, UDQState& udq_state, data::Solution& sol, data::Wells& well_data, data::GroupAndNetworkValues& grp_nwrk_data, size_t report_step, EclipseIO& io) const {
this->run_step(schedule, action_state, wtest_state, st, udq_state, sol, well_data, grp_nwrk_data, report_step, schedule.stepLength(report_step - 1), io);
void msim::run_step(const Schedule& schedule, Action::State& action_state, SummaryState& st, UDQState& udq_state, data::Solution& sol, data::Wells& well_data, data::GroupAndNetworkValues& grp_nwrk_data, size_t report_step, EclipseIO& io) const {
this->run_step(schedule, action_state, st, udq_state, sol, well_data, grp_nwrk_data, report_step, schedule.stepLength(report_step - 1), io);
}
void msim::run_step(const Schedule& schedule, Action::State& action_state, WellTestState& wtest_state, SummaryState& st, UDQState& udq_state, data::Solution& sol, data::Wells& well_data, data::GroupAndNetworkValues& group_nwrk_data, size_t report_step, double dt, EclipseIO& io) const {
void msim::run_step(const Schedule& schedule, Action::State& action_state, SummaryState& st, UDQState& udq_state, data::Solution& sol, data::Wells& well_data, data::GroupAndNetworkValues& group_nwrk_data, size_t report_step, double dt, EclipseIO& io) const {
double start_time = schedule.seconds(report_step - 1);
double end_time = schedule.seconds(report_step);
double seconds_elapsed = start_time;
@@ -112,7 +109,7 @@ void msim::run_step(const Schedule& schedule, Action::State& action_state, WellT
if ((seconds_elapsed + time_step) > end_time)
time_step = end_time - seconds_elapsed;
this->simulate(schedule, wtest_state, st, sol, well_data, group_nwrk_data, report_step, seconds_elapsed, time_step);
this->simulate(schedule, st, sol, well_data, group_nwrk_data, report_step, seconds_elapsed, time_step);
seconds_elapsed += time_step;
@@ -129,7 +126,6 @@ void msim::run_step(const Schedule& schedule, Action::State& action_state, WellT
schedule.getUDQConfig( report_step ).eval(report_step, schedule.wellMatcher(report_step), st, udq_state);
this->output(action_state,
wtest_state,
st,
udq_state,
report_step,
@@ -144,20 +140,19 @@ void msim::run_step(const Schedule& schedule, Action::State& action_state, WellT
void msim::output(Action::State& action_state, WellTestState& wtest_state, SummaryState& st, const UDQState& udq_state, size_t report_step, bool substep, double seconds_elapsed, const data::Solution& sol, const data::Wells& well_data, const data::GroupAndNetworkValues& group_nwrk_data, EclipseIO& io) const {
RestartValue value(sol, well_data, group_nwrk_data, {});
void msim::output(Action::State& action_state, SummaryState& st, const UDQState& udq_state, size_t report_step, bool substep, double seconds_elapsed, const data::Solution& sol, const data::Wells& well_data, const data::GroupAndNetworkValues& group_nwrk_data, EclipseIO& io) const {
RestartValue value(sol, well_data, group_nwrk_data);
io.writeTimeStep(action_state,
wtest_state,
st,
udq_state,
report_step,
substep,
seconds_elapsed,
std::move(value));
value);
}
void msim::simulate(const Schedule& schedule, WellTestState&, const SummaryState& st, data::Solution& sol, data::Wells& well_data, data::GroupAndNetworkValues& /* group_nwrk_data */, size_t report_step, double seconds_elapsed, double time_step) const {
void msim::simulate(const Schedule& schedule, const SummaryState& st, data::Solution& sol, data::Wells& well_data, data::GroupAndNetworkValues& /* group_nwrk_data */, size_t report_step, double seconds_elapsed, double time_step) const {
for (const auto& sol_pair : this->solutions) {
auto func = sol_pair.second;
func(this->state, schedule, sol, report_step, seconds_elapsed + time_step);

View File

@@ -53,7 +53,7 @@
do { \
std::ostringstream oss__; \
oss__ << "[" << __FILE__ << ":" << __LINE__ << "] " << message; \
::Opm::OpmLog::error(oss__.str()); \
Opm::OpmLog::error(oss__.str()); \
throw Exception(oss__.str()); \
} while (false)

View File

@@ -23,9 +23,9 @@
#include <cstdint>
#include <string>
namespace Opm {
#include <opm/common/OpmLog/KeywordLocation.hpp>
class KeywordLocation;
namespace Opm {
namespace Log {
namespace MessageType {

View File

@@ -88,8 +88,6 @@ public:
}
static bool stdoutIsTerminal();
private:
static std::shared_ptr<Logger> getLogger();
static std::shared_ptr<Logger> m_logger;

View File

@@ -34,11 +34,8 @@ namespace Opm
#if __cplusplus < 201703L || \
(defined(__GNUC__) && __GNUC__ < 8 && !defined(__clang__))
namespace filesystem = std::experimental::filesystem;
filesystem::path proximate(const filesystem::path& p,
const filesystem::path& base = filesystem::current_path());
#else
namespace filesystem = std::filesystem;
using filesystem::proximate;
#endif
// A poor man's filesystem::unique_path

View File

@@ -17,14 +17,14 @@
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef OPM_SERIALIZER_HPP
#define OPM_SERIALIZER_HPP
#include <cstring>
#include <string>
#include <unordered_map>
#include <vector>
#ifndef OPM_SERIALIZER_HPP
#define OPM_SERIALIZER_HPP
namespace Opm {
/*
This is a very basic serialization class used to support serialization of

View File

@@ -3,10 +3,6 @@
#include <algorithm>
#include <cctype>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <optional>
#include <sstream>
#include <string>
#include <vector>
@@ -107,25 +103,6 @@ inline std::vector<std::string> split_string(const std::string& input,
return result;
}
inline std::string format_double(double d) {
double integral_part;
const double decimal_part = std::modf(d, &integral_part);
if (decimal_part == 0)
return std::to_string(static_cast<int>(d));
else
return std::to_string(d);
}
inline std::optional<double> try_parse_double(const std::string& token) {
char * end_ptr;
auto value = std::strtod(token.c_str(), &end_ptr);
if (std::strlen(end_ptr) == 0)
return value;
return std::nullopt;
}
}
#endif //OPM_UTILITY_STRING_HPP

View File

@@ -24,7 +24,6 @@
#include <ctime>
#include <string>
#include <unordered_map>
#include <opm/parser/eclipse/Deck/DeckRecord.hpp>
namespace Opm {
@@ -39,13 +38,7 @@ namespace Opm {
std::time_t advance(const std::time_t tp, const double sec);
std::time_t makeUTCTime(std::tm timePoint);
const std::unordered_map<std::string , int>& eclipseMonthIndices();
const std::unordered_map<int, std::string>& eclipseMonthNames();
int eclipseMonth(const std::string& name);
bool valid_month(const std::string& month_name);
std::time_t mkdatetime(int in_year, int in_month, int in_day, int hour, int minute, int second);
std::time_t mkdate(int in_year, int in_month, int in_day);
std::time_t timeFromEclipse(const DeckRecord &dateRecord);
}
class TimeStampUTC
@@ -122,8 +115,6 @@ namespace Opm {
TimeStampUTC operator+(const TimeStampUTC& lhs, std::chrono::duration<double> delta);
std::time_t asTimeT(const TimeStampUTC& tp);
std::time_t asLocalTimeT(const TimeStampUTC& tp);
time_point asTimePoint(const TimeStampUTC& tp);
} // namespace Opm

View File

@@ -5,7 +5,7 @@
// Created: Mon Jun 29 15:28:59 2009
//
// Author(s): Atgeirr F Rasmussen <atgeirr@sintef.no>
// Bård Skaflestad <bard.skaflestad@sintef.no>
// B<EFBFBD>rd Skaflestad <bard.skaflestad@sintef.no>
//
// $Date$
//

View File

@@ -4,7 +4,7 @@
//
// Created: Tue Jun 2 16:00:21 2009
//
// Author(s): Bård Skaflestad <bard.skaflestad@sintef.no>
// Author(s): B<EFBFBD>rd Skaflestad <bard.skaflestad@sintef.no>
// Atgeirr F Rasmussen <atgeirr@sintef.no>
//
// $Date$

View File

@@ -4,7 +4,7 @@
//
// Created: Tue Jun 2 19:11:11 2009
//
// Author(s): Bård Skaflestad <bard.skaflestad@sintef.no>
// Author(s): B<EFBFBD>rd Skaflestad <bard.skaflestad@sintef.no>
// Atgeirr F Rasmussen <atgeirr@sintef.no>
//
// $Date$

View File

@@ -4,7 +4,7 @@
//
// Created: Tue Jun 2 19:06:46 2009
//
// Author(s): Bård Skaflestad <bard.skaflestad@sintef.no>
// Author(s): B<EFBFBD>rd Skaflestad <bard.skaflestad@sintef.no>
// Atgeirr F Rasmussen <atgeirr@sintef.no>
//
// $Date$
@@ -142,7 +142,7 @@ namespace Opm {
assignments.push_back(std::make_pair(name, value));
continue;
}
OpmLog::warning("Too many assignments (' "
OpmLog::warning("Too many assignements (' "
+ ID_delimiter_assignment
+ "') detected in argument " + to_string(i));
}

View File

@@ -4,7 +4,7 @@
//
// Created: Tue Jun 2 19:05:54 2009
//
// Author(s): Bård Skaflestad <bard.skaflestad@sintef.no>
// Author(s): B<EFBFBD>rd Skaflestad <bard.skaflestad@sintef.no>
// Atgeirr F Rasmussen <atgeirr@sintef.no>
//
// $Date$

View File

@@ -4,7 +4,7 @@
//
// Created: Tue Jun 2 19:05:02 2009
//
// Author(s): Bård Skaflestad <bard.skaflestad@sintef.no>
// Author(s): B<EFBFBD>rd Skaflestad <bard.skaflestad@sintef.no>
// Atgeirr F Rasmussen <atgeirr@sintef.no>
//
// $Date$

View File

@@ -4,7 +4,7 @@
//
// Created: Tue Jun 2 19:04:15 2009
//
// Author(s): Bård Skaflestad <bard.skaflestad@sintef.no>
// Author(s): B<EFBFBD>rd Skaflestad <bard.skaflestad@sintef.no>
// Atgeirr F Rasmussen <atgeirr@sintef.no>
//
// $Date$

View File

@@ -4,7 +4,7 @@
//
// Created: Tue Jun 2 19:02:19 2009
//
// Author(s): Bård Skaflestad <bard.skaflestad@sintef.no>
// Author(s): B<EFBFBD>rd Skaflestad <bard.skaflestad@sintef.no>
// Atgeirr F Rasmussen <atgeirr@sintef.no>
//
// $Date$

View File

@@ -48,9 +48,6 @@ public:
void getCellCorners(int globindex, std::array<double,8>& X, std::array<double,8>& Y, std::array<double,8>& Z);
void getCellCorners(const std::array<int, 3>& ijk, std::array<double,8>& X, std::array<double,8>& Y, std::array<double,8>& Z);
std::vector<std::array<float, 3>> getXYZ_layer(int layer, bool bottom=false);
std::vector<std::array<float, 3>> getXYZ_layer(int layer, const std::array<int, 4>& box, bool bottom=false);
int activeCells() const { return nactive; }
int totalNumberOfCells() const { return nijk[0] * nijk[1] * nijk[2]; }
@@ -67,17 +64,11 @@ public:
const std::vector<std::string>& list_of_lgrs() const { return lgr_names; }
const std::vector<float>& get_mapaxes() const { return m_mapaxes; }
const std::string& get_mapunits() const { return m_mapunits; }
private:
Opm::filesystem::path inputFileName, initFileName;
std::string m_grid_name;
bool m_radial;
std::vector<float> m_mapaxes;
std::string m_mapunits;
std::array<int, 3> nijk;
std::array<int, 3> host_nijk;
@@ -102,12 +93,6 @@ private:
int actnum_array_index;
int nnc1_array_index;
int nnc2_array_index;
std::vector<float> get_zcorn_from_disk(int layer, bool bottom);
void getCellCorners(const std::array<int, 3>& ijk, const std::vector<float>& zcorn_layer,
std::array<double,4>& X, std::array<double,4>& Y, std::array<double,4>& Z);
};
}} // namespace Opm::EclIO

View File

@@ -51,7 +51,35 @@ public:
protected:
template <typename T>
const std::vector<T>& ImplgetInitData(const std::string& name, const std::string& grid_name = "global");
const std::vector<T>& ImplgetInitData(const std::string& name, const std::string& grid_name = "global")
{
int arr_ind = get_array_index(name, grid_name);
if constexpr (std::is_same_v<T, int>)
return getImpl(arr_ind, INTE, inte_array, "integer");
if constexpr (std::is_same_v<T, float>)
return getImpl(arr_ind, REAL, real_array, "float");
if constexpr (std::is_same_v<T, double>)
return getImpl(arr_ind, DOUB, doub_array, "double");
if constexpr (std::is_same_v<T, bool>)
return getImpl(arr_ind, LOGI, logi_array, "bool");
if constexpr (std::is_same_v<T, std::string>)
{
if (array_type[arr_ind] == Opm::EclIO::CHAR)
return getImpl(arr_ind, array_type[arr_ind], char_array, "char");
if (array_type[arr_ind] == Opm::EclIO::C0NN)
return getImpl(arr_ind, array_type[arr_ind], char_array, "c0nn");
OPM_THROW(std::runtime_error, "Array not of type CHAR or C0nn");
}
OPM_THROW(std::runtime_error, "type not supported");
}
private:
std::array<int, 3> global_nijk;

View File

@@ -53,6 +53,9 @@ public:
template <typename T>
const std::vector<T>& getRestartData(const std::string& name, int reportStepNumber, int occurrence);
template <typename T>
const std::vector<T>& getRestartData(const std::string& name, int reportStepNumber, const std::string& lgr_name);
template <typename T>
const std::vector<T>& getRestartData(int index, int reportStepNumber)
{
@@ -61,10 +64,16 @@ public:
}
template <typename T>
const std::vector<T>& getRestartData(const std::string& name, int reportStepNumber, const std::string& lgr_name);
const std::vector<T>& getRestartData(int index, int reportStepNumber, const std::string& lgr_name)
{
auto indRange = this->getIndexRange(reportStepNumber);
template <typename T>
const std::vector<T>& getRestartData(int index, int reportStepNumber, const std::string& lgr_name);
if ((std::get<0>(indRange) + index) > std::get<1>(indRange))
OPM_THROW(std::invalid_argument, "getRestartData, index out of range");
int start_ind = get_start_index_lgrname(reportStepNumber, lgr_name);
return this->get<T>(index + start_ind);
}
int occurrence_count(const std::string& name, int reportStepNumber) const;
size_t numberOfReportSteps() const { return seqnum.size(); };

View File

@@ -35,7 +35,6 @@ namespace Opm { namespace EclIO {
using ArrSourceEntry = std::tuple<std::string, std::string, int, uint64_t>;
using TimeStepEntry = std::tuple<int, int, uint64_t>;
using RstEntry = std::tuple<std::string, int>;
class ESmry
{
@@ -59,7 +58,7 @@ public:
void LoadData(const std::vector<std::string>& vectList) const;
void LoadData() const;
bool make_esmry_file();
bool make_lodsmry_file();
time_point startdate() const { return startdat; }
@@ -75,17 +74,13 @@ public:
const std::string& get_unit(const SummaryNode& node) const;
void write_rsm(std::ostream&) const;
void write_rsm_file(std::optional<filesystem::path> = std::nullopt) const;
bool all_steps_available();
void write_rsm_file(std::optional<Opm::filesystem::path> = std::nullopt) const;
private:
filesystem::path inputFileName;
RstEntry restart_info;
Opm::filesystem::path inputFileName, lodFileName;
int nI, nJ, nK, nSpecFiles;
bool fromSingleRun;
bool fromSingleRun, lodEnabeled;
uint64_t lod_offset, lod_arr_size;
size_t nVect, nTstep;
std::vector<bool> formattedFiles;
@@ -93,7 +88,6 @@ private:
mutable std::vector<std::vector<float>> vectorData;
mutable std::vector<bool> vectorLoaded;
std::vector<TimeStepEntry> timeStepList;
std::vector<TimeStepEntry> miniStepList;
std::vector<std::map<int, int>> arrayPos;
std::vector<std::string> keyword;
std::map<std::string, int> keyword_index;
@@ -102,7 +96,6 @@ private:
std::vector<std::vector<std::string>> keywordListSpecFile;
std::vector<int> seqIndex;
std::vector<int> mini_steps;
void ijk_from_global_index(int glob, int &i, int &j, int &k) const;
@@ -111,17 +104,15 @@ private:
time_point startdat;
std::vector<std::string> checkForMultipleResultFiles(const filesystem::path& rootN, bool formatted) const;
std::vector<std::string> checkForMultipleResultFiles(const Opm::filesystem::path& rootN, bool formatted) const;
void getRstString(const std::vector<std::string>& restartArray,
filesystem::path& pathRst,
filesystem::path& rootN) const;
Opm::filesystem::path& pathRst,
Opm::filesystem::path& rootN) const;
void updatePathAndRootName(filesystem::path& dir, filesystem::path& rootN) const;
void updatePathAndRootName(Opm::filesystem::path& dir, Opm::filesystem::path& rootN) const;
std::string makeKeyString(const std::string& keyword, const std::string& wgname, int num,
const std::optional<Opm::EclIO::lgr_info> lgr_info) const;
std::string makeKeyString(const std::string& keyword, const std::string& wgname, int num) const;
std::string unpackNumber(const SummaryNode&) const;
std::string lookupKey(const SummaryNode&) const;
@@ -144,9 +135,8 @@ private:
std::vector<std::tuple <std::string, uint64_t>> getListOfArrays(std::string filename, bool formatted);
std::vector<int> makeKeywPosVector(int speInd) const;
std::string read_string_from_disk(std::fstream& fileH, uint64_t size) const;
void read_ministeps_from_disk();
int read_ministep_formatted(std::fstream& fileH);
void inspect_lodsmry();
void Load_from_lodsmry(const std::vector<int>& keywIndVect) const;
};
}} // namespace Opm::EclIO

View File

@@ -19,10 +19,11 @@
#ifndef OPM_IO_ECLFILE_HPP
#define OPM_IO_ECLFILE_HPP
#include <opm/common/ErrorMacros.hpp>
#include <opm/io/eclipse/EclIOdata.hpp>
#include <ios>
#include <map>
#include <string>
#include <stdexcept>
#include <tuple>
@@ -96,7 +97,19 @@ protected:
template<class T>
const std::vector<T>& getImpl(int arrIndex, eclArrType type,
const std::unordered_map<int, std::vector<T>>& array,
const std::string& typeStr);
const std::string& typeStr)
{
if (array_type[arrIndex] != type) {
std::string message = "Array with index " + std::to_string(arrIndex) + " is not of type " + typeStr;
OPM_THROW(std::runtime_error, message);
}
if (!arrayLoaded[arrIndex]) {
loadData(arrIndex);
}
return array.at(arrIndex);
}
std::streampos
seekPosition(const std::vector<std::string>::size_type arrIndex) const;

View File

@@ -1,106 +0,0 @@
/*
Copyright 2019 Equinor ASA.
This file is part of the Open Porous Media project (OPM).
OPM is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OPM is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef OPM_IO_ExtESmry_HPP
#define OPM_IO_ExtESmry_HPP
#include <chrono>
#include <ostream>
#include <string>
#include <unordered_map>
#include <vector>
#include <map>
#include <stdint.h>
#include <opm/common/utility/FileSystem.hpp>
#include <opm/common/utility/TimeService.hpp>
namespace Opm { namespace EclIO {
using ArrSourceEntry = std::tuple<std::string, std::string, int, uint64_t>;
using TimeStepEntry = std::tuple<int, int, uint64_t>;
using RstEntry = std::tuple<std::string, int>;
// start, rstart + rstnum, keycheck, units, rstep, tstep
using LodsmryHeadType = std::tuple<time_point, RstEntry, std::vector<std::string>, std::vector<std::string>,
std::vector<int>, std::vector<int>>;
class ExtESmry
{
public:
// input is esmry, only binary supported.
explicit ExtESmry(const std::string& filename, bool loadBaseRunData=false);
const std::vector<float>& get(const std::string& name);
std::vector<float> get_at_rstep(const std::string& name);
std::string& get_unit(const std::string& name);
void loadData();
void loadData(const std::vector<std::string>& stringVect);
time_point startdate() const { return m_startdat; }
bool hasKey(const std::string& key) const;
size_t numberOfTimeSteps() const { return m_nTstep; }
size_t numberOfVectors() const { return m_nVect; }
const std::vector<std::string>& keywordList() const { return m_keyword;}
std::vector<std::string> keywordList(const std::string& pattern) const;
std::vector<time_point> dates();
bool all_steps_available();
private:
filesystem::path m_inputFileName;
std::vector<filesystem::path> m_lodsmry_files;
bool m_loadBaseRun;
std::vector<std::map<std::string, int>> m_keyword_index;
std::vector<std::tuple<int,int>> m_tstep_range;
std::vector<std::string> m_keyword;
std::vector<int> m_rstep;
std::vector<int> m_tstep;
std::vector<std::vector<int>> m_rstep_v;
std::vector<std::vector<int>> m_tstep_v;
std::vector<std::vector<float>> m_vectorData;
std::vector<bool> m_vectorLoaded;
std::unordered_map<std::string, std::string> kwunits;
size_t m_nVect;
std::vector<size_t> m_nTstep_v;
size_t m_nTstep;
std::vector<int> m_seqIndex;
std::vector<uint64_t> m_lod_offset;
std::vector<uint64_t> m_lod_arr_size;
time_point m_startdat;
uint64_t open_esmry(Opm::filesystem::path& inputFileName, LodsmryHeadType& lodsmry_head);
void updatePathAndRootName(Opm::filesystem::path& dir, Opm::filesystem::path& rootN);
};
}} // namespace Opm::EclIO
#endif // OPM_IO_ExtESmry_HPP

View File

@@ -1,68 +0,0 @@
/*
Copyright 2019 Statoil ASA.
This file is part of the Open Porous Media project (OPM).
OPM is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OPM is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef OPM_IO_ExtSmryOutput_HPP
#define OPM_IO_ExtSmryOutput_HPP
#include <string>
#include <opm/parser/eclipse/EclipseState/EclipseState.hpp>
namespace Opm {
class EclipseState;
}
namespace Opm { namespace EclIO {
class ExtSmryOutput
{
public:
ExtSmryOutput(const std::vector<std::string>& valueKeys, const std::vector<std::string>& valueUnits,
const EclipseState& es, const time_t start_time);
void write(const std::vector<float>& ts_data, int report_step);
private:
std::string m_outputFileName;
int m_nTimeSteps;
int m_nVect;
bool m_fmt;
std::vector<int> m_start_date_vect;
std::string m_restart_rootn;
int m_restart_step;
std::vector<std::string> m_smry_keys;
std::vector<std::string> m_smryUnits;
std::vector<int> m_rstep;
std::vector<int> m_tstep;
std::vector<std::vector<float>> m_smrydata;
std::array<int, 3> ijk_from_global_index(const GridDims& dims, int globInd) const;
std::vector<std::string> make_modified_keys(const std::vector<std::string>& valueKeys, const GridDims& dims);
};
}} // namespace Opm::EclIO
#endif // OPM_IO_ExtSmryOutput_HPP

View File

@@ -1,70 +0,0 @@
/*
Copyright 2021 Equinor ASA.
This file is part of the Open Porous Media project (OPM).
OPM is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OPM is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef OPM_RESTART_FILE_VIEW_HPP
#define OPM_RESTART_FILE_VIEW_HPP
#include <cstddef>
#include <memory>
#include <vector>
namespace Opm { namespace EclIO {
class ERst;
}} // Opm::EclIO
namespace Opm { namespace EclIO {
class RestartFileView
{
public:
explicit RestartFileView(std::shared_ptr<ERst> restart_file,
const int report_step);
~RestartFileView();
RestartFileView(const RestartFileView& rhs) = delete;
RestartFileView(RestartFileView&& rhs);
RestartFileView& operator=(const RestartFileView& rhs) = delete;
RestartFileView& operator=(RestartFileView&& rhs);
std::size_t simStep() const;
int reportStep() const;
int occurrenceCount(const std::string& vector) const;
template <typename ElmType>
bool hasKeyword(const std::string& vector) const;
template <typename ElmType>
const std::vector<ElmType>&
getKeyword(const std::string& vector, const int occurrence = 0) const;
const std::vector<int>& intehead() const;
const std::vector<bool>& logihead() const;
const std::vector<double>& doubhead() const;
private:
class Implementation;
std::unique_ptr<Implementation> pImpl_;
};
}} // Opm::RestartIO
#endif // OPM_RESTART_FILE_VIEW_HPP

View File

@@ -24,15 +24,9 @@
#include <optional>
#include <string>
#include <unordered_set>
#include <array>
namespace Opm { namespace EclIO {
struct lgr_info {
std::string name;
std::array<int, 3> ijk;
};
struct SummaryNode {
enum class Category {
Well,
@@ -58,14 +52,13 @@ struct SummaryNode {
Undefined,
};
std::string keyword;
Category category;
Type type;
std::string wgname;
int number;
std::optional<std::string> fip_region;
std::optional<lgr_info> lgr;
constexpr static int default_number { std::numeric_limits<int>::min() };

View File

@@ -1,78 +0,0 @@
/*
Copyright 2021 Equinor ASA.
This file is part of the Open Porous Media project (OPM).
OPM is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OPM is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef RST_ACTIONX
#define RST_ACTIONX
#include <ctime>
#include <optional>
#include <string>
#include <variant>
#include <vector>
#include <opm/parser/eclipse/EclipseState/Schedule/Action/Enums.hpp>
#include <opm/parser/eclipse/Deck/DeckKeyword.hpp>
namespace Opm {
namespace RestartIO {
struct RstAction {
struct Quantity {
std::variant<std::string, double> quantity;
std::optional<std::string> wgname;
Quantity() = default;
Quantity(const std::string * zacn, double sacn_value);
Quantity(const std::string& quantity);
Quantity(double value);
};
struct Condition {
static bool valid(const std::string * zacn, const int * iacn);
Condition(const std::string * zacn, const int * iacn, const double * sacn);
Action::Logical logic;
Action::Comparator cmp_op;
Quantity lhs;
Quantity rhs;
bool left_paren{false};
bool right_paren{false};
std::vector<std::string> tokens() const;
};
RstAction(const std::string& name_arg, int max_run_arg, int run_count_arg, double min_wait_arg, std::time_t start_time, std::time_t last_run, std::vector<Condition> conditions_arg);
std::string name;
int max_run;
int run_count;
double min_wait;
std::time_t start_time;
std::optional<std::time_t> last_run;
std::vector<Condition> conditions;
std::vector<DeckKeyword> keywords;
};
}
}
#endif

View File

@@ -1,132 +0,0 @@
/*
Copyright 2021 Equinor ASA.
This file is part of the Open Porous Media project (OPM).
OPM is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OPM is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef OPM_RESTART_AQUIFER_HPP
#define OPM_RESTART_AQUIFER_HPP
#include <opm/parser/eclipse/EclipseState/Grid/FaceDir.hpp>
#include <cstddef>
#include <memory>
#include <optional>
#include <unordered_map>
#include <utility>
#include <vector>
namespace Opm {
class AquiferConfig;
class EclipseGrid;
class UnitSystem;
} // Opm
namespace Opm { namespace EclIO {
class RestartFileView;
}} // Opm::EclIO
namespace Opm { namespace RestartIO {
class RstAquifer
{
public:
struct CarterTracy {
int aquiferID{};
int inftableID{};
int pvttableID{};
double porosity{};
double datum_depth{};
double total_compr{};
double inner_radius{};
double permeability{};
double thickness{};
double angle_fraction{};
double initial_pressure{};
double time_constant{};
double influx_constant{};
double water_density{};
double water_viscosity{};
};
struct Fetkovich {
int aquiferID{};
int pvttableID{};
double prod_index{};
double total_compr{};
double initial_watvolume{};
double datum_depth{};
double initial_pressure{};
double time_constant{};
};
class Connections {
public:
struct Cell {
std::size_t global_index;
double influx_coeff;
double effective_facearea;
FaceDir::DirEnum face_dir;
};
const std::vector<Cell>& cells() const
{
return this->cells_;
}
void reserve(const std::vector<Cell>::size_type cpty)
{
this->cells_.reserve(cpty);
}
template <typename... Args>
void emplace_back(Args&&... args)
{
this->cells_.push_back(Cell { std::forward<Args>(args)... });
}
private:
std::vector<Cell> cells_{};
};
explicit RstAquifer(std::shared_ptr<EclIO::RestartFileView> rstView,
const EclipseGrid* grid,
const UnitSystem& usys);
RstAquifer(const RstAquifer& rhs);
RstAquifer(RstAquifer&& rhs);
RstAquifer& operator=(const RstAquifer& rhs);
RstAquifer& operator=(RstAquifer&& rhs);
~RstAquifer();
bool hasAnalyticAquifers() const;
const std::vector<CarterTracy>& carterTracy() const;
const std::vector<Fetkovich>& fetkovich() const;
const std::unordered_map<int, Connections>& connections() const;
private:
class Implementation;
std::unique_ptr<Implementation> pImpl_;
};
}} // Opm::RestartIO
#endif // OPM_RESTART_AQUIFER_HPP

View File

@@ -45,7 +45,6 @@ struct RstGroup {
int winj_cmode;
int ginj_cmode;
int guide_rate_def;
int exceed_action;
float oil_rate_limit;
float water_rate_limit;

View File

@@ -86,11 +86,6 @@ struct RstHeader {
int nmfipr;
int ngroup;
int nwgmax;
int nwell_udq;
int ngroup_udq;
int nfield_udq;
int num_action;
int guide_rate_nominated_phase;
bool e300_radial;
bool e100_radial;
@@ -122,9 +117,7 @@ struct RstHeader {
double udq_undefined;
double udq_eps;
std::time_t sim_time() const;
std::pair<std::time_t, std::size_t> restart_info() const;
int num_udq() const;
};

View File

@@ -19,53 +19,70 @@
#ifndef RST_STATE
#define RST_STATE
#include <memory>
#include <string>
#include <vector>
#include <string>
#include <opm/io/eclipse/ERst.hpp>
#include <opm/io/eclipse/rst/header.hpp>
#include <opm/io/eclipse/rst/aquifer.hpp>
#include <opm/io/eclipse/rst/group.hpp>
#include <opm/io/eclipse/rst/well.hpp>
#include <opm/io/eclipse/rst/udq.hpp>
#include <opm/io/eclipse/rst/action.hpp>
#include <opm/parser/eclipse/Units/UnitSystem.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Tuning.hpp>
#include <opm/parser/eclipse/EclipseState/Runspec.hpp>
namespace Opm {
class EclipseGrid;
class Parser;
class Parser;
} // namespace Opm
namespace Opm { namespace EclIO {
class RestartFileView;
}} // namespace Opm::EclIO
namespace Opm { namespace RestartIO {
namespace RestartIO {
struct RstState {
RstState(std::shared_ptr<EclIO::RestartFileView> rstView,
const ::Opm::EclipseGrid* grid);
RstState(const ::Opm::UnitSystem& unit_system,
const std::vector<int>& intehead,
const std::vector<bool>& logihead,
const std::vector<double>& doubhead);
static RstState load(std::shared_ptr<EclIO::RestartFileView> rstView,
const Runspec& runspec,
const Parser& parser,
const ::Opm::EclipseGrid* grid = nullptr);
RstState(const ::Opm::UnitSystem& unit_system,
const std::vector<int>& intehead,
const std::vector<bool>& logihead,
const std::vector<double>& doubhead,
const std::vector<std::string>& zgrp,
const std::vector<int>& igrp,
const std::vector<float>& sgrp,
const std::vector<double>& xgrp,
const std::vector<std::string>& zwel,
const std::vector<int>& iwel,
const std::vector<float>& swel,
const std::vector<double>& xwel,
const std::vector<int>& icon,
const std::vector<float>& scon,
const std::vector<double>& xcon);
RstState(const ::Opm::UnitSystem& unit_system,
const std::vector<int>& intehead,
const std::vector<bool>& logihead,
const std::vector<double>& doubhead,
const std::vector<std::string>& zgrp,
const std::vector<int>& igrp,
const std::vector<float>& sgrp,
const std::vector<double>& xgrp,
const std::vector<std::string>& zwel,
const std::vector<int>& iwel,
const std::vector<float>& swel,
const std::vector<double>& xwel,
const std::vector<int>& icon,
const std::vector<float>& scon,
const std::vector<double>& xcon,
const std::vector<int>& iseg,
const std::vector<double>& rseg);
static RstState load(EclIO::ERst& rst_file, int report_step);
const RstWell& get_well(const std::string& wname) const;
::Opm::UnitSystem unit_system;
const ::Opm::UnitSystem unit_system;
RstHeader header;
RstAquifer aquifers;
std::vector<RstWell> wells;
std::vector<RstGroup> groups;
std::vector<RstUDQ> udqs;
RstUDQActive udq_active;
std::vector<RstAction> actions;
Tuning tuning;
private:
@@ -76,45 +93,11 @@ private:
const std::vector<int>& igrp,
const std::vector<float>& sgrp,
const std::vector<double>& xgrp);
void add_wells(const std::vector<std::string>& zwel,
const std::vector<int>& iwel,
const std::vector<float>& swel,
const std::vector<double>& xwel,
const std::vector<int>& icon,
const std::vector<float>& scon,
const std::vector<double>& xcon);
void add_msw(const std::vector<std::string>& zwel,
const std::vector<int>& iwel,
const std::vector<float>& swel,
const std::vector<double>& xwel,
const std::vector<int>& icon,
const std::vector<float>& scon,
const std::vector<double>& xcon,
const std::vector<int>& iseg,
const std::vector<double>& rseg);
void add_udqs(const std::vector<int>& iudq,
const std::vector<std::string>& zudn,
const std::vector<std::string>& zudl,
const std::vector<double>& dudw,
const std::vector<double>& dudg,
const std::vector<double>& dudf);
void add_actions(const Parser& parser,
const Runspec& runspec,
std::time_t sim_time,
const std::vector<std::string>& zact,
const std::vector<int>& iact,
const std::vector<float>& sact,
const std::vector<std::string>& zacn,
const std::vector<int>& iacn,
const std::vector<double>& sacn,
const std::vector<std::string>& zlact);
};
}
}
}} // namespace Opm::RestartIO
#endif

View File

@@ -1,112 +0,0 @@
/*
Copyright 2021 Equinor ASA.
This file is part of the Open Porous Media project (OPM).
OPM is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OPM is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef RST_UDQ
#define RST_UDQ
#include <cstddef>
#include <optional>
#include <string>
#include <unordered_set>
#include <utility>
#include <variant>
#include <vector>
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQEnums.hpp>
#include <opm/parser/eclipse/EclipseState/Runspec.hpp>
namespace Opm {
namespace RestartIO {
struct RstHeader;
class RstUDQ {
public:
struct RstDefine {
RstDefine(const std::string& expression_arg, UDQUpdate status_arg);
std::string expression;
UDQUpdate status;
std::vector<std::pair<std::string, double>> values;
std::optional<double> field_value;
};
struct RstAssign {
void update_value(const std::string& name_arg, double new_value);
std::optional<double> value;
std::unordered_set<std::string> selector;
};
RstUDQ(const std::string& name_arg,
const std::string& unit_arg,
const std::string& define_arg,
UDQUpdate status_arg);
RstUDQ(const std::string& name_arg,
const std::string& unit_arg);
void add_value(double value);
void add_value(const std::string& wgname, double value);
bool is_define() const;
double assign_value() const;
const std::unordered_set<std::string>& assign_selector() const;
const std::string& expression() const;
const std::vector<std::pair<std::string, double>>& values() const;
std::optional<double> field_value() const;
std::string name;
std::string unit;
UDQVarType var_type;
private:
std::variant<std::monostate, RstDefine, RstAssign> data;
};
class RstUDQActive {
struct RstRecord {
RstRecord(UDAControl c, std::size_t i, std::size_t u1, std::size_t u2);
UDAControl control;
std::size_t input_index;
std::size_t use_count;
std::size_t wg_offset;
};
public:
RstUDQActive() = default;
RstUDQActive(const std::vector<int>& iuad, const std::vector<int>& iuap, const std::vector<int>& igph);
std::vector<RstRecord> iuad;
std::vector<int> wg_index;
std::vector<Phase> ig_phase;
};
}
}
#endif

View File

@@ -76,9 +76,6 @@ struct RstWell {
int completion_ordering;
int pvt_table;
int msw_pressure_drop_model;
int wtest_config_reasons;
int wtest_close_reason;
int wtest_remaining;
float orat_target;
float wrat_target;
@@ -94,8 +91,6 @@ struct RstWell {
float drainage_radius;
float efficiency_factor;
float alq_value;
float wtest_interval;
float wtest_startup;
double oil_rate;
double water_rate;

View File

@@ -42,6 +42,7 @@ struct PhaseUsage;
* Use the create() function to setup a chain of writer based on the
* configuration values, e.g.
*
* \example
* \code{.cpp}
* ParameterGroup params (argc, argv, false);
* auto parser = std::make_shared <const Deck> (

View File

@@ -15,22 +15,21 @@
You should have received a copy of the GNU General Public License
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
*/
#ifndef OPM_OUTPUT_AQUIFER_HPP
#define OPM_OUTPUT_AQUIFER_HPP
#include <cstddef>
#include <map>
#include <memory>
#include <string>
#include <unordered_map>
#include <utility>
#include <variant>
#include <vector>
namespace Opm { namespace data {
/**
* Small struct that keeps track of data for output to restart/summary
* files.
*/
enum class AquiferType
{
Fetkovich, CarterTracy, Numerical,
@@ -38,235 +37,15 @@ namespace Opm { namespace data {
struct FetkovichData
{
double initVolume{};
double prodIndex{};
double timeConstant{};
bool operator==(const FetkovichData& other) const;
// MessageBufferType API should be similar to Dune::MessageBufferIF
template <class MessageBufferType>
void write(MessageBufferType& buffer) const;
// MessageBufferType API should be similar to Dune::MessageBufferIF
template <class MessageBufferType>
void read(MessageBufferType& buffer);
double initVolume;
double prodIndex;
double timeConstant;
};
struct CarterTracyData
{
double timeConstant{};
double influxConstant{};
double waterDensity{};
double waterViscosity{};
double dimensionless_time{};
double dimensionless_pressure{};
bool operator==(const CarterTracyData& other) const;
// MessageBufferType API should be similar to Dune::MessageBufferIF
template <class MessageBufferType>
void write(MessageBufferType& buffer) const;
// MessageBufferType API should be similar to Dune::MessageBufferIF
template <class MessageBufferType>
void read(MessageBufferType& buffer);
};
struct NumericAquiferData
{
std::vector<double> initPressure{};
bool operator==(const NumericAquiferData& other) const;
// MessageBufferType API should be similar to Dune::MessageBufferIF
template <class MessageBufferType>
void write(MessageBufferType& buffer) const;
// MessageBufferType API should be similar to Dune::MessageBufferIF
template <class MessageBufferType>
void read(MessageBufferType& buffer);
};
namespace detail {
template <AquiferType>
struct TypeMap;
template <> struct TypeMap<AquiferType::CarterTracy>
{
using Alternative = CarterTracyData;
};
template <> struct TypeMap<AquiferType::Fetkovich>
{
using Alternative = FetkovichData;
};
template <> struct TypeMap<AquiferType::Numerical>
{
using Alternative = NumericAquiferData;
};
template <AquiferType t>
using TypeMap_t = typename TypeMap<t>::Alternative;
} // namespace detail
class TypeSpecificData
{
private:
template <typename T>
bool is() const
{
return std::holds_alternative<T>(this->options_);
}
template <typename T>
const T* get() const
{
return this->template is<T>()
? &std::get<T>(this->options_)
: nullptr;
}
template <typename T>
T* get()
{
return this->template is<T>()
? &std::get<T>(this->options_)
: nullptr;
}
public:
TypeSpecificData() = default;
TypeSpecificData(const TypeSpecificData&) = default;
TypeSpecificData(TypeSpecificData&&) = default;
TypeSpecificData& operator=(const TypeSpecificData&) = default;
TypeSpecificData& operator=(TypeSpecificData&&) = default;
bool operator==(const TypeSpecificData& that) const
{
return std::visit(Equal{}, this->options_, that.options_);
}
template <AquiferType t>
auto* create()
{
return &this->options_.emplace<detail::TypeMap_t<t>>();
}
template <AquiferType t>
bool is() const
{
return this->template is<detail::TypeMap_t<t>>();
}
template <AquiferType t>
auto const* get() const
{
return this->template get<detail::TypeMap_t<t>>();
}
template <AquiferType t>
auto* getMutable()
{
return this->template get<detail::TypeMap_t<t>>();
}
template <typename MessageBufferType>
void write(MessageBufferType& buffer) const
{
buffer.write(this->options_.index());
std::visit(Write<MessageBufferType>{buffer}, this->options_);
}
template <typename MessageBufferType>
void read(MessageBufferType& buffer)
{
auto type = 0 * this->options_.index();
buffer.read(type);
if (type < std::variant_size_v<Types>) {
this->create(type);
std::visit(Read<MessageBufferType>{buffer}, this->options_);
}
}
private:
using Types = std::variant<std::monostate,
CarterTracyData,
FetkovichData,
NumericAquiferData>;
struct Equal
{
template <typename T1, typename T2>
bool operator()(const T1&, const T2&) const
{
return false;
}
template <typename T>
bool operator()(const T& e1, const T& e2) const
{
return e1 == e2;
}
bool operator()(const std::monostate&,
const std::monostate&) const
{
return true;
}
};
template <typename MessageBufferType>
class Read
{
public:
explicit Read(MessageBufferType& buffer)
: buffer_{ buffer }
{}
template <typename T>
void operator()(T& alternative)
{
return alternative.read(this->buffer_);
}
void operator()(std::monostate&)
{}
private:
MessageBufferType& buffer_;
};
template <typename MessageBufferType>
class Write
{
public:
explicit Write(MessageBufferType& buffer)
: buffer_{ buffer }
{}
template <typename T>
void operator()(const T& alternative) const
{
return alternative.write(this->buffer_);
}
void operator()(const std::monostate&) const
{}
private:
MessageBufferType& buffer_;
};
Types options_{};
void create(const std::size_t option);
double dimensionless_time;
double dimensionless_pressure;
};
struct AquiferData
@@ -278,12 +57,12 @@ namespace Opm { namespace data {
double initPressure = 0.0; //< Aquifer's initial pressure
double datumDepth = 0.0; //< Aquifer's pressure reference depth
TypeSpecificData typeData{};
AquiferType type;
std::shared_ptr<FetkovichData> aquFet;
std::shared_ptr<CarterTracyData> aquCT;
double get(const std::string& key) const;
bool operator==(const AquiferData& other) const;
// MessageBufferType API should be similar to Dune::MessageBufferIF
template <class MessageBufferType>
void write(MessageBufferType& buffer) const;
@@ -291,81 +70,30 @@ namespace Opm { namespace data {
// MessageBufferType API should be similar to Dune::MessageBufferIF
template <class MessageBufferType>
void read(MessageBufferType& buffer);
private:
using GetSummaryValue = double (AquiferData::*)() const;
using SummaryValueDispatchTable = std::unordered_map<std::string, GetSummaryValue>;
static SummaryValueDispatchTable summaryValueDispatchTable_;
double aquiferFlowRate() const;
double aquiferPressure() const;
double aquiferTotalProduction() const;
double carterTracyDimensionlessTime() const;
double carterTracyDimensionlessPressure() const;
};
// TODO: not sure what extension we will need
using Aquifers = std::map<int, AquiferData>;
template <class MessageBufferType>
void FetkovichData::write(MessageBufferType& buffer) const
inline double AquiferData::get(const std::string& key) const
{
buffer.write(this->initVolume);
buffer.write(this->prodIndex);
buffer.write(this->timeConstant);
}
template <class MessageBufferType>
void FetkovichData::read(MessageBufferType& buffer)
{
buffer.read(this->initVolume);
buffer.read(this->prodIndex);
buffer.read(this->timeConstant);
}
template <class MessageBufferType>
void CarterTracyData::write(MessageBufferType& buffer) const
{
buffer.write(this->timeConstant);
buffer.write(this->influxConstant);
buffer.write(this->waterDensity);
buffer.write(this->waterViscosity);
buffer.write(this->dimensionless_time);
buffer.write(this->dimensionless_pressure);
}
template <class MessageBufferType>
void CarterTracyData::read(MessageBufferType& buffer)
{
buffer.read(this->timeConstant);
buffer.read(this->influxConstant);
buffer.read(this->waterDensity);
buffer.read(this->waterViscosity);
buffer.read(this->dimensionless_time);
buffer.read(this->dimensionless_pressure);
}
template <class MessageBufferType>
void NumericAquiferData::write(MessageBufferType& buffer) const
{
buffer.write(this->initPressure.size());
for (const auto& pressure : this->initPressure) {
buffer.write(pressure);
if ((key == "AAQR") || (key == "ANQR")) {
return this->fluxRate;
}
}
template <class MessageBufferType>
void NumericAquiferData::read(MessageBufferType& buffer)
{
decltype(this->initPressure.size()) size{};
buffer.read(size);
this->initPressure.resize(size, 0.0);
for (auto& pressure : this->initPressure) {
buffer.read(pressure);
else if ((key == "AAQT") || (key == "ANQT")) {
return this->volume;
}
else if ((key == "AAQP") || (key == "ANQP")) {
return this->pressure;
}
else if ((key == "AAQTD") && (this->aquCT != nullptr)) {
return this->aquCT->dimensionless_time;
}
else if ((key == "AAQPD") && (this->aquCT != nullptr)) {
return this->aquCT->dimensionless_pressure;
}
return 0.0;
}
template <class MessageBufferType>
@@ -378,7 +106,18 @@ namespace Opm { namespace data {
buffer.write(this->initPressure);
buffer.write(this->datumDepth);
this->typeData.write(buffer);
const int aqu = (this->aquFet != nullptr) + 2*(this->aquCT != nullptr);
buffer.write(aqu);
if (this->aquFet != nullptr) {
buffer.write(this->aquFet->initVolume);
buffer.write(this->aquFet->prodIndex);
buffer.write(this->aquFet->timeConstant);
}
else if (this->aquCT != nullptr) {
buffer.write(this->aquCT->dimensionless_time);
buffer.write(this->aquCT->dimensionless_pressure);
}
}
template <class MessageBufferType>
@@ -391,7 +130,29 @@ namespace Opm { namespace data {
buffer.read(this->initPressure);
buffer.read(this->datumDepth);
this->typeData.read(buffer);
int aqu;
buffer.read(aqu);
if (aqu == 1) {
this->type = AquiferType::Fetkovich;
if (this->aquFet == nullptr) {
this->aquFet = std::make_shared<FetkovichData>();
}
buffer.read(this->aquFet->initVolume);
buffer.read(this->aquFet->prodIndex);
buffer.read(this->aquFet->timeConstant);
}
else if (aqu == 2) {
this->type = AquiferType::CarterTracy;
if (this->aquCT == nullptr) {
this->aquCT = std::make_shared<CarterTracyData>();
}
buffer.read(this->aquCT->dimensionless_time);
buffer.read(this->aquCT->dimensionless_pressure);
}
}
}} // Opm::data

View File

@@ -28,7 +28,7 @@
#include <vector>
#include <opm/output/data/GuideRateValue.hpp>
#include <opm/json/JsonObject.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Group/Group.hpp>
namespace Opm { namespace data {
@@ -54,12 +54,6 @@ namespace Opm { namespace data {
inline GroupConstraints& set(Opm::Group::ProductionCMode cpc,
Opm::Group::InjectionCMode cgic,
Opm::Group::InjectionCMode cwic);
void init_json(Json::JsonObject& json_data) const {
json_data.add_item("prod", Opm::Group::ProductionCMode2String(this->currentProdConstraint));
json_data.add_item("water_inj", Opm::Group::InjectionCMode2String(this->currentGasInjectionConstraint));
json_data.add_item("gas_inj", Opm::Group::InjectionCMode2String(this->currentWaterInjectionConstraint));
}
};
struct GroupGuideRates {
@@ -85,14 +79,6 @@ namespace Opm { namespace data {
return this->production == other.production
&& this->injection == other.injection;
}
void init_json(Json::JsonObject& json_data) const {
auto json_prod = json_data.add_object("production");
this->production.init_json(json_prod);
auto json_inj = json_data.add_object("injection");
this->injection.init_json(json_inj);
}
};
struct GroupData {
@@ -118,15 +104,6 @@ namespace Opm { namespace data {
return this->currentControl == other.currentControl
&& this->guideRates == other.guideRates;
}
void init_json(Json::JsonObject& json_data) const {
auto json_constraints = json_data.add_object("constraints");
this->currentControl.init_json(json_constraints);
auto json_gr = json_data.add_object("guide_rate");
this->guideRates.init_json(json_gr);
}
};
struct NodeData {
@@ -148,10 +125,6 @@ namespace Opm { namespace data {
{
return this->pressure == other.pressure;
}
void init_json(Json::JsonObject& json_data) const {
json_data.add_item("pressure", this->pressure);
}
};
class GroupAndNetworkValues {
@@ -185,26 +158,6 @@ namespace Opm { namespace data {
this->nodeData.clear();
}
void init_json(Json::JsonObject& json_data) const {
auto group_data = json_data.add_object("group_data");
for (const auto& [gname, gdata] : this->groupData) {
auto group_json_data = group_data.add_object(gname);
gdata.init_json( group_json_data );
}
auto node_data = json_data.add_object("node_data");
for (const auto& [gname, ndata] : this->nodeData) {
auto node_json_data = node_data.add_object(gname);
ndata.init_json( node_json_data );
}
}
Json::JsonObject json() const {
Json::JsonObject json_data;
this->init_json(json_data);
return json_data;
}
private:
template <class MessageBufferType, class ValueType>
void writeMap(const std::map<std::string, ValueType>& map,

View File

@@ -25,7 +25,6 @@
#include <cstddef>
#include <stdexcept>
#include <string>
#include <opm/json/JsonObject.hpp>
namespace Opm { namespace data {
@@ -125,14 +124,6 @@ namespace Opm { namespace data {
}
}
void init_json(Json::JsonObject& json_data) const {
for (const auto& item : {Item::Oil, Item::Gas, Item::Water, Item::ResV}) {
if (this->has(item))
json_data.add_item(this->itemName(item), this->get(item));
}
}
private:
enum { Size = static_cast<std::size_t>(Item::NumItems) };

View File

@@ -30,8 +30,8 @@
#include <unordered_map>
#include <vector>
#include <opm/json/JsonObject.hpp>
#include <opm/output/data/GuideRateValue.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Well/Well.hpp>
namespace Opm {
@@ -69,9 +69,7 @@ namespace Opm {
well_potential_oil = (1 << 15),
well_potential_gas = (1 << 16),
brine = (1 << 17),
alq = (1 << 18),
tracer = (1 << 19),
micp = (1 << 20)
alq = (1 << 18)
};
using enum_size = std::underlying_type< opt >::type;
@@ -85,12 +83,10 @@ namespace Opm {
/// Read the value indicated by m. Returns a default value if
/// the requested value is unset.
inline double get( opt m, double default_value ) const;
inline double get( opt m, double default_value , const std::string& tracer_name ) const;
/// Set the value specified by m. Throws an exception if multiple
/// values are requested. Returns a self-reference to support
/// chaining.
inline Rates& set( opt m, double value );
inline Rates& set( opt m, double value , const std::string& tracer_name );
/// Returns true if any of the rates oil, gas, water is nonzero
inline bool flowing() const;
@@ -102,12 +98,9 @@ namespace Opm {
bool operator==(const Rates& rat2) const;
inline void init_json(Json::JsonObject& json_data) const;
private:
double& get_ref( opt );
double& get_ref( opt, const std::string& tracer_name );
const double& get_ref( opt ) const;
const double& get_ref( opt, const std::string& tracer_name ) const;
opt mask = static_cast< opt >( 0 );
@@ -130,8 +123,6 @@ namespace Opm {
double well_potential_gas = 0.0;
double brine = 0.0;
double alq = 0.0;
std::map<std::string, double> tracer;
double micp = 0.0;
};
struct Connection {
@@ -164,8 +155,6 @@ namespace Opm {
void write(MessageBufferType& buffer) const;
template <class MessageBufferType>
void read(MessageBufferType& buffer);
inline void init_json(Json::JsonObject& json_data) const;
};
class SegmentPressures {
@@ -208,7 +197,7 @@ namespace Opm {
private:
constexpr static std::size_t numvals = 5;
std::array<double, numvals> values_ = {0};
std::array<double, numvals> values_;
std::size_t index(const Value ix) const
{
@@ -253,19 +242,6 @@ namespace Opm {
(!this->isProducer && (this->inj == rhs.inj)));
}
void init_json(Json::JsonObject& json_data) const
{
if (this->inj == ::Opm::Well::InjectorCMode::CMODE_UNDEFINED)
json_data.add_item("inj", "CMODE_UNDEFINED");
else
json_data.add_item("inj", ::Opm::Well::InjectorCMode2String(this->inj));
if (this->prod == ::Opm::Well::ProducerCMode::CMODE_UNDEFINED)
json_data.add_item("prod", "CMODE_UNDEFINED");
else
json_data.add_item("prod", ::Opm::Well::ProducerCMode2String(this->prod));
}
template <class MessageBufferType>
void write(MessageBufferType& buffer) const;
@@ -274,17 +250,17 @@ namespace Opm {
};
struct Well {
Rates rates{};
double bhp{0.0};
double thp{0.0};
double temperature{0.0};
int control{0};
Rates rates;
double bhp;
double thp;
double temperature;
int control;
::Opm::Well::Status dynamicStatus { Opm::Well::Status::OPEN };
std::vector< Connection > connections{};
std::unordered_map<std::size_t, Segment> segments{};
CurrentControl current_control{};
std::vector< Connection > connections;
std::unordered_map<std::size_t, Segment> segments;
CurrentControl current_control;
GuideRateValue guide_rates{};
inline bool flowing() const noexcept;
@@ -293,8 +269,6 @@ namespace Opm {
template <class MessageBufferType>
void read(MessageBufferType& buffer);
inline void init_json(Json::JsonObject& json_data) const;
const Connection* find_connection(Connection::global_index connection_grid_index) const {
const auto connection = std::find_if( this->connections.begin() ,
this->connections.end() ,
@@ -334,7 +308,7 @@ namespace Opm {
};
class Wells: public std::map<std::string , Well> {
class WellRates : public std::map<std::string , Well> {
public:
double get(const std::string& well_name , Rates::opt m) const {
@@ -344,12 +318,6 @@ namespace Opm {
return well->second.rates.get( m, 0.0 );
}
double get(const std::string& well_name , Rates::opt m, const std::string& tracer_name) const {
const auto& well = this->find( well_name );
if( well == this->end() ) return 0.0;
return well->second.rates.get( m, 0.0, tracer_name);
}
double get(const std::string& well_name , Connection::global_index connection_grid_index, Rates::opt m) const {
const auto& witr = this->find( well_name );
@@ -391,23 +359,10 @@ namespace Opm {
this->emplace(name, well);
}
}
void init_json(Json::JsonObject& json_data) const {
for (const auto& [wname, well] : *this) {
auto json_well = json_data.add_object(wname);
well.init_json(json_well);
}
}
Json::JsonObject json() const {
Json::JsonObject json_data;
this->init_json(json_data);
return json_data;
}
};
using Wells = WellRates;
/* IMPLEMENTATIONS */
@@ -431,29 +386,8 @@ namespace Opm {
return this->get_ref( m );
}
inline double Rates::get( opt m, double default_value, const std::string& tracer_name) const {
if( !this->has( m ) ) return default_value;
if( m == opt::tracer && this->tracer.find(tracer_name) == this->tracer.end()) return default_value;
return this->get_ref( m, tracer_name);
}
inline Rates& Rates::set( opt m, double value ) {
this->get_ref( m ) = value;
/* mask |= m */
this->mask = static_cast< opt >(
static_cast< enum_size >( this->mask ) |
static_cast< enum_size >( m )
);
return *this;
}
inline Rates& Rates::set( opt m, double value , const std::string& tracer_name ) {
this->get_ref( m , tracer_name) = value;
/* mask |= m */
this->mask = static_cast< opt >(
static_cast< enum_size >( this->mask ) |
@@ -484,9 +418,7 @@ namespace Opm {
well_potential_oil == rate.well_potential_oil &&
well_potential_gas == rate.well_potential_gas &&
brine == rate.brine &&
alq == rate.alq &&
tracer == rate.tracer &&
micp == rate.micp;
alq == rate.alq;
}
@@ -520,9 +452,6 @@ namespace Opm {
case opt::well_potential_gas: return this->well_potential_gas;
case opt::brine: return this->brine;
case opt::alq: return this->alq;
case opt::tracer: /* Should _not_ be called with tracer argument */
break;
case opt::micp: return this->micp;
}
throw std::invalid_argument(
@@ -532,36 +461,12 @@ namespace Opm {
}
inline const double& Rates::get_ref( opt m, const std::string& tracer_name ) const {
if (m != opt::tracer)
throw std::logic_error("Logic error - should be called with tracer argument");
return this->tracer.at(tracer_name);
}
inline double& Rates::get_ref( opt m ) {
return const_cast< double& >(
static_cast< const Rates* >( this )->get_ref( m )
);
}
inline double& Rates::get_ref( opt m, const std::string& tracer_name ) {
if (m == opt::tracer) this->tracer.emplace(tracer_name, 0.0);
return this->tracer.at(tracer_name);
}
void Rates::init_json(Json::JsonObject& json_data) const {
if (this->has(opt::wat))
json_data.add_item("wat", this->get(opt::wat));
if (this->has(opt::oil))
json_data.add_item("oil", this->get(opt::oil));
if (this->has(opt::gas))
json_data.add_item("gas", this->get(opt::gas));
}
bool inline Rates::flowing() const {
return ((this->wat != 0) ||
@@ -595,14 +500,6 @@ namespace Opm {
buffer.write(this->well_potential_gas);
buffer.write(this->brine);
buffer.write(this->alq);
//tracer:
unsigned int size = this->tracer.size();
buffer.write(size);
for (const auto& [name, rate] : this->tracer) {
buffer.write(name);
buffer.write(rate);
}
buffer.write(this->micp);
}
template <class MessageBufferType>
@@ -618,21 +515,6 @@ namespace Opm {
buffer.write(this->trans_factor);
}
void Connection::init_json(Json::JsonObject& json_data) const {
auto json_rates = json_data.add_object("rates");
this->rates.init_json(json_rates);
json_data.add_item("global_index", static_cast<int>(this->index));
json_data.add_item("pressure", this->pressure);
json_data.add_item("reservoir_rate", this->reservoir_rate);
json_data.add_item("cell_pressure", this->cell_pressure);
json_data.add_item("swat", this->cell_saturation_water);
json_data.add_item("sgas", this->cell_saturation_gas);
json_data.add_item("Kh", this->effective_Kh);
json_data.add_item("trans_factor", this->trans_factor);
}
template <class MessageBufferType>
void Segment::write(MessageBufferType& buffer) const {
buffer.write(this->segNumber);
@@ -706,20 +588,9 @@ namespace Opm {
buffer.read(this->well_potential_gas);
buffer.read(this->brine);
buffer.read(this->alq);
//tracer:
unsigned int size;
buffer.read(size);
for (size_t i = 0; i < size; ++i) {
std::string tracer_name;
buffer.read(tracer_name);
double tracer_rate;
buffer.read(tracer_rate);
this->tracer.emplace(tracer_name, tracer_rate);
}
buffer.read(this->micp);
}
template <class MessageBufferType>
template <class MessageBufferType>
void Connection::read(MessageBufferType& buffer) {
buffer.read(this->index);
this->rates.read(buffer);
@@ -796,27 +667,6 @@ namespace Opm {
this->guide_rates.read(buffer);
}
void Well::init_json(Json::JsonObject& json_data) const {
auto json_connections = json_data.add_array("connections");
for (const auto& conn : this->connections) {
auto json_conn = json_connections.add_object();
conn.init_json(json_conn);
}
auto json_rates = json_data.add_object("rates");
this->rates.init_json(json_rates);
json_data.add_item("bhp", this->bhp);
json_data.add_item("thp", this->thp);
json_data.add_item("temperature", this->temperature);
json_data.add_item("status", ::Opm::Well::Status2String(this->dynamicStatus));
auto json_control = json_data.add_object("control");
this->current_control.init_json(json_control);
auto json_guiderate = json_data.add_object("guiderate");
this->guide_rates.init_json(json_guiderate);
}
}} // Opm::data
#endif //OPM_OUTPUT_WELLS_HPP

View File

@@ -41,7 +41,6 @@ namespace Opm {
class Schedule;
class UDQInput;
class UDQActive;
class Actdims;
namespace Action {
class State;
@@ -55,11 +54,13 @@ namespace Opm { namespace RestartIO { namespace Helpers {
class AggregateActionxData
{
public:
explicit AggregateActionxData(const std::vector<int>& actDims);
AggregateActionxData(const Opm::Schedule& sched,
const Opm::Action::State& action_state,
const Opm::SummaryState& st,
const std::size_t simStep);
void captureDeclaredActionxData( const Opm::Schedule& sched,
const Opm::Action::State& action_state,
const Opm::SummaryState& st,
const std::vector<int>& actDims,
const std::size_t simStep);
const std::vector<int>& getIACT() const
{
@@ -98,14 +99,6 @@ public:
}
private:
AggregateActionxData( const std::vector<int>& rst_dims,
std::size_t num_actions,
const Opm::Actdims& actdims,
const Opm::Schedule& sched,
const Opm::Action::State& action_state,
const Opm::SummaryState& st,
const std::size_t simStep);
/// Aggregate 'IACT' array (Integer) for all ACTIONX data (9 integers pr UDQ)
WindowedArray<int> iACT_;

View File

@@ -1,191 +0,0 @@
/*
Copyright (c) 2021 Equinor ASA
This file is part of the Open Porous Media project (OPM).
OPM is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OPM is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef OPM_AGGREGATE_AQUIFER_DATA_HPP
#define OPM_AGGREGATE_AQUIFER_DATA_HPP
#include <opm/output/eclipse/InteHEAD.hpp>
#include <opm/output/eclipse/WindowedArray.hpp>
#include <opm/output/data/Aquifer.hpp>
#include <vector>
namespace Opm {
class AquiferConfig;
class EclipseGrid;
class SummaryState;
class UnitSystem;
} // Opm
namespace Opm { namespace RestartIO { namespace Helpers {
class AggregateAquiferData
{
public:
/// Constructor.
///
/// \param[in] aqDims Aquifer dimensions including number of active
/// aquifers, maximum aquifer IDs, and number of data items per
/// aquifer (or connection) in the various output arrays.
///
/// \param[in] aqConfig Aquifer configuration object. Keeps track
/// of aquifer types (Carter-Tracy vs. Fetkovich) and provides
/// read-only access to the individual aquifer objects.
///
/// \param[in] grid Simulation grid. Needed to map active to
/// Cartesian cell indices and to extract (I,J,K) index tuples of
/// the active cells.
explicit AggregateAquiferData(const InteHEAD::AquiferDims& aqDims,
const AquiferConfig& aqConfig,
const EclipseGrid& grid);
/// Linearise dynamic information pertinent to analytic aquifers
/// into internal arrays.
///
/// \param[in] aqConfig Aquifer configuration object. Keeps track
/// of aquifer types (Carter-Tracy vs. Fetkovich) and provides
/// read-only access to the individual aquifer objects.
///
/// \param[in] aquData Dynamic aquifer data, including time
/// constants, water mass densities, water viscosities, and
/// initial aquifer pressures.
///
/// \param[in] summaryState Current state of summary variables.
/// Expected to contain at least the summary variables AAQP
/// (aquifer pressure), AAQR (aquifer flow rate), and AAQT (total
/// produced inflow volume from aquifer).
///
/// \param[in] usys Unit system. Needed to convert quantities from
/// internal to output units.
void captureDynamicdAquiferData(const AquiferConfig& aqConfig,
const data::Aquifers& aquData,
const SummaryState& summaryState,
const UnitSystem& usys);
/// Retrieve the maximum active aquifer ID over all analytic
/// aquifers.
///
/// Controls output of restart information pertaining to analytic
/// aquifer connections.
int maximumActiveAnalyticAquiferID() const
{
return this->maxActiveAnalyticAquiferID_;
}
/// Retrieve Integer Aquifer Data Array.
const std::vector<int>& getIntegerAquiferData() const
{
return this->integerAnalyticAq_.data();
}
/// Retrieve Floating-Point (Real) Aquifer Data Array.
const std::vector<float>& getSinglePrecAquiferData() const
{
return this->singleprecAnalyticAq_.data();
}
/// Retrieve Floating-Point (Double Precision) Aquifer Data Array.
const std::vector<double>& getDoublePrecAquiferData() const
{
return this->doubleprecAnalyticAq_.data();
}
/// Retrieve Integer Aquifer Data Array for Numeric Aquifers.
const std::vector<int>& getNumericAquiferIntegerData() const
{
return this->integerNumericAq_.data();
}
/// Retrieve Double Precision Aquifer Data Array for Numeric Aquifers.
const std::vector<double>& getNumericAquiferDoublePrecData() const
{
return this->doubleprecNumericAq_.data();
}
/// Retrieve Integer Aquifer Connection Data Array (analytic aquifers)
///
/// \param[in] aquiferID Aquifer for which to retrieve integer
/// connection data array. Expected to be in the range
/// [1..maximumActiveAnalyticAquiferID()] (inclusive).
const std::vector<int>& getIntegerAquiferConnectionData(const int aquiferID) const
{
return this->integerAnalyticAquiferConn_[aquiferID - 1].data();
}
/// Retrieve Floating-Point (Real) Aquifer Connection Data Array (analytic aquifers)
///
/// \param[in] aquiferID Aquifer for which to retrieve single
/// precision floating point connection data array. Expected to
/// be in the range [1..maximumActiveAnalyticAquiferID()]
/// (inclusive).
const std::vector<float>& getSinglePrecAquiferConnectionData(const int aquiferID) const
{
return this->singleprecAnalyticAquiferConn_[aquiferID - 1].data();
}
/// Retrieve Floating-Point (Double Precision) Aquifer Connection
/// Data Array (analytic aquifers)
///
/// \param[in] aquiferID Aquifer for which to retrieve double
/// precision floating point connection data array. Expected to
/// be in the range [1..maximumActiveAnalyticAquiferID()]
/// (inclusive).
const std::vector<double>& getDoublePrecAquiferConnectionData(const int aquiferID) const
{
return this->doubleprecAnalyticAquiferConn_[aquiferID - 1].data();
}
private:
int maxActiveAnalyticAquiferID_{0};
std::vector<int> numActiveConn_{};
std::vector<double> totalInflux_{};
/// Aggregate 'IAAQ' array (Integer) for all analytic aquifers.
WindowedArray<int> integerAnalyticAq_;
/// Aggregate 'SAAQ' array (Real) for all analytic aquifers.
WindowedArray<float> singleprecAnalyticAq_;
/// Aggregate 'XAAQ' array (Double Precision) for all analytic aquifers.
WindowedArray<double> doubleprecAnalyticAq_;
/// Aggregate 'IAQN' array (integer) for all numeric aquifers.
WindowedArray<int> integerNumericAq_;
/// Aggregate 'RAQN' array (Double Precision) for all numeric aquifers.
WindowedArray<double> doubleprecNumericAq_;
/// Aggregate ICAQ array (Integer) for all analytic aquifer
/// connections. Separate array for each aquifer.
std::vector<WindowedArray<int>> integerAnalyticAquiferConn_;
/// Aggregate SCAQ array (Real) for all analytic aquifer
/// connections. Separate array for each aquifer.
std::vector<WindowedArray<float>> singleprecAnalyticAquiferConn_;
/// Aggregate ACAQ array (Double Precision) for all analytic aquifer
/// connections. Separate array for each aquifer.
std::vector<WindowedArray<double>> doubleprecAnalyticAquiferConn_;
};
}}} // Opm::RestartIO::Helpers
#endif // OPM_AGGREGATE_WELL_DATA_HPP

View File

@@ -34,7 +34,7 @@ namespace Opm {
} // Opm
namespace Opm { namespace data {
class Wells;
class WellRates;
}}
namespace Opm { namespace RestartIO { namespace Helpers {
@@ -47,7 +47,7 @@ namespace Opm { namespace RestartIO { namespace Helpers {
void captureDeclaredConnData(const Opm::Schedule& sched,
const Opm::EclipseGrid& grid,
const Opm::UnitSystem& units,
const Opm::data::Wells& xw,
const Opm::data::WellRates& xw,
const Opm::SummaryState& summary_state,
const std::size_t sim_step);

View File

@@ -118,6 +118,39 @@ public:
{"GGPTH", 143},
{"GGITH", 144},
};
using inj_cmode_enum = Opm::Group::InjectionCMode;
const std::map<inj_cmode_enum, int> cmodeToNum = {
{inj_cmode_enum::NONE, 0},
{inj_cmode_enum::RATE, 1},
{inj_cmode_enum::RESV, 2},
{inj_cmode_enum::REIN, 3},
{inj_cmode_enum::VREP, 4},
{inj_cmode_enum::FLD, 0},
{inj_cmode_enum::SALE, 0},
};
// Note: guide rates don't exist at the FIELD level.
const std::map<int, inj_cmode_enum> ICntlModeToiCMode = {
{0, inj_cmode_enum::NONE},
{1, inj_cmode_enum::RATE},
{2, inj_cmode_enum::RESV},
{3, inj_cmode_enum::REIN},
{4, inj_cmode_enum::VREP}, };
using p_cmode = Opm::Group::ProductionCMode;
const std::map<int, p_cmode> PCntlModeToPCMode = {
{0, p_cmode::NONE},
{1, p_cmode::ORAT},
{2, p_cmode::WRAT},
{3, p_cmode::GRAT},
{4, p_cmode::LRAT},
{9, p_cmode::CRAT},
{5, p_cmode::RESV},
{6, p_cmode::PRBL},
};
const std::map<std::string, size_t> fieldKeyToIndex = {
{"FOPR", 0},

View File

@@ -67,7 +67,7 @@ namespace Opm { namespace RestartIO { namespace Helpers {
const std::vector<int>& inteHead,
const Opm::EclipseGrid& grid,
const Opm::SummaryState& smry,
const Opm::data::Wells& wr
const Opm::data::WellRates& wr
);
/// Retrieve Integer Multisegment well data Array.

View File

@@ -23,6 +23,15 @@
#include <opm/output/eclipse/WindowedArray.hpp>
#include <opm/io/eclipse/PaddedOutputString.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQInput.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQDefine.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQActive.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQAssign.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQEnums.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQParams.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQFunctionTable.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Schedule.hpp>
#include <cstddef>
#include <string>
#include <vector>

View File

@@ -1,76 +0,0 @@
/*
Copyright (c) 2018 Statoil ASA
This file is part of the Open Porous Media project (OPM).
OPM is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OPM is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef OPM_AGGREGATE_WLIST_DATA_HPP
#define OPM_AGGREGATE_WLIST_DATA_HPP
#include <opm/output/eclipse/WindowedArray.hpp>
#include <opm/io/eclipse/PaddedOutputString.hpp>
#include <cstddef>
#include <string>
#include <vector>
namespace Opm {
class Schedule;
} // Opm
namespace Opm { namespace data {
class Wells;
}} // Opm::data
namespace Opm { namespace RestartIO { namespace Helpers {
class AggregateWListData
{
public:
explicit AggregateWListData(const std::vector<int>& inteHead);
void captureDeclaredWListData(const Schedule& sched,
const std::size_t sim_step,
const std::vector<int>& inteHead);
/// Retrieve Integer WLIST Data Array.
const std::vector<int>& getIWls() const
{
return this->iWls_.data();
}
/// Retrieve Character WLIST Data Array.
const std::vector<EclIO::PaddedOutputString<8>>& getZWls() const
{
return this->zWls_.data();
}
private:
/// Aggregate 'IWLS' array (Integer) for all wells.
WindowedArray<int> iWls_;
/// Aggregate 'ZWLS' array (Character) for all wells.
WindowedArray<EclIO::PaddedOutputString<8>> zWls_;
};
}}} // Opm::RestartIO::Helpers
#endif // OPM_AGGREGATE_WLIST_DATA_HPP

View File

@@ -33,14 +33,13 @@ namespace Opm {
class Schedule;
class SummaryState;
class UnitSystem;
class WellTestState;
namespace Action {
class State;
}
} // Opm
namespace Opm { namespace data {
class Wells;
class WellRates;
}} // Opm::data
namespace Opm { namespace RestartIO { namespace Helpers {
@@ -50,17 +49,16 @@ namespace Opm { namespace RestartIO { namespace Helpers {
public:
explicit AggregateWellData(const std::vector<int>& inteHead);
void captureDeclaredWellData(const Schedule& sched,
const UnitSystem& units,
const std::size_t sim_step,
const Opm::Action::State& action_state,
const Opm::WellTestState& wtest_state,
const Opm::SummaryState& smry,
const std::vector<int>& inteHead);
void captureDeclaredWellData(const Schedule& sched,
const UnitSystem& units,
const std::size_t sim_step,
const ::Opm::Action::State& action_state,
const ::Opm::SummaryState& smry,
const std::vector<int>& inteHead);
void captureDynamicWellData(const Opm::Schedule& sched,
const std::size_t sim_step,
const Opm::data::Wells& xw,
const Opm::data::WellRates& xw,
const Opm::SummaryState& smry);
/// Retrieve Integer Well Data Array.

View File

@@ -46,7 +46,6 @@ class Schedule;
class SummaryConfig;
class SummaryState;
class UDQState;
class WellTestState;
namespace Action { class State; }
/*!
* \brief A class to write the reservoir state and the well state of a
@@ -61,10 +60,7 @@ public:
EclipseIO( const EclipseState& es,
EclipseGrid grid,
const Schedule& schedule,
const SummaryConfig& summary_config,
const std::string& basename = "",
const bool writeEsmry = false
);
const SummaryConfig& summary_config);
@@ -180,7 +176,6 @@ public:
*/
void writeTimeStep( const Action::State& action_state,
const WellTestState& wtest_state,
const SummaryState& st,
const UDQState& udq_state,
int report_step,
@@ -237,6 +232,7 @@ public:
private:
class Impl;
std::unique_ptr< Impl > impl;
};
} // namespace Opm

View File

@@ -40,19 +40,13 @@ public:
GasInGasPhase = 6,
PoreVolume = 7,
// The Inplace class is implemented in close relation to the
// ecloutputblackoilmodule in opm-simulators, ane there are
// certainly idiosyncracies here due to that coupling. For instance
// the enum values PressurePV, HydroCarbonPV, PressureHydroCarbonPV,
// and DynamicPoreVolume are *not* included in the return value from
// phases().
// ecloutputblackoilmodule in opm-simulators, ane there are certainly
// idiosyncracies here due to that coupling. For instance the three enum
// values PressurePV, HydroCarbonPV and PressureHydroCarbonPV are *not*
// included in the return value from phases().
PressurePV = 8,
HydroCarbonPV = 9,
PressureHydroCarbonPV = 10,
DynamicPoreVolume = 11,
WaterResVolume = 12,
OilResVolume = 13,
GasResVolume = 14,
SALT = 15,
PressureHydroCarbonPV = 10
};
/*

View File

@@ -1,5 +1,4 @@
/*
Copyright 2021 Equinor ASA.
Copyright 2016, 2017, 2018 Statoil ASA.
This file is part of the Open Porous Media Project (OPM).
@@ -26,15 +25,12 @@
#include <memory>
#include <vector>
namespace Opm {
class EclipseGrid;
class EclipseState;
class UnitSystem;
}
namespace Opm { namespace RestartIO {
namespace RestartIO {
class InteHEAD
{
@@ -136,51 +132,6 @@ namespace Opm { namespace RestartIO {
int ninobr;
};
struct AquiferDims {
// Number of active analytic aquifers (# unique aquifer IDs)
int numAquifers {0};
// Declared maximum number of analytic aquifers in model
// (AQUDIMS(5))
int maxNumAquifers {0};
// Declared maximum number of connections in any analytic
// aquifer (AQUDIMS(6))
int maxNumAquiferConn {0};
// Maximum number of *active* connections in any analytic aquifer
int maxNumActiveAquiferConn {0};
// Maximum aquifer ID across all of the model's analytic aquifers.
int maxAquiferID {0};
// Number of numeric aquifer records (lines of AQUNUM data)
int numNumericAquiferRecords {0};
// Number of data elements per aquifer in IAAQ array.
int numIntAquiferElem {18};
// Number of data elements per aquifer in SAAQ array.
int numRealAquiferElem {24};
// Number of data elements per aquifer in XAAQ array.
int numDoubAquiferElem {10};
// Number of data elements in IAQN array per numeric aquifer record.
int numNumericAquiferIntElem {10};
// Number of data elements in RAQN array per numeric aquifer record.
int numNumericAquiferDoubleElem {13};
// Number of data elements per coonnection in ICAQ array.
int numIntConnElem {7};
// Number of data elements per connecetion in SCAQ array.
int numRealConnElem {2};
// Number of data elements per connection in ACAQ array.
int numDoubConnElem {4};
};
InteHEAD();
~InteHEAD() = default;
@@ -197,16 +148,13 @@ namespace Opm { namespace RestartIO {
InteHEAD& unitConventions(const UnitSystem& usys);
InteHEAD& wellTableDimensions(const WellTableDim& wtdim);
InteHEAD& aquiferDimensions(const AquiferDims& aqudims);
InteHEAD& calendarDate(const TimePoint& date);
InteHEAD& activePhases(const Phases& phases);
InteHEAD& params_NWELZ(const int niwelz, const int nswelz, const int nxwelz, const int nzwelz);
InteHEAD& params_NCON(const int niconz, const int nsconz, const int nxconz);
InteHEAD& params_GRPZ(const std::array<int, 4>& grpz);
InteHEAD& params_NGCTRL(const int gct);
InteHEAD& params_NAAQZ(const int ncamax, const int niaaqz, const int nsaaqz, const int nxaaqz, const int nicaqz, const int nscaqz, const int nacaqz);
InteHEAD& stepParam(const int tstep, const int report_step);
InteHEAD& tuningParam(const TuningPar& tunpar);
InteHEAD& variousParam(const int version, const int iprog);
@@ -231,12 +179,11 @@ namespace Opm { namespace RestartIO {
std::vector<int> data_;
};
std::time_t makeUTCTime(const std::tm& timePoint);
InteHEAD::TimePoint
getSimulationTimePoint(const std::time_t start,
const double elapsed);
InteHEAD::AquiferDims
inferAquiferDimensions(const EclipseState& es);
}} // Opm::RestartIO
#endif // OPM_INTEHEAD_HEADER_INCLUDED

View File

@@ -26,9 +26,7 @@
#include <opm/output/eclipse/RestartValue.hpp>
#include <opm/output/eclipse/AggregateAquiferData.hpp>
#include <optional>
#include <string>
#include <utility>
#include <vector>
@@ -40,7 +38,6 @@ namespace Opm {
class Schedule;
class UDQState;
class SummaryState;
class WellTestState;
} // namespace Opm
@@ -79,19 +76,17 @@ namespace Opm { namespace Action {
*/
namespace Opm { namespace RestartIO {
void save(EclIO::OutputStream::Restart& rstFile,
int report_step,
double seconds_elapsed,
RestartValue value,
const EclipseState& es,
const EclipseGrid& grid,
const Schedule& schedule,
const Action::State& action_state,
const WellTestState& wtest_state,
const SummaryState& sumState,
const UDQState& udqState,
std::optional<Helpers::AggregateAquiferData>& aquiferData,
bool write_double = false);
void save(EclIO::OutputStream::Restart& rstFile,
int report_step,
double seconds_elapsed,
RestartValue value,
const EclipseState& es,
const EclipseGrid& grid,
const Schedule& schedule,
const Action::State& action_state,
const SummaryState& sumState,
const UDQState& udqState,
bool write_double = false);
RestartValue load(const std::string& filename,

View File

@@ -69,19 +69,15 @@ namespace Opm {
class RestartValue {
public:
using ExtraVector = std::vector<std::pair<RestartKey, std::vector<double>>>;
data::Solution solution;
data::Wells wells;
data::GroupAndNetworkValues grp_nwrk;
ExtraVector extra;
std::vector<data::AquiferData> aquifer;
data::Solution solution{};
data::Wells wells{};
data::GroupAndNetworkValues grp_nwrk{};
data::Aquifers aquifer{};
ExtraVector extra{};
RestartValue(data::Solution sol, data::Wells wells_arg, data::GroupAndNetworkValues grpn_nwrk_arg);
RestartValue(data::Solution sol,
data::Wells wells_arg,
data::GroupAndNetworkValues grpn_nwrk_arg,
data::Aquifers aquifer_arg);
RestartValue() = default;
RestartValue() {}
bool hasExtra(const std::string& key) const;
void addExtra(const std::string& key, UnitSystem::measure dimension, std::vector<double> data);
@@ -93,11 +89,10 @@ namespace Opm {
bool operator==(const RestartValue& val2) const
{
return (this->solution == val2.solution)
&& (this->wells == val2.wells)
&& (this->grp_nwrk == val2.grp_nwrk)
&& (this->aquifer == val2.aquifer)
&& (this->extra == val2.extra);
return solution == val2.solution &&
wells == val2.wells &&
grp_nwrk == val2.grp_nwrk &&
extra == val2.extra;
}
};

View File

@@ -41,7 +41,7 @@ namespace Opm {
} // namespace Opm
namespace Opm { namespace data {
class Wells;
class WellRates;
class GroupAndNetworkValues;
}} // namespace Opm::data
@@ -57,18 +57,16 @@ public:
const SummaryConfig& sumcfg,
const EclipseGrid& grid,
const Schedule& sched,
const std::string& basename = "",
const bool& writeEsmry = false
);
const std::string& basename = "");
~Summary();
void add_timestep(const SummaryState& st, const int report_step, bool isSubstep);
void add_timestep(const SummaryState& st, const int report_step);
void eval(SummaryState& summary_state,
const int report_step,
const double secs_elapsed,
const data::Wells& well_solution,
const data::WellRates& well_solution,
const data::GroupAndNetworkValues& group_and_nwrk_solution,
GlobalProcessParameters single_values,
const Inplace& initial_inplace,

View File

@@ -1,46 +0,0 @@
/*
Copyright (c) 2021 Equinor ASA
This file is part of the Open Porous Media project (OPM).
OPM is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OPM is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef OPM_UDQDIMS_HPP
#define OPM_UDQDIMS_HPP
#include <vector>
namespace Opm {
class UDQConfig;
class UDQDims {
public:
UDQDims(const UDQConfig& config, const std::vector<int>& intehead);
const std::vector<int>& data() const;
static std::size_t entriesPerIUDQ();
static std::size_t entriesPerIUAD();
static std::size_t entriesPerZUDN();
static std::size_t entriesPerZUDL();
private:
std::vector<int> m_data;
};
}
#endif

View File

@@ -1,107 +0,0 @@
/*
Copyright (c) 2021 Equinor ASA
This file is part of the Open Porous Media project (OPM).
OPM is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OPM is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef OPM_OUTPUT_ECLIPSE_VECTOR_ACTION_HPP
#define OPM_OUTPUT_ECLIPSE_VECTOR_ACTION_HPP
#include <vector>
namespace Opm { namespace RestartIO { namespace Helpers { namespace VectorItems {
namespace IACN {
enum index : std::vector<int>::size_type {
LHSQuantityType = 10,
RHSQuantityType = 11,
FirstGreater = 12,
TerminalLogic = 13,
Paren = 15,
Comparator = 16,
BoolLink = 17
};
// The same enum is used for both lefthand side and righthand side quantities;
// although not all values can be used on both sides.
namespace Value {
enum QuantityType {
Field = 1,
Well = 2,
Group = 3,
Const = 8,
Day = 10,
Month = 11,
Year = 12
};
enum ParenType {
None = 0,
Open = 1,
Close = 2
};
}
constexpr std::size_t ConditionSize = 26;
}
namespace SACN {
enum index : std::vector<int>::size_type {
LHSValue0 = 0,
RHSValue0 = 2,
LHSValue1 = 4,
RHSValue1 = 5,
LHSValue2 = 6,
RHSValue2 = 7,
LHSValue3 = 8,
RHSValue3 = 9
};
constexpr std::size_t ConditionSize = 16;
}
namespace ZACN {
enum index : std::vector<int>::size_type {
Quantity = 0,
LHSQuantity = 0,
RHSQuantity = 1,
Comparator = 2,
Well = 3,
LHSWell = 3,
RHSWell = 4,
Group = 5,
LHSGroup = 5,
RHSGroup = 6
};
constexpr std::size_t RHSOffset = 1;
constexpr std::size_t ConditionSize = 13;
}
namespace ZLACT {
constexpr std::size_t max_line_length = 128;
}
}}}} // Opm::RestartIO::Helpers::VectorItems
#endif

View File

@@ -1,5 +1,4 @@
/*
Copyright (c) 2021 Equinor ASA
Copyright (c) 2019 Equinor ASA
This file is part of the Open Porous Media project (OPM).
@@ -27,112 +26,42 @@ namespace Opm { namespace RestartIO { namespace Helpers { namespace VectorItems
namespace IAnalyticAquifer {
enum index : std::vector<int>::size_type {
NumAquiferConn = 0, // Number of active aquifer connections for this aquifer
WatPropTable = 1, // PVT number (ACUCT(10) or AQUFETP(7))
NumAquiferConn = 0,
WatPropTable = 1,
CTInfluenceFunction = 9, // AQUCT(11)
TypeRelated1 = 10, // =1 for CT, =0 for FETP
Unknown_1 = 11, // Unknown item. =1 in all cases seen thus far.
TypeRelated1 = 9,
TypeRelated2 = 10,
};
namespace Value {
enum ModelType : int {
Fetkovich = 0,
CarterTracy = 1,
};
} // Value
} // IAnalyticAquifer
namespace IAnalyticAquiferConn {
enum index : std::vector<int>::size_type {
Index_I = 0, // One-based I index of connecting cell
Index_J = 1, // One-based J index of connecting cell
Index_K = 2, // One-based K index of connecting cell
ActiveIndex = 3, // One-based columnar active index of connecting cell
FaceDirection = 4, // Direction of connecting face
};
namespace Value {
enum FaceDirection {
IMinus = 1, IPlus = 2, JMinus = 3, JPlus = 4, KMinus = 5, KPlus = 6,
};
} // Value
} // IAnalyticAquiferConn
namespace INumericAquifer {
enum index : std::vector<int>::size_type {
AquiferID = 0, // ID of numeric aquifer
Cell_I = 1, // I coordinate of aquifer cell
Cell_J = 2, // J coordinate of aquifer cell
Cell_K = 3, // K coordinate of aquifer cell
PVTTableID = 4, // PVT Table ID of numeric aquifer
SatFuncID = 5, // Saturation function ID of numeric aquifer
};
} // INumericAquifer
namespace RNumericAquifer {
enum index : std::vector<double>::size_type {
Area = 0, // Aquifer inflow area, AQUNUM(5)
Length = 1, // Aquifer length, AQUNUM(6)
Porosity = 2, // Aquifer porosity, AQUNUM(7)
Permeability = 3, // Aquifer permeability, AQUNUM(8)
Depth = 4, // Aquifer depth, AQUNUM(9)
Pressure = 5, // Aquifer pressure, AQUNUM(10)
Unknown_1 = 6, // Unknown item, = 1.0
Unknown_2 = 7, // Unknown item, = 1.0
Unknown_3 = 8, // Unknown item, = 1.0
PoreVolume = 9, // Total aquifer pore-volume (= Area * Length * Porosity)
FlowRate = 10, // Aquifer inflow rate (ANQR:N)
ProdVolume = 11, // Total liquid volume produced from aquifer (AQNT:N)
DynPressure = 12, // Dynamic aquifer pressure (ANQP:N)
};
} // RNumericAquifer
namespace SAnalyticAquifer {
enum index : std::vector<float>::size_type {
Compressibility = 0, // Total aquifer compressibility (AQUCT(6), AQUFETP(5))
Compressibility = 0,
FetInitVol = 1, // Initial aquifer volume (AQUFETP(4))
FetProdIndex = 2, // Aquifer productivity index (AQUFETP(6))
FetTimeConstant = 3, // Fetkovich Aquifer time constant (Compressibility * InitVol / ProdIndex)
FetInitVol = 1,
FetProdIndex = 2,
FetTimeConstant = 3,
CTRadius = 1, // CT aquifer external radius (AQUCT(7))
CTPermeability = 2, // CT aquifer permeability (AQUCT(4))
CTPorosity = 3, // CT aquifer porosity (AQUCT(5))
CTRadius = 1,
CTPermeability = 2,
CTPorosity = 3,
InitPressure = 4, // Initial aquifer pressure (AQUCT(3), AQUFETP(3))
DatumDepth = 5, // Aquifer datum depth (AQUCT(2), AQUFETP(2))
InitPressure = 4,
DatumDepth = 5,
CTThickness = 6, // CT aquifer thickness (AQUCT(8))
CTAngle = 7, // CT aquifer angle of influence (AQUCT(9) / 360.0)
CTWatMassDensity = 8, // Water density at reservoir conditions
CTWatViscosity = 9, // Water viscosity at reservoir conditions
CTThickness = 6,
CTAngle = 7,
CTWatMassDensity = 8,
CTWatViscosity = 9,
};
} // SAnalyticAquifer
namespace SAnalyticAquiferConn {
enum index : std::vector<float>::size_type {
InfluxFraction = 0, // Connection's fraction of total aquifer influx coefficient
FaceAreaToInfluxCoeff = 1, // Connection's effective face area divided by aquifer's total influx coefficient
};
} // SAnalyticAquiferConn
namespace XAnalyticAquifer {
enum index : std::vector<double>::size_type {
FlowRate = 0, // Aquifer rate (AAQR:N)
Pressure = 1, // Dynamic aquifer pressure (AAQP:N)
ProdVolume = 2, // Liquid volume produced from aquifer (into reservoir, AAQT:N)
TotalInfluxCoeff = 3, // Total aquifer influx coefficient across all aquifer connections
CTRecipTimeConst = 4, // Reciprocal time constant for CT aquifer
CTInfluxConstant = 5, // Influx constant "beta" for CT aquifer
CTDimensionLessTime = 8, // Dimensionless time for CT aquifer (AAQTD:N)
CTDimensionLessPressure = 9, // Dimensionless pressure for CT aquifer (AAQPD:N)
FlowRate = 0,
Pressure = 1, // Dynamic aquifer pressure
ProdVolume = 2, // Liquid volume produced from aquifer (into reservoir)
TotalArea = 3,
};
} // XAnalyticAquifer

View File

@@ -56,18 +56,12 @@ namespace Opm { namespace RestartIO { namespace Helpers { namespace VectorItems
// Observe that these value should not be used as ordinary indices into
// the the IGRP vector, they should all be used as IGRP[NWGMAX + $index]
enum index : std::vector<int>::size_type {
NoOfChildGroupsWells = 0,
ProdActiveCMode = 1,
ProdHighLevCtrl = 5,
GuideRateDef = 6,
ExceedAction = 7,
WInjCMode = 16,
GConProdCMode = 10,
WInjActiveCMode = 16,
WInjHighLevCtrl = 17,
GConInjeWInjCMode = 19,
GInjActiveCMode = 21,
GInjHighLevCtrl = 22,
GConInjeGInjCMode = 24,
GInjCMode = 21,
GroupType = 26,
GroupLevel = 27,
ParentGroup = 28,
@@ -81,7 +75,6 @@ namespace Opm { namespace RestartIO { namespace Helpers { namespace VectorItems
Water = 2,
Gas = 3,
Liquid = 4,
Resv = 6, // need to be verified!!!
Potn = 7,
Form = 8,
Comb = 9,

View File

@@ -69,7 +69,6 @@ namespace Opm { namespace RestartIO { namespace Helpers { namespace VectorItems
NXGRPZ = 38, // Number of data elements per group in XGRP array
NZGRPZ = 39, // Number of data elements per group in ZGRP array
NAQUIF = 40, // Number of *active* analytic aquifers (i.e., number of unique aquifer IDs) in model
NCAMAX = 41, // Maximum number of analytic aquifer connections
NIAAQZ = 42, // Number of data elements per aquifer in IAAQ array
@@ -124,7 +123,6 @@ namespace Opm { namespace RestartIO { namespace Helpers { namespace VectorItems
MAXNOLINES = 157, // Maximum number of lines of schedule data for ACTION keyword - including ENDACTIO
MAXNOSTRPRLINE = 158, // Maximum number of 8-chars strings pr input line of Action data (rounded up from input)
MAX_ACT_ANLYTIC_AQUCONN = 162, // Maximum number of *active* connections across all analytic aquifers
NWMAXZ = 163, // Maximum number of wells in the model
NSEGWL = 174, // Number of multisegment wells defined with WELSEG
@@ -141,22 +139,13 @@ namespace Opm { namespace RestartIO { namespace Helpers { namespace VectorItems
WSEGITR_IT2 = 208, // NR - maximum no of times that a new iteration cycle with a reduced Wp will be started
NIIAQN = 223, // Number of data elements in IAQN array pr AQUNUM record
NIRAQN = 224, // Number of data elements in RAQN array pr AQUNUM record
NUM_AQUNUM_RECORDS = 226, // Number of AQUNUM records (lines of AQUNUM data)
MAX_ACT_COND = 245, // Maximum number of conditions pr action
MAX_AN_AQUIFER_ID = 252, // Maximum aquifer ID of all analytic aquifers (<= AQUDIMS(5))
MAX_AN_AQUIFERS = 252, // Maximum number of analytic aquifers
NO_FIELD_UDQS = 262, // No of Field UDQ data (parameters) /
NO_GROUP_UDQS = 263, // No of Group UDQ data (parameters) /
NO_WELL_UDQS = 266, // No of Well UDQ data (parameters) /
UDQPAR_1 = 267, // Integer seed value for the RAND /
AQU_UNKNOWN_1 = 269, // Not characterised. Equal to NAQUIF in all cases seen so far.
MAX_ANALYTIC_AQUIFERS = 286, // Declared maximum number of analytic aquifers in model. AQUDIMS(5).
NO_IUADS = 290, // No IUADs
NO_IUAPS = 291, // No IUAPs
RSEED = 296,
@@ -166,14 +155,6 @@ namespace Opm { namespace RestartIO { namespace Helpers { namespace VectorItems
ISECND = 410 // ISECND = current simulation time HH:MM:SS - number of seconds (SS), reported in microseconds
// (0-59,999,999)
};
namespace InteheadValues {
enum LiftOpt : int {
NotActive = 0, // Gas lift not enabled (LIFTOPT not present)
FirstIterationOnly = 1, // Optimise gas lift in first Newton iteration only (LIFTOPT(4) = NO)
EachNupCol = 2, // Optimise gas lift in each of first NUPCOL Newton iterations (LIFTOPT(4) = YES)
};
} // InteheadValues
}}}} // Opm::RestartIO::Helpers::VectorItems
#endif // OPM_OUTPUT_ECLIPSE_VECTOR_INTEHEAD_HPP

View File

@@ -45,9 +45,6 @@ namespace Opm { namespace RestartIO { namespace Helpers { namespace VectorItems
XFlow = 22,
item25 = 24, // Unknown
item32 = 31, // Unknown
WTestCloseReason = 39,
WTestConfigReason = 42,
WTestRemaining = 45,
item48 = 47, // Unknown
HistReqWCtrl = 49, // Well's requested control mode from
@@ -144,7 +141,6 @@ namespace Opm { namespace RestartIO { namespace Helpers { namespace VectorItems
Open = 1,
Auto = 3,
};
} // Value
} // IWell
@@ -166,10 +162,8 @@ namespace Opm { namespace RestartIO { namespace Helpers { namespace VectorItems
DrainageRadius = 17, // Well's drainage radius - item 7 from WELSPECS
EfficiencyFactor1 = 24, // Item2 from WEFAC; this value is repeated at two locations.
EfficiencyFactor2 = 31, // Item2 from WEFAC
WTestInterval = 32,
HistLiqRateTarget = 33, // Well's historical/observed liquid
// rate target/limit
WTestStartupTime = 39,
HistGasRateTarget = 54, // Well's historical/observed gas rate
// target/limit

View File

@@ -79,11 +79,6 @@ namespace Opm { namespace RestartIO { namespace Helpers {
throw std::invalid_argument("Window array with windowsize==0 is not permitted");
}
WindowedArray(const WindowedArray& rhs) = default;
WindowedArray(WindowedArray&& rhs) = default;
WindowedArray& operator=(const WindowedArray& rhs) = delete;
WindowedArray& operator=(WindowedArray&& rhs) = default;
/// Retrieve number of windows allocated for this array.
Idx numWindows() const
{

View File

@@ -30,7 +30,7 @@ namespace Opm {
namespace Opm { namespace data {
class Wells;
class WellRates;
}} // namespace Opm::data
@@ -81,7 +81,7 @@ namespace Opm { namespace RftIO {
const ::Opm::UnitSystem& usys,
const ::Opm::EclipseGrid& grid,
const ::Opm::Schedule& schedule,
const ::Opm::data::Wells& wellSol,
const ::Opm::data::WellRates& wellSol,
::Opm::EclIO::OutputStream::RFT& rftFile);
}} // namespace Opm::RftIO

View File

@@ -33,7 +33,6 @@ namespace Opm {
class Well;
class UnitSystem;
class UDQActive;
class Actdims;
} // Opm
@@ -63,26 +62,9 @@ namespace Opm { namespace RestartIO { namespace Helpers {
const std::size_t lookup_step,
const std::vector<int>& inteHead);
std::size_t
entriesPerSACT();
std::size_t
entriesPerIACT();
std::size_t
entriesPerZACT();
std::size_t
entriesPerZACN(const Opm::Actdims& actdims);
std::size_t
entriesPerIACN(const Opm::Actdims& actdims);
std::size_t
entriesPerSACN(const Opm::Actdims& actdims);
std::vector<int>
createActionRSTDims(const Schedule& sched,
createActionxDims( const Runspec& rspec,
const Schedule& sched,
const std::size_t simStep);
}}} // Opm::RestartIO::Helpers

View File

@@ -23,11 +23,9 @@
#include <map>
#include <memory>
#include <ostream>
#include <optional>
#include <vector>
#include <string>
#include <opm/parser/eclipse/Deck/DeckTree.hpp>
#include <opm/parser/eclipse/Deck/DeckKeyword.hpp>
#include <opm/parser/eclipse/Units/UnitSystem.hpp>
@@ -70,8 +68,6 @@ namespace Opm {
const DeckKeyword& getKeyword( const std::string& keyword, size_t index ) const;
const DeckKeyword& getKeyword( const std::string& keyword ) const;
const DeckKeyword& getKeyword( size_t index ) const;
const DeckKeyword& operator[](std::size_t index) const;
DeckKeyword& getKeyword( size_t index );
template< class Keyword >
const DeckKeyword& getKeyword() const {
@@ -126,13 +122,11 @@ namespace Opm {
using DeckView::size;
using DeckView::begin;
using DeckView::end;
using DeckView::operator[];
using iterator = std::vector< DeckKeyword >::iterator;
Deck();
Deck( const Deck& );
Deck( Deck&& );
static Deck serializeObject();
@@ -151,14 +145,10 @@ namespace Opm {
void selectActiveUnitSystem( UnitSystem::UnitType unit_type );
const std::string& getInputPath() const;
std::string getDataFile() const;
const std::string& getDataFile() const;
void setDataFile(const std::string& dataFile);
std::string makeDeckPath(const std::string& path) const;
DeckTree& tree();
DeckTree tree() const;
std::size_t size() const;
bool empty() const;
iterator begin();
iterator end();
void write( DeckOutput& output ) const ;
@@ -184,9 +174,8 @@ namespace Opm {
UnitSystem defaultUnits;
std::unique_ptr<UnitSystem> activeUnits;
std::optional<std::string> m_dataFile;
std::string m_dataFile;
std::string input_path;
DeckTree file_tree;
mutable std::size_t unit_system_access_count = 0;
};
}

View File

@@ -77,10 +77,6 @@ namespace Opm {
const std::vector< double >& getSIDoubleData() const;
const std::vector<value::status>& getValueStatus() const;
template< typename T>
void shrink_to_fit();
void push_back( UDAValue );
void push_back( int );
void push_back( double );
@@ -90,15 +86,15 @@ namespace Opm {
void push_back( int, size_t );
void push_back( double, size_t );
void push_back( std::string, size_t );
void push_backDefault( UDAValue, std::size_t n = 1 );
void push_backDefault( int, std::size_t n = 1 );
void push_backDefault( double, std::size_t n = 1 );
void push_backDefault( std::string, std::size_t n = 1 );
void push_backDefault( RawString, std::size_t n = 1 );
void push_backDefault( UDAValue );
void push_backDefault( int );
void push_backDefault( double );
void push_backDefault( std::string );
void push_backDefault( RawString );
// trying to access the data of a "dummy default item" will raise an exception
template <typename T>
void push_backDummyDefault( std::size_t n = 1 );
void push_backDummyDefault();
type_tag getType() const;
@@ -149,7 +145,6 @@ namespace Opm {
serializer.vector(default_dimensions);
}
void reserve_additionalRawString(std::size_t);
private:
mutable std::vector< double > dval;
std::vector< int > ival;
@@ -174,7 +169,7 @@ namespace Opm {
template< typename T > const std::vector< T >& value_ref() const;
template< typename T > void push( T );
template< typename T > void push( T, size_t );
template< typename T > void push_default( T, std::size_t n );
template< typename T > void push_default( T );
template< typename T > void write_vector(DeckOutput& writer, const std::vector<T>& data) const;
};
}

View File

@@ -22,16 +22,18 @@
#include <string>
#include <vector>
#include <memory>
#include <utility>
#include <opm/parser/eclipse/Parser/ParserKeyword.hpp>
#include <opm/parser/eclipse/Deck/DeckValue.hpp>
#include <opm/parser/eclipse/Deck/DeckRecord.hpp>
#include <opm/parser/eclipse/Deck/value_status.hpp>
#include <opm/common/OpmLog/KeywordLocation.hpp>
namespace Opm {
class DeckOutput;
class DeckValue;
class ParserKeyword;
class UnitSystem;
class DeckKeyword {
public:
@@ -54,13 +56,10 @@ namespace Opm {
size_t size() const;
bool empty() const;
void addRecord(DeckRecord&& record);
const DeckRecord& getRecord(size_t index) const;
DeckRecord& getRecord(size_t index);
const DeckRecord& getDataRecord() const;
const DeckRecord& operator[](std::size_t index) const;
DeckRecord& operator[](std::size_t index);
void setDataKeyword(bool isDataKeyword = true);
void setDoubleRecordKeyword(bool isDoubleRecordKeyword = true);
bool isDataKeyword() const;

View File

@@ -28,13 +28,6 @@ namespace Opm {
class DeckOutput {
public:
struct format {
std::string item_sep = " "; // Separator between items on a row.
size_t columns = 7; // The maximum number of columns on a record.
std::string record_indent = " "; // The indentation when starting a new line.
std::string keyword_sep = ""; // The separation between keywords;
};
explicit DeckOutput(std::ostream& s, int precision = 10);
~DeckOutput();
void stash_default( );
@@ -42,13 +35,17 @@ namespace Opm {
void start_record( );
void end_record( );
void start_keyword(const std::string& kw, bool split_line);
void start_keyword(const std::string& kw);
void end_keyword(bool add_slash);
void endl();
void write_string(const std::string& s);
template <typename T> void write(const T& value);
format fmt;
std::string item_sep = " "; // Separator between items on a row.
size_t columns = 16; // The maximum number of columns on a record.
std::string record_indent = " "; // The indentation when starting a new line.
std::string keyword_sep = "\n\n"; // The separation between keywords;
private:
std::ostream& os;
size_t default_count;

View File

@@ -34,7 +34,7 @@ namespace Opm {
typedef std::vector< DeckItem >::const_iterator const_iterator;
DeckRecord() = default;
DeckRecord( std::vector< DeckItem >&& items, const bool check_for_duplicate_names = true );
DeckRecord( std::vector< DeckItem >&& );
static DeckRecord serializeObject();

View File

@@ -1,71 +0,0 @@
/*
Copyright 2021 Statoil ASA.
This file is part of the Open Porous Media project (OPM).
OPM is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OPM is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef DECK_TREE_HPP
#define DECK_TREE_HPP
#include <string>
#include <unordered_map>
#include <unordered_set>
namespace Opm {
/*
The purpose of the DeckTree class is to maintain a minimal relationship
between the include files in the deck; the sole purpose of this class is to
support writing of decks with the keywords in the correct files.
*/
class DeckTree {
public:
DeckTree() = default;
DeckTree(const std::string&);
const std::string& parent(const std::string& fname) const;
bool includes(const std::string& parent_file, const std::string& include_file) const;
void add_include(std::string parent_file, std::string include_file);
void add_root(const std::string& fname);
bool has_include(const std::string& fname) const;
const std::string& root() const;
private:
class TreeNode {
public:
explicit TreeNode(const std::string& fn);
TreeNode(const std::string& pn, const std::string& fn);
void add_include(const std::string& include_file);
bool includes(const std::string& include_file) const;
std::string fname;
std::optional<std::string> parent;
std::unordered_set<std::string> include_files;
};
std::string add_node(const std::string& fname);
std::optional<std::string> root_file;
std::unordered_map<std::string, TreeNode> nodes;
};
}
#endif /* DECKRECORD_HPP */

Some files were not shown because too many files have changed in this diff Show More