97 particle_set, cell, pot_manybody, para_env, mm_section, use_virial)
104 REAL(
dp),
INTENT(INOUT) :: pot_manybody
107 LOGICAL,
INTENT(IN) :: use_virial
109 CHARACTER(LEN=*),
PARAMETER :: routinen =
'energy_manybody'
111 INTEGER :: atom_a, atom_b, handle, i, iend, ifirst, igrp, ikind, ilast, ilist, indexa, &
112 ipair, iparticle, iparticle_local, istart, iunique, jkind, junique, mpair, nkinds, &
113 nloc_size, npairs, nparticle, nparticle_local, nr_h3o, nr_o, nr_oh, nunique
114 INTEGER,
DIMENSION(:),
POINTER :: glob_loc_list_a, unique_list_a, work_list
115 INTEGER,
DIMENSION(:, :),
POINTER :: glob_loc_list,
list, sort_list
116 LOGICAL :: any_ace, any_allegro, any_deepmd, &
117 any_gal, any_gal21, any_nequip, &
118 any_quip, any_siepmann, any_tersoff
119 REAL(kind=
dp) :: drij, embed, pot_ace, pot_allegro, &
120 pot_deepmd, pot_loc, pot_nequip, &
121 pot_quip, qr, rab2_max, rij(3)
122 REAL(kind=
dp),
DIMENSION(3) :: cell_v, cvi
123 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: glob_cell_v
124 REAL(kind=
dp),
POINTER :: fembed(:)
127 TYPE(
eam_type),
DIMENSION(:),
POINTER :: eam_data
135 TYPE(
pos_type),
DIMENSION(:),
POINTER :: r_last_update_pbc
139 NULLIFY (eam, siepmann, tersoff, gal, gal21)
140 any_tersoff = .false.
141 any_siepmann = .false.
146 any_allegro = .false.
149 CALL timeset(routinen, handle)
151 potparm=potparm, eam_data=eam_data)
153 DO ikind = 1,
SIZE(atomic_kind_set)
154 pot => potparm%pot(ikind, ikind)%pot
155 DO i = 1,
SIZE(pot%type)
156 IF (pot%type(i) /=
ea_type) cycle
157 eam => pot%set(i)%eam
158 nparticle =
SIZE(particle_set)
159 ALLOCATE (fembed(nparticle))
161 cpassert(
ASSOCIATED(eam_data))
163 nparticle_local = local_particles%n_el(ikind)
164 DO iparticle_local = 1, nparticle_local
165 iparticle = local_particles%list(ikind)%array(iparticle_local)
166 indexa = int(eam_data(iparticle)%rho/eam%drhoar) + 1
167 IF (indexa > eam%npoints - 1) indexa = eam%npoints - 1
168 qr = eam_data(iparticle)%rho - eam%rhoval(indexa)
170 embed = eam%frho(indexa) + qr*eam%frhop(indexa)
171 fembed(iparticle) = eam%frhop(indexa) + qr*(eam%frhop(indexa + 1) - eam%frhop(indexa))/eam%drhoar
173 pot_manybody = pot_manybody + embed
176 CALL para_env%sum(fembed)
177 DO iparticle = 1, nparticle
178 IF (particle_set(iparticle)%atomic_kind%kind_number == ikind)
THEN
179 eam_data(iparticle)%f_embed = fembed(iparticle)
187 DO ikind = 1,
SIZE(atomic_kind_set)
188 DO jkind = ikind,
SIZE(atomic_kind_set)
189 pot => potparm%pot(ikind, jkind)%pot
190 any_tersoff = any_tersoff .OR. any(pot%type ==
tersoff_type)
191 any_quip = any_quip .OR. any(pot%type ==
quip_type)
192 any_nequip = any_nequip .OR. any(pot%type ==
nequip_type)
193 any_allegro = any_allegro .OR. any(pot%type ==
allegro_type)
194 any_ace = any_ace .OR. any(pot%type ==
ace_type)
195 any_deepmd = any_deepmd .OR. any(pot%type ==
deepmd_type)
196 any_siepmann = any_siepmann .OR. any(pot%type ==
siepmann_type)
197 any_gal = any_gal .OR. any(pot%type ==
gal_type)
198 any_gal21 = any_gal21 .OR. any(pot%type ==
gal21_type)
205 fist_nonbond_env, pot_quip, para_env)
206 pot_manybody = pot_manybody + pot_quip
210 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
211 CALL setup_nequip_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, cell)
213 nequip, glob_loc_list_a, r_last_update_pbc, pot_nequip, &
214 fist_nonbond_env, para_env, use_virial)
215 pot_manybody = pot_manybody + pot_nequip
219 IF (any_allegro)
THEN
220 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a, unique_list_a)
224 allegro, glob_loc_list_a, r_last_update_pbc, pot_allegro, &
225 fist_nonbond_env, unique_list_a, para_env, use_virial)
226 pot_manybody = pot_manybody + pot_allegro
232 fist_nonbond_env, pot_ace)
233 pot_manybody = pot_manybody + pot_ace
238 fist_nonbond_env, pot_deepmd, para_env)
239 pot_manybody = pot_manybody + pot_deepmd
243 IF (any_tersoff)
THEN
244 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
245 CALL setup_tersoff_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, cell)
246 DO ilist = 1, nonbonded%nlists
247 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
248 npairs = neighbor_kind_pair%npairs
249 IF (npairs == 0) cycle
250 kind_group_loop:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
251 istart = neighbor_kind_pair%grp_kind_start(igrp)
252 iend = neighbor_kind_pair%grp_kind_end(igrp)
253 ikind = neighbor_kind_pair%ij_kind(1, igrp)
254 jkind = neighbor_kind_pair%ij_kind(2, igrp)
255 list => neighbor_kind_pair%list
256 cvi = neighbor_kind_pair%cell_vector
257 pot => potparm%pot(ikind, jkind)%pot
258 DO i = 1,
SIZE(pot%type)
260 rab2_max = pot%set(i)%tersoff%rcutsq
261 cell_v = matmul(cell%hmat, cvi)
262 pot => potparm%pot(ikind, jkind)%pot
263 tersoff => pot%set(i)%tersoff
264 npairs = iend - istart + 1
265 IF (npairs /= 0)
THEN
266 ALLOCATE (sort_list(2, npairs), work_list(npairs))
267 sort_list =
list(:, istart:iend)
270 CALL sort(sort_list(1, :), npairs, work_list)
272 work_list(ipair) = sort_list(2, work_list(ipair))
274 sort_list(2, :) = work_list
277 DO ipair = 1, npairs - 1
278 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
281 junique = sort_list(1, ipair)
283 DO iunique = 1, nunique
285 IF (glob_loc_list_a(ifirst) > atom_a) cycle
286 DO mpair = ifirst,
SIZE(glob_loc_list_a)
287 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
290 DO mpair = ifirst,
SIZE(glob_loc_list_a)
291 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
295 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
296 DO WHILE (ipair <= npairs)
297 IF (sort_list(1, ipair) /= junique)
EXIT
298 atom_b = sort_list(2, ipair)
301 rij(:) = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
302 drij = dot_product(rij, rij)
304 IF (drij > rab2_max) cycle
306 CALL tersoff_energy(pot_loc, tersoff, r_last_update_pbc, atom_a, atom_b, nloc_size, &
307 glob_loc_list(:, ifirst:ilast), glob_cell_v(:, ifirst:ilast), cell_v, drij)
308 pot_manybody = pot_manybody + 0.5_dp*pot_loc
311 IF (ipair <= npairs) junique = sort_list(1, ipair)
313 DEALLOCATE (sort_list, work_list)
316 END DO kind_group_loop
322 IF (any_siepmann)
THEN
323 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
328 DO ilist = 1, nonbonded%nlists
329 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
330 npairs = neighbor_kind_pair%npairs
331 IF (npairs == 0) cycle
332 kind_group_loop_2:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
333 istart = neighbor_kind_pair%grp_kind_start(igrp)
334 iend = neighbor_kind_pair%grp_kind_end(igrp)
335 ikind = neighbor_kind_pair%ij_kind(1, igrp)
336 jkind = neighbor_kind_pair%ij_kind(2, igrp)
337 list => neighbor_kind_pair%list
338 cvi = neighbor_kind_pair%cell_vector
339 pot => potparm%pot(ikind, jkind)%pot
340 DO i = 1,
SIZE(pot%type)
342 rab2_max = pot%set(i)%siepmann%rcutsq
343 cell_v = matmul(cell%hmat, cvi)
344 pot => potparm%pot(ikind, jkind)%pot
345 siepmann => pot%set(i)%siepmann
346 npairs = iend - istart + 1
347 IF (npairs /= 0)
THEN
348 ALLOCATE (sort_list(2, npairs), work_list(npairs))
349 sort_list =
list(:, istart:iend)
352 CALL sort(sort_list(1, :), npairs, work_list)
354 work_list(ipair) = sort_list(2, work_list(ipair))
356 sort_list(2, :) = work_list
359 DO ipair = 1, npairs - 1
360 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
363 junique = sort_list(1, ipair)
365 DO iunique = 1, nunique
367 IF (glob_loc_list_a(ifirst) > atom_a) cycle
368 DO mpair = ifirst,
SIZE(glob_loc_list_a)
369 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
372 DO mpair = ifirst,
SIZE(glob_loc_list_a)
373 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
377 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
378 DO WHILE (ipair <= npairs)
379 IF (sort_list(1, ipair) /= junique)
EXIT
380 atom_b = sort_list(2, ipair)
383 rij(:) = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
384 drij = dot_product(rij, rij)
386 IF (drij > rab2_max) cycle
388 CALL siepmann_energy(pot_loc, siepmann, r_last_update_pbc, atom_a, atom_b, nloc_size, &
389 glob_loc_list(:, ifirst:ilast), cell_v, cell, drij, &
390 particle_set, nr_oh, nr_h3o, nr_o)
391 pot_manybody = pot_manybody + pot_loc
394 IF (ipair <= npairs) junique = sort_list(1, ipair)
396 DEALLOCATE (sort_list, work_list)
399 END DO kind_group_loop_2
403 print_h3o=.false., print_o=.false.)
405 print_h3o=.true., print_o=.false.)
407 print_h3o=.false., print_o=.true.)
412 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
413 CALL setup_gal_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, cell)
414 DO ilist = 1, nonbonded%nlists
415 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
416 npairs = neighbor_kind_pair%npairs
417 IF (npairs == 0) cycle
418 kind_group_loop_3:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
419 istart = neighbor_kind_pair%grp_kind_start(igrp)
420 iend = neighbor_kind_pair%grp_kind_end(igrp)
421 ikind = neighbor_kind_pair%ij_kind(1, igrp)
422 jkind = neighbor_kind_pair%ij_kind(2, igrp)
423 list => neighbor_kind_pair%list
424 cvi = neighbor_kind_pair%cell_vector
425 pot => potparm%pot(ikind, jkind)%pot
426 DO i = 1,
SIZE(pot%type)
428 rab2_max = pot%set(i)%gal%rcutsq
429 cell_v = matmul(cell%hmat, cvi)
430 pot => potparm%pot(ikind, jkind)%pot
431 gal => pot%set(i)%gal
432 npairs = iend - istart + 1
433 IF (npairs /= 0)
THEN
434 ALLOCATE (sort_list(2, npairs), work_list(npairs))
435 sort_list =
list(:, istart:iend)
438 CALL sort(sort_list(1, :), npairs, work_list)
440 work_list(ipair) = sort_list(2, work_list(ipair))
442 sort_list(2, :) = work_list
445 DO ipair = 1, npairs - 1
446 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
449 junique = sort_list(1, ipair)
451 DO iunique = 1, nunique
453 IF (glob_loc_list_a(ifirst) > atom_a) cycle
454 DO mpair = ifirst,
SIZE(glob_loc_list_a)
455 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
458 DO mpair = ifirst,
SIZE(glob_loc_list_a)
459 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
463 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
464 DO WHILE (ipair <= npairs)
465 IF (sort_list(1, ipair) /= junique)
EXIT
466 atom_b = sort_list(2, ipair)
469 rij(:) = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
470 drij = dot_product(rij, rij)
472 IF (drij > rab2_max) cycle
474 CALL gal_energy(pot_loc, gal, r_last_update_pbc, atom_a, atom_b, &
475 cell, particle_set, mm_section)
477 pot_manybody = pot_manybody + pot_loc
480 IF (ipair <= npairs) junique = sort_list(1, ipair)
482 DEALLOCATE (sort_list, work_list)
485 END DO kind_group_loop_3
492 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
493 CALL setup_gal21_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, cell)
494 DO ilist = 1, nonbonded%nlists
495 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
496 npairs = neighbor_kind_pair%npairs
497 IF (npairs == 0) cycle
498 kind_group_loop_5:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
499 istart = neighbor_kind_pair%grp_kind_start(igrp)
500 iend = neighbor_kind_pair%grp_kind_end(igrp)
501 ikind = neighbor_kind_pair%ij_kind(1, igrp)
502 jkind = neighbor_kind_pair%ij_kind(2, igrp)
503 list => neighbor_kind_pair%list
504 cvi = neighbor_kind_pair%cell_vector
505 pot => potparm%pot(ikind, jkind)%pot
506 DO i = 1,
SIZE(pot%type)
508 rab2_max = pot%set(i)%gal21%rcutsq
509 cell_v = matmul(cell%hmat, cvi)
510 pot => potparm%pot(ikind, jkind)%pot
511 gal21 => pot%set(i)%gal21
512 npairs = iend - istart + 1
513 IF (npairs /= 0)
THEN
514 ALLOCATE (sort_list(2, npairs), work_list(npairs))
515 sort_list =
list(:, istart:iend)
518 CALL sort(sort_list(1, :), npairs, work_list)
520 work_list(ipair) = sort_list(2, work_list(ipair))
522 sort_list(2, :) = work_list
525 DO ipair = 1, npairs - 1
526 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
529 junique = sort_list(1, ipair)
531 DO iunique = 1, nunique
533 IF (glob_loc_list_a(ifirst) > atom_a) cycle
534 DO mpair = ifirst,
SIZE(glob_loc_list_a)
535 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
538 DO mpair = ifirst,
SIZE(glob_loc_list_a)
539 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
543 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
544 DO WHILE (ipair <= npairs)
545 IF (sort_list(1, ipair) /= junique)
EXIT
546 atom_b = sort_list(2, ipair)
549 rij(:) = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
550 drij = dot_product(rij, rij)
552 IF (drij > rab2_max) cycle
554 CALL gal21_energy(pot_loc, gal21, r_last_update_pbc, atom_a, atom_b, &
555 cell, particle_set, mm_section)
557 pot_manybody = pot_manybody + pot_loc
560 IF (ipair <= npairs) junique = sort_list(1, ipair)
562 DEALLOCATE (sort_list, work_list)
565 END DO kind_group_loop_5
570 CALL timestop(handle)
586 f_nonbond, pv_nonbond, use_virial)
591 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: f_nonbond, pv_nonbond
592 LOGICAL,
INTENT(IN) :: use_virial
594 CHARACTER(LEN=*),
PARAMETER :: routinen =
'force_nonbond_manybody'
596 INTEGER :: atom_a, atom_b, handle, i, i_a, i_b, iend, ifirst, igrp, ikind, ilast, ilist, &
597 ipair, istart, iunique, jkind, junique, kind_a, kind_b, mpair, nkinds, nloc_size, npairs, &
599 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: eam_kinds_index
600 INTEGER,
DIMENSION(:),
POINTER :: glob_loc_list_a, work_list
601 INTEGER,
DIMENSION(:, :),
POINTER :: glob_loc_list,
list, sort_list
602 LOGICAL :: any_ace, any_allegro, any_deepmd, &
603 any_gal, any_gal21, any_nequip, &
604 any_quip, any_siepmann, any_tersoff
605 REAL(kind=
dp) :: f_eam,
fac, fr(3), ptens11, ptens12, ptens13, ptens21, ptens22, ptens23, &
606 ptens31, ptens32, ptens33, rab(3), rab2, rab2_max, rtmp(3)
607 REAL(kind=
dp),
DIMENSION(3) :: cell_v, cvi
608 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: glob_cell_v
610 TYPE(
eam_type),
DIMENSION(:),
POINTER :: eam_data
617 TYPE(
pos_type),
DIMENSION(:),
POINTER :: r_last_update_pbc
621 any_tersoff = .false.
624 any_allegro = .false.
625 any_siepmann = .false.
630 CALL timeset(routinen, handle)
631 NULLIFY (eam_a, eam_b, tersoff, siepmann, gal, gal21)
634 natom_types=nkinds, eam_data=eam_data, r_last_update_pbc=r_last_update_pbc)
638 ptens11 = 0.0_dp; ptens12 = 0.0_dp; ptens13 = 0.0_dp
639 ptens21 = 0.0_dp; ptens22 = 0.0_dp; ptens23 = 0.0_dp
640 ptens31 = 0.0_dp; ptens32 = 0.0_dp; ptens33 = 0.0_dp
643 nkinds =
SIZE(potparm%pot, 1)
644 ALLOCATE (eam_kinds_index(nkinds, nkinds))
647 DO jkind = ikind, nkinds
648 DO i = 1,
SIZE(potparm%pot(ikind, jkind)%pot%type)
649 IF (potparm%pot(ikind, jkind)%pot%type(i) ==
ea_type)
THEN
651 cpassert(eam_kinds_index(ikind, jkind) == -1)
652 cpassert(eam_kinds_index(jkind, ikind) == -1)
653 eam_kinds_index(ikind, jkind) = i
654 eam_kinds_index(jkind, ikind) = i
660 DO jkind = ikind, nkinds
661 any_ace = any_ace .OR. any(potparm%pot(ikind, jkind)%pot%type ==
ace_type)
669 DO jkind = ikind, nkinds
670 any_deepmd = any_deepmd .OR. any(potparm%pot(ikind, jkind)%pot%type ==
deepmd_type)
682 DO ilist = 1, nonbonded%nlists
683 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
684 npairs = neighbor_kind_pair%npairs
685 IF (npairs == 0) cycle
686 kind_group_loop1:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
687 istart = neighbor_kind_pair%grp_kind_start(igrp)
688 iend = neighbor_kind_pair%grp_kind_end(igrp)
689 ikind = neighbor_kind_pair%ij_kind(1, igrp)
690 jkind = neighbor_kind_pair%ij_kind(2, igrp)
691 list => neighbor_kind_pair%list
692 cvi = neighbor_kind_pair%cell_vector
693 pot => potparm%pot(ikind, jkind)%pot
695 rab2_max = pot%rcutsq
696 cell_v = matmul(cell%hmat, cvi)
697 any_tersoff = any_tersoff .OR. any(pot%type ==
tersoff_type)
698 any_siepmann = any_siepmann .OR. any(pot%type ==
siepmann_type)
699 any_ace = any_ace .OR. any(pot%type ==
ace_type)
700 any_deepmd = any_deepmd .OR. any(pot%type ==
deepmd_type)
701 any_gal = any_gal .OR. any(pot%type ==
gal_type)
702 any_gal21 = any_gal21 .OR. any(pot%type ==
gal21_type)
703 any_nequip = any_nequip .OR. any(pot%type ==
nequip_type)
704 any_allegro = any_allegro .OR. any(pot%type ==
allegro_type)
705 i = eam_kinds_index(ikind, jkind)
708 cpassert(
ASSOCIATED(eam_data))
709 DO ipair = istart, iend
710 atom_a =
list(1, ipair)
711 atom_b =
list(2, ipair)
713 IF (atom_a == atom_b)
fac = 0.5_dp
714 kind_a = particle_set(atom_a)%atomic_kind%kind_number
715 kind_b = particle_set(atom_b)%atomic_kind%kind_number
716 i_a = eam_kinds_index(kind_a, kind_a)
717 i_b = eam_kinds_index(kind_b, kind_b)
718 eam_a => potparm%pot(kind_a, kind_a)%pot%set(i_a)%eam
719 eam_b => potparm%pot(kind_b, kind_b)%pot%set(i_b)%eam
723 rab = r_last_update_pbc(atom_b)%r - r_last_update_pbc(atom_a)%r
725 rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
726 IF (rab2 <= rab2_max)
THEN
727 CALL get_force_eam(rab2, eam_a, eam_b, eam_data, atom_a, atom_b, f_eam)
730 fr(1) = -f_eam*rab(1)
731 fr(2) = -f_eam*rab(2)
732 fr(3) = -f_eam*rab(3)
733 f_nonbond(1, atom_a) = f_nonbond(1, atom_a) - fr(1)
734 f_nonbond(2, atom_a) = f_nonbond(2, atom_a) - fr(2)
735 f_nonbond(3, atom_a) = f_nonbond(3, atom_a) - fr(3)
737 f_nonbond(1, atom_b) = f_nonbond(1, atom_b) + fr(1)
738 f_nonbond(2, atom_b) = f_nonbond(2, atom_b) + fr(2)
739 f_nonbond(3, atom_b) = f_nonbond(3, atom_b) + fr(3)
741 ptens11 = ptens11 + rab(1)*fr(1)
742 ptens21 = ptens21 + rab(2)*fr(1)
743 ptens31 = ptens31 + rab(3)*fr(1)
744 ptens12 = ptens12 + rab(1)*fr(2)
745 ptens22 = ptens22 + rab(2)*fr(2)
746 ptens32 = ptens32 + rab(3)*fr(2)
747 ptens13 = ptens13 + rab(1)*fr(3)
748 ptens23 = ptens23 + rab(2)*fr(3)
749 ptens33 = ptens33 + rab(3)*fr(3)
753 END DO kind_group_loop1
755 DEALLOCATE (eam_kinds_index)
758 IF (any_tersoff)
THEN
759 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
760 CALL setup_tersoff_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, cell)
761 DO ilist = 1, nonbonded%nlists
762 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
763 npairs = neighbor_kind_pair%npairs
764 IF (npairs == 0) cycle
765 kind_group_loop2:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
766 istart = neighbor_kind_pair%grp_kind_start(igrp)
767 iend = neighbor_kind_pair%grp_kind_end(igrp)
768 ikind = neighbor_kind_pair%ij_kind(1, igrp)
769 jkind = neighbor_kind_pair%ij_kind(2, igrp)
770 list => neighbor_kind_pair%list
771 cvi = neighbor_kind_pair%cell_vector
772 pot => potparm%pot(ikind, jkind)%pot
775 rab2_max = pot%rcutsq
776 cell_v = matmul(cell%hmat, cvi)
777 DO i = 1,
SIZE(pot%type)
780 npairs = iend - istart + 1
781 tersoff => pot%set(i)%tersoff
782 ALLOCATE (sort_list(2, npairs), work_list(npairs))
783 sort_list =
list(:, istart:iend)
786 CALL sort(sort_list(1, :), npairs, work_list)
788 work_list(ipair) = sort_list(2, work_list(ipair))
790 sort_list(2, :) = work_list
793 DO ipair = 1, npairs - 1
794 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
797 junique = sort_list(1, ipair)
799 DO iunique = 1, nunique
801 IF (glob_loc_list_a(ifirst) > atom_a) cycle
802 DO mpair = ifirst,
SIZE(glob_loc_list_a)
803 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
806 DO mpair = ifirst,
SIZE(glob_loc_list_a)
807 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
811 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
812 DO WHILE (ipair <= npairs)
813 IF (sort_list(1, ipair) /= junique)
EXIT
814 atom_b = sort_list(2, ipair)
816 rtmp = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
818 IF (dot_product(rtmp, rtmp) <= tersoff%rcutsq)
THEN
820 nloc_size, glob_loc_list(:, ifirst:ilast), glob_cell_v(:, ifirst:ilast), &
821 atom_a, atom_b, f_nonbond, pv_nonbond, use_virial, tersoff%rcutsq)
825 IF (ipair <= npairs) junique = sort_list(1, ipair)
827 DEALLOCATE (sort_list, work_list)
830 END DO kind_group_loop2
835 IF (any_siepmann)
THEN
836 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
838 DO ilist = 1, nonbonded%nlists
839 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
840 npairs = neighbor_kind_pair%npairs
841 IF (npairs == 0) cycle
842 kind_group_loop3:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
843 istart = neighbor_kind_pair%grp_kind_start(igrp)
844 iend = neighbor_kind_pair%grp_kind_end(igrp)
845 ikind = neighbor_kind_pair%ij_kind(1, igrp)
846 jkind = neighbor_kind_pair%ij_kind(2, igrp)
847 list => neighbor_kind_pair%list
848 cvi = neighbor_kind_pair%cell_vector
849 pot => potparm%pot(ikind, jkind)%pot
852 rab2_max = pot%rcutsq
853 cell_v = matmul(cell%hmat, cvi)
854 DO i = 1,
SIZE(pot%type)
857 npairs = iend - istart + 1
858 siepmann => pot%set(i)%siepmann
859 ALLOCATE (sort_list(2, npairs), work_list(npairs))
860 sort_list =
list(:, istart:iend)
863 CALL sort(sort_list(1, :), npairs, work_list)
865 work_list(ipair) = sort_list(2, work_list(ipair))
867 sort_list(2, :) = work_list
870 DO ipair = 1, npairs - 1
871 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
874 junique = sort_list(1, ipair)
876 DO iunique = 1, nunique
878 IF (glob_loc_list_a(ifirst) > atom_a) cycle
879 DO mpair = ifirst,
SIZE(glob_loc_list_a)
880 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
883 DO mpair = ifirst,
SIZE(glob_loc_list_a)
884 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
888 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
889 DO WHILE (ipair <= npairs)
890 IF (sort_list(1, ipair) /= junique)
EXIT
891 atom_b = sort_list(2, ipair)
893 rtmp = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
895 IF (dot_product(rtmp, rtmp) <= siepmann%rcutsq)
THEN
897 atom_a, atom_b, f_nonbond, use_virial, siepmann%rcutsq, &
900 nloc_size, glob_loc_list(:, ifirst:ilast), &
901 atom_a, atom_b, f_nonbond, use_virial, siepmann%rcutsq, &
906 IF (ipair <= npairs) junique = sort_list(1, ipair)
908 DEALLOCATE (sort_list, work_list)
911 END DO kind_group_loop3
918 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
919 CALL setup_gal_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, cell)
920 DO ilist = 1, nonbonded%nlists
921 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
922 npairs = neighbor_kind_pair%npairs
923 IF (npairs == 0) cycle
924 kind_group_loop4:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
925 istart = neighbor_kind_pair%grp_kind_start(igrp)
926 iend = neighbor_kind_pair%grp_kind_end(igrp)
927 ikind = neighbor_kind_pair%ij_kind(1, igrp)
928 jkind = neighbor_kind_pair%ij_kind(2, igrp)
929 list => neighbor_kind_pair%list
930 cvi = neighbor_kind_pair%cell_vector
931 pot => potparm%pot(ikind, jkind)%pot
934 rab2_max = pot%rcutsq
935 cell_v = matmul(cell%hmat, cvi)
936 DO i = 1,
SIZE(pot%type)
939 npairs = iend - istart + 1
940 gal => pot%set(i)%gal
941 ALLOCATE (sort_list(2, npairs), work_list(npairs))
942 sort_list =
list(:, istart:iend)
945 CALL sort(sort_list(1, :), npairs, work_list)
947 work_list(ipair) = sort_list(2, work_list(ipair))
949 sort_list(2, :) = work_list
952 DO ipair = 1, npairs - 1
953 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
956 junique = sort_list(1, ipair)
958 DO iunique = 1, nunique
960 IF (glob_loc_list_a(ifirst) > atom_a) cycle
961 DO mpair = ifirst,
SIZE(glob_loc_list_a)
962 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
965 DO mpair = ifirst,
SIZE(glob_loc_list_a)
966 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
970 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
971 DO WHILE (ipair <= npairs)
972 IF (sort_list(1, ipair) /= junique)
EXIT
973 atom_b = sort_list(2, ipair)
975 rtmp = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
977 IF (dot_product(rtmp, rtmp) <= gal%rcutsq)
THEN
979 atom_a, atom_b, f_nonbond, use_virial, &
984 IF (ipair <= npairs) junique = sort_list(1, ipair)
986 DEALLOCATE (sort_list, work_list)
989 END DO kind_group_loop4
996 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
997 CALL setup_gal21_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, cell)
998 DO ilist = 1, nonbonded%nlists
999 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
1000 npairs = neighbor_kind_pair%npairs
1001 IF (npairs == 0) cycle
1002 kind_group_loop6:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
1003 istart = neighbor_kind_pair%grp_kind_start(igrp)
1004 iend = neighbor_kind_pair%grp_kind_end(igrp)
1005 ikind = neighbor_kind_pair%ij_kind(1, igrp)
1006 jkind = neighbor_kind_pair%ij_kind(2, igrp)
1007 list => neighbor_kind_pair%list
1008 cvi = neighbor_kind_pair%cell_vector
1009 pot => potparm%pot(ikind, jkind)%pot
1011 IF (pot%no_mb) cycle
1012 rab2_max = pot%rcutsq
1013 cell_v = matmul(cell%hmat, cvi)
1014 DO i = 1,
SIZE(pot%type)
1017 npairs = iend - istart + 1
1018 gal21 => pot%set(i)%gal21
1019 ALLOCATE (sort_list(2, npairs), work_list(npairs))
1020 sort_list =
list(:, istart:iend)
1023 CALL sort(sort_list(1, :), npairs, work_list)
1024 DO ipair = 1, npairs
1025 work_list(ipair) = sort_list(2, work_list(ipair))
1027 sort_list(2, :) = work_list
1030 DO ipair = 1, npairs - 1
1031 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
1034 junique = sort_list(1, ipair)
1036 DO iunique = 1, nunique
1038 IF (glob_loc_list_a(ifirst) > atom_a) cycle
1039 DO mpair = ifirst,
SIZE(glob_loc_list_a)
1040 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
1043 DO mpair = ifirst,
SIZE(glob_loc_list_a)
1044 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
1048 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
1049 DO WHILE (ipair <= npairs)
1050 IF (sort_list(1, ipair) /= junique)
EXIT
1051 atom_b = sort_list(2, ipair)
1053 rtmp = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
1055 IF (dot_product(rtmp, rtmp) <= gal21%rcutsq)
THEN
1057 atom_a, atom_b, f_nonbond, pv_nonbond, use_virial, &
1062 IF (ipair <= npairs) junique = sort_list(1, ipair)
1064 DEALLOCATE (sort_list, work_list)
1067 END DO kind_group_loop6
1073 IF (any_nequip)
THEN
1078 IF (any_allegro)
THEN
1082 IF (use_virial)
THEN
1083 pv_nonbond(1, 1) = pv_nonbond(1, 1) + ptens11
1084 pv_nonbond(1, 2) = pv_nonbond(1, 2) + ptens12
1085 pv_nonbond(1, 3) = pv_nonbond(1, 3) + ptens13
1086 pv_nonbond(2, 1) = pv_nonbond(2, 1) + ptens21
1087 pv_nonbond(2, 2) = pv_nonbond(2, 2) + ptens22
1088 pv_nonbond(2, 3) = pv_nonbond(2, 3) + ptens23
1089 pv_nonbond(3, 1) = pv_nonbond(3, 1) + ptens31
1090 pv_nonbond(3, 2) = pv_nonbond(3, 2) + ptens32
1091 pv_nonbond(3, 3) = pv_nonbond(3, 3) + ptens33
1093 CALL timestop(handle)