mirror of
https://github.com/OPM/opm-simulators.git
synced 2024-12-22 15:33:29 -06:00
Add option for wvfpexp item 2 plus minor fixes
This commit is contained in:
parent
e875849497
commit
9364d4c54b
@ -33,6 +33,7 @@
|
||||
#include <opm/common/utility/TimeService.hpp>
|
||||
|
||||
#include <opm/simulators/wells/VFPHelpers.hpp>
|
||||
#include <opm/core/props/phaseUsageFromDeck.hpp>
|
||||
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
@ -46,23 +47,23 @@ struct Setup
|
||||
std::unique_ptr<const Schedule> schedule;
|
||||
std::unique_ptr<SummaryState> summary_state;
|
||||
std::unique_ptr<VFPProperties> vfp_properties;
|
||||
std::unique_ptr<WellState> well_state;
|
||||
|
||||
Setup(const std::string& file)
|
||||
{
|
||||
Parser parser;
|
||||
auto deck = parser.parseFile(file);
|
||||
ecl_state.reset(new EclipseState(deck) );
|
||||
{
|
||||
const TableManager table( deck );
|
||||
const Runspec runspec(deck);
|
||||
python = std::make_shared<Python>();
|
||||
schedule.reset( new Schedule(deck, *ecl_state, python));
|
||||
summary_state.reset( new SummaryState(TimeService::from_time_t(schedule->getStartTime())));
|
||||
}
|
||||
|
||||
const TableManager table( deck );
|
||||
const Runspec runspec(deck);
|
||||
python = std::make_shared<Python>();
|
||||
schedule.reset( new Schedule(deck, *ecl_state, python));
|
||||
summary_state.reset( new SummaryState(TimeService::from_time_t(schedule->getStartTime())));
|
||||
|
||||
const int step = 0;
|
||||
const auto& sched_state = schedule->operator[](step);
|
||||
vfp_properties = std::make_unique<VFPProperties>(sched_state.vfpinj(), sched_state.vfpprod(), *well_state);
|
||||
WellState well_state(phaseUsage(runspec.phases()));
|
||||
vfp_properties = std::make_unique<VFPProperties>(sched_state.vfpinj(), sched_state.vfpprod(), well_state);
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -346,15 +346,15 @@ VFPEvaluation bhp(const VFPProdTable& table,
|
||||
const double vapour,
|
||||
const double thp,
|
||||
const double alq,
|
||||
const double explicit_wfr,
|
||||
const double explicit_gfr,
|
||||
const bool vfpexplicit)
|
||||
const double explicit_wfr,
|
||||
const double explicit_gfr,
|
||||
const bool use_vfpexplicit)
|
||||
{
|
||||
//Find interpolation variables
|
||||
double flo = detail::getFlo(table, aqua, liquid, vapour);
|
||||
double wfr = detail::getWFR(table, aqua, liquid, vapour);
|
||||
double gfr = detail::getGFR(table, aqua, liquid, vapour);
|
||||
if (vfpexplicit) {
|
||||
if (use_vfpexplicit) {
|
||||
wfr = explicit_wfr;
|
||||
gfr = explicit_gfr;
|
||||
}
|
||||
|
@ -139,7 +139,7 @@ VFPEvaluation bhp(const VFPProdTable& table,
|
||||
const double alq,
|
||||
const double explicit_wfr,
|
||||
const double explicit_gfr,
|
||||
const bool vfpexplicit);
|
||||
const bool use_vfpexplicit);
|
||||
|
||||
VFPEvaluation bhp(const VFPInjTable& table,
|
||||
const double aqua,
|
||||
|
@ -90,10 +90,10 @@ double VFPProdProperties::bhp(int table_id,
|
||||
const double& alq,
|
||||
const double& explicit_wfr,
|
||||
const double& explicit_gfr,
|
||||
const bool expvfp) const {
|
||||
const bool use_expvfp) const {
|
||||
const VFPProdTable& table = detail::getTable(m_tables, table_id);
|
||||
|
||||
detail::VFPEvaluation retval = detail::bhp(table, aqua, liquid, vapour, thp_arg, alq, explicit_wfr,explicit_gfr, expvfp);
|
||||
detail::VFPEvaluation retval = detail::bhp(table, aqua, liquid, vapour, thp_arg, alq, explicit_wfr,explicit_gfr, use_expvfp);
|
||||
return retval.value;
|
||||
}
|
||||
|
||||
@ -151,7 +151,7 @@ EvalWell VFPProdProperties::bhp(const int table_id,
|
||||
const double& alq,
|
||||
const double& explicit_wfr,
|
||||
const double& explicit_gfr,
|
||||
const bool expvfp) const
|
||||
const bool use_expvfp) const
|
||||
{
|
||||
//Get the table
|
||||
const VFPProdTable& table = detail::getTable(m_tables, table_id);
|
||||
@ -161,7 +161,7 @@ EvalWell VFPProdProperties::bhp(const int table_id,
|
||||
EvalWell flo = detail::getFlo(table, aqua, liquid, vapour);
|
||||
EvalWell wfr = detail::getWFR(table, aqua, liquid, vapour);
|
||||
EvalWell gfr = detail::getGFR(table, aqua, liquid, vapour);
|
||||
if(expvfp) {
|
||||
if (use_expvfp) {
|
||||
wfr = explicit_wfr;
|
||||
gfr = explicit_gfr;
|
||||
}
|
||||
|
@ -66,9 +66,9 @@ public:
|
||||
const EvalWell& vapour,
|
||||
const double& thp,
|
||||
const double& alq,
|
||||
const double& wfr,
|
||||
const double& gfr,
|
||||
const bool expvfp) const;
|
||||
const double& explicit_wfr,
|
||||
const double& explicit_gfr,
|
||||
const bool use_expvfp) const;
|
||||
|
||||
/**
|
||||
* Linear interpolation of bhp as a function of the input parameters
|
||||
@ -90,7 +90,7 @@ public:
|
||||
const double& alq,
|
||||
const double& explicit_wfr,
|
||||
const double& explicit_gfr,
|
||||
const bool expvfp) const;
|
||||
const bool use_expvfp) const;
|
||||
|
||||
/**
|
||||
* Linear interpolation of thp as a function of the input parameters
|
||||
|
@ -769,7 +769,7 @@ namespace WellGroupHelpers
|
||||
alq,
|
||||
0.0, //explicit_wfr
|
||||
0.0, //explicit_gfr
|
||||
false); //expvfp we dont support explicit lookup
|
||||
false); //use_expvfp we dont support explicit lookup
|
||||
#define EXTRA_DEBUG_NETWORK 0
|
||||
#if EXTRA_DEBUG_NETWORK
|
||||
std::ostringstream oss;
|
||||
|
@ -495,8 +495,8 @@ calculateBhpFromThp(const WellState& well_state,
|
||||
const double dp = wellhelpers::computeHydrostaticCorrection(baseif_.refDepth(), vfp_ref_depth, rho, baseif_.gravity());
|
||||
const auto& wfr = baseif_.vfpProperties()->getExplicitWFR(controls.vfp_table_number, baseif_.indexOfWell());
|
||||
const auto& gfr = baseif_.vfpProperties()->getExplicitGFR(controls.vfp_table_number, baseif_.indexOfWell());
|
||||
const bool vfpexp = baseif_.vfpExplicit();
|
||||
return baseif_.vfpProperties()->getProd()->bhp(controls.vfp_table_number, aqua, liquid, vapour, baseif_.getTHPConstraint(summaryState), baseif_.getALQ(well_state), wfr, gfr, vfpexp) - dp;
|
||||
const bool use_vfpexplicit = baseif_.useVfpExplicit();
|
||||
return baseif_.vfpProperties()->getProd()->bhp(controls.vfp_table_number, aqua, liquid, vapour, baseif_.getTHPConstraint(summaryState), baseif_.getALQ(well_state), wfr, gfr, use_vfpexplicit) - dp;
|
||||
}
|
||||
else {
|
||||
OPM_DEFLOG_THROW(std::logic_error, "Expected INJECTOR or PRODUCER for well " + baseif_.name(), deferred_logger);
|
||||
|
@ -414,9 +414,10 @@ bool WellInterfaceGeneric::isOperableAndSolvable() const
|
||||
return operability_status_.isOperableAndSolvable();
|
||||
}
|
||||
|
||||
bool WellInterfaceGeneric::vfpExplicit() const
|
||||
bool WellInterfaceGeneric::useVfpExplicit() const
|
||||
{
|
||||
return operability_status_.vfpexplicit;
|
||||
const auto& wvfpexp = well_ecl_.getWVFPEXP();
|
||||
return (wvfpexp.extrapolate() || operability_status_.use_vfpexplicit);
|
||||
}
|
||||
|
||||
double WellInterfaceGeneric::getALQ(const WellState& well_state) const
|
||||
@ -666,9 +667,9 @@ computeBhpAtThpLimitProdCommon(const std::function<std::vector<double>(const dou
|
||||
assert(rates.size() == 3);
|
||||
const auto& wfr = this->vfpProperties()->getExplicitWFR(controls.vfp_table_number, this->indexOfWell());
|
||||
const auto& gfr = this->vfpProperties()->getExplicitGFR(controls.vfp_table_number, this->indexOfWell());
|
||||
const bool vfpexp = this->vfpExplicit();
|
||||
const bool use_vfpexp = this->useVfpExplicit();
|
||||
return this->vfpProperties()->getProd()
|
||||
->bhp(controls.vfp_table_number, rates[Water], rates[Oil], rates[Gas], thp_limit, alq_value, wfr, gfr, vfpexp) - dp;
|
||||
->bhp(controls.vfp_table_number, rates[Water], rates[Oil], rates[Gas], thp_limit, alq_value, wfr, gfr, use_vfpexp) - dp;
|
||||
};
|
||||
|
||||
// Make the flo() function.
|
||||
|
@ -88,7 +88,7 @@ public:
|
||||
|
||||
// whether the well is operable
|
||||
bool isOperableAndSolvable() const;
|
||||
bool vfpExplicit () const;
|
||||
bool useVfpExplicit () const;
|
||||
|
||||
void initCompletions();
|
||||
void closeCompletions(const WellTestState& wellTestState);
|
||||
@ -267,7 +267,7 @@ protected:
|
||||
//thp limit violated but not switched
|
||||
mutable bool thp_limit_violated_but_not_switched = false;
|
||||
|
||||
bool vfpexplicit = false;
|
||||
bool use_vfpexplicit = false;
|
||||
};
|
||||
|
||||
OperabilityStatus operability_status_;
|
||||
|
@ -614,7 +614,7 @@ namespace Opm
|
||||
|
||||
updateWellOperability(ebos_simulator, well_state, deferred_logger);
|
||||
if (!this->operability_status_.isOperableAndSolvable()) {
|
||||
this->operability_status_.vfpexplicit = true;
|
||||
this->operability_status_.use_vfpexplicit = true;
|
||||
deferred_logger.debug("EXPLICIT_LOOKUP_VFP",
|
||||
"well not operable, trying with explicit vfp lookup: " + this->name());
|
||||
updateWellOperability(ebos_simulator, well_state, deferred_logger);
|
||||
|
@ -270,7 +270,7 @@ BOOST_AUTO_TEST_CASE(InterpolateZero)
|
||||
const double v = m / static_cast<double>(n-1);
|
||||
|
||||
//Note order of arguments!
|
||||
sum += properties->bhp(1, v, x, y, z, u, 0, 0, false);
|
||||
sum += properties->bhp(1, v, x, y, z, u, 0.0, 0.0, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user