33 #include "../base/base_uses.f90"
39 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'xc_fxc_kernel'
56 SUBROUTINE calc_fxc_kernel(fxc_rspace, rho_r, rho_g, tau_r, xc_kernel, triplet, pw_pool)
57 TYPE(pw_r3d_rs_type),
DIMENSION(:) :: fxc_rspace, rho_r
58 TYPE(pw_c1d_gs_type),
DIMENSION(:) :: rho_g
59 TYPE(pw_r3d_rs_type),
DIMENSION(:) :: tau_r
60 TYPE(section_vals_type),
POINTER :: xc_kernel
61 LOGICAL,
INTENT(IN) :: triplet
62 TYPE(pw_pool_type),
POINTER :: pw_pool
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
74 TYPE(pw_c1d_gs_type) :: rhog, tmpg
75 TYPE(pw_r3d_rs_type) :: fxa, fxb, norm_drhoa, norm_drhob, rhoa, &
77 TYPE(pw_r3d_rs_type),
DIMENSION(3) :: drhoa
78 TYPE(xc_rho_cflags_type) :: needs
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)
101 CALL pw_copy(rho_r(1), rhoa)
102 CALL pw_copy(rho_r(2), rhob)
103 ELSE IF (triplet)
THEN
104 CALL pw_copy(rho_r(1), rhoa)
105 CALL pw_copy(rho_r(1), rhob)
107 CALL pw_copy(rho_r(1), rhoa)
108 CALL pw_copy(rho_r(1), rhob)
109 CALL pw_scale(rhoa, 0.5_dp)
110 CALL pw_scale(rhob, 0.5_dp)
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)
122 CALL pw_copy(rho_g(1), rhog)
123 ELSE IF (triplet)
THEN
124 CALL pw_copy(rho_g(1), rhog)
126 CALL pw_copy(rho_g(1), rhog)
127 CALL pw_scale(rhog, 0.5_dp)
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)
142 CALL pw_copy(rho_g(2), rhog)
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")
180 CALL pw_zero(fxc_rspace(1))
181 CALL pw_zero(fxc_rspace(2))
182 CALL pw_zero(fxc_rspace(3))
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)
197 CALL pw_zero(fxc_rspace(1))
198 CALL pw_zero(fxc_rspace(2))
199 CALL pw_zero(fxc_rspace(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)
218 CALL pw_zero(fxc_rspace(1))
219 CALL pw_zero(fxc_rspace(2))
220 CALL pw_zero(fxc_rspace(3))
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)
245 SUBROUTINE fxc_kernel_info(fxc_name, needs, lsd)
246 CHARACTER(len=20),
INTENT(IN) :: fxc_name
247 TYPE(xc_rho_cflags_type),
INTENT(INOUT) :: needs
248 LOGICAL,
INTENT(IN) :: lsd
250 SELECT CASE (trim(fxc_name))
251 CASE (
"PADEFXC",
"LDAFXC")
253 needs%rho_spin = .true.
259 needs%rho_spin = .true.
260 needs%norm_drho_spin = .true.
261 needs%norm_drho = .true.
264 needs%norm_drho = .true.
268 cpabort(
"Fxc Kernel functional is defined incorrectly")
271 END SUBROUTINE fxc_kernel_info
Defines the basic variable types.
integer, parameter, public dp
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
calculates fxc in the spirit of the b97 exchange/correlation functional
subroutine, public b97_fxc_eval(rhos, norm_drhos, fxc, gx, cx, eps_rho)
...
subroutine, public b97_fcc_eval(rhoa, rhob, norm_drhoa, norm_drhob, fcc, gcc, cco, eps_rho)
...
Exchange and Correlation kernel functionals.
subroutine, public calc_fxc_kernel(fxc_rspace, rho_r, rho_g, tau_r, xc_kernel, triplet, pw_pool)
Exchange and Correlation kernel functional calculations.
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)
...
Calculate the Perdew-Wang correlation potential and energy density and ist derivatives with respect t...
subroutine, public perdew_wang_fxc_calc(rho_a, rho_b, fxc_aa, fxc_ab, fxc_bb, scalec, eps_rho)
...
elemental subroutine, public xc_rho_cflags_setall(cflags, value)
sets all the flags to the given value
contains utility functions for the xc package
subroutine, public xc_pw_gradient(pw_r, pw_g, tmp_g, gradient, xc_deriv_method_id)
...
Calculate the local exchange functional.
subroutine, public xalpha_fxc_eval(rho_a, rho_b, fxc_aa, fxc_bb, scale_x, eps_rho)
...