mirror of
https://github.com/LCPQ/quantum_package
synced 2024-10-19 22:41:48 +02:00
added frozen_orb_scd
This commit is contained in:
parent
6e6a165610
commit
b2b73671b4
@ -16,21 +16,21 @@ subroutine initialize_mo_coef_begin_iteration
|
||||
mo_coef_begin_iteration = mo_coef
|
||||
end
|
||||
|
||||
subroutine reorder_active_orb
|
||||
subroutine reorder_core_orb
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! routines that takes the current :c:data:`mo_coef` and reorder the active orbitals (see :c:data:`list_act` and :c:data:`n_act_orb`) according to the overlap with :c:data:`mo_coef_begin_iteration`
|
||||
! routines that takes the current :c:data:`mo_coef` and reorder the core orbitals (see :c:data:`list_core` and :c:data:`n_core_orb`) according to the overlap with :c:data:`mo_coef_begin_iteration`
|
||||
END_DOC
|
||||
integer :: i,j,iorb
|
||||
integer :: k,l
|
||||
double precision, allocatable :: accu(:)
|
||||
integer, allocatable :: index_active_orb(:),iorder(:)
|
||||
integer, allocatable :: index_core_orb(:),iorder(:)
|
||||
double precision, allocatable :: mo_coef_tmp(:,:)
|
||||
allocate(accu(mo_num),index_active_orb(n_act_orb),iorder(mo_num))
|
||||
allocate(accu(mo_num),index_core_orb(n_core_orb),iorder(mo_num))
|
||||
allocate(mo_coef_tmp(ao_num,mo_num))
|
||||
|
||||
do i = 1, n_act_orb
|
||||
iorb = list_act(i)
|
||||
do i = 1, n_core_orb
|
||||
iorb = list_core(i)
|
||||
do j = 1, mo_num
|
||||
accu(j) = 0.d0
|
||||
iorder(j) = j
|
||||
@ -42,14 +42,14 @@ subroutine reorder_active_orb
|
||||
accu(j) = -dabs(accu(j))
|
||||
enddo
|
||||
call dsort(accu,iorder,mo_num)
|
||||
index_active_orb(i) = iorder(1)
|
||||
index_core_orb(i) = iorder(1)
|
||||
enddo
|
||||
|
||||
double precision :: x
|
||||
integer :: i1,i2
|
||||
do j = 1, n_act_orb
|
||||
i1 = list_act(j)
|
||||
i2 = index_active_orb(j)
|
||||
do j = 1, n_core_orb
|
||||
i1 = list_core(j)
|
||||
i2 = index_core_orb(j)
|
||||
do i=1,ao_num
|
||||
x = mo_coef(i,i1)
|
||||
mo_coef(i,i1) = mo_coef(i,i2)
|
||||
@ -58,5 +58,5 @@ subroutine reorder_active_orb
|
||||
enddo
|
||||
!call loc_cele_routine
|
||||
|
||||
deallocate(accu,index_active_orb, iorder)
|
||||
deallocate(accu,index_core_orb, iorder)
|
||||
end
|
||||
|
@ -45,9 +45,9 @@ type: double precision
|
||||
doc: Calculated HF energy
|
||||
interface: ezfio
|
||||
|
||||
[no_oa_or_av_opt]
|
||||
[frozen_orb_scf]
|
||||
type: logical
|
||||
doc: If true, leave the active orbitals untouched in the SCF procedure
|
||||
doc: If true, leave untouched all the orbitals defined as core and optimize all the orbitals defined as active with qp_set_mo_class
|
||||
interface: ezfio,provider,ocaml
|
||||
default: False
|
||||
|
||||
|
@ -61,14 +61,14 @@ subroutine damping_SCF
|
||||
write(6,'(I4,1X,F16.10, 1X, F16.10, 1X, F16.10, 3X, A )') &
|
||||
k, E, delta_E, delta_D, save_char
|
||||
|
||||
if(no_oa_or_av_opt)then
|
||||
if(frozen_orb_scf)then
|
||||
call initialize_mo_coef_begin_iteration
|
||||
endif
|
||||
D_alpha = SCF_density_matrix_ao_alpha
|
||||
D_beta = SCF_density_matrix_ao_beta
|
||||
mo_coef = eigenvectors_fock_matrix_mo
|
||||
if(no_oa_or_av_opt)then
|
||||
call reorder_active_orb
|
||||
if(frozen_orb_scf)then
|
||||
call reorder_core_orb
|
||||
call initialize_mo_coef_begin_iteration
|
||||
endif
|
||||
TOUCH mo_coef
|
||||
@ -88,8 +88,8 @@ subroutine damping_SCF
|
||||
SCF_density_matrix_ao_beta = D_beta + lambda * delta_beta
|
||||
TOUCH SCF_density_matrix_ao_alpha SCF_density_matrix_ao_beta
|
||||
mo_coef = eigenvectors_fock_matrix_mo
|
||||
if(no_oa_or_av_opt)then
|
||||
call reorder_active_orb
|
||||
if(frozen_orb_scf)then
|
||||
call reorder_core_orb
|
||||
call initialize_mo_coef_begin_iteration
|
||||
endif
|
||||
TOUCH mo_coef
|
||||
@ -123,8 +123,8 @@ subroutine damping_SCF
|
||||
SCF_density_matrix_ao_beta = D_beta
|
||||
TOUCH SCF_density_matrix_ao_alpha SCF_density_matrix_ao_beta
|
||||
mo_coef = eigenvectors_fock_matrix_mo
|
||||
if(no_oa_or_av_opt)then
|
||||
call reorder_active_orb
|
||||
if(frozen_orb_scf)then
|
||||
call reorder_core_orb
|
||||
call initialize_mo_coef_begin_iteration
|
||||
endif
|
||||
TOUCH mo_coef
|
||||
@ -133,7 +133,7 @@ subroutine damping_SCF
|
||||
write(6,'(A4,1X,A16, 1X, A16, 1X, A16, 1X, A4 )') '====','================','================','================', '===='
|
||||
write(6,*)
|
||||
|
||||
if(.not.no_oa_or_av_opt)then
|
||||
if(.not.frozen_orb_scf)then
|
||||
call mo_as_eigvectors_of_mo_matrix(Fock_matrix_mo,size(Fock_matrix_mo,1),size(Fock_matrix_mo,2),mo_label,1,.true.)
|
||||
endif
|
||||
|
||||
|
@ -19,29 +19,19 @@ BEGIN_PROVIDER [ double precision, eigenvectors_Fock_matrix_mo, (ao_num,mo_num)
|
||||
F(i,j) = Fock_matrix_mo(i,j)
|
||||
enddo
|
||||
enddo
|
||||
if(no_oa_or_av_opt)then
|
||||
|
||||
if(frozen_orb_scf)then
|
||||
integer :: iorb,jorb
|
||||
do i = 1, n_act_orb
|
||||
iorb = list_act(i)
|
||||
do j = 1, n_inact_orb
|
||||
jorb = list_inact(j)
|
||||
F(iorb,jorb) = 0.d0
|
||||
F(jorb,iorb) = 0.d0
|
||||
enddo
|
||||
do j = 1, n_virt_orb
|
||||
jorb = list_virt(j)
|
||||
F(iorb,jorb) = 0.d0
|
||||
F(jorb,iorb) = 0.d0
|
||||
enddo
|
||||
do j = 1, n_core_orb
|
||||
jorb = list_core(j)
|
||||
F(iorb,jorb) = 0.d0
|
||||
F(jorb,iorb) = 0.d0
|
||||
enddo
|
||||
do i = 1, n_core_orb
|
||||
iorb = list_core(i)
|
||||
do j = 1, n_act_orb
|
||||
jorb = list_act(j)
|
||||
F(iorb,jorb) = 0.d0
|
||||
F(jorb,iorb) = 0.d0
|
||||
enddo
|
||||
enddo
|
||||
endif
|
||||
|
||||
|
||||
! Insert level shift here
|
||||
do i = elec_beta_num+1, elec_alpha_num
|
||||
F(i,i) += 0.5d0*level_shift
|
||||
|
@ -78,6 +78,20 @@
|
||||
do i = 1, mo_num
|
||||
Fock_matrix_diag_mo(i) = Fock_matrix_mo(i,i)
|
||||
enddo
|
||||
|
||||
|
||||
if(frozen_orb_scf)then
|
||||
integer :: iorb,jorb
|
||||
do i = 1, n_core_orb
|
||||
iorb = list_core(i)
|
||||
do j = 1, n_act_orb
|
||||
jorb = list_act(j)
|
||||
Fock_matrix_mo(iorb,jorb) = 0.d0
|
||||
Fock_matrix_mo(jorb,iorb) = 0.d0
|
||||
enddo
|
||||
enddo
|
||||
endif
|
||||
|
||||
END_PROVIDER
|
||||
|
||||
|
||||
@ -108,18 +122,23 @@ BEGIN_PROVIDER [ double precision, Fock_matrix_ao, (ao_num, ao_num) ]
|
||||
! Fock matrix in AO basis set
|
||||
END_DOC
|
||||
|
||||
if ( (elec_alpha_num == elec_beta_num).and. &
|
||||
(level_shift == 0.) ) &
|
||||
then
|
||||
integer :: i,j
|
||||
do j=1,ao_num
|
||||
do i=1,ao_num
|
||||
Fock_matrix_ao(i,j) = Fock_matrix_ao_alpha(i,j)
|
||||
enddo
|
||||
enddo
|
||||
else
|
||||
if(frozen_orb_scf)then
|
||||
call mo_to_ao(Fock_matrix_mo,size(Fock_matrix_mo,1), &
|
||||
Fock_matrix_ao,size(Fock_matrix_ao,1))
|
||||
else
|
||||
if ( (elec_alpha_num == elec_beta_num).and. &
|
||||
(level_shift == 0.) ) &
|
||||
then
|
||||
integer :: i,j
|
||||
do j=1,ao_num
|
||||
do i=1,ao_num
|
||||
Fock_matrix_ao(i,j) = Fock_matrix_ao_alpha(i,j)
|
||||
enddo
|
||||
enddo
|
||||
else
|
||||
call mo_to_ao(Fock_matrix_mo,size(Fock_matrix_mo,1), &
|
||||
Fock_matrix_ao,size(Fock_matrix_ao,1))
|
||||
endif
|
||||
endif
|
||||
END_PROVIDER
|
||||
|
||||
|
@ -51,7 +51,7 @@ END_DOC
|
||||
! Increment cycle number
|
||||
|
||||
iteration_SCF += 1
|
||||
if(no_oa_or_av_opt)then
|
||||
if(frozen_orb_scf)then
|
||||
call initialize_mo_coef_begin_iteration
|
||||
endif
|
||||
|
||||
@ -85,8 +85,8 @@ END_DOC
|
||||
endif
|
||||
|
||||
MO_coef = eigenvectors_Fock_matrix_MO
|
||||
if(no_oa_or_av_opt)then
|
||||
call reorder_active_orb
|
||||
if(frozen_orb_scf)then
|
||||
call reorder_core_orb
|
||||
call initialize_mo_coef_begin_iteration
|
||||
endif
|
||||
|
||||
@ -119,8 +119,8 @@ END_DOC
|
||||
level_shift = level_shift * 2.0d0
|
||||
endif
|
||||
mo_coef(1:ao_num,1:mo_num) = eigenvectors_Fock_matrix_MO(1:ao_num,1:mo_num)
|
||||
if(no_oa_or_av_opt)then
|
||||
call reorder_active_orb
|
||||
if(frozen_orb_scf)then
|
||||
call reorder_core_orb
|
||||
call initialize_mo_coef_begin_iteration
|
||||
endif
|
||||
TOUCH mo_coef level_shift
|
||||
@ -159,7 +159,7 @@ END_DOC
|
||||
'====','================','================','================'
|
||||
write(6,*)
|
||||
|
||||
if(.not.no_oa_or_av_opt)then
|
||||
if(.not.frozen_orb_scf)then
|
||||
call mo_as_eigvectors_of_mo_matrix(Fock_matrix_mo,size(Fock_matrix_mo,1),size(Fock_matrix_mo,2),mo_label,1,.true.)
|
||||
call save_mos
|
||||
endif
|
||||
|
Loading…
Reference in New Issue
Block a user