44#include "../base/base_uses.f90"
52 REAL(KIND=
dp),
PARAMETER :: f13 = 1.0_dp/3.0_dp, &
57 REAL(KIND=
dp) :: cx, flda, flsd, sfac, t13
58 REAL(KIND=
dp) :: fact, tact
59 REAL(KIND=
dp) :: eps_rho
60 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'xc_exchange_gga'
77 SUBROUTINE xgga_info(functional, lsd, reference, shortform, needs, max_deriv)
78 INTEGER,
INTENT(in) :: functional
79 LOGICAL,
INTENT(in) :: lsd
80 CHARACTER(LEN=*),
INTENT(OUT),
OPTIONAL :: reference, shortform
82 INTEGER,
INTENT(out),
OPTIONAL :: max_deriv
84 IF (
PRESENT(reference))
THEN
85 SELECT CASE (functional)
87 reference =
"A. Becke, Phys. Rev. A 38, 3098 (1988)"
89 reference =
"J.P. Perdew and Y. Wang, Phys. Rev. B, 33, 8800 (1986)"
91 reference =
"J.P. Perdew et al., Phys. Rev. B, 46, 6671 (1992)"
93 reference =
"J.P. Perdew, K. Burke, M Ernzerhof, Phys. Rev. Lett, 77, 3865 (1996)"
95 reference =
"Y. Zhang et al., PRL, 80, 890 (1998) (Revised PBEX)"
97 reference =
"Wee-Meng Hoe, A.J. Cohen, N.C. Handy, CPL, 341, 319 (2001)"
99 reference =
"E. Engel and S.H. Vosko, Phys. Rev. B, 47, 13164 (1993)"
101 cpabort(
"Invalid functional requested ("//
cp_to_string(functional)//
")")
104 IF (len_trim(reference) + 6 < len(reference))
THEN
105 reference(len_trim(reference):len_trim(reference) + 6) =
' {LDA}'
109 IF (
PRESENT(shortform))
THEN
110 SELECT CASE (functional)
112 shortform =
"Becke 1988 Exchange Functional"
114 shortform =
"Perdew-Wang 1986 Functional (exchange energy)"
116 shortform =
"Perdew-Wang 1991 Functional (exchange energy)"
118 shortform =
"PBE exchange energy functional"
120 shortform =
"Revised PBEX by Zhang et al."
122 shortform =
"OPTX exchange energy functional"
124 shortform =
"Engel-Vosko exchange energy from virial relation"
126 cpabort(
"Invalid functional requested ("//
cp_to_string(functional)//
")")
129 IF (len_trim(shortform) + 6 < len(shortform))
THEN
130 shortform(len_trim(shortform):len_trim(shortform) + 6) =
' {LDA}'
134 IF (
PRESENT(needs))
THEN
136 needs%rho_spin = .true.
137 needs%rho_spin_1_3 = .true.
138 needs%norm_drho_spin = .true.
141 needs%rho_1_3 = .true.
142 needs%norm_drho = .true.
145 IF (
PRESENT(max_deriv)) max_deriv = 3
159 SUBROUTINE xgga_eval(functional, lsd, rho_set, deriv_set, order)
160 INTEGER,
INTENT(in) :: functional
161 LOGICAL,
INTENT(in) :: lsd
164 INTEGER,
INTENT(in) :: order
166 CHARACTER(len=*),
PARAMETER :: routinen =
'xgga_eval'
168 INTEGER :: handle, ispin, m, npoints, nspin
169 INTEGER,
DIMENSION(2) :: norm_drho_spin_name, rho_spin_name
170 INTEGER,
DIMENSION(2, 3) :: bo
171 REAL(kind=
dp) :: drho_cutoff, rho_cutoff
172 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: s
173 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: fs
174 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :, :),
POINTER :: e_0, e_ndrho, e_ndrho_ndrho, &
175 e_ndrho_ndrho_ndrho, e_rho, e_rho_ndrho, e_rho_ndrho_ndrho, e_rho_rho, e_rho_rho_ndrho, &
180 CALL timeset(routinen, handle)
181 NULLIFY (e_0, e_ndrho, e_ndrho_ndrho, e_ndrho_ndrho_ndrho, e_rho_ndrho_ndrho, &
182 e_rho_ndrho, e_rho_rho_ndrho, e_rho, e_rho_rho, e_rho_rho_rho)
184 NULLIFY (norm_drho(ispin)%array, rho(ispin)%array, rho_1_3(ispin)%array)
189 rhob_1_3=rho_1_3(2)%array, rhoa=rho(1)%array, &
190 rhob=rho(2)%array, norm_drhoa=norm_drho(1)%array, &
191 norm_drhob=norm_drho(2)%array, rho_cutoff=rho_cutoff, &
192 drho_cutoff=drho_cutoff, local_bounds=bo)
197 CALL xc_rho_set_get(rho_set, rho=rho(1)%array, rho_1_3=rho_1_3(1)%array, &
198 norm_drho=norm_drho(1)%array, local_bounds=bo, rho_cutoff=rho_cutoff, &
199 drho_cutoff=drho_cutoff)
204 npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
206 CALL xgga_init(rho_cutoff)
208 ALLOCATE (s(npoints))
209 ALLOCATE (fs(npoints, m + 1))
220 norm_drho(ispin)%array, s)
223 SELECT CASE (functional)
225 CALL efactor_b88(s, fs, m)
227 CALL efactor_pw86(s, fs, m)
235 CALL efactor_pw91(s, fs, m)
240 CALL efactor_pbex(s, fs, m, 1)
241 IF (lsd) tact = 1.0_dp
244 CALL efactor_pbex(s, fs, m, 2)
245 IF (lsd) tact = 1.0_dp
247 CALL efactor_optx(s, fs, m)
250 CALL efactor_ev93(s, fs, m)
251 IF (lsd) tact = 1.0_dp
253 cpabort(
"Unsupported functional")
257 allocate_deriv=.true.)
260 CALL x_p_0(rho(ispin)%array, rho_1_3(ispin)%array, fs, e_0, &
264 allocate_deriv=.true.)
267 allocate_deriv=.true.)
270 CALL x_p_1(rho(ispin)%array, &
271 rho_1_3(ispin)%array, s, fs, e_rho, e_ndrho, npoints)
275 rho_spin_name(ispin)], allocate_deriv=.true.)
278 norm_drho_spin_name(ispin)], allocate_deriv=.true.)
281 norm_drho_spin_name(ispin)], allocate_deriv=.true.)
284 CALL x_p_2(rho(ispin)%array, &
285 rho_1_3(ispin)%array, s, fs, e_rho_rho, e_rho_ndrho, &
286 e_ndrho_ndrho, npoints)
290 rho_spin_name(ispin), rho_spin_name(ispin)], &
291 allocate_deriv=.true.)
294 rho_spin_name(ispin), norm_drho_spin_name(ispin)], &
295 allocate_deriv=.true.)
298 norm_drho_spin_name(ispin), norm_drho_spin_name(ispin)], &
299 allocate_deriv=.true.)
302 norm_drho_spin_name(ispin), norm_drho_spin_name(ispin)], &
303 allocate_deriv=.true.)
306 CALL x_p_3(rho(ispin)%array, &
307 rho_1_3(ispin)%array, s, fs, e_rho_rho_rho, &
308 e_rho_rho_ndrho, e_rho_ndrho_ndrho, e_ndrho_ndrho_ndrho, &
312 cpabort(
"derivatives bigger than 3 not implemented")
319 CALL timestop(handle)
326 SUBROUTINE xgga_init(cutoff)
328 REAL(kind=
dp),
INTENT(IN) :: cutoff
333 cx = -0.75_dp*(3.0_dp/
pi)**f13
338 sfac = 1.0_dp/(2.0_dp*(3.0_dp*
pi*
pi)**f13)
340 END SUBROUTINE xgga_init
350 SUBROUTINE x_p_0(rho, r13, fs, e_0, npoints)
352 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, r13
353 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: fs
354 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: e_0
355 INTEGER,
INTENT(in) :: npoints
365 IF (rho(ip) > eps_rho)
THEN
366 e_0(ip) = e_0(ip) + fact*r13(ip)*rho(ip)*fs(ip, 1)
385 SUBROUTINE x_p_1(rho, r13, s, fs, e_rho, e_ndrho, npoints)
387 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, r13, s
388 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: fs
389 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: e_rho, e_ndrho
390 INTEGER,
INTENT(in) :: npoints
393 REAL(kind=
dp) :: a0, a1, sx, sy
402 IF (rho(ip) > eps_rho)
THEN
404 a0 = fact*r13(ip)*rho(ip)
405 a1 = f43*fact*r13(ip)
406 sx = -f43*s(ip)/rho(ip)
407 sy = sfac*tact/(r13(ip)*rho(ip))
408 e_rho(ip) = e_rho(ip) + a1*fs(ip, 1) + a0*fs(ip, 2)*sx
409 e_ndrho(ip) = e_ndrho(ip) + a0*fs(ip, 2)*sy
430 SUBROUTINE x_p_2(rho, r13, s, fs, e_rho_rho, e_rho_ndrho, &
431 e_ndrho_ndrho, npoints)
433 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, r13, s
434 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: fs
435 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: e_rho_rho, e_rho_ndrho, e_ndrho_ndrho
436 INTEGER,
INTENT(in) :: npoints
439 REAL(kind=
dp) :: a0, a1, a2, sx, sxx, sxy, sy
448 IF (rho(ip) > eps_rho)
THEN
450 a0 = fact*r13(ip)*rho(ip)
451 a1 = f43*fact*r13(ip)
452 a2 = f13*f43*fact/(r13(ip)*r13(ip))
453 sx = -f43*s(ip)/rho(ip)
454 sy = sfac*tact/(r13(ip)*rho(ip))
455 sxx = 28.0_dp/9.0_dp*s(ip)/(rho(ip)*rho(ip))
456 sxy = -f43*sfac*tact/(r13(ip)*rho(ip)*rho(ip))
457 e_rho_rho(ip) = e_rho_rho(ip) + a2*fs(ip, 1) + 2.0_dp*a1*fs(ip, 2)*sx + &
458 a0*fs(ip, 3)*sx*sx + a0*fs(ip, 2)*sxx
459 e_rho_ndrho(ip) = e_rho_ndrho(ip) &
460 + a1*fs(ip, 2)*sy + a0*fs(ip, 3)*sx*sy + a0*fs(ip, 2)*sxy
461 e_ndrho_ndrho(ip) = e_ndrho_ndrho(ip) + a0*fs(ip, 3)*sy*sy
483 SUBROUTINE x_p_3(rho, r13, s, fs, e_rho_rho_rho, e_rho_rho_ndrho, &
484 e_rho_ndrho_ndrho, e_ndrho_ndrho_ndrho, npoints)
486 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, r13, s
487 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN) :: fs
488 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: e_rho_rho_rho, e_rho_rho_ndrho, &
489 e_rho_ndrho_ndrho, e_ndrho_ndrho_ndrho
490 INTEGER,
INTENT(in) :: npoints
493 REAL(kind=
dp) :: a0, a1, a2, a3, sx, sxx, sxxx, sxxy, &
505 IF (rho(ip) > eps_rho)
THEN
507 a0 = fact*r13(ip)*rho(ip)
508 a1 = f43*fact*r13(ip)
509 a2 = f13*f43*fact/(r13(ip)*r13(ip))
510 a3 = -f23*f13*f43*fact/(r13(ip)*r13(ip)*rho(ip))
511 sx = -f43*s(ip)/rho(ip)
512 sy = sfac*tact/(r13(ip)*rho(ip))
513 sxx = 28.0_dp/9.0_dp*s(ip)/(rho(ip)*rho(ip))
514 sxy = -f43*sfac*tact/(r13(ip)*rho(ip)*rho(ip))
515 sxxx = -280.0_dp/27.0_dp*s(ip)/(rho(ip)*rho(ip)*rho(ip))
516 sxxy = 28.0_dp/9.0_dp*sfac*tact/(r13(ip)*rho(ip)*rho(ip)*rho(ip))
517 e_rho_rho_rho(ip) = e_rho_rho_rho(ip) &
518 + a3*fs(ip, 1) + 3.0_dp*a2*fs(ip, 2)*sx + &
519 3.0_dp*a1*fs(ip, 3)*sx*sx + 3.0_dp*a1*fs(ip, 2)*sxx + &
520 a0*fs(ip, 4)*sx*sx*sx + 3.0_dp*a0*fs(ip, 3)*sx*sxx + &
522 e_rho_rho_ndrho(ip) = e_rho_rho_ndrho(ip) &
523 + a2*fs(ip, 2)*sy + 2.0_dp*a1*fs(ip, 3)*sx*sy + &
524 2.0_dp*a1*fs(ip, 2)*sxy + a0*fs(ip, 4)*sx*sx*sy + &
525 2.0_dp*a0*fs(ip, 3)*sx*sxy + a0*fs(ip, 3)*sxx*sy + &
527 e_rho_ndrho_ndrho(ip) = e_rho_ndrho_ndrho(ip) &
528 + a1*fs(ip, 3)*sy*sy + a0*fs(ip, 4)*sx*sy*sy + &
529 2.0_dp*a0*fs(ip, 3)*sxy*sy
530 e_ndrho_ndrho_ndrho(ip) = e_ndrho_ndrho_ndrho(ip) &
531 + a0*fs(ip, 4)*sy*sy*sy
548 SUBROUTINE efactor_b88(s, fs, m)
549 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: s
550 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: fs
551 INTEGER,
INTENT(IN) :: m
554 REAL(kind=
dp) :: as, asp, beta, bs, f0, p, q, sas, sbs, sbs3, t1, t10, t13, t15, t16, t19, &
555 t2, t22, t24, t25, t32, t34, t36, t39, t4, t40, t41, t44, t48, t49, t5, t6, t65, t8, t87, &
573 sbs = sqrt(x*x + 1.0_dp)
576 ys = 1.0_dp/(1.0_dp + q*sas)
579 fs(ip, 1) = 1.0_dp + p*x*x*ys
582 fs(ip, 1) = 1.0_dp + p*x*x*ys
583 fs(ip, 2) = (2.0_dp*p*x*ys - p*q*x*x*asp*ys*ys)*f0
586 sbs3 = 1.0_dp/(sbs*sbs*sbs)
587 fs(ip, 1) = 1.0_dp + p*x*x*ys
588 fs(ip, 2) = (2.0_dp*p*x*ys - p*q*x*x*asp*ys*ys)*f0
589 fs(ip, 3) = -f0*f0*p*ys**3*sbs3*(q*x*x*x*x*(q*sas + 5.0_dp &
590 - 2.0_dp*q*sbs) + 2.0_dp*(x*x*(q*q*sas &
591 + 3.0_dp*q - sbs) - sbs))
594 sbs3 = 1.0_dp/(sbs*sbs*sbs)
595 fs(ip, 1) = 1.0_dp + p*x*x*ys
596 fs(ip, 2) = (2.0_dp*p*x*ys - p*q*x*x*asp*ys*ys)*f0
597 fs(ip, 3) = -f0*f0*p*ys**3*sbs3*(q*x*x*x*x*(q*sas + 5.0_dp &
598 - 2.0_dp*q*sbs) + 2.0_dp*(x*x*(q*q*sas &
599 + 3.0_dp*q - sbs) - sbs))
611 t19 = q*t6 + t1*t15*t16
621 t44 = 2*q*t15*t16 + t1*t36*t16 - t1*t39*t41
625 t87 = -6*p*t10*t19 + 12*t22*t24*t25 - 6*t22*t10*t44 - 6*t48/t49*t25*t19 + &
626 6*t48*t24*t19*t44 - t48*t10*(3*q*t36*t16 - 3*q*t39*t41 + 3*t1*(1/t65/t4* &
627 t2*x - t34*x)*t16 - 3*t1*t36*t41*t15 + 2*t1*t39*t15/t40/t5)
630 fs(ip, 4) = f0*f0*f0*fs(ip, 4)
633 cpabort(
"Illegal order")
639 END SUBROUTINE efactor_b88
646 SUBROUTINE efactor_pw86(s, fs, m)
647 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: s
648 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: fs
649 INTEGER,
INTENT(IN) :: m
652 REAL(kind=
dp) :: f15, p0, p1, p15, s2, s4, s6, t1, t10, &
653 t12, t13, t14, t19, t2, t25, t3, t8, t9
671 p0 = 1.0_dp + t1*s2 + t2*s4 + t3*s6
674 p0 = 1.0_dp + t1*s2 + t2*s4 + t3*s6
675 p1 = s(ip)*(2.0_dp*t1 + 4.0_dp*t2*s2 + 6.0_dp*t3*s4)
678 fs(ip, 2) = f15*p1*p15/p0
680 p0 = 1.0_dp + t1*s2 + t2*s4 + t3*s6
681 p1 = s(ip)*(2.0_dp*t1 + 4.0_dp*t2*s2 + 6.0_dp*t3*s4)
684 fs(ip, 2) = f15*p1*p15/p0
685 t9 = p15**2; t10 = t9**2; t12 = t10**2; t13 = t12*t10*t9
687 fs(ip, 3) = -14.0_dp/225.0_dp/t13/p0*t25 + &
688 1.0_dp/t13*(2.0_dp*t1 + 12*t2*s2 + 30.0_dp*t3*s4)/15.0_dp
690 p0 = 1.0_dp + t1*s2 + t2*s4 + t3*s6
691 p1 = s(ip)*(2.0_dp*t1 + 4.0_dp*t2*s2 + 6.0_dp*t3*s4)
694 fs(ip, 2) = f15*p1*p15/p0
695 t9 = p15**2; t10 = t9**2; t12 = t10**2; t13 = t12*t10*t9
697 fs(ip, 3) = -14.0_dp/225.0_dp/t13/p0*t25 + &
698 1.0_dp/t13*(2.0_dp*t1 + 12*t2*s2 + 30.0_dp*t3*s4)/15.0_dp
699 t8 = p0**2; t9 = p0**f15; t14 = p0/t9; t19 = s2*s(ip)
700 fs(ip, 4) = 406.0_dp/3375.0_dp/t14/t8*p1*p1*p1 - 14.0_dp/ &
701 75.0_dp/t14/p0*p1*(2*t1 + 12*t2*s2 + 30*t3*s4) + &
702 1/t14*(24*t2*s(ip) + 120*t3*t19)*f15
704 cpabort(
"Illegal order")
710 END SUBROUTINE efactor_pw86
717 SUBROUTINE efactor_ev93(s, fs, m)
718 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: s
719 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: fs
720 INTEGER,
INTENT(IN) :: m
723 REAL(kind=
dp) :: a1, a2, a3, b1, b2, b3, d0, d1, d2, d3, &
724 f0, f1, f2, n0, n1, n2, n3, s2, s4, &
749 n0 = 1._dp + a1*s2 + a2*s4 + a3*s6
750 d0 = 1._dp + b1*s2 + b2*s4 + b3*s6
753 n0 = 1._dp + a1*s2 + a2*s4 + a3*s6
754 d0 = 1._dp + b1*s2 + b2*s4 + b3*s6
755 n1 = ss*(2._dp*a1 + 4._dp*a2*s2 + 6._dp*a3*s4)
756 d1 = ss*(2._dp*b1 + 4._dp*b2*s2 + 6._dp*b3*s4)
759 fs(ip, 2) = (n1 - f0*d1)/d0*scale_s
761 n0 = 1._dp + a1*s2 + a2*s4 + a3*s6
762 d0 = 1._dp + b1*s2 + b2*s4 + b3*s6
763 n1 = ss*(2._dp*a1 + 4._dp*a2*s2 + 6._dp*a3*s4)
764 d1 = ss*(2._dp*b1 + 4._dp*b2*s2 + 6._dp*b3*s4)
765 n2 = 2._dp*a1 + 12._dp*a2*s2 + 30._dp*a3*s4
766 d2 = 2._dp*b1 + 12._dp*b2*s2 + 30._dp*b3*s4
770 fs(ip, 2) = f1*scale_s
771 fs(ip, 3) = (n2 - f0*d2 - 2._dp*f1*d1)/d0*scale_s*scale_s
773 n0 = 1._dp + a1*s2 + a2*s4 + a3*s6
774 d0 = 1._dp + b1*s2 + b2*s4 + b3*s6
775 n1 = ss*(2._dp*a1 + 4._dp*a2*s2 + 6._dp*a3*s4)
776 d1 = ss*(2._dp*b1 + 4._dp*b2*s2 + 6._dp*b3*s4)
777 n2 = 2._dp*a1 + 12._dp*a2*s2 + 30._dp*a3*s4
778 d2 = 2._dp*b1 + 12._dp*b2*s2 + 30._dp*b3*s4
779 n3 = ss*(24._dp*a2 + 120._dp*a3*s2)
780 d3 = ss*(24._dp*b2 + 120._dp*b3*s2)
783 f2 = (n2 - f0*d2 - 2._dp*f1*d1)/d0
785 fs(ip, 2) = f1*scale_s
786 fs(ip, 3) = f2*scale_s*scale_s
787 fs(ip, 4) = (n3 - f0*d3 - 3._dp*f2*d1 - 3._dp*f1*d2)/d0*scale_s*scale_s*scale_s
789 cpabort(
"Illegal order")
795 END SUBROUTINE efactor_ev93
802 SUBROUTINE efactor_optx(s, fs, m)
803 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: s
804 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(OUT) :: fs
805 INTEGER,
INTENT(IN) :: m
807 REAL(kind=
dp),
PARAMETER :: a1 = 1.05151_dp, a2 = 1.43169_dp, &
811 REAL(kind=
dp) :: a, b, f0, x, y
823 y = 1.0_dp/(1.0_dp + a)
826 fs(ip, 1) = a1 + b*a*a*y*y
828 fs(ip, 1) = a1 + b*a*a*y*y
829 fs(ip, 2) = 4.0_dp*b*f0*a*gamma_bo*x*y*y*y
831 fs(ip, 1) = a1 + b*a*a*y*y
832 fs(ip, 2) = 4.0_dp*b*f0*a*gamma_bo*x*y*y*y
833 fs(ip, 3) = -12.0_dp*b*f0*f0*gamma_bo*a*(a - 1.0_dp)*y*y*y*y
835 fs(ip, 1) = a1 + b*a*a*y*y
836 fs(ip, 2) = 4.0_dp*b*f0*a*gamma_bo*x*y*y*y
837 fs(ip, 3) = -12.0_dp*b*f0*f0*gamma_bo*a*(a - 1.0_dp)*y*y*y*y
838 fs(ip, 4) = 24.0_dp*b*f0*f0*f0*gamma_bo*gamma_bo*x* &
839 (1.0_dp - 5.0_dp*a + 2.0_dp*a*a)*y*y*y*y*y
841 cpabort(
"Illegal order")
847 END SUBROUTINE efactor_optx
855 SUBROUTINE efactor_pw91(s, fs, m)
856 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: s
857 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(OUT) :: fs
858 INTEGER,
INTENT(IN) :: m
861 REAL(
dp) :: t1, t10, t101, t106, t109, t111, t113, t119, t12, t123, t124, t13, t14, t15, &
862 t16, t17, t18, t19, t2, t20, t21, t22, t23, t25, t26, t27, t28, t29, t3, t30, t31, t33, &
863 t35, t37, t38, t39, t4, t40, t44, t47, t48, t5, t50, t51, t53, t55, t56, t57, t58, t59, &
864 t6, t60, t64, t65, t69, t7, t70, t71, t73, t77, t78, t8, t80, t82, t9, t90, t93, t94, &
866 REAL(kind=
dp) :: a1, a2, a3, a4, a5, b, o, x
888 fs(ip, 1) = (o + t10 + (a2 - a3*t12)*t4)/(o + t10 + a5*t17)
907 t17 = t10*(b + 1/t6*t2*x)/t7
913 t33 = o + t30 + a5*t31
916 (t9 + t17 + 2._dp*a3*a4*t19*t21 + 2._dp*t26*x)/ &
917 t33 - (o + t30 + t26*t3)/t38*(t9 + t17 + 4._dp*a5*t19)
936 t15 = 2._dp*a1*t9*t13
940 t25 = t16*(-o/t17/t5*t20*t2 + t7)*t13
951 t50 = o + t48 + a5*t39
958 t69 = t53 + t55 + 4._dp*a5*t56
959 t73 = o + t48 + t60*t2
962 (t15 + t25 - t30 + 10._dp*t31*t2*t33 - 4._dp*a3*t37*t39*t33 + &
963 2._dp*a2 - 2._dp*t44)/t50 - 2._dp* &
964 (t53 + t55 + 2._dp*t31*t56*t33 + 2._dp*t60*x)* &
965 t65*t69 + 2._dp*t73/t64/t50*t77 - t73*t65*(t15 + t25 - t30 + 12._dp*a5*t2)
979 t5 = sqrt(0.1e1_dp + t1*t2)
996 t40 = 3*t29*(1/t30/t5*t1*t9*t35 - t10*x)*t18
997 t44 = 3*t29*t14*t26*t22
998 t50 = 2*t29*t23*t22/t25/t17
1007 t73 = 0.1e1_dp + t71 + a5*t64
1016 t101 = t96 + t98 + 4*a5*t35
1018 t109 = t96 + t98 + 2*t51*t59 + 2*t106*x
1021 t119 = t78 + t80 - t82 + 12*a5*t2
1022 t123 = 0.1e1_dp + t71 + t106*t2
1025 (t20 - t28 + t40 - t44 + t50 + 24*t51*x*t53 - 36._dp*t58*t59 + 8._dp*a3*t57*a4*t64* &
1026 x*t53)/t73 - 3._dp*(t78 + t80 - t82 + 10._dp*t51*t2*t53 - &
1027 4._dp*t58*t64*t53 + 2._dp*a2 - 2._dp*t90)*t94*t101 + &
1028 6._dp*t109*t111*t113 - 3._dp*t109*t94*t119 - 6*t123/t124*t113*t101 + &
1029 6._dp*t123*t111*t101*t119 - t123*t94*(t20 - t28 + t40 - t44 + t50 + 24._dp*a5*x)
1036 END SUBROUTINE efactor_pw91
1045 SUBROUTINE efactor_pbex(s, fs, m, pset)
1046 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: s
1047 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(OUT) :: fs
1048 INTEGER,
INTENT(IN) :: m, pset
1050 REAL(kind=
dp),
PARAMETER :: kappa1 = 0.804_dp, kappa2 = 1.245_dp, &
1051 mu = 0.2195149727645171_dp
1054 REAL(kind=
dp) :: f0, mk, x, x2, y
1056 IF (pset == 1) mk = mu/kappa1
1057 IF (pset == 2) mk = mu/kappa2
1068 y = 1.0_dp/(1.0_dp + mk*x2)
1071 fs(ip, 1) = 1.0_dp + mu*x2*y
1073 fs(ip, 1) = 1.0_dp + mu*x2*y
1074 fs(ip, 2) = 2.0_dp*mu*x*y*y*f0
1076 fs(ip, 1) = 1.0_dp + mu*x2*y
1077 fs(ip, 2) = 2.0_dp*mu*x*y*y*f0
1078 fs(ip, 3) = -2.0_dp*mu*(3.0_dp*mk*x2 - 1.0_dp)*y*y*y*f0*f0
1080 fs(ip, 1) = 1.0_dp + mu*x2*y
1081 fs(ip, 2) = 2.0_dp*mu*x*y*y*f0
1082 fs(ip, 3) = -2.0_dp*mu*(3.0_dp*mk*x2 - 1.0_dp)*y*y*y*f0*f0
1083 fs(ip, 4) = 24.0_dp*mu*mk*x*(mk*x2 - 1.0_dp)*y*y*y*y*f0*f0*f0
1085 cpabort(
"Illegal order")
1091 END SUBROUTINE efactor_pbex
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
various routines to log and control the output. The idea is that decisions about where to log should ...
Defines the basic variable types.
integer, parameter, public dp
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
Module with functions to handle derivative descriptors. derivative description are strings have the f...
integer, parameter, public deriv_norm_drho
integer, parameter, public deriv_norm_drhoa
integer, parameter, public deriv_rhob
integer, parameter, public deriv_rhoa
integer, parameter, public deriv_rho
integer, parameter, public deriv_norm_drhob
represent a group ofunctional derivatives
type(xc_derivative_type) function, pointer, public xc_dset_get_derivative(derivative_set, description, allocate_deriv)
returns the requested xc_derivative
Provides types for the management of the xc-functionals and their derivatives.
subroutine, public xc_derivative_get(deriv, split_desc, order, deriv_data, accept_null_data)
returns various information on the given derivative
Calculate several different exchange energy functionals with a GGA form.
subroutine, public xgga_eval(functional, lsd, rho_set, deriv_set, order)
evaluates different exchange gga
subroutine, public xgga_info(functional, lsd, reference, shortform, needs, max_deriv)
return various information on the xgga functionals
Utility routines for the functional calculations.
subroutine, public calc_wave_vector(tag, rho, grho, s)
...
subroutine, public set_util(cutoff)
...
subroutine, public xc_rho_set_get(rho_set, can_return_null, rho, drho, norm_drho, rhoa, rhob, norm_drhoa, norm_drhob, rho_1_3, rhoa_1_3, rhob_1_3, laplace_rho, laplace_rhoa, laplace_rhob, drhoa, drhob, rho_cutoff, drho_cutoff, tau_cutoff, tau, tau_a, tau_b, local_bounds)
returns the various attributes of rho_set
represent a pointer to a contiguous 3d array
A derivative set contains the different derivatives of a xc-functional in form of a linked list.
represent a derivative of a functional
contains a flag for each component of xc_rho_set, so that you can use it to tell which components you...
represent a density, with all the representation and data needed to perform a functional evaluation