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