(git:50ddb19)
Loading...
Searching...
No Matches
qs_local_rho_types.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7! **************************************************************************************************
9
10 USE kinds, ONLY: dp
11 USE mathconstants, ONLY: fourpi,&
12 pi
24#include "./base/base_uses.f90"
25
26 IMPLICIT NONE
27
28 PRIVATE
29
30! *** Global parameters (only in this module)
31
32 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_local_rho_types'
33
34! *** Define rhoz and local_rho types ***
35
36! **************************************************************************************************
38 REAL(dp) :: one_atom = -1.0_dp
39 REAL(dp), DIMENSION(:), POINTER :: r_coef => null()
40 REAL(dp), DIMENSION(:), POINTER :: dr_coef => null()
41 REAL(dp), DIMENSION(:), POINTER :: vr_coef => null()
42 END TYPE rhoz_type
43
44! **************************************************************************************************
46 TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho_atom_set => null()
47 TYPE(rho0_mpole_type), POINTER :: rho0_mpole => null()
48 TYPE(rho0_atom_type), DIMENSION(:), POINTER :: rho0_atom_set => null()
49 TYPE(rhoz_type), DIMENSION(:), POINTER :: rhoz_set => null()
50 TYPE(rhoz_cneo_type), DIMENSION(:), POINTER :: rhoz_cneo_set => null()
51 REAL(dp) :: rhoz_tot = -1.0_dp, &
52 rhoz_cneo_tot = -1.0_dp
53 END TYPE local_rho_type
54
55! Public Types
56 PUBLIC :: local_rho_type, rhoz_type
57
58! Public Subroutine
59 PUBLIC :: allocate_rhoz, calculate_rhoz, &
62
63CONTAINS
64
65! **************************************************************************************************
66!> \brief ...
67!> \param rhoz_set ...
68!> \param nkind ...
69! **************************************************************************************************
70 SUBROUTINE allocate_rhoz(rhoz_set, nkind)
71
72 TYPE(rhoz_type), DIMENSION(:), POINTER :: rhoz_set
73 INTEGER :: nkind
74
75 INTEGER :: ikind
76
77 IF (ASSOCIATED(rhoz_set)) THEN
78 CALL deallocate_rhoz(rhoz_set)
79 END IF
80
81 ALLOCATE (rhoz_set(nkind))
82
83 DO ikind = 1, nkind
84 NULLIFY (rhoz_set(ikind)%r_coef)
85 NULLIFY (rhoz_set(ikind)%dr_coef)
86 NULLIFY (rhoz_set(ikind)%vr_coef)
87 END DO
88
89 END SUBROUTINE allocate_rhoz
90
91! **************************************************************************************************
92!> \brief ...
93!> \param rhoz ...
94!> \param grid_atom ...
95!> \param alpha ...
96!> \param zeff ...
97!> \param natom ...
98!> \param rhoz_tot ...
99!> \param harmonics ...
100! **************************************************************************************************
101 SUBROUTINE calculate_rhoz(rhoz, grid_atom, alpha, zeff, natom, rhoz_tot, harmonics)
102
103 TYPE(rhoz_type) :: rhoz
104 TYPE(grid_atom_type) :: grid_atom
105 REAL(dp), INTENT(IN) :: alpha
106 REAL(dp) :: zeff
107 INTEGER :: natom
108 REAL(dp), INTENT(INOUT) :: rhoz_tot
109 TYPE(harmonics_atom_type) :: harmonics
110
111 INTEGER :: ir, na, nr
112 REAL(dp) :: c1, c2, c3, prefactor1, prefactor2, &
113 prefactor3, sum
114
115 nr = grid_atom%nr
116 na = grid_atom%ng_sphere
117 CALL reallocate(rhoz%r_coef, 1, nr)
118 CALL reallocate(rhoz%dr_coef, 1, nr)
119 CALL reallocate(rhoz%vr_coef, 1, nr)
120
121 c1 = alpha/pi
122 c2 = c1*c1*c1*fourpi
123 c3 = sqrt(alpha)
124 prefactor1 = zeff*sqrt(c2)
125 prefactor2 = -2.0_dp*alpha
126 prefactor3 = -zeff*sqrt(fourpi)
127
128 sum = 0.0_dp
129 DO ir = 1, nr
130 c1 = -alpha*grid_atom%rad2(ir)
131 rhoz%r_coef(ir) = -exp(c1)*prefactor1
132 IF (abs(rhoz%r_coef(ir)) < 1.0e-30_dp) THEN
133 rhoz%r_coef(ir) = 0.0_dp
134 rhoz%dr_coef(ir) = 0.0_dp
135 ELSE
136 rhoz%dr_coef(ir) = prefactor2*rhoz%r_coef(ir)
137 END IF
138 rhoz%vr_coef(ir) = prefactor3*erf(grid_atom%rad(ir)*c3)/grid_atom%rad(ir)
139 sum = sum + rhoz%r_coef(ir)*grid_atom%wr(ir)
140 END DO
141 rhoz%one_atom = sum*harmonics%slm_int(1)
142 rhoz_tot = rhoz_tot + natom*rhoz%one_atom
143
144 END SUBROUTINE calculate_rhoz
145
146! **************************************************************************************************
147!> \brief ...
148!> \param rhoz_set ...
149! **************************************************************************************************
150 SUBROUTINE deallocate_rhoz(rhoz_set)
151
152 TYPE(rhoz_type), DIMENSION(:), POINTER :: rhoz_set
153
154 INTEGER :: ikind, nkind
155
156 nkind = SIZE(rhoz_set)
157
158 DO ikind = 1, nkind
159 IF (ASSOCIATED(rhoz_set(ikind)%r_coef)) DEALLOCATE (rhoz_set(ikind)%r_coef)
160 IF (ASSOCIATED(rhoz_set(ikind)%dr_coef)) DEALLOCATE (rhoz_set(ikind)%dr_coef)
161 IF (ASSOCIATED(rhoz_set(ikind)%vr_coef)) DEALLOCATE (rhoz_set(ikind)%vr_coef)
162 END DO
163
164 DEALLOCATE (rhoz_set)
165
166 END SUBROUTINE deallocate_rhoz
167
168! **************************************************************************************************
169!> \brief ...
170!> \param local_rho_set ...
171!> \param rho_atom_set ...
172!> \param rho0_atom_set ...
173!> \param rho0_mpole ...
174!> \param rhoz_set ...
175!> \param rhoz_cneo_set ...
176! **************************************************************************************************
177 SUBROUTINE get_local_rho(local_rho_set, rho_atom_set, rho0_atom_set, rho0_mpole, rhoz_set, &
178 rhoz_cneo_set)
179
180 TYPE(local_rho_type), POINTER :: local_rho_set
181 TYPE(rho_atom_type), DIMENSION(:), OPTIONAL, &
182 POINTER :: rho_atom_set
183 TYPE(rho0_atom_type), DIMENSION(:), OPTIONAL, &
184 POINTER :: rho0_atom_set
185 TYPE(rho0_mpole_type), OPTIONAL, POINTER :: rho0_mpole
186 TYPE(rhoz_type), DIMENSION(:), OPTIONAL, POINTER :: rhoz_set
187 TYPE(rhoz_cneo_type), DIMENSION(:), OPTIONAL, &
188 POINTER :: rhoz_cneo_set
189
190 IF (PRESENT(rho_atom_set)) rho_atom_set => local_rho_set%rho_atom_set
191 IF (PRESENT(rho0_atom_set)) rho0_atom_set => local_rho_set%rho0_atom_set
192 IF (PRESENT(rho0_mpole)) rho0_mpole => local_rho_set%rho0_mpole
193 IF (PRESENT(rhoz_set)) rhoz_set => local_rho_set%rhoz_set
194 IF (PRESENT(rhoz_cneo_set)) rhoz_cneo_set => local_rho_set%rhoz_cneo_set
195
196 END SUBROUTINE get_local_rho
197
198! **************************************************************************************************
199!> \brief ...
200!> \param local_rho_set ...
201! **************************************************************************************************
202 SUBROUTINE local_rho_set_create(local_rho_set)
203
204 TYPE(local_rho_type), POINTER :: local_rho_set
205
206 ALLOCATE (local_rho_set)
207
208 NULLIFY (local_rho_set%rho_atom_set)
209 NULLIFY (local_rho_set%rho0_atom_set)
210 NULLIFY (local_rho_set%rho0_mpole)
211 NULLIFY (local_rho_set%rhoz_set)
212 NULLIFY (local_rho_set%rhoz_cneo_set)
213
214 local_rho_set%rhoz_tot = 0.0_dp
215 local_rho_set%rhoz_cneo_tot = 0.0_dp
216
217 END SUBROUTINE local_rho_set_create
218
219! **************************************************************************************************
220!> \brief ...
221!> \param local_rho_set ...
222! **************************************************************************************************
223 SUBROUTINE local_rho_set_release(local_rho_set)
224
225 TYPE(local_rho_type), POINTER :: local_rho_set
226
227 IF (ASSOCIATED(local_rho_set)) THEN
228 IF (ASSOCIATED(local_rho_set%rho_atom_set)) THEN
229 CALL deallocate_rho_atom_set(local_rho_set%rho_atom_set)
230 END IF
231
232 IF (ASSOCIATED(local_rho_set%rho0_atom_set)) THEN
233 CALL deallocate_rho0_atom(local_rho_set%rho0_atom_set)
234 END IF
235
236 IF (ASSOCIATED(local_rho_set%rho0_mpole)) THEN
237 CALL deallocate_rho0_mpole(local_rho_set%rho0_mpole)
238 END IF
239
240 IF (ASSOCIATED(local_rho_set%rhoz_set)) THEN
241 CALL deallocate_rhoz(local_rho_set%rhoz_set)
242 END IF
243
244 IF (ASSOCIATED(local_rho_set%rhoz_cneo_set)) THEN
245 CALL deallocate_rhoz_cneo_set(local_rho_set%rhoz_cneo_set)
246 END IF
247
248 DEALLOCATE (local_rho_set)
249 END IF
250
251 END SUBROUTINE local_rho_set_release
252
253! **************************************************************************************************
254!> \brief ...
255!> \param local_rho_set ...
256!> \param rho_atom_set ...
257!> \param rho0_atom_set ...
258!> \param rho0_mpole ...
259!> \param rhoz_set ...
260!> \param rhoz_cneo_set ...
261! **************************************************************************************************
262 SUBROUTINE set_local_rho(local_rho_set, rho_atom_set, rho0_atom_set, rho0_mpole, &
263 rhoz_set, rhoz_cneo_set)
264
265 TYPE(local_rho_type), POINTER :: local_rho_set
266 TYPE(rho_atom_type), DIMENSION(:), OPTIONAL, &
267 POINTER :: rho_atom_set
268 TYPE(rho0_atom_type), DIMENSION(:), OPTIONAL, &
269 POINTER :: rho0_atom_set
270 TYPE(rho0_mpole_type), OPTIONAL, POINTER :: rho0_mpole
271 TYPE(rhoz_type), DIMENSION(:), OPTIONAL, POINTER :: rhoz_set
272 TYPE(rhoz_cneo_type), DIMENSION(:), OPTIONAL, &
273 POINTER :: rhoz_cneo_set
274
275 IF (PRESENT(rho_atom_set)) THEN
276 IF (ASSOCIATED(local_rho_set%rho_atom_set)) THEN
277 CALL deallocate_rho_atom_set(local_rho_set%rho_atom_set)
278 END IF
279 local_rho_set%rho_atom_set => rho_atom_set
280 END IF
281
282 IF (PRESENT(rho0_atom_set)) THEN
283 IF (ASSOCIATED(local_rho_set%rho0_atom_set)) THEN
284 CALL deallocate_rho0_atom(local_rho_set%rho0_atom_set)
285 END IF
286 local_rho_set%rho0_atom_set => rho0_atom_set
287 END IF
288
289 IF (PRESENT(rho0_mpole)) THEN
290 IF (ASSOCIATED(local_rho_set%rho0_mpole)) THEN
291 CALL deallocate_rho0_mpole(local_rho_set%rho0_mpole)
292 END IF
293 local_rho_set%rho0_mpole => rho0_mpole
294 END IF
295
296 IF (PRESENT(rhoz_set)) THEN
297 IF (ASSOCIATED(local_rho_set%rhoz_set)) THEN
298 CALL deallocate_rhoz(local_rho_set%rhoz_set)
299 END IF
300 local_rho_set%rhoz_set => rhoz_set
301 END IF
302
303 IF (PRESENT(rhoz_cneo_set)) THEN
304 IF (ASSOCIATED(local_rho_set%rhoz_cneo_set)) THEN
305 CALL deallocate_rhoz_cneo_set(local_rho_set%rhoz_cneo_set)
306 END IF
307 local_rho_set%rhoz_cneo_set => rhoz_cneo_set
308 END IF
309
310 END SUBROUTINE set_local_rho
311
312END MODULE qs_local_rho_types
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
real(kind=dp), parameter, public fourpi
Utility routines for the memory handling.
Types used by CNEO-DFT (see J. Chem. Theory Comput. 2025, 21, 16, 7865–7877)
subroutine, public deallocate_rhoz_cneo_set(rhoz_cneo_set)
...
subroutine, public local_rho_set_create(local_rho_set)
...
subroutine, public allocate_rhoz(rhoz_set, nkind)
...
subroutine, public get_local_rho(local_rho_set, rho_atom_set, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set)
...
subroutine, public local_rho_set_release(local_rho_set)
...
subroutine, public calculate_rhoz(rhoz, grid_atom, alpha, zeff, natom, rhoz_tot, harmonics)
...
subroutine, public set_local_rho(local_rho_set, rho_atom_set, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set)
...
subroutine, public deallocate_rho0_mpole(rho0)
...
subroutine, public deallocate_rho0_atom(rho0_atom_set)
...
subroutine, public deallocate_rho_atom_set(rho_atom_set)
...