(git:374b731)
Loading...
Searching...
No Matches
xc_tfw.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 Calculate the Thomas-Fermi kinetic energy functional
10!> plus the von Weizsaecker term
11!> \par History
12!> JGH (26.02.2003) : OpenMP enabled
13!> fawzi (04.2004) : adapted to the new xc interface
14!> \author JGH (18.02.2002)
15! **************************************************************************************************
16MODULE xc_tfw
18 USE kinds, ONLY: dp
22 deriv_rho,&
33#include "../base/base_uses.f90"
34
35 IMPLICIT NONE
36
37 PRIVATE
38
39! *** Global parameters ***
40
41 REAL(KIND=dp), PARAMETER :: pi = 3.14159265358979323846264338_dp
42 REAL(KIND=dp), PARAMETER :: f13 = 1.0_dp/3.0_dp, &
43 f23 = 2.0_dp*f13, &
44 f43 = 4.0_dp*f13, &
45 f53 = 5.0_dp*f13
46
48
49 REAL(KIND=dp) :: cf, flda, flsd, fvw
50 REAL(KIND=dp) :: eps_rho
51 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xc_tfw'
52
53CONTAINS
54
55! **************************************************************************************************
56!> \brief ...
57!> \param cutoff ...
58! **************************************************************************************************
59 SUBROUTINE tfw_init(cutoff)
60
61 REAL(KIND=dp), INTENT(IN) :: cutoff
62
63 eps_rho = cutoff
64 CALL set_util(cutoff)
65
66 cf = 0.3_dp*(3.0_dp*pi*pi)**f23
67 flda = cf
68 flsd = flda*2.0_dp**f23
69 fvw = 1.0_dp/72.0_dp
70
71 END SUBROUTINE tfw_init
72
73! **************************************************************************************************
74!> \brief ...
75!> \param reference ...
76!> \param shortform ...
77!> \param needs ...
78!> \param max_deriv ...
79! **************************************************************************************************
80 SUBROUTINE tfw_lda_info(reference, shortform, needs, max_deriv)
81 CHARACTER(LEN=*), INTENT(OUT), OPTIONAL :: reference, shortform
82 TYPE(xc_rho_cflags_type), INTENT(inout), OPTIONAL :: needs
83 INTEGER, INTENT(out), OPTIONAL :: max_deriv
84
85 IF (PRESENT(reference)) THEN
86 reference = "Thomas-Fermi-Weizsaecker kinetic energy functional {LDA version}"
87 END IF
88 IF (PRESENT(shortform)) THEN
89 shortform = "TF+vW kinetic energy functional {LDA}"
90 END IF
91 IF (PRESENT(needs)) THEN
92 needs%rho = .true.
93 needs%rho_1_3 = .true.
94 needs%norm_drho = .true.
95 END IF
96 IF (PRESENT(max_deriv)) max_deriv = 3
97
98 END SUBROUTINE tfw_lda_info
99
100! **************************************************************************************************
101!> \brief ...
102!> \param reference ...
103!> \param shortform ...
104!> \param needs ...
105!> \param max_deriv ...
106! **************************************************************************************************
107 SUBROUTINE tfw_lsd_info(reference, shortform, needs, max_deriv)
108 CHARACTER(LEN=*), INTENT(OUT), OPTIONAL :: reference, shortform
109 TYPE(xc_rho_cflags_type), INTENT(inout), OPTIONAL :: needs
110 INTEGER, INTENT(out), OPTIONAL :: max_deriv
111
112 IF (PRESENT(reference)) THEN
113 reference = "Thomas-Fermi-Weizsaecker kinetic energy functional"
114 END IF
115 IF (PRESENT(shortform)) THEN
116 shortform = "TF+vW kinetic energy functional"
117 END IF
118 IF (PRESENT(needs)) THEN
119 needs%rho_spin = .true.
120 needs%rho_spin_1_3 = .true.
121 needs%norm_drho = .true.
122 END IF
123 IF (PRESENT(max_deriv)) max_deriv = 3
124
125 END SUBROUTINE tfw_lsd_info
126
127! **************************************************************************************************
128!> \brief ...
129!> \param rho_set ...
130!> \param deriv_set ...
131!> \param order ...
132! **************************************************************************************************
133 SUBROUTINE tfw_lda_eval(rho_set, deriv_set, order)
134 TYPE(xc_rho_set_type), INTENT(IN) :: rho_set
135 TYPE(xc_derivative_set_type), INTENT(IN) :: deriv_set
136 INTEGER, INTENT(in) :: order
137
138 CHARACTER(len=*), PARAMETER :: routinen = 'tfw_lda_eval'
139
140 INTEGER :: handle, npoints
141 INTEGER, DIMENSION(2, 3) :: bo
142 REAL(kind=dp) :: epsilon_rho
143 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: s
144 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), POINTER :: e_0, e_ndrho, e_ndrho_ndrho, &
145 e_rho, e_rho_ndrho, e_rho_ndrho_ndrho, e_rho_rho, e_rho_rho_ndrho, e_rho_rho_rho, grho, &
146 r13, rho
147 TYPE(xc_derivative_type), POINTER :: deriv
148
149 CALL timeset(routinen, handle)
150
151 CALL xc_rho_set_get(rho_set, rho_1_3=r13, rho=rho, &
152 norm_drho=grho, local_bounds=bo, rho_cutoff=epsilon_rho)
153 npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
154 CALL tfw_init(epsilon_rho)
155
156 ALLOCATE (s(npoints))
157 CALL calc_s(rho, grho, s, npoints)
158
159 IF (order >= 0) THEN
160 deriv => xc_dset_get_derivative(deriv_set, [INTEGER::], &
161 allocate_deriv=.true.)
162 CALL xc_derivative_get(deriv, deriv_data=e_0)
163
164 CALL tfw_u_0(rho, r13, s, e_0, npoints)
165 END IF
166 IF (order >= 1 .OR. order == -1) THEN
167 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho], &
168 allocate_deriv=.true.)
169 CALL xc_derivative_get(deriv, deriv_data=e_rho)
170 deriv => xc_dset_get_derivative(deriv_set, [deriv_norm_drho], &
171 allocate_deriv=.true.)
172 CALL xc_derivative_get(deriv, deriv_data=e_ndrho)
173
174 CALL tfw_u_1(rho, grho, r13, s, e_rho, e_ndrho, npoints)
175 END IF
176 IF (order >= 2 .OR. order == -2) THEN
177 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_rho], &
178 allocate_deriv=.true.)
179 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho)
180 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_norm_drho], &
181 allocate_deriv=.true.)
182 CALL xc_derivative_get(deriv, deriv_data=e_rho_ndrho)
183 deriv => xc_dset_get_derivative(deriv_set, &
184 [deriv_norm_drho, deriv_norm_drho], allocate_deriv=.true.)
185 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrho)
186
187 CALL tfw_u_2(rho, grho, r13, s, e_rho_rho, e_rho_ndrho, &
188 e_ndrho_ndrho, npoints)
189 END IF
190 IF (order >= 3 .OR. order == -3) THEN
191 deriv => xc_dset_get_derivative(deriv_set, [deriv_rho, deriv_rho, deriv_rho], &
192 allocate_deriv=.true.)
193 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho_rho)
194 deriv => xc_dset_get_derivative(deriv_set, &
195 [deriv_rho, deriv_rho, deriv_norm_drho], allocate_deriv=.true.)
196 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho_ndrho)
197 deriv => xc_dset_get_derivative(deriv_set, &
198 [deriv_rho, deriv_norm_drho, deriv_norm_drho], allocate_deriv=.true.)
199 CALL xc_derivative_get(deriv, deriv_data=e_rho_ndrho_ndrho)
200
201 CALL tfw_u_3(rho, grho, r13, s, e_rho_rho_rho, e_rho_rho_ndrho, &
202 e_rho_ndrho_ndrho, npoints)
203 END IF
204 IF (order > 3 .OR. order < -3) THEN
205 cpabort("derivatives bigger than 3 not implemented")
206 END IF
207
208 DEALLOCATE (s)
209 CALL timestop(handle)
210 END SUBROUTINE tfw_lda_eval
211
212! **************************************************************************************************
213!> \brief ...
214!> \param rho ...
215!> \param grho ...
216!> \param s ...
217!> \param npoints ...
218! **************************************************************************************************
219 SUBROUTINE calc_s(rho, grho, s, npoints)
220 REAL(kind=dp), DIMENSION(*), INTENT(in) :: rho, grho
221 REAL(kind=dp), DIMENSION(*), INTENT(out) :: s
222 INTEGER, INTENT(in) :: npoints
223
224 INTEGER :: ip
225
226!$OMP PARALLEL DO PRIVATE(ip) DEFAULT(NONE)&
227!$OMP SHARED(npoints,rho,eps_rho,s,grho)
228 DO ip = 1, npoints
229 IF (rho(ip) < eps_rho) THEN
230 s(ip) = 0.0_dp
231 ELSE
232 s(ip) = grho(ip)*grho(ip)/rho(ip)
233 END IF
234 END DO
235 END SUBROUTINE calc_s
236
237! **************************************************************************************************
238!> \brief ...
239!> \param rho_set ...
240!> \param deriv_set ...
241!> \param order ...
242! **************************************************************************************************
243 SUBROUTINE tfw_lsd_eval(rho_set, deriv_set, order)
244 TYPE(xc_rho_set_type), INTENT(IN) :: rho_set
245 TYPE(xc_derivative_set_type), INTENT(IN) :: deriv_set
246 INTEGER, INTENT(in) :: order
247
248 CHARACTER(len=*), PARAMETER :: routinen = 'tfw_lsd_eval'
249 INTEGER, DIMENSION(2), PARAMETER :: &
250 norm_drho_spin_name = [deriv_norm_drhoa, deriv_norm_drhob], &
251 rho_spin_name = [deriv_rhoa, deriv_rhob]
252
253 INTEGER :: handle, i, ispin, npoints
254 INTEGER, DIMENSION(2, 3) :: bo
255 REAL(kind=dp) :: epsilon_rho
256 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: s
257 REAL(kind=dp), CONTIGUOUS, DIMENSION(:, :, :), &
258 POINTER :: e_0, e_ndrho, e_ndrho_ndrho, e_rho, &
259 e_rho_ndrho, e_rho_ndrho_ndrho, &
260 e_rho_rho, e_rho_rho_ndrho, &
261 e_rho_rho_rho
262 TYPE(cp_3d_r_cp_type), DIMENSION(2) :: norm_drho, rho, rho_1_3
263 TYPE(xc_derivative_type), POINTER :: deriv
264
265 CALL timeset(routinen, handle)
266 NULLIFY (deriv)
267 DO i = 1, 2
268 NULLIFY (norm_drho(i)%array, rho(i)%array, rho_1_3(i)%array)
269 END DO
270
271 CALL xc_rho_set_get(rho_set, rhoa_1_3=rho_1_3(1)%array, &
272 rhob_1_3=rho_1_3(2)%array, rhoa=rho(1)%array, &
273 rhob=rho(2)%array, norm_drhoa=norm_drho(1)%array, &
274 norm_drhob=norm_drho(2)%array, rho_cutoff=epsilon_rho, &
275 local_bounds=bo)
276 npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
277 CALL tfw_init(epsilon_rho)
278
279 ALLOCATE (s(npoints))
280
281 DO ispin = 1, 2
282 CALL calc_s(rho(ispin)%array, norm_drho(ispin)%array, s, npoints)
283
284 IF (order >= 0) THEN
285 deriv => xc_dset_get_derivative(deriv_set, [INTEGER::], &
286 allocate_deriv=.true.)
287 CALL xc_derivative_get(deriv, deriv_data=e_0)
288
289 CALL tfw_p_0(rho(ispin)%array, &
290 rho_1_3(ispin)%array, s, e_0, npoints)
291 END IF
292 IF (order >= 1 .OR. order == -1) THEN
293 deriv => xc_dset_get_derivative(deriv_set, [rho_spin_name(ispin)], &
294 allocate_deriv=.true.)
295 CALL xc_derivative_get(deriv, deriv_data=e_rho)
296 deriv => xc_dset_get_derivative(deriv_set, [norm_drho_spin_name(ispin)], &
297 allocate_deriv=.true.)
298 CALL xc_derivative_get(deriv, deriv_data=e_ndrho)
299
300 CALL tfw_p_1(rho(ispin)%array, norm_drho(ispin)%array, &
301 rho_1_3(ispin)%array, s, e_rho, e_ndrho, npoints)
302 END IF
303 IF (order >= 2 .OR. order == -2) THEN
304 deriv => xc_dset_get_derivative(deriv_set, [rho_spin_name(ispin), &
305 rho_spin_name(ispin)], allocate_deriv=.true.)
306 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho)
307 deriv => xc_dset_get_derivative(deriv_set, [rho_spin_name(ispin), &
308 norm_drho_spin_name(ispin)], allocate_deriv=.true.)
309 CALL xc_derivative_get(deriv, deriv_data=e_rho_ndrho)
310 deriv => xc_dset_get_derivative(deriv_set, [norm_drho_spin_name(ispin), &
311 norm_drho_spin_name(ispin)], allocate_deriv=.true.)
312 CALL xc_derivative_get(deriv, deriv_data=e_ndrho_ndrho)
313
314 CALL tfw_p_2(rho(ispin)%array, norm_drho(ispin)%array, &
315 rho_1_3(ispin)%array, s, e_rho_rho, e_rho_ndrho, &
316 e_ndrho_ndrho, npoints)
317 END IF
318 IF (order >= 3 .OR. order == -3) THEN
319 deriv => xc_dset_get_derivative(deriv_set, [rho_spin_name(ispin), &
320 rho_spin_name(ispin), rho_spin_name(ispin)], &
321 allocate_deriv=.true.)
322 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho_rho)
323 deriv => xc_dset_get_derivative(deriv_set, [rho_spin_name(ispin), &
324 rho_spin_name(ispin), norm_drho_spin_name(ispin)], &
325 allocate_deriv=.true.)
326 CALL xc_derivative_get(deriv, deriv_data=e_rho_rho_ndrho)
327 deriv => xc_dset_get_derivative(deriv_set, [rho_spin_name(ispin), &
328 norm_drho_spin_name(ispin), norm_drho_spin_name(ispin)], &
329 allocate_deriv=.true.)
330 CALL xc_derivative_get(deriv, deriv_data=e_rho_ndrho_ndrho)
331
332 CALL tfw_p_3(rho(ispin)%array, norm_drho(ispin)%array, &
333 rho_1_3(ispin)%array, s, e_rho_rho_rho, e_rho_rho_ndrho, &
334 e_rho_ndrho_ndrho, npoints)
335 END IF
336 IF (order > 3 .OR. order < -3) THEN
337 cpabort("derivatives bigger than 3 not implemented")
338 END IF
339 END DO
340
341 DEALLOCATE (s)
342 CALL timestop(handle)
343 END SUBROUTINE tfw_lsd_eval
344
345! **************************************************************************************************
346!> \brief ...
347!> \param rho ...
348!> \param r13 ...
349!> \param s ...
350!> \param e_0 ...
351!> \param npoints ...
352! **************************************************************************************************
353 SUBROUTINE tfw_u_0(rho, r13, s, e_0, npoints)
354
355 REAL(kind=dp), DIMENSION(*), INTENT(IN) :: rho, r13, s
356 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_0
357 INTEGER, INTENT(in) :: npoints
358
359 INTEGER :: ip
360
361!$OMP PARALLEL DO PRIVATE(ip) DEFAULT(NONE)&
362!$OMP SHARED(npoints,rho,eps_rho,e_0,flda,r13,s,fvw)
363 DO ip = 1, npoints
364
365 IF (rho(ip) > eps_rho) THEN
366
367 e_0(ip) = e_0(ip) + flda*r13(ip)*r13(ip)*rho(ip) + fvw*s(ip)
368
369 END IF
370
371 END DO
372
373 END SUBROUTINE tfw_u_0
374
375! **************************************************************************************************
376!> \brief ...
377!> \param rho ...
378!> \param grho ...
379!> \param r13 ...
380!> \param s ...
381!> \param e_rho ...
382!> \param e_ndrho ...
383!> \param npoints ...
384! **************************************************************************************************
385 SUBROUTINE tfw_u_1(rho, grho, r13, s, e_rho, e_ndrho, npoints)
386
387 REAL(kind=dp), DIMENSION(*), INTENT(IN) :: rho, grho, r13, s
388 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rho, e_ndrho
389 INTEGER, INTENT(in) :: npoints
390
391 INTEGER :: ip
392 REAL(kind=dp) :: f
393
394 f = f53*flda
395
396!$OMP PARALLEL DO PRIVATE(ip) DEFAULT(NONE)&
397!$OMP SHARED(npoints,rho,eps_rho,e_rho,e_ndrho,grho,s,r13,f,fvw)
398 DO ip = 1, npoints
399
400 IF (rho(ip) > eps_rho) THEN
401
402 e_rho(ip) = e_rho(ip) + f*r13(ip)*r13(ip) - fvw*s(ip)/rho(ip)
403 e_ndrho(ip) = e_ndrho(ip) + 2.0_dp*fvw*grho(ip)/rho(ip)
404
405 END IF
406
407 END DO
408
409 END SUBROUTINE tfw_u_1
410
411! **************************************************************************************************
412!> \brief ...
413!> \param rho ...
414!> \param grho ...
415!> \param r13 ...
416!> \param s ...
417!> \param e_rho_rho ...
418!> \param e_rho_ndrho ...
419!> \param e_ndrho_ndrho ...
420!> \param npoints ...
421! **************************************************************************************************
422 SUBROUTINE tfw_u_2(rho, grho, r13, s, e_rho_rho, e_rho_ndrho, e_ndrho_ndrho, &
423 npoints)
424
425 REAL(kind=dp), DIMENSION(*), INTENT(IN) :: rho, grho, r13, s
426 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rho_rho, e_rho_ndrho, e_ndrho_ndrho
427 INTEGER, INTENT(in) :: npoints
428
429 INTEGER :: ip
430 REAL(kind=dp) :: f
431
432 f = f23*f53*flda
433
434!$OMP PARALLEL DO PRIVATE(ip) DEFAULT(NONE)&
435!$OMP SHARED(npoints,rho,eps_rho,e_rho_rho,e_rho_ndrho,e_ndrho_ndrho,grho,f,fvw)
436 DO ip = 1, npoints
437
438 IF (rho(ip) > eps_rho) THEN
439
440 e_rho_rho(ip) = e_rho_rho(ip) + f/r13(ip) + 2.0_dp*fvw*s(ip)/(rho(ip)*rho(ip))
441 e_rho_ndrho(ip) = e_rho_ndrho(ip) - 2.0_dp*fvw*grho(ip)/(rho(ip)*rho(ip))
442 e_ndrho_ndrho(ip) = e_ndrho_ndrho(ip) + 2.0_dp*fvw/rho(ip)
443
444 END IF
445
446 END DO
447
448 END SUBROUTINE tfw_u_2
449
450! **************************************************************************************************
451!> \brief ...
452!> \param rho ...
453!> \param grho ...
454!> \param r13 ...
455!> \param s ...
456!> \param e_rho_rho_rho ...
457!> \param e_rho_rho_ndrho ...
458!> \param e_rho_ndrho_ndrho ...
459!> \param npoints ...
460! **************************************************************************************************
461 SUBROUTINE tfw_u_3(rho, grho, r13, s, e_rho_rho_rho, e_rho_rho_ndrho, &
462 e_rho_ndrho_ndrho, npoints)
463
464 REAL(kind=dp), DIMENSION(*), INTENT(IN) :: rho, grho, r13, s
465 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rho_rho_rho, e_rho_rho_ndrho, &
466 e_rho_ndrho_ndrho
467 INTEGER, INTENT(in) :: npoints
468
469 INTEGER :: ip
470 REAL(kind=dp) :: f
471
472 f = -f13*f23*f53*flda
473
474!$OMP PARALLEL DO PRIVATE(ip) DEFAULT(NONE)&
475!$OMP SHARED(npoints,rho,eps_rho,e_rho_rho_rho,r13,s,e_rho_rho_ndrho,e_rho_ndrho_ndrho,f,fvw)
476 DO ip = 1, npoints
477
478 IF (rho(ip) > eps_rho) THEN
479
480 e_rho_rho_rho(ip) = e_rho_rho_rho(ip) + f/(r13(ip)*rho(ip)) &
481 - 6.0_dp*fvw*s(ip)/(rho(ip)*rho(ip)*rho(ip))
482 e_rho_rho_ndrho(ip) = e_rho_rho_ndrho(ip) &
483 + 4.0_dp*fvw*grho(ip)/(rho(ip)*rho(ip)*rho(ip))
484 e_rho_ndrho_ndrho(ip) = e_rho_ndrho_ndrho(ip) &
485 - 2.0_dp*fvw/(rho(ip)*rho(ip))
486 END IF
487
488 END DO
489
490 END SUBROUTINE tfw_u_3
491
492! **************************************************************************************************
493!> \brief ...
494!> \param rhoa ...
495!> \param r13a ...
496!> \param sa ...
497!> \param e_0 ...
498!> \param npoints ...
499! **************************************************************************************************
500 SUBROUTINE tfw_p_0(rhoa, r13a, sa, e_0, npoints)
501
502 REAL(kind=dp), DIMENSION(*), INTENT(IN) :: rhoa, r13a, sa
503 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_0
504 INTEGER, INTENT(in) :: npoints
505
506 INTEGER :: ip
507
508!$OMP PARALLEL DO PRIVATE(ip) DEFAULT(NONE)&
509!$OMP SHARED(npoints, rhoa,eps_rho,e_0,r13a,sa,flsd,fvw)
510 DO ip = 1, npoints
511
512 IF (rhoa(ip) > eps_rho) THEN
513 e_0(ip) = e_0(ip) + flsd*r13a(ip)*r13a(ip)*rhoa(ip) + fvw*sa(ip)
514 END IF
515
516 END DO
517
518 END SUBROUTINE tfw_p_0
519
520! **************************************************************************************************
521!> \brief ...
522!> \param rhoa ...
523!> \param grhoa ...
524!> \param r13a ...
525!> \param sa ...
526!> \param e_rho ...
527!> \param e_ndrho ...
528!> \param npoints ...
529! **************************************************************************************************
530 SUBROUTINE tfw_p_1(rhoa, grhoa, r13a, sa, e_rho, e_ndrho, npoints)
531
532 REAL(kind=dp), DIMENSION(*), INTENT(IN) :: rhoa, grhoa, r13a, sa
533 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rho, e_ndrho
534 INTEGER, INTENT(in) :: npoints
535
536 INTEGER :: ip
537 REAL(kind=dp) :: f
538
539 f = f53*flsd
540
541!$OMP PARALLEL DO PRIVATE(ip) DEFAULT(NONE)&
542!$OMP SHARED(npoints,rhoa,eps_rho,r13a,sa,fvw,grhoa,e_rho,e_ndrho,f)
543 DO ip = 1, npoints
544
545 IF (rhoa(ip) > eps_rho) THEN
546 e_rho(ip) = e_rho(ip) + f*r13a(ip)*r13a(ip) - fvw*sa(ip)/rhoa(ip)
547 e_ndrho(ip) = e_ndrho(ip) + 2.0_dp*fvw*grhoa(ip)/rhoa(ip)
548 END IF
549
550 END DO
551
552 END SUBROUTINE tfw_p_1
553
554! **************************************************************************************************
555!> \brief ...
556!> \param rhoa ...
557!> \param grhoa ...
558!> \param r13a ...
559!> \param sa ...
560!> \param e_rho_rho ...
561!> \param e_rho_ndrho ...
562!> \param e_ndrho_ndrho ...
563!> \param npoints ...
564! **************************************************************************************************
565 SUBROUTINE tfw_p_2(rhoa, grhoa, r13a, sa, e_rho_rho, e_rho_ndrho, &
566 e_ndrho_ndrho, npoints)
567
568 REAL(kind=dp), DIMENSION(*), INTENT(IN) :: rhoa, grhoa, r13a, sa
569 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rho_rho, e_rho_ndrho, e_ndrho_ndrho
570 INTEGER, INTENT(in) :: npoints
571
572 INTEGER :: ip
573 REAL(kind=dp) :: f
574
575 f = f23*f53*flsd
576
577!$OMP PARALLEL DO PRIVATE(ip) DEFAULT(NONE)&
578!$OMP SHARED(npoints,rhoa,eps_rho,e_rho_rho,f,fvw,r13a,sa,e_rho_ndrho,e_ndrho_ndrho)
579 DO ip = 1, npoints
580
581 IF (rhoa(ip) > eps_rho) THEN
582 e_rho_rho(ip) = e_rho_rho(ip) &
583 + f/r13a(ip) + 2.0_dp*fvw*sa(ip)/(rhoa(ip)*rhoa(ip))
584 e_rho_ndrho(ip) = e_rho_ndrho(ip) &
585 - 2.0_dp*fvw*grhoa(ip)/(rhoa(ip)*rhoa(ip))
586 e_ndrho_ndrho(ip) = e_ndrho_ndrho(ip) + 2.0_dp*fvw/rhoa(ip)
587 END IF
588
589 END DO
590
591 END SUBROUTINE tfw_p_2
592
593! **************************************************************************************************
594!> \brief ...
595!> \param rhoa ...
596!> \param grhoa ...
597!> \param r13a ...
598!> \param sa ...
599!> \param e_rho_rho_rho ...
600!> \param e_rho_rho_ndrho ...
601!> \param e_rho_ndrho_ndrho ...
602!> \param npoints ...
603! **************************************************************************************************
604 SUBROUTINE tfw_p_3(rhoa, grhoa, r13a, sa, e_rho_rho_rho, e_rho_rho_ndrho, &
605 e_rho_ndrho_ndrho, npoints)
606
607 REAL(kind=dp), DIMENSION(*), INTENT(IN) :: rhoa, grhoa, r13a, sa
608 REAL(kind=dp), DIMENSION(*), INTENT(INOUT) :: e_rho_rho_rho, e_rho_rho_ndrho, &
609 e_rho_ndrho_ndrho
610 INTEGER, INTENT(in) :: npoints
611
612 INTEGER :: ip
613 REAL(kind=dp) :: f
614
615 f = -f13*f23*f53*flsd
616
617!$OMP PARALLEL DO PRIVATE(ip) DEFAULT(NONE)&
618!$OMP SHARED(npoints,rhoa,eps_rho,e_rho_rho_rho,e_rho_rho_ndrho,e_rho_ndrho_ndrho,f,fvw,sa,grhoa)
619 DO ip = 1, npoints
620
621 IF (rhoa(ip) > eps_rho) THEN
622 e_rho_rho_rho(ip) = e_rho_rho_rho(ip) &
623 + f/(r13a(ip)*rhoa(ip)) &
624 - 6.0_dp*fvw*sa(ip)/(rhoa(ip)*rhoa(ip)*rhoa(ip))
625 e_rho_rho_ndrho(ip) = e_rho_rho_ndrho(ip) &
626 + 4.0_dp*fvw*grhoa(ip)/(rhoa(ip)*rhoa(ip)*rhoa(ip))
627 e_rho_ndrho_ndrho(ip) = e_rho_ndrho_ndrho(ip) &
628 - 2.0_dp*fvw/(rhoa(ip)*rhoa(ip))
629 END IF
630
631 END DO
632
633 END SUBROUTINE tfw_p_3
634
635END MODULE xc_tfw
636
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Module with functions to handle derivative descriptors. derivative description are strings have the f...
integer, parameter, public deriv_norm_drho
integer, parameter, public deriv_norm_drhoa
integer, parameter, public deriv_rhob
integer, parameter, public deriv_rhoa
integer, parameter, public deriv_rho
integer, parameter, public deriv_norm_drhob
represent a group ofunctional derivatives
type(xc_derivative_type) function, pointer, public xc_dset_get_derivative(derivative_set, description, allocate_deriv)
returns the requested xc_derivative
Provides types for the management of the xc-functionals and their derivatives.
subroutine, public xc_derivative_get(deriv, split_desc, order, deriv_data, accept_null_data)
returns various information on the given derivative
Utility routines for the functional calculations.
subroutine, public set_util(cutoff)
...
contains the structure
contains the structure
subroutine, public xc_rho_set_get(rho_set, can_return_null, rho, drho, norm_drho, rhoa, rhob, norm_drhoa, norm_drhob, rho_1_3, rhoa_1_3, rhob_1_3, laplace_rho, laplace_rhoa, laplace_rhob, drhoa, drhob, rho_cutoff, drho_cutoff, tau_cutoff, tau, tau_a, tau_b, local_bounds)
returns the various attributes of rho_set
Calculate the Thomas-Fermi kinetic energy functional plus the von Weizsaecker term.
Definition xc_tfw.F:16
subroutine, public tfw_lda_info(reference, shortform, needs, max_deriv)
...
Definition xc_tfw.F:81
subroutine, public tfw_lda_eval(rho_set, deriv_set, order)
...
Definition xc_tfw.F:134
subroutine, public tfw_lsd_info(reference, shortform, needs, max_deriv)
...
Definition xc_tfw.F:108
subroutine, public tfw_lsd_eval(rho_set, deriv_set, order)
...
Definition xc_tfw.F:244
represent a pointer to a contiguous 3d array
A derivative set contains the different derivatives of a xc-functional in form of a linked list.
represent a derivative of a functional
contains a flag for each component of xc_rho_set, so that you can use it to tell which components you...
represent a density, with all the representation and data needed to perform a functional evaluation