Merge pull request #4652 from akva2/update_ws_thp_prod_shared

move updateWellStateWithTHPTargetProd to WellInterface
This commit is contained in:
Bård Skaflestad 2023-06-22 09:54:35 +02:00 committed by GitHub
commit b5517c8600
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 45 additions and 69 deletions

View File

@ -240,7 +240,7 @@ namespace Opm
std::vector<double>& well_flux,
DeferredLogger& deferred_logger) const;
virtual void computeWellRatesWithBhp(const Simulator& ebosSimulator,
void computeWellRatesWithBhp(const Simulator& ebosSimulator,
const double& bhp,
std::vector<double>& well_flux,
DeferredLogger& deferred_logger) const override;
@ -248,17 +248,13 @@ namespace Opm
void computeWellRatesWithBhpIterations(const Simulator& ebosSimulator,
const Scalar& bhp,
std::vector<double>& well_flux,
DeferredLogger& deferred_logger) const;
DeferredLogger& deferred_logger) const override;
std::vector<double> computeWellPotentialWithTHP(
const WellState& well_state,
const Simulator& ebos_simulator,
DeferredLogger& deferred_logger) const;
bool updateWellStateWithTHPTargetProd(const Simulator& ebos_simulator,
WellState& well_state,
DeferredLogger& deferred_logger) const override;
virtual double getRefDensity() const override;
virtual bool iterateWellEqWithControl(const Simulator& ebosSimulator,

View File

@ -92,6 +92,7 @@ namespace Opm
OPM_THROW(std::runtime_error, "water + gas case not supported by multisegment well yet");
}
this->thp_update_iterations = true;
}
@ -1909,34 +1910,6 @@ namespace Opm
template<typename TypeTag>
bool
MultisegmentWell<TypeTag>::
updateWellStateWithTHPTargetProd(const Simulator& ebos_simulator,
WellState& well_state,
DeferredLogger& deferred_logger) const
{
const auto& summary_state = ebos_simulator.vanguard().summaryState();
auto bhp_at_thp_limit = computeBhpAtThpLimitProdWithAlq(
ebos_simulator, summary_state, this->getALQ(well_state), deferred_logger);
if (bhp_at_thp_limit) {
std::vector<double> rates(this->number_of_phases_, 0.0);
computeWellRatesWithBhpIterations(ebos_simulator, *bhp_at_thp_limit, rates, deferred_logger);
auto& ws = well_state.well(this->name());
ws.surface_rates = rates;
ws.bhp = *bhp_at_thp_limit;
ws.thp = this->getTHPConstraint(summary_state);
return true;
} else {
return false;
}
}
template <typename TypeTag>
std::vector<double>
MultisegmentWell<TypeTag>::
@ -1971,5 +1944,4 @@ namespace Opm
return num_seg * num_eq;
}
} // namespace Opm

View File

@ -314,17 +314,13 @@ namespace Opm
void computeWellRatesWithBhpIterations(const Simulator& ebosSimulator,
const double& bhp,
std::vector<double>& well_flux,
DeferredLogger& deferred_logger) const;
DeferredLogger& deferred_logger) const override;
std::vector<double> computeWellPotentialWithTHP(
const Simulator& ebosSimulator,
DeferredLogger& deferred_logger,
const WellState &well_state) const;
bool updateWellStateWithTHPTargetProd(const Simulator& ebos_simulator,
WellState& well_state,
DeferredLogger& deferred_logger) const override;
virtual double getRefDensity() const override;
// get the mobility for specific perforation

View File

@ -1661,32 +1661,6 @@ namespace Opm
template<typename TypeTag>
bool
StandardWell<TypeTag>::
updateWellStateWithTHPTargetProd(const Simulator& ebos_simulator,
WellState& well_state,
DeferredLogger& deferred_logger) const
{
const auto& summary_state = ebos_simulator.vanguard().summaryState();
auto bhp_at_thp_limit = computeBhpAtThpLimitProdWithAlq(
ebos_simulator, summary_state, this->getALQ(well_state), deferred_logger);
if (bhp_at_thp_limit) {
std::vector<double> rates(this->number_of_phases_, 0.0);
computeWellRatesWithBhp(ebos_simulator, *bhp_at_thp_limit, rates, deferred_logger);
auto& ws = well_state.well(this->name());
ws.surface_rates = rates;
ws.bhp = *bhp_at_thp_limit;
ws.thp = this->getTHPConstraint(summary_state);
return true;
} else {
return false;
}
}
template<typename TypeTag>
double
StandardWell<TypeTag>::

View File

@ -222,9 +222,14 @@ public:
WellState& well_state,
DeferredLogger& deferred_logger) const;
virtual bool updateWellStateWithTHPTargetProd(const Simulator& ebos_simulator,
WellState& well_state,
DeferredLogger& deferred_logger) const = 0;
virtual void computeWellRatesWithBhpIterations(const Simulator& ebosSimulator,
const Scalar& bhp,
std::vector<double>& well_flux,
DeferredLogger& deferred_logger) const = 0;
bool updateWellStateWithTHPTargetProd(const Simulator& ebos_simulator,
WellState& well_state,
DeferredLogger& deferred_logger) const;
enum class IndividualOrGroup { Individual, Group, Both };
bool updateWellControl(const Simulator& ebos_simulator,
@ -344,6 +349,7 @@ protected:
std::vector<RateVector> connectionRates_;
std::vector< Scalar > B_avg_;
bool changed_to_stopped_this_step_ = false;
bool thp_update_iterations = false;
double wpolymer() const;

View File

@ -1191,6 +1191,7 @@ namespace Opm
}
}
}
template<typename TypeTag>
typename WellInterface<TypeTag>::Eval
WellInterface<TypeTag>::getPerfCellPressure(const typename WellInterface<TypeTag>::FluidState& fs) const
@ -1268,4 +1269,35 @@ namespace Opm
}
}
template<typename TypeTag>
bool
WellInterface<TypeTag>::
updateWellStateWithTHPTargetProd(const Simulator& ebos_simulator,
WellState& well_state,
DeferredLogger& deferred_logger) const
{
const auto& summary_state = ebos_simulator.vanguard().summaryState();
auto bhp_at_thp_limit = computeBhpAtThpLimitProdWithAlq(
ebos_simulator, summary_state, this->getALQ(well_state), deferred_logger);
if (bhp_at_thp_limit) {
std::vector<double> rates(this->number_of_phases_, 0.0);
if (thp_update_iterations) {
computeWellRatesWithBhpIterations(ebos_simulator, *bhp_at_thp_limit,
rates, deferred_logger);
} else {
computeWellRatesWithBhp(ebos_simulator, *bhp_at_thp_limit,
rates, deferred_logger);
}
auto& ws = well_state.well(this->name());
ws.surface_rates = rates;
ws.bhp = *bhp_at_thp_limit;
ws.thp = this->getTHPConstraint(summary_state);
return true;
} else {
return false;
}
}
} // namespace Opm