From 0a876ee833b7bb6cf358fa3e2ff92594c9801192 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ole=20Sch=C3=BCtt?= Date: Sun, 8 Feb 2026 14:26:49 +0100 Subject: [PATCH] PAO: Abort on convergence failure --- src/pao_input.F | 12 ++++++++++++ src/pao_main.F | 6 +++++- src/pao_types.F | 1 + tests/QS/regtest-pao-1/H2_pao_equi_checkgrad.inp | 1 + tests/QS/regtest-pao-1/H2_pao_exp_checkgrad.inp | 1 + tests/QS/regtest-pao-1/H2_pao_fock_checkgrad.inp | 1 + tests/QS/regtest-pao-1/H2_pao_gth_checkgrad.inp | 1 + tests/QS/regtest-pao-1/H2_pao_rotinv_checkgrad.inp | 1 + tests/QS/regtest-pao-2/H2O_pao_check_grad.inp | 1 + tests/QS/regtest-pao-2/H2O_pao_exp_cluster_MD.inp | 1 + 10 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/pao_input.F b/src/pao_input.F index d3a444b529..af35ed28b9 100644 --- a/src/pao_input.F +++ b/src/pao_input.F @@ -101,6 +101,9 @@ CONTAINS CALL section_vals_val_get(pao_section, "MAX_CYCLES", i_val=pao%max_cycles) IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,I11)") " PAO|", "MAX_CYCLES", pao%max_cycles + CALL section_vals_val_get(pao_section, "IGNORE_CONVERGENCE_FAILURE", l_val=pao%ignore_convergence_failure) + IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,L11)") " PAO|", "IGNORE_CONVERGENCE_FAILURE", pao%ignore_convergence_failure + CALL section_vals_val_get(pao_section, "PARAMETERIZATION", i_val=pao%parameterization) IF (pao%iw > 0) WRITE (pao%iw, "(A,T40,A,T70,A11)") " PAO|", "PARAMETERIZATION", id2str(pao%parameterization) @@ -296,6 +299,15 @@ CONTAINS CALL section_add_keyword(section, keyword) CALL keyword_release(keyword) + CALL keyword_create(keyword, __LOCATION__, name="IGNORE_CONVERGENCE_FAILURE", & + description="If true, only a warning is issued if a PAO "// & + "optimization has not converged. By default, a run is aborted "// & + "if the required convergence criteria have not been achieved.", & + usage="IGNORE_CONVERGENCE_FAILURE logical_value", & + default_l_val=.FALSE., lone_keyword_l_val=.TRUE.) + CALL section_add_keyword(section, keyword) + CALL keyword_release(keyword) + ! Parametrization ********************************************************** CALL keyword_create(keyword, __LOCATION__, name="PARAMETERIZATION", & description="Parametrization of the mapping between the primary and the PAO basis.", & diff --git a/src/pao_main.F b/src/pao_main.F index 705d2dc1f6..9284c2a05f 100644 --- a/src/pao_main.F +++ b/src/pao_main.F @@ -285,7 +285,11 @@ CONTAINS ! check for early abort without convergence? CALL external_control(should_stop, "PAO", start_time=qs_env%start_time, target_time=qs_env%target_time) IF (should_stop .OR. pao%istep >= pao%max_pao) THEN - CPWARN("PAO not converged!") + IF (pao%ignore_convergence_failure) THEN + CPWARN("PAO not converged!") + ELSE + CPABORT("PAO not converged!") + END IF pao_is_done = .TRUE. EXIT END IF diff --git a/src/pao_types.F b/src/pao_types.F index 42ede38420..242f6095c4 100644 --- a/src/pao_types.F +++ b/src/pao_types.F @@ -168,6 +168,7 @@ MODULE pao_types INTEGER :: optimizer = -1 INTEGER :: cg_init_steps = -1 LOGICAL :: precondition = .FALSE. + LOGICAL :: ignore_convergence_failure = .FALSE. CHARACTER(LEN=default_path_length) :: preopt_dm_file = "" CHARACTER(LEN=default_path_length) :: restart_file = "" TYPE(filename_type), DIMENSION(:), ALLOCATABLE :: ml_training_set diff --git a/tests/QS/regtest-pao-1/H2_pao_equi_checkgrad.inp b/tests/QS/regtest-pao-1/H2_pao_equi_checkgrad.inp index 792c2fa56a..1d83f7de73 100644 --- a/tests/QS/regtest-pao-1/H2_pao_equi_checkgrad.inp +++ b/tests/QS/regtest-pao-1/H2_pao_equi_checkgrad.inp @@ -18,6 +18,7 @@ &PAO CHECK_GRADIENT_TOL 1.0E-6 EPS_PAO 1.0E-5 + IGNORE_CONVERGENCE_FAILURE MAX_PAO 1 NUM_GRADIENT_ORDER 6 PARAMETERIZATION EQUIVARIANT diff --git a/tests/QS/regtest-pao-1/H2_pao_exp_checkgrad.inp b/tests/QS/regtest-pao-1/H2_pao_exp_checkgrad.inp index 5e2a03caa6..5009ff7498 100644 --- a/tests/QS/regtest-pao-1/H2_pao_exp_checkgrad.inp +++ b/tests/QS/regtest-pao-1/H2_pao_exp_checkgrad.inp @@ -18,6 +18,7 @@ &PAO CHECK_GRADIENT_TOL 1.0E-6 EPS_PAO 1.0E-5 + IGNORE_CONVERGENCE_FAILURE MAX_PAO 1 NUM_GRADIENT_ORDER 6 PARAMETERIZATION EXP diff --git a/tests/QS/regtest-pao-1/H2_pao_fock_checkgrad.inp b/tests/QS/regtest-pao-1/H2_pao_fock_checkgrad.inp index 96b6f6d06a..5477315680 100644 --- a/tests/QS/regtest-pao-1/H2_pao_fock_checkgrad.inp +++ b/tests/QS/regtest-pao-1/H2_pao_fock_checkgrad.inp @@ -18,6 +18,7 @@ &PAO CHECK_GRADIENT_TOL 1.0E-6 EPS_PAO 1.0E-5 + IGNORE_CONVERGENCE_FAILURE MAX_PAO 1 NUM_GRADIENT_ORDER 4 PARAMETERIZATION FOCK diff --git a/tests/QS/regtest-pao-1/H2_pao_gth_checkgrad.inp b/tests/QS/regtest-pao-1/H2_pao_gth_checkgrad.inp index 5a0750d4f5..a3fca92c5d 100644 --- a/tests/QS/regtest-pao-1/H2_pao_gth_checkgrad.inp +++ b/tests/QS/regtest-pao-1/H2_pao_gth_checkgrad.inp @@ -19,6 +19,7 @@ &PAO CHECK_GRADIENT_TOL 1.0E-6 EPS_PAO 1.0E-5 + IGNORE_CONVERGENCE_FAILURE MAX_PAO 1 NUM_GRADIENT_ORDER 4 PARAMETERIZATION GTH diff --git a/tests/QS/regtest-pao-1/H2_pao_rotinv_checkgrad.inp b/tests/QS/regtest-pao-1/H2_pao_rotinv_checkgrad.inp index b11d2a641c..ed6177184b 100644 --- a/tests/QS/regtest-pao-1/H2_pao_rotinv_checkgrad.inp +++ b/tests/QS/regtest-pao-1/H2_pao_rotinv_checkgrad.inp @@ -18,6 +18,7 @@ &PAO CHECK_GRADIENT_TOL 1.0E-6 EPS_PAO 1.0E-5 + IGNORE_CONVERGENCE_FAILURE LINPOT_INITGUESS_DELTA 0.1 MAX_PAO 1 NUM_GRADIENT_ORDER 2 diff --git a/tests/QS/regtest-pao-2/H2O_pao_check_grad.inp b/tests/QS/regtest-pao-2/H2O_pao_check_grad.inp index 0616f3fa33..d1d5fa0682 100644 --- a/tests/QS/regtest-pao-2/H2O_pao_check_grad.inp +++ b/tests/QS/regtest-pao-2/H2O_pao_check_grad.inp @@ -18,6 +18,7 @@ S_PRECONDITIONER NONE &PAO CHECK_GRADIENT_TOL 1.0E-6 + IGNORE_CONVERGENCE_FAILURE MAX_PAO 1 PARAMETERIZATION FOCK PREOPT_DM_FILE H2O_ref_LS_DM_SPIN_1_RESTART.dm diff --git a/tests/QS/regtest-pao-2/H2O_pao_exp_cluster_MD.inp b/tests/QS/regtest-pao-2/H2O_pao_exp_cluster_MD.inp index c05f6b5268..dc12edac44 100644 --- a/tests/QS/regtest-pao-2/H2O_pao_exp_cluster_MD.inp +++ b/tests/QS/regtest-pao-2/H2O_pao_exp_cluster_MD.inp @@ -28,6 +28,7 @@ S_PRECONDITIONER NONE &PAO EPS_PAO 1.0E-6 + IGNORE_CONVERGENCE_FAILURE MAX_PAO 100 PARAMETERIZATION EXP PENALTY_STRENGTH 0.0