diff options
Diffstat (limited to 'src/labat/ggauc.f')
| -rw-r--r-- | src/labat/ggauc.f | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/src/labat/ggauc.f b/src/labat/ggauc.f new file mode 100644 index 0000000..f3adcf5 --- /dev/null +++ b/src/labat/ggauc.f | |||
| @@ -0,0 +1,96 @@ | |||
| 1 | subroutine ggauc(rs,zet,t,uu,vv,ww,ec,ecrs,eczet,dvcup,dvcdn) | ||
| 2 | c gga91 correlation | ||
| 3 | c input rs : seitz radius | ||
| 4 | c input zet : relative spin polarization | ||
| 5 | c input t : abs(grad d)/(d*2.*ks*g) | ||
| 6 | c input uu : (grad d)*grad(abs(grad d))/(d**2 * (2*ks*g)**3) | ||
| 7 | c input vv : (laplacian d)/(d * (2*ks*g)**2) | ||
| 8 | c input ww : (grad d)*(grad zet)/(d * (2*ks*g)**2 | ||
| 9 | c input ec : correlation energy | ||
| 10 | c input ecrs : derivative of ec with respect to rs | ||
| 11 | c input eczet : derivative of ec with respect to zet | ||
| 12 | c output dvcup,dvcdn : nonlocal parts of correlation potentials | ||
| 13 | implicit double precision (a-h,o-z) | ||
| 14 | data xnu,cc0,cx,alf/15.75592d0,0.004235d0,-0.001667212d0,0.09d0/ | ||
| 15 | data c1,c2,c3,c4/0.002568d0,0.023266d0,7.389d-6,8.723d0/ | ||
| 16 | data c5,c6,a4/0.472d0,7.389d-2,100.d0/ | ||
| 17 | data thrdm,thrd2/-0.333333333333d0,0.666666666667d0/ | ||
| 18 | pi = 4.d0*datan(1.d0) | ||
| 19 | fk = 1.91915829d0/rs | ||
| 20 | sk = dsqrt(4.d0*fk/pi) | ||
| 21 | g = ((1.d0+zet)**thrd2+(1.d0-zet)**thrd2)/2.d0 | ||
| 22 | bet = xnu*cc0 | ||
| 23 | delt = 2.d0*alf/bet | ||
| 24 | g3 = g**3 | ||
| 25 | g4 = g3*g | ||
| 26 | pon = -delt*ec/(g3*bet) | ||
| 27 | b = delt/(dexp(pon)-1.d0) | ||
| 28 | b2 = b*b | ||
| 29 | t2 = t*t | ||
| 30 | t4 = t2*t2 | ||
| 31 | t6 = t4*t2 | ||
| 32 | rs2 = rs*rs | ||
| 33 | rs3 = rs2*rs | ||
| 34 | q4 = 1.d0+b*t2 | ||
| 35 | q5 = 1.d0+b*t2+b2*t4 | ||
| 36 | q6 = c1+c2*rs+c3*rs2 | ||
| 37 | q7 = 1.d0+c4*rs+c5*rs2+c6*rs3 | ||
| 38 | cc = -cx + q6/q7 | ||
| 39 | r0 = (sk/fk)**2 | ||
| 40 | r1 = a4*r0*g4 | ||
| 41 | coeff = cc-cc0-3.d0*cx/7.d0 | ||
| 42 | r2 = xnu*coeff*g3 | ||
| 43 | r3 = dexp(-r1*t2) | ||
| 44 | h0 = g3*(bet/delt)*dlog(1.d0+delt*q4*t2/q5) | ||
| 45 | h1 = r3*r2*t2 | ||
| 46 | h = h0+h1 | ||
| 47 | c energy done. now the potential: | ||
| 48 | ccrs = (c2+2.*c3*rs)/q7 - q6*(c4+2.*c5*rs+3.*c6*rs2)/q7**2 | ||
| 49 | rsthrd = rs/3.d0 | ||
| 50 | r4 = rsthrd*ccrs/coeff | ||
| 51 | c========================================================= | ||
| 52 | c fix made by Tomas Holmquist | ||
| 53 | if ((zet.eq.1.d0).or.(zet.eq.-1.d0)) then | ||
| 54 | gz = 0.d0 | ||
| 55 | else | ||
| 56 | gz = ((1.d0+zet)**thrdm - (1.d0-zet)**thrdm)/3.d0 | ||
| 57 | endif | ||
| 58 | c========================================================= | ||
| 59 | fac = delt/b+1.d0 | ||
| 60 | bg = -3.d0*b2*ec*fac/(bet*g4) | ||
| 61 | bec = b2*fac/(bet*g3) | ||
| 62 | q8 = q5*q5+delt*q4*q5*t2 | ||
| 63 | q9 = 1.d0+2.d0*b*t2 | ||
| 64 | h0b = -bet*g3*b*t6*(2.d0+b*t2)/q8 | ||
| 65 | h0rs = -rsthrd*h0b*bec*ecrs | ||
| 66 | fact0 = 2.d0*delt-6.d0*b | ||
| 67 | fact1 = q5*q9+q4*q9*q9 | ||
| 68 | h0bt = 2.d0*bet*g3*t4*((q4*q5*fact0-delt*fact1)/q8)/q8 | ||
| 69 | h0rst = rsthrd*t2*h0bt*bec*ecrs | ||
| 70 | h0z = 3.d0*gz*h0/g + h0b*(bg*gz+bec*eczet) | ||
| 71 | h0t = 2.*bet*g3*q9/q8 | ||
| 72 | h0zt = 3.d0*gz*h0t/g+h0bt*(bg*gz+bec*eczet) | ||
| 73 | fact2 = q4*q5+b*t2*(q4*q9+q5) | ||
| 74 | fact3 = 2.d0*b*q5*q9+delt*fact2 | ||
| 75 | h0tt = 4.d0*bet*g3*t*(2.d0*b/q8-(q9*fact3/q8)/q8) | ||
| 76 | h1rs = r3*r2*t2*(-r4+r1*t2/3.d0) | ||
| 77 | fact4 = 2.d0-r1*t2 | ||
| 78 | h1rst = r3*r2*t2*(2.d0*r4*(1.d0-r1*t2)-thrd2*r1*t2*fact4) | ||
| 79 | h1z = gz*r3*r2*t2*(3.d0-4.d0*r1*t2)/g | ||
| 80 | h1t = 2.d0*r3*r2*(1.d0-r1*t2) | ||
| 81 | h1zt = 2.d0*gz*r3*r2*(3.d0-11.d0*r1*t2+4.d0*r1*r1*t4)/g | ||
| 82 | h1tt = 4.d0*r3*r2*r1*t*(-2.d0+r1*t2) | ||
| 83 | hrs = h0rs+h1rs | ||
| 84 | hrst = h0rst+h1rst | ||
| 85 | ht = h0t+h1t | ||
| 86 | htt = h0tt+h1tt | ||
| 87 | hz = h0z+h1z | ||
| 88 | hzt = h0zt+h1zt | ||
| 89 | comm = h+hrs+hrst+t2*ht/6.d0+7.d0*t2*t*htt/6.d0 | ||
| 90 | pref = hz-gz*t2*ht/g | ||
| 91 | fact5 = gz*(2.d0*ht+t*htt)/g | ||
| 92 | comm = comm-pref*zet-uu*htt-vv*ht-ww*(hzt-fact5) | ||
| 93 | dvcup = comm + pref | ||
| 94 | dvcdn = comm - pref | ||
| 95 | return | ||
| 96 | end | ||
