(git:e5b1968)
Loading...
Searching...
No Matches
fist_nonbond_env_types.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2025 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!> \author HAF
12! **************************************************************************************************
17 USE cell_types, ONLY: cell_release,&
23 USE kinds, ONLY: default_string_length,&
24 dp
27 gal_type,&
35#include "./base/base_uses.f90"
36
37 IMPLICIT NONE
38 PRIVATE
39
40 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'fist_nonbond_env_types'
46
47! **************************************************************************************************
49 REAL(kind=dp) :: r(3) = 0.0_dp
50 END TYPE
51
53 REAL(kind=dp) :: f_embed = 0.0_dp
54 REAL(kind=dp) :: rho = 0.0_dp
55 END TYPE
56
58 INTEGER, POINTER :: use_indices(:) => null()
59 REAL(kind=dp), POINTER :: force(:, :) => null()
60 REAL(kind=dp) :: virial(3, 3) = 0.0_dp
61 END TYPE
62
64 INTEGER, POINTER :: use_indices(:) => null()
65 REAL(kind=dp), POINTER :: force(:, :) => null()
66 REAL(kind=dp) :: virial(3, 3) = 0.0_dp
67 TYPE(torch_model_type) :: model
68 END TYPE
69
71 INTEGER, POINTER :: use_indices(:) => null()
72 REAL(kind=dp), POINTER :: force(:, :) => null()
73 REAL(kind=dp) :: virial(3, 3) = 0.0_dp
74 TYPE(torch_model_type) :: model
75 END TYPE
76
78 INTEGER, POINTER :: use_indices(:) => null()
79 REAL(kind=dp), POINTER :: force(:, :) => null()
80 REAL(kind=dp) :: virial(3, 3) = 0.0_dp
81 TYPE(deepmd_model_type) :: model
82 END TYPE
83
85 INTEGER, ALLOCATABLE :: use_indices(:)
86 INTEGER, ALLOCATABLE :: inverse_index_map(:)
87 INTEGER :: natom = 0
88 INTEGER :: nghost = 0
89 INTEGER :: refupdate = 0
90 INTEGER :: nei = 0
91 INTEGER, ALLOCATABLE :: uctype(:)
92 INTEGER, ALLOCATABLE :: attype(:)
93 INTEGER, ALLOCATABLE :: origin(:)
94 INTEGER, ALLOCATABLE :: shift(:, :)
95 INTEGER, ALLOCATABLE :: neiat(:)
96 INTEGER, ALLOCATABLE :: nlist(:)
97 REAL(kind=dp), ALLOCATABLE :: force(:, :)
98 REAL(kind=dp), ALLOCATABLE :: atpos(:, :)
99 REAL(kind=dp) :: virial(3, 3) = 0.0_dp
100 TYPE(ace_model_type) :: model
101 END TYPE
102
103! **************************************************************************************************
105 INTEGER :: natom_types = -1
106 INTEGER :: counter = -1
107 INTEGER :: last_update = -1
108 INTEGER :: num_update = -1
109 LOGICAL :: do_nonbonded = .false.
110 LOGICAL :: do_electrostatics = .false.
111 LOGICAL :: shift_cutoff = .false.
112 CHARACTER(len=default_string_length) :: unit_type = ""
113 REAL(kind=dp) :: lup = 0.0_dp
114 REAL(kind=dp) :: aup = 0.0_dp
115 REAL(kind=dp) :: ei_scale14 = 0.0_dp
116 REAL(kind=dp) :: vdw_scale14 = 0.0_dp
117 REAL(kind=dp) :: long_range_correction = 0.0_dp
118 REAL(kind=dp), DIMENSION(:, :), POINTER :: rlist_cut => null()
119 REAL(kind=dp), DIMENSION(:, :), POINTER :: rlist_lowsq => null()
120 REAL(kind=dp), DIMENSION(:, :), POINTER :: ij_kind_full_fac => null()
121 REAL(kind=dp), DIMENSION(:), POINTER :: charges => null()
122 TYPE(fist_neighbor_type), POINTER :: nonbonded => null()
123 TYPE(pair_potential_pp_type), POINTER :: potparm14 => null()
124 TYPE(pair_potential_pp_type), POINTER :: potparm => null()
125 TYPE(cell_type), POINTER :: cell_last_update => null()
126 TYPE(pos_type), DIMENSION(:), POINTER :: r_last_update => null()
127 TYPE(pos_type), DIMENSION(:), POINTER :: r_last_update_pbc => null()
128 TYPE(pos_type), DIMENSION(:), POINTER :: rshell_last_update_pbc => null()
129 TYPE(pos_type), DIMENSION(:), POINTER :: rcore_last_update_pbc => null()
130 TYPE(eam_type), DIMENSION(:), POINTER :: eam_data => null()
131 TYPE(quip_data_type), POINTER :: quip_data => null()
132 TYPE(deepmd_data_type), POINTER :: deepmd_data => null()
133 TYPE(ace_data_type), POINTER :: ace_data => null()
134 TYPE(nequip_data_type), POINTER :: nequip_data => null()
135 TYPE(allegro_data_type), POINTER :: allegro_data => null()
136 END TYPE fist_nonbond_env_type
137
138CONTAINS
139
140! **************************************************************************************************
141!> \brief sets a fist_nonbond_env
142!> \param fist_nonbond_env the object to create
143!> \param potparm14 ...
144!> \param potparm ...
145!> \param nonbonded ...
146!> \param rlist_cut ...
147!> \param rlist_lowsq ...
148!> \param aup ...
149!> \param lup ...
150!> \param ei_scale14 ...
151!> \param vdw_scale14 ...
152!> \param shift_cutoff ...
153!> \param do_electrostatics ...
154!> \param r_last_update ...
155!> \param r_last_update_pbc ...
156!> \param rshell_last_update_pbc ...
157!> \param rcore_last_update_pbc ...
158!> \param cell_last_update ...
159!> \param num_update ...
160!> \param last_update ...
161!> \param counter ...
162!> \param natom_types ...
163!> \param long_range_correction ...
164!> \param ij_kind_full_fac ...
165!> \param eam_data ...
166!> \param quip_data ...
167!> \param nequip_data ...
168!> \param allegro_data ...
169!> \param deepmd_data ...
170!> \param ace_data ...
171!> \param charges ...
172!> \par History
173!> 12.2002 created [fawzi]
174!> \author Fawzi Mohamed
175! **************************************************************************************************
176 SUBROUTINE fist_nonbond_env_get(fist_nonbond_env, potparm14, potparm, &
177 nonbonded, rlist_cut, rlist_lowsq, aup, lup, ei_scale14, vdw_scale14, &
178 shift_cutoff, do_electrostatics, r_last_update, r_last_update_pbc, rshell_last_update_pbc, &
179 rcore_last_update_pbc, cell_last_update, num_update, last_update, &
180 counter, natom_types, long_range_correction, ij_kind_full_fac, eam_data, &
181 quip_data, nequip_data, allegro_data, deepmd_data, ace_data, charges)
182
183 TYPE(fist_nonbond_env_type), INTENT(IN) :: fist_nonbond_env
184 TYPE(pair_potential_pp_type), OPTIONAL, POINTER :: potparm14, potparm
185 TYPE(fist_neighbor_type), OPTIONAL, POINTER :: nonbonded
186 REAL(kind=dp), DIMENSION(:, :), OPTIONAL, POINTER :: rlist_cut, rlist_lowsq
187 REAL(kind=dp), OPTIONAL :: aup, lup, ei_scale14, vdw_scale14
188 LOGICAL, INTENT(OUT), OPTIONAL :: shift_cutoff, do_electrostatics
189 TYPE(pos_type), DIMENSION(:), OPTIONAL, POINTER :: r_last_update, r_last_update_pbc, &
190 rshell_last_update_pbc, &
191 rcore_last_update_pbc
192 TYPE(cell_type), OPTIONAL, POINTER :: cell_last_update
193 INTEGER, OPTIONAL :: num_update, last_update, counter, &
194 natom_types
195 REAL(kind=dp), OPTIONAL :: long_range_correction
196 REAL(kind=dp), DIMENSION(:, :), OPTIONAL, POINTER :: ij_kind_full_fac
197 TYPE(eam_type), DIMENSION(:), OPTIONAL, POINTER :: eam_data
198 TYPE(quip_data_type), OPTIONAL, POINTER :: quip_data
199 TYPE(nequip_data_type), OPTIONAL, POINTER :: nequip_data
200 TYPE(allegro_data_type), OPTIONAL, POINTER :: allegro_data
201 TYPE(deepmd_data_type), OPTIONAL, POINTER :: deepmd_data
202 TYPE(ace_data_type), OPTIONAL, POINTER :: ace_data
203 REAL(kind=dp), DIMENSION(:), OPTIONAL, POINTER :: charges
204
205 IF (PRESENT(charges)) charges => fist_nonbond_env%charges
206 IF (PRESENT(potparm14)) potparm14 => fist_nonbond_env%potparm14
207 IF (PRESENT(eam_data)) eam_data => fist_nonbond_env%eam_data
208 IF (PRESENT(quip_data)) quip_data => fist_nonbond_env%quip_data
209 IF (PRESENT(nequip_data)) nequip_data => fist_nonbond_env%nequip_data
210 IF (PRESENT(allegro_data)) allegro_data => fist_nonbond_env%allegro_data
211 IF (PRESENT(deepmd_data)) deepmd_data => fist_nonbond_env%deepmd_data
212 IF (PRESENT(ace_data)) ace_data => fist_nonbond_env%ace_data
213 IF (PRESENT(potparm)) potparm => fist_nonbond_env%potparm
214 IF (PRESENT(rlist_cut)) rlist_cut => fist_nonbond_env%rlist_cut
215 IF (PRESENT(rlist_lowsq)) rlist_lowsq => fist_nonbond_env%rlist_lowsq
216 IF (PRESENT(ij_kind_full_fac)) ij_kind_full_fac => fist_nonbond_env%ij_kind_full_fac
217 IF (PRESENT(nonbonded)) nonbonded => fist_nonbond_env%nonbonded
218 IF (PRESENT(r_last_update)) &
219 r_last_update => fist_nonbond_env%r_last_update
220 IF (PRESENT(r_last_update_pbc)) &
221 r_last_update_pbc => fist_nonbond_env%r_last_update_pbc
222 IF (PRESENT(rshell_last_update_pbc)) &
223 rshell_last_update_pbc => fist_nonbond_env%rshell_last_update_pbc
224 IF (PRESENT(rcore_last_update_pbc)) &
225 rcore_last_update_pbc => fist_nonbond_env%rcore_last_update_pbc
226 IF (PRESENT(cell_last_update)) &
227 cell_last_update => fist_nonbond_env%cell_last_update
228 IF (PRESENT(lup)) lup = fist_nonbond_env%lup
229 IF (PRESENT(aup)) aup = fist_nonbond_env%aup
230 IF (PRESENT(ei_scale14)) ei_scale14 = fist_nonbond_env%ei_scale14
231 IF (PRESENT(vdw_scale14)) vdw_scale14 = fist_nonbond_env%vdw_scale14
232 IF (PRESENT(shift_cutoff)) &
233 shift_cutoff = fist_nonbond_env%shift_cutoff
234 IF (PRESENT(do_electrostatics)) do_electrostatics = fist_nonbond_env%do_electrostatics
235 IF (PRESENT(natom_types)) natom_types = fist_nonbond_env%natom_types
236 IF (PRESENT(counter)) counter = fist_nonbond_env%counter
237 IF (PRESENT(last_update)) last_update = fist_nonbond_env%last_update
238 IF (PRESENT(num_update)) num_update = fist_nonbond_env%num_update
239 IF (PRESENT(long_range_correction)) &
240 long_range_correction = fist_nonbond_env%long_range_correction
241 END SUBROUTINE fist_nonbond_env_get
242
243! **************************************************************************************************
244!> \brief sets a fist_nonbond_env
245!> \param fist_nonbond_env the object to create
246!> \param potparm14 ...
247!> \param potparm ...
248!> \param rlist_cut ...
249!> \param rlist_lowsq ...
250!> \param nonbonded ...
251!> \param aup ...
252!> \param lup ...
253!> \param ei_scale14 ...
254!> \param vdw_scale14 ...
255!> \param shift_cutoff ...
256!> \param do_electrostatics ...
257!> \param r_last_update ...
258!> \param r_last_update_pbc ...
259!> \param rshell_last_update_pbc ...
260!> \param rcore_last_update_pbc ...
261!> \param cell_last_update ...
262!> \param num_update ...
263!> \param last_update ...
264!> \param counter ...
265!> \param natom_types ...
266!> \param long_range_correction ...
267!> \param eam_data ...
268!> \param quip_data ...
269!> \param nequip_data ...
270!> \param allegro_data ...
271!> \param deepmd_data ...
272!> \param ace_data ...
273!> \param charges ...
274!> \par History
275!> 12.2002 created [fawzi]
276!> \author Fawzi Mohamed
277! **************************************************************************************************
278 SUBROUTINE fist_nonbond_env_set(fist_nonbond_env, potparm14, potparm, &
279 rlist_cut, rlist_lowsq, nonbonded, aup, lup, ei_scale14, vdw_scale14, &
280 shift_cutoff, do_electrostatics, r_last_update, r_last_update_pbc, rshell_last_update_pbc, &
281 rcore_last_update_pbc, cell_last_update, num_update, last_update, &
282 counter, natom_types, long_range_correction, eam_data, quip_data, &
283 nequip_data, allegro_data, deepmd_data, ace_data, charges)
284
285 TYPE(fist_nonbond_env_type), INTENT(INOUT) :: fist_nonbond_env
286 TYPE(pair_potential_pp_type), OPTIONAL, POINTER :: potparm14, potparm
287 REAL(kind=dp), DIMENSION(:, :), OPTIONAL, POINTER :: rlist_cut, rlist_lowsq
288 TYPE(fist_neighbor_type), OPTIONAL, POINTER :: nonbonded
289 REAL(kind=dp), OPTIONAL :: aup, lup, ei_scale14, vdw_scale14
290 LOGICAL, INTENT(IN), OPTIONAL :: shift_cutoff, do_electrostatics
291 TYPE(pos_type), DIMENSION(:), OPTIONAL, POINTER :: r_last_update, r_last_update_pbc, &
292 rshell_last_update_pbc, &
293 rcore_last_update_pbc
294 TYPE(cell_type), OPTIONAL, POINTER :: cell_last_update
295 INTEGER, OPTIONAL :: num_update, last_update, counter, &
296 natom_types
297 REAL(kind=dp), OPTIONAL :: long_range_correction
298 TYPE(eam_type), DIMENSION(:), OPTIONAL, POINTER :: eam_data
299 TYPE(quip_data_type), OPTIONAL, POINTER :: quip_data
300 TYPE(nequip_data_type), OPTIONAL, POINTER :: nequip_data
301 TYPE(allegro_data_type), OPTIONAL, POINTER :: allegro_data
302 TYPE(deepmd_data_type), OPTIONAL, POINTER :: deepmd_data
303 TYPE(ace_data_type), OPTIONAL, POINTER :: ace_data
304 REAL(kind=dp), DIMENSION(:), OPTIONAL, POINTER :: charges
305
306 IF (PRESENT(potparm14)) fist_nonbond_env%potparm14 => potparm14
307 IF (PRESENT(eam_data)) fist_nonbond_env%eam_data => eam_data
308 IF (PRESENT(quip_data)) fist_nonbond_env%quip_data => quip_data
309 IF (PRESENT(nequip_data)) fist_nonbond_env%nequip_data => nequip_data
310 IF (PRESENT(allegro_data)) fist_nonbond_env%allegro_data => allegro_data
311 IF (PRESENT(deepmd_data)) fist_nonbond_env%deepmd_data => deepmd_data
312 IF (PRESENT(ace_data)) fist_nonbond_env%ace_data => ace_data
313 IF (PRESENT(potparm)) fist_nonbond_env%potparm => potparm
314 IF (PRESENT(rlist_cut)) fist_nonbond_env%rlist_cut => rlist_cut
315 IF (PRESENT(charges)) fist_nonbond_env%charges => charges
316 IF (PRESENT(rlist_lowsq)) fist_nonbond_env%rlist_lowsq => rlist_lowsq
317 IF (PRESENT(nonbonded)) fist_nonbond_env%nonbonded => nonbonded
318 IF (PRESENT(r_last_update)) &
319 fist_nonbond_env%r_last_update => r_last_update
320 IF (PRESENT(r_last_update_pbc)) &
321 fist_nonbond_env%r_last_update_pbc => r_last_update_pbc
322 IF (PRESENT(rshell_last_update_pbc)) &
323 fist_nonbond_env%rshell_last_update_pbc => rshell_last_update_pbc
324 IF (PRESENT(rcore_last_update_pbc)) &
325 fist_nonbond_env%rcore_last_update_pbc => rcore_last_update_pbc
326 IF (PRESENT(cell_last_update)) &
327 fist_nonbond_env%cell_last_update => cell_last_update
328 IF (PRESENT(lup)) fist_nonbond_env%lup = lup
329 IF (PRESENT(aup)) fist_nonbond_env%aup = aup
330 IF (PRESENT(ei_scale14)) fist_nonbond_env%ei_scale14 = ei_scale14
331 IF (PRESENT(vdw_scale14)) fist_nonbond_env%vdw_scale14 = vdw_scale14
332 IF (PRESENT(shift_cutoff)) &
333 fist_nonbond_env%shift_cutoff = shift_cutoff
334 IF (PRESENT(do_electrostatics)) fist_nonbond_env%do_electrostatics = do_electrostatics
335 IF (PRESENT(natom_types)) fist_nonbond_env%natom_types = natom_types
336 IF (PRESENT(counter)) fist_nonbond_env%counter = counter
337 IF (PRESENT(last_update)) fist_nonbond_env%last_update = last_update
338 IF (PRESENT(num_update)) fist_nonbond_env%num_update = num_update
339 IF (PRESENT(long_range_correction)) &
340 fist_nonbond_env%long_range_correction = long_range_correction
341 END SUBROUTINE fist_nonbond_env_set
342
343! **************************************************************************************************
344!> \brief allocates and intitializes a fist_nonbond_env
345!> \param fist_nonbond_env the object to create
346!> \param atomic_kind_set ...
347!> \param potparm14 ...
348!> \param potparm ...
349!> \param do_nonbonded ...
350!> \param do_electrostatics ...
351!> \param verlet_skin ...
352!> \param ewald_rcut ...
353!> \param ei_scale14 ...
354!> \param vdw_scale14 ...
355!> \param shift_cutoff ...
356!> \par History
357!> 12.2002 created [fawzi]
358!> \author Fawzi Mohamed
359! **************************************************************************************************
360 SUBROUTINE fist_nonbond_env_create(fist_nonbond_env, atomic_kind_set, &
361 potparm14, potparm, do_nonbonded, do_electrostatics, verlet_skin, ewald_rcut, &
362 ei_scale14, vdw_scale14, shift_cutoff)
363 TYPE(fist_nonbond_env_type), INTENT(OUT) :: fist_nonbond_env
364 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
365 TYPE(pair_potential_pp_type), OPTIONAL, POINTER :: potparm14, potparm
366 LOGICAL, INTENT(IN) :: do_nonbonded, do_electrostatics
367 REAL(kind=dp), INTENT(IN) :: verlet_skin, ewald_rcut, ei_scale14, &
368 vdw_scale14
369 LOGICAL, INTENT(IN) :: shift_cutoff
370
371 NULLIFY (fist_nonbond_env%potparm14)
372 NULLIFY (fist_nonbond_env%potparm)
373 NULLIFY (fist_nonbond_env%rlist_cut)
374 NULLIFY (fist_nonbond_env%rlist_lowsq)
375 NULLIFY (fist_nonbond_env%ij_kind_full_fac)
376 NULLIFY (fist_nonbond_env%nonbonded)
377 NULLIFY (fist_nonbond_env%cell_last_update)
378 NULLIFY (fist_nonbond_env%r_last_update)
379 NULLIFY (fist_nonbond_env%r_last_update_pbc)
380 NULLIFY (fist_nonbond_env%rshell_last_update_pbc)
381 NULLIFY (fist_nonbond_env%rcore_last_update_pbc)
382 NULLIFY (fist_nonbond_env%eam_data)
383 NULLIFY (fist_nonbond_env%quip_data)
384 NULLIFY (fist_nonbond_env%nequip_data)
385 NULLIFY (fist_nonbond_env%allegro_data)
386 NULLIFY (fist_nonbond_env%deepmd_data)
387 NULLIFY (fist_nonbond_env%ace_data)
388 NULLIFY (fist_nonbond_env%charges)
389 CALL init_fist_nonbond_env(fist_nonbond_env, atomic_kind_set, potparm14, &
390 potparm, do_nonbonded, do_electrostatics, verlet_skin, ewald_rcut, ei_scale14, &
391 vdw_scale14, shift_cutoff)
392 END SUBROUTINE fist_nonbond_env_create
393
394! **************************************************************************************************
395!> \brief Purpose: Initialise the FIST nonbond environment.
396!> \param fist_nonbond_env the object to create
397!> \param atomic_kind_set ...
398!> \param potparm14 ...
399!> \param potparm ...
400!> \param do_nonbonded ...
401!> \param do_electrostatics ...
402!> \param verlet_skin ...
403!> \param ewald_rcut ...
404!> \param ei_scale14 ...
405!> \param vdw_scale14 ...
406!> \param shift_cutoff ...
407! **************************************************************************************************
408 SUBROUTINE init_fist_nonbond_env(fist_nonbond_env, atomic_kind_set, &
409 potparm14, potparm, do_nonbonded, do_electrostatics, verlet_skin, ewald_rcut, ei_scale14, &
410 vdw_scale14, shift_cutoff)
411
412 TYPE(fist_nonbond_env_type), INTENT(INOUT) :: fist_nonbond_env
413 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
414 TYPE(pair_potential_pp_type), OPTIONAL, POINTER :: potparm14, potparm
415 LOGICAL, INTENT(IN) :: do_nonbonded, do_electrostatics
416 REAL(kind=dp), INTENT(IN) :: verlet_skin, ewald_rcut, ei_scale14, &
417 vdw_scale14
418 LOGICAL, INTENT(IN) :: shift_cutoff
419
420 INTEGER :: idim, jdim, natom_types
421 LOGICAL :: check, use_potparm, use_potparm14
422 REAL(kind=dp) :: fac, rcut, rlow
423
424 use_potparm14 = PRESENT(potparm14)
425 IF (use_potparm14) use_potparm14 = use_potparm14 .OR. ASSOCIATED(potparm14)
426 use_potparm = PRESENT(potparm)
427 IF (use_potparm) use_potparm = use_potparm .OR. ASSOCIATED(potparm)
428 NULLIFY (fist_nonbond_env%nonbonded)
429 NULLIFY (fist_nonbond_env%r_last_update)
430 NULLIFY (fist_nonbond_env%r_last_update_pbc)
431 NULLIFY (fist_nonbond_env%rshell_last_update_pbc)
432 NULLIFY (fist_nonbond_env%rcore_last_update_pbc)
433 NULLIFY (fist_nonbond_env%cell_last_update)
434 NULLIFY (fist_nonbond_env%rlist_cut)
435 NULLIFY (fist_nonbond_env%rlist_lowsq)
436 NULLIFY (fist_nonbond_env%ij_kind_full_fac)
437 fist_nonbond_env%unit_type = "ANGSTROM"
438 fist_nonbond_env%do_nonbonded = do_nonbonded
439 fist_nonbond_env%do_electrostatics = do_electrostatics
440 fist_nonbond_env%lup = 0
441 fist_nonbond_env%aup = 0
442 fist_nonbond_env%ei_scale14 = ei_scale14
443 fist_nonbond_env%vdw_scale14 = vdw_scale14
444 fist_nonbond_env%shift_cutoff = shift_cutoff
445 fist_nonbond_env%counter = 0
446 fist_nonbond_env%last_update = 0
447 fist_nonbond_env%num_update = 0
448 fist_nonbond_env%long_range_correction = 0
449 IF (do_nonbonded) THEN
450 natom_types = 1
451 ! Determine size of kind arrays
452 natom_types = SIZE(atomic_kind_set)
453 IF (use_potparm14) THEN
454 check = (SIZE(potparm14%pot, 1) == natom_types)
455 cpassert(check)
456 END IF
457 IF (use_potparm) THEN
458 check = (SIZE(potparm%pot, 1) == natom_types)
459 cpassert(check)
460 END IF
461 ALLOCATE (fist_nonbond_env%rlist_cut(natom_types, natom_types))
462 ALLOCATE (fist_nonbond_env%rlist_lowsq(natom_types, natom_types))
463 ALLOCATE (fist_nonbond_env%ij_kind_full_fac(natom_types, natom_types))
464 fist_nonbond_env%ij_kind_full_fac = 1.0_dp
465 DO idim = 1, natom_types
466 DO jdim = idim, natom_types
467 IF ((use_potparm) .OR. (use_potparm14)) THEN
468 IF (use_potparm) THEN
469 rcut = sqrt(potparm%pot(idim, jdim)%pot%rcutsq)
470 fac = potparm%pot(idim, jdim)%pot%spl_f%rscale(1)
471 rlow = fac/(potparm%pot(idim, jdim)%pot%pair_spline_data(1)%spline_data%xn)
472 ELSE
473 rcut = sqrt(potparm14%pot(idim, jdim)%pot%rcutsq)
474 fac = potparm14%pot(idim, jdim)%pot%spl_f%rscale(1)
475 rlow = fac/(potparm14%pot(idim, jdim)%pot%pair_spline_data(1)%spline_data%xn)
476 END IF
477 ! Warning: rlist_rcut should only be used by the neighbor list
478 ! algorithm. It is not the cutoff for the evaluation of the
479 ! interactions because rlist_rcut includes the Verlet skin.
480 rcut = max(rcut, ewald_rcut) + verlet_skin
481 fist_nonbond_env%rlist_cut(idim, jdim) = rcut
482 fist_nonbond_env%rlist_cut(jdim, idim) = rcut
483 rlow = rlow*(1.06_dp)**2 ! 1.06_dp in order to have 1/2 Emax_spline
484 fist_nonbond_env%rlist_lowsq(idim, jdim) = rlow
485 fist_nonbond_env%rlist_lowsq(jdim, idim) = rlow
486 ! In case of manybody potential the neighbor list will be full.
487 ! This means that for each atom pair (a,b) of the current types,
488 ! atom a is in the neighbor list of b and b is in the neighbor
489 ! list of a. ij_kind_full_fac is used to correct for the double
490 ! counting in the conventional pair potentials cause by this
491 ! situation.
492 IF (any(potparm%pot(idim, jdim)%pot%type == tersoff_type)) THEN
493 ! TODO: what if 14 is not of tersoff type while the normal
494 ! nonbond is? (or the reverse). We'd better impose
495 ! consistency.
496 fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
497 fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
498 END IF
499 IF (any(potparm%pot(idim, jdim)%pot%type == siepmann_type)) THEN
500 ! TODO:see tersoff_type
501 fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
502 fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
503 END IF
504 IF (any(potparm%pot(idim, jdim)%pot%type == ace_type)) THEN
505 fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
506 fist_nonbond_env%ij_kind_full_fac(jdim, idim) = 0.5_dp
507 END IF
508 IF (any(potparm%pot(idim, jdim)%pot%type == gal_type)) THEN
509 fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
510 fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
511 END IF
512 IF (any(potparm%pot(idim, jdim)%pot%type == gal21_type)) THEN
513 fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
514 fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
515 END IF
516 IF (any(potparm%pot(idim, jdim)%pot%type == nequip_type)) THEN
517 fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
518 fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
519 END IF
520 ELSE
521 ! In case we don't use potparm for initialization let's account
522 ! only for the real-space part of the Ewald sum.
523 fist_nonbond_env%rlist_cut(idim, jdim) = ewald_rcut
524 fist_nonbond_env%rlist_cut(jdim, idim) = ewald_rcut
525 fist_nonbond_env%rlist_lowsq(idim, jdim) = 0.0_dp
526 fist_nonbond_env%rlist_lowsq(jdim, idim) = 0.0_dp
527 END IF
528 END DO
529 END DO
530 IF (use_potparm14) fist_nonbond_env%potparm14 => potparm14
531 IF (use_potparm) fist_nonbond_env%potparm => potparm
532 fist_nonbond_env%natom_types = natom_types
533 ELSE
534 NULLIFY (fist_nonbond_env%potparm)
535 NULLIFY (fist_nonbond_env%potparm14)
536 END IF
537 END SUBROUTINE init_fist_nonbond_env
538
539! **************************************************************************************************
540!> \brief releases the given fist_nonbond_env (see doc/ReferenceCounting.html)
541!> \param fist_nonbond_env the object to release
542!> \par History
543!> 12.2002 created [fawzi]
544!> \author Fawzi Mohamed
545! **************************************************************************************************
546 SUBROUTINE fist_nonbond_env_release(fist_nonbond_env)
547 TYPE(fist_nonbond_env_type), INTENT(INOUT) :: fist_nonbond_env
548
549 IF (ASSOCIATED(fist_nonbond_env%nonbonded)) THEN
550 CALL fist_neighbor_deallocate(fist_nonbond_env%nonbonded)
551 END IF
552 ! Release potparm
553 CALL pair_potential_pp_release(fist_nonbond_env%potparm)
554 ! Release potparm14
555 CALL pair_potential_pp_release(fist_nonbond_env%potparm14)
556 IF (ASSOCIATED(fist_nonbond_env%r_last_update)) THEN
557 DEALLOCATE (fist_nonbond_env%r_last_update)
558 END IF
559 IF (ASSOCIATED(fist_nonbond_env%r_last_update_pbc)) THEN
560 DEALLOCATE (fist_nonbond_env%r_last_update_pbc)
561 END IF
562 IF (ASSOCIATED(fist_nonbond_env%charges)) THEN
563 DEALLOCATE (fist_nonbond_env%charges)
564 END IF
565 IF (ASSOCIATED(fist_nonbond_env%eam_data)) THEN
566 DEALLOCATE (fist_nonbond_env%eam_data)
567 END IF
568 IF (ASSOCIATED(fist_nonbond_env%quip_data)) THEN
569 IF (ASSOCIATED(fist_nonbond_env%quip_data%force)) THEN
570 DEALLOCATE (fist_nonbond_env%quip_data%force)
571 END IF
572 IF (ASSOCIATED(fist_nonbond_env%quip_data%use_indices)) THEN
573 DEALLOCATE (fist_nonbond_env%quip_data%use_indices)
574 END IF
575 DEALLOCATE (fist_nonbond_env%quip_data)
576 END IF
577 IF (ASSOCIATED(fist_nonbond_env%nequip_data)) THEN
578 IF (ASSOCIATED(fist_nonbond_env%nequip_data%force)) THEN
579 DEALLOCATE (fist_nonbond_env%nequip_data%force)
580 END IF
581 IF (ASSOCIATED(fist_nonbond_env%nequip_data%use_indices)) THEN
582 DEALLOCATE (fist_nonbond_env%nequip_data%use_indices)
583 END IF
584 CALL torch_model_release(fist_nonbond_env%nequip_data%model)
585 DEALLOCATE (fist_nonbond_env%nequip_data)
586 END IF
587 IF (ASSOCIATED(fist_nonbond_env%allegro_data)) THEN
588 IF (ASSOCIATED(fist_nonbond_env%allegro_data%force)) THEN
589 DEALLOCATE (fist_nonbond_env%allegro_data%force)
590 END IF
591 IF (ASSOCIATED(fist_nonbond_env%allegro_data%use_indices)) THEN
592 DEALLOCATE (fist_nonbond_env%allegro_data%use_indices)
593 END IF
594 CALL torch_model_release(fist_nonbond_env%allegro_data%model)
595 DEALLOCATE (fist_nonbond_env%allegro_data)
596 END IF
597 IF (ASSOCIATED(fist_nonbond_env%deepmd_data)) THEN
598 IF (ASSOCIATED(fist_nonbond_env%deepmd_data%force)) THEN
599 DEALLOCATE (fist_nonbond_env%deepmd_data%force)
600 END IF
601 IF (ASSOCIATED(fist_nonbond_env%deepmd_data%use_indices)) THEN
602 DEALLOCATE (fist_nonbond_env%deepmd_data%use_indices)
603 END IF
604 CALL deepmd_model_release(fist_nonbond_env%deepmd_data%model)
605 DEALLOCATE (fist_nonbond_env%deepmd_data)
606 END IF
607 IF (ASSOCIATED(fist_nonbond_env%ace_data)) THEN
608 IF (ALLOCATED(fist_nonbond_env%ace_data%use_indices)) THEN
609 DEALLOCATE (fist_nonbond_env%ace_data%use_indices)
610 END IF
611 IF (ALLOCATED(fist_nonbond_env%ace_data%inverse_index_map)) THEN
612 DEALLOCATE (fist_nonbond_env%ace_data%inverse_index_map)
613 END IF
614 IF (ALLOCATED(fist_nonbond_env%ace_data%force)) THEN
615 DEALLOCATE (fist_nonbond_env%ace_data%force)
616 END IF
617 IF (ALLOCATED(fist_nonbond_env%ace_data%atpos)) THEN
618 DEALLOCATE (fist_nonbond_env%ace_data%atpos)
619 END IF
620 IF (ALLOCATED(fist_nonbond_env%ace_data%uctype)) THEN
621 DEALLOCATE (fist_nonbond_env%ace_data%uctype)
622 END IF
623 IF (ALLOCATED(fist_nonbond_env%ace_data%attype)) THEN
624 DEALLOCATE (fist_nonbond_env%ace_data%attype)
625 END IF
626 IF (ALLOCATED(fist_nonbond_env%ace_data%origin)) THEN
627 DEALLOCATE (fist_nonbond_env%ace_data%origin)
628 END IF
629 IF (ALLOCATED(fist_nonbond_env%ace_data%shift)) THEN
630 DEALLOCATE (fist_nonbond_env%ace_data%shift)
631 END IF
632 IF (ALLOCATED(fist_nonbond_env%ace_data%neiat)) THEN
633 DEALLOCATE (fist_nonbond_env%ace_data%neiat)
634 END IF
635 IF (ALLOCATED(fist_nonbond_env%ace_data%nlist)) THEN
636 DEALLOCATE (fist_nonbond_env%ace_data%nlist)
637 END IF
638 CALL ace_model_release(fist_nonbond_env%ace_data%model)
639 DEALLOCATE (fist_nonbond_env%ace_data)
640 END IF
641 IF (ASSOCIATED(fist_nonbond_env%rshell_last_update_pbc)) THEN
642 DEALLOCATE (fist_nonbond_env%rshell_last_update_pbc)
643 END IF
644 IF (ASSOCIATED(fist_nonbond_env%rcore_last_update_pbc)) THEN
645 DEALLOCATE (fist_nonbond_env%rcore_last_update_pbc)
646 END IF
647 IF (ASSOCIATED(fist_nonbond_env%cell_last_update)) THEN
648 CALL cell_release(fist_nonbond_env%cell_last_update)
649 END IF
650 IF (ASSOCIATED(fist_nonbond_env%ij_kind_full_fac)) THEN
651 DEALLOCATE (fist_nonbond_env%ij_kind_full_fac)
652 END IF
653 IF (ASSOCIATED(fist_nonbond_env%rlist_cut)) THEN
654 DEALLOCATE (fist_nonbond_env%rlist_cut)
655 END IF
656 IF (ASSOCIATED(fist_nonbond_env%rlist_lowsq)) THEN
657 DEALLOCATE (fist_nonbond_env%rlist_lowsq)
658 END IF
659 END SUBROUTINE fist_nonbond_env_release
660
661END MODULE fist_nonbond_env_types
static GRID_HOST_DEVICE double fac(const int i)
Factorial function, e.g. fac(5) = 5! = 120.
Definition grid_common.h:51
Interface to ACE C wrapper.
Definition ace_wrapper.F:12
subroutine, public ace_model_release(model)
Releases an ACE model and all its ressources.
Define the atomic kind types and their sub types.
Handles all functions related to the CELL.
Definition cell_types.F:15
subroutine, public cell_release(cell)
releases the given cell (see doc/ReferenceCounting.html)
Definition cell_types.F:559
Interface to the DeePMD-kit or a c++ wrapper.
subroutine, public deepmd_model_release(model)
Releases a deepmd model and all its ressources.
Define the neighbor list data types and the corresponding functionality.
subroutine, public fist_neighbor_deallocate(fist_neighbor)
...
subroutine, public fist_nonbond_env_create(fist_nonbond_env, atomic_kind_set, potparm14, potparm, do_nonbonded, do_electrostatics, verlet_skin, ewald_rcut, ei_scale14, vdw_scale14, shift_cutoff)
allocates and intitializes a fist_nonbond_env
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, 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, quip_data, nequip_data, allegro_data, deepmd_data, ace_data, charges)
sets a fist_nonbond_env
subroutine, public fist_nonbond_env_release(fist_nonbond_env)
releases the given fist_nonbond_env (see doc/ReferenceCounting.html)
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
integer, parameter, public gal_type
subroutine, public pair_potential_pp_release(potparm)
Release Data-structure that constains potential parameters.
integer, parameter, public nequip_type
integer, parameter, public siepmann_type
integer, parameter, public ace_type
integer, parameter, public gal21_type
integer, parameter, public tersoff_type
subroutine, public torch_model_release(model)
Releases a Torch model and all its ressources.
Definition torch_api.F:1205
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Definition cell_types.F:55