From e58fed9956ab396b95e792904f5f16ed46f7092b Mon Sep 17 00:00:00 2001 From: Andreas Lauser Date: Fri, 9 Jun 2017 13:41:34 +0200 Subject: [PATCH 1/4] ignore the CNV convergence criterion for the last few newton iterations the cell based residual can cause problems for cells with almost-singular shapes and/or small pore volume. --- opm/autodiff/BlackoilModelEbos.hpp | 7 ++++++- opm/autodiff/BlackoilModelParameters.cpp | 1 + opm/autodiff/BlackoilModelParameters.hpp | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/opm/autodiff/BlackoilModelEbos.hpp b/opm/autodiff/BlackoilModelEbos.hpp index 6b7d3383c..6b115a9a9 100644 --- a/opm/autodiff/BlackoilModelEbos.hpp +++ b/opm/autodiff/BlackoilModelEbos.hpp @@ -975,7 +975,12 @@ namespace Opm { residual_norms.push_back(CNV[compIdx]); } - const bool converged = converged_MB && converged_CNV && converged_Well; + bool converged = converged_MB && converged_Well; + + // do not care about the cell based residual in the last two Newton + // iterations + if (iteration < param_.max_iter_ - 2) + converged = converged && converged_CNV; if ( terminal_output_ ) { diff --git a/opm/autodiff/BlackoilModelParameters.cpp b/opm/autodiff/BlackoilModelParameters.cpp index 6ae955458..e33a4c4d2 100644 --- a/opm/autodiff/BlackoilModelParameters.cpp +++ b/opm/autodiff/BlackoilModelParameters.cpp @@ -52,6 +52,7 @@ namespace Opm tolerance_well_control_ = param.getDefault("tolerance_well_control", tolerance_well_control_); maxSinglePrecisionTimeStep_ = unit::convert::from( param.getDefault("max_single_precision_days", unit::convert::to( maxSinglePrecisionTimeStep_, unit::day) ), unit::day ); + max_iter_ = param.getDefault("max_iter",15); solve_welleq_initially_ = param.getDefault("solve_welleq_initially",solve_welleq_initially_); update_equations_scaling_ = param.getDefault("update_equations_scaling", update_equations_scaling_); use_update_stabilization_ = param.getDefault("use_update_stabilization", use_update_stabilization_); diff --git a/opm/autodiff/BlackoilModelParameters.hpp b/opm/autodiff/BlackoilModelParameters.hpp index 9f3427bb9..12260472a 100644 --- a/opm/autodiff/BlackoilModelParameters.hpp +++ b/opm/autodiff/BlackoilModelParameters.hpp @@ -56,6 +56,9 @@ namespace Opm /// for solving for the Jacobian double maxSinglePrecisionTimeStep_; + /// Maximum number of Newton iterations before we give up + int max_iter_; + /// Solve well equation initially bool solve_welleq_initially_; From 0304183361a2e0eb1fbc257f132e90c54823b50c Mon Sep 17 00:00:00 2001 From: Andreas Lauser Date: Fri, 9 Jun 2017 15:57:11 +0200 Subject: [PATCH 2/4] Newton: fail earlier i.e. give up after 10 instead of 15 Newton iterations. since this now also causes the CNV convergence criterion to be ignored after 8 instead of after 13 Newton iterations, and because CNV stagnation seems to be the cause for the vast majority of the failures, it does not lead to worse results or more time step chopping on Norne but causes fewer wasted iterations. --- opm/autodiff/BlackoilModelParameters.cpp | 2 +- opm/autodiff/NonlinearSolver_impl.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/opm/autodiff/BlackoilModelParameters.cpp b/opm/autodiff/BlackoilModelParameters.cpp index e33a4c4d2..4376a2a52 100644 --- a/opm/autodiff/BlackoilModelParameters.cpp +++ b/opm/autodiff/BlackoilModelParameters.cpp @@ -52,7 +52,7 @@ namespace Opm tolerance_well_control_ = param.getDefault("tolerance_well_control", tolerance_well_control_); maxSinglePrecisionTimeStep_ = unit::convert::from( param.getDefault("max_single_precision_days", unit::convert::to( maxSinglePrecisionTimeStep_, unit::day) ), unit::day ); - max_iter_ = param.getDefault("max_iter",15); + max_iter_ = param.getDefault("max_iter",10); solve_welleq_initially_ = param.getDefault("solve_welleq_initially",solve_welleq_initially_); update_equations_scaling_ = param.getDefault("update_equations_scaling", update_equations_scaling_); use_update_stabilization_ = param.getDefault("use_update_stabilization", use_update_stabilization_); diff --git a/opm/autodiff/NonlinearSolver_impl.hpp b/opm/autodiff/NonlinearSolver_impl.hpp index cc6126a01..1caaa0ece 100644 --- a/opm/autodiff/NonlinearSolver_impl.hpp +++ b/opm/autodiff/NonlinearSolver_impl.hpp @@ -184,7 +184,7 @@ namespace Opm relax_max_ = 0.5; relax_increment_ = 0.1; relax_rel_tol_ = 0.2; - max_iter_ = 15; + max_iter_ = 10; min_iter_ = 1; } From e3d0bbc144f541bcc5911076f5406f03861e0c73 Mon Sep 17 00:00:00 2001 From: Andreas Lauser Date: Tue, 13 Jun 2017 15:55:19 +0200 Subject: [PATCH 3/4] specify the number of iterations where we use a "strict" Newton convergence criterion using a separate parameter that parameter is called "max_strict_iter". This increases the flexibility of this slightly and it avoids screwing up the default value for the "max_iter" parameter in the future. The credits for this patch go to [at]atgeirr for proposing it. --- opm/autodiff/BlackoilModelEbos.hpp | 2 +- opm/autodiff/BlackoilModelParameters.cpp | 2 +- opm/autodiff/BlackoilModelParameters.hpp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/opm/autodiff/BlackoilModelEbos.hpp b/opm/autodiff/BlackoilModelEbos.hpp index 6b115a9a9..6f2b9350c 100644 --- a/opm/autodiff/BlackoilModelEbos.hpp +++ b/opm/autodiff/BlackoilModelEbos.hpp @@ -979,7 +979,7 @@ namespace Opm { // do not care about the cell based residual in the last two Newton // iterations - if (iteration < param_.max_iter_ - 2) + if (iteration < param_.max_strict_iter_) converged = converged && converged_CNV; if ( terminal_output_ ) diff --git a/opm/autodiff/BlackoilModelParameters.cpp b/opm/autodiff/BlackoilModelParameters.cpp index 4376a2a52..9808556a7 100644 --- a/opm/autodiff/BlackoilModelParameters.cpp +++ b/opm/autodiff/BlackoilModelParameters.cpp @@ -52,7 +52,7 @@ namespace Opm tolerance_well_control_ = param.getDefault("tolerance_well_control", tolerance_well_control_); maxSinglePrecisionTimeStep_ = unit::convert::from( param.getDefault("max_single_precision_days", unit::convert::to( maxSinglePrecisionTimeStep_, unit::day) ), unit::day ); - max_iter_ = param.getDefault("max_iter",10); + max_strict_iter_ = param.getDefault("max_strict_iter",8); solve_welleq_initially_ = param.getDefault("solve_welleq_initially",solve_welleq_initially_); update_equations_scaling_ = param.getDefault("update_equations_scaling", update_equations_scaling_); use_update_stabilization_ = param.getDefault("use_update_stabilization", use_update_stabilization_); diff --git a/opm/autodiff/BlackoilModelParameters.hpp b/opm/autodiff/BlackoilModelParameters.hpp index 12260472a..cfb36728b 100644 --- a/opm/autodiff/BlackoilModelParameters.hpp +++ b/opm/autodiff/BlackoilModelParameters.hpp @@ -56,8 +56,8 @@ namespace Opm /// for solving for the Jacobian double maxSinglePrecisionTimeStep_; - /// Maximum number of Newton iterations before we give up - int max_iter_; + /// Maximum number of Newton iterations before we give up on the CNV convergence criterion + int max_strict_iter_; /// Solve well equation initially bool solve_welleq_initially_; From 0a868b4374fc6e0262bd8262d6032104000a5aff Mon Sep 17 00:00:00 2001 From: Arne Morten Kvarving Date: Wed, 14 Jun 2017 12:43:25 +0200 Subject: [PATCH 4/4] fix param file specification in regression test use this in spe5. (temporarily) disable in polymer where it was intended to be used but bug caused it not to be. --- compareECLFiles.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/compareECLFiles.cmake b/compareECLFiles.cmake index 2f8e22ea7..54165923d 100644 --- a/compareECLFiles.cmake +++ b/compareECLFiles.cmake @@ -27,7 +27,7 @@ macro (add_test_compareECLFiles casename filename simulator abs_tol rel_tol pref set(DIR ${casename}) endif() if(${ARGC} GREATER 8) - set(TEST_ARGS ${OPM_DATA_ROOT}/${DIR}/${ARGV1} deckfilename=${OPM_DATA_ROOT}/${DIR}/${filename}) + set(TEST_ARGS ${OPM_DATA_ROOT}/${DIR}/${ARGV8} deck_filename=${OPM_DATA_ROOT}/${DIR}/${filename}.DATA) else() set(TEST_ARGS ${OPM_DATA_ROOT}/${DIR}/${filename}) endif() @@ -113,8 +113,8 @@ add_test_compareECLFiles(spe3 SPE3CASE1 flow_legacy ${abs_tol} ${rel_tol} compar add_test_compareECLFiles(spe9 SPE9_CP_SHORT flow_ebos ${abs_tol} ${rel_tol} compareECLFiles "") add_test_compareECLFiles(spe9 SPE9_CP_SHORT flow_legacy ${abs_tol} ${rel_tol} compareECLFiles "") add_test_compareECLFiles(msw_2d_h 2D_H__ flow_multisegment ${abs_tol} ${rel_tol} compareECLFiles "") -add_test_compareECLFiles(polymer_simple2D 2D_THREEPHASE_POLY_HETER flow_polymer ${abs_tol} ${rel_tol} compareECLFiles "" polymer_simple2D run.param) -add_test_compareECLFiles(spe5 SPE5CASE1 flow_solvent ${abs_tol} ${rel_tol} compareECLFiles "") +add_test_compareECLFiles(polymer_simple2D 2D_THREEPHASE_POLY_HETER flow_polymer ${abs_tol} ${rel_tol} compareECLFiles "") +add_test_compareECLFiles(spe5 SPE5CASE1 flow_solvent ${abs_tol} ${rel_tol} compareECLFiles "" spe5 run.param) # Restart tests opm_set_test_driver(${PROJECT_SOURCE_DIR}/tests/run-restart-regressionTest.sh "")