diff --git a/opm/parser/eclipse/EclipseState/Schedule/Action/ASTNode.hpp b/opm/parser/eclipse/EclipseState/Schedule/Action/ASTNode.hpp index d37fb2456..affd6665e 100644 --- a/opm/parser/eclipse/EclipseState/Schedule/Action/ASTNode.hpp +++ b/opm/parser/eclipse/EclipseState/Schedule/Action/ASTNode.hpp @@ -1,6 +1,8 @@ #ifndef ASTNODE_HPP #define ASTNODE_HPP +#include + #include #include "ActionValue.hpp" @@ -27,6 +29,7 @@ public: void add_child(const ASTNode& child); size_t size() const; std::string func; + void required_summary(std::unordered_set& required_summary) const; bool operator==(const ASTNode& data) const; diff --git a/opm/parser/eclipse/EclipseState/Schedule/Action/ActionAST.hpp b/opm/parser/eclipse/EclipseState/Schedule/Action/ActionAST.hpp index 95826590e..01ce17f5e 100644 --- a/opm/parser/eclipse/EclipseState/Schedule/Action/ActionAST.hpp +++ b/opm/parser/eclipse/EclipseState/Schedule/Action/ActionAST.hpp @@ -21,9 +21,10 @@ #ifndef ActionAST_HPP #define ActionAST_HPP -#include -#include #include +#include +#include +#include #include @@ -56,6 +57,7 @@ public: { serializer(condition); } + void required_summary(std::unordered_set& required_summary) const; private: /* diff --git a/opm/parser/eclipse/EclipseState/Schedule/Action/ActionX.hpp b/opm/parser/eclipse/EclipseState/Schedule/Action/ActionX.hpp index 77f9331fc..ff908c641 100644 --- a/opm/parser/eclipse/EclipseState/Schedule/Action/ActionX.hpp +++ b/opm/parser/eclipse/EclipseState/Schedule/Action/ActionX.hpp @@ -21,9 +21,10 @@ #ifndef ActionX_HPP_ #define ActionX_HPP_ -#include -#include #include +#include +#include +#include #include #include @@ -75,7 +76,7 @@ public: bool ready(const State& state, std::time_t sim_time) const; Action::Result eval(const Action::Context& context) const; - + void required_summary(std::unordered_set& required_summary) const; std::string name() const { return this->m_name; } size_t max_run() const { return this->m_max_run; } double min_wait() const { return this->m_min_wait; } diff --git a/src/opm/output/eclipse/Summary.cpp b/src/opm/output/eclipse/Summary.cpp index 9e477f943..b115d21c8 100644 --- a/src/opm/output/eclipse/Summary.cpp +++ b/src/opm/output/eclipse/Summary.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -3152,12 +3153,15 @@ std::vector make_default_nodes(const std::string& keywo void Opm::out::Summary::SummaryImplementation::configureUDQ(const SummaryConfig& summary_config, const Schedule& sched) { - const std::unordered_set time_vectors = {"TIME", "DAY", "MONTH", "YEAR", "YEARS"}; + const std::unordered_set time_vectors = {"TIME", "DAY", "MONTH", "YEAR", "YEARS", "MNTH"}; auto nodes = std::vector {}; std::unordered_set summary_keys; for (const auto& udq_ptr : sched.udqConfigList()) udq_ptr->required_summary(summary_keys); + for (const auto& action : sched.actions(sched.size() - 1)) + action.required_summary(summary_keys); + for (const auto& key : summary_keys) { const auto& default_nodes = make_default_nodes(key, sched); for (const auto& def_node : default_nodes) @@ -3189,6 +3193,12 @@ void Opm::out::Summary::SummaryImplementation::configureUDQ(const SummaryConfig& continue; } + if (node.is_user_defined()) + continue; + + if (TimeMap::valid_month(node.keyword)) + continue; + throw std::logic_error(fmt::format("Evaluation function for: {} not found ", node.keyword)); } } diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/Action/ASTNode.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/Action/ASTNode.cpp index 23f2d431c..0a4f371f1 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/Action/ASTNode.cpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/Action/ASTNode.cpp @@ -169,5 +169,13 @@ bool ASTNode::operator==(const ASTNode& data) const { children == data.children; } +void ASTNode::required_summary(std::unordered_set& required_summary) const { + if (this->type == TokenType::ecl_expr) + required_summary.insert( this->func ); + + for (const auto& node : this->children) + node.required_summary(required_summary); +} + } } diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/Action/ActionAST.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/Action/ActionAST.cpp index 04266fd7a..63e3dc2b6 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/Action/ActionAST.cpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/Action/ActionAST.cpp @@ -62,6 +62,10 @@ bool AST::operator==(const AST& data) const { return !condition || (*condition == *data.condition); } +void AST::required_summary(std::unordered_set& required_summary) const { + this->condition->required_summary(required_summary); +} + } } diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/Action/ActionX.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/Action/ActionX.cpp index 08245de12..6b09b3a93 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/Action/ActionX.cpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/Action/ActionX.cpp @@ -194,5 +194,10 @@ bool ActionX::operator==(const ActionX& data) const { this->conditions() == data.conditions(); } + +void ActionX::required_summary(std::unordered_set& required_summary) const { + this->condition.required_summary(required_summary); +} + } } diff --git a/tests/parser/ACTIONX.cpp b/tests/parser/ACTIONX.cpp index 7b5b5c6fc..abcadd56d 100644 --- a/tests/parser/ACTIONX.cpp +++ b/tests/parser/ACTIONX.cpp @@ -1043,6 +1043,11 @@ TSTEP const auto& glo = sched.glo(0); BOOST_CHECK(!glo.has_group("PLAT-A")); } + std::unordered_set required_summary; + action1.required_summary(required_summary); + BOOST_CHECK_EQUAL( required_summary.count("WWCT"), 1); + BOOST_CHECK_EQUAL( required_summary.count("FPR"), 1); + Action::Result action_result(true); sched.applyAction(0, action1, action_result); @@ -1094,6 +1099,9 @@ TSTEP const auto& well = sched.getWell("PROD1", 0); BOOST_CHECK_EQUAL( well.getWellPIScalingFactor(1.0), 1.0); } + std::unordered_set required_summary; + action1.required_summary(required_summary); + BOOST_CHECK_EQUAL( required_summary.count("WWCT"), 1); Action::Result action_result(true); sched.applyAction(0, action1, action_result);