Skip to content

Commit e05e5ee

Browse files
committed
Refactor TargetCalculator
Refactor TargetCalculator::groupTarget() to WellGroupHelper::getProductionGroupTarget(), and don't pass Group::ProductionControls as a parameter. Since TargetCalculator only works for a given group, passing control as a parameter is confusing and can be error prone if being passed a control for a different group than the TargetCalculator was constructed for.
1 parent 64a1dc7 commit e05e5ee

22 files changed

+463
-652
lines changed

opm/simulators/wells/BlackoilWellModelNldd_impl.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ recoverWellSolutionAndUpdateWellState(const BVector& x,
118118
}
119119
well->recoverWellSolutionAndUpdateWellState(wellModel_.simulator(),
120120
x_local_,
121+
wellModel_.wgHelper(),
121122
wellModel_.wellState(),
122123
local_deferredLogger);
123124
}
@@ -143,8 +144,7 @@ getWellConvergence(const Domain& domain,
143144
for (const auto& well : wellModel_.localNonshutWells()) {
144145
if ((this->well_domain().at(well->name()) == domain.index)) {
145146
if (well->isOperableAndSolvable() || well->wellIsStopped()) {
146-
report += well->getWellConvergence(wellModel_.simulator(),
147-
wellModel_.wellState(),
147+
report += well->getWellConvergence(wellModel_.wgHelper(),
148148
B_avg,
149149
local_deferredLogger,
150150
relax_tolerance);

opm/simulators/wells/BlackoilWellModel_impl.hpp

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -514,9 +514,9 @@ namespace Opm {
514514
if (event || dyn_status_change) {
515515
try {
516516
well->scaleSegmentRatesAndPressure(this->wellState());
517-
well->calculateExplicitQuantities(simulator_, this->wellState(), local_deferredLogger);
517+
well->calculateExplicitQuantities(simulator_, this->wgHelper(), local_deferredLogger);
518518
well->updateWellStateWithTarget(simulator_, this->wgHelper(), this->wellState(), local_deferredLogger);
519-
well->updatePrimaryVariables(simulator_, this->wellState(), local_deferredLogger);
519+
well->updatePrimaryVariables(this->wgHelper(), local_deferredLogger);
520520
well->solveWellEquation(
521521
simulator_, this->wgHelper(), this->wellState(), local_deferredLogger
522522
);
@@ -1169,7 +1169,7 @@ namespace Opm {
11691169

11701170
OPM_BEGIN_PARALLEL_TRY_CATCH();
11711171
for (auto& well : this->well_container_) {
1172-
well->solveEqAndUpdateWellState(simulator_, well_state, deferred_logger);
1172+
well->solveEqAndUpdateWellState(simulator_, this->wgHelper(), well_state, deferred_logger);
11731173
}
11741174
OPM_END_PARALLEL_TRY_CATCH("BlackoilWellModel::doPreStepNetworkRebalance() failed: ",
11751175
this->simulator_.vanguard().grid().comm());
@@ -1403,9 +1403,6 @@ namespace Opm {
14031403

14041404
//TODO: Auto choke combined with RESV control is not supported
14051405
std::vector<Scalar> resv_coeff(Indices::numPhases, 1.0);
1406-
Scalar gratTargetFromSales = 0.0;
1407-
if (group_state.has_grat_sales_target(group.name()))
1408-
gratTargetFromSales = group_state.grat_sales_target(group.name());
14091406

14101407
const auto ctrl = group.productionControls(summary_state);
14111408
auto cmode_tmp = ctrl.cmode;
@@ -1418,7 +1415,7 @@ namespace Opm {
14181415
const Scalar efficiencyFactor = 1.0;
14191416
const Group& parentGroup = this->schedule().getGroup(group.parent(), reportStepIdx);
14201417
auto target = WellGroupControls<Scalar, IndexTraits>::getAutoChokeGroupProductionTargetRate(
1421-
group.name(),
1418+
group,
14221419
parentGroup,
14231420
this->wgHelper(),
14241421
this->schedule(),
@@ -1431,15 +1428,12 @@ namespace Opm {
14311428
target_tmp = target.first;
14321429
cmode_tmp = target.second;
14331430
}
1434-
const auto cmode = cmode_tmp;
14351431
using TargetCalculatorType = WGHelpers::TargetCalculator<Scalar, IndexTraits>;
1436-
TargetCalculatorType tcalc(cmode, FluidSystem::phaseUsage(), resv_coeff,
1437-
gratTargetFromSales, nodeName, group_state,
1438-
group.has_gpmaint_control(cmode));
1432+
TargetCalculatorType tcalc{this->wgHelper(), resv_coeff, group};
14391433
if (!fld_none)
14401434
{
14411435
// Target is set for the autochoke group itself
1442-
target_tmp = tcalc.groupTarget(ctrl, local_deferredLogger);
1436+
target_tmp = tcalc.groupTarget(local_deferredLogger);
14431437
}
14441438

14451439
const Scalar orig_target = target_tmp;
@@ -1777,7 +1771,7 @@ namespace Opm {
17771771
x_local_[i] = x[cells[i]];
17781772
}
17791773
well->recoverWellSolutionAndUpdateWellState(simulator_, x_local_,
1780-
this->wellState(), local_deferredLogger);
1774+
this->wgHelper(), this->wellState(), local_deferredLogger);
17811775
}
17821776
}
17831777
OPM_END_PARALLEL_TRY_CATCH_LOG(local_deferredLogger,
@@ -1812,7 +1806,7 @@ namespace Opm {
18121806
for (const auto& well : well_container_) {
18131807
if (well->isOperableAndSolvable() || well->wellIsStopped()) {
18141808
local_report += well->getWellConvergence(
1815-
simulator_, this->wellState(), B_avg, local_deferredLogger,
1809+
this->wgHelper(), B_avg, local_deferredLogger,
18161810
iterationIdx > param_.strict_outer_iter_wells_);
18171811
} else {
18181812
ConvergenceReport report;
@@ -1858,7 +1852,7 @@ namespace Opm {
18581852
{
18591853
// TODO: checking isOperableAndSolvable() ?
18601854
for (auto& well : well_container_) {
1861-
well->calculateExplicitQuantities(simulator_, this->wellState(), deferred_logger);
1855+
well->calculateExplicitQuantities(simulator_, this->wgHelper(), deferred_logger);
18621856
}
18631857
}
18641858

@@ -2101,9 +2095,7 @@ namespace Opm {
21012095
this->wgHelper(),
21022096
local_deferredLogger);
21032097
const bool under_zero_target =
2104-
well->wellUnderZeroGroupRateTarget(this->simulator_,
2105-
this->wellState(),
2106-
local_deferredLogger);
2098+
well->wellUnderZeroGroupRateTarget(this->wgHelper(), local_deferredLogger);
21072099
well->updateWellTestState(this->wellState().well(wname),
21082100
simulationTime,
21092101
/*writeMessageToOPMLog=*/ true,
@@ -2280,7 +2272,7 @@ namespace Opm {
22802272
well->updateWellStateWithTarget(
22812273
simulator_, this->wgHelper(), this->wellState(), deferred_logger
22822274
);
2283-
well->updatePrimaryVariables(simulator_, this->wellState(), deferred_logger);
2275+
well->updatePrimaryVariables(this->wgHelper(), deferred_logger);
22842276
// There is no new well control change input within a report step,
22852277
// so next time step, the well does not consider to have effective events anymore.
22862278
events.clearEvent(WellState<Scalar, IndexTraits>::event_mask);
@@ -2364,7 +2356,7 @@ namespace Opm {
23642356
updatePrimaryVariables(DeferredLogger& deferred_logger)
23652357
{
23662358
for (const auto& well : well_container_) {
2367-
well->updatePrimaryVariables(simulator_, this->wellState(), deferred_logger);
2359+
well->updatePrimaryVariables(this->wgHelper(), deferred_logger);
23682360
}
23692361
}
23702362

opm/simulators/wells/MultisegmentWell.hpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,7 @@ namespace Opm {
9999
void scaleSegmentRatesAndPressure(WellStateType& well_state) const override;
100100

101101
/// check whether the well equations get converged for this well
102-
ConvergenceReport getWellConvergence(const Simulator& simulator,
103-
const WellStateType& well_state,
102+
ConvergenceReport getWellConvergence(const WellGroupHelperType& wgHelper,
104103
const std::vector<Scalar>& B_avg,
105104
DeferredLogger& deferred_logger,
106105
const bool relax_tolerance) const override;
@@ -114,6 +113,7 @@ namespace Opm {
114113
/// xw to update Well State
115114
void recoverWellSolutionAndUpdateWellState(const Simulator& simulator,
116115
const BVector& x,
116+
const WellGroupHelperType& wgHelper,
117117
WellStateType& well_state,
118118
DeferredLogger& deferred_logger) override;
119119

@@ -124,16 +124,16 @@ namespace Opm {
124124
std::vector<Scalar>& well_potentials,
125125
DeferredLogger& deferred_logger) override;
126126

127-
void updatePrimaryVariables(const Simulator& simulator,
128-
const WellStateType& well_state,
127+
void updatePrimaryVariables(const WellGroupHelperType& wgHelper,
129128
DeferredLogger& deferred_logger) override;
130129

131130
void solveEqAndUpdateWellState(const Simulator& simulator,
131+
const WellGroupHelperType& wgHelper,
132132
WellStateType& well_state,
133133
DeferredLogger& deferred_logger) override; // const?
134134

135135
void calculateExplicitQuantities(const Simulator& simulator,
136-
const WellStateType& well_state,
136+
const WellGroupHelperType& wgHelper,
137137
DeferredLogger& deferred_logger) override; // should be const?
138138

139139
void updateIPRImplicit(const Simulator& simulator,
@@ -185,6 +185,7 @@ namespace Opm {
185185
// updating the well_state based on well solution dwells
186186
void updateWellState(const Simulator& simulator,
187187
const BVectorWell& dwells,
188+
const WellGroupHelperType& wgHelper,
188189
WellStateType& well_state,
189190
DeferredLogger& deferred_logger,
190191
const Scalar relaxation_factor = 1.0);

opm/simulators/wells/MultisegmentWellAssemble.cpp

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include <opm/simulators/wells/MultisegmentWellPrimaryVariables.hpp>
3434
#include <opm/simulators/wells/WellAssemble.hpp>
3535
#include <opm/simulators/wells/WellBhpThpCalculator.hpp>
36+
#include <opm/simulators/wells/WellGroupHelper.hpp>
3637
#include <opm/simulators/wells/WellHelpers.hpp>
3738
#include <opm/simulators/wells/WellInterfaceIndices.hpp>
3839
#include <opm/simulators/wells/WellState.hpp>
@@ -82,10 +83,7 @@ class MultisegmentWellEquationAccess {
8283

8384
template<class FluidSystem, class Indices>
8485
void MultisegmentWellAssemble<FluidSystem,Indices>::
85-
assembleControlEq(const WellState<Scalar, IndexTraits>& well_state,
86-
const GroupState<Scalar>& group_state,
87-
const Schedule& schedule,
88-
const SummaryState& summaryState,
86+
assembleControlEq(const WellGroupHelperType& wgHelper,
8987
const Well::InjectionControls& inj_controls,
9088
const Well::ProductionControls& prod_controls,
9189
const Scalar rho,
@@ -94,6 +92,8 @@ assembleControlEq(const WellState<Scalar, IndexTraits>& well_state,
9492
const bool stopped_or_zero_target,
9593
DeferredLogger& deferred_logger) const
9694
{
95+
const auto& well_state = wgHelper.wellState();
96+
const auto& summary_state = wgHelper.summaryState();
9797
/*
9898
This function assembles the control equation, similar as for StandardWells.
9999
It does *not* need communication.
@@ -155,21 +155,18 @@ assembleControlEq(const WellState<Scalar, IndexTraits>& well_state,
155155
return WellBhpThpCalculator(well_).calculateBhpFromThp(well_state,
156156
rates,
157157
well,
158-
summaryState,
158+
summary_state,
159159
rho,
160160
deferred_logger);
161161
};
162162
// Call generic implementation.
163-
WellAssemble(well_).assembleControlEqInj(well_state,
164-
group_state,
165-
schedule,
166-
summaryState,
167-
inj_controls,
168-
primary_variables.getBhp(),
169-
injection_rate,
170-
bhp_from_thp,
171-
control_eq,
172-
deferred_logger);
163+
WellAssemble(well_).template assembleControlEqInj<EvalWell>(wgHelper,
164+
inj_controls,
165+
primary_variables.getBhp(),
166+
injection_rate,
167+
bhp_from_thp,
168+
control_eq,
169+
deferred_logger);
173170
} else {
174171
// Find rates.
175172
const auto rates = getRates();
@@ -178,21 +175,18 @@ assembleControlEq(const WellState<Scalar, IndexTraits>& well_state,
178175
return WellBhpThpCalculator(well_).calculateBhpFromThp(well_state,
179176
rates,
180177
well,
181-
summaryState,
178+
summary_state,
182179
rho,
183180
deferred_logger);
184181
};
185182
// Call generic implementation.
186-
WellAssemble(well_).assembleControlEqProd(well_state,
187-
group_state,
188-
schedule,
189-
summaryState,
190-
prod_controls,
191-
primary_variables.getBhp(),
192-
rates,
193-
bhp_from_thp,
194-
control_eq,
195-
deferred_logger);
183+
WellAssemble(well_).template assembleControlEqProd<EvalWell>(wgHelper,
184+
prod_controls,
185+
primary_variables.getBhp(),
186+
rates,
187+
bhp_from_thp,
188+
control_eq,
189+
deferred_logger);
196190
}
197191

198192
MultisegmentWellEquationAccess<Scalar, IndexTraits, numWellEq,Indices::numEq> eqns(eqns1);

opm/simulators/wells/MultisegmentWellAssemble.hpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class Schedule;
3737
class SummaryState;
3838
template<class FluidSystem, class Indices> class WellInterfaceIndices;
3939
template<typename Scalar, typename IndexTraits> class WellState;
40+
template<typename Scalar, typename IndexTraits> class WellGroupHelper;
4041

4142
//! \brief Class handling assemble of the equation system for MultisegmentWell.
4243
template<class FluidSystem, class Indices>
@@ -56,17 +57,15 @@ class MultisegmentWellAssemble
5657
using IndexTraits = typename FluidSystem::IndexTraitsType;
5758
using Equations = MultisegmentWellEquations<Scalar, IndexTraits, numWellEq,Indices::numEq>;
5859
using EvalWell = DenseAd::Evaluation<Scalar, numWellEq+Indices::numEq>;
60+
using WellGroupHelperType = WellGroupHelper<Scalar, IndexTraits>;
5961

6062
//! \brief Constructor initializes reference to well.
6163
explicit MultisegmentWellAssemble(const WellInterfaceIndices<FluidSystem,Indices>& well)
6264
: well_(well)
6365
{}
6466

6567
//! \brief Assemble control equation.
66-
void assembleControlEq(const WellState<Scalar, IndexTraits>& well_state,
67-
const GroupState<Scalar>& group_state,
68-
const Schedule& schedule,
69-
const SummaryState& summaryState,
68+
void assembleControlEq(const WellGroupHelperType& wgHelper,
7069
const Well::InjectionControls& inj_controls,
7170
const Well::ProductionControls& prod_controls,
7271
const Scalar rho,

0 commit comments

Comments
 (0)