(git:07a6c39)
Loading...
Searching...
No Matches
fist_neighbor_list_control.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
8! **************************************************************************************************
9!> \par History
10!> Harald Forbert (Dec-2000): Changes for multiple linked lists
11!> linklist_internal_data_type
12!> 07.02.2005: using real coordinates for r_last_update; cleaned (MK)
13!> \author CJM,MK
14! **************************************************************************************************
16
19 USE cell_methods, ONLY: cell_create
20 USE cell_types, ONLY: cell_clone,&
22 cell_type,&
23 pbc,&
40 USE kinds, ONLY: dp
42 USE pair_potential_types, ONLY: &
46#include "./base/base_uses.f90"
47
48 IMPLICIT NONE
49
50 PRIVATE
51
52 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'fist_neighbor_list_control'
53
54 PUBLIC :: list_control
55
56!***
57
58CONTAINS
59
60! to decide whether the neighbor list is to be updated or not
61! based on a displacement criterion;
62! if any particle has moved by 0.5*verlet_skin from the previous
63! list update, then the list routine is called.
64
65! **************************************************************************************************
66!> \brief ...
67!> \param atomic_kind_set ...
68!> \param particle_set ...
69!> \param local_particles ...
70!> \param cell ...
71!> \param fist_nonbond_env ...
72!> \param para_env ...
73!> \param mm_section ...
74!> \param shell_particle_set ...
75!> \param core_particle_set ...
76!> \param force_update ...
77!> \param exclusions ...
78! **************************************************************************************************
79 SUBROUTINE list_control(atomic_kind_set, particle_set, local_particles, &
80 cell, fist_nonbond_env, para_env, mm_section, shell_particle_set, &
81 core_particle_set, force_update, exclusions)
82
83 TYPE(atomic_kind_type), POINTER :: atomic_kind_set(:)
84 TYPE(particle_type), POINTER :: particle_set(:)
85 TYPE(distribution_1d_type), POINTER :: local_particles
86 TYPE(cell_type), POINTER :: cell
87 TYPE(fist_nonbond_env_type), POINTER :: fist_nonbond_env
88 TYPE(mp_para_env_type), POINTER :: para_env
89 TYPE(section_vals_type), POINTER :: mm_section
90 TYPE(particle_type), OPTIONAL, POINTER :: shell_particle_set(:), &
91 core_particle_set(:)
92 LOGICAL, INTENT(IN), OPTIONAL :: force_update
93 TYPE(exclusion_type), DIMENSION(:), OPTIONAL :: exclusions
94
95 CHARACTER(LEN=*), PARAMETER :: routinen = 'list_control'
96
97 INTEGER :: counter, handle, ikind, iparticle, iparticle_kind, iparticle_local, ishell, &
98 jkind, last_update, nparticle, nparticle_kind, nparticle_local, nshell, num_update, &
99 output_unit
100 LOGICAL :: build_from_scratch, geo_check, &
101 shell_adiabatic, shell_present, &
102 update_neighbor_lists
103 LOGICAL, DIMENSION(:, :), POINTER :: full_nl
104 REAL(kind=dp) :: aup, dr2, dr2_max, ei_scale14, lup, &
105 vdw_scale14, verlet_skin
106 REAL(kind=dp), DIMENSION(3) :: dr, rab, rab_last_update, s, s2r
107 REAL(kind=dp), DIMENSION(:, :), POINTER :: rlist_cut, rlist_lowsq
108 TYPE(cell_type), POINTER :: cell_last_update
109 TYPE(cp_logger_type), POINTER :: logger
110 TYPE(fist_neighbor_type), POINTER :: nonbonded
111 TYPE(pair_potential_pp_type), POINTER :: potparm
112 TYPE(pos_type), DIMENSION(:), POINTER :: r_last_update, r_last_update_pbc, &
113 rcore_last_update_pbc, &
114 rshell_last_update_pbc
115
116 CALL timeset(routinen, handle)
117 NULLIFY (logger)
118 logger => cp_get_default_logger()
119
120 ! *** Assigning local pointers ***
121 CALL fist_nonbond_env_get(fist_nonbond_env, &
122 nonbonded=nonbonded, &
123 rlist_cut=rlist_cut, &
124 rlist_lowsq=rlist_lowsq, &
125 aup=aup, &
126 lup=lup, &
127 ei_scale14=ei_scale14, &
128 vdw_scale14=vdw_scale14, &
129 counter=counter, &
130 r_last_update=r_last_update, &
131 r_last_update_pbc=r_last_update_pbc, &
132 rshell_last_update_pbc=rshell_last_update_pbc, &
133 rcore_last_update_pbc=rcore_last_update_pbc, &
134 cell_last_update=cell_last_update, &
135 num_update=num_update, &
136 potparm=potparm, &
137 last_update=last_update)
138
139 nparticle = SIZE(particle_set)
140 nparticle_kind = SIZE(atomic_kind_set)
141 nshell = 0
142 CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, &
143 shell_present=shell_present, shell_adiabatic=shell_adiabatic)
144 IF (shell_present) THEN
145 nshell = SIZE(shell_particle_set)
146 END IF
147
148 ! *** Check, if the neighbor lists have to be built or updated ***
149 update_neighbor_lists = .false.
150 CALL section_vals_val_get(mm_section, "NEIGHBOR_LISTS%NEIGHBOR_LISTS_FROM_SCRATCH", &
151 l_val=build_from_scratch)
152 CALL section_vals_val_get(mm_section, "NEIGHBOR_LISTS%GEO_CHECK", &
153 l_val=geo_check)
154 IF (ASSOCIATED(r_last_update)) THEN
155 ! Determine the maximum of the squared displacement, compared to
156 ! r_last_update.
157 CALL section_vals_val_get(mm_section, "NEIGHBOR_LISTS%VERLET_SKIN", &
158 r_val=verlet_skin)
159 dr2_max = 0.0_dp
160 DO iparticle_kind = 1, nparticle_kind
161 nparticle_local = local_particles%n_el(iparticle_kind)
162 DO iparticle_local = 1, nparticle_local
163 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
164 s2r = r_last_update(iparticle)%r
165 s = particle_set(iparticle)%r(:)
166 dr(:) = s2r - s
167 dr2 = dr(1)*dr(1) + dr(2)*dr(2) + dr(3)*dr(3)
168 dr2_max = max(dr2_max, dr2)
169 END DO
170 END DO
171
172 CALL para_env%max(dr2_max)
173
174 ! If the maximum distplacement is too large, ...
175 IF (dr2_max > 0.25_dp*verlet_skin**2 .OR. build_from_scratch) THEN
176 DO iparticle = 1, nparticle
177 r_last_update(iparticle)%r = particle_set(iparticle)%r(:)
178 END DO
179 update_neighbor_lists = .true.
180 END IF
181 ELSE
182 ! There is no r_last_update to compare with. Neighbor lists from scratch.
183 ALLOCATE (r_last_update(nparticle))
184 DO iparticle = 1, nparticle
185 r_last_update(iparticle)%r = particle_set(iparticle)%r(:)
186 END DO
187
188 update_neighbor_lists = .true.
189 build_from_scratch = .true.
190 END IF
191 ! Force Update
192 IF (PRESENT(force_update)) THEN
193 IF (force_update) update_neighbor_lists = .true.
194 END IF
195
196 ! Allocate the r_last_update_pbc, rshell_last_update_pbc, rcore_last_update_pbc
197 IF (.NOT. ASSOCIATED(r_last_update_pbc)) THEN
198 ALLOCATE (r_last_update_pbc(nparticle))
199 END IF
200 IF (shell_present .AND. .NOT. ASSOCIATED(rshell_last_update_pbc)) THEN
201 ALLOCATE (rshell_last_update_pbc(nshell))
202 END IF
203 IF (shell_present .AND. .NOT. ASSOCIATED(rcore_last_update_pbc)) THEN
204 ALLOCATE (rcore_last_update_pbc(nshell))
205 END IF
206
207 ! update the neighbor lists
208 IF (update_neighbor_lists) THEN
209 ! determine which pairs of atom kinds need full neighbor lists. Full
210 ! means that atom a is in the neighbor list of atom b and vice versa.
211 ALLOCATE (full_nl(nparticle_kind, nparticle_kind))
212 IF (ASSOCIATED(potparm)) THEN
213 DO ikind = 1, nparticle_kind
214 DO jkind = ikind, nparticle_kind
215 full_nl(ikind, jkind) = .false.
216 IF (any(potparm%pot(ikind, jkind)%pot%type == tersoff_type)) THEN
217 full_nl(ikind, jkind) = .true.
218 END IF
219 IF (any(potparm%pot(ikind, jkind)%pot%type == siepmann_type)) THEN
220 full_nl(ikind, jkind) = .true.
221 END IF
222 IF (any(potparm%pot(ikind, jkind)%pot%type == gal_type)) THEN
223 full_nl(ikind, jkind) = .true.
224 END IF
225 IF (any(potparm%pot(ikind, jkind)%pot%type == gal21_type)) THEN
226 full_nl(ikind, jkind) = .true.
227 END IF
228 IF (any(potparm%pot(ikind, jkind)%pot%type == allegro_type)) THEN
229 full_nl(ikind, jkind) = .true.
230 END IF
231 IF (any(potparm%pot(ikind, jkind)%pot%type == nequip_type)) THEN
232 full_nl(ikind, jkind) = .true.
233 END IF
234 IF (any(potparm%pot(ikind, jkind)%pot%type == mace_type)) THEN
235 full_nl(ikind, jkind) = .true.
236 END IF
237 IF (any(potparm%pot(ikind, jkind)%pot%type == ace_type)) THEN
238 full_nl(ikind, jkind) = .true.
239 END IF
240 full_nl(jkind, ikind) = full_nl(ikind, jkind)
241 END DO
242 END DO
243 ELSE
244 full_nl = .false.
245 END IF
246 CALL build_fist_neighbor_lists(atomic_kind_set, particle_set, &
247 local_particles, cell, rlist_cut, rlist_lowsq, ei_scale14, &
248 vdw_scale14, nonbonded, para_env, &
249 build_from_scratch=build_from_scratch, geo_check=geo_check, &
250 mm_section=mm_section, full_nl=full_nl, &
251 exclusions=exclusions)
252
253 CALL cell_release(cell_last_update)
254 CALL cell_create(cell_last_update)
255 CALL cell_clone(cell, cell_last_update)
256
257 IF (counter > 0) THEN
258 num_update = num_update + 1
259 lup = counter + 1 - last_update
260 last_update = counter + 1
261 aup = aup + (lup - aup)/real(num_update, kind=dp)
262 ELSE
263 num_update = 0
264 lup = 0
265 last_update = 1
266 aup = 0.0_dp
267 END IF
268
269 CALL fist_nonbond_env_set(fist_nonbond_env, &
270 lup=lup, &
271 aup=aup, &
272 r_last_update=r_last_update, &
273 r_last_update_pbc=r_last_update_pbc, &
274 rshell_last_update_pbc=rshell_last_update_pbc, &
275 rcore_last_update_pbc=rcore_last_update_pbc, &
276 nonbonded=nonbonded, &
277 num_update=num_update, &
278 last_update=last_update, &
279 cell_last_update=cell_last_update)
280
281 output_unit = cp_print_key_unit_nr(logger, mm_section, "PRINT%NEIGHBOR_LISTS", &
282 extension=".mmLog")
283 IF (output_unit > 0) THEN
284 WRITE (unit=output_unit, &
285 fmt="(/,T2,A,/,T52,A,/,A,T31,A,T49,2(1X,F15.2),/,T2,A,/)") &
286 repeat("*", 79), "INSTANTANEOUS AVERAGES", &
287 " LIST UPDATES[steps]", "= ", lup, aup, repeat("*", 79)
288 END IF
289 CALL cp_print_key_finished_output(output_unit, logger, mm_section, &
290 "PRINT%NEIGHBOR_LISTS")
291 DEALLOCATE (full_nl)
292 END IF
293
294 ! Store particle positions after the last update, translated to the
295 ! primitive cell, in r_last_update_pbc.
296 DO iparticle = 1, nparticle
297 ! The pbc algorithm is sensitive to numeric noise and compiler optimization because of ANINT.
298 ! Therefore we need to call here exactly the same routine as in build_neighbor_lists.
299 rab_last_update = pbc(r_last_update(iparticle)%r, cell_last_update) - r_last_update(iparticle)%r
300 CALL real_to_scaled(s, rab_last_update, cell_last_update)
301 CALL scaled_to_real(rab, s, cell)
302
303 r_last_update_pbc(iparticle)%r = particle_set(iparticle)%r + rab
304 ! Use the same translation for core and shell.
305 ishell = particle_set(iparticle)%shell_index
306 IF (ishell /= 0) THEN
307 rshell_last_update_pbc(ishell)%r = rab + shell_particle_set(ishell)%r(:)
308 IF (shell_adiabatic) THEN
309 rcore_last_update_pbc(ishell)%r = rab + core_particle_set(ishell)%r(:)
310 ELSE
311 rcore_last_update_pbc(ishell)%r = r_last_update_pbc(iparticle)%r(:)
312 END IF
313 END IF
314 END DO
315
316 counter = counter + 1
317 CALL fist_nonbond_env_set(fist_nonbond_env, counter=counter)
318 CALL timestop(handle)
319
320 END SUBROUTINE list_control
321
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind_set(atomic_kind_set, atom_of_kind, kind_of, natom_of_kind, maxatom, natom, nshell, fist_potential_present, shell_present, shell_adiabatic, shell_check_distance, damping_present)
Get attributes of an atomic kind set.
Handles all functions related to the CELL.
subroutine, public cell_create(cell, hmat, periodic, tag)
allocates and initializes a cell
Handles all functions related to the CELL.
Definition cell_types.F:15
subroutine, public scaled_to_real(r, s, cell)
Transform scaled cell coordinates real coordinates. r=h*s.
Definition cell_types.F:625
subroutine, public real_to_scaled(s, r, cell)
Transform real to scaled cell coordinates. s=h_inv*r.
Definition cell_types.F:595
subroutine, public cell_release(cell)
releases the given cell (see doc/ReferenceCounting.html)
Definition cell_types.F:668
subroutine, public cell_clone(cell_in, cell_out, tag)
Clone cell variable.
Definition cell_types.F:141
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
stores a lists of integer that are local to a processor. The idea is that these integers represent ob...
an exclusion type
subroutine, public list_control(atomic_kind_set, particle_set, local_particles, cell, fist_nonbond_env, para_env, mm_section, shell_particle_set, core_particle_set, force_update, exclusions)
...
Define the neighbor list data types and the corresponding functionality.
Generate the atomic neighbor lists for FIST.
subroutine, public build_fist_neighbor_lists(atomic_kind_set, particle_set, local_particles, cell, r_max, r_minsq, ei_scale14, vdw_scale14, nonbonded, para_env, build_from_scratch, geo_check, mm_section, full_nl, exclusions)
...
subroutine, public fist_nonbond_env_get(fist_nonbond_env, potparm14, potparm, nonbonded, rlist_cut, rlist_lowsq, aup, lup, ei_scale14, vdw_scale14, shift_cutoff, do_electrostatics, r_last_update, r_last_update_pbc, rshell_last_update_pbc, rcore_last_update_pbc, cell_last_update, num_update, last_update, counter, natom_types, long_range_correction, ij_kind_full_fac, eam_data, nequip_data, deepmd_data, ace_data, charges)
sets a fist_nonbond_env
subroutine, public fist_nonbond_env_set(fist_nonbond_env, potparm14, potparm, rlist_cut, rlist_lowsq, nonbonded, aup, lup, ei_scale14, vdw_scale14, shift_cutoff, do_electrostatics, r_last_update, r_last_update_pbc, rshell_last_update_pbc, rcore_last_update_pbc, cell_last_update, num_update, last_update, counter, natom_types, long_range_correction, eam_data, nequip_data, deepmd_data, ace_data, charges)
sets a fist_nonbond_env
objects that represent the structure of input sections and the data contained in an input section
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Interface to the message passing library MPI.
integer, parameter, public allegro_type
integer, parameter, public gal_type
integer, parameter, public nequip_type
integer, parameter, public siepmann_type
integer, parameter, public ace_type
integer, parameter, public mace_type
integer, parameter, public gal21_type
integer, parameter, public tersoff_type
Define the data structure for the particle information.
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
type of a logger, at the moment it contains just a print level starting at which level it should be l...
structure to store local (to a processor) ordered lists of integers.
A type used to store lists of exclusions and onfos.
stores all the informations relevant to an mpi environment