From cda47a63877d676933ef644df578c8c0175e2243 Mon Sep 17 00:00:00 2001 From: jakobtorben Date: Tue, 10 Sep 2024 09:57:15 +0200 Subject: [PATCH] Register convergence monitoring parameters --- opm/simulators/flow/BlackoilModel.hpp | 24 ++++++++----------- .../flow/BlackoilModelParameters.cpp | 11 +++++++++ .../flow/BlackoilModelParameters.hpp | 12 ++++++++++ 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/opm/simulators/flow/BlackoilModel.hpp b/opm/simulators/flow/BlackoilModel.hpp index 898e33112..1b754e801 100644 --- a/opm/simulators/flow/BlackoilModel.hpp +++ b/opm/simulators/flow/BlackoilModel.hpp @@ -1113,16 +1113,13 @@ namespace Opm { void checkCardPenalty(ConvergenceReport& report, int iteration) { if (iteration > 0) { - const auto& prev_report = convergence_reports_.back().report.back(); const auto& prev_metrics = prev_report.reservoirConvergence(); const auto& current_metrics = report.reservoirConvergence(); auto distances = std::vector(current_metrics.size(), 0.0); - const double sigma = 0.75; for (size_t i = 0; i < current_metrics.size(); ++i) { - distances[i] = std::max(std::log(current_metrics[i].value()), 0.0); if (current_metrics[i].type() == prev_metrics[i].type() && current_metrics[i].phase() == prev_metrics[i].phase()) { @@ -1133,9 +1130,9 @@ namespace Opm { } } // use L1 norm of the distances vector - double current_distance = std::accumulate(distances.begin(), distances.end(), 0.0); + double current_distance = std::accumulate(distances.begin(), distances.end(), 0.0); - if (current_distance > sigma * prev_distance_) { + if (current_distance > param_.convergence_monitoring_decay_factor_ * prev_distance_) { report.addDistanceDecayPenalty(); } prev_distance_ = current_distance; @@ -1147,6 +1144,12 @@ namespace Opm { total_penaltyCard_ += report.getPenaltyCard(); + if (total_penaltyCard_.total() > param_.convergence_monitoring_cutoff_) { + report.setReservoirFailed({ConvergenceReport::ReservoirFailure::Type::ConvergenceMonitorFailure, + ConvergenceReport::Severity::TooLarge, + -1}); // -1 indicates it's not specific to any component + throw ConvergenceMonitorFailure("Total penalty count exceeded cut-off-limit of " + std::to_string(param_.convergence_monitoring_cutoff_) + ". Cutting timestep."); + } } /// Compute convergence based on total mass balance (tol_mb) and maximum @@ -1170,15 +1173,8 @@ namespace Opm { OPM_TIMEBLOCK(getWellConvergence); report += wellModel().getWellConvergence(B_avg, /*checkWellGroupControls*/report.converged()); } - // check card penalty, and add to report - checkCardPenalty(report, iteration); - - int cut_off_limit = 30; - if (total_penaltyCard_.total() > cut_off_limit) { - report.setReservoirFailed({ConvergenceReport::ReservoirFailure::Type::ConvergenceMonitorFailure, - ConvergenceReport::Severity::TooLarge, - -1}); // -1 indicates it's not specific to any component - throw ConvergenceMonitorFailure("Total penalty count exceeded cut-off-limit of " + std::to_string(cut_off_limit) + ". Cutting timestep."); + if (param_.convergence_monitoring_) { + checkCardPenalty(report, iteration); } return report; diff --git a/opm/simulators/flow/BlackoilModelParameters.cpp b/opm/simulators/flow/BlackoilModelParameters.cpp index f4be5d768..07d2bf3d7 100644 --- a/opm/simulators/flow/BlackoilModelParameters.cpp +++ b/opm/simulators/flow/BlackoilModelParameters.cpp @@ -94,6 +94,10 @@ BlackoilModelParameters::BlackoilModelParameters() network_max_iterations_ = Parameters::Get(); local_domain_ordering_ = domainOrderingMeasureFromString(Parameters::Get()); write_partitions_ = Parameters::Get(); + + convergence_monitoring_ = Parameters::Get(); + convergence_monitoring_cutoff_ = Parameters::Get(); + convergence_monitoring_decay_factor_ = Parameters::Get>(); } template @@ -228,6 +232,13 @@ void BlackoilModelParameters::registerParameters() Parameters::Register ("Whether or not to emit cell partitions as a debugging aid."); + Parameters::Register + ("Enable convergence monitoring"); + Parameters::Register + ("Cut off limit for convergence monitoring"); + Parameters::Register> + ("Decay factor for convergence monitoring"); + Parameters::Hide(); // if openMP is available, determine the number threads per process automatically. diff --git a/opm/simulators/flow/BlackoilModelParameters.hpp b/opm/simulators/flow/BlackoilModelParameters.hpp index 377e2699b..ff626e0b5 100644 --- a/opm/simulators/flow/BlackoilModelParameters.hpp +++ b/opm/simulators/flow/BlackoilModelParameters.hpp @@ -137,6 +137,11 @@ struct LocalDomainsPartitioningImbalance { static constexpr Scalar value = 1.03; struct LocalDomainsPartitioningMethod { static constexpr auto value = "zoltan"; }; struct LocalDomainsOrderingMeasure { static constexpr auto value = "maxpressure"; }; +struct ConvergenceMonitoring { static constexpr bool value = false; }; +struct ConvergenceMonitoringCutOff { static constexpr int value = 30; }; +template +struct ConvergenceMonitoringDecayFactor { static constexpr Scalar value = 0.75; }; + } // namespace Opm::Parameters namespace Opm { @@ -284,6 +289,13 @@ public: bool write_partitions_{false}; + /// Whether to enable convergence monitoring + bool convergence_monitoring_; + /// Cut-off limit for convergence monitoring + int convergence_monitoring_cutoff_; + /// Decay factor used in convergence monitoring + Scalar convergence_monitoring_decay_factor_; + /// Construct from user parameters or defaults. BlackoilModelParameters();