38#include "../base/base_uses.f90"
43 REAL(KIND=
dp),
DIMENSION(-1:1) :: a, a1, b1, b2, b3, b4
44 REAL(KIND=
dp),
DIMENSION(-1:1) :: c0, c1, c2, c3
45 REAL(KIND=
dp),
DIMENSION(-1:1) :: d0, d1
46 REAL(KIND=
dp) :: eps_rho
47 REAL(KIND=
dp),
PARAMETER :: &
48 epsilon = 5.e-13_dp, &
49 fpp = 0.584822362263464620726223866376013788782_dp
50 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'xc_perdew_wang'
68 INTEGER,
INTENT(in) :: method
69 LOGICAL,
INTENT(in) :: lsd
70 CHARACTER(LEN=*),
INTENT(OUT),
OPTIONAL :: reference, shortform
72 INTEGER,
INTENT(out),
OPTIONAL :: max_deriv
73 REAL(kind=
dp),
INTENT(in) :: scale
75 CHARACTER(len=3) :: p_string
79 cpabort(
"Unsupported parametrization")
88 IF (
PRESENT(reference))
THEN
89 reference =
"J. P. Perdew and Yue Wang," &
90 //
" Phys. Rev. B 45, 13244 (1992)" &
91 //
"["//trim(p_string)//
"]"
92 IF (scale /= 1._dp)
THEN
93 WRITE (reference(len_trim(reference) + 1:len(reference)),
"('s=',f5.3)") &
97 IF (len_trim(reference) + 6 < len(reference))
THEN
98 reference(len_trim(reference) + 1:len_trim(reference) + 7) =
' {LDA}'
102 IF (
PRESENT(shortform))
THEN
103 shortform =
"J. P. Perdew et al., PRB 45, 13244 (1992)" &
104 //
"["//trim(p_string)//
"]"
105 IF (scale /= 1._dp)
THEN
106 WRITE (shortform(len_trim(shortform) + 1:len(shortform)),
"('s=',f5.3)") &
110 IF (len_trim(shortform) + 6 < len(shortform))
THEN
111 shortform(len_trim(shortform) + 1:len_trim(shortform) + 7) =
' {LDA}'
115 IF (
PRESENT(needs))
THEN
117 needs%rho_spin = .true.
122 IF (
PRESENT(max_deriv)) max_deriv = 3
131 SUBROUTINE perdew_wang_init(method, cutoff)
133 INTEGER,
INTENT(IN) :: method
134 REAL(kind=
dp),
INTENT(IN) :: cutoff
153 cpabort(
"Unknown method")
156 a(0) = 0.031091_dp; a(1) = 0.015545_dp
157 a1(0) = 0.21370_dp; a1(1) = 0.20548_dp
158 b1(0) = 7.5957_dp; b1(1) = 14.1189_dp
159 b2(0) = 3.5876_dp; b2(1) = 6.1977_dp
160 b3(0) = 1.6382_dp; b3(1) = 3.3662_dp
161 b4(0) = 0.49294_dp; b4(1) = 0.62517_dp
164 a(0) = 0.031091_dp; a(1) = 0.015545_dp
165 a1(0) = 0.026481_dp; a1(1) = 0.022465_dp
166 b1(0) = 7.5957_dp; b1(1) = 14.1189_dp
167 b2(0) = 3.5876_dp; b2(1) = 6.1977_dp
168 b3(0) = -0.46647_dp; b3(1) = -0.56043_dp
169 b4(0) = 0.13354_dp; b4(1) = 0.11313_dp
172 a(0) = 0.031091_dp; a(1) = 0.015545_dp
173 a1(0) = -0.002257_dp; a1(1) = -0.009797_dp
174 b1(0) = 7.5957_dp; b1(1) = 14.1189_dp
175 b2(0) = 3.5876_dp; b2(1) = 6.1977_dp
176 b3(0) = -0.52669_dp; b3(1) = -0.91381_dp
177 b4(0) = 0.03755_dp; b4(1) = 0.01538_dp
183 c1(k) = -2.0_dp*c0(k)*log(2.0_dp*a(k)*b1(k))
185 c3(k) = -2.0_dp*a(k)*(a1(k)*log(2.0_dp*a(k)*b1(k)) &
186 - (b2(k)/b1(k))**2 + (b3(k)/b1(k)))
188 d1(k) = a1(k)*b3(k)/(b4(k)**2)
191 END SUBROUTINE perdew_wang_init
208 INTEGER,
INTENT(in) :: method
211 INTEGER,
INTENT(in) :: order
212 REAL(kind=
dp),
INTENT(in) :: scale
214 CHARACTER(len=*),
PARAMETER :: routinen =
'perdew_wang_lda_eval'
216 INTEGER :: npoints, timer_handle
217 INTEGER,
DIMENSION(2, 3) :: bo
218 REAL(kind=
dp) :: rho_cutoff
219 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :, :),
POINTER :: dummy, e_0, e_rho, e_rho_rho, &
223 CALL timeset(routinen, timer_handle)
224 NULLIFY (rho, e_0, e_rho, e_rho_rho, e_rho_rho_rho, dummy)
226 local_bounds=bo, rho_cutoff=rho_cutoff)
227 npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
229 CALL perdew_wang_init(method, rho_cutoff)
236 e_rho_rho_rho => dummy
239 allocate_deriv=.true.)
243 allocate_deriv=.true.)
248 allocate_deriv=.true.)
253 allocate_deriv=.true.)
257 cpabort(
"derivatives bigger than 3 not implemented")
260 CALL perdew_wang_lda_calc(rho, e_0, e_rho, e_rho_rho, e_rho_rho_rho, &
261 npoints, order, scale)
263 CALL timestop(timer_handle)
278 SUBROUTINE perdew_wang_lda_calc(rho, e_0, e_rho, e_rho_rho, e_rho_rho_rho, npoints, order, scale)
280 REAL(kind=
dp),
DIMENSION(*),
INTENT(in) :: rho
281 REAL(kind=
dp),
DIMENSION(*),
INTENT(inout) :: e_0, e_rho, e_rho_rho, e_rho_rho_rho
282 INTEGER,
INTENT(in) :: npoints, order
283 REAL(kind=
dp),
INTENT(in) :: scale
286 REAL(kind=
dp),
DIMENSION(0:3) :: ed
292 IF (rho(k) > eps_rho)
THEN
295 CALL pw_lda_ed_loc(rho(k), ed, order)
296 ed(0:order) = scale*ed(0:order)
298 e_0(k) = e_0(k) + rho(k)*ed(0)
300 e_rho(k) = e_rho(k) + ed(0) + rho(k)*ed(1)
303 e_rho_rho(k) = e_rho_rho(k) + 2.0_dp*ed(1) + rho(k)*ed(2)
306 e_rho_rho_rho(k) = e_rho_rho_rho(k) + 3.0_dp*ed(2) + rho(k)*ed(3)
314 END SUBROUTINE perdew_wang_lda_calc
330 INTEGER,
INTENT(in) :: method
333 INTEGER,
INTENT(IN),
OPTIONAL :: order
334 REAL(kind=
dp),
INTENT(in) :: scale
336 CHARACTER(len=*),
PARAMETER :: routinen =
'perdew_wang_lsd_eval'
338 INTEGER :: npoints, timer_handle
339 INTEGER,
DIMENSION(2, 3) :: bo
340 REAL(kind=
dp) :: rho_cutoff
341 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :, :),
POINTER :: a, b, dummy, e_0, ea, eaa, eaaa, eaab, &
342 eab, eabb, eb, ebb, ebbb
345 CALL timeset(routinen, timer_handle)
346 NULLIFY (a, b, e_0, ea, eb, eaa, eab, ebb, eaaa, eaab, eabb, ebbb)
348 local_bounds=bo, rho_cutoff=rho_cutoff)
349 npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
351 CALL perdew_wang_init(method, rho_cutoff)
358 ea => dummy; eb => dummy
359 eaa => dummy; eab => dummy; ebb => dummy
360 eaaa => dummy; eaab => dummy; eabb => dummy; ebbb => dummy
363 allocate_deriv=.true.)
367 allocate_deriv=.true.)
370 allocate_deriv=.true.)
375 allocate_deriv=.true.)
378 allocate_deriv=.true.)
381 allocate_deriv=.true.)
386 allocate_deriv=.true.)
389 allocate_deriv=.true.)
392 allocate_deriv=.true.)
395 allocate_deriv=.true.)
399 cpabort(
"derivatives bigger than 3 not implemented")
402 CALL perdew_wang_lsd_calc(a, b, e_0, ea, eb, eaa, eab, ebb, eaaa, eaab, eabb, &
403 ebbb, npoints, order, scale)
405 CALL timestop(timer_handle)
427 SUBROUTINE perdew_wang_lsd_calc(rhoa, rhob, e_0, ea, eb, eaa, eab, ebb, eaaa, eaab, eabb, &
428 ebbb, npoints, order, scale)
430 REAL(kind=
dp),
DIMENSION(*),
INTENT(in) :: rhoa, rhob
431 REAL(kind=
dp),
DIMENSION(*),
INTENT(inout) :: e_0, ea, eb, eaa, eab, ebb, eaaa, eaab, &
433 INTEGER,
INTENT(in) :: npoints, order
434 REAL(kind=
dp),
INTENT(in) :: scale
438 REAL(kind=
dp),
DIMENSION(0:9) :: ed
444 rho = rhoa(k) + rhob(k)
445 IF (rho > eps_rho)
THEN
448 CALL pw_lsd_ed_loc(rhoa(k), rhob(k), ed, order)
451 e_0(k) = e_0(k) + rho*ed(0)
453 ea(k) = ea(k) + ed(0) + rho*ed(1)
454 eb(k) = eb(k) + ed(0) + rho*ed(2)
457 eaa(k) = eaa(k) + 2.0_dp*ed(1) + rho*ed(3)
458 eab(k) = eab(k) + ed(1) + ed(2) + rho*ed(4)
459 ebb(k) = ebb(k) + 2.0_dp*ed(2) + rho*ed(5)
462 eaaa(k) = eaaa(k) + 3.0_dp*ed(3) + rho*ed(6)
463 eaab(k) = eaab(k) + 2.0_dp*ed(4) + ed(3) + rho*ed(7)
464 eabb(k) = eabb(k) + 2.0_dp*ed(4) + ed(5) + rho*ed(8)
465 ebbb(k) = ebbb(k) + 3.0_dp*ed(5) + rho*ed(9)
472 END SUBROUTINE perdew_wang_lsd_calc
487 REAL(kind=
dp),
INTENT(in) :: scalec, eps_rho
490 INTEGER,
DIMENSION(2, 3) :: bo
491 REAL(kind=
dp) :: rho, rhoa, rhob, eaa, eab, ebb
492 REAL(kind=
dp),
DIMENSION(0:9) :: ed
494 CALL perdew_wang_init(
pw_orig, eps_rho)
495 bo(1:2, 1:3) = rho_a%pw_grid%bounds_local(1:2, 1:3)
498 DO k = bo(1, 3), bo(2, 3)
499 DO j = bo(1, 2), bo(2, 2)
500 DO i = bo(1, 1), bo(2, 1)
501 rhoa = rho_a%array(i, j, k)
502 rhob = rho_b%array(i, j, k)
504 IF (rho > eps_rho)
THEN
506 CALL pw_lsd_ed_loc(rhoa, rhob, ed, 2)
508 eaa = 2.0_dp*ed(1) + rho*ed(3)
509 eab = ed(1) + ed(2) + rho*ed(4)
510 ebb = 2.0_dp*ed(2) + rho*ed(5)
511 fxc_aa%array(i, j, k) = fxc_aa%array(i, j, k) + eaa
512 fxc_ab%array(i, j, k) = fxc_ab%array(i, j, k) + eab
513 fxc_bb%array(i, j, k) = fxc_bb%array(i, j, k) + ebb
528 PURE SUBROUTINE calc_g(r, z, g, order)
536 REAL(kind=
dp),
INTENT(IN) :: r
537 INTEGER,
INTENT(IN) :: z
538 REAL(kind=
dp),
DIMENSION(0:),
INTENT(OUT) :: g
539 INTEGER,
INTENT(IN) :: order
541 REAL(kind=
dp) :: a1_, a_, b1_, b2_, b3_, b4_, rr, rsr, &
542 sr, t11, t12, t14, t15, t16, t20, t22, &
543 t3, t40, t44, t45, t47, t48, t55, t56
545 a_ = a(z); a1_ = a1(z)
546 b1_ = b1(z); b2_ = b2(z); b3_ = b3(z); b4_ = b4(z)
555 g(0) = c0(z)*log(r) - c1(z) + c2(z)*r*log(r) - c3(z)*r
556 IF (order >= 1) g(1) = c0(z)/r + c2(z)*log(r) + c2(z) - c3(z)
557 IF (order >= 2) g(2) = -c0(z)/rr + c2(z)/r
558 IF (order >= 3) g(3) = 2.0_dp*c0(z)/(rr*r) - c2(z)/rr
560 ELSE IF (r <= 100.0_dp)
THEN
563 t11 = b1_*sr + b2_*r + b3_*rsr + b4_*rr
565 t15 = 1.0_dp + 0.5_dp/a_/t11
567 t20 = 0.5_dp*b1_/sr + b2_ + 1.5_dp*b3_*sr + 2.0_dp*b4_*r
570 g(0) = -2.0_dp*a_*t3*t16
574 g(1) = -2.0_dp*a_*a1_*t16 + t3*t20/(t12*t15)
580 t40 = -0.25_dp*b1_/rsr + 0.75_dp*b3_/sr + 2.0_dp*b4_
582 g(2) = 2.0_dp*a1_*t20/(t12*t15) &
583 - 2.0_dp*(t20**2)*t3/(t12*t11*t15) &
585 + 0.5_dp*t3*(t20**2)/(a_*(t12**2)*(t15**2))
602 -6.0_dp*a1_*t14*t22/t15 &
603 + 3.0_dp*a1_*t40/(t15*t12) &
604 + 1.5_dp*a1_*t45*t22*t48/a_ &
605 + 6.0_dp*t55*t56/t15 &
606 - 6.0_dp*t3*t14*t20*t40/t15 &
607 - 3.0_dp*t3*t56*t48/(a_*t44*t11) &
608 + 0.375_dp*t3*(b1_/(rr*sr) - b3_/rsr)/(t12*t15) &
609 + 1.5_dp*t55*t40*t48*t20/a_ &
610 + 0.5_dp*t3*t56/((a_**2)*t44*t12*t47*t15)
617 g(0) = -d0(z)/r + d1(z)/rsr
618 IF (order >= 1) g(1) = d0(z)/rr - 1.5_dp*d1(z)/(rsr*r)
619 IF (order >= 2) g(2) = -2.0_dp*d0(z)/(rr*r) + 3.75_dp*d1(z)/(rsr*rr)
620 IF (order >= 3) g(3) = 6.0_dp*d0(z)/(rr*rr) - 13.125_dp*d1(z)/(rsr*rr*r)
624 END SUBROUTINE calc_g
632 SUBROUTINE pw_lda_ed_loc(rho, ed, order)
634 REAL(kind=
dp),
INTENT(IN) :: rho
635 REAL(kind=
dp),
DIMENSION(0:),
INTENT(OUT) :: ed
636 INTEGER,
INTENT(IN) :: order
639 LOGICAL,
DIMENSION(0:3) :: calc
640 REAL(kind=
dp),
DIMENSION(0:3) :: e0, r
646 IF (order_ >= 0)
THEN
647 calc(0:order_) = .true.
650 calc(order_) = .true.
654 CALL calc_g(r(0), 0, e0, order_)
656 IF (order_ >= 1) r(1) = (-1.0_dp/3.0_dp)*r(0)/rho
657 IF (order_ >= 2) r(2) = (-4.0_dp/3.0_dp)*r(1)/rho
658 IF (order_ >= 3) r(3) = (-7.0_dp/3.0_dp)*r(2)/rho
670 ed(m) = e0(2)*r(1)**2 + e0(1)*r(2)
674 ed(m) = e0(3)*r(1)**3 + e0(2)*3.0_dp*r(1)*r(2) + e0(1)*r(3)
677 END SUBROUTINE pw_lda_ed_loc
686 SUBROUTINE pw_lsd_ed_loc(a, b, ed, order)
688 REAL(kind=
dp),
INTENT(IN) :: a, b
689 REAL(kind=
dp),
DIMENSION(0:),
INTENT(OUT) :: ed
690 INTEGER,
INTENT(IN) :: order
693 LOGICAL,
DIMENSION(0:3) :: calc
694 REAL(kind=
dp) :: rho, tr, trr, trrr, trrz, trz, trzz, tz, &
696 REAL(kind=
dp),
DIMENSION(0:3) :: ac, e0, e1, f, r
697 REAL(kind=
dp),
DIMENSION(0:3, 0:3) :: z
703 calc(0:order_) = .true.
706 calc(order_) = .true.
711 CALL calc_fx(a, b, f(0:order_), order_)
713 CALL calc_g(r(0), -1, ac(0:order_), order_)
714 CALL calc_g(r(0), 0, e0(0:order_), order_)
715 CALL calc_g(r(0), 1, e1(0:order_), order_)
716 CALL calc_z(a, b, z(0:order_, 0:order_), order_)
719 IF (order_ >= 1)
THEN
720 r(1) = (-1.0_dp/3.0_dp)*r(0)/rho
723 - fpp*ac(1)*f(0)*z(0, 0)**4 &
724 + (e1(1) - e0(1))*f(0)*z(0, 0)**4
725 tz = fpp*ac(0)*f(1) &
726 - fpp*ac(0)*f(1)*z(0, 0)**4 &
727 - fpp*ac(0)*f(0)*4.0_dp*z(0, 0)**3 &
728 + (e1(0) - e0(0))*f(1)*z(0, 0)**4 &
729 + (e1(0) - e0(0))*f(0)*4.0_dp*z(0, 0)**3
733 IF (order_ >= 2)
THEN
734 r(2) = (-4.0_dp/3.0_dp)*r(1)/rho
737 - fpp*ac(2)*f(0)*z(0, 0)**4 &
738 + (e1(2) - e0(2))*f(0)*z(0, 0)**4
739 trz = fpp*ac(1)*f(1) &
740 - fpp*ac(1)*f(1)*z(0, 0)**4 &
741 - fpp*ac(1)*f(0)*4.0_dp*z(0, 0)**3 &
742 + (e1(1) - e0(1))*f(1)*z(0, 0)**4 &
743 + (e1(1) - e0(1))*f(0)*4.0_dp*z(0, 0)**3
744 tzz = fpp*ac(0)*f(2) &
745 - fpp*ac(0)*f(2)*z(0, 0)**4 &
746 - fpp*ac(0)*f(1)*8.0_dp*z(0, 0)**3 &
747 - fpp*ac(0)*f(0)*12.0_dp*z(0, 0)**2 &
748 + (e1(0) - e0(0))*f(2)*z(0, 0)**4 &
749 + (e1(0) - e0(0))*f(1)*8.0_dp*z(0, 0)**3 &
750 + (e1(0) - e0(0))*f(0)*12.0_dp*z(0, 0)**2
754 IF (order_ >= 3)
THEN
756 r(3) = (-7.0_dp/3.0_dp)*r(2)/rho
760 - fpp*ac(3)*f(0)*z(0, 0)**4 &
761 + (e1(3) - e0(3))*f(0)*z(0, 0)**4
763 trrz = fpp*ac(2)*f(1) &
764 - fpp*ac(2)*f(1)*z(0, 0)**4 &
765 - fpp*ac(2)*f(0)*4.0_dp*z(0, 0)**3 &
766 + (e1(2) - e0(2))*f(1)*z(0, 0)**4 &
767 + (e1(2) - e0(2))*f(0)*4.0_dp*z(0, 0)**3
769 trzz = fpp*ac(1)*f(2) &
770 - fpp*ac(1)*f(2)*z(0, 0)**4 &
771 - fpp*ac(1)*f(1)*8.0_dp*z(0, 0)**3 &
772 - fpp*ac(1)*f(0)*12.0_dp*z(0, 0)**2 &
773 + (e1(1) - e0(1))*f(2)*z(0, 0)**4 &
774 + (e1(1) - e0(1))*f(1)*8.0_dp*z(0, 0)**3 &
775 + (e1(1) - e0(1))*f(0)*12.0_dp*z(0, 0)**2
777 tzzz = fpp*ac(0)*f(3) &
778 - fpp*ac(0)*f(3)*z(0, 0)**4 &
779 - fpp*ac(0)*f(2)*12.0_dp*z(0, 0)**3 &
780 - fpp*ac(0)*f(1)*36.0_dp*z(0, 0)**2 &
781 - fpp*ac(0)*f(0)*24.0_dp*z(0, 0) &
782 + (e1(0) - e0(0))*f(3)*z(0, 0)**4 &
783 + (e1(0) - e0(0))*f(2)*12.0_dp*z(0, 0)**3 &
784 + (e1(0) - e0(0))*f(1)*36.0_dp*z(0, 0)**2 &
785 + (e1(0) - e0(0))*f(0)*24.0_dp*z(0, 0)
791 + fpp*ac(0)*f(0)*(1.0_dp - z(0, 0)**4) &
792 + (e1(0) - e0(0))*f(0)*z(0, 0)**4
796 ed(m) = tr*r(1) + tz*z(1, 0)
797 ed(m + 1) = tr*r(1) + tz*z(0, 1)
801 ed(m) = trr*r(1)**2 + 2.0_dp*trz*r(1)*z(1, 0) &
802 + tr*r(2) + tzz*z(1, 0)**2 + tz*z(2, 0)
803 ed(m + 1) = trr*r(1)**2 + trz*r(1)*(z(0, 1) + z(1, 0)) &
804 + tr*r(2) + tzz*z(1, 0)*z(0, 1) + tz*z(1, 1)
805 ed(m + 2) = trr*r(1)**2 + 2.0_dp*trz*r(1)*z(0, 1) &
806 + tr*r(2) + tzz*z(0, 1)**2 + tz*z(0, 2)
811 trrr*r(1)**3 + 3.0_dp*trrz*r(1)**2*z(1, 0) &
812 + 3.0_dp*trr*r(1)*r(2) + 3.0_dp*trz*r(2)*z(1, 0) + tr*r(3) &
813 + 3.0_dp*trzz*r(1)*z(1, 0)**2 + tzzz*z(1, 0)**3 &
814 + 3.0_dp*trz*r(1)*z(2, 0) &
815 + 3.0_dp*tzz*z(1, 0)*z(2, 0) + tz*z(3, 0)
817 trrr*r(1)**3 + trrz*r(1)**2*(2.0_dp*z(1, 0) + z(0, 1)) &
818 + 2.0_dp*trzz*r(1)*z(1, 0)*z(0, 1) &
819 + 2.0_dp*trz*(r(2)*z(1, 0) + r(1)*z(1, 1)) &
820 + 3.0_dp*trr*r(2)*r(1) + trz*r(2)*z(0, 1) + tr*r(3) &
821 + trzz*r(1)*z(1, 0)**2 + tzzz*z(1, 0)**2*z(0, 1) &
822 + 2.0_dp*tzz*z(1, 0)*z(1, 1) &
823 + trz*r(1)*z(2, 0) + tzz*z(2, 0)*z(0, 1) + tz*z(2, 1)
825 trrr*r(1)**3 + trrz*r(1)**2*(2.0_dp*z(0, 1) + z(1, 0)) &
826 + 2.0_dp*trzz*r(1)*z(0, 1)*z(1, 0) &
827 + 2.0_dp*trz*(r(2)*z(0, 1) + r(1)*z(1, 1)) &
828 + 3.0_dp*trr*r(2)*r(1) + trz*r(2)*z(1, 0) + tr*r(3) &
829 + trzz*r(1)*z(0, 1)**2 + tzzz*z(0, 1)**2*z(1, 0) &
830 + 2.0_dp*tzz*z(0, 1)*z(1, 1) &
831 + trz*r(1)*z(0, 2) + tzz*z(0, 2)*z(1, 0) + tz*z(1, 2)
833 trrr*r(1)**3 + 3.0_dp*trrz*r(1)**2*z(0, 1) &
834 + 3.0_dp*trr*r(1)*r(2) + 3.0_dp*trz*r(2)*z(0, 1) + tr*r(3) &
835 + 3.0_dp*trzz*r(1)*z(0, 1)**2 + tzzz*z(0, 1)**3 &
836 + 3.0_dp*trz*r(1)*z(0, 2) &
837 + 3.0_dp*tzz*z(0, 1)*z(0, 2) + tz*z(0, 3)
840 END SUBROUTINE pw_lsd_ed_loc
Defines the basic variable types.
integer, parameter, public dp
Module with functions to handle derivative descriptors. derivative description are strings have the f...
integer, parameter, public deriv_rhob
integer, parameter, public deriv_rhoa
integer, parameter, public deriv_rho
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
Utility routines for the functional calculations.
subroutine, public set_util(cutoff)
...
pure subroutine, public calc_z(a, b, z, order)
...
Calculate the Perdew-Wang correlation potential and energy density and ist derivatives with respect t...
subroutine, public perdew_wang_fxc_calc(rho_a, rho_b, fxc_aa, fxc_ab, fxc_bb, scalec, eps_rho)
...
subroutine, public perdew_wang_lda_eval(method, rho_set, deriv_set, order, scale)
Calculate the correlation energy and its derivatives wrt to rho (the electron density) up to 3rd orde...
subroutine, public perdew_wang_info(method, lsd, reference, shortform, needs, max_deriv, scale)
Return some info on the functionals.
subroutine, public perdew_wang_lsd_eval(method, rho_set, deriv_set, order, scale)
Calculate the correlation energy and its derivatives wrt to rho (the electron density) up to 3rd orde...
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
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