diff --git a/opm/simulators/flow/BlackoilModel.hpp b/opm/simulators/flow/BlackoilModel.hpp index 4182958b0..2ccf4a093 100644 --- a/opm/simulators/flow/BlackoilModel.hpp +++ b/opm/simulators/flow/BlackoilModel.hpp @@ -1009,6 +1009,7 @@ namespace Opm { const auto tol_cnv = use_relaxed_cnv ? param_.tolerance_cnv_relaxed_ : param_.tolerance_cnv_; const auto tol_mb = use_relaxed_mb ? param_.tolerance_mb_relaxed_ : param_.tolerance_mb_; + const auto tol_cnv_energy = use_relaxed_cnv ? param_.tolerance_cnv_energy_relaxed_ : param_.tolerance_cnv_energy_; // Finish computation std::vector CNV(numComp); @@ -1031,7 +1032,9 @@ namespace Opm { CR::ReservoirFailure::Type::Cnv, }; - const Scalar tol[2] = { tol_mb, tol_cnv, }; + Scalar tol[2] = { tol_mb, tol_cnv, }; + if (has_energy_ && compIdx == contiEnergyEqIdx) + tol[1] = tol_cnv_energy; for (int ii : {0, 1}) { if (std::isnan(res[ii])) { diff --git a/opm/simulators/flow/BlackoilModelParameters.cpp b/opm/simulators/flow/BlackoilModelParameters.cpp index 23eae8231..b2abb3890 100644 --- a/opm/simulators/flow/BlackoilModelParameters.cpp +++ b/opm/simulators/flow/BlackoilModelParameters.cpp @@ -40,6 +40,8 @@ BlackoilModelParameters::BlackoilModelParameters() tolerance_mb_relaxed_ = std::max(tolerance_mb_, Parameters::Get>()); tolerance_cnv_ = Parameters::Get>(); tolerance_cnv_relaxed_ = std::max(tolerance_cnv_, Parameters::Get>()); + tolerance_cnv_energy_ = Parameters::Get>(); + tolerance_cnv_energy_relaxed_ = std::max(tolerance_cnv_energy_, Parameters::Get>()); tolerance_wells_ = Parameters::Get>(); tolerance_well_control_ = Parameters::Get>(); max_welleq_iter_ = Parameters::Get(); @@ -115,6 +117,11 @@ void BlackoilModelParameters::registerParameters() Parameters::Register> ("Relaxed local convergence tolerance that applies for iterations " "after the iterations with the strict tolerance"); + Parameters::Register> + ("Local energy convergence tolerance (Maximum of local energy errors)"); + Parameters::Register> + ("Relaxed local energy convergence tolerance that applies for iterations " + "after the iterations with the strict tolerance"); Parameters::Register> ("Well convergence tolerance"); Parameters::Register> diff --git a/opm/simulators/flow/BlackoilModelParameters.hpp b/opm/simulators/flow/BlackoilModelParameters.hpp index 01df8c35c..ff61fd9af 100644 --- a/opm/simulators/flow/BlackoilModelParameters.hpp +++ b/opm/simulators/flow/BlackoilModelParameters.hpp @@ -52,6 +52,12 @@ struct ToleranceCnv { static constexpr Scalar value = 1e-2; }; template struct ToleranceCnvRelaxed { static constexpr Scalar value = 1.0; }; +template +struct ToleranceCnvEnergy { static constexpr Scalar value = 1e-4; }; + +template +struct ToleranceCnvEnergyRelaxed { static constexpr Scalar value = 2.0e-4; }; + template struct ToleranceWells { static constexpr Scalar value = 1e-4; }; @@ -151,6 +157,10 @@ public: Scalar tolerance_cnv_; /// Relaxed local convergence tolerance (can be used when iter >= min_strict_cnv_iter_ && cnvViolatedPV < relaxed_max_pv_fraction_). Scalar tolerance_cnv_relaxed_; + /// Local energy convergence tolerance (max of local energy errors). + Scalar tolerance_cnv_energy_; + /// Relaxed local energy convergence tolerance (can be used when iter >= min_strict_cnv_iter_ && cnvViolatedPV < relaxed_max_pv_fraction_). + Scalar tolerance_cnv_energy_relaxed_; /// Well convergence tolerance. Scalar tolerance_wells_; /// Tolerance for the well control equations