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