1
0
mirror of https://gitlab.com/scemama/qp_plugins_scemama.git synced 2024-12-22 12:23:37 +01:00

added new stopping criterion in CASSCF

This commit is contained in:
Emmanuel Giner 2021-07-21 11:30:05 +02:00
parent 8875d58f03
commit 14f4a79a4b
2 changed files with 44 additions and 15 deletions

View File

@ -45,7 +45,13 @@ default: True
[criterion_casscf]
type: character*(32)
doc: choice of the criterion for the convergence of the casscf: can be energy or gradients
doc: choice of the criterion for the convergence of the casscf: can be energy or gradients or e_pt2
interface: ezfio, provider, ocaml
default: energy
default: e_pt2
[thresh_casscf]
type: Threshold
doc: Threshold on the convergence of the CASCF energy.
interface: ezfio,provider,ocaml
default: 1.e-06

View File

@ -10,13 +10,15 @@ program casscf
SOFT_TOUCH pt2_max
n_det_max_full = 500
touch n_det_max_full
pt2_relative_error = 0.02
touch pt2_relative_error
call run_stochastic_cipsi
call run
end
subroutine run
implicit none
double precision :: energy_old, energy
double precision :: energy_old, energy, pt2_max_before, ept2_before,delta_E
logical :: converged,state_following_casscf_save
integer :: iteration
converged = .False.
@ -27,28 +29,47 @@ subroutine run
state_following_casscf_save = state_following_casscf
state_following_casscf = .True.
touch state_following_casscf
ept2_before = 0.d0
do while (.not.converged)
call run_stochastic_cipsi
energy_old = energy
energy = eone+etwo+ecore
pt2_max_before = pt2_max
call write_time(6)
call write_int(6,iteration,'CAS-SCF iteration = ')
call write_double(6,energy,'CAS-SCF energy = ')
if(n_states == 1)then
double precision :: E_PT2, PT2
call ezfio_get_casscf_energy_pt2(E_PT2)
call ezfio_get_casscf_energy(PT2)
PT2 -= E_PT2
call write_double(6,E_PT2,'E + PT2 energy = ')
call write_double(6,PT2,' PT2 = ')
call write_double(6,pt2_max,' PT2_MAX = ')
endif
print*,''
call write_double(6,norm_grad_vec2,'Norm of gradients = ')
call write_double(6,norm_grad_vec2_tab(1), ' Core-active gradients = ')
call write_double(6,norm_grad_vec2_tab(2), ' Core-virtual gradients = ')
call write_double(6,norm_grad_vec2_tab(3), ' Active-virtual gradients = ')
print*,''
call write_double(6,energy_improvement, 'Predicted energy improvement = ')
if(criterion_casscf == "energy")then
converged = dabs(energy_improvement) < thresh_scf
else if (criterion_casscf == "gradients")then
converged = norm_grad_vec2 < thresh_scf
else
converged = dabs(energy_improvement) < thresh_scf
else if (criterion_casscf == "e_pt2")then
delta_E = dabs(E_PT2 - ept2_before)
converged = dabs(delta_E) < thresh_casscf
endif
pt2_max = dabs(energy_improvement / pt2_relative_error)
ept2_before = E_PT2
pt2_max = dabs(energy_improvement / (pt2_relative_error))
pt2_max = min(pt2_max, pt2_max_before)
print*,''
call write_double(6,pt2_max, 'PT2_MAX for next iteration = ')
mo_coef = NewOrbs
mo_occ = occnum
@ -70,3 +91,5 @@ subroutine run
enddo
end