From d24b729fc32d70e15263761b326e0f019dc29dab Mon Sep 17 00:00:00 2001 From: Pierre-Francois Loos Date: Thu, 16 Dec 2021 15:19:44 +0100 Subject: [PATCH] regularized GW --- input/methods | 8 +- input/options | 2 +- src/MBPT/evGW.f90 | 2 + src/MBPT/qsGW.f90 | 2 + .../regularized_self_energy_correlation.f90 | 126 ++++++++++++++++++ ...gularized_self_energy_correlation_diag.f90 | 6 +- 6 files changed, 138 insertions(+), 8 deletions(-) create mode 100644 src/MBPT/regularized_self_energy_correlation.f90 diff --git a/input/methods b/input/methods index c1c696e..02ac24b 100644 --- a/input/methods +++ b/input/methods @@ -1,7 +1,7 @@ # RHF UHF KS MOM - F T F F + T F F F # MP2* MP3 MP2-F12 - T F F + F F F # CCD pCCD DCD CCSD CCSD(T) F F F F F # drCCD rCCD crCCD lCCD @@ -9,11 +9,11 @@ # CIS* CIS(D) CID CISD FCI F F F F F # RPA* RPAx* crRPA ppRPA - F F F T + F F F F # G0F2* evGF2* qsGF2* G0F3 evGF3 F F F F F # G0W0* evGW* qsGW* ufG0W0 ufGW - F F F F F + F F T F F # G0T0 evGT qsGT F F F # MCMP2 diff --git a/input/options b/input/options index d6745cf..f8f9987 100644 --- a/input/options +++ b/input/options @@ -9,7 +9,7 @@ # GF: maxSCF thresh DIIS n_diis lin eta renorm 256 0.00001 T 5 T 0.00367493 3 # GW/GT: maxSCF thresh DIIS n_diis lin eta COHSEX SOSEX TDA_W G0W GW0 - 256 0.00001 T 15 T 0.00367493 F F F F F + 256 0.00001 T 5 T 0.0 F F F F F # ACFDT: AC Kx XBS F F F # BSE: BSE dBSE dTDA evDyn diff --git a/src/MBPT/evGW.f90 b/src/MBPT/evGW.f90 index 9a74734..c25f9ab 100644 --- a/src/MBPT/evGW.f90 +++ b/src/MBPT/evGW.f90 @@ -161,11 +161,13 @@ subroutine evGW(maxSCF,thresh,max_diis,doACFDT,exchange_kernel,doXBS,COHSEX,BSE, if(G0W) then +! call regularized_self_energy_correlation_diag(COHSEX,eta,nBas,nC,nO,nV,nR,nS,eHF,OmRPA,rho_RPA,EcGM,SigC) call self_energy_correlation_diag(COHSEX,eta,nBas,nC,nO,nV,nR,nS,eHF,OmRPA,rho_RPA,EcGM,SigC) call renormalization_factor(COHSEX,eta,nBas,nC,nO,nV,nR,nS,eHF,OmRPA,rho_RPA,Z) else +! call regularized_self_energy_correlation_diag(COHSEX,eta,nBas,nC,nO,nV,nR,nS,eGW,OmRPA,rho_RPA,EcGM,SigC) call self_energy_correlation_diag(COHSEX,eta,nBas,nC,nO,nV,nR,nS,eGW,OmRPA,rho_RPA,EcGM,SigC) call renormalization_factor(COHSEX,eta,nBas,nC,nO,nV,nR,nS,eGW,OmRPA,rho_RPA,Z) diff --git a/src/MBPT/qsGW.f90 b/src/MBPT/qsGW.f90 index d6bc2bb..2b7b289 100644 --- a/src/MBPT/qsGW.f90 +++ b/src/MBPT/qsGW.f90 @@ -192,11 +192,13 @@ subroutine qsGW(maxSCF,thresh,max_diis,doACFDT,exchange_kernel,doXBS,COHSEX,BSE, if(G0W) then +! call regularized_self_energy_correlation(COHSEX,eta,nBas,nC,nO,nV,nR,nS,eHF,OmRPA,rho_RPA,EcGM,SigC) call self_energy_correlation(COHSEX,eta,nBas,nC,nO,nV,nR,nS,eHF,OmRPA,rho_RPA,EcGM,SigC) call renormalization_factor(COHSEX,eta,nBas,nC,nO,nV,nR,nS,eHF,OmRPA,rho_RPA,Z) else +! call regularized_self_energy_correlation(COHSEX,eta,nBas,nC,nO,nV,nR,nS,eGW,OmRPA,rho_RPA,EcGM,SigC) call self_energy_correlation(COHSEX,eta,nBas,nC,nO,nV,nR,nS,eGW,OmRPA,rho_RPA,EcGM,SigC) call renormalization_factor(COHSEX,eta,nBas,nC,nO,nV,nR,nS,eGW,OmRPA,rho_RPA,Z) diff --git a/src/MBPT/regularized_self_energy_correlation.f90 b/src/MBPT/regularized_self_energy_correlation.f90 new file mode 100644 index 0000000..1a56dcd --- /dev/null +++ b/src/MBPT/regularized_self_energy_correlation.f90 @@ -0,0 +1,126 @@ +subroutine regularized_self_energy_correlation(COHSEX,eta,nBas,nC,nO,nV,nR,nS,e,Omega,rho,EcGM,SigC) + +! Compute correlation part of the regularized self-energy + + implicit none + include 'parameters.h' + +! Input variables + + logical,intent(in) :: COHSEX + double precision,intent(in) :: eta + integer,intent(in) :: nBas,nC,nO,nV,nR,nS + double precision,intent(in) :: e(nBas) + double precision,intent(in) :: Omega(nS) + double precision,intent(in) :: rho(nBas,nBas,nS) + +! Local variables + + integer :: i,j,a,b + integer :: p,q,r + integer :: jb + double precision :: eps + + double precision :: kappa + double precision :: fk + +! Output variables + + double precision,intent(out) :: SigC(nBas,nBas) + double precision,intent(out) :: EcGM + +! Initialize + + SigC(:,:) = 0d0 + +!---------------------------------------------! +! Parameters for regularized MP2 calculations ! +!---------------------------------------------! + + kappa = 1.1d0 + +!-----------------------------! +! COHSEX static approximation ! +!-----------------------------! + + if(COHSEX) then + + ! COHSEX: SEX of the COHSEX correlation self-energy + + do p=nC+1,nBas-nR + do q=nC+1,nBas-nR + do i=nC+1,nO + do jb=1,nS + SigC(p,q) = SigC(p,q) + 4d0*rho(p,i,jb)*rho(q,i,jb)/Omega(jb) + end do + end do + end do + end do + + ! COHSEX: COH part of the COHSEX correlation self-energy + + do p=nC+1,nBas-nR + do q=nC+1,nBas-nR + do r=nC+1,nBas-nR + do jb=1,nS + SigC(p,q) = SigC(p,q) - 2d0*rho(p,r,jb)*rho(q,r,jb)/Omega(jb) + end do + end do + end do + end do + + EcGM = 0d0 + do i=nC+1,nO + EcGM = EcGM + 0.5d0*SigC(i,i) + end do + + else + +!----------------! +! GW self-energy ! +!----------------! + + ! Occupied part of the correlation self-energy + + do p=nC+1,nBas-nR + do q=nC+1,nBas-nR + do i=nC+1,nO + do jb=1,nS + eps = e(p) - e(i) + Omega(jb) + fk = (1d0 - exp(-kappa*abs(eps)))**2/eps + SigC(p,q) = SigC(p,q) + 2d0*rho(p,i,jb)*rho(q,i,jb)*fk + end do + end do + end do + end do + + ! Virtual part of the correlation self-energy + + do p=nC+1,nBas-nR + do q=nC+1,nBas-nR + do a=nO+1,nBas-nR + do jb=1,nS + eps = e(p) - e(a) - Omega(jb) + fk = (1d0 - exp(-kappa*abs(eps)))**2/eps + SigC(p,q) = SigC(p,q) + 2d0*rho(p,a,jb)*rho(q,a,jb)*fk + end do + end do + end do + end do + + ! GM correlation energy + + EcGM = 0d0 + do i=nC+1,nO + do a=nO+1,nBas-nR + do jb=1,nS + eps = e(a) - e(i) + Omega(jb) + fk = (1d0 - exp(-kappa*abs(eps)))**2/eps + EcGM = EcGM - 4d0*rho(a,i,jb)**2*fk + end do + end do + end do + + end if + +end subroutine regularized_self_energy_correlation diff --git a/src/MBPT/regularized_self_energy_correlation_diag.f90 b/src/MBPT/regularized_self_energy_correlation_diag.f90 index d0dba7d..ec7bb5f 100644 --- a/src/MBPT/regularized_self_energy_correlation_diag.f90 +++ b/src/MBPT/regularized_self_energy_correlation_diag.f90 @@ -88,7 +88,7 @@ subroutine regularized_self_energy_correlation_diag(COHSEX,eta,nBas,nC,nO,nV,nR, do i=nC+1,nO do jb=1,nS eps = e(p) - e(i) + Omega(jb) - fk = (1d0 - exp(-kappa*eps))**2/eps + fk = (1d0 - exp(-kappa*abs(eps)))**2/eps SigC(p) = SigC(p) + 2d0*rho(p,i,jb)**2*fk end do end do @@ -100,7 +100,7 @@ subroutine regularized_self_energy_correlation_diag(COHSEX,eta,nBas,nC,nO,nV,nR, do a=nO+1,nBas-nR do jb=1,nS eps = e(p) - e(a) - Omega(jb) - fk = (1d0 - exp(-kappa*eps))**2/eps + fk = (1d0 - exp(-kappa*abs(eps)))**2/eps SigC(p) = SigC(p) + 2d0*rho(p,a,jb)**2*fk end do end do @@ -113,7 +113,7 @@ subroutine regularized_self_energy_correlation_diag(COHSEX,eta,nBas,nC,nO,nV,nR, do a=nO+1,nBas-nR do jb=1,nS eps = e(a) - e(i) + Omega(jb) - fk = (1d0 - exp(-kappa*eps))**2/eps + fk = (1d0 - exp(-kappa*abs(eps)))**2/eps EcGM = EcGM - 4d0*rho(a,i,jb)**2*fk end do end do