(git:1a29073)
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-2024 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 
17  USE atomic_kind_types, ONLY: atomic_kind_type,&
19  USE cell_methods, ONLY: cell_create
20  USE cell_types, ONLY: cell_clone,&
21  cell_release,&
22  cell_type,&
23  pbc,&
27  cp_logger_type
30  USE distribution_1d_types, ONLY: distribution_1d_type
31  USE exclusion_types, ONLY: exclusion_type
32  USE fist_neighbor_list_types, ONLY: fist_neighbor_type
36  fist_nonbond_env_type,&
37  pos_type
38  USE input_section_types, ONLY: section_vals_type,&
40  USE kinds, ONLY: dp
41  USE message_passing, ONLY: mp_para_env_type
43  gal21_type,&
44  gal_type,&
45  nequip_type,&
46  pair_potential_pp_type,&
49  USE particle_types, ONLY: particle_type
50 #include "./base/base_uses.f90"
51 
52  IMPLICIT NONE
53 
54  PRIVATE
55 
56  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'fist_neighbor_list_control'
57 
58  PUBLIC :: list_control
59 
60 !***
61 
62 CONTAINS
63 
64 ! to decide whether the neighbor list is to be updated or not
65 ! based on a displacement criterion;
66 ! if any particle has moved by 0.5*verlet_skin from the previous
67 ! list update, then the list routine is called.
68 
69 ! **************************************************************************************************
70 !> \brief ...
71 !> \param atomic_kind_set ...
72 !> \param particle_set ...
73 !> \param local_particles ...
74 !> \param cell ...
75 !> \param fist_nonbond_env ...
76 !> \param para_env ...
77 !> \param mm_section ...
78 !> \param shell_particle_set ...
79 !> \param core_particle_set ...
80 !> \param force_update ...
81 !> \param exclusions ...
82 ! **************************************************************************************************
83  SUBROUTINE list_control(atomic_kind_set, particle_set, local_particles, &
84  cell, fist_nonbond_env, para_env, mm_section, shell_particle_set, &
85  core_particle_set, force_update, exclusions)
86 
87  TYPE(atomic_kind_type), POINTER :: atomic_kind_set(:)
88  TYPE(particle_type), POINTER :: particle_set(:)
89  TYPE(distribution_1d_type), POINTER :: local_particles
90  TYPE(cell_type), POINTER :: cell
91  TYPE(fist_nonbond_env_type), POINTER :: fist_nonbond_env
92  TYPE(mp_para_env_type), POINTER :: para_env
93  TYPE(section_vals_type), POINTER :: mm_section
94  TYPE(particle_type), OPTIONAL, POINTER :: shell_particle_set(:), &
95  core_particle_set(:)
96  LOGICAL, INTENT(IN), OPTIONAL :: force_update
97  TYPE(exclusion_type), DIMENSION(:), OPTIONAL :: exclusions
98 
99  CHARACTER(LEN=*), PARAMETER :: routinen = 'list_control'
100 
101  INTEGER :: counter, handle, ikind, iparticle, iparticle_kind, iparticle_local, ishell, &
102  jkind, last_update, nparticle, nparticle_kind, nparticle_local, nshell, num_update, &
103  output_unit
104  LOGICAL :: build_from_scratch, geo_check, &
105  shell_adiabatic, shell_present, &
106  update_neighbor_lists
107  LOGICAL, DIMENSION(:, :), POINTER :: full_nl
108  REAL(kind=dp) :: aup, dr2, dr2_max, ei_scale14, lup, &
109  vdw_scale14, verlet_skin
110  REAL(kind=dp), DIMENSION(3) :: dr, rab, rab_last_update, s, s2r
111  REAL(kind=dp), DIMENSION(:, :), POINTER :: rlist_cut, rlist_lowsq
112  TYPE(cell_type), POINTER :: cell_last_update
113  TYPE(cp_logger_type), POINTER :: logger
114  TYPE(fist_neighbor_type), POINTER :: nonbonded
115  TYPE(pair_potential_pp_type), POINTER :: potparm
116  TYPE(pos_type), DIMENSION(:), POINTER :: r_last_update, r_last_update_pbc, &
117  rcore_last_update_pbc, &
118  rshell_last_update_pbc
119 
120  CALL timeset(routinen, handle)
121  NULLIFY (logger)
122  logger => cp_get_default_logger()
123 
124  ! *** Assigning local pointers ***
125  CALL fist_nonbond_env_get(fist_nonbond_env, &
126  nonbonded=nonbonded, &
127  rlist_cut=rlist_cut, &
128  rlist_lowsq=rlist_lowsq, &
129  aup=aup, &
130  lup=lup, &
131  ei_scale14=ei_scale14, &
132  vdw_scale14=vdw_scale14, &
133  counter=counter, &
134  r_last_update=r_last_update, &
135  r_last_update_pbc=r_last_update_pbc, &
136  rshell_last_update_pbc=rshell_last_update_pbc, &
137  rcore_last_update_pbc=rcore_last_update_pbc, &
138  cell_last_update=cell_last_update, &
139  num_update=num_update, &
140  potparm=potparm, &
141  last_update=last_update)
142 
143  nparticle = SIZE(particle_set)
144  nparticle_kind = SIZE(atomic_kind_set)
145  nshell = 0
146  CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, &
147  shell_present=shell_present, shell_adiabatic=shell_adiabatic)
148  IF (shell_present) THEN
149  nshell = SIZE(shell_particle_set)
150  END IF
151 
152  ! *** Check, if the neighbor lists have to be built or updated ***
153  update_neighbor_lists = .false.
154  CALL section_vals_val_get(mm_section, "NEIGHBOR_LISTS%NEIGHBOR_LISTS_FROM_SCRATCH", &
155  l_val=build_from_scratch)
156  CALL section_vals_val_get(mm_section, "NEIGHBOR_LISTS%GEO_CHECK", &
157  l_val=geo_check)
158  IF (ASSOCIATED(r_last_update)) THEN
159  ! Determine the maximum of the squared displacement, compared to
160  ! r_last_update.
161  CALL section_vals_val_get(mm_section, "NEIGHBOR_LISTS%VERLET_SKIN", &
162  r_val=verlet_skin)
163  dr2_max = 0.0_dp
164  DO iparticle_kind = 1, nparticle_kind
165  nparticle_local = local_particles%n_el(iparticle_kind)
166  DO iparticle_local = 1, nparticle_local
167  iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
168  s2r = r_last_update(iparticle)%r
169  s = particle_set(iparticle)%r(:)
170  dr(:) = s2r - s
171  dr2 = dr(1)*dr(1) + dr(2)*dr(2) + dr(3)*dr(3)
172  dr2_max = max(dr2_max, dr2)
173  END DO
174  END DO
175 
176  CALL para_env%max(dr2_max)
177 
178  ! If the maximum distplacement is too large, ...
179  IF (dr2_max > 0.25_dp*verlet_skin**2 .OR. build_from_scratch) THEN
180  DO iparticle = 1, nparticle
181  r_last_update(iparticle)%r = particle_set(iparticle)%r(:)
182  END DO
183  update_neighbor_lists = .true.
184  END IF
185  ELSE
186  ! There is no r_last_update to compare with. Neighbor lists from scratch.
187  ALLOCATE (r_last_update(nparticle))
188  DO iparticle = 1, nparticle
189  r_last_update(iparticle)%r = particle_set(iparticle)%r(:)
190  END DO
191 
192  update_neighbor_lists = .true.
193  build_from_scratch = .true.
194  END IF
195  ! Force Update
196  IF (PRESENT(force_update)) THEN
197  IF (force_update) update_neighbor_lists = .true.
198  END IF
199 
200  ! Allocate the r_last_update_pbc, rshell_last_update_pbc, rcore_last_update_pbc
201  IF (.NOT. ASSOCIATED(r_last_update_pbc)) THEN
202  ALLOCATE (r_last_update_pbc(nparticle))
203  END IF
204  IF (shell_present .AND. .NOT. ASSOCIATED(rshell_last_update_pbc)) THEN
205  ALLOCATE (rshell_last_update_pbc(nshell))
206  END IF
207  IF (shell_present .AND. .NOT. ASSOCIATED(rcore_last_update_pbc)) THEN
208  ALLOCATE (rcore_last_update_pbc(nshell))
209  END IF
210 
211  ! update the neighbor lists
212  IF (update_neighbor_lists) THEN
213  ! determine which pairs of atom kinds need full neighbor lists. Full
214  ! means that atom a is in the neighbor list of atom b and vice versa.
215  ALLOCATE (full_nl(nparticle_kind, nparticle_kind))
216  IF (ASSOCIATED(potparm)) THEN
217  DO ikind = 1, nparticle_kind
218  DO jkind = ikind, nparticle_kind
219  full_nl(ikind, jkind) = .false.
220  IF (any(potparm%pot(ikind, jkind)%pot%type == tersoff_type)) THEN
221  full_nl(ikind, jkind) = .true.
222  END IF
223  IF (any(potparm%pot(ikind, jkind)%pot%type == siepmann_type)) THEN
224  full_nl(ikind, jkind) = .true.
225  END IF
226  IF (any(potparm%pot(ikind, jkind)%pot%type == gal_type)) THEN
227  full_nl(ikind, jkind) = .true.
228  END IF
229  IF (any(potparm%pot(ikind, jkind)%pot%type == gal21_type)) THEN
230  full_nl(ikind, jkind) = .true.
231  END IF
232  IF (any(potparm%pot(ikind, jkind)%pot%type == nequip_type)) THEN
233  full_nl(ikind, jkind) = .true.
234  END IF
235  IF (any(potparm%pot(ikind, jkind)%pot%type == allegro_type)) THEN
236  full_nl(ikind, jkind) = .true.
237  END IF
238  full_nl(jkind, ikind) = full_nl(ikind, jkind)
239  END DO
240  END DO
241  ELSE
242  full_nl = .false.
243  END IF
244  CALL build_fist_neighbor_lists(atomic_kind_set, particle_set, &
245  local_particles, cell, rlist_cut, rlist_lowsq, ei_scale14, &
246  vdw_scale14, nonbonded, para_env, &
247  build_from_scratch=build_from_scratch, geo_check=geo_check, &
248  mm_section=mm_section, full_nl=full_nl, &
249  exclusions=exclusions)
250 
251  CALL cell_release(cell_last_update)
252  CALL cell_create(cell_last_update)
253  CALL cell_clone(cell, cell_last_update)
254 
255  IF (counter > 0) THEN
256  num_update = num_update + 1
257  lup = counter + 1 - last_update
258  last_update = counter + 1
259  aup = aup + (lup - aup)/real(num_update, kind=dp)
260  ELSE
261  num_update = 0
262  lup = 0
263  last_update = 1
264  aup = 0.0_dp
265  END IF
266 
267  CALL fist_nonbond_env_set(fist_nonbond_env, &
268  lup=lup, &
269  aup=aup, &
270  r_last_update=r_last_update, &
271  r_last_update_pbc=r_last_update_pbc, &
272  rshell_last_update_pbc=rshell_last_update_pbc, &
273  rcore_last_update_pbc=rcore_last_update_pbc, &
274  nonbonded=nonbonded, &
275  num_update=num_update, &
276  last_update=last_update, &
277  cell_last_update=cell_last_update)
278 
279  output_unit = cp_print_key_unit_nr(logger, mm_section, "PRINT%NEIGHBOR_LISTS", &
280  extension=".mmLog")
281  IF (output_unit > 0) THEN
282  WRITE (unit=output_unit, &
283  fmt="(/,T2,A,/,T52,A,/,A,T31,A,T49,2(1X,F15.2),/,T2,A,/)") &
284  repeat("*", 79), "INSTANTANEOUS AVERAGES", &
285  " LIST UPDATES[steps]", "= ", lup, aup, repeat("*", 79)
286  END IF
287  CALL cp_print_key_finished_output(output_unit, logger, mm_section, &
288  "PRINT%NEIGHBOR_LISTS")
289  DEALLOCATE (full_nl)
290  END IF
291 
292  ! Store particle positions after the last update, translated to the
293  ! primitive cell, in r_last_update_pbc.
294  DO iparticle = 1, nparticle
295  ! The pbc algorithm is sensitive to numeric noise and compiler optimization because of ANINT.
296  ! Therefore we need to call here exactly the same routine as in build_neighbor_lists.
297  rab_last_update = pbc(r_last_update(iparticle)%r, cell_last_update) - r_last_update(iparticle)%r
298  CALL real_to_scaled(s, rab_last_update, cell_last_update)
299  CALL scaled_to_real(rab, s, cell)
300 
301  r_last_update_pbc(iparticle)%r = particle_set(iparticle)%r + rab
302  ! Use the same translation for core and shell.
303  ishell = particle_set(iparticle)%shell_index
304  IF (ishell /= 0) THEN
305  rshell_last_update_pbc(ishell)%r = rab + shell_particle_set(ishell)%r(:)
306  IF (shell_adiabatic) THEN
307  rcore_last_update_pbc(ishell)%r = rab + core_particle_set(ishell)%r(:)
308  ELSE
309  rcore_last_update_pbc(ishell)%r = r_last_update_pbc(iparticle)%r(:)
310  END IF
311  END IF
312  END DO
313 
314  counter = counter + 1
315  CALL fist_nonbond_env_set(fist_nonbond_env, counter=counter)
316  CALL timestop(handle)
317 
318  END SUBROUTINE list_control
319 
subroutine pbc(r, r_pbc, s, s_pbc, a, b, c, alpha, beta, gamma, debug, info, pbc0, h, hinv)
...
Definition: dumpdcd.F:1203
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.
Definition: cell_methods.F:15
subroutine, public cell_create(cell, hmat, periodic, tag)
allocates and initializes a cell
Definition: cell_methods.F:85
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:516
subroutine, public real_to_scaled(s, r, cell)
Transform real to scaled cell coordinates. s=h_inv*r.
Definition: cell_types.F:486
subroutine, public cell_release(cell)
releases the given cell (see doc/ReferenceCounting.html)
Definition: cell_types.F:559
subroutine, public cell_clone(cell_in, cell_out, tag)
Clone cell variable.
Definition: cell_types.F:107
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, quip_data, nequip_data, allegro_data, deepmd_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, quip_data, nequip_data, allegro_data, deepmd_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 gal21_type
integer, parameter, public tersoff_type
Define the data structure for the particle information.