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
71 TYPE(xc_rho_cflags_type),
INTENT(inout),
OPTIONAL :: needs
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
210 INTEGER,
INTENT(in) :: method
211 TYPE(xc_rho_set_type),
INTENT(IN) :: rho_set
212 TYPE(xc_derivative_set_type),
INTENT(IN) :: deriv_set
213 INTEGER,
INTENT(in) :: order
214 REAL(kind=
dp),
INTENT(in) :: scale
216 CHARACTER(len=*),
PARAMETER :: routinen =
'perdew_wang_lda_eval'
218 INTEGER :: npoints, timer_handle
219 INTEGER,
DIMENSION(2, 3) :: bo
220 REAL(kind=
dp) :: rho_cutoff
221 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :, :),
POINTER :: dummy, e_0, e_rho, e_rho_rho, &
223 TYPE(xc_derivative_type),
POINTER :: deriv
225 CALL timeset(routinen, timer_handle)
226 NULLIFY (rho, e_0, e_rho, e_rho_rho, e_rho_rho_rho, dummy)
228 local_bounds=bo, rho_cutoff=rho_cutoff)
229 npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
231 CALL perdew_wang_init(method, rho_cutoff)
238 e_rho_rho_rho => dummy
242 allocate_deriv=.true.)
245 IF (order >= 1 .OR. order == -1)
THEN
247 allocate_deriv=.true.)
250 IF (order >= 2 .OR. order == -2)
THEN
252 allocate_deriv=.true.)
255 IF (order >= 3 .OR. order == -3)
THEN
257 allocate_deriv=.true.)
260 IF (order > 3 .OR. order < -3)
THEN
261 cpabort(
"derivatives bigger than 3 not implemented")
264 CALL perdew_wang_lda_calc(rho, e_0, e_rho, e_rho_rho, e_rho_rho_rho, &
265 npoints, order, scale)
267 CALL timestop(timer_handle)
282 SUBROUTINE perdew_wang_lda_calc(rho, e_0, e_rho, e_rho_rho, e_rho_rho_rho, npoints, order, scale)
284 REAL(kind=
dp),
DIMENSION(*),
INTENT(in) :: rho
285 REAL(kind=
dp),
DIMENSION(*),
INTENT(inout) :: e_0, e_rho, e_rho_rho, e_rho_rho_rho
286 INTEGER,
INTENT(in) :: npoints, order
287 REAL(kind=
dp),
INTENT(in) :: scale
289 INTEGER :: abs_order, k
290 REAL(kind=
dp),
DIMENSION(0:3) :: ed
292 abs_order = abs(order)
298 IF (rho(k) > eps_rho)
THEN
301 CALL pw_lda_ed_loc(rho(k), ed, abs_order)
302 ed(0:abs_order) = scale*ed(0:abs_order)
305 e_0(k) = e_0(k) + rho(k)*ed(0)
307 IF (order >= 1 .OR. order == -1)
THEN
308 e_rho(k) = e_rho(k) + ed(0) + rho(k)*ed(1)
310 IF (order >= 2 .OR. order == -2)
THEN
311 e_rho_rho(k) = e_rho_rho(k) + 2.0_dp*ed(1) + rho(k)*ed(2)
313 IF (order >= 3 .OR. order == -3)
THEN
314 e_rho_rho_rho(k) = e_rho_rho_rho(k) + 3.0_dp*ed(2) + rho(k)*ed(3)
322 END SUBROUTINE perdew_wang_lda_calc
340 INTEGER,
INTENT(in) :: method
341 TYPE(xc_rho_set_type),
INTENT(IN) :: rho_set
342 TYPE(xc_derivative_set_type),
INTENT(IN) :: deriv_set
343 INTEGER,
INTENT(IN),
OPTIONAL :: order
344 REAL(kind=
dp),
INTENT(in) :: scale
346 CHARACTER(len=*),
PARAMETER :: routinen =
'perdew_wang_lsd_eval'
348 INTEGER :: npoints, timer_handle
349 INTEGER,
DIMENSION(2, 3) :: bo
350 REAL(kind=
dp) :: rho_cutoff
351 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :, :),
POINTER :: a, b, dummy, e_0, ea, eaa, eaaa, eaab, &
352 eab, eabb, eb, ebb, ebbb
353 TYPE(xc_derivative_type),
POINTER :: deriv
355 CALL timeset(routinen, timer_handle)
356 NULLIFY (a, b, e_0, ea, eb, eaa, eab, ebb, eaaa, eaab, eabb, ebbb)
358 local_bounds=bo, rho_cutoff=rho_cutoff)
359 npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
361 CALL perdew_wang_init(method, rho_cutoff)
368 ea => dummy; eb => dummy
369 eaa => dummy; eab => dummy; ebb => dummy
370 eaaa => dummy; eaab => dummy; eabb => dummy; ebbb => dummy
374 allocate_deriv=.true.)
377 IF (order >= 1 .OR. order == -1)
THEN
379 allocate_deriv=.true.)
382 allocate_deriv=.true.)
385 IF (order >= 2 .OR. order == -2)
THEN
387 allocate_deriv=.true.)
390 allocate_deriv=.true.)
393 allocate_deriv=.true.)
396 IF (order >= 3 .OR. order == -3)
THEN
398 allocate_deriv=.true.)
401 allocate_deriv=.true.)
404 allocate_deriv=.true.)
407 allocate_deriv=.true.)
410 IF (order > 3 .OR. order < -3)
THEN
411 cpabort(
"derivatives bigger than 3 not implemented")
414 CALL perdew_wang_lsd_calc(a, b, e_0, ea, eb, eaa, eab, ebb, eaaa, eaab, eabb, &
415 ebbb, npoints, order, scale)
417 CALL timestop(timer_handle)
439 SUBROUTINE perdew_wang_lsd_calc(rhoa, rhob, e_0, ea, eb, eaa, eab, ebb, eaaa, eaab, eabb, &
440 ebbb, npoints, order, scale)
442 REAL(kind=
dp),
DIMENSION(*),
INTENT(in) :: rhoa, rhob
443 REAL(kind=
dp),
DIMENSION(*),
INTENT(inout) :: e_0, ea, eb, eaa, eab, ebb, eaaa, eaab, &
445 INTEGER,
INTENT(in) :: npoints, order
446 REAL(kind=
dp),
INTENT(in) :: scale
448 INTEGER :: abs_order, k
450 REAL(kind=
dp),
DIMENSION(0:9) :: ed
452 abs_order = abs(order)
458 rho = rhoa(k) + rhob(k)
459 IF (rho > eps_rho)
THEN
462 CALL pw_lsd_ed_loc(rhoa(k), rhob(k), ed, abs_order)
466 e_0(k) = e_0(k) + rho*ed(0)
468 IF (order >= 1 .OR. order == -1)
THEN
469 ea(k) = ea(k) + ed(0) + rho*ed(1)
470 eb(k) = eb(k) + ed(0) + rho*ed(2)
472 IF (order >= 2 .OR. order == -2)
THEN
473 eaa(k) = eaa(k) + 2.0_dp*ed(1) + rho*ed(3)
474 eab(k) = eab(k) + ed(1) + ed(2) + rho*ed(4)
475 ebb(k) = ebb(k) + 2.0_dp*ed(2) + rho*ed(5)
477 IF (order >= 3 .OR. order == -3)
THEN
478 eaaa(k) = eaaa(k) + 3.0_dp*ed(3) + rho*ed(6)
479 eaab(k) = eaab(k) + 2.0_dp*ed(4) + ed(3) + rho*ed(7)
480 eabb(k) = eabb(k) + 2.0_dp*ed(4) + ed(5) + rho*ed(8)
481 ebbb(k) = ebbb(k) + 3.0_dp*ed(5) + rho*ed(9)
488 END SUBROUTINE perdew_wang_lsd_calc
501 TYPE(pw_r3d_rs_type),
INTENT(IN) :: rho_a, rho_b
502 TYPE(pw_r3d_rs_type),
INTENT(INOUT) :: fxc_aa, fxc_ab, fxc_bb
503 REAL(kind=
dp),
INTENT(in) :: scalec, eps_rho
506 INTEGER,
DIMENSION(2, 3) :: bo
507 REAL(kind=
dp) :: rho, rhoa, rhob, eaa, eab, ebb
508 REAL(kind=
dp),
DIMENSION(0:9) :: ed
510 CALL perdew_wang_init(
pw_orig, eps_rho)
511 bo(1:2, 1:3) = rho_a%pw_grid%bounds_local(1:2, 1:3)
514 DO k = bo(1, 3), bo(2, 3)
515 DO j = bo(1, 2), bo(2, 2)
516 DO i = bo(1, 1), bo(2, 1)
517 rhoa = rho_a%array(i, j, k)
518 rhob = rho_b%array(i, j, k)
520 IF (rho > eps_rho)
THEN
522 CALL pw_lsd_ed_loc(rhoa, rhob, ed, 2)
524 eaa = 2.0_dp*ed(1) + rho*ed(3)
525 eab = ed(1) + ed(2) + rho*ed(4)
526 ebb = 2.0_dp*ed(2) + rho*ed(5)
527 fxc_aa%array(i, j, k) = fxc_aa%array(i, j, k) + eaa
528 fxc_ab%array(i, j, k) = fxc_ab%array(i, j, k) + eab
529 fxc_bb%array(i, j, k) = fxc_bb%array(i, j, k) + ebb
544 PURE SUBROUTINE calc_g(r, z, g, order)
552 REAL(kind=
dp),
INTENT(IN) :: r
553 INTEGER,
INTENT(IN) :: z
554 REAL(kind=
dp),
DIMENSION(0:),
INTENT(OUT) :: g
555 INTEGER,
INTENT(IN) :: order
557 REAL(kind=
dp) :: a1_, a_, b1_, b2_, b3_, b4_, rr, rsr, &
558 sr, t11, t12, t14, t15, t16, t20, t22, &
559 t3, t40, t44, t45, t47, t48, t55, t56
561 a_ = a(z); a1_ = a1(z)
562 b1_ = b1(z); b2_ = b2(z); b3_ = b3(z); b4_ = b4(z)
571 g(0) = c0(z)*log(r) - c1(z) + c2(z)*r*log(r) - c3(z)*r
572 IF (order >= 1) g(1) = c0(z)/r + c2(z)*log(r) + c2(z) - c3(z)
573 IF (order >= 2) g(2) = -c0(z)/rr + c2(z)/r
574 IF (order >= 3) g(3) = 2.0_dp*c0(z)/(rr*r) - c2(z)/rr
576 ELSE IF (r <= 100.0_dp)
THEN
579 t11 = b1_*sr + b2_*r + b3_*rsr + b4_*rr
581 t15 = 1.0_dp + 0.5_dp/a_/t11
583 t20 = 0.5_dp*b1_/sr + b2_ + 1.5_dp*b3_*sr + 2.0_dp*b4_*r
586 g(0) = -2.0_dp*a_*t3*t16
590 g(1) = -2.0_dp*a_*a1_*t16 + t3*t20/(t12*t15)
596 t40 = -0.25_dp*b1_/rsr + 0.75_dp*b3_/sr + 2.0_dp*b4_
598 g(2) = 2.0_dp*a1_*t20/(t12*t15) &
599 - 2.0_dp*(t20**2)*t3/(t12*t11*t15) &
601 + 0.5_dp*t3*(t20**2)/(a_*(t12**2)*(t15**2))
618 -6.0_dp*a1_*t14*t22/t15 &
619 + 3.0_dp*a1_*t40/(t15*t12) &
620 + 1.5_dp*a1_*t45*t22*t48/a_ &
621 + 6.0_dp*t55*t56/t15 &
622 - 6.0_dp*t3*t14*t20*t40/t15 &
623 - 3.0_dp*t3*t56*t48/(a_*t44*t11) &
624 + 0.375_dp*t3*(b1_/(rr*sr) - b3_/rsr)/(t12*t15) &
625 + 1.5_dp*t55*t40*t48*t20/a_ &
626 + 0.5_dp*t3*t56/((a_**2)*t44*t12*t47*t15)
633 g(0) = -d0(z)/r + d1(z)/rsr
634 IF (order >= 1) g(1) = d0(z)/rr - 1.5_dp*d1(z)/(rsr*r)
635 IF (order >= 2) g(2) = -2.0_dp*d0(z)/(rr*r) + 3.75_dp*d1(z)/(rsr*rr)
636 IF (order >= 3) g(3) = 6.0_dp*d0(z)/(rr*rr) - 13.125_dp*d1(z)/(rsr*rr*r)
640 END SUBROUTINE calc_g
648 SUBROUTINE pw_lda_ed_loc(rho, ed, order)
650 REAL(kind=
dp),
INTENT(IN) :: rho
651 REAL(kind=
dp),
DIMENSION(0:),
INTENT(OUT) :: ed
652 INTEGER,
INTENT(IN) :: order
655 LOGICAL,
DIMENSION(0:3) :: calc
656 REAL(kind=
dp),
DIMENSION(0:3) :: e0, r
662 IF (order_ >= 0)
THEN
663 calc(0:order_) = .true.
666 calc(order_) = .true.
669 CALL calc_rs(rho, r(0))
670 CALL calc_g(r(0), 0, e0, order_)
672 IF (order_ >= 1) r(1) = (-1.0_dp/3.0_dp)*r(0)/rho
673 IF (order_ >= 2) r(2) = (-4.0_dp/3.0_dp)*r(1)/rho
674 IF (order_ >= 3) r(3) = (-7.0_dp/3.0_dp)*r(2)/rho
686 ed(m) = e0(2)*r(1)**2 + e0(1)*r(2)
690 ed(m) = e0(3)*r(1)**3 + e0(2)*3.0_dp*r(1)*r(2) + e0(1)*r(3)
693 END SUBROUTINE pw_lda_ed_loc
702 SUBROUTINE pw_lsd_ed_loc(a, b, ed, order)
704 REAL(kind=
dp),
INTENT(IN) :: a, b
705 REAL(kind=
dp),
DIMENSION(0:),
INTENT(OUT) :: ed
706 INTEGER,
INTENT(IN) :: order
709 LOGICAL,
DIMENSION(0:3) :: calc
710 REAL(kind=
dp) :: rho, tr, trr, trrr, trrz, trz, trzz, tz, &
712 REAL(kind=
dp),
DIMENSION(0:3) :: ac, e0, e1, f, r
713 REAL(kind=
dp),
DIMENSION(0:3, 0:3) :: z
719 calc(0:order_) = .true.
722 calc(order_) = .true.
727 CALL calc_fx(a, b, f(0:order_), order_)
728 CALL calc_rs(rho, r(0))
729 CALL calc_g(r(0), -1, ac(0:order_), order_)
730 CALL calc_g(r(0), 0, e0(0:order_), order_)
731 CALL calc_g(r(0), 1, e1(0:order_), order_)
732 CALL calc_z(a, b, z(0:order_, 0:order_), order_)
735 IF (order_ >= 1)
THEN
736 r(1) = (-1.0_dp/3.0_dp)*r(0)/rho
739 - fpp*ac(1)*f(0)*z(0, 0)**4 &
740 + (e1(1) - e0(1))*f(0)*z(0, 0)**4
741 tz = fpp*ac(0)*f(1) &
742 - fpp*ac(0)*f(1)*z(0, 0)**4 &
743 - fpp*ac(0)*f(0)*4.0_dp*z(0, 0)**3 &
744 + (e1(0) - e0(0))*f(1)*z(0, 0)**4 &
745 + (e1(0) - e0(0))*f(0)*4.0_dp*z(0, 0)**3
749 IF (order_ >= 2)
THEN
750 r(2) = (-4.0_dp/3.0_dp)*r(1)/rho
753 - fpp*ac(2)*f(0)*z(0, 0)**4 &
754 + (e1(2) - e0(2))*f(0)*z(0, 0)**4
755 trz = fpp*ac(1)*f(1) &
756 - fpp*ac(1)*f(1)*z(0, 0)**4 &
757 - fpp*ac(1)*f(0)*4.0_dp*z(0, 0)**3 &
758 + (e1(1) - e0(1))*f(1)*z(0, 0)**4 &
759 + (e1(1) - e0(1))*f(0)*4.0_dp*z(0, 0)**3
760 tzz = fpp*ac(0)*f(2) &
761 - fpp*ac(0)*f(2)*z(0, 0)**4 &
762 - fpp*ac(0)*f(1)*8.0_dp*z(0, 0)**3 &
763 - fpp*ac(0)*f(0)*12.0_dp*z(0, 0)**2 &
764 + (e1(0) - e0(0))*f(2)*z(0, 0)**4 &
765 + (e1(0) - e0(0))*f(1)*8.0_dp*z(0, 0)**3 &
766 + (e1(0) - e0(0))*f(0)*12.0_dp*z(0, 0)**2
770 IF (order_ >= 3)
THEN
772 r(3) = (-7.0_dp/3.0_dp)*r(2)/rho
776 - fpp*ac(3)*f(0)*z(0, 0)**4 &
777 + (e1(3) - e0(3))*f(0)*z(0, 0)**4
779 trrz = fpp*ac(2)*f(1) &
780 - fpp*ac(2)*f(1)*z(0, 0)**4 &
781 - fpp*ac(2)*f(0)*4.0_dp*z(0, 0)**3 &
782 + (e1(2) - e0(2))*f(1)*z(0, 0)**4 &
783 + (e1(2) - e0(2))*f(0)*4.0_dp*z(0, 0)**3
785 trzz = fpp*ac(1)*f(2) &
786 - fpp*ac(1)*f(2)*z(0, 0)**4 &
787 - fpp*ac(1)*f(1)*8.0_dp*z(0, 0)**3 &
788 - fpp*ac(1)*f(0)*12.0_dp*z(0, 0)**2 &
789 + (e1(1) - e0(1))*f(2)*z(0, 0)**4 &
790 + (e1(1) - e0(1))*f(1)*8.0_dp*z(0, 0)**3 &
791 + (e1(1) - e0(1))*f(0)*12.0_dp*z(0, 0)**2
793 tzzz = fpp*ac(0)*f(3) &
794 - fpp*ac(0)*f(3)*z(0, 0)**4 &
795 - fpp*ac(0)*f(2)*12.0_dp*z(0, 0)**3 &
796 - fpp*ac(0)*f(1)*36.0_dp*z(0, 0)**2 &
797 - fpp*ac(0)*f(0)*24.0_dp*z(0, 0) &
798 + (e1(0) - e0(0))*f(3)*z(0, 0)**4 &
799 + (e1(0) - e0(0))*f(2)*12.0_dp*z(0, 0)**3 &
800 + (e1(0) - e0(0))*f(1)*36.0_dp*z(0, 0)**2 &
801 + (e1(0) - e0(0))*f(0)*24.0_dp*z(0, 0)
807 + fpp*ac(0)*f(0)*(1.0_dp - z(0, 0)**4) &
808 + (e1(0) - e0(0))*f(0)*z(0, 0)**4
812 ed(m) = tr*r(1) + tz*z(1, 0)
813 ed(m + 1) = tr*r(1) + tz*z(0, 1)
817 ed(m) = trr*r(1)**2 + 2.0_dp*trz*r(1)*z(1, 0) &
818 + tr*r(2) + tzz*z(1, 0)**2 + tz*z(2, 0)
819 ed(m + 1) = trr*r(1)**2 + trz*r(1)*(z(0, 1) + z(1, 0)) &
820 + tr*r(2) + tzz*z(1, 0)*z(0, 1) + tz*z(1, 1)
821 ed(m + 2) = trr*r(1)**2 + 2.0_dp*trz*r(1)*z(0, 1) &
822 + tr*r(2) + tzz*z(0, 1)**2 + tz*z(0, 2)
827 trrr*r(1)**3 + 3.0_dp*trrz*r(1)**2*z(1, 0) &
828 + 3.0_dp*trr*r(1)*r(2) + 3.0_dp*trz*r(2)*z(1, 0) + tr*r(3) &
829 + 3.0_dp*trzz*r(1)*z(1, 0)**2 + tzzz*z(1, 0)**3 &
830 + 3.0_dp*trz*r(1)*z(2, 0) &
831 + 3.0_dp*tzz*z(1, 0)*z(2, 0) + tz*z(3, 0)
833 trrr*r(1)**3 + trrz*r(1)**2*(2.0_dp*z(1, 0) + z(0, 1)) &
834 + 2.0_dp*trzz*r(1)*z(1, 0)*z(0, 1) &
835 + 2.0_dp*trz*(r(2)*z(1, 0) + r(1)*z(1, 1)) &
836 + 3.0_dp*trr*r(2)*r(1) + trz*r(2)*z(0, 1) + tr*r(3) &
837 + trzz*r(1)*z(1, 0)**2 + tzzz*z(1, 0)**2*z(0, 1) &
838 + 2.0_dp*tzz*z(1, 0)*z(1, 1) &
839 + trz*r(1)*z(2, 0) + tzz*z(2, 0)*z(0, 1) + tz*z(2, 1)
841 trrr*r(1)**3 + trrz*r(1)**2*(2.0_dp*z(0, 1) + z(1, 0)) &
842 + 2.0_dp*trzz*r(1)*z(0, 1)*z(1, 0) &
843 + 2.0_dp*trz*(r(2)*z(0, 1) + r(1)*z(1, 1)) &
844 + 3.0_dp*trr*r(2)*r(1) + trz*r(2)*z(1, 0) + tr*r(3) &
845 + trzz*r(1)*z(0, 1)**2 + tzzz*z(0, 1)**2*z(1, 0) &
846 + 2.0_dp*tzz*z(0, 1)*z(1, 1) &
847 + trz*r(1)*z(0, 2) + tzz*z(0, 2)*z(1, 0) + tz*z(1, 2)
849 trrr*r(1)**3 + 3.0_dp*trrz*r(1)**2*z(0, 1) &
850 + 3.0_dp*trr*r(1)*r(2) + 3.0_dp*trz*r(2)*z(0, 1) + tr*r(3) &
851 + 3.0_dp*trzz*r(1)*z(0, 1)**2 + tzzz*z(0, 1)**3 &
852 + 3.0_dp*trz*r(1)*z(0, 2) &
853 + 3.0_dp*tzz*z(0, 1)*z(0, 2) + tz*z(0, 3)
856 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