Skip to content

Commit 969448b

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 e724831 commit 969448b

22 files changed

+505
-697
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_.groupStateHelper(),
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_.groupStateHelper(),
148148
B_avg,
149149
local_deferredLogger,
150150
relax_tolerance);

opm/simulators/wells/BlackoilWellModel_impl.hpp

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -513,9 +513,9 @@ namespace Opm {
513513
if (event || dyn_status_change) {
514514
try {
515515
well->scaleSegmentRatesAndPressure(this->wellState());
516-
well->calculateExplicitQuantities(simulator_, this->wellState(), local_deferredLogger);
516+
well->calculateExplicitQuantities(simulator_, this->groupStateHelper(), local_deferredLogger);
517517
well->updateWellStateWithTarget(simulator_, this->groupStateHelper(), this->wellState(), local_deferredLogger);
518-
well->updatePrimaryVariables(simulator_, this->wellState(), local_deferredLogger);
518+
well->updatePrimaryVariables(this->groupStateHelper(), local_deferredLogger);
519519
well->solveWellEquation(
520520
simulator_, this->groupStateHelper(), this->wellState(), local_deferredLogger
521521
);
@@ -1168,7 +1168,7 @@ namespace Opm {
11681168

11691169
OPM_BEGIN_PARALLEL_TRY_CATCH();
11701170
for (auto& well : this->well_container_) {
1171-
well->solveEqAndUpdateWellState(simulator_, well_state, deferred_logger);
1171+
well->solveEqAndUpdateWellState(simulator_, this->groupStateHelper(), well_state, deferred_logger);
11721172
}
11731173
OPM_END_PARALLEL_TRY_CATCH("BlackoilWellModel::doPreStepNetworkRebalance() failed: ",
11741174
this->simulator_.vanguard().grid().comm());
@@ -1402,9 +1402,6 @@ namespace Opm {
14021402

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

14091406
const auto ctrl = group.productionControls(summary_state);
14101407
auto cmode_tmp = ctrl.cmode;
@@ -1417,7 +1414,7 @@ namespace Opm {
14171414
const Scalar efficiencyFactor = 1.0;
14181415
const Group& parentGroup = this->schedule().getGroup(group.parent(), reportStepIdx);
14191416
auto target = WellGroupControls<Scalar, IndexTraits>::getAutoChokeGroupProductionTargetRate(
1420-
group.name(),
1417+
group,
14211418
parentGroup,
14221419
this->groupStateHelper(),
14231420
this->schedule(),
@@ -1430,16 +1427,12 @@ namespace Opm {
14301427
target_tmp = target.first;
14311428
cmode_tmp = target.second;
14321429
}
1433-
const auto cmode = cmode_tmp;
1434-
using TargetCalculatorType = GroupStateHelpers
1435-
::TargetCalculator<Scalar, IndexTraits>;
1436-
TargetCalculatorType tcalc(cmode, FluidSystem::phaseUsage(), resv_coeff,
1437-
gratTargetFromSales, nodeName, group_state,
1438-
group.has_gpmaint_control(cmode));
1430+
using TargetCalculatorType = GroupStateHelpers::TargetCalculator<Scalar, IndexTraits>;
1431+
TargetCalculatorType tcalc{this->groupStateHelper(), resv_coeff, group};
14391432
if (!fld_none)
14401433
{
14411434
// Target is set for the autochoke group itself
1442-
target_tmp = tcalc.groupTarget(ctrl, local_deferredLogger);
1435+
target_tmp = tcalc.groupTarget(local_deferredLogger);
14431436
}
14441437

14451438
const Scalar orig_target = target_tmp;
@@ -1777,7 +1770,7 @@ ::TargetCalculator<Scalar, IndexTraits>;
17771770
x_local_[i] = x[cells[i]];
17781771
}
17791772
well->recoverWellSolutionAndUpdateWellState(simulator_, x_local_,
1780-
this->wellState(), local_deferredLogger);
1773+
this->groupStateHelper(), this->wellState(), local_deferredLogger);
17811774
}
17821775
}
17831776
OPM_END_PARALLEL_TRY_CATCH_LOG(local_deferredLogger,
@@ -1812,7 +1805,7 @@ ::TargetCalculator<Scalar, IndexTraits>;
18121805
for (const auto& well : well_container_) {
18131806
if (well->isOperableAndSolvable() || well->wellIsStopped()) {
18141807
local_report += well->getWellConvergence(
1815-
simulator_, this->wellState(), B_avg, local_deferredLogger,
1808+
this->groupStateHelper(), B_avg, local_deferredLogger,
18161809
iterationIdx > param_.strict_outer_iter_wells_);
18171810
} else {
18181811
ConvergenceReport report;
@@ -1858,7 +1851,7 @@ ::TargetCalculator<Scalar, IndexTraits>;
18581851
{
18591852
// TODO: checking isOperableAndSolvable() ?
18601853
for (auto& well : well_container_) {
1861-
well->calculateExplicitQuantities(simulator_, this->wellState(), deferred_logger);
1854+
well->calculateExplicitQuantities(simulator_, this->groupStateHelper(), deferred_logger);
18621855
}
18631856
}
18641857

@@ -2101,9 +2094,7 @@ ::TargetCalculator<Scalar, IndexTraits>;
21012094
this->groupStateHelper(),
21022095
local_deferredLogger);
21032096
const bool under_zero_target =
2104-
well->wellUnderZeroGroupRateTarget(this->simulator_,
2105-
this->wellState(),
2106-
local_deferredLogger);
2097+
well->wellUnderZeroGroupRateTarget(this->groupStateHelper(), local_deferredLogger);
21072098
well->updateWellTestState(this->wellState().well(wname),
21082099
simulationTime,
21092100
/*writeMessageToOPMLog=*/ true,
@@ -2280,7 +2271,7 @@ ::TargetCalculator<Scalar, IndexTraits>;
22802271
well->updateWellStateWithTarget(
22812272
simulator_, this->groupStateHelper(), this->wellState(), deferred_logger
22822273
);
2283-
well->updatePrimaryVariables(simulator_, this->wellState(), deferred_logger);
2274+
well->updatePrimaryVariables(this->groupStateHelper(), deferred_logger);
22842275
// There is no new well control change input within a report step,
22852276
// so next time step, the well does not consider to have effective events anymore.
22862277
events.clearEvent(WellState<Scalar, IndexTraits>::event_mask);
@@ -2364,7 +2355,7 @@ ::TargetCalculator<Scalar, IndexTraits>;
23642355
updatePrimaryVariables(DeferredLogger& deferred_logger)
23652356
{
23662357
for (const auto& well : well_container_) {
2367-
well->updatePrimaryVariables(simulator_, this->wellState(), deferred_logger);
2358+
well->updatePrimaryVariables(this->groupStateHelper(), deferred_logger);
23682359
}
23692360
}
23702361

0 commit comments

Comments
 (0)