Compare commits

...

28 Commits

Author SHA1 Message Date
Atgeirr Flø Rasmussen
c72d2bf460
Merge pull request #2092 from OPM/fix/add-std-includes
add missing includes of standard library headers
2020-11-06 13:29:22 +01:00
Bernd Flemisch
dfddff0562 add missing includes of standard library headers 2020-11-06 09:56:05 +01:00
Joakim Hove
1371b5706d Bump version to 2020.04 final 2020-05-14 12:46:39 +02:00
Joakim Hove
b571dd9d66 Bump version to rc4 2020-05-08 10:39:27 +02:00
Joakim Hove
ad746440e0 Use string based parent *name* in GTNode instead of pointer 2020-05-08 10:23:54 +02:00
Markus Blatt
2bae3b2300 Quietly searcg for OpenMP in opm-common-prereqs.cmake 2020-04-30 12:17:56 +02:00
Markus Blatt
75a2a7e0ee Mark OpenMP as prerequisite for opm-common
to automatically trigger find_package(OpenMP) in downstream
modules (e.g. Dumux)
2020-04-30 12:17:50 +02:00
Arne Morten Kvarving
917fc523ad changed: remove multiarch-support predepends
no longer required in ubuntu bionic, and breaks ubuntu focal,
and in any case it is support by both platforms.
2020-04-30 10:25:58 +02:00
Joakim Hove
28e492ecb9 Bump version to 2020.04-rc3 2020-04-29 16:44:26 +02:00
Joakim Hove
ec1c315968 Python files should go in $PREFIX/dist-packages on debian 2020-04-29 10:49:49 +02:00
Joakim Hove
cf72ef0330 Remove unused function from Group output data 2020-04-29 10:43:03 +02:00
Markus Blatt
10a3bc4b56 Find Zoltan only if MPI is available.
Otherwise we experience compilation errors if OPM is configured with
deactivated MPI and activated and found dune-alugrid (cpmpile error
that mpi.h is not found). This commit fixes this for me.
2020-04-28 14:51:46 +02:00
Joakim Hove
8b4d8f1734 Remove unsupported E300 keywords 2020-04-27 19:22:15 +02:00
Markus Blatt
7cea357930 Use OpenMP::OpenMP_CXX target when linking libopmcommon
This should allow downstream to automatically use the correct
compile and linke flags for CMake > 3.9. For older versions
we fall back to the old approach.

Closes #1751
2020-04-27 16:09:42 +02:00
OPMUSER
720fb8dcab Add PVTGW, PVTGWO and RWGSALT
Will also add to Missing Features.
2020-04-27 13:00:12 +02:00
OPMUSER
8e56b44201 Update keyword_list.cmake with PERMFACT
Update keyword_list.cmake with PERMFACT
2020-04-27 13:00:04 +02:00
OPMUSER
b14c5fc1a9 Rename PERMRED to PERMFACT
As per TNO rename PERMRED to PERMFACT to match documentation.
2020-04-27 13:00:00 +02:00
Joakim Hove
565d6b76dc Use ESmry::loadData() to preload all summary vectors 2020-04-27 12:58:41 +02:00
Joakim Hove
ac840312e7 Small fixes to RSM output
- MAI -> MAY
- Update text header with simulation time and flow version
- Make sure the YEARS column is always the first column on page 1
2020-04-27 12:58:37 +02:00
Joakim Hove
5e800ae2e7 Add keyword PRVD 2020-04-25 21:44:14 +02:00
Joakim Hove
2e0583cc74 Summary compare ESmry and ERsm - looser tolerance 2020-04-25 09:11:59 +02:00
OPMUSER
8365eaed0b Update keyword_list.cmake 2020-04-25 09:11:53 +02:00
OPMUSER
571582c881 Create HMMULTSG
Create HMMULTSG definition
2020-04-25 09:11:46 +02:00
Joakim Hove
6439ae1cea Unconditionally add YEARS to summary output 2020-04-25 09:11:40 +02:00
Joakim Hove
e796916057 Introduce time unit ecl_years == 365.25 days 2020-04-25 09:11:10 +02:00
Joakim Hove
63b663228a Bumped version to 2020.04-rc2 2020-04-23 10:33:41 +02:00
Joakim Hove
bf475b73b4 Segment sorting - check if already in order 2020-04-23 10:27:29 +02:00
Joakim Hove
1e734020f1 Update connections should hanlde empty list 2020-04-23 10:27:12 +02:00
38 changed files with 244 additions and 106 deletions

View File

@ -247,7 +247,11 @@ install(FILES etc/opm_bash_completion.sh.in DESTINATION share/opm/etc)
if (OPM_ENABLE_PYTHON)
# -------------------------------------------------------------------------
# 1: Wrap C++ functionality in Python
set(PYTHON_PACKAGE_PATH "site-packages")
if (EXISTS "/etc/debian_version")
set(PYTHON_PACKAGE_PATH "dist-packages")
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")
make_directory(${PROJECT_BINARY_DIR}/python)

View File

@ -16,6 +16,9 @@ if(ZOLTAN_ROOT)
set(ZOLTAN_NO_DEFAULT_PATH "NO_DEFAULT_PATH")
endif()
# We only need zoltan with MPI. Otherwise usage of alugrid is broken.
find_package(MPI)
# Make sure we have checked for the underlying partitioners.
find_package(PTScotch)
#find_package(ParMETIS)
@ -39,20 +42,23 @@ find_library(ZOLTAN_LIBRARIES
${ZOLTAN_NO_DEFAULT_PATH})
set (ZOLTAN_FOUND FALSE)
if (ZOLTAN_INCLUDE_DIRS OR ZOLTAN_LIBRARIES)
set(ZOLTAN_FOUND TRUE)
set (ZOLTAN_CONFIG_VAR HAVE_ZOLTAN)
# print a message to indicate status of this package
include (FindPackageHandleStandardArgs)
find_package_handle_standard_args(ZOLTAN
DEFAULT_MSG
ZOLTAN_LIBRARIES
ZOLTAN_INCLUDE_DIRS
MPI_FOUND
)
if (ZOLTAN_FOUND)
set(HAVE_ZOLTAN 1)
set(ZOLTAN_LIBRARIES ${ZOLTAN_LIBRARIES} ${PARMETIS_LIBRARIES} ${PTSCOTCH_LIBRARIES})
set(ZOLTAN_INCLUDE_DIRS ${ZOLTAN_INCLUDE_DIRS} ${PARMETIS_INCLUDE_DIRS}
${PTSCOTCH_INCLUDE_DIRS})
endif()
set (ZOLTAN_CONFIG_VAR HAVE_ZOLTAN)
# print a message to indicate status of this package
include (FindPackageHandleStandardArgs)
find_package_handle_standard_args(ZOLTAN
DEFAULT_MSG
ZOLTAN_LIBRARIES
ZOLTAN_INCLUDE_DIRS
)

View File

@ -5,6 +5,8 @@ is_compiler_gcc_compatible ()
include(TestCXXAcceptsFlag)
macro (opm_defaults opm)
message("Processing opm_defaults ${opm}")
# if we are installing a development version (default when checking out of
# VCS), then remember which directories were used when configuring. package
# distribution should disable this option.

View File

@ -42,7 +42,13 @@ macro (find_openmp opm)
# enabling OpenMP is supposedly enough to make the compiler link with
# the appropriate libraries
find_package (OpenMP ${${opm}_QUIET})
list (APPEND ${opm}_LIBRARIES ${OpenMP_LIBRARIES})
if(OpenMP_CXX_FOUND)
list (APPEND ${opm}_LIBRARIES OpenMP::OpenMP_CXX)
else()
list (APPEND ${opm}_LIBRARIES ${OpenMP_LIBRARIES})
endif()
if (OPENMP_FOUND)
add_options (C ALL_BUILDS "${OpenMP_C_FLAGS}")
add_options (CXX ALL_BUILDS "${OpenMP_CXX_FLAGS}")

2
debian/changelog vendored
View File

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

4
debian/control vendored
View File

@ -16,7 +16,7 @@ Vcs-Browser: https://github.com/OPM/opm-common
Package: libopm-common1
Section: libs
Pre-Depends: ${misc:Pre-Depends}, multiarch-support
Pre-Depends: ${misc:Pre-Depends}
Architecture: any
Multi-Arch: same
Depends: ${shlibs:Depends}, ${misc:Depends}
@ -56,7 +56,7 @@ Description: OPM common library -- documentation
Package: python3-opm-common
Section: libs
Pre-Depends: ${misc:Pre-Depends}, multiarch-support
Pre-Depends: ${misc:Pre-Depends}
Architecture: any
Multi-Arch: same
Depends: ${shlibs:Depends}, ${misc:Depends}, libopm-common1, python3-numpy, python3-decorator

View File

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

View File

@ -15,6 +15,7 @@ set (opm-common_DEPS
list(APPEND opm-common_DEPS
# various runtime library enhancements
"Boost 1.44.0 COMPONENTS system unit_test_framework REQUIRED"
"OpenMP QUIET"
)
find_package_deps(opm-common)

View File

@ -49,9 +49,6 @@ namespace Opm {
inline currentGroupConstraints& set( Opm::Group::ProductionCMode cpc,
Opm::Group::InjectionCMode cgic,
Opm::Group::InjectionCMode cwic);
inline bool has();
};
@ -110,12 +107,6 @@ namespace Opm {
return *this;
}
inline bool currentGroupConstraints::has() {
return ((&this->currentGasInjectionConstraint != nullptr) && (&this->currentGasInjectionConstraint != nullptr)
&& (&this->currentProdConstraint != nullptr));
}
}} // Opm::data
#endif //OPM_OUTPUT_GROUPS_HPP

View File

@ -17,6 +17,7 @@
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#include <optional>
#include <vector>
#include <opm/parser/eclipse/EclipseState/Schedule/Group/Group.hpp>
@ -29,7 +30,7 @@ namespace Opm {
class GTNode {
public:
GTNode(const Group& group, const GTNode* parent);
GTNode(const Group& group, std::size_t level, const std::optional<std::string>& parent_name);
void add_group(const GTNode& child_group);
void add_well(const Well& well);
@ -37,11 +38,13 @@ public:
const std::vector<Well>& wells() const;
const std::vector<GTNode>& groups() const;
const std::string& name() const;
const GTNode& parent() const;
const std::string& parent_name() const;
const Group& group() const;
private:
const Group m_group;
const GTNode * m_parent;
std::size_t m_level;
std::optional<std::string> m_parent_name;
/*
Class T with a stl container <T> - supposedly undefined behavior before
C++17 - but it compiles without warnings.

View File

@ -24,6 +24,7 @@
#include <map>
#include <utility>
#include <vector>
#include <string>
#include <opm/parser/eclipse/EclipseState/Schedule/MSW/icd.hpp>

View File

@ -23,6 +23,7 @@
#include <map>
#include <utility>
#include <vector>
#include <string>
#include <opm/parser/eclipse/EclipseState/Schedule/MSW/icd.hpp>

View File

@ -367,8 +367,7 @@ namespace Opm
const UnitSystem& unit_system);
DynamicState<std::shared_ptr<RPTConfig>> rpt_config;
GTNode groupTree(const std::string& root_node, std::size_t report_step, const GTNode * parent) const;
GTNode groupTree(const std::string& root_node, std::size_t report_step, std::size_t level, const std::optional<std::string>& parent_name) const;
void updateGroup(std::shared_ptr<Group> group, size_t reportStep);
bool checkGroups(const ParseContext& parseContext, ErrorGuard& errors);
void updateUDQActive( std::size_t timeStep, std::shared_ptr<UDQActive> udq );

View File

@ -101,11 +101,12 @@ namespace Opm {
/// \name Time
/// @{
constexpr const double second = 1;
constexpr const double minute = 60 * second;
constexpr const double hour = 60 * minute;
constexpr const double day = 24 * hour;
constexpr const double year = 365 * day;
constexpr const double second = 1;
constexpr const double minute = 60 * second;
constexpr const double hour = 60 * minute;
constexpr const double day = 24 * hour;
constexpr const double year = 365 * day;
constexpr const double ecl_year = 365.25 * day;
/// @}
/// \name Volume

View File

@ -5,7 +5,7 @@
%define tag final
Name: opm-common
Version: 2018.10
Version: 2020.04
Release: 0
Summary: Open Porous Media - common helpers and buildsystem
License: GPL-3.0

View File

@ -309,7 +309,10 @@ bool cmp(const ESmry& smry, const ERsm& rsm) {
const auto& smry_vector = smry.get(node);
const auto& rsm_vector = rsm.get(key);
for (std::size_t index = 0; index < smry_vector.size(); index++) {
if (!cmp::scalar_equal(static_cast<double>(smry_vector[index]), rsm_vector[index]))
const double diff = static_cast<double>(smry_vector[index]) - rsm_vector[index];
const double sum = std::fabs(static_cast<double>(smry_vector[index])) + std::fabs(rsm_vector[index]);
if (diff > 1e-5 * sum)
return false;
}
}

View File

@ -21,6 +21,7 @@
#include <algorithm>
#include <chrono>
#include <cmath>
#include <ctime>
#include <fstream>
#include <functional>
#include <iomanip>
@ -33,6 +34,8 @@
#include <opm/common/utility/TimeService.hpp>
#include <opm/io/eclipse/ESmry.hpp>
#include "project-version.h"
namespace {
constexpr std::size_t column_width { 8 } ;
@ -47,11 +50,20 @@ namespace {
// the fact that the dashed header line has 127 rather than 130 dashes has no provenance
const std::string divider_line { std::string(total_width - 3, '-') } ;
const std::string block_header_line(const std::string& run_name, const std::string& comment) {
return "SUMMARY OF RUN " + run_name + " OPM FLOW " + comment;
const std::vector<std::string> month_names = {"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"};
std::string format_date(const std::chrono::system_clock::time_point& tp) {
auto ts = Opm::TimeStampUTC( std::chrono::system_clock::to_time_t(tp) );
char buffer[12];
std::snprintf(buffer, 12, "%2d-%3s-%4d", ts.day(), month_names[ts.month() - 1].c_str(), ts.year());
return std::string(buffer, 11);
}
const std::string block_header_line(const std::string& run_name) {
std::string date_string = format_date( std::chrono::system_clock::from_time_t( std::time(nullptr)));
return "SUMMARY OF RUN " + run_name + " at: " + date_string + " OPM FLOW " + PROJECT_VERSION_NAME;
}
const std::vector<std::string> month_names = {"JAN", "FEB", "MAR", "APR", "MAI", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"};
void write_line(std::ostream& os, const std::string& line, char prefix = ' ') {
os << prefix << std::setw(total_width) << std::left << line << '\n';
@ -127,12 +139,6 @@ namespace {
}
std::string format_date(const std::chrono::system_clock::time_point& tp) {
auto ts = Opm::TimeStampUTC( std::chrono::system_clock::to_time_t(tp) );
char buffer[12];
std::snprintf(buffer, 12, "%2d-%3s-%4d", ts.day(), month_names[ts.month() - 1].c_str(), ts.year());
return std::string(buffer, 11);
}
}
@ -141,7 +147,7 @@ namespace Opm::EclIO {
void ESmry::write_block(std::ostream& os, bool write_dates, const std::vector<std::string>& time_column, const std::vector<SummaryNode>& vectors) const {
write_line(os, block_separator_line, '1');
write_line(os, divider_line);
write_line(os, block_header_line(inputFileName.stem(), "VERSION 1910 ANYTHING CAN GO HERE: USER, MACHINE ETC."));
write_line(os, block_header_line(inputFileName.stem()));
write_line(os, divider_line);
std::vector<std::pair<std::vector<float>, int>> data;
@ -197,6 +203,16 @@ void ESmry::write_rsm(std::ostream& os) const {
}
});
/*
Ensure that the YEARS vector is the first in the data_vectors; could in
principle embark on a more general sorting here.
*/
if (data_vectors[0].keyword != "YEARS") {
auto years_iter = std::find_if(data_vectors.begin(), data_vectors.end(), [](const SummaryNode& node) { return (node.keyword == "YEARS"); });
if (years_iter != data_vectors.end())
std::swap(data_vectors[0], *years_iter);
}
std::vector<std::list<SummaryNode>> data_vector_blocks;
constexpr std::size_t data_column_count { column_count - 1 } ;
for (std::size_t i { 0 } ; i < data_vectors.size(); i += data_column_count) {
@ -204,6 +220,7 @@ void ESmry::write_rsm(std::ostream& os) const {
data_vector_blocks.emplace_back(data_vectors.begin() + i, data_vectors.begin() + last);
}
this->LoadData();
std::vector<std::string> time_column;
if (this->hasKey("DAY") && this->hasKey("MONTH") && this->hasKey("YEAR")) {
write_dates = true;

View File

@ -1815,7 +1815,7 @@ namespace Evaluator {
const auto val = st.get_elapsed() + stepSize;
st.update(this->saveKey_, convert::to(val, year));
st.update(this->saveKey_, convert::to(val, ecl_year));
}
private:
@ -2477,7 +2477,6 @@ configureTimeVectors(const EclipseState& es, const SummaryConfig& sumcfg)
.makeParameter(kw, dfltwgname, dfltnum, "", std::move(eval));
}
#if NOT_YET
// YEARS
{
const auto& kw = std::string("YEARS");
@ -2488,7 +2487,6 @@ configureTimeVectors(const EclipseState& es, const SummaryConfig& sumcfg)
this->outputParameters_
.makeParameter(kw, dfltwgname, dfltnum, kw, std::move(eval));
}
#endif // NOT_YET
}
void

View File

@ -18,6 +18,7 @@
*/
#include <fnmatch.h>
#include <stdexcept>
#include <opm/parser/eclipse/EclipseState/Schedule/Action/ActionContext.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Action/ActionValue.hpp>

View File

@ -20,6 +20,7 @@
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <stdexcept>
#include <opm/parser/eclipse/EclipseState/SummaryConfig/SummaryConfig.hpp>

View File

@ -1,5 +1,6 @@
#include <opm/parser/eclipse/EclipseState/Schedule/Action/ActionValue.hpp>
#include <stdexcept>
namespace Opm {
namespace Action {

View File

@ -21,10 +21,12 @@
namespace Opm {
GTNode::GTNode(const Group& group_arg, const GTNode * parent_arg) :
GTNode::GTNode(const Group& group_arg, std::size_t level, const std::optional<std::string>& parent_name) :
m_group(group_arg),
m_parent(parent_arg)
{}
m_level(level),
m_parent_name(parent_name)
{
}
const std::string& GTNode::name() const {
return this->m_group.name();
@ -34,9 +36,9 @@ const Group& GTNode::group() const {
return this->m_group;
}
const GTNode& GTNode::parent() const {
if (this->m_parent)
return *this->m_parent;
const std::string& GTNode::parent_name() const {
if (this->m_parent_name.has_value())
return *this->m_parent_name;
throw std::invalid_argument("Tried to access parent of root in GroupTree. Root: " + this->name());
}

View File

@ -23,7 +23,7 @@
#include <opm/parser/eclipse/EclipseState/Schedule/MSW/Valve.hpp>
#include <cassert>
#include <stdexcept>
#include <string>
namespace Opm {

View File

@ -20,6 +20,7 @@
#include <cmath>
#include <iostream>
#include <map>
#include <iterator>
#include <unordered_set>
#ifdef _WIN32
@ -479,16 +480,19 @@ namespace Opm {
}
}
std::size_t head_index = 0;
while (head_index < segments.size()) {
auto head_iter = std::find_if(segments.begin() + head_index, segments.end(),
[&segment_set] (const Segment& segment) { return (segment_set.count(segment.outletSegment()) == 0); });
const auto& head_segment = segments[head_index];
if (segment_set.count(head_segment.outletSegment()) != 0) {
auto head_iter = std::find_if(std::next(segments.begin(), head_index), segments.end(),
[&segment_set] (const Segment& segment) { return (segment_set.count(segment.outletSegment()) == 0); });
if (head_iter == segments.end())
throw std::logic_error("Loop detected in branch/segment structure");
segment_set.erase( head_iter->segmentNumber() );
std::swap( segments[head_index], *head_iter);
if (head_iter == segments.end())
throw std::logic_error("Loop detected in branch/segment structure");
std::swap( segments[head_index], *head_iter);
}
segment_set.erase( segments[head_index].segmentNumber() );
head_index++;
}

View File

@ -18,6 +18,8 @@
*/
#include <opm/parser/eclipse/EclipseState/Schedule/OilVaporizationProperties.hpp>
#include <stdexcept>
namespace Opm {
OilVaporizationProperties::OilVaporizationProperties()

View File

@ -2218,9 +2218,9 @@ void Schedule::invalidNamePattern( const std::string& namePattern, std::size_t
}
GTNode Schedule::groupTree(const std::string& root_node, std::size_t report_step, const GTNode * parent) const {
GTNode Schedule::groupTree(const std::string& root_node, std::size_t report_step, std::size_t level, const std::optional<std::string>& parent_name) const {
auto root_group = this->getGroup(root_node, report_step);
GTNode tree(root_group, parent);
GTNode tree(root_group, level, parent_name);
for (const auto& wname : root_group.wells()) {
const auto& well = this->getWell(wname, report_step);
@ -2228,7 +2228,7 @@ void Schedule::invalidNamePattern( const std::string& namePattern, std::size_t
}
for (const auto& gname : root_group.groups()) {
auto child_group = this->groupTree(gname, report_step, std::addressof(tree));
auto child_group = this->groupTree(gname, report_step, level + 1, root_node);
tree.add_group(child_group);
}
@ -2236,7 +2236,7 @@ void Schedule::invalidNamePattern( const std::string& namePattern, std::size_t
}
GTNode Schedule::groupTree(const std::string& root_node, std::size_t report_step) const {
return this->groupTree(root_node, report_step, nullptr);
return this->groupTree(root_node, report_step, 0, {});
}

View File

@ -628,7 +628,7 @@ bool Well::updateConnections(std::shared_ptr<WellConnections> connections_arg) {
bool Well::updateConnections(std::shared_ptr<WellConnections> connections_arg, const EclipseGrid& grid, const std::vector<int>& pvtnum) {
bool update = this->updateConnections(connections_arg);
if (this->pvt_table == 0) {
if (this->pvt_table == 0 && this->connections->size() > 0) {
const auto& lowest = this->connections->lowest();
auto active_index = grid.activeIndex(lowest.global_index());
this->pvt_table = pvtnum[active_index];

View File

@ -431,12 +431,16 @@ inline std::array< size_t, 3> directionIndices(const Opm::Connection::Direction
const Connection& WellConnections::lowest() const {
if (this->m_connections.empty())
throw std::logic_error("Tried to get lowest connection from empty set");
const auto max_iter = std::max_element(this->m_connections.begin(),
this->m_connections.end(),
[](const Connection& c1, const Connection& c2)
{
return c1.depth() < c2.depth();
});
return *max_iter;
}

View File

@ -0,0 +1,10 @@
{
"name": "HMMULTSG",
"sections": [
"GRID"
],
"data": {
"value_type": "DOUBLE",
"dimension": "1"
}
}

View File

@ -0,0 +1,21 @@
{
"name": "PRVD",
"sections": [
"SOLUTION"
],
"size": {
"keyword": "EQLDIMS",
"item": "NTEQUL"
},
"items": [
{
"name": "DATA",
"value_type": "DOUBLE",
"size_type": "ALL",
"dimension": [
"Length",
"Pressure"
]
}
]
}

View File

@ -1,6 +0,0 @@
{
"name": "DEADOIL",
"sections": [
"RUNSPEC"
]
}

View File

@ -1,22 +0,0 @@
{
"name": "THERMEX1",
"sections": [
"PROPS"
],
"size": {
"keyword": "TABDIMS",
"item": "NUM_STATE_EQ"
},
"comment": "and this also cannot (yet?) be specified.",
"items": [
{
"name": "EXPANSION_COEFF",
"value_type": "DOUBLE",
"size_type": "ALL",
"dimension": [
"1/AbsoluteTemperature"
],
"default": 0
}
]
}

View File

@ -1,5 +1,5 @@
{
"name": "PERMRED",
"name": "PERMFACT",
"sections": [
"PROPS"
],
@ -10,7 +10,7 @@
"dimension": "1"
},
{
"name": "PERMREDMULT",
"name": "PERMFACTMULT",
"value_type": "DOUBLE",
"dimension": "1"
}

View File

@ -0,0 +1,27 @@
{
"name": "PVTGW",
"sections": [
"PROPS"
],
"num_tables": {
"keyword": "TABDIMS",
"item": "NTPVT"
},
"items": [
{
"name": "GAS_PRESSURE",
"value_type": "DOUBLE",
"dimension": "Pressure"
},
{
"name": "DATA",
"size_type": "ALL",
"value_type": "DOUBLE",
"dimension": [
"OilDissolutionFactor",
"OilDissolutionFactor",
"Viscosity"
]
}
]
}

View File

@ -0,0 +1,28 @@
{
"name": "PVTGWO",
"sections": [
"PROPS"
],
"num_tables": {
"keyword": "TABDIMS",
"item": "NTPVT"
},
"items": [
{
"name": "GAS_PRESSURE",
"value_type": "DOUBLE",
"dimension": "Pressure"
},
{
"name": "DATA",
"size_type": "ALL",
"value_type": "DOUBLE",
"dimension": [
"OilDissolutionFactor",
"OilDissolutionFactor",
"OilDissolutionFactor",
"Viscosity"
]
}
]
}

View File

@ -0,0 +1,29 @@
{
"name": "RWGSALT",
"sections": [
"PROPS"
],
"num_tables": {
"keyword": "TABDIMS",
"item": "NTPVT"
},
"items": [
{
"name": "RESERVOIR_PRESSURE",
"value_type": "DOUBLE",
"dimension": "Pressure"
},
{
"name": "SALT_CONCENTRATION",
"value_type": "DOUBLE",
"size_type": "ALL",
"dimension": "Mass/Length*Length*Length"
},
{
"name": "DATA",
"size_type": "ALL",
"value_type":"DOUBLE",
"dimension": "OilDissolutionFactor"
}
]
}

View File

@ -345,6 +345,7 @@ set( keywords
000_Eclipse100/H/HMMLTWCN
000_Eclipse100/H/HMMULTxx
000_Eclipse100/H/HMMULTFT
000_Eclipse100/H/HMMULTSG
000_Eclipse100/H/HMPROPS
000_Eclipse100/H/HMROCK
000_Eclipse100/H/HMROCKT
@ -629,6 +630,7 @@ set( keywords
000_Eclipse100/P/PROPS
000_Eclipse100/P/PRIORITY
000_Eclipse100/P/PRORDER
000_Eclipse100/P/PRVD
000_Eclipse100/P/PSTEADY
000_Eclipse100/P/PSWRG
000_Eclipse100/P/PSWRO
@ -1047,7 +1049,6 @@ set( keywords
001_Eclipse300/C/COMPS
001_Eclipse300/C/CREF
001_Eclipse300/C/CREFS
001_Eclipse300/D/DEADOIL
001_Eclipse300/D/DREF
001_Eclipse300/D/DREFS
001_Eclipse300/D/DZV
@ -1073,7 +1074,6 @@ set( keywords
001_Eclipse300/T/THCROCK
001_Eclipse300/T/THCWATER
001_Eclipse300/T/THERMAL
001_Eclipse300/T/THERMEX1
001_Eclipse300/T/TREF
001_Eclipse300/T/TREFS
001_Eclipse300/W/WINJTEMP
@ -1092,15 +1092,18 @@ set( keywords
900_OPM/M/MINPVFIL
900_OPM/O/OCOMPIDX
900_OPM/O/OILDENT
900_OPM/P/PERMRED
900_OPM/P/PERMFACT
900_OPM/P/PINTDIMS
900_OPM/P/PLYVMH
900_OPM/P/PLYMWINJ
900_OPM/P/POLYMW
900_OPM/P/PRECSALT
900_OPM/P/PVTGW
900_OPM/P/PVTGWO
900_OPM/P/PYACTION
900_OPM/P/PYINPUT
900_OPM/R/RHO
900_OPM/R/RWGSALT
900_OPM/S/SALTPVD
900_OPM/S/SALTSOL
900_OPM/S/SKPRPOLY

View File

@ -475,13 +475,13 @@ BOOST_AUTO_TEST_CASE(GroupTree2TEST) {
auto gt = schedule.groupTree(0);
BOOST_CHECK_EQUAL(gt.wells().size(), 0);
BOOST_CHECK_EQUAL(gt.group().name(), "FIELD");
BOOST_CHECK_THROW(gt.parent(), std::invalid_argument);
BOOST_CHECK_THROW(gt.parent_name(), std::invalid_argument);
auto cg = gt.groups();
auto pg = cg[0];
BOOST_CHECK_EQUAL(cg.size(), 1);
BOOST_CHECK_EQUAL(pg.group().name(), "PLATFORM");
BOOST_CHECK_EQUAL(pg.parent().name(), "FIELD");
BOOST_CHECK_EQUAL(pg.parent_name(), "FIELD");
}