commit
b5012898d8
@ -187,6 +187,7 @@ namespace Opm
|
|||||||
double seconds(std::size_t timeStep) const;
|
double seconds(std::size_t timeStep) const;
|
||||||
double stepLength(std::size_t timeStep) const;
|
double stepLength(std::size_t timeStep) const;
|
||||||
std::optional<int> exitStatus() const;
|
std::optional<int> exitStatus() const;
|
||||||
|
const UnitSystem& getUnits() const { return this->unit_system; }
|
||||||
|
|
||||||
const TimeMap& getTimeMap() const;
|
const TimeMap& getTimeMap() const;
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include <opm/common/OpmLog/KeywordLocation.hpp>
|
#include <opm/common/OpmLog/KeywordLocation.hpp>
|
||||||
#include <opm/common/utility/OpmInputError.hpp>
|
#include <opm/common/utility/OpmInputError.hpp>
|
||||||
|
|
||||||
|
#include <opm/output/eclipse/Inplace.hpp>
|
||||||
#include <opm/parser/eclipse/EclipseState/EclipseState.hpp>
|
#include <opm/parser/eclipse/EclipseState/EclipseState.hpp>
|
||||||
#include <opm/parser/eclipse/EclipseState/IOConfig/IOConfig.hpp>
|
#include <opm/parser/eclipse/EclipseState/IOConfig/IOConfig.hpp>
|
||||||
#include <opm/parser/eclipse/EclipseState/Runspec.hpp>
|
#include <opm/parser/eclipse/EclipseState/Runspec.hpp>
|
||||||
@ -405,6 +406,8 @@ struct fn_args {
|
|||||||
const Opm::out::RegionCache& regionCache;
|
const Opm::out::RegionCache& regionCache;
|
||||||
const Opm::EclipseGrid& grid;
|
const Opm::EclipseGrid& grid;
|
||||||
const std::vector< std::pair< std::string, double > > eff_factors;
|
const std::vector< std::pair< std::string, double > > eff_factors;
|
||||||
|
const Opm::Inplace& initial_inplace;
|
||||||
|
const Opm::UnitSystem& unit_system;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Since there are several enums in opm scattered about more-or-less
|
/* Since there are several enums in opm scattered about more-or-less
|
||||||
@ -745,6 +748,28 @@ inline quantity bhp( const fn_args& args ) {
|
|||||||
return { p->second.bhp, measure::pressure };
|
return { p->second.bhp, measure::pressure };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
This function is slightly ugly - the evaluation of ROEW uses the already
|
||||||
|
calculated WOPT results. We do not really have any formalism for such
|
||||||
|
dependencies between the summary vectors. For this particualar case there is a
|
||||||
|
hack in SummaryConfig which should ensure that this is safe.
|
||||||
|
*/
|
||||||
|
|
||||||
|
quantity roew(const fn_args& args) {
|
||||||
|
double oil_prod = 0;
|
||||||
|
const auto& region_name = std::get<std::string>(*args.extra_data);
|
||||||
|
const auto& wells = args.regionCache.wells( region_name, args.num );
|
||||||
|
for (const auto& well : wells)
|
||||||
|
oil_prod += args.st.get_well_var(well, "WOPT");
|
||||||
|
|
||||||
|
//oil_prod = args.unit_system.to_si(Opm::UnitSystem::measure::volume, oil_prod);
|
||||||
|
return { oil_prod / args.initial_inplace.get( region_name, Opm::Inplace::Phase::OIL, args.num ) , measure::identity };
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
inline quantity temperature( const fn_args& args ) {
|
inline quantity temperature( const fn_args& args ) {
|
||||||
const quantity zero = { 0, measure::temperature };
|
const quantity zero = { 0, measure::temperature };
|
||||||
if( args.schedule_wells.empty() ) return zero;
|
if( args.schedule_wells.empty() ) return zero;
|
||||||
@ -1563,6 +1588,7 @@ static const std::unordered_map< std::string, ofun > funs = {
|
|||||||
{ "WOPI", potential_rate< rt::well_potential_oil , false, true>},
|
{ "WOPI", potential_rate< rt::well_potential_oil , false, true>},
|
||||||
{ "WGPI", potential_rate< rt::well_potential_gas , false, true>},
|
{ "WGPI", potential_rate< rt::well_potential_gas , false, true>},
|
||||||
{ "WGIP", potential_rate< rt::well_potential_gas , false, true>}, // Alias for 'WGPI'
|
{ "WGIP", potential_rate< rt::well_potential_gas , false, true>}, // Alias for 'WGPI'
|
||||||
|
{ "ROEW", roew },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -1819,6 +1845,7 @@ namespace Evaluator {
|
|||||||
const Opm::Schedule& sched;
|
const Opm::Schedule& sched;
|
||||||
const Opm::EclipseGrid& grid;
|
const Opm::EclipseGrid& grid;
|
||||||
const Opm::out::RegionCache& reg;
|
const Opm::out::RegionCache& reg;
|
||||||
|
const Opm::Inplace initial_inplace;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SimulatorResults
|
struct SimulatorResults
|
||||||
@ -1877,7 +1904,7 @@ namespace Evaluator {
|
|||||||
std::max(0, this->node_.number),
|
std::max(0, this->node_.number),
|
||||||
this->node_.fip_region,
|
this->node_.fip_region,
|
||||||
st, simRes.wellSol, simRes.grpNwrkSol, input.reg, input.grid,
|
st, simRes.wellSol, simRes.grpNwrkSol, input.reg, input.grid,
|
||||||
std::move(efac.factors)
|
std::move(efac.factors), input.initial_inplace, input.sched.getUnits()
|
||||||
};
|
};
|
||||||
|
|
||||||
const auto& usys = input.es.getUnits();
|
const auto& usys = input.es.getUnits();
|
||||||
@ -2422,8 +2449,7 @@ namespace Evaluator {
|
|||||||
{}, "", 0.0, 0, std::max(0, this->node_->number),
|
{}, "", 0.0, 0, std::max(0, this->node_->number),
|
||||||
this->node_->fip_region,
|
this->node_->fip_region,
|
||||||
this->st_, {}, {}, reg, this->grid_,
|
this->st_, {}, {}, reg, this->grid_,
|
||||||
{}
|
{}, {}, Opm::UnitSystem(Opm::UnitSystem::UnitType::UNIT_TYPE_METRIC)};
|
||||||
};
|
|
||||||
|
|
||||||
const auto prm = this->paramFunction_(args);
|
const auto prm = this->paramFunction_(args);
|
||||||
|
|
||||||
@ -2672,6 +2698,7 @@ public:
|
|||||||
const data::WellRates& well_solution,
|
const data::WellRates& well_solution,
|
||||||
const data::GroupAndNetworkValues& grp_nwrk_solution,
|
const data::GroupAndNetworkValues& grp_nwrk_solution,
|
||||||
GlobalProcessParameters& single_values,
|
GlobalProcessParameters& single_values,
|
||||||
|
const Inplace& initial_inplace,
|
||||||
const RegionParameters& region_values,
|
const RegionParameters& region_values,
|
||||||
const BlockValues& block_values,
|
const BlockValues& block_values,
|
||||||
const data::Aquifers& aquifer_values,
|
const data::Aquifers& aquifer_values,
|
||||||
@ -2780,6 +2807,7 @@ eval(const int sim_step,
|
|||||||
const data::WellRates& well_solution,
|
const data::WellRates& well_solution,
|
||||||
const data::GroupAndNetworkValues& grp_nwrk_solution,
|
const data::GroupAndNetworkValues& grp_nwrk_solution,
|
||||||
GlobalProcessParameters& single_values,
|
GlobalProcessParameters& single_values,
|
||||||
|
const Inplace& initial_inplace,
|
||||||
const RegionParameters& region_values,
|
const RegionParameters& region_values,
|
||||||
const BlockValues& block_values,
|
const BlockValues& block_values,
|
||||||
const data::Aquifers& aquifer_values,
|
const data::Aquifers& aquifer_values,
|
||||||
@ -2792,7 +2820,7 @@ eval(const int sim_step,
|
|||||||
st.update("TIMESTEP", this->es_.get().getUnits().from_si(Opm::UnitSystem::measure::time, duration));
|
st.update("TIMESTEP", this->es_.get().getUnits().from_si(Opm::UnitSystem::measure::time, duration));
|
||||||
|
|
||||||
const Evaluator::InputData input {
|
const Evaluator::InputData input {
|
||||||
this->es_, this->sched_, this->grid_, this->regCache_
|
this->es_, this->sched_, this->grid_, this->regCache_, initial_inplace
|
||||||
};
|
};
|
||||||
|
|
||||||
const Evaluator::SimulatorResults simRes {
|
const Evaluator::SimulatorResults simRes {
|
||||||
@ -3177,7 +3205,7 @@ void Summary::eval(SummaryState& st,
|
|||||||
const data::WellRates& well_solution,
|
const data::WellRates& well_solution,
|
||||||
const data::GroupAndNetworkValues& grp_nwrk_solution,
|
const data::GroupAndNetworkValues& grp_nwrk_solution,
|
||||||
GlobalProcessParameters single_values,
|
GlobalProcessParameters single_values,
|
||||||
const Inplace& ,
|
const Inplace& initial_inplace,
|
||||||
const RegionParameters& region_values,
|
const RegionParameters& region_values,
|
||||||
const BlockValues& block_values,
|
const BlockValues& block_values,
|
||||||
const Opm::data::Aquifers& aquifer_values) const
|
const Opm::data::Aquifers& aquifer_values) const
|
||||||
@ -3194,8 +3222,8 @@ void Summary::eval(SummaryState& st,
|
|||||||
* wells, groups, connections &c in the Schedule object. */
|
* wells, groups, connections &c in the Schedule object. */
|
||||||
const auto sim_step = std::max( 0, report_step - 1 );
|
const auto sim_step = std::max( 0, report_step - 1 );
|
||||||
|
|
||||||
this->pImpl_->eval(sim_step, secs_elapsed,
|
this->pImpl_->eval(sim_step, secs_elapsed, well_solution,
|
||||||
well_solution, grp_nwrk_solution, single_values,
|
grp_nwrk_solution, single_values, initial_inplace,
|
||||||
region_values, block_values, aquifer_values, st);
|
region_values, block_values, aquifer_values, st);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -725,6 +725,7 @@ inline void keywordR2R( SummaryConfig::keyword_list& /* list */,
|
|||||||
|
|
||||||
inline void keywordR( SummaryConfig::keyword_list& list,
|
inline void keywordR( SummaryConfig::keyword_list& list,
|
||||||
const DeckKeyword& deck_keyword,
|
const DeckKeyword& deck_keyword,
|
||||||
|
const Schedule& schedule,
|
||||||
const TableManager& tables,
|
const TableManager& tables,
|
||||||
const ParseContext& parseContext,
|
const ParseContext& parseContext,
|
||||||
ErrorGuard& errors ) {
|
ErrorGuard& errors ) {
|
||||||
@ -749,6 +750,11 @@ inline void keywordR( SummaryConfig::keyword_list& list,
|
|||||||
regions.push_back( region );
|
regions.push_back( region );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// See comment on function roew() in Summary.cpp for this weirdness.
|
||||||
|
if (keyword.rfind("ROEW", 0) == 0)
|
||||||
|
keywordW(list, "WOPT", {}, schedule);
|
||||||
|
|
||||||
|
|
||||||
auto param = SummaryConfigNode {
|
auto param = SummaryConfigNode {
|
||||||
keyword, SummaryConfigNode::Category::Region, deck_keyword.location()
|
keyword, SummaryConfigNode::Category::Region, deck_keyword.location()
|
||||||
}
|
}
|
||||||
@ -1054,7 +1060,7 @@ inline void keywordMISC( SummaryConfig::keyword_list& list,
|
|||||||
case Cat::Group: return keywordG( list, parseContext, errors, keyword, schedule );
|
case Cat::Group: return keywordG( list, parseContext, errors, keyword, schedule );
|
||||||
case Cat::Field: return keywordF( list, keyword );
|
case Cat::Field: return keywordF( list, keyword );
|
||||||
case Cat::Block: return keywordB( list, keyword, dims );
|
case Cat::Block: return keywordB( list, keyword, dims );
|
||||||
case Cat::Region: return keywordR( list, keyword, tables, parseContext, errors );
|
case Cat::Region: return keywordR( list, keyword, schedule, tables, parseContext, errors );
|
||||||
case Cat::Connection: return keywordC( list, parseContext, errors, keyword, schedule, dims);
|
case Cat::Connection: return keywordC( list, parseContext, errors, keyword, schedule, dims);
|
||||||
case Cat::Segment: return keywordS( list, parseContext, errors, keyword, schedule );
|
case Cat::Segment: return keywordS( list, parseContext, errors, keyword, schedule );
|
||||||
case Cat::Node: return keyword_node( list, node_names, parseContext, errors, keyword );
|
case Cat::Node: return keyword_node( list, node_names, parseContext, errors, keyword );
|
||||||
|
@ -1187,9 +1187,10 @@ ROEW_REG
|
|||||||
|
|
||||||
RHPV_REG
|
RHPV_REG
|
||||||
/
|
/
|
||||||
|
|
||||||
)";
|
)";
|
||||||
const auto& summary_config = createSummary(deck_string);
|
const auto& summary_config = createSummary(deck_string);
|
||||||
BOOST_CHECK_EQUAL(summary_config.size(), 15U);
|
BOOST_CHECK_EQUAL(summary_config.size(), 15 + 4);
|
||||||
BOOST_CHECK(summary_config.hasKeyword("RPR__REG"));
|
BOOST_CHECK(summary_config.hasKeyword("RPR__REG"));
|
||||||
BOOST_CHECK(summary_config.hasKeyword("ROPT_REG"));
|
BOOST_CHECK(summary_config.hasKeyword("ROPT_REG"));
|
||||||
BOOST_CHECK(summary_config.hasKeyword("RRPV_REG"));
|
BOOST_CHECK(summary_config.hasKeyword("RRPV_REG"));
|
||||||
@ -1210,11 +1211,11 @@ RHPV_REG
|
|||||||
BOOST_CHECK( reg_iter != fip_regions.end() );
|
BOOST_CHECK( reg_iter != fip_regions.end() );
|
||||||
|
|
||||||
|
|
||||||
auto wkeywords = summary_config.keywords("W*");
|
|
||||||
BOOST_CHECK(wkeywords.empty());
|
|
||||||
|
|
||||||
auto rpr = summary_config.keywords("RP*");
|
auto rpr = summary_config.keywords("RP*");
|
||||||
BOOST_CHECK_EQUAL(rpr.size(), 3U);
|
BOOST_CHECK_EQUAL(rpr.size(), 3U);
|
||||||
|
|
||||||
|
// See comment on the roew() function in Summary.cpp for this uglyness.
|
||||||
|
BOOST_CHECK(summary_config.hasKeyword("WOPT"));
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE( WOPRL ) {
|
BOOST_AUTO_TEST_CASE( WOPRL ) {
|
||||||
|
Loading…
Reference in New Issue
Block a user