From 783c890dbeb315b1f255e3df1a5006934543cdd0 Mon Sep 17 00:00:00 2001 From: Anthony Scemama Date: Fri, 16 Jun 2017 15:59:23 +0200 Subject: [PATCH] Fixed SCF --- plugins/Hartree_Fock/EZFIO.cfg | 4 ++-- plugins/Hartree_Fock/Roothaan_Hall_SCF.irp.f | 21 ++++++++++---------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/plugins/Hartree_Fock/EZFIO.cfg b/plugins/Hartree_Fock/EZFIO.cfg index 8db83f92..a4b646e1 100644 --- a/plugins/Hartree_Fock/EZFIO.cfg +++ b/plugins/Hartree_Fock/EZFIO.cfg @@ -20,7 +20,7 @@ default: 0. type: Threshold doc: Threshold on the convergence of the Hartree Fock energy. interface: ezfio,provider,ocaml -default: 1.e-12 +default: 1.e-10 [n_it_scf_max] type: Strictly_positive_int @@ -32,7 +32,7 @@ default: 500 type: Positive_float doc: Energy shift on the virtual MOs to improve SCF convergence interface: ezfio,provider,ocaml -default: 0.3 +default: 0.0 [scf_algorithm] type: character*(32) diff --git a/plugins/Hartree_Fock/Roothaan_Hall_SCF.irp.f b/plugins/Hartree_Fock/Roothaan_Hall_SCF.irp.f index 18201c96..9aa66614 100644 --- a/plugins/Hartree_Fock/Roothaan_Hall_SCF.irp.f +++ b/plugins/Hartree_Fock/Roothaan_Hall_SCF.irp.f @@ -13,8 +13,9 @@ END_DOC integer :: iteration_SCF,dim_DIIS,index_dim_DIIS integer :: i,j + double precision, allocatable :: mo_coef_save(:,:) - allocate( & + allocate(mo_coef_save(ao_num,mo_tot_num), & Fock_matrix_DIIS (ao_num,ao_num,max_dim_DIIS), & error_matrix_DIIS(ao_num,ao_num,max_dim_DIIS) & ) @@ -72,9 +73,7 @@ END_DOC Fock_matrix_AO_alpha = Fock_matrix_AO*0.5d0 Fock_matrix_AO_beta = Fock_matrix_AO*0.5d0 level_shift_save = level_shift - if (max_error_DIIS > 0.1d0) then - level_shift += 0.5d0 - endif + level_shift += max_error_DIIS TOUCH Fock_matrix_AO_alpha Fock_matrix_AO_beta level_shift = level_shift_save @@ -97,21 +96,21 @@ END_DOC Fock_matrix_AO_alpha = Fock_matrix_AO*0.5d0 Fock_matrix_AO_beta = Fock_matrix_AO*0.5d0 TOUCH Fock_matrix_AO_alpha Fock_matrix_AO_beta - dim_DIIS = 0 endif double precision :: level_shift_save level_shift_save = level_shift - if (max_error_DIIS > 0.5d0) then - level_shift += 0.5d0 - endif + mo_coef_save(1:ao_num,1:mo_tot_num) = mo_coef(1:ao_num,1:mo_tot_num) do while (Delta_Energy_SCF > 0.d0) + mo_coef(1:ao_num,1:mo_tot_num) = mo_coef_save + TOUCH mo_coef level_shift = level_shift + 0.1d0 - MO_coef = eigenvectors_Fock_matrix_MO - TOUCH MO_coef level_shift + mo_coef(1:ao_num,1:mo_tot_num) = eigenvectors_Fock_matrix_MO(1:ao_num,1:mo_tot_num) + TOUCH mo_coef level_shift Delta_Energy_SCF = HF_energy - energy_SCF_previous energy_SCF = HF_energy - if (level_shift-level_shift_save > 0.5d0) exit + if (level_shift-level_shift_save > 1.d0) exit + dim_DIIS=0 enddo level_shift = level_shift_save SOFT_TOUCH level_shift