(git:34ef472)
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
15  USE pw_grid_types, ONLY: pw_grid_type
16  USE pw_methods, ONLY: pw_zero
17  USE pw_poisson_types, ONLY: do_ewald_ewald,&
19  do_ewald_pme,&
21  USE pw_types, ONLY: pw_r3d_rs_type
22 #include "../base/base_uses.f90"
23 
24  IMPLICIT NONE
25 
26  PRIVATE
27  PUBLIC:: dg_rho0_type, dg_rho0_init, dg_rho0_set, dg_rho0_get, &
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 ! **************************************************************************************************
39  TYPE dg_rho0_type
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 
49 CONTAINS
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 
258 END MODULE dg_rho0_types
subroutine, public dg_rho0_init(dg_rho0, pw_grid)
...
subroutine, public dg_rho0_get(dg_rho0, cutoff_radius, TYPE, grid, kind, gcc, zet, density)
Get the dg_rho0_type.
Definition: dg_rho0_types.F:95
subroutine, public dg_rho0_set(dg_rho0, TYPE, grid, kind, cutoff_radius, gcc, zet, density)
Set the dg_rho0_type.
Definition: dg_rho0_types.F:65
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
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