fixup from PR comments

This commit is contained in:
Tor Harald Sandve
2022-10-17 15:22:04 +02:00
parent 9538db85b1
commit 7b90d35f21
7 changed files with 27 additions and 24 deletions

View File

@@ -50,6 +50,7 @@ namespace Opm
min_linear_iterations ( std::numeric_limits<unsigned int>::max() ), min_linear_iterations ( std::numeric_limits<unsigned int>::max() ),
max_linear_iterations ( 0 ), max_linear_iterations ( 0 ),
converged(false), converged(false),
well_group_control_changed(false),
exit_status(EXIT_SUCCESS), exit_status(EXIT_SUCCESS),
global_time(0), global_time(0),
timestep_length(0.0) timestep_length(0.0)

View File

@@ -50,6 +50,7 @@ namespace Opm
bool converged; bool converged;
bool well_group_control_changed;
int exit_status; int exit_status;
double global_time; double global_time;

View File

@@ -260,7 +260,7 @@ namespace Opm {
void applyScaleAdd(const Scalar alpha, const BVector& x, BVector& Ax) const; void applyScaleAdd(const Scalar alpha, const BVector& x, BVector& Ax) const;
// Check if well equations is converged. // Check if well equations is converged.
ConvergenceReport getWellConvergence(const std::vector<Scalar>& B_avg, const bool checkWellGroupControls = false); ConvergenceReport getWellConvergence(const std::vector<Scalar>& B_avg, const bool checkWellGroupControls = false) const;
const SimulatorReportSingle& lastReport() const; const SimulatorReportSingle& lastReport() const;
@@ -373,7 +373,7 @@ namespace Opm {
// and in the well equations. // and in the well equations.
void assemble(const int iterationIdx, void assemble(const int iterationIdx,
const double dt); const double dt);
void assembleImpl(const int iterationIdx, bool assembleImpl(const int iterationIdx,
const double dt, const double dt,
const std::size_t recursion_level, const std::size_t recursion_level,
DeferredLogger& local_deferredLogger); DeferredLogger& local_deferredLogger);

View File

@@ -880,9 +880,11 @@ namespace Opm {
terminal_output_, grid().comm()); terminal_output_, grid().comm());
} }
assembleImpl(iterationIdx, dt, 0, local_deferredLogger); const bool well_group_control_changed = assembleImpl(iterationIdx, dt, 0, local_deferredLogger);
last_report_.converged = true; // if group or well control changes we don't consider the
// case converged
last_report_.well_group_control_changed = well_group_control_changed;
last_report_.assemble_time_well += perfTimer.stop(); last_report_.assemble_time_well += perfTimer.stop();
} }
@@ -891,7 +893,7 @@ namespace Opm {
template<typename TypeTag> template<typename TypeTag>
void bool
BlackoilWellModel<TypeTag>:: BlackoilWellModel<TypeTag>::
assembleImpl(const int iterationIdx, assembleImpl(const int iterationIdx,
const double dt, const double dt,
@@ -899,7 +901,7 @@ namespace Opm {
DeferredLogger& local_deferredLogger) DeferredLogger& local_deferredLogger)
{ {
const auto [group_well_changed, network_changed, network_imbalance] = updateWellControls(local_deferredLogger); auto [well_group_control_changed, network_changed, network_imbalance] = updateWellControls(local_deferredLogger);
bool alq_updated = false; bool alq_updated = false;
OPM_BEGIN_PARALLEL_TRY_CATCH(); OPM_BEGIN_PARALLEL_TRY_CATCH();
@@ -931,10 +933,11 @@ namespace Opm {
const auto& balance = schedule()[reportStepIdx].network_balance(); const auto& balance = schedule()[reportStepIdx].network_balance();
// Iterate if not converged, and number of iterations is not yet max (NETBALAN item 3). // Iterate if not converged, and number of iterations is not yet max (NETBALAN item 3).
if (recursion_level < balance.pressure_max_iter() && network_imbalance > balance.pressure_tolerance()) { if (recursion_level < balance.pressure_max_iter() && network_imbalance > balance.pressure_tolerance()) {
assembleImpl(iterationIdx, dt, recursion_level + 1, local_deferredLogger); well_group_control_changed = assembleImpl(iterationIdx, dt, recursion_level + 1, local_deferredLogger);
} }
} }
} }
return well_group_control_changed;
} }
@@ -1389,7 +1392,7 @@ namespace Opm {
template<typename TypeTag> template<typename TypeTag>
ConvergenceReport ConvergenceReport
BlackoilWellModel<TypeTag>:: BlackoilWellModel<TypeTag>::
getWellConvergence(const std::vector<Scalar>& B_avg, bool checkWellGroupControls) getWellConvergence(const std::vector<Scalar>& B_avg, bool checkWellGroupControls) const
{ {
DeferredLogger local_deferredLogger; DeferredLogger local_deferredLogger;
@@ -1409,14 +1412,13 @@ namespace Opm {
const Opm::Parallel::Communication comm = grid().comm(); const Opm::Parallel::Communication comm = grid().comm();
DeferredLogger global_deferredLogger = gatherDeferredLogger(local_deferredLogger, comm); DeferredLogger global_deferredLogger = gatherDeferredLogger(local_deferredLogger, comm);
ConvergenceReport report = gatherConvergenceReport(local_report, comm); ConvergenceReport report = gatherConvergenceReport(local_report, comm);
if (report.converged() && checkWellGroupControls) { // the well_group_control_changed info is already communicated
const auto [group_well_changed, network_changed, network_imbalance] = updateWellControls(global_deferredLogger); if (checkWellGroupControls) {
report.setWellGroupTargetsViolated(group_well_changed); report.setWellGroupTargetsViolated(this->lastReport().well_group_control_changed);
} }
if (terminal_output_) { if (terminal_output_) {
global_deferredLogger.logMessages(); global_deferredLogger.logMessages();
} }

View File

@@ -1363,10 +1363,10 @@ updateThp(WellState& well_state,
ws.thp = 0; ws.thp = 0;
return; return;
} }
// For THP controled wells, we know the thp value // For THP controlled wells, we know the thp value
bool thp_controled = baseif_.isInjector() ? ws.injection_cmode == Well::InjectorCMode::THP: bool thp_controlled = baseif_.isInjector() ? ws.injection_cmode == Well::InjectorCMode::THP:
ws.production_cmode == Well::ProducerCMode::THP; ws.production_cmode == Well::ProducerCMode::THP;
if (thp_controled) { if (thp_controlled) {
return; return;
} }

View File

@@ -573,14 +573,13 @@ updateThp(WellState& well_state,
return; return;
} }
// For THP controled wells, we know the thp value // For THP controlled wells, we know the thp value
bool thp_controled = baseif_.isInjector() ? ws.injection_cmode == Well::InjectorCMode::THP: bool thp_controlled = baseif_.isInjector() ? ws.injection_cmode == Well::InjectorCMode::THP:
ws.production_cmode == Well::ProducerCMode::THP; ws.production_cmode == Well::ProducerCMode::THP;
if (thp_controled) { if (thp_controlled) {
return; return;
} }
// the well is under other control types, we calculate the thp based on bhp and rates // the well is under other control types, we calculate the thp based on bhp and rates
std::vector<double> rates(3, 0.0); std::vector<double> rates(3, 0.0);

View File

@@ -710,15 +710,15 @@ namespace Opm
{ {
this->operability_status_.resetOperability(); this->operability_status_.resetOperability();
bool thp_controled = this->isInjector() ? well_state.well(this->index_of_well_).injection_cmode == Well::InjectorCMode::THP: bool thp_controlled = this->isInjector() ? well_state.well(this->index_of_well_).injection_cmode == Well::InjectorCMode::THP:
well_state.well(this->index_of_well_).production_cmode == Well::ProducerCMode::THP; well_state.well(this->index_of_well_).production_cmode == Well::ProducerCMode::THP;
bool bhp_controled = this->isInjector() ? well_state.well(this->index_of_well_).injection_cmode == Well::InjectorCMode::BHP: bool bhp_controlled = this->isInjector() ? well_state.well(this->index_of_well_).injection_cmode == Well::InjectorCMode::BHP:
well_state.well(this->index_of_well_).production_cmode == Well::ProducerCMode::BHP; well_state.well(this->index_of_well_).production_cmode == Well::ProducerCMode::BHP;
// Operability checking is not free // Operability checking is not free
// Only check wells under BHP and THP control // Only check wells under BHP and THP control
bool check_thp = thp_controled || this->operability_status_.thp_limit_violated_but_not_switched; bool check_thp = thp_controlled || this->operability_status_.thp_limit_violated_but_not_switched;
if (check_thp || bhp_controled) { if (check_thp || bhp_controlled) {
updateIPR(ebos_simulator, deferred_logger); updateIPR(ebos_simulator, deferred_logger);
checkOperabilityUnderBHPLimit(well_state, ebos_simulator, deferred_logger); checkOperabilityUnderBHPLimit(well_state, ebos_simulator, deferred_logger);
} }