Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
10 changes: 7 additions & 3 deletions opm/simulators/wells/BlackoilWellModel_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1456,7 +1456,10 @@ namespace Opm {
const auto inj_controls = Well::InjectionControls(0);
const auto prod_controls = well_ecl.productionControls(summary_state);
well->iterateWellEqWithSwitching(
this->simulator_, dt, inj_controls, prod_controls, this->wgHelper(), this->wellState(), local_deferredLogger, false, false
this->simulator_, dt, inj_controls, prod_controls, this->wgHelper(), this->wellState(), local_deferredLogger,
/*fixed_control=*/false,
/*fixed_status=*/false,
/*solving_with_zero_rate=*/false
);
rate = -tcalc.calcModeRateFromRates(ws.surface_rates);
group_rate += rate;
Expand Down Expand Up @@ -1599,8 +1602,9 @@ namespace Opm {
OPM_BEGIN_PARALLEL_TRY_CATCH();

for (auto& well: well_container_) {
well->assembleWellEqWithoutIteration(simulator_, dt, this->wellState(), this->groupState(),
deferred_logger);
well->assembleWellEqWithoutIteration(simulator_, this->wgHelper(), dt, this->wellState(),
deferred_logger,
/*solving_with_zero_rate=*/false);
}
OPM_END_PARALLEL_TRY_CATCH_LOG(deferred_logger, "BlackoilWellModel::assembleWellEqWithoutIteration failed: ",
this->terminal_output_, grid().comm());
Expand Down
13 changes: 8 additions & 5 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 @@ -286,16 +287,18 @@ namespace Opm {
const WellGroupHelperType& wgHelper,
WellStateType& well_state,
DeferredLogger& deferred_logger,
const bool fixed_control = false,
const bool fixed_status = false) override;
const bool fixed_control,
const bool fixed_status,
const bool solving_with_zero_rate) 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) override;

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

Expand Down
43 changes: 29 additions & 14 deletions opm/simulators/wells/MultisegmentWell_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -593,7 +593,10 @@ namespace Opm
);
} else {
converged = well_copy.iterateWellEqWithSwitching(
simulator, dt, inj_controls, prod_controls, wgHelper_copy, well_state_copy, deferred_logger
simulator, dt, inj_controls, prod_controls, wgHelper_copy, well_state_copy, deferred_logger,
/*fixed_control=*/false,
/*fixed_status=*/false,
/*solving_with_zero_rate=*/false
);
}

Expand Down Expand Up @@ -1397,6 +1400,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 +1431,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 +1444,8 @@ 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,
/*solving_with_zero_rate=*/false);

BVectorWell rhs(this->numberOfSegments());
rhs = 0.0;
Expand Down Expand Up @@ -1526,7 +1530,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 +1558,9 @@ 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=*/false);

const auto report = getWellConvergence(simulator, well_state, Base::B_avg_, deferred_logger, relax_convergence);
if (report.converged()) {
Expand Down Expand Up @@ -1651,9 +1655,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 +1677,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 +1708,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 +1734,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 +1827,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 +1982,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
16 changes: 10 additions & 6 deletions opm/simulators/wells/StandardWell.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -211,8 +211,9 @@ namespace Opm
const WellGroupHelperType& wgHelper,
WellStateType& well_state,
DeferredLogger& deferred_logger,
const bool fixed_control = false,
const bool fixed_status = false) override;
const bool fixed_control,
const bool fixed_status,
const bool solving_with_zero_rate) 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) 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
Loading