(git:ed6f26b)
Loading...
Searching...
No Matches
manybody_allegro.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2025 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \par History
10!> allegro implementation
11!> \author Gabriele Tocci
12! **************************************************************************************************
14
16 USE cell_types, ONLY: cell_type
24 USE kinds, ONLY: dp,&
25 int_8,&
26 sp
33 USE torch_api, ONLY: &
37 USE util, ONLY: sort
38#include "./base/base_uses.f90"
39
40 IMPLICIT NONE
41
42 PRIVATE
45 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'manybody_allegro'
46
47CONTAINS
48
49! **************************************************************************************************
50!> \brief ...
51!> \param nonbonded ...
52!> \param potparm ...
53!> \param glob_loc_list ...
54!> \param glob_cell_v ...
55!> \param glob_loc_list_a ...
56!> \param unique_list_a ...
57!> \param cell ...
58!> \par History
59!> Implementation of the allegro potential - [gtocci] 2023
60!> \author Gabriele Tocci - University of Zurich
61! **************************************************************************************************
62 SUBROUTINE setup_allegro_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, &
63 unique_list_a, cell)
64 TYPE(fist_neighbor_type), POINTER :: nonbonded
65 TYPE(pair_potential_pp_type), POINTER :: potparm
66 INTEGER, DIMENSION(:, :), POINTER :: glob_loc_list
67 REAL(kind=dp), DIMENSION(:, :), POINTER :: glob_cell_v
68 INTEGER, DIMENSION(:), POINTER :: glob_loc_list_a, unique_list_a
69 TYPE(cell_type), POINTER :: cell
70
71 CHARACTER(LEN=*), PARAMETER :: routinen = 'setup_allegro_arrays'
72
73 INTEGER :: handle, i, iend, igrp, ikind, ilist, &
74 ipair, istart, jkind, nkinds, nlocal, &
75 npairs, npairs_tot
76 INTEGER, ALLOCATABLE, DIMENSION(:) :: temp_unique_list_a, work_list, work_list2
77 INTEGER, DIMENSION(:, :), POINTER :: list
78 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: rwork_list
79 REAL(kind=dp), DIMENSION(3) :: cell_v, cvi
80 TYPE(neighbor_kind_pairs_type), POINTER :: neighbor_kind_pair
81 TYPE(pair_potential_single_type), POINTER :: pot
82
83 cpassert(.NOT. ASSOCIATED(glob_loc_list))
84 cpassert(.NOT. ASSOCIATED(glob_loc_list_a))
85 cpassert(.NOT. ASSOCIATED(unique_list_a))
86 cpassert(.NOT. ASSOCIATED(glob_cell_v))
87 CALL timeset(routinen, handle)
88 npairs_tot = 0
89 nkinds = SIZE(potparm%pot, 1)
90 DO ilist = 1, nonbonded%nlists
91 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
92 npairs = neighbor_kind_pair%npairs
93 IF (npairs == 0) cycle
94 kind_group_loop1: DO igrp = 1, neighbor_kind_pair%ngrp_kind
95 istart = neighbor_kind_pair%grp_kind_start(igrp)
96 iend = neighbor_kind_pair%grp_kind_end(igrp)
97 ikind = neighbor_kind_pair%ij_kind(1, igrp)
98 jkind = neighbor_kind_pair%ij_kind(2, igrp)
99 pot => potparm%pot(ikind, jkind)%pot
100 npairs = iend - istart + 1
101 IF (pot%no_mb) cycle
102 DO i = 1, SIZE(pot%type)
103 IF (pot%type(i) == allegro_type) npairs_tot = npairs_tot + npairs
104 END DO
105 END DO kind_group_loop1
106 END DO
107 ALLOCATE (work_list(npairs_tot))
108 ALLOCATE (work_list2(npairs_tot))
109 ALLOCATE (glob_loc_list(2, npairs_tot))
110 ALLOCATE (glob_cell_v(3, npairs_tot))
111 ! Fill arrays with data
112 npairs_tot = 0
113 DO ilist = 1, nonbonded%nlists
114 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
115 npairs = neighbor_kind_pair%npairs
116 IF (npairs == 0) cycle
117 kind_group_loop2: DO igrp = 1, neighbor_kind_pair%ngrp_kind
118 istart = neighbor_kind_pair%grp_kind_start(igrp)
119 iend = neighbor_kind_pair%grp_kind_end(igrp)
120 ikind = neighbor_kind_pair%ij_kind(1, igrp)
121 jkind = neighbor_kind_pair%ij_kind(2, igrp)
122 list => neighbor_kind_pair%list
123 cvi = neighbor_kind_pair%cell_vector
124 pot => potparm%pot(ikind, jkind)%pot
125 npairs = iend - istart + 1
126 IF (pot%no_mb) cycle
127 cell_v = matmul(cell%hmat, cvi)
128 DO i = 1, SIZE(pot%type)
129 ! ALLEGRO
130 IF (pot%type(i) == allegro_type) THEN
131 DO ipair = 1, npairs
132 glob_loc_list(:, npairs_tot + ipair) = list(:, istart - 1 + ipair)
133 glob_cell_v(1:3, npairs_tot + ipair) = cell_v(1:3)
134 END DO
135 npairs_tot = npairs_tot + npairs
136 END IF
137 END DO
138 END DO kind_group_loop2
139 END DO
140 ! Order the arrays w.r.t. the first index of glob_loc_list
141 CALL sort(glob_loc_list(1, :), npairs_tot, work_list)
142 DO ipair = 1, npairs_tot
143 work_list2(ipair) = glob_loc_list(2, work_list(ipair))
144 END DO
145 glob_loc_list(2, :) = work_list2
146 DEALLOCATE (work_list2)
147 ALLOCATE (rwork_list(3, npairs_tot))
148 DO ipair = 1, npairs_tot
149 rwork_list(:, ipair) = glob_cell_v(:, work_list(ipair))
150 END DO
151 glob_cell_v = rwork_list
152 DEALLOCATE (rwork_list)
153 DEALLOCATE (work_list)
154 ALLOCATE (glob_loc_list_a(npairs_tot))
155 glob_loc_list_a = glob_loc_list(1, :)
156 ALLOCATE (temp_unique_list_a(npairs_tot))
157 nlocal = 1
158 temp_unique_list_a(1) = glob_loc_list_a(1)
159 DO ipair = 2, npairs_tot
160 IF (glob_loc_list_a(ipair - 1) /= glob_loc_list_a(ipair)) THEN
161 nlocal = nlocal + 1
162 temp_unique_list_a(nlocal) = glob_loc_list_a(ipair)
163 END IF
164 END DO
165 ALLOCATE (unique_list_a(nlocal))
166 unique_list_a(:) = temp_unique_list_a(:nlocal)
167 DEALLOCATE (temp_unique_list_a)
168 CALL timestop(handle)
169 END SUBROUTINE setup_allegro_arrays
170
171! **************************************************************************************************
172!> \brief ...
173!> \param glob_loc_list ...
174!> \param glob_cell_v ...
175!> \param glob_loc_list_a ...
176!> \param unique_list_a ...
177!> \par History
178!> Implementation of the allegro potential - [gtocci] 2023
179!> \author Gabriele Tocci - University of Zurich
180! **************************************************************************************************
181 SUBROUTINE destroy_allegro_arrays(glob_loc_list, glob_cell_v, glob_loc_list_a, unique_list_a)
182 INTEGER, DIMENSION(:, :), POINTER :: glob_loc_list
183 REAL(kind=dp), DIMENSION(:, :), POINTER :: glob_cell_v
184 INTEGER, DIMENSION(:), POINTER :: glob_loc_list_a, unique_list_a
185
186 IF (ASSOCIATED(glob_loc_list)) THEN
187 DEALLOCATE (glob_loc_list)
188 END IF
189 IF (ASSOCIATED(glob_loc_list_a)) THEN
190 DEALLOCATE (glob_loc_list_a)
191 END IF
192 IF (ASSOCIATED(glob_cell_v)) THEN
193 DEALLOCATE (glob_cell_v)
194 END IF
195 IF (ASSOCIATED(unique_list_a)) THEN
196 DEALLOCATE (unique_list_a)
197 END IF
198
199 END SUBROUTINE destroy_allegro_arrays
200
201! **************************************************************************************************
202!> \brief ...
203!> \param nonbonded ...
204!> \param particle_set ...
205!> \param cell ...
206!> \param atomic_kind_set ...
207!> \param potparm ...
208!> \param allegro ...
209!> \param glob_loc_list_a ...
210!> \param r_last_update_pbc ...
211!> \param pot_allegro ...
212!> \param fist_nonbond_env ...
213!> \param unique_list_a ...
214!> \param para_env ...
215!> \param use_virial ...
216!> \par History
217!> Implementation of the allegro potential - [gtocci] 2023
218!> Index mapping of atoms from .xyz to Allegro config.yaml file - [mbilichenko] 2024
219!> \author Gabriele Tocci - University of Zurich
220! **************************************************************************************************
221 SUBROUTINE allegro_energy_store_force_virial(nonbonded, particle_set, cell, atomic_kind_set, &
222 potparm, allegro, glob_loc_list_a, r_last_update_pbc, &
223 pot_allegro, fist_nonbond_env, unique_list_a, para_env, use_virial)
224
225 TYPE(fist_neighbor_type), POINTER :: nonbonded
226 TYPE(particle_type), POINTER :: particle_set(:)
227 TYPE(cell_type), POINTER :: cell
228 TYPE(atomic_kind_type), POINTER :: atomic_kind_set(:)
229 TYPE(pair_potential_pp_type), POINTER :: potparm
230 TYPE(allegro_pot_type), POINTER :: allegro
231 INTEGER, DIMENSION(:), POINTER :: glob_loc_list_a
232 TYPE(pos_type), DIMENSION(:), POINTER :: r_last_update_pbc
233 REAL(kind=dp) :: pot_allegro
234 TYPE(fist_nonbond_env_type), POINTER :: fist_nonbond_env
235 INTEGER, DIMENSION(:), POINTER :: unique_list_a
236 TYPE(mp_para_env_type), POINTER :: para_env
237 LOGICAL, INTENT(IN) :: use_virial
238
239 CHARACTER(LEN=*), PARAMETER :: routinen = 'allegro_energy_store_force_virial'
240
241 INTEGER :: atom_a, atom_b, atom_idx, handle, i, iat, iat_use, iend, ifirst, igrp, ikind, &
242 ilast, ilist, ipair, istart, iunique, jkind, junique, mpair, n_atoms, n_atoms_use, &
243 nedges, nloc_size, npairs, nunique
244 INTEGER(kind=int_8), ALLOCATABLE :: atom_types(:), temp_atom_types(:)
245 INTEGER(kind=int_8), ALLOCATABLE, DIMENSION(:, :) :: edge_index, t_edge_index, temp_edge_index
246 INTEGER, ALLOCATABLE, DIMENSION(:) :: work_list
247 INTEGER, DIMENSION(:, :), POINTER :: list, sort_list
248 LOGICAL, ALLOCATABLE :: use_atom(:)
249 REAL(kind=dp) :: drij, rab2_max, rij(3)
250 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: edge_cell_shifts, lattice, &
251 new_edge_cell_shifts, pos
252 REAL(kind=dp), DIMENSION(3) :: cell_v, cvi
253 REAL(kind=dp), DIMENSION(:, :), POINTER :: atomic_energy, forces, virial
254 REAL(kind=dp), DIMENSION(:, :, :), POINTER :: virial3d
255 REAL(kind=sp), ALLOCATABLE, DIMENSION(:, :) :: lattice_sp, new_edge_cell_shifts_sp, &
256 pos_sp
257 REAL(kind=sp), DIMENSION(:, :), POINTER :: atomic_energy_sp, forces_sp
258 TYPE(allegro_data_type), POINTER :: allegro_data
259 TYPE(neighbor_kind_pairs_type), POINTER :: neighbor_kind_pair
260 TYPE(pair_potential_single_type), POINTER :: pot
261 TYPE(torch_dict_type) :: inputs, outputs
262 TYPE(torch_tensor_type) :: atom_types_tensor, atomic_energy_tensor, forces_tensor, &
263 lattice_tensor, new_edge_cell_shifts_tensor, pos_tensor, t_edge_index_tensor, &
264 virial_tensor
265
266 CALL timeset(routinen, handle)
267
268 NULLIFY (atomic_energy, forces, atomic_energy_sp, forces_sp, virial3d, virial)
269 n_atoms = SIZE(particle_set)
270 ALLOCATE (use_atom(n_atoms))
271 use_atom = .false.
272
273 DO ikind = 1, SIZE(atomic_kind_set)
274 DO jkind = 1, SIZE(atomic_kind_set)
275 pot => potparm%pot(ikind, jkind)%pot
276 DO i = 1, SIZE(pot%type)
277 IF (pot%type(i) /= allegro_type) cycle
278 DO iat = 1, n_atoms
279 IF (particle_set(iat)%atomic_kind%kind_number == ikind .OR. &
280 particle_set(iat)%atomic_kind%kind_number == jkind) use_atom(iat) = .true.
281 END DO ! iat
282 END DO ! i
283 END DO ! jkind
284 END DO ! ikind
285 n_atoms_use = count(use_atom)
286
287 ! get allegro_data to save force, virial info and to load model
288 CALL fist_nonbond_env_get(fist_nonbond_env, allegro_data=allegro_data)
289 IF (.NOT. ASSOCIATED(allegro_data)) THEN
290 ALLOCATE (allegro_data)
291 CALL fist_nonbond_env_set(fist_nonbond_env, allegro_data=allegro_data)
292 NULLIFY (allegro_data%use_indices, allegro_data%force)
293 CALL torch_model_load(allegro_data%model, pot%set(1)%allegro%allegro_file_name)
294 CALL torch_model_freeze(allegro_data%model)
295 END IF
296 IF (ASSOCIATED(allegro_data%force)) THEN
297 IF (SIZE(allegro_data%force, 2) /= n_atoms_use) THEN
298 DEALLOCATE (allegro_data%force, allegro_data%use_indices)
299 END IF
300 END IF
301 IF (.NOT. ASSOCIATED(allegro_data%force)) THEN
302 ALLOCATE (allegro_data%force(3, n_atoms_use))
303 ALLOCATE (allegro_data%use_indices(n_atoms_use))
304 END IF
305
306 iat_use = 0
307 DO iat = 1, n_atoms_use
308 IF (use_atom(iat)) THEN
309 iat_use = iat_use + 1
310 allegro_data%use_indices(iat_use) = iat
311 END IF
312 END DO
313
314 nedges = 0
315
316 ALLOCATE (edge_index(2, SIZE(glob_loc_list_a)))
317 ALLOCATE (edge_cell_shifts(3, SIZE(glob_loc_list_a)))
318 ALLOCATE (temp_atom_types(SIZE(glob_loc_list_a)))
319
320 DO ilist = 1, nonbonded%nlists
321 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
322 npairs = neighbor_kind_pair%npairs
323 IF (npairs == 0) cycle
324 kind_group_loop_allegro: DO igrp = 1, neighbor_kind_pair%ngrp_kind
325 istart = neighbor_kind_pair%grp_kind_start(igrp)
326 iend = neighbor_kind_pair%grp_kind_end(igrp)
327 ikind = neighbor_kind_pair%ij_kind(1, igrp)
328 jkind = neighbor_kind_pair%ij_kind(2, igrp)
329 list => neighbor_kind_pair%list
330 cvi = neighbor_kind_pair%cell_vector
331 pot => potparm%pot(ikind, jkind)%pot
332 DO i = 1, SIZE(pot%type)
333 IF (pot%type(i) /= allegro_type) cycle
334 rab2_max = pot%set(i)%allegro%rcutsq
335 cell_v = matmul(cell%hmat, cvi)
336 pot => potparm%pot(ikind, jkind)%pot
337 allegro => pot%set(i)%allegro
338 npairs = iend - istart + 1
339 IF (npairs /= 0) THEN
340 ALLOCATE (sort_list(2, npairs), work_list(npairs))
341 sort_list = list(:, istart:iend)
342 ! Sort the list of neighbors, this increases the efficiency for single
343 ! potential contributions
344 CALL sort(sort_list(1, :), npairs, work_list)
345 DO ipair = 1, npairs
346 work_list(ipair) = sort_list(2, work_list(ipair))
347 END DO
348 sort_list(2, :) = work_list
349 ! find number of unique elements of array index 1
350 nunique = 1
351 DO ipair = 1, npairs - 1
352 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
353 END DO
354 ipair = 1
355 junique = sort_list(1, ipair)
356 ifirst = 1
357 DO iunique = 1, nunique
358 atom_a = junique
359 IF (glob_loc_list_a(ifirst) > atom_a) cycle
360 DO mpair = ifirst, SIZE(glob_loc_list_a)
361 IF (glob_loc_list_a(mpair) == atom_a) EXIT
362 END DO
363 ifirst = mpair
364 DO mpair = ifirst, SIZE(glob_loc_list_a)
365 IF (glob_loc_list_a(mpair) /= atom_a) EXIT
366 END DO
367 ilast = mpair - 1
368 nloc_size = 0
369 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
370 DO WHILE (ipair <= npairs)
371 IF (sort_list(1, ipair) /= junique) EXIT
372 atom_b = sort_list(2, ipair)
373 rij(:) = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
374 drij = dot_product(rij, rij)
375 ipair = ipair + 1
376 IF (drij <= rab2_max) THEN
377 nedges = nedges + 1
378 edge_index(:, nedges) = [atom_a - 1, atom_b - 1]
379 edge_cell_shifts(:, nedges) = cvi
380 END IF
381 END DO
382 ifirst = ilast + 1
383 IF (ipair <= npairs) junique = sort_list(1, ipair)
384 END DO
385 DEALLOCATE (sort_list, work_list)
386 END IF
387 END DO
388 END DO kind_group_loop_allegro
389 END DO
390
391 allegro => pot%set(1)%allegro
392
393 ALLOCATE (temp_edge_index(2, nedges))
394 temp_edge_index(:, :) = edge_index(:, :nedges)
395 ALLOCATE (new_edge_cell_shifts(3, nedges))
396 new_edge_cell_shifts(:, :) = edge_cell_shifts(:, :nedges)
397 DEALLOCATE (edge_cell_shifts)
398
399 ALLOCATE (t_edge_index(nedges, 2))
400
401 t_edge_index(:, :) = transpose(temp_edge_index)
402 DEALLOCATE (temp_edge_index, edge_index)
403 ALLOCATE (lattice(3, 3), lattice_sp(3, 3))
404 lattice(:, :) = cell%hmat/pot%set(1)%allegro%unit_cell_val
405 lattice_sp(:, :) = real(lattice, kind=sp)
406 iat_use = 0
407 ALLOCATE (pos(3, n_atoms_use), atom_types(n_atoms_use))
408 DO iat = 1, n_atoms_use
409 IF (.NOT. use_atom(iat)) cycle
410 iat_use = iat_use + 1
411 ! Find index of the element based on its position in config.yaml file to have correct mapping
412 DO i = 1, SIZE(allegro%type_names_torch)
413 IF (particle_set(iat)%atomic_kind%element_symbol == allegro%type_names_torch(i)) THEN
414 atom_idx = i - 1
415 END IF
416 END DO
417 atom_types(iat_use) = atom_idx
418 pos(:, iat) = r_last_update_pbc(iat)%r(:)/allegro%unit_coords_val
419 END DO
420
421 CALL torch_dict_create(inputs)
422
423 IF (allegro%do_allegro_sp) THEN
424 ALLOCATE (new_edge_cell_shifts_sp(3, nedges), pos_sp(3, n_atoms_use))
425 new_edge_cell_shifts_sp(:, :) = real(new_edge_cell_shifts(:, :), kind=sp)
426 pos_sp(:, :) = real(pos(:, :), kind=sp)
427 DEALLOCATE (pos, new_edge_cell_shifts)
428 CALL torch_tensor_from_array(pos_tensor, pos_sp)
429 CALL torch_tensor_from_array(new_edge_cell_shifts_tensor, new_edge_cell_shifts_sp)
430 CALL torch_tensor_from_array(lattice_tensor, lattice_sp)
431 ELSE
432 CALL torch_tensor_from_array(pos_tensor, pos)
433 CALL torch_tensor_from_array(new_edge_cell_shifts_tensor, new_edge_cell_shifts)
434 CALL torch_tensor_from_array(lattice_tensor, lattice)
435 END IF
436
437 CALL torch_dict_insert(inputs, "pos", pos_tensor)
438 CALL torch_dict_insert(inputs, "edge_cell_shift", new_edge_cell_shifts_tensor)
439 CALL torch_dict_insert(inputs, "cell", lattice_tensor)
440 CALL torch_tensor_release(pos_tensor)
441 CALL torch_tensor_release(new_edge_cell_shifts_tensor)
442 CALL torch_tensor_release(lattice_tensor)
443
444 CALL torch_tensor_from_array(t_edge_index_tensor, t_edge_index)
445 CALL torch_dict_insert(inputs, "edge_index", t_edge_index_tensor)
446 CALL torch_tensor_release(t_edge_index_tensor)
447
448 CALL torch_tensor_from_array(atom_types_tensor, atom_types)
449 CALL torch_dict_insert(inputs, "atom_types", atom_types_tensor)
450 CALL torch_tensor_release(atom_types_tensor)
451
452 CALL torch_dict_create(outputs)
453 CALL torch_model_forward(allegro_data%model, inputs, outputs)
454 pot_allegro = 0.0_dp
455
456 CALL torch_dict_get(outputs, "atomic_energy", atomic_energy_tensor)
457 CALL torch_dict_get(outputs, "forces", forces_tensor)
458 IF (allegro%do_allegro_sp) THEN
459 CALL torch_tensor_data_ptr(atomic_energy_tensor, atomic_energy_sp)
460 CALL torch_tensor_data_ptr(forces_tensor, forces_sp)
461 allegro_data%force(:, :) = real(forces_sp(:, :), kind=dp)*allegro%unit_forces_val
462 DO iat_use = 1, SIZE(unique_list_a)
463 i = unique_list_a(iat_use)
464 pot_allegro = pot_allegro + real(atomic_energy_sp(1, i), kind=dp)*allegro%unit_energy_val
465 END DO
466 DEALLOCATE (new_edge_cell_shifts_sp, pos_sp)
467 ELSE
468 CALL torch_tensor_data_ptr(atomic_energy_tensor, atomic_energy)
469 CALL torch_tensor_data_ptr(forces_tensor, forces)
470
471 allegro_data%force(:, :) = forces(:, :)*allegro%unit_forces_val
472 DO iat_use = 1, SIZE(unique_list_a)
473 i = unique_list_a(iat_use)
474 pot_allegro = pot_allegro + atomic_energy(1, i)*allegro%unit_energy_val
475 END DO
476 DEALLOCATE (pos, new_edge_cell_shifts)
477 END IF
478 CALL torch_tensor_release(atomic_energy_tensor)
479 CALL torch_tensor_release(forces_tensor)
480
481 IF (use_virial) THEN
482 CALL torch_dict_get(outputs, "virial", virial_tensor)
483 CALL torch_tensor_data_ptr(virial_tensor, virial3d)
484 allegro_data%virial(:, :) = reshape(virial3d, (/3, 3/))*allegro%unit_energy_val
485 CALL torch_tensor_release(virial_tensor)
486 END IF
487
488 CALL torch_dict_release(inputs)
489 CALL torch_dict_release(outputs)
490
491 DEALLOCATE (t_edge_index, atom_types)
492
493 IF (use_virial) allegro_data%virial(:, :) = allegro_data%virial/real(para_env%num_pe, dp)
494 CALL timestop(handle)
496
497! **************************************************************************************************
498!> \brief ...
499!> \param fist_nonbond_env ...
500!> \param f_nonbond ...
501!> \param pv_nonbond ...
502!> \param use_virial ...
503! **************************************************************************************************
504 SUBROUTINE allegro_add_force_virial(fist_nonbond_env, f_nonbond, pv_nonbond, use_virial)
505
506 TYPE(fist_nonbond_env_type), POINTER :: fist_nonbond_env
507 REAL(kind=dp), DIMENSION(:, :), INTENT(INOUT) :: f_nonbond, pv_nonbond
508 LOGICAL, INTENT(IN) :: use_virial
509
510 INTEGER :: iat, iat_use
511 TYPE(allegro_data_type), POINTER :: allegro_data
512
513 CALL fist_nonbond_env_get(fist_nonbond_env, allegro_data=allegro_data)
514
515 IF (use_virial) THEN
516 pv_nonbond = pv_nonbond + allegro_data%virial
517 END IF
518
519 DO iat_use = 1, SIZE(allegro_data%use_indices)
520 iat = allegro_data%use_indices(iat_use)
521 cpassert(iat >= 1 .AND. iat <= SIZE(f_nonbond, 2))
522 f_nonbond(1:3, iat) = f_nonbond(1:3, iat) + allegro_data%force(1:3, iat_use)
523 END DO
524
525 END SUBROUTINE allegro_add_force_virial
526END MODULE manybody_allegro
527
Define the atom type and its sub types.
Definition atom_types.F:15
Define the atomic kind types and their sub types.
Handles all functions related to the CELL.
Definition cell_types.F:15
Define the neighbor list data types and the corresponding functionality.
subroutine, public fist_nonbond_env_get(fist_nonbond_env, potparm14, potparm, nonbonded, rlist_cut, rlist_lowsq, aup, lup, ei_scale14, vdw_scale14, shift_cutoff, do_electrostatics, r_last_update, r_last_update_pbc, rshell_last_update_pbc, rcore_last_update_pbc, cell_last_update, num_update, last_update, counter, natom_types, long_range_correction, ij_kind_full_fac, eam_data, quip_data, nequip_data, allegro_data, deepmd_data, charges)
sets a fist_nonbond_env
subroutine, public fist_nonbond_env_set(fist_nonbond_env, potparm14, potparm, rlist_cut, rlist_lowsq, nonbonded, aup, lup, ei_scale14, vdw_scale14, shift_cutoff, do_electrostatics, r_last_update, r_last_update_pbc, rshell_last_update_pbc, rcore_last_update_pbc, cell_last_update, num_update, last_update, counter, natom_types, long_range_correction, eam_data, quip_data, nequip_data, allegro_data, deepmd_data, charges)
sets a fist_nonbond_env
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public int_8
Definition kinds.F:54
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public sp
Definition kinds.F:33
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Definition list.F:24
subroutine, public setup_allegro_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, unique_list_a, cell)
...
subroutine, public allegro_add_force_virial(fist_nonbond_env, f_nonbond, pv_nonbond, use_virial)
...
subroutine, public allegro_energy_store_force_virial(nonbonded, particle_set, cell, atomic_kind_set, potparm, allegro, glob_loc_list_a, r_last_update_pbc, pot_allegro, fist_nonbond_env, unique_list_a, para_env, use_virial)
...
subroutine, public destroy_allegro_arrays(glob_loc_list, glob_cell_v, glob_loc_list_a, unique_list_a)
...
Interface to the message passing library MPI.
integer, parameter, public allegro_type
Define the data structure for the particle information.
subroutine, public torch_dict_release(dict)
Releases a Torch dictionary and all its ressources.
Definition torch_api.F:1113
subroutine, public torch_dict_get(dict, key, tensor)
Retrieves a Torch tensor from a Torch dictionary.
Definition torch_api.F:1079
subroutine, public torch_model_load(model, filename)
Loads a Torch model from given "*.pth" file. (In Torch lingo models are called modules)
Definition torch_api.F:1137
subroutine, public torch_dict_create(dict)
Creates an empty Torch dictionary.
Definition torch_api.F:1023
subroutine, public torch_model_freeze(model)
Freeze the given Torch model: applies generic optimization that speed up model. See https://pytorch....
Definition torch_api.F:1333
subroutine, public torch_dict_insert(dict, key, tensor)
Inserts a Torch tensor into a Torch dictionary.
Definition torch_api.F:1047
subroutine, public torch_tensor_release(tensor)
Releases a Torch tensor and all its ressources.
Definition torch_api.F:999
subroutine, public torch_model_forward(model, inputs, outputs)
Evaluates the given Torch model.
Definition torch_api.F:1169
All kind of helpful little routines.
Definition util.F:14
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
Definition cell_types.F:55
stores all the informations relevant to an mpi environment