Line data Source code
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 Calculate the several different kinetic energy functionals
10 : !> with a GGA form
11 : !> \par History
12 : !> JGH (26.02.2003) : OpenMP enabled
13 : !> fawzi (04.2004) : adapted to the new xc interface
14 : !> \author JGH (20.02.2002)
15 : ! **************************************************************************************************
16 : MODULE xc_ke_gga
17 :
18 : USE cp_array_utils, ONLY: cp_3d_r_cp_type
19 : USE kinds, ONLY: dp
20 : USE mathconstants, ONLY: pi
21 : USE xc_derivative_desc, ONLY: deriv_norm_drho,&
22 : deriv_norm_drhoa,&
23 : deriv_norm_drhob,&
24 : deriv_rho,&
25 : deriv_rhoa,&
26 : deriv_rhob
27 : USE xc_derivative_set_types, ONLY: xc_derivative_set_type,&
28 : xc_dset_get_derivative
29 : USE xc_derivative_types, ONLY: xc_derivative_get,&
30 : xc_derivative_type
31 : USE xc_functionals_utilities, ONLY: calc_wave_vector,&
32 : set_util
33 : USE xc_input_constants, ONLY: ke_lc,&
34 : ke_llp,&
35 : ke_ol1,&
36 : ke_ol2,&
37 : ke_pbe,&
38 : ke_pw86,&
39 : ke_pw91,&
40 : ke_t92
41 : USE xc_rho_cflags_types, ONLY: xc_rho_cflags_type
42 : USE xc_rho_set_types, ONLY: xc_rho_set_get,&
43 : xc_rho_set_type
44 : #include "../base/base_uses.f90"
45 :
46 : IMPLICIT NONE
47 :
48 : PRIVATE
49 :
50 : REAL(KIND=dp), PARAMETER :: f13 = 1.0_dp/3.0_dp, &
51 : f23 = 2.0_dp*f13, &
52 : f43 = 4.0_dp*f13, &
53 : f53 = 5.0_dp*f13
54 :
55 : PUBLIC :: ke_gga_info, ke_gga_lda_eval, ke_gga_lsd_eval
56 :
57 : REAL(KIND=dp) :: cf, b, b_lda, b_lsd, flda, flsd, sfac, t13
58 : REAL(KIND=dp) :: fact, tact
59 : REAL(KIND=dp) :: eps_rho
60 :
61 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xc_ke_gga'
62 :
63 : CONTAINS
64 :
65 : ! **************************************************************************************************
66 : !> \brief ...
67 : !> \param cutoff ...
68 : ! **************************************************************************************************
69 1648 : SUBROUTINE ke_gga_init(cutoff)
70 :
71 : REAL(KIND=dp), INTENT(IN) :: cutoff
72 :
73 1648 : eps_rho = cutoff
74 1648 : CALL set_util(cutoff)
75 :
76 1648 : cf = 0.3_dp*(3.0_dp*pi*pi)**f23
77 1648 : flda = cf
78 1648 : flsd = flda*2.0_dp**f23
79 : ! the_factor 2^(1/3) for LDA is here
80 1648 : b_lda = 2.0_dp**f43*(3.0_dp*pi*pi)**(f13)
81 1648 : b_lsd = 2.0_dp*(3.0_dp*pi*pi)**(f13)
82 1648 : sfac = 1.0_dp/(2.0_dp*(3.0_dp*pi*pi)**f13)
83 1648 : t13 = 2.0_dp**f13
84 :
85 1648 : END SUBROUTINE ke_gga_init
86 :
87 : ! **************************************************************************************************
88 : !> \brief ...
89 : !> \param functional ...
90 : !> \param lsd ...
91 : !> \param reference ...
92 : !> \param shortform ...
93 : !> \param needs ...
94 : !> \param max_deriv ...
95 : ! **************************************************************************************************
96 1786 : SUBROUTINE ke_gga_info(functional, lsd, reference, shortform, needs, max_deriv)
97 : INTEGER, INTENT(in) :: functional
98 : LOGICAL, INTENT(in) :: lsd
99 : CHARACTER(LEN=*), INTENT(OUT), OPTIONAL :: reference, shortform
100 : TYPE(xc_rho_cflags_type), INTENT(inout), OPTIONAL :: needs
101 : INTEGER, INTENT(out), OPTIONAL :: max_deriv
102 :
103 1786 : IF (PRESENT(reference)) THEN
104 0 : SELECT CASE (functional)
105 : CASE (ke_ol1)
106 : reference = "H. Ou-Yang and M. Levy, "// &
107 0 : "Intl. J. Quant. Chem. 40, 379 (1991); Functional 1"
108 : CASE (ke_ol2)
109 : reference = "H. Ou-Yang and M. Levy, "// &
110 0 : "Intl. J. Quant. Chem. 40, 379 (1991); Functional 2"
111 : CASE (ke_llp)
112 0 : reference = "H. Lee, C. Lee, R.G. Parr, Phys. Rev. A, 44, 768 (1991)"
113 : CASE (ke_pw86)
114 0 : reference = "J.P. Perdew and Y. Wang, Phys. Rev. B, 33, 8800 (1986)"
115 : CASE (ke_pw91)
116 0 : reference = "J.P. Perdew and Y. Wang, Electronic Structure of Solids 91"
117 : CASE (ke_lc)
118 0 : reference = "A. Lembarki and H. Chermette, Phys. Rev. A, 50, 5328 (1994)"
119 : CASE (ke_t92)
120 0 : reference = "A.J. Thakkar, Phys. Rev. A, 46, 6920 (1992)"
121 : CASE (ke_pbe)
122 0 : reference = "J.P.Perdew, K.Burke, M.Ernzerhof, Phys. Rev. Letter, 77, 3865 (1996)"
123 : END SELECT
124 0 : IF (.NOT. lsd) THEN
125 0 : IF (LEN_TRIM(reference) + 6 < LEN(reference)) THEN
126 0 : reference(LEN_TRIM(reference):LEN_TRIM(reference) + 6) = ' {spin unpolarized}'
127 : END IF
128 : END IF
129 : END IF
130 1786 : IF (PRESENT(shortform)) THEN
131 0 : SELECT CASE (functional)
132 : CASE (ke_ol1)
133 0 : shortform = "Ou-Yang-Levy Functional 1"
134 : CASE (ke_ol2)
135 0 : shortform = "Ou-Yang-Levy Functional 2"
136 : CASE (ke_llp)
137 0 : shortform = "Lee-Lee-Parr Functional"
138 : CASE (ke_pw86)
139 0 : shortform = "Perdew-Wang 1986 Functional (kinetic energy)"
140 : CASE (ke_pw91)
141 0 : shortform = "Perdew-Wang 1991 Functional (kinetic energy)"
142 : CASE (ke_lc)
143 0 : shortform = "Lembarki-Chermette kinetic energy functional"
144 : CASE (ke_t92)
145 0 : shortform = "Thakkar 1992 Functional"
146 : CASE (ke_pbe)
147 0 : shortform = "Perdew-Burke-Ernzerhof Functional (kinetic energy)"
148 : END SELECT
149 0 : IF (.NOT. lsd) THEN
150 0 : IF (LEN_TRIM(shortform) + 6 < LEN(shortform)) THEN
151 0 : shortform(LEN_TRIM(shortform):LEN_TRIM(shortform) + 6) = ' {spin unpolarized}'
152 : END IF
153 : END IF
154 : END IF
155 1786 : IF (PRESENT(needs)) THEN
156 1786 : IF (lsd) THEN
157 0 : needs%rho_spin = .TRUE.
158 0 : needs%rho_spin_1_3 = .TRUE.
159 0 : needs%norm_drho_spin = .TRUE.
160 : ELSE
161 1786 : needs%rho = .TRUE.
162 1786 : needs%rho_1_3 = .TRUE.
163 1786 : needs%norm_drho = .TRUE.
164 : END IF
165 : END IF
166 1786 : IF (PRESENT(max_deriv)) max_deriv = 3
167 :
168 1786 : END SUBROUTINE ke_gga_info
169 :
170 : ! **************************************************************************************************
171 : !> \brief ...
172 : !> \param functional ...
173 : !> \param rho_set ...
174 : !> \param deriv_set ...
175 : !> \param order ...
176 : ! **************************************************************************************************
177 1648 : SUBROUTINE ke_gga_lda_eval(functional, rho_set, deriv_set, order)
178 :
179 : INTEGER, INTENT(IN) :: functional
180 : TYPE(xc_rho_set_type), INTENT(IN) :: rho_set
181 : TYPE(xc_derivative_set_type), INTENT(IN) :: deriv_set
182 : INTEGER, INTENT(IN) :: order
183 :
184 : CHARACTER(LEN=*), PARAMETER :: routineN = 'ke_gga_lda_eval'
185 :
186 : INTEGER :: handle, m, npoints
187 : INTEGER, DIMENSION(2, 3) :: bo
188 : REAL(KIND=dp) :: drho_cutoff, rho_cutoff
189 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: s
190 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: fs
191 1648 : REAL(KIND=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_0, e_ndrho, e_ndrho_ndrho, &
192 1648 : e_ndrho_ndrho_ndrho, e_rho, e_rho_ndrho, e_rho_ndrho_ndrho, e_rho_rho, e_rho_rho_ndrho, &
193 1648 : e_rho_rho_rho, grho, rho, rho13
194 : TYPE(xc_derivative_type), POINTER :: deriv
195 :
196 1648 : CALL timeset(routineN, handle)
197 1648 : NULLIFY (rho, rho13, e_0, e_rho, e_ndrho, &
198 1648 : e_rho_rho, e_rho_ndrho, e_ndrho_ndrho, &
199 1648 : e_rho_rho_rho, e_rho_rho_ndrho, e_rho_ndrho_ndrho, e_ndrho_ndrho_ndrho)
200 1648 : m = ABS(order)
201 :
202 : CALL xc_rho_set_get(rho_set, rho_1_3=rho13, rho=rho, &
203 : norm_drho=grho, local_bounds=bo, rho_cutoff=rho_cutoff, &
204 1648 : drho_cutoff=drho_cutoff)
205 1648 : npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
206 1648 : CALL ke_gga_init(rho_cutoff)
207 :
208 4944 : ALLOCATE (s(npoints))
209 6592 : ALLOCATE (fs(npoints, m + 1))
210 :
211 : ! s = norm_drho/(rho^(4/3)*2*(pi*pi*3)^(1/3))
212 1648 : CALL calc_wave_vector("p", rho, grho, s)
213 :
214 1648 : fact = flda
215 : ! Definition of s has changed
216 1648 : b = b_lda
217 : ! tact = t13
218 1648 : tact = 1.0_dp
219 :
220 1648 : SELECT CASE (functional)
221 : CASE (ke_ol1)
222 0 : CALL efactor_ol1(s, fs, m)
223 0 : CPABORT("OL1 functional currently not working properly")
224 : CASE (ke_ol2)
225 0 : CALL efactor_ol2(s, fs, m)
226 0 : CPABORT("OL2 functional currently not working properly")
227 : CASE (ke_llp)
228 736 : CALL efactor_llp(s, fs, m)
229 : CASE (ke_pw86)
230 54 : CALL efactor_pw86(s, fs, m)
231 : CASE (ke_pw91)
232 54 : CALL efactor_pw91(s, fs, m, 1)
233 : CASE (ke_lc)
234 54 : CALL efactor_pw91(s, fs, m, 2)
235 : CASE (ke_t92)
236 174 : CALL efactor_t92(s, fs, m)
237 : CASE (ke_pbe)
238 576 : CALL efactor_pbex(s, fs, m, 1)
239 : CASE DEFAULT
240 1648 : CPABORT("Unsupported functional")
241 : END SELECT
242 :
243 1648 : IF (order >= 0) THEN
244 : deriv => xc_dset_get_derivative(deriv_set, [INTEGER::], &
245 1648 : allocate_deriv=.TRUE.)
246 1648 : CALL xc_derivative_get(deriv, deriv_data=e_0)
247 :
248 1648 : CALL kex_p_0(rho, rho13, fs, e_0, npoints)
249 : END IF
250 :
251 1648 : IF (order >= 1 .OR. order == -1) THEN
252 : deriv => xc_dset_get_derivative(deriv_set, [deriv_rho], &
253 1648 : allocate_deriv=.TRUE.)
254 1648 : CALL xc_derivative_get(deriv, deriv_data=e_rho)
255 : deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho], &
256 1648 : allocate_deriv=.TRUE.)
257 1648 : CALL xc_derivative_get(deriv, deriv_data=e_ndrho)
258 :
259 : CALL kex_p_1(rho, rho13, s, fs, e_rho=e_rho, e_ndrho=e_ndrho, &
260 1648 : npoints=npoints)
261 : END IF
262 1648 : IF (order >= 2 .OR. order == -2) THEN
263 : deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_rho], &
264 138 : allocate_deriv=.TRUE.)
265 138 : CALL xc_derivative_get(deriv, deriv_data=e_rho_rho)
266 : deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_norm_drho], &
267 138 : allocate_deriv=.TRUE.)
268 138 : CALL xc_derivative_get(deriv, deriv_data=e_rho_ndrho)
269 : deriv => xc_dset_get_derivative(deriv_set, &
270 138 : [deriv_norm_drho, deriv_norm_drho], allocate_deriv=.TRUE.)
271 138 : CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrho)
272 :
273 : CALL kex_p_2(rho, rho13, s, fs, e_rho_rho=e_rho_rho, &
274 138 : e_rho_ndrho=e_rho_ndrho, e_ndrho_ndrho=e_ndrho_ndrho, npoints=npoints)
275 : END IF
276 1648 : IF (order >= 3 .OR. order == -3) THEN
277 : deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_rho, deriv_rho], &
278 0 : allocate_deriv=.TRUE.)
279 0 : CALL xc_derivative_get(deriv, deriv_data=e_rho_rho_rho)
280 : deriv => xc_dset_get_derivative(deriv_set, &
281 0 : [deriv_rho, deriv_rho, deriv_norm_drho], allocate_deriv=.TRUE.)
282 0 : CALL xc_derivative_get(deriv, deriv_data=e_rho_rho_ndrho)
283 : deriv => xc_dset_get_derivative(deriv_set, &
284 0 : [deriv_rho, deriv_norm_drho, deriv_norm_drho], allocate_deriv=.TRUE.)
285 0 : CALL xc_derivative_get(deriv, deriv_data=e_rho_ndrho_ndrho)
286 : deriv => xc_dset_get_derivative(deriv_set, &
287 0 : [deriv_norm_drho, deriv_norm_drho, deriv_norm_drho], allocate_deriv=.TRUE.)
288 0 : CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrho_ndrho)
289 :
290 : CALL kex_p_3(rho, rho13, s, fs, e_rho_rho_rho=e_rho_rho_rho, &
291 : e_rho_rho_ndrho=e_rho_rho_ndrho, e_rho_ndrho_ndrho=e_rho_ndrho_ndrho, &
292 0 : e_ndrho_ndrho_ndrho=e_ndrho_ndrho_ndrho, npoints=npoints)
293 : END IF
294 1648 : IF (order > 3 .OR. order < -3) THEN
295 0 : CPABORT("derivatives bigger than 3 not implemented")
296 : END IF
297 :
298 1648 : DEALLOCATE (s)
299 1648 : DEALLOCATE (fs)
300 :
301 1648 : CALL timestop(handle)
302 :
303 1648 : END SUBROUTINE ke_gga_lda_eval
304 :
305 : ! **************************************************************************************************
306 : !> \brief ...
307 : !> \param functional ...
308 : !> \param rho_set ...
309 : !> \param deriv_set ...
310 : !> \param order ...
311 : ! **************************************************************************************************
312 0 : SUBROUTINE ke_gga_lsd_eval(functional, rho_set, deriv_set, order)
313 :
314 : INTEGER, INTENT(IN) :: functional
315 : TYPE(xc_rho_set_type), INTENT(IN) :: rho_set
316 : TYPE(xc_derivative_set_type), INTENT(IN) :: deriv_set
317 : INTEGER, INTENT(IN), OPTIONAL :: order
318 :
319 : CHARACTER(len=*), PARAMETER :: routineN = 'ke_gga_lsd_eval'
320 : INTEGER, DIMENSION(2), PARAMETER :: &
321 : norm_drho_spin_name = [deriv_norm_drhoa, deriv_norm_drhob], &
322 : rho_spin_name = [deriv_rhoa, deriv_rhob]
323 :
324 : INTEGER :: handle, ispin, m, npoints
325 : INTEGER, DIMENSION(2, 3) :: bo
326 : REAL(KIND=dp) :: rho_cutoff
327 0 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: s
328 0 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: fs
329 0 : REAL(KIND=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_0, e_ndrho, e_ndrho_ndrho, &
330 0 : e_ndrho_ndrho_ndrho, e_rho, e_rho_ndrho, e_rho_ndrho_ndrho, e_rho_rho, e_rho_rho_ndrho, &
331 0 : e_rho_rho_rho
332 0 : TYPE(cp_3d_r_cp_type), DIMENSION(2) :: norm_drho, rho, rho_1_3
333 : TYPE(xc_derivative_type), POINTER :: deriv
334 :
335 0 : CALL timeset(routineN, handle)
336 0 : NULLIFY (e_0, e_ndrho, e_ndrho_ndrho, e_ndrho_ndrho_ndrho, e_rho_ndrho_ndrho, &
337 0 : e_rho_ndrho, e_rho_rho_ndrho, e_rho, e_rho_rho, e_rho_rho_rho)
338 0 : DO ispin = 1, 2
339 0 : NULLIFY (norm_drho(ispin)%array, rho(ispin)%array, rho_1_3(ispin)%array)
340 : END DO
341 :
342 : CALL xc_rho_set_get(rho_set, rhoa_1_3=rho_1_3(1)%array, &
343 : rhob_1_3=rho_1_3(2)%array, rhoa=rho(1)%array, &
344 : rhob=rho(2)%array, norm_drhoa=norm_drho(1)%array, &
345 : norm_drhob=norm_drho(2)%array, rho_cutoff=rho_cutoff, &
346 0 : local_bounds=bo)
347 0 : npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
348 0 : m = ABS(order)
349 0 : CALL ke_gga_init(rho_cutoff)
350 :
351 0 : ALLOCATE (s(npoints))
352 0 : ALLOCATE (fs(npoints, m + 1))
353 :
354 0 : fact = flsd
355 0 : b = b_lsd
356 0 : tact = 1.0_dp
357 :
358 0 : DO ispin = 1, 2
359 :
360 0 : CALL calc_wave_vector("p", rho(ispin)%array, norm_drho(ispin)%array, s)
361 :
362 0 : SELECT CASE (functional)
363 : CASE (ke_ol1)
364 0 : CALL efactor_ol1(s, fs, m)
365 : CASE (ke_ol2)
366 0 : CALL efactor_ol2(s, fs, m)
367 : CASE (ke_llp)
368 0 : CALL efactor_llp(s, fs, m)
369 : CASE (ke_pw86)
370 0 : tact = (1.0_dp/2.0_dp)**(1.0_dp/3.0_dp)
371 0 : CALL efactor_pw86(s, fs, m, f2_lsd=tact)
372 0 : tact = 1.0_dp
373 : CASE (ke_pbe)
374 0 : tact = (1.0_dp/2.0_dp)**(1.0_dp/3.0_dp)
375 0 : CALL efactor_pbex(s, fs, m, 1, f2_lsd=tact)
376 0 : tact = 1.0_dp
377 : CASE (ke_pw91)
378 0 : tact = (1.0_dp/2.0_dp)**(1.0_dp/3.0_dp)
379 0 : CALL efactor_pw91(s, fs, m, 1, f2_lsd=tact)
380 0 : tact = 1.0_dp
381 : CASE (ke_lc)
382 0 : tact = (1.0_dp/2.0_dp)**(1.0_dp/3.0_dp)
383 0 : CALL efactor_pw91(s, fs, m, 2, f2_lsd=tact)
384 0 : tact = 1.0_dp
385 : CASE (ke_t92)
386 0 : CALL efactor_t92(s, fs, m)
387 : CASE DEFAULT
388 0 : CPABORT("Unsupported functional")
389 : END SELECT
390 :
391 0 : IF (order >= 0) THEN
392 : deriv => xc_dset_get_derivative(deriv_set, [INTEGER::], &
393 0 : allocate_deriv=.TRUE.)
394 0 : CALL xc_derivative_get(deriv, deriv_data=e_0)
395 :
396 : CALL kex_p_0(rho(ispin)%array, rho_1_3(ispin)%array, fs, &
397 0 : e_0=e_0, npoints=npoints)
398 : END IF
399 0 : IF (order >= 1 .OR. order == -1) THEN
400 : deriv => xc_dset_get_derivative(deriv_set, [rho_spin_name(ispin)], &
401 0 : allocate_deriv=.TRUE.)
402 0 : CALL xc_derivative_get(deriv, deriv_data=e_rho)
403 : deriv => xc_dset_get_derivative(deriv_set, [norm_drho_spin_name(ispin)], &
404 0 : allocate_deriv=.TRUE.)
405 0 : CALL xc_derivative_get(deriv, deriv_data=e_ndrho)
406 :
407 : CALL kex_p_1(rho=rho(ispin)%array, &
408 : r13=rho_1_3(ispin)%array, s=s, fs=fs, e_rho=e_rho, &
409 0 : e_ndrho=e_ndrho, npoints=npoints)
410 : END IF
411 0 : IF (order >= 2 .OR. order == -2) THEN
412 : deriv => xc_dset_get_derivative(deriv_set, [rho_spin_name(ispin), &
413 0 : rho_spin_name(ispin)], allocate_deriv=.TRUE.)
414 0 : CALL xc_derivative_get(deriv, deriv_data=e_rho_rho)
415 : deriv => xc_dset_get_derivative(deriv_set, [rho_spin_name(ispin), &
416 0 : norm_drho_spin_name(ispin)], allocate_deriv=.TRUE.)
417 0 : CALL xc_derivative_get(deriv, deriv_data=e_rho_ndrho)
418 : deriv => xc_dset_get_derivative(deriv_set, [norm_drho_spin_name(ispin), &
419 0 : norm_drho_spin_name(ispin)], allocate_deriv=.TRUE.)
420 0 : CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrho)
421 :
422 : CALL kex_p_2(rho(ispin)%array, rho_1_3(ispin)%array, &
423 0 : s, fs, e_rho_rho, e_rho_ndrho, e_ndrho_ndrho, npoints)
424 : END IF
425 0 : IF (order >= 3 .OR. order == -3) THEN
426 : deriv => xc_dset_get_derivative(deriv_set, [rho_spin_name(ispin), &
427 : rho_spin_name(ispin), rho_spin_name(ispin)], &
428 0 : allocate_deriv=.TRUE.)
429 0 : CALL xc_derivative_get(deriv, deriv_data=e_rho_rho_rho)
430 : deriv => xc_dset_get_derivative(deriv_set, [rho_spin_name(ispin), &
431 : rho_spin_name(ispin), norm_drho_spin_name(ispin)], &
432 0 : allocate_deriv=.TRUE.)
433 0 : CALL xc_derivative_get(deriv, deriv_data=e_rho_rho_ndrho)
434 : deriv => xc_dset_get_derivative(deriv_set, [rho_spin_name(ispin), &
435 : norm_drho_spin_name(ispin), norm_drho_spin_name(ispin)], &
436 0 : allocate_deriv=.TRUE.)
437 0 : CALL xc_derivative_get(deriv, deriv_data=e_rho_ndrho_ndrho)
438 : deriv => xc_dset_get_derivative(deriv_set, [norm_drho_spin_name(ispin), &
439 : norm_drho_spin_name(ispin), norm_drho_spin_name(ispin)], &
440 0 : allocate_deriv=.TRUE.)
441 0 : CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrho_ndrho)
442 :
443 : CALL kex_p_3(rho(ispin)%array, &
444 : rho_1_3(ispin)%array, s, fs, e_rho_rho_rho, e_rho_rho_ndrho, &
445 0 : e_rho_ndrho_ndrho, e_ndrho_ndrho_ndrho, npoints)
446 : END IF
447 0 : IF (order > 3 .OR. order < -3) THEN
448 0 : CPABORT("derivatives bigger than 3 not implemented")
449 : END IF
450 :
451 : END DO
452 :
453 0 : DEALLOCATE (s)
454 0 : DEALLOCATE (fs)
455 0 : CALL timestop(handle)
456 0 : END SUBROUTINE ke_gga_lsd_eval
457 :
458 : ! **************************************************************************************************
459 : !> \brief ...
460 : !> \param rho ...
461 : !> \param r13 ...
462 : !> \param fs ...
463 : !> \param e_0 ...
464 : !> \param npoints ...
465 : ! **************************************************************************************************
466 1648 : SUBROUTINE kex_p_0(rho, r13, fs, e_0, npoints)
467 :
468 : REAL(KIND=dp), DIMENSION(*), INTENT(IN) :: rho, r13
469 : REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: fs
470 : REAL(KIND=dp), DIMENSION(*), INTENT(INOUT) :: e_0
471 : INTEGER, INTENT(in) :: npoints
472 :
473 : INTEGER :: ip
474 :
475 : !$OMP PARALLEL DO DEFAULT(NONE) &
476 : !$OMP SHARED(npoints, rho, e_0, fact, r13, fs, eps_rho) &
477 1648 : !$OMP PRIVATE(ip)
478 :
479 : DO ip = 1, npoints
480 :
481 : IF (rho(ip) > eps_rho) THEN
482 : e_0(ip) = e_0(ip) + fact*r13(ip)*r13(ip)*rho(ip)*fs(ip, 1)
483 : END IF
484 :
485 : END DO
486 :
487 : !$OMP END PARALLEL DO
488 :
489 1648 : END SUBROUTINE kex_p_0
490 :
491 : ! **************************************************************************************************
492 : !> \brief ...
493 : !> \param rho ...
494 : !> \param r13 ...
495 : !> \param s ...
496 : !> \param fs ...
497 : !> \param e_rho ...
498 : !> \param e_ndrho ...
499 : !> \param npoints ...
500 : ! **************************************************************************************************
501 1648 : SUBROUTINE kex_p_1(rho, r13, s, fs, e_rho, e_ndrho, npoints)
502 :
503 : REAL(KIND=dp), DIMENSION(*), INTENT(IN) :: rho, r13, s
504 : REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: fs
505 : REAL(KIND=dp), DIMENSION(*), INTENT(INOUT) :: e_rho, e_ndrho
506 : INTEGER, INTENT(in) :: npoints
507 :
508 : INTEGER :: ip
509 : REAL(KIND=dp) :: a0, a1, sx, sy
510 :
511 : !$OMP PARALLEL DO DEFAULT(NONE) &
512 : !$OMP SHARED(npoints, rho, eps_rho, fact, r13, sfac, tact) &
513 : !$OMP SHARED(fs, e_rho, e_ndrho, s) &
514 1648 : !$OMP PRIVATE(ip,a0,a1,sx,sy)
515 :
516 : DO ip = 1, npoints
517 :
518 : IF (rho(ip) > eps_rho) THEN
519 :
520 : a0 = fact*r13(ip)*r13(ip)*rho(ip)
521 : a1 = f53*fact*r13(ip)*r13(ip)
522 : sx = -f43*s(ip)/rho(ip)
523 : sy = sfac*tact/(r13(ip)*rho(ip))
524 : e_rho(ip) = e_rho(ip) + a1*fs(ip, 1) + a0*fs(ip, 2)*sx
525 : e_ndrho(ip) = e_ndrho(ip) + a0*fs(ip, 2)*sy
526 :
527 : END IF
528 :
529 : END DO
530 :
531 : !$OMP END PARALLEL DO
532 :
533 1648 : END SUBROUTINE kex_p_1
534 :
535 : ! **************************************************************************************************
536 : !> \brief ...
537 : !> \param rho ...
538 : !> \param r13 ...
539 : !> \param s ...
540 : !> \param fs ...
541 : !> \param e_rho_rho ...
542 : !> \param e_rho_ndrho ...
543 : !> \param e_ndrho_ndrho ...
544 : !> \param npoints ...
545 : ! **************************************************************************************************
546 138 : SUBROUTINE kex_p_2(rho, r13, s, fs, e_rho_rho, e_rho_ndrho, e_ndrho_ndrho, &
547 : npoints)
548 :
549 : REAL(KIND=dp), DIMENSION(*), INTENT(IN) :: rho, r13, s
550 : REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: fs
551 : REAL(KIND=dp), DIMENSION(*), INTENT(INOUT) :: e_rho_rho, e_rho_ndrho, e_ndrho_ndrho
552 : INTEGER, INTENT(in) :: npoints
553 :
554 : INTEGER :: ip
555 : REAL(KIND=dp) :: a0, a1, a2, sx, sxx, sxy, sy
556 :
557 : !$OMP PARALLEL DO DEFAULT(NONE) &
558 : !$OMP SHARED (npoints, rho, eps_rho, fact, r13) &
559 : !$OMP SHARED (e_rho_rho, e_rho_ndrho, e_ndrho_ndrho, fs) &
560 : !$OMP SHARED(s, sfac, tact) &
561 138 : !$OMP PRIVATE(ip,a0,a1,a2,sx,sy,sxx,sxy)
562 :
563 : DO ip = 1, npoints
564 :
565 : IF (rho(ip) > eps_rho) THEN
566 :
567 : a0 = fact*r13(ip)*r13(ip)*rho(ip)
568 : a1 = f53*fact*r13(ip)*r13(ip)
569 : a2 = f23*f53*fact/r13(ip)
570 : sx = -f43*s(ip)/rho(ip)
571 : sy = sfac*tact/(r13(ip)*rho(ip))
572 : sxx = 28.0_dp/9.0_dp*s(ip)/(rho(ip)*rho(ip))
573 : sxy = -f43*sfac*tact/(r13(ip)*rho(ip)*rho(ip))
574 : e_rho_rho(ip) = e_rho_rho(ip) + a2*fs(ip, 1) + 2.0_dp*a1*fs(ip, 2)*sx + &
575 : a0*fs(ip, 3)*sx*sx + a0*fs(ip, 2)*sxx
576 : e_rho_ndrho(ip) = e_rho_ndrho(ip) + a1*fs(ip, 2)*sy + a0*fs(ip, 3)*sx*sy + &
577 : a0*fs(ip, 2)*sxy
578 : e_ndrho_ndrho(ip) = e_ndrho_ndrho(ip) + a0*fs(ip, 3)*sy*sy
579 :
580 : END IF
581 :
582 : END DO
583 :
584 : !$OMP END PARALLEL DO
585 :
586 138 : END SUBROUTINE kex_p_2
587 :
588 : ! **************************************************************************************************
589 : !> \brief ...
590 : !> \param rho ...
591 : !> \param r13 ...
592 : !> \param s ...
593 : !> \param fs ...
594 : !> \param e_rho_rho_rho ...
595 : !> \param e_rho_rho_ndrho ...
596 : !> \param e_rho_ndrho_ndrho ...
597 : !> \param e_ndrho_ndrho_ndrho ...
598 : !> \param npoints ...
599 : ! **************************************************************************************************
600 0 : SUBROUTINE kex_p_3(rho, r13, s, fs, e_rho_rho_rho, e_rho_rho_ndrho, &
601 : e_rho_ndrho_ndrho, e_ndrho_ndrho_ndrho, npoints)
602 :
603 : REAL(KIND=dp), DIMENSION(*), INTENT(IN) :: rho, r13, s
604 : REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: fs
605 : REAL(KIND=dp), DIMENSION(*), INTENT(inout) :: e_rho_rho_rho, e_rho_rho_ndrho, &
606 : e_rho_ndrho_ndrho, e_ndrho_ndrho_ndrho
607 : INTEGER, INTENT(in) :: npoints
608 :
609 : INTEGER :: ip
610 : REAL(KIND=dp) :: a0, a1, a2, a3, sx, sxx, sxxx, sxxy, &
611 : sxy, sy
612 :
613 : !$OMP PARALLEL DO DEFAULT(NONE) &
614 : !$OMP SHARED(npoints, rho, eps_rho, fact, r13) &
615 : !$OMP SHARED(s, sfac, tact, fs, e_rho_rho_rho) &
616 : !$OMP SHARED(e_rho_rho_ndrho, e_rho_ndrho_ndrho) &
617 : !$OMP SHARED(e_ndrho_ndrho_ndrho) &
618 0 : !$OMP PRIVATE(ip,a0,a1,a2,a3,sx,sy,sxx,sxy,sxxx,sxxy)
619 :
620 : DO ip = 1, npoints
621 :
622 : IF (rho(ip) > eps_rho) THEN
623 :
624 : a0 = fact*r13(ip)*r13(ip)*rho(ip)
625 : a1 = f53*fact*r13(ip)*r13(ip)
626 : a2 = f23*f53*fact/r13(ip)
627 : a3 = -f13*f23*f53*fact/(r13(ip)*rho(ip))
628 : sx = -f43*s(ip)/rho(ip)
629 : sy = sfac*tact/(r13(ip)*rho(ip))
630 : sxx = 28.0_dp/9.0_dp*s(ip)/(rho(ip)*rho(ip))
631 : sxy = -f43*sfac*tact/(r13(ip)*rho(ip)*rho(ip))
632 : sxxx = -280.0_dp/27.0_dp*s(ip)/(rho(ip)*rho(ip)*rho(ip))
633 : sxxy = 28.0_dp/9.0_dp*sfac*tact/(r13(ip)*rho(ip)*rho(ip)*rho(ip))
634 : e_rho_rho_rho(ip) = e_rho_rho_rho(ip) + a3*fs(ip, 1) + 3.0_dp*a2*fs(ip, 2)*sx + &
635 : 3.0_dp*a1*fs(ip, 3)*sx*sx + 3.0_dp*a1*fs(ip, 2)*sxx + &
636 : a0*fs(ip, 4)*sx*sx*sx + 3.0_dp*a0*fs(ip, 3)*sx*sxx + &
637 : a0*fs(ip, 2)*sxxx
638 : e_rho_rho_ndrho(ip) = e_rho_rho_ndrho(ip) + a2*fs(ip, 2)*sy + 2.0_dp*a1*fs(ip, 3)*sx*sy + &
639 : 2.0_dp*a1*fs(ip, 2)*sxy + a0*fs(ip, 4)*sx*sx*sy + &
640 : 2.0_dp*a0*fs(ip, 3)*sx*sxy + a0*fs(ip, 3)*sxx*sy + &
641 : a0*fs(ip, 2)*sxxy
642 : e_rho_ndrho_ndrho(ip) = e_rho_ndrho_ndrho(ip) + a1*fs(ip, 3)*sy*sy + a0*fs(ip, 4)*sx*sy*sy + &
643 : 2.0_dp*a0*fs(ip, 3)*sxy*sy
644 : e_ndrho_ndrho_ndrho(ip) = e_ndrho_ndrho_ndrho(ip) + a0*fs(ip, 4)*sy*sy*sy
645 :
646 : END IF
647 :
648 : END DO
649 :
650 : !$OMP END PARALLEL DO
651 :
652 0 : END SUBROUTINE kex_p_3
653 :
654 : ! Enhancement Factors
655 : ! **************************************************************************************************
656 : !> \brief ...
657 : !> \param s ...
658 : !> \param fs ...
659 : !> \param m ...
660 : ! **************************************************************************************************
661 0 : SUBROUTINE efactor_ol1(s, fs, m)
662 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: s
663 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: fs
664 : INTEGER, INTENT(IN) :: m
665 :
666 : INTEGER :: ip
667 : REAL(KIND=dp) :: t1, t2
668 :
669 0 : t1 = b*b/(72.0_dp*cf)
670 0 : t2 = 0.001878_dp*b
671 :
672 : !$OMP PARALLEL DO DEFAULT(NONE) &
673 : !$OMP SHARED(s, m, fs, t1, t2) &
674 0 : !$OMP PRIVATE(ip)
675 :
676 : DO ip = 1, SIZE(s)
677 : SELECT CASE (m)
678 : CASE (0)
679 : fs(ip, 1) = 1.0_dp + t1*s(ip)*s(ip) + t2*s(ip)
680 : CASE (1)
681 : fs(ip, 1) = 1.0_dp + t1*s(ip)*s(ip) + t2*s(ip)
682 : fs(ip, 2) = 2.0_dp*t1*s(ip) + t2
683 : CASE (2:3)
684 : fs(ip, 1) = 1.0_dp + t1*s(ip)*s(ip) + t2*s(ip)
685 : fs(ip, 2) = 2.0_dp*t1*s(ip) + t2
686 : fs(ip, 3) = 2.0_dp*t1
687 : CASE DEFAULT
688 : CPABORT("Illegal order.")
689 : END SELECT
690 : END DO
691 :
692 : !$OMP END PARALLEL DO
693 :
694 0 : IF (m == 3) fs(:, 4) = 0.0_dp
695 :
696 0 : END SUBROUTINE efactor_ol1
697 : ! **************************************************************************************************
698 : !> \brief ...
699 : !> \param s ...
700 : !> \param fs ...
701 : !> \param m ...
702 : ! **************************************************************************************************
703 0 : SUBROUTINE efactor_ol2(s, fs, m)
704 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: s
705 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: fs
706 : INTEGER, INTENT(IN) :: m
707 :
708 : INTEGER :: ip
709 : REAL(KIND=dp) :: t1, t2, t3, y
710 :
711 0 : t1 = b*b/(72.0_dp*cf)
712 0 : t2 = 0.0245_dp*b
713 0 : t3 = 2.0_dp**f53*b
714 :
715 : !$OMP PARALLEL DO DEFAULT(NONE) &
716 : !$OMP SHARED(s, m, t1, t2, t3, fs) &
717 0 : !$OMP PRIVATE(ip,y)
718 :
719 : DO ip = 1, SIZE(s)
720 : y = 1.0_dp/(1.0_dp + t3*s(ip))
721 : SELECT CASE (m)
722 : CASE (0)
723 : fs(ip, 1) = 1.0_dp + t1*s(ip)*s(ip) + t2*s(ip)*y
724 : CASE (1)
725 : fs(ip, 1) = 1.0_dp + t1*s(ip)*s(ip) + t2*s(ip)*y
726 : fs(ip, 2) = 2.0_dp*t1*s(ip) + t2*y*y
727 : CASE (2)
728 : fs(ip, 1) = 1.0_dp + t1*s(ip)*s(ip) + t2*s(ip)*y
729 : fs(ip, 2) = 2.0_dp*t1*s(ip) + t2*y*y
730 : fs(ip, 3) = 2.0_dp*(t1 - t2*t3*y*y*y)
731 : CASE (3)
732 : fs(ip, 1) = 1.0_dp + t1*s(ip)*s(ip) + t2*s(ip)*y
733 : fs(ip, 2) = 2.0_dp*t1*s(ip) + t2*y*y
734 : fs(ip, 3) = 2.0_dp*(t1 - t2*t3*y*y*y)
735 : fs(ip, 4) = 6.0_dp*t2*t3*t3*y*y*y*y
736 : CASE DEFAULT
737 : CPABORT("Illegal order.")
738 : END SELECT
739 : END DO
740 :
741 : !$OMP END PARALLEL DO
742 :
743 0 : END SUBROUTINE efactor_ol2
744 : ! **************************************************************************************************
745 : !> \brief ...
746 : !> \param s ...
747 : !> \param fs ...
748 : !> \param m ...
749 : ! **************************************************************************************************
750 736 : SUBROUTINE efactor_llp(s, fs, m)
751 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: s
752 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: fs
753 : INTEGER, INTENT(IN) :: m
754 :
755 : INTEGER :: ip
756 : REAL(KIND=dp) :: as, bs, p, q, sas, sbs, t1, t10, t11, t12, t133, t16, t17, t19, t2, t20, &
757 : t22, t23, t26, t28, t29, t3, t30, t33, t36, t39, t4, t40, t42, t43, t45, t46, t47, t49, &
758 : t5, t50, t54, t55, t7, t71, t8, t9, x, ys
759 :
760 736 : p = 0.0044188_dp*b*b
761 736 : q = 0.0253_dp*b
762 :
763 : !$OMP PARALLEL DO DEFAULT(NONE) &
764 : !$OMP SHARED(s, m, fs, p, q, b) &
765 : !$OMP PRIVATE(ip,x,bs,sbs,as,sas,ys,t2,t4,t5,t8,t9,t10,t12) &
766 : !$OMP PRIVATE(t1,t3,t7,t11,t16,t17,t20,t22,t23,t26,t30,t33) &
767 : !$OMP PRIVATE(t40,t42,t43,t45,t46,t47,t49,t50,t71,t133) &
768 736 : !$OMP PRIVATE(t19,t28,t29,t36,t39,t54,t55)
769 :
770 : DO ip = 1, SIZE(s)
771 : x = s(ip)
772 : bs = b*x
773 : sbs = SQRT(bs*bs + 1.0_dp)
774 : as = LOG(bs + sbs)
775 : sas = x*as
776 : ys = 1.0_dp/(1.0_dp + q*sas)
777 : SELECT CASE (m)
778 : CASE (0)
779 : fs(ip, 1) = 1.0_dp + p*x*x*ys
780 : CASE (1)
781 : fs(ip, 1) = 1.0_dp + p*x*x*ys
782 : t2 = q*x
783 : t4 = b**2
784 : t5 = x**2
785 : t8 = SQRT(1.0_dp + t4*t5)
786 : t9 = b*x + t8
787 : t10 = LOG(t9)
788 : t12 = 1.0_dp + t2*t10
789 : t17 = t12**2
790 : fs(ip, 2) = 2.0_dp*p*x/t12 - p*t5/t17*(q*t10 + t2*(b + 1.0_dp/t8*t4*x)/t9)
791 :
792 : CASE (2)
793 : fs(ip, 1) = 1.0_dp + p*x*x*ys
794 : ! first der
795 : t2 = q*x
796 : t4 = b**2
797 : t5 = x**2
798 : t8 = SQRT(1.0_dp + t4*t5)
799 : t9 = b*x + t8
800 : t10 = LOG(t9)
801 : t12 = 1.0_dp + t2*t10
802 : t17 = t12**2
803 : fs(ip, 2) = 2.0_dp*p*x/t12 - p*t5/t17*(q*t10 + t2*(b + 1.0_dp/t8*t4*x)/t9)
804 :
805 : ! second der
806 : t1 = q*x
807 : t3 = b**2
808 : t4 = x**2
809 : t7 = SQRT(1.0_dp + t3*t4)
810 : t8 = b*x + t7
811 : t9 = LOG(t8)
812 : t11 = 1.0_dp + t1*t9
813 : t16 = t11**2
814 : t17 = 1.0_dp/t16
815 : t20 = 1.0_dp/t7*t3
816 : t22 = b + t20*x
817 : t23 = 1/t8
818 : t26 = q*t9 + t1*t22*t23
819 : t30 = p*t4
820 : t33 = t26**2
821 : t40 = t7**2
822 : t43 = t3**2
823 : t49 = t22**2
824 : t50 = t8**2
825 : fs(ip, 3) = 2.0_dp*p/t11 - 4.0_dp*p*x*t17*t26 + 2.0_dp*t30/t16/ &
826 : t11*t33 - t30*t17*(2.0_dp*q*t22*t23 + t1* &
827 : (-1.0_dp/t40/t7*t43*t4 + t20)*t23 - t1*t49/t50)
828 :
829 : CASE (3)
830 :
831 : fs(ip, 1) = 1.0_dp + p*x*x*ys
832 : ! first der
833 : t2 = q*x
834 : t4 = b**2
835 : t5 = x**2
836 : t8 = SQRT(1.0_dp + t4*t5)
837 : t9 = b*x + t8
838 : t10 = LOG(t9)
839 : t12 = 1.0_dp + t2*t10
840 : t17 = t12**2
841 : fs(ip, 2) = 2.0_dp*p*x/t12 - p*t5/t17*(q*t10 + t2*(b + 1.0_dp/t8*t4*x)/t9)
842 :
843 : ! second der
844 : t1 = q*x
845 : t3 = b**2
846 : t4 = x**2
847 : t7 = SQRT(1.0_dp + t3*t4)
848 : t8 = b*x + t7
849 : t9 = LOG(t8)
850 : t11 = 1.0_dp + t1*t9
851 : t16 = t11**2
852 : t17 = 1.0_dp/t16
853 : t20 = 1.0_dp/t7*t3
854 : t22 = b + t20*x
855 : t23 = 1/t8
856 : t26 = q*t9 + t1*t22*t23
857 : t30 = p*t4
858 : t33 = t26**2
859 : t40 = t7**2
860 : t43 = t3**2
861 : t49 = t22**2
862 : t50 = t8**2
863 : fs(ip, 3) = 2.0_dp*p/t11 - 4.0_dp*p*x*t17*t26 + 2.0_dp*t30/t16/ &
864 : t11*t33 - t30*t17*(2.0_dp*q*t22*t23 + t1* &
865 : (-1.0_dp/t40/t7*t43*t4 + t20)*t23 - t1*t49/t50)
866 :
867 : t1 = q*x
868 : t3 = b**2
869 : t4 = x**2
870 : t7 = SQRT(1 + t3*t4)
871 : t8 = b*x + t7
872 : t9 = LOG(t8)
873 : t11 = 1.0_dp + t1*t9
874 : t12 = t11**2
875 : t133 = 1.0_dp/t12
876 : t17 = 1.0_dp/t7*t3
877 : t19 = b + t17*x
878 : t20 = 1.0_dp/t8
879 : t23 = q*t9 + t1*t19*t20
880 : t26 = p*x
881 : t28 = 1.0_dp/t12/t11
882 : t29 = t23**2
883 : t36 = t7**2
884 : t39 = t3**2
885 : t40 = 1.0_dp/t36/t7*t39
886 : t42 = -t40*t4 + t17
887 : t45 = t19**2
888 : t46 = t8**2
889 : t47 = 1.0_dp/t46
890 : t50 = 2.0_dp*q*t19*t20 + t1*t42*t20 - t1*t45*t47
891 : t54 = p*t4
892 : t55 = t12**2
893 : t71 = t36**2
894 : fs(ip, 4) = &
895 : -6.0_dp*p*t133*t23 + 12.0_dp*t26*t28*t29 - &
896 : 6.0_dp*t26*t133*t50 - 6.0_dp*t54/t55*t29*t23 + &
897 : 6.0_dp*t54*t28*t23*t50 - t54*t133* &
898 : (3.0_dp*q*t42*t20 - 3.0_dp*q*t45*t47 + 3.0_dp*t1* &
899 : (1.0_dp/t71/t7*t39*t3*t4*x - t40*x)*t20 - &
900 : 3.0_dp*t1*t42*t47*t19 + 2.0_dp*t1*t45*t19/t46/t8)
901 :
902 : CASE DEFAULT
903 : CPABORT("Illegal order.")
904 : END SELECT
905 : END DO
906 :
907 : !$OMP END PARALLEL DO
908 :
909 736 : END SUBROUTINE efactor_llp
910 : ! **************************************************************************************************
911 : !> \brief ...
912 : !> \param s ...
913 : !> \param fs ...
914 : !> \param m ...
915 : !> \param f2_lsd ...
916 : ! **************************************************************************************************
917 54 : SUBROUTINE efactor_pw86(s, fs, m, f2_lsd)
918 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: s
919 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: fs
920 : INTEGER, INTENT(IN) :: m
921 : REAL(dp), OPTIONAL :: f2_lsd
922 :
923 : INTEGER :: ip
924 : REAL(KIND=dp) :: f15, ff, p0, p1, p15, p2, p3, s1, s2, &
925 : s4, s6, t1, t2, t3
926 :
927 54 : t1 = 1.296_dp
928 54 : t2 = 14.0_dp
929 54 : t3 = 0.2_dp
930 54 : f15 = 1.0_dp/15.0_dp
931 54 : ff = 1.0_dp
932 54 : IF (PRESENT(f2_lsd)) ff = f2_lsd
933 :
934 : !$OMP PARALLEL DO DEFAULT(NONE) &
935 : !$OMP SHARED(s, fs, m, t1, t2, t3, f15, ff) &
936 54 : !$OMP PRIVATE(ip, s1, s2, s4, s6, p0, p1, p2, p3, p15)
937 :
938 : DO ip = 1, SIZE(s)
939 : s1 = s(ip)*ff
940 : s2 = s1*s1
941 : s4 = s2*s2
942 : s6 = s2*s4
943 : SELECT CASE (m)
944 : CASE (0)
945 : p0 = 1.0_dp + t1*s2 + t2*s4 + t3*s6
946 : fs(ip, 1) = p0**f15
947 : CASE (1)
948 : p0 = 1.0_dp + t1*s2 + t2*s4 + t3*s6
949 : p1 = s1*ff*(2.0_dp*t1 + 4.0_dp*t2*s2 + 6.0_dp*t3*s4)
950 : p15 = p0**f15
951 : fs(ip, 1) = p15
952 : fs(ip, 2) = f15*p1*p15/p0
953 : CASE (2)
954 : p0 = 1.0_dp + t1*s2 + t2*s4 + t3*s6
955 : p1 = s1*ff*(2.0_dp*t1 + 4.0_dp*t2*s2 + 6.0_dp*t3*s4)
956 : p2 = ff*ff*(2.0_dp*t1 + 12.0_dp*t2*s2 + 30.0_dp*t3*s4)
957 : p15 = p0**f15
958 : fs(ip, 1) = p15
959 : fs(ip, 2) = f15*p1*p15/p0
960 : fs(ip, 3) = f15*p15/p0*(p2 - 14.0_dp/15.0_dp*p1*p1/p0)
961 : CASE (3)
962 : p0 = 1.0_dp + t1*s2 + t2*s4 + t3*s6
963 : p1 = s1*ff*(2.0_dp*t1 + 4.0_dp*t2*s2 + 6.0_dp*t3*s4)
964 : p2 = ff*ff*(2.0_dp*t1 + 12.0_dp*t2*s2 + 30.0_dp*t3*s4)
965 : p3 = s1*ff*ff*ff*(24.0_dp*t2 + 120.0_dp*t3*s2)
966 : p15 = p0**f15
967 : fs(ip, 1) = p15
968 : fs(ip, 2) = f15*p1*p15/p0
969 : fs(ip, 3) = f15*p15/p0*(p2 - 14.0_dp/15.0_dp*p1*p1/p0)
970 : fs(ip, 4) = f15*p15/p0*(-14.0_dp*f15*p1*p1/p0 + 14.0_dp*14.0_dp*f15*p1*p1*p1/p0/p0 + &
971 : p3 - 14.0_dp*p2*p1/p0 + 14.0_dp*p1*p1/p0/p0)
972 : CASE DEFAULT
973 : CPABORT("Illegal order.")
974 : END SELECT
975 : END DO
976 :
977 : !$OMP END PARALLEL DO
978 :
979 54 : END SUBROUTINE efactor_pw86
980 : ! **************************************************************************************************
981 : !> \brief ...
982 : !> \param s ...
983 : !> \param fs ...
984 : !> \param m ...
985 : ! **************************************************************************************************
986 174 : SUBROUTINE efactor_t92(s, fs, m)
987 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: s
988 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: fs
989 : INTEGER, INTENT(IN) :: m
990 :
991 : INTEGER :: ip
992 : REAL(KIND=dp) :: a1, a2, as, asp, asp2, asp3, bs, p, q, &
993 : s1, s2, sas, sbs, sbs3, sbs5, t0, w1, &
994 : x, ys
995 :
996 174 : p = 0.0055_dp*b*b
997 174 : q = 0.0253_dp*b
998 174 : a1 = 0.072_dp*b
999 174 : a2 = 2.0_dp**f53*b
1000 :
1001 : !$OMP PARALLEL DO DEFAULT(NONE) &
1002 : !$OMP SHARED(s, fs, m, p, q, a1, a2, b) &
1003 : !$OMP PRIVATE(ip, x, bs, sbs, sas, ys, asp, sbs3, asp2, sbs5) &
1004 174 : !$OMP PRIVATE(asp3, as, s2, s1, t0, w1)
1005 :
1006 : DO ip = 1, SIZE(s)
1007 : x = s(ip)
1008 : bs = b*x
1009 : sbs = SQRT(bs*bs + 1.0_dp)
1010 : as = LOG(bs + sbs)
1011 : sas = x*as
1012 : ys = 1.0_dp/(1.0_dp + q*sas)
1013 : SELECT CASE (m)
1014 : CASE (0)
1015 : fs(ip, 1) = 1.0_dp + p*x*x*ys - a1*x/(1 + a2*x)
1016 : CASE (1)
1017 : asp = as + bs/sbs
1018 : fs(ip, 1) = 1.0_dp + p*x*x*ys - a1*x/(1 + a2*x)
1019 : fs(ip, 2) = 2.0_dp*p*x*ys - p*q*x*x*asp*ys*ys - a1/(1 + a2*x)**2
1020 : CASE (2)
1021 : asp = as + bs/sbs
1022 : sbs3 = sbs*sbs*sbs
1023 : asp2 = 2.0_dp*b/sbs - b*bs*bs/sbs3
1024 : fs(ip, 1) = 1.0_dp + p*x*x*ys - a1*x/(1 + a2*x)
1025 : fs(ip, 2) = 2.0_dp*p*x*ys - p*q*x*x*asp*ys*ys - a1/(1 + a2*x)**2
1026 : fs(ip, 3) = 2.0_dp*p*ys - p*q*x*(4.0_dp*asp + x*asp2)*ys*ys + &
1027 : 2.0_dp*p*q*q*x*x*asp*asp*ys*ys*ys + 2.0_dp*a1*a2/(1 + a2*x)**3
1028 : CASE (3)
1029 : asp = as + bs/sbs
1030 : sbs3 = sbs*sbs*sbs
1031 : sbs5 = sbs3*sbs*sbs
1032 : asp2 = 2.0_dp*b/sbs - b*bs*bs/sbs3
1033 : asp3 = -4.0_dp*b*b*bs/sbs3 + 3.0_dp*b*b*bs*bs*bs/sbs5
1034 : w1 = (4.0_dp*asp + x*asp2)
1035 : fs(ip, 1) = 1.0_dp + p*x*x*ys - a1*x/(1 + a2*x)
1036 : fs(ip, 2) = 2.0_dp*p*x*ys - p*q*x*x*asp*ys*ys - a1/(1 + a2*x)**2
1037 : fs(ip, 3) = 2.0_dp*p*ys - p*q*x*w1*ys*ys + &
1038 : 2.0_dp*p*q*q*x*x*asp*asp*ys*ys*ys + 2.0_dp*a1*a2/(1 + a2*x)**3
1039 :
1040 : s2 = -6*p/(1 + q*x*LOG(b*x + SQRT(1 + b**2*x**2)))**2*(q*LOG(b*x + SQRT(1 + b**2*x**2)) + &
1041 : q*x*(b + 1/SQRT(1 + b**2*x**2)*b**2*x)/(b*x + SQRT(1 + b**2*x**2))) + 12*p*x/ &
1042 : (1 + q*x*LOG(b*x + SQRT(1 + b**2*x**2)))**3*(q*LOG(b*x + SQRT(1 + b**2*x**2)) + &
1043 : q*x*(b + 1/SQRT(1 + b**2*x**2)*b**2*x)/(b*x + SQRT(1 + b**2*x**2)))**2
1044 : s1 = s2 - 6*p*x/(1 + q*x*LOG(b*x + SQRT(1 + b**2*x**2)))**2*(2*q*(b + 1/SQRT(1 + b**2*x**2)*b**2*x)/ &
1045 : (b*x + SQRT(1 + b**2*x**2)) + q*x*(-1/SQRT(1 + b**2*x**2)**3*b**4*x**2 + 1/SQRT(1 + b**2*x**2)*b**2)/ &
1046 : (b*x + SQRT(1 + b**2*x**2)) - q*x*(b + 1/SQRT(1 + b**2*x**2)*b**2*x)**2/ &
1047 : (b*x + SQRT(1 + b**2*x**2))**2) - 6*p*x**2/(1 + q*x*LOG(b*x + SQRT(1 + b**2*x**2)))**4 &
1048 : *(q*LOG(b*x + SQRT(1 + b**2*x**2)) + q*x*(b + 1/SQRT(1 + b**2*x**2)*b**2*x)/(b*x + SQRT(1 + b**2*x**2)))**3
1049 : s2 = s1 + 6*p*x**2/(1 + q*x*LOG(b*x + SQRT(1 + b**2*x**2)))**3*(q*LOG(b*x + SQRT(1 + b**2*x**2)) + &
1050 : q*x*(b + 1/SQRT(1 + b**2*x**2)*b**2*x)/(b*x + SQRT(1 + b**2*x**2)))*(2*q*(b + 1/SQRT(1 + b**2*x**2)*b**2*x) &
1051 : /(b*x + SQRT(1 + b**2*x**2)) + q*x*(-1/SQRT(1 + b**2*x**2)**3*b**4*x**2 + 1/SQRT(1 + b**2*x**2)* &
1052 : b**2)/(b*x + SQRT(1 + b**2*x**2)) - q*x*(b + 1/SQRT(1 + b**2*x**2)*b**2*x)**2/(b*x + SQRT(1 + b**2*x**2))**2)
1053 : t0 = s2 - p*x**2/(1 + q*x*LOG(b*x + SQRT(1 + b**2*x**2)))**2*(3*q*(-1/SQRT(1 + b**2*x**2)**3*b**4*x**2 + &
1054 : 1/SQRT(1 + b**2*x**2)*b**2)/(b*x + SQRT(1 + b**2*x**2)) - 3*q*(b + 1/SQRT(1 + b**2*x**2)*b**2*x)**2/ &
1055 : (b*x + SQRT(1 + b**2*x**2))**2 + q*x*(3/SQRT(1 + b**2*x**2)**5*b**6*x**3 - 3/SQRT(1 + b**2*x**2)**3*b**4*x)/ &
1056 : (b*x + SQRT(1 + b**2*x**2)) - 3*q*x*(-1/SQRT(1 + b**2*x**2)**3*b**4*x**2 + 1/SQRT(1 + b**2*x**2)*b**2)/ &
1057 : (b*x + SQRT(1 + b**2*x**2))**2*(b + 1/SQRT(1 + b**2*x**2)*b**2*x) + 2*q*x*(b + 1/SQRT(1 + b**2*x**2)* &
1058 : b**2*x)**3/(b*x + SQRT(1 + b**2*x**2))**3) - 6*a1/(1 + a2*x)**3*a2**2 + 6*a1*x/(1 + a2*x)**4*a2**3
1059 :
1060 : fs(ip, 4) = t0
1061 :
1062 : CASE DEFAULT
1063 : CPABORT("Illegal order")
1064 : END SELECT
1065 : END DO
1066 :
1067 : !$OMP END PARALLEL DO
1068 :
1069 174 : END SUBROUTINE efactor_t92
1070 : ! **************************************************************************************************
1071 : !> \brief ...
1072 : !> \param s ...
1073 : !> \param fs ...
1074 : !> \param m ...
1075 : !> \param pset ...
1076 : !> \param f2_lsd ...
1077 : ! **************************************************************************************************
1078 576 : SUBROUTINE efactor_pbex(s, fs, m, pset, f2_lsd)
1079 :
1080 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: s
1081 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: fs
1082 : INTEGER, INTENT(IN) :: m, pset
1083 : REAL(dp), OPTIONAL :: f2_lsd
1084 :
1085 : REAL(KIND=dp), PARAMETER :: kappa1 = 0.804_dp, kappa2 = 1.245_dp, &
1086 : mu = 0.2195149727645171_dp
1087 :
1088 : INTEGER :: ip
1089 : REAL(KIND=dp) :: f0, mk, x, x2, y
1090 :
1091 : IF (pset == 1) mk = mu/kappa1
1092 576 : IF (pset == 2) mk = mu/kappa2
1093 :
1094 576 : f0 = 1.0_dp/tact
1095 576 : IF (PRESENT(f2_lsd)) f0 = f2_lsd
1096 :
1097 : !$OMP PARALLEL DO DEFAULT(NONE) &
1098 : !$OMP SHARED(s, m, fs, f0, mk) &
1099 576 : !$OMP PRIVATE(ip,x,x2,y)
1100 :
1101 : DO ip = 1, SIZE(s)
1102 : x = s(ip)*f0
1103 : x2 = x*x
1104 : y = 1.0_dp/(1.0_dp + mk*x2)
1105 : SELECT CASE (m)
1106 : CASE (0)
1107 : fs(ip, 1) = 1.0_dp + mu*x2*y
1108 : CASE (1)
1109 : fs(ip, 1) = 1.0_dp + mu*x2*y
1110 : fs(ip, 2) = 2.0_dp*mu*x*y*y*f0
1111 : CASE (2)
1112 : fs(ip, 1) = 1.0_dp + mu*x2*y
1113 : fs(ip, 2) = 2.0_dp*mu*x*y*y*f0
1114 : fs(ip, 3) = -2.0_dp*mu*(3.0_dp*mk*x2 - 1.0_dp)*y*y*y*f0*f0
1115 : CASE (3)
1116 : fs(ip, 1) = 1.0_dp + mu*x2*y
1117 : fs(ip, 2) = 2.0_dp*mu*x*y*y*f0
1118 : fs(ip, 3) = -2.0_dp*mu*(3.0_dp*mk*x2 - 1.0_dp)*y*y*y*f0*f0
1119 : fs(ip, 4) = 24.0_dp*mu*mk*x*(mk*x2 - 1.0_dp)*y*y*y*y*f0*f0*f0
1120 : CASE DEFAULT
1121 : CPABORT("Illegal order.")
1122 : END SELECT
1123 : END DO
1124 :
1125 : !$OMP END PARALLEL DO
1126 :
1127 576 : END SUBROUTINE efactor_pbex
1128 :
1129 : ! **************************************************************************************************
1130 : !> \brief ...
1131 : !> \param s ...
1132 : !> \param fs ...
1133 : !> \param m ...
1134 : !> \param pset ...
1135 : !> \param f2_lsd ...
1136 : ! **************************************************************************************************
1137 108 : SUBROUTINE efactor_pw91(s, fs, m, pset, f2_lsd)
1138 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: s
1139 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: fs
1140 : INTEGER, INTENT(IN) :: m, pset
1141 : REAL(dp), OPTIONAL :: f2_lsd
1142 :
1143 : INTEGER :: ip
1144 : REAL(dp) :: ff, t1, t10, t101, t106, t109, t111, t113, t119, t12, t123, t124, t13, t14, t15, &
1145 : t16, t17, t18, t19, t2, t20, t21, t22, t23, t25, t26, t27, t28, t29, t3, t30, t31, t33, &
1146 : t35, t37, t38, t39, t4, t40, t44, t47, t48, t5, t50, t51, t53, t55, t56, t57, t58, t59, &
1147 : t6, t60, t64, t65, t69, t7, t70, t71, t73, t77, t78, t8, t80, t82, t9, t90, t93, t94, &
1148 : t96, t98
1149 : REAL(KIND=dp) :: a1, a2, a3, a4, a5, bb, o, pa(6, 2), x
1150 :
1151 : ! parameter set 1: Perdew-Wang
1152 : ! parameter set 2: Lembarki-Chermette
1153 :
1154 : pa(1:6, 1) = (/0.19645_dp, 0.2743_dp, &
1155 : 0.1508_dp, 100.0_dp, &
1156 756 : 7.7956_dp, 0.004_dp/)
1157 : pa(1:6, 2) = (/0.093907_dp, 0.26608_dp, &
1158 : 0.0809615_dp, 100.0_dp, &
1159 756 : 76.320_dp, 0.57767e-4_dp/)
1160 108 : o = 1.0_dp
1161 108 : ff = 1.0_dp
1162 108 : IF (PRESENT(f2_lsd)) ff = f2_lsd
1163 108 : a1 = pa(1, pset)*FF
1164 108 : a2 = pa(2, pset)*ff*ff
1165 108 : a3 = pa(3, pset)*ff*ff
1166 108 : a4 = pa(4, pset)*ff*ff
1167 108 : bb = pa(5, pset)*ff
1168 : ! it should be valid also for lsd
1169 108 : a5 = pa(6, pset)*ff*ff*ff*ff
1170 :
1171 : !$OMP PARALLEL DEFAULT(NONE) &
1172 : !$OMP SHARED(s, fs, m, a1, a2, a3, a4, a5, bb, pa, o, ff) &
1173 : !$OMP PRIVATE(x,t1,t10,t101,t106,t109,t111,t113,t119,t12,t123) &
1174 : !$OMP PRIVATE(t124,t13,t14,t15,t16,t17,t18,t19,t2,t20,t21,t22) &
1175 : !$OMP PRIVATE(t23,t25,t26,t27,t28,t29,t3,t30,t31,t33,t35,t37) &
1176 : !$OMP PRIVATE(t38,t39,t4,t40,t44,t47,t48,t5,t50,t51,t53,t55) &
1177 : !$OMP PRIVATE(t56,t57,t58,t59,t6,t60,t64,t65,t69,t7,t70,t71) &
1178 108 : !$OMP PRIVATE(t73,t77,t78,t8,t80,t82,t9,t90,t93,t94,t96,t98,ip)
1179 :
1180 : IF (m >= 0) THEN
1181 : !$OMP DO
1182 : DO ip = 1, SIZE(s)
1183 : x = s(ip)
1184 : t3 = bb**2
1185 : t4 = x**2
1186 : t7 = SQRT(o + t3*t4)
1187 : t9 = LOG(bb*x + t7)
1188 : t10 = a1*x*t9
1189 : t12 = EXP(-a4*t4)
1190 : t17 = t4**2
1191 : fs(ip, 1) = (o + t10 + (a2 - a3*t12)*t4)/(o + t10 + a5*t17)
1192 : END DO
1193 : !$OMP END DO
1194 : END IF
1195 : IF (m >= 1) THEN
1196 : !$OMP DO
1197 : DO ip = 1, SIZE(s)
1198 : x = s(ip)
1199 : t2 = bb**2
1200 : t3 = x**2
1201 : t6 = SQRT(o + t2*t3)
1202 : t7 = bb*x + t6
1203 : t8 = LOG(t7)
1204 : t9 = a1*t8
1205 : t10 = a1*x
1206 : t17 = t10*(bb + 1/t6*t2*x)/t7
1207 : t19 = t3*x
1208 : t21 = EXP(-a4*t3)
1209 : t26 = a2 - a3*t21
1210 : t30 = t10*t8
1211 : t31 = t3**2
1212 : t33 = o + t30 + a5*t31
1213 : t38 = t33**2
1214 : fs(ip, 2) = &
1215 : (t9 + t17 + 2._dp*a3*a4*t19*t21 + 2._dp*t26*x)/ &
1216 : t33 - (o + t30 + t26*t3)/t38*(t9 + t17 + 4._dp*a5*t19)
1217 : END DO
1218 : !$OMP END DO
1219 : END IF
1220 : IF (m >= 2) THEN
1221 : !$OMP DO
1222 : DO ip = 1, SIZE(s)
1223 : x = s(ip)
1224 : t1 = bb**2
1225 : t2 = x**2
1226 : t5 = SQRT(o + t1*t2)
1227 : t7 = o/t5*t1
1228 : t9 = bb + t7*x
1229 : t12 = bb*x + t5
1230 : t13 = o/t12
1231 : t15 = 2._dp*a1*t9*t13
1232 : t16 = a1*x
1233 : t17 = t5**2
1234 : t20 = t1**2
1235 : t25 = t16*(-o/t17/t5*t20*t2 + t7)*t13
1236 : t26 = t9**2
1237 : t27 = t12**2
1238 : t30 = t16*t26/t27
1239 : t31 = a3*a4
1240 : t33 = EXP(-a4*t2)
1241 : t37 = a4**2
1242 : t39 = t2**2
1243 : t44 = a3*t33
1244 : t47 = LOG(t12)
1245 : t48 = t16*t47
1246 : t50 = o + t48 + a5*t39
1247 : t53 = a1*t47
1248 : t55 = t16*t9*t13
1249 : t56 = t2*x
1250 : t60 = a2 - t44
1251 : t64 = t50**2
1252 : t65 = o/t64
1253 : t69 = t53 + t55 + 4._dp*a5*t56
1254 : t73 = o + t48 + t60*t2
1255 : t77 = t69**2
1256 : fs(ip, 3) = &
1257 : (t15 + t25 - t30 + 10._dp*t31*t2*t33 - 4._dp*a3*t37*t39*t33 + &
1258 : 2._dp*a2 - 2._dp*t44)/t50 - 2._dp* &
1259 : (t53 + t55 + 2._dp*t31*t56*t33 + 2._dp*t60*x)* &
1260 : t65*t69 + 2._dp*t73/t64/t50*t77 - t73*t65*(t15 + t25 - t30 + 12._dp*a5*t2)
1261 : END DO
1262 : !$OMP END DO
1263 : END IF
1264 : IF (m >= 3) THEN
1265 : !$OMP DO
1266 : DO ip = 1, SIZE(s)
1267 : x = s(ip)
1268 : t1 = bb**2
1269 : t2 = x**2
1270 : t5 = SQRT(0.1e1_dp + t1*t2)
1271 : t6 = t5**2
1272 : t9 = t1**2
1273 : t10 = 1/t6/t5*t9
1274 : t13 = 1/t5*t1
1275 : t14 = -t10*t2 + t13
1276 : t17 = bb*x + t5
1277 : t18 = 1/t17
1278 : t20 = 3*a1*t14*t18
1279 : t22 = bb + t13*x
1280 : t23 = t22**2
1281 : t25 = t17**2
1282 : t26 = 1/t25
1283 : t28 = 3*a1*t23*t26
1284 : t29 = a1*x
1285 : t30 = t6**2
1286 : t35 = t2*x
1287 : t40 = 3*t29*(1/t30/t5*t1*t9*t35 - t10*x)*t18
1288 : t44 = 3*t29*t14*t26*t22
1289 : t50 = 2*t29*t23*t22/t25/t17
1290 : t51 = a3*a4
1291 : t53 = EXP(-a4*t2)
1292 : t57 = a4**2
1293 : t58 = a3*t57
1294 : t59 = t35*t53
1295 : t64 = t2**2
1296 : t70 = LOG(t17)
1297 : t71 = t29*t70
1298 : t73 = 0.1e1_dp + t71 + a5*t64
1299 : t78 = 2*a1*t22*t18
1300 : t80 = t29*t14*t18
1301 : t82 = t29*t23*t26
1302 : t90 = a3*t53
1303 : t93 = t73**2
1304 : t94 = 1/t93
1305 : t96 = a1*t70
1306 : t98 = t29*t18*t22
1307 : t101 = t96 + t98 + 4*a5*t35
1308 : t106 = a2 - t90
1309 : t109 = t96 + t98 + 2*t51*t59 + 2*t106*x
1310 : t111 = 1/t93/t73
1311 : t113 = t101**2
1312 : t119 = t78 + t80 - t82 + 12*a5*t2
1313 : t123 = 0.1e1_dp + t71 + t106*t2
1314 : t124 = t93**2
1315 : fs(ip, 4) = &
1316 : (t20 - t28 + t40 - t44 + t50 + 24*t51*x*t53 - 36._dp*t58*t59 + 8._dp*a3*t57*a4*t64* &
1317 : x*t53)/t73 - 3._dp*(t78 + t80 - t82 + 10._dp*t51*t2*t53 - &
1318 : 4._dp*t58*t64*t53 + 2._dp*a2 - 2._dp*t90)*t94*t101 + &
1319 : 6._dp*t109*t111*t113 - 3._dp*t109*t94*t119 - 6*t123/t124*t113*t101 + &
1320 : 6._dp*t123*t111*t101*t119 - t123*t94*(t20 - t28 + t40 - t44 + t50 + 24._dp*a5*x)
1321 : END DO
1322 : !$OMP END DO
1323 : END IF
1324 :
1325 : !$OMP END PARALLEL
1326 :
1327 108 : END SUBROUTINE efactor_pw91
1328 :
1329 : END MODULE xc_ke_gga
1330 :
|