Add well_var methods to SummaryState

This commit is contained in:
Joakim Hove 2018-11-09 10:57:33 +01:00
parent 1ba51534ae
commit ca9da29c53
4 changed files with 79 additions and 12 deletions

View File

@ -23,6 +23,8 @@
#include <string> #include <string>
#include <unordered_map> #include <unordered_map>
#include <ert/ecl/smspec_node.h>
namespace Opm{ namespace Opm{
@ -31,19 +33,51 @@ namespace Opm{
computed, ready to use summary values. The values will typically be used by computed, ready to use summary values. The values will typically be used by
the UDQ, WTEST and ACTIONX calculations. Observe that all value *have been the UDQ, WTEST and ACTIONX calculations. Observe that all value *have been
converted to the correct output units*. converted to the correct output units*.
The main key used to access the content of this container is the eclipse style
colon separated string - i.e. 'WWCT:OPX' to get the watercut in well 'OPX'.
The main usage of the SummaryState class is a temporary holding ground while
assembling data for the summary output, but it is also used as a context
object when evaulating the condition in ACTIONX keywords. For that reason some
of the data is duplicated both in the general structure and a specialized
structure:
SummaryState st;
st.add_well_var("OPX", "WWCT", 0.75);
st.add("WGOR:OPY", 120);
// The WWCT:OPX key has been added with the specialized add_well_var()
// method and this data is available both with the general
// st.has("WWCT:OPX") and the specialized st.has_well_var("OPX", "WWCT");
st.has("WWCT:OPX") => True
st.has_well_var("OPX", "WWCT") => True
// The WGOR:OPY key is added with the general add("WGOR:OPY") and is *not*
// accessible through the specialized st.has_well_var("OPY", "WGOR").
st.has("WGOR:OPY") => True
st.has_well_var("OPY", "WGOR") => False
*/ */
class SummaryState { class SummaryState {
public: public:
typedef std::unordered_map<std::string, double>::const_iterator const_iterator; typedef std::unordered_map<std::string, double>::const_iterator const_iterator;
void add(const std::string& key, double value);
double get(const std::string&) const; double get(const std::string&) const;
bool has(const std::string& key) const; bool has(const std::string& key) const;
void add(const std::string& key, double value);
void add(const smspec_node_type * node_ptr, double value);
void add_well_var(const std::string& well, const std::string& var, double value);
bool has_well_var(const std::string& well, const std::string& var) const;
double get_well_var(const std::string& well, const std::string& var) const;
const_iterator begin() const; const_iterator begin() const;
const_iterator end() const; const_iterator end() const;
private: private:
std::unordered_map<std::string,double> values; std::unordered_map<std::string,double> values;
std::unordered_map<std::string, std::unordered_map<std::string, double>> well_values;
}; };
} }

View File

@ -1310,7 +1310,7 @@ Summary::Summary( const EclipseState& st,
for (const auto& pair : this->handlers->handlers) { for (const auto& pair : this->handlers->handlers) {
const auto * nodeptr = pair.first; const auto * nodeptr = pair.first;
if (smspec_node_is_total(nodeptr)) if (smspec_node_is_total(nodeptr))
this->prev_state.add(smspec_node_get_gen_key1(nodeptr), 0); this->prev_state.add(nodeptr, 0);
} }
} }
@ -1410,7 +1410,6 @@ void Summary::add_timestep( int report_step,
for( auto& f : this->handlers->handlers ) { for( auto& f : this->handlers->handlers ) {
const int num = smspec_node_get_num( f.first ); const int num = smspec_node_get_num( f.first );
const auto* genkey = smspec_node_get_gen_key1( f.first );
const auto schedule_wells = find_wells( schedule, f.first, sim_step, this->regionCache ); const auto schedule_wells = find_wells( schedule, f.first, sim_step, this->regionCache );
auto eff_factors = well_efficiency_factors( f.first, schedule, schedule_wells, sim_step ); auto eff_factors = well_efficiency_factors( f.first, schedule, schedule_wells, sim_step );
@ -1425,22 +1424,22 @@ void Summary::add_timestep( int report_step,
eff_factors}); eff_factors});
double unit_applied_val = es.getUnits().from_si( val.unit, val.value ); double unit_applied_val = es.getUnits().from_si( val.unit, val.value );
if (smspec_node_is_total(f.first)) if (smspec_node_is_total(f.first)) {
const auto* genkey = smspec_node_get_gen_key1( f.first );
unit_applied_val += this->prev_state.get(genkey); unit_applied_val += this->prev_state.get(genkey);
}
st.add(genkey, unit_applied_val); st.add(f.first, unit_applied_val);
} }
for( const auto& value_pair : single_values ) { for( const auto& value_pair : single_values ) {
const std::string key = value_pair.first; const std::string key = value_pair.first;
const auto node_pair = this->handlers->single_value_nodes.find( key ); const auto node_pair = this->handlers->single_value_nodes.find( key );
if (node_pair != this->handlers->single_value_nodes.end()) { if (node_pair != this->handlers->single_value_nodes.end()) {
const auto * nodeptr = node_pair->second;
const auto * genkey = smspec_node_get_gen_key1( nodeptr );
const auto unit = single_values_units.at( key ); const auto unit = single_values_units.at( key );
double si_value = value_pair.second; double si_value = value_pair.second;
double output_value = es.getUnits().from_si(unit , si_value ); double output_value = es.getUnits().from_si(unit , si_value );
st.add(genkey, output_value); st.add(node_pair->second, output_value);
} }
} }
@ -1450,13 +1449,12 @@ void Summary::add_timestep( int report_step,
const auto node_pair = this->handlers->region_nodes.find( std::make_pair(key, reg+1) ); const auto node_pair = this->handlers->region_nodes.find( std::make_pair(key, reg+1) );
if (node_pair != this->handlers->region_nodes.end()) { if (node_pair != this->handlers->region_nodes.end()) {
const auto * nodeptr = node_pair->second; const auto * nodeptr = node_pair->second;
const auto* genkey = smspec_node_get_gen_key1( nodeptr );
const auto unit = region_units.at( key ); const auto unit = region_units.at( key );
assert (smspec_node_get_num( nodeptr ) - 1 == static_cast<int>(reg)); assert (smspec_node_get_num( nodeptr ) - 1 == static_cast<int>(reg));
double si_value = value_pair.second[reg]; double si_value = value_pair.second[reg];
double output_value = es.getUnits().from_si(unit , si_value ); double output_value = es.getUnits().from_si(unit , si_value );
st.add(genkey, output_value); st.add(nodeptr, output_value);
} }
} }
} }
@ -1466,11 +1464,10 @@ void Summary::add_timestep( int report_step,
const auto node_pair = this->handlers->block_nodes.find( key ); const auto node_pair = this->handlers->block_nodes.find( key );
if (node_pair != this->handlers->block_nodes.end()) { if (node_pair != this->handlers->block_nodes.end()) {
const auto * nodeptr = node_pair->second; const auto * nodeptr = node_pair->second;
const auto * genkey = smspec_node_get_gen_key1( nodeptr );
const auto unit = block_units.at( key.first ); const auto unit = block_units.at( key.first );
double si_value = value_pair.second; double si_value = value_pair.second;
double output_value = es.getUnits().from_si(unit , si_value ); double output_value = es.getUnits().from_si(unit , si_value );
st.add(genkey, output_value); st.add(nodeptr, output_value);
} }
} }

View File

@ -21,6 +21,14 @@
#include <opm/parser/eclipse/EclipseState/Schedule/SummaryState.hpp> #include <opm/parser/eclipse/EclipseState/Schedule/SummaryState.hpp>
namespace Opm{ namespace Opm{
void SummaryState::add(const smspec_node_type * node_ptr, double value) {
if (smspec_node_get_var_type(node_ptr) == ECL_SMSPEC_WELL_VAR)
this->add_well_var(smspec_node_get_wgname(node_ptr),
smspec_node_get_keyword(node_ptr),
value);
else
this->add(smspec_node_get_gen_key1(node_ptr), value);
}
void SummaryState::add(const std::string& key, double value) { void SummaryState::add(const std::string& key, double value) {
this->values[key] = value; this->values[key] = value;
@ -40,6 +48,28 @@ namespace Opm{
return iter->second; return iter->second;
} }
void SummaryState::add_well_var(const std::string& well, const std::string& var, double value) {
this->add(var + ":" + well, value);
this->well_values[well][var] = value;
}
bool SummaryState::has_well_var(const std::string& well, const std::string& var) const {
const auto& well_iter = this->well_values.find(well);
if (well_iter == this->well_values.end())
return false;
const auto& var_iter = well_iter->second.find(var);
if (var_iter == well_iter->second.end())
return false;
return true;
}
double SummaryState::get_well_var(const std::string& well, const std::string& var) const {
return this->well_values.at(well).at(var);
}
SummaryState::const_iterator SummaryState::begin() const { SummaryState::const_iterator SummaryState::begin() const {
return this->values.begin(); return this->values.begin();
} }

View File

@ -1306,6 +1306,12 @@ BOOST_AUTO_TEST_CASE(Test_SummaryState) {
BOOST_CHECK_THROW(st.get("NO_SUCH_KEY"), std::invalid_argument); BOOST_CHECK_THROW(st.get("NO_SUCH_KEY"), std::invalid_argument);
BOOST_CHECK(st.has("WWCT:OP_2")); BOOST_CHECK(st.has("WWCT:OP_2"));
BOOST_CHECK(!st.has("NO_SUCH_KEY")); BOOST_CHECK(!st.has("NO_SUCH_KEY"));
st.add_well_var("OP1", "WWCT", 0.75);
BOOST_CHECK( st.has_well_var("OP1", "WWCT"));
BOOST_CHECK_EQUAL( st.get_well_var("OP1", "WWCT"), 0.75);
BOOST_CHECK_EQUAL( st.get_well_var("OP1", "WWCT"), st.get("WWCT:OP1"));
} }
BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE_END()