37 #include "../base/base_uses.f90"
43 REAL(KIND=
dp),
PARAMETER :: f13 = 1.0_dp/3.0_dp, &
47 REAL(KIND=
dp),
PARAMETER :: a0 = 0.4581652932831429e+0_dp, &
48 a1 = 0.2217058676663745e+1_dp, &
49 a2 = 0.7405551735357053e+0_dp, &
50 a3 = 0.1968227878617998e-1_dp, &
51 b1 = 1.0000000000000000e+0_dp, &
52 b2 = 0.4504130959426697e+1_dp, &
53 b3 = 0.1110667363742916e+1_dp, &
54 b4 = 0.2359291751427506e-1_dp
56 REAL(KIND=
dp),
PARAMETER :: da0 = 0.119086804055547e+0_dp, &
57 da1 = 0.6157402568883345e+0_dp, &
58 da2 = 0.1574201515892867e+0_dp, &
59 da3 = 0.3532336663397157e-2_dp, &
60 db1 = 0.0000000000000000e+0_dp, &
61 db2 = 0.2673612973836267e+0_dp, &
62 db3 = 0.2052004607777787e+0_dp, &
63 db4 = 0.4200005045691381e-2_dp
65 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'xc_pade'
69 REAL(KIND=
dp) :: eps_rho
81 REAL(kind=
dp),
INTENT(IN) :: cutoff
82 LOGICAL,
INTENT(IN),
OPTIONAL :: debug
89 IF (
PRESENT(debug))
THEN
105 SUBROUTINE pade_info(reference, shortform, lsd, needs, max_deriv)
107 CHARACTER(LEN=*),
INTENT(OUT),
OPTIONAL :: reference, shortform
108 LOGICAL,
INTENT(IN),
OPTIONAL :: lsd
109 TYPE(xc_rho_cflags_type),
INTENT(inout),
OPTIONAL :: needs
110 INTEGER,
INTENT(out),
OPTIONAL :: max_deriv
112 IF (
PRESENT(reference))
THEN
113 reference =
"S. Goedecker, M. Teter and J. Hutter," &
114 //
" Phys. Rev. B 54, 1703 (1996)"
116 IF (
PRESENT(shortform))
THEN
117 shortform =
"S. Goedecker et al., PRB 54, 1703 (1996)"
120 IF (
PRESENT(needs))
THEN
121 IF (.NOT.
PRESENT(lsd)) &
122 cpabort(
"Arguments mismatch.")
124 needs%rho_spin = .true.
130 IF (
PRESENT(max_deriv)) max_deriv = 3
142 TYPE(xc_derivative_set_type),
INTENT(IN) :: deriv_set
143 TYPE(xc_rho_set_type),
INTENT(IN) :: rho_set
144 INTEGER,
INTENT(IN),
OPTIONAL :: order
148 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: rs
149 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :, :), &
150 POINTER :: e_0, e_r, e_rr, e_rrr
151 TYPE(xc_derivative_type),
POINTER :: deriv
154 IF (order >= 0) calc(0:order) = .true.
155 IF (order < 0) calc(-order) = .true.
157 n = product(rho_set%local_bounds(2, :) - rho_set%local_bounds(1, :) + (/1, 1, 1/))
161 IF (calc(0) .AND. calc(1))
THEN
163 allocate_deriv=.true.)
166 allocate_deriv=.true.)
168 CALL pade_lda_01(n, rho_set%rho, rs, e_0, e_r)
169 ELSE IF (calc(0))
THEN
171 allocate_deriv=.true.)
173 CALL pade_lda_0(n, rho_set%rho, rs, e_0)
174 ELSE IF (calc(1))
THEN
176 allocate_deriv=.true.)
178 CALL pade_lda_1(n, rho_set%rho, rs, e_r)
182 allocate_deriv=.true.)
184 CALL pade_lda_2(n, rho_set%rho, rs, e_rr)
188 allocate_deriv=.true.)
190 CALL pade_lda_3(n, rho_set%rho, rs, e_rrr)
205 TYPE(xc_derivative_set_type),
INTENT(IN) :: deriv_set
206 TYPE(xc_rho_set_type),
INTENT(IN) :: rho_set
207 INTEGER,
INTENT(IN),
OPTIONAL :: order
211 REAL(kind=
dp) :: rhoa, rhob, rs
212 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :, :), &
213 POINTER :: e_0, e_ra, e_rara, e_rarara, e_rararb, &
214 e_rarb, e_rarbrb, e_rb, e_rbrb, &
216 REAL(kind=
dp),
DIMENSION(4) :: fx
217 TYPE(xc_derivative_type),
POINTER :: deriv
220 IF (order >= 0) calc(0:order) = .true.
221 IF (order < 0) calc(-order) = .true.
225 allocate_deriv=.true.)
230 allocate_deriv=.true.)
233 allocate_deriv=.true.)
238 allocate_deriv=.true.)
241 allocate_deriv=.true.)
244 allocate_deriv=.true.)
249 allocate_deriv=.true.)
252 allocate_deriv=.true.)
255 allocate_deriv=.true.)
258 allocate_deriv=.true.)
264 DO i = rho_set%local_bounds(1, 1), rho_set%local_bounds(2, 1)
265 DO j = rho_set%local_bounds(1, 2), rho_set%local_bounds(2, 2)
266 DO k = rho_set%local_bounds(1, 3), rho_set%local_bounds(2, 3)
268 rhoa = rho_set%rhoa(i, j, k)
269 rhob = rho_set%rhob(i, j, k)
272 CALL calc_rs(fx(1), rs)
273 CALL calc_fx(rhoa, rhob, fx, abs(order))
275 IF (calc(0) .AND. calc(1))
THEN
276 CALL pade_lsd_01(rhoa, rhob, rs, fx, &
277 e_0(i, j, k), e_ra(i, j, k), e_rb(i, j, k))
278 ELSE IF (calc(0))
THEN
279 CALL pade_lsd_0(rhoa, rhob, rs, fx, e_0(i, j, k))
280 ELSE IF (calc(1))
THEN
281 CALL pade_lsd_1(rhoa, rhob, rs, fx, &
282 e_ra(i, j, k), e_rb(i, j, k))
285 CALL pade_lsd_2(rhoa, rhob, rs, fx, &
286 e_rara(i, j, k), e_rarb(i, j, k), e_rbrb(i, j, k))
289 CALL pade_lsd_3(rhoa, rhob, rs, fx, &
290 e_rarara(i, j, k), e_rararb(i, j, k), e_rarbrb(i, j, k), e_rbrbrb(i, j, k))
305 SUBROUTINE pade_lda_0(n, rho, rs, pot)
307 INTEGER,
INTENT(IN) :: n
308 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, rs
309 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: pot
312 REAL(kind=
dp) :: epade, p, q
317 IF (rho(ip) > eps_rho)
THEN
318 p = a0 + (a1 + (a2 + a3*rs(ip))*rs(ip))*rs(ip)
319 q = (b1 + (b2 + (b3 + b4*rs(ip))*rs(ip))*rs(ip))*rs(ip)
321 pot(ip) = pot(ip) + epade*rho(ip)
325 END SUBROUTINE pade_lda_0
334 SUBROUTINE pade_lda_1(n, rho, rs, pot)
336 INTEGER,
INTENT(IN) :: n
337 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, rs
338 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: pot
341 REAL(kind=
dp) :: depade, dpv, dq, epade, p, q
347 IF (rho(ip) > eps_rho)
THEN
349 p = a0 + (a1 + (a2 + a3*rs(ip))*rs(ip))*rs(ip)
350 q = (b1 + (b2 + (b3 + b4*rs(ip))*rs(ip))*rs(ip))*rs(ip)
353 dpv = a1 + (2.0_dp*a2 + 3.0_dp*a3*rs(ip))*rs(ip)
354 dq = b1 + (2.0_dp*b2 + (3.0_dp*b3 + 4.0_dp*b4*rs(ip))*rs(ip))*rs(ip)
355 depade = f13*rs(ip)*(dpv*q - p*dq)/(q*q)
357 pot(ip) = pot(ip) + epade + depade
362 END SUBROUTINE pade_lda_1
372 SUBROUTINE pade_lda_01(n, rho, rs, pot0, pot1)
374 INTEGER,
INTENT(IN) :: n
375 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, rs
376 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: pot0, pot1
379 REAL(kind=
dp) :: depade, dpv, dq, epade, p, q
385 IF (rho(ip) > eps_rho)
THEN
387 p = a0 + (a1 + (a2 + a3*rs(ip))*rs(ip))*rs(ip)
388 q = (b1 + (b2 + (b3 + b4*rs(ip))*rs(ip))*rs(ip))*rs(ip)
391 dpv = a1 + (2.0_dp*a2 + 3.0_dp*a3*rs(ip))*rs(ip)
392 dq = b1 + (2.0_dp*b2 + (3.0_dp*b3 + 4.0_dp*b4*rs(ip))*rs(ip))*rs(ip)
393 depade = f13*rs(ip)*(dpv*q - p*dq)/(q*q)
395 pot0(ip) = pot0(ip) + epade*rho(ip)
396 pot1(ip) = pot1(ip) + epade + depade
401 END SUBROUTINE pade_lda_01
410 SUBROUTINE pade_lda_2(n, rho, rs, pot)
412 INTEGER,
INTENT(IN) :: n
413 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, rs
414 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: pot
417 REAL(kind=
dp) :: d2p, d2q, dpv, dq, p, q, rsr, t1, t2, t3
423 IF (rho(ip) > eps_rho)
THEN
425 p = a0 + (a1 + (a2 + a3*rs(ip))*rs(ip))*rs(ip)
426 q = (b1 + (b2 + (b3 + b4*rs(ip))*rs(ip))*rs(ip))*rs(ip)
428 dpv = a1 + (2.0_dp*a2 + 3.0_dp*a3*rs(ip))*rs(ip)
429 dq = b1 + (2.0_dp*b2 + (3.0_dp*b3 + 4.0_dp*b4*rs(ip))*rs(ip))*rs(ip)
431 d2p = 2.0_dp*a2 + 6.0_dp*a3*rs(ip)
432 d2q = 2.0_dp*b2 + (6.0_dp*b3 + 12.0_dp*b4*rs(ip))*rs(ip)
435 t1 = (p*dq - dpv*q)/(q*q)
436 t2 = (d2p*q - p*d2q)/(q*q)
437 t3 = (p*dq*dq - dpv*q*dq)/(q*q*q)
439 pot(ip) = pot(ip) - f13*(f23*t1 + f13*t2*rs(ip) + f23*t3*rs(ip))*rsr
444 END SUBROUTINE pade_lda_2
453 SUBROUTINE pade_lda_3(n, rho, rs, pot)
455 INTEGER,
INTENT(IN) :: n
456 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, rs
457 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: pot
460 REAL(kind=
dp) :: ab1, ab2, ab3, d2p, d2q, d3p, d3q, dpv, &
461 dq, p, q, rsr1, rsr2, rsr3
467 IF (rho(ip) > eps_rho)
THEN
469 p = a0 + (a1 + (a2 + a3*rs(ip))*rs(ip))*rs(ip)
470 q = (b1 + (b2 + (b3 + b4*rs(ip))*rs(ip))*rs(ip))*rs(ip)
472 dpv = a1 + (2.0_dp*a2 + 3.0_dp*a3*rs(ip))*rs(ip)
473 dq = b1 + (2.0_dp*b2 + (3.0_dp*b3 + 4.0_dp*b4*rs(ip))*rs(ip))*rs(ip)
475 d2p = 2.0_dp*a2 + 6.0_dp*a3*rs(ip)
476 d2q = 2.0_dp*b2 + (6.0_dp*b3 + 12.0_dp*b4*rs(ip))*rs(ip)
479 d3q = 6.0_dp*b3 + 24.0_dp*b4*rs(ip)
481 ab1 = (dpv*q - p*dq)/(q*q)
482 ab2 = (d2p*q*q - p*q*d2q - 2.0_dp*dpv*q*dq + 2.0_dp*p*dq*dq)/(q*q*q)
483 ab3 = (d3p*q*q - p*q*d3q - 3.0_dp*dpv*q*d2q + 3.0_dp*p*dq*d2q)/(q*q*q)
484 ab3 = ab3 - 3.0_dp*ab2*dq/q
485 rsr1 = rs(ip)/(rho(ip)*rho(ip))
486 rsr2 = f13*f13*rs(ip)*rsr1
487 rsr3 = f13*rs(ip)*rsr2
488 rsr1 = -f23*f23*f23*rsr1
489 pot(ip) = pot(ip) + rsr1*ab1 + rsr2*ab2 + rsr3*ab3
494 END SUBROUTINE pade_lda_3
504 SUBROUTINE pade_lsd_0(rhoa, rhob, rs, fx, pot0)
506 REAL(kind=
dp),
INTENT(IN) :: rhoa, rhob, rs
507 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: fx
508 REAL(kind=
dp),
INTENT(INOUT) :: pot0
510 REAL(kind=
dp) :: fa0, fa1, fa2, fa3, fb1, fb2, fb3, fb4, &
515 IF (rhoab > eps_rho)
THEN
526 p = fa0 + (fa1 + (fa2 + fa3*rs)*rs)*rs
527 q = (fb1 + (fb2 + (fb3 + fb4*rs)*rs)*rs)*rs
529 pot0 = pot0 - p/q*rhoab
533 END SUBROUTINE pade_lsd_0
544 SUBROUTINE pade_lsd_1(rhoa, rhob, rs, fx, pota, potb)
546 REAL(kind=
dp),
INTENT(IN) :: rhoa, rhob, rs
547 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: fx
548 REAL(kind=
dp),
INTENT(INOUT) :: pota, potb
550 REAL(kind=
dp) :: dc, dpv, dq, dr, dx, fa0, fa1, fa2, fa3, &
551 fb1, fb2, fb3, fb4, p, q, rhoab, xp, xq
555 IF (rhoab > eps_rho)
THEN
566 p = fa0 + (fa1 + (fa2 + fa3*rs)*rs)*rs
567 q = (fb1 + (fb2 + (fb3 + fb4*rs)*rs)*rs)*rs
568 dpv = fa1 + (2.0_dp*fa2 + 3.0_dp*fa3*rs)*rs
569 dq = fb1 + (2.0_dp*fb2 + (3.0_dp*fb3 + &
570 4.0_dp*fb4*rs)*rs)*rs
571 xp = da0 + (da1 + (da2 + da3*rs)*rs)*rs
572 xq = (db1 + (db2 + (db3 + db4*rs)*rs)*rs)*rs
574 dr = (dpv*q - p*dq)/(q*q)
575 dx = 2.0_dp*(xp*q - p*xq)/(q*q)*fx(2)/rhoab
578 pota = pota + dc - dx*rhob
579 potb = potb + dc + dx*rhoa
583 END SUBROUTINE pade_lsd_1
595 SUBROUTINE pade_lsd_01(rhoa, rhob, rs, fx, pot0, pota, potb)
597 REAL(kind=
dp),
INTENT(IN) :: rhoa, rhob, rs
598 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: fx
599 REAL(kind=
dp),
INTENT(INOUT) :: pot0, pota, potb
601 REAL(kind=
dp) :: dc, dpv, dq, dr, dx, fa0, fa1, fa2, fa3, &
602 fb1, fb2, fb3, fb4, p, q, rhoab, xp, xq
606 IF (rhoab > eps_rho)
THEN
617 p = fa0 + (fa1 + (fa2 + fa3*rs)*rs)*rs
618 q = (fb1 + (fb2 + (fb3 + fb4*rs)*rs)*rs)*rs
619 dpv = fa1 + (2.0_dp*fa2 + 3.0_dp*fa3*rs)*rs
620 dq = fb1 + (2.0_dp*fb2 + (3.0_dp*fb3 + &
621 4.0_dp*fb4*rs)*rs)*rs
622 xp = da0 + (da1 + (da2 + da3*rs)*rs)*rs
623 xq = (db1 + (db2 + (db3 + db4*rs)*rs)*rs)*rs
625 dr = (dpv*q - p*dq)/(q*q)
626 dx = 2.0_dp*(xp*q - p*xq)/(q*q)*fx(2)/rhoab
629 pot0 = pot0 - p/q*rhoab
630 pota = pota + dc - dx*rhob
631 potb = potb + dc + dx*rhoa
635 END SUBROUTINE pade_lsd_01
647 SUBROUTINE pade_lsd_2(rhoa, rhob, rs, fx, potaa, potab, potbb)
649 REAL(kind=
dp),
INTENT(IN) :: rhoa, rhob, rs
650 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: fx
651 REAL(kind=
dp),
INTENT(INOUT) :: potaa, potab, potbb
653 REAL(kind=
dp) :: d2p, d2q, dpv, dq, dr, drr, dx, dxp, &
654 dxq, dxr, dxx, fa0, fa1, fa2, fa3, &
655 fb1, fb2, fb3, fb4, or, p, q, rhoab, &
660 IF (rhoab > eps_rho)
THEN
671 p = fa0 + (fa1 + (fa2 + fa3*rs)*rs)*rs
672 q = (fb1 + (fb2 + (fb3 + fb4*rs)*rs)*rs)*rs
674 dpv = fa1 + (2.0_dp*fa2 + 3.0_dp*fa3*rs)*rs
675 dq = fb1 + (2.0_dp*fb2 + (3.0_dp*fb3 + &
676 4.0_dp*fb4*rs)*rs)*rs
678 d2p = 2.0_dp*fa2 + 6.0_dp*fa3*rs
679 d2q = 2.0_dp*fb2 + (6.0_dp*fb3 + 12.0_dp*fb4*rs)*rs
681 xp = da0 + (da1 + (da2 + da3*rs)*rs)*rs
682 xq = (db1 + (db2 + (db3 + db4*rs)*rs)*rs)*rs
684 dxp = da1 + (2.0_dp*da2 + 3.0_dp*da3*rs)*rs
685 dxq = db1 + (2.0_dp*db2 + (3.0_dp*db3 + &
686 4.0_dp*db4*rs)*rs)*rs
688 dr = (dpv*q - p*dq)/(q*q)
689 drr = (d2p*q*q - p*q*d2q - 2.0_dp*dpv*q*dq + 2.0_dp*p*dq*dq)/(q*q*q)
690 dx = (xp*q - p*xq)/(q*q)
691 dxx = 2.0_dp*xq*(p*xq - xp*q)/(q*q*q)
692 dxr = (dxp*q*q + dpv*xq*q - xp*dq*q - p*dxq*q - 2.0_dp*dpv*q*xq + 2.0_dp*p*dq*xq)/(q*q*q)
698 potaa = potaa + f23*f13*dr*rs*or - f13*f13*drr*rs*rs*or &
699 + f43*rs*fx(2)*dxr*yt*or &
700 - 4.0_dp*fx(2)*fx(2)*dxx*yt*yt*or &
701 - 4.0_dp*dx*fx(3)*yt*yt*or
702 potab = potab + f23*f13*dr*rs*or - f13*f13*drr*rs*rs*or &
703 + f23*rs*fx(2)*dxr*(yt - xt)*or &
704 + 4.0_dp*fx(2)*fx(2)*dxx*xt*yt*or &
705 + 4.0_dp*dx*fx(3)*xt*yt*or
706 potbb = potbb + f23*f13*dr*rs*or - f13*f13*drr*rs*rs*or &
707 - f43*rs*fx(2)*dxr*xt*or &
708 - 4.0_dp*fx(2)*fx(2)*dxx*xt*xt*or &
709 - 4.0_dp*dx*fx(3)*xt*xt*or
713 END SUBROUTINE pade_lsd_2
726 SUBROUTINE pade_lsd_3(rhoa, rhob, rs, fx, potaaa, potaab, potabb, potbbb)
728 REAL(kind=
dp),
INTENT(IN) :: rhoa, rhob, rs
729 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: fx
730 REAL(kind=
dp),
INTENT(INOUT) :: potaaa, potaab, potabb, potbbb
732 REAL(kind=
dp) :: d2p, d2q, d2xp, d2xq, d3p, d3q, dpv, dq, dr, drr, drrr, dx, dxp, dxq, dxr, &
733 dxrr, dxx, dxxr, dxxx, fa0, fa1, fa2, fa3, fb1, fb2, fb3, fb4, or, p, q, rhoab, xp, xq, &
736 IF (.NOT. debug_flag) cpabort(
"Routine not tested")
740 IF (rhoab > eps_rho)
THEN
751 p = fa0 + (fa1 + (fa2 + fa3*rs)*rs)*rs
752 q = (fb1 + (fb2 + (fb3 + fb4*rs)*rs)*rs)*rs
754 dpv = fa1 + (2.0_dp*fa2 + 3.0_dp*fa3*rs)*rs
755 dq = fb1 + (2.0_dp*fb2 + (3.0_dp*fb3 + &
756 4.0_dp*fb4*rs)*rs)*rs
758 d2p = 2.0_dp*fa2 + 6.0_dp*fa3*rs
759 d2q = 2.0_dp*fb2 + (6.0_dp*fb3 + 12.0_dp*fb4*rs)*rs
762 d3q = 6.0_dp*fb3 + 24.0_dp*fb4*rs
764 xp = da0 + (da1 + (da2 + da3*rs)*rs)*rs
765 xq = (db1 + (db2 + (db3 + db4*rs)*rs)*rs)*rs
767 dxp = da1 + (2.0_dp*da2 + 3.0_dp*da3*rs)*rs
768 dxq = db1 + (2.0_dp*db2 + (3.0_dp*db3 + &
769 4.0_dp*db4*rs)*rs)*rs
771 d2xp = 2.0_dp*da2 + 6.0_dp*da3*rs
772 d2xq = 2.0_dp*db2 + (6.0_dp*db3 + 12.0_dp*db4*rs)*rs
774 dr = (dpv*q - p*dq)/(q*q)
775 drr = (d2p*q*q - p*q*d2q - 2.0_dp*dpv*q*dq + 2.0_dp*p*dq*dq)/(q*q*q)
776 drrr = (d3p*q*q*q - 3.0_dp*d2p*dq*q*q + 6.0_dp*dpv*dq*dq*q - 3.0_dp*dpv*d2q*q*q - &
777 6.0_dp*p*dq*dq*dq + 6.0_dp*p*dq*d2q*q - p*d3q*q*q)/(q*q*q*q)
778 dx = (xp*q - p*xq)/(q*q)
779 dxx = 2.0_dp*xq*(p*xq - xp*q)/(q*q*q)
780 dxxx = 6.0_dp*xq*(q*xp*xq - p*xq*xq)/(q*q*q*q)
781 dxr = (dxp*q*q + dpv*xq*q - xp*dq*q - p*dxq*q - 2.0_dp*dpv*q*xq + 2.0_dp*p*dq*xq)/(q*q*q)
782 dxxr = 2.0_dp*(2.0_dp*dxq*q*p*xq - dxq*q*q*xp + xq*xq*q*dpv - xq*q*q*dxp + &
783 2.0_dp*xq*q*xp*dq - 3.0_dp*xq*xq*dq*p)/(q*q*q*q)
784 dxrr = (q*q*q*d2xp - 2.0_dp*q*q*dxp*dq - q*q*xp*d2q - q*q*d2p*xq - &
785 2.0_dp*q*q*dpv*dxq - q*q*p*d2xq + 4.0_dp*dq*q*dpv*xq + 4.0_dp*dq*q*p*dxq + &
786 2.0_dp*dq*dq*q*xp - 6.0_dp*dq*dq*p*xq + 2.0_dp*d2q*q*p*xq)/(q*q*q*q)
792 potaaa = potaaa + 8.0_dp/27.0_dp*dr*rs*or*or + &
793 1.0_dp/9.0_dp*drr*rs*rs*or*or + &
794 1.0_dp/27.0_dp*drrr*rs**3*or*or + &
795 dxr*or*or*yt*rs*(-8.0_dp/3.0_dp*fx(2) + 4.0_dp*fx(3)*yt)
796 potaab = potaab + 0.0_dp
797 potabb = potabb + 0.0_dp
798 potbbb = potbbb + 0.0_dp
802 END SUBROUTINE pade_lsd_3
813 TYPE(pw_r3d_rs_type),
INTENT(IN) :: rho_a, rho_b
814 TYPE(pw_r3d_rs_type),
INTENT(INOUT) :: fxc_aa, fxc_ab, fxc_bb
817 INTEGER,
DIMENSION(2, 3) :: bo
818 REAL(kind=
dp) :: eaa, eab, ebb, rhoa, rhob, rs
819 REAL(kind=
dp),
DIMENSION(4) :: fx
821 bo(1:2, 1:3) = rho_a%pw_grid%bounds_local(1:2, 1:3)
824 DO k = bo(1, 3), bo(2, 3)
825 DO j = bo(1, 2), bo(2, 2)
826 DO i = bo(1, 1), bo(2, 1)
828 rhoa = rho_a%array(i, j, k)
829 rhob = rho_b%array(i, j, k)
832 CALL calc_rs(fx(1), rs)
833 CALL calc_fx(rhoa, rhob, fx, 2)
835 eaa = 0.0_dp; eab = 0.0_dp; ebb = 0.0_dp
836 CALL pade_lsd_2(rhoa, rhob, rs, fx, eaa, eab, ebb)
838 fxc_aa%array(i, j, k) = eaa
839 fxc_ab%array(i, j, k) = eab
840 fxc_bb%array(i, j, k) = ebb
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public goedecker1996
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 calc_rs_pw(rho, rs, n)
...
subroutine, public set_util(cutoff)
...
Calculate the LDA functional in the Pade approximation Literature: S. Goedecker, M....
subroutine, public pade_fxc_eval(rho_a, rho_b, fxc_aa, fxc_ab, fxc_bb)
...
subroutine, public pade_init(cutoff, debug)
...
subroutine, public pade_lsd_pw_eval(deriv_set, rho_set, order)
...
subroutine, public pade_info(reference, shortform, lsd, needs, max_deriv)
...
subroutine, public pade_lda_pw_eval(deriv_set, rho_set, order)
...