Merge pull request #2647 from joakim-hove/rst-actionx

Rst actionx
This commit is contained in:
Joakim Hove 2021-09-14 15:54:32 +02:00 committed by GitHub
commit 4b3231c9ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 2657 additions and 869 deletions

View File

@ -104,6 +104,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
@ -284,6 +285,7 @@ if(ENABLE_ECL_OUTPUT)
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
@ -489,6 +491,9 @@ if(ENABLE_ECL_OUTPUT)
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
@ -763,6 +768,7 @@ 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
@ -873,6 +879,7 @@ if(ENABLE_ECL_OUTPUT)
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

View File

@ -0,0 +1,74 @@
/*
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>
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, double min_wait_arg, std::time_t start_time, std::vector<Condition> conditions_arg);
std::string name;
int max_run;
double min_wait;
std::time_t start_time;
std::vector<Condition> conditions;
};
}
}
#endif

View File

@ -89,7 +89,7 @@ struct RstHeader {
int nwell_udq;
int ngroup_udq;
int nfield_udq;
int num_action;
bool e300_radial;
bool e100_radial;

View File

@ -28,6 +28,7 @@
#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>
@ -37,6 +38,7 @@
namespace Opm {
class EclipseGrid;
class Parser;
class Actdims;
} // namespace Opm
namespace Opm { namespace EclIO {
@ -63,6 +65,7 @@ struct RstState {
std::vector<RstGroup> groups;
std::vector<RstUDQ> udqs;
RstUDQActive udq_active;
std::vector<RstAction> actions;
Tuning tuning;
private:
@ -99,6 +102,15 @@ private:
const std::vector<double>& dudg,
const std::vector<double>& dudf);
void add_actions(const Actdims& actdims,
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);
};
}} // namespace Opm::RestartIO

View File

@ -38,7 +38,7 @@ namespace Opm { namespace RestartIO { namespace Helpers { namespace VectorItems
// 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 QuantiyType {
enum QuantityType {
Field = 1,
Well = 2,
Group = 3,
@ -63,6 +63,7 @@ namespace Opm { namespace RestartIO { namespace Helpers { namespace VectorItems
namespace SACN {
enum index : std::vector<int>::size_type {
LHSValue0 = 0,
RHSValue0 = 2,
LHSValue1 = 4,
RHSValue1 = 5,
@ -78,15 +79,19 @@ namespace Opm { namespace RestartIO { namespace Helpers { namespace VectorItems
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;
}

View File

@ -38,6 +38,11 @@ namespace Opm {
class DeckKeyword;
class WellMatcher;
namespace RestartIO {
struct RstAction;
}
namespace Action {
class State;
@ -71,6 +76,7 @@ public:
ActionX(const std::string& name, size_t max_run, double max_wait, std::time_t start_time);
ActionX(const DeckKeyword& kw, std::time_t start_time);
ActionX(const DeckRecord& record, std::time_t start_time);
explicit ActionX(const RestartIO::RstAction& rst_action);
static ActionX serializeObject();

View File

@ -24,6 +24,8 @@
#include <vector>
#include <opm/common/OpmLog/KeywordLocation.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Action/Enums.hpp>
#include <opm/io/eclipse/rst/action.hpp>
namespace Opm {
@ -34,7 +36,9 @@ class Quantity {
public:
Quantity() = default;
Quantity(const std::string& arg) :
explicit Quantity(const RestartIO::RstAction::Quantity& rst_quantity);
explicit Quantity(const std::string& arg) :
quantity(arg)
{}
@ -63,23 +67,8 @@ public:
class Condition {
public:
enum class Logical {
AND,
OR,
END
};
enum class Comparator {
EQUAL,
GREATER,
LESS,
GREATER_EQUAL,
LESS_EQUAL,
INVALID
};
Condition() = default;
explicit Condition(const RestartIO::RstAction::Condition& rst_condition);
Condition(const std::vector<std::string>& tokens, const KeywordLocation& location);
@ -94,7 +83,6 @@ enum class Comparator {
static Logical logic_from_int(int);
int logic_as_int() const;
static Comparator comparator_from_int(int);
int comparator_as_int() const;
int paren_as_int() const;
bool open_paren() const;

View File

@ -0,0 +1,51 @@
/*
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 ACTION_ENUMS_HPP
#define ACTION_ENUMS_HPP
#include <string>
namespace Opm {
namespace Action {
enum class Logical {
AND,
OR,
END
};
enum class Comparator {
EQUAL,
GREATER,
LESS,
GREATER_EQUAL,
LESS_EQUAL,
INVALID
};
Comparator comparator_from_int(int cmp_int);
std::string comparator_as_string(Comparator cmp);
Logical logic_from_int(int int_logic);
}
}
#endif

View File

@ -0,0 +1,146 @@
/*
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/>.
*/
#include <cmath>
#include <opm/io/eclipse/rst/action.hpp>
#include <opm/output/eclipse/VectorItems/action.hpp>
#include <opm/common/utility/String.hpp>
#include <opm/common/utility/TimeService.hpp>
namespace Opm {
namespace RestartIO {
namespace IACN = Helpers::VectorItems::IACN;
namespace SACN = Helpers::VectorItems::SACN;
namespace ZACN = Helpers::VectorItems::ZACN;
RstAction::RstAction(const std::string& name_arg, int max_run_arg, double min_wait_arg, std::time_t start_time_arg, std::vector<RstAction::Condition> conditions_arg)
: name(name_arg)
, max_run(max_run_arg)
, min_wait(min_wait_arg)
, start_time(start_time_arg)
, conditions(conditions_arg)
{
}
RstAction::Quantity::Quantity(const std::string * zacn, double sacn_value) {
auto str_quantity = trim_copy(zacn[ZACN::Quantity]);
if (str_quantity.empty()) {
this->quantity = sacn_value;
return;
}
this->quantity = str_quantity;
if (str_quantity[0] == 'W')
this->wgname = trim_copy(zacn[ZACN::Well]);
else if (str_quantity[0] == 'G')
this->wgname = trim_copy(zacn[ZACN::Group]);
}
RstAction::Quantity::Quantity(const std::string& q)
: quantity(q)
{
}
RstAction::Quantity::Quantity(double value)
: quantity(value)
{
}
RstAction::Condition::Condition(const std::string * zacn, const int * iacn, const double * sacn)
: logic(Action::logic_from_int(iacn[IACN::TerminalLogic]))
, cmp_op(Action::comparator_from_int(iacn[IACN::Comparator]))
{
auto type_index = IACN::LHSQuantityType;
auto rhs_value = sacn[SACN::RHSValue0];
if (iacn[type_index] == IACN::Value::Day) {
this->lhs = RstAction::Quantity("DAY");
this->rhs = RstAction::Quantity(rhs_value);
return;
}
if (iacn[type_index] == IACN::Value::Month) {
this->lhs = RstAction::Quantity("MNTH");
this->rhs = RstAction::Quantity(TimeService::eclipseMonthNames().at(static_cast<int>(rhs_value)));
return;
}
if (iacn[type_index] == IACN::Value::Year) {
this->lhs = RstAction::Quantity("YEAR");
this->rhs = RstAction::Quantity(rhs_value);
return;
}
this->lhs = RstAction::Quantity(zacn, sacn[SACN::LHSValue0]);
this->rhs = RstAction::Quantity(&zacn[ZACN::RHSOffset], sacn[SACN::RHSValue0]);
this->left_paren = (iacn[IACN::Paren] == IACN::Value::Open);
this->right_paren = (iacn[IACN::Paren] == IACN::Value::Close);
}
bool RstAction::Condition::valid(const std::string * zacn, const int * iacn) {
auto type_index = IACN::LHSQuantityType;
if (iacn[type_index] == IACN::Value::Day)
return true;
if (iacn[type_index] == IACN::Value::Month)
return true;
if (iacn[type_index] == IACN::Value::Year)
return true;
auto str_quantity = trim_copy(zacn[ZACN::LHSQuantity]);
return !str_quantity.empty();
}
std::vector<std::string> RstAction::Condition::tokens() const {
std::vector<std::string> tokens;
if (this->left_paren)
tokens.push_back("(");
tokens.push_back(std::get<std::string>(this->lhs.quantity));
if (this->lhs.wgname.has_value())
tokens.push_back(this->lhs.wgname.value());
tokens.push_back(Action::comparator_as_string(this->cmp_op));
if (std::holds_alternative<std::string>(this->rhs.quantity))
tokens.push_back(std::get<std::string>(this->rhs.quantity));
else
tokens.push_back(format_double(std::get<double>(this->rhs.quantity)));
if (this->rhs.wgname.has_value())
tokens.push_back(this->rhs.wgname.value());
if (this->right_paren)
tokens.push_back(")");
if (this->logic == Action::Logical::AND)
tokens.push_back("AND");
if (this->logic == Action::Logical::OR)
tokens.push_back("OR");
return tokens;
}
}
}

View File

@ -90,6 +90,7 @@ RstHeader::RstHeader(const Opm::UnitSystem& unit_system, const std::vector<int>&
nwell_udq(intehead[VI::intehead::NO_WELL_UDQS]),
ngroup_udq(intehead[VI::intehead::NO_GROUP_UDQS]),
nfield_udq(intehead[VI::intehead::NO_FIELD_UDQS]),
num_action(intehead[VI::intehead::NOOFACTIONS]),
//
e300_radial(logihead[VI::logihead::E300Radial]),
e100_radial(logihead[VI::logihead::E100Radial]),
@ -127,7 +128,7 @@ RstHeader::RstHeader(const Opm::UnitSystem& unit_system, const std::vector<int>&
std::time_t RstHeader::sim_time() const {
TimeStampUTC ts(this->year, this->month, this->mday);
ts.hour(this->hour);
ts.minutes(this->minute);
ts.minutes(this->minute);
ts.microseconds(this->microsecond);
return asTimeT(ts);
}

View File

@ -28,6 +28,7 @@
#include <opm/io/eclipse/rst/connection.hpp>
#include <opm/io/eclipse/rst/well.hpp>
#include <opm/io/eclipse/rst/state.hpp>
#include <opm/output/eclipse/WriteRestartHelpers.hpp>
#include <opm/parser/eclipse/Parser/Parser.hpp>
#include <opm/output/eclipse/UDQDims.hpp>
@ -35,6 +36,8 @@
#include <opm/output/eclipse/VectorItems/well.hpp>
#include <opm/output/eclipse/VectorItems/intehead.hpp>
#include <opm/output/eclipse/VectorItems/doubhead.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Action/Actdims.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Action/Condition.hpp>
namespace {
@ -60,6 +63,7 @@ namespace {
{
return Opm::UDQ::updateType(iudq[udq_index * Opm::UDQDims::entriesPerIUDQ()]);
}
}
namespace VI = ::Opm::RestartIO::Helpers::VectorItems;
@ -261,6 +265,55 @@ void RstState::add_udqs(const std::vector<int>& iudq,
}
}
std::string oper_string(Action::Logical logic) {
if (logic == Action::Logical::AND)
return "AND";
if (logic == Action::Logical::OR)
return "OR";
return "";
}
void RstState::add_actions(const Actdims& actdims,
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)
{
auto zact_action_size = RestartIO::Helpers::entriesPerZACT();
auto iact_action_size = RestartIO::Helpers::entriesPerIACT();
auto sact_action_size = RestartIO::Helpers::entriesPerSACT();
auto zacn_action_size = RestartIO::Helpers::entriesPerZACN(actdims);
auto iacn_action_size = RestartIO::Helpers::entriesPerIACN(actdims);
auto sacn_action_size = RestartIO::Helpers::entriesPerSACN(actdims);
auto zacn_cond_size = 13;
auto iacn_cond_size = 26;
auto sacn_cond_size = 16;
for (std::size_t index=0; index < static_cast<std::size_t>(this->header.num_action); index++) {
std::vector<RstAction::Condition> conditions;
for (std::size_t icond = 0; icond < actdims.max_conditions(); icond++) {
const auto zacn_offset = index * zacn_action_size + icond * zacn_cond_size;
const auto iacn_offset = index * iacn_action_size + icond * iacn_cond_size;
const auto sacn_offset = index * sacn_action_size + icond * sacn_cond_size;
if (RstAction::Condition::valid(&zacn[zacn_offset], &iacn[iacn_offset]))
conditions.emplace_back(&zacn[zacn_offset], &iacn[iacn_offset], &sacn[sacn_offset]);
}
const auto& name = zact[index * zact_action_size + 0];
const auto& max_run = iact[index * iact_action_size + 5];
const auto& min_wait = this->unit_system.to_si(UnitSystem::measure::time, sact[index * sact_action_size + 3]);
this->actions.emplace_back(name, max_run, min_wait, sim_time, conditions );
}
}
const RstWell& RstState::get_well(const std::string& wname) const {
const auto well_iter = std::find_if(this->wells.begin(),
@ -275,7 +328,7 @@ const RstWell& RstState::get_well(const std::string& wname) const {
}
RstState RstState::load(std::shared_ptr<EclIO::RestartFileView> rstView,
const Runspec&,
const Runspec& runspec,
const Parser&,
const ::Opm::EclipseGrid* grid)
{
@ -330,6 +383,17 @@ RstState RstState::load(std::shared_ptr<EclIO::RestartFileView> rstView,
}
}
if (state.header.num_action > 0) {
const auto& zact = rstView->getKeyword<std::string>("ZACT");
const auto& iact = rstView->getKeyword<int>("IACT");
const auto& sact = rstView->getKeyword<float>("SACT");
const auto& zacn = rstView->getKeyword<std::string>("ZACN");
const auto& iacn = rstView->getKeyword<int>("IACN");
const auto& sacn = rstView->getKeyword<double>("SACN");
state.add_actions(runspec.actdims(), state.header.sim_time(), zact, iact, sact, zacn, iacn, sacn);
}
return state;
}

View File

@ -36,6 +36,7 @@
#include <opm/parser/eclipse/EclipseState/Schedule/Action/Actions.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Action/ActionX.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Action/Actdims.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Action/Enums.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>
@ -73,7 +74,7 @@ namespace {
{"Y", 0},
};*/
using cmp_enum = Opm::Action::Condition::Comparator;
using cmp_enum = Opm::Action::Comparator;
const std::map<cmp_enum, int> cmpToIacn_12 = {
{cmp_enum::GREATER, 0},
{cmp_enum::LESS, 1},
@ -90,7 +91,7 @@ const std::map<std::string, int> rhsQuantityToIndex = {
{"G", 3},
};
using logic_enum = Opm::Action::Condition::Logical;
using logic_enum = Opm::Action::Logical;
const std::map<logic_enum, int> logicalToIndex_17 = {
{logic_enum::AND, 1},
@ -331,7 +332,7 @@ const std::map<logic_enum, int> logicalToIndex_17 = {
int first_greater = 0;
{
const auto& first_cond = actx_cond[0];
if (first_cond.cmp == Opm::Action::Condition::Comparator::LESS)
if (first_cond.cmp == Opm::Action::Comparator::LESS)
first_greater = 1;
}
@ -378,7 +379,7 @@ const std::map<logic_enum, int> logicalToIndex_17 = {
parenFirstCond = true;
insideParen = true;
}
if (cond_it->logic == Opm::Action::Condition::Logical::AND) {
if (cond_it->logic == Opm::Action::Logical::AND) {
allPrevLogicOp_AND = true;
}
} else {
@ -402,9 +403,9 @@ const std::map<logic_enum, int> logicalToIndex_17 = {
}
// update the previous logic-sequence
if (parenFirstCond && cond_it->logic == Opm::Action::Condition::Logical::OR) {
if (parenFirstCond && cond_it->logic == Opm::Action::Logical::OR) {
allPrevLogicOp_AND = false;
} else if (!insideParen && cond_it->logic == Opm::Action::Condition::Logical::OR) {
} else if (!insideParen && cond_it->logic == Opm::Action::Logical::OR) {
allPrevLogicOp_AND = false;
}
}

View File

@ -91,9 +91,7 @@ std::size_t Opm::RestartIO::Helpers::entriesPerIACN(const Opm::Actdims& actdims)
std::size_t Opm::RestartIO::Helpers::entriesPerSACN(const Opm::Actdims& actdims)
{
//16
std::size_t no_entries = 16 * actdims.max_conditions();
return no_entries;
return Opm::RestartIO::Helpers::VectorItems::SACN::ConditionSize * actdims.max_conditions();
}
std::size_t Opm::RestartIO::Helpers::entriesPerIACT()

View File

@ -755,12 +755,12 @@ Opm::RestartIO::InteHEAD&
Opm::RestartIO::InteHEAD::
variousUDQ_ACTIONXParam()
{
this -> data_[159] = 4;
this -> data_[160] = 5;
this -> data_[161] = 9;
this -> data_[246] = 26;
this -> data_[247] = 16;
this -> data_[248] = 13;
this -> data_[159] = 4; // entriesPerZACT??
this -> data_[160] = 5; // entriesPerSACT??
this -> data_[161] = 9; // entriesPerIACT??
this -> data_[246] = 26; // entriesPerIACN (multiply max_conditions)
this -> data_[247] = 16; // entriesPerSACN (multiply max_conditions)
this -> data_[248] = 13; // entriesPerZACN (multiply max_conditions)
return *this;
}

View File

@ -28,6 +28,7 @@
#include <opm/parser/eclipse/EclipseState/Schedule/Action/State.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Well/WellMatcher.hpp>
#include <opm/parser/eclipse/Parser/ParserKeywords/W.hpp>
#include <opm/io/eclipse/rst/action.hpp>
#include "ActionParser.hpp"
@ -60,6 +61,22 @@ ActionX::ActionX(const std::string& name, size_t max_run, double min_wait, std::
m_start_time(start_time)
{}
ActionX::ActionX(const RestartIO::RstAction& rst_action)
: m_name(rst_action.name)
, m_max_run(rst_action.max_run)
, m_min_wait(rst_action.min_wait),
m_start_time(rst_action.start_time)
{
std::vector<std::string> tokens;
for (const auto& rst_condition : rst_action.conditions) {
this->m_conditions.emplace_back(rst_condition);
const auto& cond_tokens = rst_condition.tokens();
tokens.insert(tokens.end(), cond_tokens.begin(), cond_tokens.end());
}
this->condition = Action::AST(tokens);
}
ActionX::ActionX(const DeckRecord& record, std::time_t start_time) :
ActionX( record.getItem("NAME").getTrimmedString(0),
@ -70,6 +87,9 @@ ActionX::ActionX(const DeckRecord& record, std::time_t start_time) :
{}
ActionX::ActionX(const DeckKeyword& kw, std::time_t start_time) :
ActionX(kw.getRecord(0), start_time)
{
@ -102,8 +122,8 @@ ActionX ActionX::serializeObject()
Condition cond;
cond.lhs = quant;
cond.rhs = quant;
cond.logic = Condition::Logical::AND;
cond.cmp = Condition::Comparator::GREATER_EQUAL;
cond.logic = Logical::AND;
cond.cmp = Comparator::GREATER_EQUAL;
cond.cmp_string = "test3";
result.m_conditions = {cond};

View File

@ -17,13 +17,17 @@
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#include <fmt/format.h>
#include <string>
#include <opm/output/eclipse/VectorItems/action.hpp>
#include <opm/common/utility/String.hpp>
#include <opm/parser/eclipse/Deck/DeckKeyword.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Action/ActionValue.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Action/Condition.hpp>
#include <opm/parser/eclipse/EclipseState/Schedule/Action/Enums.hpp>
#include <opm/io/eclipse/rst/action.hpp>
#include "ActionParser.hpp"
@ -34,44 +38,26 @@ namespace Action {
namespace {
Condition::Comparator comparator(TokenType tt) {
Comparator comparator(TokenType tt) {
if (tt == TokenType::op_eq)
return Condition::Comparator::EQUAL;
return Comparator::EQUAL;
if (tt == TokenType::op_gt)
return Condition::Comparator::GREATER;
return Comparator::GREATER;
if (tt == TokenType::op_lt)
return Condition::Comparator::LESS;
return Comparator::LESS;
if (tt == TokenType::op_le)
return Condition::Comparator::LESS_EQUAL;
return Comparator::LESS_EQUAL;
if (tt == TokenType::op_ge)
return Condition::Comparator::GREATER_EQUAL;
return Comparator::GREATER_EQUAL;
return Condition::Comparator::INVALID;
return Comparator::INVALID;
}
std::string cmp2string(Condition::Comparator cmp) {
if (cmp == Condition::Comparator::EQUAL)
return "=";
if (cmp == Condition::Comparator::GREATER)
return ">";
if (cmp == Condition::Comparator::LESS)
return "<";
if (cmp == Condition::Comparator::LESS_EQUAL)
return "<=";
if (cmp == Condition::Comparator::GREATER_EQUAL)
return ">=";
throw std::logic_error("Bug in opm/flow - should not be here");
}
std::string strip_quotes(const std::string& s) {
if (s[0] == '\'')
@ -82,6 +68,18 @@ std::string strip_quotes(const std::string& s) {
}
Quantity::Quantity(const RestartIO::RstAction::Quantity& rst_quantity)
{
if (std::holds_alternative<std::string>(rst_quantity.quantity))
this->quantity = std::get<std::string>(rst_quantity.quantity);
else
this->quantity = format_double(std::get<double>(rst_quantity.quantity));
if (rst_quantity.wgname.has_value())
this->add_arg(rst_quantity.wgname.value());
}
void Quantity::add_arg(const std::string& arg) {
this->args.push_back(strip_quotes(arg));
}
@ -127,6 +125,17 @@ int Quantity::int_type() const {
}
Condition::Condition(const RestartIO::RstAction::Condition& rst_condition)
: lhs(rst_condition.lhs)
, rhs(rst_condition.rhs)
, logic(rst_condition.logic)
, cmp(rst_condition.cmp_op)
, left_paren(rst_condition.left_paren)
, right_paren(rst_condition.right_paren)
{
}
Condition::Condition(const std::vector<std::string>& tokens, const KeywordLocation& location) {
std::size_t token_index = 0;
if (tokens[0] == "(") {
@ -146,7 +155,7 @@ Condition::Condition(const std::vector<std::string>& tokens, const KeywordLocati
token_index += 1;
} else {
this->cmp = comp;
this->cmp_string = cmp2string(this->cmp);
this->cmp_string = comparator_as_string(this->cmp);
token_index += 1;
break;
}
@ -164,9 +173,9 @@ Condition::Condition(const std::vector<std::string>& tokens, const KeywordLocati
auto token_type = Parser::get_type(tokens[token_index]);
if (token_type == TokenType::op_and)
this->logic = Condition::Logical::AND;
this->logic = Logical::AND;
else if (token_type == TokenType::op_or)
this->logic = Condition::Logical::OR;
this->logic = Logical::OR;
else if (token_type == TokenType::close_paren)
this->right_paren = true;
else
@ -207,19 +216,6 @@ int Condition::paren_as_int() const {
}
Condition::Logical Condition::logic_from_int(int int_logic) {
if (int_logic == 0)
return Logical::END;
if (int_logic == 1)
return Logical::AND;
if (int_logic == 2)
return Logical::OR;
throw std::logic_error("Unknown integer value");
}
int Condition::logic_as_int() const {
switch (this->logic) {
case Logical::END:
@ -233,37 +229,21 @@ int Condition::logic_as_int() const {
}
}
Condition::Comparator Condition::comparator_from_int(int cmp_int) {
switch (cmp_int) {
case 1:
return Condition::Comparator::GREATER;
case 2:
return Condition::Comparator::LESS;
case 3:
return Condition::Comparator::GREATER_EQUAL;
case 4:
return Condition::Comparator::LESS_EQUAL;
case 5:
return Condition::Comparator::EQUAL;
default:
throw std::logic_error("What the f...?");
}
}
int Condition::comparator_as_int() const {
switch (this->cmp) {
case Condition::Comparator::GREATER:
case Comparator::GREATER:
return 1;
case Condition::Comparator::LESS:
case Comparator::LESS:
return 2;
case Condition::Comparator::GREATER_EQUAL:
case Comparator::GREATER_EQUAL:
return 3;
case Condition::Comparator::LESS_EQUAL:
case Comparator::LESS_EQUAL:
return 4;
case Condition::Comparator::EQUAL:
case Comparator::EQUAL:
return 5;
default:
throw std::logic_error("What the f...?");
throw std::logic_error(fmt::format("Unhandeled value: {} in enum comparison", static_cast<int>(this->cmp)));
}
}

View File

@ -0,0 +1,81 @@
/*
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/>.
*/
#include <fmt/format.h>
#include <stdexcept>
#include <opm/parser/eclipse/EclipseState/Schedule/Action/Enums.hpp>
namespace Opm {
namespace Action {
Logical logic_from_int(int int_logic) {
if (int_logic == 0)
return Logical::END;
if (int_logic == 1)
return Logical::AND;
if (int_logic == 2)
return Logical::OR;
throw std::logic_error("Unknown integer value");
}
Comparator comparator_from_int(int cmp_int) {
switch (cmp_int) {
case 1:
return Comparator::GREATER;
case 2:
return Comparator::LESS;
case 3:
return Comparator::GREATER_EQUAL;
case 4:
return Comparator::LESS_EQUAL;
case 5:
return Comparator::EQUAL;
default:
throw std::logic_error(fmt::format("Integer value: {} could not be converted to ACTIONX comparator", cmp_int));
}
}
std::string comparator_as_string(Comparator cmp) {
if (cmp == Comparator::EQUAL)
return "=";
if (cmp == Comparator::GREATER)
return ">";
if (cmp == Comparator::LESS)
return "<";
if (cmp == Comparator::LESS_EQUAL)
return "<=";
if (cmp == Comparator::GREATER_EQUAL)
return ">=";
throw std::logic_error("Bug in opm/flow - should not be here");
}
}
}

View File

@ -1467,6 +1467,14 @@ namespace {
}
this->snapshots.back().udq_active.update( std::move(udq_active) );
}
if (!rst_state.actions.empty()) {
auto actions = this->snapshots.back().actions();
for (const auto& rst_action : rst_state.actions)
actions.add( Action::ActionX(rst_action) );
this->snapshots.back().actions.update( std::move(actions) );
}
}
std::shared_ptr<const Python> Schedule::python() const

569
tests/UDQ_ACTIONX.DATA Normal file
View File

@ -0,0 +1,569 @@
RUNSPEC
TITLE
'Generic' 'Reservoir'
NOECHO
DIMENS
3 5 4 /
START
22 'AUG' 2018 /
OIL
GAS
WATER
DISGAS
METRIC
TABDIMS
1 1 130 24 1 20 /
EQLDIMS
2 100 20 /
WELLDIMS
230 120 50 80 /
UNIFIN
UNIFOUT
UDQDIMS
50 25 0 50 50 0 0
50 0 20 /
UDADIMS
10 1* 10 /
GRID
NOECHO
INIT
GRIDFILE
0 1 /
MAPAXES
0 100 0 0 100 0 /
NOECHO
SPECGRID
3 5 4 1 'F' /
COORD
2000 2000 2000 1999.5638 2000 2039.9619 2199.8096
2000 2008.7239 2199.3735 2000 2048.6858 2399.6193 2000
2017.4478 2399.1831 2000 2057.4097 2599.4289 2000 2026.1716
2598.9927 2000 2066.1336 2000 2200 2000 1999.5638
2200 2039.9619 2199.8096 2200 2008.7239 2199.3735 2200
2048.6858 2399.6193 2200 2017.4478 2399.1831 2200 2057.4097
2599.4289 2200 2026.1716 2598.9927 2200 2066.1336 2000
2400 2000 1999.5638 2400 2039.9619 2199.8096 2400
2008.7239 2199.3735 2400 2048.6858 2399.6193 2400 2017.4478
2399.1831 2400 2057.4097 2599.4289 2400 2026.1716 2598.9927
2400 2066.1336 2000 2600 2000 1999.5638 2600
2039.9619 2199.8096 2600 2008.7239 2199.3735 2600 2048.6858
2399.6193 2600 2017.4478 2399.1831 2600 2057.4097 2599.4289
2600 2026.1716 2598.9927 2600 2066.1336 2000 2800
2000 1999.5638 2800 2039.9619 2199.8096 2800 2008.7239
2199.3735 2800 2048.6858 2399.6193 2800 2017.4478 2399.1831
2800 2057.4097 2599.4289 2800 2026.1716 2598.9927 2800
2066.1336 2000 3000 2000 1999.5638 3000 2039.9619
2199.8096 3000 2008.7239 2199.3735 3000 2048.6858 2399.6193
3000 2017.4478 2399.1831 3000 2057.4097 2599.4289 3000
2026.1716 2598.9927 3000 2066.1336 /
ZCORN
2000 2008.7239 2008.7239 2017.4478 2017.4478 2026.1716 2000
2008.7239 2008.7239 2017.4478 2017.4478 2026.1716 2000 2008.7239
2008.7239 2017.4478 2017.4478 2026.1716 2000 2008.7239 2008.7239
2017.4478 2017.4478 2026.1716 2000 2008.7239 2008.7239 2017.4478
2017.4478 2026.1716 2000 2008.7239 2008.7239 2017.4478 2017.4478
2026.1716 2000 2008.7239 2008.7239 2017.4478 2017.4478 2026.1716
2000 2008.7239 2008.7239 2017.4478 2017.4478 2026.1716 2000
2008.7239 2008.7239 2017.4478 2017.4478 2026.1716 2000 2008.7239
2008.7239 2017.4478 2017.4478 2026.1716 2009.9905 2018.7144 2018.7144
2027.4382 2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382
2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382
2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621
2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905
2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144
2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144 2018.7144
2027.4382 2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382
2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382
2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621
2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905
2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144
2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144 2018.7144
2027.4382 2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382
2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382
2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621
2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905
2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2019.981 2028.7048
2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048
2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287
2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287
2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526
2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2019.981
2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048
2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048
2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287
2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287
2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526
2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2019.981
2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048
2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048
2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287
2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287
2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526
2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2029.9714
2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953
2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953
2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192
2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192
2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431
2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714
2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953
2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953
2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192
2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192
2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431
2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714
2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953
2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953
2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192
2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192
2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431
2039.9619 2048.6858 2048.6858 2057.4097 2057.4097 2066.1336 2039.9619
2048.6858 2048.6858 2057.4097 2057.4097 2066.1336 2039.9619 2048.6858
2048.6858 2057.4097 2057.4097 2066.1336 2039.9619 2048.6858 2048.6858
2057.4097 2057.4097 2066.1336 2039.9619 2048.6858 2048.6858 2057.4097
2057.4097 2066.1336 2039.9619 2048.6858 2048.6858 2057.4097 2057.4097
2066.1336 2039.9619 2048.6858 2048.6858 2057.4097 2057.4097 2066.1336
2039.9619 2048.6858 2048.6858 2057.4097 2057.4097 2066.1336 2039.9619
2048.6858 2048.6858 2057.4097 2057.4097 2066.1336 2039.9619 2048.6858
2048.6858 2057.4097 2057.4097 2066.1336 /
PORO
0.25 0.25 0.25 0.25 0.25 0.25 0.25
0.25 0.25 0.25 0.25 0.25 0.25 0.25
0.25 0.2 0.2 0.2 0.2 0.2 0.2
0.2 0.2 0.2 0.2 0.2 0.2 0.2
0.2 0.2 0.23 0.23 0.23 0.23 0.23
0.23 0.23 0.23 0.23 0.23 0.23 0.23
0.23 0.23 0.23 0.18 0.18 0.18 0.18
0.18 0.18 0.18 0.18 0.18 0.18 0.18
0.18 0.18 0.18 0.18 /
PERMX
500 500 500 500 500 500 500
500 500 500 500 500 500 500
500 100 100 100 100 100 100
100 100 100 100 100 100 100
100 100 1000 1000 1000 1000 1000
1000 1000 1000 1000 1000 1000 1000
1000 1000 1000 250 250 250 250
250 250 250 250 250 250 250
250 250 250 250 /
COPY
'PERMX' 'PERMY' /
'PERMX' 'PERMZ' /
/
MULTIPLY
'PERMZ' 0.1 /
/
MULTZ
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 /
EDIT
PROPS
SGOF
0 0 1 0 0.0183 0.001480314 0.8127534
0 0.0366 0.004696335 0.675857 0 0.0549 0.009371694
0.5622753 0 0.0732 0.01546379 0.4663578 0 0.0915
0.02298664 0.385133 0 0.1098 0.03197913 0.3164995 0
0.1281 0.04249268 0.2587408 0 0.1464 0.05458466 0.2103665
0 0.1647 0.06831379 0.1700565 0 0.183 0.08373629
0.1366388 0 0.2013 0.1009022 0.1090792 0 0.2196
0.1198516 0.08647139 0 0.2379 0.1406109 0.06802822 0
0.2562 0.1631885 0.05307051 0 0.2745 0.1875705 0.04101619
0 0.2928 0.2137163 0.03136912 0 0.3111 0.2415547
0.02370834 0 0.3294 0.2709792 0.01767817 0 0.3477
0.3018447 0.01297907 0 0.366 0.3339653 0.009359652 0
0.3843 0.3671116 0.006609586 0 0.4026 0.401011 0.00455345
0 0.4209 0.4353486 0.003045475 0 0.4392 0.4697695
0.001965044 0 0.4575 0.5038828 0.001212868 0 0.4758
0.5372664 0.0007077659 0 0.4941 0.5694721 0.000383946 0
0.5124 0.6000285 0.0001887263 0 0.5307 0.6284408 8.062741e-05
0 0.549 0.6541796 2.778023e-05 0 0.5673 0.676644
6.602397e-06 0 0.5856 0.6950468 7.048731e-07 0 0.61
0.71 0 0 0.6275 0.7825 0 0
0.645 0.855 0 0 0.6625 0.9275 0
0 0.68 1 0 0 /
SWOF
0.32 0 1 0 0.3365 3.00925e-08 0.9804566
0 0.353 7.541952e-07 0.9391194 0 0.3695 5.01876e-06
0.8832853 0 0.386 1.941502e-05 0.8178788 0 0.4025
5.581854e-05 0.7471578 0 0.419 0.0001330574 0.674704 0
0.4355 0.0002787865 0.60333 0 0.452 0.0005316304 0.535068
0 0.4685 0.0009436502 0.4712431 0 0.485 0.001583182
0.412597 0 0.5015 0.002538082 0.3594268 0 0.518
0.00391938 0.3117147 0 0.5345 0.005865308 0.2692366 0
0.551 0.008545575 0.2316458 0 0.5675 0.01216566 0.1985336
0 0.584 0.01697073 0.169471 0 0.6005 0.0232485
0.1440352 0 0.617 0.03133019 0.1218258 0 0.6335
0.04158825 0.1024735 0 0.65 0.05442925 0.08564409 0
0.6665 0.07028023 0.0710386 0 0.683 0.08956673 0.05839253
0 0.6995 0.1126816 0.0474734 0 0.716 0.1399451
0.03807806 0 0.7325 0.1715593 0.03002991 0 0.749
0.2075632 0.02317622 0 0.7655 0.2478002 0.01738581 0
0.782 0.2919105 0.01254709 0 0.7985 0.3393688 0.008566921
0 0.815 0.3895919 0.005370427 0 0.8315 0.4421811
0.002903191 0 0.848 0.4975608 0.001139647 0 0.87
0.59168 0 0 0.8885714 0.6500114 0 0
0.9071429 0.7083429 0 0 0.9257143 0.7666743 0
0 0.9442857 0.8250057 0 0 0.9628571 0.8833371
0 0 0.9814286 0.9416686 0 0 1
1 0 0 /
PVDG
20 0.061895 0.01299 40 0.030252 0.01383 60
0.019844 0.0145 80 0.014686 0.0152 100 0.011627
0.01596 120 0.009619 0.01682 140 0.008213 0.0178
160 0.007184 0.0189 197.66 0.00582 0.0216 231.13
0.005042 0.02477 261.31 0.004561 0.02844 288.87 0.004255
0.03272 314.34 0.004062 0.03783 338.2 0.003953 0.0441
360.83 0.003947 0.0521 382.58 0.003915 0.06273 403.6
0.003912 0.07723 423.77 0.003907 0.09631 /
PVTO
19.6 20 1.12324 0.96519 55 1.11698 1.03237
90 1.11127 1.10051 125 1.10602 1.16942 160
1.10119 1.2389 195 1.09672 1.30876 230 1.09256
1.37884 265 1.08868 1.44899 300 1.08504 1.51908
335 1.08164 1.58903 370 1.07843 1.65876 /
31.5 40 1.15981 0.85738 75 1.15288 0.91402
110 1.14657 0.97137 145 1.14079 1.02927 180
1.13546 1.08759 215 1.13053 1.14617 250 1.12595
1.20488 285 1.12168 1.2636 320 1.11768 1.32224
355 1.11394 1.38073 390 1.11042 1.43898 /
42.4 60 1.191 0.7868 95 1.184 0.8364
130 1.177 0.8866 165 1.171 0.9371 200
1.165 0.988 235 1.16 1.039 270 1.155
1.0902 305 1.15 1.1413 340 1.146 1.1922
375 1.142 1.2431 410 1.138 1.2936 /
53.4 80 1.222 0.7175 115 1.214 0.7608
150 1.206 0.8045 185 1.2 0.8485 220
1.194 0.8928 255 1.188 0.9371 290 1.183
0.9815 325 1.178 1.0258 360 1.173 1.07
395 1.169 1.1141 430 1.165 1.1579 /
64.6 100 1.252 0.6544 135 1.244 0.6923
170 1.236 0.7305 205 1.229 0.7689 240
1.222 0.8075 275 1.216 0.8461 310 1.211
0.8847 345 1.205 0.9233 380 1.2 0.9618
415 1.196 1 450 1.191 1.0381 /
76.3 120 1.284 0.5978 155 1.275 0.6312
190 1.266 0.6648 225 1.259 0.6985 260
1.252 0.7323 295 1.245 0.7661 330 1.239
0.7999 365 1.234 0.8337 400 1.229 0.8673
435 1.224 0.9007 470 1.219 0.934 /
88.5 140 1.316 0.5477 175 1.307 0.5749
210 1.298 0.602 245 1.29 0.629 280
1.282 0.6559 315 1.276 0.6827 350 1.269
0.7095 385 1.263 0.7362 420 1.258 0.7629
455 1.253 0.7895 490 1.248 0.8161 /
101.3 160 1.35 0.502 195 1.34 0.5227
230 1.331 0.5432 265 1.322 0.5635 300
1.314 0.5835 335 1.307 0.6034 370 1.3
0.6231 405 1.294 0.6426 440 1.288 0.662
475 1.283 0.6813 /
114.7 180 1.385 0.4636 215 1.375 0.482
250 1.365 0.5003 285 1.356 0.5183 320
1.347 0.5362 355 1.34 0.5538 390 1.333
0.5712 425 1.326 0.5885 460 1.32 0.6055
495 1.314 0.6222 /
128.9 200 1.422 0.429 235 1.411 0.4455
270 1.401 0.4618 305 1.391 0.4779 340
1.382 0.4938 375 1.374 0.5096 410 1.367
0.5252 445 1.36 0.5406 480 1.353 0.5558 /
143.8 220 1.461 0.3977 255 1.449 0.4125
290 1.438 0.4271 325 1.428 0.4415 360
1.419 0.4558 395 1.41 0.4699 430 1.402
0.4839 465 1.395 0.4977 /
159.5 240 1.502 0.3692 275 1.489 0.3825
310 1.478 0.3956 345 1.467 0.4086 380
1.458 0.4214 415 1.449 0.4341 450 1.44
0.4466 485 1.432 0.459 /
184 268.79 1.565 0.3324 303.79 1.551 0.3438
338.79 1.539 0.3551 373.79 1.528 0.3663 408.79
1.517 0.3774 443.79 1.508 0.3883 478.79 1.499
0.3991 /
226.3 306.18 1.679 0.2855 341.18 1.664 0.2949
376.18 1.65 0.3041 411.18 1.637 0.3132 446.18
1.625 0.3222 481.18 1.614 0.3311 /
268.6 339.93 1.792 0.2517 374.93 1.775 0.2597
409.93 1.76 0.2675 444.93 1.746 0.2751 479.93
1.732 0.2827 /
310.9 371.44 1.903 0.2265 406.44 1.885 0.2333
441.44 1.868 0.2401 476.44 1.853 0.2468 /
353.3 401.66 2.013 0.2071 436.66 1.993 0.2132
471.66 1.975 0.2192 /
/
PVTW
344.83 1.0292 4.002e-05 0.36 0 /
ROCK
383 4.12e-05 /
DENSITY
842.3 1001.1 0.9 /
REGIONS
EQLNUM
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 2 2 2 2 2
2 2 2 2 2 2 2
2 2 2 2 2 2 2
2 2 2 2 2 2 2
2 2 2 2 /
SOLUTION
EQUIL
2030 382.4 2030 0 500 0 1
1 0 /
2050 382.4 2050 0 500 0 1
1 0 /
RSVD
1500 180 4000 180 /
1500 180 4000 180 /
RPTRST
'BASIC=2' 'PBPD' /
SUMMARY
FOPR
FOPRH
FGPR
FGPRH
FWPR
FWPRH
FWIR
FWIP
FOIP
FGIP
FWCT
FWCTH
FGOR
FGORH
FPR
RPR
/
ROIP
/
ROIPL
/
ROIPG
/
RGIP
/
RGIPL
/
RGIPG
/
RGPR
/
RGPT
/
GWIR
/
GVIR
/
GOPR
/
GWPR
/
GLPR
/
GLPR
/
GVPR
/
WOPR
/
WOPRH
/
WGPR
/
WGPRH
/
WWPR
/
WWPRH
/
WOPT
/
WWPT
/
WGPT
/
WOPTH
/
WWPTH
/
WGPTH
/
WWCT
/
WWCTH
/
WGOR
/
WGORH
/
WWIR
/
WWIRH
/
WGIR
/
WGIRH
/
WWIT
/
WWITH
/
WGIT
/
WGITH
/
WBHP
/
WTHP
/
WPI
/
WVPR
/
WBP
/
WBP4
/
WBP9
/
WMCTL
/
WLPR
/
FMWIN
FMWPR
GMWPR
'UPPER' 'LOWER' /
GMWIN
'UPPER' 'LOWER' /
WUPR1
'OP*' /
WUPR3
'OP*' /
SCHEDULE
GRUPTREE
'UPPER' 'TEST' /
'LOWER' 'TEST' /
/
WELSPECS
'OPU01' 'UPPER' 1 2 2002 'OIL' 0
'STD' 'SHUT' 'YES' 0 'SEG' /
'OPU02' 'UPPER' 1 4 2002 'OIL' 0
'STD' 'SHUT' 'YES' 0 'SEG' /
'OPL01' 'LOWER' 1 2 2025 'OIL' 0
'STD' 'SHUT' 'YES' 0 'SEG' /
'OPL02' 'LOWER' 1 4 2025 'OIL' 0
'STD' 'SHUT' 'YES' 0 'SEG' /
/
WELSPECS
'WIU01' 'UPPER' 3 3 2030 'WATER' 0
'STD' 'SHUT' 'YES' 0 'SEG' /
'WIL01' 'LOWER' 3 3 2050 'WATER' 0
'STD' 'SHUT' 'YES' 0 'SEG' /
/
COMPDAT
'OPU01' 1 2 1 1 'OPEN' 0
1* 0.241 1* 2.5 0 'Z' /
'OPU02' 1 4 1 1 'OPEN' 0
1* 0.241 1* 2.5 0 'Z' /
'OPL01' 1 2 3 3 'OPEN' 0
1* 0.241 1* 2.5 0 'Z' /
'OPL02' 1 4 3 3 'OPEN' 0
1* 0.241 1* 2.5 0 'Z' /
'WIU01' 3 3 2 2 'OPEN' 0
1* 0.241 1* 2.5 0 'Z' /
'WIL01' 3 3 4 4 'OPEN' 0
1* 0.241 1* 2.5 0 'Z' /
/
WCONPROD
'OPU*' 'SHUT' 'GRUP' 1500 2* 2500 1*
60 /
'OPL*' 'SHUT' 'GRUP' 1500 2* 2500 1*
60 /
/
WCONINJE
'WIU*' 'WATER' 'SHUT' 'GRUP' 10500 1* 500 /
'WIL*' 'WATER' 'SHUT' 'GRUP' 10500 1* 500 /
/
UDQ
DEFINE 'WUPR1' 1/(WWCT 'OP*' ) /
DEFINE 'WUPR3' SORTA(WUPR1) /
/
GCONPROD
'TEST' 'LRAT' 6000 2* 6000 'RATE' 'NO' /
'LOWER' 'FLD' 6000 2* 6000 'RATE' 'YES'
1* 'FORM' /
'UPPER' 'FLD' 3000 2* 6000 'RATE' 'YES'
1* 'FORM' /
/
GCONINJE
'LOWER' 'WATER' 'VREP' 3* 1.2 /
'UPPER' 'WATER' 'VREP' 3* 2 /
/
GUIDERAT
0 'OIL' 1 0.5 1 1 0
0 'YES' 0.5 /
ACTIONX
'ACT01' 10 /
FMWPR >= 4 AND /
WUPR3 'OP*' = 1 /
/
WELOPEN
'?' 'SHUT' 0 0 0 /
/
ENDACTIO
DATES
1 'SEP' 2018 /
/
WELOPEN
'OPL01' 'OPEN' /
/
DATES
1 'OCT' 2018 /
/
WELOPEN
'WIL01' 'OPEN' /
/
DATES
1 'NOV' 2018 /
/
WELOPEN
'OPL02' 'OPEN' /
/
DATES
1 'DEC' 2018 /
/
WELOPEN
'OPU01' 'OPEN' /
/
DATES
1 'MAY' 2019 /
/
WELOPEN
'OPU02' 'OPEN' /
/
DATES
1 'JUN' 2019 /
/
WELOPEN
'WIU01' 'OPEN' /
/
DATES
1 'JAN' 2021 /
/
DATES
1 'MAR' 2021 /
/
DATES
1 'MAY' 2021 /
/
DATES
1 'JUL' 2021 /
/

BIN
tests/UDQ_ACTIONX.X0007 Normal file

Binary file not shown.

View File

@ -0,0 +1,563 @@
RUNSPEC
TITLE
'Generic' 'Reservoir'
NOECHO
DIMENS
3 5 4 /
START
22 'AUG' 2018 /
OIL
GAS
WATER
DISGAS
METRIC
TABDIMS
1 1 130 24 1 20 /
EQLDIMS
2 100 20 /
WELLDIMS
230 120 50 80 /
UNIFOUT
UDQDIMS
50 25 0 50 50 0 0
50 0 20 /
UDADIMS
10 1* 10 /
GRID
NOECHO
INIT
GRIDFILE
0 1 /
MAPAXES
0 100 0 0 100 0 /
NOECHO
SPECGRID
3 5 4 1 'F' /
COORD
2000 2000 2000 1999.5638 2000 2039.9619 2199.8096
2000 2008.7239 2199.3735 2000 2048.6858 2399.6193 2000
2017.4478 2399.1831 2000 2057.4097 2599.4289 2000 2026.1716
2598.9927 2000 2066.1336 2000 2200 2000 1999.5638
2200 2039.9619 2199.8096 2200 2008.7239 2199.3735 2200
2048.6858 2399.6193 2200 2017.4478 2399.1831 2200 2057.4097
2599.4289 2200 2026.1716 2598.9927 2200 2066.1336 2000
2400 2000 1999.5638 2400 2039.9619 2199.8096 2400
2008.7239 2199.3735 2400 2048.6858 2399.6193 2400 2017.4478
2399.1831 2400 2057.4097 2599.4289 2400 2026.1716 2598.9927
2400 2066.1336 2000 2600 2000 1999.5638 2600
2039.9619 2199.8096 2600 2008.7239 2199.3735 2600 2048.6858
2399.6193 2600 2017.4478 2399.1831 2600 2057.4097 2599.4289
2600 2026.1716 2598.9927 2600 2066.1336 2000 2800
2000 1999.5638 2800 2039.9619 2199.8096 2800 2008.7239
2199.3735 2800 2048.6858 2399.6193 2800 2017.4478 2399.1831
2800 2057.4097 2599.4289 2800 2026.1716 2598.9927 2800
2066.1336 2000 3000 2000 1999.5638 3000 2039.9619
2199.8096 3000 2008.7239 2199.3735 3000 2048.6858 2399.6193
3000 2017.4478 2399.1831 3000 2057.4097 2599.4289 3000
2026.1716 2598.9927 3000 2066.1336 /
ZCORN
2000 2008.7239 2008.7239 2017.4478 2017.4478 2026.1716 2000
2008.7239 2008.7239 2017.4478 2017.4478 2026.1716 2000 2008.7239
2008.7239 2017.4478 2017.4478 2026.1716 2000 2008.7239 2008.7239
2017.4478 2017.4478 2026.1716 2000 2008.7239 2008.7239 2017.4478
2017.4478 2026.1716 2000 2008.7239 2008.7239 2017.4478 2017.4478
2026.1716 2000 2008.7239 2008.7239 2017.4478 2017.4478 2026.1716
2000 2008.7239 2008.7239 2017.4478 2017.4478 2026.1716 2000
2008.7239 2008.7239 2017.4478 2017.4478 2026.1716 2000 2008.7239
2008.7239 2017.4478 2017.4478 2026.1716 2009.9905 2018.7144 2018.7144
2027.4382 2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382
2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382
2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621
2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905
2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144
2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144 2018.7144
2027.4382 2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382
2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382
2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621
2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905
2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144
2018.7144 2027.4382 2027.4382 2036.1621 2009.9905 2018.7144 2018.7144
2027.4382 2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382
2027.4382 2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382
2036.1621 2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621
2009.9905 2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2009.9905
2018.7144 2018.7144 2027.4382 2027.4382 2036.1621 2019.981 2028.7048
2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048
2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287
2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287
2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526
2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2019.981
2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048
2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048
2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287
2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287
2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526
2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2019.981
2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048
2028.7048 2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048
2037.4287 2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287
2037.4287 2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287
2046.1526 2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526
2019.981 2028.7048 2028.7048 2037.4287 2037.4287 2046.1526 2029.9714
2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953
2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953
2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192
2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192
2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431
2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714
2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953
2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953
2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192
2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192
2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431
2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714
2038.6953 2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953
2038.6953 2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953
2047.4192 2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192
2047.4192 2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192
2056.1431 2029.9714 2038.6953 2038.6953 2047.4192 2047.4192 2056.1431
2039.9619 2048.6858 2048.6858 2057.4097 2057.4097 2066.1336 2039.9619
2048.6858 2048.6858 2057.4097 2057.4097 2066.1336 2039.9619 2048.6858
2048.6858 2057.4097 2057.4097 2066.1336 2039.9619 2048.6858 2048.6858
2057.4097 2057.4097 2066.1336 2039.9619 2048.6858 2048.6858 2057.4097
2057.4097 2066.1336 2039.9619 2048.6858 2048.6858 2057.4097 2057.4097
2066.1336 2039.9619 2048.6858 2048.6858 2057.4097 2057.4097 2066.1336
2039.9619 2048.6858 2048.6858 2057.4097 2057.4097 2066.1336 2039.9619
2048.6858 2048.6858 2057.4097 2057.4097 2066.1336 2039.9619 2048.6858
2048.6858 2057.4097 2057.4097 2066.1336 /
PORO
0.25 0.25 0.25 0.25 0.25 0.25 0.25
0.25 0.25 0.25 0.25 0.25 0.25 0.25
0.25 0.2 0.2 0.2 0.2 0.2 0.2
0.2 0.2 0.2 0.2 0.2 0.2 0.2
0.2 0.2 0.23 0.23 0.23 0.23 0.23
0.23 0.23 0.23 0.23 0.23 0.23 0.23
0.23 0.23 0.23 0.18 0.18 0.18 0.18
0.18 0.18 0.18 0.18 0.18 0.18 0.18
0.18 0.18 0.18 0.18 /
PERMX
500 500 500 500 500 500 500
500 500 500 500 500 500 500
500 100 100 100 100 100 100
100 100 100 100 100 100 100
100 100 1000 1000 1000 1000 1000
1000 1000 1000 1000 1000 1000 1000
1000 1000 1000 250 250 250 250
250 250 250 250 250 250 250
250 250 250 250 /
COPY
'PERMX' 'PERMY' /
'PERMX' 'PERMZ' /
/
MULTIPLY
'PERMZ' 0.1 /
/
MULTZ
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 /
EDIT
PROPS
SGOF
0 0 1 0 0.0183 0.001480314 0.8127534
0 0.0366 0.004696335 0.675857 0 0.0549 0.009371694
0.5622753 0 0.0732 0.01546379 0.4663578 0 0.0915
0.02298664 0.385133 0 0.1098 0.03197913 0.3164995 0
0.1281 0.04249268 0.2587408 0 0.1464 0.05458466 0.2103665
0 0.1647 0.06831379 0.1700565 0 0.183 0.08373629
0.1366388 0 0.2013 0.1009022 0.1090792 0 0.2196
0.1198516 0.08647139 0 0.2379 0.1406109 0.06802822 0
0.2562 0.1631885 0.05307051 0 0.2745 0.1875705 0.04101619
0 0.2928 0.2137163 0.03136912 0 0.3111 0.2415547
0.02370834 0 0.3294 0.2709792 0.01767817 0 0.3477
0.3018447 0.01297907 0 0.366 0.3339653 0.009359652 0
0.3843 0.3671116 0.006609586 0 0.4026 0.401011 0.00455345
0 0.4209 0.4353486 0.003045475 0 0.4392 0.4697695
0.001965044 0 0.4575 0.5038828 0.001212868 0 0.4758
0.5372664 0.0007077659 0 0.4941 0.5694721 0.000383946 0
0.5124 0.6000285 0.0001887263 0 0.5307 0.6284408 8.062741e-05
0 0.549 0.6541796 2.778023e-05 0 0.5673 0.676644
6.602397e-06 0 0.5856 0.6950468 7.048731e-07 0 0.61
0.71 0 0 0.6275 0.7825 0 0
0.645 0.855 0 0 0.6625 0.9275 0
0 0.68 1 0 0 /
SWOF
0.32 0 1 0 0.3365 3.00925e-08 0.9804566
0 0.353 7.541952e-07 0.9391194 0 0.3695 5.01876e-06
0.8832853 0 0.386 1.941502e-05 0.8178788 0 0.4025
5.581854e-05 0.7471578 0 0.419 0.0001330574 0.674704 0
0.4355 0.0002787865 0.60333 0 0.452 0.0005316304 0.535068
0 0.4685 0.0009436502 0.4712431 0 0.485 0.001583182
0.412597 0 0.5015 0.002538082 0.3594268 0 0.518
0.00391938 0.3117147 0 0.5345 0.005865308 0.2692366 0
0.551 0.008545575 0.2316458 0 0.5675 0.01216566 0.1985336
0 0.584 0.01697073 0.169471 0 0.6005 0.0232485
0.1440352 0 0.617 0.03133019 0.1218258 0 0.6335
0.04158825 0.1024735 0 0.65 0.05442925 0.08564409 0
0.6665 0.07028023 0.0710386 0 0.683 0.08956673 0.05839253
0 0.6995 0.1126816 0.0474734 0 0.716 0.1399451
0.03807806 0 0.7325 0.1715593 0.03002991 0 0.749
0.2075632 0.02317622 0 0.7655 0.2478002 0.01738581 0
0.782 0.2919105 0.01254709 0 0.7985 0.3393688 0.008566921
0 0.815 0.3895919 0.005370427 0 0.8315 0.4421811
0.002903191 0 0.848 0.4975608 0.001139647 0 0.87
0.59168 0 0 0.8885714 0.6500114 0 0
0.9071429 0.7083429 0 0 0.9257143 0.7666743 0
0 0.9442857 0.8250057 0 0 0.9628571 0.8833371
0 0 0.9814286 0.9416686 0 0 1
1 0 0 /
PVDG
20 0.061895 0.01299 40 0.030252 0.01383 60
0.019844 0.0145 80 0.014686 0.0152 100 0.011627
0.01596 120 0.009619 0.01682 140 0.008213 0.0178
160 0.007184 0.0189 197.66 0.00582 0.0216 231.13
0.005042 0.02477 261.31 0.004561 0.02844 288.87 0.004255
0.03272 314.34 0.004062 0.03783 338.2 0.003953 0.0441
360.83 0.003947 0.0521 382.58 0.003915 0.06273 403.6
0.003912 0.07723 423.77 0.003907 0.09631 /
PVTO
19.6 20 1.12324 0.96519 55 1.11698 1.03237
90 1.11127 1.10051 125 1.10602 1.16942 160
1.10119 1.2389 195 1.09672 1.30876 230 1.09256
1.37884 265 1.08868 1.44899 300 1.08504 1.51908
335 1.08164 1.58903 370 1.07843 1.65876 /
31.5 40 1.15981 0.85738 75 1.15288 0.91402
110 1.14657 0.97137 145 1.14079 1.02927 180
1.13546 1.08759 215 1.13053 1.14617 250 1.12595
1.20488 285 1.12168 1.2636 320 1.11768 1.32224
355 1.11394 1.38073 390 1.11042 1.43898 /
42.4 60 1.191 0.7868 95 1.184 0.8364
130 1.177 0.8866 165 1.171 0.9371 200
1.165 0.988 235 1.16 1.039 270 1.155
1.0902 305 1.15 1.1413 340 1.146 1.1922
375 1.142 1.2431 410 1.138 1.2936 /
53.4 80 1.222 0.7175 115 1.214 0.7608
150 1.206 0.8045 185 1.2 0.8485 220
1.194 0.8928 255 1.188 0.9371 290 1.183
0.9815 325 1.178 1.0258 360 1.173 1.07
395 1.169 1.1141 430 1.165 1.1579 /
64.6 100 1.252 0.6544 135 1.244 0.6923
170 1.236 0.7305 205 1.229 0.7689 240
1.222 0.8075 275 1.216 0.8461 310 1.211
0.8847 345 1.205 0.9233 380 1.2 0.9618
415 1.196 1 450 1.191 1.0381 /
76.3 120 1.284 0.5978 155 1.275 0.6312
190 1.266 0.6648 225 1.259 0.6985 260
1.252 0.7323 295 1.245 0.7661 330 1.239
0.7999 365 1.234 0.8337 400 1.229 0.8673
435 1.224 0.9007 470 1.219 0.934 /
88.5 140 1.316 0.5477 175 1.307 0.5749
210 1.298 0.602 245 1.29 0.629 280
1.282 0.6559 315 1.276 0.6827 350 1.269
0.7095 385 1.263 0.7362 420 1.258 0.7629
455 1.253 0.7895 490 1.248 0.8161 /
101.3 160 1.35 0.502 195 1.34 0.5227
230 1.331 0.5432 265 1.322 0.5635 300
1.314 0.5835 335 1.307 0.6034 370 1.3
0.6231 405 1.294 0.6426 440 1.288 0.662
475 1.283 0.6813 /
114.7 180 1.385 0.4636 215 1.375 0.482
250 1.365 0.5003 285 1.356 0.5183 320
1.347 0.5362 355 1.34 0.5538 390 1.333
0.5712 425 1.326 0.5885 460 1.32 0.6055
495 1.314 0.6222 /
128.9 200 1.422 0.429 235 1.411 0.4455
270 1.401 0.4618 305 1.391 0.4779 340
1.382 0.4938 375 1.374 0.5096 410 1.367
0.5252 445 1.36 0.5406 480 1.353 0.5558 /
143.8 220 1.461 0.3977 255 1.449 0.4125
290 1.438 0.4271 325 1.428 0.4415 360
1.419 0.4558 395 1.41 0.4699 430 1.402
0.4839 465 1.395 0.4977 /
159.5 240 1.502 0.3692 275 1.489 0.3825
310 1.478 0.3956 345 1.467 0.4086 380
1.458 0.4214 415 1.449 0.4341 450 1.44
0.4466 485 1.432 0.459 /
184 268.79 1.565 0.3324 303.79 1.551 0.3438
338.79 1.539 0.3551 373.79 1.528 0.3663 408.79
1.517 0.3774 443.79 1.508 0.3883 478.79 1.499
0.3991 /
226.3 306.18 1.679 0.2855 341.18 1.664 0.2949
376.18 1.65 0.3041 411.18 1.637 0.3132 446.18
1.625 0.3222 481.18 1.614 0.3311 /
268.6 339.93 1.792 0.2517 374.93 1.775 0.2597
409.93 1.76 0.2675 444.93 1.746 0.2751 479.93
1.732 0.2827 /
310.9 371.44 1.903 0.2265 406.44 1.885 0.2333
441.44 1.868 0.2401 476.44 1.853 0.2468 /
353.3 401.66 2.013 0.2071 436.66 1.993 0.2132
471.66 1.975 0.2192 /
/
PVTW
344.83 1.0292 4.002e-05 0.36 0 /
ROCK
383 4.12e-05 /
DENSITY
842.3 1001.1 0.9 /
REGIONS
EQLNUM
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 2 2 2 2 2
2 2 2 2 2 2 2
2 2 2 2 2 2 2
2 2 2 2 2 2 2
2 2 2 2 /
SOLUTION
RESTART
'UDQ_ACTIONX' 7 /
RPTRST
'BASIC=2' 'PBPD' /
SUMMARY
FOPR
FOPRH
FGPR
FGPRH
FWPR
FWPRH
FWIR
FWIP
FOIP
FGIP
FWCT
FWCTH
FGOR
FGORH
FPR
RPR
/
ROIP
/
ROIPL
/
ROIPG
/
RGIP
/
RGIPL
/
RGIPG
/
RGPR
/
RGPT
/
GWIR
/
GVIR
/
GOPR
/
GWPR
/
GLPR
/
GLPR
/
GVPR
/
WOPR
/
WOPRH
/
WGPR
/
WGPRH
/
WWPR
/
WWPRH
/
WOPT
/
WWPT
/
WGPT
/
WOPTH
/
WWPTH
/
WGPTH
/
WWCT
/
WWCTH
/
WGOR
/
WGORH
/
WWIR
/
WWIRH
/
WGIR
/
WGIRH
/
WWIT
/
WWITH
/
WGIT
/
WGITH
/
WBHP
/
WTHP
/
WPI
/
WVPR
/
WBP
/
WBP4
/
WBP9
/
WMCTL
/
WLPR
/
FMWIN
FMWPR
GMWPR
'UPPER' 'LOWER' /
GMWIN
'UPPER' 'LOWER' /
WUPR1
'OP*' /
WUPR3
'OP*' /
SCHEDULE
SKIPREST
GRUPTREE
'UPPER' 'TEST' /
'LOWER' 'TEST' /
/
WELSPECS
'OPU01' 'UPPER' 1 2 2002 'OIL' 0
'STD' 'SHUT' 'YES' 0 'SEG' /
'OPU02' 'UPPER' 1 4 2002 'OIL' 0
'STD' 'SHUT' 'YES' 0 'SEG' /
'OPL01' 'LOWER' 1 2 2025 'OIL' 0
'STD' 'SHUT' 'YES' 0 'SEG' /
'OPL02' 'LOWER' 1 4 2025 'OIL' 0
'STD' 'SHUT' 'YES' 0 'SEG' /
/
WELSPECS
'WIU01' 'UPPER' 3 3 2030 'WATER' 0
'STD' 'SHUT' 'YES' 0 'SEG' /
'WIL01' 'LOWER' 3 3 2050 'WATER' 0
'STD' 'SHUT' 'YES' 0 'SEG' /
/
COMPDAT
'OPU01' 1 2 1 1 'OPEN' 0
1* 0.241 1* 2.5 0 'Z' /
'OPU02' 1 4 1 1 'OPEN' 0
1* 0.241 1* 2.5 0 'Z' /
'OPL01' 1 2 3 3 'OPEN' 0
1* 0.241 1* 2.5 0 'Z' /
'OPL02' 1 4 3 3 'OPEN' 0
1* 0.241 1* 2.5 0 'Z' /
'WIU01' 3 3 2 2 'OPEN' 0
1* 0.241 1* 2.5 0 'Z' /
'WIL01' 3 3 4 4 'OPEN' 0
1* 0.241 1* 2.5 0 'Z' /
/
WCONPROD
'OPU*' 'SHUT' 'GRUP' 1500 2* 2500 1*
60 /
'OPL*' 'SHUT' 'GRUP' 1500 2* 2500 1*
60 /
/
WCONINJE
'WIU*' 'WATER' 'SHUT' 'GRUP' 10500 1* 500 /
'WIL*' 'WATER' 'SHUT' 'GRUP' 10500 1* 500 /
/
UDQ
DEFINE 'WUPR1' 1/(WWCT 'OP*' ) /
DEFINE 'WUPR3' SORTA(WUPR1) /
/
GCONPROD
'TEST' 'LRAT' 6000 2* 6000 'RATE' 'NO' /
'LOWER' 'FLD' 6000 2* 6000 'RATE' 'YES'
1* 'FORM' /
'UPPER' 'FLD' 3000 2* 6000 'RATE' 'YES'
1* 'FORM' /
/
GCONINJE
'LOWER' 'WATER' 'VREP' 3* 1.2 /
'UPPER' 'WATER' 'VREP' 3* 2 /
/
GUIDERAT
0 'OIL' 1 0.5 1 1 0
0 'YES' 0.5 /
ACTIONX
'ACT01' 10 /
FMWPR >= 4 AND /
WUPR3 'OP*' = 1 /
/
WELOPEN
'?' 'SHUT' 0 0 0 /
/
ENDACTIO
DATES
1 'SEP' 2018 /
/
WELOPEN
'OPL01' 'OPEN' /
/
DATES
1 'OCT' 2018 /
/
WELOPEN
'WIL01' 'OPEN' /
/
DATES
1 'NOV' 2018 /
/
WELOPEN
'OPL02' 'OPEN' /
/
DATES
1 'DEC' 2018 /
/
WELOPEN
'OPU01' 'OPEN' /
/
DATES
1 'MAY' 2019 /
/
WELOPEN
'OPU02' 'OPEN' /
/
DATES
1 'JUN' 2019 /
/
WELOPEN
'WIU01' 'OPEN' /
/
DATES
1 'JAN' 2021 /
/
DATES
1 'MAR' 2021 /
/
DATES
1 'MAY' 2021 /
/
DATES
1 'JUL' 2021 /
/

View File

@ -702,7 +702,7 @@ BOOST_AUTO_TEST_CASE(Conditions) {
BOOST_CHECK_THROW(Action::Condition cond({"WWCT", "OPX", ">"}, location), std::invalid_argument);
Action::Condition cond({"WWCT", "OPX", ">", "0.75", "AND"}, location);
BOOST_CHECK(cond.cmp == Action::Condition::Comparator::GREATER);
BOOST_CHECK(cond.cmp == Action::Comparator::GREATER);
BOOST_CHECK(cond.cmp_string == ">" );
BOOST_CHECK_EQUAL(cond.lhs.quantity, "WWCT");
BOOST_CHECK_EQUAL(cond.lhs.args.size(), 1U);
@ -712,10 +712,10 @@ BOOST_AUTO_TEST_CASE(Conditions) {
BOOST_CHECK_EQUAL(cond.rhs.quantity, "0.75");
BOOST_CHECK_EQUAL(cond.rhs.args.size(), 0U);
BOOST_CHECK(cond.logic == Action::Condition::Logical::AND);
BOOST_CHECK(cond.logic == Action::Logical::AND);
Action::Condition cond2({"WWCT", "OPX", "<=", "WSOPR", "OPX", "235"}, location);
BOOST_CHECK(cond2.cmp == Action::Condition::Comparator::LESS_EQUAL);
BOOST_CHECK(cond2.cmp == Action::Comparator::LESS_EQUAL);
BOOST_CHECK(cond2.cmp_string == "<=" );
BOOST_CHECK_EQUAL(cond2.lhs.quantity, "WWCT");
BOOST_CHECK_EQUAL(cond2.lhs.args.size(), 1U);
@ -725,7 +725,7 @@ BOOST_AUTO_TEST_CASE(Conditions) {
BOOST_CHECK_EQUAL(cond2.rhs.args.size(), 2U);
BOOST_CHECK_EQUAL(cond2.rhs.args[0], "OPX");
BOOST_CHECK_EQUAL(cond2.rhs.args[1], "235");
BOOST_CHECK(cond2.logic == Action::Condition::Logical::END);
BOOST_CHECK(cond2.logic == Action::Logical::END);
}
@ -808,8 +808,8 @@ TSTEP
const auto& cond0 = conditions[0];
BOOST_CHECK_EQUAL(cond0.lhs.quantity, "WWCT");
BOOST_CHECK(cond0.cmp == Action::Condition::Comparator::GREATER);
BOOST_CHECK(cond0.logic == Action::Condition::Logical::AND);
BOOST_CHECK(cond0.cmp == Action::Comparator::GREATER);
BOOST_CHECK(cond0.logic == Action::Logical::AND);
BOOST_CHECK_EQUAL(cond0.lhs.args.size(), 1U);
BOOST_CHECK_EQUAL(cond0.lhs.args[0], "OPX");
BOOST_CHECK_EQUAL(cond0.rhs.args.size(), 0U);
@ -817,8 +817,8 @@ TSTEP
const auto& cond1 = conditions[1];
BOOST_CHECK_EQUAL(cond1.lhs.quantity, "FPR");
BOOST_CHECK(cond1.cmp == Action::Condition::Comparator::LESS);
BOOST_CHECK(cond1.logic == Action::Condition::Logical::END);
BOOST_CHECK(cond1.cmp == Action::Comparator::LESS);
BOOST_CHECK(cond1.logic == Action::Logical::END);
/*****************************************************************/
@ -829,16 +829,16 @@ TSTEP
const auto& condB = actB.conditions();
BOOST_CHECK_EQUAL(condB.size() , 1U);
BOOST_CHECK_EQUAL(condB[0].lhs.quantity, "FWCT");
BOOST_CHECK(condB[0].cmp == Action::Condition::Comparator::LESS_EQUAL);
BOOST_CHECK(condB[0].logic == Action::Condition::Logical::END);
BOOST_CHECK(condB[0].cmp == Action::Comparator::LESS_EQUAL);
BOOST_CHECK(condB[0].logic == Action::Logical::END);
BOOST_CHECK_EQUAL(condB[0].cmp_string, "<=");
const auto& actA = actions2["A"];
const auto& condA = actA.conditions();
BOOST_CHECK_EQUAL(condA.size() , 1U);
BOOST_CHECK_EQUAL(condA[0].lhs.quantity, "WOPR");
BOOST_CHECK(condA[0].cmp == Action::Condition::Comparator::EQUAL);
BOOST_CHECK(condA[0].logic == Action::Condition::Logical::END);
BOOST_CHECK(condA[0].cmp == Action::Comparator::EQUAL);
BOOST_CHECK(condA[0].logic == Action::Logical::END);
BOOST_CHECK_EQUAL(condA[0].cmp_string , "=");
std::size_t index = 0;

View File

@ -171,3 +171,11 @@ BOOST_AUTO_TEST_CASE(LoadUDQRestartSim) {
}
}
}
BOOST_AUTO_TEST_CASE(LoadActionRestartSim) {
const auto& [sched, restart_sched] = load_schedule_pair("UDQ_ACTIONX.DATA", "UDQ_ACTIONX_RESTART.DATA", "UDQ_ACTIONX.X0007", 7);
const auto& input_actions = sched[7].actions();
const auto& rst_actions = restart_sched[7].actions();
BOOST_CHECK_EQUAL(input_actions.ecl_size(), rst_actions.ecl_size());
}

File diff suppressed because it is too large Load Diff