10
1
mirror of https://github.com/pfloos/quack synced 2024-09-27 20:11:05 +02:00
QuAcK/src/MP/RMP2.f90

183 lines
5.7 KiB
Fortran
Raw Normal View History

2023-11-11 23:00:00 +01:00
subroutine RMP2(dotest,regularize,nBas,nC,nO,nV,nR,ERI,ENuc,ERHF,eHF,EcMP2)
2019-03-19 10:13:33 +01:00
2021-12-16 14:24:02 +01:00
! Perform second-order Moller-Plesset calculation with and without regularizers
2019-03-19 10:13:33 +01:00
implicit none
! Input variables
2023-11-11 23:00:00 +01:00
logical,intent(in) :: dotest
logical,intent(in) :: regularize
2021-03-03 11:37:46 +01:00
integer,intent(in) :: nBas
integer,intent(in) :: nC
integer,intent(in) :: nO
integer,intent(in) :: nV
integer,intent(in) :: nR
double precision,intent(in) :: ENuc
2023-11-11 21:43:35 +01:00
double precision,intent(in) :: ERHF
double precision,intent(in) :: eHF(nBas)
2021-03-03 11:37:46 +01:00
double precision,intent(in) :: ERI(nBas,nBas,nBas,nBas)
2019-03-19 10:13:33 +01:00
! Local variables
integer :: i,j,a,b
2021-12-16 14:24:02 +01:00
double precision :: kappa,sigm1,sigm2
double precision :: Dijab
double precision :: fs,fs2,fk
double precision :: E2d,E2ds,E2ds2,E2dk
double precision :: E2x,E2xs,E2xs2,E2xk
double precision :: EcsMP2,Ecs2MP2,EckMP2
2019-03-19 10:13:33 +01:00
! Output variables
2023-10-27 13:35:10 +02:00
double precision,intent(out) :: EcMP2
2019-03-19 10:13:33 +01:00
! Hello world
write(*,*)
2023-11-11 23:00:00 +01:00
write(*,*)'******************************'
write(*,*)'* Restricted MP2 Calculation *'
write(*,*)'******************************'
2019-03-19 10:13:33 +01:00
write(*,*)
2021-12-16 14:24:02 +01:00
!---------------------------------------------!
! Parameters for regularized MP2 calculations !
!---------------------------------------------!
kappa = 1.1d0
sigm1 = 0.7d0
sigm2 = 0.4d0
!--------------------------------------------------!
! Compute conventinal and regularized MP2 energies !
!--------------------------------------------------!
E2d = 0d0
E2ds = 0d0
E2ds2 = 0d0
E2dk = 0d0
E2x = 0d0
E2xs = 0d0
E2xs2 = 0d0
E2xk = 0d0
2019-03-19 10:13:33 +01:00
do i=nC+1,nO
2021-12-16 14:24:02 +01:00
do j=nC+1,nO
do a=nO+1,nBas-nR
do b=nO+1,nBas-nR
2019-03-19 10:13:33 +01:00
2023-11-11 21:43:35 +01:00
Dijab = eHF(a) + eHF(b) - eHF(i) - eHF(j)
2019-03-19 10:13:33 +01:00
2021-12-16 14:24:02 +01:00
! Second-order ring diagram
2019-03-19 10:13:33 +01:00
2021-12-16 14:47:13 +01:00
fs = (1d0 - exp(-sigm1*Dijab))/Dijab
fs2 = (1d0 - exp(-sigm2*Dijab*Dijab))/Dijab
fk = (1d0 - exp(-kappa*Dijab))**2/Dijab
2019-03-19 10:13:33 +01:00
2021-12-16 14:24:02 +01:00
E2d = E2d - ERI(i,j,a,b)*ERI(i,j,a,b)/Dijab
E2ds = E2ds - ERI(i,j,a,b)*ERI(i,j,a,b)*fs
E2ds2 = E2ds2 - ERI(i,j,a,b)*ERI(i,j,a,b)*fs2
E2dk = E2dk - ERI(i,j,a,b)*ERI(i,j,a,b)*fk
2019-03-19 10:13:33 +01:00
2021-12-16 14:24:02 +01:00
! Second-order exchange diagram
2019-03-19 10:13:33 +01:00
2021-12-16 14:24:02 +01:00
E2x = E2x - ERI(i,j,a,b)*ERI(i,j,b,a)/Dijab
E2xs = E2xs - ERI(i,j,a,b)*ERI(i,j,b,a)*fs
E2xs2 = E2xs2 - ERI(i,j,a,b)*ERI(i,j,b,a)*fs2
E2xk = E2xk - ERI(i,j,a,b)*ERI(i,j,b,a)*fk
2023-12-03 18:47:30 +01:00
end do
end do
end do
end do
2019-03-19 10:13:33 +01:00
2021-12-16 14:24:02 +01:00
EcMP2 = 2d0*E2d - E2x
EcsMP2 = 2d0*E2ds - E2xs
Ecs2MP2 = 2d0*E2ds2 - E2xs2
EckMP2 = 2d0*E2dk - E2xk
!------------!
! MP2 energy !
!------------!
2019-03-19 10:13:33 +01:00
write(*,*)
2020-01-15 22:29:43 +01:00
write(*,'(A32)') '--------------------------'
write(*,'(A32)') ' MP2 calculation '
write(*,'(A32)') '--------------------------'
2021-03-23 19:50:46 +01:00
write(*,'(A32,1X,F16.10)') ' MP2 correlation energy = ',EcMP2
2021-12-16 14:24:02 +01:00
write(*,'(A32,1X,F16.10)') ' Direct part = ',2d0*E2d
write(*,'(A32,1X,F16.10)') ' Exchange part = ',-E2x
2020-01-15 22:29:43 +01:00
write(*,'(A32)') '--------------------------'
2023-11-11 21:43:35 +01:00
write(*,'(A32,1X,F16.10)') ' MP2 electronic energy = ',ERHF + EcMP2
write(*,'(A32,1X,F16.10)') ' MP2 total energy = ',ENuc + ERHF + EcMP2
2020-01-15 22:29:43 +01:00
write(*,'(A32)') '--------------------------'
2019-03-19 10:13:33 +01:00
write(*,*)
if(regularize) then
2021-12-16 14:24:02 +01:00
!-------------------!
! sigma1-MP2 energy !
!-------------------!
write(*,*)
write(*,'(A32)') '--------------------------'
write(*,'(A32)') ' sigma-MP2 calculation '
write(*,'(A32)') '--------------------------'
write(*,'(A32,1X,F16.10)') ' MP2 correlation energy = ',EcsMP2
write(*,'(A32,1X,F16.10)') ' Direct part = ',2d0*E2ds
write(*,'(A32,1X,F16.10)') ' Exchange part = ',-E2xs
write(*,'(A32)') '--------------------------'
2023-11-11 21:43:35 +01:00
write(*,'(A32,1X,F16.10)') ' MP2 electronic energy = ',ERHF + EcsMP2
write(*,'(A32,1X,F16.10)') ' MP2 total energy = ',ENuc + ERHF + EcsMP2
write(*,'(A32)') '--------------------------'
write(*,*)
2021-12-16 14:24:02 +01:00
!--------------------!
! sigma^2-MP2 energy !
!--------------------!
write(*,*)
write(*,'(A32)') '--------------------------'
write(*,'(A32)') ' sigma^2-MP2 calculation '
write(*,'(A32)') '--------------------------'
write(*,'(A32,1X,F16.10)') ' MP2 correlation energy = ',Ecs2MP2
write(*,'(A32,1X,F16.10)') ' Direct part = ',2d0*E2ds2
write(*,'(A32,1X,F16.10)') ' Exchange part = ',-E2xs2
write(*,'(A32)') '--------------------------'
2023-11-11 21:43:35 +01:00
write(*,'(A32,1X,F16.10)') ' MP2 electronic energy = ',ERHF + Ecs2MP2
write(*,'(A32,1X,F16.10)') ' MP2 total energy = ',ENuc + ERHF + Ecs2MP2
write(*,'(A32)') '--------------------------'
write(*,*)
2021-12-16 14:24:02 +01:00
!------------------!
! kappa-MP2 energy !
!------------------!
write(*,*)
write(*,'(A32)') '--------------------------'
write(*,'(A32)') ' kappa-MP2 calculation '
write(*,'(A32)') '--------------------------'
write(*,'(A32,1X,F16.10)') ' MP2 correlation energy = ',EckMP2
write(*,'(A32,1X,F16.10)') ' Direct part = ',2d0*E2dk
write(*,'(A32,1X,F16.10)') ' Exchange part = ',-E2xk
write(*,'(A32)') '--------------------------'
2023-11-11 21:43:35 +01:00
write(*,'(A32,1X,F16.10)') ' MP2 electronic energy = ',ERHF + EckMP2
write(*,'(A32,1X,F16.10)') ' MP2 total energy = ',ENuc + ERHF + EckMP2
write(*,'(A32)') '--------------------------'
write(*,*)
end if
2021-12-16 14:24:02 +01:00
2023-11-11 23:00:00 +01:00
if(dotest) then
2023-11-14 14:31:27 +01:00
call dump_test_value('R','MP2 correlation energy',EcMP2)
2023-11-11 23:00:00 +01:00
end if
2023-07-17 14:50:16 +02:00
end subroutine