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 IF (order >= 0) calc(0:order) = .true.
156 IF (order < 0) calc(-order) = .true.
158 n = product(rho_set%local_bounds(2, :) - rho_set%local_bounds(1, :) + [1, 1, 1])
162 IF (calc(0) .AND. calc(1))
THEN
164 allocate_deriv=.true.)
167 allocate_deriv=.true.)
169 CALL pade_lda_01(n, rho_set%rho, rs, e_0, e_r)
170 ELSE IF (calc(0))
THEN
172 allocate_deriv=.true.)
174 CALL pade_lda_0(n, rho_set%rho, rs, e_0)
175 ELSE IF (calc(1))
THEN
177 allocate_deriv=.true.)
179 CALL pade_lda_1(n, rho_set%rho, rs, e_r)
183 allocate_deriv=.true.)
185 CALL pade_lda_2(n, rho_set%rho, rs, e_rr)
189 allocate_deriv=.true.)
191 CALL pade_lda_3(n, rho_set%rho, rs, e_rrr)
208 INTEGER,
INTENT(IN),
OPTIONAL :: order
212 REAL(kind=
dp) :: rhoa, rhob, rs
213 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :, :), &
214 POINTER :: e_0, e_ra, e_rara, e_rarara, e_rararb, &
215 e_rarb, e_rarbrb, e_rb, e_rbrb, &
217 REAL(kind=
dp),
DIMENSION(4) :: fx
221 IF (order >= 0) calc(0:order) = .true.
222 IF (order < 0) calc(-order) = .true.
226 allocate_deriv=.true.)
231 allocate_deriv=.true.)
234 allocate_deriv=.true.)
239 allocate_deriv=.true.)
242 allocate_deriv=.true.)
245 allocate_deriv=.true.)
250 allocate_deriv=.true.)
253 allocate_deriv=.true.)
256 allocate_deriv=.true.)
259 allocate_deriv=.true.)
265 DO i = rho_set%local_bounds(1, 1), rho_set%local_bounds(2, 1)
266 DO j = rho_set%local_bounds(1, 2), rho_set%local_bounds(2, 2)
267 DO k = rho_set%local_bounds(1, 3), rho_set%local_bounds(2, 3)
269 rhoa = rho_set%rhoa(i, j, k)
270 rhob = rho_set%rhob(i, j, k)
274 CALL calc_fx(rhoa, rhob, fx, abs(order))
276 IF (calc(0) .AND. calc(1))
THEN
277 CALL pade_lsd_01(rhoa, rhob, rs, fx, &
278 e_0(i, j, k), e_ra(i, j, k), e_rb(i, j, k))
279 ELSE IF (calc(0))
THEN
280 CALL pade_lsd_0(rhoa, rhob, rs, fx, e_0(i, j, k))
281 ELSE IF (calc(1))
THEN
282 CALL pade_lsd_1(rhoa, rhob, rs, fx, &
283 e_ra(i, j, k), e_rb(i, j, k))
286 CALL pade_lsd_2(rhoa, rhob, rs, fx, &
287 e_rara(i, j, k), e_rarb(i, j, k), e_rbrb(i, j, k))
290 CALL pade_lsd_3(rhoa, rhob, rs, fx, &
291 e_rarara(i, j, k), e_rararb(i, j, k), e_rarbrb(i, j, k), e_rbrbrb(i, j, k))
306 SUBROUTINE pade_lda_0(n, rho, rs, pot)
308 INTEGER,
INTENT(IN) :: n
309 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, rs
310 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: pot
313 REAL(kind=
dp) :: epade, p, q
318 IF (rho(ip) > eps_rho)
THEN
319 p = a0 + (a1 + (a2 + a3*rs(ip))*rs(ip))*rs(ip)
320 q = (b1 + (b2 + (b3 + b4*rs(ip))*rs(ip))*rs(ip))*rs(ip)
322 pot(ip) = pot(ip) + epade*rho(ip)
326 END SUBROUTINE pade_lda_0
335 SUBROUTINE pade_lda_1(n, rho, rs, pot)
337 INTEGER,
INTENT(IN) :: n
338 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, rs
339 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: pot
342 REAL(kind=
dp) :: depade, dpv, dq, epade, p, q
348 IF (rho(ip) > eps_rho)
THEN
350 p = a0 + (a1 + (a2 + a3*rs(ip))*rs(ip))*rs(ip)
351 q = (b1 + (b2 + (b3 + b4*rs(ip))*rs(ip))*rs(ip))*rs(ip)
354 dpv = a1 + (2.0_dp*a2 + 3.0_dp*a3*rs(ip))*rs(ip)
355 dq = b1 + (2.0_dp*b2 + (3.0_dp*b3 + 4.0_dp*b4*rs(ip))*rs(ip))*rs(ip)
356 depade = f13*rs(ip)*(dpv*q - p*dq)/(q*q)
358 pot(ip) = pot(ip) + epade + depade
363 END SUBROUTINE pade_lda_1
373 SUBROUTINE pade_lda_01(n, rho, rs, pot0, pot1)
375 INTEGER,
INTENT(IN) :: n
376 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, rs
377 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: pot0, pot1
380 REAL(kind=
dp) :: depade, dpv, dq, epade, p, q
386 IF (rho(ip) > eps_rho)
THEN
388 p = a0 + (a1 + (a2 + a3*rs(ip))*rs(ip))*rs(ip)
389 q = (b1 + (b2 + (b3 + b4*rs(ip))*rs(ip))*rs(ip))*rs(ip)
392 dpv = a1 + (2.0_dp*a2 + 3.0_dp*a3*rs(ip))*rs(ip)
393 dq = b1 + (2.0_dp*b2 + (3.0_dp*b3 + 4.0_dp*b4*rs(ip))*rs(ip))*rs(ip)
394 depade = f13*rs(ip)*(dpv*q - p*dq)/(q*q)
396 pot0(ip) = pot0(ip) + epade*rho(ip)
397 pot1(ip) = pot1(ip) + epade + depade
402 END SUBROUTINE pade_lda_01
411 SUBROUTINE pade_lda_2(n, rho, rs, pot)
413 INTEGER,
INTENT(IN) :: n
414 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, rs
415 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: pot
418 REAL(kind=
dp) :: d2p, d2q, dpv, dq, p, q, rsr, t1, t2, t3
424 IF (rho(ip) > eps_rho)
THEN
426 p = a0 + (a1 + (a2 + a3*rs(ip))*rs(ip))*rs(ip)
427 q = (b1 + (b2 + (b3 + b4*rs(ip))*rs(ip))*rs(ip))*rs(ip)
429 dpv = a1 + (2.0_dp*a2 + 3.0_dp*a3*rs(ip))*rs(ip)
430 dq = b1 + (2.0_dp*b2 + (3.0_dp*b3 + 4.0_dp*b4*rs(ip))*rs(ip))*rs(ip)
432 d2p = 2.0_dp*a2 + 6.0_dp*a3*rs(ip)
433 d2q = 2.0_dp*b2 + (6.0_dp*b3 + 12.0_dp*b4*rs(ip))*rs(ip)
436 t1 = (p*dq - dpv*q)/(q*q)
437 t2 = (d2p*q - p*d2q)/(q*q)
438 t3 = (p*dq*dq - dpv*q*dq)/(q*q*q)
440 pot(ip) = pot(ip) - f13*(f23*t1 + f13*t2*rs(ip) + f23*t3*rs(ip))*rsr
445 END SUBROUTINE pade_lda_2
454 SUBROUTINE pade_lda_3(n, rho, rs, pot)
456 INTEGER,
INTENT(IN) :: n
457 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, rs
458 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: pot
461 REAL(kind=
dp) :: ab1, ab2, ab3, d2p, d2q, d3p, d3q, dpv, &
462 dq, p, q, rsr1, rsr2, rsr3
468 IF (rho(ip) > eps_rho)
THEN
470 p = a0 + (a1 + (a2 + a3*rs(ip))*rs(ip))*rs(ip)
471 q = (b1 + (b2 + (b3 + b4*rs(ip))*rs(ip))*rs(ip))*rs(ip)
473 dpv = a1 + (2.0_dp*a2 + 3.0_dp*a3*rs(ip))*rs(ip)
474 dq = b1 + (2.0_dp*b2 + (3.0_dp*b3 + 4.0_dp*b4*rs(ip))*rs(ip))*rs(ip)
476 d2p = 2.0_dp*a2 + 6.0_dp*a3*rs(ip)
477 d2q = 2.0_dp*b2 + (6.0_dp*b3 + 12.0_dp*b4*rs(ip))*rs(ip)
480 d3q = 6.0_dp*b3 + 24.0_dp*b4*rs(ip)
482 ab1 = (dpv*q - p*dq)/(q*q)
483 ab2 = (d2p*q*q - p*q*d2q - 2.0_dp*dpv*q*dq + 2.0_dp*p*dq*dq)/(q*q*q)
484 ab3 = (d3p*q*q - p*q*d3q - 3.0_dp*dpv*q*d2q + 3.0_dp*p*dq*d2q)/(q*q*q)
485 ab3 = ab3 - 3.0_dp*ab2*dq/q
486 rsr1 = rs(ip)/(rho(ip)*rho(ip))
487 rsr2 = f13*f13*rs(ip)*rsr1
488 rsr3 = f13*rs(ip)*rsr2
489 rsr1 = -f23*f23*f23*rsr1
490 pot(ip) = pot(ip) + rsr1*ab1 + rsr2*ab2 + rsr3*ab3
495 END SUBROUTINE pade_lda_3
505 SUBROUTINE pade_lsd_0(rhoa, rhob, rs, fx, pot0)
507 REAL(kind=
dp),
INTENT(IN) :: rhoa, rhob, rs
508 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: fx
509 REAL(kind=
dp),
INTENT(INOUT) :: pot0
511 REAL(kind=
dp) :: fa0, fa1, fa2, fa3, fb1, fb2, fb3, fb4, &
516 IF (rhoab > eps_rho)
THEN
527 p = fa0 + (fa1 + (fa2 + fa3*rs)*rs)*rs
528 q = (fb1 + (fb2 + (fb3 + fb4*rs)*rs)*rs)*rs
530 pot0 = pot0 - p/q*rhoab
534 END SUBROUTINE pade_lsd_0
545 SUBROUTINE pade_lsd_1(rhoa, rhob, rs, fx, pota, potb)
547 REAL(kind=
dp),
INTENT(IN) :: rhoa, rhob, rs
548 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: fx
549 REAL(kind=
dp),
INTENT(INOUT) :: pota, potb
551 REAL(kind=
dp) :: dc, dpv, dq, dr, dx, fa0, fa1, fa2, fa3, &
552 fb1, fb2, fb3, fb4, p, q, rhoab, xp, xq
556 IF (rhoab > eps_rho)
THEN
567 p = fa0 + (fa1 + (fa2 + fa3*rs)*rs)*rs
568 q = (fb1 + (fb2 + (fb3 + fb4*rs)*rs)*rs)*rs
569 dpv = fa1 + (2.0_dp*fa2 + 3.0_dp*fa3*rs)*rs
570 dq = fb1 + (2.0_dp*fb2 + (3.0_dp*fb3 + &
571 4.0_dp*fb4*rs)*rs)*rs
572 xp = da0 + (da1 + (da2 + da3*rs)*rs)*rs
573 xq = (db1 + (db2 + (db3 + db4*rs)*rs)*rs)*rs
575 dr = (dpv*q - p*dq)/(q*q)
576 dx = 2.0_dp*(xp*q - p*xq)/(q*q)*fx(2)/rhoab
579 pota = pota + dc - dx*rhob
580 potb = potb + dc + dx*rhoa
584 END SUBROUTINE pade_lsd_1
596 SUBROUTINE pade_lsd_01(rhoa, rhob, rs, fx, pot0, pota, potb)
598 REAL(kind=
dp),
INTENT(IN) :: rhoa, rhob, rs
599 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: fx
600 REAL(kind=
dp),
INTENT(INOUT) :: pot0, pota, potb
602 REAL(kind=
dp) :: dc, dpv, dq, dr, dx, fa0, fa1, fa2, fa3, &
603 fb1, fb2, fb3, fb4, p, q, rhoab, xp, xq
607 IF (rhoab > eps_rho)
THEN
618 p = fa0 + (fa1 + (fa2 + fa3*rs)*rs)*rs
619 q = (fb1 + (fb2 + (fb3 + fb4*rs)*rs)*rs)*rs
620 dpv = fa1 + (2.0_dp*fa2 + 3.0_dp*fa3*rs)*rs
621 dq = fb1 + (2.0_dp*fb2 + (3.0_dp*fb3 + &
622 4.0_dp*fb4*rs)*rs)*rs
623 xp = da0 + (da1 + (da2 + da3*rs)*rs)*rs
624 xq = (db1 + (db2 + (db3 + db4*rs)*rs)*rs)*rs
626 dr = (dpv*q - p*dq)/(q*q)
627 dx = 2.0_dp*(xp*q - p*xq)/(q*q)*fx(2)/rhoab
630 pot0 = pot0 - p/q*rhoab
631 pota = pota + dc - dx*rhob
632 potb = potb + dc + dx*rhoa
636 END SUBROUTINE pade_lsd_01
648 SUBROUTINE pade_lsd_2(rhoa, rhob, rs, fx, potaa, potab, potbb)
650 REAL(kind=
dp),
INTENT(IN) :: rhoa, rhob, rs
651 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: fx
652 REAL(kind=
dp),
INTENT(INOUT) :: potaa, potab, potbb
654 REAL(kind=
dp) :: d2p, d2q, dpv, dq, dr, drr, dx, dxp, &
655 dxq, dxr, dxx, fa0, fa1, fa2, fa3, &
656 fb1, fb2, fb3, fb4, or, p, q, rhoab, &
661 IF (rhoab > eps_rho)
THEN
672 p = fa0 + (fa1 + (fa2 + fa3*rs)*rs)*rs
673 q = (fb1 + (fb2 + (fb3 + fb4*rs)*rs)*rs)*rs
675 dpv = fa1 + (2.0_dp*fa2 + 3.0_dp*fa3*rs)*rs
676 dq = fb1 + (2.0_dp*fb2 + (3.0_dp*fb3 + &
677 4.0_dp*fb4*rs)*rs)*rs
679 d2p = 2.0_dp*fa2 + 6.0_dp*fa3*rs
680 d2q = 2.0_dp*fb2 + (6.0_dp*fb3 + 12.0_dp*fb4*rs)*rs
682 xp = da0 + (da1 + (da2 + da3*rs)*rs)*rs
683 xq = (db1 + (db2 + (db3 + db4*rs)*rs)*rs)*rs
685 dxp = da1 + (2.0_dp*da2 + 3.0_dp*da3*rs)*rs
686 dxq = db1 + (2.0_dp*db2 + (3.0_dp*db3 + &
687 4.0_dp*db4*rs)*rs)*rs
689 dr = (dpv*q - p*dq)/(q*q)
690 drr = (d2p*q*q - p*q*d2q - 2.0_dp*dpv*q*dq + 2.0_dp*p*dq*dq)/(q*q*q)
691 dx = (xp*q - p*xq)/(q*q)
692 dxx = 2.0_dp*xq*(p*xq - xp*q)/(q*q*q)
693 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)
699 potaa = potaa + f23*f13*dr*rs*or - f13*f13*drr*rs*rs*or &
700 + f43*rs*fx(2)*dxr*yt*or &
701 - 4.0_dp*fx(2)*fx(2)*dxx*yt*yt*or &
702 - 4.0_dp*dx*fx(3)*yt*yt*or
703 potab = potab + f23*f13*dr*rs*or - f13*f13*drr*rs*rs*or &
704 + f23*rs*fx(2)*dxr*(yt - xt)*or &
705 + 4.0_dp*fx(2)*fx(2)*dxx*xt*yt*or &
706 + 4.0_dp*dx*fx(3)*xt*yt*or
707 potbb = potbb + f23*f13*dr*rs*or - f13*f13*drr*rs*rs*or &
708 - f43*rs*fx(2)*dxr*xt*or &
709 - 4.0_dp*fx(2)*fx(2)*dxx*xt*xt*or &
710 - 4.0_dp*dx*fx(3)*xt*xt*or
714 END SUBROUTINE pade_lsd_2
727 SUBROUTINE pade_lsd_3(rhoa, rhob, rs, fx, potaaa, potaab, potabb, potbbb)
729 REAL(kind=
dp),
INTENT(IN) :: rhoa, rhob, rs
730 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: fx
731 REAL(kind=
dp),
INTENT(INOUT) :: potaaa, potaab, potabb, potbbb
733 REAL(kind=
dp) :: d2p, d2q, d2xp, d2xq, d3p, d3q, dpv, dq, dr, drr, drrr, dx, dxp, dxq, dxr, &
734 dxrr, dxx, dxxr, dxxx, fa0, fa1, fa2, fa3, fb1, fb2, fb3, fb4, or, p, q, rhoab, xp, xq, &
737 IF (.NOT. debug_flag) cpabort(
"Routine not tested")
741 IF (rhoab > eps_rho)
THEN
752 p = fa0 + (fa1 + (fa2 + fa3*rs)*rs)*rs
753 q = (fb1 + (fb2 + (fb3 + fb4*rs)*rs)*rs)*rs
755 dpv = fa1 + (2.0_dp*fa2 + 3.0_dp*fa3*rs)*rs
756 dq = fb1 + (2.0_dp*fb2 + (3.0_dp*fb3 + &
757 4.0_dp*fb4*rs)*rs)*rs
759 d2p = 2.0_dp*fa2 + 6.0_dp*fa3*rs
760 d2q = 2.0_dp*fb2 + (6.0_dp*fb3 + 12.0_dp*fb4*rs)*rs
763 d3q = 6.0_dp*fb3 + 24.0_dp*fb4*rs
765 xp = da0 + (da1 + (da2 + da3*rs)*rs)*rs
766 xq = (db1 + (db2 + (db3 + db4*rs)*rs)*rs)*rs
768 dxp = da1 + (2.0_dp*da2 + 3.0_dp*da3*rs)*rs
769 dxq = db1 + (2.0_dp*db2 + (3.0_dp*db3 + &
770 4.0_dp*db4*rs)*rs)*rs
772 d2xp = 2.0_dp*da2 + 6.0_dp*da3*rs
773 d2xq = 2.0_dp*db2 + (6.0_dp*db3 + 12.0_dp*db4*rs)*rs
775 dr = (dpv*q - p*dq)/(q*q)
776 drr = (d2p*q*q - p*q*d2q - 2.0_dp*dpv*q*dq + 2.0_dp*p*dq*dq)/(q*q*q)
777 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 - &
778 6.0_dp*p*dq*dq*dq + 6.0_dp*p*dq*d2q*q - p*d3q*q*q)/(q*q*q*q)
779 dx = (xp*q - p*xq)/(q*q)
780 dxx = 2.0_dp*xq*(p*xq - xp*q)/(q*q*q)
781 dxxx = 6.0_dp*xq*(q*xp*xq - p*xq*xq)/(q*q*q*q)
782 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)
783 dxxr = 2.0_dp*(2.0_dp*dxq*q*p*xq - dxq*q*q*xp + xq*xq*q*dpv - xq*q*q*dxp + &
784 2.0_dp*xq*q*xp*dq - 3.0_dp*xq*xq*dq*p)/(q*q*q*q)
785 dxrr = (q*q*q*d2xp - 2.0_dp*q*q*dxp*dq - q*q*xp*d2q - q*q*d2p*xq - &
786 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 + &
787 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)
793 potaaa = potaaa + 8.0_dp/27.0_dp*dr*rs*or*or + &
794 1.0_dp/9.0_dp*drr*rs*rs*or*or + &
795 1.0_dp/27.0_dp*drrr*rs**3*or*or + &
796 dxr*or*or*yt*rs*(-8.0_dp/3.0_dp*fx(2) + 4.0_dp*fx(3)*yt)
797 potaab = potaab + 0.0_dp
798 potabb = potabb + 0.0_dp
799 potbbb = potbbb + 0.0_dp
803 END SUBROUTINE pade_lsd_3
818 INTEGER,
DIMENSION(2, 3) :: bo
819 REAL(kind=
dp) :: eaa, eab, ebb, rhoa, rhob, rs
820 REAL(kind=
dp),
DIMENSION(4) :: fx
822 bo(1:2, 1:3) = rho_a%pw_grid%bounds_local(1:2, 1:3)
825 DO k = bo(1, 3), bo(2, 3)
826 DO j = bo(1, 2), bo(2, 2)
827 DO i = bo(1, 1), bo(2, 1)
829 rhoa = rho_a%array(i, j, k)
830 rhob = rho_b%array(i, j, k)
834 CALL calc_fx(rhoa, rhob, fx, 2)
836 eaa = 0.0_dp; eab = 0.0_dp; ebb = 0.0_dp
837 CALL pade_lsd_2(rhoa, rhob, rs, fx, eaa, eab, ebb)
839 fxc_aa%array(i, j, k) = eaa
840 fxc_ab%array(i, j, k) = eab
841 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