commit
2ba39f875c
@ -468,21 +468,21 @@ double efac( const std::vector<std::pair<std::string,double>>& eff_factors, cons
|
|||||||
return (it != eff_factors.end()) ? it->second : 1;
|
return (it != eff_factors.end()) ? it->second : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline quantity alqrate( const fn_args& args ) {
|
/*
|
||||||
const quantity zero = { 0.0, measure::gas_surface_rate };
|
This is bit dangerous, exactly how the ALQ value should be interpreted varies
|
||||||
|
between the different VFP tables. The code here assumes - without checking -
|
||||||
|
that it represents gas lift rate.
|
||||||
|
*/
|
||||||
|
inline quantity glir( const fn_args& args ) {
|
||||||
|
double alq_rate = 0;
|
||||||
|
|
||||||
if (args.schedule_wells.empty()) {
|
for (const auto& well : args.schedule_wells) {
|
||||||
// No wells. Before simulation starts?
|
auto xwPos = args.wells.find(well.name());
|
||||||
return zero;
|
if (xwPos != args.wells.end())
|
||||||
|
alq_rate += xwPos->second.rates.get(rt::alq, 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto& well = args.schedule_wells.front();
|
return { alq_rate, measure::gas_surface_rate };
|
||||||
auto xwPos = args.wells.find(well.name());
|
|
||||||
if (xwPos == args.wells.end()) {
|
|
||||||
return zero;
|
|
||||||
}
|
|
||||||
|
|
||||||
return { xwPos->second.rates.get(rt::alq, 0.0), measure::gas_surface_rate };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template< rt phase, bool injection = true >
|
template< rt phase, bool injection = true >
|
||||||
@ -1044,7 +1044,7 @@ static const std::unordered_map< std::string, ofun > funs = {
|
|||||||
{ "WOPR", rate< rt::oil, producer > },
|
{ "WOPR", rate< rt::oil, producer > },
|
||||||
{ "WGPR", rate< rt::gas, producer > },
|
{ "WGPR", rate< rt::gas, producer > },
|
||||||
{ "WEPR", rate< rt::energy, producer > },
|
{ "WEPR", rate< rt::energy, producer > },
|
||||||
{ "WGLIR", alqrate },
|
{ "WGLIR", glir },
|
||||||
{ "WNPR", rate< rt::solvent, producer > },
|
{ "WNPR", rate< rt::solvent, producer > },
|
||||||
{ "WCPR", rate< rt::polymer, producer > },
|
{ "WCPR", rate< rt::polymer, producer > },
|
||||||
{ "WSPR", rate< rt::brine, producer > },
|
{ "WSPR", rate< rt::brine, producer > },
|
||||||
@ -1126,7 +1126,7 @@ static const std::unordered_map< std::string, ofun > funs = {
|
|||||||
{ "GWPR", rate< rt::wat, producer > },
|
{ "GWPR", rate< rt::wat, producer > },
|
||||||
{ "GOPR", rate< rt::oil, producer > },
|
{ "GOPR", rate< rt::oil, producer > },
|
||||||
{ "GGPR", rate< rt::gas, producer > },
|
{ "GGPR", rate< rt::gas, producer > },
|
||||||
{ "GGLIR", alqrate },
|
{ "GGLIR", glir },
|
||||||
{ "GNPR", rate< rt::solvent, producer > },
|
{ "GNPR", rate< rt::solvent, producer > },
|
||||||
{ "GCPR", rate< rt::polymer, producer > },
|
{ "GCPR", rate< rt::polymer, producer > },
|
||||||
{ "GSPR", rate< rt::brine, producer > },
|
{ "GSPR", rate< rt::brine, producer > },
|
||||||
@ -1280,7 +1280,7 @@ static const std::unordered_map< std::string, ofun > funs = {
|
|||||||
{ "FWPR", rate< rt::wat, producer > },
|
{ "FWPR", rate< rt::wat, producer > },
|
||||||
{ "FOPR", rate< rt::oil, producer > },
|
{ "FOPR", rate< rt::oil, producer > },
|
||||||
{ "FGPR", rate< rt::gas, producer > },
|
{ "FGPR", rate< rt::gas, producer > },
|
||||||
{ "FGLIR", alqrate },
|
{ "FGLIR", glir },
|
||||||
{ "FNPR", rate< rt::solvent, producer > },
|
{ "FNPR", rate< rt::solvent, producer > },
|
||||||
{ "FCPR", rate< rt::polymer, producer > },
|
{ "FCPR", rate< rt::polymer, producer > },
|
||||||
{ "FSPR", rate< rt::brine, producer > },
|
{ "FSPR", rate< rt::brine, producer > },
|
||||||
|
@ -255,6 +255,10 @@ namespace {
|
|||||||
|| is_in_set(countkw, keyword.substr(1));
|
|| is_in_set(countkw, keyword.substr(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool is_liquid_phase(const std::string& keyword) {
|
||||||
|
return keyword == "WPIL";
|
||||||
|
}
|
||||||
|
|
||||||
bool is_region_to_region(const std::string& keyword) {
|
bool is_region_to_region(const std::string& keyword) {
|
||||||
using sz_t = std::string::size_type;
|
using sz_t = std::string::size_type;
|
||||||
if ((keyword.size() == sz_t{3}) && keyword[2] == 'F') return true;
|
if ((keyword.size() == sz_t{3}) && keyword[2] == 'F') return true;
|
||||||
@ -424,14 +428,14 @@ inline void keywordW( SummaryConfig::keyword_list& list,
|
|||||||
Two step check for whether to discard this keyword as unsupported:
|
Two step check for whether to discard this keyword as unsupported:
|
||||||
|
|
||||||
1. Completion quantity keywords are currently not supported. These are
|
1. Completion quantity keywords are currently not supported. These are
|
||||||
well summary keywords, apart from "WMCTL", that end in 'L'.
|
well summary keywords, apart from "WMCTL" and "WPIL", that end in 'L'.
|
||||||
|
|
||||||
2. If the keyword is a UDQ keyword there is no convention enforced to
|
2. If the keyword is a UDQ keyword there is no convention enforced to
|
||||||
the last character, and in that case it is treated as a normal well
|
the last character, and in that case it is treated as a normal well
|
||||||
keyword anyways.
|
keyword anyways.
|
||||||
*/
|
*/
|
||||||
if (keyword.name().back() == 'L') {
|
if (keyword.name().back() == 'L') {
|
||||||
if (! (is_control_mode(keyword.name()) || is_udq(keyword.name()))) {
|
if (! (is_control_mode(keyword.name()) || is_liquid_phase(keyword.name()) || is_udq(keyword.name()))) {
|
||||||
const auto& location = keyword.location();
|
const auto& location = keyword.location();
|
||||||
std::string msg = "Unsupported summary output keyword {}\n"
|
std::string msg = "Unsupported summary output keyword {}\n"
|
||||||
"In {file} line {line}";
|
"In {file} line {line}";
|
||||||
|
Loading…
Reference in New Issue
Block a user