88 particle_set, cell, pot_manybody, para_env, mm_section, use_virial)
95 REAL(
dp),
INTENT(INOUT) :: pot_manybody
98 LOGICAL,
INTENT(IN) :: use_virial
100 CHARACTER(LEN=*),
PARAMETER :: routinen =
'energy_manybody'
102 INTEGER :: atom_a, atom_b, handle, i, iend, ifirst, igrp, ikind, ilast, ilist, indexa, &
103 ipair, iparticle, iparticle_local, istart, iunique, jkind, junique, mpair, nkinds, &
104 nloc_size, npairs, nparticle, nparticle_local, nr_h3o, nr_o, nr_oh, nunique
105 INTEGER,
DIMENSION(:),
POINTER :: glob_loc_list_a, work_list
106 INTEGER,
DIMENSION(:, :),
POINTER :: glob_loc_list,
list, sort_list
107 LOGICAL :: any_ace, any_allegro, any_deepmd, &
108 any_gal, any_gal21, any_nequip, &
109 any_siepmann, any_tersoff
110 REAL(kind=
dp) :: drij, embed, pot_ace, pot_allegro, &
111 pot_deepmd, pot_loc, pot_nequip, qr, &
113 REAL(kind=
dp),
DIMENSION(3) :: cell_v, cvi
114 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: glob_cell_v
115 REAL(kind=
dp),
POINTER :: fembed(:)
117 TYPE(
eam_type),
DIMENSION(:),
POINTER :: eam_data
124 TYPE(
pos_type),
DIMENSION(:),
POINTER :: r_last_update_pbc
128 NULLIFY (eam, siepmann, tersoff, gal, gal21)
129 any_tersoff = .false.
130 any_siepmann = .false.
133 any_allegro = .false.
137 CALL timeset(routinen, handle)
139 potparm=potparm, eam_data=eam_data)
141 DO ikind = 1,
SIZE(atomic_kind_set)
142 pot => potparm%pot(ikind, ikind)%pot
143 DO i = 1,
SIZE(pot%type)
144 IF (pot%type(i) /=
ea_type) cycle
145 eam => pot%set(i)%eam
146 nparticle =
SIZE(particle_set)
147 ALLOCATE (fembed(nparticle))
149 cpassert(
ASSOCIATED(eam_data))
151 nparticle_local = local_particles%n_el(ikind)
152 DO iparticle_local = 1, nparticle_local
153 iparticle = local_particles%list(ikind)%array(iparticle_local)
154 indexa = int(eam_data(iparticle)%rho/eam%drhoar) + 1
155 IF (indexa > eam%npoints - 1) indexa = eam%npoints - 1
156 qr = eam_data(iparticle)%rho - eam%rhoval(indexa)
158 embed = eam%frho(indexa) + qr*eam%frhop(indexa)
159 fembed(iparticle) = eam%frhop(indexa) + qr*(eam%frhop(indexa + 1) - eam%frhop(indexa))/eam%drhoar
161 pot_manybody = pot_manybody + embed
164 CALL para_env%sum(fembed)
165 DO iparticle = 1, nparticle
166 IF (particle_set(iparticle)%atomic_kind%kind_number == ikind)
THEN
167 eam_data(iparticle)%f_embed = fembed(iparticle)
175 DO ikind = 1,
SIZE(atomic_kind_set)
176 DO jkind = ikind,
SIZE(atomic_kind_set)
177 pot => potparm%pot(ikind, jkind)%pot
178 any_tersoff = any_tersoff .OR. any(pot%type ==
tersoff_type)
179 any_nequip = any_nequip .OR. any(pot%type ==
nequip_type)
180 any_ace = any_ace .OR. any(pot%type ==
ace_type)
181 any_allegro = any_allegro .OR. any(pot%type ==
allegro_type)
182 any_deepmd = any_deepmd .OR. any(pot%type ==
deepmd_type)
183 any_siepmann = any_siepmann .OR. any(pot%type ==
siepmann_type)
184 any_gal = any_gal .OR. any(pot%type ==
gal_type)
185 any_gal21 = any_gal21 .OR. any(pot%type ==
gal21_type)
191 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
193 atomic_kind_set, potparm, r_last_update_pbc, &
194 pot_nequip, fist_nonbond_env, &
196 pot_manybody = pot_manybody + pot_nequip
199 IF (any_allegro)
THEN
200 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
202 atomic_kind_set, potparm, r_last_update_pbc, &
203 pot_allegro, fist_nonbond_env, &
205 pot_manybody = pot_manybody + pot_allegro
210 fist_nonbond_env, pot_ace)
211 pot_manybody = pot_manybody + pot_ace
216 fist_nonbond_env, pot_deepmd, para_env)
217 pot_manybody = pot_manybody + pot_deepmd
221 IF (any_tersoff)
THEN
222 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
223 CALL setup_tersoff_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, cell)
224 DO ilist = 1, nonbonded%nlists
225 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
226 npairs = neighbor_kind_pair%npairs
227 IF (npairs == 0) cycle
228 kind_group_loop:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
229 istart = neighbor_kind_pair%grp_kind_start(igrp)
230 iend = neighbor_kind_pair%grp_kind_end(igrp)
231 ikind = neighbor_kind_pair%ij_kind(1, igrp)
232 jkind = neighbor_kind_pair%ij_kind(2, igrp)
233 list => neighbor_kind_pair%list
234 cvi = neighbor_kind_pair%cell_vector
235 pot => potparm%pot(ikind, jkind)%pot
236 DO i = 1,
SIZE(pot%type)
238 rab2_max = pot%set(i)%tersoff%rcutsq
239 cell_v = matmul(cell%hmat, cvi)
240 pot => potparm%pot(ikind, jkind)%pot
241 tersoff => pot%set(i)%tersoff
242 npairs = iend - istart + 1
243 IF (npairs /= 0)
THEN
244 ALLOCATE (sort_list(2, npairs), work_list(npairs))
245 sort_list =
list(:, istart:iend)
248 CALL sort(sort_list(1, :), npairs, work_list)
250 work_list(ipair) = sort_list(2, work_list(ipair))
252 sort_list(2, :) = work_list
255 DO ipair = 1, npairs - 1
256 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
259 junique = sort_list(1, ipair)
261 DO iunique = 1, nunique
263 IF (glob_loc_list_a(ifirst) > atom_a) cycle
264 DO mpair = ifirst,
SIZE(glob_loc_list_a)
265 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
268 DO mpair = ifirst,
SIZE(glob_loc_list_a)
269 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
273 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
274 DO WHILE (ipair <= npairs)
275 IF (sort_list(1, ipair) /= junique)
EXIT
276 atom_b = sort_list(2, ipair)
279 rij(:) = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
280 drij = dot_product(rij, rij)
282 IF (drij > rab2_max) cycle
284 CALL tersoff_energy(pot_loc, tersoff, r_last_update_pbc, atom_a, atom_b, nloc_size, &
285 glob_loc_list(:, ifirst:ilast), glob_cell_v(:, ifirst:ilast), cell_v, drij)
286 pot_manybody = pot_manybody + 0.5_dp*pot_loc
289 IF (ipair <= npairs) junique = sort_list(1, ipair)
291 DEALLOCATE (sort_list, work_list)
294 END DO kind_group_loop
300 IF (any_siepmann)
THEN
301 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
306 DO ilist = 1, nonbonded%nlists
307 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
308 npairs = neighbor_kind_pair%npairs
309 IF (npairs == 0) cycle
310 kind_group_loop_2:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
311 istart = neighbor_kind_pair%grp_kind_start(igrp)
312 iend = neighbor_kind_pair%grp_kind_end(igrp)
313 ikind = neighbor_kind_pair%ij_kind(1, igrp)
314 jkind = neighbor_kind_pair%ij_kind(2, igrp)
315 list => neighbor_kind_pair%list
316 cvi = neighbor_kind_pair%cell_vector
317 pot => potparm%pot(ikind, jkind)%pot
318 DO i = 1,
SIZE(pot%type)
320 rab2_max = pot%set(i)%siepmann%rcutsq
321 cell_v = matmul(cell%hmat, cvi)
322 pot => potparm%pot(ikind, jkind)%pot
323 siepmann => pot%set(i)%siepmann
324 npairs = iend - istart + 1
325 IF (npairs /= 0)
THEN
326 ALLOCATE (sort_list(2, npairs), work_list(npairs))
327 sort_list =
list(:, istart:iend)
330 CALL sort(sort_list(1, :), npairs, work_list)
332 work_list(ipair) = sort_list(2, work_list(ipair))
334 sort_list(2, :) = work_list
337 DO ipair = 1, npairs - 1
338 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
341 junique = sort_list(1, ipair)
343 DO iunique = 1, nunique
345 IF (glob_loc_list_a(ifirst) > atom_a) cycle
346 DO mpair = ifirst,
SIZE(glob_loc_list_a)
347 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
350 DO mpair = ifirst,
SIZE(glob_loc_list_a)
351 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
355 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
356 DO WHILE (ipair <= npairs)
357 IF (sort_list(1, ipair) /= junique)
EXIT
358 atom_b = sort_list(2, ipair)
361 rij(:) = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
362 drij = dot_product(rij, rij)
364 IF (drij > rab2_max) cycle
366 CALL siepmann_energy(pot_loc, siepmann, r_last_update_pbc, atom_a, atom_b, nloc_size, &
367 glob_loc_list(:, ifirst:ilast), cell_v, cell, drij, &
368 particle_set, nr_oh, nr_h3o, nr_o)
369 pot_manybody = pot_manybody + pot_loc
372 IF (ipair <= npairs) junique = sort_list(1, ipair)
374 DEALLOCATE (sort_list, work_list)
377 END DO kind_group_loop_2
381 print_h3o=.false., print_o=.false.)
383 print_h3o=.true., print_o=.false.)
385 print_h3o=.false., print_o=.true.)
390 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
391 CALL setup_gal_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, cell)
392 DO ilist = 1, nonbonded%nlists
393 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
394 npairs = neighbor_kind_pair%npairs
395 IF (npairs == 0) cycle
396 kind_group_loop_3:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
397 istart = neighbor_kind_pair%grp_kind_start(igrp)
398 iend = neighbor_kind_pair%grp_kind_end(igrp)
399 ikind = neighbor_kind_pair%ij_kind(1, igrp)
400 jkind = neighbor_kind_pair%ij_kind(2, igrp)
401 list => neighbor_kind_pair%list
402 cvi = neighbor_kind_pair%cell_vector
403 pot => potparm%pot(ikind, jkind)%pot
404 DO i = 1,
SIZE(pot%type)
406 rab2_max = pot%set(i)%gal%rcutsq
407 cell_v = matmul(cell%hmat, cvi)
408 pot => potparm%pot(ikind, jkind)%pot
409 gal => pot%set(i)%gal
410 npairs = iend - istart + 1
411 IF (npairs /= 0)
THEN
412 ALLOCATE (sort_list(2, npairs), work_list(npairs))
413 sort_list =
list(:, istart:iend)
416 CALL sort(sort_list(1, :), npairs, work_list)
418 work_list(ipair) = sort_list(2, work_list(ipair))
420 sort_list(2, :) = work_list
423 DO ipair = 1, npairs - 1
424 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
427 junique = sort_list(1, ipair)
429 DO iunique = 1, nunique
431 IF (glob_loc_list_a(ifirst) > atom_a) cycle
432 DO mpair = ifirst,
SIZE(glob_loc_list_a)
433 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
436 DO mpair = ifirst,
SIZE(glob_loc_list_a)
437 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
441 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
442 DO WHILE (ipair <= npairs)
443 IF (sort_list(1, ipair) /= junique)
EXIT
444 atom_b = sort_list(2, ipair)
447 rij(:) = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
448 drij = dot_product(rij, rij)
450 IF (drij > rab2_max) cycle
452 CALL gal_energy(pot_loc, gal, r_last_update_pbc, atom_a, atom_b, &
453 cell, particle_set, mm_section)
455 pot_manybody = pot_manybody + pot_loc
458 IF (ipair <= npairs) junique = sort_list(1, ipair)
460 DEALLOCATE (sort_list, work_list)
463 END DO kind_group_loop_3
470 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
471 CALL setup_gal21_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, cell)
472 DO ilist = 1, nonbonded%nlists
473 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
474 npairs = neighbor_kind_pair%npairs
475 IF (npairs == 0) cycle
476 kind_group_loop_5:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
477 istart = neighbor_kind_pair%grp_kind_start(igrp)
478 iend = neighbor_kind_pair%grp_kind_end(igrp)
479 ikind = neighbor_kind_pair%ij_kind(1, igrp)
480 jkind = neighbor_kind_pair%ij_kind(2, igrp)
481 list => neighbor_kind_pair%list
482 cvi = neighbor_kind_pair%cell_vector
483 pot => potparm%pot(ikind, jkind)%pot
484 DO i = 1,
SIZE(pot%type)
486 rab2_max = pot%set(i)%gal21%rcutsq
487 cell_v = matmul(cell%hmat, cvi)
488 pot => potparm%pot(ikind, jkind)%pot
489 gal21 => pot%set(i)%gal21
490 npairs = iend - istart + 1
491 IF (npairs /= 0)
THEN
492 ALLOCATE (sort_list(2, npairs), work_list(npairs))
493 sort_list =
list(:, istart:iend)
496 CALL sort(sort_list(1, :), npairs, work_list)
498 work_list(ipair) = sort_list(2, work_list(ipair))
500 sort_list(2, :) = work_list
503 DO ipair = 1, npairs - 1
504 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
507 junique = sort_list(1, ipair)
509 DO iunique = 1, nunique
511 IF (glob_loc_list_a(ifirst) > atom_a) cycle
512 DO mpair = ifirst,
SIZE(glob_loc_list_a)
513 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
516 DO mpair = ifirst,
SIZE(glob_loc_list_a)
517 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
521 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
522 DO WHILE (ipair <= npairs)
523 IF (sort_list(1, ipair) /= junique)
EXIT
524 atom_b = sort_list(2, ipair)
527 rij(:) = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
528 drij = dot_product(rij, rij)
530 IF (drij > rab2_max) cycle
532 CALL gal21_energy(pot_loc, gal21, r_last_update_pbc, atom_a, atom_b, &
533 cell, particle_set, mm_section)
535 pot_manybody = pot_manybody + pot_loc
538 IF (ipair <= npairs) junique = sort_list(1, ipair)
540 DEALLOCATE (sort_list, work_list)
543 END DO kind_group_loop_5
548 CALL timestop(handle)
564 f_nonbond, pv_nonbond, use_virial)
569 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: f_nonbond, pv_nonbond
570 LOGICAL,
INTENT(IN) :: use_virial
572 CHARACTER(LEN=*),
PARAMETER :: routinen =
'force_nonbond_manybody'
574 INTEGER :: atom_a, atom_b, handle, i, i_a, i_b, iend, ifirst, igrp, ikind, ilast, ilist, &
575 ipair, istart, iunique, jkind, junique, kind_a, kind_b, mpair, nkinds, nloc_size, npairs, &
577 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: eam_kinds_index
578 INTEGER,
DIMENSION(:),
POINTER :: glob_loc_list_a, work_list
579 INTEGER,
DIMENSION(:, :),
POINTER :: glob_loc_list,
list, sort_list
580 LOGICAL :: any_ace, any_allegro, any_deepmd, &
581 any_gal, any_gal21, any_nequip, &
582 any_siepmann, any_tersoff
583 REAL(kind=
dp) :: f_eam,
fac, fr(3), ptens11, ptens12, ptens13, ptens21, ptens22, ptens23, &
584 ptens31, ptens32, ptens33, rab(3), rab2, rab2_max, rtmp(3)
585 REAL(kind=
dp),
DIMENSION(3) :: cell_v, cvi
586 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: glob_cell_v
588 TYPE(
eam_type),
DIMENSION(:),
POINTER :: eam_data
595 TYPE(
pos_type),
DIMENSION(:),
POINTER :: r_last_update_pbc
599 any_tersoff = .false.
600 any_allegro = .false.
602 any_siepmann = .false.
607 CALL timeset(routinen, handle)
608 NULLIFY (eam_a, eam_b, tersoff, siepmann, gal, gal21)
611 natom_types=nkinds, eam_data=eam_data, r_last_update_pbc=r_last_update_pbc)
615 ptens11 = 0.0_dp; ptens12 = 0.0_dp; ptens13 = 0.0_dp
616 ptens21 = 0.0_dp; ptens22 = 0.0_dp; ptens23 = 0.0_dp
617 ptens31 = 0.0_dp; ptens32 = 0.0_dp; ptens33 = 0.0_dp
620 nkinds =
SIZE(potparm%pot, 1)
621 ALLOCATE (eam_kinds_index(nkinds, nkinds))
624 DO jkind = ikind, nkinds
625 DO i = 1,
SIZE(potparm%pot(ikind, jkind)%pot%type)
626 IF (potparm%pot(ikind, jkind)%pot%type(i) ==
ea_type)
THEN
628 cpassert(eam_kinds_index(ikind, jkind) == -1)
629 cpassert(eam_kinds_index(jkind, ikind) == -1)
630 eam_kinds_index(ikind, jkind) = i
631 eam_kinds_index(jkind, ikind) = i
637 DO jkind = ikind, nkinds
638 any_ace = any_ace .OR. any(potparm%pot(ikind, jkind)%pot%type ==
ace_type)
646 DO jkind = ikind, nkinds
647 any_deepmd = any_deepmd .OR. any(potparm%pot(ikind, jkind)%pot%type ==
deepmd_type)
656 DO jkind = ikind, nkinds
657 any_nequip = any_nequip .OR. any(potparm%pot(ikind, jkind)%pot%type ==
nequip_type)
666 DO jkind = ikind, nkinds
667 any_allegro = any_allegro .OR. any(potparm%pot(ikind, jkind)%pot%type ==
allegro_type)
670 IF (any_allegro)
THEN
675 DO ilist = 1, nonbonded%nlists
676 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
677 npairs = neighbor_kind_pair%npairs
678 IF (npairs == 0) cycle
679 kind_group_loop1:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
680 istart = neighbor_kind_pair%grp_kind_start(igrp)
681 iend = neighbor_kind_pair%grp_kind_end(igrp)
682 ikind = neighbor_kind_pair%ij_kind(1, igrp)
683 jkind = neighbor_kind_pair%ij_kind(2, igrp)
684 list => neighbor_kind_pair%list
685 cvi = neighbor_kind_pair%cell_vector
686 pot => potparm%pot(ikind, jkind)%pot
687 IF (pot%no_mb) cycle kind_group_loop1
688 rab2_max = pot%rcutsq
689 cell_v = matmul(cell%hmat, cvi)
690 any_tersoff = any_tersoff .OR. any(pot%type ==
tersoff_type)
691 any_siepmann = any_siepmann .OR. any(pot%type ==
siepmann_type)
692 any_ace = any_ace .OR. any(pot%type ==
ace_type)
693 any_deepmd = any_deepmd .OR. any(pot%type ==
deepmd_type)
694 any_gal = any_gal .OR. any(pot%type ==
gal_type)
695 any_gal21 = any_gal21 .OR. any(pot%type ==
gal21_type)
696 any_nequip = any_nequip .OR. any(pot%type ==
nequip_type)
697 any_allegro = any_allegro .OR. any(pot%type ==
allegro_type)
698 i = eam_kinds_index(ikind, jkind)
699 IF (i == -1) cycle kind_group_loop1
701 cpassert(
ASSOCIATED(eam_data))
702 DO ipair = istart, iend
703 atom_a =
list(1, ipair)
704 atom_b =
list(2, ipair)
706 IF (atom_a == atom_b)
fac = 0.5_dp
707 kind_a = particle_set(atom_a)%atomic_kind%kind_number
708 kind_b = particle_set(atom_b)%atomic_kind%kind_number
709 i_a = eam_kinds_index(kind_a, kind_a)
710 i_b = eam_kinds_index(kind_b, kind_b)
711 eam_a => potparm%pot(kind_a, kind_a)%pot%set(i_a)%eam
712 eam_b => potparm%pot(kind_b, kind_b)%pot%set(i_b)%eam
716 rab = r_last_update_pbc(atom_b)%r - r_last_update_pbc(atom_a)%r
718 rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
719 IF (rab2 <= rab2_max)
THEN
720 CALL get_force_eam(rab2, eam_a, eam_b, eam_data, atom_a, atom_b, f_eam)
723 fr(1) = -f_eam*rab(1)
724 fr(2) = -f_eam*rab(2)
725 fr(3) = -f_eam*rab(3)
726 f_nonbond(1, atom_a) = f_nonbond(1, atom_a) - fr(1)
727 f_nonbond(2, atom_a) = f_nonbond(2, atom_a) - fr(2)
728 f_nonbond(3, atom_a) = f_nonbond(3, atom_a) - fr(3)
730 f_nonbond(1, atom_b) = f_nonbond(1, atom_b) + fr(1)
731 f_nonbond(2, atom_b) = f_nonbond(2, atom_b) + fr(2)
732 f_nonbond(3, atom_b) = f_nonbond(3, atom_b) + fr(3)
734 ptens11 = ptens11 + rab(1)*fr(1)
735 ptens21 = ptens21 + rab(2)*fr(1)
736 ptens31 = ptens31 + rab(3)*fr(1)
737 ptens12 = ptens12 + rab(1)*fr(2)
738 ptens22 = ptens22 + rab(2)*fr(2)
739 ptens32 = ptens32 + rab(3)*fr(2)
740 ptens13 = ptens13 + rab(1)*fr(3)
741 ptens23 = ptens23 + rab(2)*fr(3)
742 ptens33 = ptens33 + rab(3)*fr(3)
746 END DO kind_group_loop1
748 DEALLOCATE (eam_kinds_index)
751 IF (any_tersoff)
THEN
752 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
753 CALL setup_tersoff_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, cell)
754 DO ilist = 1, nonbonded%nlists
755 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
756 npairs = neighbor_kind_pair%npairs
757 IF (npairs == 0) cycle
758 kind_group_loop2:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
759 istart = neighbor_kind_pair%grp_kind_start(igrp)
760 iend = neighbor_kind_pair%grp_kind_end(igrp)
761 ikind = neighbor_kind_pair%ij_kind(1, igrp)
762 jkind = neighbor_kind_pair%ij_kind(2, igrp)
763 list => neighbor_kind_pair%list
764 cvi = neighbor_kind_pair%cell_vector
765 pot => potparm%pot(ikind, jkind)%pot
767 IF (pot%no_mb) cycle kind_group_loop2
768 rab2_max = pot%rcutsq
769 cell_v = matmul(cell%hmat, cvi)
770 DO i = 1,
SIZE(pot%type)
773 npairs = iend - istart + 1
774 tersoff => pot%set(i)%tersoff
775 ALLOCATE (sort_list(2, npairs), work_list(npairs))
776 sort_list =
list(:, istart:iend)
779 CALL sort(sort_list(1, :), npairs, work_list)
781 work_list(ipair) = sort_list(2, work_list(ipair))
783 sort_list(2, :) = work_list
786 DO ipair = 1, npairs - 1
787 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
790 junique = sort_list(1, ipair)
792 DO iunique = 1, nunique
794 IF (glob_loc_list_a(ifirst) > atom_a) cycle
795 DO mpair = ifirst,
SIZE(glob_loc_list_a)
796 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
799 DO mpair = ifirst,
SIZE(glob_loc_list_a)
800 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
804 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
805 DO WHILE (ipair <= npairs)
806 IF (sort_list(1, ipair) /= junique)
EXIT
807 atom_b = sort_list(2, ipair)
809 rtmp = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
811 IF (dot_product(rtmp, rtmp) <= tersoff%rcutsq)
THEN
813 nloc_size, glob_loc_list(:, ifirst:ilast), glob_cell_v(:, ifirst:ilast), &
814 atom_a, atom_b, f_nonbond, pv_nonbond, use_virial, tersoff%rcutsq)
818 IF (ipair <= npairs) junique = sort_list(1, ipair)
820 DEALLOCATE (sort_list, work_list)
823 END DO kind_group_loop2
828 IF (any_siepmann)
THEN
829 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
831 DO ilist = 1, nonbonded%nlists
832 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
833 npairs = neighbor_kind_pair%npairs
834 IF (npairs == 0) cycle
835 kind_group_loop3:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
836 istart = neighbor_kind_pair%grp_kind_start(igrp)
837 iend = neighbor_kind_pair%grp_kind_end(igrp)
838 ikind = neighbor_kind_pair%ij_kind(1, igrp)
839 jkind = neighbor_kind_pair%ij_kind(2, igrp)
840 list => neighbor_kind_pair%list
841 cvi = neighbor_kind_pair%cell_vector
842 pot => potparm%pot(ikind, jkind)%pot
844 IF (pot%no_mb) cycle kind_group_loop3
845 rab2_max = pot%rcutsq
846 cell_v = matmul(cell%hmat, cvi)
847 DO i = 1,
SIZE(pot%type)
850 npairs = iend - istart + 1
851 siepmann => pot%set(i)%siepmann
852 ALLOCATE (sort_list(2, npairs), work_list(npairs))
853 sort_list =
list(:, istart:iend)
856 CALL sort(sort_list(1, :), npairs, work_list)
858 work_list(ipair) = sort_list(2, work_list(ipair))
860 sort_list(2, :) = work_list
863 DO ipair = 1, npairs - 1
864 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
867 junique = sort_list(1, ipair)
869 DO iunique = 1, nunique
871 IF (glob_loc_list_a(ifirst) > atom_a) cycle
872 DO mpair = ifirst,
SIZE(glob_loc_list_a)
873 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
876 DO mpair = ifirst,
SIZE(glob_loc_list_a)
877 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
881 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
882 DO WHILE (ipair <= npairs)
883 IF (sort_list(1, ipair) /= junique)
EXIT
884 atom_b = sort_list(2, ipair)
886 rtmp = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
888 IF (dot_product(rtmp, rtmp) <= siepmann%rcutsq)
THEN
890 atom_a, atom_b, f_nonbond, use_virial, siepmann%rcutsq, &
893 nloc_size, glob_loc_list(:, ifirst:ilast), &
894 atom_a, atom_b, f_nonbond, use_virial, siepmann%rcutsq, &
899 IF (ipair <= npairs) junique = sort_list(1, ipair)
901 DEALLOCATE (sort_list, work_list)
904 END DO kind_group_loop3
911 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
912 CALL setup_gal_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, cell)
913 DO ilist = 1, nonbonded%nlists
914 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
915 npairs = neighbor_kind_pair%npairs
916 IF (npairs == 0) cycle
917 kind_group_loop4:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
918 istart = neighbor_kind_pair%grp_kind_start(igrp)
919 iend = neighbor_kind_pair%grp_kind_end(igrp)
920 ikind = neighbor_kind_pair%ij_kind(1, igrp)
921 jkind = neighbor_kind_pair%ij_kind(2, igrp)
922 list => neighbor_kind_pair%list
923 cvi = neighbor_kind_pair%cell_vector
924 pot => potparm%pot(ikind, jkind)%pot
926 IF (pot%no_mb) cycle kind_group_loop4
927 rab2_max = pot%rcutsq
928 cell_v = matmul(cell%hmat, cvi)
929 DO i = 1,
SIZE(pot%type)
932 npairs = iend - istart + 1
933 gal => pot%set(i)%gal
934 ALLOCATE (sort_list(2, npairs), work_list(npairs))
935 sort_list =
list(:, istart:iend)
938 CALL sort(sort_list(1, :), npairs, work_list)
940 work_list(ipair) = sort_list(2, work_list(ipair))
942 sort_list(2, :) = work_list
945 DO ipair = 1, npairs - 1
946 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
949 junique = sort_list(1, ipair)
951 DO iunique = 1, nunique
953 IF (glob_loc_list_a(ifirst) > atom_a) cycle
954 DO mpair = ifirst,
SIZE(glob_loc_list_a)
955 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
958 DO mpair = ifirst,
SIZE(glob_loc_list_a)
959 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
963 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
964 DO WHILE (ipair <= npairs)
965 IF (sort_list(1, ipair) /= junique)
EXIT
966 atom_b = sort_list(2, ipair)
968 rtmp = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
970 IF (dot_product(rtmp, rtmp) <= gal%rcutsq)
THEN
972 atom_a, atom_b, f_nonbond, use_virial, &
977 IF (ipair <= npairs) junique = sort_list(1, ipair)
979 DEALLOCATE (sort_list, work_list)
982 END DO kind_group_loop4
989 NULLIFY (glob_loc_list, glob_cell_v, glob_loc_list_a)
990 CALL setup_gal21_arrays(nonbonded, potparm, glob_loc_list, glob_cell_v, glob_loc_list_a, cell)
991 DO ilist = 1, nonbonded%nlists
992 neighbor_kind_pair => nonbonded%neighbor_kind_pairs(ilist)
993 npairs = neighbor_kind_pair%npairs
994 IF (npairs == 0) cycle
995 kind_group_loop6:
DO igrp = 1, neighbor_kind_pair%ngrp_kind
996 istart = neighbor_kind_pair%grp_kind_start(igrp)
997 iend = neighbor_kind_pair%grp_kind_end(igrp)
998 ikind = neighbor_kind_pair%ij_kind(1, igrp)
999 jkind = neighbor_kind_pair%ij_kind(2, igrp)
1000 list => neighbor_kind_pair%list
1001 cvi = neighbor_kind_pair%cell_vector
1002 pot => potparm%pot(ikind, jkind)%pot
1004 IF (pot%no_mb) cycle kind_group_loop6
1005 rab2_max = pot%rcutsq
1006 cell_v = matmul(cell%hmat, cvi)
1007 DO i = 1,
SIZE(pot%type)
1010 npairs = iend - istart + 1
1011 gal21 => pot%set(i)%gal21
1012 ALLOCATE (sort_list(2, npairs), work_list(npairs))
1013 sort_list =
list(:, istart:iend)
1016 CALL sort(sort_list(1, :), npairs, work_list)
1017 DO ipair = 1, npairs
1018 work_list(ipair) = sort_list(2, work_list(ipair))
1020 sort_list(2, :) = work_list
1023 DO ipair = 1, npairs - 1
1024 IF (sort_list(1, ipair + 1) /= sort_list(1, ipair)) nunique = nunique + 1
1027 junique = sort_list(1, ipair)
1029 DO iunique = 1, nunique
1031 IF (glob_loc_list_a(ifirst) > atom_a) cycle
1032 DO mpair = ifirst,
SIZE(glob_loc_list_a)
1033 IF (glob_loc_list_a(mpair) == atom_a)
EXIT
1036 DO mpair = ifirst,
SIZE(glob_loc_list_a)
1037 IF (glob_loc_list_a(mpair) /= atom_a)
EXIT
1041 IF (ifirst /= 0) nloc_size = ilast - ifirst + 1
1042 DO WHILE (ipair <= npairs)
1043 IF (sort_list(1, ipair) /= junique)
EXIT
1044 atom_b = sort_list(2, ipair)
1046 rtmp = r_last_update_pbc(atom_b)%r(:) - r_last_update_pbc(atom_a)%r(:) + cell_v
1048 IF (dot_product(rtmp, rtmp) <= gal21%rcutsq)
THEN
1050 atom_a, atom_b, f_nonbond, pv_nonbond, use_virial, &
1055 IF (ipair <= npairs) junique = sort_list(1, ipair)
1057 DEALLOCATE (sort_list, work_list)
1060 END DO kind_group_loop6
1065 IF (use_virial)
THEN
1066 pv_nonbond(1, 1) = pv_nonbond(1, 1) + ptens11
1067 pv_nonbond(1, 2) = pv_nonbond(1, 2) + ptens12
1068 pv_nonbond(1, 3) = pv_nonbond(1, 3) + ptens13
1069 pv_nonbond(2, 1) = pv_nonbond(2, 1) + ptens21
1070 pv_nonbond(2, 2) = pv_nonbond(2, 2) + ptens22
1071 pv_nonbond(2, 3) = pv_nonbond(2, 3) + ptens23
1072 pv_nonbond(3, 1) = pv_nonbond(3, 1) + ptens31
1073 pv_nonbond(3, 2) = pv_nonbond(3, 2) + ptens32
1074 pv_nonbond(3, 3) = pv_nonbond(3, 3) + ptens33
1076 CALL timestop(handle)