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: ace_type,&
26 : gal21_type,&
27 : gal_type,&
28 : nequip_type,&
29 : pair_potential_pp_release,&
30 : pair_potential_pp_type,&
31 : siepmann_type,&
32 : tersoff_type
33 : USE torch_api, ONLY: torch_model_release,&
34 : torch_model_type
35 : #include "./base/base_uses.f90"
36 :
37 : IMPLICIT NONE
38 : PRIVATE
39 :
40 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'fist_nonbond_env_types'
41 : PUBLIC :: fist_nonbond_env_type, fist_nonbond_env_set, &
42 : fist_nonbond_env_get, fist_nonbond_env_create, &
43 : fist_nonbond_env_release, pos_type, eam_type, &
44 : nequip_data_type, allegro_data_type, &
45 : deepmd_data_type, ace_data_type
46 :
47 : ! **************************************************************************************************
48 : TYPE pos_type
49 : REAL(KIND=dp) :: r(3) = 0.0_dp
50 : END TYPE pos_type
51 :
52 : TYPE eam_type
53 : REAL(KIND=dp) :: f_embed = 0.0_dp
54 : REAL(KIND=dp) :: rho = 0.0_dp
55 : END TYPE eam_type
56 :
57 : TYPE nequip_data_type
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 :
64 : TYPE allegro_data_type
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 :
71 : TYPE deepmd_data_type
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 :
78 : TYPE ace_data_type
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 : ! **************************************************************************************************
98 : TYPE fist_nonbond_env_type
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 :
131 : CONTAINS
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 532821 : 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 532821 : IF (PRESENT(charges)) charges => fist_nonbond_env%charges
197 532821 : IF (PRESENT(potparm14)) potparm14 => fist_nonbond_env%potparm14
198 532821 : IF (PRESENT(eam_data)) eam_data => fist_nonbond_env%eam_data
199 532821 : IF (PRESENT(nequip_data)) nequip_data => fist_nonbond_env%nequip_data
200 532821 : IF (PRESENT(allegro_data)) allegro_data => fist_nonbond_env%allegro_data
201 532821 : IF (PRESENT(deepmd_data)) deepmd_data => fist_nonbond_env%deepmd_data
202 532821 : IF (PRESENT(ace_data)) ace_data => fist_nonbond_env%ace_data
203 532821 : IF (PRESENT(potparm)) potparm => fist_nonbond_env%potparm
204 532821 : IF (PRESENT(rlist_cut)) rlist_cut => fist_nonbond_env%rlist_cut
205 532821 : IF (PRESENT(rlist_lowsq)) rlist_lowsq => fist_nonbond_env%rlist_lowsq
206 532821 : IF (PRESENT(ij_kind_full_fac)) ij_kind_full_fac => fist_nonbond_env%ij_kind_full_fac
207 532821 : IF (PRESENT(nonbonded)) nonbonded => fist_nonbond_env%nonbonded
208 532821 : IF (PRESENT(r_last_update)) &
209 242474 : r_last_update => fist_nonbond_env%r_last_update
210 532821 : IF (PRESENT(r_last_update_pbc)) &
211 391296 : r_last_update_pbc => fist_nonbond_env%r_last_update_pbc
212 532821 : IF (PRESENT(rshell_last_update_pbc)) &
213 159788 : rshell_last_update_pbc => fist_nonbond_env%rshell_last_update_pbc
214 532821 : IF (PRESENT(rcore_last_update_pbc)) &
215 159788 : rcore_last_update_pbc => fist_nonbond_env%rcore_last_update_pbc
216 532821 : IF (PRESENT(cell_last_update)) &
217 80790 : cell_last_update => fist_nonbond_env%cell_last_update
218 532821 : IF (PRESENT(lup)) lup = fist_nonbond_env%lup
219 532821 : IF (PRESENT(aup)) aup = fist_nonbond_env%aup
220 532821 : IF (PRESENT(ei_scale14)) ei_scale14 = fist_nonbond_env%ei_scale14
221 532821 : IF (PRESENT(vdw_scale14)) vdw_scale14 = fist_nonbond_env%vdw_scale14
222 532821 : IF (PRESENT(shift_cutoff)) &
223 0 : shift_cutoff = fist_nonbond_env%shift_cutoff
224 532821 : IF (PRESENT(do_electrostatics)) do_electrostatics = fist_nonbond_env%do_electrostatics
225 532821 : IF (PRESENT(natom_types)) natom_types = fist_nonbond_env%natom_types
226 532821 : IF (PRESENT(counter)) counter = fist_nonbond_env%counter
227 532821 : IF (PRESENT(last_update)) last_update = fist_nonbond_env%last_update
228 532821 : IF (PRESENT(num_update)) num_update = fist_nonbond_env%num_update
229 532821 : IF (PRESENT(long_range_correction)) &
230 0 : long_range_correction = fist_nonbond_env%long_range_correction
231 532821 : 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 94583 : 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 94583 : IF (PRESENT(potparm14)) fist_nonbond_env%potparm14 => potparm14
295 94583 : IF (PRESENT(eam_data)) fist_nonbond_env%eam_data => eam_data
296 94583 : IF (PRESENT(nequip_data)) fist_nonbond_env%nequip_data => nequip_data
297 94583 : IF (PRESENT(allegro_data)) fist_nonbond_env%allegro_data => allegro_data
298 94583 : IF (PRESENT(deepmd_data)) fist_nonbond_env%deepmd_data => deepmd_data
299 94583 : IF (PRESENT(ace_data)) fist_nonbond_env%ace_data => ace_data
300 94583 : IF (PRESENT(potparm)) fist_nonbond_env%potparm => potparm
301 94583 : IF (PRESENT(rlist_cut)) fist_nonbond_env%rlist_cut => rlist_cut
302 94583 : IF (PRESENT(charges)) fist_nonbond_env%charges => charges
303 94583 : IF (PRESENT(rlist_lowsq)) fist_nonbond_env%rlist_lowsq => rlist_lowsq
304 94583 : IF (PRESENT(nonbonded)) fist_nonbond_env%nonbonded => nonbonded
305 94583 : IF (PRESENT(r_last_update)) &
306 11120 : fist_nonbond_env%r_last_update => r_last_update
307 94583 : IF (PRESENT(r_last_update_pbc)) &
308 11120 : fist_nonbond_env%r_last_update_pbc => r_last_update_pbc
309 94583 : IF (PRESENT(rshell_last_update_pbc)) &
310 11120 : fist_nonbond_env%rshell_last_update_pbc => rshell_last_update_pbc
311 94583 : IF (PRESENT(rcore_last_update_pbc)) &
312 11120 : fist_nonbond_env%rcore_last_update_pbc => rcore_last_update_pbc
313 94583 : IF (PRESENT(cell_last_update)) &
314 11120 : fist_nonbond_env%cell_last_update => cell_last_update
315 94583 : IF (PRESENT(lup)) fist_nonbond_env%lup = lup
316 94583 : IF (PRESENT(aup)) fist_nonbond_env%aup = aup
317 94583 : IF (PRESENT(ei_scale14)) fist_nonbond_env%ei_scale14 = ei_scale14
318 94583 : IF (PRESENT(vdw_scale14)) fist_nonbond_env%vdw_scale14 = vdw_scale14
319 94583 : IF (PRESENT(shift_cutoff)) &
320 0 : fist_nonbond_env%shift_cutoff = shift_cutoff
321 94583 : IF (PRESENT(do_electrostatics)) fist_nonbond_env%do_electrostatics = do_electrostatics
322 94583 : IF (PRESENT(natom_types)) fist_nonbond_env%natom_types = natom_types
323 94583 : IF (PRESENT(counter)) fist_nonbond_env%counter = counter
324 94583 : IF (PRESENT(last_update)) fist_nonbond_env%last_update = last_update
325 94583 : IF (PRESENT(num_update)) fist_nonbond_env%num_update = num_update
326 94583 : IF (PRESENT(long_range_correction)) &
327 0 : fist_nonbond_env%long_range_correction = long_range_correction
328 94583 : 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 2677 : 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 2677 : vdw_scale14, shift_cutoff)
378 2677 : 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 2677 : 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 2677 : use_potparm14 = PRESENT(potparm14)
411 2677 : IF (use_potparm14) use_potparm14 = use_potparm14 .OR. ASSOCIATED(potparm14)
412 2677 : use_potparm = PRESENT(potparm)
413 2677 : IF (use_potparm) use_potparm = use_potparm .OR. ASSOCIATED(potparm)
414 2677 : NULLIFY (fist_nonbond_env%nonbonded)
415 2677 : NULLIFY (fist_nonbond_env%r_last_update)
416 2677 : NULLIFY (fist_nonbond_env%r_last_update_pbc)
417 2677 : NULLIFY (fist_nonbond_env%rshell_last_update_pbc)
418 2677 : NULLIFY (fist_nonbond_env%rcore_last_update_pbc)
419 2677 : NULLIFY (fist_nonbond_env%cell_last_update)
420 2677 : NULLIFY (fist_nonbond_env%rlist_cut)
421 2677 : NULLIFY (fist_nonbond_env%rlist_lowsq)
422 2677 : NULLIFY (fist_nonbond_env%ij_kind_full_fac)
423 2677 : fist_nonbond_env%unit_type = "ANGSTROM"
424 2677 : fist_nonbond_env%do_nonbonded = do_nonbonded
425 2677 : fist_nonbond_env%do_electrostatics = do_electrostatics
426 2677 : fist_nonbond_env%lup = 0
427 2677 : fist_nonbond_env%aup = 0
428 2677 : fist_nonbond_env%ei_scale14 = ei_scale14
429 2677 : fist_nonbond_env%vdw_scale14 = vdw_scale14
430 2677 : fist_nonbond_env%shift_cutoff = shift_cutoff
431 2677 : fist_nonbond_env%counter = 0
432 2677 : fist_nonbond_env%last_update = 0
433 2677 : fist_nonbond_env%num_update = 0
434 2677 : fist_nonbond_env%long_range_correction = 0
435 2677 : IF (do_nonbonded) THEN
436 2661 : natom_types = 1
437 : ! Determine size of kind arrays
438 2661 : natom_types = SIZE(atomic_kind_set)
439 2661 : IF (use_potparm14) THEN
440 2629 : check = (SIZE(potparm14%pot, 1) == natom_types)
441 2629 : CPASSERT(check)
442 : END IF
443 2661 : IF (use_potparm) THEN
444 2629 : check = (SIZE(potparm%pot, 1) == natom_types)
445 2629 : CPASSERT(check)
446 : END IF
447 10644 : ALLOCATE (fist_nonbond_env%rlist_cut(natom_types, natom_types))
448 7983 : ALLOCATE (fist_nonbond_env%rlist_lowsq(natom_types, natom_types))
449 7983 : ALLOCATE (fist_nonbond_env%ij_kind_full_fac(natom_types, natom_types))
450 518261 : fist_nonbond_env%ij_kind_full_fac = 1.0_dp
451 13926 : DO idim = 1, natom_types
452 271726 : DO jdim = idim, natom_types
453 269065 : IF ((use_potparm) .OR. (use_potparm14)) THEN
454 257720 : IF (use_potparm) THEN
455 257720 : rcut = SQRT(potparm%pot(idim, jdim)%pot%rcutsq)
456 257720 : fac = potparm%pot(idim, jdim)%pot%spl_f%rscale(1)
457 257720 : rlow = fac/(potparm%pot(idim, jdim)%pot%pair_spline_data(1)%spline_data%xn)
458 : ELSE
459 0 : rcut = SQRT(potparm14%pot(idim, jdim)%pot%rcutsq)
460 0 : fac = potparm14%pot(idim, jdim)%pot%spl_f%rscale(1)
461 0 : 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 257720 : rcut = MAX(rcut, ewald_rcut) + verlet_skin
467 257720 : fist_nonbond_env%rlist_cut(idim, jdim) = rcut
468 257720 : fist_nonbond_env%rlist_cut(jdim, idim) = rcut
469 257720 : rlow = rlow*(1.06_dp)**2 ! 1.06_dp in order to have 1/2 Emax_spline
470 257720 : fist_nonbond_env%rlist_lowsq(idim, jdim) = rlow
471 257720 : 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 515330 : 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 118 : 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 515443 : IF (ANY(potparm%pot(idim, jdim)%pot%type == siepmann_type)) THEN
486 : ! TODO:see tersoff_type
487 5 : 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 515430 : IF (ANY(potparm%pot(idim, jdim)%pot%type == ace_type)) THEN
491 18 : fist_nonbond_env%ij_kind_full_fac(idim, jdim) = 0.5_dp
492 18 : fist_nonbond_env%ij_kind_full_fac(jdim, idim) = 0.5_dp
493 : END IF
494 515447 : IF (ANY(potparm%pot(idim, jdim)%pot%type == gal_type)) THEN
495 1 : 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 515447 : IF (ANY(potparm%pot(idim, jdim)%pot%type == gal21_type)) THEN
499 1 : 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 515436 : IF (ANY(potparm%pot(idim, jdim)%pot%type == nequip_type)) THEN
503 12 : 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 80 : fist_nonbond_env%rlist_cut(idim, jdim) = ewald_rcut
510 80 : fist_nonbond_env%rlist_cut(jdim, idim) = ewald_rcut
511 80 : fist_nonbond_env%rlist_lowsq(idim, jdim) = 0.0_dp
512 80 : fist_nonbond_env%rlist_lowsq(jdim, idim) = 0.0_dp
513 : END IF
514 : END DO
515 : END DO
516 2661 : IF (use_potparm14) fist_nonbond_env%potparm14 => potparm14
517 2661 : IF (use_potparm) fist_nonbond_env%potparm => potparm
518 2661 : fist_nonbond_env%natom_types = natom_types
519 : ELSE
520 16 : NULLIFY (fist_nonbond_env%potparm)
521 16 : NULLIFY (fist_nonbond_env%potparm14)
522 : END IF
523 2677 : 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 2677 : SUBROUTINE fist_nonbond_env_release(fist_nonbond_env)
533 : TYPE(fist_nonbond_env_type), INTENT(INOUT) :: fist_nonbond_env
534 :
535 2677 : IF (ASSOCIATED(fist_nonbond_env%nonbonded)) THEN
536 2507 : CALL fist_neighbor_deallocate(fist_nonbond_env%nonbonded)
537 : END IF
538 : ! Release potparm
539 2677 : CALL pair_potential_pp_release(fist_nonbond_env%potparm)
540 : ! Release potparm14
541 2677 : CALL pair_potential_pp_release(fist_nonbond_env%potparm14)
542 2677 : IF (ASSOCIATED(fist_nonbond_env%r_last_update)) THEN
543 2507 : DEALLOCATE (fist_nonbond_env%r_last_update)
544 : END IF
545 2677 : IF (ASSOCIATED(fist_nonbond_env%r_last_update_pbc)) THEN
546 2507 : DEALLOCATE (fist_nonbond_env%r_last_update_pbc)
547 : END IF
548 2677 : IF (ASSOCIATED(fist_nonbond_env%charges)) THEN
549 8 : DEALLOCATE (fist_nonbond_env%charges)
550 : END IF
551 2677 : IF (ASSOCIATED(fist_nonbond_env%eam_data)) THEN
552 12 : DEALLOCATE (fist_nonbond_env%eam_data)
553 : END IF
554 2677 : IF (ASSOCIATED(fist_nonbond_env%nequip_data)) THEN
555 4 : IF (ASSOCIATED(fist_nonbond_env%nequip_data%force)) THEN
556 4 : DEALLOCATE (fist_nonbond_env%nequip_data%force)
557 : END IF
558 4 : IF (ASSOCIATED(fist_nonbond_env%nequip_data%use_indices)) THEN
559 4 : DEALLOCATE (fist_nonbond_env%nequip_data%use_indices)
560 : END IF
561 4 : CALL torch_model_release(fist_nonbond_env%nequip_data%model)
562 4 : DEALLOCATE (fist_nonbond_env%nequip_data)
563 : END IF
564 2677 : IF (ASSOCIATED(fist_nonbond_env%allegro_data)) THEN
565 4 : IF (ASSOCIATED(fist_nonbond_env%allegro_data%force)) THEN
566 4 : DEALLOCATE (fist_nonbond_env%allegro_data%force)
567 : END IF
568 4 : IF (ASSOCIATED(fist_nonbond_env%allegro_data%use_indices)) THEN
569 4 : DEALLOCATE (fist_nonbond_env%allegro_data%use_indices)
570 : END IF
571 4 : CALL torch_model_release(fist_nonbond_env%allegro_data%model)
572 4 : DEALLOCATE (fist_nonbond_env%allegro_data)
573 : END IF
574 2677 : IF (ASSOCIATED(fist_nonbond_env%deepmd_data)) THEN
575 2 : IF (ASSOCIATED(fist_nonbond_env%deepmd_data%force)) THEN
576 2 : DEALLOCATE (fist_nonbond_env%deepmd_data%force)
577 : END IF
578 2 : IF (ASSOCIATED(fist_nonbond_env%deepmd_data%use_indices)) THEN
579 2 : DEALLOCATE (fist_nonbond_env%deepmd_data%use_indices)
580 : END IF
581 2 : CALL deepmd_model_release(fist_nonbond_env%deepmd_data%model)
582 2 : DEALLOCATE (fist_nonbond_env%deepmd_data)
583 : END IF
584 2677 : IF (ASSOCIATED(fist_nonbond_env%ace_data)) THEN
585 6 : IF (ALLOCATED(fist_nonbond_env%ace_data%use_indices)) THEN
586 6 : DEALLOCATE (fist_nonbond_env%ace_data%use_indices)
587 : END IF
588 6 : IF (ALLOCATED(fist_nonbond_env%ace_data%inverse_index_map)) THEN
589 6 : DEALLOCATE (fist_nonbond_env%ace_data%inverse_index_map)
590 : END IF
591 6 : IF (ALLOCATED(fist_nonbond_env%ace_data%force)) THEN
592 6 : DEALLOCATE (fist_nonbond_env%ace_data%force)
593 : END IF
594 6 : IF (ALLOCATED(fist_nonbond_env%ace_data%atpos)) THEN
595 6 : DEALLOCATE (fist_nonbond_env%ace_data%atpos)
596 : END IF
597 6 : IF (ALLOCATED(fist_nonbond_env%ace_data%uctype)) THEN
598 6 : DEALLOCATE (fist_nonbond_env%ace_data%uctype)
599 : END IF
600 6 : IF (ALLOCATED(fist_nonbond_env%ace_data%attype)) THEN
601 6 : DEALLOCATE (fist_nonbond_env%ace_data%attype)
602 : END IF
603 6 : IF (ALLOCATED(fist_nonbond_env%ace_data%origin)) THEN
604 6 : DEALLOCATE (fist_nonbond_env%ace_data%origin)
605 : END IF
606 6 : IF (ALLOCATED(fist_nonbond_env%ace_data%shift)) THEN
607 6 : DEALLOCATE (fist_nonbond_env%ace_data%shift)
608 : END IF
609 6 : IF (ALLOCATED(fist_nonbond_env%ace_data%neiat)) THEN
610 6 : DEALLOCATE (fist_nonbond_env%ace_data%neiat)
611 : END IF
612 6 : IF (ALLOCATED(fist_nonbond_env%ace_data%nlist)) THEN
613 6 : DEALLOCATE (fist_nonbond_env%ace_data%nlist)
614 : END IF
615 6 : CALL ace_model_release(fist_nonbond_env%ace_data%model)
616 6 : DEALLOCATE (fist_nonbond_env%ace_data)
617 : END IF
618 2677 : IF (ASSOCIATED(fist_nonbond_env%rshell_last_update_pbc)) THEN
619 242 : DEALLOCATE (fist_nonbond_env%rshell_last_update_pbc)
620 : END IF
621 2677 : IF (ASSOCIATED(fist_nonbond_env%rcore_last_update_pbc)) THEN
622 242 : DEALLOCATE (fist_nonbond_env%rcore_last_update_pbc)
623 : END IF
624 2677 : IF (ASSOCIATED(fist_nonbond_env%cell_last_update)) THEN
625 2507 : CALL cell_release(fist_nonbond_env%cell_last_update)
626 : END IF
627 2677 : IF (ASSOCIATED(fist_nonbond_env%ij_kind_full_fac)) THEN
628 2661 : DEALLOCATE (fist_nonbond_env%ij_kind_full_fac)
629 : END IF
630 2677 : IF (ASSOCIATED(fist_nonbond_env%rlist_cut)) THEN
631 2661 : DEALLOCATE (fist_nonbond_env%rlist_cut)
632 : END IF
633 2677 : IF (ASSOCIATED(fist_nonbond_env%rlist_lowsq)) THEN
634 2661 : DEALLOCATE (fist_nonbond_env%rlist_lowsq)
635 : END IF
636 2677 : END SUBROUTINE fist_nonbond_env_release
637 :
638 0 : END MODULE fist_nonbond_env_types
|