Compare commits

...

836 Commits

Author SHA1 Message Date
Arne Morten Kvarving
4e413a3aa7 bump version to 2021.10-rc1 2021-10-18 08:22:23 +02:00
Atgeirr Flø Rasmussen
3b2d650f8d Merge pull request #2757 from atgeirr/silence-struct-class-warning
Use struct consistently for Tuning.
2021-10-15 08:34:24 +02:00
Atgeirr Flø Rasmussen
8d123ea7ab Use struct consistently for Tuning. 2021-10-15 07:19:09 +02:00
Tor Harald Sandve
0dff883914 Merge pull request #2743 from daavid00/micp-2021-10
micp
2021-10-14 22:27:43 +02:00
daavid00
a26b69e91e Adding the SIScaling in MICPTests for correct parameetr conversion 2021-10-14 22:11:50 +02:00
daavid00
ae8baba566 Removing EQLDIMS word in MICPTests for jenkins building 2021-10-14 21:04:28 +02:00
daavid00
60d5cd2c70 Adding missing words to MICPTests for jenkins building 2021-10-14 20:41:22 +02:00
daavid00
ae5c09243a adding one test for the MICP keywords 2021-10-14 19:31:07 +02:00
daavid00
60963e2310 first version of micp implementation in flow 2021-10-14 17:27:13 +02:00
Joakim Hove
7b23110ccc Merge pull request #2753 from joakim-hove/wconprod-question-pattern
Ensure that matched wells are passed to WCONPROD and WCONINJE
2021-10-14 07:22:07 +02:00
Joakim Hove
aaed77da09 Merge pull request #2754 from joakim-hove/rst-deck-testing
Move some code from rst_deck application to FileDeck class
2021-10-14 07:21:53 +02:00
Joakim Hove
fa77a72e61 Merge pull request #2755 from bska/use-mutable-error-guard
Confer 'trim_wgname' Errors Back to Caller
2021-10-14 07:21:04 +02:00
Bård Skaflestad
64d0db7a26 Confer 'trim_wgname' Errors Back to Caller
Mutating a copy of the ErrorGuard object means we potentially lose
error conditions.
2021-10-13 22:37:10 +02:00
Joakim Hove
82b112305e Move some code from rst_deck application to FileDeck class 2021-10-13 14:51:02 +02:00
Joakim Hove
e101020f33 Add FileDeck::Index::operator< 2021-10-13 14:37:25 +02:00
Bård Skaflestad
117c9179fa Merge pull request #2739 from bska/restore-guiderate
Add Means of Initialising GR Values in SI Units
2021-10-13 14:01:25 +02:00
Joakim Hove
1e0c65163b Ensure that matched wells are passed to WCONPROD and WCONINJE 2021-10-13 12:33:36 +02:00
Bård Skaflestad
05e449440a Add Means of Initialising GR Values in SI Units
Intended use case is reading initial guide-rate values from the
restart file.
2021-10-13 11:41:23 +02:00
Bård Skaflestad
dcaf86e443 Hook Production Groups Into Guide Rate System at Restart
Otherwise, groups that have a non-trivial guide rate definition
won't be a part of group-level controls (GCONPROD) when continuing
the simulation run.
2021-10-13 11:41:23 +02:00
Bård Skaflestad
e451babec7 Restore Guiderate's Nominated Phase From Restart File 2021-10-13 11:41:23 +02:00
Bård Skaflestad
0c8f270723 Use min_element to Determine When GR Values Have Expired
This reduces the amount of mutable state being processed.
2021-10-13 11:41:23 +02:00
Bård Skaflestad
79a856ab20 Simplify Logic to Determine When to Reuse GR Values
Using map<>::find() means we also don't need to perform repeated
name-based lookups.
2021-10-13 11:41:23 +02:00
Bård Skaflestad
55ac8ff824 Make GuideRate Implementation Tidier
Mark parameters 'const' where possible, make value state private,
and wrap long lines.
2021-10-13 11:41:23 +02:00
Joakim Hove
0c2645154f Merge pull request #2747 from joakim-hove/wtest-state-rst-load
Wtest state rst load
2021-10-13 11:27:50 +02:00
Bård Skaflestad
9a866a8a10 Merge pull request #2751 from bska/report-siunits-injgr-grouplevel
Add Guide Rate Value Accessor for SI Units
2021-10-13 10:56:57 +02:00
Bård Skaflestad
d3ccb820af Add Guide Rate Value Accessor for SI Units
Needed to properly report group-level injection guide rates in the
summary file.

Forgotten in PR #2605 (commit 2a374fc53).
2021-10-13 09:53:39 +02:00
Joakim Hove
06fd01c6ba Create WellTestState object from restart file 2021-10-13 08:46:11 +02:00
Joakim Hove
ee92f53b72 Merge pull request #2746 from joakim-hove/wtest-load-rst
Wtest load rst
2021-10-13 08:43:06 +02:00
Joakim Hove
7a1869fa60 Load WTEST configuration from restart file 2021-10-12 17:04:18 +02:00
Joakim Hove
af253dde47 Merge pull request #2748 from joakim-hove/wtest-serialize
Enable serialize support for WellTestState
2021-10-12 17:03:23 +02:00
Joakim Hove
4d72677b57 Merge pull request #2750 from joakim-hove/rst_deck_bugfix
Fix bug in SOLUTION section iteration in rst_deck
2021-10-12 13:05:47 +02:00
Joakim Hove
b440860478 Fix bug in SOLUTION section iteration in rst_deck 2021-10-12 12:06:46 +02:00
Joakim Hove
c5267ad7e6 Merge pull request #2745 from joakim-hove/wtest-state-is-open
Remove WellTestState::xxx_is_open() predicates
2021-10-12 09:17:35 +02:00
Joakim Hove
c56165b2d0 Enable serialize support for WellTestState 2021-10-12 07:57:41 +02:00
Joakim Hove
178fd6462c Remove WellTestState::xxx_is_open() predicates 2021-10-11 17:26:51 +02:00
Joakim Hove
f1c51b549a Merge pull request #2718 from joakim-hove/wtest-restart
Wtest restart
2021-10-11 17:25:56 +02:00
Joakim Hove
7f24433337 Write WTEST configuration and state to restart file 2021-10-10 13:06:28 +02:00
Joakim Hove
f7b09380d4 Add WellTestState argument to AggregateWellData functions 2021-10-10 12:11:29 +02:00
Joakim Hove
bc6e2b268a Merge pull request #2737 from joakim-hove/wtest-state-refactor2
Wtest state refactor2
2021-10-10 09:54:08 +02:00
Joakim Hove
139e988598 Refactor WellStateTest to use map storage internally 2021-10-08 18:34:47 +02:00
Joakim Hove
5bd7b61075 Rename updateWells -> test_wells 2021-10-08 14:15:16 +02:00
Joakim Hove
e41a8dfbf1 Remove ecl wells from WellTestState::update call 2021-10-08 14:15:14 +02:00
Joakim Hove
69e0a49e55 Merge pull request #2742 from joakim-hove/welltest-state-rename
Welltest state rename
2021-10-08 14:06:52 +02:00
Joakim Hove
b317e1e8d8 WellTestState::dropCompletion -> WellTestState::open_completion 2021-10-08 12:56:48 +02:00
Joakim Hove
ac6a8f91d6 WellTestState::openWell -> WellTestState::open_well 2021-10-08 12:56:48 +02:00
Joakim Hove
a5ee46c195 WellTestState::hasWellClosed -> WellTestState::well_is_closed 2021-10-08 12:56:48 +02:00
Joakim Hove
60f0c3f260 WellTestState::closeWell -> WellTestState::close_well 2021-10-08 12:56:47 +02:00
Joakim Hove
c202ccfb46 WellTestState::hasCompletion -> WellTestState::completion_is_closed 2021-10-08 12:56:47 +02:00
Joakim Hove
d840b72ed5 WellTestState::addClosedCompletion - WellTestState::close_completion 2021-10-08 12:56:47 +02:00
Joakim Hove
52dde24faf WellTestState::openAllCompletions -> WellTestState::open_completions 2021-10-08 12:56:47 +02:00
Joakim Hove
b39cf81142 Renome unused function WellTestState::updateCompletion() 2021-10-08 12:56:47 +02:00
Joakim Hove
04bbb164d9 Merge pull request #2741 from dafeda/find_boost
Use built in FindBoost
2021-10-08 10:46:58 +02:00
Bård Skaflestad
72e4f5f774 Merge pull request #2738 from bska/restore-group-control
Restore Group Level Controls if Limits Exist
2021-10-08 10:13:21 +02:00
Bård Skaflestad
3ac75ed2fc Restore Group Level Controls if Limits Exist
A group may have limits but no active control at the time of restart.
2021-10-07 21:59:27 +02:00
Bård Skaflestad
687d98aeea Restore Limited Version of Exceed Action From Restart File
Applies to group-level production controls.
2021-10-07 21:59:27 +02:00
Bård Skaflestad
de0d603215 Merge pull request #2735 from bska/restore-history-cmode
Restore Well Level History Control Mode From Restart File
2021-10-07 21:01:38 +02:00
Bård Skaflestad
f1cdcdb0e9 Restore History Control Mode From Restart File
In this case, we must also discard all other limits to ensure we
don't accidentally change control modes until explicitly reset with
a new WCONHIST or WCONINJH keyword.
2021-10-07 15:49:13 +02:00
Bård Skaflestad
f2a98d2a8b Create Helper Functions to Determine Active Well Controls
While here, also check that history mode injectors use only RATE or
BHP controls.
2021-10-07 15:49:13 +02:00
Bård Skaflestad
0a266f460d Add Means of Discarding All Well Level Injection Controls
Needed when restoring history mode injectors from restart files.
2021-10-07 15:49:13 +02:00
Bård Skaflestad
5f0177e275 Merge pull request #2734 from bska/reset-actnum-eclipsestate
Support Resetting ACTNUM At EclipseState Level
2021-10-07 15:45:16 +02:00
Bård Skaflestad
fe2a3f5203 Support Resetting ACTNUM At EclipseState Level
Mostly a convenience method that avoids resorting to ugly const_cast
expressions in client code.
2021-10-07 14:50:50 +02:00
Bård Skaflestad
b3befa57fe Merge pull request #2730 from bska/prune-deactivated-anconn
Add Means of Pruning Deactivated Aquifer Connections
2021-10-07 14:49:35 +02:00
Bård Skaflestad
75ee817fed Add Means of Pruning Deactivated Aquifer Connections
This commit adds operation pruneDeactivatedAquiferConnections at
the EclipseState and AquiferConfig levels.  This is intended as a
stop-gap solution to a sequencing problem that arises from MINPV
processing.  In general we must not form connections to analytic
aquifers until the set of active grid cells is fully established.

Pruning cells that become deactivated as part of MINPV handling
nevertheless covers the common case of connection boxes applying
only to the outer shell.  Solving the problem in general will
however require delaying forming the analytic aquifer connections
until after the active cells are fully known.
2021-10-07 12:31:08 +02:00
Arne Morten Kvarving
0c7dc81814 Merge pull request #2740 from akva2/janitoring
anonymize parameter to quell compiler warning
2021-10-07 12:27:18 +02:00
Feda Curic
c2e8eabc2f Use built in FindBoost 2021-10-07 12:11:54 +02:00
Arne Morten Kvarving
c240581785 anonymize parameter to quell compiler warning 2021-10-07 11:10:29 +02:00
Joakim Hove
d2b221da64 Merge pull request #2736 from joakim-hove/welltest-state-wells-size
WellTestState: will only count actually closed wells
2021-10-07 09:27:34 +02:00
Joakim Hove
d78cdfbe7f WellTestState: will only count actually closed wells 2021-10-06 17:51:15 +02:00
Joakim Hove
d4baf44e1b Merge pull request #2727 from joakim-hove/netbalan-units
Handle NETBALAN keyword in Schedule section
2021-10-06 08:00:38 +02:00
Joakim Hove
d05f152100 Merge pull request #2722 from joakim-hove/add-wtest-state-argument
2: Add WellTestState argument to IO routines
2021-10-05 07:31:31 +02:00
Joakim Hove
75d05312b7 Add WellTestState argument to IO routines 2021-10-04 20:42:39 +02:00
Joakim Hove
2e6daf088b Merge pull request #2724 from joakim-hove/wtest-state-serialize
1: Wtest state serialize
2021-10-04 20:40:41 +02:00
Joakim Hove
e1b9602a25 Handle NETBALAN keyword in Schedule 2021-10-04 13:43:19 +02:00
Joakim Hove
0074364560 Merge pull request #2729 from joakim-hove/netbalan-commits
Netbalan commits
2021-10-04 13:42:58 +02:00
Joakim Hove
72ba5b8d36 Merge pull request #2728 from joakim-hove/cmp-network
Add network member to ScheduleState::operator==()
2021-10-04 13:11:24 +02:00
Joakim Hove
c6dc9277c5 Add units to JSON specification for NETBALAN keyword 2021-10-04 12:27:03 +02:00
Joakim Hove
a1f924baec Fix typo in json file 2021-10-04 12:27:03 +02:00
Joakim Hove
0e0c72edd5 Remove stale comments 2021-10-04 12:27:03 +02:00
Joakim Hove
4aea8cd584 Add network member to ScheduleState::operator==() 2021-10-04 12:23:42 +02:00
Joakim Hove
3ca639e2dd Add serialization support for WellTestState 2021-10-01 14:14:05 +02:00
Joakim Hove
bffa3a3768 Extracted buffer test class to separate compilation unit for reuse 2021-10-01 14:14:05 +02:00
Joakim Hove
cd1c40dbcb Merge pull request #2726 from totto82/fixUnitWECON
fix unit item 5 and item 6 WECON
2021-10-01 14:08:50 +02:00
Tor Harald Sandve
fad9305cdc fix unit item 5 and item 6 WECON 2021-10-01 12:55:43 +02:00
Joakim Hove
27ec5e0ea5 Merge pull request #2725 from joakim-hove/strip-actionx-cond-quotes
Strip the quotes when creating Actionx::Condition instance
2021-10-01 11:09:25 +02:00
Joakim Hove
21c53158ad Strip the quotes when creating Actionx::Condition instance 2021-09-30 17:17:50 +02:00
Joakim Hove
bd4386c79b Merge pull request #2723 from totto82/openComp
add method that open all completions
2021-09-30 16:43:29 +02:00
Tor Harald Sandve
cc24920ff9 add method that open all completions 2021-09-30 11:46:19 +02:00
Joakim Hove
9a2a4036de Merge pull request #2720 from joakim-hove/wtest-overwrite
WTEST - consecutive keywords overwrite instead of updating
2021-09-30 10:31:23 +02:00
Bård Skaflestad
05bac5f59a Merge pull request #2719 from OPMUSER/master
Add WTEST to Allowed ACTIONX Keywords
2021-09-29 18:41:28 +02:00
Bård Skaflestad
53dcb5c8a0 Merge pull request #2721 from blattms/fix-fs-proximare-gcc7
Fix compilation with g++-7 lacking fs::proximate
2021-09-29 18:40:00 +02:00
Bård Skaflestad
7ecbf4725a Merge pull request #2714 from jalvestad/rstfieldctrl-r
Improve Eclipse-compatible restart file. Output correct Guiderate control and FIELD level control
2021-09-29 17:07:08 +02:00
Markus Blatt
49bfad1779 Fix compilation with g++-7 lacking fs::proximate
Use Opm::prximate instead of fs::proximate. Fixes
compilation issue like
```
opm-common/src/opm/parser/eclipse/Deck/FileDeck.cpp: In member function ‘void Opm::FileDeck::dump_shared(std::ostream&, const string&) const’:
opm-common/src/opm/parser/eclipse/Deck/FileDeck.cpp:331:44: error: ‘proximate’ is not a member of ‘fs’
             std::string include_file = fs::proximate(block.fname, output_dir);
```
2021-09-29 16:36:03 +02:00
Joakim Hove
05c6fb3cbd WTEST - consecutive keywords overwrite instead of updating 2021-09-29 14:00:04 +02:00
OPMUSER
491275cfc7 Update SummaryConfigTests.cpp 2021-09-29 19:57:24 +08:00
OPMUSER
7d0bf1adde Remove FSIP from ALL keyword Vector List
FSIP (Field Salt In-Place) is not part of the SUMMARY ALL keyword vector list.
2021-09-29 19:08:06 +08:00
OPMUSER
97dd24c7ee Add WTEST to Allowed ACTIONX Keywords
Add WTEST to allowed ACTIONX Keywords
2021-09-29 18:54:03 +08:00
Joakim Hove
3369785c7d Merge pull request #2715 from bska/restore-bhp-hist-limit
Set Appropriate Restart BHP Limit for History Wells
2021-09-28 21:52:43 +02:00
Bård Skaflestad
b97819a121 Set Appropriate Restart BHP Limit for History Wells
Without this we would end up with very wrong BHP limits for this
case--e.g., upper BHP limit of 1 ATM for injectors--and this would
obviously mean that restarted runs do not converge.
2021-09-28 12:01:59 +02:00
Bård Skaflestad
88b6cebb19 Fix Spelling 2021-09-28 12:01:59 +02:00
Joakim Hove
1db095c69b Merge pull request #2717 from OPMUSER/master
Add WECON to Allowed ACTIONX Keywords
2021-09-28 11:57:26 +02:00
Bård Skaflestad
3c23f90cfe Merge pull request #2711 from totto82/wtest_ref
return unique vector of names and not a map with wells and reason
2021-09-28 11:30:36 +02:00
OPMUSER
a0b6e7533b Add WECON to Allowed ACTIONX Keywords 2021-09-28 16:18:35 +08:00
Tor Harald Sandve
cb6db86afe return unique vector of names and not a map with wells and reason 2021-09-28 10:07:45 +02:00
Joakim Hove
caacf4e047 Merge pull request #2716 from joakim-hove/fix-udqstate-serialize-object
Fix serializeObject in UDQState
2021-09-28 09:54:02 +02:00
Joakim Hove
2edfbc42e1 Fix serializeObject in UDQState 2021-09-28 09:01:06 +02:00
Joakim Hove
b39e32a221 Merge pull request #2712 from joakim-hove/serialize-action-state
Serialize Action::State
2021-09-27 13:47:22 +02:00
Jostein Alvestad
77b86dfd3b final changes for corretions to IGRP[nwgmax+WInjActiveCMode] and IGRP[nwgmax+GConInjeWInjCMode] plus similar gas inj 2021-09-27 12:24:34 +02:00
Jostein Alvestad
b97931ddd5 first changes to improve guiderate output to restart file - enums mapping 2021-09-27 12:24:32 +02:00
Arne Morten Kvarving
94d15ca921 Merge pull request #2713 from akva2/fix_rh_rst_deck
fix redhat packaging
2021-09-27 08:14:54 +02:00
Arne Morten Kvarving
e8a8688a48 fix redhat packaging
due to new man page
2021-09-27 08:14:26 +02:00
Joakim Hove
f05fbe281a Add serializer support for UDQState 2021-09-25 11:51:34 +02:00
Joakim Hove
cb5eef07a6 Serialize Action::State 2021-09-25 08:29:27 +02:00
Arne Morten Kvarving
beb78ca1f9 Merge pull request #2710 from akva2/fix_semicolon
fixed: sneaky ; was supposed to be :
2021-09-24 22:27:45 +02:00
Joakim Hove
5a3eca0fe5 Merge pull request #2684 from joakim-hove/file-deck
rst_deck: application to create a deck prepared for restart
2021-09-24 18:46:45 +02:00
Joakim Hove
04dd44488b Merge pull request #2709 from joakim-hove/rst-update-tuning-bug
Fix out of bounds write
2021-09-24 18:45:42 +02:00
Joakim Hove
cc0b9add62 Add integration testing of rst_deck 2021-09-24 14:19:25 +02:00
Joakim Hove
24f31e6358 Add application rst_deck 2021-09-24 14:19:25 +02:00
Arne Morten Kvarving
ed445c9bb2 fixed: do not keep tacking on PYTHONPATH for each build configuration 2021-09-24 14:02:11 +02:00
Joakim Hove
d94db10da4 Fix out of bounds write 2021-09-24 08:34:24 +02:00
Joakim Hove
294d98b9bd Add container FileDeck to represent a deck with file awareness 2021-09-23 21:46:10 +02:00
Joakim Hove
a172879395 Assemble DeckTree during parse process 2021-09-23 14:24:35 +02:00
Joakim Hove
6f94580ff1 Add class DeckTree to mange include file hierarchy 2021-09-23 14:24:35 +02:00
Joakim Hove
a39c707282 Merge pull request #2705 from joakim-hove/opmhash-multi
Add multi deck comparison to opmhash
2021-09-23 14:23:59 +02:00
Bård Skaflestad
b807f39357 Merge pull request #2706 from joakim-hove/use-strtod
Use strtod
2021-09-23 11:26:34 +02:00
Joakim Hove
4910e75d63 Avoid try catch when parsing floating point numbers in UDQ 2021-09-23 10:23:25 +02:00
Joakim Hove
97455adfa6 Add utility function to parse string -> double without exception 2021-09-23 10:23:25 +02:00
Bård Skaflestad
f21239c5a7 Merge pull request #2707 from akva2/set_python_path
set python path in jenkins build script
2021-09-23 10:01:13 +02:00
Arne Morten Kvarving
cc4cc85361 fixed: support cmake 3.13
the Python3 find module only sets Python3_VERSION_XXX,
not PYTHON_VERSION_XXX
2021-09-23 08:43:30 +02:00
Arne Morten Kvarving
7a65fe951e set python path in jenkins build script 2021-09-23 08:29:38 +02:00
Bård Skaflestad
e0e26df2ae Merge pull request #2701 from goncalvesmachadoc/fieldInPlace
add field volumes in place to summary
2021-09-22 21:53:58 +02:00
Joakim Hove
1a7e2edf52 Add multi deck comparison to opmhash 2021-09-22 18:23:35 +02:00
Joakim Hove
ceb03e889d Merge pull request #2698 from joakim-hove/load-action-state
Load action state
2021-09-22 12:35:52 +02:00
Joakim Hove
a8afa7a50f Load run_count and last runtime for actionx from restart file 2021-09-22 00:27:59 +02:00
Joakim Hove
d338325147 Merge pull request #2699 from joakim-hove/numerical-month
Round numerical month values to integer before comparison
2021-09-22 00:27:35 +02:00
Joakim Hove
33a791d499 Merge pull request #2696 from joakim-hove/actionx-strip-quotes
Remove quotes before creating ACTIONX AST
2021-09-22 00:27:16 +02:00
Joakim Hove
745fe11b87 Merge pull request #2704 from joakim-hove/use-proximate
Use fs:proximate() due to missing fs::relative()
2021-09-21 14:59:14 +02:00
Joakim Hove
0213cbad17 Merge pull request #2702 from joakim-hove/deck-tree-commitsII
Deck tree commits ii
2021-09-21 13:43:05 +02:00
Joakim Hove
7f9f20b84e Merge pull request #2700 from hakonhagland/pybind_shared
Use std::shared_ptr as holder type for some Pybind11 classes
2021-09-21 13:33:42 +02:00
Joakim Hove
1f0c3133c6 Use Opm::proximate() due to missing fs::relative() 2021-09-21 13:20:15 +02:00
Joakim Hove
bb5ddb477e Mark TSTEP as keyword which should be split on output 2021-09-21 10:36:20 +02:00
Joakim Hove
ca3eae90ff Add Deck::operator[]() 2021-09-21 10:36:20 +02:00
Joakim Hove
8fffd10ec3 Add DeckKeyword::operator[]() 2021-09-21 10:36:20 +02:00
Joakim Hove
73a3e1d095 Add methods Deck::size() and Deck::empty() 2021-09-21 10:36:20 +02:00
Joakim Hove
daaee6d2a4 Accept numerical month values when outputting ACTIONX state for rst 2021-09-20 19:05:06 +02:00
Joakim Hove
fcad042bdd Round numerical month values to integer before comparison 2021-09-20 19:04:34 +02:00
Joakim Hove
111d1f7ea7 Merge pull request #2697 from joakim-hove/runspec-sim-start
Runspec sim start
2021-09-20 19:03:17 +02:00
Joakim Hove
9a8fae2a88 Merge pull request #2695 from joakim-hove/max-action-conditions
Check number of conditions in ACTIONX with ACTDIMS
2021-09-20 19:02:50 +02:00
Joakim Hove
87f3d039f3 Merge pull request #2693 from joakim-hove/deck-tree-commits
Deck tree commits
2021-09-20 19:02:09 +02:00
goncalvesmachadoc
8698d20d0f add volumes in place to summary 2021-09-20 17:55:08 +02:00
Bård Skaflestad
05e147105e Merge pull request #2694 from totto82/aquct15
add item 13 in AQUCT
2021-09-20 12:18:44 +02:00
Håkon Hægland
29c4ffcdc9 Use std::shared_ptr as holder type.
Use std::shared_ptr as holder type for some Pybind11 classes such that
they can be shared with opm.simulators.
2021-09-20 11:43:50 +02:00
Tor Harald Sandve
c84d52d964 add item 13 in AQUCT 2021-09-20 10:05:13 +02:00
Joakim Hove
e9c9d9b5e3 Use Runspec start_time when assembling ScheduleDeck 2021-09-19 11:23:47 +02:00
Joakim Hove
b8c09945a3 Internalize start time in Runspec 2021-09-19 11:16:25 +02:00
Joakim Hove
8d63e4f20d Moved time related functions from ScheduleDeck to TimeService 2021-09-19 11:06:52 +02:00
Joakim Hove
67b850d086 Remove quotes before creating ACTIONX AST 2021-09-18 20:48:40 +02:00
Joakim Hove
56f5ae6558 Check number of conditions in ACTIONX with ACTDIMS 2021-09-18 18:46:12 +02:00
Joakim Hove
1ef317a66b Normalize include file paths 2021-09-17 14:40:59 +02:00
Joakim Hove
b936b3f7d4 Normalize argument path before internalizing 2021-09-17 14:10:50 +02:00
Joakim Hove
4920b0ea3a Disallow multiple assignments to Deck::datafile 2021-09-17 12:05:51 +02:00
Joakim Hove
0355a71abd Merge pull request #2690 from joakim-hove/readonly-testing
Readonly testing
2021-09-17 12:05:32 +02:00
Arne Morten Kvarving
7894aaf073 Merge pull request #2692 from akva2/janitoring
fixed: use curly-braces
2021-09-17 11:06:36 +02:00
Arne Morten Kvarving
6a69a985cd fixed: use curly-braces
the parantheses confused the preprocessor
2021-09-17 10:49:52 +02:00
Joakim Hove
7562781a8b Readonly summary testing 2021-09-17 10:01:17 +02:00
Joakim Hove
ca59665575 Run ERst tests in readonly tests/ 2021-09-17 10:01:17 +02:00
Joakim Hove
9478bf0292 Run EclIO tests in readonly tests/ 2021-09-17 10:01:17 +02:00
Joakim Hove
41c97ad6a2 Make sure regression test testing can go in readonly tests/ 2021-09-17 10:01:17 +02:00
Joakim Hove
08f9140191 Summary testing with readonly tests/ 2021-09-17 10:01:17 +02:00
Joakim Hove
5b3cd8b908 Ensure RFT testing can be done in readonly tests/ 2021-09-17 10:01:17 +02:00
Joakim Hove
1f8e545ea1 Make sure summary testing can be done with readonly tests/ 2021-09-17 10:01:17 +02:00
Joakim Hove
2d879941fe Ensure UDQ tests can run in readonly tests/ 2021-09-17 10:01:17 +02:00
Joakim Hove
5c0aec538b Make sure test can run in readonly tests/ 2021-09-17 10:01:17 +02:00
Joakim Hove
d3cd4c73ba Make sure tests can be run with readonly tests/ 2021-09-17 10:01:17 +02:00
Joakim Hove
d938b69143 WorkArea::org_path 2021-09-17 10:01:17 +02:00
Joakim Hove
c0d7ca8136 Merge pull request #2687 from joakim-hove/rsm-cmp-zero
Special case comparison with zero
2021-09-16 13:38:26 +02:00
Joakim Hove
60bdfb6a93 Special case comparison with zero 2021-09-16 12:56:08 +02:00
Joakim Hove
a775808972 Merge pull request #2685 from joakim-hove/rsm-summary-compare-fix
Compare with startdate and not first simulation date
2021-09-15 23:58:12 +02:00
Joakim Hove
8821b27556 Special case rsm <-> summary comparison for zero values 2021-09-15 20:44:39 +02:00
Joakim Hove
8f263e637b Merge pull request #2664 from joakim-hove/rst-actionx-keywords
Rst actionx keywords
2021-09-15 16:03:09 +02:00
Joakim Hove
d53984c72d Add trailing newline to error message 2021-09-15 14:38:27 +02:00
Joakim Hove
75add72412 Load action keywords from restart file 2021-09-15 14:29:28 +02:00
Joakim Hove
a9c987b70f Some simplification in ZLACT book keeping 2021-09-15 14:29:28 +02:00
Joakim Hove
21d1b63164 Compare with startdate and not first simulation date 2021-09-15 14:04:53 +02:00
Joakim Hove
d64d138147 Merge pull request #2660 from joakim-hove/split-udq-eval
Split udq eval in eval_assign() and eval_define()
2021-09-14 20:06:14 +02:00
Joakim Hove
df8e14a8ac Throw exception if unknown UDQ is used as UDA 2021-09-14 15:58:59 +02:00
Joakim Hove
d880637a65 Utility function UDQ::controlName(UDAControl) -> std::string 2021-09-14 15:58:59 +02:00
Joakim Hove
598afb9dc9 Split udq eval in eval_assign() and eval_define() 2021-09-14 15:58:59 +02:00
Joakim Hove
4b3231c9ef Merge pull request #2647 from joakim-hove/rst-actionx
Rst actionx
2021-09-14 15:54:32 +02:00
Joakim Hove
b14790f990 Merge pull request #2675 from joakim-hove/no-actnum
Handle GDFILE with grid without actnum
2021-09-14 15:53:24 +02:00
Joakim Hove
b319647a09 Merge pull request #2682 from akva2/janitoring
fixed: add missing field initializers
2021-09-14 15:52:50 +02:00
Joakim Hove
fb6aeb240f Merge pull request #2683 from blattms/spelling-fix
Fixed spelling of assignment,
2021-09-14 15:52:19 +02:00
Markus Blatt
9833afbc5f Fixed spelling of assignment,
Detected by linitian run on Debian package for opm-upscaling.
2021-09-14 12:27:36 +02:00
Arne Morten Kvarving
a2bef15aa1 fixed: add missing field initializers 2021-09-14 11:11:37 +02:00
Joakim Hove
7ad1f360bd Merge pull request #2680 from joakim-hove/output-width
Ensure that normal keywords are not split on output
2021-09-13 17:25:46 +02:00
Joakim Hove
b31c68e830 Ensure that normal keywords are not split on output 2021-09-13 16:50:07 +02:00
Joakim Hove
507f60ec25 Merge pull request #2681 from joakim-hove/testdata-include
Reorganize test deck to use INCLUDE
2021-09-13 16:46:32 +02:00
Joakim Hove
6cc0cba14c Reorganize test deck to use INCLUDE 2021-09-13 16:26:20 +02:00
Joakim Hove
0da931a7e6 Merge pull request #2661 from joakim-hove/save-correct-report-step
Assign SAVE keyword to previous report step
2021-09-13 15:12:56 +02:00
Joakim Hove
6c9a756d9e Merge pull request #2671 from tskille/esmry_lgr
Adding support for LGR related summary vectors
2021-09-13 14:06:21 +02:00
Joakim Hove
bf7d162ce4 Load actionx from restart file 2021-09-13 11:43:26 +02:00
Torbjørn Skille
ce052232f6 update SummaryNode with lgr info 2021-09-13 11:38:41 +02:00
Joakim Hove
e7aa8fda54 Merge pull request #2678 from joakim-hove/remove-parser-output
Remove debug output from parser keyword generation
2021-09-13 11:16:12 +02:00
Joakim Hove
8b5475b98b Merge pull request #2677 from joakim-hove/actionx-enable-gconsump
Enable keywords as ACTIONX keywords
2021-09-13 11:03:42 +02:00
Joakim Hove
c61e3adb86 Remove debug output from parser keyword generation 2021-09-13 10:46:37 +02:00
Joakim Hove
aefb78e078 Enable keywords as ACTIONX keywords 2021-09-13 10:38:00 +02:00
Joakim Hove
efaa613368 Add testdata for restart load testing of ACTIONX 2021-09-13 10:33:32 +02:00
Joakim Hove
de942d91b6 Load ACTIONX conditions from restart file 2021-09-13 10:33:32 +02:00
Joakim Hove
974c53fcd1 Add comment about content of ACTIONX related INTEHEAD parameters 2021-09-13 10:18:35 +02:00
Joakim Hove
539c86c21c Move action condition related enums to separate compilation unit 2021-09-13 10:18:35 +02:00
Joakim Hove
de00a53190 White space 2021-09-13 10:18:35 +02:00
Joakim Hove
3ffff5b65d Merge pull request #2669 from jalvestad/rst_improvement
Add correct value for SACT[4] - equal to last time that the action was triggered
2021-09-13 09:52:41 +02:00
Joakim Hove
00bd0866f2 SAVE keyword should apply to previous timestep 2021-09-13 09:26:00 +02:00
Joakim Hove
1216b4f638 Remove restart schedule testing of possibly dubious quality 2021-09-13 09:10:53 +02:00
Joakim Hove
a1f8585395 Handle GDFILE with grid without actnum 2021-09-13 09:00:16 +02:00
Torbjørn Skille
e4c324dcef Adding support for LGR related summary vectors 2021-09-13 08:37:35 +02:00
Joakim Hove
7002faba3b Merge pull request #2662 from joakim-hove/remove-uda-autocreate
Remove uda autocreate
2021-09-12 08:45:44 +02:00
Joakim Hove
34ab3d8bd7 Merge pull request #2668 from joakim-hove/igph-rst-size
Unconditonally use number of groups for IGPH restart vector
2021-09-12 08:35:51 +02:00
Joakim Hove
fe22a67670 Merge pull request #2666 from joakim-hove/rst-nothing
Protect against unset optional when checking restart config
2021-09-12 08:35:33 +02:00
Joakim Hove
c7237dbc36 Merge pull request #2670 from joakim-hove/udq-trailing-comments
Special case treatment of trailing slash for UDQ keywords
2021-09-12 08:35:18 +02:00
Joakim Hove
9bad260538 Special case treatment of trailing slash for UDQ keywords 2021-09-11 08:29:42 +02:00
Joakim Hove
4dfe80b493 Merge pull request #2663 from joakim-hove/rst-add-parser-argument
Add Parser argument to restart loader
2021-09-10 16:27:42 +02:00
Joakim Hove
a289bc790e Ensure that temporary igph vector is allocated with correct size 2021-09-10 16:16:33 +02:00
Joakim Hove
8790dc5524 Merge pull request #2665 from joakim-hove/has-gpmaint
Add small utility function to check for gpmaint across groups
2021-09-10 14:45:27 +02:00
Jostein Alvestad
59b1166682 Added correction to handle actions that has not been run, plus unit test for SACT[4] 2021-09-10 14:44:39 +02:00
Joakim Hove
5358aa5485 Protect against unset optional when checking restart config 2021-09-10 12:45:54 +02:00
Jostein Alvestad
d9f7c89ecb added sAct[4] = last time that the action was triggered 2021-09-10 08:40:40 +02:00
Joakim Hove
8787078f4b Add small utility function to check for gpmaint across groups 2021-09-09 16:31:13 +02:00
Joakim Hove
7e3d910823 Add begin() and end() const iterators for ScheduleState::map_member 2021-09-09 16:21:33 +02:00
Joakim Hove
54e1345d45 Add Parser argument to restart loader 2021-09-09 12:48:41 +02:00
Joakim Hove
026cbade9c UDQ - a keyword is not recognized only from UNITS verb 2021-09-09 08:30:00 +02:00
Joakim Hove
babff0e0ba Stopped auto creation of UDQ ASSIGN from UDQ UNITS 2021-09-09 08:30:00 +02:00
Joakim Hove
6e13564832 Merge pull request #2658 from joakim-hove/time-point-utility
Utility function to create time_point from UTC timestamp
2021-09-08 14:00:55 +02:00
Joakim Hove
206fe1cf69 Utility function to create time_point from UTC timestamp 2021-09-08 13:58:45 +02:00
Joakim Hove
6a684235d2 Merge pull request #2656 from joakim-hove/action-rst-const
Action rst const
2021-09-08 08:36:13 +02:00
Bård Skaflestad
b101ea885a Merge pull request #2657 from tskille/esmry_fix
fixing bug in Opm::EclIO::ESmry constructor
2021-09-07 23:58:34 +02:00
Torbjørn Skille
c900462edb fixing bug in Opm::EclIO::ESmry constructor
- changed behaviour when opening summary file from restart run
 - will now work with loadBaseRunData=false and original base run folder
   not found.
2021-09-07 22:49:48 +02:00
Joakim Hove
d281881448 rst: use named constants for actionx condition information 2021-09-07 12:40:23 +02:00
Joakim Hove
9cff0dae26 Merge pull request #2655 from joakim-hove/rst-actionx-commits
Rst actionx commits
2021-09-07 08:44:46 +02:00
Joakim Hove
1eaa527725 Implement Actions::operator[] 2021-09-06 20:02:04 +02:00
Joakim Hove
7284c250b3 Make number of restart items for ACTIONX public 2021-09-06 20:02:04 +02:00
Joakim Hove
972136c98b Add method sim_time() in rst::header 2021-09-06 20:02:04 +02:00
Joakim Hove
cc05d493c0 Add utility function to format double 2021-09-06 19:43:16 +02:00
Joakim Hove
02b7e9ae04 Add mapping int -> string for month names 2021-09-06 19:42:51 +02:00
Joakim Hove
6b26dea23a Merge pull request #2652 from joakim-hove/rst-actionx-commits
Rst actionx commits
2021-09-06 16:40:26 +02:00
Joakim Hove
0b97a8bcae Merge pull request #2651 from joakim-hove/add-runspec-arg
Add const Runspec& argument to restart loader
2021-09-06 16:40:11 +02:00
Bård Skaflestad
531090bdab Merge pull request #2653 from akva2/janitoring
remove unused variable
2021-09-06 09:58:30 +02:00
Arne Morten Kvarving
b902867328 remove unused variable 2021-09-06 09:15:00 +02:00
Joakim Hove
f3fc5c7d76 Remove context aware rst testing from regression tester 2021-09-06 08:20:54 +02:00
Joakim Hove
e73b6a053e Use month names from TimeService 2021-09-06 08:20:54 +02:00
Joakim Hove
5b89ba16fb Add functions to convert Action::Condition::Comparator <-> int 2021-09-06 08:20:54 +02:00
Joakim Hove
b35e78df9f Introduce convenience functions to convert int <-> Actionx OR/AND 2021-09-06 08:20:54 +02:00
Joakim Hove
e3685eeb34 Introduce predicated Condition::date() for Actionx output 2021-09-06 08:20:54 +02:00
Joakim Hove
a49758af62 Remove unused argument 2021-09-06 08:16:13 +02:00
Joakim Hove
fcca036af4 Remove context aware rst testing from regression tester 2021-09-04 19:51:10 +02:00
Joakim Hove
04a44657d6 Add const Runspec& argument to restart loader 2021-09-04 19:42:31 +02:00
Joakim Hove
d060d92268 Merge pull request #2649 from joakim-hove/actdims-rename
Rename actDims in AggregateActionxData
2021-09-04 19:10:47 +02:00
Joakim Hove
4b0df44879 Merge pull request #2650 from jalvestad/ighp-unit-test
Unit test for IGPH
2021-09-04 19:00:25 +02:00
Joakim Hove
d904ab6108 Rename actDims -> action_rst_dims + refactor Actionx restart 2021-09-04 18:13:11 +02:00
Joakim Hove
e75b6167ef Split Actions::size() in py_size() and ecl_size() 2021-09-03 14:05:43 +02:00
Jostein Alvestad
1d3415d07a added unit tests for IGPH 2021-09-03 13:29:18 +02:00
Tor Harald Sandve
08e22740d8 Merge pull request #2648 from joakim-hove/group-has-injection-control
Use Group class to query for  controls
2021-09-03 07:32:28 +02:00
Joakim Hove
51213a30b5 Remove has_control() method from Injection and Production controls 2021-09-02 22:24:16 +02:00
Joakim Hove
09becfbb7f Include target control in GPMaint when acessing group 2021-09-02 22:08:51 +02:00
Joakim Hove
038c1946c7 Use Group class to query for injection controls 2021-09-02 16:21:08 +02:00
Bård Skaflestad
a3ccf0118b Merge pull request #2645 from akva2/fix_thread_stupid
fixed: do not assign value to nonexistent variable
2021-09-02 11:42:54 +02:00
Arne Morten Kvarving
a2d5b83dbc fixed: do not assign value to nonexistent variable 2021-09-02 10:36:18 +02:00
Tor Harald Sandve
9af5108421 Merge pull request #2643 from joakim-hove/gpmaint-state
Gpmaint state
2021-09-02 08:02:25 +02:00
Joakim Hove
81f5ec72e9 Merge pull request #2642 from joakim-hove/schedule-rename-runtime
Schedule rename runtime
2021-09-02 07:16:13 +02:00
Joakim Hove
5d8053c134 Add inner class State to GPMaint and GPMaint::rate() method 2021-09-01 21:19:53 +02:00
Joakim Hove
46d92d4701 Add report step member to GPMaint class 2021-09-01 16:02:23 +02:00
Joakim Hove
39938be2c3 Rename HandlerContext::runtime
When replaying the Schedule keywords due to ACTIONX only the actual ACTIONX
keywords should be involved with the runtime flag set to true. The rest of the
deck should be evaluated in the normal way.
2021-09-01 15:44:25 +02:00
Joakim Hove
100f6e96d1 Add small function Schedule::end_report() 2021-09-01 15:43:52 +02:00
Bård Skaflestad
84c0f73a33 Merge pull request #2640 from goncalvesmachadoc/radial
fix bug radial
2021-09-01 09:37:36 +02:00
Cintia Goncalves Machado
08c4cebced fix bug radial 2021-09-01 00:01:18 +02:00
Joakim Hove
60971f21e8 Merge pull request #2620 from joakim-hove/uda-rst
Uda rst
2021-08-31 16:48:03 +02:00
Markus Blatt
44c612ef7a Merge pull request #2639 from bska/fix-signed-vs-unsigned
Fix "Signed vs. Unsigned" Comparison Warning
2021-08-31 14:32:16 +02:00
Bård Skaflestad
17e3c9ce63 Fix "Signed vs. Unsigned" Comparison Warning
Use range-for instead of a counted loop.  While here, also mark a
few objects as 'const' to avoid inadvertent modifications.
2021-08-31 12:48:25 +02:00
Joakim Hove
5e2bff42cf Update UDA properties from restart file 2021-08-31 12:48:01 +02:00
Joakim Hove
d8d6749337 Load active UDA's from restart file 2021-08-31 11:20:12 +02:00
Joakim Hove
fd010c1370 Add testdata for UDA restart testing 2021-08-31 11:20:12 +02:00
Joakim Hove
dca7775997 Merge pull request #2633 from joakim-hove/uda-ig-phase
Ensure that UDA is only active for one phase in restart file
2021-08-31 11:19:09 +02:00
Bård Skaflestad
7a2f2bd23a Merge pull request #2635 from tskille/ecloutput_update
Update of class EclOutput
2021-08-31 10:03:58 +02:00
Joakim Hove
89d7507bfa Merge pull request #2638 from joakim-hove/summary-action-keys-month-names
Intercept month keywords earlier in Summary creation
2021-08-30 19:43:15 +02:00
Joakim Hove
5b8d24bf2f Intercept month keywords earlier in Summary creation 2021-08-30 17:32:41 +02:00
Markus Blatt
657f04cd28 Merge pull request #2631 from blattms/dune-2.8-metis
Fix FindMETIS for DUNE 2.8.
2021-08-30 16:23:55 +02:00
Torbjørn Skille
a9ba936f6a update of class EclOutput
- significant improvements on performance
 - writing blocks of data from disk, rather that one by one element
2021-08-30 15:57:53 +02:00
Joakim Hove
50cb0b5da2 Merge pull request #2636 from bska/segmet-wct
Support Segment-Level Water Cut Summary Vector
2021-08-30 09:53:07 +02:00
Bård Skaflestad
b251d5dfe6 Support Segment-Level Water Cut Summary Vector 2021-08-29 21:08:42 +02:00
Bård Skaflestad
1858362ce7 Merge pull request #2634 from tskille/eclfile_update
update of base class EclFile
2021-08-27 23:06:31 +02:00
Bård Skaflestad
2e1c65e515 Merge pull request #2565 from goncalvesmachadoc/fsip
add FSIP to summary
2021-08-27 22:43:52 +02:00
Torbjørn Skille
83b5c99135 update of base class EclFile
- significant improvements on performance
 - reading blocks of data from disk, rather that one by one element
 - using block sizes defined in Opm::EclIO::EclIOdata.hpp

updates of EGrid::get_zcorn_from_disk
 - using same approach as for EclFile
 - also minor change in EGrid api
2021-08-27 20:21:46 +02:00
Cintia Goncalves Machado
65017f3855 add FSIP to test 2021-08-27 13:13:48 +02:00
Joakim Hove
bbba7661a1 Ensure that UDA is only active for one phase in restart file 2021-08-27 11:58:09 +02:00
Joakim Hove
de6997847d Add function to check if GroupInjectionProperties is UDA enabled 2021-08-27 11:55:24 +02:00
Joakim Hove
4604c2b0c8 Merge pull request #2632 from joakim-hove/uda-rst-commits
Uda rst commits
2021-08-27 11:36:42 +02:00
Cintia Goncalves Machado
7520e95276 outputFSIP 2021-08-26 18:31:56 +02:00
Joakim Hove
cb6e6164a3 Add operator== to Well::ProductionControls and init struct members 2021-08-26 18:30:29 +02:00
Joakim Hove
8dfa1cdd2b Refactor test 2021-08-26 18:30:29 +02:00
Bård Skaflestad
06ad830769 Merge pull request #2629 from jalvestad/actionrst-improvement
Corrections to Actionx data IACT, SACT
2021-08-26 17:56:11 +02:00
Joakim Hove
bf5e63f8cf Add Group::injectionProperties(Phase) accessor 2021-08-26 17:24:51 +02:00
Markus Blatt
0056e0a2a1 Fix FindMETIS for DUNE 2.8.
With version 2.8 DUNE will specify imported target METIS::METIS for
the linker and introduces a METIS_API_VERSION to distinguish different
versions. This patch introduces these to the find module used by OPM.
2021-08-26 15:08:27 +02:00
Jostein Alvestad
1715bfc4e4 removed comments from UDQ_ACTIONX_TEST1.DATA 2021-08-26 12:22:15 +02:00
Jostein Alvestad
86a85b5b24 added unit tests and modified input data accordingly 2021-08-26 12:17:40 +02:00
Jostein Alvestad
f3fbd44b4b changes to allow for opm/units 2021-08-26 12:17:38 +02:00
Jostein Alvestad
30109c1722 correction of units for SACT[3] 2021-08-26 12:17:36 +02:00
Jostein Alvestad
4705cf7eb9 corrections to IACT[2], SACT[3] 2021-08-26 12:17:35 +02:00
Bård Skaflestad
961190c723 Merge pull request #2628 from goncalvesmachadoc/outputVolume
Add reservoir volumes to Inplace
2021-08-26 10:21:02 +02:00
Bård Skaflestad
87041776ce Merge pull request #2626 from joakim-hove/normal-summmary-keys
Normal summmary keys
2021-08-25 22:16:17 +02:00
Bård Skaflestad
c2444681d7 Merge pull request #2627 from joakim-hove/udq-units
Make sure to assign UDQ units for udq loaded from restart file
2021-08-25 21:35:25 +02:00
Cintia Goncalves Machado
6e386d6245 add reservoir volumes to Inplace 2021-08-25 18:25:10 +02:00
Joakim Hove
9257610869 Make sure to assign UDQ units for udq loaded from restart file 2021-08-25 16:16:54 +02:00
Joakim Hove
3867cde543 Merge pull request #2616 from akva2/default_asserts
changed: default to asserts enabled in release mode
2021-08-25 09:42:10 +02:00
Joakim Hove
a07ab41a73 Refactor summary configuration of time vectors to reuse from ACTIONX 2021-08-25 07:29:30 +02:00
Joakim Hove
69e1101b35 Remove automatic DAY, YEAR and MONTH from SummaryState 2021-08-25 06:57:17 +02:00
Joakim Hove
cda7bd3740 Use normal summary keys for time related properties 2021-08-25 06:52:47 +02:00
Joakim Hove
31fa88b53e Merge pull request #2621 from tskille/extesmry
Adding python bindings for class ExtESmry
2021-08-24 23:24:32 +02:00
Joakim Hove
797c1cbde8 Merge pull request #2624 from akva2/janitoring
Some janitoring
2021-08-24 11:02:42 +02:00
Arne Morten Kvarving
41867b55fe reduce scope of variables
also use .empty() instead of comparing strings to ""
2021-08-24 09:33:22 +02:00
Arne Morten Kvarving
2d20087f17 only declare variable when required 2021-08-24 09:33:22 +02:00
Arne Morten Kvarving
add60560ee pass by const reference 2021-08-24 09:33:22 +02:00
Joakim Hove
7b2b58caa8 Merge pull request #2623 from joakim-hove/actionx-pretty-print
Fix prefix with output from schedule parse in ACTIONX mode
2021-08-24 07:39:45 +02:00
Joakim Hove
f4eda06021 Fix prefix with output from schedule parse in ACTIONX mode 2021-08-23 23:01:08 +02:00
Torbjørn Skille
514e3a4a35 Adding python bindings for c++ class ExtESmry
- Used for loading data from summary file ESMRY
 - python class ESmry supporting both SMSPEC/UNSMRY and ESMRY summary files.
2021-08-23 22:15:58 +02:00
Bård Skaflestad
981e977da4 Merge pull request #2495 from bska/walq
Implement WALQ Summary Vector
2021-08-20 21:41:31 +02:00
Bård Skaflestad
b638ba0f0e Output WGLIR=0 Unless ALQ=GRAT
This reduces the risk of users misinterpreting the curves since the
unit of measure when plotting the vector will unconditionally be
surface volume rate for gas.

We will revisit this decision if we gain the ability to capture the
actual lift gas injection rate independent of ALQ type.

Suggested by: [at]tskille
2021-08-20 20:35:12 +02:00
Bård Skaflestad
2ad81c9364 Implement WALQ Summary Vector 2021-08-20 20:35:12 +02:00
Bård Skaflestad
0b5694c05b Check ALQ Type When Accumulating Gas Lift Injection Rate
This commit adds a guard to the xGLIR accumulation procedure.  In
particular, we do not accumulate anything unless the ALQ type is gas
rate.  We do however output a well-level value if the ALQ type is
gas/liquid ratio.  This guard requires passing the Schedule object
as part of the 'fn_args', so update the call sites accordingly.
2021-08-20 20:35:12 +02:00
Bård Skaflestad
fcac9edef6 Don't Copy VFP Table To Extract ALQ Type
We can just extract the ALQ type directly from a reference to a VFP
table instead.
2021-08-20 20:35:12 +02:00
Bård Skaflestad
6b9f0817a8 Prune Duplicate Summary Keyword
Keyword 'WGLIR' was already present earlier in the list.
2021-08-20 20:35:12 +02:00
Joakim Hove
c21bde269a Merge pull request #2619 from joakim-hove/uda-rst-trivial
Uda rst trivial
2021-08-20 15:43:45 +02:00
Joakim Hove
815606651e Slightly simplify logic test 2021-08-20 14:29:45 +02:00
Joakim Hove
aff9cb74d1 Add UDQConfig::operator[](std::size_t insert_index) 2021-08-20 14:29:45 +02:00
Joakim Hove
3ab7179305 Add UDQInput::operator== 2021-08-20 14:29:45 +02:00
Joakim Hove
d2b1c99663 Use std::variant instead of pointers 2021-08-20 14:29:45 +02:00
Joakim Hove
9a883f1907 Remove unused variable - check vector size directly 2021-08-20 14:29:44 +02:00
Joakim Hove
cdb92013dd Add function to convert from integer code to UDAControl type 2021-08-20 14:29:16 +02:00
Joakim Hove
5e60927477 Rename uad -> uda 2021-08-20 14:29:16 +02:00
Joakim Hove
c087c725b6 Remove unused members wg_keys and udq_keys from UDQActive 2021-08-20 14:29:16 +02:00
Joakim Hove
c4896a0f49 Add missing this-> 2021-08-20 14:29:16 +02:00
Joakim Hove
e1ff4b4682 Rename UDQActive::Record -> UDQActive::OutputRecord 2021-08-20 14:29:16 +02:00
Joakim Hove
1ce143e479 Rename UDQActive::get_iuad() -> iuad() 2021-08-20 14:29:16 +02:00
Joakim Hove
a0ad7883c7 Remove unused size query functions 2021-08-20 14:29:14 +02:00
Joakim Hove
f5f3957177 Merge pull request #2617 from tskille/egrid_mapaxes
Adding support for handling MAPAXES and MAPUNITS
2021-08-20 13:12:15 +02:00
Bård Skaflestad
fe27c58b0b Merge pull request #2526 from bska/restart-load-analytic-aquifer
Load Analytic Aquifer Objects From Restart File
2021-08-19 22:29:36 +02:00
Bård Skaflestad
6db9e150e1 Merge pull request #2618 from joakim-hove/store-action-results
Store action results
2021-08-19 20:48:49 +02:00
Bård Skaflestad
0d35d64aea Load Analytic Aquifer Objects from Restart File
This commit adds support for creating the analytic aquifer objects

    Opm::AquiferCT
    Opm::Aquifetp
    Opm::Aquancon
    Opm::AquiferConfig

from information stored in the restart vectors

    {I,S,X}AAQ
    {I,S}CAQ

We add a new helper class

    Opm::RestartIO::RstAquifer

which contain the same data members as the '*_data' structures of
the analytic aquifer objects.  Those analytic aquifer objects then
get friendship from the '*_data' structures in order to assign the
private members from the corresponding restart information.  We
finally add a gateway to EclipseState that consumes an RstAquifer
instance and overwrites the internal AquiferConfig object when the
restarted run contains analytic aquifers.

Update RstState constructor API to meet requirements of RstAquifer,
notably by adding an EclipseGrid parameter.  That in turn is needed
by the RstAquifer to translate connection (I,J,K) tuples to active
cell IDs.

Note that if an analytic aquifer does not have any connections then
this facility will not load said aquifer.  That may be a problem
when plotting summary curves, but we will address the issue later if
it comes up.
2021-08-19 20:34:19 +02:00
Bård Skaflestad
d1b1cebdf5 Support Retrieving Non-Zero Restart Vector Occurrence
Needed to load connection information for analytic aquifers (xCAQ).
2021-08-19 20:34:19 +02:00
Bård Skaflestad
e4a485844f Load Numeric Aquifer Data From Restart File
Needed to get continuous 'ANQT' curves in restarted runs.
2021-08-19 20:34:19 +02:00
Joakim Hove
9862d88b12 Remove unused UDQActive::operator[] 2021-08-19 17:01:31 +02:00
Joakim Hove
ec66eeee17 Remove trailing whitespace 2021-08-19 16:21:27 +02:00
Joakim Hove
3c434b2d49 Use const ref 2021-08-19 16:21:27 +02:00
Joakim Hove
41ea258752 Use fmt to create error messages 2021-08-19 16:21:27 +02:00
Joakim Hove
86311f3735 Use stored Action result when updating ZWEL 2021-08-19 15:53:31 +02:00
Torbjørn Skille
445a329785 adding support for handling MAPAXES and MAPUNITS 2021-08-19 15:35:26 +02:00
Joakim Hove
957f540d17 The Action::State will store the last Action::Result instance 2021-08-19 15:29:15 +02:00
Joakim Hove
c6540d6f5b Add operator== to Action::Result 2021-08-19 15:28:47 +02:00
Joakim Hove
a63341db79 Implement optional semantics with std::optional 2021-08-19 14:28:17 +02:00
Joakim Hove
1940ab20a8 Add typedef for convenience 2021-08-19 14:15:14 +02:00
Arne Morten Kvarving
7f84696bc9 changed: default to asserts enabled in release mode 2021-08-19 13:03:25 +02:00
Arne Morten Kvarving
e291234e04 Merge pull request #2594 from akva2/fix_ndebug
fixed: make WITH_NDEBUG cmake option work again
2021-08-19 13:02:10 +02:00
Joakim Hove
ae8671455c Merge pull request #2613 from akva2/refactor_test_update_params
changed: pass more information as parameters
2021-08-19 10:08:38 +02:00
Joakim Hove
66de0ed235 Merge pull request #2608 from joakim-hove/skiprest-nug
Skiprest bug
2021-08-18 18:26:37 +02:00
Bård Skaflestad
51ee6ffd16 Merge pull request #2611 from akva2/fix_proximate
fix build with gcc7
2021-08-18 17:53:20 +02:00
Joakim Hove
658e14667d Merge pull request #2614 from joakim-hove/use-summary-get-well-var
Use SummaryState::get_well_var() with default
2021-08-18 17:08:52 +02:00
Joakim Hove
69c9faefcc Use SummaryState::get_well_var() with default 2021-08-18 16:17:55 +02:00
Arne Morten Kvarving
2f3733b615 fix build with gcc7
the filesystem ts did not include proximate. implement
a poor man's version (copied from libstdc++, slightly modified)
and use this when necessary
2021-08-18 15:33:02 +02:00
Arne Morten Kvarving
91816c2b53 changed: pass more information as parameters
the use of environment variables makes it less flexible
2021-08-18 13:48:53 +02:00
Joakim Hove
d37389720f Fix bug for time-stepping when loading restart deck 2021-08-18 13:40:21 +02:00
Joakim Hove
719b05e93b Improve error message when scanning past restart date 2021-08-18 13:40:21 +02:00
Joakim Hove
34f9d88c32 Renamed test deck 2021-08-18 13:40:21 +02:00
Joakim Hove
a646794882 Merge pull request #2612 from bska/restore-group-quant
Load Active Constraints and Guide Rates at Group Level
2021-08-18 13:11:02 +02:00
Joakim Hove
a53a1d871e Load Active Constraints and Guide Rates at Group Level
Needed to initialise restarted runs.
2021-08-18 09:37:42 +02:00
Bård Skaflestad
a1619543f3 Refactor Group Cumulative Loading
Reduces duplication.
2021-08-18 09:33:38 +02:00
Joakim Hove
8acda9b023 Merge pull request #2610 from joakim-hove/skiprest-bug-trivial
Skiprest bug trivial
2021-08-17 11:30:13 +02:00
Joakim Hove
8c43916751 Updates to Schedule logger utility class 2021-08-17 10:35:21 +02:00
Joakim Hove
b8565ee46c Add info message when adding group and well from restart file 2021-08-17 09:22:36 +02:00
Joakim Hove
f25c71b8f3 Merge pull request #2597 from bska/rptonly
Add Support for RPTONLY and RPTONLYO
2021-08-17 09:21:02 +02:00
Bård Skaflestad
d216de77ea Add Support for RPTONLY and RPTONLYO
This former restricts summary output events to coincide with the
report step while the latter (*O) turns off this restriction and
makes summary output for every timestep.
2021-08-16 20:50:08 +02:00
Bård Skaflestad
114eec30c5 Merge pull request #2609 from tskille/fix_ExtESmry
fixing bug in ExtESmry
2021-08-16 20:46:42 +02:00
Torbjørn Skille
3f1a89069d fixing bug in ExtESmry
- segfault when loading more that one vector
 - test ExtESmry updated, now failing without this fix
2021-08-16 19:47:59 +02:00
Joakim Hove
2cf17408e9 Merge pull request #2605 from bska/report-siunits-guiderates
Add Guiderate Value Accessor for SI Units
2021-08-16 16:51:30 +02:00
Bård Skaflestad
2a374fc53b Add Guiderate Value Accessor for SI Units
This is mostly for reporting purposes if the calling code knows that
the values stored in the GuideRate container are in output units.
The output layer, and particularly the Summary facility, expects
that its input values are strictly SI.
2021-08-16 12:26:09 +02:00
Bård Skaflestad
612cbf749c Merge pull request #2607 from akva2/janitoring
Some more SCA warning cleanup
2021-08-16 12:24:56 +02:00
Joakim Hove
52acaa3757 Merge pull request #2603 from bska/protect-import-container-from-multiple-inclusion
Add Include Guards to Protect From Multiple Inclusion
2021-08-16 11:34:27 +02:00
Arne Morten Kvarving
f7a143c604 pass by const ref 2021-08-16 11:06:00 +02:00
Bård Skaflestad
210e09f981 Add Include Guards to Protect From Multiple Inclusion
While here, also use a more efficient way of forming a
vector<double> from a vector<float> source.
2021-08-16 11:03:38 +02:00
Arne Morten Kvarving
e25667dc71 mark constructor explicit 2021-08-16 10:57:22 +02:00
Arne Morten Kvarving
7560d7fd7c make EclipseState constructor explicit
and adjust test code
2021-08-16 10:57:22 +02:00
Arne Morten Kvarving
155c8fbcdb make Aquifer constructors explicit
and adjust test code
2021-08-16 10:57:22 +02:00
Arne Morten Kvarving
1463266ba6 initialize member 2021-08-16 10:57:22 +02:00
Bård Skaflestad
92b1c6cb45 Merge pull request #2606 from tskille/cleanup_esmry
cleanup after renaming from LODSMRY -> ESMRY
2021-08-16 10:40:26 +02:00
Torbjørn Skille
c6ff9bba00 cleanup after renaming from LODSMRY -> ESMRY 2021-08-16 09:10:00 +02:00
Bård Skaflestad
f89d3fe75a Merge pull request #2590 from tskille/write_lodsmry
Support for writing ESMRY file
2021-08-12 21:29:45 +02:00
Bård Skaflestad
6801ac1a3d Merge pull request #2604 from akva2/janitoring
Quell some static analysis warnings
2021-08-12 20:36:21 +02:00
Torbjørn Skille
46693aec47 Adding support for writing esmry
- command line option --enable-esmry, default = false
 - complete re-write of esmry file for every time step

Updating of class ESmry
 - remove automatic loading from ESMRY
2021-08-12 19:17:07 +02:00
Arne Morten Kvarving
f44e56d101 use std::copy 2021-08-12 15:42:34 +02:00
Arne Morten Kvarving
ad9de78253 mark some constructors explicit 2021-08-12 15:36:25 +02:00
Arne Morten Kvarving
a3ca314832 use initializer list 2021-08-12 15:34:55 +02:00
Bård Skaflestad
d9dc2f3dd8 Merge pull request #2602 from tskille/egrid_update
Adding member function getXYZ_layer to EGrid
2021-08-12 12:19:02 +02:00
Torbjørn Skille
9a5937ae29 Adding member function getXYZ_layer to EGrid
- getting xyz values from EGrid file
 - partially loading ZCORN array, loading only z-values associated with selected layer
 - will be used by resinsight, user interface discussed with Ceetron
2021-08-12 08:47:31 +02:00
Bård Skaflestad
8bcd1b8f83 Merge pull request #2600 from asnyv/import_paths
Support PATHS in IMPORT keyword
2021-08-11 21:33:40 +02:00
Bård Skaflestad
4aafd43871 Merge pull request #2601 from akva2/janitoring
Some janitoring
2021-08-11 21:02:17 +02:00
Asgeir Nyvoll
1a2f6cae46 Support PATHS in IMPORT keyword 2021-08-11 15:02:32 +02:00
Arne Morten Kvarving
a76cf5cdb3 replace NULL with nullptr 2021-08-11 14:46:49 +02:00
Arne Morten Kvarving
8b539a46fc trim some whitespace and fix a typo 2021-08-11 14:46:48 +02:00
Bård Skaflestad
f373afd526 Merge pull request #2596 from bska/refactor-sumthin
Refactor SUMTHIN Implementation
2021-08-09 18:18:10 +02:00
Bård Skaflestad
509878eb49 Refactor SUMTHIN Implementation
Report steps do not influence the SUMTHIN intervals and the special
value

    SUMTHIN
    0.0 /

turns off the "thinning" process.  This refactoring introduces a new
helper variable, sumthin_active_, which caches whether SUMTHIN is
active (i.e., exists and has strictly positive value).

While here, also ensure that the ministep IDs have non-unit steps
when SUMTHIN ends up skipping an output event.
2021-08-09 17:59:13 +02:00
Joakim Hove
e6d7081950 Merge pull request #2582 from joakim-hove/igrp-simplification2
Igrp simplification2
2021-08-05 08:55:08 +02:00
Joakim Hove
edb4100457 Merge pull request #2580 from joakim-hove/zudl-roundtrip
Normalise input data in UDQ definitions
2021-08-05 08:54:39 +02:00
Joakim Hove
3502bbdc7f Merge pull request #2595 from goncalvesmachadoc/enablePrecSalt
add enable PRECSALT
2021-08-05 00:15:56 +02:00
Cintia Goncalves Machado
c5a5bb2f1d add enable PRECSALT 2021-08-04 16:24:58 +02:00
Bård Skaflestad
ee4987bf20 Merge pull request #2592 from akva2/janitoring
changed: use std::vector<char> instead of raw char arrays
2021-08-04 15:53:52 +02:00
Bård Skaflestad
fc378d510e Merge pull request #2591 from goncalvesmachadoc/VAPWAT
Add enable WATVAP
2021-08-04 15:50:13 +02:00
Arne Morten Kvarving
1d4a3cc655 fixed: make WITH_NDEBUG cmake option work again
cmake now adds -DNDEBUG to default CXX flags
invert logic and use -UNDEBUG to remove instead
2021-08-04 15:21:37 +02:00
Cintia Goncalves Machado
0427f45163 fix; 2021-08-04 13:35:21 +02:00
Arne Morten Kvarving
328882e820 changed: use std::vector<char> instead of raw char arrays
also fixes a harmless error where delete was used instead of delete[]
2021-08-04 13:03:31 +02:00
Joakim Hove
cbe2ba52fc Use common function injectionGroup for both gas and water 2021-08-04 12:24:02 +02:00
Cintia Goncalves Machado
830cb81620 addEnableWATVAP 2021-08-04 12:23:17 +02:00
Joakim Hove
af3679980d More shuffling about 2021-08-04 12:05:56 +02:00
Joakim Hove
a6ba80068b Split out if (cgroup) { ... } 2021-08-04 12:05:56 +02:00
Joakim Hove
579463c2a0 Introduce local bool variable 2021-08-04 12:05:56 +02:00
Joakim Hove
01b93b15ec Remove extra assignment 2021-08-04 12:05:56 +02:00
Joakim Hove
5369e4021b Minor white space shuffle about 2021-08-04 12:05:56 +02:00
Joakim Hove
2c6f37bd88 Merge pull request #2587 from joakim-hove/guiderat-delay-throw
Delay error condition to GuideRateModel::eval() time
2021-08-04 11:52:52 +02:00
Joakim Hove
89d41ec087 Merge pull request #2585 from joakim-hove/validate-compord
Support 'DEPTH' ordering in COMPORD
2021-08-04 11:52:32 +02:00
Joakim Hove
3db1cfd8e5 Merge pull request #2584 from joakim-hove/irrevers-thpres
Support EQLOPTS option IRREVER in THPRES keyword
2021-08-04 10:07:04 +02:00
Joakim Hove
2fa5c48679 Support EQLOPTS option IRREVER in THPRES keyword 2021-08-04 07:55:36 +02:00
Joakim Hove
4a415e7ebf Support DEPTH ordering in COMPDAT 2021-08-04 07:54:54 +02:00
Joakim Hove
c0601e183b Do not trap invalid COMPORD input 2021-08-04 07:54:54 +02:00
Joakim Hove
1726ad8090 Delay error condition to GuideRateModel::eval() time 2021-08-04 07:54:12 +02:00
Joakim Hove
d36e5a86a2 Merge pull request #2586 from joakim-hove/foam-validation
Enforce keyword requirement with "requires": []
2021-08-04 07:53:15 +02:00
Joakim Hove
e61f47600d Merge pull request #2588 from joakim-hove/handle-gridunit
GRIDUNIT
2021-08-04 07:53:00 +02:00
Joakim Hove
324f55684b Merge pull request #2581 from joakim-hove/rst-cumulatives
Unconditionally store both production and injection cumulatives
2021-08-03 21:49:32 +02:00
Joakim Hove
36fbd90151 Merge pull request #2576 from joakim-hove/multiple-welsegs
Multiple welsegs
2021-08-03 21:49:18 +02:00
Joakim Hove
729631cd2a Merge pull request #2575 from joakim-hove/skiprest
Skiprest
2021-08-03 21:48:51 +02:00
Joakim Hove
af03d417bb Unconditionally store both production and injection cumulatives 2021-08-03 18:29:34 +02:00
Joakim Hove
691936d0fc Allow scanning past restart date if SKIPREST is active 2021-08-03 18:28:42 +02:00
Joakim Hove
a897cfaa14 Add small struct ScheduleRestartInfo 2021-08-03 18:28:42 +02:00
Joakim Hove
f9aa081235 Remove [[maybe unused]] 2021-08-03 18:28:42 +02:00
Joakim Hove
597c7017e1 Allow for multiple WELSEGS keywords for the same well 2021-08-03 18:26:07 +02:00
Joakim Hove
106cc727c8 Allow scanning past restart date if SKIPREST is active 2021-08-03 18:26:07 +02:00
Joakim Hove
56bb0cacf3 Add small struct ScheduleRestartInfo 2021-08-03 18:26:07 +02:00
Joakim Hove
7c62eade08 Remove [[maybe unused]] 2021-08-03 18:26:07 +02:00
Joakim Hove
e4f5898457 Merge pull request #2579 from joakim-hove/rock-size
Set keyword size of ROCK to UNKNOWN
2021-08-03 18:25:33 +02:00
Joakim Hove
acbabab232 Merge pull request #2578 from joakim-hove/vfpprod-lookup
Check that VFP table exists before deref ...
2021-08-03 18:25:19 +02:00
Joakim Hove
342b5dfb8d Merge pull request #2589 from joakim-hove/sumthin
Sumthin
2021-08-03 18:24:23 +02:00
Joakim Hove
c13edd0826 Handle GRIDUNIT in deck input 2021-08-03 18:22:32 +02:00
Joakim Hove
e9ca60944d Fix typo 2021-08-03 18:15:26 +02:00
Joakim Hove
7c986e6891 Simplify setting of FOAM options 2021-08-03 18:10:57 +02:00
Joakim Hove
04a4cf46d9 Enforce keyword requirement with "requires": [] 2021-08-03 18:10:04 +02:00
Joakim Hove
7d1bb870aa Check that SUMTHIN requirement is respected in summary writer 2021-08-03 14:04:18 +02:00
Joakim Hove
055efd00fc Add SUMTHIN member to ScheduleState 2021-08-03 14:04:18 +02:00
Joakim Hove
f9c792fe35 Set keyword size of ROCK to UNKNOWN 2021-08-03 14:03:02 +02:00
Joakim Hove
cff145095f Merge pull request #2573 from joakim-hove/refactor-keyword-size
Expand KeywordSize class
2021-08-03 14:02:18 +02:00
Joakim Hove
7939adf3e3 Normalise input data in UDQ definitions
The UDQDefine::input_string() function will return normalized input which is
equivalent to the deck input string, but not necessarily identical. Normalizing
which might give rise to differences:

- All selectors/qualifiers in expressions like "WWCT '*'" are quoted.

- Whether to pad operators with space like "170 + FU_PAR10" or "170+FU_PAR10" is
  hardcoded and independent of the space used in the input.

- Floating point numbers is output with format "%g" - no trailing zeros.
2021-07-25 16:36:18 +02:00
Joakim Hove
3853356b22 Check that VFP table exists before deref 2021-07-25 13:08:13 +02:00
Joakim Hove
2482251c3d Specify min_size for SAVE keyword 2021-07-23 10:42:47 +02:00
Joakim Hove
946fcca4fd Add min_size setting ParserKeywords 2021-07-23 10:42:47 +02:00
Joakim Hove
48a0d91e49 Extract all data related to keyword size in class KeywordSize 2021-07-23 10:42:47 +02:00
Joakim Hove
f17b75ab53 Merge pull request #2570 from bska/dont-manage-resources
Don't Manage Resources Manually
2021-07-23 10:42:20 +02:00
Joakim Hove
647cdf2190 Merge pull request #2577 from joakim-hove/keyword-size
Keyword size
2021-07-23 10:42:07 +02:00
Joakim Hove
bfc94a0bdb Use keyword/item scheme with shift for TRACERKM keyword 2021-07-23 09:07:10 +02:00
Joakim Hove
f4c23b6b84 Use normal keyword/item syntax for size of ROCKPAMA keyword 2021-07-23 09:07:10 +02:00
Joakim Hove
763670635c Use normal keyword/item scheme to specify size of ROCK 2021-07-23 09:07:10 +02:00
Joakim Hove
fb7f74f397 Merge pull request #2574 from joakim-hove/log-error
Log error messages from EclipseState and Schedule construction
2021-07-23 08:02:05 +02:00
Joakim Hove
d4b2902c6d Log error messages from EclipseState and Schedule construction 2021-07-22 08:38:30 +02:00
Bård Skaflestad
80a88bea56 Use 'vector' in Place of Manual Memory Management 2021-07-20 12:25:39 +02:00
Bård Skaflestad
21fcfcc135 ESmry: Slight Refactoring
Mostly to reduce variable scope and make objects 'const'.  While
here, also replace a number of 'std::to_string' calls with 'format'.
2021-07-20 12:25:39 +02:00
Markus Blatt
1561a8a82e Merge pull request #2569 from bska/fix-tag-mismatch
Fix Mismatched Tags
2021-07-19 14:20:00 +02:00
Bård Skaflestad
d596fd5f64 Use Variable in Most Narrow Scope Only
This eliminiates a dead store.
2021-07-16 11:29:56 +02:00
Bård Skaflestad
5bebfed4cf Fix Mismatched Tags
'RstState' is a 'struct' and should be forward declared as such.
While here, also fix a shadowing variable warning.
2021-07-16 11:29:56 +02:00
Bård Skaflestad
c72a90ef6e Merge pull request #2572 from plgbrts/gaswater5
fix for two phase gas-water system
2021-07-15 11:55:31 +02:00
Paul Egberts
64051c254f shorten threeP and twoP formulation 2021-07-14 14:10:13 +02:00
Paul Egberts
bddbc252db allow for two phase gas-water system 2021-07-14 11:50:43 +02:00
Bård Skaflestad
dd2f215132 Merge pull request #2571 from OPM/esmry_ms
new member function in ESmry
2021-07-13 17:22:30 +02:00
Torbjørn Skille
7b89e9dbf8 new member function in ESmry
- checking if all timesteps are avaliable
- This will not be the case if RPTONLY has been used with eclipse
2021-07-13 16:14:21 +02:00
Joakim Hove
3d154ee668 Merge pull request #2568 from OPMUSER/Jason_Updates
Update TRACERS JSON
2021-07-10 10:50:08 +02:00
OPMUSER
a0050ed896 Update TRACERS JSON
Added item for checking, no other changes.
2021-07-10 09:11:47 +08:00
Joakim Hove
8b2b70bdf3 Merge pull request #2567 from OPMUSER/Jason_Updates
JSON Revised Definitions
2021-07-09 12:03:29 +02:00
OPMUSER
0e693e68e3 BOOST_AUTO_TEST_CASE( WCHONHIST )
Change number of entries from 11 to 12.
2021-07-09 16:00:54 +08:00
OPMUSER
147acc1445 JSON Revised Definitions
Mostly item and comments, except for:
NODEPROP
WCONHIST
2021-07-08 15:25:47 +08:00
Bård Skaflestad
0f2b338805 Merge pull request #2551 from bska/basic-5-freq-6
Use Previous Output Time to Decide Next Output Time
2021-07-07 22:08:35 +02:00
Bård Skaflestad
ed5a9db25b Use Previous Output Time to Decide Next Output Time
This commit switches the criterion for BASIC=4 and BASIC=5 to using
the difference between the previous and the next output time instead
of "just" the next output time.  The original criteria

    year % freq == 0
    month % freq == 0

don't do what we want.  BASIC=4 and BASIC=5 should output every
'freq' year (=4) or 'freq' month (=5) of simulated time.
2021-07-07 15:06:10 +02:00
Bård Skaflestad
1c49dcc3db Whitespace Adjustments
In preparation of fixing restart output times.
2021-07-07 14:37:21 +02:00
Bård Skaflestad
045d407aed Merge pull request #2559 from bska/write-restart-file-events
Add Utility to Track Restart Output Events
2021-07-07 14:36:11 +02:00
Bård Skaflestad
e8c59932b3 Add Utility to Track Restart Output Events
This commit adds a new helper object

    Opm::WriteRestartFileEvents

that identifies when a restart file output event occurs as well as
the most recent output event prior to a particular report step.  We
implement this facility in terms of a dense bit vector that wastes
up to 63 bits of space.  Most of the logic is devoted to finding the
most recent previous output event, of which the core routine is
counting the number of leading zero bits in a 64 bit value.  We've
elected to implement this in a portable manner using binary search,
although most implementations provide efficient intrinsics for this
operation, e.g., GCC's __builtin_clzl.  In C++20 we can use the new
function std::countl_zero() from <bit>.
2021-07-06 14:26:09 +02:00
Joakim Hove
833d036074 Merge pull request #2549 from OPMUSER/Jason_Updates
Update Various JSON Definitions
2021-07-05 22:54:31 +02:00
Joakim Hove
68d4f3d730 Merge pull request #2555 from goncalvesmachadoc/patch-3
Add BCAD
2021-07-05 19:51:09 +02:00
Joakim Hove
458b1d0396 Merge pull request #2558 from joakim-hove/remove-test
Remove test check for number of items in record
2021-07-05 19:50:21 +02:00
Joakim Hove
6ad1d4020c Remove superfluos test 2021-07-05 16:01:31 +02:00
Joakim Hove
7946532f8c Merge pull request #2557 from joakim-hove/udq-load-rst
Create UDQConfig object when loading from restart file
2021-07-03 23:26:48 +02:00
Joakim Hove
56facd6a49 Create UDQConfig object when loading from restart file 2021-07-03 10:29:36 +02:00
Bård Skaflestad
1e8356cc86 Merge pull request #2553 from osae/tracerUnits
Some support for non-default tracer amount units.
2021-07-02 12:14:00 +02:00
Bård Skaflestad
43829de62d Merge pull request #2550 from bska/separate-boost-test-params
Separate Test Command Line Arguments from Runner Arguments
2021-07-01 22:57:59 +02:00
Bård Skaflestad
85f809c42b Separate Test Command Line Arguments from Runner Arguments
When passing parameters to test runners based on Boost.Test we need
to distinguish the parameters that are intended for the test case
and those that are intended for the Boost.Test framework (e.g.,
"--run_test=").
2021-07-01 16:27:26 +02:00
Bård Skaflestad
f9f54d9cea Merge pull request #2556 from bska/fix-udq-restart-indexing
Don't Use Common Start Offset for UDQ Restart Variables
2021-07-01 16:25:19 +02:00
Bård Skaflestad
cb862b5fa5 Don't Use Common Start Offset for UDQ Restart Variables
The arrays are sized according to the number of variables of each
category (well, group, field), not the number of UDQs.
2021-07-01 14:23:02 +02:00
Bård Skaflestad
b8e9f2d766 Split UDQ Definition Strings Out of Main Loop
Mainly for reduced mental load when reading the body.
2021-07-01 14:21:10 +02:00
Bård Skaflestad
3a2d37b92a Merge pull request #2546 from joakim-hove/udq-rst
Udq rst
2021-07-01 14:19:35 +02:00
Cintia Goncalves Machado
29af0809b7 Add BCAD
BSIP was written twice.
2021-07-01 10:49:31 +02:00
Joakim Hove
6af909778c Load UDQConfig and UDQState from restart data 2021-07-01 07:31:48 +02:00
Joakim Hove
f108463265 Split UDQ tokens also on ' ' 2021-07-01 07:31:03 +02:00
Joakim Hove
1c478078b8 Implement rst udq with std::variant<> for DEFINE and ASSIGN 2021-07-01 07:30:21 +02:00
Joakim Hove
a045550121 Add std::initializer_list constructor for NameOrder 2021-07-01 07:25:54 +02:00
Joakim Hove
1e4a940e70 Add WellMatcher constructor which takes list of wells 2021-07-01 07:25:25 +02:00
Ove Sævareid
e9458705d0 Some formatting of unit names. 2021-06-30 19:04:16 +02:00
Arne Morten Kvarving
0f953dfef8 Merge pull request #2554 from akva2/rh_boost_doc
fix redhat packaging
2021-06-30 15:09:57 +02:00
Arne Morten Kvarving
155ab84649 fix redhat packaging
- use system level boost instead of boost 1.48 now that RHEL6 is dead
- take care of new doc installation
2021-06-30 15:01:09 +02:00
OPMUSER
189db2490a Add NMESSAGE Summary keyword
Add NMESSAGE summary keyword and declarations in config file.
2021-06-30 18:38:13 +08:00
Bård Skaflestad
b39ab05f9f Merge pull request #2537 from GitPaean/new_update_guide_rates_together
[new attempt] update the guide rates for all the wells at the same time.
2021-06-30 12:37:52 +02:00
OPMUSER
f1e7efeb39 JSON Keyword Updates
COMPDAT, GCONINJE and GCONPROD
2021-06-30 18:32:32 +08:00
Ove Sævareid
9013b7dca5 Some support for non-default tracer amount units. 2021-06-30 12:22:52 +02:00
Bård Skaflestad
c492cc5c0b Merge pull request #2545 from joakim-hove/actionx-enable-complump-wpimult
Add COMPLUMP and WPIMULT as AXTIONX enabled keywords
2021-06-30 11:54:10 +02:00
OPMUSER
9133b6125d Update Various JSON Definitions
AQUCON, AQUCT, AQUFETP, EQUIL, MESSAGES, PLYMAX, REGDIMS, and RESTART
2021-06-29 19:17:52 +08:00
Bård Skaflestad
b4eeca78fa Merge pull request #2548 from jalvestad/rstcorr-test
Added test data for IGRP - availablility for higher order control
2021-06-29 09:14:33 +02:00
Kai Bao
23d0185acd update the guide rates for all the wells at the same time. 2021-06-28 23:11:11 +02:00
Jostein Alvestad
98641b3e93 first version of extended IGRP tests 2021-06-28 13:32:50 +02:00
Jostein Alvestad
01b3c8ee64 initial changes to make extended unit tests for AggregateGroupData 2021-06-28 13:32:49 +02:00
Jostein Alvestad
b747a5edbb corrections for errors occurred during rebase - move of code to UDQDims.cpp 2021-06-28 13:32:43 +02:00
Jostein Alvestad
84023e650f correction to test for when to output IGPH 2021-06-28 13:29:42 +02:00
Bård Skaflestad
e7c223bc00 Merge pull request #2544 from OPMUSER/Jason_Updates
JSON updates
2021-06-27 17:06:09 +02:00
OPMUSER
82e0c608d2 FixJSON typos for EDITNNC, FOAMFSC, FOAMOPTS
Fix JSON typos for or EDITNNC, FOAMFSC, FOAMOPTS keywords
2021-06-26 16:16:03 +08:00
Joakim Hove
f7427c9ae8 Merge pull request #2539 from joakim-hove/udq-rst-selector
Alternative selector implementation for UDQAssign loaded from rst
2021-06-26 09:41:54 +02:00
Bård Skaflestad
24c04a0b0d Merge pull request #2543 from joakim-hove/udq-state-refactor
Refactor UDQ state to use plain maps
2021-06-25 22:02:38 +02:00
Bård Skaflestad
f4d5a80fcc Merge pull request #2468 from osae/tracerWell
Support for tracer summary curves, WT(I/P)(R/T/C).
2021-06-25 17:47:56 +02:00
Bård Skaflestad
fc98b2a2dc Merge pull request #2518 from jalvestad/rstfile-corr
Corrections to eclipse-compatible restart file
2021-06-25 17:25:59 +02:00
Joakim Hove
3fa67b21b3 Alternative selector implementation for UDQAssign loaded from rst 2021-06-25 15:25:48 +02:00
Joakim Hove
44e056a84e Merge pull request #2496 from bska/aqunum-initpress-array
Collect Type-Specific Aquifer Data in Single Structure
2021-06-25 15:23:48 +02:00
Joakim Hove
0f9c2c2cf3 Refactor UDQState to use plain maps internally 2021-06-25 15:09:42 +02:00
Joakim Hove
c5bed1a023 Add COMPLUMP and WPIMULT as AXTIONX enabled keywords 2021-06-25 14:33:34 +02:00
OPMUSER
8542fe4128 Fix VISREF Replace semicolon with comma 2021-06-25 18:12:17 +08:00
OPMUSER
5010ebb57e EDITNNC, FOAMFSC, FOAMOPTS and VISCREF
Added item and comments. VISCREF was missing the oil API column.
2021-06-25 18:06:27 +08:00
Bård Skaflestad
4e14cb68e1 Collect Type-Specific Aquifer Data in Single Structure
This commit adds a new helper class,

    Opm::data::TypeSpecificData

which holds type-specific sub-structures for Carter-Tracy,
Fetkovich, and Numerical aquifers.  We implement this facility in
terms of a std::variant<> of simple structures.  In turn, use the
type-specific data for numerical aquifers to fill in the initial
aquifer cell pressures where not available in the input data.
2021-06-25 11:55:56 +02:00
Joakim Hove
d875715cff Merge pull request #2541 from OPMUSER/Jason_Updates
AQUCON, AQUCT, EHYSTR, NETWORK, NNC and UDQDIMS Changes
2021-06-25 11:45:18 +02:00
Joakim Hove
b5d2a224bf Merge pull request #2542 from bska/use-restart-file-view
Reimplement RstState::load In Terms of RestartFileView
2021-06-25 09:54:29 +02:00
Bård Skaflestad
c32aa48b32 Reimplement RstState::load In Terms of RestartFileView
This is in preparation of unconditionally loading analytic aquifer
information from the restart file.  Update callers to new API.
2021-06-25 09:20:55 +02:00
Bård Skaflestad
62893dfcdc RestartFileView: Add Keyword Accessors for 'bool'
Needed to load logical vectors like 'LOGIHEAD'.
2021-06-25 09:14:44 +02:00
OPMUSER
68d3b4ce1f AQUCON, AQUCT, EHYSTR, NETWORK, NNC and UDQDIMS Changes
Added item counter for checking and comment for E300 parameters.
2021-06-25 12:43:50 +08:00
Bård Skaflestad
1c2212487d Merge pull request #2540 from bska/prune-close-brace-semicolon
Prune Needless Trailing ';' On Certain Close Braces
2021-06-25 00:59:36 +02:00
Bård Skaflestad
cbe149a783 Prune Needless Trailing ';' On Certain Close Braces
Removes warning "extra ';'" in GCC's "-Wpedantic" mode.
2021-06-24 23:58:27 +02:00
Jostein Alvestad
0452a0c867 corrections for errors occurred during rebase - move of code to UDQDims.cpp 2021-06-24 23:24:15 +02:00
Jostein Alvestad
72e4891ac5 Correction for inj_phase - index plus function name change 2021-06-24 23:21:39 +02:00
Jostein Alvestad
4633a4c498 correction to test for when to output IGPH 2021-06-24 23:21:19 +02:00
Joakim Hove
ed66a05c54 Merge pull request #2535 from joakim-hove/rstfile-corr-udq
UDQ output updates
2021-06-24 16:58:27 +02:00
Joakim Hove
0d170d7339 Merge pull request #2534 from joakim-hove/udq-rst-preparation
Update UDQ parsing - preparation for restart load
2021-06-24 15:42:54 +02:00
Joakim Hove
31731a3a2a Merge pull request #2538 from akva2/print_opm_tests_rev
print revision of opm-tests
2021-06-24 15:25:09 +02:00
Arne Morten Kvarving
085ec57759 print revision of opm-tests 2021-06-24 14:40:01 +02:00
Joakim Hove
6041a16339 Merge pull request #2536 from OPMUSER/Jason_Updates
WELLDIMS Fix Up
2021-06-24 12:46:08 +02:00
OPMUSER
9c6d1e5395 WELLDIMS Fix Up
Fix missing entry and defaults to eliminate false warning messages.
2021-06-24 17:23:49 +08:00
Joakim Hove
81f6e7dcd7 Merge pull request #2530 from OPMUSER/Jason_Updates
Jason updates #2
2021-06-24 11:10:39 +02:00
OPMUSER
41b7d05285 Correct TABDIMS and ROCKCOMP 2021-06-24 15:51:52 +08:00
Joakim Hove
e73b613582 UDQ output updates 2021-06-24 09:18:34 +02:00
Joakim Hove
3f47cd536d Improve UDQToken pretty output 2021-06-24 01:29:39 +02:00
Joakim Hove
e1c780ee62 Update UDQ parsing - preparation for restart load 2021-06-24 01:08:54 +02:00
Joakim Hove
3b41815974 Merge pull request #2533 from blattms/janitor
Remove warnings about unsigned-signed comparison and init order.
2021-06-23 16:30:37 +02:00
Markus Blatt
48d73bbc6e Remove warnings about unsigned-signed comparison and init order. 2021-06-23 14:42:44 +02:00
Joakim Hove
0d060fad24 Merge pull request #2527 from tskille/parser
Functionality for parsing only selected sections of a data deck
2021-06-23 14:04:42 +02:00
Joakim Hove
3b7f43f7c4 Merge pull request #2529 from joakim-hove/nnc-json
Update JSON scheme for NNC
2021-06-23 13:38:54 +02:00
Bård Skaflestad
91a852dc53 Merge pull request #2519 from joakim-hove/udq-rst
Udq rst
2021-06-23 12:03:25 +02:00
Joakim Hove
ccf23ab301 Update JSON scheme for NNC 2021-06-23 11:53:28 +02:00
Joakim Hove
1e5a1311c4 Load UDQ data from restart files 2021-06-23 08:12:25 +02:00
Joakim Hove
ba21904558 Merge pull request #2524 from joakim-hove/jostein-commits
Jostein commits
2021-06-23 08:11:31 +02:00
Bård Skaflestad
cc55180797 Merge pull request #2525 from joakim-hove/keyword-sections
Keyword sections
2021-06-23 00:34:42 +02:00
Bård Skaflestad
f3de7bde0f Merge pull request #2472 from bska/centralise-aquprop-calculations
Centralise Aquifer PVT Property Calculations and Use Simulator's Values for Restart Output
2021-06-22 20:38:07 +02:00
Ove Sævareid
e7104a4b16 Guard against undefined values. 2021-06-22 20:17:14 +02:00
Ove Sævareid
30d446d41b Tests for tracer summary. 2021-06-22 20:17:14 +02:00
Ove Sævareid
5a22e9c782 Tracer read/write/get. 2021-06-22 20:17:14 +02:00
Ove Sævareid
7f062f213f Comments and cleanup 2021-06-22 20:17:14 +02:00
Ove Sævareid
785d360fed Untangling tracer summary. 2021-06-22 20:17:14 +02:00
Ove Sævareid
94c6c4942c Support for tracer summary curves, WT(I/P)(R/T/C). 2021-06-22 20:17:14 +02:00
Torbjørn Skille
eded5fdb0c add functionality to the parser for parsing selected sections of a data deck
- made available in python bindings
 - added unit tests both for c++ and python
2021-06-22 18:45:24 +02:00
Joakim Hove
84e5307117 Return set of valid sections from ParserKeyword 2021-06-22 17:16:48 +02:00
Joakim Hove
050e82cebd Return deck names from ParserKeyword as std::unordered_set 2021-06-22 17:16:00 +02:00
Joakim Hove
36c07ae545 Remove unused iterator for section names 2021-06-22 17:08:43 +02:00
Bård Skaflestad
b783a1de32 Use More Dynamic Aquifer Data From Simulator
This commit switches to using the simulator's notion of initial
aquifer pressure, aquifer mass density of water, aquifer water
viscosity, and aquifer time constants.  These values will,
ultimately, come from the *_data structures for the analytic
aquifers but the simulator is the only system that is able to
compute equilibrated initial pressure values if that is defaulted in
the input.
2021-06-22 16:36:45 +02:00
Bård Skaflestad
4381eca9ac Rename Analytic Aquifer Structure Data Members
This commit renames various data members of the *_data structures to
aid the reader who may not be intimately familiar with the details
of the analytic models.  We switch the 'initial_pressure' into an
optional<double> instead of a pair<bool,double> with 'std::nullopt'
representing defaulted initial aquifer pressure values in the input
file.

We also add logic and private data members to compute/store aquifer
time constants, mass density of water, water viscosity and, in the
case of Carter-Tracy aquifers, also the influx constant 'beta'.
This centralises the requisite logic which reduces the risk of
subtle errors.

In the case of defaulted initial pressures, we support deferred
calculation of aquifer properties until the equilibrium pressure is
known.  Users are then expected to assign a value to the initial
pressure members and call 'finishInitialisation()' to derive those
properties.

While here, also switch to using raw string literals instead of
concatenated and escaped literals for the embedded deck strings in
the ParserTests.
2021-06-22 16:36:45 +02:00
Joakim Hove
79da27ae91 Remove leading space from ActionX condition 2021-06-22 16:20:24 +02:00
Jostein Alvestad
a1a8d74738 Update IUQD[0] depending on status 2021-06-22 16:20:24 +02:00
Jostein Alvestad
c44dcb8257 changes to DeckOutput.hpp for opmpack 2021-06-22 16:20:24 +02:00
Joakim Hove
8b625b6590 Merge pull request #2523 from joakim-hove/gr-minor
GuideRate / restart - minor stuff
2021-06-22 16:19:59 +02:00
Joakim Hove
b240f15ff8 Move eclipseControlMode function as static method in Well class 2021-06-22 10:32:46 +02:00
Joakim Hove
d1a0b4ab34 Add method GuideRate::init_grvalue() 2021-06-22 10:32:46 +02:00
Joakim Hove
9e2c79517a Remove method Schedule::guideRateConfig() 2021-06-22 10:32:46 +02:00
Bård Skaflestad
be0838981d Merge pull request #2505 from joakim-hove/restore-guide-rates
Assign guide rate values to data::Wells when loading from restart
2021-06-22 09:16:37 +02:00
Joakim Hove
f7299aaea4 Recover guide rates from restart file 2021-06-22 07:24:00 +02:00
Joakim Hove
b0c134d385 Merge pull request #2522 from bska/report-dynpv
Add 'Inplace' Slot for Dynamic Pore Volume
2021-06-21 17:51:44 +02:00
Bård Skaflestad
695357e5f0 Add 'Inplace' Slot for Dynamic Pore Volume
The 'PoreVolume' value is supposed to be calculated at reference
conditions (i.e., no rock compressibility or temperature effects),
but being able to report the non-reference condition value is
beneficial.  This commit adds a slot for accumulating that value per
FIP region and transporting the aggregated values to the PRT output
system.
2021-06-21 16:25:55 +02:00
Joakim Hove
5f4483769b Merge pull request #2521 from joakim-hove/udq-rst-preparations
Udq rst preparations
2021-06-21 09:21:22 +02:00
Joakim Hove
fff4c58a9a Create small class UDQDims with static methods to enable reuse 2021-06-21 08:15:07 +02:00
Joakim Hove
176669d625 RstState add groups and wells by calls from RstState::load() 2021-06-21 08:15:07 +02:00
Joakim Hove
1f9aaae0b8 Merge pull request #2520 from joakim-hove/opmpack-title-special
Make sure deck output of TITLE has trailing newline
2021-06-19 13:42:46 +02:00
Joakim Hove
df2fbd0ab3 Update AggregateUDQTest to output valid restart file 2021-06-19 13:38:41 +02:00
Joakim Hove
94bf2db8c7 Make sure deck output of TITLE has trailing newline 2021-06-19 11:39:25 +02:00
Joakim Hove
862dd4b180 Use unformatted IO in testcase 2021-06-18 15:02:02 +02:00
Joakim Hove
f45f787651 White space 2021-06-18 14:06:43 +02:00
Joakim Hove
92adc65bbe Merge pull request #2517 from joakim-hove/load-rst-group
Add Schedule::addGroup( const RstGroup& ) overload
2021-06-17 21:22:43 +02:00
Joakim Hove
419bdf23c4 Add Schedule::addGroup( const RstGroup& ) overload 2021-06-17 13:19:20 +02:00
Joakim Hove
33f4ec04c2 Merge pull request #2516 from joakim-hove/update-rst-output
Update restart output from EclRegressionTest
2021-06-17 10:11:30 +02:00
Joakim Hove
e561e3fb43 Update restart output from EclRegressionTest 2021-06-17 08:46:51 +02:00
Joakim Hove
bd3724068c Merge pull request #2512 from blattms/doxygen-no-timestamp
For discussion: Deactive timestamping in doxygen for reproducible builds.
2021-06-17 08:32:00 +02:00
Markus Blatt
d052e6e47d Merge pull request #2510 from blattms/debian-patches-2
Further patches to the build system from Debian unstable packaging.
2021-06-16 12:34:04 +02:00
Joakim Hove
59115f818d Merge pull request #2515 from joakim-hove/group-cmode
Group cmode
2021-06-16 12:24:51 +02:00
Markus Blatt
b1a0964cd1 Merge pull request #2511 from blattms/debian-spelling-and-encoding-fixes
Debian spelling and encoding fixes
2021-06-16 10:32:45 +02:00
Joakim Hove
d7eff6159f Use function Group::InjectionCMode2Int() to convert cmode -> int 2021-06-16 08:50:51 +02:00
Joakim Hove
0ff19fa453 Use function Group::ProductionCMode2Int() for enum -> int mapping 2021-06-16 08:50:51 +02:00
Markus Blatt
c957f31d40 Doygen: remove wrong usage of \example directive.
For whatever reason it produced a file like
_2tmp_2reprotest_81JBnX9_2build-experiment-1_2build-experiment-1_2opm_2output_2OutputWriter_8hpp-example.html
with the full path in it.

BTW: correct usage is "\example <cpp-file>" where the cpp file
includes the example code.
2021-06-15 23:14:23 +02:00
Markus Blatt
f8840e7152 Deactive timestamping in doxygen for reproducible builds. 2021-06-15 21:17:03 +02:00
Markus Blatt
b83919d1f3 Changed encoding of all installed headers to UTF-8
On Debian support for national encodings is being phased out.
Fixes lintian warnings about national-encoding.
2021-06-15 21:11:45 +02:00
Markus Blatt
50ec3bca05 Spelling fixes pointed out by lintian. 2021-06-15 21:11:36 +02:00
Markus Blatt
13bf65a73b Install build system documentation to doc and not next to CMake files. 2021-06-15 21:06:55 +02:00
Markus Blatt
ff9792e31c Work around issues of Boost >=1.70.0 and CMake 3.18.4
With that combination the first search seems to happen in CONFIG mode
but subsequent searches will use MODULE mode. This will result in the
following warning:

CMake Warning at /usr/share/cmake-3.18/Modules/FindBoost.cmake:1187 (message):
  New Boost version may have incorrect or missing dependencies and imported
  targets
Call Stack (most recent call first):
  /usr/share/cmake-3.18/Modules/FindBoost.cmake:1311 (_Boost_COMPONENT_DEPENDENCIES)
  /usr/share/cmake-3.18/Modules/FindBoost.cmake:1919 (_Boost_MISSING_DEPENDENCIES)
  cmake/Modules/OpmFind.cmake:135 (find_package)
  cmake/Modules/OpmFind.cmake:230 (find_and_append_package_to)
  cmake/Modules/OpmLibMain.cmake:83 (find_and_append_package_list_to)
  CMakeLists.txt:222 (include)

Also the variable Boost_LIBRARIES will look quite messed up by
occurrences of optimized and debug:
Boost_LIBRARIES=optimized;/usr/lib/x86_64-linux-gnu/libboost_system.so.1.74.0;debug;/usr/lib/x86_64-linux-gnu/libboost_system.so;optimized;/usr/lib/x86_64-linux-gnu/libboost_unit_test_framework.so.1.74.0;debug;/usr/lib/x86_64-linux-gnu/libboost_unit_test_framework.so

Which will make the modules unusable because of CMake errors during
linking:

CMake Error at /usr/share/dune/cmake/modules/DuneMacros.cmake:991 (target_link_libraries):
  The "debug" argument must be followed by a library.
Call Stack (most recent call first):
  src/CMakeLists.txt:2 (target_link_dune_default_libraries)
-- Configuring incomplete, errors occurred!

Note this fix is only needed for Boost versions 1.70 and higher.
Older versions do not provide cmake package configuration
files (BoostConfig.cmake) and hence there can be no mixup.

Note also that the alternative approach of setting
CMAKE_FIND_PACKAGE_PREFER_CONFIG does not work for OPM as with this
e.g. the Dune module versions would not be set correctly.
2021-06-15 21:04:41 +02:00
Markus Blatt
bf55667553 Allow installation of bash completion scripts to new location.
That location is /usr/share/bash-completion/completions and scripts
will be loaded on demand. Added option USE_BASH_COMPLETIONS_DIR (default OFF)
to request this. It is needed to prevent lintian warnings for Debian
packages.
2021-06-15 20:56:50 +02:00
Joakim Hove
428563e33a Merge pull request #2503 from joakim-hove/wells-output-json
Wells output json
2021-06-15 10:14:51 +02:00
Joakim Hove
702de267bc Add json output for data::Group 2021-06-15 07:38:41 +02:00
Joakim Hove
011845992f Add Json output from output::Wells 2021-06-15 07:38:34 +02:00
Joakim Hove
73d2f7812e Merge pull request #2504 from joakim-hove/rename-wellrates
Rename data::WellRates -> data::Wells
2021-06-14 18:21:33 +02:00
Joakim Hove
69dfff722b Merge pull request #2506 from joakim-hove/guiderate-model-const
Make method GuideRateModel::updateLINCOM() const
2021-06-14 15:30:46 +02:00
Joakim Hove
71ccf698ab Make method GuideRateModel::updateLINCOM() const 2021-06-14 12:52:28 +02:00
Joakim Hove
9fe4be5ebf Rename data::WellRates -> data::Wells 2021-06-12 09:33:05 +02:00
Bård Skaflestad
5e1d923647 Merge pull request #2500 from joakim-hove/del-timemap
Remove stale class TimeMap
2021-06-10 20:30:08 +02:00
Joakim Hove
37f07a1b18 Remove stale class TimeMap 2021-06-10 14:12:12 +02:00
Bård Skaflestad
b7c79c2da7 Merge pull request #2485 from bska/track-gconinje-udqactive
Track UDA Active Status for Group Injection Controls
2021-06-10 12:33:14 +02:00
Arne Morten Kvarving
e88909995f upadte-opm-tests: supply access token in header 2021-06-10 10:25:54 +02:00
Bård Skaflestad
5ab4bdc2db Track UDA Active Status for Group Injection Controls
This commit adds a new member function, updateUDQActive, to the
group injection properties.  This is inspired by the function of the
same name in the group production properties and fills the same
purpose.  This, in turn, enables tracking whether a GCONINJE keyword
activates a user-defined argument.  That status is in turn needed to
generate the 'IUAD' restart vector in the restart file in the face
of models for which the only UDA is in GCONINJE.
2021-06-09 20:41:03 +02:00
Bård Skaflestad
665a82b9cd Identify GCONINJE UDA Items
This commit adds UDA items for the GCONINJE keyword.  This is in
preparation of tracking UDA status in this context.  While here,
also add unit tests for the expected values of UDQ::keyword() and
UDQ::udaCode().
2021-06-09 20:41:03 +02:00
Bård Skaflestad
cefc083135 Associate Group Injection Properties to Named Group
This commit adds a new data member, group_name, to the injection
properties per group.  This is in preparation of tracking the UDQ
active status for group injection controls (keyword GCONINJE).
Group production properties already have a similar data member for
the same purpose.
2021-06-09 20:41:03 +02:00
Bård Skaflestad
1f26249ce9 Merge pull request #2498 from bska/public-rst-file-view
Promote RestartFileView to Public Access
2021-06-09 20:38:44 +02:00
Bård Skaflestad
82ccd15580 Promote RestartFileView to Public Access
In preparation of loading analytic aquifers from the restart file.
2021-06-09 00:35:13 +02:00
Bård Skaflestad
423b4a39e6 Merge pull request #2497 from joakim-hove/connections-num-open
Add method ConnectionSet::num_open()
2021-06-08 17:59:46 +02:00
Joakim Hove
9dd4c43209 Add method ConnectionSet::num_open() 2021-06-08 14:41:52 +02:00
Joakim Hove
59efd8e98e Merge pull request #2493 from akva2/add_missing_forward
add missing forward declaration
2021-06-05 22:56:07 +02:00
Joakim Hove
4127c45866 Merge pull request #2494 from blattms/prevent-further-reallocations
Prevent reallocations where possible when parsing items.
2021-06-04 18:25:18 +02:00
Markus Blatt
de37080dae Prevent reallocations where possible when parsing items.
We either reserve or use std::vector::insert instead of just
blindly using push_back.
2021-06-04 16:21:05 +02:00
Arne Morten Kvarving
ebadbdc0ac add missing forward declaration 2021-06-04 13:18:42 +02:00
Bård Skaflestad
4238209e8f Merge pull request #2492 from atgeirr/silence-warnings
Silence warnings.
2021-06-03 17:09:55 +02:00
Atgeirr Flø Rasmussen
51701f230e Silence warnings. 2021-06-03 12:22:45 +02:00
Joakim Hove
e01e8e9225 Merge pull request #2471 from bska/communicate-dynamic-aqudata
Communicate Dynamic Aquifer Data
2021-05-29 07:47:18 +02:00
Joakim Hove
542edd6fa9 Merge pull request #2487 from bska/nrsegz-actph
Account for RSEG Size Depending on Number of Active Phases
2021-05-29 07:45:57 +02:00
Bård Skaflestad
a1fd22d578 Make Aquifer Data a First Class RestartValue
This commit promotes the 'aquifer' data member of 'RestartValue' to
first class status.  In particular, this means that users must
provide aquifer data, albeit possibly empty, when constructing the
RestartValue object for input or output.

This is in preparation of using more dynamic aquifer quantities from
the simulator layer as part of the restart I/O.
2021-05-28 17:41:29 +02:00
Bård Skaflestad
15150bee50 Add Communication Support for Dynamic Aquifer Data
This commit introduces 'MessageBuffer' read and write operations for
the CarterTracyData and FetkovichData structures in preparation of
communicating these substructures from parallel processes to the IO
rank.  This is foundational work for retrieving more of the dynamic
quantities pertaining to aquifers from the simulation layer.
2021-05-28 17:41:29 +02:00
Bård Skaflestad
096ef91b73 Account for RSEG Size Depending on Number of Active Phases
The number of data items per well segment in the RSEG restart vector
turns out to depend on the number of active phases (Oil, Gas, Water)
in the simulation run.  In particular, the following relations hold

  * Single phase (Oil, Gas, or Water):          NRSEGZ = 126
  * Two phases (Oil/Gas, Oil/Water, Gas/Water): NRSEGZ = 134
  * Three phases (Oil/Gas/Water):               NRSEGZ = 146

This commit implements that variability.

The output layer does not currently use any items above index 110 so
this does not alter the contents of RSEG, only the size, for 1p or
2p simulation runs.
2021-05-28 17:41:20 +02:00
Bård Skaflestad
1b4c833c2f Merge pull request #2491 from joakim-hove/remove-unused
Remove unused variables
2021-05-28 17:37:25 +02:00
Bård Skaflestad
46e336fbb4 Merge pull request #2490 from joakim-hove/expose-stdout
Expose function stdoutIsTerminal() as static member in OpmLog
2021-05-28 13:08:28 +02:00
Joakim Hove
c9325ccfcc Remove unused variables 2021-05-28 12:02:14 +02:00
Joakim Hove
e57febca9a Expose function stdoutIsTerminal() as static member in OpmLog 2021-05-28 10:12:30 +02:00
Joakim Hove
3c4935e10b Merge pull request #2489 from joakim-hove/nupcol-update
Nupcol updates
2021-05-28 07:22:27 +02:00
Joakim Hove
0d565f9c10 Nupcol updates 2021-05-28 00:59:09 +02:00
Bård Skaflestad
6ea6891ccb Merge pull request #2488 from joakim-hove/shrink-to-fit
Add shrink_to_fit() for underlying storage in DeckItem
2021-05-27 18:14:37 +02:00
Joakim Hove
503ad0b98c Add shrink_to_fit() for underlying storage in DeckItem 2021-05-27 12:45:03 +02:00
Bård Skaflestad
dee11eae41 Merge pull request #2475 from jalvestad/rst-wlist
Output of restart tables for Well list information to the Eclipse compatible restart files
2021-05-27 10:29:44 +02:00
Jostein Alvestad
589c6014a4 changed WLIST unit test - made consistent with WListManager - newList 2021-05-26 15:25:58 +02:00
Jostein Alvestad
60148fda30 modification-correction of serialization of well_wlist_names 2021-05-26 14:27:51 +02:00
Jostein Alvestad
7974fd219a modified code to handle new empty wlists and make action NEW more robust 2021-05-26 13:58:06 +02:00
Joakim Hove
bf6ca3ff58 Merge pull request #2481 from joakim-hove/min-nupcol
Min nupcol
2021-05-26 10:22:09 +02:00
Jostein Alvestad
d1eafd6919 removed comments and removed unnecessary include-headers 2021-05-26 09:02:46 +02:00
Joakim Hove
b3b73c6f02 Merge pull request #2484 from bska/fix-double-inc
Don't Increment Loop Counter Twice
2021-05-26 00:39:55 +02:00
Bård Skaflestad
32fa3df6b6 Don't Increment Loop Counter Twice 2021-05-25 17:31:44 +02:00
Jostein Alvestad
5907a7520a first complete version that satisfies all unit tests 2021-05-25 10:37:45 +02:00
Jostein Alvestad
31c55af919 first running rewritten version - use WListManager only 2021-05-25 10:37:43 +02:00
Jostein Alvestad
4c9832aedc minor change of variable name rptStep to simStep to be consistent 2021-05-25 10:37:42 +02:00
Jostein Alvestad
1ffbfded8e cleaned up code - removed comments 2021-05-25 10:37:41 +02:00
Jostein Alvestad
c6a798cd2a completed unit tests for WList-data 2021-05-25 10:37:40 +02:00
Jostein Alvestad
96f0c2fbdd further changes unit tests 2021-05-25 10:37:39 +02:00
Jostein Alvestad
5dd815bcbe partial completion of unit tests 2021-05-25 10:37:37 +02:00
Jostein Alvestad
50cb354e23 added unit tests incl. test dataset 2021-05-25 10:37:33 +02:00
Jostein Alvestad
1086c60825 first version of restart output for WLIST keyword, plus related parser code changes 2021-05-25 10:37:29 +02:00
Joakim Hove
76fdcc2985 Merge pull request #2482 from joakim-hove/actionx-well-event
Add new well event for wells which have been touched by ACTIONX
2021-05-22 11:16:46 +02:00
Joakim Hove
ff292908ff Add new well event for wells which have been touched by ACTIONX 2021-05-21 15:55:39 +02:00
Joakim Hove
8dd9b47fd4 Use Nupcol class in Runspec & ScheduleState 2021-05-21 14:53:12 +02:00
Joakim Hove
2e52d46b68 Add class Nupcol 2021-05-21 14:40:36 +02:00
Bård Skaflestad
536265a8a3 Merge pull request #2480 from bska/write-aqunum-restart
Add Restart Output for Numeric Aquifers
2021-05-20 13:58:58 +02:00
Bård Skaflestad
6c1c753764 Add Numeric Aquifer Restart Output
This commit generates the IAQN and RAQN restart vectors pertaining
to numeric aquifers.  The arrays are sized according to the number
of records in the input AQUNUM keyword.  RAQN is a mix of static and
dynamic information, including the cumulative total inflow volume of
water from the aquifer into the model.  IAQN is exclusively static
information.

We add new members to 'AggregateAquiferData' and ensure that the
numeric aquifer arrays remain empty when no numeric aquifers exist
in the model.  Add unit tests for these new arrays and update
existing unit tests to account for new dimension items.
2021-05-19 23:07:05 +02:00
Bård Skaflestad
8c33979071 Ensure Existence of ANQx Summary Vectors
These are needed for restart purposes.
2021-05-19 23:03:45 +02:00
Bård Skaflestad
5a81df350c Identify Numeric Aquifer Restart Array Items
In particular, identify most the items in the IAQN and RAQN arrays.
While here, also make INTEHEAD Items for numeric aquifers public.
2021-05-19 22:42:58 +02:00
Joakim Hove
cb5e4eff2b Merge pull request #2479 from joakim-hove/actionx-output-sep
Actionx output sep
2021-05-19 16:51:29 +02:00
Joakim Hove
a99c27add1 Make sure ACTIONX restart output is formatted as opmpack 2021-05-19 13:02:31 +02:00
Joakim Hove
4b831e750a Assemble output formatting in small struct 2021-05-19 13:02:10 +02:00
Joakim Hove
f259f78788 Merge pull request #2477 from bska/count-aqunum-records
Track AQUNUM Records for Restart Purposes
2021-05-19 07:42:13 +02:00
Bård Skaflestad
8eb9bee6ed Track AQUNUM Records for Restart Purposes
When forming restart arrays for numerical aquifers (IAQN and RAQN)
we need to know the total number of records in the input AQUNUM
keyword as well as the record ID of each individual record.  This
commit adds a tracking mechanism for this information.

While here, also add unit tests that verify that we've correctly
interpreted the AQUNUM records.
2021-05-18 21:17:33 +02:00
Joakim Hove
f58a314f6a Merge pull request #2476 from totto82/guideRateTypeRES
Add support for guide rate type RES
2021-05-18 21:15:29 +02:00
Joakim Hove
bf064812d3 Merge pull request #2478 from berland/extend_options_items
Extend number of parameters to OPTIONS keyword.
2021-05-18 20:42:15 +02:00
Håvard Berland
fb2d5dc620 Extend number of parameters to OPTIONS keyword.
Eclipse 2019.1 reference manual goes to item number 319
2021-05-18 14:02:46 +02:00
Tor Harald Sandve
a18866b355 Add support for guide rate type RES 2021-05-18 11:20:57 +02:00
Joakim Hove
147359c564 Merge pull request #2473 from bska/fix-smry-anx-all
Output Summary for all Numeric Aquifers When ID Defaulted
2021-05-17 07:11:08 +02:00
Bård Skaflestad
51cf551eac Output Summary for all Numeric Aquifers When ID Defaulted
This commit extends the 'SummaryConfig' aquifer processing to
recognize numeric aquifer keywords without an explicit list of
aquifer IDs, i.e., summary keywords of the form

    ANQR
    /

We use the new functions '{analytic,numeric}AquiferIDs()' to form
lists of pertinent IDs once and then ensure that we create nodes
only for proper subsets of these ID sets.

Add unit tests to both the analytic and numeric configurations to
ensure that we generate these output sets or input errors when the
input file refers to IDs of incorrect type or out of range.
2021-05-16 12:15:46 +02:00
Bård Skaflestad
79b1f97640 Provide Means of Linearising All Aquifer IDs in a Model
This commit adds two helper functions

    std::vector<int> analyticAquiferIDs(const AquiferConfig&)
    std::vector<int> numericAquiferIDs(const AquiferConfig&)

which return the numeric IDs of the model's analytic and numeric
aquifers respectively.  These are useful for configuring aquifer
summary keywords of the form

    AAQR
    /

that do not list individual aquifer IDs and for identifying issues
in the input file when a summary keyword that does list its aquifer
IDs refers to an aquifer of incorrect category (e.g., ID of numeric
aquifer in an analytic aquifer summary keyword).

While here, also add more unit test coverage to the AquiferConfig
object.  In particular, add a unit test that includes aquifers at
all.
2021-05-16 12:15:46 +02:00
Joakim Hove
f44b49338b Merge pull request #2474 from bska/deckkeyword-empty
Add 'empty' Predicate to DeckKeyword Type
2021-05-16 07:30:24 +02:00
Bård Skaflestad
b216c63921 Add 'empty' Predicate to DeckKeyword Type
Makes logic statements more explicit and removes a number of
"signed vs. unsigned" comparison operations.
2021-05-16 00:07:10 +02:00
Joakim Hove
98b49964f5 Merge pull request #2470 from vkip/master
Adding support for DATES with time (HH:MM:SS.MICROSEC) in python/opm/utils/time_vector.py
2021-05-14 08:03:23 +02:00
Vegard Kippe
e5987985be Removed pandas dep also from supporting files.. 2021-05-13 10:53:03 +02:00
Vegard Kippe
8a69023089 Removed the pandas dependency 2021-05-13 10:47:27 +02:00
Vegard Kippe
988ff7521b Add python3-pandas to debian/control 2021-05-12 14:49:28 +02:00
Vegard Kippe
62e78e0018 Adding pandas to requirements.txt 2021-05-12 12:36:42 +02:00
Vegard Kippe
fe5004685c Adding support for time (HH:MM:SS.MICROSEC) in time_vector. Updating tests accordingly. 2021-05-12 12:16:34 +02:00
Joakim Hove
dc207ae8c5 Merge pull request #2469 from atgeirr/optimize-for-large-nnc-case
Optimize further for large NNC case
2021-05-11 20:46:35 +02:00
Atgeirr Flø Rasmussen
521cd5610f Remove extra reserved item capacity in ParseRecord. 2021-05-11 15:56:54 +02:00
Atgeirr Flø Rasmussen
fef696d978 Make duplicate name of item check optional in DeckRecord constructor.
This is for catching programmer error mostly, so it has been disabled
in the call path used in OPM Flow.
2021-05-11 15:30:31 +02:00
Joakim Hove
12a41a7b1f Merge pull request #2467 from atgeirr/add-deck-move-constructor
Add move constructor for Deck.
2021-05-11 11:00:41 +02:00
Atgeirr Flø Rasmussen
395bb1ca90 Add move constructor for Deck. 2021-05-11 08:10:18 +02:00
Bård Skaflestad
fea7bbce6d Merge pull request #2466 from jalvestad/rst-file_corrections
Some corrections / improvements to the eclipse - compatible restart file
2021-05-10 22:00:03 +02:00
Jostein Alvestad
26cc7897c6 correction to SWEL for prediction mode wells 2021-05-10 09:54:25 +02:00
Jostein Alvestad
777de0673f Added correction for IH[ROCKOPTS_TTYP] 2021-05-10 09:54:23 +02:00
Jostein Alvestad
68fbc5f51b further changes/corrections 2021-05-10 09:54:20 +02:00
Jostein Alvestad
184bff2e6b correction to ZACN - include Field props rhs.quantities [ind+1] 2021-05-10 09:54:18 +02:00
Jostein Alvestad
2e6fa4468b Correction for change of dimension of INOBR array v. 2019 2021-05-10 09:54:16 +02:00
Joakim Hove
3a4a8c91c6 Merge pull request #2465 from joakim-hove/wg-events-has
Add method WellGroupEvents::has(wgname)
2021-05-10 08:47:06 +02:00
Joakim Hove
14885372d2 Add method WellGroupEvents::has(wgname) 2021-05-09 16:32:07 +02:00
Joakim Hove
c1442803bd Merge pull request #2463 from joakim-hove/get_events
Add method WellGroupEvents.at() to get individual events
2021-05-09 13:52:22 +02:00
Joakim Hove
65edae0b2e Add method WellGroupEvents.at() to get individual events 2021-05-09 11:44:11 +02:00
Joakim Hove
d50b5852e0 Merge pull request #2464 from akva2/no_more_python3.5
changed: python 3.5 is no longer support in pypi
2021-05-08 20:13:10 +02:00
Arne Morten Kvarving
04ae012638 changed: python 3.5 is no longer support in pypi 2021-05-08 19:25:06 +02:00
Bård Skaflestad
65dc2e0942 Merge pull request #2462 from joakim-hove/keyword-generator-default-precision
Make sure precision is retained in very small default values

Closes #2448
2021-05-07 12:45:16 +02:00
Joakim Hove
f1c3c66996 Merge pull request #2461 from atgeirr/add-missing-include
Add missing <sstream> include.
2021-05-06 15:45:24 +02:00
Joakim Hove
e2572ed89e Merge pull request #2460 from joakim-hove/clear-events
Add clearEvent() method to consume events
2021-05-06 15:45:09 +02:00
Joakim Hove
b21fd3e3e8 Make sure precision is retained in very small default values 2021-05-06 15:33:21 +02:00
Atgeirr Flø Rasmussen
d3c32d1906 Add missing <sstream> include. 2021-05-06 11:34:47 +02:00
Bård Skaflestad
25db0ec1db Merge pull request #2458 from joakim-hove/mapaxes
Mapaxes
2021-05-05 20:33:17 +02:00
Joakim Hove
05fee1fd12 Add small class to handle MAPAXES & MAPUNITS 2021-05-05 16:09:58 +02:00
Joakim Hove
4372354174 Merge pull request #2361 from bska/dont-copy-wells-for-smry-eval
Don't Copy Well Objects During Summary Vector Evaluation
2021-05-05 16:07:23 +02:00
Joakim Hove
881da80e96 Add clearEvent() method to consume events 2021-05-05 13:40:50 +02:00
Joakim Hove
6509da9b66 Merge pull request #2459 from akva2/no_opm_in_opm
fixed: do not use Opm:: prefix when inside namespace Opm
2021-05-05 13:10:49 +02:00
Arne Morten Kvarving
978150d78f fixed: do not use Opm:: prefix when inside namespace Opm
this is at best bad practice and can lead to confusing
errors because compiler will interpret it as Opm:: if there
is no 'foo' symbol available in the Opm namespace and give
confusing 'no symbol Opm::Opm::foo' error messages.
2021-05-05 09:43:07 +02:00
Bård Skaflestad
3a5934a09e Don't Copy Well Objects During Summary Vector Evaluation
This commit makes the 'find_wells()' helper function return a vector
of (const) Well pointers instead of fully fledged Well objects.
This, in turn, eliminates quite a bit of the overhead of evaluating
well-based summary vectors (i.e., well, group, field, and connection
level vectors).
2021-05-04 13:17:52 +02:00
Joakim Hove
6650369970 Fix dimension handling for MAPAXES / MAPUNITS 2021-05-04 13:15:40 +02:00
Joakim Hove
2ca78faf3c Configure MAPAXES as DATA keyword to enable loading from IMPORT 2021-05-04 13:15:40 +02:00
Joakim Hove
2da2b28159 Merge pull request #2457 from joakim-hove/remove-get-mapaxes
Remove getMAPAXES from EclipseGrid public api
2021-05-04 13:14:54 +02:00
Joakim Hove
a093251235 Remove unused mapaxes argument in constructor / init 2021-05-04 10:39:48 +02:00
Joakim Hove
d3f2f593eb Remove public method EclipseGrid::getMAPUNITS() 2021-05-04 07:48:23 +02:00
Joakim Hove
a6d574581d Remove getMAPAXES from EclipseGrid public api 2021-05-03 15:19:47 +02:00
Joakim Hove
507242c9e7 Merge pull request #2452 from bska/fix-gaslift-restart
Don't Output Gas Lift Parameters Unless Active
2021-05-03 12:45:28 +02:00
Bård Skaflestad
c76f1364c2 Don't Output Gas Lift Parameters Unless Active
This commit checks that gas lift is active before outputting a
positive value in INTEHEAD[EACHNC].  Unless gas lift is activated
through keyword LIFTOPT, that item in INTEHEAD must be zero.
2021-05-02 00:17:05 +02:00
Arne Morten Kvarving
04622a13a5 Merge pull request #2456 from blattms/fix-cmake-package-config
Include OpmPackage in opm-project-config.cmake and force -std=c++17
2021-04-30 11:11:32 +02:00
Bård Skaflestad
efcb8d9c00 Merge pull request #2454 from akva2/fix_missing_include
fixed: include <stdexcept> in RFTConfig.cpp
2021-04-29 20:34:36 +02:00
Markus Blatt
ddfe309a88 Use current CMAKE_CXX_STANDARD in opm-project-prereq.cmake 2021-04-29 16:03:59 +02:00
Markus Blatt
7740e00883 Removed code for CMake < 3.10 2021-04-29 16:03:21 +02:00
Markus Blatt
f336cd1b74 Include OpmPackage in opm-project-config.cmake and force -std=c++17
OpmPackage is needed as it defines find_package_deps. The CXX standard
needs to be set as some cmake package config scripts will add
incompatible compile switches like -std=gnu++11 otherwise (I guess
because of import targets with INTERFACE_COMPILE_FEATURES), that will
break the build.
2021-04-29 14:07:59 +02:00
Arne Morten Kvarving
63f336c931 fixed: include <stdexcept> in connection.cpp 2021-04-29 13:24:37 +02:00
Arne Morten Kvarving
bb164e2dd0 fixed: include <stdexcept> in RFTConfig.cpp 2021-04-29 12:40:58 +02:00
Bård Skaflestad
98a2d1b8a3 Merge pull request #2449 from akva2/fix_missing_include
fixed: include <limits> in TranCalculator
2021-04-29 12:12:53 +02:00
Arne Morten Kvarving
8753bef383 fixed: include <limits> in TranCalculator
also forward struct as struct
2021-04-29 10:26:35 +02:00
Joakim Hove
c05ea0fe21 Merge pull request #2441 from akva2/use_forwarding
Use forwarding
2021-04-27 19:30:04 +02:00
Joakim Hove
da6df3cc87 Merge pull request #2444 from joakim-hove/actions-wait-time-equal
ActionX wait time compared with =>
2021-04-27 16:17:30 +02:00
Arne Morten Kvarving
b063fcd089 remove some unnecessary includes
from tests and a few schedule classes
2021-04-27 12:55:45 +02:00
Arne Morten Kvarving
bc3863912f BoxTests: fix test suite name 2021-04-27 12:55:45 +02:00
Arne Morten Kvarving
b968cd7d95 SummaryState: move forwarding to fix doxy 2021-04-27 12:55:45 +02:00
Arne Morten Kvarving
058b41e7d7 RFTConfig: remove unnecessary include 2021-04-27 12:55:45 +02:00
Arne Morten Kvarving
43dfdd4d2d UDQContext: forward types to avoid includes 2021-04-27 12:55:45 +02:00
Arne Morten Kvarving
4fe78a0424 LogUtil: forward types to avoid includes 2021-04-27 12:55:45 +02:00
Arne Morten Kvarving
b51779b6f8 UDQSet: forward types to avoid includes 2021-04-27 12:55:45 +02:00
Arne Morten Kvarving
1ff9cf93aa Connection: forward types to avoid includes 2021-04-27 12:55:45 +02:00
Arne Morten Kvarving
bc633fb09a UDQConfig: forward types to avoid includes 2021-04-27 12:55:45 +02:00
Arne Morten Kvarving
0dd63e4f84 SICD/AutoICD: forward types to avoid includes
move helper template to separate private header to avoid
use of symbols in header
2021-04-27 12:55:45 +02:00
Arne Morten Kvarving
9876a73a53 Well: forward types to avoid includes 2021-04-27 12:45:24 +02:00
Arne Morten Kvarving
cd7a12ce48 WellConnections: forward types to avoid includes 2021-04-27 12:45:24 +02:00
Arne Morten Kvarving
c407618375 Schedule: forward types to avoid includes
move constructor definition to compile unit
to avoid symbol usage in header
2021-04-27 12:45:24 +02:00
Arne Morten Kvarving
1ef8fd987b JFunc: forward types to avoid includes 2021-04-27 12:45:24 +02:00
Arne Morten Kvarving
b835c33c1a TableManager: forward types to avoid includes
move private template definitions to compile unit
to avoid using symbol definitions in header
2021-04-27 12:45:24 +02:00
Arne Morten Kvarving
2e5554598d RSTConfig: forward types to avoid includes 2021-04-27 12:45:24 +02:00
Arne Morten Kvarving
35c20318f4 RPTConfig: forward types to avoid includes 2021-04-27 12:45:24 +02:00
Arne Morten Kvarving
b9e8f01862 GConSale: forward types to avoid includes 2021-04-27 12:45:24 +02:00
Arne Morten Kvarving
c43076f598 GConSump: forward types to avoid includes 2021-04-27 12:45:24 +02:00
Arne Morten Kvarving
97eaa972c2 EclipseState: forward types to avoid includes
also clean up some unnecessary forwards, old debugging code
2021-04-27 12:45:24 +02:00
Arne Morten Kvarving
1e232cf5c0 Actdims: forward types to avoid includes 2021-04-27 12:45:24 +02:00
Arne Morten Kvarving
85d56347ba MULTREGTScanner: forward types to avoid includes 2021-04-27 12:45:24 +02:00
Arne Morten Kvarving
d96a246441 GridDims: forward types to avoid includes 2021-04-27 12:45:24 +02:00
Arne Morten Kvarving
7fd4d2bd9f EInit: move template definition to cpp file
and use explicit template instantation to generate necessary symbols.

this allows not pulling in error macros in header
2021-04-27 12:45:24 +02:00
Arne Morten Kvarving
007fdc73aa ERst: move template definition to cpp file
and use explicit template instantation to generate necessary symbols.

this allows not pulling in error macros in header
2021-04-27 12:45:24 +02:00
Arne Morten Kvarving
b9b71d7c1f EclFile: move template definition to cpp file
only used internally. this allows not pulling in error macros in header
2021-04-27 12:45:24 +02:00
Arne Morten Kvarving
651fcc5dc0 EclipseGrid: forward types to avoid includes 2021-04-27 12:45:24 +02:00
Arne Morten Kvarving
079e51e8c0 DeckKeyword: forward types to avoid includes 2021-04-27 12:45:24 +02:00
Joakim Hove
0ef2bc1528 ActionX wait time compared with => 2021-04-27 11:59:17 +02:00
Arne Morten Kvarving
b7fca24862 Merge pull request #2443 from totto82/bump_master
Bump version number
2021-04-27 10:13:28 +02:00
Tor Harald Sandve
6ad6283706 Bump version number 2021-04-27 09:59:50 +02:00
Joakim Hove
76286d9b97 Merge pull request #2426 from bska/support-voidage-smry
Summary: Support Voidage Vectors CV{I,P}{R,T}
2021-04-26 10:27:18 +02:00
Bård Skaflestad
7055a18a97 Summary: Support Voidage Vectors CV{I,P}{R,T}
This commit adds support for outputting the reservoir voidage volume
summary vectors CVPR (production rate), CVPT (cumulative production
total), CVIR (injection rate), and CVIT (cumulative injection total).

The simulator uses the 'data::Connection::reservoir_rate' member to
communicate these values, so add a special purpose evaluation
function to compute the requisite updates.

While here, also add 'CVPR' to the 'CONNECTION_PROBE'.  This keyword
being missing looks to be an earlier oversight.
2021-04-24 20:27:17 +02:00
Bård Skaflestad
06d2520b07 Remove Executable Bit From Source Files 2021-04-24 20:27:17 +02:00
Joakim Hove
086b44c0fb Merge pull request #2440 from akva2/fix_fallout_2438
Fix fallout from PR #2438
2021-04-24 08:27:12 +02:00
Arne Morten Kvarving
0fcbfac33d fixed: missing member initialization
if deck has no rockcomp keyword, variable is not written
2021-04-23 22:18:52 +02:00
Arne Morten Kvarving
7a4e63c24b Revert "Temp disable test"
This reverts commit aeb4ba3788.
2021-04-23 22:09:35 +02:00
Bård Skaflestad
c62563a7e5 Merge pull request #2439 from joakim-hove/fix-rst
Inclide cstdlib to get EXIT_SUCCESS and EXIT_FAILURE
2021-04-23 20:31:47 +02:00
Joakim Hove
aeb4ba3788 Temp disable test 2021-04-23 19:12:33 +02:00
Joakim Hove
326b1638dc Inclide cstdlib to get EXIT_SUCCESS and EXIT_FAILURE 2021-04-23 19:11:32 +02:00
Joakim Hove
2934a5ac1a Merge pull request #2438 from akva2/avoid_gen_headers_in_headers
Avoid headers in headers
2021-04-23 17:30:59 +02:00
Bård Skaflestad
1bfc81c82f Merge pull request #2437 from akva2/prune_boost_includes
changed: remove unnecessary boost includes
2021-04-23 16:09:57 +02:00
Arne Morten Kvarving
96da3d3c98 PlyshlogTable: remove unnecessary include 2021-04-23 13:05:08 +02:00
Arne Morten Kvarving
131a34f336 RockConfig: put some more code in cpp file
to avoid include files in header
2021-04-23 13:05:08 +02:00
Arne Morten Kvarving
c80da8bb6c MessageLimits: put some more code in cpp file
to avoid include files in header
2021-04-23 13:05:08 +02:00
Arne Morten Kvarving
3307889464 Tabdims: put some code in separate compile unit
to avoid include files in header
2021-04-23 13:05:08 +02:00
Arne Morten Kvarving
6547376330 Regdims: put some code in separate compile unit
to avoid include files in header
2021-04-23 13:05:08 +02:00
Arne Morten Kvarving
625c33f18f Eqldims: put some code in separate compile unit
to avoid include files in header
2021-04-23 13:05:08 +02:00
Arne Morten Kvarving
dcba5e2641 Aqudims: put some code in separate compile unit
to avoid include files in header
2021-04-23 13:05:05 +02:00
Arne Morten Kvarving
54979c1aed Tuning: put some code in separate compile unit
to avoid include files in header
2021-04-23 13:05:01 +02:00
Arne Morten Kvarving
3a01bf6a51 TranCalculator: put some code in separate compile unit
to avoid include files in header
2021-04-23 13:04:53 +02:00
Arne Morten Kvarving
95925e8648 fix header guards 2021-04-23 13:04:53 +02:00
Arne Morten Kvarving
72ede7df50 changed: remove unnecessary boost includes 2021-04-23 11:27:38 +02:00
Joakim Hove
b1e76e0038 Merge pull request #2389 from GitPaean/using_pinched_grid_numerical_aquifer
Using pinched grid for numerical aquifer
2021-04-21 13:03:21 +02:00
Joakim Hove
9e3ad90b8a Merge pull request #2434 from akva2/fix_serialize_valgrind
Fix some valgrind errors in test_ParallelRestart
2021-04-21 13:01:10 +02:00
Kai Bao
b3f53b2f04 renaming function names for numerical aquifers
following reviewing comment.
2021-04-21 09:35:54 +02:00
Arne Morten Kvarving
c7a7caff56 fixed: do no use [] to deref when checking for data
this causes default initialized objects if key is missing,
and these objects tend to have uninitialized members.
2021-04-21 09:33:24 +02:00
Arne Morten Kvarving
c817c4de33 fixed: missing data in serializeObjects 2021-04-21 09:33:24 +02:00
Arne Morten Kvarving
84c2d2239e simplify
this is a vector of POD so we can use the primitive serializer directly
2021-04-21 09:33:24 +02:00
Arne Morten Kvarving
c99c8e1193 fixed: initialize data
can cause uninitialized data usage when default constructed
2021-04-21 09:33:24 +02:00
Joakim Hove
ca03815efe Merge pull request #2433 from totto82/fldNO
let cmode FLD override yes/no in item8 in GCONPROD and GCONINJE
2021-04-21 08:44:28 +02:00
Tor Harald Sandve
49bac6f251 let cmode FLD override yes/no in item8 in GCONPROD and GCONINJE 2021-04-20 11:29:45 +02:00
Kai Bao
4e911f1c88 splitting generation of the numerical aquifer connections to two steps
generate all the connections specified in the deck records first, then
filter out the wrong ones using processed grid later. The refactoring is
to avoid using the Deck explicitly in opm-grid.
2021-04-20 00:35:17 +02:00
Bård Skaflestad
d7389f9b3c Merge pull request #2431 from totto82/addSwitchEvent
add event for switching from injector to producer
2021-04-16 19:04:14 +02:00
Bård Skaflestad
1c915d5c9c Merge pull request #2432 from goncalvesmachadoc/welltemp_output
Fix Well Temperature Output
2021-04-16 18:56:54 +02:00
Cintia Goncalves Machado
a9f3909f13 fixWellTempOutput 2021-04-16 16:50:12 +02:00
Tor Harald Sandve
7b8b83645b add event for switching from injector to producer 2021-04-16 13:39:33 +02:00
Joakim Hove
a48c3829d7 Merge pull request #2429 from blattms/fix-compile-g++10.2
Include stdexcept header to fix compilation with g++-10
2021-04-15 14:36:29 +02:00
Markus Blatt
b240e66503 Include stdexcept header to fix compilation with g++-10 2021-04-15 11:51:57 +02:00
Joakim Hove
b7c4bde0e9 Merge pull request #2428 from joakim-hove/optional-guiderate-model
Use std::optional<> in GuideRateConfig
2021-04-15 08:15:42 +02:00
Kai Bao
ea293b8353 make sure NNC is from low to high for numerical aquifers. 2021-04-14 21:11:10 +02:00
Kai Bao
9517d9bdae removing an unused function aquiferNNCs()
and using std::make_move_iterator following review comments.
2021-04-14 21:11:10 +02:00
Kai Bao
08539cdcd6 fixing AquiferTests 2021-04-14 21:11:10 +02:00
Kai Bao
67d56cd637 adding methond to set NNC for EclipseState
it needs to be updated after grid processing.
2021-04-14 21:11:10 +02:00
Kai Bao
36f714381d using pinched grid for numerical aquifer 2021-04-14 21:11:10 +02:00
Kai Bao
276530fcde neighborCellInsideReservoirAndActive function takes extra actnum 2021-04-14 21:11:10 +02:00
Joakim Hove
05366912fc Merge pull request #2380 from bska/output-aquifer-to-restart
Add Restart Output Facility for Analytic Aquifer Data
2021-04-14 20:59:49 +02:00
Bård Skaflestad
ef5a74392e Address Review Comments
Use SummaryState::get() with default, std::size instead of distance,
and a named constant for the aquifer model type.
2021-04-14 20:58:19 +02:00
Bård Skaflestad
d43e358d01 Activate Aquifer Restart Output
This commit hooks the aquifer restart output facility (output arrays
{I,S,X}AAQ and {I,S,A}CAQ) up to the general "RestartIO" module.  If
a simulation run uses analytic aquifers we construct an aquifer
output object at simulation start and store this in an optional<> in
the internal implementation object.  Otherwise the optional holds
nullopt.  We expand RestartIO::save() to take such an optional by
reference and aggregate/output aquifer information, directly after
the well information, if the optional holds a value.  Update callers
accordingly.
2021-04-14 20:58:19 +02:00
Bård Skaflestad
a36b8bd4bb Centralise Aquifer Dimension Handling in INTEHEAD
This commit switches the INTEHEAD factory function to passing
dimensions related to aquifers by means of the 'AquiferDims'
structure.  While here, also update description and names of a few
aquifer-related INTEHEAD items to reflect more recent understanding.
2021-04-14 20:58:19 +02:00
Bård Skaflestad
0edf6673ba Add Restart Output Facility for Analytic Aquifer Data
We support both Fetkovich and Carter-Tracy aquifers.  We presently
output trivial values only in the 'ACAQ' (per-connection, double
precision elements), but otherwise assemble reasonable values for
many items.

We leverage the fact that the aquifer connections do not change
throughout the simulation run.  The "Aggregate" API is therefore
constructed in such a way that most of the expensive operations
(e.g., mapping active cell IDs to their columnar counterparts)
happens once (in the constructor) and the per-aquifer operations are
performed for each restart output step.  We intend that one aquifer
output object be constructed at the start of the simulation run, if
needed, and that this object will live until simulation shutdown.
2021-04-14 20:58:19 +02:00
Bård Skaflestad
0aea5c1e20 Hook Aquifer Dimensions Up to 'Runspec' Constructor
Forgotten in 796318409 (PR #2338).
2021-04-14 20:58:19 +02:00
Bård Skaflestad
762e256d2b Make "WindowedArray" a Movable Type
Needed to put such objects into standard containers.
2021-04-14 20:58:19 +02:00
Bård Skaflestad
0e5a7a335b Order Aquifer Connections by Global Index
We need a stable connection order for restart purposes.
2021-04-14 20:58:19 +02:00
Bård Skaflestad
e477409373 Reduce Analytic Aquifer Compilation Overhead
In particular, switch to using forward declarations instead of
transitive includes in headers and especially of 'Deck'-related
headers.
2021-04-14 20:58:19 +02:00
Joakim Hove
39dab54321 Use std::optional<> in GuideRateConfig 2021-04-14 19:57:59 +02:00
Joakim Hove
a93c75ed2f Merge pull request #2425 from joakim-hove/optional-topup-phase
Return std::optional<Phase> for Group::topup_phase()
2021-04-14 19:56:54 +02:00
Joakim Hove
4ab4f0407f Return std::optional<Phase> for Group::topup_phase() 2021-04-14 11:28:36 +02:00
Joakim Hove
a6bdda7b27 Merge pull request #2420 from tskille/fix_erst
fixing bug for python bindings ERst
2021-04-14 10:05:59 +02:00
Bård Skaflestad
bdd0c9d351 Merge pull request #2424 from tskille/vfp_iglr
fixing ALQ Type IGLR
2021-04-13 21:01:29 +02:00
Bård Skaflestad
2afb2ddd1e Merge pull request #2421 from tskille/latest_emodel
new python bindings class EModel
2021-04-13 18:13:12 +02:00
Torbjørn Skille
5b73f17652 fixing ALQ Type IGLR 2021-04-13 11:21:27 +02:00
Torbjørn Skille
94e541ad60 new python bindings class EModel 2021-04-13 10:42:43 +02:00
Torbjørn Skille
6003736221 fixing bug for python bindings ERst
> bug related to occurence parameter in function get_erst_vector(..)
 > additional python unittest related to this function
2021-04-11 08:48:23 +02:00
564 changed files with 65049 additions and 11941 deletions

View File

@@ -42,11 +42,13 @@ 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(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_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(OPM_PACK_COMMAND ${PROJECT_BINARY_DIR}/bin/opmpack)
set(RST_DECK_COMMAND ${PROJECT_BINARY_DIR}/bin/rst_deck)")
endif()
# project information is in dune.module. Read this file and set variables.
@@ -107,8 +109,7 @@ macro (config_hook)
set(HAVE_ECL_OUTPUT 1)")
endif()
# Configure boost targets for old cmake
include(cmake/Modules/BoostTargets.cmake)
find_package(Boost COMPONENTS filesystem regex system unit_test_framework)
if (HAVE_DYNAMIC_BOOST_TEST)
set_target_properties(Boost::unit_test_framework PROPERTIES INTERFACE_COMPILE_DEFINITIONS BOOST_TEST_DYN_LINK=1)
@@ -300,15 +301,20 @@ if(ENABLE_ECL_INPUT)
${PROJECT_BINARY_DIR}/tests
)
foreach(test test_EclIO test_EGrid test_ERft test_ERst test_ESmry test_EInit)
foreach(test test_EclIO test_EGrid test_ERft test_ERst test_ESmry test_EInit test_ExtESmry)
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
install(DIRECTORY cmake DESTINATION share/opm USE_SOURCE_PERMISSIONS)
# 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 tab completion skeleton
install(FILES etc/opm_bash_completion.sh.in DESTINATION share/opm/etc)
@@ -321,7 +327,17 @@ if (OPM_ENABLE_PYTHON)
else()
set(PYTHON_PACKAGE_PATH "site-packages")
endif()
set(PYTHON_INSTALL_PREFIX "lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/${PYTHON_PACKAGE_PATH}" CACHE STRING "Subdirectory to install Python modules in")
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")
make_directory(${PROJECT_BINARY_DIR}/python)
get_target_property(_opmcommon_include_dirs opmcommon INCLUDE_DIRECTORIES)

View File

@@ -46,6 +46,8 @@ 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
@@ -79,12 +81,14 @@ 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
@@ -92,6 +96,7 @@ 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
@@ -102,6 +107,7 @@ 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
@@ -124,6 +130,7 @@ 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
@@ -136,7 +143,8 @@ 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/TimeMap.cpp
src/opm/parser/eclipse/EclipseState/Schedule/Tuning.cpp
src/opm/parser/eclipse/EclipseState/Schedule/WriteRestartFileEvents.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
@@ -151,6 +159,7 @@ 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
@@ -162,10 +171,13 @@ 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
@@ -182,6 +194,7 @@ 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
@@ -229,6 +242,7 @@ 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
@@ -270,24 +284,32 @@ 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/CreateActionxDims.cpp
src/opm/output/eclipse/AggregateWListData.cpp
src/opm/output/eclipse/CreateActionRSTDims.cpp
src/opm/output/eclipse/CreateDoubHead.cpp
src/opm/output/eclipse/CreateInteHead.cpp
src/opm/output/eclipse/CreateLogiHead.cpp
@@ -303,13 +325,16 @@ 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()
@@ -318,6 +343,7 @@ 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
@@ -332,6 +358,7 @@ 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
@@ -356,6 +383,7 @@ 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
@@ -390,7 +418,6 @@ 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
@@ -401,15 +428,18 @@ 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
@@ -444,6 +474,8 @@ 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
@@ -455,13 +487,21 @@ 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
@@ -472,13 +512,17 @@ 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
@@ -513,15 +557,21 @@ 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_lodsmry.cpp
examples/make_ext_smry.cpp
)
endif()
@@ -534,7 +584,8 @@ if(ENABLE_ECL_INPUT)
examples/opmi.cpp
examples/opmpack.cpp
examples/opmhash.cpp
examples/make_lodsmry.cpp
examples/rst_deck.cpp
examples/make_esmry.cpp
)
endif()
@@ -622,9 +673,11 @@ 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
@@ -724,15 +777,16 @@ 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
@@ -750,6 +804,7 @@ 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
@@ -765,6 +820,7 @@ 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
@@ -806,7 +862,9 @@ 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
@@ -828,14 +886,20 @@ 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
@@ -843,6 +907,7 @@ 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
@@ -854,12 +919,14 @@ 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
@@ -873,12 +940,14 @@ if(ENABLE_ECL_OUTPUT)
opm/output/eclipse/Inplace.hpp
opm/output/eclipse/Summary.hpp
opm/output/eclipse/Tables.hpp
opm/output/eclipse/UDQDims.hpp
opm/output/eclipse/WindowedArray.hpp
opm/output/eclipse/WriteInit.hpp
opm/output/eclipse/WriteRFT.hpp
opm/output/eclipse/WriteRPT.hpp
opm/output/eclipse/WriteRestartHelpers.hpp
opm/output/OutputWriter.hpp
opm/utility/EModel.hpp
)
endif()

View File

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

View File

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

View File

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

View File

@@ -8,7 +8,11 @@
# 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)
@@ -35,9 +39,27 @@ find_library(METIS_LIBRARIES
${METIS_NO_DEFAULT_PATH})
set (METIS_FOUND FALSE)
if (METIS_INCLUDE_DIRS OR METIS_LIBRARIES)
set(METIS_FOUND TRUE)
set(HAVE_METIS TRUE)
file(READ "${METIS_INCLUDE_DIRS}/metis.h" metisheader)
string(REGEX MATCH "#define METIS_VER_MAJOR[ ]+([0-9]+)" METIS_MAJOR_VERSION ${metisheader})
if(NOT METIS_API_VERSION AND METIS_MAJOR_VERSION)
# string(REGEX REPLACE ".*#define METIS_VER_MAJOR[ ]+([0-9]+).*" "\\1"
# METIS_MAJOR_VERSION "${metisheader}")
if(METIS_MAJOR_VERSION GREATER_EQUAL 3 AND METIS_MAJOR_VERSION LESS 5)
set(METIS_API_VERSION "3")
else()
set(METIS_API_VERSION "${METIS_MAJOR_VERSION}")
endif()
endif()
add_library(METIS::METIS UNKNOWN IMPORTED)
set_target_properties(METIS::METIS PROPERTIES
IMPORTED_LOCATION ${METIS_LIBRARIES}
INTERFACE_INCLUDE_DIRECTORIES ${METIS_INCLUDE_DIRS}
INTERFACE_COMPILE_DEFINITIONS METIS_API_VERSION=${METIS_API_VERSION})
endif()
# print a message to indicate status of this package

View File

@@ -1,6 +1,16 @@
# 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 ${binary}_bash_completion.sh @ONLY)
install(FILES ${PROJECT_BINARY_DIR}/${binary}_bash_completion.sh DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/bash_completion.d)
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})
endmacro()

View File

@@ -130,9 +130,18 @@ 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)
find_package (${name} ${ARGN})
# 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})
else()
if(${name}_DIR)
find_package (${name} ${${prefix}_VERSION_MAJOR}.${${prefix}_VERSION_MINOR} ${ARGN} NO_MODULE PATHS ${${name}_DIR} NO_DEFAULT_PATH)

View File

@@ -138,14 +138,9 @@ 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
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()
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# quadmath must be explicitly enabled
# This needs to be in OpmInit as prereqs is called before OpmLibMain is included.

View File

@@ -1,4 +1,11 @@
find_package (Boost 1.44.0 COMPONENTS unit_test_framework QUIET)
# 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})
if (Boost_UNIT_TEST_FRAMEWORK_FOUND)
# setup to do a test compile

View File

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

View File

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

View File

@@ -93,6 +93,16 @@ 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.
@@ -104,6 +114,7 @@ if(NOT @opm-project_NAME@_FOUND)
@OPM_PROJECT_EXTRA_CODE@
# end extra code
include(OpmPackage)
include(@opm-project_NAME@-prereqs)
endif()
endif()

2
debian/changelog vendored
View File

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

View File

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

7
docs/man1/rst_deck.1 Normal file
View File

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

View File

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

View File

@@ -39,7 +39,7 @@ static void printHelp() {
std::cout << "\nThis program create one or more lodsmry files, designed for effective load on the demand. \n"
<< "These files are created with input from the smspec and unsmry file. \n"
<< "\nIn addition, the program takes these options (which must be given before the arguments):\n\n"
<< "-f if LODSMRY file exist, this will be replaced. Default behaviour is that existing file is kept.\n"
<< "-f if ESMRY 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,7 +48,9 @@ static void printHelp() {
int main(int argc, char **argv) {
int c = 0;
int max_threads [[maybe_unused]] = -1;
#ifdef _OPENMP
int max_threads = -1;
#endif
bool force = false;
while ((c = getopt(argc, argv, "fn:h")) != -1) {
@@ -60,7 +62,11 @@ 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;
@@ -89,21 +95,21 @@ int main(int argc, char **argv) {
for (int f = argOffset; f < argc; f ++){
Opm::filesystem::path inputFileName = argv[f];
Opm::filesystem::path lodFileName = inputFileName.parent_path() / inputFileName.stem();
lodFileName = lodFileName += ".LODSMRY";
Opm::filesystem::path esmryFileName = inputFileName.parent_path() / inputFileName.stem();
esmryFileName = esmryFileName += ".ESMRY";
if (Opm::EclIO::fileExists(lodFileName) && (force))
remove (lodFileName);
if (Opm::EclIO::fileExists(esmryFileName) && (force))
remove (esmryFileName);
Opm::EclIO::ESmry smryFile(argv[f]);
if (!smryFile.make_lodsmry_file()){
if (!smryFile.make_esmry_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) << " LODSMRY files: " << elapsed_seconds1.count() << " seconds\n" << std::endl;
std::cout << "\nruntime for creating " << (argc-argOffset) << " ESMRY files: " << elapsed_seconds1.count() << " seconds\n" << std::endl;
return 0;
}

View File

@@ -20,6 +20,8 @@
#include <vector>
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <fmt/format.h>
#include <opm/parser/eclipse/Parser/Parser.hpp>
@@ -49,7 +51,7 @@ struct keyword {
};
std::vector<keyword> load_deck(const char * deck_file) {
std::vector<keyword> load_deck(const std::string& deck_file) {
Opm::ParseContext parseContext;
Opm::ErrorGuard errors;
Opm::Parser parser;
@@ -73,7 +75,7 @@ std::vector<keyword> load_deck(const char * deck_file) {
}
std::size_t deck_hash(const std::vector<keyword>& keywords) {
std::size_t make_deck_hash(const std::vector<keyword>& keywords) {
std::stringstream ss;
for (const auto& kw : keywords)
ss << kw.content_hash;
@@ -82,14 +84,14 @@ std::size_t deck_hash(const std::vector<keyword>& keywords) {
}
void print_keywords(const std::vector<keyword>& keywords, bool location_info) {
void print_keywords(const std::vector<keyword>& keywords, std::size_t deck_hash, 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(keywords));
fmt::print("\n{:8s} : {}\n", "Total", deck_hash);
}
@@ -118,6 +120,12 @@ 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;
@@ -129,10 +137,11 @@ 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, "ls");
c = getopt(argc, argv, "lsS");
if (c == -1)
break;
@@ -143,16 +152,53 @@ 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();
auto keywords = load_deck(argv[arg_offset]);
if (short_form)
std::cout << deck_hash(keywords) << std::endl;
else
print_keywords(keywords, location_info);
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);
}
}

271
examples/rst_deck.cpp Normal file
View File

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

View File

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

View File

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

View File

@@ -14,6 +14,9 @@ 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
@@ -29,6 +32,9 @@ else
if ! test -d $WORKSPACE/deps/opm-tests
then
cp $OPM_TESTS_ROOT $WORKSPACE/deps/opm-tests -R
pushd $WORKSPACE/deps/opm-tests
echo "opmt-tests-revision: `git rev-parse HEAD`"
popd
fi
fi
OPM_TESTS_ROOT=$WORKSPACE/deps/opm-tests

View File

@@ -37,14 +37,14 @@ do
prnumber=${rev//[!0-9]/}
BRANCH_NAME="${BRANCH_NAME}_${repo}_$prnumber"
test -n "$REASON" && REASON+=" "
REASON+="https://github.com/OPM/$repo/pull/$prnumber\n"
REASON+="PR 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/deps/opm-simulators/tests/update_reference_data.sh $OPM_TESTS_ROOT $WORKSPACE/$configuration/build-opm-simulators $WORKSPACE/$configuration/install/bin/convertECL
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\" }" -X POST https://api.github.com/repos/OPM/$MAIN_REPO/issues/$PRNUMBER/comments?access_token=$GH_TOKEN
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
else
git-open-pull -u jenkins4opm --base-account OPM --base-repo opm-tests -r /tmp/cmsg $BRANCH_NAME
fi

View File

@@ -27,6 +27,7 @@ class Parser;
class Python;
class SummaryState;
class UDQState;
class WellTestState;
namespace Action {
class State;
@@ -48,10 +49,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, 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;
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;
EclipseState state;
std::map<std::string, std::map<data::Rates::opt, std::function<well_rate_function>>> well_rates;

View File

@@ -18,6 +18,7 @@
*/
#include <iostream>
#include <utility>
#include <opm/output/eclipse/Inplace.hpp>
#include <opm/output/eclipse/EclipseIO.hpp>
@@ -33,6 +34,7 @@
#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>
@@ -49,6 +51,7 @@ 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;
@@ -57,10 +60,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, st, udq_state, sol, well_data, group_nwrk_data, report_step, io);
run_step(schedule, action_state, wtest_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, st, udq_state, sol, well_data, group_nwrk_data, report_step, time_step, io);
run_step(schedule, action_state, wtest_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);
@@ -94,12 +97,12 @@ void msim::post_step(Schedule& schedule, Action::State& action_state, SummarySta
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& 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& group_nwrk_data, size_t report_step, double dt, EclipseIO& io) const {
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 {
double start_time = schedule.seconds(report_step - 1);
double end_time = schedule.seconds(report_step);
double seconds_elapsed = start_time;
@@ -109,7 +112,7 @@ void msim::run_step(const Schedule& schedule, Action::State& action_state, Summa
if ((seconds_elapsed + time_step) > end_time)
time_step = end_time - seconds_elapsed;
this->simulate(schedule, st, sol, well_data, group_nwrk_data, report_step, seconds_elapsed, time_step);
this->simulate(schedule, wtest_state, st, sol, well_data, group_nwrk_data, report_step, seconds_elapsed, time_step);
seconds_elapsed += time_step;
@@ -126,6 +129,7 @@ void msim::run_step(const Schedule& schedule, Action::State& action_state, Summa
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,
@@ -140,19 +144,20 @@ void msim::run_step(const Schedule& schedule, Action::State& action_state, Summa
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);
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, {});
io.writeTimeStep(action_state,
wtest_state,
st,
udq_state,
report_step,
substep,
seconds_elapsed,
value);
std::move(value));
}
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 {
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 {
for (const auto& sol_pair : this->solutions) {
auto func = sol_pair.second;
func(this->state, schedule, sol, report_step, seconds_elapsed + time_step);

View File

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

View File

@@ -23,10 +23,10 @@
#include <cstdint>
#include <string>
#include <opm/common/OpmLog/KeywordLocation.hpp>
namespace Opm {
class KeywordLocation;
namespace Log {
namespace MessageType {
const int64_t Debug = 1; /* Excessive information */

View File

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

View File

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

View File

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

View File

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

View File

@@ -24,6 +24,7 @@
#include <ctime>
#include <string>
#include <unordered_map>
#include <opm/parser/eclipse/Deck/DeckRecord.hpp>
namespace Opm {
@@ -38,7 +39,13 @@ 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
@@ -115,6 +122,8 @@ namespace Opm {
TimeStampUTC operator+(const TimeStampUTC& lhs, std::chrono::duration<double> delta);
std::time_t asTimeT(const TimeStampUTC& tp);
std::time_t asLocalTimeT(const TimeStampUTC& tp);
time_point asTimePoint(const TimeStampUTC& tp);
} // namespace Opm

View File

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

View File

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

View File

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

View File

@@ -4,7 +4,7 @@
//
// Created: Tue Jun 2 19:06:46 2009
//
// Author(s): B<EFBFBD>rd Skaflestad <bard.skaflestad@sintef.no>
// Author(s): Bå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 assignements (' "
OpmLog::warning("Too many assignments (' "
+ ID_delimiter_assignment
+ "') detected in argument " + to_string(i));
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -48,6 +48,9 @@ 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]; }
@@ -64,11 +67,17 @@ 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;
@@ -93,6 +102,12 @@ private:
int actnum_array_index;
int nnc1_array_index;
int nnc2_array_index;
std::vector<float> get_zcorn_from_disk(int layer, bool bottom);
void getCellCorners(const std::array<int, 3>& ijk, const std::vector<float>& zcorn_layer,
std::array<double,4>& X, std::array<double,4>& Y, std::array<double,4>& Z);
};
}} // namespace Opm::EclIO

View File

@@ -51,35 +51,7 @@ public:
protected:
template <typename T>
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");
}
const std::vector<T>& ImplgetInitData(const std::string& name, const std::string& grid_name = "global");
private:
std::array<int, 3> global_nijk;

View File

@@ -53,9 +53,6 @@ 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)
{
@@ -64,16 +61,10 @@ public:
}
template <typename T>
const std::vector<T>& getRestartData(int index, int reportStepNumber, const std::string& lgr_name)
{
auto indRange = this->getIndexRange(reportStepNumber);
const std::vector<T>& getRestartData(const std::string& name, 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);
}
template <typename T>
const std::vector<T>& getRestartData(int index, int reportStepNumber, const std::string& lgr_name);
int occurrence_count(const std::string& name, int reportStepNumber) const;
size_t numberOfReportSteps() const { return seqnum.size(); };

View File

@@ -35,6 +35,7 @@ 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
{
@@ -58,7 +59,7 @@ public:
void LoadData(const std::vector<std::string>& vectList) const;
void LoadData() const;
bool make_lodsmry_file();
bool make_esmry_file();
time_point startdate() const { return startdat; }
@@ -74,13 +75,17 @@ public:
const std::string& get_unit(const SummaryNode& node) const;
void write_rsm(std::ostream&) const;
void write_rsm_file(std::optional<Opm::filesystem::path> = std::nullopt) const;
void write_rsm_file(std::optional<filesystem::path> = std::nullopt) const;
bool all_steps_available();
private:
Opm::filesystem::path inputFileName, lodFileName;
filesystem::path inputFileName;
RstEntry restart_info;
int nI, nJ, nK, nSpecFiles;
bool fromSingleRun, lodEnabeled;
uint64_t lod_offset, lod_arr_size;
bool fromSingleRun;
size_t nVect, nTstep;
std::vector<bool> formattedFiles;
@@ -88,6 +93,7 @@ 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;
@@ -96,6 +102,7 @@ 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;
@@ -104,15 +111,17 @@ private:
time_point startdat;
std::vector<std::string> checkForMultipleResultFiles(const Opm::filesystem::path& rootN, bool formatted) const;
std::vector<std::string> checkForMultipleResultFiles(const filesystem::path& rootN, bool formatted) const;
void getRstString(const std::vector<std::string>& restartArray,
Opm::filesystem::path& pathRst,
Opm::filesystem::path& rootN) const;
filesystem::path& pathRst,
filesystem::path& rootN) const;
void updatePathAndRootName(Opm::filesystem::path& dir, Opm::filesystem::path& rootN) const;
void updatePathAndRootName(filesystem::path& dir, filesystem::path& rootN) const;
std::string makeKeyString(const std::string& keyword, const std::string& wgname, int num) 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 unpackNumber(const SummaryNode&) const;
std::string lookupKey(const SummaryNode&) const;
@@ -135,8 +144,9 @@ 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 inspect_lodsmry();
void Load_from_lodsmry(const std::vector<int>& keywIndVect) const;
void read_ministeps_from_disk();
int read_ministep_formatted(std::fstream& fileH);
};
}} // namespace Opm::EclIO

View File

@@ -19,11 +19,10 @@
#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>
@@ -97,19 +96,7 @@ 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)
{
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);
}
const std::string& typeStr);
std::streampos
seekPosition(const std::vector<std::string>::size_type arrIndex) const;

106
opm/io/eclipse/ExtESmry.hpp Normal file
View File

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

View File

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

View File

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

View File

@@ -24,9 +24,15 @@
#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,
@@ -52,13 +58,14 @@ struct SummaryNode {
Undefined,
};
std::string keyword;
Category category;
Type type;
std::string wgname;
int number;
std::optional<std::string> fip_region;
std::optional<lgr_info> lgr;
constexpr static int default_number { std::numeric_limits<int>::min() };

View File

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

View File

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

View File

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

View File

@@ -86,6 +86,11 @@ 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;
@@ -117,7 +122,9 @@ struct RstHeader {
double udq_undefined;
double udq_eps;
std::time_t sim_time() const;
std::pair<std::time_t, std::size_t> restart_info() const;
int num_udq() const;
};

View File

@@ -19,70 +19,53 @@
#ifndef RST_STATE
#define RST_STATE
#include <vector>
#include <memory>
#include <string>
#include <vector>
#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(const ::Opm::UnitSystem& unit_system,
const std::vector<int>& intehead,
const std::vector<bool>& logihead,
const std::vector<double>& doubhead);
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,
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);
static RstState load(std::shared_ptr<EclIO::RestartFileView> rstView,
const Runspec& runspec,
const Parser& parser,
const ::Opm::EclipseGrid* grid = nullptr);
const RstWell& get_well(const std::string& wname) const;
const ::Opm::UnitSystem unit_system;
::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:
@@ -93,11 +76,45 @@ 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

112
opm/io/eclipse/rst/udq.hpp Normal file
View File

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

View File

@@ -76,6 +76,9 @@ 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;
@@ -91,6 +94,8 @@ struct RstWell {
float drainage_radius;
float efficiency_factor;
float alq_value;
float wtest_interval;
float wtest_startup;
double oil_rate;
double water_rate;

View File

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

View File

@@ -15,21 +15,22 @@
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,
@@ -37,15 +38,235 @@ namespace Opm { namespace data {
struct FetkovichData
{
double initVolume;
double prodIndex;
double timeConstant;
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);
};
struct CarterTracyData
{
double dimensionless_time;
double dimensionless_pressure;
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);
};
struct AquiferData
@@ -57,12 +278,12 @@ namespace Opm { namespace data {
double initPressure = 0.0; //< Aquifer's initial pressure
double datumDepth = 0.0; //< Aquifer's pressure reference depth
AquiferType type;
std::shared_ptr<FetkovichData> aquFet;
std::shared_ptr<CarterTracyData> aquCT;
TypeSpecificData typeData{};
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;
@@ -70,30 +291,81 @@ 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>;
inline double AquiferData::get(const std::string& key) const
template <class MessageBufferType>
void FetkovichData::write(MessageBufferType& buffer) const
{
if ((key == "AAQR") || (key == "ANQR")) {
return this->fluxRate;
}
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;
}
buffer.write(this->initVolume);
buffer.write(this->prodIndex);
buffer.write(this->timeConstant);
}
return 0.0;
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);
}
}
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);
}
}
template <class MessageBufferType>
@@ -106,18 +378,7 @@ namespace Opm { namespace data {
buffer.write(this->initPressure);
buffer.write(this->datumDepth);
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);
}
this->typeData.write(buffer);
}
template <class MessageBufferType>
@@ -130,29 +391,7 @@ namespace Opm { namespace data {
buffer.read(this->initPressure);
buffer.read(this->datumDepth);
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);
}
this->typeData.read(buffer);
}
}} // Opm::data

View File

@@ -28,7 +28,7 @@
#include <vector>
#include <opm/output/data/GuideRateValue.hpp>
#include <opm/json/JsonObject.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Group/Group.hpp>
namespace Opm { namespace data {
@@ -54,6 +54,12 @@ 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 {
@@ -79,6 +85,14 @@ 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 {
@@ -104,6 +118,15 @@ 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 {
@@ -125,6 +148,10 @@ 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 {
@@ -158,6 +185,26 @@ namespace Opm { namespace data {
this->nodeData.clear();
}
void init_json(Json::JsonObject& json_data) const {
auto group_data = json_data.add_object("group_data");
for (const auto& [gname, gdata] : this->groupData) {
auto group_json_data = group_data.add_object(gname);
gdata.init_json( group_json_data );
}
auto node_data = json_data.add_object("node_data");
for (const auto& [gname, ndata] : this->nodeData) {
auto node_json_data = node_data.add_object(gname);
ndata.init_json( node_json_data );
}
}
Json::JsonObject json() const {
Json::JsonObject json_data;
this->init_json(json_data);
return json_data;
}
private:
template <class MessageBufferType, class ValueType>
void writeMap(const std::map<std::string, ValueType>& map,

View File

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

View File

@@ -30,8 +30,8 @@
#include <unordered_map>
#include <vector>
#include <opm/json/JsonObject.hpp>
#include <opm/output/data/GuideRateValue.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Well/Well.hpp>
namespace Opm {
@@ -69,7 +69,9 @@ namespace Opm {
well_potential_oil = (1 << 15),
well_potential_gas = (1 << 16),
brine = (1 << 17),
alq = (1 << 18)
alq = (1 << 18),
tracer = (1 << 19),
micp = (1 << 20)
};
using enum_size = std::underlying_type< opt >::type;
@@ -83,10 +85,12 @@ 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;
@@ -98,9 +102,12 @@ 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 );
@@ -123,6 +130,8 @@ 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 {
@@ -155,6 +164,8 @@ 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 {
@@ -197,7 +208,7 @@ namespace Opm {
private:
constexpr static std::size_t numvals = 5;
std::array<double, numvals> values_;
std::array<double, numvals> values_ = {0};
std::size_t index(const Value ix) const
{
@@ -242,6 +253,19 @@ 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;
@@ -250,17 +274,17 @@ namespace Opm {
};
struct Well {
Rates rates;
double bhp;
double thp;
double temperature;
int control;
Rates rates{};
double bhp{0.0};
double thp{0.0};
double temperature{0.0};
int control{0};
::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;
@@ -269,6 +293,8 @@ 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() ,
@@ -308,7 +334,7 @@ namespace Opm {
};
class WellRates : public std::map<std::string , Well> {
class Wells: public std::map<std::string , Well> {
public:
double get(const std::string& well_name , Rates::opt m) const {
@@ -318,6 +344,12 @@ 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 );
@@ -359,9 +391,22 @@ namespace Opm {
this->emplace(name, well);
}
}
};
using Wells = WellRates;
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;
}
};
/* IMPLEMENTATIONS */
@@ -386,8 +431,29 @@ 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 ) |
@@ -418,7 +484,9 @@ namespace Opm {
well_potential_oil == rate.well_potential_oil &&
well_potential_gas == rate.well_potential_gas &&
brine == rate.brine &&
alq == rate.alq;
alq == rate.alq &&
tracer == rate.tracer &&
micp == rate.micp;
}
@@ -452,6 +520,9 @@ 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(
@@ -461,12 +532,36 @@ 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) ||
@@ -500,6 +595,14 @@ 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>
@@ -515,6 +618,21 @@ 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);
@@ -588,9 +706,20 @@ 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);
@@ -667,6 +796,27 @@ namespace Opm {
this->guide_rates.read(buffer);
}
void Well::init_json(Json::JsonObject& json_data) const {
auto json_connections = json_data.add_array("connections");
for (const auto& conn : this->connections) {
auto json_conn = json_connections.add_object();
conn.init_json(json_conn);
}
auto json_rates = json_data.add_object("rates");
this->rates.init_json(json_rates);
json_data.add_item("bhp", this->bhp);
json_data.add_item("thp", this->thp);
json_data.add_item("temperature", this->temperature);
json_data.add_item("status", ::Opm::Well::Status2String(this->dynamicStatus));
auto json_control = json_data.add_object("control");
this->current_control.init_json(json_control);
auto json_guiderate = json_data.add_object("guiderate");
this->guide_rates.init_json(json_guiderate);
}
}} // Opm::data
#endif //OPM_OUTPUT_WELLS_HPP

View File

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

View File

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

View File

@@ -34,7 +34,7 @@ namespace Opm {
} // Opm
namespace Opm { namespace data {
class WellRates;
class Wells;
}}
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::WellRates& xw,
const Opm::data::Wells& xw,
const Opm::SummaryState& summary_state,
const std::size_t sim_step);

View File

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

View File

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

View File

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

View File

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

View File

@@ -33,13 +33,14 @@ namespace Opm {
class Schedule;
class SummaryState;
class UnitSystem;
class WellTestState;
namespace Action {
class State;
}
} // Opm
namespace Opm { namespace data {
class WellRates;
class Wells;
}} // Opm::data
namespace Opm { namespace RestartIO { namespace Helpers {
@@ -49,16 +50,17 @@ 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::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::WellTestState& wtest_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::WellRates& xw,
const Opm::data::Wells& xw,
const Opm::SummaryState& smry);
/// Retrieve Integer Well Data Array.

View File

@@ -46,6 +46,7 @@ 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
@@ -60,7 +61,10 @@ public:
EclipseIO( const EclipseState& es,
EclipseGrid grid,
const Schedule& schedule,
const SummaryConfig& summary_config);
const SummaryConfig& summary_config,
const std::string& basename = "",
const bool writeEsmry = false
);
@@ -176,6 +180,7 @@ public:
*/
void writeTimeStep( const Action::State& action_state,
const WellTestState& wtest_state,
const SummaryState& st,
const UDQState& udq_state,
int report_step,
@@ -232,7 +237,6 @@ public:
private:
class Impl;
std::unique_ptr< Impl > impl;
};
} // namespace Opm

View File

@@ -40,13 +40,19 @@ 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 three enum
// values PressurePV, HydroCarbonPV and PressureHydroCarbonPV 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 enum values PressurePV, HydroCarbonPV, PressureHydroCarbonPV,
// and DynamicPoreVolume are *not* included in the return value from
// phases().
PressurePV = 8,
HydroCarbonPV = 9,
PressureHydroCarbonPV = 10
PressureHydroCarbonPV = 10,
DynamicPoreVolume = 11,
WaterResVolume = 12,
OilResVolume = 13,
GasResVolume = 14,
SALT = 15,
};
/*

View File

@@ -1,4 +1,5 @@
/*
Copyright 2021 Equinor ASA.
Copyright 2016, 2017, 2018 Statoil ASA.
This file is part of the Open Porous Media Project (OPM).
@@ -25,12 +26,15 @@
#include <memory>
#include <vector>
namespace Opm {
class EclipseGrid;
class EclipseState;
class UnitSystem;
namespace RestartIO {
}
namespace Opm { namespace RestartIO {
class InteHEAD
{
@@ -132,6 +136,51 @@ 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;
@@ -148,13 +197,16 @@ 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);
@@ -179,11 +231,12 @@ namespace RestartIO {
std::vector<int> data_;
};
std::time_t makeUTCTime(const std::tm& timePoint);
InteHEAD::TimePoint
getSimulationTimePoint(const std::time_t start,
const double elapsed);
InteHEAD::AquiferDims
inferAquiferDimensions(const EclipseState& es);
}} // Opm::RestartIO
#endif // OPM_INTEHEAD_HEADER_INCLUDED

View File

@@ -26,7 +26,9 @@
#include <opm/output/eclipse/RestartValue.hpp>
#include <opm/output/eclipse/AggregateAquiferData.hpp>
#include <optional>
#include <string>
#include <utility>
#include <vector>
@@ -38,6 +40,7 @@ namespace Opm {
class Schedule;
class UDQState;
class SummaryState;
class WellTestState;
} // namespace Opm
@@ -76,17 +79,19 @@ 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 SummaryState& sumState,
const UDQState& udqState,
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 WellTestState& wtest_state,
const SummaryState& sumState,
const UDQState& udqState,
std::optional<Helpers::AggregateAquiferData>& aquiferData,
bool write_double = false);
RestartValue load(const std::string& filename,

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,4 +1,5 @@
/*
Copyright (c) 2021 Equinor ASA
Copyright (c) 2019 Equinor ASA
This file is part of the Open Porous Media project (OPM).
@@ -26,42 +27,112 @@ namespace Opm { namespace RestartIO { namespace Helpers { namespace VectorItems
namespace IAnalyticAquifer {
enum index : std::vector<int>::size_type {
NumAquiferConn = 0,
WatPropTable = 1,
NumAquiferConn = 0, // Number of active aquifer connections for this aquifer
WatPropTable = 1, // PVT number (ACUCT(10) or AQUFETP(7))
TypeRelated1 = 9,
TypeRelated2 = 10,
CTInfluenceFunction = 9, // AQUCT(11)
TypeRelated1 = 10, // =1 for CT, =0 for FETP
Unknown_1 = 11, // Unknown item. =1 in all cases seen thus far.
};
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,
Compressibility = 0, // Total aquifer compressibility (AQUCT(6), AQUFETP(5))
FetInitVol = 1,
FetProdIndex = 2,
FetTimeConstant = 3,
FetInitVol = 1, // Initial aquifer volume (AQUFETP(4))
FetProdIndex = 2, // Aquifer productivity index (AQUFETP(6))
FetTimeConstant = 3, // Fetkovich Aquifer time constant (Compressibility * InitVol / ProdIndex)
CTRadius = 1,
CTPermeability = 2,
CTPorosity = 3,
CTRadius = 1, // CT aquifer external radius (AQUCT(7))
CTPermeability = 2, // CT aquifer permeability (AQUCT(4))
CTPorosity = 3, // CT aquifer porosity (AQUCT(5))
InitPressure = 4,
DatumDepth = 5,
InitPressure = 4, // Initial aquifer pressure (AQUCT(3), AQUFETP(3))
DatumDepth = 5, // Aquifer datum depth (AQUCT(2), AQUFETP(2))
CTThickness = 6,
CTAngle = 7,
CTWatMassDensity = 8,
CTWatViscosity = 9,
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
};
} // 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,
Pressure = 1, // Dynamic aquifer pressure
ProdVolume = 2, // Liquid volume produced from aquifer (into reservoir)
TotalArea = 3,
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)
};
} // XAnalyticAquifer

View File

@@ -56,12 +56,18 @@ 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,
GInjCMode = 21,
WInjActiveCMode = 16,
WInjHighLevCtrl = 17,
GConInjeWInjCMode = 19,
GInjActiveCMode = 21,
GInjHighLevCtrl = 22,
GConInjeGInjCMode = 24,
GroupType = 26,
GroupLevel = 27,
ParentGroup = 28,
@@ -75,6 +81,7 @@ namespace Opm { namespace RestartIO { namespace Helpers { namespace VectorItems
Water = 2,
Gas = 3,
Liquid = 4,
Resv = 6, // need to be verified!!!
Potn = 7,
Form = 8,
Comb = 9,

View File

@@ -69,6 +69,7 @@ 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
@@ -123,6 +124,7 @@ 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
@@ -139,13 +141,22 @@ 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_AQUIFERS = 252, // Maximum number of analytic aquifers
MAX_AN_AQUIFER_ID = 252, // Maximum aquifer ID of all analytic aquifers (<= AQUDIMS(5))
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,
@@ -155,6 +166,14 @@ namespace Opm { namespace RestartIO { namespace Helpers { namespace VectorItems
ISECND = 410 // ISECND = current simulation time HH:MM:SS - number of seconds (SS), reported in microseconds
// (0-59,999,999)
};
namespace InteheadValues {
enum LiftOpt : int {
NotActive = 0, // Gas lift not enabled (LIFTOPT not present)
FirstIterationOnly = 1, // Optimise gas lift in first Newton iteration only (LIFTOPT(4) = NO)
EachNupCol = 2, // Optimise gas lift in each of first NUPCOL Newton iterations (LIFTOPT(4) = YES)
};
} // InteheadValues
}}}} // Opm::RestartIO::Helpers::VectorItems
#endif // OPM_OUTPUT_ECLIPSE_VECTOR_INTEHEAD_HPP

View File

@@ -45,6 +45,9 @@ 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
@@ -141,6 +144,7 @@ namespace Opm { namespace RestartIO { namespace Helpers { namespace VectorItems
Open = 1,
Auto = 3,
};
} // Value
} // IWell
@@ -162,8 +166,10 @@ namespace Opm { namespace RestartIO { namespace Helpers { namespace VectorItems
DrainageRadius = 17, // Well's drainage radius - item 7 from WELSPECS
EfficiencyFactor1 = 24, // Item2 from WEFAC; this value is repeated at two locations.
EfficiencyFactor2 = 31, // Item2 from WEFAC
WTestInterval = 32,
HistLiqRateTarget = 33, // Well's historical/observed liquid
// rate target/limit
WTestStartupTime = 39,
HistGasRateTarget = 54, // Well's historical/observed gas rate
// target/limit

View File

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

View File

@@ -30,7 +30,7 @@ namespace Opm {
namespace Opm { namespace data {
class WellRates;
class Wells;
}} // 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::WellRates& wellSol,
const ::Opm::data::Wells& wellSol,
::Opm::EclIO::OutputStream::RFT& rftFile);
}} // namespace Opm::RftIO

View File

@@ -33,6 +33,7 @@ namespace Opm {
class Well;
class UnitSystem;
class UDQActive;
class Actdims;
} // Opm
@@ -62,9 +63,26 @@ 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>
createActionxDims( const Runspec& rspec,
const Schedule& sched,
createActionRSTDims(const Schedule& sched,
const std::size_t simStep);
}}} // Opm::RestartIO::Helpers

View File

@@ -23,9 +23,11 @@
#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>
@@ -68,6 +70,8 @@ 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 {
@@ -122,11 +126,13 @@ 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();
@@ -145,10 +151,14 @@ namespace Opm {
void selectActiveUnitSystem( UnitSystem::UnitType unit_type );
const std::string& getInputPath() const;
const std::string& getDataFile() 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 ;
@@ -174,8 +184,9 @@ namespace Opm {
UnitSystem defaultUnits;
std::unique_ptr<UnitSystem> activeUnits;
std::string m_dataFile;
std::optional<std::string> m_dataFile;
std::string input_path;
DeckTree file_tree;
mutable std::size_t unit_system_access_count = 0;
};
}

View File

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

View File

@@ -22,18 +22,16 @@
#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:
@@ -56,10 +54,13 @@ namespace Opm {
size_t size() const;
bool empty() const;
void addRecord(DeckRecord&& record);
const DeckRecord& getRecord(size_t index) const;
DeckRecord& getRecord(size_t index);
const DeckRecord& getDataRecord() const;
const DeckRecord& operator[](std::size_t index) const;
DeckRecord& operator[](std::size_t index);
void setDataKeyword(bool isDataKeyword = true);
void setDoubleRecordKeyword(bool isDoubleRecordKeyword = true);
bool isDataKeyword() const;

View File

@@ -28,6 +28,13 @@ 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( );
@@ -35,17 +42,13 @@ namespace Opm {
void start_record( );
void end_record( );
void start_keyword(const std::string& kw);
void start_keyword(const std::string& kw, bool split_line);
void end_keyword(bool add_slash);
void endl();
void write_string(const std::string& s);
template <typename T> void write(const T& value);
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;
format fmt;
private:
std::ostream& os;
size_t default_count;

View File

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

View File

@@ -0,0 +1,71 @@
/*
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 */

View File

@@ -0,0 +1,161 @@
/*
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 FILE_DECK_HPP
#define FILE_DECK_HPP
#include <optional>
#include <string>
#include <unordered_set>
#include <fstream>
#include <iostream>
#include <fmt/format.h>
#include <opm/parser/eclipse/Deck/DeckKeyword.hpp>
#include <opm/parser/eclipse/Deck/FileDeck.hpp>
#include <opm/common/utility/FileSystem.hpp>
namespace fs = Opm::filesystem;
namespace Opm {
class Deck;
class FileDeck {
public:
static const std::unordered_set<std::string> rst_keep_in_solution;
enum class OutputMode {
INLINE = 1,
SHARE = 2,
COPY = 3
};
struct Index {
std::size_t file_index;
std::size_t keyword_index;
Index(std::size_t file_index_arg, std::size_t keyword_index_arg, const FileDeck* deck_arg)
: file_index(file_index_arg)
, keyword_index(keyword_index_arg)
, deck(deck_arg)
{}
Index& operator--();
Index operator--(int);
Index& operator++();
Index operator++(int);
bool operator==(const Index& other) const;
bool operator!=(const Index& other) const;
bool operator<(const Index& other) const;
private:
const FileDeck * deck;
};
class Block {
public:
explicit Block(const std::string& filename);
std::size_t size() const;
void load(const Deck& deck, std::size_t deck_index);
std::optional<std::size_t> find(const std::string& keyword) const;
bool empty() const;
void erase(const FileDeck::Index& index);
void insert(std::size_t keyword_index, const DeckKeyword& keyword);
void dump(DeckOutput& out) const;
private:
std::string fname;
std::vector<DeckKeyword> keywords;
friend FileDeck;
};
explicit FileDeck(const Deck& deck);
std::optional<Index> find(const std::string& keyword) const;
void erase(const Index& index);
void erase(const Index& begin, const Index& end);
void insert(const Index& index, const DeckKeyword& keyword);
void dump_stdout(const std::string& output_dir, OutputMode mode) const;
void dump(const std::string& dir, const std::string& fname, OutputMode mode) const;
const DeckKeyword& operator[](const Index& index) const;
const Index start() const;
const Index stop() const;
void rst_solution(const std::string& rst_base, int report_step);
void insert_skiprest();
private:
std::vector<Block> blocks;
std::string input_directory;
std::unordered_set<std::string> modified_files;
DeckTree deck_tree;
struct DumpContext {
std::unordered_map<std::string, std::ofstream> stream_map;
std::unordered_map<std::string, std::string> file_map;
bool has_file(const std::string& fname) const {
return this->file_map.count(fname) > 0;
}
std::optional<std::ofstream *> get_stream(const std::string& deck_name) {
auto name_iter = this->file_map.find(deck_name);
if (name_iter == this->file_map.end())
return {};
return &this->stream_map.at(name_iter->second);
}
std::ofstream& open_file(const std::string& deck_name, const fs::path& output_file)
{
if (this->stream_map.count(output_file.string()) == 0) {
this->file_map.insert(std::make_pair( deck_name, output_file.string() ));
if (!fs::is_directory(output_file.parent_path()))
fs::create_directories(output_file.parent_path());
std::ofstream stream{output_file};
if (!stream)
throw std::logic_error(fmt::format("Opening {} for writing failed", output_file.string()));
this->stream_map.insert(std::make_pair(output_file.string(), std::move(stream)));
}
return this->stream_map.at(output_file.string());
}
};
void dump(std::ostream& os) const;
void dump_shared(std::ostream& stream, const std::string& output_dir) const;
void dump_inline() const;
std::string dump_block(const Block& block, const std::string& dir, const std::optional<std::string>& fname, DumpContext& context) const;
void include_block(const std::string& source_file, const std::string& target_file, const std::string& dir, DumpContext& context) const;
};
}
#endif

View File

@@ -17,8 +17,11 @@
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef IMPORT_CONTAINER_HPP
#define IMPORT_CONTAINER_HPP
#include <cstddef>
#include <string>
#include <vector>
#include <opm/parser/eclipse/Deck/DeckKeyword.hpp>
@@ -27,6 +30,7 @@
namespace Opm {
class Parser;
class UnitSystem;
class ImportContainer {
public:
@@ -40,3 +44,5 @@ private:
}
#endif // IMPORT_CONTAINER_HPP

View File

@@ -37,6 +37,10 @@ namespace Opm {
class Deck;
}
namespace Opm { namespace RestartIO {
class RstAquifer;
}} // Opm::RestartIO
namespace Opm {
class Aquancon {
@@ -82,10 +86,12 @@ namespace Opm {
}
};
Aquancon() = default;
Aquancon(const EclipseGrid& grid, const Deck& deck);
Aquancon(const std::unordered_map<int, std::vector<Aquancon::AquancCell>>& data);
explicit Aquancon(const std::unordered_map<int, std::vector<Aquancon::AquancCell>>& data);
void pruneDeactivatedAquiferConnections(const std::vector<std::size_t>& deactivated_cells);
void loadFromRestart(const RestartIO::RstAquifer& rst_aquifers);
static Aquancon serializeObject();

View File

@@ -25,88 +25,110 @@
This includes the logic for parsing as well as the associated tables. It is meant to be used by opm-grid and opm-simulators in order to
implement the Carter Tracy analytical aquifer model in OPM Flow.
*/
#include <opm/parser/eclipse/Parser/ParserKeywords/A.hpp>
#include <opm/parser/eclipse/Deck/Deck.hpp>
#include <opm/parser/eclipse/Deck/DeckItem.hpp>
#include <opm/parser/eclipse/Deck/DeckRecord.hpp>
#include <opm/parser/eclipse/Deck/DeckKeyword.hpp>
#include <opm/parser/eclipse/Units/UnitSystem.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/Aqudims.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/TableContainer.hpp>
#include <opm/parser/eclipse/EclipseState/Tables/AqutabTable.hpp>
#include <cstddef>
#include <optional>
#include <vector>
namespace Opm {
class Deck;
class DeckRecord;
class TableManager;
}
namespace Opm { namespace RestartIO {
class RstAquifer;
}} // Opm::RestartIO
namespace Opm {
class AquiferCT {
public:
struct AQUCT_data{
struct AQUCT_data
{
friend class AquiferCT;
AQUCT_data(const DeckRecord& record, const TableManager& tables);
AQUCT_data() = default;
AQUCT_data(int aqID,
int infID,
int pvtID,
double phi_aq_,
double d0_,
double C_t_,
double r_o_,
double k_a_,
double c1_,
double h_,
double theta_,
double c2_,
const std::pair<bool, double>& p0_,
const std::vector<double>& td_,
const std::vector<double>& pi_);
AQUCT_data(const DeckRecord& record, const TableManager& tables);
AQUCT_data(const int aqID,
const int infID,
const int pvtID,
const double phi_aq_,
const double d0_,
const double C_t_,
const double r_o_,
const double k_a_,
const double h_,
const double theta_,
const double p0_,
const double T0_);
int aquiferID;
int inftableID, pvttableID;
int aquiferID{};
int inftableID{};
int pvttableID{};
double phi_aq , // aquifer porosity
d0, // aquifer datum depth
C_t , // total compressibility
r_o , // aquifer inner radius
k_a , // aquifer permeability
c1, // 0.008527 (METRIC, PVT-M); 0.006328 (FIELD); 3.6 (LAB)
h , // aquifer thickness
theta , // angle subtended by the aquifer boundary
c2 ; // 6.283 (METRIC, PVT-M); 1.1191 (FIELD); 6.283 (LAB).
double porosity{};
double datum_depth{};
double total_compr{};
double inner_radius{};
double permeability{};
double thickness{};
double angle_fraction{};
std::pair<bool, double> p0; //Initial aquifer pressure at datum depth, d0
std::vector<double> td, pi;
std::optional<double> initial_pressure{};
std::optional<double> initial_temperature{};
std::vector<double> dimensionless_time{};
std::vector<double> dimensionless_pressure{};
static AQUCT_data serializeObject();
double timeConstant() const { return this->time_constant_; }
double influxConstant() const { return this->influx_constant_; }
double waterDensity() const { return this->water_density_; }
double waterViscosity() const { return this->water_viscosity_; }
bool operator==(const AQUCT_data& other) const;
void finishInitialisation(const TableManager& tables);
template<class Serializer>
void serializeOp(Serializer& serializer)
{
serializer(aquiferID);
serializer(inftableID);
serializer(pvttableID);
serializer(phi_aq);
serializer(d0);
serializer(C_t);
serializer(r_o);
serializer(k_a);
serializer(c1);
serializer(h);
serializer(theta);
serializer(c2);
serializer(p0);
serializer(td);
serializer(pi);
serializer(this->aquiferID);
serializer(this->inftableID);
serializer(this->pvttableID);
serializer(this->porosity);
serializer(this->datum_depth);
serializer(this->total_compr);
serializer(this->inner_radius);
serializer(this->permeability);
serializer(this->thickness);
serializer(this->angle_fraction);
serializer(this->initial_pressure);
serializer(this->initial_temperature);
serializer(this->dimensionless_time);
serializer(this->dimensionless_pressure);
serializer(this->time_constant_);
serializer(this->influx_constant_);
serializer(this->water_density_);
serializer(this->water_viscosity_);
}
private:
double time_constant_{};
double influx_constant_{};
double water_density_{};
double water_viscosity_{};
};
AquiferCT() = default;
AquiferCT(const TableManager& tables, const Deck& deck);
AquiferCT(const std::vector<AquiferCT::AQUCT_data>& data);
void loadFromRestart(const RestartIO::RstAquifer& rst,
const TableManager& tables);
static AquiferCT serializeObject();
std::size_t size() const;

View File

@@ -25,12 +25,21 @@
#include <opm/parser/eclipse/EclipseState/Aquifer/AquiferCT.hpp>
#include <opm/parser/eclipse/EclipseState/Aquifer/NumericalAquifer/NumericalAquifers.hpp>
namespace Opm {
#include <cstddef>
#include <vector>
class TableManager;
class EclipseGrid;
class Deck;
class FieldPropsManager;
namespace Opm {
class TableManager;
class EclipseGrid;
class Deck;
class FieldPropsManager;
} // namespace Opm
namespace Opm { namespace RestartIO {
class RstAquifer;
}} // namespace Opm::RestartIO
namespace Opm {
class AquiferConfig {
public:
@@ -40,6 +49,9 @@ public:
AquiferConfig(const Aquifetp& fetp, const AquiferCT& ct, const Aquancon& conn);
void load_connections(const Deck& deck, const EclipseGrid& grid);
void pruneDeactivatedAquiferConnections(const std::vector<std::size_t>& deactivated_cells);
void loadFromRestart(const RestartIO::RstAquifer& aquifers,
const TableManager& tables);
static AquiferConfig serializeObject();
@@ -53,6 +65,7 @@ public:
bool hasNumericalAquifer() const;
bool hasAnalyticalAquifer() const;
const NumericalAquifers& numericalAquifers() const;
NumericalAquifers& mutableNumericalAquifers() const;
template<class Serializer>
void serializeOp(Serializer& serializer)
@@ -64,12 +77,14 @@ public:
}
private:
Aquifetp aquifetp;
AquiferCT aquiferct;
NumericalAquifers numerical_aquifers;
Aquancon aqconn;
Aquifetp aquifetp{};
AquiferCT aquiferct{};
mutable NumericalAquifers numerical_aquifers{};
Aquancon aqconn{};
};
std::vector<int> analyticAquiferIDs(const AquiferConfig& cfg);
std::vector<int> numericAquiferIDs(const AquiferConfig& cfg);
}
#endif

View File

@@ -25,47 +25,87 @@
This includes the logic for parsing as well as the associated tables. It is meant to be used by opm-grid and opm-simulators in order to
implement the Fetkovich analytical aquifer model in OPM Flow.
*/
#include <cstddef>
#include <optional>
#include <vector>
namespace Opm {
class Deck;
class DeckRecord;
class TableManager;
}
namespace Opm { namespace RestartIO {
class RstAquifer;
}} // Opm::RestartIO
namespace Opm {
class Deck;
class DeckRecord;
class Aquifetp {
public:
struct AQUFETP_data{
AQUFETP_data(const DeckRecord& record);
struct AQUFETP_data
{
friend class Aquifetp;
AQUFETP_data() = default;
AQUFETP_data(int aquiferID_, int pvttableID_, double J_, double C_t_, double V0_, double d0_, const std::pair<bool, double>& p0_);
AQUFETP_data(const DeckRecord& record, const TableManager& tables);
AQUFETP_data(const int aquiferID_,
const int pvttableID_,
const double J_,
const double C_t_,
const double V0_,
const double d0_,
const double p0_);
int aquiferID{};
int pvttableID{};
double prod_index{};
double total_compr{};
double initial_watvolume{};
double datum_depth{};
std::optional<double> initial_pressure{};
static AQUFETP_data serializeObject();
double timeConstant() const { return this->time_constant_; }
double waterDensity() const { return this->water_density_; }
double waterViscosity() const { return this->water_viscosity_; }
bool operator==(const AQUFETP_data& other) const;
int aquiferID;
int pvttableID;
double J, // Specified Productivity Index
C_t, // total rock compressibility
V0, // initial volume of water in aquifer
d0; // aquifer datum depth
std::pair<bool, double> p0;
void finishInitialisation(const TableManager& tables);
template<class Serializer>
void serializeOp(Serializer& serializer)
{
serializer(aquiferID);
serializer(pvttableID);
serializer(J);
serializer(C_t);
serializer(V0);
serializer(d0);
serializer(p0);
serializer(this->aquiferID);
serializer(this->pvttableID);
serializer(this->prod_index);
serializer(this->total_compr);
serializer(this->initial_watvolume);
serializer(this->datum_depth);
serializer(this->initial_pressure);
serializer(this->time_constant_);
serializer(this->water_density_);
serializer(this->water_viscosity_);
}
private:
double time_constant_{};
double water_density_{};
double water_viscosity_{};
};
Aquifetp() = default;
Aquifetp(const Deck& deck);
Aquifetp(const std::vector<Aquifetp::AQUFETP_data>& data);
Aquifetp(const TableManager& tables, const Deck& deck);
explicit Aquifetp(const std::vector<Aquifetp::AQUFETP_data>& data);
void loadFromRestart(const RestartIO::RstAquifer& rst,
const TableManager& tables);
static Aquifetp serializeObject();

View File

@@ -20,6 +20,7 @@
#ifndef OPM_NUMERICALAQUIFERCELL_HPP
#define OPM_NUMERICALAQUIFERCELL_HPP
#include <cstddef>
#include <optional>
namespace Opm {
@@ -28,19 +29,20 @@ namespace Opm {
class FieldPropsManager;
struct NumericalAquiferCell {
NumericalAquiferCell(const DeckRecord&, const EclipseGrid&, const FieldPropsManager&);
NumericalAquiferCell(const std::size_t record_id_, const DeckRecord&, const EclipseGrid&, const FieldPropsManager&);
NumericalAquiferCell() = default;
size_t aquifer_id;
size_t I, J, K;
double area;
double length;
double porosity;
double permeability;
double depth;
std::optional<double> init_pressure;
int pvttable;
int sattable;
size_t global_index;
std::size_t aquifer_id{};
std::size_t I{}, J{}, K{};
double area{};
double length{};
double porosity{};
double permeability{};
double depth{};
std::optional<double> init_pressure{};
int pvttable{};
int sattable{};
std::size_t global_index{};
std::size_t record_id{};
double cellVolume() const;
double poreVolume() const;
@@ -62,6 +64,7 @@ namespace Opm {
serializer(this->pvttable);
serializer(this->sattable);
serializer(this->global_index);
serializer(this->record_id);
}
};
}

View File

@@ -65,9 +65,11 @@ namespace Opm {
serializer(this->ve_frac_cappress);
}
static std::map<size_t, std::map<size_t, NumericalAquiferConnection>> generateConnections(const Deck& deck, const EclipseGrid& grid);
static std::map<size_t, std::map<size_t, NumericalAquiferConnection>>
generateConnections(const Deck& deck, const EclipseGrid& grid);
private:
static std::vector<NumericalAquiferConnection> connectionsFromSingleRecord(const EclipseGrid& grid, const DeckRecord& record);
static std::vector<NumericalAquiferConnection>
connectionsFromSingleRecord(const EclipseGrid& grid, const DeckRecord& record);
};
}

View File

@@ -20,8 +20,10 @@
#ifndef OPM_NUMERICALAQUIFERS_HPP
#define OPM_NUMERICALAQUIFERS_HPP
#include <unordered_map>
#include <map>
#include <unordered_map>
#include <stddef.h>
#include <opm/parser/eclipse/EclipseState/Aquifer/NumericalAquifer/SingleNumericalAquifer.hpp>
@@ -36,6 +38,7 @@ namespace Opm {
NumericalAquifers() = default;
NumericalAquifers(const Deck& deck, const EclipseGrid& grid, const FieldPropsManager& field_props);
int numRecords() const { return static_cast<int>(this->m_num_records); }
size_t size() const;
bool hasAquifer(size_t aquifer_id) const;
const SingleNumericalAquifer& getAquifer(size_t aquifer_id) const;
@@ -46,22 +49,27 @@ namespace Opm {
std::unordered_map<size_t, double> aquiferCellVolumes() const;
std::vector<NNCdata> aquiferNNCs(const EclipseGrid& grid, const FieldPropsManager& fp) const;
std::vector<NNCdata> aquiferCellNNCs() const;
std::vector<NNCdata> aquiferConnectionNNCs(const EclipseGrid& grid, const FieldPropsManager& fp) const;
std::unordered_map<size_t, AquiferCellProps> aquiferCellProps() const;
void initConnections(const Deck& deck, const EclipseGrid& grid);
void postProcessConnections(const EclipseGrid& grid, const std::vector<int>& actnum);
static NumericalAquifers serializeObject();
template <class Serializer>
void serializeOp(Serializer& serializer)
{
serializer.map(this->m_aquifers);
serializer(this->m_num_records);
}
private:
std::map<size_t, SingleNumericalAquifer> m_aquifers;
std::map<size_t, SingleNumericalAquifer> m_aquifers{};
size_t m_num_records{0};
void addAquiferCell(const NumericalAquiferCell& aqu_cell);
void addAquiferConnections(const Deck &deck, const EclipseGrid &grid);
};
}

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