56 SUBROUTINE calc_fxc_kernel(fxc_rspace, rho_r, rho_g, tau_r, xc_kernel, triplet, pw_pool)
61 LOGICAL,
INTENT(IN) :: triplet
64 CHARACTER(len=*),
PARAMETER :: routinen =
'calc_fxc_kernel'
65 REAL(kind=
dp),
PARAMETER :: eps_rho = 1.e-10_dp
67 CHARACTER(len=20) :: fxc_name
68 INTEGER :: handle, i, idir, j, k, nspins
69 INTEGER,
DIMENSION(2, 3) :: bo
71 REAL(kind=
dp) :: scalec, scalex
72 REAL(kind=
dp),
DIMENSION(3) :: ccaa, ccab, cxaa, g_ab
73 REAL(kind=
dp),
DIMENSION(:),
POINTER :: rvals
80 cpassert(
ASSOCIATED(xc_kernel))
81 cpassert(
ASSOCIATED(pw_pool))
83 CALL timeset(routinen, handle)
96 CALL fxc_kernel_info(fxc_name, needs, lsd)
98 CALL pw_pool%create_pw(rhoa)
99 CALL pw_pool%create_pw(rhob)
103 ELSE IF (triplet)
THEN
112 IF (needs%norm_drho)
THEN
115 CALL pw_pool%create_pw(drhoa(idir))
117 CALL pw_pool%create_pw(norm_drhoa)
118 CALL pw_pool%create_pw(norm_drhob)
119 CALL pw_pool%create_pw(rhog)
120 CALL pw_pool%create_pw(tmpg)
123 ELSE IF (triplet)
THEN
130 bo(1:2, 1:3) = rhoa%pw_grid%bounds_local(1:2, 1:3)
132 DO k = bo(1, 3), bo(2, 3)
133 DO j = bo(1, 2), bo(2, 2)
134 DO i = bo(1, 1), bo(2, 1)
135 norm_drhoa%array(i, j, k) = sqrt(drhoa(1)%array(i, j, k)**2 + &
136 drhoa(2)%array(i, j, k)**2 + &
137 drhoa(3)%array(i, j, k)**2)
144 bo(1:2, 1:3) = rhob%pw_grid%bounds_local(1:2, 1:3)
146 DO k = bo(1, 3), bo(2, 3)
147 DO j = bo(1, 2), bo(2, 2)
148 DO i = bo(1, 1), bo(2, 1)
149 norm_drhob%array(i, j, k) = sqrt(drhoa(1)%array(i, j, k)**2 + &
150 drhoa(2)%array(i, j, k)**2 + &
151 drhoa(3)%array(i, j, k)**2)
156 norm_drhob%array(:, :, :) = norm_drhoa%array(:, :, :)
158 CALL pw_pool%give_back_pw(rhog)
159 CALL pw_pool%give_back_pw(tmpg)
163 cpabort(
"Meta functionals not available.")
166 SELECT CASE (trim(fxc_name))
168 IF (scalec == scalex)
THEN
170 CALL pade_fxc_eval(rhoa, rhob, fxc_rspace(1), fxc_rspace(2), fxc_rspace(3))
171 IF (scalex /= 1.0_dp)
THEN
172 CALL pw_scale(fxc_rspace(1), scalex)
173 CALL pw_scale(fxc_rspace(2), scalex)
174 CALL pw_scale(fxc_rspace(3), scalex)
177 cpabort(
"PADE Fxc Kernel functional needs SCALE_X==SCALE_C")
183 CALL xalpha_fxc_eval(rhoa, rhob, fxc_rspace(1), fxc_rspace(3), scalex, eps_rho)
189 g_ab(1:3) = rvals(1:3)
191 cxaa(1:3) = rvals(1:3)
193 ccaa(1:3) = rvals(1:3)
195 ccab(1:3) = rvals(1:3)
202 CALL b97_fxc_eval(rhoa, norm_drhoa, fxc_rspace(1), g_ab(1), ccaa, eps_rho)
203 CALL b97_fxc_eval(rhob, norm_drhob, fxc_rspace(3), g_ab(3), ccaa, eps_rho)
204 CALL b97_fcc_eval(rhoa, rhob, norm_drhoa, norm_drhob, fxc_rspace(2), g_ab(2), ccab, eps_rho)
206 CALL pw_pool%create_pw(fxa)
207 CALL pw_pool%create_pw(fxb)
211 CALL b97_fxc_eval(rhoa, norm_drhoa, fxa, g_ab(1), cxaa, eps_rho)
212 CALL b97_fxc_eval(rhob, norm_drhob, fxb, g_ab(1), cxaa, eps_rho)
213 CALL pw_axpy(fxa, fxc_rspace(1))
214 CALL pw_axpy(fxb, fxc_rspace(3))
215 CALL pw_pool%give_back_pw(fxa)
216 CALL pw_pool%give_back_pw(fxb)
222 cpabort(
"Fxc Kernel functional is defined incorrectly")
225 CALL pw_pool%give_back_pw(rhoa)
226 CALL pw_pool%give_back_pw(rhob)
227 IF (needs%norm_drho)
THEN
228 CALL pw_pool%give_back_pw(norm_drhoa)
229 CALL pw_pool%give_back_pw(norm_drhob)
231 CALL pw_pool%give_back_pw(drhoa(idir))
235 CALL timestop(handle)