Add energy balance tolerances + use standard tolerances as defaults for now

This commit is contained in:
Vegard Kippe 2024-09-16 14:38:28 +02:00
parent 33b72a9722
commit 18a8b5bb90
3 changed files with 23 additions and 3 deletions

View File

@ -1010,6 +1010,7 @@ namespace Opm {
const auto tol_cnv = use_relaxed_cnv ? param_.tolerance_cnv_relaxed_ : param_.tolerance_cnv_; 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_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_; const auto tol_cnv_energy = use_relaxed_cnv ? param_.tolerance_cnv_energy_relaxed_ : param_.tolerance_cnv_energy_;
const auto tol_eb = use_relaxed_mb ? param_.tolerance_energy_balance_relaxed_ : param_.tolerance_energy_balance_;
// Finish computation // Finish computation
std::vector<Scalar> CNV(numComp); std::vector<Scalar> CNV(numComp);
@ -1033,8 +1034,10 @@ namespace Opm {
}; };
Scalar tol[2] = { tol_mb, tol_cnv, }; Scalar tol[2] = { tol_mb, tol_cnv, };
if (has_energy_ && compIdx == contiEnergyEqIdx) if (has_energy_ && compIdx == contiEnergyEqIdx) {
tol[0] = tol_eb;
tol[1] = tol_cnv_energy; tol[1] = tol_cnv_energy;
}
for (int ii : {0, 1}) { for (int ii : {0, 1}) {
if (std::isnan(res[ii])) { if (std::isnan(res[ii])) {

View File

@ -38,6 +38,8 @@ BlackoilModelParameters<Scalar>::BlackoilModelParameters()
relaxed_max_pv_fraction_ = Parameters::Get<Parameters::RelaxedMaxPvFraction<Scalar>>(); relaxed_max_pv_fraction_ = Parameters::Get<Parameters::RelaxedMaxPvFraction<Scalar>>();
tolerance_mb_ = Parameters::Get<Parameters::ToleranceMb<Scalar>>(); tolerance_mb_ = Parameters::Get<Parameters::ToleranceMb<Scalar>>();
tolerance_mb_relaxed_ = std::max(tolerance_mb_, Parameters::Get<Parameters::ToleranceMbRelaxed<Scalar>>()); tolerance_mb_relaxed_ = std::max(tolerance_mb_, Parameters::Get<Parameters::ToleranceMbRelaxed<Scalar>>());
tolerance_energy_balance_ = Parameters::Get<Parameters::ToleranceEnergyBalance<Scalar>>();
tolerance_energy_balance_relaxed_ = std::max(tolerance_energy_balance_, Parameters::Get<Parameters::ToleranceEnergyBalanceRelaxed<Scalar>>());
tolerance_cnv_ = Parameters::Get<Parameters::ToleranceCnv<Scalar>>(); tolerance_cnv_ = Parameters::Get<Parameters::ToleranceCnv<Scalar>>();
tolerance_cnv_relaxed_ = std::max(tolerance_cnv_, Parameters::Get<Parameters::ToleranceCnvRelaxed<Scalar>>()); tolerance_cnv_relaxed_ = std::max(tolerance_cnv_, Parameters::Get<Parameters::ToleranceCnvRelaxed<Scalar>>());
tolerance_cnv_energy_ = Parameters::Get<Parameters::ToleranceCnvEnergy<Scalar>>(); tolerance_cnv_energy_ = Parameters::Get<Parameters::ToleranceCnvEnergy<Scalar>>();
@ -112,6 +114,11 @@ void BlackoilModelParameters<Scalar>::registerParameters()
Parameters::Register<Parameters::ToleranceMbRelaxed<Scalar>> Parameters::Register<Parameters::ToleranceMbRelaxed<Scalar>>
("Relaxed tolerated mass balance error that applies for iterations " ("Relaxed tolerated mass balance error that applies for iterations "
"after the iterations with the strict tolerance"); "after the iterations with the strict tolerance");
Parameters::Register<Parameters::ToleranceEnergyBalance<Scalar>>
("Tolerated energy balance error relative to (scaled) total energy present");
Parameters::Register<Parameters::ToleranceEnergyBalanceRelaxed<Scalar>>
("Relaxed tolerated energy balance error that applies for iterations "
"after the iterations with the strict tolerance");
Parameters::Register<Parameters::ToleranceCnv<Scalar>> Parameters::Register<Parameters::ToleranceCnv<Scalar>>
("Local convergence tolerance (Maximum of local saturation errors)"); ("Local convergence tolerance (Maximum of local saturation errors)");
Parameters::Register<Parameters::ToleranceCnvRelaxed<Scalar>> Parameters::Register<Parameters::ToleranceCnvRelaxed<Scalar>>

View File

@ -46,6 +46,12 @@ struct ToleranceMb { static constexpr Scalar value = 1e-7; };
template<class Scalar> template<class Scalar>
struct ToleranceMbRelaxed { static constexpr Scalar value = 1e-6; }; struct ToleranceMbRelaxed { static constexpr Scalar value = 1e-6; };
template<class Scalar>
struct ToleranceEnergyBalance { static constexpr Scalar value = 1e-7; };
template<class Scalar>
struct ToleranceEnergyBalanceRelaxed { static constexpr Scalar value = 1e-6; };
template<class Scalar> template<class Scalar>
struct ToleranceCnv { static constexpr Scalar value = 1e-2; }; struct ToleranceCnv { static constexpr Scalar value = 1e-2; };
@ -53,10 +59,10 @@ template<class Scalar>
struct ToleranceCnvRelaxed { static constexpr Scalar value = 1.0; }; struct ToleranceCnvRelaxed { static constexpr Scalar value = 1.0; };
template<class Scalar> template<class Scalar>
struct ToleranceCnvEnergy { static constexpr Scalar value = 1e-4; }; struct ToleranceCnvEnergy { static constexpr Scalar value = 1e-2; };
template<class Scalar> template<class Scalar>
struct ToleranceCnvEnergyRelaxed { static constexpr Scalar value = 2.0e-4; }; struct ToleranceCnvEnergyRelaxed { static constexpr Scalar value = 1.0; };
template<class Scalar> template<class Scalar>
struct ToleranceWells { static constexpr Scalar value = 1e-4; }; struct ToleranceWells { static constexpr Scalar value = 1e-4; };
@ -153,6 +159,10 @@ public:
Scalar tolerance_mb_; Scalar tolerance_mb_;
/// Relaxed mass balance tolerance (can be used when iter >= min_strict_mb_iter_). /// Relaxed mass balance tolerance (can be used when iter >= min_strict_mb_iter_).
Scalar tolerance_mb_relaxed_; Scalar tolerance_mb_relaxed_;
/// Relative energy balance tolerance (total energy balance error).
Scalar tolerance_energy_balance_;
/// Relaxed energy balance tolerance (can be used when iter >= min_strict_mb_iter_).
Scalar tolerance_energy_balance_relaxed_;
/// Local convergence tolerance (max of local saturation errors). /// Local convergence tolerance (max of local saturation errors).
Scalar tolerance_cnv_; Scalar tolerance_cnv_;
/// Relaxed local convergence tolerance (can be used when iter >= min_strict_cnv_iter_ && cnvViolatedPV < relaxed_max_pv_fraction_). /// Relaxed local convergence tolerance (can be used when iter >= min_strict_cnv_iter_ && cnvViolatedPV < relaxed_max_pv_fraction_).