From e2ad7378481c18c4ae00723d8845eac98b04858a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A5rd=20Skaflestad?= Date: Tue, 10 Oct 2023 18:25:24 +0200 Subject: [PATCH] Make Number of Initial Global Iterations Configurable The NLDD solver would always take one global non-linear (Newton) iteration before starting the local non-linear iterations. This commit introduces a new command-line parameter, --nldd-num-initial-newton-iter (NlddNumInitialNewtonIter) which allows the user to configure this value at runtime. The default value, 1, preserves the current behaviour. --- opm/simulators/flow/BlackoilModelEbos.hpp | 12 ++++++------ opm/simulators/flow/BlackoilModelParametersEbos.hpp | 12 ++++++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/opm/simulators/flow/BlackoilModelEbos.hpp b/opm/simulators/flow/BlackoilModelEbos.hpp index de556497f..45d73d699 100644 --- a/opm/simulators/flow/BlackoilModelEbos.hpp +++ b/opm/simulators/flow/BlackoilModelEbos.hpp @@ -369,13 +369,13 @@ namespace Opm { convergence_reports_.back().report.reserve(11); } - if (iteration == 0) { - return nonlinearIterationNewton(iteration, timer, nonlinear_solver); + if ((this->param_.nonlinear_solver_ != "nldd") || + (iteration < this->param_.nldd_num_initial_newton_iter_)) + { + return this->nonlinearIterationNewton(iteration, timer, nonlinear_solver); } - if (param_.nonlinear_solver_ == "nldd") { - return nlddSolver_->nonlinearIterationNldd(iteration, timer, nonlinear_solver); - } else { - return nonlinearIterationNewton(iteration, timer, nonlinear_solver); + else { + return this->nlddSolver_->nonlinearIterationNldd(iteration, timer, nonlinear_solver); } } diff --git a/opm/simulators/flow/BlackoilModelParametersEbos.hpp b/opm/simulators/flow/BlackoilModelParametersEbos.hpp index dfe740723..1cddef6a0 100644 --- a/opm/simulators/flow/BlackoilModelParametersEbos.hpp +++ b/opm/simulators/flow/BlackoilModelParametersEbos.hpp @@ -208,6 +208,10 @@ struct LocalToleranceScalingCnv { using type = UndefinedProperty; }; template +struct NlddNumInitialNewtonIter { + using type = UndefinedProperty; +}; +template struct NumLocalDomains { using type = UndefinedProperty; }; @@ -407,6 +411,11 @@ struct LocalToleranceScalingCnv { static constexpr type value = 0.01; }; template +struct NlddNumInitialNewtonIter { + using type = int; + static constexpr auto value = type{1}; +}; +template struct NumLocalDomains { using type = int; static constexpr auto value = 0; @@ -558,6 +567,7 @@ namespace Opm double local_tolerance_scaling_mb_; double local_tolerance_scaling_cnv_; + int nldd_num_initial_newton_iter_{1}; int num_local_domains_{0}; double local_domain_partition_imbalance_{1.03}; std::string local_domain_partition_method_; @@ -612,6 +622,7 @@ namespace Opm max_local_solve_iterations_ = EWOMS_GET_PARAM(TypeTag, int, MaxLocalSolveIterations); local_tolerance_scaling_mb_ = EWOMS_GET_PARAM(TypeTag, double, LocalToleranceScalingMb); local_tolerance_scaling_cnv_ = EWOMS_GET_PARAM(TypeTag, double, LocalToleranceScalingCnv); + nldd_num_initial_newton_iter_ = EWOMS_GET_PARAM(TypeTag, int, NlddNumInitialNewtonIter); num_local_domains_ = EWOMS_GET_PARAM(TypeTag, int, NumLocalDomains); local_domain_partition_imbalance_ = std::max(1.0, EWOMS_GET_PARAM(TypeTag, double, LocalDomainsPartitioningImbalance)); local_domain_partition_method_ = EWOMS_GET_PARAM(TypeTag, std::string, LocalDomainsPartitioningMethod); @@ -672,6 +683,7 @@ namespace Opm EWOMS_REGISTER_PARAM(TypeTag, int, MaxLocalSolveIterations, "Max iterations for local solves with NLDD nonlinear solver."); EWOMS_REGISTER_PARAM(TypeTag, Scalar, LocalToleranceScalingMb, "Set lower than 1.0 to use stricter convergence tolerance for local solves."); EWOMS_REGISTER_PARAM(TypeTag, Scalar, LocalToleranceScalingCnv, "Set lower than 1.0 to use stricter convergence tolerance for local solves."); + EWOMS_REGISTER_PARAM(TypeTag, int, NlddNumInitialNewtonIter, "Number of initial global Newton iterations when running the NLDD nonlinear solver."); EWOMS_REGISTER_PARAM(TypeTag, int, NumLocalDomains, "Number of local domains for NLDD nonlinear solver."); EWOMS_REGISTER_PARAM(TypeTag, Scalar, LocalDomainsPartitioningImbalance, "Subdomain partitioning imbalance tolerance. 1.03 is 3 percent imbalance."); EWOMS_REGISTER_PARAM(TypeTag, std::string, LocalDomainsPartitioningMethod, "Subdomain partitioning method. "