37 #include "../base/base_uses.f90"
49 REAL(KIND=
dp),
PARAMETER :: a1 = 0.00979681_dp, &
54 REAL(KIND=
dp),
PARAMETER :: a = 1.0161144_dp, &
56 c = -0.077215461_dp, &
58 e = -0.051955731_dp, &
61 clda = -0.73855876638202240588423_dp
62 REAL(KIND=
dp),
PARAMETER :: expcutoff = 700.0_dp
63 REAL(KIND=
dp),
PARAMETER :: smax = 8.572844_dp, &
64 sconst = 18.79622316_dp, &
66 REAL(KIND=
dp),
PARAMETER :: gcutoff = 0.08_dp, &
67 g1 = -0.02628417880_dp/e, &
68 g2 = -0.07117647788_dp/e, &
69 g3 = 0.08534541323_dp/e, &
71 REAL(KIND=
dp),
PARAMETER :: wcutoff = 14.0_dp
73 REAL(KIND=
dp),
PARAMETER :: eps_rho = 0.00000001_dp
75 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'xc_xpbe_hole_t_c_lr'
91 CHARACTER(LEN=*),
INTENT(OUT),
OPTIONAL :: reference, shortform
92 TYPE(xc_rho_cflags_type),
INTENT(inout),
OPTIONAL :: needs
93 INTEGER,
INTENT(out),
OPTIONAL :: max_deriv
95 IF (
PRESENT(reference))
THEN
96 reference =
"{LDA version}"
98 IF (
PRESENT(shortform))
THEN
101 IF (
PRESENT(needs))
THEN
103 needs%norm_drho = .true.
105 IF (
PRESENT(max_deriv)) max_deriv = 1
121 CHARACTER(LEN=*),
INTENT(OUT),
OPTIONAL :: reference, shortform
122 TYPE(xc_rho_cflags_type),
INTENT(inout),
OPTIONAL :: needs
123 INTEGER,
INTENT(out),
OPTIONAL :: max_deriv
125 IF (
PRESENT(reference))
THEN
126 reference =
"{LSD version}"
128 IF (
PRESENT(shortform))
THEN
131 IF (
PRESENT(needs))
THEN
132 needs%rho_spin = .true.
133 needs%norm_drho_spin = .true.
135 IF (
PRESENT(max_deriv)) max_deriv = 1
155 TYPE(xc_rho_set_type),
INTENT(IN) :: rho_set
156 TYPE(xc_derivative_set_type),
INTENT(IN) :: deriv_set
157 INTEGER,
INTENT(IN) :: order
158 TYPE(section_vals_type),
POINTER :: params
160 CHARACTER(len=*),
PARAMETER :: routinen =
'xpbe_hole_t_c_lr_lda_eval'
162 INTEGER :: handle, npoints
163 INTEGER,
DIMENSION(2, 3) :: bo
164 REAL(kind=
dp) :: epsilon_rho, r, sx
165 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :, :), &
166 POINTER :: dummy, e_0, e_ndrho, e_rho, norm_drho, &
168 TYPE(xc_derivative_type),
POINTER :: deriv
170 CALL timeset(routinen, handle)
176 norm_drho=norm_drho, local_bounds=bo, rho_cutoff=epsilon_rho)
177 npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
187 allocate_deriv=.true.)
190 IF (order >= 1 .OR. order == -1)
THEN
192 allocate_deriv=.true.)
195 allocate_deriv=.true.)
198 IF (order > 1 .OR. order < -1)
THEN
199 cpabort(
"derivatives bigger than 1 not implemented")
202 IF (r == 0.0_dp)
THEN
203 cpabort(
"Cutoff_Radius 0.0 not implemented")
211 CALL xpbe_hole_t_c_lr_lda_calc(npoints, order, rho=rho, norm_drho=norm_drho, &
212 e_0=e_0, e_rho=e_rho, e_ndrho=e_ndrho, &
213 epsilon_rho=epsilon_rho, &
218 CALL timestop(handle)
241 SUBROUTINE xpbe_hole_t_c_lr_lda_calc(npoints, order, rho, norm_drho, e_0, e_rho, e_ndrho, &
244 INTEGER,
INTENT(in) :: npoints, order
245 REAL(kind=
dp),
DIMENSION(1:npoints),
INTENT(inout) :: rho, norm_drho, e_0, e_rho, e_ndrho
246 REAL(kind=
dp),
INTENT(in) :: epsilon_rho, sx, r
249 REAL(
dp) :: my_ndrho, my_rho
250 REAL(kind=
dp) :: ss, ss2, sscale, t1, t2, t3, t4, t6, t7, &
256 my_rho = max(rho(ip), 0.0_dp)
257 IF (my_rho > epsilon_rho)
THEN
258 my_ndrho = max(norm_drho(ip), epsilon(0.0_dp)*1.e4_dp)
263 t3 = t2**(0.1e1_dp/0.3e1_dp)
268 ss = 0.3466806371753173524216762e0_dp*t6*t8
269 IF (ss > scutoff)
THEN
271 sscale = (smax*ss2 - sconst)/(ss2*ss)
273 IF (ss*sscale > gcutoff)
THEN
276 my_ndrho, sscale, sx, r, order)
280 my_ndrho, sscale, sx, r, order)
287 END SUBROUTINE xpbe_hole_t_c_lr_lda_calc
305 TYPE(xc_rho_set_type),
INTENT(IN) :: rho_set
306 TYPE(xc_derivative_set_type),
INTENT(IN) :: deriv_set
307 INTEGER,
INTENT(IN) :: order
308 TYPE(section_vals_type),
POINTER :: params
310 CHARACTER(len=*),
PARAMETER :: routinen =
'xpbe_hole_t_c_lr_lsd_eval'
312 INTEGER :: handle, npoints
313 INTEGER,
DIMENSION(2, 3) :: bo
314 REAL(kind=
dp) :: epsilon_rho, r, sx
315 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :, :), &
316 POINTER :: dummy, e_0, e_ndrhoa, e_ndrhob, e_rhoa, &
317 e_rhob, norm_drhoa, norm_drhob, rhoa, &
319 TYPE(xc_derivative_type),
POINTER :: deriv
321 CALL timeset(routinen, handle)
327 norm_drhoa=norm_drhoa, norm_drhob=norm_drhob, local_bounds=bo, rho_cutoff=epsilon_rho)
328 npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
340 allocate_deriv=.true.)
343 IF (order >= 1 .OR. order == -1)
THEN
345 allocate_deriv=.true.)
348 allocate_deriv=.true.)
351 allocate_deriv=.true.)
354 allocate_deriv=.true.)
357 IF (order > 1 .OR. order < -1)
THEN
358 cpabort(
"derivatives bigger than 1 not implemented")
361 IF (r == 0.0_dp)
THEN
362 cpabort(
"Cutoff_Radius 0.0 not implemented")
370 CALL xpbe_hole_t_c_lr_lsd_calc(npoints, order, rho=rhoa, norm_drho=norm_drhoa, &
371 e_0=e_0, e_rho=e_rhoa, e_ndrho=e_ndrhoa, &
372 epsilon_rho=epsilon_rho, sx=sx, r=r)
373 CALL xpbe_hole_t_c_lr_lsd_calc(npoints, order, rho=rhob, norm_drho=norm_drhob, &
374 e_0=e_0, e_rho=e_rhob, e_ndrho=e_ndrhob, &
375 epsilon_rho=epsilon_rho, sx=sx, r=r)
379 CALL timestop(handle)
402 SUBROUTINE xpbe_hole_t_c_lr_lsd_calc(npoints, order, rho, norm_drho, e_0, e_rho, e_ndrho, &
405 INTEGER,
INTENT(in) :: npoints, order
406 REAL(kind=
dp),
DIMENSION(1:npoints),
INTENT(inout) :: rho, norm_drho, e_0, e_rho, e_ndrho
407 REAL(kind=
dp),
INTENT(in) :: epsilon_rho, sx, r
410 REAL(
dp) :: my_ndrho, my_rho
411 REAL(kind=
dp) :: e_tmp, ss, ss2, sscale, t1, t2, t3, t4, &
417 my_rho = max(2.0_dp*rho(ip), 0.0_dp)
418 IF (my_rho > epsilon_rho)
THEN
419 my_ndrho = max(2.0_dp*norm_drho(ip), 0.0_dp)
425 t3 = t2**(0.1e1_dp/0.3e1_dp)
430 ss = 0.3466806371753173524216762e0_dp*t6*t8
431 IF (ss > scutoff)
THEN
433 sscale = (smax*ss2 - sconst)/(ss2*ss)
436 IF (ss*sscale > gcutoff)
THEN
439 my_ndrho, sscale, sx, r, order)
443 my_ndrho, sscale, sx, r, order)
445 e_0(ip) = e_0(ip) + 0.5_dp*e_tmp
452 END SUBROUTINE xpbe_hole_t_c_lr_lsd_calc
470 rho, ndrho, sscale, sx, R, order)
471 REAL(kind=
dp),
INTENT(INOUT) :: e_0, e_rho, e_ndrho
472 REAL(kind=
dp),
INTENT(IN) :: rho, ndrho, sscale, sx, r
473 INTEGER,
INTENT(IN) :: order
475 REAL(kind=
dp) :: p, pndrho, prho, q, qndrho, qrho, sndrho, srho, ssval, t1, t103, t104, &
476 t105, t106, t107, t108, t109, t11, t113, t115, t116, t117, t118, t119, t12, t121, t123, &
477 t125, t126, t129, t13, t133, t136, t14, t140, t142, t143, t144, t147, t150, t152, t155, &
478 t156, t159, t162, t163, t164, t167, t17, t170, t173, t175, t176, t177, t178, t181, t183, &
479 t187, t19, t190, t194, t195, t196, t199, t2, t202, t209, t21, t214, t216, t217, t218, &
480 t22, t222, t223, t224, t227, t228, t229, t232, t234, t235, t236, t237, t240, t244, t248, &
481 t25, t251, t255, t256, t257, t261, t262, t265, t269, t27, t273, t276
482 REAL(kind=
dp) :: t279, t280, t281, t29, t292, t3, t308, t31, t312, t314, t318, t320, t322, &
483 t33, t331, t334, t339, t34, t341, t347, t349, t35, t359, t362, t368, t37, t370, t373, &
484 t38, t382, t385, t39, t393, t4, t40, t401, t402, t404, t405, t409, t41, t42, t420, t421, &
485 t424, t425, t426, t429, t430, t431, t437, t44, t445, t446, t45, t451, t46, t473, t475, &
486 t479, t48, t484, t497, t498, t5, t50, t503, t504, t51, t517, t52, t523, t524, t527, t53, &
487 t533, t534, t54, t541, t56, t568, t57, t58, t581, t590, t6, t60, t603, t604, t61, t611, &
488 t612, t64, t640, t65, t653, t667, t675, t677, t69, t7, t71, t716
489 REAL(kind=
dp) :: t717, t720, t723, t73, t739, t758, t762, t77, t8, t800, t803, t808, t85, &
490 t86, t87, t88, t91, t92, t93, t94, t95, t98, t99
493 t1 = 3**(0.1e1_dp/0.3e1_dp)
498 t6 = t5**(0.1e1_dp/0.3e1_dp)
501 ssval = t3*t7*t8/0.6e1_dp
502 t11 = red(rho, ndrho)
508 t21 = a1*t12*t13 + a2*t17*t19
514 t33 = 1 + a3*t17*t19 + a4*t25*t27 + a5*t29*t31
524 p = 0.9e1_dp/0.4e1_dp*t14*t42
525 t44 = rho**(0.1e1_dp/0.3e1_dp)
544 t77 = c*(1 + t73*t12*t13)
545 t85 = t69*(15*e + 6*t77*t51 + 4*b*t56 + 8*a*t57)
554 t98 = erf(0.3e1_dp/0.2e1_dp*t94*t95)
556 t103 = 0.3e1_dp/0.4e1_dp*
pi + t85*t88/0.16e2_dp - 0.3e1_dp/0.4e1_dp*t92 &
564 t113 = t40*c + real(2*t64*t65, kind=
dp) - 0.32e2_dp/0.15e2_dp*t105*t109 &
572 t123 = t119*b + t40*t121
578 t140 = real(2*t129*t34, kind=
dp) - 0.32e2_dp/0.15e2_dp*t133*t109 + real(2 &
579 *t64*t136, kind=
dp) + t126*t73
585 t152 = -0.32e2_dp/0.15e2_dp*t142*t144 + real(2*t64*t147, kind=
dp) + t150 &
589 t159 = t126 + 2*d*e + t14*t140 + t115*t152 + t155*t156* &
596 t173 = -0.16e2_dp/0.15e2_dp*t167*t109 + real(2*t64*t170, kind=
dp)
602 t183 = -0.32e2_dp/0.15e2_dp*t176*t178 + t181*t118
604 t190 = t61*e + t14*t173 + t115*t183 - 0.16e2_dp/0.15e2_dp*t115 &
606 t194 = 2*e + t60 + t61*b + t14*t113 + t115*t123 + t125*t37 &
607 *t159 + 3*t163*t164*t190
610 t199 = exp(-t196*t38 - q)
611 t202 = -0.4e1_dp/0.9e1_dp*a*t46 + 0.4e1_dp/0.9e1_dp*a*t48 - 0.4e1_dp/ &
612 0.9e1_dp*a*t54 - 0.4e1_dp/0.9e1_dp*t195*t199
613 e_0 = e_0 + (t45*t202*clda)*sx
615 IF (order >= 1 .OR. order >= -1)
THEN
617 srho = -t3/t164*t8*t4/0.18e2_dp - t3*t7/t209/0.6e1_dp
620 sndrho = t214*t8/0.6e1_dp
623 t218 = dsdrho(rho, ndrho)
624 t222 = 2*t217*t125*t37*t218
630 t232 = 2*t223*t224 + 4*t228*t229
637 t248 = 4*t237*t229 + 5*t240*t27*t218 + 6*t244*t31*t218
638 t251 = t236*t125*t37*t248
639 t255 = 0.2e1_dp/0.3e1_dp*t50*t125*t7*t4
640 qrho = t222 + t234 - t251 + t255
646 prho = 0.9e1_dp/0.2e1_dp*t256*t257*t218 + 0.9e1_dp/0.4e1_dp*t14*t262 &
647 - 0.9e1_dp/0.4e1_dp*t22*t265*t248
651 t279 = 2*t223*t273 + 4*t228*t276
654 t292 = 4*t237*t276 + 5*t240*t27*t269 + 6*t244*t31*t269
655 pndrho = 0.9e1_dp/0.2e1_dp*t256*t257*t269 + 0.9e1_dp/0.4e1_dp*t14* &
656 t281 - 0.9e1_dp/0.4e1_dp*t22*t265*t292
657 qndrho = 2*t217*t125*t37*t269 + t14*t279*t39 - t236*t125 &
659 t308 = dexeirho(p, q, prho, qrho)
661 t314 = t312*t106*t107
664 t322 = 0.1e1_dp/t21*t33*t318*t1*t320
665 t331 = 2*t216*t40*t218 + t14*t261 - t14*t235*t248
670 t349 = 0.1e1_dp/t347*t194
674 t370 = f1*t232*t34 - t71*t368
678 t393 = 0.1e1_dp/t86/t347
680 t402 = sqrt(0.31415926535897932385e1_dp)
682 t405 = 0.1e1_dp/t402*t404
684 t420 = real(t69*(6*c*(t370*t12*t13 + 2*t373*t224)*t51 &
685 + 6*t77*t331 + 8*t382*t331 + 24*t385*t331)*t88, kind=
dp)/ &
686 0.16e2_dp - 0.7e1_dp/0.32e2_dp*real(t85, kind=
dp)*real(t393, kind=
dp)* &
687 REAL(t331, kind=
dp) - 0.3e1_dp &
688 /0.4e1_dp*t92*prho*t93*t99 + 0.3e1_dp/0.2e1_dp*t401*t405 &
689 *(0.3e1_dp/0.2e1_dp*t218*sscale*t95 + 0.3e1_dp/0.4e1_dp*t94*t409 &
690 *(t262 - t235*t41*t248))
699 t445 = 0.1e1_dp/t117/t33
704 t479 = t108*t429*t331
724 e_rho = e_rho + (0.4e1_dp/0.3e1_dp*t44*t202*clda + t45*(-0.4e1_dp/0.9e1_dp* &
725 a*t308 - 0.4e1_dp/0.27e2_dp*a*qrho*t314*t322 + 0.4e1_dp/0.27e2_dp &
726 *a*(t331*t35*t38 + 0.2e1_dp/0.3e1_dp*t52*t334)*t339*t341 &
727 *t318*t1*t320 + 0.4e1_dp/0.3e1_dp*t349*t199*t331 - 0.4e1_dp &
728 /0.9e1_dp*t58*(real(2*t216*t113*t218, kind=
dp) + t14*(t261*c &
729 - t235*c*real(t248, kind=
dp) + real(2*t359*t65, kind=
dp) - real(2*t64*t362 &
730 *t248, kind=
dp) - 0.32e2_dp/0.15e2_dp*t421*t109 + 0.64e2_dp/0.15e2_dp*t425 &
731 *t426 - 0.112e3_dp/0.15e2_dp*t142*t431 + t60*t370) + real(4* &
732 t437*t123*t218, kind=
dp) + t115*(0.2e1_dp*t235*b*t232 - 0.2e1_dp*t446 &
733 *b*real(t248, kind=
dp) + t261*t121 - t235*t451 + t40*c*t370) &
734 + 0.2e1_dp/0.3e1_dp*t125*t7*t159*t4 + t125*t37*(real(2* &
735 t216*t140*t218, kind=
dp) + t14*(0.2e1_dp*e*t232*t34 - real(2*t129 &
736 *t368, kind=
dp) - 0.32e2_dp/0.15e2_dp*d*t420*t104*t109 + 0.64e2_dp/0.15e2_dp &
737 *t133*t475 - 0.112e3_dp/0.15e2_dp*t133*t479 + real(2*t359 &
738 *t136, kind=
dp) - real(2*t64*t484*t248, kind=
dp) + t126*t370) + real(4* &
739 t437*t152*t218, kind=
dp) + t115*(-0.32e2_dp/0.15e2_dp*t421*t106*t144 &
740 + 0.64e2_dp/0.15e2_dp*t497*t498*t34*real(t218, kind=
dp) - 0.112e3_dp/0.15e2_dp &
741 *t503*t504*t34*t331 - 0.32e2_dp/0.15e2_dp*t142*t143* &
742 t261 + 0.32e2_dp/0.15e2_dp*t503*t498*real(t368, kind=
dp) + real(2*t359 &
743 *t147, kind=
dp) - 0.2e1_dp*t517*t451 + 0.2e1_dp*real(t64, kind=
dp)*real(t136, kind=
dp)* &
744 t370 + real(2*t523*t524, kind=
dp) - real(2*t150*t527, kind=
dp)) + real(6*t533 &
745 *t156*t534, kind=
dp) + t155*t370*t116*t118 + 0.2e1_dp*t155*t541 &
746 *real(t524, kind=
dp) - 0.2e1_dp*t155*real(t156, kind=
dp)*real(t527, kind=
dp)) + 0.4e1_dp &
747 *t163*t6*t190*t4 + 0.3e1_dp*t163*t164*(real(2*t216*t173 &
748 *t218, kind=
dp) + t14*(-0.16e2_dp/0.15e2_dp*t61*t420*t104*t109 + &
749 0.32e2_dp/0.15e2_dp*t167*t475 - 0.56e2_dp/0.15e2_dp*t167*t479 + real(2 &
750 *t359*t170, kind=
dp) - real(2*t64*t568*t248, kind=
dp)) + real(4*t437 &
751 *t183*t218, kind=
dp) + t115*(-0.32e2_dp/0.15e2_dp*real(t359, kind=
dp)*real(t175, kind=
dp) &
752 *real(t178, kind=
dp) + 0.32e2_dp/0.15e2_dp*t581*t177*t143*real(t248, kind=
dp) &
753 - 0.32e2_dp/0.15e2_dp*real(t64, kind=
dp)*t34*t420*real(t178, kind=
dp) + 0.64e2_dp &
754 /0.15e2_dp*t176*t590*t426 - 0.112e3_dp/0.15e2_dp*t176*t177* &
755 t431 + real(2*t129*t524, kind=
dp) - real(2*t181*t527, kind=
dp)) - 0.64e2_dp/ &
756 0.15e2_dp*real(t603, kind=
dp)*real(t604, kind=
dp)*real(t534, kind=
dp) - 0.16e2_dp/0.15e2_dp* &
757 t115*t420*t187 - 0.56e2_dp/0.15e2_dp*t611*t612*t118*t331 - &
758 0.32e2_dp/0.15e2_dp*t611*t498*real(t524, kind=
dp) + 0.32e2_dp/0.15e2_dp*t611 &
759 *real(t604, kind=
dp)*real(t527, kind=
dp)))*t199 - 0.4e1_dp/0.9e1_dp*t195*(-0.2e1_dp &
760 /0.3e1_dp*t196*t334 - t222 - t234 + t251 - t255)*t199)* &
762 t640 = dexeindrho(p, q, pndrho, qndrho)
763 t653 = 2*t216*t40*t269 + t14*t280 - t14*t235*t292
766 t677 = f1*t279*t34 - t71*t675
767 t716 = real(t69*(6*c*(t677*t12*t13 + 2*t373*t273)*t51 &
768 + 6*t77*t653 + 8*t382*t653 + 24*t385*t653)*t88, kind=
dp)/ &
769 0.16e2_dp - 0.7e1_dp/0.32e2_dp*real(t85, kind=
dp)*real(t393, kind=
dp)* &
770 REAL(t653, kind=
dp) - 0.3e1_dp &
771 /0.4e1_dp*t92*pndrho*t93*t99 + 0.3e1_dp/0.2e1_dp*t401*t405 &
772 *(0.3e1_dp/0.2e1_dp*t269*sscale*t95 + 0.3e1_dp/0.4e1_dp*t94* &
773 t409*(t281 - t235*t41*t292))
779 t762 = t108*t429*t653
783 e_ndrho = e_ndrho + (t45*(-0.4e1_dp/0.9e1_dp*a*t640 - 0.4e1_dp/0.27e2_dp*a*qndrho &
784 *t314*t322 + 0.4e1_dp/0.9e1_dp*a*t653*t339*t341 + 0.4e1_dp &
785 /0.3e1_dp*t349*t199*t653 - 0.4e1_dp/0.9e1_dp*t58*(real(2*t216 &
786 *t113*t269, kind=
dp) + t14*(t280*c - t235*c*real(t292, kind=
dp) + real(2 &
787 *t667*t65, kind=
dp) - real(2*t64*t362*t292, kind=
dp) - 0.32e2_dp/0.15e2_dp &
788 *t717*t109 + 0.64e2_dp/0.15e2_dp*t425*t720 - 0.112e3_dp/0.15e2_dp* &
789 t142*t723 + t60*t677) + real(4*t437*t123*t269, kind=
dp) + t115* &
790 (0.2e1_dp*t235*b*t279 - 0.2e1_dp*t446*b*real(t292, kind=
dp) + t280* &
791 t121 - t235*t739 + t40*c*t677) + t125*t37*(real(2*t216 &
792 *t140*t269, kind=
dp) + t14*(0.2e1_dp*e*t279*t34 - real(2*t129* &
793 t675, kind=
dp) - 0.32e2_dp/0.15e2_dp*d*t716*t104*t109 + 0.64e2_dp/0.15e2_dp &
794 *t133*t758 - 0.112e3_dp/0.15e2_dp*t133*t762 + real(2*t667* &
795 t136, kind=
dp) - real(2*t64*t484*t292, kind=
dp) + t126*t677) + real(4*t437 &
796 *t152*t269, kind=
dp) + t115*(-0.32e2_dp/0.15e2_dp*t717*t106*t144 + &
797 0.64e2_dp/0.15e2_dp*t497*t498*t34*real(t269, kind=
dp) - 0.112e3_dp/0.15e2_dp &
798 *t503*t504*t34*t653 - 0.32e2_dp/0.15e2_dp*t142*t143*t280 &
799 + 0.32e2_dp/0.15e2_dp*t503*t498*real(t675, kind=
dp) + real(2*t667* &
800 t147, kind=
dp) - 0.2e1_dp*t517*t739 + 0.2e1_dp*real(t64, kind=
dp)*real(t136, kind=
dp)*t677 &
801 + real(2*t523*t800, kind=
dp) - real(2*t150*t803, kind=
dp)) + real(6*t533 &
802 *t156*t808, kind=
dp) + t155*t677*t116*t118 + 0.2e1_dp*t155*t541 &
803 *real(t800, kind=
dp) - 0.2e1_dp*t155*real(t156, kind=
dp)*real(t803, kind=
dp)) + 0.3e1_dp*t163 &
804 *t164*(real(2*t216*t173*t269, kind=
dp) + t14*(-0.16e2_dp/0.15e2_dp &
805 *t61*t716*t104*t109 + 0.32e2_dp/0.15e2_dp*t167*t758 - 0.56e2_dp &
806 /0.15e2_dp*t167*t762 + real(2*t667*t170, kind=
dp) - real(2*t64 &
807 *t568*t292, kind=
dp)) + real(4*t437*t183*t269, kind=
dp) + t115*(-0.32e2_dp &
808 /0.15e2_dp*real(t667, kind=
dp)*real(t175, kind=
dp)*real(t178, kind=
dp) + 0.32e2_dp/0.15e2_dp &
809 *t581*t177*t143*real(t292, kind=
dp) - 0.32e2_dp/0.15e2_dp*real(t64, kind=
dp)* &
810 t34*t716*real(t178, kind=
dp) + 0.64e2_dp/0.15e2_dp*t176*t590*t720 - 0.112e3_dp &
811 /0.15e2_dp*t176*t177*t723 + real(2*t129*t800, kind=
dp) - real(2 &
812 *t181*t803, kind=
dp)) - 0.64e2_dp/0.15e2_dp*real(t603, kind=
dp)*real(t604, kind=
dp)* &
813 REAL(t808, kind=
dp) - 0.16e2_dp/0.15e2_dp*t115*t716*t187 - 0.56e2_dp/0.15e2_dp &
814 *t611*t612*t118*t653 - 0.32e2_dp/0.15e2_dp*t611*t498*real(t800, kind=
dp) &
815 + 0.32e2_dp/0.15e2_dp*t611*real(t604, kind=
dp)*real(t803, kind=
dp)))*t199 &
816 + 0.4e1_dp/0.9e1_dp*t195*qndrho*t199)*clda)*sx
837 rho, ndrho, sscale, sx, R, order)
838 REAL(kind=
dp),
INTENT(INOUT) :: e_0, e_rho, e_ndrho
839 REAL(kind=
dp),
INTENT(IN) :: rho, ndrho, sscale, sx, r
840 INTEGER,
INTENT(IN) :: order
842 REAL(kind=
dp) :: p, pndrho, prho, q, qndrho, qrho, sndrho, srho, ssval, t1, t102, t106, t11, &
843 t110, t113, t115, t117, t118, t119, t12, t122, t125, t126, t127, t128, t13, t130, t133, &
844 t135, t138, t14, t140, t142, t143, t146, t150, t151, t152, t155, t158, t165, t17, t170, &
845 t172, t173, t174, t178, t179, t180, t183, t184, t185, t188, t19, t190, t191, t192, t193, &
846 t196, t197, t2, t200, t204, t207, t21, t211, t212, t213, t217, t22, t221, t225, t229, &
847 t232, t235, t236, t242, t248, t25, t264, t268, t27, t272, t276, t278, t280, t287, t289, &
848 t29, t292, t297, t299, t3, t305, t307, t31, t317, t320, t324
849 REAL(kind=
dp) :: t327, t33, t330, t333, t334, t338, t34, t340, t344, t35, t352, t353, t358, &
850 t37, t38, t380, t39, t394, t398, t399, t4, t40, t401, t406, t407, t408, t41, t415, t435, &
851 t44, t45, t454, t46, t461, t48, t485, t496, t498, t5, t50, t51, t512, t52, t524, t525, &
852 t529, t53, t531, t54, t545, t56, t579, t58, t581, t586, t6, t60, t61, t64, t65, t7, t74, &
853 t75, t77, t79, t8, t81, t83, t84, t85, t86, t89, t91, t93, t94, t95, t97
856 t1 = 3**(0.1e1_dp/0.3e1_dp)
861 t6 = t5**(0.1e1_dp/0.3e1_dp)
864 ssval = t3*t7*t8/0.6e1_dp
866 t11 = red(rho, ndrho)
872 t21 = a1*t12*t13 + a2*t17*t19
878 t33 = 1 + a3*t17*t19 + a4*t25*t27 + a5*t29*t31
887 p = 0.9e1_dp/0.4e1_dp*t14*t40*t41
888 t44 = rho**(0.1e1_dp/0.3e1_dp)
898 t58 = 0.1e1_dp/t56/t51
903 t74 = g1 + g2*t12*t13 + g3*t17*t19 + g4*t25*t27
907 t81 = t40*c + 2*t64*t65 + 2*t75 + t60*t79
913 t91 = t84*t86*b + t40*t89
919 t106 = 2*t97*t34 + 2*t95*t74 + 2*t64*t102 + t94*t79
922 t115 = 2*t75*t40 + 2*t64*t110 + t113*t86
926 t122 = t94 + 2*t95 + t14*t106 + t83*t115 + t118*t119*t86
932 t133 = t128*t74 + 2*t64*t130
935 t140 = 2*t64*t135 + t138*t86
938 t146 = t128 + t14*t133 + t83*t140 + t142*t143*t86
939 t150 = 2*e + t60 + t61*b + t14*t81 + t83*t91 + t93*t37* &
940 t122 + 3*t126*t127*t146
943 t155 = exp(-t152*t38 - q)
944 t158 = -0.4e1_dp/0.9e1_dp*a*t46 + 0.4e1_dp/0.9e1_dp*a*t48 - 0.4e1_dp/ &
945 0.9e1_dp*a*t54 - 0.4e1_dp/0.9e1_dp*t151*t155
946 e_0 = e_0 + (t45*t158*clda)*sx
948 IF (order >= 1 .OR. order == -1)
THEN
950 srho = -t3/t127*t8*t4/0.18e2_dp - t3*t7/t165/0.6e1_dp
952 sndrho = t170*t8/0.6e1_dp
955 t174 = dsdrho(rho, ndrho)
956 t178 = 2*t173*t93*t37*t174
962 t188 = 2*t179*t180 + 4*t184*t185
970 t204 = 4*t193*t185 + 5*t196*t197 + 6*t200*t31*t174
971 t207 = t192*t93*t37*t204
972 t211 = 0.2e1_dp/0.3e1_dp*t50*t93*t7*t4
973 qrho = t178 + t190 - t207 + t211
978 prho = 0.9e1_dp/0.2e1_dp*t212*t213*t174 + 0.9e1_dp/0.4e1_dp*t14*t217 &
979 *t41 - 0.9e1_dp/0.4e1_dp*t22*t221*t204
983 t235 = 2*t179*t229 + 4*t184*t232
986 t248 = 4*t193*t232 + 5*t196*t242 + 6*t200*t31*t225
987 pndrho = 0.9e1_dp/0.2e1_dp*t212*t213*t225 + 0.9e1_dp/0.4e1_dp*t14* &
988 t236*t41 - 0.9e1_dp/0.4e1_dp*t22*t221*t248
989 qndrho = 2*t173*t93*t37*t225 + t14*t235*t39 - t192*t93 &
991 t264 = dexeirho(p, q, prho, qrho)
996 t280 = 0.1e1_dp/t21*t33*t276*t1*t278
998 t289 = 2*t172*t40*t174 + t14*t217 - t14*t287
1003 t307 = 0.1e1_dp/t305*t150
1009 t333 = 2*t324*t180 + 4*t327*t185 + 5*t330*t197
1012 t340 = f1*t188*t34 - t77*t338
1014 t352 = 0.1e1_dp/t85/t33
1029 e_rho = e_rho + (0.4e1_dp/0.3e1_dp*t44*t158*clda + t45*(-0.4e1_dp/0.9e1_dp* &
1030 a*t264 - 0.4e1_dp/0.27e2_dp*a*qrho*t272*t280 + 0.4e1_dp/0.27e2_dp &
1031 *a*(t289*t35*t38 + 0.2e1_dp/0.3e1_dp*t52*t292)*t297*t299 &
1032 *t276*t1*t278 + 0.4e1_dp/0.3e1_dp*t307*t155*t289 - 0.4e1_dp &
1033 /0.9e1_dp*t58*(real(2*t172*t81*t174, kind=
dp) + real(t14*(t217 &
1034 *c - t191*c*t204 + 2*t317*t65 - 2*t64*t320*t204 + 2 &
1035 *t334 + t60*t340), kind=
dp) + real(4*t344*t91*t174, kind=
dp) + real(t83* &
1036 (2*t191*b*t188 - 2*t353*b*t204 + t217*t89 - t191*t358 &
1037 + t40*c*t340), kind=
dp) + 0.2e1_dp/0.3e1_dp*t93*t7*t122*t4 + t93 &
1038 *t37*real(2*t172*t106*t174 + t14*(2*e*t188*t34 &
1039 - 2*t97*t338 + 2*t95*t333 + 2*t317*t102 - 2*t64*t380 &
1040 *t204 + t94*t340) + 4*t344*t115*t174 + t83*(2*t334 &
1041 *t40 + 2*t75*t217 - 2*t75*t287 + 2*t317*t110 - 2*t394 &
1042 *t358 + 2*t64*t102*t340 + 2*t398*t399 - 2*t113* &
1043 t401) + 6*t407*t119*t408 + t118*t340*t84*t86 + 2*t118 &
1044 *t415*t399 - 2*t118*t119*t401, kind=
dp) + 0.4e1_dp*t126*t6*t146 &
1045 *t4 + 0.3e1_dp*t126*t127*real(2*t172*t133*t174 + t14 &
1046 *(t128*t333 + 2*t317*t130 - 2*t64*t435*t204) + 4*t344 &
1047 *t140*t174 + t83*(2*t317*t135 - 2*t394*t75*t204 &
1048 + 2*t64*t130*t333 + 2*t97*t399 - 2*t138*t401) + 6* &
1049 t454*t143*t408 + t142*t333*t84*t86 + 2*t142*t461*t399 &
1050 - 2*t142*t143*t401, kind=
dp))*t155 - 0.4e1_dp/0.9e1_dp*t151*(-0.2e1_dp &
1051 /0.3e1_dp*t152*t292 - t178 - t190 + t207 - t211)*t155)* &
1053 t485 = dexeindrho(p, q, pndrho, qndrho)
1055 t498 = 2*t172*t40*t225 + t14*t236 - t14*t496
1057 t524 = 2*t324*t229 + 4*t327*t232 + 5*t330*t242
1060 t531 = f1*t235*t34 - t77*t529
1065 e_ndrho = e_ndrho + (t45*(-0.4e1_dp/0.9e1_dp*a*t485 - 0.4e1_dp/0.27e2_dp*a*qndrho &
1066 *t272*t280 + 0.4e1_dp/0.9e1_dp*a*t498*t297*t299 + 0.4e1_dp &
1067 /0.3e1_dp*t307*t155*t498 - 0.4e1_dp/0.9e1_dp*t58*real(2*t172 &
1068 *t81*t225 + t14*(t236*c - t191*c*t248 + 2*t512*t65 &
1069 - 2*t64*t320*t248 + 2*t525 + t60*t531) + 4*t344*t91 &
1070 *t225 + t83*(2*t191*b*t235 - 2*t353*b*t248 + t236 &
1071 *t89 - t191*t545 + t40*c*t531) + t93*t37*(2*t172* &
1072 t106*t225 + t14*(2*e*t235*t34 - 2*t97*t529 + 2*t95 &
1073 *t524 + 2*t512*t102 - 2*t64*t380*t248 + t94*t531) + &
1074 4*t344*t115*t225 + t83*(2*t525*t40 + 2*t75*t236 - &
1075 2*t75*t496 + 2*t512*t110 - 2*t394*t545 + 2*t64*t102 &
1076 *t531 + 2*t398*t579 - 2*t113*t581) + 6*t407*t119* &
1077 t586 + t118*t531*t84*t86 + 2*t118*t415*t579 - 2*t118 &
1078 *t119*t581) + 3*t126*t127*(2*t172*t133*t225 + t14 &
1079 *(t128*t524 + 2*t512*t130 - 2*t64*t435*t248) + 4*t344 &
1080 *t140*t225 + t83*(2*t512*t135 - 2*t394*t75*t248 &
1081 + 2*t64*t130*t524 + 2*t97*t579 - 2*t138*t581) + 6* &
1082 t454*t143*t586 + t142*t524*t84*t86 + 2*t142*t461*t579 &
1083 - 2*t142*t143*t581), kind=
dp)*t155 + 0.4e1_dp/0.9e1_dp*t151*qndrho &
1105 ELEMENTAL FUNCTION exei(P, Q)
1106 REAL(
dp),
INTENT(IN) :: p, q
1109 REAL(
dp) :: q2, q3, q4, tmp
1112 IF (p < expcutoff)
THEN
1114 IF (p + q < 0.5_dp)
THEN
1115 tmp = -
euler - log(p + q) + p + q
1116 tmp = tmp - 0.25_dp*(p + q)**2 + 1.0_dp/18.0_dp*(p + q)**3 - 1.0_dp/96.0_dp*(p + q)**4
1117 tmp = tmp + 1.0_dp/600.0_dp*(p + q)**5
1120 exei = exp(p)*expint(1, q + p)
1129 exei = exei - (q + 1.0_dp)*tmp
1133 exei = exei + (2.0_dp*q + q2 + 2.0_dp)*tmp
1137 exei = exei - (3.0_dp*q2 + 6.0_dp*q + q3 + 6.0_dp)*tmp
1141 exei = exei + (24.0_dp + 4.0_dp*q3 + q4 + 12.0_dp*q2 + 24.0_dp*q)*tmp
1156 ELEMENTAL FUNCTION dexeirho(P, Q, dPrho, dQrho)
1157 REAL(
dp),
INTENT(IN) :: p, q, dprho, dqrho
1158 REAL(
dp) :: dexeirho
1160 dexeirho = dprho*exei(p, q) - (dprho + dqrho)/(p + q)*exp(-q)
1161 END FUNCTION dexeirho
1171 ELEMENTAL FUNCTION dexeindrho(P, Q, dPndrho, dQndrho)
1172 REAL(
dp),
INTENT(IN) :: p, q, dpndrho, dqndrho
1173 REAL(
dp) :: dexeindrho
1175 dexeindrho = dpndrho*exei(p, q) - (dpndrho + dqndrho)/(p + q)*exp(-q)
1176 END FUNCTION dexeindrho
1184 ELEMENTAL FUNCTION red(rho, ndrho)
1185 REAL(
dp),
INTENT(IN) :: rho, ndrho
1188 red = 1.0_dp/6.0_dp*ndrho*3.0_dp**(2.0_dp/3.0_dp)
1189 red = red/(
pi**(2.0_dp/3.0_dp))
1190 red = red*max(1.0_dp/rho**(4.0_dp/3.0_dp), eps_rho)
1199 ELEMENTAL FUNCTION dsdrho(rho, ndrho)
1200 REAL(
dp),
INTENT(IN) :: rho, ndrho
1203 dsdrho = -2.0_dp/9.0_dp*ndrho*3.0**(2.0_dp/3.0_dp)
1204 dsdrho = dsdrho/(
pi**(2.0_dp/3.0_dp))
1205 dsdrho = dsdrho*max(1.0_dp/rho**(7.0_dp/3.0_dp), eps_rho)
1213 ELEMENTAL FUNCTION dsdndrho(rho)
1214 REAL(
dp),
INTENT(IN) :: rho
1215 REAL(
dp) :: dsdndrho
1217 dsdndrho = 1.0_dp/6.0_dp*3.0_dp**(2.0_dp/3.0_dp)
1218 dsdndrho = dsdndrho/(
pi**(2.0_dp/3.0_dp))
1219 dsdndrho = dsdndrho*max(1.0_dp/rho**(4.0_dp/3.0_dp), eps_rho)
1220 END FUNCTION dsdndrho
1233 ELEMENTAL FUNCTION expint(n, x)
1234 INTEGER,
INTENT(IN) :: n
1235 REAL(
dp),
INTENT(IN) :: x
1238 INTEGER,
PARAMETER :: maxit = 100
1239 REAL(
dp),
PARAMETER :: eps = 6.e-14_dp,
euler = 0.5772156649015328606065120_dp, &
1240 fpmin = tiny(0.0_dp)
1242 INTEGER :: i, ii, nm1
1243 REAL(
dp) :: a, b, c, d, del, fact, h, psi
1247 IF (n .LT. 0 .OR. x .LT. 0.0_dp .OR. (x .EQ. 0.0_dp .AND. (n .EQ. 0 .OR. n .EQ. 1)))
THEN
1248 expint = huge(1.0_dp)
1249 ELSE IF (n .EQ. 0)
THEN
1251 ELSE IF (x .EQ. 0.0_dp)
THEN
1253 ELSE IF (x .GT. 1.0_dp)
THEN
1261 d = 1.0_dp/(a*d + b)
1265 IF (abs(del - 1.0_dp) .LT. eps .OR. i == maxit)
THEN
1271 IF (nm1 .NE. 0)
THEN
1274 expint = -log(x) -
euler
1279 IF (i .NE. nm1)
THEN
1280 del = -fact/(i - nm1)
1284 psi = psi + 1.0_dp/ii
1286 del = fact*(-log(x) + psi)
1288 expint = expint + del
1289 IF (abs(del) .LT. abs(expint)*eps)
RETURN
Defines the basic variable types.
integer, parameter, public dp
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
real(kind=dp), parameter, public euler
real(kind=dp), parameter, public rootpi
Module with functions to handle derivative descriptors. derivative description are strings have the f...
integer, parameter, public deriv_norm_drho
integer, parameter, public deriv_norm_drhoa
integer, parameter, public deriv_rhob
integer, parameter, public deriv_rhoa
integer, parameter, public deriv_rho
integer, parameter, public deriv_norm_drhob
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
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
Calculates the exchange energy for the pbe hole model in a truncated coulomb potential,...
subroutine, public xpbe_hole_t_c_lr_lda_info(reference, shortform, needs, max_deriv)
returns various information on the functional
subroutine, public xpbe_hole_t_c_lr_lda_eval(rho_set, deriv_set, order, params)
evaluates the pbe-hole exchange in a truncated coulomb potential
elemental subroutine, public xpbe_hole_t_c_lr_lda_calc_2(e_0, e_rho, e_ndrho, rho, ndrho, sscale, sx, R, order)
low level routine that calculates the energy derivatives in one point
subroutine, public xpbe_hole_t_c_lr_lsd_eval(rho_set, deriv_set, order, params)
evaluates the pbe-hole exchange in a truncated coulomb potential
elemental subroutine, public xpbe_hole_t_c_lr_lda_calc_1(e_0, e_rho, e_ndrho, rho, ndrho, sscale, sx, R, order)
low level routine that calculates the energy derivatives in one point
subroutine, public xpbe_hole_t_c_lr_lsd_info(reference, shortform, needs, max_deriv)
returns various information on the functional