mirror of
https://github.com/pfloos/quack
synced 2024-12-23 04:43:53 +01:00
RPA and ACRPA
This commit is contained in:
parent
89ae51c659
commit
c6ec8f91e9
21
input/basis
21
input/basis
@ -1,16 +1,9 @@
|
|||||||
1 6
|
1 3
|
||||||
S 4 1.00
|
S 3 1.00
|
||||||
234.0000000 0.0025870
|
38.3600000 0.0238090
|
||||||
35.1600000 0.0195330
|
5.7700000 0.1548910
|
||||||
7.9890000 0.0909980
|
1.2400000 0.4699870
|
||||||
2.2120000 0.2720500
|
|
||||||
S 1 1.00
|
S 1 1.00
|
||||||
0.6669000 1.0000000
|
0.2976000 1.0000000
|
||||||
S 1 1.00
|
|
||||||
0.2089000 1.0000000
|
|
||||||
P 1 1.00
|
P 1 1.00
|
||||||
3.0440000 1.0000000
|
1.2750000 1.0000000
|
||||||
P 1 1.00
|
|
||||||
0.7580000 1.0000000
|
|
||||||
D 1 1.00
|
|
||||||
1.9650000 1.0000000
|
|
||||||
|
@ -3,13 +3,13 @@
|
|||||||
# MP2 MP3 MP2-F12
|
# MP2 MP3 MP2-F12
|
||||||
F F F
|
F F F
|
||||||
# CCD CCSD CCSD(T)
|
# CCD CCSD CCSD(T)
|
||||||
F F F
|
F F T
|
||||||
# CIS TDHF ppRPA ADC
|
# CIS RPA TDHF ppRPA ADC
|
||||||
F F F F
|
F T T F F
|
||||||
# GF2 GF3
|
# GF2 GF3
|
||||||
F F
|
F F
|
||||||
# G0W0 evGW qsGW
|
# G0W0 evGW qsGW
|
||||||
T F F
|
F F F
|
||||||
# G0T0 evGT qsGT
|
# G0T0 evGT qsGT
|
||||||
F F F
|
F F F
|
||||||
# MCMP2
|
# MCMP2
|
||||||
|
21
input/weight
21
input/weight
@ -1,16 +1,9 @@
|
|||||||
1 6
|
1 3
|
||||||
S 4 1.00
|
S 3 1.00
|
||||||
234.0000000 0.0025870
|
38.3600000 0.0238090
|
||||||
35.1600000 0.0195330
|
5.7700000 0.1548910
|
||||||
7.9890000 0.0909980
|
1.2400000 0.4699870
|
||||||
2.2120000 0.2720500
|
|
||||||
S 1 1.00
|
S 1 1.00
|
||||||
0.6669000 1.0000000
|
0.2976000 1.0000000
|
||||||
S 1 1.00
|
|
||||||
0.2089000 1.0000000
|
|
||||||
P 1 1.00
|
P 1 1.00
|
||||||
3.0440000 1.0000000
|
1.2750000 1.0000000
|
||||||
P 1 1.00
|
|
||||||
0.7580000 1.0000000
|
|
||||||
D 1 1.00
|
|
||||||
1.9650000 1.0000000
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
subroutine Ec_AC(ispin,nBas,nC,nO,nV,nR,nS,ERI,XpY,EcAC)
|
subroutine Ec_AC(ispin,dRPA,nBas,nC,nO,nV,nR,nS,ERI,XpY,EcAC)
|
||||||
|
|
||||||
! Compute the correlation energy via the adiabatic connection formula
|
! Compute the correlation energy via the adiabatic connection formula
|
||||||
|
|
||||||
@ -8,6 +8,7 @@ subroutine Ec_AC(ispin,nBas,nC,nO,nV,nR,nS,ERI,XpY,EcAC)
|
|||||||
! Input variables
|
! Input variables
|
||||||
|
|
||||||
integer,intent(in) :: ispin
|
integer,intent(in) :: ispin
|
||||||
|
logical,intent(in) :: dRPA
|
||||||
integer,intent(in) :: nBas,nC,nO,nV,nR,nS
|
integer,intent(in) :: nBas,nC,nO,nV,nR,nS
|
||||||
double precision,intent(in) :: ERI(nBas,nBas,nBas,nBas)
|
double precision,intent(in) :: ERI(nBas,nBas,nBas,nBas)
|
||||||
double precision,intent(in) :: XpY(nS,nS)
|
double precision,intent(in) :: XpY(nS,nS)
|
||||||
@ -17,7 +18,10 @@ subroutine Ec_AC(ispin,nBas,nC,nO,nV,nR,nS,ERI,XpY,EcAC)
|
|||||||
integer :: i,j,a,b
|
integer :: i,j,a,b
|
||||||
integer :: ia,jb,kc
|
integer :: ia,jb,kc
|
||||||
double precision :: delta_spin
|
double precision :: delta_spin
|
||||||
|
double precision :: delta_dRPA
|
||||||
double precision,allocatable :: P(:,:)
|
double precision,allocatable :: P(:,:)
|
||||||
|
double precision,allocatable :: V(:,:)
|
||||||
|
double precision,external :: trace_matrix
|
||||||
|
|
||||||
! Output variables
|
! Output variables
|
||||||
|
|
||||||
@ -29,30 +33,24 @@ subroutine Ec_AC(ispin,nBas,nC,nO,nV,nR,nS,ERI,XpY,EcAC)
|
|||||||
if(ispin == 1) delta_spin = +1d0
|
if(ispin == 1) delta_spin = +1d0
|
||||||
if(ispin == 2) delta_spin = -1d0
|
if(ispin == 2) delta_spin = -1d0
|
||||||
|
|
||||||
|
! Direct RPA
|
||||||
|
|
||||||
|
delta_dRPA = 0d0
|
||||||
|
if(dRPA) delta_dRPA = 1d0
|
||||||
|
|
||||||
! Memory allocation
|
! Memory allocation
|
||||||
|
|
||||||
allocate(P(nS,nS))
|
allocate(P(nS,nS),V(nS,nS))
|
||||||
|
|
||||||
! Compute P = (X+Y)(X+Y) - 1
|
! Compute P = (X+Y)(X+Y) - 1
|
||||||
|
|
||||||
P(:,:) = 0d0
|
P(:,:) = matmul(transpose(XpY),XpY)
|
||||||
|
|
||||||
do ia=1,nS
|
do ia=1,nS
|
||||||
do jb=1,nS
|
|
||||||
do kc=1,nS
|
|
||||||
|
|
||||||
P(ia,jb) = P(ia,jb) + XpY(ia,kc)*XpY(kc,jb)
|
|
||||||
|
|
||||||
enddo
|
|
||||||
enddo
|
|
||||||
|
|
||||||
P(ia,ia) = P(ia,ia) - 1d0
|
P(ia,ia) = P(ia,ia) - 1d0
|
||||||
|
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
! Compute Tr[VP]
|
! Compute Viajb = (ia|bj)
|
||||||
|
|
||||||
EcAC = 0d0
|
|
||||||
|
|
||||||
ia = 0
|
ia = 0
|
||||||
do i=nC+1,nO
|
do i=nC+1,nO
|
||||||
@ -63,12 +61,16 @@ subroutine Ec_AC(ispin,nBas,nC,nO,nV,nR,nS,ERI,XpY,EcAC)
|
|||||||
do b=nO+1,nBas-nR
|
do b=nO+1,nBas-nR
|
||||||
jb = jb + 1
|
jb = jb + 1
|
||||||
|
|
||||||
EcAC = EcAC + (1d0 + delta_spin)*ERI(i,b,a,j)*P(jb,ia)
|
V(ia,jb) = (1d0 + delta_spin)*ERI(i,b,a,j)
|
||||||
|
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
|
! Compute Tr(VP)
|
||||||
|
|
||||||
|
EcAC = trace_matrix(nS,matmul(V,P))
|
||||||
|
|
||||||
end subroutine Ec_AC
|
end subroutine Ec_AC
|
||||||
|
|
||||||
|
@ -191,10 +191,14 @@ subroutine G0W0(COHSEX,SOSEX,BSE,TDA,singlet_manifold,triplet_manifold,eta, &
|
|||||||
|
|
||||||
lambda = rAC(iAC)
|
lambda = rAC(iAC)
|
||||||
|
|
||||||
|
call linear_response(ispin,dRPA,TDA,.false.,nBas,nC,nO,nV,nR,nS,lambda,eHF,ERI, &
|
||||||
|
rho(:,:,:,ispin),EcRPA(ispin),Omega(:,ispin),XpY(:,:,ispin))
|
||||||
|
call excitation_density(nBas,nC,nO,nR,nS,ERI,XpY(:,:,ispin),rho(:,:,:,ispin))
|
||||||
|
|
||||||
call linear_response(ispin,dRPA,TDA,BSE,nBas,nC,nO,nV,nR,nS,lambda,eG0W0,ERI, &
|
call linear_response(ispin,dRPA,TDA,BSE,nBas,nC,nO,nV,nR,nS,lambda,eG0W0,ERI, &
|
||||||
rho(:,:,:,ispin),EcACBSE(iAC,ispin),Omega(:,ispin),XpY(:,:,ispin))
|
rho(:,:,:,ispin),EcACBSE(iAC,ispin),Omega(:,ispin),XpY(:,:,ispin))
|
||||||
|
|
||||||
call Ec_AC(ispin,nBas,nC,nO,nV,nR,nS,ERI,XpY(:,:,ispin),EcAC(iAC,ispin))
|
call Ec_AC(ispin,dRPA,nBas,nC,nO,nV,nR,nS,ERI,XpY(:,:,ispin),EcAC(iAC,ispin))
|
||||||
|
|
||||||
write(*,'(2X,F15.6,1X,F30.15,1X,F30.15)') lambda,EcACBSE(iAC,ispin),EcAC(iAC,ispin)
|
write(*,'(2X,F15.6,1X,F30.15,1X,F30.15)') lambda,EcACBSE(iAC,ispin),EcAC(iAC,ispin)
|
||||||
|
|
||||||
@ -225,10 +229,14 @@ subroutine G0W0(COHSEX,SOSEX,BSE,TDA,singlet_manifold,triplet_manifold,eta, &
|
|||||||
|
|
||||||
lambda = rAC(iAC)
|
lambda = rAC(iAC)
|
||||||
|
|
||||||
|
call linear_response(ispin,dRPA,TDA,.false.,nBas,nC,nO,nV,nR,nS,lambda,eHF,ERI, &
|
||||||
|
rho(:,:,:,ispin),EcRPA(ispin),Omega(:,ispin),XpY(:,:,ispin))
|
||||||
|
call excitation_density(nBas,nC,nO,nR,nS,ERI,XpY(:,:,ispin),rho(:,:,:,ispin))
|
||||||
|
|
||||||
call linear_response(ispin,dRPA,TDA,BSE,nBas,nC,nO,nV,nR,nS,lambda,eG0W0,ERI, &
|
call linear_response(ispin,dRPA,TDA,BSE,nBas,nC,nO,nV,nR,nS,lambda,eG0W0,ERI, &
|
||||||
rho(:,:,:,ispin),EcACBSE(iAC,ispin),Omega(:,ispin),XpY(:,:,ispin))
|
rho(:,:,:,ispin),EcACBSE(iAC,ispin),Omega(:,ispin),XpY(:,:,ispin))
|
||||||
|
|
||||||
call Ec_AC(ispin,nBas,nC,nO,nV,nR,nS,ERI,XpY(:,:,ispin),EcAC(iAC,ispin))
|
call Ec_AC(ispin,dRPA,nBas,nC,nO,nV,nR,nS,ERI,XpY(:,:,ispin),EcAC(iAC,ispin))
|
||||||
|
|
||||||
write(*,'(2X,F15.6,1X,F30.15,1X,F30.15)') lambda,EcACBSE(iAC,ispin),EcAC(iAC,ispin)
|
write(*,'(2X,F15.6,1X,F30.15,1X,F30.15)') lambda,EcACBSE(iAC,ispin),EcAC(iAC,ispin)
|
||||||
|
|
||||||
|
@ -7,7 +7,8 @@ program QuAcK
|
|||||||
logical :: doRHF,doUHF,doMOM
|
logical :: doRHF,doUHF,doMOM
|
||||||
logical :: doMP2,doMP3,doMP2F12
|
logical :: doMP2,doMP3,doMP2F12
|
||||||
logical :: doCCD,doCCSD,doCCSDT
|
logical :: doCCD,doCCSD,doCCSDT
|
||||||
logical :: doCIS,doTDHF,doppRPA,doADC
|
logical :: doCIS,doRPA,doTDHF
|
||||||
|
logical :: doppRPA,doADC
|
||||||
logical :: doGF2,doGF3
|
logical :: doGF2,doGF3
|
||||||
logical :: doG0W0,doevGW,doqsGW
|
logical :: doG0W0,doevGW,doqsGW
|
||||||
logical :: doG0T0,doevGT,doqsGT
|
logical :: doG0T0,doevGT,doqsGT
|
||||||
@ -44,6 +45,7 @@ program QuAcK
|
|||||||
double precision :: start_CCD ,end_CCD ,t_CCD
|
double precision :: start_CCD ,end_CCD ,t_CCD
|
||||||
double precision :: start_CCSD ,end_CCSD ,t_CCSD
|
double precision :: start_CCSD ,end_CCSD ,t_CCSD
|
||||||
double precision :: start_CIS ,end_CIS ,t_CIS
|
double precision :: start_CIS ,end_CIS ,t_CIS
|
||||||
|
double precision :: start_RPA ,end_RPA ,t_RPA
|
||||||
double precision :: start_TDHF ,end_TDHF ,t_TDHF
|
double precision :: start_TDHF ,end_TDHF ,t_TDHF
|
||||||
double precision :: start_ppRPA ,end_ppRPA ,t_ppRPA
|
double precision :: start_ppRPA ,end_ppRPA ,t_ppRPA
|
||||||
double precision :: start_ADC ,end_ADC ,t_ADC
|
double precision :: start_ADC ,end_ADC ,t_ADC
|
||||||
@ -106,13 +108,14 @@ program QuAcK
|
|||||||
|
|
||||||
! Which calculations do you want to do?
|
! Which calculations do you want to do?
|
||||||
|
|
||||||
call read_methods(doRHF,doUHF,doMOM, &
|
call read_methods(doRHF,doUHF,doMOM, &
|
||||||
doMP2,doMP3,doMP2F12, &
|
doMP2,doMP3,doMP2F12, &
|
||||||
doCCD,doCCSD,doCCSDT, &
|
doCCD,doCCSD,doCCSDT, &
|
||||||
doCIS,doTDHF,doppRPA,doADC, &
|
doCIS,doRPA,doTDHF, &
|
||||||
doGF2,doGF3, &
|
doppRPA,doADC, &
|
||||||
doG0W0,doevGW,doqsGW, &
|
doGF2,doGF3, &
|
||||||
doG0T0,doevGT,doqsGT, &
|
doG0W0,doevGW,doqsGW, &
|
||||||
|
doG0T0,doevGT,doqsGT, &
|
||||||
doMCMP2)
|
doMCMP2)
|
||||||
|
|
||||||
! Read options for methods
|
! Read options for methods
|
||||||
@ -363,6 +366,8 @@ program QuAcK
|
|||||||
! Perform CCSD or CCSD(T) calculation
|
! Perform CCSD or CCSD(T) calculation
|
||||||
!------------------------------------------------------------------------
|
!------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if(doCCSDT) doCCSD = .true.
|
||||||
|
|
||||||
if(doCCSD) then
|
if(doCCSD) then
|
||||||
|
|
||||||
call cpu_time(start_CCSD)
|
call cpu_time(start_CCSD)
|
||||||
@ -391,6 +396,22 @@ program QuAcK
|
|||||||
|
|
||||||
end if
|
end if
|
||||||
|
|
||||||
|
!------------------------------------------------------------------------
|
||||||
|
! Compute (direct) RPA excitations
|
||||||
|
!------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if(doRPA) then
|
||||||
|
|
||||||
|
call cpu_time(start_RPA)
|
||||||
|
call RPA(singlet_manifold,triplet_manifold,nBas,nC,nO,nV,nR,nS,ENuc,ERHF,ERI_MO_basis,eHF)
|
||||||
|
call cpu_time(end_RPA)
|
||||||
|
|
||||||
|
t_RPA = end_RPA - start_RPA
|
||||||
|
write(*,'(A65,1X,F9.3,A8)') 'Total CPU time for RPA = ',t_RPA,' seconds'
|
||||||
|
write(*,*)
|
||||||
|
|
||||||
|
end if
|
||||||
|
|
||||||
!------------------------------------------------------------------------
|
!------------------------------------------------------------------------
|
||||||
! Compute TDHF excitations
|
! Compute TDHF excitations
|
||||||
!------------------------------------------------------------------------
|
!------------------------------------------------------------------------
|
||||||
|
185
src/QuAcK/RPA.f90
Normal file
185
src/QuAcK/RPA.f90
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
subroutine RPA(singlet_manifold,triplet_manifold,nBas,nC,nO,nV,nR,nS,ENuc,ERHF,ERI,e)
|
||||||
|
|
||||||
|
! Perform a direct random phase approximation calculation
|
||||||
|
|
||||||
|
implicit none
|
||||||
|
include 'parameters.h'
|
||||||
|
include 'quadrature.h'
|
||||||
|
|
||||||
|
! Input variables
|
||||||
|
|
||||||
|
logical,intent(in) :: singlet_manifold
|
||||||
|
logical,intent(in) :: triplet_manifold
|
||||||
|
integer,intent(in) :: nBas
|
||||||
|
integer,intent(in) :: nC
|
||||||
|
integer,intent(in) :: nO
|
||||||
|
integer,intent(in) :: nV
|
||||||
|
integer,intent(in) :: nR
|
||||||
|
integer,intent(in) :: nS
|
||||||
|
double precision,intent(in) :: ENuc
|
||||||
|
double precision,intent(in) :: ERHF
|
||||||
|
double precision,intent(in) :: e(nBas)
|
||||||
|
double precision,intent(in) :: ERI(nBas,nBas,nBas,nBas)
|
||||||
|
|
||||||
|
! Local variables
|
||||||
|
|
||||||
|
logical :: dRPA
|
||||||
|
logical :: TDA
|
||||||
|
logical :: BSE
|
||||||
|
integer :: ispin
|
||||||
|
double precision,allocatable :: Omega(:,:)
|
||||||
|
double precision,allocatable :: XpY(:,:,:)
|
||||||
|
|
||||||
|
double precision :: rho
|
||||||
|
double precision :: EcRPA(nspin)
|
||||||
|
|
||||||
|
logical :: AC
|
||||||
|
integer :: iAC
|
||||||
|
double precision :: lambda
|
||||||
|
double precision,allocatable :: EcACRPA(:,:)
|
||||||
|
double precision,allocatable :: EcAC(:,:)
|
||||||
|
|
||||||
|
! Hello world
|
||||||
|
|
||||||
|
write(*,*)
|
||||||
|
write(*,*)'***********************************************'
|
||||||
|
write(*,*)'| random-phase approximation calculation |'
|
||||||
|
write(*,*)'***********************************************'
|
||||||
|
write(*,*)
|
||||||
|
|
||||||
|
! Initialization
|
||||||
|
|
||||||
|
EcRPA(:) = 0d0
|
||||||
|
|
||||||
|
! Switch off exchange for RPA
|
||||||
|
|
||||||
|
dRPA = .true.
|
||||||
|
|
||||||
|
! Switch off Tamm-Dancoff approximation for RPA
|
||||||
|
|
||||||
|
TDA = .false.
|
||||||
|
|
||||||
|
! Switch off Bethe-Salpeter equation for RPA
|
||||||
|
|
||||||
|
BSE = .false.
|
||||||
|
|
||||||
|
! Memory allocation
|
||||||
|
|
||||||
|
allocate(Omega(nS,nspin),XpY(nS,nS,nspin))
|
||||||
|
|
||||||
|
AC = .true.
|
||||||
|
allocate(EcACRPA(nAC,nspin),EcAC(nAC,nspin))
|
||||||
|
|
||||||
|
! Singlet manifold
|
||||||
|
|
||||||
|
if(singlet_manifold) then
|
||||||
|
|
||||||
|
ispin = 1
|
||||||
|
|
||||||
|
call linear_response(ispin,dRPA,TDA,BSE,nBas,nC,nO,nV,nR,nS,1d0,e,ERI,rho, &
|
||||||
|
EcRPA(ispin),Omega(:,ispin),XpY(:,:,ispin))
|
||||||
|
call print_excitation('RPA ',ispin,nS,Omega(:,ispin))
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
! Triplet manifold
|
||||||
|
|
||||||
|
if(triplet_manifold) then
|
||||||
|
|
||||||
|
ispin = 2
|
||||||
|
|
||||||
|
call linear_response(ispin,dRPA,TDA,BSE,nBas,nC,nO,nV,nR,nS,1d0,e,ERI,rho, &
|
||||||
|
EcRPA(ispin),Omega(:,ispin),XpY(:,:,ispin))
|
||||||
|
call print_excitation('RPA ',ispin,nS,Omega(:,ispin))
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
write(*,*)
|
||||||
|
write(*,*)'-------------------------------------------------------------------------------'
|
||||||
|
write(*,'(2X,A40,F15.6)') 'RPA@RPA correlation energy (singlet) =',EcRPA(1)
|
||||||
|
write(*,'(2X,A40,F15.6)') 'RPA@RPA correlation energy (triplet) =',EcRPA(2)
|
||||||
|
write(*,'(2X,A40,F15.6)') 'RPA@RPA correlation energy =',EcRPA(1) + EcRPA(2)
|
||||||
|
write(*,'(2X,A40,F15.6)') 'RPA@RPA total energy =',ENuc + ERHF + EcRPA(1) + EcRPA(2)
|
||||||
|
write(*,*)'-------------------------------------------------------------------------------'
|
||||||
|
write(*,*)
|
||||||
|
|
||||||
|
! Compute the correlation energy via the adiabatic connection
|
||||||
|
|
||||||
|
if(AC) then
|
||||||
|
|
||||||
|
write(*,*) '------------------------------------------------------'
|
||||||
|
write(*,*) 'Adiabatic connection version of RPA correlation energy'
|
||||||
|
write(*,*) '------------------------------------------------------'
|
||||||
|
write(*,*)
|
||||||
|
|
||||||
|
if(singlet_manifold) then
|
||||||
|
|
||||||
|
ispin = 1
|
||||||
|
EcACRPA(:,ispin) = 0d0
|
||||||
|
|
||||||
|
write(*,*) '--------------'
|
||||||
|
write(*,*) 'Singlet states'
|
||||||
|
write(*,*) '--------------'
|
||||||
|
write(*,*)
|
||||||
|
|
||||||
|
write(*,*) '-----------------------------------------------------------------------------------'
|
||||||
|
write(*,'(2X,A15,1X,A30,1X,A30)') 'lambda','EcRPA(lambda)','Tr(V x P_lambda)'
|
||||||
|
write(*,*) '-----------------------------------------------------------------------------------'
|
||||||
|
|
||||||
|
do iAC=1,nAC
|
||||||
|
|
||||||
|
lambda = rAC(iAC)
|
||||||
|
|
||||||
|
call linear_response(ispin,dRPA,TDA,BSE,nBas,nC,nO,nV,nR,nS,lambda,e,ERI,rho, &
|
||||||
|
EcACRPA(iAC,ispin),Omega(:,ispin),XpY(:,:,ispin))
|
||||||
|
|
||||||
|
call Ec_AC(ispin,dRPA,nBas,nC,nO,nV,nR,nS,ERI,XpY(:,:,ispin),EcAC(iAC,ispin))
|
||||||
|
|
||||||
|
write(*,'(2X,F15.6,1X,F30.15,1X,F30.15)') lambda,EcACRPA(iAC,ispin),EcAC(iAC,ispin)
|
||||||
|
|
||||||
|
end do
|
||||||
|
|
||||||
|
write(*,*) '-----------------------------------------------------------------------------------'
|
||||||
|
write(*,'(2X,A50,1X,F15.6)') ' Ec(RPA) via Gauss-Legendre quadrature:',0.5d0*dot_product(wAC,EcAC(:,ispin))
|
||||||
|
write(*,*) '-----------------------------------------------------------------------------------'
|
||||||
|
write(*,*)
|
||||||
|
|
||||||
|
end if
|
||||||
|
|
||||||
|
if(triplet_manifold) then
|
||||||
|
|
||||||
|
ispin = 2
|
||||||
|
EcACRPA(:,ispin) = 0d0
|
||||||
|
|
||||||
|
write(*,*) '--------------'
|
||||||
|
write(*,*) 'Triplet states'
|
||||||
|
write(*,*) '--------------'
|
||||||
|
write(*,*)
|
||||||
|
|
||||||
|
write(*,*) '-----------------------------------------------------------------------------------'
|
||||||
|
write(*,'(2X,A15,1X,A30,1X,A30)') 'lambda','EcRPA(lambda)','Tr(V x P_lambda)'
|
||||||
|
write(*,*) '-----------------------------------------------------------------------------------'
|
||||||
|
|
||||||
|
do iAC=1,nAC
|
||||||
|
|
||||||
|
lambda = rAC(iAC)
|
||||||
|
|
||||||
|
call linear_response(ispin,dRPA,TDA,BSE,nBas,nC,nO,nV,nR,nS,lambda,e,ERI,rho, &
|
||||||
|
EcACRPA(iAC,ispin),Omega(:,ispin),XpY(:,:,ispin))
|
||||||
|
|
||||||
|
call Ec_AC(ispin,dRPA,nBas,nC,nO,nV,nR,nS,ERI,XpY(:,:,ispin),EcAC(iAC,ispin))
|
||||||
|
|
||||||
|
write(*,'(2X,F15.6,1X,F30.15,1X,F30.15)') lambda,EcACRPA(iAC,ispin),EcAC(iAC,ispin)
|
||||||
|
|
||||||
|
end do
|
||||||
|
|
||||||
|
write(*,*) '-----------------------------------------------------------------------------------'
|
||||||
|
write(*,'(2X,A50,1X,F15.6)') ' Ec(RPA) via Gauss-Legendre quadrature:',0.5d0*dot_product(wAC,EcAC(:,ispin))
|
||||||
|
write(*,*) '-----------------------------------------------------------------------------------'
|
||||||
|
write(*,*)
|
||||||
|
|
||||||
|
end if
|
||||||
|
|
||||||
|
end if
|
||||||
|
|
||||||
|
end subroutine RPA
|
@ -4,6 +4,7 @@ subroutine TDHF(singlet_manifold,triplet_manifold,nBas,nC,nO,nV,nR,nS,ENuc,ERHF,
|
|||||||
|
|
||||||
implicit none
|
implicit none
|
||||||
include 'parameters.h'
|
include 'parameters.h'
|
||||||
|
include 'quadrature.h'
|
||||||
|
|
||||||
! Input variables
|
! Input variables
|
||||||
|
|
||||||
@ -26,13 +27,18 @@ subroutine TDHF(singlet_manifold,triplet_manifold,nBas,nC,nO,nV,nR,nS,ENuc,ERHF,
|
|||||||
logical :: TDA
|
logical :: TDA
|
||||||
logical :: BSE
|
logical :: BSE
|
||||||
integer :: ispin
|
integer :: ispin
|
||||||
double precision :: lambda
|
|
||||||
double precision,allocatable :: Omega(:,:)
|
double precision,allocatable :: Omega(:,:)
|
||||||
double precision,allocatable :: XpY(:,:,:)
|
double precision,allocatable :: XpY(:,:,:)
|
||||||
|
|
||||||
double precision :: rho
|
double precision :: rho
|
||||||
double precision :: EcRPA(nspin)
|
double precision :: EcRPA(nspin)
|
||||||
|
|
||||||
|
logical :: AC
|
||||||
|
integer :: iAC
|
||||||
|
double precision :: lambda
|
||||||
|
double precision,allocatable :: EcACRPA(:,:)
|
||||||
|
double precision,allocatable :: EcAC(:,:)
|
||||||
|
|
||||||
! Hello world
|
! Hello world
|
||||||
|
|
||||||
write(*,*)
|
write(*,*)
|
||||||
@ -45,10 +51,6 @@ subroutine TDHF(singlet_manifold,triplet_manifold,nBas,nC,nO,nV,nR,nS,ENuc,ERHF,
|
|||||||
|
|
||||||
EcRPA(:) = 0d0
|
EcRPA(:) = 0d0
|
||||||
|
|
||||||
! Adiabatic connection scaling
|
|
||||||
|
|
||||||
lambda = 1d0
|
|
||||||
|
|
||||||
! Switch on exchange for TDHF
|
! Switch on exchange for TDHF
|
||||||
|
|
||||||
dRPA = .false.
|
dRPA = .false.
|
||||||
@ -65,13 +67,16 @@ subroutine TDHF(singlet_manifold,triplet_manifold,nBas,nC,nO,nV,nR,nS,ENuc,ERHF,
|
|||||||
|
|
||||||
allocate(Omega(nS,nspin),XpY(nS,nS,nspin))
|
allocate(Omega(nS,nspin),XpY(nS,nS,nspin))
|
||||||
|
|
||||||
|
AC = .true.
|
||||||
|
allocate(EcACRPA(nAC,nspin),EcAC(nAC,nspin))
|
||||||
|
|
||||||
! Singlet manifold
|
! Singlet manifold
|
||||||
|
|
||||||
if(singlet_manifold) then
|
if(singlet_manifold) then
|
||||||
|
|
||||||
ispin = 1
|
ispin = 1
|
||||||
|
|
||||||
call linear_response(ispin,dRPA,TDA,BSE,nBas,nC,nO,nV,nR,nS,lambda,e,ERI,rho, &
|
call linear_response(ispin,dRPA,TDA,BSE,nBas,nC,nO,nV,nR,nS,1d0,e,ERI,rho, &
|
||||||
EcRPA(ispin),Omega(:,ispin),XpY(:,:,ispin))
|
EcRPA(ispin),Omega(:,ispin),XpY(:,:,ispin))
|
||||||
call print_excitation('TDHF ',ispin,nS,Omega(:,ispin))
|
call print_excitation('TDHF ',ispin,nS,Omega(:,ispin))
|
||||||
|
|
||||||
@ -83,7 +88,7 @@ subroutine TDHF(singlet_manifold,triplet_manifold,nBas,nC,nO,nV,nR,nS,ENuc,ERHF,
|
|||||||
|
|
||||||
ispin = 2
|
ispin = 2
|
||||||
|
|
||||||
call linear_response(ispin,dRPA,TDA,BSE,nBas,nC,nO,nV,nR,nS,lambda,e,ERI,rho, &
|
call linear_response(ispin,dRPA,TDA,BSE,nBas,nC,nO,nV,nR,nS,1d0,e,ERI,rho, &
|
||||||
EcRPA(ispin),Omega(:,ispin),XpY(:,:,ispin))
|
EcRPA(ispin),Omega(:,ispin),XpY(:,:,ispin))
|
||||||
call print_excitation('TDHF ',ispin,nS,Omega(:,ispin))
|
call print_excitation('TDHF ',ispin,nS,Omega(:,ispin))
|
||||||
|
|
||||||
@ -98,4 +103,91 @@ subroutine TDHF(singlet_manifold,triplet_manifold,nBas,nC,nO,nV,nR,nS,ENuc,ERHF,
|
|||||||
write(*,*)'-------------------------------------------------------------------------------'
|
write(*,*)'-------------------------------------------------------------------------------'
|
||||||
write(*,*)
|
write(*,*)
|
||||||
|
|
||||||
|
! Compute the correlation energy via the adiabatic connection
|
||||||
|
|
||||||
|
if(AC) then
|
||||||
|
|
||||||
|
write(*,*) '------------------------------------------------------'
|
||||||
|
write(*,*) 'Adiabatic connection version of RPA correlation energy'
|
||||||
|
write(*,*) '------------------------------------------------------'
|
||||||
|
write(*,*)
|
||||||
|
|
||||||
|
if(singlet_manifold) then
|
||||||
|
|
||||||
|
ispin = 1
|
||||||
|
EcACRPA(:,ispin) = 0d0
|
||||||
|
|
||||||
|
write(*,*) '--------------'
|
||||||
|
write(*,*) 'Singlet states'
|
||||||
|
write(*,*) '--------------'
|
||||||
|
write(*,*)
|
||||||
|
|
||||||
|
write(*,*) '-----------------------------------------------------------------------------------'
|
||||||
|
write(*,'(2X,A15,1X,A30,1X,A30)') 'lambda','EcRPA(lambda)','Tr(V x P_lambda)'
|
||||||
|
write(*,*) '-----------------------------------------------------------------------------------'
|
||||||
|
|
||||||
|
do iAC=1,nAC
|
||||||
|
|
||||||
|
lambda = rAC(iAC)
|
||||||
|
|
||||||
|
! call linear_response(ispin,dRPA,TDA,.false.,nBas,nC,nO,nV,nR,nS,lambda,eHF,ERI, &
|
||||||
|
! rho(:,:,:,ispin),EcRPA(ispin),Omega(:,ispin),XpY(:,:,ispin))
|
||||||
|
! call excitation_density(nBas,nC,nO,nR,nS,ERI,XpY(:,:,ispin),rho(:,:,:,ispin))
|
||||||
|
|
||||||
|
call linear_response(ispin,dRPA,TDA,BSE,nBas,nC,nO,nV,nR,nS,lambda,e,ERI, &
|
||||||
|
rho,EcACRPA(iAC,ispin),Omega(:,ispin),XpY(:,:,ispin))
|
||||||
|
|
||||||
|
call Ec_AC(ispin,dRPA,nBas,nC,nO,nV,nR,nS,ERI,XpY(:,:,ispin),EcAC(iAC,ispin))
|
||||||
|
|
||||||
|
write(*,'(2X,F15.6,1X,F30.15,1X,F30.15)') lambda,EcACRPA(iAC,ispin),EcAC(iAC,ispin)
|
||||||
|
|
||||||
|
end do
|
||||||
|
|
||||||
|
write(*,*) '-----------------------------------------------------------------------------------'
|
||||||
|
write(*,'(2X,A50,1X,F15.6)') ' Ec(RPA) via Gauss-Legendre quadrature:',0.5d0*dot_product(wAC,EcAC(:,ispin))
|
||||||
|
write(*,*) '-----------------------------------------------------------------------------------'
|
||||||
|
write(*,*)
|
||||||
|
|
||||||
|
end if
|
||||||
|
|
||||||
|
if(triplet_manifold) then
|
||||||
|
|
||||||
|
ispin = 2
|
||||||
|
EcACRPA(:,ispin) = 0d0
|
||||||
|
|
||||||
|
write(*,*) '--------------'
|
||||||
|
write(*,*) 'Triplet states'
|
||||||
|
write(*,*) '--------------'
|
||||||
|
write(*,*)
|
||||||
|
|
||||||
|
write(*,*) '-----------------------------------------------------------------------------------'
|
||||||
|
write(*,'(2X,A15,1X,A30,1X,A30)') 'lambda','EcRPA(lambda)','Tr(V x P_lambda)'
|
||||||
|
write(*,*) '-----------------------------------------------------------------------------------'
|
||||||
|
|
||||||
|
do iAC=1,nAC
|
||||||
|
|
||||||
|
lambda = rAC(iAC)
|
||||||
|
|
||||||
|
! call linear_response(ispin,dRPA,TDA,.false.,nBas,nC,nO,nV,nR,nS,lambda,eHF,ERI, &
|
||||||
|
! rho(:,:,:,ispin),EcRPA(ispin),Omega(:,ispin),XpY(:,:,ispin))
|
||||||
|
! call excitation_density(nBas,nC,nO,nR,nS,ERI,XpY(:,:,ispin),rho(:,:,:,ispin))
|
||||||
|
|
||||||
|
call linear_response(ispin,dRPA,TDA,BSE,nBas,nC,nO,nV,nR,nS,lambda,e,ERI, &
|
||||||
|
rho,EcACRPA(iAC,ispin),Omega(:,ispin),XpY(:,:,ispin))
|
||||||
|
|
||||||
|
call Ec_AC(ispin,dRPA,nBas,nC,nO,nV,nR,nS,ERI,XpY(:,:,ispin),EcAC(iAC,ispin))
|
||||||
|
|
||||||
|
write(*,'(2X,F15.6,1X,F30.15,1X,F30.15)') lambda,EcACRPA(iAC,ispin),EcAC(iAC,ispin)
|
||||||
|
|
||||||
|
end do
|
||||||
|
|
||||||
|
write(*,*) '-----------------------------------------------------------------------------------'
|
||||||
|
write(*,'(2X,A50,1X,F15.6)') ' Ec(RPA) via Gauss-Legendre quadrature:',0.5d0*dot_product(wAC,EcAC(:,ispin))
|
||||||
|
write(*,*) '-----------------------------------------------------------------------------------'
|
||||||
|
write(*,*)
|
||||||
|
|
||||||
|
end if
|
||||||
|
|
||||||
|
end if
|
||||||
|
|
||||||
end subroutine TDHF
|
end subroutine TDHF
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
subroutine read_methods(doRHF,doUHF,doMOM, &
|
subroutine read_methods(doRHF,doUHF,doMOM, &
|
||||||
doMP2,doMP3,doMP2F12, &
|
doMP2,doMP3,doMP2F12, &
|
||||||
doCCD,doCCSD,doCCSDT, &
|
doCCD,doCCSD,doCCSDT, &
|
||||||
doCIS,doTDHF,doppRPA,doADC, &
|
doCIS,doRPA,doTDHF, &
|
||||||
doGF2,doGF3, &
|
doppRPA,doADC, &
|
||||||
doG0W0,doevGW,doqsGW, &
|
doGF2,doGF3, &
|
||||||
doG0T0,doevGT,doqsGT, &
|
doG0W0,doevGW,doqsGW, &
|
||||||
|
doG0T0,doevGT,doqsGT, &
|
||||||
doMCMP2)
|
doMCMP2)
|
||||||
|
|
||||||
! Read desired methods
|
! Read desired methods
|
||||||
@ -16,7 +17,7 @@ subroutine read_methods(doRHF,doUHF,doMOM, &
|
|||||||
logical,intent(out) :: doRHF,doUHF,doMOM
|
logical,intent(out) :: doRHF,doUHF,doMOM
|
||||||
logical,intent(out) :: doMP2,doMP3,doMP2F12
|
logical,intent(out) :: doMP2,doMP3,doMP2F12
|
||||||
logical,intent(out) :: doCCD,doCCSD,doCCSDT
|
logical,intent(out) :: doCCD,doCCSD,doCCSDT
|
||||||
logical,intent(out) :: doCIS,doTDHF,doppRPA,doADC
|
logical,intent(out) :: doCIS,doRPA,doTDHF,doppRPA,doADC
|
||||||
logical,intent(out) :: doGF2,doGF3
|
logical,intent(out) :: doGF2,doGF3
|
||||||
logical,intent(out) :: doG0W0,doevGW,doqsGW
|
logical,intent(out) :: doG0W0,doevGW,doqsGW
|
||||||
logical,intent(out) :: doG0T0,doevGT,doqsGT
|
logical,intent(out) :: doG0T0,doevGT,doqsGT
|
||||||
@ -24,7 +25,7 @@ subroutine read_methods(doRHF,doUHF,doMOM, &
|
|||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
|
|
||||||
character(len=1) :: answer1,answer2,answer3,answer4
|
character(len=1) :: answer1,answer2,answer3,answer4,answer5
|
||||||
|
|
||||||
! Open file with method specification
|
! Open file with method specification
|
||||||
|
|
||||||
@ -45,6 +46,7 @@ subroutine read_methods(doRHF,doUHF,doMOM, &
|
|||||||
doCCSDT = .false.
|
doCCSDT = .false.
|
||||||
|
|
||||||
doCIS = .false.
|
doCIS = .false.
|
||||||
|
doRPA = .false.
|
||||||
doTDHF = .false.
|
doTDHF = .false.
|
||||||
doppRPA = .false.
|
doppRPA = .false.
|
||||||
doADC = .false.
|
doADC = .false.
|
||||||
@ -89,11 +91,12 @@ subroutine read_methods(doRHF,doUHF,doMOM, &
|
|||||||
! Read excited state methods
|
! Read excited state methods
|
||||||
|
|
||||||
read(1,*)
|
read(1,*)
|
||||||
read(1,*) answer1,answer2,answer3,answer4
|
read(1,*) answer1,answer2,answer3,answer4,answer5
|
||||||
if(answer1 == 'T') doCIS = .true.
|
if(answer1 == 'T') doCIS = .true.
|
||||||
if(answer2 == 'T') doTDHF = .true.
|
if(answer2 == 'T') doRPA = .true.
|
||||||
if(answer3 == 'T') doppRPA = .true.
|
if(answer3 == 'T') doTDHF = .true.
|
||||||
if(answer4 == 'T') doADC = .true.
|
if(answer4 == 'T') doppRPA = .true.
|
||||||
|
if(answer5 == 'T') doADC = .true.
|
||||||
|
|
||||||
! Read Green function methods
|
! Read Green function methods
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user