Skip to content

Commit bb3617e

Browse files
author
lburth
committed
qsGW @ MOM reference
1 parent bc0d296 commit bb3617e

File tree

4 files changed

+769
-1
lines changed

4 files changed

+769
-1
lines changed

src/GW/CVS_UGW_SRG_self_energy.f90

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
subroutine CVS_UGW_SRG_self_energy(flow,nBas,nC,nO,nV,nR,nS,nCVS,nFC,occupations,virtuals,e,Om,rho,EcGM,SigC,Z)
2+
3+
! Compute correlation part of the self-energy
4+
5+
implicit none
6+
include 'parameters.h'
7+
8+
! Input variables
9+
10+
double precision,intent(in) :: flow
11+
integer,intent(in) :: nBas
12+
integer,intent(in) :: nC(nspin)
13+
integer,intent(in) :: nO(nspin)
14+
integer,intent(in) :: nV(nspin)
15+
integer,intent(in) :: nR(nspin)
16+
integer,intent(in) :: nS
17+
double precision,intent(in) :: e(nBas,nspin)
18+
double precision,intent(in) :: Om(nS)
19+
double precision,intent(in) :: rho(nBas,nBas,nS,nspin)
20+
integer,intent(in) :: nCVS(nspin)
21+
integer,intent(in) :: nFC(nspin)
22+
integer,intent(in) :: occupations(maxval(nO-nFC),nspin)
23+
integer,intent(in) :: virtuals(nBas-minval(nO),nspin)
24+
25+
! Local variables
26+
27+
integer :: ispin
28+
integer :: i,j,a,b
29+
integer :: p,q
30+
integer :: m
31+
double precision :: Dpim,Dqim,Dpam,Dqam,Diam
32+
double precision :: s
33+
34+
! Output variables
35+
36+
double precision,intent(out) :: EcGM
37+
double precision,intent(out) :: SigC(nBas,nBas,nspin)
38+
double precision,intent(out) :: Z(nBas,nspin)
39+
40+
! SRG flow parameter
41+
42+
s = flow
43+
44+
! Initialize
45+
46+
SigC(:,:,:) = 0d0
47+
48+
!--------------------!
49+
! SRG-GW self-energy !
50+
!--------------------!
51+
52+
! Occupied part of the correlation self-energy
53+
54+
!$OMP PARALLEL &
55+
!$OMP SHARED(SigC,rho,s,nS,nC,nO,nBas,nR,e,Om,nFC,occupations) &
56+
!$OMP PRIVATE(ispin,m,i,q,p,Dpim,Dqim) &
57+
!$OMP DEFAULT(NONE)
58+
!$OMP DO
59+
do ispin=1,nspin
60+
do q=1,nBas
61+
do p=1,nBas
62+
do m=1,nS
63+
do i=1,nO(ispin)-nFC(ispin)
64+
65+
Dpim = e(p,ispin) - e(occupations(i,ispin),ispin) + Om(m)
66+
Dqim = e(q,ispin) - e(occupations(i,ispin),ispin) + Om(m)
67+
SigC(p,q,ispin) = SigC(p,q,ispin) &
68+
+ rho(p,occupations(i,ispin),m,ispin)*rho(q,occupations(i,ispin),m,ispin)*(1d0-dexp(-s*Dpim*Dpim)*dexp(-s*Dqim*Dqim)) &
69+
*(Dpim + Dqim)/(Dpim*Dpim + Dqim*Dqim)
70+
71+
end do
72+
end do
73+
end do
74+
end do
75+
end do
76+
!$OMP END DO
77+
!$OMP END PARALLEL
78+
79+
! Virtual part of the correlation self-energy
80+
81+
!$OMP PARALLEL &
82+
!$OMP SHARED(SigC,rho,s,nS,nC,nO,nR,nBas,e,Om,nCVS,virtuals) &
83+
!$OMP PRIVATE(ispin,m,a,q,p,Dpam,Dqam) &
84+
!$OMP DEFAULT(NONE)
85+
!$OMP DO
86+
do ispin=1,nspin
87+
do q=1,nBas
88+
do p=1,nBas
89+
do m=1,nS
90+
do a=nCVS(ispin)+1,nBas-nO(ispin)
91+
92+
Dpam = e(p,ispin) - e(virtuals(a,ispin),ispin) - Om(m)
93+
Dqam = e(q,ispin) - e(virtuals(a,ispin),ispin) - Om(m)
94+
SigC(p,q,ispin) = SigC(p,q,ispin) &
95+
+ rho(p,virtuals(a,ispin),m,ispin)*rho(q,virtuals(a,ispin),m,ispin)*(1d0-exp(-s*Dpam*Dpam)*exp(-s*Dqam*Dqam)) &
96+
*(Dpam + Dqam)/(Dpam*Dpam + Dqam*Dqam)
97+
98+
end do
99+
end do
100+
end do
101+
end do
102+
end do
103+
!$OMP END DO
104+
!$OMP END PARALLEL
105+
106+
!------------------------!
107+
! Renormalization factor !
108+
!------------------------!
109+
110+
Z(:,:) = 0d0
111+
112+
! Occupied part of the renormalization factor
113+
114+
do ispin=1,nspin
115+
do p=1,nBas
116+
do i=1,nO(ispin)-nFC(ispin)
117+
do m=1,nS
118+
Dpim = e(p,ispin) - e(occupations(i,ispin),ispin) + Om(m)
119+
Z(p,ispin) = Z(p,ispin) - rho(p,occupations(i,ispin),m,ispin)**2*(1d0-dexp(-2d0*s*Dpim*Dpim))/Dpim**2
120+
end do
121+
end do
122+
end do
123+
end do
124+
125+
! Virtual part of the renormalization factor
126+
127+
do ispin=1,nspin
128+
do p=1,nBas
129+
do a=nCVS(ispin)+1,nBas-nO(ispin)
130+
do m=1,nS
131+
Dpam = e(p,ispin) - e(virtuals(a,ispin),ispin) - Om(m)
132+
Z(p,ispin) = Z(p,ispin) - rho(p,virtuals(a,ispin),m,ispin)**2*(1d0-dexp(-2d0*s*Dpam*Dpam))/Dpam**2
133+
end do
134+
end do
135+
end do
136+
end do
137+
138+
Z(:,:) = 1d0/(1d0 - Z(:,:))
139+
140+
!-------------------------------------!
141+
! Galitskii-Migdal correlation energy !
142+
!-------------------------------------!
143+
144+
EcGM = 0d0
145+
do ispin=1,nspin
146+
do i=1,nO(ispin)-nFC(ispin)
147+
do a=nCVS(ispin)+1,nBas-nO(ispin)
148+
do m=1,nS
149+
Diam = e(virtuals(a,ispin),ispin) - e(occupations(i,ispin),ispin) + Om(m)
150+
EcGM = EcGM - rho(virtuals(a,ispin),occupations(i,ispin),m,ispin)*rho(virtuals(a,ispin),occupations(i,ispin),m,ispin)*(1d0-exp(-2d0*s*Diam*Diam))/Diam
151+
end do
152+
end do
153+
end do
154+
end do
155+
156+
end subroutine

src/GW/CVS_UGW_self_energy.f90

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
subroutine CVS_UGW_self_energy(eta,nBas,nC,nO,nV,nR,nSt,nCVS,nFC,occupations,virtuals,e,Om,rho,EcGM,Sig,Z)
2+
3+
! Compute diagonal of the correlation part of the self-energy
4+
5+
implicit none
6+
include 'parameters.h'
7+
8+
! Input variables
9+
10+
double precision,intent(in) :: eta
11+
integer,intent(in) :: nBas
12+
integer,intent(in) :: nC(nspin)
13+
integer,intent(in) :: nO(nspin)
14+
integer,intent(in) :: nV(nspin)
15+
integer,intent(in) :: nR(nspin)
16+
integer,intent(in) :: nSt
17+
double precision,intent(in) :: e(nBas,nspin)
18+
double precision,intent(in) :: Om(nSt)
19+
double precision,intent(in) :: rho(nBas,nBas,nSt,nspin)
20+
integer,intent(in) :: nCVS(nspin)
21+
integer,intent(in) :: nFC(nspin)
22+
integer,intent(in) :: occupations(maxval(nO-nFC),nspin)
23+
integer,intent(in) :: virtuals(nBas-minval(nO),nspin)
24+
25+
! Local variables
26+
27+
integer :: i,a,p,q,m
28+
double precision :: num,eps
29+
30+
! Output variables
31+
32+
double precision,intent(out) :: Sig(nBas,nBas,nspin)
33+
double precision,intent(out) :: Z(nBas,nspin)
34+
double precision :: EcGM(nspin)
35+
36+
! Initialize
37+
38+
Sig(:,:,:) = 0d0
39+
Z(:,:) = 0d0
40+
EcGM(:) = 0d0
41+
42+
!--------------!
43+
! Spin-up part !
44+
!--------------!
45+
46+
! Occupied part of the correlation self-energy
47+
48+
do p=1,nBas
49+
do q=1,nBas
50+
do i=1,nO(1)-nFC(1)
51+
do m=1,nSt
52+
eps = e(p,1) - e(occupations(i,1),1) + Om(m)
53+
num = rho(p,occupations(i,1),m,1)*rho(q,occupations(i,1),m,1)
54+
Sig(p,q,1) = Sig(p,q,1) + num*eps/(eps**2 + eta**2)
55+
if(p == q) Z(p,1) = Z(p,1) - num*(eps**2 - eta**2)/(eps**2 + eta**2)**2
56+
end do
57+
end do
58+
end do
59+
end do
60+
61+
! Virtual part of the correlation self-energy
62+
63+
do p=1,nBas
64+
do q=1,nBas
65+
do a=nCVS(1)+1,nBas-nO(1)
66+
do m=1,nSt
67+
eps = e(p,1) - e(virtuals(a,1),1) - Om(m)
68+
num = rho(p,virtuals(a,1),m,1)*rho(q,virtuals(a,1),m,1)
69+
Sig(p,q,1) = Sig(p,q,1) + num*eps/(eps**2 + eta**2)
70+
if(p == q) Z(p,1) = Z(p,1) - num*(eps**2 - eta**2)/(eps**2 + eta**2)**2
71+
end do
72+
end do
73+
end do
74+
end do
75+
76+
! GM correlation energy
77+
78+
do i=1,nO(1)-nFC(1)
79+
do a=nCVS(1)+1,nBas-nO(1)
80+
do m=1,nSt
81+
eps = e(virtuals(a,1),1) - e(occupations(i,1),1) + Om(m)
82+
num = rho(virtuals(a,1),occupations(i,1),m,1)**2
83+
EcGM(1) = EcGM(1) - num*eps/(eps**2 + eta**2)
84+
end do
85+
end do
86+
end do
87+
88+
!----------------!
89+
! Spin-down part !
90+
!----------------!
91+
92+
! Occupied part of the correlation self-energy
93+
94+
do p=1,nBas
95+
do q=1,nBas
96+
do i=1,nO(2) - nFC(2)
97+
do m=1,nSt
98+
eps = e(p,2) - e(occupations(i,2),2) + Om(m)
99+
num = rho(p,occupations(i,2),m,2)*rho(q,occupations(i,2),m,2)
100+
Sig(p,q,2) = Sig(p,q,2) + num*eps/(eps**2 + eta**2)
101+
if(p == q) Z(p,2) = Z(p,2) - num*(eps**2 - eta**2)/(eps**2 + eta**2)**2
102+
end do
103+
end do
104+
end do
105+
end do
106+
107+
! Virtual part of the correlation self-energy
108+
109+
do p=1,nBas
110+
do q=1,nBas
111+
do a=nCVS(2)+1,nBas-nO(2)
112+
do m=1,nSt
113+
eps = e(p,2) - e(virtuals(a,2),2) - Om(m)
114+
num = rho(p,virtuals(a,2),m,2)*rho(q,virtuals(a,2),m,2)
115+
Sig(p,q,2) = Sig(p,q,2) + num*eps/(eps**2 + eta**2)
116+
if(p == q) Z(p,2) = Z(p,2) - num*(eps**2 - eta**2)/(eps**2 + eta**2)**2
117+
end do
118+
end do
119+
end do
120+
end do
121+
122+
! GM correlation energy
123+
124+
do i=1,nO(2)-nFC(2)
125+
do a=nCVS(2)+1,nBas-nO(2)
126+
do m=1,nSt
127+
eps = e(virtuals(a,2),2) - e(occupations(i,2),2) + Om(m)
128+
num = rho(virtuals(a,2),occupations(i,2),m,2)**2
129+
EcGM(2) = EcGM(2) - num*eps/(eps**2 + eta**2)
130+
end do
131+
end do
132+
end do
133+
134+
! Compute renormalization factor from derivative
135+
136+
Z(:,:) = 1d0/(1d0 - Z(:,:))
137+
138+
end subroutine

0 commit comments

Comments
 (0)