(git:374b731)
Loading...
Searching...
No Matches
xc_fxc_kernel.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Exchange and Correlation kernel functionals
10!> \author JGH
11! **************************************************************************************************
15 USE kinds, ONLY: dp
16 USE pw_methods, ONLY: pw_axpy,&
17 pw_copy,&
18 pw_scale,&
21 USE pw_types, ONLY: pw_c1d_gs_type,&
23 USE xc_b97_fxc, ONLY: b97_fcc_eval,&
26 USE xc_pade, ONLY: pade_fxc_eval,&
31 USE xc_util, ONLY: xc_pw_gradient
32 USE xc_xalpha, ONLY: xalpha_fxc_eval
33#include "../base/base_uses.f90"
34
35 IMPLICIT NONE
36 PRIVATE
37 PUBLIC :: calc_fxc_kernel
38
39 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xc_fxc_kernel'
40
41CONTAINS
42
43! **************************************************************************************************
44!> \brief Exchange and Correlation kernel functional calculations
45!> \param fxc_rspace ...
46!> \param rho_r the value of the density in the real space
47!> \param rho_g value of the density in the g space (needs to be associated
48!> only for gradient corrections)
49!> \param tau_r value of the kinetic density tau on the grid (can be null,
50!> used only with meta functionals)
51!> \param xc_kernel which functional to calculate, and how to do it
52!> \param triplet ...
53!> \param pw_pool the pool for the grids
54!> \author JGH
55! **************************************************************************************************
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
63
64 CHARACTER(len=*), PARAMETER :: routinen = 'calc_fxc_kernel'
65 REAL(kind=dp), PARAMETER :: eps_rho = 1.e-10_dp
66
67 CHARACTER(len=20) :: fxc_name
68 INTEGER :: handle, i, idir, j, k, nspins
69 INTEGER, DIMENSION(2, 3) :: bo
70 LOGICAL :: lsd
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, &
76 rhob
77 TYPE(pw_r3d_rs_type), DIMENSION(3) :: drhoa
78 TYPE(xc_rho_cflags_type) :: needs
79
80 cpassert(ASSOCIATED(xc_kernel))
81 cpassert(ASSOCIATED(pw_pool))
82
83 CALL timeset(routinen, handle)
84
85 nspins = SIZE(rho_r)
86 lsd = (nspins == 2)
87 IF (triplet) THEN
88 cpassert(nspins == 1)
89 END IF
90
91 CALL section_vals_val_get(xc_kernel, "_SECTION_PARAMETERS_", c_val=fxc_name)
92 CALL section_vals_val_get(xc_kernel, "SCALE_X", r_val=scalex)
93 CALL section_vals_val_get(xc_kernel, "SCALE_C", r_val=scalec)
94
95 CALL xc_rho_cflags_setall(needs, .false.)
96 CALL fxc_kernel_info(fxc_name, needs, lsd)
97
98 CALL pw_pool%create_pw(rhoa)
99 CALL pw_pool%create_pw(rhob)
100 IF (lsd) THEN
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)
106 ELSE
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)
111 END IF
112 IF (needs%norm_drho) THEN
113 ! deriv rho
114 DO idir = 1, 3
115 CALL pw_pool%create_pw(drhoa(idir))
116 END DO
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)
121 IF (lsd) THEN
122 CALL pw_copy(rho_g(1), rhog)
123 ELSE IF (triplet) THEN
124 CALL pw_copy(rho_g(1), rhog)
125 ELSE
126 CALL pw_copy(rho_g(1), rhog)
127 CALL pw_scale(rhog, 0.5_dp)
128 END IF
129 CALL xc_pw_gradient(rhoa, rhog, tmpg, drhoa(:), xc_deriv_pw)
130 bo(1:2, 1:3) = rhoa%pw_grid%bounds_local(1:2, 1:3)
131!$OMP PARALLEL DO DEFAULT(NONE) PRIVATE(i,j,k) SHARED(bo,norm_drhoa,drhoa)
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)
138 END DO
139 END DO
140 END DO
141 IF (lsd) THEN
142 CALL pw_copy(rho_g(2), rhog)
143 CALL xc_pw_gradient(rhob, rhog, tmpg, drhoa(:), xc_deriv_pw)
144 bo(1:2, 1:3) = rhob%pw_grid%bounds_local(1:2, 1:3)
145!$OMP PARALLEL DO DEFAULT(NONE) PRIVATE(i,j,k) SHARED(bo,norm_drhob,drhoa)
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)
152 END DO
153 END DO
154 END DO
155 ELSE
156 norm_drhob%array(:, :, :) = norm_drhoa%array(:, :, :)
157 END IF
158 CALL pw_pool%give_back_pw(rhog)
159 CALL pw_pool%give_back_pw(tmpg)
160 END IF
161 IF (needs%tau) THEN
162 mark_used(tau_r)
163 cpabort("Meta functionals not available.")
164 END IF
165
166 SELECT CASE (trim(fxc_name))
167 CASE ("PADEFXC")
168 IF (scalec == scalex) THEN
169 CALL pade_init(eps_rho)
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)
175 END IF
176 ELSE
177 cpabort("PADE Fxc Kernel functional needs SCALE_X==SCALE_C")
178 END IF
179 CASE ("LDAFXC")
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)
184 CALL perdew_wang_fxc_calc(rhoa, rhob, fxc_rspace(1), fxc_rspace(2), fxc_rspace(3), &
185 scalec, eps_rho)
186 CASE ("GGAFXC")
187 ! get parameter
188 CALL section_vals_val_get(xc_kernel, "GAMMA", r_vals=rvals)
189 g_ab(1:3) = rvals(1:3)
190 CALL section_vals_val_get(xc_kernel, "C_XAA", r_vals=rvals)
191 cxaa(1:3) = rvals(1:3)
192 CALL section_vals_val_get(xc_kernel, "C_CAA", r_vals=rvals)
193 ccaa(1:3) = rvals(1:3)
194 CALL section_vals_val_get(xc_kernel, "C_CAB", r_vals=rvals)
195 ccab(1:3) = rvals(1:3)
196 ! correlation
197 CALL pw_zero(fxc_rspace(1))
198 CALL pw_zero(fxc_rspace(2))
199 CALL pw_zero(fxc_rspace(3))
200 CALL perdew_wang_fxc_calc(rhoa, rhob, fxc_rspace(1), fxc_rspace(2), fxc_rspace(3), &
201 scalec, eps_rho)
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)
205 ! exchange
206 CALL pw_pool%create_pw(fxa)
207 CALL pw_pool%create_pw(fxb)
208 CALL pw_zero(fxa)
209 CALL pw_zero(fxb)
210 CALL xalpha_fxc_eval(rhoa, rhob, fxa, fxb, scalex, eps_rho)
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)
217 CASE ("NONE")
218 CALL pw_zero(fxc_rspace(1))
219 CALL pw_zero(fxc_rspace(2))
220 CALL pw_zero(fxc_rspace(3))
221 CASE default
222 cpabort("Fxc Kernel functional is defined incorrectly")
223 END SELECT
224
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)
230 DO idir = 1, 3
231 CALL pw_pool%give_back_pw(drhoa(idir))
232 END DO
233 END IF
234
235 CALL timestop(handle)
236
237 END SUBROUTINE calc_fxc_kernel
238
239! **************************************************************************************************
240!> \brief ...
241!> \param fxc_name ...
242!> \param needs ...
243!> \param lsd ...
244! **************************************************************************************************
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
249
250 SELECT CASE (trim(fxc_name))
251 CASE ("PADEFXC", "LDAFXC")
252 IF (lsd) THEN
253 needs%rho_spin = .true.
254 ELSE
255 needs%rho = .true.
256 END IF
257 CASE ("GGAFXC")
258 IF (lsd) THEN
259 needs%rho_spin = .true.
260 needs%norm_drho_spin = .true.
261 needs%norm_drho = .true.
262 ELSE
263 needs%rho = .true.
264 needs%norm_drho = .true.
265 END IF
266 CASE ("NONE")
267 CASE default
268 cpabort("Fxc Kernel functional is defined incorrectly")
269 END SELECT
270
271 END SUBROUTINE fxc_kernel_info
272
273END MODULE xc_fxc_kernel
274
objects that represent the structure of input sections and the data contained in an input section
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
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
Definition xc_b97_fxc.F:12
subroutine, public b97_fxc_eval(rhos, norm_drhos, fxc, gx, cx, eps_rho)
...
Definition xc_b97_fxc.F:34
subroutine, public b97_fcc_eval(rhoa, rhob, norm_drhoa, norm_drhob, fcc, gcc, cco, eps_rho)
...
Definition xc_b97_fxc.F:88
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.
input constants for xc
integer, parameter, public xc_deriv_pw
Calculate the LDA functional in the Pade approximation Literature: S. Goedecker, M....
Definition xc_pade.F:19
subroutine, public pade_fxc_eval(rho_a, rho_b, fxc_aa, fxc_ab, fxc_bb)
...
Definition xc_pade.F:813
subroutine, public pade_init(cutoff, debug)
...
Definition xc_pade.F:80
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)
...
contains the structure
elemental subroutine, public xc_rho_cflags_setall(cflags, value)
sets all the flags to the given value
contains utility functions for the xc package
Definition xc_util.F:14
subroutine, public xc_pw_gradient(pw_r, pw_g, tmp_g, gradient, xc_deriv_method_id)
...
Definition xc_util.F:123
Calculate the local exchange functional.
Definition xc_xalpha.F:19
subroutine, public xalpha_fxc_eval(rho_a, rho_b, fxc_aa, fxc_bb, scale_x, eps_rho)
...
Definition xc_xalpha.F:559
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
contains a flag for each component of xc_rho_set, so that you can use it to tell which components you...