Line data Source code
1 : MODULE m_excepbe
2 : !.....-----------------------------------------------------------------
3 : !.....epbe(easy_pbe) exchange-correlation energy density in hartree.
4 : ! excepbe - easypbe
5 : !.....------------------------------------------------------------------
6 : CONTAINS
7 785 : SUBROUTINE excepbe( &
8 : xcpot,jspins,mirm,irmx, &
9 785 : rh,agr,agru,agrd, &
10 785 : g2ru,g2rd,gggr,gggru,gggrd, &
11 785 : exc)
12 :
13 : USE m_easypbe
14 : USE m_types_xcpot_data
15 :
16 : IMPLICIT NONE
17 :
18 : ! .. Arguments ..
19 : TYPE(t_xcpot_data),INTENT(IN)::xcpot
20 : INTEGER, INTENT (IN) :: irmx,jspins,mirm
21 : REAL, INTENT (IN) :: rh(mirm,jspins)
22 : REAL, INTENT (IN) :: agr(mirm),agru(mirm),agrd(mirm)
23 : REAL, INTENT (IN) :: g2ru(mirm),g2rd(mirm),gggr(mirm)
24 : REAL, INTENT (IN) :: gggru(mirm),gggrd(mirm)
25 : REAL, INTENT (OUT) :: exc(mirm)
26 :
27 : ! .. local variables ..
28 : INTEGER :: lcor,lpot,i
29 : REAL :: ro,rou,rod,xedl,cedl,xedg,cedg,xced
30 : REAL :: up,agrup,delgrup,uplap,dn,agrdn,delgrdn,dnlap, &
31 : agrt,delgrt, &
32 : exlsd,vxuplsd,vxdnlsd,eclsd,vcuplsd,vcdnlsd, &
33 : expbe,vxuppbe,vxdnpbe,ecpbe,vcuppbe,vcdnpbe, &
34 : vxupsr,vxdnsr
35 :
36 : REAL, PARAMETER :: sml = 1.e-14
37 : REAL, PARAMETER :: smlc = 2.01e-14
38 :
39 : !$OMP parallel do default(private) &
40 : !$OMP SHARED(xcpot,jspins,mirm,irmx) &
41 : !$OMP SHARED(rh,agr,agru,agrd) &
42 : !$OMP SHARED(g2ru,g2rd,gggr,gggru,gggrd) &
43 785 : !$OMP SHARED(exc)
44 : DO i = 1,irmx
45 :
46 : IF (jspins == 1) THEN
47 : rou=rh(i,1)/2
48 : rou=max(rou,sml)
49 : rod=rou
50 : ELSE
51 : rou=rh(i,1)
52 : rod=rh(i,jspins)
53 : rou=max(rou,sml)
54 : rod=max(rod,sml)
55 : ENDIF
56 :
57 : ro=rou+rod
58 :
59 : !.....
60 : ! xedl,xedg: exchange energy density (local,grad.exp.) in ry.
61 : ! cedl,cedg: exchange energy density (local,grad.expnd.) in ry.
62 : !.....
63 : xedl = 0.0e0
64 : cedl = 0.0e0
65 : xedg = 0.0e0
66 : cedg = 0.0e0
67 :
68 : IF (ro > smlc) THEN
69 :
70 : lcor=1
71 : lpot=1
72 : up=rou
73 : agrup=agru(i)
74 : delgrup=gggru(i)
75 : uplap=g2ru(i)
76 : dn=rod
77 : agrdn=agrd(i)
78 : delgrdn=gggrd(i)
79 : dnlap=g2rd(i)
80 : agrt=agr(i)
81 : delgrt=gggr(i)
82 :
83 : CALL easypbe (xcpot, &
84 : up,agrup,delgrup,uplap,dn,agrdn,delgrdn,dnlap, &
85 : agrt,delgrt,lcor,lpot, &
86 : exlsd,vxuplsd,vxdnlsd,eclsd,vcuplsd,vcdnlsd, &
87 : expbe,vxuppbe,vxdnpbe,ecpbe,vcuppbe,vcdnpbe, &
88 : vxupsr,vxdnsr)
89 :
90 : xedl=exlsd
91 : cedl=eclsd
92 : xedg=expbe-exlsd
93 : cedg=ecpbe-eclsd
94 :
95 : ENDIF ! ro > smlc
96 :
97 : IF(xcpot%is_pbe0) THEN
98 : !pbe0: weight exchange energy with factor 0.75
99 : xced = (0.75*xedl+cedl+0.75*xedg+cedg)
100 : ELSE
101 : xced = (xedl+cedl+xedg+cedg)
102 : END IF
103 :
104 : exc(i) = xced*2 ! in ry
105 :
106 : ENDDO
107 : !$OMP end parallel do
108 785 : END SUBROUTINE excepbe
109 : END MODULE m_excepbe
|