diff --git a/input/methods b/input/methods index 688d56a..3560ea4 100644 --- a/input/methods +++ b/input/methods @@ -7,15 +7,15 @@ # drCCD rCCD crCCD lCCD F F F F # CIS* CIS(D) CID CISD FCI - F F F F F + T F F F F # RPA* RPAx* crRPA ppRPA - F F F F + F T F F # G0F2* evGF2* qsGF2* G0F3 evGF3 F F F F F # G0W0* evGW* qsGW* ufG0W0 ufGW T F F F F # G0T0 evGT qsGT - T F F + F F F # MCMP2 F # * unrestricted version available diff --git a/input/options b/input/options index 6bc78e4..f9037df 100644 --- a/input/options +++ b/input/options @@ -14,7 +14,7 @@ 10 0.00001 T 5 T 0.0 F F # ACFDT: AC Kx XBS F T T -# BSE: BSE dBSE dTDA evDyn ppBSE - F F T F F +# BSE: BSE dBSE dTDA evDyn ppBSE BSE2 + T F T F F T # MCMP2: nMC nEq nWalk dt nPrint iSeed doDrift 1000000 100000 10 0.3 10000 1234 T diff --git a/mol/h2.xyz b/mol/h2.xyz index 2a6dce9..3f90e9e 100644 --- a/mol/h2.xyz +++ b/mol/h2.xyz @@ -1,4 +1,4 @@ 2 H 0. 0. 0. -H 0. 0. 0.7 +H 0. 0. 0.740848 diff --git a/src/GW/BSE2_static_kernel.f90 b/src/GW/BSE2_static_kernel.f90 deleted file mode 100644 index 32d7be3..0000000 --- a/src/GW/BSE2_static_kernel.f90 +++ /dev/null @@ -1,123 +0,0 @@ -subroutine BSE2_static_kernel(eta,nBas,nC,nO,nV,nR,nS,lambda,eW,ERI,Om,rho,A_sta) - -! Compute the second-order static BSE kernel (only for singlets!) - - implicit none - include 'parameters.h' - -! Input variables - - double precision,intent(in) :: eta - 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) :: lambda - - double precision,intent(in) :: ERI(nBas,nBas,nBas,nBas) - double precision,intent(in) :: eW(nBas) - double precision,intent(in) :: Om(nS) - - double precision,intent(in) :: rho(nBas,nBas,nS) - - -! Local variables - - double precision :: chi - integer :: p,q,r,s - integer :: m - - double precision :: dem,num - integer :: i,j,k,l - integer :: a,b,c,d - integer :: ia,jb - - double precision,allocatable :: W(:,:,:,:) - -! Output variables - - double precision,intent(inout) :: A_sta(nS,nS) - -! memory allocation - - allocate(W(nBas,nBas,nBas,nBas)) - -!------------------------------------------------ -! Compute static screening (physicist's notation) -!------------------------------------------------ - - do p=1,nBas - do q=1,nBas - do r=1,nBas - do s=1,nBas - - chi = 0d0 - do m=1,nS - dem = Om(m)**2 + eta**2 - chi = chi + rho(p,q,m)*rho(r,s,m)*Om(m)/dem - enddo - - W(p,s,q,r) = - ERI(p,s,q,r) + 4d0*chi - - enddo - enddo - enddo - enddo - - ia = 0 - do i=nC+1,nO - do a=nO+1,nBas-nR - ia = ia + 1 - - jb = 0 - do j=nC+1,nO - do b=nO+1,nBas-nR - jb = jb + 1 - - do k=nC+1,nO - do c=nO+1,nBas-nR - - dem = - (eW(c) - eW(k)) - num = 2d0*W(j,k,i,c)*W(a,c,b,k) - - A_sta(ia,jb) = A_sta(ia,jb) - num*dem/(dem**2 + eta**2) - - dem = + (eW(c) - eW(k)) - num = 2d0*W(j,c,i,k)*W(a,k,b,c) - - A_sta(ia,jb) = A_sta(ia,jb) + num*dem/(dem**2 + eta**2) - - end do - end do - - do c=nO+1,nBas-nR - do d=nO+1,nBas-nR - - dem = - (eW(c) + eW(d)) - num = 2d0*W(a,j,c,d)*W(c,d,i,b) - - A_sta(ia,jb) = A_sta(ia,jb) + num*dem/(dem**2 + eta**2) - - end do - end do - - do k=nC+1,nO - do l=nC+1,nO - - dem = - (eW(k) + eW(l)) - num = 2d0*W(a,j,k,l)*W(k,l,i,b) - - A_sta(ia,jb) = A_sta(ia,jb) - num*dem/(dem**2 + eta**2) - - end do - end do - - end do - end do - - end do - end do - -end subroutine BSE2_static_kernel diff --git a/src/GW/Bethe_Salpeter.f90 b/src/GW/Bethe_Salpeter.f90 index 0fc3f57..77c9360 100644 --- a/src/GW/Bethe_Salpeter.f90 +++ b/src/GW/Bethe_Salpeter.f90 @@ -46,6 +46,10 @@ subroutine Bethe_Salpeter(BSE2,TDA_W,TDA,dBSE,dTDA,evDyn,singlet,triplet,eta,nBa double precision,allocatable :: KA_sta(:,:) double precision,allocatable :: KB_sta(:,:) + double precision,allocatable :: W(:,:,:,:) + double precision,allocatable :: KA2_sta(:,:) + double precision,allocatable :: KB2_sta(:,:) + ! Output variables double precision,intent(out) :: EcBSE(nspin) @@ -78,13 +82,25 @@ subroutine Bethe_Salpeter(BSE2,TDA_W,TDA,dBSE,dTDA,evDyn,singlet,triplet,eta,nBa ispin = 1 EcBSE(ispin) = 0d0 - ! Second-order BSE staic kernel - - if(BSE2) call BSE2_static_kernel(eta,nBas,nC,nO,nV,nR,nS,1d0,eW,ERI,OmRPA,rho_RPA,KA_sta) + ! Second-order BSE static kernel + allocate(W(nBas,nBas,nBas,nBas),KA2_sta(nS,nS),KB2_sta(nS,nS)) + KA2_sta(:,:) = 0d0 + KB2_sta(:,:) = 0d0 + + if(BSE2) then + + write(*,*) '*** Second-order BSE static kernel activated! ***' + call static_kernel_W(eta,nBas,nC,nO,nV,nR,nS,1d0,ERI,OmRPA,rho_RPA,W) + call BSE2_static_kernel_KA(eta,nBas,nC,nO,nV,nR,nS,1d0,eW,W,KA2_sta) + + if(.not.TDA) call BSE2_static_kernel_KB(eta,nBas,nC,nO,nV,nR,nS,1d0,eW,W,KB2_sta) + + end if + ! Compute BSE excitation energies - call linear_response_BSE(ispin,.true.,TDA,.true.,eta,nBas,nC,nO,nV,nR,nS,1d0,eGW,ERI,KA_sta,KB_sta, & + call linear_response_BSE(ispin,.true.,TDA,.true.,eta,nBas,nC,nO,nV,nR,nS,1d0,eGW,ERI,KA_sta-KA2_sta,KB_sta-KB2_sta, & EcBSE(ispin),OmBSE(:,ispin),XpY_BSE(:,:,ispin),XmY_BSE(:,:,ispin)) call print_excitation('BSE@GW ',ispin,nS,OmBSE(:,ispin)) call print_transition_vectors(.true.,nBas,nC,nO,nV,nR,nS,dipole_int, &