Compare commits
2 Commits
release/20
...
release/20
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bcc96eda2c | ||
|
|
75b81a16a5 |
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
49
cmake/Modules/BoostTargets.cmake
Normal file
49
cmake/Modules/BoostTargets.cmake
Normal 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()
|
||||
@@ -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()
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
@@ -19,9 +19,7 @@ find_opm_package (
|
||||
"BLAS REQUIRED;
|
||||
LAPACK REQUIRED;
|
||||
CxaDemangle;
|
||||
MPI;
|
||||
TBB;
|
||||
GMP
|
||||
MPI
|
||||
"
|
||||
# header to search for
|
||||
"dune/common/fvector.hh"
|
||||
|
||||
@@ -24,8 +24,7 @@ find_opm_package (
|
||||
dune-alugrid;
|
||||
ZLIB;
|
||||
ZOLTAN;
|
||||
METIS;
|
||||
Quadmath
|
||||
METIS
|
||||
"
|
||||
# header to search for
|
||||
"dune/fem/space/shapefunctionset/legendre.hh"
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
2
debian/changelog
vendored
@@ -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
|
||||
|
||||
|
||||
@@ -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", ....
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
.TH RST_DECK
|
||||
.SH NAME
|
||||
rst_deck \- Create a version of deck ready for restart
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -23,9 +23,9 @@
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
|
||||
namespace Opm {
|
||||
#include <opm/common/OpmLog/KeywordLocation.hpp>
|
||||
|
||||
class KeywordLocation;
|
||||
namespace Opm {
|
||||
|
||||
namespace Log {
|
||||
namespace MessageType {
|
||||
|
||||
@@ -88,8 +88,6 @@ public:
|
||||
}
|
||||
|
||||
|
||||
static bool stdoutIsTerminal();
|
||||
|
||||
private:
|
||||
static std::shared_ptr<Logger> getLogger();
|
||||
static std::shared_ptr<Logger> m_logger;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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$
|
||||
//
|
||||
|
||||
@@ -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$
|
||||
|
||||
@@ -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$
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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$
|
||||
|
||||
@@ -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$
|
||||
|
||||
@@ -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$
|
||||
|
||||
@@ -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$
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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(); };
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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() };
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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;
|
||||
|
||||
@@ -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> (
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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) };
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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_;
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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},
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user