(git:6a2e663)
xc_b97_fxc.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 calculates fxc in the spirit of the b97 exchange/correlation functional
10 !> \author jgh
11 ! **************************************************************************************************
12 MODULE xc_b97_fxc
13  USE kinds, ONLY: dp
14  USE pw_types, ONLY: pw_r3d_rs_type
15 #include "../base/base_uses.f90"
16 
17  IMPLICIT NONE
18  PRIVATE
19 
20  PUBLIC :: b97_fxc_eval, b97_fcc_eval
21 
22 CONTAINS
23 
24 ! **************************************************************************************************
25 !> \brief ...
26 !> \param rhos ...
27 !> \param norm_drhos ...
28 !> \param fxc ...
29 !> \param gx ...
30 !> \param cx ...
31 !> \param eps_rho ...
32 ! **************************************************************************************************
33  SUBROUTINE b97_fxc_eval(rhos, norm_drhos, fxc, gx, cx, eps_rho)
34  TYPE(pw_r3d_rs_type), INTENT(IN) :: rhos, norm_drhos
35  TYPE(pw_r3d_rs_type), INTENT(INOUT) :: fxc
36  REAL(kind=dp), INTENT(IN) :: gx
37  REAL(kind=dp), DIMENSION(:), INTENT(IN) :: cx
38  REAL(kind=dp), INTENT(IN) :: eps_rho
39 
40  CHARACTER(len=*), PARAMETER :: routinen = 'b97_fxc_eval'
41 
42  INTEGER :: handle, i, io, j, k, norder
43  INTEGER, DIMENSION(2, 3) :: bo
44  REAL(kind=dp) :: drho, gval, rho, sval, ux
45 
46  CALL timeset(routinen, handle)
47 
48  norder = SIZE(cx)
49  bo(1:2, 1:3) = rhos%pw_grid%bounds_local(1:2, 1:3)
50 !$OMP PARALLEL DO PRIVATE(i,j,k,io,rho,drho,sval,gval,ux) DEFAULT(NONE)&
51 !$OMP SHARED(bo,rhos,norm_drhos,fxc,gx,cx,eps_rho,norder)
52  DO k = bo(1, 3), bo(2, 3)
53  DO j = bo(1, 2), bo(2, 2)
54  DO i = bo(1, 1), bo(2, 1)
55 
56  rho = rhos%array(i, j, k)
57  drho = norm_drhos%array(i, j, k)
58  IF (rho > eps_rho) THEN
59  sval = gx*(drho/rho**1.33333333333333_dp)**2
60  ux = sval/(1._dp + sval)
61  gval = 0.0_dp
62  DO io = 0, norder - 1
63  gval = gval + cx(io + 1)*(ux**io)
64  END DO
65  fxc%array(i, j, k) = fxc%array(i, j, k)*gval
66  END IF
67 
68  END DO
69  END DO
70  END DO
71 
72  CALL timestop(handle)
73 
74  END SUBROUTINE b97_fxc_eval
75 
76 ! **************************************************************************************************
77 !> \brief ...
78 !> \param rhoa ...
79 !> \param rhob ...
80 !> \param norm_drhoa ...
81 !> \param norm_drhob ...
82 !> \param fcc ...
83 !> \param gcc ...
84 !> \param cco ...
85 !> \param eps_rho ...
86 ! **************************************************************************************************
87  SUBROUTINE b97_fcc_eval(rhoa, rhob, norm_drhoa, norm_drhob, fcc, gcc, cco, eps_rho)
88  TYPE(pw_r3d_rs_type), INTENT(IN) :: rhoa, rhob, norm_drhoa, norm_drhob
89  TYPE(pw_r3d_rs_type), INTENT(INOUT) :: fcc
90  REAL(kind=dp), INTENT(IN) :: gcc
91  REAL(kind=dp), DIMENSION(:), INTENT(IN) :: cco
92  REAL(kind=dp), INTENT(IN) :: eps_rho
93 
94  CHARACTER(len=*), PARAMETER :: routinen = 'b97_fcc_eval'
95 
96  INTEGER :: handle, i, io, j, k, norder
97  INTEGER, DIMENSION(2, 3) :: bo
98  REAL(kind=dp) :: dra, drb, gval, ra, rb, sa, sb, sval, ux
99 
100  CALL timeset(routinen, handle)
101 
102  norder = SIZE(cco)
103  bo(1:2, 1:3) = rhoa%pw_grid%bounds_local(1:2, 1:3)
104 !$OMP PARALLEL DO PRIVATE(i,j,k,ra,rb,dra,drb,sa,sb,sval,gval,ux,io) DEFAULT(NONE)&
105 !$OMP SHARED(bo,rhoa,rhob,norm_drhoa,norm_drhob,fcc,gcc,cco,norder,eps_rho)
106  DO k = bo(1, 3), bo(2, 3)
107  DO j = bo(1, 2), bo(2, 2)
108  DO i = bo(1, 1), bo(2, 1)
109 
110  ra = rhoa%array(i, j, k)
111  rb = rhob%array(i, j, k)
112  dra = norm_drhoa%array(i, j, k)
113  drb = norm_drhob%array(i, j, k)
114  IF (ra > eps_rho .AND. rb > eps_rho) THEN
115  sa = (dra/ra**1.33333333333333_dp)**2
116  sb = (drb/rb**1.33333333333333_dp)**2
117  sval = 0.5_dp*gcc*(sa + sb)
118  ux = sval/(1._dp + sval)
119  gval = 0.0_dp
120  DO io = 0, norder - 1
121  gval = gval + cco(io + 1)*(ux**io)
122  END DO
123  fcc%array(i, j, k) = fcc%array(i, j, k)*gval
124  END IF
125 
126  END DO
127  END DO
128  END DO
129 
130  CALL timestop(handle)
131 
132  END SUBROUTINE b97_fcc_eval
133 
134 END MODULE xc_b97_fxc
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
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