Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion opm/simulators/wells/BlackoilWellModel_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1599,7 +1599,7 @@ namespace Opm {
OPM_BEGIN_PARALLEL_TRY_CATCH();

for (auto& well: well_container_) {
well->assembleWellEqWithoutIteration(simulator_, dt, this->wellState(), this->groupState(),
well->assembleWellEqWithoutIteration(simulator_, this->wgHelper(), dt, this->wellState(),
deferred_logger);
}
OPM_END_PARALLEL_TRY_CATCH_LOG(deferred_logger, "BlackoilWellModel::assembleWellEqWithoutIteration failed: ",
Expand Down
11 changes: 7 additions & 4 deletions opm/simulators/wells/MultisegmentWell.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ namespace Opm {
DeferredLogger& deferred_logger) override; // should be const?

void updateIPRImplicit(const Simulator& simulator,
const WellGroupHelperType& wgHelper,
WellStateType& well_state,
DeferredLogger& deferred_logger) override;

Expand Down Expand Up @@ -234,7 +235,7 @@ namespace Opm {
void getTransMult(Value& trans_mult,
const Simulator& simulator,
const int cell_indx) const;

// get the mobility for specific perforation
template<class Value>
void getMobility(const Simulator& simulator,
Expand Down Expand Up @@ -287,15 +288,17 @@ namespace Opm {
WellStateType& well_state,
DeferredLogger& deferred_logger,
const bool fixed_control = false,
const bool fixed_status = false) override;
const bool fixed_status = false,
const bool solving_with_zero_rate = false) override;

void assembleWellEqWithoutIteration(const Simulator& simulator,
const WellGroupHelperType& wgHelper,
const double dt,
const Well::InjectionControls& inj_controls,
const Well::ProductionControls& prod_controls,
WellStateType& well_state,
const GroupState<Scalar>& group_state,
DeferredLogger& deferred_logger) override;
DeferredLogger& deferred_logger,
const bool solving_with_zero_rate = false) override;

void updateWaterThroughput(const double dt, WellStateType& well_state) const override;

Expand Down
36 changes: 23 additions & 13 deletions opm/simulators/wells/MultisegmentWell_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1397,6 +1397,7 @@ namespace Opm
void
MultisegmentWell<TypeTag>::
updateIPRImplicit(const Simulator& simulator,
const WellGroupHelperType& wgHelper,
WellStateType& well_state,
DeferredLogger& deferred_logger)
{
Expand Down Expand Up @@ -1427,7 +1428,6 @@ namespace Opm
return;
*/
}
const auto& group_state = simulator.problem().wellModel().groupState();

std::fill(ws.implicit_ipr_a.begin(), ws.implicit_ipr_a.end(), 0.);
std::fill(ws.implicit_ipr_b.begin(), ws.implicit_ipr_b.end(), 0.);
Expand All @@ -1441,7 +1441,7 @@ namespace Opm
const auto cmode = ws.production_cmode;
ws.production_cmode = Well::ProducerCMode::BHP;
const double dt = simulator.timeStepSize();
assembleWellEqWithoutIteration(simulator, dt, inj_controls, prod_controls, well_state, group_state, deferred_logger);
assembleWellEqWithoutIteration(simulator, wgHelper, dt, inj_controls, prod_controls, well_state, deferred_logger);

BVectorWell rhs(this->numberOfSegments());
rhs = 0.0;
Expand Down Expand Up @@ -1526,7 +1526,6 @@ namespace Opm
WellStateType& well_state,
DeferredLogger& deferred_logger)
{
const auto& group_state = wgHelper.groupState();
if (!this->isOperableAndSolvable() && !this->wellIsStopped()) return true;

const int max_iter_number = this->param_.max_inner_iter_ms_wells_;
Expand Down Expand Up @@ -1555,8 +1554,8 @@ namespace Opm
this->regularize_ = true;
}

assembleWellEqWithoutIteration(simulator, dt, inj_controls, prod_controls,
well_state, group_state, deferred_logger);
assembleWellEqWithoutIteration(simulator, wgHelper, dt, inj_controls, prod_controls,
well_state, deferred_logger);

const auto report = getWellConvergence(simulator, well_state, Base::B_avg_, deferred_logger, relax_convergence);
if (report.converged()) {
Expand Down Expand Up @@ -1651,9 +1650,9 @@ namespace Opm
WellStateType& well_state,
DeferredLogger& deferred_logger,
const bool fixed_control /*false*/,
const bool fixed_status /*false*/)
const bool fixed_status /*false*/,
const bool solving_with_zero_rate /*false*/)
{
const auto& group_state = wgHelper.groupState();
const int max_iter_number = this->param_.max_inner_iter_ms_wells_;

{
Expand All @@ -1673,7 +1672,7 @@ namespace Opm
bool converged = false;
bool relax_convergence = false;
this->regularize_ = false;
const auto& summary_state = simulator.vanguard().summaryState();
const auto& summary_state = wgHelper.summaryState();

// Always take a few (more than one) iterations after a switch before allowing a new switch
// The optimal number here is subject to further investigation, but it has been observerved
Expand Down Expand Up @@ -1704,7 +1703,8 @@ namespace Opm
const Scalar wqTotal = this->primary_variables_.getWQTotal().value();
bool changed = this->updateWellControlAndStatusLocalIteration(
simulator, wgHelper, inj_controls, prod_controls, wqTotal,
well_state, deferred_logger, fixed_control, fixed_status
well_state, deferred_logger, fixed_control, fixed_status,
solving_with_zero_rate
);
if (changed) {
its_since_last_switch = 0;
Expand All @@ -1729,8 +1729,8 @@ namespace Opm
this->regularize_ = true;
}

assembleWellEqWithoutIteration(simulator, dt, inj_controls, prod_controls,
well_state, group_state, deferred_logger);
assembleWellEqWithoutIteration(simulator, wgHelper, dt, inj_controls, prod_controls,
well_state, deferred_logger, solving_with_zero_rate);


const auto report = getWellConvergence(simulator, well_state, Base::B_avg_, deferred_logger, relax_convergence);
Expand Down Expand Up @@ -1822,15 +1822,17 @@ namespace Opm
void
MultisegmentWell<TypeTag>::
assembleWellEqWithoutIteration(const Simulator& simulator,
const WellGroupHelperType& wgHelper,
const double dt,
const Well::InjectionControls& inj_controls,
const Well::ProductionControls& prod_controls,
WellStateType& well_state,
const GroupState<Scalar>& group_state,
DeferredLogger& deferred_logger)
DeferredLogger& deferred_logger,
const bool solving_with_zero_rate)
{
if (!this->isOperableAndSolvable() && !this->wellIsStopped()) return;


// update the upwinding segments
this->segments_.updateUpwindingSegments(this->primary_variables_);

Expand Down Expand Up @@ -1975,6 +1977,14 @@ namespace Opm
const auto& summaryState = simulator.vanguard().summaryState();
const Schedule& schedule = simulator.vanguard().schedule();
const bool stopped_or_zero_target = this->stoppedOrZeroRateTarget(simulator, well_state, deferred_logger);
// When solving with zero rate (well isolation), use empty group_state to isolate
// from group constraints in assembly.
// Otherwise use real group state from wgHelper.
const GroupState<Scalar> empty_group_state;
const auto& group_state = solving_with_zero_rate
? empty_group_state
: wgHelper.groupState();

MultisegmentWellAssemble(*this).
assembleControlEq(well_state,
group_state,
Expand Down
14 changes: 9 additions & 5 deletions opm/simulators/wells/StandardWell.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,8 @@ namespace Opm
WellStateType& well_state,
DeferredLogger& deferred_logger,
const bool fixed_control = false,
const bool fixed_status = false) override;
const bool fixed_status = false,
const bool solving_with_zero_rate = false) override;

/* returns BHP */
Scalar computeWellRatesAndBhpWithThpAlqProd(const Simulator& ebos_simulator,
Expand All @@ -238,6 +239,7 @@ namespace Opm
bool iterate_if_no_solution) const override;

void updateIPRImplicit(const Simulator& simulator,
const WellGroupHelperType& wgHelper,
WellStateType& well_state,
DeferredLogger& deferred_logger) override;

Expand Down Expand Up @@ -360,20 +362,22 @@ namespace Opm
DeferredLogger& deferred_logger) const;

void assembleWellEqWithoutIteration(const Simulator& simulator,
const WellGroupHelperType& wgHelper,
const double dt,
const Well::InjectionControls& inj_controls,
const Well::ProductionControls& prod_controls,
WellStateType& well_state,
const GroupState<Scalar>& group_state,
DeferredLogger& deferred_logger) override;
DeferredLogger& deferred_logger,
const bool solving_with_zero_rate = false) override;

void assembleWellEqWithoutIterationImpl(const Simulator& simulator,
const WellGroupHelperType& wgHelper,
const double dt,
const Well::InjectionControls& inj_controls,
const Well::ProductionControls& prod_controls,
WellStateType& well_state,
const GroupState<Scalar>& group_state,
DeferredLogger& deferred_logger);
DeferredLogger& deferred_logger,
const bool solving_with_zero_rate);

void calculateSinglePerf(const Simulator& simulator,
const int perf,
Expand Down
60 changes: 35 additions & 25 deletions opm/simulators/wells/StandardWell_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -339,12 +339,13 @@ namespace Opm
void
StandardWell<TypeTag>::
assembleWellEqWithoutIteration(const Simulator& simulator,
const WellGroupHelperType& wgHelper,
const double dt,
const Well::InjectionControls& inj_controls,
const Well::ProductionControls& prod_controls,
WellStateType& well_state,
const GroupState<Scalar>& group_state,
DeferredLogger& deferred_logger)
DeferredLogger& deferred_logger,
const bool solving_with_zero_rate)
{
// TODO: only_wells should be put back to save some computation
// for example, the matrices B C does not need to update if only_wells
Expand All @@ -353,9 +354,9 @@ namespace Opm
// clear all entries
this->linSys_.clear();

assembleWellEqWithoutIterationImpl(simulator, dt, inj_controls,
assembleWellEqWithoutIterationImpl(simulator, wgHelper, dt, inj_controls,
prod_controls, well_state,
group_state, deferred_logger);
deferred_logger, solving_with_zero_rate);
}


Expand All @@ -365,12 +366,13 @@ namespace Opm
void
StandardWell<TypeTag>::
assembleWellEqWithoutIterationImpl(const Simulator& simulator,
const WellGroupHelperType& wgHelper,
const double dt,
const Well::InjectionControls& inj_controls,
const Well::ProductionControls& prod_controls,
WellStateType& well_state,
const GroupState<Scalar>& group_state,
DeferredLogger& deferred_logger)
DeferredLogger& deferred_logger,
const bool solving_with_zero_rate)
{
// try to regularize equation if the well does not converge
const Scalar regularization_factor = this->regularize_? this->param_.regularization_factor_wells_ : 1.0;
Expand Down Expand Up @@ -468,16 +470,24 @@ namespace Opm
const auto& summaryState = simulator.vanguard().summaryState();
const Schedule& schedule = simulator.vanguard().schedule();
const bool stopped_or_zero_target = this->stoppedOrZeroRateTarget(simulator, well_state, deferred_logger);
StandardWellAssemble<FluidSystem,Indices>(*this).
assembleControlEq(well_state, group_state,
schedule, summaryState,
inj_controls, prod_controls,
this->primary_variables_,
this->getRefDensity(),
this->linSys_,
stopped_or_zero_target,
deferred_logger);

{
// When solving_with_zero_rate=true (called from solveWellWithZeroRate),
// we use an empty GroupState to isolate the well from group constraints during assembly.
// This allows us to solve the well equations independently of group controls/targets.
const GroupState<Scalar> empty_group_state;
const auto& group_state = solving_with_zero_rate
? empty_group_state
: wgHelper.groupState();
StandardWellAssemble<FluidSystem,Indices>(*this).
assembleControlEq(well_state, group_state,
schedule, summaryState,
inj_controls, prod_controls,
this->primary_variables_,
this->getRefDensity(),
this->linSys_,
stopped_or_zero_target,
deferred_logger);
}

// do the local inversion of D.
try {
Expand Down Expand Up @@ -909,6 +919,7 @@ namespace Opm
void
StandardWell<TypeTag>::
updateIPRImplicit(const Simulator& simulator,
const WellGroupHelperType& wgHelper,
WellStateType& well_state,
DeferredLogger& deferred_logger)
{
Expand Down Expand Up @@ -939,7 +950,6 @@ namespace Opm
return;
*/
}
const auto& group_state = simulator.problem().wellModel().groupState();

std::fill(ws.implicit_ipr_a.begin(), ws.implicit_ipr_a.end(), 0.);
std::fill(ws.implicit_ipr_b.begin(), ws.implicit_ipr_b.end(), 0.);
Expand All @@ -953,7 +963,7 @@ namespace Opm
const auto cmode = ws.production_cmode;
ws.production_cmode = Well::ProducerCMode::BHP;
const double dt = simulator.timeStepSize();
assembleWellEqWithoutIteration(simulator, dt, inj_controls, prod_controls, well_state, group_state, deferred_logger);
assembleWellEqWithoutIteration(simulator, wgHelper, dt, inj_controls, prod_controls, well_state, deferred_logger);

const size_t nEq = this->primary_variables_.numWellEq();
BVectorWell rhs(1);
Expand Down Expand Up @@ -2401,7 +2411,6 @@ namespace Opm
WellStateType& well_state,
DeferredLogger& deferred_logger)
{
const auto& group_state = wgHelper.groupState();
updatePrimaryVariables(simulator, well_state, deferred_logger);

const int max_iter = this->param_.max_inner_iter_wells_;
Expand All @@ -2410,7 +2419,7 @@ namespace Opm
bool relax_convergence = false;
this->regularize_ = false;
do {
assembleWellEqWithoutIteration(simulator, dt, inj_controls, prod_controls, well_state, group_state, deferred_logger);
assembleWellEqWithoutIteration(simulator, wgHelper, dt, inj_controls, prod_controls, well_state, deferred_logger);

if (it > this->param_.strict_inner_iter_wells_) {
relax_convergence = true;
Expand Down Expand Up @@ -2464,17 +2473,17 @@ namespace Opm
WellStateType& well_state,
DeferredLogger& deferred_logger,
const bool fixed_control /*false*/,
const bool fixed_status /*false*/)
const bool fixed_status /*false*/,
const bool solving_with_zero_rate /*false*/)
{
const auto& group_state = wgHelper.groupState();
updatePrimaryVariables(simulator, well_state, deferred_logger);

const int max_iter = this->param_.max_inner_iter_wells_;
int it = 0;
bool converged = false;
bool relax_convergence = false;
this->regularize_ = false;
const auto& summary_state = simulator.vanguard().summaryState();
const auto& summary_state = wgHelper.summaryState();

// Always take a few (more than one) iterations after a switch before allowing a new switch
// The optimal number here is subject to further investigation, but it has been observerved
Expand Down Expand Up @@ -2507,7 +2516,8 @@ namespace Opm
const Scalar wqTotal = this->primary_variables_.eval(WQTotal).value();
changed = this->updateWellControlAndStatusLocalIteration(
simulator, wgHelper, inj_controls, prod_controls, wqTotal,
well_state, deferred_logger, fixed_control, fixed_status
well_state, deferred_logger, fixed_control, fixed_status,
solving_with_zero_rate
);
if (changed){
its_since_last_switch = 0;
Expand All @@ -2527,7 +2537,7 @@ namespace Opm
}
}

assembleWellEqWithoutIteration(simulator, dt, inj_controls, prod_controls, well_state, group_state, deferred_logger);
assembleWellEqWithoutIteration(simulator, wgHelper, dt, inj_controls, prod_controls, well_state, deferred_logger, solving_with_zero_rate);

if (it > this->param_.strict_inner_iter_wells_) {
relax_convergence = true;
Expand Down
Loading