Merge pull request #4572 from GitPaean/tightenging_tolerance_for_zero_rate_wells

stricter tolerance for wells with zero rate target
This commit is contained in:
Kai Bao
2023-04-14 11:19:35 +02:00
committed by GitHub
6 changed files with 37 additions and 19 deletions

View File

@@ -1404,7 +1404,8 @@ namespace Opm
template<typename TypeTag>
ConvergenceReport
StandardWell<TypeTag>::
getWellConvergence(const WellState& well_state,
getWellConvergence(const SummaryState& summary_state,
const WellState& well_state,
const std::vector<double>& B_avg,
DeferredLogger& deferred_logger,
const bool relax_tolerance) const
@@ -1413,15 +1414,21 @@ namespace Opm
// For the polymer, energy and foam cases, there is one more mass balance equations of reservoir than wells
assert((int(B_avg.size()) == this->num_components_) || has_polymer || has_energy || has_foam || has_brine || has_zFraction || has_micp);
// using sricter tolerance for stopped wells and wells under zero rate target control.
constexpr double stricter_factor = 1.e-4;
const double tol_wells = this->stopppedOrZeroRateTarget(summary_state, well_state) ?
this->param_.tolerance_wells_ * stricter_factor : this->param_.tolerance_wells_;
std::vector<double> res;
ConvergenceReport report = this->StdWellEval::getWellConvergence(well_state,
B_avg,
this->param_.max_residual_allowed_,
this->param_.tolerance_wells_,
tol_wells,
this->param_.relaxed_tolerance_flow_well_,
relax_tolerance,
res,
deferred_logger);
checkConvergenceExtraEqs(res, report);
return report;
@@ -2084,7 +2091,7 @@ namespace Opm
this->linSys_.extract(jacobian);
}
template <typename TypeTag>
void
StandardWell<TypeTag>::addWellPressureEquations(PressureMatrix& jacobian,
@@ -2102,7 +2109,7 @@ namespace Opm
well_state);
}
template<typename TypeTag>
typename StandardWell<TypeTag>::EvalWell
@@ -2507,6 +2514,7 @@ namespace Opm
bool converged;
bool relax_convergence = false;
this->regularize_ = false;
const auto& summary_state = ebosSimulator.vanguard().summaryState();
do {
assembleWellEqWithoutIteration(ebosSimulator, dt, inj_controls, prod_controls, well_state, group_state, deferred_logger);
@@ -2515,7 +2523,7 @@ namespace Opm
this->regularize_ = true;
}
auto report = getWellConvergence(well_state, Base::B_avg_, deferred_logger, relax_convergence);
auto report = getWellConvergence(summary_state, well_state, Base::B_avg_, deferred_logger, relax_convergence);
converged = report.converged();
if (converged) {
@@ -2523,7 +2531,6 @@ namespace Opm
}
++it;
const auto& summary_state = ebosSimulator.vanguard().summaryState();
solveEqAndUpdateWellState(summary_state, well_state, deferred_logger);
// TODO: when this function is used for well testing purposes, will need to check the controls, so that we will obtain convergence