mirror of
https://github.com/LCPQ/quantum_package
synced 2024-08-25 05:51:46 +02:00
Fixed
This commit is contained in:
parent
485ffb4bef
commit
eed7cc8c14
@ -29,7 +29,7 @@ subroutine diag_inactive_virt_and_update_mos
|
|||||||
|
|
||||||
|
|
||||||
label = "Canonical"
|
label = "Canonical"
|
||||||
call mo_as_eigvectors_of_mo_matrix(tmp,size(tmp,1),size(tmp,2),label,1)
|
call mo_as_eigvectors_of_mo_matrix(tmp,size(tmp,1),size(tmp,2),label,1,.false.)
|
||||||
soft_touch mo_coef
|
soft_touch mo_coef
|
||||||
|
|
||||||
|
|
||||||
@ -76,7 +76,7 @@ subroutine diag_inactive_virt_new_and_update_mos
|
|||||||
|
|
||||||
|
|
||||||
label = "Canonical"
|
label = "Canonical"
|
||||||
call mo_as_eigvectors_of_mo_matrix(tmp,size(tmp,1),size(tmp,2),label,1)
|
call mo_as_eigvectors_of_mo_matrix(tmp,size(tmp,1),size(tmp,2),label,1,.false.)
|
||||||
soft_touch mo_coef
|
soft_touch mo_coef
|
||||||
|
|
||||||
|
|
||||||
|
@ -655,7 +655,7 @@ subroutine new_approach
|
|||||||
integer :: sign
|
integer :: sign
|
||||||
sign = -1
|
sign = -1
|
||||||
|
|
||||||
call mo_as_eigvectors_of_mo_matrix(one_body_dm_mo,size(one_body_dm_mo,1),size(one_body_dm_mo,2),label,sign)
|
call mo_as_eigvectors_of_mo_matrix(one_body_dm_mo,size(one_body_dm_mo,1),size(one_body_dm_mo,2),label,sign,.true.)
|
||||||
soft_touch mo_coef
|
soft_touch mo_coef
|
||||||
call save_mos
|
call save_mos
|
||||||
|
|
||||||
|
@ -449,7 +449,7 @@ subroutine save_osoci_natural_mos
|
|||||||
|
|
||||||
label = "Natural"
|
label = "Natural"
|
||||||
|
|
||||||
call mo_as_eigvectors_of_mo_matrix(tmp,size(tmp,1),size(tmp,2),label,1)
|
call mo_as_eigvectors_of_mo_matrix(tmp,size(tmp,1),size(tmp,2),label,1,.true.)
|
||||||
!if(disk_access_ao_integrals == "None" .or. disk_access_ao_integrals == "Write" )then
|
!if(disk_access_ao_integrals == "None" .or. disk_access_ao_integrals == "Write" )then
|
||||||
! disk_access_ao_integrals = "Read"
|
! disk_access_ao_integrals = "Read"
|
||||||
! touch disk_access_ao_integrals
|
! touch disk_access_ao_integrals
|
||||||
@ -584,7 +584,7 @@ subroutine set_osoci_natural_mos
|
|||||||
enddo
|
enddo
|
||||||
|
|
||||||
label = "Natural"
|
label = "Natural"
|
||||||
call mo_as_eigvectors_of_mo_matrix(tmp,size(tmp,1),size(tmp,2),label,1)
|
call mo_as_eigvectors_of_mo_matrix(tmp,size(tmp,1),size(tmp,2),label,1,.true.)
|
||||||
soft_touch mo_coef
|
soft_touch mo_coef
|
||||||
deallocate(tmp,occ)
|
deallocate(tmp,occ)
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ END_PROVIDER
|
|||||||
|
|
||||||
do i=1,AO_num
|
do i=1,AO_num
|
||||||
do j=1,AO_num
|
do j=1,AO_num
|
||||||
Xt(i,j) = X_Matrix_AO(j,i)
|
Xt(i,j) = S_half_inv(j,i)
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
@ -103,7 +103,7 @@ END_PROVIDER
|
|||||||
call dgemm('N','N',AO_num,AO_num,AO_num, &
|
call dgemm('N','N',AO_num,AO_num,AO_num, &
|
||||||
1.d0, &
|
1.d0, &
|
||||||
Fock_matrix_AO,size(Fock_matrix_AO,1), &
|
Fock_matrix_AO,size(Fock_matrix_AO,1), &
|
||||||
X_Matrix_AO,size(X_Matrix_AO,1), &
|
S_half_inv,size(S_half_inv,1), &
|
||||||
0.d0, &
|
0.d0, &
|
||||||
eigenvectors_Fock_matrix_AO,size(eigenvectors_Fock_matrix_AO,1))
|
eigenvectors_Fock_matrix_AO,size(eigenvectors_Fock_matrix_AO,1))
|
||||||
|
|
||||||
@ -130,67 +130,10 @@ END_PROVIDER
|
|||||||
|
|
||||||
call dgemm('N','N',AO_num,AO_num,AO_num, &
|
call dgemm('N','N',AO_num,AO_num,AO_num, &
|
||||||
1.d0, &
|
1.d0, &
|
||||||
X_matrix_AO,size(X_matrix_AO,1), &
|
S_half_inv,size(S_half_inv,1), &
|
||||||
scratch,size(scratch,1), &
|
scratch,size(scratch,1), &
|
||||||
0.d0, &
|
0.d0, &
|
||||||
eigenvectors_Fock_matrix_AO,size(eigenvectors_Fock_matrix_AO,1))
|
eigenvectors_Fock_matrix_AO,size(eigenvectors_Fock_matrix_AO,1))
|
||||||
|
|
||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
BEGIN_PROVIDER [ double precision, X_matrix_AO, (AO_num,AO_num) ]
|
|
||||||
|
|
||||||
BEGIN_DOC
|
|
||||||
! Matrix X = S^{-1/2} obtained by SVD
|
|
||||||
END_DOC
|
|
||||||
|
|
||||||
implicit none
|
|
||||||
|
|
||||||
integer :: num_linear_dependencies
|
|
||||||
integer :: LDA, LDC
|
|
||||||
double precision, allocatable :: U(:,:),Vt(:,:), D(:)
|
|
||||||
integer :: info, i, j, k
|
|
||||||
|
|
||||||
LDA = size(AO_overlap,1)
|
|
||||||
LDC = size(X_matrix_AO,1)
|
|
||||||
|
|
||||||
allocate( &
|
|
||||||
U(LDC,AO_num), &
|
|
||||||
Vt(LDA,AO_num), &
|
|
||||||
D(AO_num))
|
|
||||||
|
|
||||||
call svd( &
|
|
||||||
AO_overlap,LDA, &
|
|
||||||
U,LDC, &
|
|
||||||
D, &
|
|
||||||
Vt,LDA, &
|
|
||||||
AO_num,AO_num)
|
|
||||||
|
|
||||||
num_linear_dependencies = 0
|
|
||||||
do i=1,AO_num
|
|
||||||
print*,D(i)
|
|
||||||
if(abs(D(i)) <= threshold_overlap_AO_eigenvalues) then
|
|
||||||
D(i) = 0.d0
|
|
||||||
num_linear_dependencies += 1
|
|
||||||
else
|
|
||||||
ASSERT (D(i) > 0.d0)
|
|
||||||
D(i) = 1.d0/sqrt(D(i))
|
|
||||||
endif
|
|
||||||
do j=1,AO_num
|
|
||||||
X_matrix_AO(j,i) = 0.d0
|
|
||||||
enddo
|
|
||||||
enddo
|
|
||||||
write(*,*) 'linear dependencies',num_linear_dependencies
|
|
||||||
! stop
|
|
||||||
|
|
||||||
do k=1,AO_num
|
|
||||||
if(D(k) /= 0.d0) then
|
|
||||||
do j=1,AO_num
|
|
||||||
do i=1,AO_num
|
|
||||||
X_matrix_AO(i,j) = X_matrix_AO(i,j) + U(i,k)*D(k)*Vt(k,j)
|
|
||||||
enddo
|
|
||||||
enddo
|
|
||||||
endif
|
|
||||||
enddo
|
|
||||||
|
|
||||||
|
|
||||||
END_PROVIDER
|
|
||||||
|
@ -263,17 +263,8 @@ BEGIN_PROVIDER [ double precision, Fock_matrix_mo_alpha, (mo_tot_num,mo_tot_num)
|
|||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! Fock matrix on the MO basis
|
! Fock matrix on the MO basis
|
||||||
END_DOC
|
END_DOC
|
||||||
double precision, allocatable :: T(:,:)
|
call ao_to_mo(Fock_matrix_ao_alpha,size(Fock_matrix_ao_alpha,1), &
|
||||||
allocate ( T(ao_num,mo_tot_num) )
|
Fock_matrix_mo_alpha,size(Fock_matrix_mo_alpha,1))
|
||||||
call dgemm('N','N', ao_num, mo_tot_num, ao_num, &
|
|
||||||
1.d0, Fock_matrix_ao_alpha,size(Fock_matrix_ao_alpha,1), &
|
|
||||||
mo_coef, size(mo_coef,1), &
|
|
||||||
0.d0, T, size(T,1))
|
|
||||||
call dgemm('T','N', mo_tot_num, mo_tot_num, ao_num, &
|
|
||||||
1.d0, mo_coef,size(mo_coef,1), &
|
|
||||||
T, size(T,1), &
|
|
||||||
0.d0, Fock_matrix_mo_alpha, size(Fock_matrix_mo_alpha,1))
|
|
||||||
deallocate(T)
|
|
||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
|
|
||||||
@ -282,17 +273,8 @@ BEGIN_PROVIDER [ double precision, Fock_matrix_mo_beta, (mo_tot_num,mo_tot_num)
|
|||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! Fock matrix on the MO basis
|
! Fock matrix on the MO basis
|
||||||
END_DOC
|
END_DOC
|
||||||
double precision, allocatable :: T(:,:)
|
call ao_to_mo(Fock_matrix_ao_beta,size(Fock_matrix_ao_beta,1), &
|
||||||
allocate ( T(ao_num,mo_tot_num) )
|
Fock_matrix_mo_beta,size(Fock_matrix_mo_beta,1))
|
||||||
call dgemm('N','N', ao_num, mo_tot_num, ao_num, &
|
|
||||||
1.d0, Fock_matrix_ao_beta,size(Fock_matrix_ao_beta,1), &
|
|
||||||
mo_coef, size(mo_coef,1), &
|
|
||||||
0.d0, T, size(T,1))
|
|
||||||
call dgemm('T','N', mo_tot_num, mo_tot_num, ao_num, &
|
|
||||||
1.d0, mo_coef,size(mo_coef,1), &
|
|
||||||
T, size(T,1), &
|
|
||||||
0.d0, Fock_matrix_mo_beta, size(Fock_matrix_mo_beta,1))
|
|
||||||
deallocate(T)
|
|
||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
BEGIN_PROVIDER [ double precision, HF_energy ]
|
BEGIN_PROVIDER [ double precision, HF_energy ]
|
||||||
@ -330,97 +312,9 @@ BEGIN_PROVIDER [ double precision, Fock_matrix_ao, (ao_num, ao_num) ]
|
|||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
else
|
else
|
||||||
double precision, allocatable :: T(:,:), M(:,:)
|
call mo_to_ao(Fock_matrix_mo,size(Fock_matrix_mo,1), &
|
||||||
integer :: ierr
|
Fock_matrix_ao,size(Fock_matrix_ao,1))
|
||||||
! F_ao = S C F_mo C^t S
|
|
||||||
allocate (T(ao_num,ao_num),M(ao_num,ao_num),stat=ierr)
|
|
||||||
if (ierr /=0 ) then
|
|
||||||
print *, irp_here, ' : allocation failed'
|
|
||||||
endif
|
|
||||||
|
|
||||||
! ao_overlap (ao_num,ao_num) . mo_coef (ao_num,mo_tot_num)
|
|
||||||
! -> M(ao_num,mo_tot_num)
|
|
||||||
call dgemm('N','N', ao_num,mo_tot_num,ao_num, 1.d0, &
|
|
||||||
ao_overlap, size(ao_overlap,1), &
|
|
||||||
mo_coef, size(mo_coef,1), &
|
|
||||||
0.d0, &
|
|
||||||
M, size(M,1))
|
|
||||||
|
|
||||||
! M(ao_num,mo_tot_num) . Fock_matrix_mo (mo_tot_num,mo_tot_num)
|
|
||||||
! -> T(ao_num,mo_tot_num)
|
|
||||||
call dgemm('N','N', ao_num,mo_tot_num,mo_tot_num, 1.d0, &
|
|
||||||
M, size(M,1), &
|
|
||||||
Fock_matrix_mo, size(Fock_matrix_mo,1), &
|
|
||||||
0.d0, &
|
|
||||||
T, size(T,1))
|
|
||||||
|
|
||||||
! T(ao_num,mo_tot_num) . mo_coef^T (mo_tot_num,ao_num)
|
|
||||||
! -> M(ao_num,ao_num)
|
|
||||||
call dgemm('N','T', ao_num,ao_num,mo_tot_num, 1.d0, &
|
|
||||||
T, size(T,1), &
|
|
||||||
mo_coef, size(mo_coef,1), &
|
|
||||||
0.d0, &
|
|
||||||
M, size(M,1))
|
|
||||||
|
|
||||||
! M(ao_num,ao_num) . ao_overlap (ao_num,ao_num)
|
|
||||||
! -> Fock_matrix_ao(ao_num,ao_num)
|
|
||||||
call dgemm('N','N', ao_num,ao_num,ao_num, 1.d0, &
|
|
||||||
M, size(M,1), &
|
|
||||||
ao_overlap, size(ao_overlap,1), &
|
|
||||||
0.d0, &
|
|
||||||
Fock_matrix_ao, size(Fock_matrix_ao,1))
|
|
||||||
|
|
||||||
|
|
||||||
deallocate(T)
|
|
||||||
endif
|
endif
|
||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
subroutine Fock_mo_to_ao(FMO,LDFMO,FAO,LDFAO)
|
|
||||||
implicit none
|
|
||||||
integer, intent(in) :: LDFMO ! size(FMO,1)
|
|
||||||
integer, intent(in) :: LDFAO ! size(FAO,1)
|
|
||||||
double precision, intent(in) :: FMO(LDFMO,*)
|
|
||||||
double precision, intent(out) :: FAO(LDFAO,*)
|
|
||||||
|
|
||||||
double precision, allocatable :: T(:,:), M(:,:)
|
|
||||||
integer :: ierr
|
|
||||||
! F_ao = S C F_mo C^t S
|
|
||||||
allocate (T(ao_num,ao_num),M(ao_num,ao_num),stat=ierr)
|
|
||||||
if (ierr /=0 ) then
|
|
||||||
print *, irp_here, ' : allocation failed'
|
|
||||||
endif
|
|
||||||
|
|
||||||
! ao_overlap (ao_num,ao_num) . mo_coef (ao_num,mo_tot_num)
|
|
||||||
! -> M(ao_num,mo_tot_num)
|
|
||||||
call dgemm('N','N', ao_num,mo_tot_num,ao_num, 1.d0, &
|
|
||||||
ao_overlap, size(ao_overlap,1), &
|
|
||||||
mo_coef, size(mo_coef,1), &
|
|
||||||
0.d0, &
|
|
||||||
M, size(M,1))
|
|
||||||
|
|
||||||
! M(ao_num,mo_tot_num) . FMO (mo_tot_num,mo_tot_num)
|
|
||||||
! -> T(ao_num,mo_tot_num)
|
|
||||||
call dgemm('N','N', ao_num,mo_tot_num,mo_tot_num, 1.d0, &
|
|
||||||
M, size(M,1), &
|
|
||||||
FMO, size(FMO,1), &
|
|
||||||
0.d0, &
|
|
||||||
T, size(T,1))
|
|
||||||
|
|
||||||
! T(ao_num,mo_tot_num) . mo_coef^T (mo_tot_num,ao_num)
|
|
||||||
! -> M(ao_num,ao_num)
|
|
||||||
call dgemm('N','T', ao_num,ao_num,mo_tot_num, 1.d0, &
|
|
||||||
T, size(T,1), &
|
|
||||||
mo_coef, size(mo_coef,1), &
|
|
||||||
0.d0, &
|
|
||||||
M, size(M,1))
|
|
||||||
|
|
||||||
! M(ao_num,ao_num) . ao_overlap (ao_num,ao_num)
|
|
||||||
! -> Fock_matrix_ao(ao_num,ao_num)
|
|
||||||
call dgemm('N','N', ao_num,ao_num,ao_num, 1.d0, &
|
|
||||||
M, size(M,1), &
|
|
||||||
ao_overlap, size(ao_overlap,1), &
|
|
||||||
0.d0, &
|
|
||||||
FAO, size(FAO,1))
|
|
||||||
deallocate(T,M)
|
|
||||||
end
|
|
||||||
|
|
||||||
|
@ -83,7 +83,6 @@ END_DOC
|
|||||||
! Calculate error vectors
|
! Calculate error vectors
|
||||||
|
|
||||||
max_error_DIIS = maxval(Abs(FPS_SPF_Matrix_MO))
|
max_error_DIIS = maxval(Abs(FPS_SPF_Matrix_MO))
|
||||||
! max_error_DIIS = maxval(Abs(FPS_SPF_Matrix_AO))
|
|
||||||
|
|
||||||
! SCF energy
|
! SCF energy
|
||||||
|
|
||||||
@ -134,7 +133,7 @@ END_DOC
|
|||||||
write(output_hartree_fock,*)
|
write(output_hartree_fock,*)
|
||||||
|
|
||||||
if(.not.no_oa_or_av_opt)then
|
if(.not.no_oa_or_av_opt)then
|
||||||
call mo_as_eigvectors_of_mo_matrix(Fock_matrix_mo,size(Fock_matrix_mo,1),size(Fock_matrix_mo,2),mo_label,1)
|
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
|
endif
|
||||||
|
|
||||||
call write_double(output_hartree_fock, Energy_SCF, 'Hartree-Fock energy')
|
call write_double(output_hartree_fock, Energy_SCF, 'Hartree-Fock energy')
|
||||||
|
@ -23,7 +23,7 @@ subroutine create_guess
|
|||||||
mo_coef = ao_ortho_lowdin_coef
|
mo_coef = ao_ortho_lowdin_coef
|
||||||
TOUCH mo_coef
|
TOUCH mo_coef
|
||||||
mo_label = 'Guess'
|
mo_label = 'Guess'
|
||||||
call mo_as_eigvectors_of_mo_matrix(mo_mono_elec_integral,size(mo_mono_elec_integral,1),size(mo_mono_elec_integral,2),mo_label)
|
call mo_as_eigvectors_of_mo_matrix(mo_mono_elec_integral,size(mo_mono_elec_integral,1),size(mo_mono_elec_integral,2),mo_label,.false.)
|
||||||
SOFT_TOUCH mo_coef mo_label
|
SOFT_TOUCH mo_coef mo_label
|
||||||
else if (mo_guess_type == "Huckel") then
|
else if (mo_guess_type == "Huckel") then
|
||||||
call huckel_guess
|
call huckel_guess
|
||||||
|
@ -119,7 +119,7 @@ subroutine damping_SCF
|
|||||||
write(output_hartree_fock,*)
|
write(output_hartree_fock,*)
|
||||||
|
|
||||||
if(.not.no_oa_or_av_opt)then
|
if(.not.no_oa_or_av_opt)then
|
||||||
call mo_as_eigvectors_of_mo_matrix(Fock_matrix_mo,size(Fock_matrix_mo,1),size(Fock_matrix_mo,2),mo_label,1)
|
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
|
endif
|
||||||
|
|
||||||
call write_double(output_hartree_fock, E_min, 'Hartree-Fock energy')
|
call write_double(output_hartree_fock, E_min, 'Hartree-Fock energy')
|
||||||
|
@ -11,21 +11,24 @@ subroutine huckel_guess
|
|||||||
label = "Guess"
|
label = "Guess"
|
||||||
call mo_as_eigvectors_of_mo_matrix(mo_mono_elec_integral, &
|
call mo_as_eigvectors_of_mo_matrix(mo_mono_elec_integral, &
|
||||||
size(mo_mono_elec_integral,1), &
|
size(mo_mono_elec_integral,1), &
|
||||||
size(mo_mono_elec_integral,2),label,1)
|
size(mo_mono_elec_integral,2),label,1,.false.)
|
||||||
TOUCH mo_coef
|
TOUCH mo_coef
|
||||||
|
|
||||||
c = 0.5d0 * 1.75d0
|
c = 0.5d0 * 1.75d0
|
||||||
|
|
||||||
do j=1,ao_num
|
do j=1,ao_num
|
||||||
do i=1,ao_num
|
do i=1,ao_num
|
||||||
Fock_matrix_ao(i,j) = c*ao_overlap(i,j)*(ao_mono_elec_integral_diag(i) + &
|
Fock_matrix_ao_alpha(i,j) = c*ao_overlap(i,j)*(ao_mono_elec_integral_diag(i) + &
|
||||||
ao_mono_elec_integral_diag(j))
|
ao_mono_elec_integral_diag(j))
|
||||||
|
Fock_matrix_ao_beta (i,j) = Fock_matrix_ao_alpha(i,j)
|
||||||
enddo
|
enddo
|
||||||
Fock_matrix_ao(j,j) = Fock_matrix_ao_alpha(j,j)
|
Fock_matrix_ao_alpha(j,j) = ao_mono_elec_integral(j,j) + ao_bi_elec_integral_alpha(j,j)
|
||||||
|
Fock_matrix_ao_beta (j,j) = Fock_matrix_ao_alpha(j,j)
|
||||||
enddo
|
enddo
|
||||||
TOUCH Fock_matrix_ao
|
TOUCH Fock_matrix_ao_alpha Fock_matrix_ao_beta
|
||||||
mo_coef = eigenvectors_fock_matrix_mo
|
mo_coef = eigenvectors_fock_matrix_mo
|
||||||
SOFT_TOUCH mo_coef
|
SOFT_TOUCH mo_coef
|
||||||
call save_mos
|
call save_mos
|
||||||
|
print *, 'E=', HF_energy
|
||||||
|
|
||||||
end
|
end
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
BEGIN_PROVIDER [ double precision, ao_overlap,(ao_num,ao_num) ]
|
BEGIN_PROVIDER [ double precision, ao_overlap,(ao_num_align,ao_num) ]
|
||||||
&BEGIN_PROVIDER [ double precision, ao_overlap_x,(ao_num,ao_num) ]
|
&BEGIN_PROVIDER [ double precision, ao_overlap_x,(ao_num_align,ao_num) ]
|
||||||
&BEGIN_PROVIDER [ double precision, ao_overlap_y,(ao_num,ao_num) ]
|
&BEGIN_PROVIDER [ double precision, ao_overlap_y,(ao_num_align,ao_num) ]
|
||||||
&BEGIN_PROVIDER [ double precision, ao_overlap_z,(ao_num,ao_num) ]
|
&BEGIN_PROVIDER [ double precision, ao_overlap_z,(ao_num_align,ao_num) ]
|
||||||
implicit none
|
implicit none
|
||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! Overlap between atomic basis functions:
|
! Overlap between atomic basis functions:
|
||||||
@ -69,7 +69,7 @@
|
|||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
|
|
||||||
BEGIN_PROVIDER [ double precision, ao_overlap_abs,(ao_num,ao_num) ]
|
BEGIN_PROVIDER [ double precision, ao_overlap_abs,(ao_num_align,ao_num) ]
|
||||||
implicit none
|
implicit none
|
||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! Overlap between absolute value of atomic basis functions:
|
! Overlap between absolute value of atomic basis functions:
|
||||||
@ -123,11 +123,68 @@ BEGIN_PROVIDER [ double precision, ao_overlap_abs,(ao_num,ao_num) ]
|
|||||||
!$OMP END PARALLEL DO
|
!$OMP END PARALLEL DO
|
||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
BEGIN_PROVIDER [ double precision, ao_overlap_inv,(ao_num,ao_num) ]
|
BEGIN_PROVIDER [ double precision, S_inv,(ao_num,ao_num) ]
|
||||||
implicit none
|
implicit none
|
||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! S^-1
|
! S^-1
|
||||||
END_DOC
|
END_DOC
|
||||||
call get_pseudo_inverse(ao_overlap,size(ao_overlap,1),ao_num,ao_num,ao_overlap_inv,size(ao_overlap_inv,1))
|
call get_pseudo_inverse(ao_overlap,size(ao_overlap,1),ao_num,ao_num,S_inv,size(S_inv,1))
|
||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
|
BEGIN_PROVIDER [ double precision, S_half_inv, (AO_num,AO_num) ]
|
||||||
|
|
||||||
|
BEGIN_DOC
|
||||||
|
! Matrix X = S^{-1/2} obtained by SVD
|
||||||
|
END_DOC
|
||||||
|
|
||||||
|
implicit none
|
||||||
|
|
||||||
|
integer :: num_linear_dependencies
|
||||||
|
integer :: LDA, LDC
|
||||||
|
double precision, allocatable :: U(:,:),Vt(:,:), D(:)
|
||||||
|
integer :: info, i, j, k
|
||||||
|
|
||||||
|
LDA = size(AO_overlap,1)
|
||||||
|
LDC = size(S_half_inv,1)
|
||||||
|
|
||||||
|
allocate( &
|
||||||
|
U(LDC,AO_num), &
|
||||||
|
Vt(LDA,AO_num), &
|
||||||
|
D(AO_num))
|
||||||
|
|
||||||
|
call svd( &
|
||||||
|
AO_overlap,LDA, &
|
||||||
|
U,LDC, &
|
||||||
|
D, &
|
||||||
|
Vt,LDA, &
|
||||||
|
AO_num,AO_num)
|
||||||
|
|
||||||
|
num_linear_dependencies = 0
|
||||||
|
do i=1,AO_num
|
||||||
|
print*,D(i)
|
||||||
|
if(abs(D(i)) <= threshold_overlap_AO_eigenvalues) then
|
||||||
|
D(i) = 0.d0
|
||||||
|
num_linear_dependencies += 1
|
||||||
|
else
|
||||||
|
ASSERT (D(i) > 0.d0)
|
||||||
|
D(i) = 1.d0/sqrt(D(i))
|
||||||
|
endif
|
||||||
|
do j=1,AO_num
|
||||||
|
S_half_inv(j,i) = 0.d0
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
write(*,*) 'linear dependencies',num_linear_dependencies
|
||||||
|
! stop
|
||||||
|
|
||||||
|
do k=1,AO_num
|
||||||
|
if(D(k) /= 0.d0) then
|
||||||
|
do j=1,AO_num
|
||||||
|
do i=1,AO_num
|
||||||
|
S_half_inv(i,j) = S_half_inv(i,j) + U(i,k)*D(k)*Vt(k,j)
|
||||||
|
enddo
|
||||||
|
enddo
|
||||||
|
endif
|
||||||
|
enddo
|
||||||
|
|
||||||
|
|
||||||
|
END_PROVIDER
|
||||||
|
@ -337,8 +337,8 @@ end
|
|||||||
END_DOC
|
END_DOC
|
||||||
mo_integrals_cache_min_8 = max(1_8,elec_alpha_num - 63_8)
|
mo_integrals_cache_min_8 = max(1_8,elec_alpha_num - 63_8)
|
||||||
mo_integrals_cache_max_8 = min(int(mo_tot_num,8),mo_integrals_cache_min+127_8)
|
mo_integrals_cache_max_8 = min(int(mo_tot_num,8),mo_integrals_cache_min+127_8)
|
||||||
mo_integrals_cache_min = mo_integrals_cache_min_8
|
mo_integrals_cache_min = max(1,elec_alpha_num - 63)
|
||||||
mo_integrals_cache_max = mo_integrals_cache_max_8
|
mo_integrals_cache_max = min(mo_tot_num,mo_integrals_cache_min+127)
|
||||||
|
|
||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
@ -349,17 +349,22 @@ BEGIN_PROVIDER [ double precision, mo_integrals_cache, (0_8:128_8*128_8*128_8*12
|
|||||||
END_DOC
|
END_DOC
|
||||||
PROVIDE mo_bielec_integrals_in_map
|
PROVIDE mo_bielec_integrals_in_map
|
||||||
integer*8 :: i,j,k,l
|
integer*8 :: i,j,k,l
|
||||||
|
integer*8 :: i4,j4,k4,l4
|
||||||
integer*8 :: ii
|
integer*8 :: ii
|
||||||
integer(key_kind) :: idx
|
integer(key_kind) :: idx
|
||||||
real(integral_kind) :: integral
|
real(integral_kind) :: integral
|
||||||
FREE ao_integrals_cache
|
FREE ao_integrals_cache
|
||||||
!$OMP PARALLEL DO PRIVATE (i,j,k,l,idx,ii,integral)
|
!$OMP PARALLEL DO PRIVATE (i,j,k,l,i4,j4,k4,l4,idx,ii,integral)
|
||||||
do l=mo_integrals_cache_min_8,mo_integrals_cache_max_8
|
do l=mo_integrals_cache_min_8,mo_integrals_cache_max_8
|
||||||
do k=mo_integrals_cache_min_8,mo_integrals_cache_max_8
|
do k=mo_integrals_cache_min_8,mo_integrals_cache_max_8
|
||||||
do j=mo_integrals_cache_min_8,mo_integrals_cache_max_8
|
do j=mo_integrals_cache_min_8,mo_integrals_cache_max_8
|
||||||
do i=mo_integrals_cache_min_8,mo_integrals_cache_max_8
|
do i=mo_integrals_cache_min_8,mo_integrals_cache_max_8
|
||||||
|
i4 = int(i,4)
|
||||||
|
j4 = int(j,4)
|
||||||
|
k4 = int(k,4)
|
||||||
|
l4 = int(l,4)
|
||||||
!DIR$ FORCEINLINE
|
!DIR$ FORCEINLINE
|
||||||
call bielec_integrals_index(i,j,k,l,idx)
|
call bielec_integrals_index(i4,j4,k4,l4,idx)
|
||||||
!DIR$ FORCEINLINE
|
!DIR$ FORCEINLINE
|
||||||
call map_get(mo_integrals_map,idx,integral)
|
call map_get(mo_integrals_map,idx,integral)
|
||||||
ii = l-mo_integrals_cache_min_8
|
ii = l-mo_integrals_cache_min_8
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
BEGIN_PROVIDER [ double precision, ao_mono_elec_integral,(ao_num,ao_num)]
|
BEGIN_PROVIDER [ double precision, ao_mono_elec_integral,(ao_num_align,ao_num)]
|
||||||
&BEGIN_PROVIDER [ double precision, ao_mono_elec_integral_diag,(ao_num)]
|
&BEGIN_PROVIDER [ double precision, ao_mono_elec_integral_diag,(ao_num)]
|
||||||
implicit none
|
implicit none
|
||||||
integer :: i,j,n,l
|
integer :: i,j,n,l
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
BEGIN_PROVIDER [ double precision, ao_deriv2_x,(ao_num,ao_num) ]
|
BEGIN_PROVIDER [ double precision, ao_deriv2_x,(ao_num_align,ao_num) ]
|
||||||
&BEGIN_PROVIDER [ double precision, ao_deriv2_y,(ao_num,ao_num) ]
|
&BEGIN_PROVIDER [ double precision, ao_deriv2_y,(ao_num_align,ao_num) ]
|
||||||
&BEGIN_PROVIDER [ double precision, ao_deriv2_z,(ao_num,ao_num) ]
|
&BEGIN_PROVIDER [ double precision, ao_deriv2_z,(ao_num_align,ao_num) ]
|
||||||
implicit none
|
implicit none
|
||||||
integer :: i,j,n,l
|
integer :: i,j,n,l
|
||||||
double precision :: f
|
double precision :: f
|
||||||
@ -119,7 +119,7 @@
|
|||||||
|
|
||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
BEGIN_PROVIDER [double precision, ao_kinetic_integral, (ao_num,ao_num)]
|
BEGIN_PROVIDER [double precision, ao_kinetic_integral, (ao_num_align,ao_num)]
|
||||||
implicit none
|
implicit none
|
||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! array of the priminitve basis kinetic integrals
|
! array of the priminitve basis kinetic integrals
|
||||||
@ -134,11 +134,14 @@ BEGIN_PROVIDER [double precision, ao_kinetic_integral, (ao_num,ao_num)]
|
|||||||
else
|
else
|
||||||
!$OMP PARALLEL DO DEFAULT(NONE) &
|
!$OMP PARALLEL DO DEFAULT(NONE) &
|
||||||
!$OMP PRIVATE(i,j) &
|
!$OMP PRIVATE(i,j) &
|
||||||
!$OMP SHARED(ao_num, ao_kinetic_integral,ao_deriv2_x,ao_deriv2_y,ao_deriv2_z)
|
!$OMP SHARED(ao_num, ao_num_align, ao_kinetic_integral,ao_deriv2_x,ao_deriv2_y,ao_deriv2_z)
|
||||||
do j = 1, ao_num
|
do j = 1, ao_num
|
||||||
do i = 1, ao_num
|
do i = 1, ao_num
|
||||||
ao_kinetic_integral(i,j) = -0.5d0 * (ao_deriv2_x(i,j) + ao_deriv2_y(i,j) + ao_deriv2_z(i,j) )
|
ao_kinetic_integral(i,j) = -0.5d0 * (ao_deriv2_x(i,j) + ao_deriv2_y(i,j) + ao_deriv2_z(i,j) )
|
||||||
enddo
|
enddo
|
||||||
|
do i = ao_num +1,ao_num_align
|
||||||
|
ao_kinetic_integral(i,j) = 0.d0
|
||||||
|
enddo
|
||||||
enddo
|
enddo
|
||||||
!$OMP END PARALLEL DO
|
!$OMP END PARALLEL DO
|
||||||
endif
|
endif
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
BEGIN_PROVIDER [double precision, mo_kinetic_integral, (mo_tot_num,mo_tot_num)]
|
BEGIN_PROVIDER [double precision, mo_kinetic_integral, (mo_tot_num_align,mo_tot_num)]
|
||||||
implicit none
|
implicit none
|
||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! Kinetic energy integrals in the MO basis
|
! Kinetic energy integrals in the MO basis
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
BEGIN_PROVIDER [ double precision, mo_mono_elec_integral,(mo_tot_num,mo_tot_num)]
|
BEGIN_PROVIDER [ double precision, mo_mono_elec_integral,(mo_tot_num_align,mo_tot_num)]
|
||||||
implicit none
|
implicit none
|
||||||
integer :: i,j,n,l
|
integer :: i,j,n,l
|
||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
BEGIN_PROVIDER [ double precision, ao_nucl_elec_integral, (ao_num,ao_num)]
|
BEGIN_PROVIDER [ double precision, ao_nucl_elec_integral, (ao_num_align,ao_num)]
|
||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! interaction nuclear electron
|
! interaction nuclear electron
|
||||||
END_DOC
|
END_DOC
|
||||||
@ -80,7 +80,7 @@ BEGIN_PROVIDER [ double precision, ao_nucl_elec_integral, (ao_num,ao_num)]
|
|||||||
|
|
||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
BEGIN_PROVIDER [ double precision, ao_nucl_elec_integral_per_atom, (ao_num,ao_num,nucl_num)]
|
BEGIN_PROVIDER [ double precision, ao_nucl_elec_integral_per_atom, (ao_num_align,ao_num,nucl_num)]
|
||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! ao_nucl_elec_integral_per_atom(i,j,k) = -<AO(i)|1/|r-Rk|AO(j)>
|
! ao_nucl_elec_integral_per_atom(i,j,k) = -<AO(i)|1/|r-Rk|AO(j)>
|
||||||
! where Rk is the geometry of the kth atom
|
! where Rk is the geometry of the kth atom
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
BEGIN_PROVIDER [ double precision, ao_pseudo_integral, (ao_num,ao_num)]
|
BEGIN_PROVIDER [ double precision, ao_pseudo_integral, (ao_num_align,ao_num)]
|
||||||
implicit none
|
implicit none
|
||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! Pseudo-potential integrals
|
! Pseudo-potential integrals
|
||||||
@ -29,7 +29,7 @@ BEGIN_PROVIDER [ double precision, ao_pseudo_integral, (ao_num,ao_num)]
|
|||||||
|
|
||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
BEGIN_PROVIDER [ double precision, ao_pseudo_integral_local, (ao_num,ao_num)]
|
BEGIN_PROVIDER [ double precision, ao_pseudo_integral_local, (ao_num_align,ao_num)]
|
||||||
implicit none
|
implicit none
|
||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! Local pseudo-potential
|
! Local pseudo-potential
|
||||||
@ -128,7 +128,7 @@ BEGIN_PROVIDER [ double precision, ao_pseudo_integral_local, (ao_num,ao_num)]
|
|||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
|
|
||||||
BEGIN_PROVIDER [ double precision, ao_pseudo_integral_non_local, (ao_num,ao_num)]
|
BEGIN_PROVIDER [ double precision, ao_pseudo_integral_non_local, (ao_num_align,ao_num)]
|
||||||
implicit none
|
implicit none
|
||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! Local pseudo-potential
|
! Local pseudo-potential
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
BEGIN_PROVIDER [double precision, mo_nucl_elec_integral, (mo_tot_num,mo_tot_num)]
|
BEGIN_PROVIDER [double precision, mo_nucl_elec_integral, (mo_tot_num_align,mo_tot_num)]
|
||||||
implicit none
|
implicit none
|
||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! interaction nuclear electron on the MO basis
|
! interaction nuclear electron on the MO basis
|
||||||
@ -25,7 +25,7 @@ BEGIN_PROVIDER [double precision, mo_nucl_elec_integral, (mo_tot_num,mo_tot_num)
|
|||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
|
|
||||||
BEGIN_PROVIDER [double precision, mo_nucl_elec_integral_per_atom, (mo_tot_num,mo_tot_num,nucl_num)]
|
BEGIN_PROVIDER [double precision, mo_nucl_elec_integral_per_atom, (mo_tot_num_align,mo_tot_num,nucl_num)]
|
||||||
implicit none
|
implicit none
|
||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! mo_nucl_elec_integral_per_atom(i,j,k) = -<MO(i)|1/|r-Rk|MO(j)>
|
! mo_nucl_elec_integral_per_atom(i,j,k) = -<MO(i)|1/|r-Rk|MO(j)>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
BEGIN_PROVIDER [double precision, mo_pseudo_integral, (mo_tot_num,mo_tot_num)]
|
BEGIN_PROVIDER [double precision, mo_pseudo_integral, (mo_tot_num_align,mo_tot_num)]
|
||||||
implicit none
|
implicit none
|
||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! interaction nuclear electron on the MO basis
|
! interaction nuclear electron on the MO basis
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
BEGIN_PROVIDER [ double precision, ao_spread_x, (ao_num,ao_num)]
|
BEGIN_PROVIDER [ double precision, ao_spread_x, (ao_num_align,ao_num)]
|
||||||
&BEGIN_PROVIDER [ double precision, ao_spread_y, (ao_num,ao_num)]
|
&BEGIN_PROVIDER [ double precision, ao_spread_y, (ao_num_align,ao_num)]
|
||||||
&BEGIN_PROVIDER [ double precision, ao_spread_z, (ao_num,ao_num)]
|
&BEGIN_PROVIDER [ double precision, ao_spread_z, (ao_num_align,ao_num)]
|
||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! array of the integrals of AO_i * x^2 AO_j
|
! array of the integrals of AO_i * x^2 AO_j
|
||||||
! array of the integrals of AO_i * y^2 AO_j
|
! array of the integrals of AO_i * y^2 AO_j
|
||||||
@ -69,9 +69,9 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN_PROVIDER [ double precision, ao_dipole_x, (ao_num,ao_num)]
|
BEGIN_PROVIDER [ double precision, ao_dipole_x, (ao_num_align,ao_num)]
|
||||||
&BEGIN_PROVIDER [ double precision, ao_dipole_y, (ao_num,ao_num)]
|
&BEGIN_PROVIDER [ double precision, ao_dipole_y, (ao_num_align,ao_num)]
|
||||||
&BEGIN_PROVIDER [ double precision, ao_dipole_z, (ao_num,ao_num)]
|
&BEGIN_PROVIDER [ double precision, ao_dipole_z, (ao_num_align,ao_num)]
|
||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! array of the integrals of AO_i * x AO_j
|
! array of the integrals of AO_i * x AO_j
|
||||||
! array of the integrals of AO_i * y AO_j
|
! array of the integrals of AO_i * y AO_j
|
||||||
@ -139,9 +139,9 @@
|
|||||||
!$OMP END PARALLEL DO
|
!$OMP END PARALLEL DO
|
||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
BEGIN_PROVIDER [ double precision, ao_deriv_1_x, (ao_num,ao_num)]
|
BEGIN_PROVIDER [ double precision, ao_deriv_1_x, (ao_num_align,ao_num)]
|
||||||
&BEGIN_PROVIDER [ double precision, ao_deriv_1_y, (ao_num,ao_num)]
|
&BEGIN_PROVIDER [ double precision, ao_deriv_1_y, (ao_num_align,ao_num)]
|
||||||
&BEGIN_PROVIDER [ double precision, ao_deriv_1_z, (ao_num,ao_num)]
|
&BEGIN_PROVIDER [ double precision, ao_deriv_1_z, (ao_num_align,ao_num)]
|
||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! array of the integrals of AO_i * d/dx AO_j
|
! array of the integrals of AO_i * d/dx AO_j
|
||||||
! array of the integrals of AO_i * d/dy AO_j
|
! array of the integrals of AO_i * d/dy AO_j
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
BEGIN_PROVIDER [double precision, mo_dipole_x , (mo_tot_num,mo_tot_num)]
|
BEGIN_PROVIDER [double precision, mo_dipole_x , (mo_tot_num_align,mo_tot_num)]
|
||||||
&BEGIN_PROVIDER [double precision, mo_dipole_y , (mo_tot_num,mo_tot_num)]
|
&BEGIN_PROVIDER [double precision, mo_dipole_y , (mo_tot_num_align,mo_tot_num)]
|
||||||
&BEGIN_PROVIDER [double precision, mo_dipole_z , (mo_tot_num,mo_tot_num)]
|
&BEGIN_PROVIDER [double precision, mo_dipole_z , (mo_tot_num_align,mo_tot_num)]
|
||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! array of the integrals of MO_i * x MO_j
|
! array of the integrals of MO_i * x MO_j
|
||||||
! array of the integrals of MO_i * y MO_j
|
! array of the integrals of MO_i * y MO_j
|
||||||
@ -29,9 +29,9 @@
|
|||||||
|
|
||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
BEGIN_PROVIDER [double precision, mo_spread_x , (mo_tot_num,mo_tot_num)]
|
BEGIN_PROVIDER [double precision, mo_spread_x , (mo_tot_num_align,mo_tot_num)]
|
||||||
&BEGIN_PROVIDER [double precision, mo_spread_y , (mo_tot_num,mo_tot_num)]
|
&BEGIN_PROVIDER [double precision, mo_spread_y , (mo_tot_num_align,mo_tot_num)]
|
||||||
&BEGIN_PROVIDER [double precision, mo_spread_z , (mo_tot_num,mo_tot_num)]
|
&BEGIN_PROVIDER [double precision, mo_spread_z , (mo_tot_num_align,mo_tot_num)]
|
||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! array of the integrals of MO_i * x^2 MO_j
|
! array of the integrals of MO_i * x^2 MO_j
|
||||||
! array of the integrals of MO_i * y^2 MO_j
|
! array of the integrals of MO_i * y^2 MO_j
|
||||||
|
@ -5,11 +5,5 @@ program H_CORE_guess
|
|||||||
END_DOC
|
END_DOC
|
||||||
implicit none
|
implicit none
|
||||||
character*(64) :: label
|
character*(64) :: label
|
||||||
label = "Guess"
|
call h_core_guess
|
||||||
call mo_as_eigvectors_of_mo_matrix(mo_mono_elec_integral, &
|
|
||||||
size(mo_mono_elec_integral,1), &
|
|
||||||
size(mo_mono_elec_integral,2),label,1)
|
|
||||||
print *, 'save mos'
|
|
||||||
call save_mos
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
@ -7,8 +7,7 @@ subroutine hcore_guess
|
|||||||
label = "Guess"
|
label = "Guess"
|
||||||
call mo_as_eigvectors_of_mo_matrix(mo_mono_elec_integral, &
|
call mo_as_eigvectors_of_mo_matrix(mo_mono_elec_integral, &
|
||||||
size(mo_mono_elec_integral,1), &
|
size(mo_mono_elec_integral,1), &
|
||||||
size(mo_mono_elec_integral,2),label,1)
|
size(mo_mono_elec_integral,2),label,1,.false.)
|
||||||
print *, 'save mos'
|
|
||||||
call save_mos
|
call save_mos
|
||||||
SOFT_TOUCH mo_coef mo_label
|
SOFT_TOUCH mo_coef mo_label
|
||||||
end
|
end
|
||||||
|
@ -26,7 +26,7 @@ BEGIN_PROVIDER [ integer, mo_tot_num_align ]
|
|||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
|
|
||||||
|
|
||||||
BEGIN_PROVIDER [ double precision, mo_coef, (ao_num_align,mo_tot_num) ]
|
BEGIN_PROVIDER [ double precision, mo_coef, (ao_num_align,mo_tot_num) ]
|
||||||
implicit none
|
implicit none
|
||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! Molecular orbital coefficients on AO basis set
|
! Molecular orbital coefficients on AO basis set
|
||||||
@ -35,7 +35,6 @@ BEGIN_PROVIDER [ double precision, mo_coef, (ao_num_align,mo_tot_num) ]
|
|||||||
END_DOC
|
END_DOC
|
||||||
integer :: i, j
|
integer :: i, j
|
||||||
double precision, allocatable :: buffer(:,:)
|
double precision, allocatable :: buffer(:,:)
|
||||||
!DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: buffer
|
|
||||||
logical :: exists
|
logical :: exists
|
||||||
PROVIDE ezfio_filename
|
PROVIDE ezfio_filename
|
||||||
|
|
||||||
@ -50,9 +49,6 @@ BEGIN_PROVIDER [ double precision, mo_coef, (ao_num_align,mo_tot_num) ]
|
|||||||
do j=1,ao_num
|
do j=1,ao_num
|
||||||
mo_coef(j,i) = buffer(j,i)
|
mo_coef(j,i) = buffer(j,i)
|
||||||
enddo
|
enddo
|
||||||
do j=ao_num+1,ao_num_align
|
|
||||||
mo_coef(j,i) = 0.d0
|
|
||||||
enddo
|
|
||||||
enddo
|
enddo
|
||||||
deallocate(buffer)
|
deallocate(buffer)
|
||||||
else
|
else
|
||||||
@ -61,9 +57,6 @@ BEGIN_PROVIDER [ double precision, mo_coef, (ao_num_align,mo_tot_num) ]
|
|||||||
do j=1,ao_num
|
do j=1,ao_num
|
||||||
mo_coef(j,i) = ao_ortho_canonical_coef(j,i)
|
mo_coef(j,i) = ao_ortho_canonical_coef(j,i)
|
||||||
enddo
|
enddo
|
||||||
do j=ao_num+1,ao_num_align
|
|
||||||
mo_coef(j,i) = 0.d0
|
|
||||||
enddo
|
|
||||||
enddo
|
enddo
|
||||||
endif
|
endif
|
||||||
END_PROVIDER
|
END_PROVIDER
|
||||||
@ -125,7 +118,7 @@ BEGIN_PROVIDER [ double precision, S_mo_coef, (ao_num_align, mo_tot_num) ]
|
|||||||
END_DOC
|
END_DOC
|
||||||
|
|
||||||
call dgemm('N','N', ao_num, mo_tot_num, ao_num, &
|
call dgemm('N','N', ao_num, mo_tot_num, ao_num, &
|
||||||
1.d0, ao_overlap,size(ao_overlap,1), &
|
1.d0, ao_overlap,size(ao_overlap,1), &
|
||||||
mo_coef, size(mo_coef,1), &
|
mo_coef, size(mo_coef,1), &
|
||||||
0.d0, S_mo_coef, size(S_mo_coef,1))
|
0.d0, S_mo_coef, size(S_mo_coef,1))
|
||||||
|
|
||||||
@ -159,24 +152,25 @@ subroutine ao_to_mo(A_ao,LDA_ao,A_mo,LDA_mo)
|
|||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! Transform A from the AO basis to the MO basis
|
! Transform A from the AO basis to the MO basis
|
||||||
!
|
!
|
||||||
! (S.C)t.A_ao.S.C
|
! Ct.A_ao.C
|
||||||
END_DOC
|
END_DOC
|
||||||
integer, intent(in) :: LDA_ao,LDA_mo
|
integer, intent(in) :: LDA_ao,LDA_mo
|
||||||
double precision, intent(in) :: A_ao(LDA_ao,ao_num)
|
double precision, intent(in) :: A_ao(LDA_ao,ao_num)
|
||||||
double precision, intent(out) :: A_mo(LDA_mo,mo_tot_num)
|
double precision, intent(out) :: A_mo(LDA_mo,mo_tot_num)
|
||||||
double precision, allocatable :: T(:,:)
|
double precision, allocatable :: T(:,:)
|
||||||
|
|
||||||
allocate ( T(mo_tot_num,ao_num) )
|
allocate ( T(ao_num_align,mo_tot_num) )
|
||||||
|
!DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: T
|
||||||
|
|
||||||
call dgemm('T','N', mo_tot_num, ao_num, ao_num, &
|
call dgemm('N','N', ao_num, mo_tot_num, ao_num, &
|
||||||
1.d0, S_mo_coef, size(S_mo_coef,1), &
|
1.d0, A_ao,LDA_ao, &
|
||||||
A_ao, size(A_ao,1), &
|
mo_coef, size(mo_coef,1), &
|
||||||
0.d0, T, size(T,1))
|
0.d0, T, ao_num_align)
|
||||||
|
|
||||||
call dgemm('N','N', mo_tot_num, mo_tot_num, ao_num, &
|
call dgemm('T','N', mo_tot_num, mo_tot_num, ao_num, &
|
||||||
1.d0, T,size(T,1), &
|
1.d0, mo_coef,size(mo_coef,1), &
|
||||||
S_mo_coef, size(S_mo_coef,1), &
|
T, ao_num_align, &
|
||||||
0.d0, A_mo, size(A_mo,1))
|
0.d0, A_mo, LDA_mo)
|
||||||
|
|
||||||
deallocate(T)
|
deallocate(T)
|
||||||
end
|
end
|
||||||
@ -186,7 +180,7 @@ subroutine mo_to_ao(A_mo,LDA_mo,A_ao,LDA_ao)
|
|||||||
BEGIN_DOC
|
BEGIN_DOC
|
||||||
! Transform A from the MO basis to the AO basis
|
! Transform A from the MO basis to the AO basis
|
||||||
!
|
!
|
||||||
! C.A_mo.Ct
|
! (S.C).A_mo.(S.C)t
|
||||||
END_DOC
|
END_DOC
|
||||||
integer, intent(in) :: LDA_ao,LDA_mo
|
integer, intent(in) :: LDA_ao,LDA_mo
|
||||||
double precision, intent(in) :: A_mo(LDA_mo,mo_tot_num)
|
double precision, intent(in) :: A_mo(LDA_mo,mo_tot_num)
|
||||||
@ -194,15 +188,14 @@ subroutine mo_to_ao(A_mo,LDA_mo,A_ao,LDA_ao)
|
|||||||
double precision, allocatable :: T(:,:)
|
double precision, allocatable :: T(:,:)
|
||||||
|
|
||||||
allocate ( T(mo_tot_num_align,ao_num) )
|
allocate ( T(mo_tot_num_align,ao_num) )
|
||||||
!DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: T
|
|
||||||
|
|
||||||
call dgemm('N','T', mo_tot_num, ao_num, mo_tot_num, &
|
call dgemm('N','T', mo_tot_num, ao_num, mo_tot_num, &
|
||||||
1.d0, A_mo,LDA_mo, &
|
1.d0, A_mo,size(A_mo,1), &
|
||||||
mo_coef, size(mo_coef,1), &
|
S_mo_coef, size(S_mo_coef,1), &
|
||||||
0.d0, T, size(T,1))
|
0.d0, T, size(T,1))
|
||||||
|
|
||||||
call dgemm('N','N', ao_num, ao_num, mo_tot_num, &
|
call dgemm('N','N', ao_num, ao_num, mo_tot_num, &
|
||||||
1.d0, mo_coef,size(mo_coef,1), &
|
1.d0, S_mo_coef, size(S_mo_coef,1), &
|
||||||
T, size(T,1), &
|
T, size(T,1), &
|
||||||
0.d0, A_ao, size(A_ao,1))
|
0.d0, A_ao, size(A_ao,1))
|
||||||
|
|
||||||
@ -257,18 +250,17 @@ subroutine ao_ortho_cano_to_ao(A_ao,LDA_ao,A,LDA)
|
|||||||
double precision, allocatable :: T(:,:)
|
double precision, allocatable :: T(:,:)
|
||||||
|
|
||||||
allocate ( T(ao_num_align,ao_num) )
|
allocate ( T(ao_num_align,ao_num) )
|
||||||
!DIR$ ATTRIBUTES ALIGN : $IRP_ALIGN :: T
|
|
||||||
|
|
||||||
call dgemm('T','N', ao_num, ao_num, ao_num, &
|
call dgemm('T','N', ao_num, ao_num, ao_num, &
|
||||||
1.d0, &
|
1.d0, &
|
||||||
ao_ortho_canonical_coef_inv, size(ao_ortho_canonical_coef_inv,1), &
|
ao_ortho_canonical_coef_inv, size(ao_ortho_canonical_coef_inv,1),&
|
||||||
A_ao,LDA_ao, &
|
A_ao,size(A_ao,1), &
|
||||||
0.d0, T, ao_num_align)
|
0.d0, T, size(T,1))
|
||||||
|
|
||||||
call dgemm('N','N', ao_num, ao_num, ao_num, 1.d0, &
|
call dgemm('N','N', ao_num, ao_num, ao_num, 1.d0, &
|
||||||
T, size(T,1), &
|
T, size(T,1), &
|
||||||
ao_ortho_canonical_coef_inv,size(ao_ortho_canonical_coef_inv,1),&
|
ao_ortho_canonical_coef_inv,size(ao_ortho_canonical_coef_inv,1),&
|
||||||
0.d0, A, LDA)
|
0.d0, A, size(A,1))
|
||||||
|
|
||||||
deallocate(T)
|
deallocate(T)
|
||||||
end
|
end
|
||||||
|
@ -44,11 +44,12 @@ subroutine save_mos_truncated(n)
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
subroutine mo_as_eigvectors_of_mo_matrix(matrix,n,m,label,sign)
|
subroutine mo_as_eigvectors_of_mo_matrix(matrix,n,m,label,sign,output)
|
||||||
implicit none
|
implicit none
|
||||||
integer,intent(in) :: n,m, sign
|
integer,intent(in) :: n,m, sign
|
||||||
character*(64), intent(in) :: label
|
character*(64), intent(in) :: label
|
||||||
double precision, intent(in) :: matrix(n,m)
|
double precision, intent(in) :: matrix(n,m)
|
||||||
|
logical, intent(in) :: output
|
||||||
|
|
||||||
integer :: i,j
|
integer :: i,j
|
||||||
double precision, allocatable :: mo_coef_new(:,:), R(:,:),eigvalues(:), A(:,:)
|
double precision, allocatable :: mo_coef_new(:,:), R(:,:),eigvalues(:), A(:,:)
|
||||||
@ -76,22 +77,26 @@ subroutine mo_as_eigvectors_of_mo_matrix(matrix,n,m,label,sign)
|
|||||||
mo_coef_new = mo_coef
|
mo_coef_new = mo_coef
|
||||||
|
|
||||||
call lapack_diag(eigvalues,R,A,n,m)
|
call lapack_diag(eigvalues,R,A,n,m)
|
||||||
write (output_mo_basis,'(A)') 'MOs are now **'//trim(label)//'**'
|
if (output) then
|
||||||
write (output_mo_basis,'(A)') ''
|
write (output_mo_basis,'(A)') 'MOs are now **'//trim(label)//'**'
|
||||||
write (output_mo_basis,'(A)') 'Eigenvalues'
|
write (output_mo_basis,'(A)') ''
|
||||||
write (output_mo_basis,'(A)') '-----------'
|
write (output_mo_basis,'(A)') 'Eigenvalues'
|
||||||
write (output_mo_basis,'(A)') ''
|
write (output_mo_basis,'(A)') '-----------'
|
||||||
write (output_mo_basis,'(A)') '======== ================'
|
write (output_mo_basis,'(A)') ''
|
||||||
|
write (output_mo_basis,'(A)') '======== ================'
|
||||||
|
endif
|
||||||
if (sign == -1) then
|
if (sign == -1) then
|
||||||
do i=1,m
|
do i=1,m
|
||||||
eigvalues(i) = -eigvalues(i)
|
eigvalues(i) = -eigvalues(i)
|
||||||
enddo
|
enddo
|
||||||
endif
|
endif
|
||||||
do i=1,m
|
if (output) then
|
||||||
write (output_mo_basis,'(I8,1X,F16.10)') i,eigvalues(i)
|
do i=1,m
|
||||||
enddo
|
write (output_mo_basis,'(I8,1X,F16.10)') i,eigvalues(i)
|
||||||
write (output_mo_basis,'(A)') '======== ================'
|
enddo
|
||||||
write (output_mo_basis,'(A)') ''
|
write (output_mo_basis,'(A)') '======== ================'
|
||||||
|
write (output_mo_basis,'(A)') ''
|
||||||
|
endif
|
||||||
|
|
||||||
call dgemm('N','N',ao_num,m,m,1.d0,mo_coef_new,size(mo_coef_new,1),R,size(R,1),0.d0,mo_coef,size(mo_coef,1))
|
call dgemm('N','N',ao_num,m,m,1.d0,mo_coef_new,size(mo_coef_new,1),R,size(R,1),0.d0,mo_coef,size(mo_coef,1))
|
||||||
deallocate(A,mo_coef_new,R,eigvalues)
|
deallocate(A,mo_coef_new,R,eigvalues)
|
||||||
|
Loading…
Reference in New Issue
Block a user