44#include "./base/base_uses.f90"
49 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'eip_silicon'
78 CHARACTER(len=*),
PARAMETER :: routinen =
'eip_bazant'
80 INTEGER :: handle, i, iparticle, iparticle_kind, &
81 iparticle_local, iw, natom, &
82 nparticle_kind, nparticle_local
83 REAL(kind=
dp) :: ekin, ener, ener_var, mass
84 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rxyz
85 REAL(kind=
dp),
DIMENSION(3) :: abc
99 CALL timeset(routinen, handle)
101 NULLIFY (cell, particle_set, eip_section, logger, atomic_kinds, &
102 atomic_kind, local_particles, subsys, atomic_kind_set, para_env)
108 cpassert(
ASSOCIATED(eip_env))
110 CALL eip_env_get(eip_env=eip_env, cell=cell, particle_set=particle_set, &
111 subsys=subsys, local_particles=local_particles, &
112 atomic_kind_set=atomic_kind_set)
116 natom =
SIZE(particle_set)
119 ALLOCATE (rxyz(3, natom))
123 rxyz(:, i) = particle_set(i)%r(:)*
angstrom
126 CALL eip_bazant_silicon(nat=natom, alat=abc*
angstrom, rxyz0=rxyz, &
127 fxyz=eip_env%eip_forces, ener=ener, &
128 coord=eip_env%coord_avg, ener_var=ener_var, &
129 coord_var=eip_env%coord_var, count=eip_env%count)
134 nparticle_kind = atomic_kinds%n_els
136 DO iparticle_kind = 1, nparticle_kind
137 atomic_kind => atomic_kind_set(iparticle_kind)
139 nparticle_local = local_particles%n_el(iparticle_kind)
140 DO iparticle_local = 1, nparticle_local
141 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
142 ekin = ekin + 0.5_dp*mass* &
143 (particle_set(iparticle)%v(1)*particle_set(iparticle)%v(1) &
144 + particle_set(iparticle)%v(2)*particle_set(iparticle)%v(2) &
145 + particle_set(iparticle)%v(3)*particle_set(iparticle)%v(3))
151 CALL para_env%sum(ekin)
152 eip_env%eip_kinetic_energy = ekin
154 eip_env%eip_potential_energy = ener/
evolt
155 eip_env%eip_energy = eip_env%eip_kinetic_energy + eip_env%eip_potential_energy
156 eip_env%eip_energy_var = ener_var/
evolt
159 particle_set(i)%f(:) = eip_env%eip_forces(:, i)/
evolt*
angstrom
166 eip_section,
"PRINT%ENERGIES"),
cp_p_file))
THEN
170 CALL eip_print_energies(eip_env=eip_env, output_unit=iw)
176 eip_section,
"PRINT%ENERGIES_VAR"),
cp_p_file))
THEN
180 CALL eip_print_energy_var(eip_env=eip_env, output_unit=iw)
182 "PRINT%ENERGIES_VAR")
186 eip_section,
"PRINT%FORCES"),
cp_p_file))
THEN
190 CALL eip_print_forces(eip_env=eip_env, output_unit=iw)
196 eip_section,
"PRINT%COORD_AVG"),
cp_p_file))
THEN
200 CALL eip_print_coord_avg(eip_env=eip_env, output_unit=iw)
206 eip_section,
"PRINT%COORD_VAR"),
cp_p_file))
THEN
210 CALL eip_print_coord_var(eip_env=eip_env, output_unit=iw)
216 eip_section,
"PRINT%COUNT"),
cp_p_file))
THEN
220 CALL eip_print_count(eip_env=eip_env, output_unit=iw)
225 CALL timestop(handle)
244 CHARACTER(len=*),
PARAMETER :: routinen =
'eip_lenosky'
246 INTEGER :: handle, i, iparticle, iparticle_kind, &
247 iparticle_local, iw, natom, &
248 nparticle_kind, nparticle_local
249 REAL(kind=
dp) :: ekin, ener, ener_var, mass
250 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rxyz
251 REAL(kind=
dp),
DIMENSION(3) :: abc
265 CALL timeset(routinen, handle)
267 NULLIFY (cell, particle_set, eip_section, logger, atomic_kinds, &
268 atomic_kind, local_particles, subsys, atomic_kind_set, para_env)
274 cpassert(
ASSOCIATED(eip_env))
276 CALL eip_env_get(eip_env=eip_env, cell=cell, particle_set=particle_set, &
277 subsys=subsys, local_particles=local_particles, &
278 atomic_kind_set=atomic_kind_set)
282 natom =
SIZE(particle_set)
285 ALLOCATE (rxyz(3, natom))
289 rxyz(:, i) = particle_set(i)%r(:)*
angstrom
292 CALL eip_lenosky_silicon(nat=natom, alat=abc*
angstrom, rxyz0=rxyz, &
293 fxyz=eip_env%eip_forces, ener=ener, &
294 coord=eip_env%coord_avg, ener_var=ener_var, &
295 coord_var=eip_env%coord_var, count=eip_env%count)
300 nparticle_kind = atomic_kinds%n_els
302 DO iparticle_kind = 1, nparticle_kind
303 atomic_kind => atomic_kind_set(iparticle_kind)
305 nparticle_local = local_particles%n_el(iparticle_kind)
306 DO iparticle_local = 1, nparticle_local
307 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
308 ekin = ekin + 0.5_dp*mass* &
309 (particle_set(iparticle)%v(1)*particle_set(iparticle)%v(1) &
310 + particle_set(iparticle)%v(2)*particle_set(iparticle)%v(2) &
311 + particle_set(iparticle)%v(3)*particle_set(iparticle)%v(3))
317 CALL para_env%sum(ekin)
318 eip_env%eip_kinetic_energy = ekin
320 eip_env%eip_potential_energy = ener/
evolt
321 eip_env%eip_energy = eip_env%eip_kinetic_energy + eip_env%eip_potential_energy
322 eip_env%eip_energy_var = ener_var/
evolt
325 particle_set(i)%f(:) = eip_env%eip_forces(:, i)/
evolt*
angstrom
332 eip_section,
"PRINT%ENERGIES"),
cp_p_file))
THEN
336 CALL eip_print_energies(eip_env=eip_env, output_unit=iw)
342 eip_section,
"PRINT%ENERGIES_VAR"),
cp_p_file))
THEN
346 CALL eip_print_energy_var(eip_env=eip_env, output_unit=iw)
348 "PRINT%ENERGIES_VAR")
352 eip_section,
"PRINT%FORCES"),
cp_p_file))
THEN
356 CALL eip_print_forces(eip_env=eip_env, output_unit=iw)
362 eip_section,
"PRINT%COORD_AVG"),
cp_p_file))
THEN
366 CALL eip_print_coord_avg(eip_env=eip_env, output_unit=iw)
372 eip_section,
"PRINT%COORD_VAR"),
cp_p_file))
THEN
376 CALL eip_print_coord_var(eip_env=eip_env, output_unit=iw)
382 eip_section,
"PRINT%COUNT"),
cp_p_file))
THEN
386 CALL eip_print_count(eip_env=eip_env, output_unit=iw)
391 CALL timestop(handle)
408 CHARACTER(len=*),
PARAMETER :: routinen =
'eip_stillinger_weber'
410 INTEGER :: handle, i, iparticle, iparticle_kind, &
411 iparticle_local, iw, natom, &
412 nparticle_kind, nparticle_local
413 REAL(kind=
dp) :: ekin, ener, mass
414 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rxyz
415 REAL(kind=
dp),
DIMENSION(3) :: abc
427 CALL timeset(routinen, handle)
429 NULLIFY (cell, particle_set, eip_section, logger, atomic_kinds, &
430 atomic_kind, local_particles, subsys, atomic_kind_set, para_env)
436 cpassert(
ASSOCIATED(eip_env))
438 CALL eip_env_get(eip_env=eip_env, cell=cell, particle_set=particle_set, &
439 subsys=subsys, local_particles=local_particles, &
440 atomic_kind_set=atomic_kind_set)
444 natom =
SIZE(particle_set)
446 ALLOCATE (rxyz(3, natom))
449 rxyz(:, i) = particle_set(i)%r(:)*
angstrom
452 CALL eip_stillinger_weber_silicon(nat=natom, alat=abc*
angstrom, &
453 rxyz0=rxyz, fxyz=eip_env%eip_forces, &
454 etot=ener, count=eip_env%count)
456 eip_env%coord_avg = 0.0_dp
457 eip_env%coord_var = 0.0_dp
461 nparticle_kind = atomic_kinds%n_els
463 DO iparticle_kind = 1, nparticle_kind
464 atomic_kind => atomic_kind_set(iparticle_kind)
466 nparticle_local = local_particles%n_el(iparticle_kind)
467 DO iparticle_local = 1, nparticle_local
468 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
469 ekin = ekin + 0.5_dp*mass* &
470 (particle_set(iparticle)%v(1)*particle_set(iparticle)%v(1) &
471 + particle_set(iparticle)%v(2)*particle_set(iparticle)%v(2) &
472 + particle_set(iparticle)%v(3)*particle_set(iparticle)%v(3))
477 CALL para_env%sum(ekin)
478 eip_env%eip_kinetic_energy = ekin
480 eip_env%eip_potential_energy = ener/
evolt
481 eip_env%eip_energy = eip_env%eip_kinetic_energy + eip_env%eip_potential_energy
482 eip_env%eip_energy_var = 0.0_dp
485 particle_set(i)%f(:) = eip_env%eip_forces(:, i)/
evolt*
angstrom
491 eip_section,
"PRINT%ENERGIES"),
cp_p_file))
THEN
495 CALL eip_print_energies(eip_env=eip_env, output_unit=iw)
501 eip_section,
"PRINT%ENERGIES_VAR"),
cp_p_file))
THEN
505 CALL eip_print_energy_var(eip_env=eip_env, output_unit=iw)
507 "PRINT%ENERGIES_VAR")
511 eip_section,
"PRINT%FORCES"),
cp_p_file))
THEN
515 CALL eip_print_forces(eip_env=eip_env, output_unit=iw)
521 eip_section,
"PRINT%COORD_AVG"),
cp_p_file))
THEN
525 CALL eip_print_coord_avg(eip_env=eip_env, output_unit=iw)
531 eip_section,
"PRINT%COORD_VAR"),
cp_p_file))
THEN
535 CALL eip_print_coord_var(eip_env=eip_env, output_unit=iw)
541 eip_section,
"PRINT%COUNT"),
cp_p_file))
THEN
545 CALL eip_print_count(eip_env=eip_env, output_unit=iw)
550 CALL timestop(handle)
570 CHARACTER(len=*),
PARAMETER :: routinen =
'eip_tersoff'
572 INTEGER :: handle, i, iparticle, iparticle_kind, &
573 iparticle_local, iw, natom, &
574 nparticle_kind, nparticle_local
575 REAL(kind=
dp) :: ekin, ener, mass
576 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rxyz
577 REAL(kind=
dp),
DIMENSION(3) :: abc
589 CALL timeset(routinen, handle)
591 NULLIFY (cell, particle_set, eip_section, logger, atomic_kinds, &
592 atomic_kind, local_particles, subsys, atomic_kind_set, para_env)
598 cpassert(
ASSOCIATED(eip_env))
600 CALL eip_env_get(eip_env=eip_env, cell=cell, particle_set=particle_set, &
601 subsys=subsys, local_particles=local_particles, &
602 atomic_kind_set=atomic_kind_set)
606 natom =
SIZE(particle_set)
608 ALLOCATE (rxyz(3, natom))
611 rxyz(:, i) = particle_set(i)%r(:)*
angstrom
614 CALL eip_tersoff_silicon(nat=natom, alat=abc*
angstrom, rxyz=rxyz, &
615 fxyz=eip_env%eip_forces, etot=ener, &
618 eip_env%coord_avg = 0.0_dp
619 eip_env%coord_var = 0.0_dp
623 nparticle_kind = atomic_kinds%n_els
625 DO iparticle_kind = 1, nparticle_kind
626 atomic_kind => atomic_kind_set(iparticle_kind)
628 nparticle_local = local_particles%n_el(iparticle_kind)
629 DO iparticle_local = 1, nparticle_local
630 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
631 ekin = ekin + 0.5_dp*mass* &
632 (particle_set(iparticle)%v(1)*particle_set(iparticle)%v(1) &
633 + particle_set(iparticle)%v(2)*particle_set(iparticle)%v(2) &
634 + particle_set(iparticle)%v(3)*particle_set(iparticle)%v(3))
639 CALL para_env%sum(ekin)
640 eip_env%eip_kinetic_energy = ekin
642 eip_env%eip_potential_energy = ener/
evolt
643 eip_env%eip_energy = eip_env%eip_kinetic_energy + eip_env%eip_potential_energy
644 eip_env%eip_energy_var = 0.0_dp
647 particle_set(i)%f(:) = eip_env%eip_forces(:, i)/
evolt*
angstrom
653 eip_section,
"PRINT%ENERGIES"),
cp_p_file))
THEN
657 CALL eip_print_energies(eip_env=eip_env, output_unit=iw)
663 eip_section,
"PRINT%ENERGIES_VAR"),
cp_p_file))
THEN
667 CALL eip_print_energy_var(eip_env=eip_env, output_unit=iw)
669 "PRINT%ENERGIES_VAR")
673 eip_section,
"PRINT%FORCES"),
cp_p_file))
THEN
677 CALL eip_print_forces(eip_env=eip_env, output_unit=iw)
683 eip_section,
"PRINT%COORD_AVG"),
cp_p_file))
THEN
687 CALL eip_print_coord_avg(eip_env=eip_env, output_unit=iw)
693 eip_section,
"PRINT%COORD_VAR"),
cp_p_file))
THEN
697 CALL eip_print_coord_var(eip_env=eip_env, output_unit=iw)
703 eip_section,
"PRINT%COUNT"),
cp_p_file))
THEN
707 CALL eip_print_count(eip_env=eip_env, output_unit=iw)
712 CALL timestop(handle)
727 SUBROUTINE eip_print_energies(eip_env, output_unit)
729 INTEGER,
INTENT(IN) :: output_unit
733 IF (output_unit > 0)
THEN
734 WRITE (unit=output_unit, fmt=
"(/,(T3,A,T55,F25.14))") &
735 "Kinetic energy [Hartree]: ", eip_env%eip_kinetic_energy, &
736 "Potential energy [Hartree]: ", eip_env%eip_potential_energy, &
737 "Total EIP energy [Hartree]: ", eip_env%eip_energy
740 END SUBROUTINE eip_print_energies
750 SUBROUTINE eip_print_energy_var(eip_env, output_unit)
752 INTEGER,
INTENT(IN) :: output_unit
758 unit_nr = output_unit
760 IF (unit_nr > 0)
THEN
762 WRITE (unit_nr, *)
""
763 WRITE (unit_nr, *)
"The variance of the EIP energy/atom!"
764 WRITE (unit_nr, *)
""
765 WRITE (unit_nr, *) eip_env%eip_energy_var
769 END SUBROUTINE eip_print_energy_var
779 SUBROUTINE eip_print_forces(eip_env, output_unit)
781 INTEGER,
INTENT(IN) :: output_unit
783 INTEGER :: iatom, natom, unit_nr
788 NULLIFY (particle_set)
790 unit_nr = output_unit
792 IF (unit_nr > 0)
THEN
794 CALL eip_env_get(eip_env=eip_env, particle_set=particle_set)
796 natom =
SIZE(particle_set)
798 WRITE (unit_nr, *)
""
799 WRITE (unit_nr, *)
"The EIP forces!"
800 WRITE (unit_nr, *)
""
801 WRITE (unit_nr, *)
"Total EIP forces [Hartree/Bohr]"
803 WRITE (unit_nr, *) eip_env%eip_forces(1:3, iatom)
808 END SUBROUTINE eip_print_forces
818 SUBROUTINE eip_print_coord_avg(eip_env, output_unit)
820 INTEGER,
INTENT(IN) :: output_unit
826 unit_nr = output_unit
828 IF (unit_nr > 0)
THEN
830 WRITE (unit_nr, *)
""
831 WRITE (unit_nr, *)
"The average coordination number!"
832 WRITE (unit_nr, *)
""
833 WRITE (unit_nr, *) eip_env%coord_avg
837 END SUBROUTINE eip_print_coord_avg
847 SUBROUTINE eip_print_coord_var(eip_env, output_unit)
849 INTEGER,
INTENT(IN) :: output_unit
855 unit_nr = output_unit
857 IF (unit_nr > 0)
THEN
859 WRITE (unit_nr, *)
""
860 WRITE (unit_nr, *)
"The variance of the coordination number!"
861 WRITE (unit_nr, *)
""
862 WRITE (unit_nr, *) eip_env%coord_var
866 END SUBROUTINE eip_print_coord_var
876 SUBROUTINE eip_print_count(eip_env, output_unit)
878 INTEGER,
INTENT(IN) :: output_unit
884 unit_nr = output_unit
886 IF (unit_nr > 0)
THEN
888 WRITE (unit_nr, *)
""
889 WRITE (unit_nr, *)
"The function call counter!"
890 WRITE (unit_nr, *)
""
891 WRITE (unit_nr, *) eip_env%count
895 END SUBROUTINE eip_print_count
926 SUBROUTINE eip_bazant_silicon(nat, alat, rxyz0, fxyz, ener, coord, ener_var, &
930 REAL(kind=
dp) :: alat(3), rxyz0(3, nat), fxyz(3, nat), &
931 ener, coord, ener_var, coord_var, count
933 INTEGER :: i, iam, iat, iat1, iat2, ii, il, in, indlst, indlstx, istop, istopg, l1, l2, l3, &
934 laymx, ll1, ll2, ll3, lot, max_nbrs, myspace, myspaceout, ncx, nn, nnbrx, npr
935 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: lay, lstb, num2, num3, numz
936 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: lsta
937 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :, :) :: icell
938 REAL(kind=
dp) :: coord2, cut, cut2, ener2, rlc1i, rlc2i, &
939 rlc3i, tcoord, tcoord2, tener, tener2
940 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rel, rxyz, s2, s3, sz, txyz
943 cut = 3.1213820e0_dp + 1.e-14_dp
945 IF (count == 0)
OPEN (unit=10, file=
'bazant.mon', status=
'unknown')
946 count = count + 1.e0_dp
949 ll1 = int(alat(1)/cut)
950 IF (ll1 < 1) cpabort(
"alat(1) too small")
951 ll2 = int(alat(2)/cut)
952 IF (ll2 < 1) cpabort(
"alat(2) too small")
953 ll3 = int(alat(3)/cut)
954 IF (ll3 < 1) cpabort(
"alat(3) too small")
970 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
971 icell(0, -1:ll1, -1:ll2, -1:ll3) = 0
976 loop_iat_s:
DO iat = 1, nat
977 rxyz0(1, iat) =
modulo(
modulo(rxyz0(1, iat), alat(1)), alat(1))
978 rxyz0(2, iat) =
modulo(
modulo(rxyz0(2, iat), alat(2)), alat(2))
979 rxyz0(3, iat) =
modulo(
modulo(rxyz0(3, iat), alat(3)), alat(3))
980 l1 = int(rxyz0(1, iat)*rlc1i)
981 l2 = int(rxyz0(2, iat)*rlc2i)
982 l3 = int(rxyz0(3, iat)*rlc3i)
984 ii = icell(0, l1, l2, l3)
986 icell(0, l1, l2, l3) = ii
988 WRITE (10, *) count,
'NCX too small', ncx
993 icell(ii, l1, l2, l3) = iat
1003 rxyz0(1, iat) =
modulo(
modulo(rxyz0(1, iat), alat(1)), alat(1))
1004 rxyz0(2, iat) =
modulo(
modulo(rxyz0(2, iat), alat(2)), alat(2))
1005 rxyz0(3, iat) =
modulo(
modulo(rxyz0(3, iat), alat(3)), alat(3))
1013 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
1014 icell(0, -1:ll1, -1:ll2, -1:ll3) = 0
1020 loop_iat_p:
DO iat = 1, nat
1021 l1 = int(rxyz0(1, iat)*rlc1i)
1022 l2 = int(rxyz0(2, iat)*rlc2i)
1023 l3 = int(rxyz0(3, iat)*rlc3i)
1024 ii = icell(0, l1, l2, l3)
1026 icell(0, l1, l2, l3) = ii
1028 WRITE (10, *) count,
'NCX too small', ncx
1033 icell(ii, l1, l2, l3) = iat
1041 laymx = ncx*(2*ll1*ll2 + 2*ll1*ll3 + 2*ll2*ll3 + 4*ll1 + 4*ll2 + 4*ll3 + 8)
1043 ALLOCATE (rxyz(3, nn), lay(nn))
1046 rxyz(1, iat) = rxyz0(1, iat)
1047 rxyz(2, iat) = rxyz0(2, iat)
1048 rxyz(3, iat) = rxyz0(3, iat)
1055 in = icell(0, l1, l2, 0)
1056 icell(0, l1, l2, ll3) = in
1058 i = icell(ii, l1, l2, 0)
1060 IF (il > nn) cpabort(
"enlarge laymx")
1062 icell(ii, l1, l2, ll3) = il
1063 rxyz(1, il) = rxyz(1, i)
1064 rxyz(2, il) = rxyz(2, i)
1065 rxyz(3, il) = rxyz(3, i) + alat(3)
1068 in = icell(0, l1, l2, ll3 - 1)
1069 icell(0, l1, l2, -1) = in
1071 i = icell(ii, l1, l2, ll3 - 1)
1073 IF (il > nn) cpabort(
"enlarge laymx")
1075 icell(ii, l1, l2, -1) = il
1076 rxyz(1, il) = rxyz(1, i)
1077 rxyz(2, il) = rxyz(2, i)
1078 rxyz(3, il) = rxyz(3, i) - alat(3)
1088 in = icell(0, 0, l2, l3)
1089 icell(0, ll1, l2, l3) = in
1091 i = icell(ii, 0, l2, l3)
1093 IF (il > nn) cpabort(
"enlarge laymx")
1095 icell(ii, ll1, l2, l3) = il
1096 rxyz(1, il) = rxyz(1, i) + alat(1)
1097 rxyz(2, il) = rxyz(2, i)
1098 rxyz(3, il) = rxyz(3, i)
1101 in = icell(0, ll1 - 1, l2, l3)
1102 icell(0, -1, l2, l3) = in
1104 i = icell(ii, ll1 - 1, l2, l3)
1106 IF (il > nn) cpabort(
"enlarge laymx")
1108 icell(ii, -1, l2, l3) = il
1109 rxyz(1, il) = rxyz(1, i) - alat(1)
1110 rxyz(2, il) = rxyz(2, i)
1111 rxyz(3, il) = rxyz(3, i)
1121 in = icell(0, l1, 0, l3)
1122 icell(0, l1, ll2, l3) = in
1124 i = icell(ii, l1, 0, l3)
1126 IF (il > nn) cpabort(
"enlarge laymx")
1128 icell(ii, l1, ll2, l3) = il
1129 rxyz(1, il) = rxyz(1, i)
1130 rxyz(2, il) = rxyz(2, i) + alat(2)
1131 rxyz(3, il) = rxyz(3, i)
1134 in = icell(0, l1, ll2 - 1, l3)
1135 icell(0, l1, -1, l3) = in
1137 i = icell(ii, l1, ll2 - 1, l3)
1139 IF (il > nn) cpabort(
"enlarge laymx")
1141 icell(ii, l1, -1, l3) = il
1142 rxyz(1, il) = rxyz(1, i)
1143 rxyz(2, il) = rxyz(2, i) - alat(2)
1144 rxyz(3, il) = rxyz(3, i)
1153 in = icell(0, l1, 0, 0)
1154 icell(0, l1, ll2, ll3) = in
1156 i = icell(ii, l1, 0, 0)
1158 IF (il > nn) cpabort(
"enlarge laymx")
1160 icell(ii, l1, ll2, ll3) = il
1161 rxyz(1, il) = rxyz(1, i)
1162 rxyz(2, il) = rxyz(2, i) + alat(2)
1163 rxyz(3, il) = rxyz(3, i) + alat(3)
1166 in = icell(0, l1, 0, ll3 - 1)
1167 icell(0, l1, ll2, -1) = in
1169 i = icell(ii, l1, 0, ll3 - 1)
1171 IF (il > nn) cpabort(
"enlarge laymx")
1173 icell(ii, l1, ll2, -1) = il
1174 rxyz(1, il) = rxyz(1, i)
1175 rxyz(2, il) = rxyz(2, i) + alat(2)
1176 rxyz(3, il) = rxyz(3, i) - alat(3)
1179 in = icell(0, l1, ll2 - 1, 0)
1180 icell(0, l1, -1, ll3) = in
1182 i = icell(ii, l1, ll2 - 1, 0)
1184 IF (il > nn) cpabort(
"enlarge laymx")
1186 icell(ii, l1, -1, ll3) = il
1187 rxyz(1, il) = rxyz(1, i)
1188 rxyz(2, il) = rxyz(2, i) - alat(2)
1189 rxyz(3, il) = rxyz(3, i) + alat(3)
1192 in = icell(0, l1, ll2 - 1, ll3 - 1)
1193 icell(0, l1, -1, -1) = in
1195 i = icell(ii, l1, ll2 - 1, ll3 - 1)
1197 IF (il > nn) cpabort(
"enlarge laymx")
1199 icell(ii, l1, -1, -1) = il
1200 rxyz(1, il) = rxyz(1, i)
1201 rxyz(2, il) = rxyz(2, i) - alat(2)
1202 rxyz(3, il) = rxyz(3, i) - alat(3)
1210 in = icell(0, 0, l2, 0)
1211 icell(0, ll1, l2, ll3) = in
1213 i = icell(ii, 0, l2, 0)
1215 IF (il > nn) cpabort(
"enlarge laymx")
1217 icell(ii, ll1, l2, ll3) = il
1218 rxyz(1, il) = rxyz(1, i) + alat(1)
1219 rxyz(2, il) = rxyz(2, i)
1220 rxyz(3, il) = rxyz(3, i) + alat(3)
1223 in = icell(0, 0, l2, ll3 - 1)
1224 icell(0, ll1, l2, -1) = in
1226 i = icell(ii, 0, l2, ll3 - 1)
1228 IF (il > nn) cpabort(
"enlarge laymx")
1230 icell(ii, ll1, l2, -1) = il
1231 rxyz(1, il) = rxyz(1, i) + alat(1)
1232 rxyz(2, il) = rxyz(2, i)
1233 rxyz(3, il) = rxyz(3, i) - alat(3)
1236 in = icell(0, ll1 - 1, l2, 0)
1237 icell(0, -1, l2, ll3) = in
1239 i = icell(ii, ll1 - 1, l2, 0)
1241 IF (il > nn) cpabort(
"enlarge laymx")
1243 icell(ii, -1, l2, ll3) = il
1244 rxyz(1, il) = rxyz(1, i) - alat(1)
1245 rxyz(2, il) = rxyz(2, i)
1246 rxyz(3, il) = rxyz(3, i) + alat(3)
1249 in = icell(0, ll1 - 1, l2, ll3 - 1)
1250 icell(0, -1, l2, -1) = in
1252 i = icell(ii, ll1 - 1, l2, ll3 - 1)
1254 IF (il > nn) cpabort(
"enlarge laymx")
1256 icell(ii, -1, l2, -1) = il
1257 rxyz(1, il) = rxyz(1, i) - alat(1)
1258 rxyz(2, il) = rxyz(2, i)
1259 rxyz(3, il) = rxyz(3, i) - alat(3)
1267 in = icell(0, 0, 0, l3)
1268 icell(0, ll1, ll2, l3) = in
1270 i = icell(ii, 0, 0, l3)
1272 IF (il > nn) cpabort(
"enlarge laymx")
1274 icell(ii, ll1, ll2, l3) = il
1275 rxyz(1, il) = rxyz(1, i) + alat(1)
1276 rxyz(2, il) = rxyz(2, i) + alat(2)
1277 rxyz(3, il) = rxyz(3, i)
1280 in = icell(0, ll1 - 1, 0, l3)
1281 icell(0, -1, ll2, l3) = in
1283 i = icell(ii, ll1 - 1, 0, l3)
1285 IF (il > nn) cpabort(
"enlarge laymx")
1287 icell(ii, -1, ll2, l3) = il
1288 rxyz(1, il) = rxyz(1, i) - alat(1)
1289 rxyz(2, il) = rxyz(2, i) + alat(2)
1290 rxyz(3, il) = rxyz(3, i)
1293 in = icell(0, 0, ll2 - 1, l3)
1294 icell(0, ll1, -1, l3) = in
1296 i = icell(ii, 0, ll2 - 1, l3)
1298 IF (il > nn) cpabort(
"enlarge laymx")
1300 icell(ii, ll1, -1, l3) = il
1301 rxyz(1, il) = rxyz(1, i) + alat(1)
1302 rxyz(2, il) = rxyz(2, i) - alat(2)
1303 rxyz(3, il) = rxyz(3, i)
1306 in = icell(0, ll1 - 1, ll2 - 1, l3)
1307 icell(0, -1, -1, l3) = in
1309 i = icell(ii, ll1 - 1, ll2 - 1, l3)
1311 IF (il > nn) cpabort(
"enlarge laymx")
1313 icell(ii, -1, -1, l3) = il
1314 rxyz(1, il) = rxyz(1, i) - alat(1)
1315 rxyz(2, il) = rxyz(2, i) - alat(2)
1316 rxyz(3, il) = rxyz(3, i)
1322 in = icell(0, 0, 0, 0)
1323 icell(0, ll1, ll2, ll3) = in
1325 i = icell(ii, 0, 0, 0)
1327 IF (il > nn) cpabort(
"enlarge laymx")
1329 icell(ii, ll1, ll2, ll3) = il
1330 rxyz(1, il) = rxyz(1, i) + alat(1)
1331 rxyz(2, il) = rxyz(2, i) + alat(2)
1332 rxyz(3, il) = rxyz(3, i) + alat(3)
1335 in = icell(0, ll1 - 1, 0, 0)
1336 icell(0, -1, ll2, ll3) = in
1338 i = icell(ii, ll1 - 1, 0, 0)
1340 IF (il > nn) cpabort(
"enlarge laymx")
1342 icell(ii, -1, ll2, ll3) = il
1343 rxyz(1, il) = rxyz(1, i) - alat(1)
1344 rxyz(2, il) = rxyz(2, i) + alat(2)
1345 rxyz(3, il) = rxyz(3, i) + alat(3)
1348 in = icell(0, 0, ll2 - 1, 0)
1349 icell(0, ll1, -1, ll3) = in
1351 i = icell(ii, 0, ll2 - 1, 0)
1353 IF (il > nn) cpabort(
"enlarge laymx")
1355 icell(ii, ll1, -1, ll3) = il
1356 rxyz(1, il) = rxyz(1, i) + alat(1)
1357 rxyz(2, il) = rxyz(2, i) - alat(2)
1358 rxyz(3, il) = rxyz(3, i) + alat(3)
1361 in = icell(0, ll1 - 1, ll2 - 1, 0)
1362 icell(0, -1, -1, ll3) = in
1364 i = icell(ii, ll1 - 1, ll2 - 1, 0)
1366 IF (il > nn) cpabort(
"enlarge laymx")
1368 icell(ii, -1, -1, ll3) = il
1369 rxyz(1, il) = rxyz(1, i) - alat(1)
1370 rxyz(2, il) = rxyz(2, i) - alat(2)
1371 rxyz(3, il) = rxyz(3, i) + alat(3)
1374 in = icell(0, 0, 0, ll3 - 1)
1375 icell(0, ll1, ll2, -1) = in
1377 i = icell(ii, 0, 0, ll3 - 1)
1379 IF (il > nn) cpabort(
"enlarge laymx")
1381 icell(ii, ll1, ll2, -1) = il
1382 rxyz(1, il) = rxyz(1, i) + alat(1)
1383 rxyz(2, il) = rxyz(2, i) + alat(2)
1384 rxyz(3, il) = rxyz(3, i) - alat(3)
1387 in = icell(0, ll1 - 1, 0, ll3 - 1)
1388 icell(0, -1, ll2, -1) = in
1390 i = icell(ii, ll1 - 1, 0, ll3 - 1)
1392 IF (il > nn) cpabort(
"enlarge laymx")
1394 icell(ii, -1, ll2, -1) = il
1395 rxyz(1, il) = rxyz(1, i) - alat(1)
1396 rxyz(2, il) = rxyz(2, i) + alat(2)
1397 rxyz(3, il) = rxyz(3, i) - alat(3)
1400 in = icell(0, 0, ll2 - 1, ll3 - 1)
1401 icell(0, ll1, -1, -1) = in
1403 i = icell(ii, 0, ll2 - 1, ll3 - 1)
1405 IF (il > nn) cpabort(
"enlarge laymx")
1407 icell(ii, ll1, -1, -1) = il
1408 rxyz(1, il) = rxyz(1, i) + alat(1)
1409 rxyz(2, il) = rxyz(2, i) - alat(2)
1410 rxyz(3, il) = rxyz(3, i) - alat(3)
1413 in = icell(0, ll1 - 1, ll2 - 1, ll3 - 1)
1414 icell(0, -1, -1, -1) = in
1416 i = icell(ii, ll1 - 1, ll2 - 1, ll3 - 1)
1418 IF (il > nn) cpabort(
"enlarge laymx")
1420 icell(ii, -1, -1, -1) = il
1421 rxyz(1, il) = rxyz(1, i) - alat(1)
1422 rxyz(2, il) = rxyz(2, i) - alat(2)
1423 rxyz(3, il) = rxyz(3, i) - alat(3)
1426 ALLOCATE (lsta(2, nat))
1429 ALLOCATE (lstb(nnbrx*nat), rel(5, nnbrx*nat))
1445 myspace = (nat*nnbrx)/npr
1446 IF (iam == 0) myspaceout = myspace
1449 loop_l3:
DO l3 = 0, ll3 - 1
1450 loop_l2:
DO l2 = 0, ll2 - 1
1451 loop_l1:
DO l1 = 0, ll1 - 1
1452 loop_ii:
DO ii = 1, icell(0, l1, l2, l3)
1453 iat = icell(ii, l1, l2, l3)
1454 IF (((iat - 1)*npr)/nat == iam)
THEN
1456 lsta(1, iat) = iam*myspace + indlst + 1
1457 CALL sublstiat_b(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
1458 rxyz, icell, lstb(iam*myspace + 1), lay, &
1459 rel(1, iam*myspace + 1), cut2, indlst)
1460 lsta(2, iat) = iam*myspace + indlst
1470 indlstx = max(indlstx, indlst)
1474 IF (indlstx >= myspaceout)
THEN
1475 WRITE (10, *) count,
'NNBRX too small', nnbrx
1476 DEALLOCATE (lstb, rel)
1502 ALLOCATE (txyz(3, nat), s2(max_nbrs, 8), s3(max_nbrs, 7), sz(max_nbrs, 6), &
1503 num2(max_nbrs), num3(max_nbrs), numz(max_nbrs))
1513 fxyz(1, iat) = 0.e0_dp
1514 fxyz(2, iat) = 0.e0_dp
1515 fxyz(3, iat) = 0.e0_dp
1520 lot = int(real(nat, kind=
dp)/real(npr, kind=
dp) + .999999999999e0_dp)
1522 iat2 = min((iam + 1)*lot, nat)
1524 CALL subfeniat_b(iat1, iat2, nat, lsta, lstb, rel, tener, tener2, &
1525 tcoord, tcoord2, nnbrx, txyz, max_nbrs, istop, &
1526 s2(1, 1), s2(1, 2), s2(1, 3), s2(1, 4), s2(1, 5), s2(1, 6), s2(1, 7), s2(1, 8), &
1527 num2, s3(1, 1), s3(1, 2), s3(1, 3), s3(1, 4), s3(1, 5), s3(1, 6), s3(1, 7), &
1528 num3, sz(1, 1), sz(1, 2), sz(1, 3), sz(1, 4), sz(1, 5), sz(1, 6), numz)
1532 ener2 = ener2 + tener2
1533 coord = coord + tcoord
1534 coord2 = coord2 + tcoord2
1535 istopg = istopg + istop
1537 fxyz(1, iat) = fxyz(1, iat) + txyz(1, iat)
1538 fxyz(2, iat) = fxyz(2, iat) + txyz(2, iat)
1539 fxyz(3, iat) = fxyz(3, iat) + txyz(3, iat)
1541 DEALLOCATE (txyz, s2, s3, sz, num2, num3, numz)
1548 ALLOCATE (s2(max_nbrs, 8), s3(max_nbrs, 7), sz(max_nbrs, 6), &
1549 num2(max_nbrs), num3(max_nbrs), numz(max_nbrs))
1550 CALL subfeniat_b(iat1, iat2, nat, lsta, lstb, rel, ener, ener2, &
1551 coord, coord2, nnbrx, fxyz, max_nbrs, istopg, &
1552 s2(1, 1), s2(1, 2), s2(1, 3), s2(1, 4), s2(1, 5), s2(1, 6), s2(1, 7), s2(1, 8), &
1553 num2, s3(1, 1), s3(1, 2), s3(1, 3), s3(1, 4), s3(1, 5), s3(1, 6), s3(1, 7), &
1554 num3, sz(1, 1), sz(1, 2), sz(1, 3), sz(1, 4), sz(1, 5), sz(1, 6), numz)
1555 DEALLOCATE (s2, s3, sz, num2, num3, numz)
1560 IF (istopg > 0) cpabort(
"DIMENSION ERROR (see WARNING above)")
1561 ener_var = ener2/nat - (ener/nat)**2
1563 coord_var = coord2/nat - coord**2
1565 DEALLOCATE (rxyz, icell, lay, lsta, lstb, rel)
1567 END SUBROUTINE eip_bazant_silicon
1610 SUBROUTINE subfeniat_b(iat1, iat2, nat, lsta, lstb, rel, ener, ener2, &
1611 coord, coord2, nnbrx, ff, max_nbrs, istop, &
1612 s2_t0, s2_t1, s2_t2, s2_t3, s2_dx, s2_dy, s2_dz, s2_r, &
1613 num2, s3_g, s3_dg, s3_rinv, s3_dx, s3_dy, s3_dz, s3_r, &
1614 num3, sz_df, sz_sum, sz_dx, sz_dy, sz_dz, sz_r, numz)
1622 INTEGER :: iat1, iat2, nat, lsta(2, nat)
1623 REAL(kind=
dp) :: ener, ener2, coord, coord2
1625 REAL(kind=
dp) :: rel(5, nnbrx*nat)
1626 INTEGER :: lstb(nnbrx*nat)
1627 REAL(kind=
dp) :: ff(3, nat)
1628 INTEGER :: max_nbrs, istop
1629 REAL(kind=
dp) :: s2_t0(max_nbrs), s2_t1(max_nbrs), s2_t2(max_nbrs), s2_t3(max_nbrs), &
1630 s2_dx(max_nbrs), s2_dy(max_nbrs), s2_dz(max_nbrs), s2_r(max_nbrs)
1631 INTEGER :: num2(max_nbrs)
1632 REAL(kind=
dp) :: s3_g(max_nbrs), s3_dg(max_nbrs), s3_rinv(max_nbrs), s3_dx(max_nbrs), &
1633 s3_dy(max_nbrs), s3_dz(max_nbrs), s3_r(max_nbrs)
1634 INTEGER :: num3(max_nbrs)
1635 REAL(kind=
dp) :: sz_df(max_nbrs), sz_sum(max_nbrs), &
1636 sz_dx(max_nbrs), sz_dy(max_nbrs), &
1637 sz_dz(max_nbrs), sz_r(max_nbrs)
1638 INTEGER :: numz(max_nbrs)
1640 INTEGER :: i, j, k, l, n, n2, n3, nj, nk, nl, nz
1641 REAL(kind=
dp) :: bmc, cmbinv, coord_iat, dedrl, dedrlx, dedrly, dedrlz, den, dhdl, dhdx, &
1642 dp1, dtau, dv2dz, dv2ijx, dv2ijy, dv2ijz, dv2j, dv3dz, dv3l, dv3ljx, dv3ljy, dv3ljz, &
1643 dv3lkx, dv3lky, dv3lkz, dv3rij, dv3rijx, dv3rijy, dv3rijz, dv3rik, dv3rikx, dv3riky, &
1644 dv3rikz, dwinv, dx, dxdz, dy, dz, ener_iat, fjx, fjy, fjz, fkx, fky, fkz, fz, h, lcos, &
1645 muhalf, par_a, par_alp, par_b, par_bet, par_bg, par_c, par_cap_a, par_cap_b, par_delta, &
1646 par_eta, par_gam, par_lam, par_mu, par_palp, par_qo, par_rh, par_sig, pz, qort, r, rinv, &
1647 rmainv, rmbinv, tau, temp0, temp1, u1, u2, u3, u4, u5, winv, x, xarg
1648 REAL(kind=
dp) :: xinv, xinv3, z
1659 par_cap_a = 5.6714030e0_dp
1660 par_cap_b = 2.0002804e0_dp
1661 par_rh = 1.2085196e0_dp
1662 par_a = 3.1213820e0_dp
1663 par_sig = 0.5774108e0_dp
1664 par_lam = 1.4533108e0_dp
1665 par_gam = 1.1247945e0_dp
1666 par_b = 3.1213820e0_dp
1667 par_c = 2.5609104e0_dp
1668 par_delta = 78.7590539e0_dp
1669 par_mu = 0.6966326e0_dp
1670 par_qo = 312.1341346e0_dp
1671 par_palp = 1.4074424e0_dp
1672 par_bet = 0.0070975e0_dp
1673 par_alp = 3.1083847e0_dp
1681 par_eta = par_delta/par_qo
1698 muhalf = par_mu*0.5e0_dp
1701 cmbinv = 1.0e0_dp/(par_c - par_b)
1705 atoms:
DO i = iat1, iat2
1718 DO n = lsta(1, i), lsta(2, i)
1729 rmainv = 1.e0_dp/(r - par_a)
1730 s2_t0(n2) = par_cap_a*exp(par_sig*rmainv)
1731 s2_t1(n2) = (par_cap_b*rinv)**par_rh
1732 s2_t2(n2) = par_rh*rinv
1733 s2_t3(n2) = par_sig*rmainv*rmainv
1739 IF (n2 > max_nbrs)
THEN
1740 WRITE (*, *)
'WARNING enlarge max_nbrs'
1747 IF (r <= 2.36e0_dp)
THEN
1748 coord_iat = coord_iat + 1.e0_dp
1749 ELSE IF (r >= 3.12e0_dp)
THEN
1751 xarg = (r - 2.36e0_dp)*(1.e0_dp/(3.12e0_dp - 2.36e0_dp))
1752 coord_iat = coord_iat + (2*xarg + 1.e0_dp)*(xarg - 1.e0_dp)**2
1757 IF (r < par_bg)
THEN
1760 rmbinv = 1.e0_dp/(r - par_bg)
1761 temp1 = par_gam*rmbinv
1764 s3_dg(n3) = -rmbinv*temp1*temp0
1771 IF (n3 > max_nbrs)
THEN
1772 WRITE (*, *)
'WARNING enlarge max_nbrs'
1783 xinv = bmc/(r - par_c)
1784 xinv3 = xinv*xinv*xinv
1785 den = 1.e0_dp/(1 - xinv3)
1790 sz_df(nz) = fz*temp1*den*3.e0_dp*xinv3*xinv*cmbinv
1797 IF (nz > max_nbrs)
THEN
1798 WRITE (*, *)
'WARNING enlarge max_nbrs'
1813 sz_sum(nl) = 0.e0_dp
1819 pz = par_palp*exp(-temp0*z)
1821 dp1 = -2.e0_dp*temp0*pz
1828 temp0 = s2_t1(nj) - pz
1832 ener_iat = ener_iat + temp0*s2_t0(nj)
1836 dv2j = -s2_t0(nj)*(s2_t1(nj)*s2_t2(nj) + temp0*s2_t3(nj))
1838 dv2ijx = dv2j*s2_dx(nj)
1839 dv2ijy = dv2j*s2_dy(nj)
1840 dv2ijz = dv2j*s2_dz(nj)
1841 ff(1, i) = ff(1, i) + dv2ijx
1842 ff(2, i) = ff(2, i) + dv2ijy
1843 ff(3, i) = ff(3, i) + dv2ijz
1845 ff(1, j) = ff(1, j) - dv2ijx
1846 ff(2, j) = ff(2, j) - dv2ijy
1847 ff(3, j) = ff(3, j) - dv2ijz
1851 dv2dz = -dp1*s2_t0(nj)
1853 sz_sum(nl) = sz_sum(nl) + dv2dz
1860 winv = qort*exp(-muhalf*z)
1862 dwinv = -muhalf*winv
1865 tau = u1 + u2*temp0*(u3 - temp0)
1867 dtau = u5*temp0*(2*temp0 - u3)
1878 DO nk = nj + 1, n3 - 1
1884 lcos = s3_dx(nj)*s3_dx(nk) + s3_dy(nj)*s3_dy(nk) + s3_dz(nj)*s3_dz(nk)
1885 x = (lcos + tau)*winv
1888 h = par_lam*(1 - temp0 + par_eta*x*x)
1889 dhdx = 2*par_lam*x*(temp0 + par_eta)
1895 temp1 = s3_g(nj)*s3_g(nk)
1896 ener_iat = ener_iat + temp1*h
1900 dv3rij = s3_dg(nj)*s3_g(nk)*h
1901 dv3rijx = dv3rij*s3_dx(nj)
1902 dv3rijy = dv3rij*s3_dy(nj)
1903 dv3rijz = dv3rij*s3_dz(nj)
1910 dv3rik = s3_g(nj)*s3_dg(nk)*h
1911 dv3rikx = dv3rik*s3_dx(nk)
1912 dv3riky = dv3rik*s3_dy(nk)
1913 dv3rikz = dv3rik*s3_dz(nk)
1921 dv3ljx = dv3l*(s3_dx(nk) - lcos*s3_dx(nj))*s3_rinv(nj)
1922 dv3ljy = dv3l*(s3_dy(nk) - lcos*s3_dy(nj))*s3_rinv(nj)
1923 dv3ljz = dv3l*(s3_dz(nk) - lcos*s3_dz(nj))*s3_rinv(nj)
1930 dv3lkx = dv3l*(s3_dx(nj) - lcos*s3_dx(nk))*s3_rinv(nk)
1931 dv3lky = dv3l*(s3_dy(nj) - lcos*s3_dy(nk))*s3_rinv(nk)
1932 dv3lkz = dv3l*(s3_dz(nj) - lcos*s3_dz(nk))*s3_rinv(nk)
1939 ff(1, j) = ff(1, j) - fjx
1940 ff(2, j) = ff(2, j) - fjy
1941 ff(3, j) = ff(3, j) - fjz
1942 ff(1, k) = ff(1, k) - fkx
1943 ff(2, k) = ff(2, k) - fky
1944 ff(3, k) = ff(3, k) - fkz
1945 ff(1, i) = ff(1, i) + fjx + fkx
1946 ff(2, i) = ff(2, i) + fjy + fky
1947 ff(3, i) = ff(3, i) + fjz + fkz
1950 dxdz = dwinv*(lcos + tau) + winv*dtau
1951 dv3dz = temp1*dhdx*dxdz
1956 sz_sum(nl) = sz_sum(nl) + dv3dz
1965 dedrl = sz_sum(nl)*sz_df(nl)
1966 dedrlx = dedrl*sz_dx(nl)
1967 dedrly = dedrl*sz_dy(nl)
1968 dedrlz = dedrl*sz_dz(nl)
1969 ff(1, i) = ff(1, i) + dedrlx
1970 ff(2, i) = ff(2, i) + dedrly
1971 ff(3, i) = ff(3, i) + dedrlz
1973 ff(1, l) = ff(1, l) - dedrlx
1974 ff(2, l) = ff(2, l) - dedrly
1975 ff(3, l) = ff(3, l) - dedrlz
1979 coord = coord + coord_iat
1980 coord2 = coord2 + coord_iat**2
1981 ener = ener + ener_iat
1982 ener2 = ener2 + ener_iat**2
1987 END SUBROUTINE subfeniat_b
2009 SUBROUTINE sublstiat_b(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
2010 rxyz, icell, lstb, lay, rel, cut2, indlst)
2013 INTEGER :: iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, &
2015 REAL(kind=
dp) :: rxyz(3, nn)
2016 INTEGER :: icell(0:ncx, -1:ll1, -1:ll2, -1:ll3), lstb(0:myspace - 1), lay(nn)
2017 REAL(kind=
dp) :: rel(5, 0:myspace - 1), cut2
2020 INTEGER :: jat, jj, k1, k2, k3
2021 REAL(kind=
dp) :: rr2, tt, tti, xrel, yrel, zrel
2023 DO k3 = l3 - 1, l3 + 1
2024 DO k2 = l2 - 1, l2 + 1
2025 DO k1 = l1 - 1, l1 + 1
2026 DO jj = 1, icell(0, k1, k2, k3)
2027 jat = icell(jj, k1, k2, k3)
2028 IF (jat == iat) cycle
2029 xrel = rxyz(1, iat) - rxyz(1, jat)
2030 yrel = rxyz(2, iat) - rxyz(2, jat)
2031 zrel = rxyz(3, iat) - rxyz(3, jat)
2032 rr2 = xrel**2 + yrel**2 + zrel**2
2033 IF (rr2 <= cut2)
THEN
2034 indlst = min(indlst, myspace - 1)
2035 lstb(indlst) = lay(jat)
2039 rel(1, indlst) = xrel*tti
2040 rel(2, indlst) = yrel*tti
2041 rel(3, indlst) = zrel*tti
2043 rel(5, indlst) = tti
2052 END SUBROUTINE sublstiat_b
2078 SUBROUTINE eip_lenosky_silicon(nat, alat, rxyz0, fxyz, ener, coord, ener_var, &
2082 REAL(kind=
dp) :: alat(3), rxyz0(3, nat), fxyz(3, nat), &
2083 ener, coord, ener_var, coord_var, count
2085 INTEGER :: i, iam, iat, iat1, iat2, ii, il, in, indlst, indlstx, istop, istopg, l1, l2, l3, &
2086 laymx, ll1, ll2, ll3, lot, myspace, myspaceout, ncx, nn, nnbrx, npjkx, npjx, npr, rlc1i, &
2088 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: lay, lstb
2089 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: lsta
2090 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :, :) :: icell
2091 REAL(kind=
dp) :: coord2, cut, cut2, ener2, tcoord, &
2092 tcoord2, tener, tener2
2093 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: f2ij, f3ij, f3ik, rel, rxyz, txyz
2097 cut = 0.4500000e+01_dp
2099 IF (count == 0)
OPEN (unit=10, file=
'lenosky.mon', status=
'unknown')
2100 count = count + 1.e0_dp
2103 ll1 = int(alat(1)/cut)
2104 IF (ll1 < 1) cpabort(
"alat(1) too small")
2105 ll2 = int(alat(2)/cut)
2106 IF (ll2 < 1) cpabort(
"alat(2) too small")
2107 ll3 = int(alat(3)/cut)
2108 IF (ll3 < 1) cpabort(
"alat(3) too small")
2124 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
2125 icell(0, -1:ll1, -1:ll2, -1:ll3) = 0
2126 rlc1i = int(ll1/alat(1))
2127 rlc2i = int(ll2/alat(2))
2128 rlc3i = int(ll3/alat(3))
2130 loop_iat_s:
DO iat = 1, nat
2131 rxyz0(1, iat) =
modulo(
modulo(rxyz0(1, iat), alat(1)), alat(1))
2132 rxyz0(2, iat) =
modulo(
modulo(rxyz0(2, iat), alat(2)), alat(2))
2133 rxyz0(3, iat) =
modulo(
modulo(rxyz0(3, iat), alat(3)), alat(3))
2134 l1 = int(rxyz0(1, iat)*rlc1i)
2135 l2 = int(rxyz0(2, iat)*rlc2i)
2136 l3 = int(rxyz0(3, iat)*rlc3i)
2138 ii = icell(0, l1, l2, l3)
2140 icell(0, l1, l2, l3) = ii
2142 WRITE (10, *) count,
'NCX too small', ncx
2147 icell(ii, l1, l2, l3) = iat
2157 rxyz0(1, iat) =
modulo(
modulo(rxyz0(1, iat), alat(1)), alat(1))
2158 rxyz0(2, iat) =
modulo(
modulo(rxyz0(2, iat), alat(2)), alat(2))
2159 rxyz0(3, iat) =
modulo(
modulo(rxyz0(3, iat), alat(3)), alat(3))
2167 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
2168 icell(0, -1:ll1, -1:ll2, -1:ll3) = 0
2169 rlc1i = int(ll1/alat(1))
2170 rlc2i = int(ll2/alat(2))
2171 rlc3i = int(ll3/alat(3))
2173 loop_iat_p:
DO iat = 1, nat
2174 l1 = int(rxyz0(1, iat)*rlc1i)
2175 l2 = int(rxyz0(2, iat)*rlc2i)
2176 l3 = int(rxyz0(3, iat)*rlc3i)
2177 ii = icell(0, l1, l2, l3)
2179 icell(0, l1, l2, l3) = ii
2181 WRITE (10, *) count,
'NCX too small', ncx
2186 icell(ii, l1, l2, l3) = iat
2194 laymx = ncx*(2*ll1*ll2 + 2*ll1*ll3 + 2*ll2*ll3 + 4*ll1 + 4*ll2 + 4*ll3 + 8)
2196 ALLOCATE (rxyz(3, nn), lay(nn))
2199 rxyz(1, iat) = rxyz0(1, iat)
2200 rxyz(2, iat) = rxyz0(2, iat)
2201 rxyz(3, iat) = rxyz0(3, iat)
2208 in = icell(0, l1, l2, 0)
2209 icell(0, l1, l2, ll3) = in
2211 i = icell(ii, l1, l2, 0)
2213 IF (il > nn) cpabort(
"enlarge laymx")
2215 icell(ii, l1, l2, ll3) = il
2216 rxyz(1, il) = rxyz(1, i)
2217 rxyz(2, il) = rxyz(2, i)
2218 rxyz(3, il) = rxyz(3, i) + alat(3)
2221 in = icell(0, l1, l2, ll3 - 1)
2222 icell(0, l1, l2, -1) = in
2224 i = icell(ii, l1, l2, ll3 - 1)
2226 IF (il > nn) cpabort(
"enlarge laymx")
2228 icell(ii, l1, l2, -1) = il
2229 rxyz(1, il) = rxyz(1, i)
2230 rxyz(2, il) = rxyz(2, i)
2231 rxyz(3, il) = rxyz(3, i) - alat(3)
2241 in = icell(0, 0, l2, l3)
2242 icell(0, ll1, l2, l3) = in
2244 i = icell(ii, 0, l2, l3)
2246 IF (il > nn) cpabort(
"enlarge laymx")
2248 icell(ii, ll1, l2, l3) = il
2249 rxyz(1, il) = rxyz(1, i) + alat(1)
2250 rxyz(2, il) = rxyz(2, i)
2251 rxyz(3, il) = rxyz(3, i)
2254 in = icell(0, ll1 - 1, l2, l3)
2255 icell(0, -1, l2, l3) = in
2257 i = icell(ii, ll1 - 1, l2, l3)
2259 IF (il > nn) cpabort(
"enlarge laymx")
2261 icell(ii, -1, l2, l3) = il
2262 rxyz(1, il) = rxyz(1, i) - alat(1)
2263 rxyz(2, il) = rxyz(2, i)
2264 rxyz(3, il) = rxyz(3, i)
2274 in = icell(0, l1, 0, l3)
2275 icell(0, l1, ll2, l3) = in
2277 i = icell(ii, l1, 0, l3)
2279 IF (il > nn) cpabort(
"enlarge laymx")
2281 icell(ii, l1, ll2, l3) = il
2282 rxyz(1, il) = rxyz(1, i)
2283 rxyz(2, il) = rxyz(2, i) + alat(2)
2284 rxyz(3, il) = rxyz(3, i)
2287 in = icell(0, l1, ll2 - 1, l3)
2288 icell(0, l1, -1, l3) = in
2290 i = icell(ii, l1, ll2 - 1, l3)
2292 IF (il > nn) cpabort(
"enlarge laymx")
2294 icell(ii, l1, -1, l3) = il
2295 rxyz(1, il) = rxyz(1, i)
2296 rxyz(2, il) = rxyz(2, i) - alat(2)
2297 rxyz(3, il) = rxyz(3, i)
2306 in = icell(0, l1, 0, 0)
2307 icell(0, l1, ll2, ll3) = in
2309 i = icell(ii, l1, 0, 0)
2311 IF (il > nn) cpabort(
"enlarge laymx")
2313 icell(ii, l1, ll2, ll3) = il
2314 rxyz(1, il) = rxyz(1, i)
2315 rxyz(2, il) = rxyz(2, i) + alat(2)
2316 rxyz(3, il) = rxyz(3, i) + alat(3)
2319 in = icell(0, l1, 0, ll3 - 1)
2320 icell(0, l1, ll2, -1) = in
2322 i = icell(ii, l1, 0, ll3 - 1)
2324 IF (il > nn) cpabort(
"enlarge laymx")
2326 icell(ii, l1, ll2, -1) = il
2327 rxyz(1, il) = rxyz(1, i)
2328 rxyz(2, il) = rxyz(2, i) + alat(2)
2329 rxyz(3, il) = rxyz(3, i) - alat(3)
2332 in = icell(0, l1, ll2 - 1, 0)
2333 icell(0, l1, -1, ll3) = in
2335 i = icell(ii, l1, ll2 - 1, 0)
2337 IF (il > nn) cpabort(
"enlarge laymx")
2339 icell(ii, l1, -1, ll3) = il
2340 rxyz(1, il) = rxyz(1, i)
2341 rxyz(2, il) = rxyz(2, i) - alat(2)
2342 rxyz(3, il) = rxyz(3, i) + alat(3)
2345 in = icell(0, l1, ll2 - 1, ll3 - 1)
2346 icell(0, l1, -1, -1) = in
2348 i = icell(ii, l1, ll2 - 1, ll3 - 1)
2350 IF (il > nn) cpabort(
"enlarge laymx")
2352 icell(ii, l1, -1, -1) = il
2353 rxyz(1, il) = rxyz(1, i)
2354 rxyz(2, il) = rxyz(2, i) - alat(2)
2355 rxyz(3, il) = rxyz(3, i) - alat(3)
2363 in = icell(0, 0, l2, 0)
2364 icell(0, ll1, l2, ll3) = in
2366 i = icell(ii, 0, l2, 0)
2368 IF (il > nn) cpabort(
"enlarge laymx")
2370 icell(ii, ll1, l2, ll3) = il
2371 rxyz(1, il) = rxyz(1, i) + alat(1)
2372 rxyz(2, il) = rxyz(2, i)
2373 rxyz(3, il) = rxyz(3, i) + alat(3)
2376 in = icell(0, 0, l2, ll3 - 1)
2377 icell(0, ll1, l2, -1) = in
2379 i = icell(ii, 0, l2, ll3 - 1)
2381 IF (il > nn) cpabort(
"enlarge laymx")
2383 icell(ii, ll1, l2, -1) = il
2384 rxyz(1, il) = rxyz(1, i) + alat(1)
2385 rxyz(2, il) = rxyz(2, i)
2386 rxyz(3, il) = rxyz(3, i) - alat(3)
2389 in = icell(0, ll1 - 1, l2, 0)
2390 icell(0, -1, l2, ll3) = in
2392 i = icell(ii, ll1 - 1, l2, 0)
2394 IF (il > nn) cpabort(
"enlarge laymx")
2396 icell(ii, -1, l2, ll3) = il
2397 rxyz(1, il) = rxyz(1, i) - alat(1)
2398 rxyz(2, il) = rxyz(2, i)
2399 rxyz(3, il) = rxyz(3, i) + alat(3)
2402 in = icell(0, ll1 - 1, l2, ll3 - 1)
2403 icell(0, -1, l2, -1) = in
2405 i = icell(ii, ll1 - 1, l2, ll3 - 1)
2407 IF (il > nn) cpabort(
"enlarge laymx")
2409 icell(ii, -1, l2, -1) = il
2410 rxyz(1, il) = rxyz(1, i) - alat(1)
2411 rxyz(2, il) = rxyz(2, i)
2412 rxyz(3, il) = rxyz(3, i) - alat(3)
2420 in = icell(0, 0, 0, l3)
2421 icell(0, ll1, ll2, l3) = in
2423 i = icell(ii, 0, 0, l3)
2425 IF (il > nn) cpabort(
"enlarge laymx")
2427 icell(ii, ll1, ll2, l3) = il
2428 rxyz(1, il) = rxyz(1, i) + alat(1)
2429 rxyz(2, il) = rxyz(2, i) + alat(2)
2430 rxyz(3, il) = rxyz(3, i)
2433 in = icell(0, ll1 - 1, 0, l3)
2434 icell(0, -1, ll2, l3) = in
2436 i = icell(ii, ll1 - 1, 0, l3)
2438 IF (il > nn) cpabort(
"enlarge laymx")
2440 icell(ii, -1, ll2, l3) = il
2441 rxyz(1, il) = rxyz(1, i) - alat(1)
2442 rxyz(2, il) = rxyz(2, i) + alat(2)
2443 rxyz(3, il) = rxyz(3, i)
2446 in = icell(0, 0, ll2 - 1, l3)
2447 icell(0, ll1, -1, l3) = in
2449 i = icell(ii, 0, ll2 - 1, l3)
2451 IF (il > nn) cpabort(
"enlarge laymx")
2453 icell(ii, ll1, -1, l3) = il
2454 rxyz(1, il) = rxyz(1, i) + alat(1)
2455 rxyz(2, il) = rxyz(2, i) - alat(2)
2456 rxyz(3, il) = rxyz(3, i)
2459 in = icell(0, ll1 - 1, ll2 - 1, l3)
2460 icell(0, -1, -1, l3) = in
2462 i = icell(ii, ll1 - 1, ll2 - 1, l3)
2464 IF (il > nn) cpabort(
"enlarge laymx")
2466 icell(ii, -1, -1, l3) = il
2467 rxyz(1, il) = rxyz(1, i) - alat(1)
2468 rxyz(2, il) = rxyz(2, i) - alat(2)
2469 rxyz(3, il) = rxyz(3, i)
2475 in = icell(0, 0, 0, 0)
2476 icell(0, ll1, ll2, ll3) = in
2478 i = icell(ii, 0, 0, 0)
2480 IF (il > nn) cpabort(
"enlarge laymx")
2482 icell(ii, ll1, ll2, ll3) = il
2483 rxyz(1, il) = rxyz(1, i) + alat(1)
2484 rxyz(2, il) = rxyz(2, i) + alat(2)
2485 rxyz(3, il) = rxyz(3, i) + alat(3)
2488 in = icell(0, ll1 - 1, 0, 0)
2489 icell(0, -1, ll2, ll3) = in
2491 i = icell(ii, ll1 - 1, 0, 0)
2493 IF (il > nn) cpabort(
"enlarge laymx")
2495 icell(ii, -1, ll2, ll3) = il
2496 rxyz(1, il) = rxyz(1, i) - alat(1)
2497 rxyz(2, il) = rxyz(2, i) + alat(2)
2498 rxyz(3, il) = rxyz(3, i) + alat(3)
2501 in = icell(0, 0, ll2 - 1, 0)
2502 icell(0, ll1, -1, ll3) = in
2504 i = icell(ii, 0, ll2 - 1, 0)
2506 IF (il > nn) cpabort(
"enlarge laymx")
2508 icell(ii, ll1, -1, ll3) = il
2509 rxyz(1, il) = rxyz(1, i) + alat(1)
2510 rxyz(2, il) = rxyz(2, i) - alat(2)
2511 rxyz(3, il) = rxyz(3, i) + alat(3)
2514 in = icell(0, ll1 - 1, ll2 - 1, 0)
2515 icell(0, -1, -1, ll3) = in
2517 i = icell(ii, ll1 - 1, ll2 - 1, 0)
2519 IF (il > nn) cpabort(
"enlarge laymx")
2521 icell(ii, -1, -1, ll3) = il
2522 rxyz(1, il) = rxyz(1, i) - alat(1)
2523 rxyz(2, il) = rxyz(2, i) - alat(2)
2524 rxyz(3, il) = rxyz(3, i) + alat(3)
2527 in = icell(0, 0, 0, ll3 - 1)
2528 icell(0, ll1, ll2, -1) = in
2530 i = icell(ii, 0, 0, ll3 - 1)
2532 IF (il > nn) cpabort(
"enlarge laymx")
2534 icell(ii, ll1, ll2, -1) = il
2535 rxyz(1, il) = rxyz(1, i) + alat(1)
2536 rxyz(2, il) = rxyz(2, i) + alat(2)
2537 rxyz(3, il) = rxyz(3, i) - alat(3)
2540 in = icell(0, ll1 - 1, 0, ll3 - 1)
2541 icell(0, -1, ll2, -1) = in
2543 i = icell(ii, ll1 - 1, 0, ll3 - 1)
2545 IF (il > nn) cpabort(
"enlarge laymx")
2547 icell(ii, -1, ll2, -1) = il
2548 rxyz(1, il) = rxyz(1, i) - alat(1)
2549 rxyz(2, il) = rxyz(2, i) + alat(2)
2550 rxyz(3, il) = rxyz(3, i) - alat(3)
2553 in = icell(0, 0, ll2 - 1, ll3 - 1)
2554 icell(0, ll1, -1, -1) = in
2556 i = icell(ii, 0, ll2 - 1, ll3 - 1)
2558 IF (il > nn) cpabort(
"enlarge laymx")
2560 icell(ii, ll1, -1, -1) = il
2561 rxyz(1, il) = rxyz(1, i) + alat(1)
2562 rxyz(2, il) = rxyz(2, i) - alat(2)
2563 rxyz(3, il) = rxyz(3, i) - alat(3)
2566 in = icell(0, ll1 - 1, ll2 - 1, ll3 - 1)
2567 icell(0, -1, -1, -1) = in
2569 i = icell(ii, ll1 - 1, ll2 - 1, ll3 - 1)
2571 IF (il > nn) cpabort(
"enlarge laymx")
2573 icell(ii, -1, -1, -1) = il
2574 rxyz(1, il) = rxyz(1, i) - alat(1)
2575 rxyz(2, il) = rxyz(2, i) - alat(2)
2576 rxyz(3, il) = rxyz(3, i) - alat(3)
2579 ALLOCATE (lsta(2, nat))
2582 ALLOCATE (lstb(nnbrx*nat), rel(5, nnbrx*nat))
2598 myspace = (nat*nnbrx)/npr
2599 IF (iam == 0) myspaceout = myspace
2602 loop_l3:
DO l3 = 0, ll3 - 1
2603 loop_l2:
DO l2 = 0, ll2 - 1
2604 loop_l1:
DO l1 = 0, ll1 - 1
2605 loop_ii:
DO ii = 1, icell(0, l1, l2, l3)
2606 iat = icell(ii, l1, l2, l3)
2607 IF (((iat - 1)*npr)/nat == iam)
THEN
2609 lsta(1, iat) = iam*myspace + indlst + 1
2610 CALL sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
2611 rxyz, icell, lstb(iam*myspace + 1), lay, &
2612 rel(1, iam*myspace + 1), cut2, indlst)
2613 lsta(2, iat) = iam*myspace + indlst
2624 indlstx = max(indlstx, indlst)
2628 IF (indlstx >= myspaceout)
THEN
2629 WRITE (10, *) count,
'NNBRX too small', nnbrx
2630 DEALLOCATE (lstb, rel)
2648 npjx = 300; npjkx = 6000
2655 ALLOCATE (txyz(3, nat), f2ij(3, npjx), f3ij(3, npjkx), f3ik(3, npjkx))
2665 fxyz(1, iat) = 0.e0_dp
2666 fxyz(2, iat) = 0.e0_dp
2667 fxyz(3, iat) = 0.e0_dp
2672 lot = int(real(nat, kind=
dp)/real(npr, kind=
dp) + .999999999999e0_dp)
2674 iat2 = min((iam + 1)*lot, nat)
2676 CALL subfeniat_l(iat1, iat2, nat, lsta, lstb, rel, tener, tener2, &
2677 tcoord, tcoord2, nnbrx, txyz, f2ij, npjx, f3ij, npjkx, f3ik, istop)
2680 ener2 = ener2 + tener2
2681 coord = coord + tcoord
2682 coord2 = coord2 + tcoord2
2683 istopg = istopg + istop
2685 fxyz(1, iat) = fxyz(1, iat) + txyz(1, iat)
2686 fxyz(2, iat) = fxyz(2, iat) + txyz(2, iat)
2687 fxyz(3, iat) = fxyz(3, iat) + txyz(3, iat)
2689 DEALLOCATE (txyz, f2ij, f3ij, f3ik)
2696 ALLOCATE (f2ij(3, npjx), f3ij(3, npjkx), f3ik(3, npjkx))
2697 CALL subfeniat_l(iat1, iat2, nat, lsta, lstb, rel, ener, ener2, &
2698 coord, coord2, nnbrx, fxyz, f2ij, npjx, f3ij, npjkx, f3ik, istopg)
2699 DEALLOCATE (f2ij, f3ij, f3ik)
2704 IF (istopg > 0) cpabort(
"DIMENSION ERROR (see WARNING above)")
2705 ener_var = ener2/nat - (ener/nat)**2
2707 coord_var = coord2/nat - coord**2
2709 DEALLOCATE (rxyz, icell, lay, lsta, lstb, rel)
2711 END SUBROUTINE eip_lenosky_silicon
2734 SUBROUTINE subfeniat_l(iat1, iat2, nat, lsta, lstb, rel, tener, tener2, &
2735 tcoord, tcoord2, nnbrx, txyz, f2ij, npjx, f3ij, npjkx, f3ik, istop)
2741 INTEGER :: iat1, iat2, nat, lsta(2, nat)
2742 REAL(kind=
dp) :: tener, tener2, tcoord, tcoord2
2744 REAL(kind=
dp) :: rel(5, nnbrx*nat)
2745 INTEGER :: lstb(nnbrx*nat)
2746 REAL(kind=
dp) :: txyz(3, nat)
2748 REAL(kind=
dp) :: f2ij(3, npjx)
2750 REAL(kind=
dp) :: f3ij(3, npjkx), f3ik(3, npjkx)
2753 REAL(kind=
dp),
DIMENSION(0:10),
PARAMETER :: cof_rho = [0.13747000000000e+00_dp, &
2754 -0.14831000000000e+00_dp, -0.55972000000000e+00_dp, -0.73110000000000e+00_dp, &
2755 -0.76283000000000e+00_dp, -0.72918000000000e+00_dp, -0.66620000000000e+00_dp, &
2756 -0.57328000000000e+00_dp, -0.40690000000000e+00_dp, -0.16662000000000e+00_dp, &
2757 0.00000000000000e+00_dp]
2758 REAL(kind=
dp),
DIMENSION(0:10),
PARAMETER :: dof_rho = [-0.32275496741918e+01_dp, &
2759 -0.64119006516165e+01_dp, 0.10030652280658e+02_dp, 0.22937915289857e+01_dp, &
2760 0.17416816033995e+01_dp, 0.54648205741626e+00_dp, 0.47189016693543e+00_dp, &
2761 0.20569572748420e+01_dp, 0.23192807336964e+01_dp, -0.24908020962757e+00_dp, &
2762 -0.12371959895186e+02_dp]
2763 REAL(kind=
dp),
DIMENSION(0:7),
PARAMETER :: cof_ggg = [0.52541600000000e+01_dp, &
2764 0.23591500000000e+01_dp, 0.11959500000000e+01_dp, 0.12299500000000e+01_dp, &
2765 0.20356500000000e+01_dp, 0.34247400000000e+01_dp, 0.49485900000000e+01_dp, &
2766 0.56179900000000e+01_dp], cof_uuu = [-0.10749300000000e+01_dp, -0.20045000000000e+00_dp, &
2767 0.41422000000000e+00_dp, 0.87939000000000e+00_dp, 0.12668900000000e+01_dp, &
2768 0.16299800000000e+01_dp, 0.19773800000000e+01_dp, 0.23961800000000e+01_dp]
2769 REAL(kind=
dp),
DIMENSION(0:7),
PARAMETER :: dof_ggg = [0.15826876132396e+02_dp, &
2770 0.31176239377907e+02_dp, 0.16589446539683e+02_dp, 0.11083892500520e+02_dp, &
2771 0.90887216383860e+01_dp, 0.54902279653967e+01_dp, -0.18823313223755e+02_dp, &
2772 -0.77183416481005e+01_dp], dof_uuu = [-0.14827125747284e+00_dp, -0.14922155328475e+00_dp, &
2773 -0.70113224223509e-01_dp, -0.39449020349230e-01_dp, -0.15815242579643e-01_dp, &
2774 0.26112640061855e-01_dp, -0.13786974745095e+00_dp, 0.74941595372657e+00_dp]
2775 REAL(kind=
dp),
DIMENSION(0:9),
PARAMETER :: cof_fff = [0.12503100000000e+01_dp, &
2776 0.86821000000000e+00_dp, 0.60846000000000e+00_dp, 0.48756000000000e+00_dp, &
2777 0.44163000000000e+00_dp, 0.37610000000000e+00_dp, 0.27145000000000e+00_dp, &
2778 0.14814000000000e+00_dp, 0.48550000000000e-01_dp, 0.00000000000000e+00_dp], cof_phi = [ &
2779 0.69299400000000e+01_dp, -0.43995000000000e+00_dp, -0.17012300000000e+01_dp, &
2780 -0.16247300000000e+01_dp, -0.99696000000000e+00_dp, -0.27391000000000e+00_dp, &
2781 -0.24990000000000e-01_dp, -0.17840000000000e-01_dp, -0.96100000000000e-02_dp, &
2782 0.00000000000000e+00_dp]
2783 REAL(kind=
dp),
DIMENSION(0:9),
PARAMETER :: dof_fff = [0.27904652711432e+02_dp, &
2784 -0.45230754228635e+01_dp, 0.50531739800222e+01_dp, 0.11806545027747e+01_dp, &
2785 -0.66693699112098e+00_dp, -0.89430653829079e+00_dp, -0.50891685571587e+00_dp, &
2786 0.66278396115427e+00_dp, 0.73976101109878e+00_dp, 0.25795319944506e+01_dp], dof_phi = [ &
2787 0.16533229480429e+03_dp, 0.39415410391417e+02_dp, 0.68710036300407e+01_dp, &
2788 0.53406950884203e+01_dp, 0.15347960162782e+01_dp, -0.63347591535331e+01_dp, &
2789 -0.17987794021458e+01_dp, 0.47429676211617e+00_dp, -0.40087646318907e-01_dp, &
2790 -0.23942617684055e+00_dp]
2791 REAL(kind=
dp),
PARAMETER :: h2sixth_fff = 8.23045267489712e-003_dp, &
2792 h2sixth_ggg = 1.10221225156463e-002_dp, h2sixth_phi = 1.85185185185185e-002_dp, &
2793 h2sixth_rho = 6.66666666666667e-003_dp, h2sixth_uuu = 0.318679429600340e0_dp, &
2794 hi_fff = 4.50000000000e0_dp, hi_ggg = 3.88858644327663e0_dp, hi_phi = 3.00000000000e0_dp, &
2795 hi_rho = 5.00000000000e0_dp, hi_uuu = 0.723181585730594e0_dp, &
2796 hsixth_fff = 3.70370370370370e-002_dp, hsixth_ggg = 4.28604761904762e-002_dp, &
2797 hsixth_phi = 5.55555555555556e-002_dp, hsixth_rho = 3.33333333333333e-002_dp, &
2798 hsixth_uuu = 0.230463095238095e0_dp
2799 REAL(kind=
dp),
PARAMETER :: tmax_fff = 0.3500000e+01_dp, tmax_ggg = 0.8001400e+00_dp, &
2800 tmax_phi = 0.4500000e+01_dp, tmax_rho = 0.3500000e+01_dp, tmax_uuu = 0.7908520e+01_dp, &
2801 tmin_fff = 0.1500000e+01_dp, tmin_ggg = -0.1000000e+01_dp, tmin_phi = 0.1500000e+01_dp, &
2802 tmin_rho = 0.1500000e+01_dp, tmin_uuu = -0.1770930e+01_dp
2804 INTEGER :: iat, jat, jbr, jcnt, jkcnt, kat, kbr, &
2805 khi_fff, khi_ggg, klo_fff, klo_ggg
2806 REAL(kind=
dp) :: a2_fff, a2_ggg, a_fff, a_ggg, b2_fff, b2_ggg, b_fff, b_ggg, cof1_fff, &
2807 cof1_ggg, cof2_fff, cof2_ggg, cof3_fff, cof3_ggg, cof4_fff, cof4_ggg, cof_fff_khi, &
2808 cof_fff_klo, cof_ggg_khi, cof_ggg_klo, coord_iat, costheta, dens, dens2, dens3, &
2809 dof_fff_khi, dof_fff_klo, dof_ggg_khi, dof_ggg_klo, e_phi, e_uuu, ener_iat, ep_phi, &
2810 ep_uuu, fij, fijp, fik, fikp, fxij, fxik, fyij, fyik, fzij, fzik, gjik, gjikp, rho, rhop, &
2811 rij, rik, sij, sik, t1, t2, t3, t4, tt, tt_fff, tt_ggg, xarg, ypt1_fff, ypt1_ggg, &
2812 ypt2_fff, ypt2_ggg, yt1_fff, yt1_ggg, yt2_fff, yt2_ggg
2822 txyz(1, iat) = 0.e0_dp
2823 txyz(2, iat) = 0.e0_dp
2824 txyz(3, iat) = 0.e0_dp
2829 forces_and_energy:
DO iat = iat1, iat2
2837 calculate:
DO jbr = lsta(1, iat), lsta(2, iat)
2840 IF (jcnt > npjx)
THEN
2841 WRITE (*, *)
'WARNING: enlarge npjx'
2854 IF (rij <= 2.36e0_dp)
THEN
2855 coord_iat = coord_iat + 1.e0_dp
2856 ELSE IF (rij >= 3.12e0_dp)
THEN
2858 xarg = (rij - 2.36e0_dp)*(1.e0_dp/(3.12e0_dp - 2.36e0_dp))
2859 coord_iat = coord_iat + (2*xarg + 1.e0_dp)*(xarg - 1.e0_dp)**2
2863 CALL splint(cof_phi, dof_phi, tmin_phi, tmax_phi, &
2864 hsixth_phi, h2sixth_phi, hi_phi, 10, rij, e_phi, ep_phi)
2865 ener_iat = ener_iat + (e_phi*.5e0_dp)
2866 txyz(1, iat) = txyz(1, iat) - fxij*(ep_phi*.5e0_dp)
2867 txyz(2, iat) = txyz(2, iat) - fyij*(ep_phi*.5e0_dp)
2868 txyz(3, iat) = txyz(3, iat) - fzij*(ep_phi*.5e0_dp)
2869 txyz(1, jat) = txyz(1, jat) + fxij*(ep_phi*.5e0_dp)
2870 txyz(2, jat) = txyz(2, jat) + fyij*(ep_phi*.5e0_dp)
2871 txyz(3, jat) = txyz(3, jat) + fzij*(ep_phi*.5e0_dp)
2874 CALL splint(cof_rho, dof_rho, tmin_rho, tmax_rho, &
2875 hsixth_rho, h2sixth_rho, hi_rho, 11, rij, rho, rhop)
2877 f2ij(1, jcnt) = fxij*rhop
2878 f2ij(2, jcnt) = fyij*rhop
2879 f2ij(3, jcnt) = fzij*rhop
2882 CALL splint(cof_fff, dof_fff, tmin_fff, tmax_fff, &
2883 hsixth_fff, h2sixth_fff, hi_fff, 10, rij, fij, fijp)
2885 embed_3body:
DO kbr = lsta(1, iat), lsta(2, iat)
2889 IF (jkcnt > npjkx)
THEN
2890 WRITE (*, *)
'WARNING: enlarge npjkx', npjkx
2911 IF (rik > tmax_fff)
THEN
2912 fikp = 0.e0_dp; fik = 0.e0_dp
2913 gjik = 0.e0_dp; gjikp = 0.e0_dp; sik = 0.e0_dp
2914 costheta = 0.e0_dp; fxik = 0.e0_dp; fyik = 0.e0_dp; fzik = 0.e0_dp
2915 ELSE IF (rik < tmin_fff)
THEN
2919 costheta = fxij*fxik + fyij*fyik + fzij*fzik
2921 fikp = hi_fff*(cof_fff(1) - cof_fff(0)) - &
2922 (dof_fff(1) + 2.e0_dp*dof_fff(0))*hsixth_fff
2923 fik = cof_fff(0) + (rik - tmin_fff)*fikp
2924 tt_ggg = (costheta - tmin_ggg)*hi_ggg
2925 IF (costheta > tmax_ggg)
THEN
2926 gjikp = hi_ggg*(cof_ggg(8 - 1) - cof_ggg(8 - 2)) + &
2927 (2.e0_dp*dof_ggg(8 - 1) + dof_ggg(8 - 2))*hsixth_ggg
2928 gjik = cof_ggg(8 - 1) + (costheta - tmax_ggg)*gjikp
2930 klo_ggg = int(tt_ggg)
2931 khi_ggg = klo_ggg + 1
2932 cof_ggg_klo = cof_ggg(klo_ggg)
2933 dof_ggg_klo = dof_ggg(klo_ggg)
2934 b_ggg = tt_ggg - klo_ggg
2935 a_ggg = 1.e0_dp - b_ggg
2936 cof_ggg_khi = cof_ggg(khi_ggg)
2937 dof_ggg_khi = dof_ggg(khi_ggg)
2938 b2_ggg = b_ggg*b_ggg
2939 gjik = a_ggg*cof_ggg_klo
2940 gjikp = cof_ggg_khi - cof_ggg_klo
2941 a2_ggg = a_ggg*a_ggg
2942 cof1_ggg = a2_ggg - 1.e0_dp
2943 cof2_ggg = b2_ggg - 1.e0_dp
2944 gjik = gjik + b_ggg*cof_ggg_khi
2945 gjikp = hi_ggg*gjikp
2946 cof3_ggg = 3.e0_dp*b2_ggg
2947 cof4_ggg = 3.e0_dp*a2_ggg
2948 cof1_ggg = a_ggg*cof1_ggg
2949 cof2_ggg = b_ggg*cof2_ggg
2950 cof3_ggg = cof3_ggg - 1.e0_dp
2951 cof4_ggg = cof4_ggg - 1.e0_dp
2952 yt1_ggg = cof1_ggg*dof_ggg_klo
2953 yt2_ggg = cof2_ggg*dof_ggg_khi
2954 ypt1_ggg = cof3_ggg*dof_ggg_khi
2955 ypt2_ggg = cof4_ggg*dof_ggg_klo
2956 gjik = gjik + (yt1_ggg + yt2_ggg)*h2sixth_ggg
2957 gjikp = gjikp + (ypt1_ggg - ypt2_ggg)*hsixth_ggg
2961 tt_fff = rik - tmin_fff
2962 costheta = fxij*fxik
2964 tt_fff = tt_fff*hi_fff
2965 costheta = costheta + fyij*fyik
2967 klo_fff = int(tt_fff)
2968 costheta = costheta + fzij*fzik
2970 tt_ggg = (costheta - tmin_ggg)*hi_ggg
2971 IF (costheta > tmax_ggg)
THEN
2972 gjikp = hi_ggg*(cof_ggg(8 - 1) - cof_ggg(8 - 2)) + &
2973 (2.e0_dp*dof_ggg(8 - 1) + dof_ggg(8 - 2))*hsixth_ggg
2974 gjik = cof_ggg(8 - 1) + (costheta - tmax_ggg)*gjikp
2975 khi_fff = klo_fff + 1
2976 cof_fff_klo = cof_fff(klo_fff)
2977 dof_fff_klo = dof_fff(klo_fff)
2978 b_fff = tt_fff - klo_fff
2979 a_fff = 1.e0_dp - b_fff
2980 cof_fff_khi = cof_fff(khi_fff)
2981 dof_fff_khi = dof_fff(khi_fff)
2982 b2_fff = b_fff*b_fff
2983 fik = a_fff*cof_fff_klo
2984 fikp = cof_fff_khi - cof_fff_klo
2985 a2_fff = a_fff*a_fff
2986 cof1_fff = a2_fff - 1.e0_dp
2987 cof2_fff = b2_fff - 1.e0_dp
2988 fik = fik + b_fff*cof_fff_khi
2990 cof3_fff = 3.e0_dp*b2_fff
2991 cof4_fff = 3.e0_dp*a2_fff
2992 cof1_fff = a_fff*cof1_fff
2993 cof2_fff = b_fff*cof2_fff
2994 cof3_fff = cof3_fff - 1.e0_dp
2995 cof4_fff = cof4_fff - 1.e0_dp
2996 yt1_fff = cof1_fff*dof_fff_klo
2997 yt2_fff = cof2_fff*dof_fff_khi
2998 ypt1_fff = cof3_fff*dof_fff_khi
2999 ypt2_fff = cof4_fff*dof_fff_klo
3000 fik = fik + (yt1_fff + yt2_fff)*h2sixth_fff
3001 fikp = fikp + (ypt1_fff - ypt2_fff)*hsixth_fff
3003 klo_ggg = int(tt_ggg)
3004 khi_ggg = klo_ggg + 1
3005 khi_fff = klo_fff + 1
3006 cof_ggg_klo = cof_ggg(klo_ggg)
3007 cof_fff_klo = cof_fff(klo_fff)
3008 dof_ggg_klo = dof_ggg(klo_ggg)
3009 dof_fff_klo = dof_fff(klo_fff)
3010 b_ggg = tt_ggg - klo_ggg
3011 b_fff = tt_fff - klo_fff
3012 a_ggg = 1.e0_dp - b_ggg
3013 a_fff = 1.e0_dp - b_fff
3014 cof_ggg_khi = cof_ggg(khi_ggg)
3015 cof_fff_khi = cof_fff(khi_fff)
3016 dof_ggg_khi = dof_ggg(khi_ggg)
3017 dof_fff_khi = dof_fff(khi_fff)
3018 b2_ggg = b_ggg*b_ggg
3019 b2_fff = b_fff*b_fff
3020 gjik = a_ggg*cof_ggg_klo
3021 fik = a_fff*cof_fff_klo
3022 gjikp = cof_ggg_khi - cof_ggg_klo
3023 fikp = cof_fff_khi - cof_fff_klo
3024 a2_ggg = a_ggg*a_ggg
3025 a2_fff = a_fff*a_fff
3026 cof1_ggg = a2_ggg - 1.e0_dp
3027 cof1_fff = a2_fff - 1.e0_dp
3028 cof2_ggg = b2_ggg - 1.e0_dp
3029 cof2_fff = b2_fff - 1.e0_dp
3030 gjik = gjik + b_ggg*cof_ggg_khi
3031 fik = fik + b_fff*cof_fff_khi
3032 gjikp = hi_ggg*gjikp
3034 cof3_ggg = 3.e0_dp*b2_ggg
3035 cof3_fff = 3.e0_dp*b2_fff
3036 cof4_ggg = 3.e0_dp*a2_ggg
3037 cof4_fff = 3.e0_dp*a2_fff
3038 cof1_ggg = a_ggg*cof1_ggg
3039 cof1_fff = a_fff*cof1_fff
3040 cof2_ggg = b_ggg*cof2_ggg
3041 cof2_fff = b_fff*cof2_fff
3042 cof3_ggg = cof3_ggg - 1.e0_dp
3043 cof3_fff = cof3_fff - 1.e0_dp
3044 cof4_ggg = cof4_ggg - 1.e0_dp
3045 cof4_fff = cof4_fff - 1.e0_dp
3046 yt1_ggg = cof1_ggg*dof_ggg_klo
3047 yt1_fff = cof1_fff*dof_fff_klo
3048 yt2_ggg = cof2_ggg*dof_ggg_khi
3049 yt2_fff = cof2_fff*dof_fff_khi
3050 ypt1_ggg = cof3_ggg*dof_ggg_khi
3051 ypt1_fff = cof3_fff*dof_fff_khi
3052 ypt2_ggg = cof4_ggg*dof_ggg_klo
3053 ypt2_fff = cof4_fff*dof_fff_klo
3054 gjik = gjik + (yt1_ggg + yt2_ggg)*h2sixth_ggg
3055 fik = fik + (yt1_fff + yt2_fff)*h2sixth_fff
3056 gjikp = gjikp + (ypt1_ggg - ypt2_ggg)*hsixth_ggg
3057 fikp = fikp + (ypt1_fff - ypt2_fff)*hsixth_fff
3063 dens3 = dens3 + tt*gjik
3067 f3ij(1, jkcnt) = fxij*t1 + (fxik - fxij*costheta)*t2
3068 f3ij(2, jkcnt) = fyij*t1 + (fyik - fyij*costheta)*t2
3069 f3ij(3, jkcnt) = fzij*t1 + (fzik - fzij*costheta)*t2
3073 f3ik(1, jkcnt) = fxik*t3 + (fxij - fxik*costheta)*t4
3074 f3ik(2, jkcnt) = fyik*t3 + (fyij - fyik*costheta)*t4
3075 f3ik(3, jkcnt) = fzik*t3 + (fzij - fzik*costheta)*t4
3081 dens = dens2 + dens3
3082 CALL splint(cof_uuu, dof_uuu, tmin_uuu, tmax_uuu, &
3083 hsixth_uuu, h2sixth_uuu, hi_uuu, 8, dens, e_uuu, ep_uuu)
3084 ener_iat = ener_iat + e_uuu
3089 loop_again:
DO jbr = lsta(1, iat), lsta(2, iat)
3092 txyz(1, iat) = txyz(1, iat) - ep_uuu*f2ij(1, jcnt)
3093 txyz(2, iat) = txyz(2, iat) - ep_uuu*f2ij(2, jcnt)
3094 txyz(3, iat) = txyz(3, iat) - ep_uuu*f2ij(3, jcnt)
3095 txyz(1, jat) = txyz(1, jat) + ep_uuu*f2ij(1, jcnt)
3096 txyz(2, jat) = txyz(2, jat) + ep_uuu*f2ij(2, jcnt)
3097 txyz(3, jat) = txyz(3, jat) + ep_uuu*f2ij(3, jcnt)
3100 DO kbr = lsta(1, iat), lsta(2, iat)
3105 txyz(1, iat) = txyz(1, iat) - ep_uuu*(f3ij(1, jkcnt) + f3ik(1, jkcnt))
3106 txyz(2, iat) = txyz(2, iat) - ep_uuu*(f3ij(2, jkcnt) + f3ik(2, jkcnt))
3107 txyz(3, iat) = txyz(3, iat) - ep_uuu*(f3ij(3, jkcnt) + f3ik(3, jkcnt))
3108 txyz(1, jat) = txyz(1, jat) + ep_uuu*f3ij(1, jkcnt)
3109 txyz(2, jat) = txyz(2, jat) + ep_uuu*f3ij(2, jkcnt)
3110 txyz(3, jat) = txyz(3, jat) + ep_uuu*f3ij(3, jkcnt)
3111 txyz(1, kat) = txyz(1, kat) + ep_uuu*f3ik(1, jkcnt)
3112 txyz(2, kat) = txyz(2, kat) + ep_uuu*f3ik(2, jkcnt)
3113 txyz(3, kat) = txyz(3, kat) + ep_uuu*f3ik(3, jkcnt)
3121 tener = tener + ener_iat
3122 tener2 = tener2 + ener_iat**2
3123 tcoord = tcoord + coord_iat
3124 tcoord2 = tcoord2 + coord_iat**2
3126 END DO forces_and_energy
3128 END SUBROUTINE subfeniat_l
3150 SUBROUTINE sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
3151 rxyz, icell, lstb, lay, rel, cut2, indlst)
3154 INTEGER :: iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, &
3156 REAL(kind=
dp) :: rxyz(3, nn)
3157 INTEGER :: icell(0:ncx, -1:ll1, -1:ll2, -1:ll3), lstb(0:myspace - 1), lay(nn)
3158 REAL(kind=
dp) :: rel(5, 0:myspace - 1), cut2
3161 INTEGER :: jat, jj, k1, k2, k3
3162 REAL(kind=
dp) :: rr2, tt, tti, xrel, yrel, zrel
3164 loop_k3:
DO k3 = l3 - 1, l3 + 1
3165 loop_k2:
DO k2 = l2 - 1, l2 + 1
3166 loop_k1:
DO k1 = l1 - 1, l1 + 1
3167 loop_jj:
DO jj = 1, icell(0, k1, k2, k3)
3168 jat = icell(jj, k1, k2, k3)
3169 IF (jat == iat) cycle loop_k3
3170 xrel = rxyz(1, iat) - rxyz(1, jat)
3171 yrel = rxyz(2, iat) - rxyz(2, jat)
3172 zrel = rxyz(3, iat) - rxyz(3, jat)
3173 rr2 = xrel**2 + yrel**2 + zrel**2
3174 IF (rr2 <= cut2)
THEN
3175 indlst = min(indlst, myspace - 1)
3176 lstb(indlst) = lay(jat)
3180 rel(1, indlst) = xrel*tti
3181 rel(2, indlst) = yrel*tti
3182 rel(3, indlst) = zrel*tti
3184 rel(5, indlst) = tti
3193 END SUBROUTINE sublstiat_l
3209 SUBROUTINE splint(ya, y2a, tmin, tmax, hsixth, h2sixth, hi, n, x, y, yp)
3210 REAL(kind=
dp) :: tmin, tmax, hsixth, h2sixth, hi
3212 REAL(kind=
dp) :: y2a(0:n - 1), ya(0:n - 1), x, y, yp
3215 REAL(kind=
dp) :: a, a2, b, b2, cof1, cof2, cof3, cof4, &
3216 tt, y2a_khi, y2a_klo, ya_khi, ya_klo, &
3217 ypt1, ypt2, yt1, yt2
3222 yp = hi*(ya(1) - ya(0)) - &
3223 (y2a(1) + 2.e0_dp*y2a(0))*hsixth
3224 y = ya(0) + (x - tmin)*yp
3225 ELSE IF (x > tmax)
THEN
3226 yp = hi*(ya(n - 1) - ya(n - 2)) + &
3227 (2.e0_dp*y2a(n - 1) + y2a(n - 2))*hsixth
3228 y = ya(n - 1) + (x - tmax)*yp
3241 yp = ya_khi - ya_klo
3251 cof3 = cof3 - 1.e0_dp
3252 cof4 = cof4 - 1.e0_dp
3257 y = y + (yt1 + yt2)*h2sixth
3258 yp = yp + (ypt1 - ypt2)*hsixth
3261 END SUBROUTINE splint
3276 SUBROUTINE eip_stillinger_weber_silicon(nat, alat, rxyz0, fxyz, etot, count)
3319 REAL(
dp) :: alat(3), rxyz0(3, nat), fxyz(3, nat), &
3322 REAL(kind=
dp),
PARAMETER :: eps = 2.167239428587_dp, ra = 1.8_dp, &
3325 INTEGER :: i, iam, iat, ii, il, in, indlst, &
3326 indlstx, ipb, l1, l2, l3, laymx, ll1, &
3327 ll2, ll3, myspace, myspaceout, ncx, &
3328 ndat, nn, nnbrx, npjkx, npjx, npr
3329 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: lay, lstb
3330 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: lsta
3331 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :, :) :: icell
3332 REAL(
dp) :: cut, cut2, esigma, fx(nat), fx3(nat), &
3333 fy(nat), fy3(nat), fz(nat), fz3(nat), &
3334 isigma, p, p3, pv3, rlc1i, rlc2i, rlc3i
3335 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rel, rxyz
3337 count = count + 1._dp
3338 cut = sigma*ra*2._dp
3339 isigma = 1._dp/sigma
3343 ll1 = int(alat(1)/cut)
3344 IF (ll1 < 1) cpabort(
"alat(1) too small")
3345 ll2 = int(alat(2)/cut)
3346 IF (ll2 < 1) cpabort(
"alat(2) too small")
3347 ll3 = int(alat(3)/cut)
3348 IF (ll3 < 1) cpabort(
"alat(3) too small")
3354 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
3355 icell(0, :, :, :) = 0
3361 rxyz0(1, iat) =
modulo(
modulo(rxyz0(1, iat), alat(1)), alat(1))
3362 rxyz0(2, iat) =
modulo(
modulo(rxyz0(2, iat), alat(2)), alat(2))
3363 rxyz0(3, iat) =
modulo(
modulo(rxyz0(3, iat), alat(3)), alat(3))
3364 l1 = int(rxyz0(1, iat)*rlc1i)
3365 l2 = int(rxyz0(2, iat)*rlc2i)
3366 l3 = int(rxyz0(3, iat)*rlc3i)
3368 ii = icell(0, l1, l2, l3)
3370 icell(0, l1, l2, l3) = ii
3375 icell(ii, l1, l2, l3) = iat
3377 IF (
ALLOCATED(icell))
EXIT
3381 laymx = ncx*(2*ll1*ll2 + 2*ll1*ll3 + 2*ll2*ll3 + 4*ll1 + 4*ll2 + 4*ll3 + 8)
3383 ALLOCATE (rxyz(3, nn), lay(nn))
3386 rxyz(1, iat) = rxyz0(1, iat)
3387 rxyz(2, iat) = rxyz0(2, iat)
3388 rxyz(3, iat) = rxyz0(3, iat)
3395 in = icell(0, l1, l2, 0)
3396 icell(0, l1, l2, ll3) = in
3398 i = icell(ii, l1, l2, 0)
3400 IF (il > nn) cpabort(
"enlarge laymx")
3402 icell(ii, l1, l2, ll3) = il
3403 rxyz(1, il) = rxyz(1, i)
3404 rxyz(2, il) = rxyz(2, i)
3405 rxyz(3, il) = rxyz(3, i) + alat(3)
3408 in = icell(0, l1, l2, ll3 - 1)
3409 icell(0, l1, l2, -1) = in
3411 i = icell(ii, l1, l2, ll3 - 1)
3413 IF (il > nn) cpabort(
"enlarge laymx")
3415 icell(ii, l1, l2, -1) = il
3416 rxyz(1, il) = rxyz(1, i)
3417 rxyz(2, il) = rxyz(2, i)
3418 rxyz(3, il) = rxyz(3, i) - alat(3)
3428 in = icell(0, 0, l2, l3)
3429 icell(0, ll1, l2, l3) = in
3431 i = icell(ii, 0, l2, l3)
3433 IF (il > nn) cpabort(
"enlarge laymx")
3435 icell(ii, ll1, l2, l3) = il
3436 rxyz(1, il) = rxyz(1, i) + alat(1)
3437 rxyz(2, il) = rxyz(2, i)
3438 rxyz(3, il) = rxyz(3, i)
3441 in = icell(0, ll1 - 1, l2, l3)
3442 icell(0, -1, l2, l3) = in
3444 i = icell(ii, ll1 - 1, l2, l3)
3446 IF (il > nn) cpabort(
"enlarge laymx")
3448 icell(ii, -1, l2, l3) = il
3449 rxyz(1, il) = rxyz(1, i) - alat(1)
3450 rxyz(2, il) = rxyz(2, i)
3451 rxyz(3, il) = rxyz(3, i)
3461 in = icell(0, l1, 0, l3)
3462 icell(0, l1, ll2, l3) = in
3464 i = icell(ii, l1, 0, l3)
3466 IF (il > nn) cpabort(
"enlarge laymx")
3468 icell(ii, l1, ll2, l3) = il
3469 rxyz(1, il) = rxyz(1, i)
3470 rxyz(2, il) = rxyz(2, i) + alat(2)
3471 rxyz(3, il) = rxyz(3, i)
3474 in = icell(0, l1, ll2 - 1, l3)
3475 icell(0, l1, -1, l3) = in
3477 i = icell(ii, l1, ll2 - 1, l3)
3479 IF (il > nn) cpabort(
"enlarge laymx")
3481 icell(ii, l1, -1, l3) = il
3482 rxyz(1, il) = rxyz(1, i)
3483 rxyz(2, il) = rxyz(2, i) - alat(2)
3484 rxyz(3, il) = rxyz(3, i)
3493 in = icell(0, l1, 0, 0)
3494 icell(0, l1, ll2, ll3) = in
3496 i = icell(ii, l1, 0, 0)
3498 IF (il > nn) cpabort(
"enlarge laymx")
3500 icell(ii, l1, ll2, ll3) = il
3501 rxyz(1, il) = rxyz(1, i)
3502 rxyz(2, il) = rxyz(2, i) + alat(2)
3503 rxyz(3, il) = rxyz(3, i) + alat(3)
3506 in = icell(0, l1, 0, ll3 - 1)
3507 icell(0, l1, ll2, -1) = in
3509 i = icell(ii, l1, 0, ll3 - 1)
3511 IF (il > nn) cpabort(
"enlarge laymx")
3513 icell(ii, l1, ll2, -1) = il
3514 rxyz(1, il) = rxyz(1, i)
3515 rxyz(2, il) = rxyz(2, i) + alat(2)
3516 rxyz(3, il) = rxyz(3, i) - alat(3)
3519 in = icell(0, l1, ll2 - 1, 0)
3520 icell(0, l1, -1, ll3) = in
3522 i = icell(ii, l1, ll2 - 1, 0)
3524 IF (il > nn) cpabort(
"enlarge laymx")
3526 icell(ii, l1, -1, ll3) = il
3527 rxyz(1, il) = rxyz(1, i)
3528 rxyz(2, il) = rxyz(2, i) - alat(2)
3529 rxyz(3, il) = rxyz(3, i) + alat(3)
3532 in = icell(0, l1, ll2 - 1, ll3 - 1)
3533 icell(0, l1, -1, -1) = in
3535 i = icell(ii, l1, ll2 - 1, ll3 - 1)
3537 IF (il > nn) cpabort(
"enlarge laymx")
3539 icell(ii, l1, -1, -1) = il
3540 rxyz(1, il) = rxyz(1, i)
3541 rxyz(2, il) = rxyz(2, i) - alat(2)
3542 rxyz(3, il) = rxyz(3, i) - alat(3)
3550 in = icell(0, 0, l2, 0)
3551 icell(0, ll1, l2, ll3) = in
3553 i = icell(ii, 0, l2, 0)
3555 IF (il > nn) cpabort(
"enlarge laymx")
3557 icell(ii, ll1, l2, ll3) = il
3558 rxyz(1, il) = rxyz(1, i) + alat(1)
3559 rxyz(2, il) = rxyz(2, i)
3560 rxyz(3, il) = rxyz(3, i) + alat(3)
3563 in = icell(0, 0, l2, ll3 - 1)
3564 icell(0, ll1, l2, -1) = in
3566 i = icell(ii, 0, l2, ll3 - 1)
3568 IF (il > nn) cpabort(
"enlarge laymx")
3570 icell(ii, ll1, l2, -1) = il
3571 rxyz(1, il) = rxyz(1, i) + alat(1)
3572 rxyz(2, il) = rxyz(2, i)
3573 rxyz(3, il) = rxyz(3, i) - alat(3)
3576 in = icell(0, ll1 - 1, l2, 0)
3577 icell(0, -1, l2, ll3) = in
3579 i = icell(ii, ll1 - 1, l2, 0)
3581 IF (il > nn) cpabort(
"enlarge laymx")
3583 icell(ii, -1, l2, ll3) = il
3584 rxyz(1, il) = rxyz(1, i) - alat(1)
3585 rxyz(2, il) = rxyz(2, i)
3586 rxyz(3, il) = rxyz(3, i) + alat(3)
3589 in = icell(0, ll1 - 1, l2, ll3 - 1)
3590 icell(0, -1, l2, -1) = in
3592 i = icell(ii, ll1 - 1, l2, ll3 - 1)
3594 IF (il > nn) cpabort(
"enlarge laymx")
3596 icell(ii, -1, l2, -1) = il
3597 rxyz(1, il) = rxyz(1, i) - alat(1)
3598 rxyz(2, il) = rxyz(2, i)
3599 rxyz(3, il) = rxyz(3, i) - alat(3)
3607 in = icell(0, 0, 0, l3)
3608 icell(0, ll1, ll2, l3) = in
3610 i = icell(ii, 0, 0, l3)
3612 IF (il > nn) cpabort(
"enlarge laymx")
3614 icell(ii, ll1, ll2, l3) = il
3615 rxyz(1, il) = rxyz(1, i) + alat(1)
3616 rxyz(2, il) = rxyz(2, i) + alat(2)
3617 rxyz(3, il) = rxyz(3, i)
3620 in = icell(0, ll1 - 1, 0, l3)
3621 icell(0, -1, ll2, l3) = in
3623 i = icell(ii, ll1 - 1, 0, l3)
3625 IF (il > nn) cpabort(
"enlarge laymx")
3627 icell(ii, -1, ll2, l3) = il
3628 rxyz(1, il) = rxyz(1, i) - alat(1)
3629 rxyz(2, il) = rxyz(2, i) + alat(2)
3630 rxyz(3, il) = rxyz(3, i)
3633 in = icell(0, 0, ll2 - 1, l3)
3634 icell(0, ll1, -1, l3) = in
3636 i = icell(ii, 0, ll2 - 1, l3)
3638 IF (il > nn) cpabort(
"enlarge laymx")
3640 icell(ii, ll1, -1, l3) = il
3641 rxyz(1, il) = rxyz(1, i) + alat(1)
3642 rxyz(2, il) = rxyz(2, i) - alat(2)
3643 rxyz(3, il) = rxyz(3, i)
3646 in = icell(0, ll1 - 1, ll2 - 1, l3)
3647 icell(0, -1, -1, l3) = in
3649 i = icell(ii, ll1 - 1, ll2 - 1, l3)
3651 IF (il > nn) cpabort(
"enlarge laymx")
3653 icell(ii, -1, -1, l3) = il
3654 rxyz(1, il) = rxyz(1, i) - alat(1)
3655 rxyz(2, il) = rxyz(2, i) - alat(2)
3656 rxyz(3, il) = rxyz(3, i)
3662 in = icell(0, 0, 0, 0)
3663 icell(0, ll1, ll2, ll3) = in
3665 i = icell(ii, 0, 0, 0)
3667 IF (il > nn) cpabort(
"enlarge laymx")
3669 icell(ii, ll1, ll2, ll3) = il
3670 rxyz(1, il) = rxyz(1, i) + alat(1)
3671 rxyz(2, il) = rxyz(2, i) + alat(2)
3672 rxyz(3, il) = rxyz(3, i) + alat(3)
3675 in = icell(0, ll1 - 1, 0, 0)
3676 icell(0, -1, ll2, ll3) = in
3678 i = icell(ii, ll1 - 1, 0, 0)
3680 IF (il > nn) cpabort(
"enlarge laymx")
3682 icell(ii, -1, ll2, ll3) = il
3683 rxyz(1, il) = rxyz(1, i) - alat(1)
3684 rxyz(2, il) = rxyz(2, i) + alat(2)
3685 rxyz(3, il) = rxyz(3, i) + alat(3)
3688 in = icell(0, 0, ll2 - 1, 0)
3689 icell(0, ll1, -1, ll3) = in
3691 i = icell(ii, 0, ll2 - 1, 0)
3693 IF (il > nn) cpabort(
"enlarge laymx")
3695 icell(ii, ll1, -1, ll3) = il
3696 rxyz(1, il) = rxyz(1, i) + alat(1)
3697 rxyz(2, il) = rxyz(2, i) - alat(2)
3698 rxyz(3, il) = rxyz(3, i) + alat(3)
3701 in = icell(0, ll1 - 1, ll2 - 1, 0)
3702 icell(0, -1, -1, ll3) = in
3704 i = icell(ii, ll1 - 1, ll2 - 1, 0)
3706 IF (il > nn) cpabort(
"enlarge laymx")
3708 icell(ii, -1, -1, ll3) = il
3709 rxyz(1, il) = rxyz(1, i) - alat(1)
3710 rxyz(2, il) = rxyz(2, i) - alat(2)
3711 rxyz(3, il) = rxyz(3, i) + alat(3)
3714 in = icell(0, 0, 0, ll3 - 1)
3715 icell(0, ll1, ll2, -1) = in
3717 i = icell(ii, 0, 0, ll3 - 1)
3719 IF (il > nn) cpabort(
"enlarge laymx")
3721 icell(ii, ll1, ll2, -1) = il
3722 rxyz(1, il) = rxyz(1, i) + alat(1)
3723 rxyz(2, il) = rxyz(2, i) + alat(2)
3724 rxyz(3, il) = rxyz(3, i) - alat(3)
3727 in = icell(0, ll1 - 1, 0, ll3 - 1)
3728 icell(0, -1, ll2, -1) = in
3730 i = icell(ii, ll1 - 1, 0, ll3 - 1)
3732 IF (il > nn) cpabort(
"enlarge laymx")
3734 icell(ii, -1, ll2, -1) = il
3735 rxyz(1, il) = rxyz(1, i) - alat(1)
3736 rxyz(2, il) = rxyz(2, i) + alat(2)
3737 rxyz(3, il) = rxyz(3, i) - alat(3)
3740 in = icell(0, 0, ll2 - 1, ll3 - 1)
3741 icell(0, ll1, -1, -1) = in
3743 i = icell(ii, 0, ll2 - 1, ll3 - 1)
3745 IF (il > nn) cpabort(
"enlarge laymx")
3747 icell(ii, ll1, -1, -1) = il
3748 rxyz(1, il) = rxyz(1, i) + alat(1)
3749 rxyz(2, il) = rxyz(2, i) - alat(2)
3750 rxyz(3, il) = rxyz(3, i) - alat(3)
3753 in = icell(0, ll1 - 1, ll2 - 1, ll3 - 1)
3754 icell(0, -1, -1, -1) = in
3756 i = icell(ii, ll1 - 1, ll2 - 1, ll3 - 1)
3758 IF (il > nn) cpabort(
"enlarge laymx")
3760 icell(ii, -1, -1, -1) = il
3761 rxyz(1, il) = rxyz(1, i) - alat(1)
3762 rxyz(2, il) = rxyz(2, i) - alat(2)
3763 rxyz(3, il) = rxyz(3, i) - alat(3)
3766 ALLOCATE (lsta(2, nat))
3770 ALLOCATE (lstb(nnbrx*nat), rel(5, nnbrx*nat))
3779 myspace = (nat*nnbrx)/npr
3780 IF (iam == 0) myspaceout = myspace
3786 DO ii = 1, icell(0, l1, l2, l3)
3787 iat = icell(ii, l1, l2, l3)
3788 IF (((iat - 1)*npr)/nat == iam)
THEN
3789 lsta(1, iat) = iam*myspace + indlst + 1
3790 CALL sw_sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
3791 rxyz, icell, lstb(iam*myspace + 1), lay, rel(1, iam*myspace + 1), cut2, indlst)
3792 lsta(2, iat) = iam*myspace + indlst
3794 ndat = lsta(2, iat) - lsta(1, iat) + 1
3800 indlstx = max(indlstx, indlst)
3802 IF (indlstx < myspaceout)
EXIT
3803 DEALLOCATE (lstb, rel)
3808 npjx = 300; npjkx = 6000
3831 CALL sw_subfeniat_l(i, nat, nnbrx, rel, p, p3, fx, fy, fz, fx3, fy3, fz3, lstb, lsta, isigma, sigma)
3836 fx(i) = fx(i) + fx3(i)
3837 fy(i) = fy(i) + fy3(i)
3838 fz(i) = fz(i) + fz3(i)
3843 fxyz(1, i) = fx(i)*esigma
3844 fxyz(2, i) = fy(i)*esigma
3845 fxyz(3, i) = fz(i)*esigma
3848 DEALLOCATE (rxyz, icell, lay, lsta, lstb, rel)
3849 END SUBROUTINE eip_stillinger_weber_silicon
3857 REAL(kind=
dp)
FUNCTION f(c)
3860 REAL(kind=
dp),
PARAMETER :: aa = 7.049556277_dp, &
3861 bb = 0.6022245584_dp, ra = 1.8_dp
3863 REAL(kind=
dp) :: c4, crainv
3865 IF ((c - ra) < 0._dp)
THEN
3866 crainv = 1.0_dp/(c - ra)
3868 f = aa*bb*4.0_dp/(c4*c)*exp(crainv) + aa*(bb/(c4) - 1.0_dp)*exp(crainv)*crainv*crainv
3880 REAL(kind=
dp)
FUNCTION pe(d)
3883 REAL(kind=
dp),
PARAMETER :: aa = 7.049556277_dp, &
3884 bb = 0.6022245584_dp, ra = 1.8_dp
3886 IF ((d - ra) < 0._dp)
THEN
3887 pe = aa*(bb/(d*d*d*d) - 1.0_dp)*exp(1.0_dp/(d - ra))
3914 SUBROUTINE sw_sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
3915 rxyz, icell, lstb, lay, rel, cut2, indlst)
3918 INTEGER :: iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, &
3920 REAL(kind=
dp) :: rxyz(3, nn)
3921 INTEGER :: icell(0:ncx, -1:ll1, -1:ll2, -1:ll3), lstb(0:myspace - 1), lay(nn)
3922 REAL(kind=
dp) :: rel(5, 0:myspace - 1), cut2
3925 INTEGER :: jat, jj, k1, k2, k3
3926 REAL(kind=
dp) :: rr2, tt, tti, xrel, yrel, zrel
3928 DO k3 = l3 - 1, l3 + 1
3929 DO k2 = l2 - 1, l2 + 1
3930 DO k1 = l1 - 1, l1 + 1
3931 DO jj = 1, icell(0, k1, k2, k3)
3932 jat = icell(jj, k1, k2, k3)
3933 IF (jat == iat) cycle
3934 xrel = rxyz(1, iat) - rxyz(1, jat)
3935 yrel = rxyz(2, iat) - rxyz(2, jat)
3936 zrel = rxyz(3, iat) - rxyz(3, jat)
3937 rr2 = xrel**2 + yrel**2 + zrel**2
3938 IF (rr2 <= cut2)
THEN
3939 indlst = min(indlst, myspace - 1)
3940 lstb(indlst) = lay(jat)
3944 rel(1, indlst) = xrel*tti
3945 rel(2, indlst) = yrel*tti
3946 rel(3, indlst) = zrel*tti
3948 rel(5, indlst) = tti
3957 END SUBROUTINE sw_sublstiat_l
3978 SUBROUTINE sw_subfeniat_l(i, nat, nnbrx, rel, p, p3, fx, fy, fz, fx3, fy3, fz3, lstb, lsta, isigma, sigma)
3979 INTEGER,
INTENT(IN) :: i, nat, nnbrx
3980 REAL(kind=
dp),
INTENT(IN) :: rel(5, nnbrx*nat)
3981 REAL(kind=
dp),
INTENT(INOUT) :: p, p3, fx(nat), fy(nat), fz(nat), &
3982 fx3(nat), fy3(nat), fz3(nat)
3983 INTEGER,
INTENT(IN) :: lstb(nnbrx*nat), lsta(2, nat)
3984 REAL(kind=
dp),
INTENT(IN) :: isigma, sigma
3986 REAL(kind=
dp),
PARAMETER :: aa = 7.049556277_dp, &
3987 bb = 0.6022245584_dp, gam = 1.2_dp, &
3988 ra = 1.8_dp, ramda = 21.0_dp
3990 INTEGER :: ipb, ipe, j, k, l, m, nij
3991 REAL(kind=
dp) :: c4, cosijk, cosijk3, cosikj, cosikj3, cosjik, cosjik3, crainv, force, hi, &
3992 hixij, hixij0, hixij1, hixik, hixik0, hixik1, hiyij, hiyij0, hiyij1, hiyik, hiyik0, &
3993 hiyik1, hizij, hizij0, hizij1, hizik, hizik0, hizik1, hj, hjxij, hjxij0, hjxij1, hjxjk, &
3994 hjxjk0, hjxjk1, hjyij, hjyij0, hjyij1, hjyjk, hjyjk0, hjyjk1, hjzij, hjzij0, hjzij1, &
3995 hjzjk, hjzjk0, hjzjk1, hk, hkxik, hkxik0, hkxik1, hkxkj, hkxkj0, hkxkj1, hkyik, hkyik0, &
3996 hkyik1, hkykj, hkykj0, hkykj1, hkzik, hkzik0, hkzik1, hkzkj, hkzkj0, hkzkj1, invrij, &
3997 invrija, invrik, invrika, invrjk, invrjka, refi, refj, refk, rij, rija, rik
3998 REAL(kind=
dp) :: rika, rjk, rjka, xij, xik, xjk, yij, yik, yjk, zij, zik, zjk
4007 rij = rel(4, l)*isigma
4008 invrij = rel(5, l)*sigma
4013 IF (rij >= 2._dp*ra) cycle
4015 crainv = 1.0_dp/(rij - ra)
4016 c4 = rij*rij*rij*rij
4017 force = aa*bb*4.0_dp/(c4*rij)*exp(crainv) + aa*(bb/(c4) - 1.0_dp)*exp(crainv)*crainv*crainv
4019 fx(i) = force*xij*invrij + fx(i)
4020 fy(i) = force*yij*invrij + fy(i)
4021 fz(i) = force*zij*invrij + fz(i)
4023 fx(j) = -force*xij*invrij + fx(j)
4024 fy(j) = -force*yij*invrij + fy(j)
4025 fz(j) = -force*zij*invrij + fz(j)
4027 p = p + aa*(bb/(rij*rij*rij*rij) - 1.0_dp)*exp(1.0_dp/(rij - ra))
4035 invrik = rel(5, m)*sigma
4036 rik = rel(4, m)*isigma
4041 IF ((rik >= ra) .AND. (nij == 0)) cycle
4047 rjk = sqrt(xjk*xjk + yjk*yjk + zjk*zjk)
4050 IF ((rjk >= ra) .AND. (nij == 0)) cycle
4051 cosjik = (xij*xik + yij*yik + zij*zik)*(invrij*invrik)
4052 cosijk = (-xij*xjk - yij*yjk - zij*zjk)*(invrij*invrjk)
4053 cosikj = (xik*xjk + yik*yjk + zik*zjk)*(invrik*invrjk)
4054 cosjik3 = cosjik + 1.0_dp/3.0_dp
4055 cosijk3 = cosijk + 1.0_dp/3.0_dp
4056 cosikj3 = cosikj + 1.0_dp/3.0_dp
4062 invrija = 1._dp/rija
4063 invrika = 1._dp/rika
4064 invrjka = 1._dp/rjka
4066 IF (rija >= 0.0_dp)
THEN
4069 refk = ramda*exp(gam*invrika + gam*invrjka)
4070 ELSE IF ((rija < 0.0_dp) .AND. (rika < 0.0_dp))
THEN
4071 IF (rjka < 0.0_dp)
THEN
4072 refi = ramda*exp(gam*invrija + gam*invrika)
4073 refj = ramda*exp(gam*invrija + gam*invrjka)
4074 refk = ramda*exp(gam*invrika + gam*invrjka)
4076 refi = ramda*exp(gam*invrija + gam*invrika)
4080 ELSE IF ((rija < 0.0_dp) .AND. (rjka < 0.0_dp))
THEN
4082 refj = ramda*exp(gam*invrija + gam*invrjka)
4088 hi = refi*cosjik3*cosjik3
4089 hj = refj*cosijk3*cosijk3
4090 hk = refk*cosikj3*cosikj3
4091 p3 = p3 + hi + hj + hk
4093 hixij0 = 2.0_dp*(xik*invrik - xij*cosjik*invrij)
4094 hixij1 = gam*xij*cosjik3*(invrija*invrija)
4095 hixij = refi*cosjik3*(hixij0 - hixij1)*invrij
4096 hixik0 = 2.0_dp*(xij*invrij - xik*cosjik*invrik)
4097 hixik1 = gam*xik*cosjik3*(invrika*invrika)
4098 hixik = refi*cosjik3*(hixik0 - hixik1)*invrik
4099 hjxij0 = 2.0_dp*(-xjk*invrjk - xij*cosijk*invrij)
4100 hjxij1 = gam*xij*cosijk3*(invrija*invrija)
4101 hjxij = refj*cosijk3*(hjxij0 - hjxij1)*invrij
4102 hkxik0 = 2.0_dp*(xjk*invrjk - xik*cosikj*invrik)
4103 hkxik1 = gam*xik*cosikj3*(invrika*invrika)
4104 hkxik = refk*cosikj3*(hkxik0 - hkxik1)*invrik
4105 hjxjk0 = 2.0_dp*(-xij*invrij - xjk*cosijk*invrjk)
4106 hjxjk1 = gam*xjk*cosijk3*(invrjka*invrjka)
4107 hjxjk = refj*cosijk3*(hjxjk0 - hjxjk1)*invrjk
4108 hkxkj0 = 2.0_dp*(-xik*invrik + xjk*cosikj*invrjk)
4109 hkxkj1 = gam*xjk*cosikj3*(invrjka*invrjka)
4110 hkxkj = refk*cosikj3*(hkxkj0 + hkxkj1)*invrjk
4112 hiyij0 = 2.0_dp*(yik*invrik - yij*cosjik*invrij)
4113 hiyij1 = gam*yij*cosjik3*(invrija*invrija)
4114 hiyij = refi*cosjik3*(hiyij0 - hiyij1)*invrij
4115 hiyik0 = 2.0_dp*(yij*invrij - yik*cosjik*invrik)
4116 hiyik1 = gam*yik*cosjik3*(invrika*invrika)
4117 hiyik = refi*cosjik3*(hiyik0 - hiyik1)*invrik
4118 hjyij0 = 2.0_dp*(-yjk*invrjk - yij*cosijk*invrij)
4119 hjyij1 = gam*yij*cosijk3*(invrija*invrija)
4120 hjyij = refj*cosijk3*(hjyij0 - hjyij1)*invrij
4121 hkyik0 = 2.0_dp*(yjk*invrjk - yik*cosikj*invrik)
4122 hkyik1 = gam*yik*cosikj3*(invrika*invrika)
4123 hkyik = refk*cosikj3*(hkyik0 - hkyik1)*invrik
4124 hjyjk0 = 2.0_dp*(-yij*invrij - yjk*cosijk*invrjk)
4125 hjyjk1 = gam*yjk*cosijk3*(invrjka*invrjka)
4126 hjyjk = refj*cosijk3*(hjyjk0 - hjyjk1)*invrjk
4127 hkykj0 = 2.0_dp*(-yik*invrik + yjk*cosikj*invrjk)
4128 hkykj1 = gam*yjk*cosikj3*(invrjka*invrjka)
4129 hkykj = refk*cosikj3*(hkykj0 + hkykj1)*invrjk
4131 hizij0 = 2.0_dp*(zik*invrik - zij*cosjik*invrij)
4132 hizij1 = gam*zij*cosjik3*(invrija*invrija)
4133 hizij = refi*cosjik3*(hizij0 - hizij1)*invrij
4134 hizik0 = 2.0_dp*(zij*invrij - zik*cosjik*invrik)
4135 hizik1 = gam*zik*cosjik3*(invrika*invrika)
4136 hizik = refi*cosjik3*(hizik0 - hizik1)*invrik
4137 hjzij0 = 2.0_dp*(-zjk*invrjk - zij*cosijk*invrij)
4138 hjzij1 = gam*zij*cosijk3*(invrija*invrija)
4139 hjzij = refj*cosijk3*(hjzij0 - hjzij1)*invrij
4140 hkzik0 = 2.0_dp*(zjk*invrjk - zik*cosikj*invrik)
4141 hkzik1 = gam*zik*cosikj3*(invrika*invrika)
4142 hkzik = refk*cosikj3*(hkzik0 - hkzik1)*invrik
4143 hjzjk0 = 2.0_dp*(-zij*invrij - zjk*cosijk*invrjk)
4144 hjzjk1 = gam*zjk*cosijk3*(invrjka*invrjka)
4145 hjzjk = refj*cosijk3*(hjzjk0 - hjzjk1)*invrjk
4146 hkzkj0 = 2.0_dp*(-zik*invrik + zjk*cosikj*invrjk)
4147 hkzkj1 = gam*zjk*cosikj3*(invrjka*invrjka)
4148 hkzkj = refk*cosikj3*(hkzkj0 + hkzkj1)*invrjk
4150 fx3(i) = fx3(i) - hixij - hixik - hjxij - hkxik
4151 fy3(i) = fy3(i) - hiyij - hiyik - hjyij - hkyik
4152 fz3(i) = fz3(i) - hizij - hizik - hjzij - hkzik
4154 fx3(j) = fx3(j) + hixij + hjxij - hjxjk + hkxkj
4155 fy3(j) = fy3(j) + hiyij + hjyij - hjyjk + hkykj
4156 fz3(j) = fz3(j) + hizij + hjzij - hjzjk + hkzkj
4158 fx3(k) = fx3(k) + hixik + hkxik - hkxkj + hjxjk
4159 fy3(k) = fy3(k) + hiyik + hkyik - hkykj + hjyjk
4160 fz3(k) = fz3(k) + hizik + hkzik - hkzkj + hjzjk
4163 END SUBROUTINE sw_subfeniat_l
4174 SUBROUTINE eip_tersoff_silicon(nat, alat, rxyz, fxyz, etot, count)
4202 REAL(kind=
dp) :: alat(3), rxyz(3, nat), fxyz(3, nat), &
4205 INTEGER :: iat, nnmax, npmax
4206 INTEGER,
ALLOCATABLE,
DIMENSION(:) ::
kinds, lstb
4207 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: lsta
4208 REAL(kind=
dp) :: uatot, urtot, xbox, ybox, zbox
4209 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: dkeij, uadurdf, xyzrrefdf
4210 REAL(kind=
dp),
DIMENSION(1:2) :: bcsq, co_bcd, dsq, h, pmass, pn
4211 REAL(kind=
dp),
DIMENSION(1:2, 1:2) :: ala, alr, ca, cr, r1, r2, x
4213 INTEGER:: nnbrx, nnbrxt
4216 count = count + 1._dp
4219 rxyz(1, iat) =
modulo(
modulo(rxyz(1, iat), alat(1)), alat(1))
4220 rxyz(2, iat) =
modulo(
modulo(rxyz(2, iat), alat(2)), alat(2))
4221 rxyz(3, iat) =
modulo(
modulo(rxyz(3, iat), alat(3)), alat(3))
4224 ALLOCATE (
kinds(1:nat))
4230 ALLOCATE (lsta(2, nat), lstb(nnbrxt*nat))
4231 ALLOCATE (xyzrrefdf(1:6*npmax), uadurdf(1:3*npmax), dkeij(1:3*nnmax))
4237 xbox = alat(1); ybox = alat(2); zbox = alat(3)
4238 CALL tersoff_parameters(r1, r2, cr, ca, alr, ala, x, pn, co_bcd, bcsq, dsq, h, pmass)
4239 CALL tersoff_pairlist_energy_forces(nat, npmax, nnmax, xbox, ybox, zbox,
kinds, rxyz, r1, r2, cr, &
4240 ca, alr, ala, x, xyzrrefdf, uadurdf, urtot, lsta, lstb, nnbrx, &
4241 pn, co_bcd, bcsq, dsq, h, fxyz, uatot, dkeij)
4242 etot = urtot + uatot
4243 DEALLOCATE (
kinds, xyzrrefdf, uadurdf, dkeij, lsta, lstb)
4244 END SUBROUTINE eip_tersoff_silicon
4262 SUBROUTINE tersoff_parameters(R1, R2, Cr, Ca, alr, ala, X, Pn, Co_bcd, bcsq, dsq, h, Pmass)
4264 REAL(kind=
dp),
DIMENSION(1:2, 1:2),
INTENT(out) :: r1, r2, cr, ca, alr, ala, x
4265 REAL(kind=
dp),
DIMENSION(1:2),
INTENT(out) :: pn, co_bcd, bcsq, dsq, h, pmass
4267 REAL(kind=
dp),
PARAMETER :: c_ala = 2.2119_dp, c_alr = 3.4879_dp, c_b = 1.5724e-7_dp, &
4268 c_c = 3.8049e4_dp, c_ca = 3.4674e2_dp, c_cr = 1.3936e3_dp, c_d = 4.3484_dp, &
4269 c_h = -5.7058e-1_dp, c_mass = 12.0_dp, c_n = 7.2751e-1_dp, c_r1 = 1.8_dp, c_r2 = 2.1_dp, &
4270 si_ala = 1.7322_dp, si_alr = 2.4799_dp, si_b = 1.1000e-6_dp, si_c = 1.0039e5_dp, &
4271 si_ca = 4.7118e2_dp, si_cr = 1.8308e3_dp, si_d = 1.6217e1_dp, si_h = -5.9825e-1_dp, &
4272 si_mass = 28.0855_dp, si_n = 7.8734e-1_dp, si_r1 = 2.7_dp, si_r2 = 3.3_dp
4290 cr(1, 2) = sqrt(cr(1, 1)*cr(2, 2))
4295 ca(1, 2) = sqrt(ca(1, 1)*ca(2, 2))
4300 r1(1, 2) = sqrt(r1(1, 1)*r1(2, 2))
4305 r2(1, 2) = sqrt(r2(1, 1)*r2(2, 2))
4315 alr(1, 2) = 0.5_dp*(alr(1, 1) + alr(2, 2))
4316 alr(2, 1) = alr(1, 2)
4320 ala(1, 2) = 0.5_dp*(ala(1, 1) + ala(2, 2))
4321 ala(2, 1) = ala(1, 2)
4326 co_bcd(1) = c_b*(1.0_dp + c_c*c_c/(c_d*c_d))
4327 co_bcd(2) = si_b*(1.0_dp + si_c*si_c/(si_d*si_d))
4329 bcsq(1) = c_b*c_c*c_c
4330 bcsq(2) = si_b*si_c*si_c
4342 END SUBROUTINE tersoff_parameters
4376 SUBROUTINE tersoff_pairlist_energy_forces(Nmol, Npmax, NNmax, xbox, ybox, zbox, Kinds, R, R1, R2, Cr, Ca, alr, ala, X, &
4377 XYZRrefdf, UadUrdf, Urtot, lsta, lstb, nnbrx, &
4378 Pn, Co_bcd, bcsq, dsq, h, F, Uatot, dkEij)
4379 INTEGER,
INTENT(in) :: nmol, npmax, nnmax
4380 REAL(kind=
dp),
INTENT(in) :: xbox, ybox, zbox
4381 INTEGER,
DIMENSION(1:Nmol),
INTENT(in) ::
kinds
4382 REAL(kind=
dp),
DIMENSION(1:3*Nmol),
INTENT(in) :: r
4383 REAL(kind=
dp),
DIMENSION(1:2, 1:2),
INTENT(in) :: r1, r2, cr, ca, alr, ala, x
4384 REAL(kind=
dp),
DIMENSION(1:6*Npmax),
INTENT(out) :: xyzrrefdf
4385 REAL(kind=
dp),
DIMENSION(1:3*Npmax),
INTENT(out) :: uadurdf
4386 REAL(kind=
dp),
INTENT(out) :: urtot
4387 INTEGER :: lsta(2, nmol)
4388 INTEGER,
INTENT(inout) :: nnbrx
4389 INTEGER :: lstb(nnbrx*nmol)
4390 REAL(kind=
dp),
DIMENSION(1:2),
INTENT(in) :: pn, co_bcd, bcsq, dsq, h
4391 REAL(kind=
dp),
DIMENSION(1:3*Nmol),
INTENT(out) :: f
4392 REAL(kind=
dp),
INTENT(out) :: uatot
4393 REAL(kind=
dp),
DIMENSION(1:3*NNmax) :: dkeij
4395 INTEGER :: i, iam, iat, ii, il, in, indlst, indlstx, ipb, istopg, jat, l1, l2, l3, laymx, &
4396 ll1, ll2, ll3, myspace, myspaceout, nat, ncx, ndat, nn, npjkx, npjx, npr, nptot
4397 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: lay
4398 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :, :) :: icell
4399 REAL(kind=
dp) :: alat(3), cut, cut2, rlc1i, rlc2i, rlc3i, &
4400 rxyz0(3, nmol), xhalf, yhalf, zhalf
4401 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rel, rxyz
4415 rxyz0(1, iat) = r(jat + 1)
4416 rxyz0(2, iat) = r(jat + 2)
4417 rxyz0(3, iat) = r(jat + 3)
4420 cut = r2(2, 2) - 1.d-9
4423 ll1 = int(alat(1)/cut)
4424 IF (ll1 < 1) cpabort(
"alat(1) too small")
4425 ll2 = int(alat(2)/cut)
4426 IF (ll2 < 1) cpabort(
"alat(2) too small")
4427 ll3 = int(alat(3)/cut)
4428 IF (ll3 < 1) cpabort(
"alat(3) too small")
4437 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
4438 icell(0, :, :, :) = 0
4444 l1 = int(rxyz0(1, iat)*rlc1i)
4445 l2 = int(rxyz0(2, iat)*rlc2i)
4446 l3 = int(rxyz0(3, iat)*rlc3i)
4448 ii = icell(0, l1, l2, l3)
4450 icell(0, l1, l2, l3) = ii
4455 icell(ii, l1, l2, l3) = iat
4457 IF (
ALLOCATED(icell))
EXIT
4461 laymx = ncx*(2*ll1*ll2 + 2*ll1*ll3 + 2*ll2*ll3 + 4*ll1 + 4*ll2 + 4*ll3 + 8)
4463 ALLOCATE (rxyz(3, nn), lay(nn))
4466 rxyz(1, iat) = rxyz0(1, iat)
4467 rxyz(2, iat) = rxyz0(2, iat)
4468 rxyz(3, iat) = rxyz0(3, iat)
4475 in = icell(0, l1, l2, 0)
4476 icell(0, l1, l2, ll3) = in
4478 i = icell(ii, l1, l2, 0)
4480 IF (il > nn) cpabort(
"enlarge laymx")
4482 icell(ii, l1, l2, ll3) = il
4483 rxyz(1, il) = rxyz(1, i)
4484 rxyz(2, il) = rxyz(2, i)
4485 rxyz(3, il) = rxyz(3, i) + alat(3)
4488 in = icell(0, l1, l2, ll3 - 1)
4489 icell(0, l1, l2, -1) = in
4491 i = icell(ii, l1, l2, ll3 - 1)
4493 IF (il > nn) cpabort(
"enlarge laymx")
4495 icell(ii, l1, l2, -1) = il
4496 rxyz(1, il) = rxyz(1, i)
4497 rxyz(2, il) = rxyz(2, i)
4498 rxyz(3, il) = rxyz(3, i) - alat(3)
4508 in = icell(0, 0, l2, l3)
4509 icell(0, ll1, l2, l3) = in
4511 i = icell(ii, 0, l2, l3)
4513 IF (il > nn) cpabort(
"enlarge laymx")
4515 icell(ii, ll1, l2, l3) = il
4516 rxyz(1, il) = rxyz(1, i) + alat(1)
4517 rxyz(2, il) = rxyz(2, i)
4518 rxyz(3, il) = rxyz(3, i)
4521 in = icell(0, ll1 - 1, l2, l3)
4522 icell(0, -1, l2, l3) = in
4524 i = icell(ii, ll1 - 1, l2, l3)
4526 IF (il > nn) cpabort(
"enlarge laymx")
4528 icell(ii, -1, l2, l3) = il
4529 rxyz(1, il) = rxyz(1, i) - alat(1)
4530 rxyz(2, il) = rxyz(2, i)
4531 rxyz(3, il) = rxyz(3, i)
4541 in = icell(0, l1, 0, l3)
4542 icell(0, l1, ll2, l3) = in
4544 i = icell(ii, l1, 0, l3)
4546 IF (il > nn) cpabort(
"enlarge laymx")
4548 icell(ii, l1, ll2, l3) = il
4549 rxyz(1, il) = rxyz(1, i)
4550 rxyz(2, il) = rxyz(2, i) + alat(2)
4551 rxyz(3, il) = rxyz(3, i)
4554 in = icell(0, l1, ll2 - 1, l3)
4555 icell(0, l1, -1, l3) = in
4557 i = icell(ii, l1, ll2 - 1, l3)
4559 IF (il > nn) cpabort(
"enlarge laymx")
4561 icell(ii, l1, -1, l3) = il
4562 rxyz(1, il) = rxyz(1, i)
4563 rxyz(2, il) = rxyz(2, i) - alat(2)
4564 rxyz(3, il) = rxyz(3, i)
4573 in = icell(0, l1, 0, 0)
4574 icell(0, l1, ll2, ll3) = in
4576 i = icell(ii, l1, 0, 0)
4578 IF (il > nn) cpabort(
"enlarge laymx")
4580 icell(ii, l1, ll2, ll3) = il
4581 rxyz(1, il) = rxyz(1, i)
4582 rxyz(2, il) = rxyz(2, i) + alat(2)
4583 rxyz(3, il) = rxyz(3, i) + alat(3)
4586 in = icell(0, l1, 0, ll3 - 1)
4587 icell(0, l1, ll2, -1) = in
4589 i = icell(ii, l1, 0, ll3 - 1)
4591 IF (il > nn) cpabort(
"enlarge laymx")
4593 icell(ii, l1, ll2, -1) = il
4594 rxyz(1, il) = rxyz(1, i)
4595 rxyz(2, il) = rxyz(2, i) + alat(2)
4596 rxyz(3, il) = rxyz(3, i) - alat(3)
4599 in = icell(0, l1, ll2 - 1, 0)
4600 icell(0, l1, -1, ll3) = in
4602 i = icell(ii, l1, ll2 - 1, 0)
4604 IF (il > nn) cpabort(
"enlarge laymx")
4606 icell(ii, l1, -1, ll3) = il
4607 rxyz(1, il) = rxyz(1, i)
4608 rxyz(2, il) = rxyz(2, i) - alat(2)
4609 rxyz(3, il) = rxyz(3, i) + alat(3)
4612 in = icell(0, l1, ll2 - 1, ll3 - 1)
4613 icell(0, l1, -1, -1) = in
4615 i = icell(ii, l1, ll2 - 1, ll3 - 1)
4617 IF (il > nn) cpabort(
"enlarge laymx")
4619 icell(ii, l1, -1, -1) = il
4620 rxyz(1, il) = rxyz(1, i)
4621 rxyz(2, il) = rxyz(2, i) - alat(2)
4622 rxyz(3, il) = rxyz(3, i) - alat(3)
4630 in = icell(0, 0, l2, 0)
4631 icell(0, ll1, l2, ll3) = in
4633 i = icell(ii, 0, l2, 0)
4635 IF (il > nn) cpabort(
"enlarge laymx")
4637 icell(ii, ll1, l2, ll3) = il
4638 rxyz(1, il) = rxyz(1, i) + alat(1)
4639 rxyz(2, il) = rxyz(2, i)
4640 rxyz(3, il) = rxyz(3, i) + alat(3)
4643 in = icell(0, 0, l2, ll3 - 1)
4644 icell(0, ll1, l2, -1) = in
4646 i = icell(ii, 0, l2, ll3 - 1)
4648 IF (il > nn) cpabort(
"enlarge laymx")
4650 icell(ii, ll1, l2, -1) = il
4651 rxyz(1, il) = rxyz(1, i) + alat(1)
4652 rxyz(2, il) = rxyz(2, i)
4653 rxyz(3, il) = rxyz(3, i) - alat(3)
4656 in = icell(0, ll1 - 1, l2, 0)
4657 icell(0, -1, l2, ll3) = in
4659 i = icell(ii, ll1 - 1, l2, 0)
4661 IF (il > nn) cpabort(
"enlarge laymx")
4663 icell(ii, -1, l2, ll3) = il
4664 rxyz(1, il) = rxyz(1, i) - alat(1)
4665 rxyz(2, il) = rxyz(2, i)
4666 rxyz(3, il) = rxyz(3, i) + alat(3)
4669 in = icell(0, ll1 - 1, l2, ll3 - 1)
4670 icell(0, -1, l2, -1) = in
4672 i = icell(ii, ll1 - 1, l2, ll3 - 1)
4674 IF (il > nn) cpabort(
"enlarge laymx")
4676 icell(ii, -1, l2, -1) = il
4677 rxyz(1, il) = rxyz(1, i) - alat(1)
4678 rxyz(2, il) = rxyz(2, i)
4679 rxyz(3, il) = rxyz(3, i) - alat(3)
4687 in = icell(0, 0, 0, l3)
4688 icell(0, ll1, ll2, l3) = in
4690 i = icell(ii, 0, 0, l3)
4692 IF (il > nn) cpabort(
"enlarge laymx")
4694 icell(ii, ll1, ll2, l3) = il
4695 rxyz(1, il) = rxyz(1, i) + alat(1)
4696 rxyz(2, il) = rxyz(2, i) + alat(2)
4697 rxyz(3, il) = rxyz(3, i)
4700 in = icell(0, ll1 - 1, 0, l3)
4701 icell(0, -1, ll2, l3) = in
4703 i = icell(ii, ll1 - 1, 0, l3)
4705 IF (il > nn) cpabort(
"enlarge laymx")
4707 icell(ii, -1, ll2, l3) = il
4708 rxyz(1, il) = rxyz(1, i) - alat(1)
4709 rxyz(2, il) = rxyz(2, i) + alat(2)
4710 rxyz(3, il) = rxyz(3, i)
4713 in = icell(0, 0, ll2 - 1, l3)
4714 icell(0, ll1, -1, l3) = in
4716 i = icell(ii, 0, ll2 - 1, l3)
4718 IF (il > nn) cpabort(
"enlarge laymx")
4720 icell(ii, ll1, -1, l3) = il
4721 rxyz(1, il) = rxyz(1, i) + alat(1)
4722 rxyz(2, il) = rxyz(2, i) - alat(2)
4723 rxyz(3, il) = rxyz(3, i)
4726 in = icell(0, ll1 - 1, ll2 - 1, l3)
4727 icell(0, -1, -1, l3) = in
4729 i = icell(ii, ll1 - 1, ll2 - 1, l3)
4731 IF (il > nn) cpabort(
"enlarge laymx")
4733 icell(ii, -1, -1, l3) = il
4734 rxyz(1, il) = rxyz(1, i) - alat(1)
4735 rxyz(2, il) = rxyz(2, i) - alat(2)
4736 rxyz(3, il) = rxyz(3, i)
4742 in = icell(0, 0, 0, 0)
4743 icell(0, ll1, ll2, ll3) = in
4745 i = icell(ii, 0, 0, 0)
4747 IF (il > nn) cpabort(
"enlarge laymx")
4749 icell(ii, ll1, ll2, ll3) = il
4750 rxyz(1, il) = rxyz(1, i) + alat(1)
4751 rxyz(2, il) = rxyz(2, i) + alat(2)
4752 rxyz(3, il) = rxyz(3, i) + alat(3)
4755 in = icell(0, ll1 - 1, 0, 0)
4756 icell(0, -1, ll2, ll3) = in
4758 i = icell(ii, ll1 - 1, 0, 0)
4760 IF (il > nn) cpabort(
"enlarge laymx")
4762 icell(ii, -1, ll2, ll3) = il
4763 rxyz(1, il) = rxyz(1, i) - alat(1)
4764 rxyz(2, il) = rxyz(2, i) + alat(2)
4765 rxyz(3, il) = rxyz(3, i) + alat(3)
4768 in = icell(0, 0, ll2 - 1, 0)
4769 icell(0, ll1, -1, ll3) = in
4771 i = icell(ii, 0, ll2 - 1, 0)
4773 IF (il > nn) cpabort(
"enlarge laymx")
4775 icell(ii, ll1, -1, ll3) = il
4776 rxyz(1, il) = rxyz(1, i) + alat(1)
4777 rxyz(2, il) = rxyz(2, i) - alat(2)
4778 rxyz(3, il) = rxyz(3, i) + alat(3)
4781 in = icell(0, ll1 - 1, ll2 - 1, 0)
4782 icell(0, -1, -1, ll3) = in
4784 i = icell(ii, ll1 - 1, ll2 - 1, 0)
4786 IF (il > nn) cpabort(
"enlarge laymx")
4788 icell(ii, -1, -1, ll3) = il
4789 rxyz(1, il) = rxyz(1, i) - alat(1)
4790 rxyz(2, il) = rxyz(2, i) - alat(2)
4791 rxyz(3, il) = rxyz(3, i) + alat(3)
4794 in = icell(0, 0, 0, ll3 - 1)
4795 icell(0, ll1, ll2, -1) = in
4797 i = icell(ii, 0, 0, ll3 - 1)
4799 IF (il > nn) cpabort(
"enlarge laymx")
4801 icell(ii, ll1, ll2, -1) = il
4802 rxyz(1, il) = rxyz(1, i) + alat(1)
4803 rxyz(2, il) = rxyz(2, i) + alat(2)
4804 rxyz(3, il) = rxyz(3, i) - alat(3)
4807 in = icell(0, ll1 - 1, 0, ll3 - 1)
4808 icell(0, -1, ll2, -1) = in
4810 i = icell(ii, ll1 - 1, 0, ll3 - 1)
4812 IF (il > nn) cpabort(
"enlarge laymx")
4814 icell(ii, -1, ll2, -1) = il
4815 rxyz(1, il) = rxyz(1, i) - alat(1)
4816 rxyz(2, il) = rxyz(2, i) + alat(2)
4817 rxyz(3, il) = rxyz(3, i) - alat(3)
4820 in = icell(0, 0, ll2 - 1, ll3 - 1)
4821 icell(0, ll1, -1, -1) = in
4823 i = icell(ii, 0, ll2 - 1, ll3 - 1)
4825 IF (il > nn) cpabort(
"enlarge laymx")
4827 icell(ii, ll1, -1, -1) = il
4828 rxyz(1, il) = rxyz(1, i) + alat(1)
4829 rxyz(2, il) = rxyz(2, i) - alat(2)
4830 rxyz(3, il) = rxyz(3, i) - alat(3)
4833 in = icell(0, ll1 - 1, ll2 - 1, ll3 - 1)
4834 icell(0, -1, -1, -1) = in
4836 i = icell(ii, ll1 - 1, ll2 - 1, ll3 - 1)
4838 IF (il > nn) cpabort(
"enlarge laymx")
4840 icell(ii, -1, -1, -1) = il
4841 rxyz(1, il) = rxyz(1, i) - alat(1)
4842 rxyz(2, il) = rxyz(2, i) - alat(2)
4843 rxyz(3, il) = rxyz(3, i) - alat(3)
4847 ALLOCATE (rel(5, nnbrx*nat))
4855 myspace = (nat*nnbrx)/npr
4856 IF (iam == 0) myspaceout = myspace
4862 DO ii = 1, icell(0, l1, l2, l3)
4863 iat = icell(ii, l1, l2, l3)
4864 IF (((iat - 1)*npr)/nat == iam)
THEN
4866 lsta(1, iat) = iam*myspace + indlst + 1
4867 CALL tersoff_sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
4868 rxyz, icell, lstb(iam*myspace + 1), lay, rel(1, iam*myspace + 1), cut2, indlst)
4869 lsta(2, iat) = iam*myspace + indlst
4871 ndat = lsta(2, iat) - lsta(1, iat) + 1
4878 indlstx = max(indlstx, indlst)
4880 IF (indlstx >= myspaceout) cpabort(
"NNBRX too small")
4884 npjx = 300; npjkx = 6000
4893 do_i:
DO i = 1, nmol
4894 CALL tersoff_subeniat_l(i, nmol, npmax,
kinds, x, r1, r2, cr, ca, alr, ala, xyzrrefdf, uadurdf, urtot, lsta, lstb, nnbrx, rel)
4897 urtot = 0.5_dp*urtot
4902 do_if:
DO i = 1, nmol
4903 CALL tersoff_subfiat_l(i,nmol,npmax,nnmax,
kinds,pn,co_bcd,bcsq,dsq,h,xyzrrefdf,uadurdf,f,uatot,dkeij,lsta,lstb,nnbrx)
4907 uatot = 0.5_dp*uatot
4909 DEALLOCATE (rxyz, icell, lay, rel)
4910 END SUBROUTINE tersoff_pairlist_energy_forces
4933 SUBROUTINE tersoff_sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
4934 rxyz, icell, lstb, lay, rel, cut2, indlst)
4937 INTEGER :: iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, &
4939 REAL(kind=
dp) :: rxyz(3, nn)
4940 INTEGER :: icell(0:ncx, -1:ll1, -1:ll2, -1:ll3), lstb(0:myspace - 1), lay(nn)
4941 REAL(kind=
dp) :: rel(5, 0:myspace - 1), cut2
4944 INTEGER :: jat, jj, k1, k2, k3
4945 REAL(kind=
dp) :: rr2, tt, tti, xrel, yrel, zrel
4947 DO k3 = l3 - 1, l3 + 1
4948 DO k2 = l2 - 1, l2 + 1
4949 DO k1 = l1 - 1, l1 + 1
4950 DO jj = 1, icell(0, k1, k2, k3)
4951 jat = icell(jj, k1, k2, k3)
4952 IF (jat == iat) cycle
4953 xrel = rxyz(1, iat) - rxyz(1, jat)
4954 yrel = rxyz(2, iat) - rxyz(2, jat)
4955 zrel = rxyz(3, iat) - rxyz(3, jat)
4956 rr2 = xrel**2 + yrel**2 + zrel**2
4957 IF (rr2 <= cut2)
THEN
4958 indlst = min(indlst, myspace - 1)
4959 lstb(indlst) = lay(jat)
4963 rel(1, indlst) = xrel*tti
4964 rel(2, indlst) = yrel*tti
4965 rel(3, indlst) = zrel*tti
4967 rel(5, indlst) = tti
4976 END SUBROUTINE tersoff_sublstiat_l
4999SUBROUTINE tersoff_subeniat_l(i, Nmol, Npmax, Kinds, X, R1, R2, Cr, Ca, alr, ala, XYZRrefdf, UadUrdf, Urtot, lsta, lstb, nnbrx, rel)
5001 INTEGER,
INTENT(in) :: nmol, npmax
5002 INTEGER,
DIMENSION(1:Nmol),
INTENT(in) ::
kinds
5003 REAL(kind=
dp),
DIMENSION(1:2, 1:2),
INTENT(in) :: x, r1, r2, cr, ca, alr, ala
5004 REAL(kind=
dp),
DIMENSION(1:6*Npmax),
INTENT(inout) :: xyzrrefdf
5005 REAL(kind=
dp),
DIMENSION(1:3*Npmax),
INTENT(inout) :: uadurdf
5006 REAL(kind=
dp),
INTENT(inout) :: urtot
5007 INTEGER,
INTENT(in) :: lsta(2, nmol), nnbrx, lstb(nnbrx*nmol)
5008 REAL(kind=
dp),
INTENT(in) :: rel(5, nnbrx*nmol)
5010 INTEGER :: j, ki, kj, l, nppt3, nppt6, nptot
5011 REAL(kind=
dp) :: alaij, alrij, dfij, fij, pl1, pl2, r1ij, &
5012 r2ij, rij, rreij, ua, ur, xij, yij, zij
5019 do_j:
DO l = lsta(1, i), lsta(2, i)
5030 nppt3 = 3*(nptot - 1)
5031 nppt6 = 6*(nptot - 1)
5034 xyzrrefdf(nppt6 + 1) = xij
5035 xyzrrefdf(nppt6 + 2) = yij
5036 xyzrrefdf(nppt6 + 3) = zij
5037 xyzrrefdf(nppt6 + 4) = rreij
5042 ur = cr(ki, kj)*exp(-alrij*rij)
5043 ua = -ca(ki, kj)*exp(-alaij*rij)*x(ki, kj)
5046 IF (rij <= r1ij)
THEN
5047 xyzrrefdf(nppt6 + 5) = 1.0_dp
5048 xyzrrefdf(nppt6 + 6) = 0.0_dp
5050 uadurdf(nppt3 + 1) = ua
5051 uadurdf(nppt3 + 2) = -alrij*ur
5052 uadurdf(nppt3 + 3) = -alaij*ua
5054 pl1 =
pi/(r2ij - r1ij)
5055 pl2 = pl1*(rij - r1ij)
5056 fij = 0.5_dp + 0.5_dp*cos(pl2)
5057 dfij = -0.5_dp*pl1*sin(pl2)
5058 xyzrrefdf(nppt6 + 5) = fij
5059 xyzrrefdf(nppt6 + 6) = dfij
5060 urtot = urtot + fij*ur
5061 uadurdf(nppt3 + 1) = fij*ua
5062 uadurdf(nppt3 + 2) = (dfij - alrij*fij)*ur
5063 uadurdf(nppt3 + 3) = (dfij - alaij*fij)*ua
5066 END SUBROUTINE tersoff_subeniat_l
5089 SUBROUTINE tersoff_subfiat_l(i,Nmol,Npmax,NNmax,Kinds,Pn,Co_bcd,bcsq,dsq,h,XYZRrefdf,UadUrdf,F,Uatot,dkEij,lsta,lstb,nnbrx)
5091 INTEGER,
INTENT(in) :: nmol, npmax, nnmax
5092 INTEGER,
DIMENSION(1:Nmol),
INTENT(in) ::
kinds
5093 REAL(kind=
dp),
DIMENSION(1:2),
INTENT(in) :: pn, co_bcd, bcsq, dsq, h
5094 REAL(kind=
dp),
DIMENSION(1:6*Npmax),
INTENT(in) :: xyzrrefdf
5095 REAL(kind=
dp),
DIMENSION(1:3*Npmax),
INTENT(in) :: uadurdf
5096 REAL(kind=
dp),
DIMENSION(1:3*Nmol),
INTENT(inout) :: f
5097 REAL(kind=
dp),
INTENT(inout) :: uatot
5098 REAL(kind=
dp),
DIMENSION(1:3*NNmax) :: dkeij
5099 INTEGER,
INTENT(in) :: lsta(2, nmol), nnbrx, lstb(nnbrx*nmol)
5101 INTEGER :: ij, ijpt3, ijpt6, ik, ikpt6, ipb, ipe, &
5102 ipt3, jpt3, ki, kpt3, nkpt3
5103 REAL(kind=
dp) :: bcsqi, bij, co1_dkeij, co2_dkeij, co_cdi, co_dhcosi, co_hcosi, co_mb1, &
5104 co_mb2, co_pa, cosijk, dfij, dfik, dfxi, dfxj, dfxk, dfyi, dfyj, dfyk, dfzi, dfzj, dfzk, &
5105 dgi, djeij, dsqi, dxjeij2, dyjeij2, dzjeij2, eij, fdg, fdgcos, fij, fik, gi, hi, pni, &
5106 rreij, rreik, ua, xrreij, xrreik, yrreij, yrreik, zrreij, zrreik
5123 do_j:
DO ij = ipb, ipe, +1
5128 xrreij = xyzrrefdf(ijpt6 + 1)
5129 yrreij = xyzrrefdf(ijpt6 + 2)
5130 zrreij = xyzrrefdf(ijpt6 + 3)
5131 rreij = xyzrrefdf(ijpt6 + 4)
5132 fij = xyzrrefdf(ijpt6 + 5)
5133 dfij = xyzrrefdf(ijpt6 + 6)
5142 do_k:
DO ik = ipb, ipe, +1
5146 ikij:
IF (ik /= ij)
THEN
5150 xrreik = xyzrrefdf(ikpt6 + 1)
5151 yrreik = xyzrrefdf(ikpt6 + 2)
5152 zrreik = xyzrrefdf(ikpt6 + 3)
5153 rreik = xyzrrefdf(ikpt6 + 4)
5154 fik = xyzrrefdf(ikpt6 + 5)
5155 dfik = xyzrrefdf(ikpt6 + 6)
5157 cosijk = xrreij*xrreik + yrreij*yrreik + zrreij*zrreik
5159 co_hcosi = hi - cosijk
5160 co_dhcosi = 1.0_dp/(dsqi + co_hcosi*co_hcosi)
5161 gi = -bcsqi*co_dhcosi
5162 dgi = 2.0_dp*co_hcosi*co_dhcosi*gi
5170 djeij = djeij + fdgcos
5172 dxjeij2 = dxjeij2 + fdg*xrreik
5173 dyjeij2 = dyjeij2 + fdg*yrreik
5174 dzjeij2 = dzjeij2 + fdg*zrreik
5176 co1_dkeij = -dfik*gi + fdgcos*rreik
5177 co2_dkeij = -fdg*rreik
5179 dkeij(nkpt3 + 1) = co1_dkeij*xrreik + co2_dkeij*xrreij
5180 dkeij(nkpt3 + 2) = co1_dkeij*yrreik + co2_dkeij*yrreij
5181 dkeij(nkpt3 + 3) = co1_dkeij*zrreik + co2_dkeij*zrreij
5184 dkeij(nkpt3 + 1) = 0.0_dp
5185 dkeij(nkpt3 + 2) = 0.0_dp
5186 dkeij(nkpt3 + 3) = 0.0_dp
5191 bij = 1.0_dp + eij**pni
5192 ua = uadurdf(ijpt3 + 1)*bij**(-0.5_dp/pni)
5195 co_pa = uadurdf(ijpt3 + 2) + uadurdf(ijpt3 + 3)*bij**(-0.5_dp/pni)
5197 ceij:
IF (nkpt3 > 0)
THEN
5199 co_mb1 = ua*0.5_dp*eij**(pni - 1.0_dp)/bij
5200 co_mb2 = co_mb1*rreij
5203 DO ik = ipb, ipe, +1
5206 dfxk = co_mb1*dkeij(nkpt3 + 1)
5207 dfyk = co_mb1*dkeij(nkpt3 + 2)
5208 dfzk = co_mb1*dkeij(nkpt3 + 3)
5210 kpt3 = 3*(lstb(ik) - 1)
5211 f(kpt3 + 1) = f(kpt3 + 1) + dfxk
5212 f(kpt3 + 2) = f(kpt3 + 2) + dfyk
5213 f(kpt3 + 3) = f(kpt3 + 3) + dfzk
5221 dfxj = co_pa*xrreij + co_mb2*(xrreij*djeij - dxjeij2)
5222 dfyj = co_pa*yrreij + co_mb2*(yrreij*djeij - dyjeij2)
5223 dfzj = co_pa*zrreij + co_mb2*(zrreij*djeij - dzjeij2)
5233 jpt3 = 3*(lstb(ij) - 1)
5235 f(jpt3 + 1) = f(jpt3 + 1) + dfxj
5236 f(jpt3 + 2) = f(jpt3 + 2) + dfyj
5237 f(jpt3 + 3) = f(jpt3 + 3) + dfzj
5246 f(ipt3 + 1) = f(ipt3 + 1) - dfxi
5247 f(ipt3 + 2) = f(ipt3 + 2) - dfyi
5248 f(ipt3 + 3) = f(ipt3 + 3) - dfzi
5249 END SUBROUTINE tersoff_subfiat_l
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
represent a simple array based list of the given type
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
Handles all functions related to the CELL.
subroutine, public get_cell(cell, alpha, beta, gamma, deth, orthorhombic, abc, periodic, h, h_inv, symmetry_id, tag)
Get informations about a simulation cell.
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
types that represent a subsys, i.e. a part of the system
subroutine, public cp_subsys_get(subsys, ref_count, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell)
returns information about various attributes of the given subsys
stores a lists of integer that are local to a processor. The idea is that these integers represent ob...
The environment for the empirical interatomic potential methods.
subroutine, public eip_env_get(eip_env, eip_model, eip_energy, eip_energy_var, eip_forces, coord_avg, coord_var, count, subsys, atomic_kind_set, particle_set, local_particles, molecule_kind_set, molecule_set, local_molecules, eip_input, force_env_input, cell, cell_ref, use_ref_cell, eip_kinetic_energy, eip_potential_energy, virial)
Returns various attributes of the eip environment.
Empirical interatomic potentials for Silicon.
subroutine, public eip_stillinger_weber(eip_env)
Interface routine of the Stillinger-Weber force field to CP2K.
subroutine, public eip_lenosky(eip_env)
Interface routine of Goedecker's Lenosky force field to CP2K.
subroutine, public eip_tersoff(eip_env)
Interface routine of the Tersoff force field to CP2K.
subroutine, public eip_bazant(eip_env)
Interface routine of Goedecker's Bazant EDIP to CP2K.
Defines the basic variable types.
integer, parameter, public dp
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
Interface to the message passing library MPI.
Define the data structure for the particle information.
Definition of physical constants:
real(kind=dp), parameter, public evolt
real(kind=dp), parameter, public angstrom
represent a list of objects
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
type of a logger, at the moment it contains just a print level starting at which level it should be l...
represents a system: atoms, molecules, their pos,vel,...
structure to store local (to a processor) ordered lists of integers.
The empirical interatomic potential environment.
stores all the informations relevant to an mpi environment