making sure to update the pressure when needing network balance

This commit is contained in:
Kai Bao 2023-04-21 13:37:28 +02:00
parent 5536b24a84
commit bb7ed4d78e
3 changed files with 20 additions and 14 deletions

View File

@ -293,7 +293,9 @@ namespace Opm {
void prepareTimeStep(DeferredLogger& deferred_logger); void prepareTimeStep(DeferredLogger& deferred_logger);
void initPrimaryVariablesEvaluation() const; void initPrimaryVariablesEvaluation() const;
std::pair<bool, bool> updateWellControls(DeferredLogger& deferred_logger, const std::size_t network_update_it = 0); std::pair<bool, bool>
updateWellControls(const bool mandatory_network_balance, DeferredLogger& deferred_logger,
const std::size_t network_update_it);
void updateAndCommunicate(const int reportStepIdx, void updateAndCommunicate(const int reportStepIdx,
const int iterationIdx, const int iterationIdx,
@ -397,11 +399,14 @@ namespace Opm {
// the function handles one iteration of updating well controls and network pressures. // the function handles one iteration of updating well controls and network pressures.
// it is possible to decouple the update of well controls and network pressures further. // it is possible to decouple the update of well controls and network pressures further.
// the returned two booleans are {continue_due_to_network, well_group_control_changed}, respectively // the returned two booleans are {continue_due_to_network, well_group_control_changed}, respectively
std::pair<bool, bool> updateWellControlsAndNetworkIteration(const double dt, std::pair<bool, bool> updateWellControlsAndNetworkIteration(const bool mandatory_network_balance,
const double dt,
const std::size_t network_update_iteration, const std::size_t network_update_iteration,
DeferredLogger& local_deferredLogger); DeferredLogger& local_deferredLogger);
bool updateWellControlsAndNetwork(const double dt, DeferredLogger& local_deferredLogger); bool updateWellControlsAndNetwork(const bool mandatory_network_balance,
const double dt,
DeferredLogger& local_deferredLogger);
// called at the end of a time step // called at the end of a time step
void timeStepSucceeded(const double& simulationTime, const double dt); void timeStepSucceeded(const double& simulationTime, const double dt);

View File

@ -862,9 +862,7 @@ namespace Opm {
size_t iter = 0; size_t iter = 0;
bool changed_well_group = false; bool changed_well_group = false;
do { do {
// TODO: the interface of updateWellControlsAndNetwork is not updated yet changed_well_group = updateWellControlsAndNetwork(true, dt, deferred_logger);
// changed_well_group = updateWellControlsAndNetwork(deferred_logger, true);
changed_well_group = updateWellControlsAndNetwork(dt, deferred_logger);
assembleWellEqWithoutIteration(dt, deferred_logger); assembleWellEqWithoutIteration(dt, deferred_logger);
converged = this->getWellConvergence(this->B_avg_, true).converged() && !changed_well_group; converged = this->getWellConvergence(this->B_avg_, true).converged() && !changed_well_group;
if (converged) { if (converged) {
@ -933,7 +931,7 @@ namespace Opm {
terminal_output_, grid().comm()); terminal_output_, grid().comm());
} }
const bool well_group_control_changed = updateWellControlsAndNetwork(dt, local_deferredLogger); const bool well_group_control_changed = updateWellControlsAndNetwork(false, dt, local_deferredLogger);
if ( ! wellsActive() ) { if ( ! wellsActive() ) {
return; return;
@ -953,7 +951,7 @@ namespace Opm {
template<typename TypeTag> template<typename TypeTag>
bool bool
BlackoilWellModel<TypeTag>:: BlackoilWellModel<TypeTag>::
updateWellControlsAndNetwork(const double dt, DeferredLogger& local_deferredLogger) updateWellControlsAndNetwork(const bool mandatory_network_balance, const double dt, DeferredLogger& local_deferredLogger)
{ {
// not necessarily that we always need to update once of the network solutions // not necessarily that we always need to update once of the network solutions
bool do_network_update = true; bool do_network_update = true;
@ -961,7 +959,8 @@ namespace Opm {
std::size_t network_update_iteration = 0; std::size_t network_update_iteration = 0;
while (do_network_update) { while (do_network_update) {
std::tie(do_network_update, well_group_control_changed) = std::tie(do_network_update, well_group_control_changed) =
updateWellControlsAndNetworkIteration(dt, network_update_iteration, local_deferredLogger); updateWellControlsAndNetworkIteration(mandatory_network_balance, dt,
network_update_iteration, local_deferredLogger);
++network_update_iteration; ++network_update_iteration;
} }
return well_group_control_changed; return well_group_control_changed;
@ -973,11 +972,13 @@ namespace Opm {
template<typename TypeTag> template<typename TypeTag>
std::pair<bool, bool> std::pair<bool, bool>
BlackoilWellModel<TypeTag>:: BlackoilWellModel<TypeTag>::
updateWellControlsAndNetworkIteration(const double dt, updateWellControlsAndNetworkIteration(const bool mandatory_network_balance,
const double dt,
const std::size_t network_update_iteration, const std::size_t network_update_iteration,
DeferredLogger& local_deferredLogger) DeferredLogger& local_deferredLogger)
{ {
auto [well_group_control_changed, more_network_update] = updateWellControls(local_deferredLogger, network_update_iteration); auto [well_group_control_changed, more_network_update] =
updateWellControls(mandatory_network_balance,local_deferredLogger,network_update_iteration);
bool alq_updated = false; bool alq_updated = false;
OPM_BEGIN_PARALLEL_TRY_CATCH(); OPM_BEGIN_PARALLEL_TRY_CATCH();
@ -1556,7 +1557,7 @@ namespace Opm {
template<typename TypeTag> template<typename TypeTag>
std::pair<bool, bool> std::pair<bool, bool>
BlackoilWellModel<TypeTag>:: BlackoilWellModel<TypeTag>::
updateWellControls(DeferredLogger& deferred_logger, updateWellControls(const bool mandatory_network_balance, DeferredLogger& deferred_logger,
const std::size_t network_update_it) const std::size_t network_update_it)
{ {
const int episodeIdx = ebosSimulator_.episodeIndex(); const int episodeIdx = ebosSimulator_.episodeIndex();
@ -1571,7 +1572,7 @@ namespace Opm {
// network related // network related
bool more_network_update = false; bool more_network_update = false;
if (shouldBalanceNetwork(episodeIdx, iterationIdx)) { if (shouldBalanceNetwork(episodeIdx, iterationIdx) || mandatory_network_balance) {
const auto [local_network_changed, local_network_imbalance] = updateNetworkPressures(episodeIdx); const auto [local_network_changed, local_network_imbalance] = updateNetworkPressures(episodeIdx);
const bool network_changed = comm.sum(local_network_changed); const bool network_changed = comm.sum(local_network_changed);
const double network_imbalance = comm.max(local_network_imbalance); const double network_imbalance = comm.max(local_network_imbalance);

View File

@ -147,7 +147,7 @@ BOOST_AUTO_TEST_CASE(G1)
Opm::DeferredLogger deferred_logger; Opm::DeferredLogger deferred_logger;
well_model.calculateExplicitQuantities(deferred_logger); well_model.calculateExplicitQuantities(deferred_logger);
well_model.prepareTimeStep(deferred_logger); well_model.prepareTimeStep(deferred_logger);
well_model.updateWellControls(deferred_logger); well_model.updateWellControls(false, deferred_logger, 0);
well_model.initPrimaryVariablesEvaluation(); well_model.initPrimaryVariablesEvaluation();
Opm::WellInterface<TypeTag> *well_ptr = well_model.getWell("B-1H").get(); Opm::WellInterface<TypeTag> *well_ptr = well_model.getWell("B-1H").get();
StdWell *std_well = dynamic_cast<StdWell *>(well_ptr); StdWell *std_well = dynamic_cast<StdWell *>(well_ptr);