21 #include "../base/base_uses.f90"
26 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
27 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'pint_staging'
45 TYPE(staging_env_type),
INTENT(OUT) :: staging_env
46 TYPE(section_vals_type),
POINTER :: staging_section
47 INTEGER,
INTENT(in) :: p
48 REAL(kind=
dp),
INTENT(in) :: kt
53 staging_env%nseg = staging_env%p/staging_env%j
55 staging_env%w_p = sqrt(real(staging_env%p,
dp))*kt
56 staging_env%w_j = kt*sqrt(real(staging_env%nseg,
dp))
57 staging_env%Q_stage = kt/staging_env%w_p**2
58 IF (staging_env%Q_end <= 0._dp)
THEN
59 staging_env%Q_end = staging_env%j*staging_env%Q_stage
69 TYPE(staging_env_type),
INTENT(IN) :: staging_env
71 mark_used(staging_env)
88 TYPE(staging_env_type),
INTENT(IN) :: staging_env
89 REAL(kind=
dp),
DIMENSION(:),
INTENT(in) :: mass
90 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(out), &
91 OPTIONAL :: mass_beads, mass_fict
92 REAL(kind=
dp),
DIMENSION(:),
INTENT(out),
OPTIONAL :: q
94 INTEGER :: i, iat, ib, iseg
95 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: scal
98 q = staging_env%Q_stage
99 DO i = 1, staging_env%p, staging_env%j
100 q(i) = staging_env%Q_end
103 IF (
PRESENT(mass_beads) .OR.
PRESENT(mass_fict))
THEN
105 ALLOCATE (scal(staging_env%p))
106 DO iseg = 1, staging_env%nseg
107 DO i = 1, staging_env%j
108 scal(staging_env%j*(iseg - 1) + i) = real(i,
dp)/real(max(1, i - 1),
dp)
117 IF (
PRESENT(mass_beads))
THEN
118 DO iat = 1,
SIZE(mass)
119 DO ib = 1, staging_env%p
120 mass_beads(ib, iat) = scal(ib)*mass(iat)
124 IF (
PRESENT(mass_fict))
THEN
125 DO iat = 1,
SIZE(mass)
126 DO ib = 1, staging_env%p
127 mass_fict(ib, iat) = scal(ib)*mass(iat)
143 TYPE(staging_env_type),
INTENT(IN) :: staging_env
144 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(out) :: ux
145 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(in) :: x
150 DO s = 0, staging_env%nseg - 1
151 DO k = 2, staging_env%j
152 ux(staging_env%j*s + k, :) = ux(staging_env%j*s + k, :) &
153 - ((real(k - 1,
dp)/real(k,
dp) &
154 *x(
modulo((staging_env%j*s + k + 1), staging_env%p), :) + &
155 x(staging_env%j*s + 1, :)/real(k,
dp)))
169 TYPE(staging_env_type),
INTENT(IN) :: staging_env
170 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(in) :: ux
171 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(out) :: x
174 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: iii, jjj
175 REAL(kind=
dp) :: const, const2
178 const = real(j - 1,
dp)/real(j,
dp)
179 const2 = 1._dp/real(j,
dp)
180 ALLOCATE (iii(staging_env%nseg), jjj(staging_env%nseg))
181 DO i = 1, staging_env%nseg
182 iii(i) = staging_env%j*(i - 1) + 1
184 DO i = 1, staging_env%nseg - 1
187 jjj(staging_env%nseg) = 1
190 DO i = 1, staging_env%nseg
191 x(j - 1 + iii(i), :) = x(j - 1 + iii(i), :) + &
192 const*ux(jjj(i), :) + ux(iii(i), :)*const2
194 DO ist = 1, staging_env%nseg
195 DO i = staging_env%j - 2, 2, -1
196 x(i + iii(ist), :) = x(i + iii(ist), :) + &
197 REAL(i - 1,
dp)/
REAL(i,
dp)*x(i + iii(ist) + 1, :) &
198 + ux(iii(ist), :)/
REAL(i,
dp)
211 TYPE(staging_env_type),
INTENT(IN) :: staging_env
212 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(out) :: uf
213 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(in) :: f
215 INTEGER :: i, idim, ij, ist, k
216 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: iii, jjj, kkk
217 REAL(kind=
dp) :: const, sum_f
219 const = real(staging_env%j - 1,
dp)/real(staging_env%j,
dp)
220 ALLOCATE (iii(staging_env%j), jjj(staging_env%j), &
222 DO ist = 1, staging_env%j - 1
223 iii(ist) = (ist - 1)*staging_env%j + 1
224 jjj(ist) = iii(ist) + staging_env%j - 1
225 kkk(ist) = iii(ist) - 1
227 kkk(1) = staging_env%p
231 DO k = 1, staging_env%nseg
232 DO i = 2, staging_env%j
233 uf(i + iii(k), :) = uf(i + iii(k), :) &
234 + real(i - 1,
dp)/real(i,
dp)*uf(i + iii(k) - 1, :)
238 DO idim = 1,
SIZE(uf, 2)
239 DO k = 1, staging_env%nseg
241 DO ij = 2, staging_env%j - 1
242 sum_f = sum_f + uf((k - 1)*staging_env%j + ij, idim)
244 uf(iii(k), idim) = uf(iii(k), idim) + &
245 sum_f - const*(uf(jjj(k), idim) - uf(kkk(k), idim))
260 TYPE(staging_env_type),
INTENT(IN) :: staging_env
261 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: mass_beads, ux, uf_h
262 REAL(kind=
dp),
INTENT(OUT) :: e_h
264 INTEGER :: idim, isg, ist
265 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: iii, jjj, kkk
266 REAL(kind=
dp) :: d, f
270 ALLOCATE (iii(staging_env%nseg), jjj(staging_env%nseg), &
271 kkk(staging_env%nseg))
273 DO ist = 1, staging_env%nseg
274 iii(ist) = (ist - 1)*staging_env%j + 1
275 jjj(ist) = iii(ist) + staging_env%j
276 kkk(ist) = iii(ist) - staging_env%j
278 jjj(staging_env%nseg) = 1
279 kkk(1) = staging_env%p - staging_env%j
281 DO idim = 1,
SIZE(mass_beads, 2)
282 DO ist = 1, staging_env%nseg
283 e_h = e_h + 0.5*mass_beads(1, idim)*staging_env%w_j**2* &
284 (ux(iii(ist), idim) - ux(jjj(ist), idim))**2
285 uf_h(iii(ist), idim) = mass_beads(1, idim)*staging_env%w_j**2*( &
286 2._dp*ux(iii(ist), idim) &
287 - ux(jjj(ist), idim) &
288 - ux(kkk(ist), idim) &
290 DO isg = 2, staging_env%j
291 d = ux((ist - 1)*staging_env%j + isg, idim)
292 f = mass_beads((ist - 1)*staging_env%j + isg, idim)*staging_env%w_j**2*d
293 e_h = e_h + 0.5_dp*f*d
294 uf_h((ist - 1)*staging_env%j + isg, idim) = f
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
Defines the basic variable types.
integer, parameter, public dp
Data type and methods dealing with PI calcs in staging coordinates.
elemental subroutine, public staging_release(staging_env)
releases the staging environment, kept for symmetry reasons with staging_env_create
pure subroutine, public staging_calc_uf_h(staging_env, mass_beads, ux, uf_h, e_h)
calculates the harmonic force in the staging basis
pure subroutine, public staging_x2u(staging_env, ux, x)
Transforms from the x into the u variables using a staging transformation for the positions.
pure subroutine, public staging_f2uf(staging_env, uf, f)
staging transformation for the forces
pure subroutine, public staging_u2x(staging_env, ux, x)
transform from the u variable to the x (back staging transformation for the positions)
subroutine, public staging_env_create(staging_env, staging_section, p, kT)
creates the data needed for a staging transformation
pure subroutine, public staging_init_masses(staging_env, mass, mass_beads, mass_fict, Q)
initializes the masses and fictitious masses compatibly with the staging information