Compare commits
28 Commits
master
...
release/20
Author | SHA1 | Date | |
---|---|---|---|
|
c72d2bf460 | ||
|
dfddff0562 | ||
|
1371b5706d | ||
|
b571dd9d66 | ||
|
ad746440e0 | ||
|
2bae3b2300 | ||
|
75a2a7e0ee | ||
|
917fc523ad | ||
|
28e492ecb9 | ||
|
ec1c315968 | ||
|
cf72ef0330 | ||
|
10a3bc4b56 | ||
|
8b4d8f1734 | ||
|
7cea357930 | ||
|
720fb8dcab | ||
|
8e56b44201 | ||
|
b14c5fc1a9 | ||
|
565d6b76dc | ||
|
ac840312e7 | ||
|
5e800ae2e7 | ||
|
2e0583cc74 | ||
|
8365eaed0b | ||
|
571582c881 | ||
|
6439ae1cea | ||
|
e796916057 | ||
|
63b663228a | ||
|
bf475b73b4 | ||
|
1e734020f1 |
@ -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)
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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.
|
||||
|
@ -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
2
debian/changelog
vendored
@ -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
4
debian/control
vendored
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <map>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/MSW/icd.hpp>
|
||||
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include <map>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/MSW/icd.hpp>
|
||||
|
||||
|
@ -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 );
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <algorithm>
|
||||
#include <cstring>
|
||||
#include <cstdlib>
|
||||
#include <stdexcept>
|
||||
|
||||
#include <opm/parser/eclipse/EclipseState/SummaryConfig/SummaryConfig.hpp>
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/Action/ActionValue.hpp>
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
namespace Opm {
|
||||
namespace Action {
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -23,7 +23,7 @@
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/MSW/Valve.hpp>
|
||||
|
||||
#include <cassert>
|
||||
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
|
||||
namespace Opm {
|
||||
|
@ -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++;
|
||||
}
|
||||
|
||||
|
@ -18,6 +18,8 @@
|
||||
*/
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/OilVaporizationProperties.hpp>
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
namespace Opm {
|
||||
|
||||
OilVaporizationProperties::OilVaporizationProperties()
|
||||
|
@ -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, {});
|
||||
}
|
||||
|
||||
|
||||
|
@ -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];
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,10 @@
|
||||
{
|
||||
"name": "HMMULTSG",
|
||||
"sections": [
|
||||
"GRID"
|
||||
],
|
||||
"data": {
|
||||
"value_type": "DOUBLE",
|
||||
"dimension": "1"
|
||||
}
|
||||
}
|
21
src/opm/parser/eclipse/share/keywords/000_Eclipse100/P/PRVD
Normal file
21
src/opm/parser/eclipse/share/keywords/000_Eclipse100/P/PRVD
Normal 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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
{
|
||||
"name": "DEADOIL",
|
||||
"sections": [
|
||||
"RUNSPEC"
|
||||
]
|
||||
}
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
@ -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"
|
||||
}
|
27
src/opm/parser/eclipse/share/keywords/900_OPM/P/PVTGW
Normal file
27
src/opm/parser/eclipse/share/keywords/900_OPM/P/PVTGW
Normal 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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
28
src/opm/parser/eclipse/share/keywords/900_OPM/P/PVTGWO
Normal file
28
src/opm/parser/eclipse/share/keywords/900_OPM/P/PVTGWO
Normal 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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
29
src/opm/parser/eclipse/share/keywords/900_OPM/R/RWGSALT
Normal file
29
src/opm/parser/eclipse/share/keywords/900_OPM/R/RWGSALT
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
@ -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
|
||||
|
@ -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");
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user