(git:6a2e663)
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 ! **************************************************************************************************
13  USE input_section_types, ONLY: section_vals_type,&
15  USE kinds, ONLY: dp
16  USE pw_methods, ONLY: pw_axpy,&
17  pw_copy,&
18  pw_scale,&
19  pw_zero
20  USE pw_pool_types, ONLY: pw_pool_type
21  USE pw_types, ONLY: pw_c1d_gs_type,&
22  pw_r3d_rs_type
23  USE xc_b97_fxc, ONLY: b97_fcc_eval,&
26  USE xc_pade, ONLY: pade_fxc_eval,&
27  pade_init
30  xc_rho_cflags_type
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 
41 CONTAINS
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 
273 END 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 ...
Definition: pw_pool_types.F:24
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.
Definition: xc_fxc_kernel.F:12
subroutine, public calc_fxc_kernel(fxc_rspace, rho_r, rho_g, tau_r, xc_kernel, triplet, pw_pool)
Exchange and Correlation kernel functional calculations.
Definition: xc_fxc_kernel.F:57
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