(git:374b731)
Loading...
Searching...
No Matches
dg_rho0_types.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!> \par History
10!> none
11! **************************************************************************************************
13
14 USE kinds, ONLY: dp
16 USE pw_methods, ONLY: pw_zero
21 USE pw_types, ONLY: pw_r3d_rs_type
22#include "../base/base_uses.f90"
23
24 IMPLICIT NONE
25
26 PRIVATE
29
30 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'dg_rho0_types'
31
32! **************************************************************************************************
33!> \brief Type for Gaussian Densities
34!> type = type of gaussian (PME)
35!> grid = grid number
36!> gcc = Gaussian contraction coefficient
37!> zet = Gaussian exponent
38! **************************************************************************************************
40 INTEGER :: TYPE = do_ewald_none
41 INTEGER :: grid = 0
42 INTEGER :: kind = 0
43 REAL(kind=dp) :: cutoff_radius = 0.0_dp
44 REAL(kind=dp), DIMENSION(:), POINTER :: gcc => null()
45 REAL(kind=dp), DIMENSION(:), POINTER :: zet => null()
46 TYPE(pw_r3d_rs_type), POINTER :: density => null()
47 END TYPE dg_rho0_type
48
49CONTAINS
50
51! **************************************************************************************************
52!> \brief Set the dg_rho0_type
53!> \param dg_rho0 ...
54!> \param TYPE ...
55!> \param grid ...
56!> \param kind ...
57!> \param cutoff_radius ...
58!> \param gcc ...
59!> \param zet ...
60!> \param density ...
61!> \version 1.0
62! **************************************************************************************************
63 SUBROUTINE dg_rho0_set(dg_rho0, TYPE, grid, kind, cutoff_radius, &
64 gcc, zet, density)
65 INTEGER, OPTIONAL :: type
66 TYPE(dg_rho0_type), POINTER :: dg_rho0
67 INTEGER, OPTIONAL :: grid, kind
68 REAL(kind=dp), OPTIONAL :: cutoff_radius
69 REAL(kind=dp), OPTIONAL, POINTER :: gcc(:), zet(:)
70 TYPE(pw_r3d_rs_type), OPTIONAL, POINTER :: density
71
72 IF (PRESENT(grid)) dg_rho0%grid = grid
73 IF (PRESENT(kind)) dg_rho0%kind = kind
74 IF (PRESENT(density)) dg_rho0%density => density
75 IF (PRESENT(gcc)) dg_rho0%gcc => gcc
76 IF (PRESENT(zet)) dg_rho0%zet => zet
77 IF (PRESENT(type)) dg_rho0%type = TYPE
78 IF (PRESENT(cutoff_radius)) dg_rho0%cutoff_radius = cutoff_radius
79
80 END SUBROUTINE dg_rho0_set
81
82! **************************************************************************************************
83!> \brief Get the dg_rho0_type
84!> \param dg_rho0 ...
85!> \param cutoff_radius ...
86!> \param TYPE ...
87!> \param grid ...
88!> \param kind ...
89!> \param gcc ...
90!> \param zet ...
91!> \param density ...
92!> \version 1.0
93! **************************************************************************************************
94 SUBROUTINE dg_rho0_get(dg_rho0, cutoff_radius, TYPE, grid, kind, gcc, zet, density)
95 INTEGER, OPTIONAL :: type
96 REAL(kind=dp), OPTIONAL :: cutoff_radius
97 TYPE(dg_rho0_type), POINTER :: dg_rho0
98 INTEGER, OPTIONAL :: grid, kind
99 REAL(kind=dp), OPTIONAL, POINTER :: gcc(:), zet(:)
100 TYPE(pw_r3d_rs_type), OPTIONAL, POINTER :: density
101
102 IF (PRESENT(grid)) grid = dg_rho0%grid
103 IF (PRESENT(kind)) kind = dg_rho0%kind
104 IF (PRESENT(density)) density => dg_rho0%density
105 IF (PRESENT(gcc)) gcc => dg_rho0%gcc
106 IF (PRESENT(zet)) zet => dg_rho0%zet
107 IF (PRESENT(type)) TYPE = dg_rho0%type
108 IF (PRESENT(cutoff_radius)) cutoff_radius = dg_rho0%cutoff_radius
109
110 END SUBROUTINE dg_rho0_get
111
112! **************************************************************************************************
113!> \brief create the dg_rho0 structure
114!> \param dg_rho0 ...
115!> \version 1.0
116! **************************************************************************************************
117 SUBROUTINE dg_rho0_create(dg_rho0)
118 TYPE(dg_rho0_type), POINTER :: dg_rho0
119
120 ALLOCATE (dg_rho0)
121
122 END SUBROUTINE dg_rho0_create
123
124! **************************************************************************************************
125!> \brief releases the given dg_rho0_type
126!> \param dg_rho0 the dg_rho0_type to release
127!> \par History
128!> 04.2003 created [fawzi]
129!> \author fawzi
130!> \note
131!> see doc/ReferenceCounting.html
132! **************************************************************************************************
133 SUBROUTINE dg_rho0_release(dg_rho0)
134 TYPE(dg_rho0_type), POINTER :: dg_rho0
135
136 IF (ASSOCIATED(dg_rho0)) THEN
137 IF (ASSOCIATED(dg_rho0%gcc)) THEN
138 DEALLOCATE (dg_rho0%gcc)
139 END IF
140 IF (ASSOCIATED(dg_rho0%zet)) THEN
141 DEALLOCATE (dg_rho0%zet)
142 END IF
143 IF (ASSOCIATED(dg_rho0%density)) THEN
144 CALL dg_rho0%density%release()
145 DEALLOCATE (dg_rho0%density)
146 END IF
147 NULLIFY (dg_rho0%gcc)
148 NULLIFY (dg_rho0%zet)
149 DEALLOCATE (dg_rho0)
150 END IF
151 NULLIFY (dg_rho0)
152 END SUBROUTINE dg_rho0_release
153
154! **************************************************************************************************
155!> \brief ...
156!> \param dg_rho0 ...
157!> \param pw_grid ...
158! **************************************************************************************************
159 SUBROUTINE dg_rho0_init(dg_rho0, pw_grid)
160 TYPE(dg_rho0_type), POINTER :: dg_rho0
161 TYPE(pw_grid_type), POINTER :: pw_grid
162
163 IF (ASSOCIATED(dg_rho0%density)) THEN
164 CALL dg_rho0%density%release()
165 ELSE
166 ALLOCATE (dg_rho0%density)
167 END IF
168 SELECT CASE (dg_rho0%type)
169 CASE (do_ewald_ewald)
170 CALL dg_rho0%density%create(pw_grid)
171 CALL dg_rho0_pme_gauss(dg_rho0%density, dg_rho0%zet(1))
172 CASE (do_ewald_pme)
173 CALL dg_rho0%density%create(pw_grid)
174 CALL dg_rho0_pme_gauss(dg_rho0%density, dg_rho0%zet(1))
175 CASE (do_ewald_spme)
176 cpabort('SPME type not implemented')
177 END SELECT
178
179 END SUBROUTINE dg_rho0_init
180
181! **************************************************************************************************
182!> \brief ...
183!> \param dg_rho0 ...
184!> \param alpha ...
185! **************************************************************************************************
186 SUBROUTINE dg_rho0_pme_gauss(dg_rho0, alpha)
187
188 TYPE(pw_r3d_rs_type), INTENT(INOUT) :: dg_rho0
189 REAL(kind=dp), INTENT(IN) :: alpha
190
191 INTEGER, PARAMETER :: impossible = 10000
192
193 INTEGER :: gpt, l0, ln, lp, m0, mn, mp, n0, nn, np
194 INTEGER, DIMENSION(:, :), POINTER :: bds
195 REAL(kind=dp) :: const, e_gsq
196 REAL(kind=dp), DIMENSION(:, :, :), POINTER :: rho0
197 TYPE(pw_grid_type), POINTER :: pw_grid
198
199 const = 1.0_dp/(8.0_dp*alpha**2)
200
201 pw_grid => dg_rho0%pw_grid
202 bds => pw_grid%bounds
203
204 IF (-bds(1, 1) == bds(2, 1)) THEN
205 l0 = impossible
206 ELSE
207 l0 = bds(1, 1)
208 END IF
209
210 IF (-bds(1, 2) == bds(2, 2)) THEN
211 m0 = impossible
212 ELSE
213 m0 = bds(1, 2)
214 END IF
215
216 IF (-bds(1, 3) == bds(2, 3)) THEN
217 n0 = impossible
218 ELSE
219 n0 = bds(1, 3)
220 END IF
221
222 CALL pw_zero(dg_rho0)
223
224 rho0 => dg_rho0%array
225
226 DO gpt = 1, pw_grid%ngpts_cut_local
227 associate(ghat => pw_grid%g_hat(:, gpt))
228
229 lp = pw_grid%mapl%pos(ghat(1))
230 ln = pw_grid%mapl%neg(ghat(1))
231 mp = pw_grid%mapm%pos(ghat(2))
232 mn = pw_grid%mapm%neg(ghat(2))
233 np = pw_grid%mapn%pos(ghat(3))
234 nn = pw_grid%mapn%neg(ghat(3))
235
236 e_gsq = exp(-const*pw_grid%gsq(gpt))/pw_grid%vol
237
238 lp = lp + bds(1, 1)
239 mp = mp + bds(1, 2)
240 np = np + bds(1, 3)
241 ln = ln + bds(1, 1)
242 mn = mn + bds(1, 2)
243 nn = nn + bds(1, 3)
244
245 rho0(lp, mp, np) = e_gsq
246 rho0(ln, mn, nn) = e_gsq
247
248 IF (ghat(1) == l0 .OR. ghat(2) == m0 .OR. ghat(3) == n0) THEN
249 rho0(lp, mp, np) = 0.0_dp
250 rho0(ln, mn, nn) = 0.0_dp
251 END IF
252 END associate
253
254 END DO
255
256 END SUBROUTINE dg_rho0_pme_gauss
257
258END MODULE dg_rho0_types
subroutine, public dg_rho0_get(dg_rho0, cutoff_radius, type, grid, kind, gcc, zet, density)
Get the dg_rho0_type.
subroutine, public dg_rho0_init(dg_rho0, pw_grid)
...
subroutine, public dg_rho0_create(dg_rho0)
create the dg_rho0 structure
subroutine, public dg_rho0_release(dg_rho0)
releases the given dg_rho0_type
subroutine, public dg_rho0_set(dg_rho0, type, grid, kind, cutoff_radius, gcc, zet, density)
Set the dg_rho0_type.
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
functions related to the poisson solver on regular grids
integer, parameter, public do_ewald_pme
integer, parameter, public do_ewald_ewald
integer, parameter, public do_ewald_none
integer, parameter, public do_ewald_spme
Type for Gaussian Densities type = type of gaussian (PME) grid = grid number gcc = Gaussian contracti...