22#include "../base/base_uses.f90"
30 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'dg_rho0_types'
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()
63 SUBROUTINE dg_rho0_set(dg_rho0, TYPE, grid, kind, cutoff_radius, &
65 INTEGER,
OPTIONAL :: type
67 INTEGER,
OPTIONAL :: grid, kind
68 REAL(kind=
dp),
OPTIONAL :: cutoff_radius
69 REAL(kind=
dp),
OPTIONAL,
POINTER :: gcc(:), zet(:)
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
63 SUBROUTINE dg_rho0_set(dg_rho0, TYPE, grid, kind, cutoff_radius, &
…
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
98 INTEGER,
OPTIONAL :: grid, kind
99 REAL(kind=
dp),
OPTIONAL,
POINTER :: gcc(:), zet(:)
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
94 SUBROUTINE dg_rho0_get(dg_rho0, cutoff_radius, TYPE, grid, kind, gcc, zet, density)
…
136 IF (
ASSOCIATED(dg_rho0))
THEN
137 IF (
ASSOCIATED(dg_rho0%gcc))
THEN
138 DEALLOCATE (dg_rho0%gcc)
140 IF (
ASSOCIATED(dg_rho0%zet))
THEN
141 DEALLOCATE (dg_rho0%zet)
143 IF (
ASSOCIATED(dg_rho0%density))
THEN
144 CALL dg_rho0%density%release()
145 DEALLOCATE (dg_rho0%density)
147 NULLIFY (dg_rho0%gcc)
148 NULLIFY (dg_rho0%zet)
163 IF (
ASSOCIATED(dg_rho0%density))
THEN
164 CALL dg_rho0%density%release()
166 ALLOCATE (dg_rho0%density)
168 SELECT CASE (dg_rho0%type)
170 CALL dg_rho0%density%create(pw_grid)
171 CALL dg_rho0_pme_gauss(dg_rho0%density, dg_rho0%zet(1))
173 CALL dg_rho0%density%create(pw_grid)
174 CALL dg_rho0_pme_gauss(dg_rho0%density, dg_rho0%zet(1))
176 cpabort(
'SPME type not implemented')
186 SUBROUTINE dg_rho0_pme_gauss(dg_rho0, alpha)
189 REAL(kind=
dp),
INTENT(IN) :: alpha
191 INTEGER,
PARAMETER :: impossible = 10000
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
199 const = 1.0_dp/(8.0_dp*alpha**2)
201 pw_grid => dg_rho0%pw_grid
202 bds => pw_grid%bounds
204 IF (-bds(1, 1) == bds(2, 1))
THEN
210 IF (-bds(1, 2) == bds(2, 2))
THEN
216 IF (-bds(1, 3) == bds(2, 3))
THEN
224 rho0 => dg_rho0%array
226 DO gpt = 1, pw_grid%ngpts_cut_local
227 associate(ghat => pw_grid%g_hat(:, gpt))
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))
236 e_gsq = exp(-const*pw_grid%gsq(gpt))/pw_grid%vol
245 rho0(lp, mp, np) = e_gsq
246 rho0(ln, mn, nn) = e_gsq
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
256 END SUBROUTINE dg_rho0_pme_gauss
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.
integer, parameter, public dp
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...