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