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
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))
THEN
122 cpabort(
"Arguments mismatch.")
125 needs%rho_spin = .true.
131 IF (
PRESENT(max_deriv)) max_deriv = 3
145 INTEGER,
INTENT(IN),
OPTIONAL :: order
149 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: rs
150 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :, :), &
151 POINTER :: e_0, e_r, e_rr, e_rrr
155 calc(0: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)
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
220 calc(0:order) = .true.
224 allocate_deriv=.true.)
229 allocate_deriv=.true.)
232 allocate_deriv=.true.)
237 allocate_deriv=.true.)
240 allocate_deriv=.true.)
243 allocate_deriv=.true.)
248 allocate_deriv=.true.)
251 allocate_deriv=.true.)
254 allocate_deriv=.true.)
257 allocate_deriv=.true.)
263 DO i = rho_set%local_bounds(1, 1), rho_set%local_bounds(2, 1)
264 DO j = rho_set%local_bounds(1, 2), rho_set%local_bounds(2, 2)
265 DO k = rho_set%local_bounds(1, 3), rho_set%local_bounds(2, 3)
267 rhoa = rho_set%rhoa(i, j, k)
268 rhob = rho_set%rhob(i, j, k)
272 CALL calc_fx(rhoa, rhob, fx, abs(order))
274 IF (calc(0) .AND. calc(1))
THEN
275 CALL pade_lsd_01(rhoa, rhob, rs, fx, &
276 e_0(i, j, k), e_ra(i, j, k), e_rb(i, j, k))
277 ELSE IF (calc(0))
THEN
278 CALL pade_lsd_0(rhoa, rhob, rs, fx, e_0(i, j, k))
279 ELSE IF (calc(1))
THEN
280 CALL pade_lsd_1(rhoa, rhob, rs, fx, &
281 e_ra(i, j, k), e_rb(i, j, k))
284 CALL pade_lsd_2(rhoa, rhob, rs, fx, &
285 e_rara(i, j, k), e_rarb(i, j, k), e_rbrb(i, j, k))
288 CALL pade_lsd_3(rhoa, rhob, rs, fx, &
289 e_rarara(i, j, k), e_rararb(i, j, k), e_rarbrb(i, j, k), e_rbrbrb(i, j, k))
304 SUBROUTINE pade_lda_0(n, rho, rs, pot)
306 INTEGER,
INTENT(IN) :: n
307 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, rs
308 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: pot
311 REAL(kind=
dp) :: epade, p, q
316 IF (rho(ip) > eps_rho)
THEN
317 p = a0 + (a1 + (a2 + a3*rs(ip))*rs(ip))*rs(ip)
318 q = (b1 + (b2 + (b3 + b4*rs(ip))*rs(ip))*rs(ip))*rs(ip)
320 pot(ip) = pot(ip) + epade*rho(ip)
324 END SUBROUTINE pade_lda_0
333 SUBROUTINE pade_lda_1(n, rho, rs, pot)
335 INTEGER,
INTENT(IN) :: n
336 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, rs
337 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: pot
340 REAL(kind=
dp) :: depade, dpv, dq, epade, p, q
346 IF (rho(ip) > eps_rho)
THEN
348 p = a0 + (a1 + (a2 + a3*rs(ip))*rs(ip))*rs(ip)
349 q = (b1 + (b2 + (b3 + b4*rs(ip))*rs(ip))*rs(ip))*rs(ip)
352 dpv = a1 + (2.0_dp*a2 + 3.0_dp*a3*rs(ip))*rs(ip)
353 dq = b1 + (2.0_dp*b2 + (3.0_dp*b3 + 4.0_dp*b4*rs(ip))*rs(ip))*rs(ip)
354 depade = f13*rs(ip)*(dpv*q - p*dq)/(q*q)
356 pot(ip) = pot(ip) + epade + depade
361 END SUBROUTINE pade_lda_1
371 SUBROUTINE pade_lda_01(n, rho, rs, pot0, pot1)
373 INTEGER,
INTENT(IN) :: n
374 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, rs
375 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: pot0, pot1
378 REAL(kind=
dp) :: depade, dpv, dq, epade, p, q
384 IF (rho(ip) > eps_rho)
THEN
386 p = a0 + (a1 + (a2 + a3*rs(ip))*rs(ip))*rs(ip)
387 q = (b1 + (b2 + (b3 + b4*rs(ip))*rs(ip))*rs(ip))*rs(ip)
390 dpv = a1 + (2.0_dp*a2 + 3.0_dp*a3*rs(ip))*rs(ip)
391 dq = b1 + (2.0_dp*b2 + (3.0_dp*b3 + 4.0_dp*b4*rs(ip))*rs(ip))*rs(ip)
392 depade = f13*rs(ip)*(dpv*q - p*dq)/(q*q)
394 pot0(ip) = pot0(ip) + epade*rho(ip)
395 pot1(ip) = pot1(ip) + epade + depade
400 END SUBROUTINE pade_lda_01
409 SUBROUTINE pade_lda_2(n, rho, rs, pot)
411 INTEGER,
INTENT(IN) :: n
412 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, rs
413 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: pot
416 REAL(kind=
dp) :: d2p, d2q, dpv, dq, p, q, rsr, t1, t2, t3
422 IF (rho(ip) > eps_rho)
THEN
424 p = a0 + (a1 + (a2 + a3*rs(ip))*rs(ip))*rs(ip)
425 q = (b1 + (b2 + (b3 + b4*rs(ip))*rs(ip))*rs(ip))*rs(ip)
427 dpv = a1 + (2.0_dp*a2 + 3.0_dp*a3*rs(ip))*rs(ip)
428 dq = b1 + (2.0_dp*b2 + (3.0_dp*b3 + 4.0_dp*b4*rs(ip))*rs(ip))*rs(ip)
430 d2p = 2.0_dp*a2 + 6.0_dp*a3*rs(ip)
431 d2q = 2.0_dp*b2 + (6.0_dp*b3 + 12.0_dp*b4*rs(ip))*rs(ip)
434 t1 = (p*dq - dpv*q)/(q*q)
435 t2 = (d2p*q - p*d2q)/(q*q)
436 t3 = (p*dq*dq - dpv*q*dq)/(q*q*q)
438 pot(ip) = pot(ip) - f13*(f23*t1 + f13*t2*rs(ip) + f23*t3*rs(ip))*rsr
443 END SUBROUTINE pade_lda_2
452 SUBROUTINE pade_lda_3(n, rho, rs, pot)
454 INTEGER,
INTENT(IN) :: n
455 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, rs
456 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: pot
459 REAL(kind=
dp) :: ab1, ab2, ab3, d2p, d2q, d3p, d3q, dpv, &
460 dq, p, q, rsr1, rsr2, rsr3
466 IF (rho(ip) > eps_rho)
THEN
468 p = a0 + (a1 + (a2 + a3*rs(ip))*rs(ip))*rs(ip)
469 q = (b1 + (b2 + (b3 + b4*rs(ip))*rs(ip))*rs(ip))*rs(ip)
471 dpv = a1 + (2.0_dp*a2 + 3.0_dp*a3*rs(ip))*rs(ip)
472 dq = b1 + (2.0_dp*b2 + (3.0_dp*b3 + 4.0_dp*b4*rs(ip))*rs(ip))*rs(ip)
474 d2p = 2.0_dp*a2 + 6.0_dp*a3*rs(ip)
475 d2q = 2.0_dp*b2 + (6.0_dp*b3 + 12.0_dp*b4*rs(ip))*rs(ip)
478 d3q = 6.0_dp*b3 + 24.0_dp*b4*rs(ip)
480 ab1 = (dpv*q - p*dq)/(q*q)
481 ab2 = (d2p*q*q - p*q*d2q - 2.0_dp*dpv*q*dq + 2.0_dp*p*dq*dq)/(q*q*q)
482 ab3 = (d3p*q*q - p*q*d3q - 3.0_dp*dpv*q*d2q + 3.0_dp*p*dq*d2q)/(q*q*q)
483 ab3 = ab3 - 3.0_dp*ab2*dq/q
484 rsr1 = rs(ip)/(rho(ip)*rho(ip))
485 rsr2 = f13*f13*rs(ip)*rsr1
486 rsr3 = f13*rs(ip)*rsr2
487 rsr1 = -f23*f23*f23*rsr1
488 pot(ip) = pot(ip) + rsr1*ab1 + rsr2*ab2 + rsr3*ab3
493 END SUBROUTINE pade_lda_3
503 SUBROUTINE pade_lsd_0(rhoa, rhob, rs, fx, pot0)
505 REAL(kind=
dp),
INTENT(IN) :: rhoa, rhob, rs
506 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: fx
507 REAL(kind=
dp),
INTENT(INOUT) :: pot0
509 REAL(kind=
dp) :: fa0, fa1, fa2, fa3, fb1, fb2, fb3, fb4, &
514 IF (rhoab > eps_rho)
THEN
525 p = fa0 + (fa1 + (fa2 + fa3*rs)*rs)*rs
526 q = (fb1 + (fb2 + (fb3 + fb4*rs)*rs)*rs)*rs
528 pot0 = pot0 - p/q*rhoab
532 END SUBROUTINE pade_lsd_0
543 SUBROUTINE pade_lsd_1(rhoa, rhob, rs, fx, pota, potb)
545 REAL(kind=
dp),
INTENT(IN) :: rhoa, rhob, rs
546 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: fx
547 REAL(kind=
dp),
INTENT(INOUT) :: pota, potb
549 REAL(kind=
dp) :: dc, dpv, dq, dr, dx, fa0, fa1, fa2, fa3, &
550 fb1, fb2, fb3, fb4, p, q, rhoab, xp, xq
554 IF (rhoab > eps_rho)
THEN
565 p = fa0 + (fa1 + (fa2 + fa3*rs)*rs)*rs
566 q = (fb1 + (fb2 + (fb3 + fb4*rs)*rs)*rs)*rs
567 dpv = fa1 + (2.0_dp*fa2 + 3.0_dp*fa3*rs)*rs
568 dq = fb1 + (2.0_dp*fb2 + (3.0_dp*fb3 + &
569 4.0_dp*fb4*rs)*rs)*rs
570 xp = da0 + (da1 + (da2 + da3*rs)*rs)*rs
571 xq = (db1 + (db2 + (db3 + db4*rs)*rs)*rs)*rs
573 dr = (dpv*q - p*dq)/(q*q)
574 dx = 2.0_dp*(xp*q - p*xq)/(q*q)*fx(2)/rhoab
577 pota = pota + dc - dx*rhob
578 potb = potb + dc + dx*rhoa
582 END SUBROUTINE pade_lsd_1
594 SUBROUTINE pade_lsd_01(rhoa, rhob, rs, fx, pot0, pota, potb)
596 REAL(kind=
dp),
INTENT(IN) :: rhoa, rhob, rs
597 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: fx
598 REAL(kind=
dp),
INTENT(INOUT) :: pot0, pota, potb
600 REAL(kind=
dp) :: dc, dpv, dq, dr, dx, fa0, fa1, fa2, fa3, &
601 fb1, fb2, fb3, fb4, p, q, rhoab, xp, xq
605 IF (rhoab > eps_rho)
THEN
616 p = fa0 + (fa1 + (fa2 + fa3*rs)*rs)*rs
617 q = (fb1 + (fb2 + (fb3 + fb4*rs)*rs)*rs)*rs
618 dpv = fa1 + (2.0_dp*fa2 + 3.0_dp*fa3*rs)*rs
619 dq = fb1 + (2.0_dp*fb2 + (3.0_dp*fb3 + &
620 4.0_dp*fb4*rs)*rs)*rs
621 xp = da0 + (da1 + (da2 + da3*rs)*rs)*rs
622 xq = (db1 + (db2 + (db3 + db4*rs)*rs)*rs)*rs
624 dr = (dpv*q - p*dq)/(q*q)
625 dx = 2.0_dp*(xp*q - p*xq)/(q*q)*fx(2)/rhoab
628 pot0 = pot0 - p/q*rhoab
629 pota = pota + dc - dx*rhob
630 potb = potb + dc + dx*rhoa
634 END SUBROUTINE pade_lsd_01
646 SUBROUTINE pade_lsd_2(rhoa, rhob, rs, fx, potaa, potab, potbb)
648 REAL(kind=
dp),
INTENT(IN) :: rhoa, rhob, rs
649 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: fx
650 REAL(kind=
dp),
INTENT(INOUT) :: potaa, potab, potbb
652 REAL(kind=
dp) :: d2p, d2q, dpv, dq, dr, drr, dx, dxp, &
653 dxq, dxr, dxx, fa0, fa1, fa2, fa3, &
654 fb1, fb2, fb3, fb4, or, p, q, rhoab, &
659 IF (rhoab > eps_rho)
THEN
670 p = fa0 + (fa1 + (fa2 + fa3*rs)*rs)*rs
671 q = (fb1 + (fb2 + (fb3 + fb4*rs)*rs)*rs)*rs
673 dpv = fa1 + (2.0_dp*fa2 + 3.0_dp*fa3*rs)*rs
674 dq = fb1 + (2.0_dp*fb2 + (3.0_dp*fb3 + &
675 4.0_dp*fb4*rs)*rs)*rs
677 d2p = 2.0_dp*fa2 + 6.0_dp*fa3*rs
678 d2q = 2.0_dp*fb2 + (6.0_dp*fb3 + 12.0_dp*fb4*rs)*rs
680 xp = da0 + (da1 + (da2 + da3*rs)*rs)*rs
681 xq = (db1 + (db2 + (db3 + db4*rs)*rs)*rs)*rs
683 dxp = da1 + (2.0_dp*da2 + 3.0_dp*da3*rs)*rs
684 dxq = db1 + (2.0_dp*db2 + (3.0_dp*db3 + &
685 4.0_dp*db4*rs)*rs)*rs
687 dr = (dpv*q - p*dq)/(q*q)
688 drr = (d2p*q*q - p*q*d2q - 2.0_dp*dpv*q*dq + 2.0_dp*p*dq*dq)/(q*q*q)
689 dx = (xp*q - p*xq)/(q*q)
690 dxx = 2.0_dp*xq*(p*xq - xp*q)/(q*q*q)
691 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)
697 potaa = potaa + f23*f13*dr*rs*or - f13*f13*drr*rs*rs*or &
698 + f43*rs*fx(2)*dxr*yt*or &
699 - 4.0_dp*fx(2)*fx(2)*dxx*yt*yt*or &
700 - 4.0_dp*dx*fx(3)*yt*yt*or
701 potab = potab + f23*f13*dr*rs*or - f13*f13*drr*rs*rs*or &
702 + f23*rs*fx(2)*dxr*(yt - xt)*or &
703 + 4.0_dp*fx(2)*fx(2)*dxx*xt*yt*or &
704 + 4.0_dp*dx*fx(3)*xt*yt*or
705 potbb = potbb + f23*f13*dr*rs*or - f13*f13*drr*rs*rs*or &
706 - f43*rs*fx(2)*dxr*xt*or &
707 - 4.0_dp*fx(2)*fx(2)*dxx*xt*xt*or &
708 - 4.0_dp*dx*fx(3)*xt*xt*or
712 END SUBROUTINE pade_lsd_2
725 SUBROUTINE pade_lsd_3(rhoa, rhob, rs, fx, potaaa, potaab, potabb, potbbb)
727 REAL(kind=
dp),
INTENT(IN) :: rhoa, rhob, rs
728 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: fx
729 REAL(kind=
dp),
INTENT(INOUT) :: potaaa, potaab, potabb, potbbb
731 REAL(kind=
dp) :: d2p, d2q, d2xp, d2xq, d3p, d3q, dpv, dq, dr, drr, drrr, dx, dxp, dxq, dxr, &
732 dxrr, dxx, dxxr, dxxx, fa0, fa1, fa2, fa3, fb1, fb2, fb3, fb4, or, p, q, rhoab, xp, xq, &
735 IF (.NOT. debug_flag) cpabort(
"Routine not tested")
739 IF (rhoab > eps_rho)
THEN
750 p = fa0 + (fa1 + (fa2 + fa3*rs)*rs)*rs
751 q = (fb1 + (fb2 + (fb3 + fb4*rs)*rs)*rs)*rs
753 dpv = fa1 + (2.0_dp*fa2 + 3.0_dp*fa3*rs)*rs
754 dq = fb1 + (2.0_dp*fb2 + (3.0_dp*fb3 + &
755 4.0_dp*fb4*rs)*rs)*rs
757 d2p = 2.0_dp*fa2 + 6.0_dp*fa3*rs
758 d2q = 2.0_dp*fb2 + (6.0_dp*fb3 + 12.0_dp*fb4*rs)*rs
761 d3q = 6.0_dp*fb3 + 24.0_dp*fb4*rs
763 xp = da0 + (da1 + (da2 + da3*rs)*rs)*rs
764 xq = (db1 + (db2 + (db3 + db4*rs)*rs)*rs)*rs
766 dxp = da1 + (2.0_dp*da2 + 3.0_dp*da3*rs)*rs
767 dxq = db1 + (2.0_dp*db2 + (3.0_dp*db3 + &
768 4.0_dp*db4*rs)*rs)*rs
770 d2xp = 2.0_dp*da2 + 6.0_dp*da3*rs
771 d2xq = 2.0_dp*db2 + (6.0_dp*db3 + 12.0_dp*db4*rs)*rs
773 dr = (dpv*q - p*dq)/(q*q)
774 drr = (d2p*q*q - p*q*d2q - 2.0_dp*dpv*q*dq + 2.0_dp*p*dq*dq)/(q*q*q)
775 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 - &
776 6.0_dp*p*dq*dq*dq + 6.0_dp*p*dq*d2q*q - p*d3q*q*q)/(q*q*q*q)
777 dx = (xp*q - p*xq)/(q*q)
778 dxx = 2.0_dp*xq*(p*xq - xp*q)/(q*q*q)
779 dxxx = 6.0_dp*xq*(q*xp*xq - p*xq*xq)/(q*q*q*q)
780 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)
781 dxxr = 2.0_dp*(2.0_dp*dxq*q*p*xq - dxq*q*q*xp + xq*xq*q*dpv - xq*q*q*dxp + &
782 2.0_dp*xq*q*xp*dq - 3.0_dp*xq*xq*dq*p)/(q*q*q*q)
783 dxrr = (q*q*q*d2xp - 2.0_dp*q*q*dxp*dq - q*q*xp*d2q - q*q*d2p*xq - &
784 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 + &
785 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)
791 potaaa = potaaa + 8.0_dp/27.0_dp*dr*rs*or*or + &
792 1.0_dp/9.0_dp*drr*rs*rs*or*or + &
793 1.0_dp/27.0_dp*drrr*rs**3*or*or + &
794 dxr*or*or*yt*rs*(-8.0_dp/3.0_dp*fx(2) + 4.0_dp*fx(3)*yt)
795 potaab = potaab + 0.0_dp
796 potabb = potabb + 0.0_dp
797 potbbb = potbbb + 0.0_dp
801 END SUBROUTINE pade_lsd_3
816 INTEGER,
DIMENSION(2, 3) :: bo
817 REAL(kind=
dp) :: eaa, eab, ebb, rhoa, rhob, rs
818 REAL(kind=
dp),
DIMENSION(4) :: fx
820 bo(1:2, 1:3) = rho_a%pw_grid%bounds_local(1:2, 1:3)
823 DO k = bo(1, 3), bo(2, 3)
824 DO j = bo(1, 2), bo(2, 2)
825 DO i = bo(1, 1), bo(2, 1)
827 rhoa = rho_a%array(i, j, k)
828 rhob = rho_b%array(i, j, k)
832 CALL calc_fx(rhoa, rhob, fx, 2)
834 eaa = 0.0_dp; eab = 0.0_dp; ebb = 0.0_dp
835 CALL pade_lsd_2(rhoa, rhob, rs, fx, eaa, eab, ebb)
837 fxc_aa%array(i, j, k) = eaa
838 fxc_ab%array(i, j, k) = eab
839 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)
...
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