95 particle_set, cell, pot_manybody, para_env, mm_section, use_virial)
102 REAL(
dp),
INTENT(INOUT) :: pot_manybody
105 LOGICAL,
INTENT(IN) :: use_virial
107 CHARACTER(LEN=*),
PARAMETER :: routinen =
'energy_manybody'
109 INTEGER :: atom_a, atom_b, handle, i, iend, ifirst, igrp, ikind, ilast, ilist, indexa, &
110 ipair, iparticle, iparticle_local, istart, iunique, jkind, junique, mpair, nkinds, &
111 nloc_size, npairs, nparticle, nparticle_local, nr_h3o, nr_o, nr_oh, nunique
112 INTEGER,
DIMENSION(:),
POINTER :: glob_loc_list_a, unique_list_a, work_list
113 INTEGER,
DIMENSION(:, :),
POINTER :: glob_loc_list,
list, sort_list
114 LOGICAL :: any_ace, any_allegro, any_deepmd, &
115 any_gal, any_gal21, any_nequip, &
116 any_siepmann, any_tersoff
117 REAL(kind=
dp) :: drij, embed, pot_ace, pot_allegro, &
118 pot_deepmd, pot_loc, pot_nequip, qr, &
120 REAL(kind=
dp),
DIMENSION(3) :: cell_v, cvi
121 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: glob_cell_v
122 REAL(kind=
dp),
POINTER :: fembed(:)
125 TYPE(
eam_type),
DIMENSION(:),
POINTER :: eam_data
133 TYPE(
pos_type),
DIMENSION(:),
POINTER :: r_last_update_pbc
137 NULLIFY (eam, siepmann, tersoff, gal, gal21)
138 any_tersoff = .false.
139 any_siepmann = .false.
143 any_allegro = .false.
146 CALL timeset(routinen, handle)
148 potparm=potparm, eam_data=eam_data)
150 DO ikind = 1,
SIZE(atomic_kind_set)
151 pot => potparm%pot(ikind, ikind)%pot
152 DO i = 1,
SIZE(pot%type)
153 IF (pot%type(i) /=
ea_type) cycle
154 eam => pot%set(i)%eam
155 nparticle =
SIZE(particle_set)
156 ALLOCATE (fembed(nparticle))
158 cpassert(
ASSOCIATED(eam_data))
160 nparticle_local = local_particles%n_el(ikind)
161 DO iparticle_local = 1, nparticle_local
162 iparticle = local_particles%list(ikind)%array(iparticle_local)
163 indexa = int(eam_data(iparticle)%rho/eam%drhoar) + 1
164 IF (indexa > eam%npoints - 1) indexa = eam%npoints - 1
165 qr = eam_data(iparticle)%rho - eam%rhoval(indexa)
167 embed = eam%frho(indexa) + qr*eam%frhop(indexa)
168 fembed(iparticle) = eam%frhop(indexa) + qr*(eam%frhop(indexa + 1) - eam%frhop(indexa))/eam%drhoar
170 pot_manybody = pot_manybody + embed
173 CALL para_env%sum(fembed)
174 DO iparticle = 1, nparticle
175 IF (particle_set(iparticle)%atomic_kind%kind_number == ikind)
THEN
176 eam_data(iparticle)%f_embed = fembed(iparticle)
184 DO ikind = 1,
SIZE(atomic_kind_set)
185 DO jkind = ikind,
SIZE(atomic_kind_set)
186 pot => potparm%pot(ikind, jkind)%pot
187 any_tersoff = any_tersoff .OR. any(pot%type ==
tersoff_type)
188 any_nequip = any_nequip .OR. any(pot%type ==
nequip_type)
189 any_allegro = any_allegro .OR. any(pot%type ==
allegro_type)
190 any_ace = any_ace .OR. any(pot%type ==
ace_type)
191 any_deepmd = any_deepmd .OR. any(pot%type ==
deepmd_type)
192 any_siepmann = any_siepmann .OR. any(pot%type ==
siepmann_type)
193 any_gal = any_gal .OR. any(pot%type ==
gal_type)
194 any_gal21 = any_gal21 .OR. any(pot%type ==
gal21_type)
200 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
201 CALL setup_nequip_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, cell)
203 nequip, glob_loc_list_a, r_last_update_pbc, pot_nequip, &
204 fist_nonbond_env, para_env, use_virial)
205 pot_manybody = pot_manybody + pot_nequip
209 IF (any_allegro)
THEN
210 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a, unique_list_a)
214 allegro, glob_loc_list_a, r_last_update_pbc, pot_allegro, &
215 fist_nonbond_env, unique_list_a, para_env, use_virial)
216 pot_manybody = pot_manybody + pot_allegro
222 fist_nonbond_env, pot_ace)
223 pot_manybody = pot_manybody + pot_ace
228 fist_nonbond_env, pot_deepmd, para_env)
229 pot_manybody = pot_manybody + pot_deepmd
233 IF (any_tersoff)
THEN
234 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
235 CALL setup_tersoff_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, cell)
236 DO ilist = 1, nonbonded%nlists
237 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
238 npairs = neighbor_kind_pair%npairs
239 IF (npairs == 0) cycle
240 kind_group_loop:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
241 istart = neighbor_kind_pair%grp_kind_start(igrp)
242 iend = neighbor_kind_pair%grp_kind_end(igrp)
243 ikind = neighbor_kind_pair%ij_kind(1, igrp)
244 jkind = neighbor_kind_pair%ij_kind(2, igrp)
245 list => neighbor_kind_pair%list
246 cvi = neighbor_kind_pair%cell_vector
247 pot => potparm%pot(ikind, jkind)%pot
248 DO i = 1,
SIZE(pot%type)
250 rab2_max = pot%set(i)%tersoff%rcutsq
251 cell_v = matmul(cell%hmat, cvi)
252 pot => potparm%pot(ikind, jkind)%pot
253 tersoff => pot%set(i)%tersoff
254 npairs = iend - istart + 1
255 IF (npairs /= 0)
THEN
256 ALLOCATE (sort_list(2, npairs), work_list(npairs))
257 sort_list =
list(:, istart:iend)
260 CALL sort(sort_list(1, :), npairs, work_list)
262 work_list(ipair) = sort_list(2, work_list(ipair))
264 sort_list(2, :) = work_list
267 DO ipair = 1, npairs - 1
268 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
271 junique = sort_list(1, ipair)
273 DO iunique = 1, nunique
275 IF (glob_loc_list_a(ifirst) > atom_a) cycle
276 DO mpair = ifirst,
SIZE(glob_loc_list_a)
277 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
280 DO mpair = ifirst,
SIZE(glob_loc_list_a)
281 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
285 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
286 DO WHILE (ipair <= npairs)
287 IF (sort_list(1, ipair) /= junique)
EXIT
288 atom_b = sort_list(2, ipair)
291 rij(:) = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
292 drij = dot_product(rij, rij)
294 IF (drij > rab2_max) cycle
296 CALL tersoff_energy(pot_loc, tersoff, r_last_update_pbc, atom_a, atom_b, nloc_size, &
297 glob_loc_list(:, ifirst:ilast), glob_cell_v(:, ifirst:ilast), cell_v, drij)
298 pot_manybody = pot_manybody + 0.5_dp*pot_loc
301 IF (ipair <= npairs) junique = sort_list(1, ipair)
303 DEALLOCATE (sort_list, work_list)
306 END DO kind_group_loop
312 IF (any_siepmann)
THEN
313 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
318 DO ilist = 1, nonbonded%nlists
319 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
320 npairs = neighbor_kind_pair%npairs
321 IF (npairs == 0) cycle
322 kind_group_loop_2:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
323 istart = neighbor_kind_pair%grp_kind_start(igrp)
324 iend = neighbor_kind_pair%grp_kind_end(igrp)
325 ikind = neighbor_kind_pair%ij_kind(1, igrp)
326 jkind = neighbor_kind_pair%ij_kind(2, igrp)
327 list => neighbor_kind_pair%list
328 cvi = neighbor_kind_pair%cell_vector
329 pot => potparm%pot(ikind, jkind)%pot
330 DO i = 1,
SIZE(pot%type)
332 rab2_max = pot%set(i)%siepmann%rcutsq
333 cell_v = matmul(cell%hmat, cvi)
334 pot => potparm%pot(ikind, jkind)%pot
335 siepmann => pot%set(i)%siepmann
336 npairs = iend - istart + 1
337 IF (npairs /= 0)
THEN
338 ALLOCATE (sort_list(2, npairs), work_list(npairs))
339 sort_list =
list(:, istart:iend)
342 CALL sort(sort_list(1, :), npairs, work_list)
344 work_list(ipair) = sort_list(2, work_list(ipair))
346 sort_list(2, :) = work_list
349 DO ipair = 1, npairs - 1
350 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
353 junique = sort_list(1, ipair)
355 DO iunique = 1, nunique
357 IF (glob_loc_list_a(ifirst) > atom_a) cycle
358 DO mpair = ifirst,
SIZE(glob_loc_list_a)
359 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
362 DO mpair = ifirst,
SIZE(glob_loc_list_a)
363 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
367 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
368 DO WHILE (ipair <= npairs)
369 IF (sort_list(1, ipair) /= junique)
EXIT
370 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)
376 IF (drij > rab2_max) cycle
378 CALL siepmann_energy(pot_loc, siepmann, r_last_update_pbc, atom_a, atom_b, nloc_size, &
379 glob_loc_list(:, ifirst:ilast), cell_v, cell, drij, &
380 particle_set, nr_oh, nr_h3o, nr_o)
381 pot_manybody = pot_manybody + pot_loc
384 IF (ipair <= npairs) junique = sort_list(1, ipair)
386 DEALLOCATE (sort_list, work_list)
389 END DO kind_group_loop_2
393 print_h3o=.false., print_o=.false.)
395 print_h3o=.true., print_o=.false.)
397 print_h3o=.false., print_o=.true.)
402 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
403 CALL setup_gal_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, cell)
404 DO ilist = 1, nonbonded%nlists
405 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
406 npairs = neighbor_kind_pair%npairs
407 IF (npairs == 0) cycle
408 kind_group_loop_3:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
409 istart = neighbor_kind_pair%grp_kind_start(igrp)
410 iend = neighbor_kind_pair%grp_kind_end(igrp)
411 ikind = neighbor_kind_pair%ij_kind(1, igrp)
412 jkind = neighbor_kind_pair%ij_kind(2, igrp)
413 list => neighbor_kind_pair%list
414 cvi = neighbor_kind_pair%cell_vector
415 pot => potparm%pot(ikind, jkind)%pot
416 DO i = 1,
SIZE(pot%type)
418 rab2_max = pot%set(i)%gal%rcutsq
419 cell_v = matmul(cell%hmat, cvi)
420 pot => potparm%pot(ikind, jkind)%pot
421 gal => pot%set(i)%gal
422 npairs = iend - istart + 1
423 IF (npairs /= 0)
THEN
424 ALLOCATE (sort_list(2, npairs), work_list(npairs))
425 sort_list =
list(:, istart:iend)
428 CALL sort(sort_list(1, :), npairs, work_list)
430 work_list(ipair) = sort_list(2, work_list(ipair))
432 sort_list(2, :) = work_list
435 DO ipair = 1, npairs - 1
436 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
439 junique = sort_list(1, ipair)
441 DO iunique = 1, nunique
443 IF (glob_loc_list_a(ifirst) > atom_a) cycle
444 DO mpair = ifirst,
SIZE(glob_loc_list_a)
445 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
448 DO mpair = ifirst,
SIZE(glob_loc_list_a)
449 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
453 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
454 DO WHILE (ipair <= npairs)
455 IF (sort_list(1, ipair) /= junique)
EXIT
456 atom_b = sort_list(2, ipair)
459 rij(:) = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
460 drij = dot_product(rij, rij)
462 IF (drij > rab2_max) cycle
464 CALL gal_energy(pot_loc, gal, r_last_update_pbc, atom_a, atom_b, &
465 cell, particle_set, mm_section)
467 pot_manybody = pot_manybody + pot_loc
470 IF (ipair <= npairs) junique = sort_list(1, ipair)
472 DEALLOCATE (sort_list, work_list)
475 END DO kind_group_loop_3
482 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
483 CALL setup_gal21_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, cell)
484 DO ilist = 1, nonbonded%nlists
485 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
486 npairs = neighbor_kind_pair%npairs
487 IF (npairs == 0) cycle
488 kind_group_loop_5:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
489 istart = neighbor_kind_pair%grp_kind_start(igrp)
490 iend = neighbor_kind_pair%grp_kind_end(igrp)
491 ikind = neighbor_kind_pair%ij_kind(1, igrp)
492 jkind = neighbor_kind_pair%ij_kind(2, igrp)
493 list => neighbor_kind_pair%list
494 cvi = neighbor_kind_pair%cell_vector
495 pot => potparm%pot(ikind, jkind)%pot
496 DO i = 1,
SIZE(pot%type)
498 rab2_max = pot%set(i)%gal21%rcutsq
499 cell_v = matmul(cell%hmat, cvi)
500 pot => potparm%pot(ikind, jkind)%pot
501 gal21 => pot%set(i)%gal21
502 npairs = iend - istart + 1
503 IF (npairs /= 0)
THEN
504 ALLOCATE (sort_list(2, npairs), work_list(npairs))
505 sort_list =
list(:, istart:iend)
508 CALL sort(sort_list(1, :), npairs, work_list)
510 work_list(ipair) = sort_list(2, work_list(ipair))
512 sort_list(2, :) = work_list
515 DO ipair = 1, npairs - 1
516 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
519 junique = sort_list(1, ipair)
521 DO iunique = 1, nunique
523 IF (glob_loc_list_a(ifirst) > atom_a) cycle
524 DO mpair = ifirst,
SIZE(glob_loc_list_a)
525 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
528 DO mpair = ifirst,
SIZE(glob_loc_list_a)
529 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
533 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
534 DO WHILE (ipair <= npairs)
535 IF (sort_list(1, ipair) /= junique)
EXIT
536 atom_b = sort_list(2, ipair)
539 rij(:) = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
540 drij = dot_product(rij, rij)
542 IF (drij > rab2_max) cycle
544 CALL gal21_energy(pot_loc, gal21, r_last_update_pbc, atom_a, atom_b, &
545 cell, particle_set, mm_section)
547 pot_manybody = pot_manybody + pot_loc
550 IF (ipair <= npairs) junique = sort_list(1, ipair)
552 DEALLOCATE (sort_list, work_list)
555 END DO kind_group_loop_5
560 CALL timestop(handle)
576 f_nonbond, pv_nonbond, use_virial)
581 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: f_nonbond, pv_nonbond
582 LOGICAL,
INTENT(IN) :: use_virial
584 CHARACTER(LEN=*),
PARAMETER :: routinen =
'force_nonbond_manybody'
586 INTEGER :: atom_a, atom_b, handle, i, i_a, i_b, iend, ifirst, igrp, ikind, ilast, ilist, &
587 ipair, istart, iunique, jkind, junique, kind_a, kind_b, mpair, nkinds, nloc_size, npairs, &
589 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: eam_kinds_index
590 INTEGER,
DIMENSION(:),
POINTER :: glob_loc_list_a, work_list
591 INTEGER,
DIMENSION(:, :),
POINTER :: glob_loc_list,
list, sort_list
592 LOGICAL :: any_ace, any_allegro, any_deepmd, &
593 any_gal, any_gal21, any_nequip, &
594 any_siepmann, any_tersoff
595 REAL(kind=
dp) :: f_eam,
fac, fr(3), ptens11, ptens12, ptens13, ptens21, ptens22, ptens23, &
596 ptens31, ptens32, ptens33, rab(3), rab2, rab2_max, rtmp(3)
597 REAL(kind=
dp),
DIMENSION(3) :: cell_v, cvi
598 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: glob_cell_v
600 TYPE(
eam_type),
DIMENSION(:),
POINTER :: eam_data
607 TYPE(
pos_type),
DIMENSION(:),
POINTER :: r_last_update_pbc
611 any_tersoff = .false.
613 any_allegro = .false.
614 any_siepmann = .false.
619 CALL timeset(routinen, handle)
620 NULLIFY (eam_a, eam_b, tersoff, siepmann, gal, gal21)
623 natom_types=nkinds, eam_data=eam_data, r_last_update_pbc=r_last_update_pbc)
627 ptens11 = 0.0_dp; ptens12 = 0.0_dp; ptens13 = 0.0_dp
628 ptens21 = 0.0_dp; ptens22 = 0.0_dp; ptens23 = 0.0_dp
629 ptens31 = 0.0_dp; ptens32 = 0.0_dp; ptens33 = 0.0_dp
632 nkinds =
SIZE(potparm%pot, 1)
633 ALLOCATE (eam_kinds_index(nkinds, nkinds))
636 DO jkind = ikind, nkinds
637 DO i = 1,
SIZE(potparm%pot(ikind, jkind)%pot%type)
638 IF (potparm%pot(ikind, jkind)%pot%type(i) ==
ea_type)
THEN
640 cpassert(eam_kinds_index(ikind, jkind) == -1)
641 cpassert(eam_kinds_index(jkind, ikind) == -1)
642 eam_kinds_index(ikind, jkind) = i
643 eam_kinds_index(jkind, ikind) = i
649 DO jkind = ikind, nkinds
650 any_ace = any_ace .OR. any(potparm%pot(ikind, jkind)%pot%type ==
ace_type)
658 DO jkind = ikind, nkinds
659 any_deepmd = any_deepmd .OR. any(potparm%pot(ikind, jkind)%pot%type ==
deepmd_type)
667 DO ilist = 1, nonbonded%nlists
668 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
669 npairs = neighbor_kind_pair%npairs
670 IF (npairs == 0) cycle
671 kind_group_loop1:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
672 istart = neighbor_kind_pair%grp_kind_start(igrp)
673 iend = neighbor_kind_pair%grp_kind_end(igrp)
674 ikind = neighbor_kind_pair%ij_kind(1, igrp)
675 jkind = neighbor_kind_pair%ij_kind(2, igrp)
676 list => neighbor_kind_pair%list
677 cvi = neighbor_kind_pair%cell_vector
678 pot => potparm%pot(ikind, jkind)%pot
679 IF (pot%no_mb) cycle kind_group_loop1
680 rab2_max = pot%rcutsq
681 cell_v = matmul(cell%hmat, cvi)
682 any_tersoff = any_tersoff .OR. any(pot%type ==
tersoff_type)
683 any_siepmann = any_siepmann .OR. any(pot%type ==
siepmann_type)
684 any_ace = any_ace .OR. any(pot%type ==
ace_type)
685 any_deepmd = any_deepmd .OR. any(pot%type ==
deepmd_type)
686 any_gal = any_gal .OR. any(pot%type ==
gal_type)
687 any_gal21 = any_gal21 .OR. any(pot%type ==
gal21_type)
688 any_nequip = any_nequip .OR. any(pot%type ==
nequip_type)
689 any_allegro = any_allegro .OR. any(pot%type ==
allegro_type)
690 i = eam_kinds_index(ikind, jkind)
691 IF (i == -1) cycle kind_group_loop1
693 cpassert(
ASSOCIATED(eam_data))
694 DO ipair = istart, iend
695 atom_a =
list(1, ipair)
696 atom_b =
list(2, ipair)
698 IF (atom_a == atom_b)
fac = 0.5_dp
699 kind_a = particle_set(atom_a)%atomic_kind%kind_number
700 kind_b = particle_set(atom_b)%atomic_kind%kind_number
701 i_a = eam_kinds_index(kind_a, kind_a)
702 i_b = eam_kinds_index(kind_b, kind_b)
703 eam_a => potparm%pot(kind_a, kind_a)%pot%set(i_a)%eam
704 eam_b => potparm%pot(kind_b, kind_b)%pot%set(i_b)%eam
708 rab = r_last_update_pbc(atom_b)%r - r_last_update_pbc(atom_a)%r
710 rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
711 IF (rab2 <= rab2_max)
THEN
712 CALL get_force_eam(rab2, eam_a, eam_b, eam_data, atom_a, atom_b, f_eam)
715 fr(1) = -f_eam*rab(1)
716 fr(2) = -f_eam*rab(2)
717 fr(3) = -f_eam*rab(3)
718 f_nonbond(1, atom_a) = f_nonbond(1, atom_a) - fr(1)
719 f_nonbond(2, atom_a) = f_nonbond(2, atom_a) - fr(2)
720 f_nonbond(3, atom_a) = f_nonbond(3, atom_a) - fr(3)
722 f_nonbond(1, atom_b) = f_nonbond(1, atom_b) + fr(1)
723 f_nonbond(2, atom_b) = f_nonbond(2, atom_b) + fr(2)
724 f_nonbond(3, atom_b) = f_nonbond(3, atom_b) + fr(3)
726 ptens11 = ptens11 + rab(1)*fr(1)
727 ptens21 = ptens21 + rab(2)*fr(1)
728 ptens31 = ptens31 + rab(3)*fr(1)
729 ptens12 = ptens12 + rab(1)*fr(2)
730 ptens22 = ptens22 + rab(2)*fr(2)
731 ptens32 = ptens32 + rab(3)*fr(2)
732 ptens13 = ptens13 + rab(1)*fr(3)
733 ptens23 = ptens23 + rab(2)*fr(3)
734 ptens33 = ptens33 + rab(3)*fr(3)
738 END DO kind_group_loop1
740 DEALLOCATE (eam_kinds_index)
743 IF (any_tersoff)
THEN
744 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
745 CALL setup_tersoff_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, cell)
746 DO ilist = 1, nonbonded%nlists
747 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
748 npairs = neighbor_kind_pair%npairs
749 IF (npairs == 0) cycle
750 kind_group_loop2:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
751 istart = neighbor_kind_pair%grp_kind_start(igrp)
752 iend = neighbor_kind_pair%grp_kind_end(igrp)
753 ikind = neighbor_kind_pair%ij_kind(1, igrp)
754 jkind = neighbor_kind_pair%ij_kind(2, igrp)
755 list => neighbor_kind_pair%list
756 cvi = neighbor_kind_pair%cell_vector
757 pot => potparm%pot(ikind, jkind)%pot
759 IF (pot%no_mb) cycle kind_group_loop2
760 rab2_max = pot%rcutsq
761 cell_v = matmul(cell%hmat, cvi)
762 DO i = 1,
SIZE(pot%type)
765 npairs = iend - istart + 1
766 tersoff => pot%set(i)%tersoff
767 ALLOCATE (sort_list(2, npairs), work_list(npairs))
768 sort_list =
list(:, istart:iend)
771 CALL sort(sort_list(1, :), npairs, work_list)
773 work_list(ipair) = sort_list(2, work_list(ipair))
775 sort_list(2, :) = work_list
778 DO ipair = 1, npairs - 1
779 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
782 junique = sort_list(1, ipair)
784 DO iunique = 1, nunique
786 IF (glob_loc_list_a(ifirst) > atom_a) cycle
787 DO mpair = ifirst,
SIZE(glob_loc_list_a)
788 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
791 DO mpair = ifirst,
SIZE(glob_loc_list_a)
792 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
796 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
797 DO WHILE (ipair <= npairs)
798 IF (sort_list(1, ipair) /= junique)
EXIT
799 atom_b = sort_list(2, ipair)
801 rtmp = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
803 IF (dot_product(rtmp, rtmp) <= tersoff%rcutsq)
THEN
805 nloc_size, glob_loc_list(:, ifirst:ilast), glob_cell_v(:, ifirst:ilast), &
806 atom_a, atom_b, f_nonbond, pv_nonbond, use_virial, tersoff%rcutsq)
810 IF (ipair <= npairs) junique = sort_list(1, ipair)
812 DEALLOCATE (sort_list, work_list)
815 END DO kind_group_loop2
820 IF (any_siepmann)
THEN
821 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
823 DO ilist = 1, nonbonded%nlists
824 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
825 npairs = neighbor_kind_pair%npairs
826 IF (npairs == 0) cycle
827 kind_group_loop3:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
828 istart = neighbor_kind_pair%grp_kind_start(igrp)
829 iend = neighbor_kind_pair%grp_kind_end(igrp)
830 ikind = neighbor_kind_pair%ij_kind(1, igrp)
831 jkind = neighbor_kind_pair%ij_kind(2, igrp)
832 list => neighbor_kind_pair%list
833 cvi = neighbor_kind_pair%cell_vector
834 pot => potparm%pot(ikind, jkind)%pot
836 IF (pot%no_mb) cycle kind_group_loop3
837 rab2_max = pot%rcutsq
838 cell_v = matmul(cell%hmat, cvi)
839 DO i = 1,
SIZE(pot%type)
842 npairs = iend - istart + 1
843 siepmann => pot%set(i)%siepmann
844 ALLOCATE (sort_list(2, npairs), work_list(npairs))
845 sort_list =
list(:, istart:iend)
848 CALL sort(sort_list(1, :), npairs, work_list)
850 work_list(ipair) = sort_list(2, work_list(ipair))
852 sort_list(2, :) = work_list
855 DO ipair = 1, npairs - 1
856 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
859 junique = sort_list(1, ipair)
861 DO iunique = 1, nunique
863 IF (glob_loc_list_a(ifirst) > atom_a) cycle
864 DO mpair = ifirst,
SIZE(glob_loc_list_a)
865 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
868 DO mpair = ifirst,
SIZE(glob_loc_list_a)
869 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
873 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
874 DO WHILE (ipair <= npairs)
875 IF (sort_list(1, ipair) /= junique)
EXIT
876 atom_b = sort_list(2, ipair)
878 rtmp = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
880 IF (dot_product(rtmp, rtmp) <= siepmann%rcutsq)
THEN
882 atom_a, atom_b, f_nonbond, use_virial, siepmann%rcutsq, &
885 nloc_size, glob_loc_list(:, ifirst:ilast), &
886 atom_a, atom_b, f_nonbond, use_virial, siepmann%rcutsq, &
891 IF (ipair <= npairs) junique = sort_list(1, ipair)
893 DEALLOCATE (sort_list, work_list)
896 END DO kind_group_loop3
903 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
904 CALL setup_gal_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, cell)
905 DO ilist = 1, nonbonded%nlists
906 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
907 npairs = neighbor_kind_pair%npairs
908 IF (npairs == 0) cycle
909 kind_group_loop4:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
910 istart = neighbor_kind_pair%grp_kind_start(igrp)
911 iend = neighbor_kind_pair%grp_kind_end(igrp)
912 ikind = neighbor_kind_pair%ij_kind(1, igrp)
913 jkind = neighbor_kind_pair%ij_kind(2, igrp)
914 list => neighbor_kind_pair%list
915 cvi = neighbor_kind_pair%cell_vector
916 pot => potparm%pot(ikind, jkind)%pot
918 IF (pot%no_mb) cycle kind_group_loop4
919 rab2_max = pot%rcutsq
920 cell_v = matmul(cell%hmat, cvi)
921 DO i = 1,
SIZE(pot%type)
924 npairs = iend - istart + 1
925 gal => pot%set(i)%gal
926 ALLOCATE (sort_list(2, npairs), work_list(npairs))
927 sort_list =
list(:, istart:iend)
930 CALL sort(sort_list(1, :), npairs, work_list)
932 work_list(ipair) = sort_list(2, work_list(ipair))
934 sort_list(2, :) = work_list
937 DO ipair = 1, npairs - 1
938 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
941 junique = sort_list(1, ipair)
943 DO iunique = 1, nunique
945 IF (glob_loc_list_a(ifirst) > atom_a) cycle
946 DO mpair = ifirst,
SIZE(glob_loc_list_a)
947 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
950 DO mpair = ifirst,
SIZE(glob_loc_list_a)
951 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
955 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
956 DO WHILE (ipair <= npairs)
957 IF (sort_list(1, ipair) /= junique)
EXIT
958 atom_b = sort_list(2, ipair)
960 rtmp = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
962 IF (dot_product(rtmp, rtmp) <= gal%rcutsq)
THEN
964 atom_a, atom_b, f_nonbond, use_virial, &
969 IF (ipair <= npairs) junique = sort_list(1, ipair)
971 DEALLOCATE (sort_list, work_list)
974 END DO kind_group_loop4
981 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
982 CALL setup_gal21_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, cell)
983 DO ilist = 1, nonbonded%nlists
984 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
985 npairs = neighbor_kind_pair%npairs
986 IF (npairs == 0) cycle
987 kind_group_loop6:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
988 istart = neighbor_kind_pair%grp_kind_start(igrp)
989 iend = neighbor_kind_pair%grp_kind_end(igrp)
990 ikind = neighbor_kind_pair%ij_kind(1, igrp)
991 jkind = neighbor_kind_pair%ij_kind(2, igrp)
992 list => neighbor_kind_pair%list
993 cvi = neighbor_kind_pair%cell_vector
994 pot => potparm%pot(ikind, jkind)%pot
996 IF (pot%no_mb) cycle kind_group_loop6
997 rab2_max = pot%rcutsq
998 cell_v = matmul(cell%hmat, cvi)
999 DO i = 1,
SIZE(pot%type)
1002 npairs = iend - istart + 1
1003 gal21 => pot%set(i)%gal21
1004 ALLOCATE (sort_list(2, npairs), work_list(npairs))
1005 sort_list =
list(:, istart:iend)
1008 CALL sort(sort_list(1, :), npairs, work_list)
1009 DO ipair = 1, npairs
1010 work_list(ipair) = sort_list(2, work_list(ipair))
1012 sort_list(2, :) = work_list
1015 DO ipair = 1, npairs - 1
1016 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
1019 junique = sort_list(1, ipair)
1021 DO iunique = 1, nunique
1023 IF (glob_loc_list_a(ifirst) > atom_a) cycle
1024 DO mpair = ifirst,
SIZE(glob_loc_list_a)
1025 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
1028 DO mpair = ifirst,
SIZE(glob_loc_list_a)
1029 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
1033 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
1034 DO WHILE (ipair <= npairs)
1035 IF (sort_list(1, ipair) /= junique)
EXIT
1036 atom_b = sort_list(2, ipair)
1038 rtmp = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
1040 IF (dot_product(rtmp, rtmp) <= gal21%rcutsq)
THEN
1042 atom_a, atom_b, f_nonbond, pv_nonbond, use_virial, &
1047 IF (ipair <= npairs) junique = sort_list(1, ipair)
1049 DEALLOCATE (sort_list, work_list)
1052 END DO kind_group_loop6
1058 IF (any_nequip)
THEN
1063 IF (any_allegro)
THEN
1067 IF (use_virial)
THEN
1068 pv_nonbond(1, 1) = pv_nonbond(1, 1) + ptens11
1069 pv_nonbond(1, 2) = pv_nonbond(1, 2) + ptens12
1070 pv_nonbond(1, 3) = pv_nonbond(1, 3) + ptens13
1071 pv_nonbond(2, 1) = pv_nonbond(2, 1) + ptens21
1072 pv_nonbond(2, 2) = pv_nonbond(2, 2) + ptens22
1073 pv_nonbond(2, 3) = pv_nonbond(2, 3) + ptens23
1074 pv_nonbond(3, 1) = pv_nonbond(3, 1) + ptens31
1075 pv_nonbond(3, 2) = pv_nonbond(3, 2) + ptens32
1076 pv_nonbond(3, 3) = pv_nonbond(3, 3) + ptens33
1078 CALL timestop(handle)