Merge pull request #2045 from joakim-hove/include-udq-summary-commits
Include udq summary commits
This commit is contained in:
commit
5c1604c5f2
@ -234,6 +234,7 @@ namespace Opm
|
||||
const GConSump& gConSump(std::size_t timestep) const;
|
||||
const WListManager& getWListManager(std::size_t timeStep) const;
|
||||
const UDQConfig& getUDQConfig(std::size_t timeStep) const;
|
||||
std::vector<const UDQConfig*> udqConfigList() const;
|
||||
const Action::Actions& actions(std::size_t timeStep) const;
|
||||
void evalAction(const SummaryState& summary_state, std::size_t timeStep);
|
||||
|
||||
|
@ -23,6 +23,7 @@
|
||||
#include <memory>
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <unordered_set>
|
||||
#include <variant>
|
||||
#include <vector>
|
||||
|
||||
@ -58,6 +59,7 @@ public:
|
||||
UDQASTNode* get_right() const;
|
||||
|
||||
bool operator==(const UDQASTNode& data) const;
|
||||
void required_summary(std::unordered_set<std::string>& summary_keys) const;
|
||||
|
||||
template<class Serializer>
|
||||
void serializeOp(Serializer& serializer)
|
||||
|
@ -79,6 +79,8 @@ namespace Opm {
|
||||
const UDQFunctionTable& function_table() const;
|
||||
|
||||
bool operator==(const UDQConfig& config) const;
|
||||
void required_summary(std::unordered_set<std::string>& summary_keys) const;
|
||||
|
||||
|
||||
template<class Serializer>
|
||||
void serializeOp(Serializer& serializer)
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include <unordered_set>
|
||||
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQEnums.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Schedule/UDQ/UDQSet.hpp>
|
||||
@ -73,6 +74,7 @@ public:
|
||||
const std::string& input_string() const;
|
||||
UDQVarType var_type() const;
|
||||
std::set<UDQTokenType> func_tokens() const;
|
||||
void required_summary(std::unordered_set<std::string>& summary_keys) const;
|
||||
|
||||
bool operator==(const UDQDefine& data) const;
|
||||
|
||||
|
@ -93,6 +93,7 @@ namespace Opm {
|
||||
};
|
||||
|
||||
SummaryConfigNode::Category parseKeywordCategory(const std::string& keyword);
|
||||
SummaryConfigNode::Type parseKeywordType(const std::string& keyword);
|
||||
|
||||
bool operator==(const SummaryConfigNode& lhs, const SummaryConfigNode& rhs);
|
||||
bool operator<(const SummaryConfigNode& lhs, const SummaryConfigNode& rhs);
|
||||
|
@ -1443,6 +1443,13 @@ private:
|
||||
return *ptr;
|
||||
}
|
||||
|
||||
std::vector<const UDQConfig*> Schedule::udqConfigList() const {
|
||||
std::vector<const UDQConfig*> udq_list;
|
||||
for (const auto& udq_pair : this->udq_config.unique())
|
||||
udq_list.push_back( udq_pair.second.get() );
|
||||
return udq_list;
|
||||
}
|
||||
|
||||
const GuideRateConfig& Schedule::guideRateConfig(std::size_t timeStep) const {
|
||||
const auto& ptr = this->guide_rate_config.get(timeStep);
|
||||
return *ptr;
|
||||
|
@ -311,4 +311,34 @@ bool UDQASTNode::operator==(const UDQASTNode& data) const {
|
||||
selector == data.selector;
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
bool is_udq(const std::string& key) {
|
||||
if (key.size() < 2)
|
||||
return false;
|
||||
|
||||
if (key[1] != 'U')
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void UDQASTNode::required_summary(std::unordered_set<std::string>& summary_keys) const {
|
||||
if (this->type == UDQTokenType::ecl_expr) {
|
||||
if (std::holds_alternative<std::string>(this->value)) {
|
||||
const auto& keyword = std::get<std::string>(this->value);
|
||||
if (!is_udq(keyword))
|
||||
summary_keys.insert(keyword);
|
||||
}
|
||||
}
|
||||
|
||||
if (this->left)
|
||||
this->left->required_summary(summary_keys);
|
||||
|
||||
if (this->right)
|
||||
this->right->required_summary(summary_keys);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -342,6 +342,16 @@ namespace Opm {
|
||||
context.update_define(def.keyword(), field_udq);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void UDQConfig::required_summary(std::unordered_set<std::string>& summary_keys) const {
|
||||
for (const auto& def_pair : this->m_definitions) {
|
||||
const auto& udq_def = def_pair.second;
|
||||
udq_def.required_summary(summary_keys);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -251,6 +251,11 @@ bool dynamic_type_check(UDQVarType lhs, UDQVarType rhs) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
void UDQDefine::required_summary(std::unordered_set<std::string>& summary_keys) const {
|
||||
this->ast->required_summary(summary_keys);
|
||||
}
|
||||
|
||||
UDQSet UDQDefine::eval(const UDQContext& context) const {
|
||||
UDQSet res = this->ast->eval(this->m_var_type, context);
|
||||
res.name( this->m_keyword );
|
||||
|
@ -319,16 +319,6 @@ namespace {
|
||||
: SummaryConfigNode::Category::Group;
|
||||
}
|
||||
|
||||
SummaryConfigNode::Type parseKeywordType(const std::string& keyword) {
|
||||
if (is_rate(keyword)) return SummaryConfigNode::Type::Rate;
|
||||
if (is_total(keyword)) return SummaryConfigNode::Type::Total;
|
||||
if (is_ratio(keyword)) return SummaryConfigNode::Type::Ratio;
|
||||
if (is_pressure(keyword)) return SummaryConfigNode::Type::Pressure;
|
||||
if (is_count(keyword)) return SummaryConfigNode::Type::Count;
|
||||
if (is_control_mode(keyword)) return SummaryConfigNode::Type::Mode;
|
||||
|
||||
return SummaryConfigNode::Type::Undefined;
|
||||
}
|
||||
|
||||
void handleMissingWell( const ParseContext& parseContext, ErrorGuard& errors, const KeywordLocation& location, const std::string& well) {
|
||||
std::string msg_fmt = fmt::format("Request for missing well {} in {{keyword}}\n"
|
||||
@ -1005,6 +995,17 @@ inline void handleKW( SummaryConfig::keyword_list& list,
|
||||
|
||||
// =====================================================================
|
||||
|
||||
SummaryConfigNode::Type parseKeywordType(const std::string& keyword) {
|
||||
if (is_rate(keyword)) return SummaryConfigNode::Type::Rate;
|
||||
if (is_total(keyword)) return SummaryConfigNode::Type::Total;
|
||||
if (is_ratio(keyword)) return SummaryConfigNode::Type::Ratio;
|
||||
if (is_pressure(keyword)) return SummaryConfigNode::Type::Pressure;
|
||||
if (is_count(keyword)) return SummaryConfigNode::Type::Count;
|
||||
if (is_control_mode(keyword)) return SummaryConfigNode::Type::Mode;
|
||||
|
||||
return SummaryConfigNode::Type::Undefined;
|
||||
}
|
||||
|
||||
SummaryConfigNode::Category parseKeywordCategory(const std::string& keyword) {
|
||||
using Cat = SummaryConfigNode::Category;
|
||||
|
||||
|
@ -1964,9 +1964,18 @@ DEFINE WUGASRA 750000 - WGLIR '*' /
|
||||
st.update_well_var("W3", "WGLIR", 3);
|
||||
|
||||
udq.eval(0, st, udq_state);
|
||||
|
||||
// The current testcase has some ordering & defined / undefined issues which
|
||||
// are not yet solved; therefor no udq.eval() here.
|
||||
{
|
||||
std::unordered_set<std::string> required_keys;
|
||||
udq.required_summary(required_keys);
|
||||
BOOST_CHECK_EQUAL( required_keys.size(), 7);
|
||||
BOOST_CHECK_EQUAL( required_keys.count("TIMESTEP"), 1);
|
||||
BOOST_CHECK_EQUAL( required_keys.count("FMWPR"), 1);
|
||||
BOOST_CHECK_EQUAL( required_keys.count("WGLIR"), 1);
|
||||
BOOST_CHECK_EQUAL( required_keys.count("FOPR"), 1);
|
||||
BOOST_CHECK_EQUAL( required_keys.count("FMWIN"), 1);
|
||||
BOOST_CHECK_EQUAL( required_keys.count("FMWPA"), 1);
|
||||
BOOST_CHECK_EQUAL( required_keys.count("FMWIA"), 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -2200,6 +2209,11 @@ UDQ
|
||||
auto undefined_value = udq.params().undefinedValue();
|
||||
UDQState udq_state(undefined_value);
|
||||
SummaryState st(std::chrono::system_clock::now());
|
||||
{
|
||||
std::unordered_set<std::string> required_keys;
|
||||
udq.required_summary(required_keys);
|
||||
BOOST_CHECK(required_keys.empty());
|
||||
}
|
||||
|
||||
udq.eval(0, st, udq_state);
|
||||
BOOST_CHECK_EQUAL(st.get("FU_VAR1"), 10);
|
||||
|
Loading…
Reference in New Issue
Block a user