Line data Source code
1 : MODULE m_mkgz
2 : c.....------------------------------------------------------------------
3 : c by use of cartesian x,y,z components of charge density gradients,
4 : c make the quantities
5 : cc agrt,agru,agrd,g2rt,g2ru,g2rd,gggrt,gggru,gggrd,
6 : cc gzgr
7 : cc used to calculate gradient contribution to xc potential and
8 : cc energy.
9 : c.....------------------------------------------------------------------
10 : CONTAINS
11 34 : SUBROUTINE mkgz(
12 34 : > nmzdf,jspins,rh1,rh2,rhdz1,rhdz2,rhdzz1,rhdzz2,idx,
13 : < grad)
14 : USE m_types
15 : IMPLICIT NONE
16 : INTEGER, INTENT (IN) :: nmzdf,jspins,idx
17 : REAL, INTENT (IN) :: rh1(nmzdf),rhdz1(nmzdf),rhdzz1(nmzdf)
18 : REAL, INTENT (IN) :: rh2(nmzdf),rhdz2(nmzdf),rhdzz2(nmzdf)
19 : TYPE(t_gradients),INTENT(INOUT)::grad
20 :
21 : INTEGER i
22 : REAL vlt,dvzt,dvzzt,vlu,dvzu,dvzzu,vld,dvzd,dvzzd
23 : REAL dagrzt,dagrzu,dagrzd,dztadz,sml
24 :
25 34 : sml = 1.e-14
26 :
27 34 : IF (ALLOCATED(grad%sigma)) THEN
28 0 : IF(jspins==1) THEN
29 0 : DO i=1,nmzdf
30 0 : grad%sigma(1,idx+i)=rhdz1(i)*rhdz1(i)
31 : ENDDO
32 : ELSE
33 0 : DO i=1,nmzdf
34 0 : grad%sigma(1,idx+i)=rhdz1(i)*rhdz1(i)
35 0 : grad%sigma(2,idx+i)=rhdz1(i)*rhdz2(i)
36 0 : grad%sigma(3,idx+i)=rhdz2(i)*rhdz2(i)
37 : ENDDO
38 : ENDIF
39 0 : RETURN
40 : ENDIF
41 :
42 34 : IF (jspins == 1) THEN
43 :
44 4620 : DO i = 1,nmzdf
45 :
46 4590 : vlu = max(rh1(i)/2,sml)
47 4590 : dvzu = rhdz1(i)/2
48 4590 : dvzzu = rhdzz1(i)/2
49 4590 : vld = vlu
50 4590 : dvzd = dvzu
51 4590 : dvzzd = dvzzu
52 :
53 4590 : vlt = vlu+vld
54 4590 : dvzt = dvzu+dvzd
55 4590 : dvzzt = dvzzu+dvzzd
56 :
57 : c agrt: abs(grad(ro)), u,d for up and down.
58 :
59 4590 : grad%agrt(idx+i) = max(abs(dvzt),sml)
60 4590 : grad%agru(idx+i) = max(abs(dvzu),sml)
61 4590 : grad%agrd(idx+i) = max(abs(dvzd),sml)
62 :
63 4590 : dagrzt= dvzt*dvzzt/grad%agrt(idx+i)
64 4590 : dagrzu= dvzu*dvzzu/grad%agru(idx+i)
65 4590 : dagrzd= dvzd*dvzzd/grad%agrd(idx+i)
66 :
67 4590 : grad%gggrt(idx+i) = dvzt*dagrzt
68 4590 : grad%gggru(idx+i) = dvzu*dagrzu
69 4590 : grad%gggrd(idx+i) = dvzd*dagrzd
70 :
71 : c dztadz=d(zeta)/dz,..
72 :
73 4590 : dztadz = (dvzu-dvzd)/vlt - (vlu-vld)*dvzt/vlt**2
74 :
75 : c gzgr=grad(zeta)*grad(ro).
76 :
77 4590 : grad%gzgr(idx+i) = dztadz*dvzt
78 :
79 : c g2rt: grad(grad(ro))
80 :
81 4590 : grad%g2rt(idx+i) = dvzzt
82 4590 : grad%g2ru(idx+i) = dvzzu
83 4620 : grad%g2rd(idx+i) = dvzzd
84 :
85 : ENDDO
86 :
87 : ELSE
88 :
89 616 : DO i = 1,nmzdf
90 :
91 612 : vlu = max(rh1(i),sml)
92 612 : dvzu = rhdz1(i)
93 612 : dvzzu = rhdzz1(i)
94 612 : vld = max(rh2(i),sml)
95 612 : dvzd = rhdz2(i)
96 612 : dvzzd = rhdzz2(i)
97 :
98 612 : vlt = vlu+vld
99 612 : dvzt = dvzu+dvzd
100 612 : dvzzt = dvzzu+dvzzd
101 :
102 : c agrt: abs(grad(ro)), u,d for up and down.
103 :
104 612 : grad%agrt(idx+i) = max(abs(dvzt),sml)
105 612 : grad%agru(idx+i) = max(abs(dvzu),sml)
106 612 : grad%agrd(idx+i) = max(abs(dvzd),sml)
107 :
108 612 : dagrzt= dvzt*dvzzt/grad%agrt(idx+i)
109 612 : dagrzu= dvzu*dvzzu/grad%agru(idx+i)
110 612 : dagrzd= dvzd*dvzzd/grad%agrd(idx+i)
111 :
112 612 : grad%gggrt(idx+i) = dvzt*dagrzt
113 612 : grad%gggru(idx+i) = dvzu*dagrzu
114 612 : grad%gggrd(idx+i) = dvzd*dagrzd
115 :
116 : c dztadz=d(zeta)/dz,..
117 :
118 612 : dztadz = (dvzu-dvzd)/vlt - (vlu-vld)*dvzt/vlt**2
119 :
120 : c gzgr=grad(zeta)*grad(ro).
121 :
122 612 : grad%gzgr(idx+i) = dztadz*dvzt
123 :
124 : c g2rt: grad(grad(ro))
125 :
126 612 : grad%g2rt(idx+i) = dvzzt
127 612 : grad%g2ru(idx+i) = dvzzu
128 616 : grad%g2rd(idx+i) = dvzzd
129 :
130 :
131 : ENDDO
132 : ENDIF
133 :
134 : END SUBROUTINE mkgz
135 : END MODULE m_mkgz
|