45#include "./base/base_uses.f90"
50 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'eip_silicon'
79 CHARACTER(len=*),
PARAMETER :: routinen =
'eip_bazant'
81 INTEGER :: handle, i, iparticle, iparticle_kind, &
82 iparticle_local, iw, natom, &
83 nparticle_kind, nparticle_local
84 REAL(kind=
dp) :: ekin, ener, ener_var, mass
85 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rxyz
86 REAL(kind=
dp),
DIMENSION(3) :: abc
100 CALL timeset(routinen, handle)
102 NULLIFY (cell, particle_set, eip_section, logger, atomic_kinds, &
103 atomic_kind, local_particles, subsys, atomic_kind_set, para_env)
109 cpassert(
ASSOCIATED(eip_env))
111 CALL eip_env_get(eip_env=eip_env, cell=cell, particle_set=particle_set, &
112 subsys=subsys, local_particles=local_particles, &
113 atomic_kind_set=atomic_kind_set)
117 natom =
SIZE(particle_set)
120 ALLOCATE (rxyz(3, natom))
124 rxyz(:, i) = particle_set(i)%r(:)*
angstrom
127 CALL eip_bazant_silicon(nat=natom, alat=abc*
angstrom, rxyz0=rxyz, &
128 fxyz=eip_env%eip_forces, ener=ener, &
129 coord=eip_env%coord_avg, ener_var=ener_var, &
130 coord_var=eip_env%coord_var, count=eip_env%count)
135 nparticle_kind = atomic_kinds%n_els
137 DO iparticle_kind = 1, nparticle_kind
138 atomic_kind => atomic_kind_set(iparticle_kind)
140 nparticle_local = local_particles%n_el(iparticle_kind)
141 DO iparticle_local = 1, nparticle_local
142 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
143 ekin = ekin + 0.5_dp*mass* &
144 (particle_set(iparticle)%v(1)*particle_set(iparticle)%v(1) &
145 + particle_set(iparticle)%v(2)*particle_set(iparticle)%v(2) &
146 + particle_set(iparticle)%v(3)*particle_set(iparticle)%v(3))
152 CALL para_env%sum(ekin)
153 eip_env%eip_kinetic_energy = ekin
155 eip_env%eip_potential_energy = ener/
evolt
156 eip_env%eip_energy = eip_env%eip_kinetic_energy + eip_env%eip_potential_energy
157 eip_env%eip_energy_var = ener_var/
evolt
160 particle_set(i)%f(:) = eip_env%eip_forces(:, i)/
evolt*
angstrom
167 eip_section,
"PRINT%ENERGIES"),
cp_p_file))
THEN
171 CALL eip_print_energies(eip_env=eip_env, output_unit=iw)
177 eip_section,
"PRINT%ENERGIES_VAR"),
cp_p_file))
THEN
181 CALL eip_print_energy_var(eip_env=eip_env, output_unit=iw)
183 "PRINT%ENERGIES_VAR")
187 eip_section,
"PRINT%FORCES"),
cp_p_file))
THEN
191 CALL eip_print_forces(eip_env=eip_env, output_unit=iw)
197 eip_section,
"PRINT%COORD_AVG"),
cp_p_file))
THEN
201 CALL eip_print_coord_avg(eip_env=eip_env, output_unit=iw)
207 eip_section,
"PRINT%COORD_VAR"),
cp_p_file))
THEN
211 CALL eip_print_coord_var(eip_env=eip_env, output_unit=iw)
217 eip_section,
"PRINT%COUNT"),
cp_p_file))
THEN
221 CALL eip_print_count(eip_env=eip_env, output_unit=iw)
226 CALL timestop(handle)
245 CHARACTER(len=*),
PARAMETER :: routinen =
'eip_lenosky'
247 INTEGER :: handle, i, iparticle, iparticle_kind, &
248 iparticle_local, iw, natom, &
249 nparticle_kind, nparticle_local
250 REAL(kind=
dp) :: ekin, ener, ener_var, mass
251 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rxyz
252 REAL(kind=
dp),
DIMENSION(3) :: abc
266 CALL timeset(routinen, handle)
268 NULLIFY (cell, particle_set, eip_section, logger, atomic_kinds, &
269 atomic_kind, local_particles, subsys, atomic_kind_set, para_env)
275 cpassert(
ASSOCIATED(eip_env))
277 CALL eip_env_get(eip_env=eip_env, cell=cell, particle_set=particle_set, &
278 subsys=subsys, local_particles=local_particles, &
279 atomic_kind_set=atomic_kind_set)
283 natom =
SIZE(particle_set)
286 ALLOCATE (rxyz(3, natom))
290 rxyz(:, i) = particle_set(i)%r(:)*
angstrom
293 CALL eip_lenosky_silicon(nat=natom, alat=abc*
angstrom, rxyz0=rxyz, &
294 fxyz=eip_env%eip_forces, ener=ener, &
295 coord=eip_env%coord_avg, ener_var=ener_var, &
296 coord_var=eip_env%coord_var, count=eip_env%count)
301 nparticle_kind = atomic_kinds%n_els
303 DO iparticle_kind = 1, nparticle_kind
304 atomic_kind => atomic_kind_set(iparticle_kind)
306 nparticle_local = local_particles%n_el(iparticle_kind)
307 DO iparticle_local = 1, nparticle_local
308 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
309 ekin = ekin + 0.5_dp*mass* &
310 (particle_set(iparticle)%v(1)*particle_set(iparticle)%v(1) &
311 + particle_set(iparticle)%v(2)*particle_set(iparticle)%v(2) &
312 + particle_set(iparticle)%v(3)*particle_set(iparticle)%v(3))
318 CALL para_env%sum(ekin)
319 eip_env%eip_kinetic_energy = ekin
321 eip_env%eip_potential_energy = ener/
evolt
322 eip_env%eip_energy = eip_env%eip_kinetic_energy + eip_env%eip_potential_energy
323 eip_env%eip_energy_var = ener_var/
evolt
326 particle_set(i)%f(:) = eip_env%eip_forces(:, i)/
evolt*
angstrom
333 eip_section,
"PRINT%ENERGIES"),
cp_p_file))
THEN
337 CALL eip_print_energies(eip_env=eip_env, output_unit=iw)
343 eip_section,
"PRINT%ENERGIES_VAR"),
cp_p_file))
THEN
347 CALL eip_print_energy_var(eip_env=eip_env, output_unit=iw)
349 "PRINT%ENERGIES_VAR")
353 eip_section,
"PRINT%FORCES"),
cp_p_file))
THEN
357 CALL eip_print_forces(eip_env=eip_env, output_unit=iw)
363 eip_section,
"PRINT%COORD_AVG"),
cp_p_file))
THEN
367 CALL eip_print_coord_avg(eip_env=eip_env, output_unit=iw)
373 eip_section,
"PRINT%COORD_VAR"),
cp_p_file))
THEN
377 CALL eip_print_coord_var(eip_env=eip_env, output_unit=iw)
383 eip_section,
"PRINT%COUNT"),
cp_p_file))
THEN
387 CALL eip_print_count(eip_env=eip_env, output_unit=iw)
392 CALL timestop(handle)
409 CHARACTER(len=*),
PARAMETER :: routinen =
'eip_stillinger_weber'
411 INTEGER :: handle, i, iparticle, iparticle_kind, &
412 iparticle_local, iw, natom, &
413 nparticle_kind, nparticle_local
414 REAL(kind=
dp) :: ekin, ener, mass
415 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rxyz
416 REAL(kind=
dp),
DIMENSION(3) :: abc
428 CALL timeset(routinen, handle)
430 NULLIFY (cell, particle_set, eip_section, logger, atomic_kinds, &
431 atomic_kind, local_particles, subsys, atomic_kind_set, para_env)
437 cpassert(
ASSOCIATED(eip_env))
439 CALL eip_env_get(eip_env=eip_env, cell=cell, particle_set=particle_set, &
440 subsys=subsys, local_particles=local_particles, &
441 atomic_kind_set=atomic_kind_set)
445 natom =
SIZE(particle_set)
447 ALLOCATE (rxyz(3, natom))
450 rxyz(:, i) = particle_set(i)%r(:)*
angstrom
453 CALL eip_stillinger_weber_silicon(nat=natom, alat=abc*
angstrom, &
454 rxyz0=rxyz, fxyz=eip_env%eip_forces, &
455 etot=ener, count=eip_env%count)
457 eip_env%coord_avg = 0.0_dp
458 eip_env%coord_var = 0.0_dp
462 nparticle_kind = atomic_kinds%n_els
464 DO iparticle_kind = 1, nparticle_kind
465 atomic_kind => atomic_kind_set(iparticle_kind)
467 nparticle_local = local_particles%n_el(iparticle_kind)
468 DO iparticle_local = 1, nparticle_local
469 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
470 ekin = ekin + 0.5_dp*mass* &
471 (particle_set(iparticle)%v(1)*particle_set(iparticle)%v(1) &
472 + particle_set(iparticle)%v(2)*particle_set(iparticle)%v(2) &
473 + particle_set(iparticle)%v(3)*particle_set(iparticle)%v(3))
478 CALL para_env%sum(ekin)
479 eip_env%eip_kinetic_energy = ekin
481 eip_env%eip_potential_energy = ener/
evolt
482 eip_env%eip_energy = eip_env%eip_kinetic_energy + eip_env%eip_potential_energy
483 eip_env%eip_energy_var = 0.0_dp
486 particle_set(i)%f(:) = eip_env%eip_forces(:, i)/
evolt*
angstrom
492 eip_section,
"PRINT%ENERGIES"),
cp_p_file))
THEN
496 CALL eip_print_energies(eip_env=eip_env, output_unit=iw)
502 eip_section,
"PRINT%ENERGIES_VAR"),
cp_p_file))
THEN
506 CALL eip_print_energy_var(eip_env=eip_env, output_unit=iw)
508 "PRINT%ENERGIES_VAR")
512 eip_section,
"PRINT%FORCES"),
cp_p_file))
THEN
516 CALL eip_print_forces(eip_env=eip_env, output_unit=iw)
522 eip_section,
"PRINT%COORD_AVG"),
cp_p_file))
THEN
526 CALL eip_print_coord_avg(eip_env=eip_env, output_unit=iw)
532 eip_section,
"PRINT%COORD_VAR"),
cp_p_file))
THEN
536 CALL eip_print_coord_var(eip_env=eip_env, output_unit=iw)
542 eip_section,
"PRINT%COUNT"),
cp_p_file))
THEN
546 CALL eip_print_count(eip_env=eip_env, output_unit=iw)
551 CALL timestop(handle)
571 CHARACTER(len=*),
PARAMETER :: routinen =
'eip_tersoff'
573 INTEGER :: handle, i, iparticle, iparticle_kind, &
574 iparticle_local, iw, natom, &
575 nparticle_kind, nparticle_local
576 REAL(kind=
dp) :: ekin, ener, mass
577 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rxyz
578 REAL(kind=
dp),
DIMENSION(3) :: abc
590 CALL timeset(routinen, handle)
592 NULLIFY (cell, particle_set, eip_section, logger, atomic_kinds, &
593 atomic_kind, local_particles, subsys, atomic_kind_set, para_env)
599 cpassert(
ASSOCIATED(eip_env))
601 CALL eip_env_get(eip_env=eip_env, cell=cell, particle_set=particle_set, &
602 subsys=subsys, local_particles=local_particles, &
603 atomic_kind_set=atomic_kind_set)
607 natom =
SIZE(particle_set)
609 ALLOCATE (rxyz(3, natom))
612 rxyz(:, i) = particle_set(i)%r(:)*
angstrom
615 CALL eip_tersoff_silicon(nat=natom, alat=abc*
angstrom, rxyz=rxyz, &
616 fxyz=eip_env%eip_forces, etot=ener, &
619 eip_env%coord_avg = 0.0_dp
620 eip_env%coord_var = 0.0_dp
624 nparticle_kind = atomic_kinds%n_els
626 DO iparticle_kind = 1, nparticle_kind
627 atomic_kind => atomic_kind_set(iparticle_kind)
629 nparticle_local = local_particles%n_el(iparticle_kind)
630 DO iparticle_local = 1, nparticle_local
631 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
632 ekin = ekin + 0.5_dp*mass* &
633 (particle_set(iparticle)%v(1)*particle_set(iparticle)%v(1) &
634 + particle_set(iparticle)%v(2)*particle_set(iparticle)%v(2) &
635 + particle_set(iparticle)%v(3)*particle_set(iparticle)%v(3))
640 CALL para_env%sum(ekin)
641 eip_env%eip_kinetic_energy = ekin
643 eip_env%eip_potential_energy = ener/
evolt
644 eip_env%eip_energy = eip_env%eip_kinetic_energy + eip_env%eip_potential_energy
645 eip_env%eip_energy_var = 0.0_dp
648 particle_set(i)%f(:) = eip_env%eip_forces(:, i)/
evolt*
angstrom
654 eip_section,
"PRINT%ENERGIES"),
cp_p_file))
THEN
658 CALL eip_print_energies(eip_env=eip_env, output_unit=iw)
664 eip_section,
"PRINT%ENERGIES_VAR"),
cp_p_file))
THEN
668 CALL eip_print_energy_var(eip_env=eip_env, output_unit=iw)
670 "PRINT%ENERGIES_VAR")
674 eip_section,
"PRINT%FORCES"),
cp_p_file))
THEN
678 CALL eip_print_forces(eip_env=eip_env, output_unit=iw)
684 eip_section,
"PRINT%COORD_AVG"),
cp_p_file))
THEN
688 CALL eip_print_coord_avg(eip_env=eip_env, output_unit=iw)
694 eip_section,
"PRINT%COORD_VAR"),
cp_p_file))
THEN
698 CALL eip_print_coord_var(eip_env=eip_env, output_unit=iw)
704 eip_section,
"PRINT%COUNT"),
cp_p_file))
THEN
708 CALL eip_print_count(eip_env=eip_env, output_unit=iw)
713 CALL timestop(handle)
728 SUBROUTINE eip_print_energies(eip_env, output_unit)
730 INTEGER,
INTENT(IN) :: output_unit
734 IF (output_unit > 0)
THEN
735 WRITE (unit=output_unit, fmt=
"(/,(T3,A,T55,F25.14))") &
736 "Kinetic energy [Hartree]: ", eip_env%eip_kinetic_energy, &
737 "Potential energy [Hartree]: ", eip_env%eip_potential_energy, &
738 "Total EIP energy [Hartree]: ", eip_env%eip_energy
741 END SUBROUTINE eip_print_energies
751 SUBROUTINE eip_print_energy_var(eip_env, output_unit)
753 INTEGER,
INTENT(IN) :: output_unit
759 unit_nr = output_unit
761 IF (unit_nr > 0)
THEN
763 WRITE (unit_nr, *)
""
764 WRITE (unit_nr, *)
"The variance of the EIP energy/atom!"
765 WRITE (unit_nr, *)
""
766 WRITE (unit_nr, *) eip_env%eip_energy_var
770 END SUBROUTINE eip_print_energy_var
780 SUBROUTINE eip_print_forces(eip_env, output_unit)
782 INTEGER,
INTENT(IN) :: output_unit
784 INTEGER :: iatom, natom, unit_nr
789 NULLIFY (particle_set)
791 unit_nr = output_unit
793 IF (unit_nr > 0)
THEN
795 CALL eip_env_get(eip_env=eip_env, particle_set=particle_set)
797 natom =
SIZE(particle_set)
799 WRITE (unit_nr, *)
""
800 WRITE (unit_nr, *)
"The EIP forces!"
801 WRITE (unit_nr, *)
""
802 WRITE (unit_nr, *)
"Total EIP forces [Hartree/Bohr]"
804 WRITE (unit_nr, *) eip_env%eip_forces(1:3, iatom)
809 END SUBROUTINE eip_print_forces
819 SUBROUTINE eip_print_coord_avg(eip_env, output_unit)
821 INTEGER,
INTENT(IN) :: output_unit
827 unit_nr = output_unit
829 IF (unit_nr > 0)
THEN
831 WRITE (unit_nr, *)
""
832 WRITE (unit_nr, *)
"The average coordination number!"
833 WRITE (unit_nr, *)
""
834 WRITE (unit_nr, *) eip_env%coord_avg
838 END SUBROUTINE eip_print_coord_avg
848 SUBROUTINE eip_print_coord_var(eip_env, output_unit)
850 INTEGER,
INTENT(IN) :: output_unit
856 unit_nr = output_unit
858 IF (unit_nr > 0)
THEN
860 WRITE (unit_nr, *)
""
861 WRITE (unit_nr, *)
"The variance of the coordination number!"
862 WRITE (unit_nr, *)
""
863 WRITE (unit_nr, *) eip_env%coord_var
867 END SUBROUTINE eip_print_coord_var
877 SUBROUTINE eip_print_count(eip_env, output_unit)
879 INTEGER,
INTENT(IN) :: output_unit
885 unit_nr = output_unit
887 IF (unit_nr > 0)
THEN
889 WRITE (unit_nr, *)
""
890 WRITE (unit_nr, *)
"The function call counter!"
891 WRITE (unit_nr, *)
""
892 WRITE (unit_nr, *) eip_env%count
896 END SUBROUTINE eip_print_count
927 SUBROUTINE eip_bazant_silicon(nat, alat, rxyz0, fxyz, ener, coord, ener_var, &
931 REAL(kind=
dp) :: alat(3), rxyz0(3, nat), fxyz(3, nat), &
932 ener, coord, ener_var, coord_var, count
934 INTEGER :: i, iam, iat, iat1, iat2, ii, il, in, indlst, indlstx, istop, istopg, l1, l2, l3, &
935 laymx, ll1, ll2, ll3, lot, max_nbrs, myspace, myspaceout, ncx, nn, nnbrx, npr
936 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: lay, lstb, num2, num3, numz
937 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: lsta
938 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :, :) :: icell
939 INTEGER,
SAVE :: monitor_unit = -1
940 REAL(kind=
dp) :: coord2, cut, cut2, ener2, rlc1i, rlc2i, &
941 rlc3i, tcoord, tcoord2, tener, tener2
942 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rel, rxyz, s2, s3, sz, txyz
947 cut = 3.1213820e0_dp + 1.e-14_dp
950 IF (monitor_unit < 1)
THEN
951 CALL open_file(file_name=
"bazant.mon", file_status=
"UNKNOWN", &
952 file_action=
"WRITE", file_position=
"ASIS", &
953 unit_number=monitor_unit)
955 count = count + 1.e0_dp
958 ll1 = int(alat(1)/cut)
959 IF (ll1 < 1) cpabort(
"alat(1) too small")
960 ll2 = int(alat(2)/cut)
961 IF (ll2 < 1) cpabort(
"alat(2) too small")
962 ll3 = int(alat(3)/cut)
963 IF (ll3 < 1) cpabort(
"alat(3) too small")
979 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
980 icell(0, -1:ll1, -1:ll2, -1:ll3) = 0
985 loop_iat_s:
DO iat = 1, nat
986 rxyz0(1, iat) =
modulo(
modulo(rxyz0(1, iat), alat(1)), alat(1))
987 rxyz0(2, iat) =
modulo(
modulo(rxyz0(2, iat), alat(2)), alat(2))
988 rxyz0(3, iat) =
modulo(
modulo(rxyz0(3, iat), alat(3)), alat(3))
989 l1 = int(rxyz0(1, iat)*rlc1i)
990 l2 = int(rxyz0(2, iat)*rlc2i)
991 l3 = int(rxyz0(3, iat)*rlc3i)
993 ii = icell(0, l1, l2, l3)
995 icell(0, l1, l2, l3) = ii
997 WRITE (unit=monitor_unit, fmt=*) count,
'NCX too small', ncx
1002 icell(ii, l1, l2, l3) = iat
1012 rxyz0(1, iat) =
modulo(
modulo(rxyz0(1, iat), alat(1)), alat(1))
1013 rxyz0(2, iat) =
modulo(
modulo(rxyz0(2, iat), alat(2)), alat(2))
1014 rxyz0(3, iat) =
modulo(
modulo(rxyz0(3, iat), alat(3)), alat(3))
1022 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
1023 icell(0, -1:ll1, -1:ll2, -1:ll3) = 0
1029 loop_iat_p:
DO iat = 1, nat
1030 l1 = int(rxyz0(1, iat)*rlc1i)
1031 l2 = int(rxyz0(2, iat)*rlc2i)
1032 l3 = int(rxyz0(3, iat)*rlc3i)
1033 ii = icell(0, l1, l2, l3)
1035 icell(0, l1, l2, l3) = ii
1037 WRITE (unit=monitor_unit, fmt=*) count,
'NCX too small', ncx
1042 icell(ii, l1, l2, l3) = iat
1050 laymx = ncx*(2*ll1*ll2 + 2*ll1*ll3 + 2*ll2*ll3 + 4*ll1 + 4*ll2 + 4*ll3 + 8)
1052 ALLOCATE (rxyz(3, nn), lay(nn))
1055 rxyz(1, iat) = rxyz0(1, iat)
1056 rxyz(2, iat) = rxyz0(2, iat)
1057 rxyz(3, iat) = rxyz0(3, iat)
1064 in = icell(0, l1, l2, 0)
1065 icell(0, l1, l2, ll3) = in
1067 i = icell(ii, l1, l2, 0)
1069 IF (il > nn) cpabort(
"enlarge laymx")
1071 icell(ii, l1, l2, ll3) = il
1072 rxyz(1, il) = rxyz(1, i)
1073 rxyz(2, il) = rxyz(2, i)
1074 rxyz(3, il) = rxyz(3, i) + alat(3)
1077 in = icell(0, l1, l2, ll3 - 1)
1078 icell(0, l1, l2, -1) = in
1080 i = icell(ii, l1, l2, ll3 - 1)
1082 IF (il > nn) cpabort(
"enlarge laymx")
1084 icell(ii, l1, l2, -1) = il
1085 rxyz(1, il) = rxyz(1, i)
1086 rxyz(2, il) = rxyz(2, i)
1087 rxyz(3, il) = rxyz(3, i) - alat(3)
1097 in = icell(0, 0, l2, l3)
1098 icell(0, ll1, l2, l3) = in
1100 i = icell(ii, 0, l2, l3)
1102 IF (il > nn) cpabort(
"enlarge laymx")
1104 icell(ii, ll1, l2, l3) = il
1105 rxyz(1, il) = rxyz(1, i) + alat(1)
1106 rxyz(2, il) = rxyz(2, i)
1107 rxyz(3, il) = rxyz(3, i)
1110 in = icell(0, ll1 - 1, l2, l3)
1111 icell(0, -1, l2, l3) = in
1113 i = icell(ii, ll1 - 1, l2, l3)
1115 IF (il > nn) cpabort(
"enlarge laymx")
1117 icell(ii, -1, l2, l3) = il
1118 rxyz(1, il) = rxyz(1, i) - alat(1)
1119 rxyz(2, il) = rxyz(2, i)
1120 rxyz(3, il) = rxyz(3, i)
1130 in = icell(0, l1, 0, l3)
1131 icell(0, l1, ll2, l3) = in
1133 i = icell(ii, l1, 0, l3)
1135 IF (il > nn) cpabort(
"enlarge laymx")
1137 icell(ii, l1, ll2, l3) = il
1138 rxyz(1, il) = rxyz(1, i)
1139 rxyz(2, il) = rxyz(2, i) + alat(2)
1140 rxyz(3, il) = rxyz(3, i)
1143 in = icell(0, l1, ll2 - 1, l3)
1144 icell(0, l1, -1, l3) = in
1146 i = icell(ii, l1, ll2 - 1, l3)
1148 IF (il > nn) cpabort(
"enlarge laymx")
1150 icell(ii, l1, -1, l3) = il
1151 rxyz(1, il) = rxyz(1, i)
1152 rxyz(2, il) = rxyz(2, i) - alat(2)
1153 rxyz(3, il) = rxyz(3, i)
1162 in = icell(0, l1, 0, 0)
1163 icell(0, l1, ll2, ll3) = in
1165 i = icell(ii, l1, 0, 0)
1167 IF (il > nn) cpabort(
"enlarge laymx")
1169 icell(ii, l1, ll2, ll3) = il
1170 rxyz(1, il) = rxyz(1, i)
1171 rxyz(2, il) = rxyz(2, i) + alat(2)
1172 rxyz(3, il) = rxyz(3, i) + alat(3)
1175 in = icell(0, l1, 0, ll3 - 1)
1176 icell(0, l1, ll2, -1) = in
1178 i = icell(ii, l1, 0, ll3 - 1)
1180 IF (il > nn) cpabort(
"enlarge laymx")
1182 icell(ii, l1, ll2, -1) = il
1183 rxyz(1, il) = rxyz(1, i)
1184 rxyz(2, il) = rxyz(2, i) + alat(2)
1185 rxyz(3, il) = rxyz(3, i) - alat(3)
1188 in = icell(0, l1, ll2 - 1, 0)
1189 icell(0, l1, -1, ll3) = in
1191 i = icell(ii, l1, ll2 - 1, 0)
1193 IF (il > nn) cpabort(
"enlarge laymx")
1195 icell(ii, l1, -1, ll3) = il
1196 rxyz(1, il) = rxyz(1, i)
1197 rxyz(2, il) = rxyz(2, i) - alat(2)
1198 rxyz(3, il) = rxyz(3, i) + alat(3)
1201 in = icell(0, l1, ll2 - 1, ll3 - 1)
1202 icell(0, l1, -1, -1) = in
1204 i = icell(ii, l1, ll2 - 1, ll3 - 1)
1206 IF (il > nn) cpabort(
"enlarge laymx")
1208 icell(ii, l1, -1, -1) = il
1209 rxyz(1, il) = rxyz(1, i)
1210 rxyz(2, il) = rxyz(2, i) - alat(2)
1211 rxyz(3, il) = rxyz(3, i) - alat(3)
1219 in = icell(0, 0, l2, 0)
1220 icell(0, ll1, l2, ll3) = in
1222 i = icell(ii, 0, l2, 0)
1224 IF (il > nn) cpabort(
"enlarge laymx")
1226 icell(ii, ll1, l2, ll3) = il
1227 rxyz(1, il) = rxyz(1, i) + alat(1)
1228 rxyz(2, il) = rxyz(2, i)
1229 rxyz(3, il) = rxyz(3, i) + alat(3)
1232 in = icell(0, 0, l2, ll3 - 1)
1233 icell(0, ll1, l2, -1) = in
1235 i = icell(ii, 0, l2, ll3 - 1)
1237 IF (il > nn) cpabort(
"enlarge laymx")
1239 icell(ii, ll1, l2, -1) = il
1240 rxyz(1, il) = rxyz(1, i) + alat(1)
1241 rxyz(2, il) = rxyz(2, i)
1242 rxyz(3, il) = rxyz(3, i) - alat(3)
1245 in = icell(0, ll1 - 1, l2, 0)
1246 icell(0, -1, l2, ll3) = in
1248 i = icell(ii, ll1 - 1, l2, 0)
1250 IF (il > nn) cpabort(
"enlarge laymx")
1252 icell(ii, -1, l2, ll3) = il
1253 rxyz(1, il) = rxyz(1, i) - alat(1)
1254 rxyz(2, il) = rxyz(2, i)
1255 rxyz(3, il) = rxyz(3, i) + alat(3)
1258 in = icell(0, ll1 - 1, l2, ll3 - 1)
1259 icell(0, -1, l2, -1) = in
1261 i = icell(ii, ll1 - 1, l2, ll3 - 1)
1263 IF (il > nn) cpabort(
"enlarge laymx")
1265 icell(ii, -1, l2, -1) = il
1266 rxyz(1, il) = rxyz(1, i) - alat(1)
1267 rxyz(2, il) = rxyz(2, i)
1268 rxyz(3, il) = rxyz(3, i) - alat(3)
1276 in = icell(0, 0, 0, l3)
1277 icell(0, ll1, ll2, l3) = in
1279 i = icell(ii, 0, 0, l3)
1281 IF (il > nn) cpabort(
"enlarge laymx")
1283 icell(ii, ll1, ll2, l3) = il
1284 rxyz(1, il) = rxyz(1, i) + alat(1)
1285 rxyz(2, il) = rxyz(2, i) + alat(2)
1286 rxyz(3, il) = rxyz(3, i)
1289 in = icell(0, ll1 - 1, 0, l3)
1290 icell(0, -1, ll2, l3) = in
1292 i = icell(ii, ll1 - 1, 0, l3)
1294 IF (il > nn) cpabort(
"enlarge laymx")
1296 icell(ii, -1, ll2, l3) = il
1297 rxyz(1, il) = rxyz(1, i) - alat(1)
1298 rxyz(2, il) = rxyz(2, i) + alat(2)
1299 rxyz(3, il) = rxyz(3, i)
1302 in = icell(0, 0, ll2 - 1, l3)
1303 icell(0, ll1, -1, l3) = in
1305 i = icell(ii, 0, ll2 - 1, l3)
1307 IF (il > nn) cpabort(
"enlarge laymx")
1309 icell(ii, ll1, -1, l3) = il
1310 rxyz(1, il) = rxyz(1, i) + alat(1)
1311 rxyz(2, il) = rxyz(2, i) - alat(2)
1312 rxyz(3, il) = rxyz(3, i)
1315 in = icell(0, ll1 - 1, ll2 - 1, l3)
1316 icell(0, -1, -1, l3) = in
1318 i = icell(ii, ll1 - 1, ll2 - 1, l3)
1320 IF (il > nn) cpabort(
"enlarge laymx")
1322 icell(ii, -1, -1, l3) = il
1323 rxyz(1, il) = rxyz(1, i) - alat(1)
1324 rxyz(2, il) = rxyz(2, i) - alat(2)
1325 rxyz(3, il) = rxyz(3, i)
1331 in = icell(0, 0, 0, 0)
1332 icell(0, ll1, ll2, ll3) = in
1334 i = icell(ii, 0, 0, 0)
1336 IF (il > nn) cpabort(
"enlarge laymx")
1338 icell(ii, ll1, ll2, ll3) = il
1339 rxyz(1, il) = rxyz(1, i) + alat(1)
1340 rxyz(2, il) = rxyz(2, i) + alat(2)
1341 rxyz(3, il) = rxyz(3, i) + alat(3)
1344 in = icell(0, ll1 - 1, 0, 0)
1345 icell(0, -1, ll2, ll3) = in
1347 i = icell(ii, ll1 - 1, 0, 0)
1349 IF (il > nn) cpabort(
"enlarge laymx")
1351 icell(ii, -1, ll2, ll3) = il
1352 rxyz(1, il) = rxyz(1, i) - alat(1)
1353 rxyz(2, il) = rxyz(2, i) + alat(2)
1354 rxyz(3, il) = rxyz(3, i) + alat(3)
1357 in = icell(0, 0, ll2 - 1, 0)
1358 icell(0, ll1, -1, ll3) = in
1360 i = icell(ii, 0, ll2 - 1, 0)
1362 IF (il > nn) cpabort(
"enlarge laymx")
1364 icell(ii, ll1, -1, ll3) = il
1365 rxyz(1, il) = rxyz(1, i) + alat(1)
1366 rxyz(2, il) = rxyz(2, i) - alat(2)
1367 rxyz(3, il) = rxyz(3, i) + alat(3)
1370 in = icell(0, ll1 - 1, ll2 - 1, 0)
1371 icell(0, -1, -1, ll3) = in
1373 i = icell(ii, ll1 - 1, ll2 - 1, 0)
1375 IF (il > nn) cpabort(
"enlarge laymx")
1377 icell(ii, -1, -1, ll3) = il
1378 rxyz(1, il) = rxyz(1, i) - alat(1)
1379 rxyz(2, il) = rxyz(2, i) - alat(2)
1380 rxyz(3, il) = rxyz(3, i) + alat(3)
1383 in = icell(0, 0, 0, ll3 - 1)
1384 icell(0, ll1, ll2, -1) = in
1386 i = icell(ii, 0, 0, ll3 - 1)
1388 IF (il > nn) cpabort(
"enlarge laymx")
1390 icell(ii, ll1, ll2, -1) = il
1391 rxyz(1, il) = rxyz(1, i) + alat(1)
1392 rxyz(2, il) = rxyz(2, i) + alat(2)
1393 rxyz(3, il) = rxyz(3, i) - alat(3)
1396 in = icell(0, ll1 - 1, 0, ll3 - 1)
1397 icell(0, -1, ll2, -1) = in
1399 i = icell(ii, ll1 - 1, 0, ll3 - 1)
1401 IF (il > nn) cpabort(
"enlarge laymx")
1403 icell(ii, -1, ll2, -1) = il
1404 rxyz(1, il) = rxyz(1, i) - alat(1)
1405 rxyz(2, il) = rxyz(2, i) + alat(2)
1406 rxyz(3, il) = rxyz(3, i) - alat(3)
1409 in = icell(0, 0, ll2 - 1, ll3 - 1)
1410 icell(0, ll1, -1, -1) = in
1412 i = icell(ii, 0, ll2 - 1, ll3 - 1)
1414 IF (il > nn) cpabort(
"enlarge laymx")
1416 icell(ii, ll1, -1, -1) = il
1417 rxyz(1, il) = rxyz(1, i) + alat(1)
1418 rxyz(2, il) = rxyz(2, i) - alat(2)
1419 rxyz(3, il) = rxyz(3, i) - alat(3)
1422 in = icell(0, ll1 - 1, ll2 - 1, ll3 - 1)
1423 icell(0, -1, -1, -1) = in
1425 i = icell(ii, ll1 - 1, ll2 - 1, ll3 - 1)
1427 IF (il > nn) cpabort(
"enlarge laymx")
1429 icell(ii, -1, -1, -1) = il
1430 rxyz(1, il) = rxyz(1, i) - alat(1)
1431 rxyz(2, il) = rxyz(2, i) - alat(2)
1432 rxyz(3, il) = rxyz(3, i) - alat(3)
1435 ALLOCATE (lsta(2, nat))
1438 ALLOCATE (lstb(nnbrx*nat), rel(5, nnbrx*nat))
1454 myspace = (nat*nnbrx)/npr
1455 IF (iam == 0) myspaceout = myspace
1458 loop_l3:
DO l3 = 0, ll3 - 1
1459 loop_l2:
DO l2 = 0, ll2 - 1
1460 loop_l1:
DO l1 = 0, ll1 - 1
1461 loop_ii:
DO ii = 1, icell(0, l1, l2, l3)
1462 iat = icell(ii, l1, l2, l3)
1463 IF (((iat - 1)*npr)/nat == iam)
THEN
1465 lsta(1, iat) = iam*myspace + indlst + 1
1466 CALL sublstiat_b(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
1467 rxyz, icell, lstb(iam*myspace + 1), lay, &
1468 rel(1, iam*myspace + 1), cut2, indlst)
1469 lsta(2, iat) = iam*myspace + indlst
1479 indlstx = max(indlstx, indlst)
1483 IF (indlstx >= myspaceout)
THEN
1484 WRITE (unit=monitor_unit, fmt=*) count,
'NNBRX too small', nnbrx
1485 DEALLOCATE (lstb, rel)
1511 ALLOCATE (txyz(3, nat), s2(max_nbrs, 8), s3(max_nbrs, 7), sz(max_nbrs, 6), &
1512 num2(max_nbrs), num3(max_nbrs), numz(max_nbrs))
1522 fxyz(1, iat) = 0.e0_dp
1523 fxyz(2, iat) = 0.e0_dp
1524 fxyz(3, iat) = 0.e0_dp
1529 lot = int(real(nat, kind=
dp)/real(npr, kind=
dp) + .999999999999e0_dp)
1531 iat2 = min((iam + 1)*lot, nat)
1533 CALL subfeniat_b(iat1, iat2, nat, lsta, lstb, rel, tener, tener2, &
1534 tcoord, tcoord2, nnbrx, txyz, max_nbrs, istop, &
1535 s2(1, 1), s2(1, 2), s2(1, 3), s2(1, 4), s2(1, 5), s2(1, 6), s2(1, 7), s2(1, 8), &
1536 num2, s3(1, 1), s3(1, 2), s3(1, 3), s3(1, 4), s3(1, 5), s3(1, 6), s3(1, 7), &
1537 num3, sz(1, 1), sz(1, 2), sz(1, 3), sz(1, 4), sz(1, 5), sz(1, 6), numz)
1541 ener2 = ener2 + tener2
1542 coord = coord + tcoord
1543 coord2 = coord2 + tcoord2
1544 istopg = istopg + istop
1546 fxyz(1, iat) = fxyz(1, iat) + txyz(1, iat)
1547 fxyz(2, iat) = fxyz(2, iat) + txyz(2, iat)
1548 fxyz(3, iat) = fxyz(3, iat) + txyz(3, iat)
1550 DEALLOCATE (txyz, s2, s3, sz, num2, num3, numz)
1557 ALLOCATE (s2(max_nbrs, 8), s3(max_nbrs, 7), sz(max_nbrs, 6), &
1558 num2(max_nbrs), num3(max_nbrs), numz(max_nbrs))
1559 CALL subfeniat_b(iat1, iat2, nat, lsta, lstb, rel, ener, ener2, &
1560 coord, coord2, nnbrx, fxyz, max_nbrs, istopg, &
1561 s2(1, 1), s2(1, 2), s2(1, 3), s2(1, 4), s2(1, 5), s2(1, 6), s2(1, 7), s2(1, 8), &
1562 num2, s3(1, 1), s3(1, 2), s3(1, 3), s3(1, 4), s3(1, 5), s3(1, 6), s3(1, 7), &
1563 num3, sz(1, 1), sz(1, 2), sz(1, 3), sz(1, 4), sz(1, 5), sz(1, 6), numz)
1564 DEALLOCATE (s2, s3, sz, num2, num3, numz)
1569 IF (istopg > 0) cpabort(
"DIMENSION ERROR: max_nbrs is too small")
1570 ener_var = ener2/nat - (ener/nat)**2
1572 coord_var = coord2/nat - coord**2
1574 DEALLOCATE (rxyz, icell, lay, lsta, lstb, rel)
1576 END SUBROUTINE eip_bazant_silicon
1619 SUBROUTINE subfeniat_b(iat1, iat2, nat, lsta, lstb, rel, ener, ener2, &
1620 coord, coord2, nnbrx, ff, max_nbrs, istop, &
1621 s2_t0, s2_t1, s2_t2, s2_t3, s2_dx, s2_dy, s2_dz, s2_r, &
1622 num2, s3_g, s3_dg, s3_rinv, s3_dx, s3_dy, s3_dz, s3_r, &
1623 num3, sz_df, sz_sum, sz_dx, sz_dy, sz_dz, sz_r, numz)
1631 INTEGER :: iat1, iat2, nat, lsta(2, nat)
1632 REAL(kind=
dp) :: ener, ener2, coord, coord2
1634 REAL(kind=
dp) :: rel(5, nnbrx*nat)
1635 INTEGER :: lstb(nnbrx*nat)
1636 REAL(kind=
dp) :: ff(3, nat)
1637 INTEGER :: max_nbrs, istop
1638 REAL(kind=
dp) :: s2_t0(max_nbrs), s2_t1(max_nbrs), s2_t2(max_nbrs), s2_t3(max_nbrs), &
1639 s2_dx(max_nbrs), s2_dy(max_nbrs), s2_dz(max_nbrs), s2_r(max_nbrs)
1640 INTEGER :: num2(max_nbrs)
1641 REAL(kind=
dp) :: s3_g(max_nbrs), s3_dg(max_nbrs), s3_rinv(max_nbrs), s3_dx(max_nbrs), &
1642 s3_dy(max_nbrs), s3_dz(max_nbrs), s3_r(max_nbrs)
1643 INTEGER :: num3(max_nbrs)
1644 REAL(kind=
dp) :: sz_df(max_nbrs), sz_sum(max_nbrs), &
1645 sz_dx(max_nbrs), sz_dy(max_nbrs), &
1646 sz_dz(max_nbrs), sz_r(max_nbrs)
1647 INTEGER :: numz(max_nbrs)
1649 INTEGER :: i, j, k, l, n, n2, n3, nj, nk, nl, nz
1650 REAL(kind=
dp) :: bmc, cmbinv, coord_iat, dedrl, dedrlx, dedrly, dedrlz, den, dhdl, dhdx, &
1651 dp1, dtau, dv2dz, dv2ijx, dv2ijy, dv2ijz, dv2j, dv3dz, dv3l, dv3ljx, dv3ljy, dv3ljz, &
1652 dv3lkx, dv3lky, dv3lkz, dv3rij, dv3rijx, dv3rijy, dv3rijz, dv3rik, dv3rikx, dv3riky, &
1653 dv3rikz, dwinv, dx, dxdz, dy, dz, ener_iat, fjx, fjy, fjz, fkx, fky, fkz, fz, h, lcos, &
1654 muhalf, par_a, par_alp, par_b, par_bet, par_bg, par_c, par_cap_a, par_cap_b, par_delta, &
1655 par_eta, par_gam, par_lam, par_mu, par_palp, par_qo, par_rh, par_sig, pz, qort, r, rinv, &
1656 rmainv, rmbinv, tau, temp0, temp1, u1, u2, u3, u4, u5, winv, x, xarg
1657 REAL(kind=
dp) :: xinv, xinv3, z
1668 par_cap_a = 5.6714030e0_dp
1669 par_cap_b = 2.0002804e0_dp
1670 par_rh = 1.2085196e0_dp
1671 par_a = 3.1213820e0_dp
1672 par_sig = 0.5774108e0_dp
1673 par_lam = 1.4533108e0_dp
1674 par_gam = 1.1247945e0_dp
1675 par_b = 3.1213820e0_dp
1676 par_c = 2.5609104e0_dp
1677 par_delta = 78.7590539e0_dp
1678 par_mu = 0.6966326e0_dp
1679 par_qo = 312.1341346e0_dp
1680 par_palp = 1.4074424e0_dp
1681 par_bet = 0.0070975e0_dp
1682 par_alp = 3.1083847e0_dp
1690 par_eta = par_delta/par_qo
1707 muhalf = par_mu*0.5e0_dp
1710 cmbinv = 1.0e0_dp/(par_c - par_b)
1714 atoms:
DO i = iat1, iat2
1727 DO n = lsta(1, i), lsta(2, i)
1738 rmainv = 1.e0_dp/(r - par_a)
1739 s2_t0(n2) = par_cap_a*exp(par_sig*rmainv)
1740 s2_t1(n2) = (par_cap_b*rinv)**par_rh
1741 s2_t2(n2) = par_rh*rinv
1742 s2_t3(n2) = par_sig*rmainv*rmainv
1748 IF (n2 > max_nbrs)
THEN
1755 IF (r <= 2.36e0_dp)
THEN
1756 coord_iat = coord_iat + 1.e0_dp
1757 ELSE IF (r >= 3.12e0_dp)
THEN
1759 xarg = (r - 2.36e0_dp)*(1.e0_dp/(3.12e0_dp - 2.36e0_dp))
1760 coord_iat = coord_iat + (2*xarg + 1.e0_dp)*(xarg - 1.e0_dp)**2
1765 IF (r < par_bg)
THEN
1768 rmbinv = 1.e0_dp/(r - par_bg)
1769 temp1 = par_gam*rmbinv
1772 s3_dg(n3) = -rmbinv*temp1*temp0
1779 IF (n3 > max_nbrs)
THEN
1790 xinv = bmc/(r - par_c)
1791 xinv3 = xinv*xinv*xinv
1792 den = 1.e0_dp/(1 - xinv3)
1797 sz_df(nz) = fz*temp1*den*3.e0_dp*xinv3*xinv*cmbinv
1804 IF (nz > max_nbrs)
THEN
1819 sz_sum(nl) = 0.e0_dp
1825 pz = par_palp*exp(-temp0*z)
1827 dp1 = -2.e0_dp*temp0*pz
1834 temp0 = s2_t1(nj) - pz
1838 ener_iat = ener_iat + temp0*s2_t0(nj)
1842 dv2j = -s2_t0(nj)*(s2_t1(nj)*s2_t2(nj) + temp0*s2_t3(nj))
1844 dv2ijx = dv2j*s2_dx(nj)
1845 dv2ijy = dv2j*s2_dy(nj)
1846 dv2ijz = dv2j*s2_dz(nj)
1847 ff(1, i) = ff(1, i) + dv2ijx
1848 ff(2, i) = ff(2, i) + dv2ijy
1849 ff(3, i) = ff(3, i) + dv2ijz
1851 ff(1, j) = ff(1, j) - dv2ijx
1852 ff(2, j) = ff(2, j) - dv2ijy
1853 ff(3, j) = ff(3, j) - dv2ijz
1857 dv2dz = -dp1*s2_t0(nj)
1859 sz_sum(nl) = sz_sum(nl) + dv2dz
1866 winv = qort*exp(-muhalf*z)
1868 dwinv = -muhalf*winv
1871 tau = u1 + u2*temp0*(u3 - temp0)
1873 dtau = u5*temp0*(2*temp0 - u3)
1884 DO nk = nj + 1, n3 - 1
1890 lcos = s3_dx(nj)*s3_dx(nk) + s3_dy(nj)*s3_dy(nk) + s3_dz(nj)*s3_dz(nk)
1891 x = (lcos + tau)*winv
1894 h = par_lam*(1 - temp0 + par_eta*x*x)
1895 dhdx = 2*par_lam*x*(temp0 + par_eta)
1901 temp1 = s3_g(nj)*s3_g(nk)
1902 ener_iat = ener_iat + temp1*h
1906 dv3rij = s3_dg(nj)*s3_g(nk)*h
1907 dv3rijx = dv3rij*s3_dx(nj)
1908 dv3rijy = dv3rij*s3_dy(nj)
1909 dv3rijz = dv3rij*s3_dz(nj)
1916 dv3rik = s3_g(nj)*s3_dg(nk)*h
1917 dv3rikx = dv3rik*s3_dx(nk)
1918 dv3riky = dv3rik*s3_dy(nk)
1919 dv3rikz = dv3rik*s3_dz(nk)
1927 dv3ljx = dv3l*(s3_dx(nk) - lcos*s3_dx(nj))*s3_rinv(nj)
1928 dv3ljy = dv3l*(s3_dy(nk) - lcos*s3_dy(nj))*s3_rinv(nj)
1929 dv3ljz = dv3l*(s3_dz(nk) - lcos*s3_dz(nj))*s3_rinv(nj)
1936 dv3lkx = dv3l*(s3_dx(nj) - lcos*s3_dx(nk))*s3_rinv(nk)
1937 dv3lky = dv3l*(s3_dy(nj) - lcos*s3_dy(nk))*s3_rinv(nk)
1938 dv3lkz = dv3l*(s3_dz(nj) - lcos*s3_dz(nk))*s3_rinv(nk)
1945 ff(1, j) = ff(1, j) - fjx
1946 ff(2, j) = ff(2, j) - fjy
1947 ff(3, j) = ff(3, j) - fjz
1948 ff(1, k) = ff(1, k) - fkx
1949 ff(2, k) = ff(2, k) - fky
1950 ff(3, k) = ff(3, k) - fkz
1951 ff(1, i) = ff(1, i) + fjx + fkx
1952 ff(2, i) = ff(2, i) + fjy + fky
1953 ff(3, i) = ff(3, i) + fjz + fkz
1956 dxdz = dwinv*(lcos + tau) + winv*dtau
1957 dv3dz = temp1*dhdx*dxdz
1962 sz_sum(nl) = sz_sum(nl) + dv3dz
1971 dedrl = sz_sum(nl)*sz_df(nl)
1972 dedrlx = dedrl*sz_dx(nl)
1973 dedrly = dedrl*sz_dy(nl)
1974 dedrlz = dedrl*sz_dz(nl)
1975 ff(1, i) = ff(1, i) + dedrlx
1976 ff(2, i) = ff(2, i) + dedrly
1977 ff(3, i) = ff(3, i) + dedrlz
1979 ff(1, l) = ff(1, l) - dedrlx
1980 ff(2, l) = ff(2, l) - dedrly
1981 ff(3, l) = ff(3, l) - dedrlz
1985 coord = coord + coord_iat
1986 coord2 = coord2 + coord_iat**2
1987 ener = ener + ener_iat
1988 ener2 = ener2 + ener_iat**2
1993 END SUBROUTINE subfeniat_b
2015 SUBROUTINE sublstiat_b(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
2016 rxyz, icell, lstb, lay, rel, cut2, indlst)
2019 INTEGER :: iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, &
2021 REAL(kind=
dp) :: rxyz(3, nn)
2022 INTEGER :: icell(0:ncx, -1:ll1, -1:ll2, -1:ll3), lstb(0:myspace - 1), lay(nn)
2023 REAL(kind=
dp) :: rel(5, 0:myspace - 1), cut2
2026 INTEGER :: jat, jj, k1, k2, k3
2027 REAL(kind=
dp) :: rr2, tt, tti, xrel, yrel, zrel
2029 DO k3 = l3 - 1, l3 + 1
2030 DO k2 = l2 - 1, l2 + 1
2031 DO k1 = l1 - 1, l1 + 1
2032 DO jj = 1, icell(0, k1, k2, k3)
2033 jat = icell(jj, k1, k2, k3)
2034 IF (jat == iat) cycle
2035 xrel = rxyz(1, iat) - rxyz(1, jat)
2036 yrel = rxyz(2, iat) - rxyz(2, jat)
2037 zrel = rxyz(3, iat) - rxyz(3, jat)
2038 rr2 = xrel**2 + yrel**2 + zrel**2
2039 IF (rr2 <= cut2)
THEN
2040 indlst = min(indlst, myspace - 1)
2041 lstb(indlst) = lay(jat)
2045 rel(1, indlst) = xrel*tti
2046 rel(2, indlst) = yrel*tti
2047 rel(3, indlst) = zrel*tti
2049 rel(5, indlst) = tti
2058 END SUBROUTINE sublstiat_b
2084 SUBROUTINE eip_lenosky_silicon(nat, alat, rxyz0, fxyz, ener, coord, ener_var, &
2088 REAL(kind=
dp) :: alat(3), rxyz0(3, nat), fxyz(3, nat), &
2089 ener, coord, ener_var, coord_var, count
2091 INTEGER :: i, iam, iat, iat1, iat2, ii, il, in, indlst, indlstx, istop, istopg, l1, l2, l3, &
2092 laymx, ll1, ll2, ll3, lot, myspace, myspaceout, ncx, nn, nnbrx, npjkx, npjx, npr, rlc1i, &
2094 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: lay, lstb
2095 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: lsta
2096 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :, :) :: icell
2097 INTEGER,
SAVE :: monitor_unit = -1
2098 REAL(kind=
dp) :: coord2, cut, cut2, ener2, tcoord, &
2099 tcoord2, tener, tener2
2100 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: f2ij, f3ij, f3ik, rel, rxyz, txyz
2106 cut = 0.4500000e+01_dp
2109 IF (monitor_unit < 1)
THEN
2110 CALL open_file(file_name=
"lenosky.mon", file_status=
"UNKNOWN", &
2111 file_action=
"WRITE", file_position=
"ASIS", &
2112 unit_number=monitor_unit)
2114 count = count + 1.e0_dp
2117 ll1 = int(alat(1)/cut)
2118 IF (ll1 < 1) cpabort(
"alat(1) too small")
2119 ll2 = int(alat(2)/cut)
2120 IF (ll2 < 1) cpabort(
"alat(2) too small")
2121 ll3 = int(alat(3)/cut)
2122 IF (ll3 < 1) cpabort(
"alat(3) too small")
2138 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
2139 icell(0, -1:ll1, -1:ll2, -1:ll3) = 0
2140 rlc1i = int(ll1/alat(1))
2141 rlc2i = int(ll2/alat(2))
2142 rlc3i = int(ll3/alat(3))
2144 loop_iat_s:
DO iat = 1, nat
2145 rxyz0(1, iat) =
modulo(
modulo(rxyz0(1, iat), alat(1)), alat(1))
2146 rxyz0(2, iat) =
modulo(
modulo(rxyz0(2, iat), alat(2)), alat(2))
2147 rxyz0(3, iat) =
modulo(
modulo(rxyz0(3, iat), alat(3)), alat(3))
2148 l1 = int(rxyz0(1, iat)*rlc1i)
2149 l2 = int(rxyz0(2, iat)*rlc2i)
2150 l3 = int(rxyz0(3, iat)*rlc3i)
2152 ii = icell(0, l1, l2, l3)
2154 icell(0, l1, l2, l3) = ii
2156 WRITE (unit=monitor_unit, fmt=*) count,
'NCX too small', ncx
2161 icell(ii, l1, l2, l3) = iat
2171 rxyz0(1, iat) =
modulo(
modulo(rxyz0(1, iat), alat(1)), alat(1))
2172 rxyz0(2, iat) =
modulo(
modulo(rxyz0(2, iat), alat(2)), alat(2))
2173 rxyz0(3, iat) =
modulo(
modulo(rxyz0(3, iat), alat(3)), alat(3))
2181 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
2182 icell(0, -1:ll1, -1:ll2, -1:ll3) = 0
2183 rlc1i = int(ll1/alat(1))
2184 rlc2i = int(ll2/alat(2))
2185 rlc3i = int(ll3/alat(3))
2187 loop_iat_p:
DO iat = 1, nat
2188 l1 = int(rxyz0(1, iat)*rlc1i)
2189 l2 = int(rxyz0(2, iat)*rlc2i)
2190 l3 = int(rxyz0(3, iat)*rlc3i)
2191 ii = icell(0, l1, l2, l3)
2193 icell(0, l1, l2, l3) = ii
2195 WRITE (unit=monitor_unit, fmt=*) count,
'NCX too small', ncx
2200 icell(ii, l1, l2, l3) = iat
2208 laymx = ncx*(2*ll1*ll2 + 2*ll1*ll3 + 2*ll2*ll3 + 4*ll1 + 4*ll2 + 4*ll3 + 8)
2210 ALLOCATE (rxyz(3, nn), lay(nn))
2213 rxyz(1, iat) = rxyz0(1, iat)
2214 rxyz(2, iat) = rxyz0(2, iat)
2215 rxyz(3, iat) = rxyz0(3, iat)
2222 in = icell(0, l1, l2, 0)
2223 icell(0, l1, l2, ll3) = in
2225 i = icell(ii, l1, l2, 0)
2227 IF (il > nn) cpabort(
"enlarge laymx")
2229 icell(ii, l1, l2, ll3) = il
2230 rxyz(1, il) = rxyz(1, i)
2231 rxyz(2, il) = rxyz(2, i)
2232 rxyz(3, il) = rxyz(3, i) + alat(3)
2235 in = icell(0, l1, l2, ll3 - 1)
2236 icell(0, l1, l2, -1) = in
2238 i = icell(ii, l1, l2, ll3 - 1)
2240 IF (il > nn) cpabort(
"enlarge laymx")
2242 icell(ii, l1, l2, -1) = il
2243 rxyz(1, il) = rxyz(1, i)
2244 rxyz(2, il) = rxyz(2, i)
2245 rxyz(3, il) = rxyz(3, i) - alat(3)
2255 in = icell(0, 0, l2, l3)
2256 icell(0, ll1, l2, l3) = in
2258 i = icell(ii, 0, l2, l3)
2260 IF (il > nn) cpabort(
"enlarge laymx")
2262 icell(ii, ll1, l2, l3) = il
2263 rxyz(1, il) = rxyz(1, i) + alat(1)
2264 rxyz(2, il) = rxyz(2, i)
2265 rxyz(3, il) = rxyz(3, i)
2268 in = icell(0, ll1 - 1, l2, l3)
2269 icell(0, -1, l2, l3) = in
2271 i = icell(ii, ll1 - 1, l2, l3)
2273 IF (il > nn) cpabort(
"enlarge laymx")
2275 icell(ii, -1, l2, l3) = il
2276 rxyz(1, il) = rxyz(1, i) - alat(1)
2277 rxyz(2, il) = rxyz(2, i)
2278 rxyz(3, il) = rxyz(3, i)
2288 in = icell(0, l1, 0, l3)
2289 icell(0, l1, ll2, l3) = in
2291 i = icell(ii, l1, 0, l3)
2293 IF (il > nn) cpabort(
"enlarge laymx")
2295 icell(ii, l1, ll2, l3) = il
2296 rxyz(1, il) = rxyz(1, i)
2297 rxyz(2, il) = rxyz(2, i) + alat(2)
2298 rxyz(3, il) = rxyz(3, i)
2301 in = icell(0, l1, ll2 - 1, l3)
2302 icell(0, l1, -1, l3) = in
2304 i = icell(ii, l1, ll2 - 1, l3)
2306 IF (il > nn) cpabort(
"enlarge laymx")
2308 icell(ii, l1, -1, l3) = il
2309 rxyz(1, il) = rxyz(1, i)
2310 rxyz(2, il) = rxyz(2, i) - alat(2)
2311 rxyz(3, il) = rxyz(3, i)
2320 in = icell(0, l1, 0, 0)
2321 icell(0, l1, ll2, ll3) = in
2323 i = icell(ii, l1, 0, 0)
2325 IF (il > nn) cpabort(
"enlarge laymx")
2327 icell(ii, l1, ll2, ll3) = il
2328 rxyz(1, il) = rxyz(1, i)
2329 rxyz(2, il) = rxyz(2, i) + alat(2)
2330 rxyz(3, il) = rxyz(3, i) + alat(3)
2333 in = icell(0, l1, 0, ll3 - 1)
2334 icell(0, l1, ll2, -1) = in
2336 i = icell(ii, l1, 0, ll3 - 1)
2338 IF (il > nn) cpabort(
"enlarge laymx")
2340 icell(ii, l1, ll2, -1) = il
2341 rxyz(1, il) = rxyz(1, i)
2342 rxyz(2, il) = rxyz(2, i) + alat(2)
2343 rxyz(3, il) = rxyz(3, i) - alat(3)
2346 in = icell(0, l1, ll2 - 1, 0)
2347 icell(0, l1, -1, ll3) = in
2349 i = icell(ii, l1, ll2 - 1, 0)
2351 IF (il > nn) cpabort(
"enlarge laymx")
2353 icell(ii, l1, -1, ll3) = il
2354 rxyz(1, il) = rxyz(1, i)
2355 rxyz(2, il) = rxyz(2, i) - alat(2)
2356 rxyz(3, il) = rxyz(3, i) + alat(3)
2359 in = icell(0, l1, ll2 - 1, ll3 - 1)
2360 icell(0, l1, -1, -1) = in
2362 i = icell(ii, l1, ll2 - 1, ll3 - 1)
2364 IF (il > nn) cpabort(
"enlarge laymx")
2366 icell(ii, l1, -1, -1) = il
2367 rxyz(1, il) = rxyz(1, i)
2368 rxyz(2, il) = rxyz(2, i) - alat(2)
2369 rxyz(3, il) = rxyz(3, i) - alat(3)
2377 in = icell(0, 0, l2, 0)
2378 icell(0, ll1, l2, ll3) = in
2380 i = icell(ii, 0, l2, 0)
2382 IF (il > nn) cpabort(
"enlarge laymx")
2384 icell(ii, ll1, l2, ll3) = il
2385 rxyz(1, il) = rxyz(1, i) + alat(1)
2386 rxyz(2, il) = rxyz(2, i)
2387 rxyz(3, il) = rxyz(3, i) + alat(3)
2390 in = icell(0, 0, l2, ll3 - 1)
2391 icell(0, ll1, l2, -1) = in
2393 i = icell(ii, 0, l2, ll3 - 1)
2395 IF (il > nn) cpabort(
"enlarge laymx")
2397 icell(ii, ll1, l2, -1) = il
2398 rxyz(1, il) = rxyz(1, i) + alat(1)
2399 rxyz(2, il) = rxyz(2, i)
2400 rxyz(3, il) = rxyz(3, i) - alat(3)
2403 in = icell(0, ll1 - 1, l2, 0)
2404 icell(0, -1, l2, ll3) = in
2406 i = icell(ii, ll1 - 1, l2, 0)
2408 IF (il > nn) cpabort(
"enlarge laymx")
2410 icell(ii, -1, l2, ll3) = il
2411 rxyz(1, il) = rxyz(1, i) - alat(1)
2412 rxyz(2, il) = rxyz(2, i)
2413 rxyz(3, il) = rxyz(3, i) + alat(3)
2416 in = icell(0, ll1 - 1, l2, ll3 - 1)
2417 icell(0, -1, l2, -1) = in
2419 i = icell(ii, ll1 - 1, l2, ll3 - 1)
2421 IF (il > nn) cpabort(
"enlarge laymx")
2423 icell(ii, -1, l2, -1) = il
2424 rxyz(1, il) = rxyz(1, i) - alat(1)
2425 rxyz(2, il) = rxyz(2, i)
2426 rxyz(3, il) = rxyz(3, i) - alat(3)
2434 in = icell(0, 0, 0, l3)
2435 icell(0, ll1, ll2, l3) = in
2437 i = icell(ii, 0, 0, l3)
2439 IF (il > nn) cpabort(
"enlarge laymx")
2441 icell(ii, ll1, ll2, l3) = il
2442 rxyz(1, il) = rxyz(1, i) + alat(1)
2443 rxyz(2, il) = rxyz(2, i) + alat(2)
2444 rxyz(3, il) = rxyz(3, i)
2447 in = icell(0, ll1 - 1, 0, l3)
2448 icell(0, -1, ll2, l3) = in
2450 i = icell(ii, ll1 - 1, 0, l3)
2452 IF (il > nn) cpabort(
"enlarge laymx")
2454 icell(ii, -1, ll2, l3) = il
2455 rxyz(1, il) = rxyz(1, i) - alat(1)
2456 rxyz(2, il) = rxyz(2, i) + alat(2)
2457 rxyz(3, il) = rxyz(3, i)
2460 in = icell(0, 0, ll2 - 1, l3)
2461 icell(0, ll1, -1, l3) = in
2463 i = icell(ii, 0, ll2 - 1, l3)
2465 IF (il > nn) cpabort(
"enlarge laymx")
2467 icell(ii, ll1, -1, l3) = il
2468 rxyz(1, il) = rxyz(1, i) + alat(1)
2469 rxyz(2, il) = rxyz(2, i) - alat(2)
2470 rxyz(3, il) = rxyz(3, i)
2473 in = icell(0, ll1 - 1, ll2 - 1, l3)
2474 icell(0, -1, -1, l3) = in
2476 i = icell(ii, ll1 - 1, ll2 - 1, l3)
2478 IF (il > nn) cpabort(
"enlarge laymx")
2480 icell(ii, -1, -1, l3) = il
2481 rxyz(1, il) = rxyz(1, i) - alat(1)
2482 rxyz(2, il) = rxyz(2, i) - alat(2)
2483 rxyz(3, il) = rxyz(3, i)
2489 in = icell(0, 0, 0, 0)
2490 icell(0, ll1, ll2, ll3) = in
2492 i = icell(ii, 0, 0, 0)
2494 IF (il > nn) cpabort(
"enlarge laymx")
2496 icell(ii, ll1, ll2, ll3) = il
2497 rxyz(1, il) = rxyz(1, i) + alat(1)
2498 rxyz(2, il) = rxyz(2, i) + alat(2)
2499 rxyz(3, il) = rxyz(3, i) + alat(3)
2502 in = icell(0, ll1 - 1, 0, 0)
2503 icell(0, -1, ll2, ll3) = in
2505 i = icell(ii, ll1 - 1, 0, 0)
2507 IF (il > nn) cpabort(
"enlarge laymx")
2509 icell(ii, -1, ll2, ll3) = il
2510 rxyz(1, il) = rxyz(1, i) - alat(1)
2511 rxyz(2, il) = rxyz(2, i) + alat(2)
2512 rxyz(3, il) = rxyz(3, i) + alat(3)
2515 in = icell(0, 0, ll2 - 1, 0)
2516 icell(0, ll1, -1, ll3) = in
2518 i = icell(ii, 0, ll2 - 1, 0)
2520 IF (il > nn) cpabort(
"enlarge laymx")
2522 icell(ii, ll1, -1, ll3) = il
2523 rxyz(1, il) = rxyz(1, i) + alat(1)
2524 rxyz(2, il) = rxyz(2, i) - alat(2)
2525 rxyz(3, il) = rxyz(3, i) + alat(3)
2528 in = icell(0, ll1 - 1, ll2 - 1, 0)
2529 icell(0, -1, -1, ll3) = in
2531 i = icell(ii, ll1 - 1, ll2 - 1, 0)
2533 IF (il > nn) cpabort(
"enlarge laymx")
2535 icell(ii, -1, -1, ll3) = il
2536 rxyz(1, il) = rxyz(1, i) - alat(1)
2537 rxyz(2, il) = rxyz(2, i) - alat(2)
2538 rxyz(3, il) = rxyz(3, i) + alat(3)
2541 in = icell(0, 0, 0, ll3 - 1)
2542 icell(0, ll1, ll2, -1) = in
2544 i = icell(ii, 0, 0, ll3 - 1)
2546 IF (il > nn) cpabort(
"enlarge laymx")
2548 icell(ii, ll1, ll2, -1) = il
2549 rxyz(1, il) = rxyz(1, i) + alat(1)
2550 rxyz(2, il) = rxyz(2, i) + alat(2)
2551 rxyz(3, il) = rxyz(3, i) - alat(3)
2554 in = icell(0, ll1 - 1, 0, ll3 - 1)
2555 icell(0, -1, ll2, -1) = in
2557 i = icell(ii, ll1 - 1, 0, ll3 - 1)
2559 IF (il > nn) cpabort(
"enlarge laymx")
2561 icell(ii, -1, ll2, -1) = il
2562 rxyz(1, il) = rxyz(1, i) - alat(1)
2563 rxyz(2, il) = rxyz(2, i) + alat(2)
2564 rxyz(3, il) = rxyz(3, i) - alat(3)
2567 in = icell(0, 0, ll2 - 1, ll3 - 1)
2568 icell(0, ll1, -1, -1) = in
2570 i = icell(ii, 0, ll2 - 1, ll3 - 1)
2572 IF (il > nn) cpabort(
"enlarge laymx")
2574 icell(ii, ll1, -1, -1) = il
2575 rxyz(1, il) = rxyz(1, i) + alat(1)
2576 rxyz(2, il) = rxyz(2, i) - alat(2)
2577 rxyz(3, il) = rxyz(3, i) - alat(3)
2580 in = icell(0, ll1 - 1, ll2 - 1, ll3 - 1)
2581 icell(0, -1, -1, -1) = in
2583 i = icell(ii, ll1 - 1, ll2 - 1, ll3 - 1)
2585 IF (il > nn) cpabort(
"enlarge laymx")
2587 icell(ii, -1, -1, -1) = il
2588 rxyz(1, il) = rxyz(1, i) - alat(1)
2589 rxyz(2, il) = rxyz(2, i) - alat(2)
2590 rxyz(3, il) = rxyz(3, i) - alat(3)
2593 ALLOCATE (lsta(2, nat))
2596 ALLOCATE (lstb(nnbrx*nat), rel(5, nnbrx*nat))
2612 myspace = (nat*nnbrx)/npr
2613 IF (iam == 0) myspaceout = myspace
2616 loop_l3:
DO l3 = 0, ll3 - 1
2617 loop_l2:
DO l2 = 0, ll2 - 1
2618 loop_l1:
DO l1 = 0, ll1 - 1
2619 loop_ii:
DO ii = 1, icell(0, l1, l2, l3)
2620 iat = icell(ii, l1, l2, l3)
2621 IF (((iat - 1)*npr)/nat == iam)
THEN
2623 lsta(1, iat) = iam*myspace + indlst + 1
2624 CALL sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
2625 rxyz, icell, lstb(iam*myspace + 1), lay, &
2626 rel(1, iam*myspace + 1), cut2, indlst)
2627 lsta(2, iat) = iam*myspace + indlst
2638 indlstx = max(indlstx, indlst)
2642 IF (indlstx >= myspaceout)
THEN
2643 WRITE (unit=monitor_unit, fmt=*) count,
'NNBRX too small', nnbrx
2644 DEALLOCATE (lstb, rel)
2662 npjx = 300; npjkx = 6000
2669 ALLOCATE (txyz(3, nat), f2ij(3, npjx), f3ij(3, npjkx), f3ik(3, npjkx))
2679 fxyz(1, iat) = 0.e0_dp
2680 fxyz(2, iat) = 0.e0_dp
2681 fxyz(3, iat) = 0.e0_dp
2686 lot = int(real(nat, kind=
dp)/real(npr, kind=
dp) + .999999999999e0_dp)
2688 iat2 = min((iam + 1)*lot, nat)
2690 CALL subfeniat_l(iat1, iat2, nat, lsta, lstb, rel, tener, tener2, &
2691 tcoord, tcoord2, nnbrx, txyz, f2ij, npjx, f3ij, npjkx, f3ik, istop)
2694 ener2 = ener2 + tener2
2695 coord = coord + tcoord
2696 coord2 = coord2 + tcoord2
2697 istopg = max(istopg, istop)
2699 fxyz(1, iat) = fxyz(1, iat) + txyz(1, iat)
2700 fxyz(2, iat) = fxyz(2, iat) + txyz(2, iat)
2701 fxyz(3, iat) = fxyz(3, iat) + txyz(3, iat)
2703 DEALLOCATE (txyz, f2ij, f3ij, f3ik)
2710 ALLOCATE (f2ij(3, npjx), f3ij(3, npjkx), f3ik(3, npjkx))
2711 CALL subfeniat_l(iat1, iat2, nat, lsta, lstb, rel, ener, ener2, &
2712 coord, coord2, nnbrx, fxyz, f2ij, npjx, f3ij, npjkx, f3ik, istopg)
2713 DEALLOCATE (f2ij, f3ij, f3ik)
2718 SELECT CASE (istopg)
2720 cpabort(
"DIMENSION ERROR: npjx is too small")
2722 cpabort(
"DIMENSION ERROR: npjkx is too small")
2724 ener_var = ener2/nat - (ener/nat)**2
2726 coord_var = coord2/nat - coord**2
2728 DEALLOCATE (rxyz, icell, lay, lsta, lstb, rel)
2730 END SUBROUTINE eip_lenosky_silicon
2753 SUBROUTINE subfeniat_l(iat1, iat2, nat, lsta, lstb, rel, tener, tener2, &
2754 tcoord, tcoord2, nnbrx, txyz, f2ij, npjx, f3ij, npjkx, f3ik, istop)
2760 INTEGER :: iat1, iat2, nat, lsta(2, nat)
2761 REAL(kind=
dp) :: tener, tener2, tcoord, tcoord2
2763 REAL(kind=
dp) :: rel(5, nnbrx*nat)
2764 INTEGER :: lstb(nnbrx*nat)
2765 REAL(kind=
dp) :: txyz(3, nat)
2767 REAL(kind=
dp) :: f2ij(3, npjx)
2769 REAL(kind=
dp) :: f3ij(3, npjkx), f3ik(3, npjkx)
2772 REAL(kind=
dp),
DIMENSION(0:10),
PARAMETER :: cof_rho = [0.13747000000000e+00_dp, &
2773 -0.14831000000000e+00_dp, -0.55972000000000e+00_dp, -0.73110000000000e+00_dp, &
2774 -0.76283000000000e+00_dp, -0.72918000000000e+00_dp, -0.66620000000000e+00_dp, &
2775 -0.57328000000000e+00_dp, -0.40690000000000e+00_dp, -0.16662000000000e+00_dp, &
2776 0.00000000000000e+00_dp]
2777 REAL(kind=
dp),
DIMENSION(0:10),
PARAMETER :: dof_rho = [-0.32275496741918e+01_dp, &
2778 -0.64119006516165e+01_dp, 0.10030652280658e+02_dp, 0.22937915289857e+01_dp, &
2779 0.17416816033995e+01_dp, 0.54648205741626e+00_dp, 0.47189016693543e+00_dp, &
2780 0.20569572748420e+01_dp, 0.23192807336964e+01_dp, -0.24908020962757e+00_dp, &
2781 -0.12371959895186e+02_dp]
2782 REAL(kind=
dp),
DIMENSION(0:7),
PARAMETER :: cof_ggg = [0.52541600000000e+01_dp, &
2783 0.23591500000000e+01_dp, 0.11959500000000e+01_dp, 0.12299500000000e+01_dp, &
2784 0.20356500000000e+01_dp, 0.34247400000000e+01_dp, 0.49485900000000e+01_dp, &
2785 0.56179900000000e+01_dp], cof_uuu = [-0.10749300000000e+01_dp, -0.20045000000000e+00_dp, &
2786 0.41422000000000e+00_dp, 0.87939000000000e+00_dp, 0.12668900000000e+01_dp, &
2787 0.16299800000000e+01_dp, 0.19773800000000e+01_dp, 0.23961800000000e+01_dp]
2788 REAL(kind=
dp),
DIMENSION(0:7),
PARAMETER :: dof_ggg = [0.15826876132396e+02_dp, &
2789 0.31176239377907e+02_dp, 0.16589446539683e+02_dp, 0.11083892500520e+02_dp, &
2790 0.90887216383860e+01_dp, 0.54902279653967e+01_dp, -0.18823313223755e+02_dp, &
2791 -0.77183416481005e+01_dp], dof_uuu = [-0.14827125747284e+00_dp, -0.14922155328475e+00_dp, &
2792 -0.70113224223509e-01_dp, -0.39449020349230e-01_dp, -0.15815242579643e-01_dp, &
2793 0.26112640061855e-01_dp, -0.13786974745095e+00_dp, 0.74941595372657e+00_dp]
2794 REAL(kind=
dp),
DIMENSION(0:9),
PARAMETER :: cof_fff = [0.12503100000000e+01_dp, &
2795 0.86821000000000e+00_dp, 0.60846000000000e+00_dp, 0.48756000000000e+00_dp, &
2796 0.44163000000000e+00_dp, 0.37610000000000e+00_dp, 0.27145000000000e+00_dp, &
2797 0.14814000000000e+00_dp, 0.48550000000000e-01_dp, 0.00000000000000e+00_dp], cof_phi = [ &
2798 0.69299400000000e+01_dp, -0.43995000000000e+00_dp, -0.17012300000000e+01_dp, &
2799 -0.16247300000000e+01_dp, -0.99696000000000e+00_dp, -0.27391000000000e+00_dp, &
2800 -0.24990000000000e-01_dp, -0.17840000000000e-01_dp, -0.96100000000000e-02_dp, &
2801 0.00000000000000e+00_dp]
2802 REAL(kind=
dp),
DIMENSION(0:9),
PARAMETER :: dof_fff = [0.27904652711432e+02_dp, &
2803 -0.45230754228635e+01_dp, 0.50531739800222e+01_dp, 0.11806545027747e+01_dp, &
2804 -0.66693699112098e+00_dp, -0.89430653829079e+00_dp, -0.50891685571587e+00_dp, &
2805 0.66278396115427e+00_dp, 0.73976101109878e+00_dp, 0.25795319944506e+01_dp], dof_phi = [ &
2806 0.16533229480429e+03_dp, 0.39415410391417e+02_dp, 0.68710036300407e+01_dp, &
2807 0.53406950884203e+01_dp, 0.15347960162782e+01_dp, -0.63347591535331e+01_dp, &
2808 -0.17987794021458e+01_dp, 0.47429676211617e+00_dp, -0.40087646318907e-01_dp, &
2809 -0.23942617684055e+00_dp]
2810 REAL(kind=
dp),
PARAMETER :: h2sixth_fff = 8.23045267489712e-003_dp, &
2811 h2sixth_ggg = 1.10221225156463e-002_dp, h2sixth_phi = 1.85185185185185e-002_dp, &
2812 h2sixth_rho = 6.66666666666667e-003_dp, h2sixth_uuu = 0.318679429600340e0_dp, &
2813 hi_fff = 4.50000000000e0_dp, hi_ggg = 3.88858644327663e0_dp, hi_phi = 3.00000000000e0_dp, &
2814 hi_rho = 5.00000000000e0_dp, hi_uuu = 0.723181585730594e0_dp, &
2815 hsixth_fff = 3.70370370370370e-002_dp, hsixth_ggg = 4.28604761904762e-002_dp, &
2816 hsixth_phi = 5.55555555555556e-002_dp, hsixth_rho = 3.33333333333333e-002_dp, &
2817 hsixth_uuu = 0.230463095238095e0_dp
2818 REAL(kind=
dp),
PARAMETER :: tmax_fff = 0.3500000e+01_dp, tmax_ggg = 0.8001400e+00_dp, &
2819 tmax_phi = 0.4500000e+01_dp, tmax_rho = 0.3500000e+01_dp, tmax_uuu = 0.7908520e+01_dp, &
2820 tmin_fff = 0.1500000e+01_dp, tmin_ggg = -0.1000000e+01_dp, tmin_phi = 0.1500000e+01_dp, &
2821 tmin_rho = 0.1500000e+01_dp, tmin_uuu = -0.1770930e+01_dp
2823 INTEGER :: iat, jat, jbr, jcnt, jkcnt, kat, kbr, &
2824 khi_fff, khi_ggg, klo_fff, klo_ggg
2825 REAL(kind=
dp) :: a2_fff, a2_ggg, a_fff, a_ggg, b2_fff, b2_ggg, b_fff, b_ggg, cof1_fff, &
2826 cof1_ggg, cof2_fff, cof2_ggg, cof3_fff, cof3_ggg, cof4_fff, cof4_ggg, cof_fff_khi, &
2827 cof_fff_klo, cof_ggg_khi, cof_ggg_klo, coord_iat, costheta, dens, dens2, dens3, &
2828 dof_fff_khi, dof_fff_klo, dof_ggg_khi, dof_ggg_klo, e_phi, e_uuu, ener_iat, ep_phi, &
2829 ep_uuu, fij, fijp, fik, fikp, fxij, fxik, fyij, fyik, fzij, fzik, gjik, gjikp, rho, rhop, &
2830 rij, rik, sij, sik, t1, t2, t3, t4, tt, tt_fff, tt_ggg, xarg, ypt1_fff, ypt1_ggg, &
2831 ypt2_fff, ypt2_ggg, yt1_fff, yt1_ggg, yt2_fff, yt2_ggg
2841 txyz(1, iat) = 0.e0_dp
2842 txyz(2, iat) = 0.e0_dp
2843 txyz(3, iat) = 0.e0_dp
2848 forces_and_energy:
DO iat = iat1, iat2
2856 calculate:
DO jbr = lsta(1, iat), lsta(2, iat)
2859 IF (jcnt > npjx)
THEN
2872 IF (rij <= 2.36e0_dp)
THEN
2873 coord_iat = coord_iat + 1.e0_dp
2874 ELSE IF (rij >= 3.12e0_dp)
THEN
2876 xarg = (rij - 2.36e0_dp)*(1.e0_dp/(3.12e0_dp - 2.36e0_dp))
2877 coord_iat = coord_iat + (2*xarg + 1.e0_dp)*(xarg - 1.e0_dp)**2
2881 CALL splint(cof_phi, dof_phi, tmin_phi, tmax_phi, &
2882 hsixth_phi, h2sixth_phi, hi_phi, 10, rij, e_phi, ep_phi)
2883 ener_iat = ener_iat + (e_phi*.5e0_dp)
2884 txyz(1, iat) = txyz(1, iat) - fxij*(ep_phi*.5e0_dp)
2885 txyz(2, iat) = txyz(2, iat) - fyij*(ep_phi*.5e0_dp)
2886 txyz(3, iat) = txyz(3, iat) - fzij*(ep_phi*.5e0_dp)
2887 txyz(1, jat) = txyz(1, jat) + fxij*(ep_phi*.5e0_dp)
2888 txyz(2, jat) = txyz(2, jat) + fyij*(ep_phi*.5e0_dp)
2889 txyz(3, jat) = txyz(3, jat) + fzij*(ep_phi*.5e0_dp)
2892 CALL splint(cof_rho, dof_rho, tmin_rho, tmax_rho, &
2893 hsixth_rho, h2sixth_rho, hi_rho, 11, rij, rho, rhop)
2895 f2ij(1, jcnt) = fxij*rhop
2896 f2ij(2, jcnt) = fyij*rhop
2897 f2ij(3, jcnt) = fzij*rhop
2900 CALL splint(cof_fff, dof_fff, tmin_fff, tmax_fff, &
2901 hsixth_fff, h2sixth_fff, hi_fff, 10, rij, fij, fijp)
2903 embed_3body:
DO kbr = lsta(1, iat), lsta(2, iat)
2907 IF (jkcnt > npjkx)
THEN
2928 IF (rik > tmax_fff)
THEN
2929 fikp = 0.e0_dp; fik = 0.e0_dp
2930 gjik = 0.e0_dp; gjikp = 0.e0_dp; sik = 0.e0_dp
2931 costheta = 0.e0_dp; fxik = 0.e0_dp; fyik = 0.e0_dp; fzik = 0.e0_dp
2932 ELSE IF (rik < tmin_fff)
THEN
2936 costheta = fxij*fxik + fyij*fyik + fzij*fzik
2938 fikp = hi_fff*(cof_fff(1) - cof_fff(0)) - &
2939 (dof_fff(1) + 2.e0_dp*dof_fff(0))*hsixth_fff
2940 fik = cof_fff(0) + (rik - tmin_fff)*fikp
2941 tt_ggg = (costheta - tmin_ggg)*hi_ggg
2942 IF (costheta > tmax_ggg)
THEN
2943 gjikp = hi_ggg*(cof_ggg(8 - 1) - cof_ggg(8 - 2)) + &
2944 (2.e0_dp*dof_ggg(8 - 1) + dof_ggg(8 - 2))*hsixth_ggg
2945 gjik = cof_ggg(8 - 1) + (costheta - tmax_ggg)*gjikp
2947 klo_ggg = int(tt_ggg)
2948 khi_ggg = klo_ggg + 1
2949 cof_ggg_klo = cof_ggg(klo_ggg)
2950 dof_ggg_klo = dof_ggg(klo_ggg)
2951 b_ggg = tt_ggg - klo_ggg
2952 a_ggg = 1.e0_dp - b_ggg
2953 cof_ggg_khi = cof_ggg(khi_ggg)
2954 dof_ggg_khi = dof_ggg(khi_ggg)
2955 b2_ggg = b_ggg*b_ggg
2956 gjik = a_ggg*cof_ggg_klo
2957 gjikp = cof_ggg_khi - cof_ggg_klo
2958 a2_ggg = a_ggg*a_ggg
2959 cof1_ggg = a2_ggg - 1.e0_dp
2960 cof2_ggg = b2_ggg - 1.e0_dp
2961 gjik = gjik + b_ggg*cof_ggg_khi
2962 gjikp = hi_ggg*gjikp
2963 cof3_ggg = 3.e0_dp*b2_ggg
2964 cof4_ggg = 3.e0_dp*a2_ggg
2965 cof1_ggg = a_ggg*cof1_ggg
2966 cof2_ggg = b_ggg*cof2_ggg
2967 cof3_ggg = cof3_ggg - 1.e0_dp
2968 cof4_ggg = cof4_ggg - 1.e0_dp
2969 yt1_ggg = cof1_ggg*dof_ggg_klo
2970 yt2_ggg = cof2_ggg*dof_ggg_khi
2971 ypt1_ggg = cof3_ggg*dof_ggg_khi
2972 ypt2_ggg = cof4_ggg*dof_ggg_klo
2973 gjik = gjik + (yt1_ggg + yt2_ggg)*h2sixth_ggg
2974 gjikp = gjikp + (ypt1_ggg - ypt2_ggg)*hsixth_ggg
2978 tt_fff = rik - tmin_fff
2979 costheta = fxij*fxik
2981 tt_fff = tt_fff*hi_fff
2982 costheta = costheta + fyij*fyik
2984 klo_fff = int(tt_fff)
2985 costheta = costheta + fzij*fzik
2987 tt_ggg = (costheta - tmin_ggg)*hi_ggg
2988 IF (costheta > tmax_ggg)
THEN
2989 gjikp = hi_ggg*(cof_ggg(8 - 1) - cof_ggg(8 - 2)) + &
2990 (2.e0_dp*dof_ggg(8 - 1) + dof_ggg(8 - 2))*hsixth_ggg
2991 gjik = cof_ggg(8 - 1) + (costheta - tmax_ggg)*gjikp
2992 khi_fff = klo_fff + 1
2993 cof_fff_klo = cof_fff(klo_fff)
2994 dof_fff_klo = dof_fff(klo_fff)
2995 b_fff = tt_fff - klo_fff
2996 a_fff = 1.e0_dp - b_fff
2997 cof_fff_khi = cof_fff(khi_fff)
2998 dof_fff_khi = dof_fff(khi_fff)
2999 b2_fff = b_fff*b_fff
3000 fik = a_fff*cof_fff_klo
3001 fikp = cof_fff_khi - cof_fff_klo
3002 a2_fff = a_fff*a_fff
3003 cof1_fff = a2_fff - 1.e0_dp
3004 cof2_fff = b2_fff - 1.e0_dp
3005 fik = fik + b_fff*cof_fff_khi
3007 cof3_fff = 3.e0_dp*b2_fff
3008 cof4_fff = 3.e0_dp*a2_fff
3009 cof1_fff = a_fff*cof1_fff
3010 cof2_fff = b_fff*cof2_fff
3011 cof3_fff = cof3_fff - 1.e0_dp
3012 cof4_fff = cof4_fff - 1.e0_dp
3013 yt1_fff = cof1_fff*dof_fff_klo
3014 yt2_fff = cof2_fff*dof_fff_khi
3015 ypt1_fff = cof3_fff*dof_fff_khi
3016 ypt2_fff = cof4_fff*dof_fff_klo
3017 fik = fik + (yt1_fff + yt2_fff)*h2sixth_fff
3018 fikp = fikp + (ypt1_fff - ypt2_fff)*hsixth_fff
3020 klo_ggg = int(tt_ggg)
3021 khi_ggg = klo_ggg + 1
3022 khi_fff = klo_fff + 1
3023 cof_ggg_klo = cof_ggg(klo_ggg)
3024 cof_fff_klo = cof_fff(klo_fff)
3025 dof_ggg_klo = dof_ggg(klo_ggg)
3026 dof_fff_klo = dof_fff(klo_fff)
3027 b_ggg = tt_ggg - klo_ggg
3028 b_fff = tt_fff - klo_fff
3029 a_ggg = 1.e0_dp - b_ggg
3030 a_fff = 1.e0_dp - b_fff
3031 cof_ggg_khi = cof_ggg(khi_ggg)
3032 cof_fff_khi = cof_fff(khi_fff)
3033 dof_ggg_khi = dof_ggg(khi_ggg)
3034 dof_fff_khi = dof_fff(khi_fff)
3035 b2_ggg = b_ggg*b_ggg
3036 b2_fff = b_fff*b_fff
3037 gjik = a_ggg*cof_ggg_klo
3038 fik = a_fff*cof_fff_klo
3039 gjikp = cof_ggg_khi - cof_ggg_klo
3040 fikp = cof_fff_khi - cof_fff_klo
3041 a2_ggg = a_ggg*a_ggg
3042 a2_fff = a_fff*a_fff
3043 cof1_ggg = a2_ggg - 1.e0_dp
3044 cof1_fff = a2_fff - 1.e0_dp
3045 cof2_ggg = b2_ggg - 1.e0_dp
3046 cof2_fff = b2_fff - 1.e0_dp
3047 gjik = gjik + b_ggg*cof_ggg_khi
3048 fik = fik + b_fff*cof_fff_khi
3049 gjikp = hi_ggg*gjikp
3051 cof3_ggg = 3.e0_dp*b2_ggg
3052 cof3_fff = 3.e0_dp*b2_fff
3053 cof4_ggg = 3.e0_dp*a2_ggg
3054 cof4_fff = 3.e0_dp*a2_fff
3055 cof1_ggg = a_ggg*cof1_ggg
3056 cof1_fff = a_fff*cof1_fff
3057 cof2_ggg = b_ggg*cof2_ggg
3058 cof2_fff = b_fff*cof2_fff
3059 cof3_ggg = cof3_ggg - 1.e0_dp
3060 cof3_fff = cof3_fff - 1.e0_dp
3061 cof4_ggg = cof4_ggg - 1.e0_dp
3062 cof4_fff = cof4_fff - 1.e0_dp
3063 yt1_ggg = cof1_ggg*dof_ggg_klo
3064 yt1_fff = cof1_fff*dof_fff_klo
3065 yt2_ggg = cof2_ggg*dof_ggg_khi
3066 yt2_fff = cof2_fff*dof_fff_khi
3067 ypt1_ggg = cof3_ggg*dof_ggg_khi
3068 ypt1_fff = cof3_fff*dof_fff_khi
3069 ypt2_ggg = cof4_ggg*dof_ggg_klo
3070 ypt2_fff = cof4_fff*dof_fff_klo
3071 gjik = gjik + (yt1_ggg + yt2_ggg)*h2sixth_ggg
3072 fik = fik + (yt1_fff + yt2_fff)*h2sixth_fff
3073 gjikp = gjikp + (ypt1_ggg - ypt2_ggg)*hsixth_ggg
3074 fikp = fikp + (ypt1_fff - ypt2_fff)*hsixth_fff
3080 dens3 = dens3 + tt*gjik
3084 f3ij(1, jkcnt) = fxij*t1 + (fxik - fxij*costheta)*t2
3085 f3ij(2, jkcnt) = fyij*t1 + (fyik - fyij*costheta)*t2
3086 f3ij(3, jkcnt) = fzij*t1 + (fzik - fzij*costheta)*t2
3090 f3ik(1, jkcnt) = fxik*t3 + (fxij - fxik*costheta)*t4
3091 f3ik(2, jkcnt) = fyik*t3 + (fyij - fyik*costheta)*t4
3092 f3ik(3, jkcnt) = fzik*t3 + (fzij - fzik*costheta)*t4
3098 dens = dens2 + dens3
3099 CALL splint(cof_uuu, dof_uuu, tmin_uuu, tmax_uuu, &
3100 hsixth_uuu, h2sixth_uuu, hi_uuu, 8, dens, e_uuu, ep_uuu)
3101 ener_iat = ener_iat + e_uuu
3106 loop_again:
DO jbr = lsta(1, iat), lsta(2, iat)
3109 txyz(1, iat) = txyz(1, iat) - ep_uuu*f2ij(1, jcnt)
3110 txyz(2, iat) = txyz(2, iat) - ep_uuu*f2ij(2, jcnt)
3111 txyz(3, iat) = txyz(3, iat) - ep_uuu*f2ij(3, jcnt)
3112 txyz(1, jat) = txyz(1, jat) + ep_uuu*f2ij(1, jcnt)
3113 txyz(2, jat) = txyz(2, jat) + ep_uuu*f2ij(2, jcnt)
3114 txyz(3, jat) = txyz(3, jat) + ep_uuu*f2ij(3, jcnt)
3117 DO kbr = lsta(1, iat), lsta(2, iat)
3122 txyz(1, iat) = txyz(1, iat) - ep_uuu*(f3ij(1, jkcnt) + f3ik(1, jkcnt))
3123 txyz(2, iat) = txyz(2, iat) - ep_uuu*(f3ij(2, jkcnt) + f3ik(2, jkcnt))
3124 txyz(3, iat) = txyz(3, iat) - ep_uuu*(f3ij(3, jkcnt) + f3ik(3, jkcnt))
3125 txyz(1, jat) = txyz(1, jat) + ep_uuu*f3ij(1, jkcnt)
3126 txyz(2, jat) = txyz(2, jat) + ep_uuu*f3ij(2, jkcnt)
3127 txyz(3, jat) = txyz(3, jat) + ep_uuu*f3ij(3, jkcnt)
3128 txyz(1, kat) = txyz(1, kat) + ep_uuu*f3ik(1, jkcnt)
3129 txyz(2, kat) = txyz(2, kat) + ep_uuu*f3ik(2, jkcnt)
3130 txyz(3, kat) = txyz(3, kat) + ep_uuu*f3ik(3, jkcnt)
3138 tener = tener + ener_iat
3139 tener2 = tener2 + ener_iat**2
3140 tcoord = tcoord + coord_iat
3141 tcoord2 = tcoord2 + coord_iat**2
3143 END DO forces_and_energy
3145 END SUBROUTINE subfeniat_l
3167 SUBROUTINE sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
3168 rxyz, icell, lstb, lay, rel, cut2, indlst)
3171 INTEGER :: iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, &
3173 REAL(kind=
dp) :: rxyz(3, nn)
3174 INTEGER :: icell(0:ncx, -1:ll1, -1:ll2, -1:ll3), lstb(0:myspace - 1), lay(nn)
3175 REAL(kind=
dp) :: rel(5, 0:myspace - 1), cut2
3178 INTEGER :: jat, jj, k1, k2, k3
3179 REAL(kind=
dp) :: rr2, tt, tti, xrel, yrel, zrel
3181 loop_k3:
DO k3 = l3 - 1, l3 + 1
3182 loop_k2:
DO k2 = l2 - 1, l2 + 1
3183 loop_k1:
DO k1 = l1 - 1, l1 + 1
3184 loop_jj:
DO jj = 1, icell(0, k1, k2, k3)
3185 jat = icell(jj, k1, k2, k3)
3186 IF (jat == iat) cycle loop_k3
3187 xrel = rxyz(1, iat) - rxyz(1, jat)
3188 yrel = rxyz(2, iat) - rxyz(2, jat)
3189 zrel = rxyz(3, iat) - rxyz(3, jat)
3190 rr2 = xrel**2 + yrel**2 + zrel**2
3191 IF (rr2 <= cut2)
THEN
3192 indlst = min(indlst, myspace - 1)
3193 lstb(indlst) = lay(jat)
3197 rel(1, indlst) = xrel*tti
3198 rel(2, indlst) = yrel*tti
3199 rel(3, indlst) = zrel*tti
3201 rel(5, indlst) = tti
3210 END SUBROUTINE sublstiat_l
3226 SUBROUTINE splint(ya, y2a, tmin, tmax, hsixth, h2sixth, hi, n, x, y, yp)
3227 REAL(kind=
dp) :: tmin, tmax, hsixth, h2sixth, hi
3229 REAL(kind=
dp) :: y2a(0:n - 1), ya(0:n - 1), x, y, yp
3232 REAL(kind=
dp) :: a, a2, b, b2, cof1, cof2, cof3, cof4, &
3233 tt, y2a_khi, y2a_klo, ya_khi, ya_klo, &
3234 ypt1, ypt2, yt1, yt2
3239 yp = hi*(ya(1) - ya(0)) - &
3240 (y2a(1) + 2.e0_dp*y2a(0))*hsixth
3241 y = ya(0) + (x - tmin)*yp
3242 ELSE IF (x > tmax)
THEN
3243 yp = hi*(ya(n - 1) - ya(n - 2)) + &
3244 (2.e0_dp*y2a(n - 1) + y2a(n - 2))*hsixth
3245 y = ya(n - 1) + (x - tmax)*yp
3258 yp = ya_khi - ya_klo
3268 cof3 = cof3 - 1.e0_dp
3269 cof4 = cof4 - 1.e0_dp
3274 y = y + (yt1 + yt2)*h2sixth
3275 yp = yp + (ypt1 - ypt2)*hsixth
3278 END SUBROUTINE splint
3293 SUBROUTINE eip_stillinger_weber_silicon(nat, alat, rxyz0, fxyz, etot, count)
3336 REAL(
dp) :: alat(3), rxyz0(3, nat), fxyz(3, nat), &
3339 REAL(kind=
dp),
PARAMETER :: eps = 2.167239428587_dp, ra = 1.8_dp, &
3342 INTEGER :: i, iam, iat, ii, il, in, indlst, &
3343 indlstx, ipb, l1, l2, l3, laymx, ll1, &
3344 ll2, ll3, myspace, myspaceout, ncx, &
3345 ndat, nn, nnbrx, npjkx, npjx, npr
3346 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: lay, lstb
3347 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: lsta
3348 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :, :) :: icell
3349 REAL(
dp) :: cut, cut2, esigma, fx(nat), fx3(nat), &
3350 fy(nat), fy3(nat), fz(nat), fz3(nat), &
3351 isigma, p, p3, pv3, rlc1i, rlc2i, rlc3i
3352 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rel, rxyz
3354 count = count + 1._dp
3355 cut = sigma*ra*2._dp
3356 isigma = 1._dp/sigma
3360 ll1 = int(alat(1)/cut)
3361 IF (ll1 < 1) cpabort(
"alat(1) too small")
3362 ll2 = int(alat(2)/cut)
3363 IF (ll2 < 1) cpabort(
"alat(2) too small")
3364 ll3 = int(alat(3)/cut)
3365 IF (ll3 < 1) cpabort(
"alat(3) too small")
3371 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
3372 icell(0, :, :, :) = 0
3378 rxyz0(1, iat) =
modulo(
modulo(rxyz0(1, iat), alat(1)), alat(1))
3379 rxyz0(2, iat) =
modulo(
modulo(rxyz0(2, iat), alat(2)), alat(2))
3380 rxyz0(3, iat) =
modulo(
modulo(rxyz0(3, iat), alat(3)), alat(3))
3381 l1 = int(rxyz0(1, iat)*rlc1i)
3382 l2 = int(rxyz0(2, iat)*rlc2i)
3383 l3 = int(rxyz0(3, iat)*rlc3i)
3385 ii = icell(0, l1, l2, l3)
3387 icell(0, l1, l2, l3) = ii
3392 icell(ii, l1, l2, l3) = iat
3394 IF (
ALLOCATED(icell))
EXIT
3398 laymx = ncx*(2*ll1*ll2 + 2*ll1*ll3 + 2*ll2*ll3 + 4*ll1 + 4*ll2 + 4*ll3 + 8)
3400 ALLOCATE (rxyz(3, nn), lay(nn))
3403 rxyz(1, iat) = rxyz0(1, iat)
3404 rxyz(2, iat) = rxyz0(2, iat)
3405 rxyz(3, iat) = rxyz0(3, iat)
3412 in = icell(0, l1, l2, 0)
3413 icell(0, l1, l2, ll3) = in
3415 i = icell(ii, l1, l2, 0)
3417 IF (il > nn) cpabort(
"enlarge laymx")
3419 icell(ii, l1, l2, ll3) = il
3420 rxyz(1, il) = rxyz(1, i)
3421 rxyz(2, il) = rxyz(2, i)
3422 rxyz(3, il) = rxyz(3, i) + alat(3)
3425 in = icell(0, l1, l2, ll3 - 1)
3426 icell(0, l1, l2, -1) = in
3428 i = icell(ii, l1, l2, ll3 - 1)
3430 IF (il > nn) cpabort(
"enlarge laymx")
3432 icell(ii, l1, l2, -1) = il
3433 rxyz(1, il) = rxyz(1, i)
3434 rxyz(2, il) = rxyz(2, i)
3435 rxyz(3, il) = rxyz(3, i) - alat(3)
3445 in = icell(0, 0, l2, l3)
3446 icell(0, ll1, l2, l3) = in
3448 i = icell(ii, 0, l2, l3)
3450 IF (il > nn) cpabort(
"enlarge laymx")
3452 icell(ii, ll1, l2, l3) = il
3453 rxyz(1, il) = rxyz(1, i) + alat(1)
3454 rxyz(2, il) = rxyz(2, i)
3455 rxyz(3, il) = rxyz(3, i)
3458 in = icell(0, ll1 - 1, l2, l3)
3459 icell(0, -1, l2, l3) = in
3461 i = icell(ii, ll1 - 1, l2, l3)
3463 IF (il > nn) cpabort(
"enlarge laymx")
3465 icell(ii, -1, l2, l3) = il
3466 rxyz(1, il) = rxyz(1, i) - alat(1)
3467 rxyz(2, il) = rxyz(2, i)
3468 rxyz(3, il) = rxyz(3, i)
3478 in = icell(0, l1, 0, l3)
3479 icell(0, l1, ll2, l3) = in
3481 i = icell(ii, l1, 0, l3)
3483 IF (il > nn) cpabort(
"enlarge laymx")
3485 icell(ii, l1, ll2, l3) = il
3486 rxyz(1, il) = rxyz(1, i)
3487 rxyz(2, il) = rxyz(2, i) + alat(2)
3488 rxyz(3, il) = rxyz(3, i)
3491 in = icell(0, l1, ll2 - 1, l3)
3492 icell(0, l1, -1, l3) = in
3494 i = icell(ii, l1, ll2 - 1, l3)
3496 IF (il > nn) cpabort(
"enlarge laymx")
3498 icell(ii, l1, -1, l3) = il
3499 rxyz(1, il) = rxyz(1, i)
3500 rxyz(2, il) = rxyz(2, i) - alat(2)
3501 rxyz(3, il) = rxyz(3, i)
3510 in = icell(0, l1, 0, 0)
3511 icell(0, l1, ll2, ll3) = in
3513 i = icell(ii, l1, 0, 0)
3515 IF (il > nn) cpabort(
"enlarge laymx")
3517 icell(ii, l1, ll2, ll3) = il
3518 rxyz(1, il) = rxyz(1, i)
3519 rxyz(2, il) = rxyz(2, i) + alat(2)
3520 rxyz(3, il) = rxyz(3, i) + alat(3)
3523 in = icell(0, l1, 0, ll3 - 1)
3524 icell(0, l1, ll2, -1) = in
3526 i = icell(ii, l1, 0, ll3 - 1)
3528 IF (il > nn) cpabort(
"enlarge laymx")
3530 icell(ii, l1, ll2, -1) = il
3531 rxyz(1, il) = rxyz(1, i)
3532 rxyz(2, il) = rxyz(2, i) + alat(2)
3533 rxyz(3, il) = rxyz(3, i) - alat(3)
3536 in = icell(0, l1, ll2 - 1, 0)
3537 icell(0, l1, -1, ll3) = in
3539 i = icell(ii, l1, ll2 - 1, 0)
3541 IF (il > nn) cpabort(
"enlarge laymx")
3543 icell(ii, l1, -1, ll3) = il
3544 rxyz(1, il) = rxyz(1, i)
3545 rxyz(2, il) = rxyz(2, i) - alat(2)
3546 rxyz(3, il) = rxyz(3, i) + alat(3)
3549 in = icell(0, l1, ll2 - 1, ll3 - 1)
3550 icell(0, l1, -1, -1) = in
3552 i = icell(ii, l1, ll2 - 1, ll3 - 1)
3554 IF (il > nn) cpabort(
"enlarge laymx")
3556 icell(ii, l1, -1, -1) = il
3557 rxyz(1, il) = rxyz(1, i)
3558 rxyz(2, il) = rxyz(2, i) - alat(2)
3559 rxyz(3, il) = rxyz(3, i) - alat(3)
3567 in = icell(0, 0, l2, 0)
3568 icell(0, ll1, l2, ll3) = in
3570 i = icell(ii, 0, l2, 0)
3572 IF (il > nn) cpabort(
"enlarge laymx")
3574 icell(ii, ll1, l2, ll3) = il
3575 rxyz(1, il) = rxyz(1, i) + alat(1)
3576 rxyz(2, il) = rxyz(2, i)
3577 rxyz(3, il) = rxyz(3, i) + alat(3)
3580 in = icell(0, 0, l2, ll3 - 1)
3581 icell(0, ll1, l2, -1) = in
3583 i = icell(ii, 0, l2, ll3 - 1)
3585 IF (il > nn) cpabort(
"enlarge laymx")
3587 icell(ii, ll1, l2, -1) = il
3588 rxyz(1, il) = rxyz(1, i) + alat(1)
3589 rxyz(2, il) = rxyz(2, i)
3590 rxyz(3, il) = rxyz(3, i) - alat(3)
3593 in = icell(0, ll1 - 1, l2, 0)
3594 icell(0, -1, l2, ll3) = in
3596 i = icell(ii, ll1 - 1, l2, 0)
3598 IF (il > nn) cpabort(
"enlarge laymx")
3600 icell(ii, -1, l2, ll3) = il
3601 rxyz(1, il) = rxyz(1, i) - alat(1)
3602 rxyz(2, il) = rxyz(2, i)
3603 rxyz(3, il) = rxyz(3, i) + alat(3)
3606 in = icell(0, ll1 - 1, l2, ll3 - 1)
3607 icell(0, -1, l2, -1) = in
3609 i = icell(ii, ll1 - 1, l2, ll3 - 1)
3611 IF (il > nn) cpabort(
"enlarge laymx")
3613 icell(ii, -1, l2, -1) = il
3614 rxyz(1, il) = rxyz(1, i) - alat(1)
3615 rxyz(2, il) = rxyz(2, i)
3616 rxyz(3, il) = rxyz(3, i) - alat(3)
3624 in = icell(0, 0, 0, l3)
3625 icell(0, ll1, ll2, l3) = in
3627 i = icell(ii, 0, 0, l3)
3629 IF (il > nn) cpabort(
"enlarge laymx")
3631 icell(ii, ll1, ll2, l3) = il
3632 rxyz(1, il) = rxyz(1, i) + alat(1)
3633 rxyz(2, il) = rxyz(2, i) + alat(2)
3634 rxyz(3, il) = rxyz(3, i)
3637 in = icell(0, ll1 - 1, 0, l3)
3638 icell(0, -1, ll2, l3) = in
3640 i = icell(ii, ll1 - 1, 0, l3)
3642 IF (il > nn) cpabort(
"enlarge laymx")
3644 icell(ii, -1, ll2, l3) = il
3645 rxyz(1, il) = rxyz(1, i) - alat(1)
3646 rxyz(2, il) = rxyz(2, i) + alat(2)
3647 rxyz(3, il) = rxyz(3, i)
3650 in = icell(0, 0, ll2 - 1, l3)
3651 icell(0, ll1, -1, l3) = in
3653 i = icell(ii, 0, ll2 - 1, l3)
3655 IF (il > nn) cpabort(
"enlarge laymx")
3657 icell(ii, ll1, -1, l3) = il
3658 rxyz(1, il) = rxyz(1, i) + alat(1)
3659 rxyz(2, il) = rxyz(2, i) - alat(2)
3660 rxyz(3, il) = rxyz(3, i)
3663 in = icell(0, ll1 - 1, ll2 - 1, l3)
3664 icell(0, -1, -1, l3) = in
3666 i = icell(ii, ll1 - 1, ll2 - 1, l3)
3668 IF (il > nn) cpabort(
"enlarge laymx")
3670 icell(ii, -1, -1, l3) = il
3671 rxyz(1, il) = rxyz(1, i) - alat(1)
3672 rxyz(2, il) = rxyz(2, i) - alat(2)
3673 rxyz(3, il) = rxyz(3, i)
3679 in = icell(0, 0, 0, 0)
3680 icell(0, ll1, ll2, ll3) = in
3682 i = icell(ii, 0, 0, 0)
3684 IF (il > nn) cpabort(
"enlarge laymx")
3686 icell(ii, ll1, ll2, ll3) = il
3687 rxyz(1, il) = rxyz(1, i) + alat(1)
3688 rxyz(2, il) = rxyz(2, i) + alat(2)
3689 rxyz(3, il) = rxyz(3, i) + alat(3)
3692 in = icell(0, ll1 - 1, 0, 0)
3693 icell(0, -1, ll2, ll3) = in
3695 i = icell(ii, ll1 - 1, 0, 0)
3697 IF (il > nn) cpabort(
"enlarge laymx")
3699 icell(ii, -1, ll2, ll3) = il
3700 rxyz(1, il) = rxyz(1, i) - alat(1)
3701 rxyz(2, il) = rxyz(2, i) + alat(2)
3702 rxyz(3, il) = rxyz(3, i) + alat(3)
3705 in = icell(0, 0, ll2 - 1, 0)
3706 icell(0, ll1, -1, ll3) = in
3708 i = icell(ii, 0, ll2 - 1, 0)
3710 IF (il > nn) cpabort(
"enlarge laymx")
3712 icell(ii, ll1, -1, ll3) = il
3713 rxyz(1, il) = rxyz(1, i) + alat(1)
3714 rxyz(2, il) = rxyz(2, i) - alat(2)
3715 rxyz(3, il) = rxyz(3, i) + alat(3)
3718 in = icell(0, ll1 - 1, ll2 - 1, 0)
3719 icell(0, -1, -1, ll3) = in
3721 i = icell(ii, ll1 - 1, ll2 - 1, 0)
3723 IF (il > nn) cpabort(
"enlarge laymx")
3725 icell(ii, -1, -1, ll3) = il
3726 rxyz(1, il) = rxyz(1, i) - alat(1)
3727 rxyz(2, il) = rxyz(2, i) - alat(2)
3728 rxyz(3, il) = rxyz(3, i) + alat(3)
3731 in = icell(0, 0, 0, ll3 - 1)
3732 icell(0, ll1, ll2, -1) = in
3734 i = icell(ii, 0, 0, ll3 - 1)
3736 IF (il > nn) cpabort(
"enlarge laymx")
3738 icell(ii, ll1, ll2, -1) = il
3739 rxyz(1, il) = rxyz(1, i) + alat(1)
3740 rxyz(2, il) = rxyz(2, i) + alat(2)
3741 rxyz(3, il) = rxyz(3, i) - alat(3)
3744 in = icell(0, ll1 - 1, 0, ll3 - 1)
3745 icell(0, -1, ll2, -1) = in
3747 i = icell(ii, ll1 - 1, 0, ll3 - 1)
3749 IF (il > nn) cpabort(
"enlarge laymx")
3751 icell(ii, -1, ll2, -1) = il
3752 rxyz(1, il) = rxyz(1, i) - alat(1)
3753 rxyz(2, il) = rxyz(2, i) + alat(2)
3754 rxyz(3, il) = rxyz(3, i) - alat(3)
3757 in = icell(0, 0, ll2 - 1, ll3 - 1)
3758 icell(0, ll1, -1, -1) = in
3760 i = icell(ii, 0, ll2 - 1, ll3 - 1)
3762 IF (il > nn) cpabort(
"enlarge laymx")
3764 icell(ii, ll1, -1, -1) = il
3765 rxyz(1, il) = rxyz(1, i) + alat(1)
3766 rxyz(2, il) = rxyz(2, i) - alat(2)
3767 rxyz(3, il) = rxyz(3, i) - alat(3)
3770 in = icell(0, ll1 - 1, ll2 - 1, ll3 - 1)
3771 icell(0, -1, -1, -1) = in
3773 i = icell(ii, ll1 - 1, ll2 - 1, ll3 - 1)
3775 IF (il > nn) cpabort(
"enlarge laymx")
3777 icell(ii, -1, -1, -1) = il
3778 rxyz(1, il) = rxyz(1, i) - alat(1)
3779 rxyz(2, il) = rxyz(2, i) - alat(2)
3780 rxyz(3, il) = rxyz(3, i) - alat(3)
3783 ALLOCATE (lsta(2, nat))
3787 ALLOCATE (lstb(nnbrx*nat), rel(5, nnbrx*nat))
3796 myspace = (nat*nnbrx)/npr
3797 IF (iam == 0) myspaceout = myspace
3803 DO ii = 1, icell(0, l1, l2, l3)
3804 iat = icell(ii, l1, l2, l3)
3805 IF (((iat - 1)*npr)/nat == iam)
THEN
3806 lsta(1, iat) = iam*myspace + indlst + 1
3807 CALL sw_sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
3808 rxyz, icell, lstb(iam*myspace + 1), lay, rel(1, iam*myspace + 1), cut2, indlst)
3809 lsta(2, iat) = iam*myspace + indlst
3811 ndat = lsta(2, iat) - lsta(1, iat) + 1
3817 indlstx = max(indlstx, indlst)
3819 IF (indlstx < myspaceout)
EXIT
3820 DEALLOCATE (lstb, rel)
3825 npjx = 300; npjkx = 6000
3848 CALL sw_subfeniat_l(i, nat, nnbrx, rel, p, p3, fx, fy, fz, fx3, fy3, fz3, lstb, lsta, isigma, sigma)
3853 fx(i) = fx(i) + fx3(i)
3854 fy(i) = fy(i) + fy3(i)
3855 fz(i) = fz(i) + fz3(i)
3860 fxyz(1, i) = fx(i)*esigma
3861 fxyz(2, i) = fy(i)*esigma
3862 fxyz(3, i) = fz(i)*esigma
3865 DEALLOCATE (rxyz, icell, lay, lsta, lstb, rel)
3866 END SUBROUTINE eip_stillinger_weber_silicon
3874 REAL(kind=
dp)
FUNCTION f(c)
3877 REAL(kind=
dp),
PARAMETER :: aa = 7.049556277_dp, &
3878 bb = 0.6022245584_dp, ra = 1.8_dp
3880 REAL(kind=
dp) :: c4, crainv
3882 IF ((c - ra) < 0._dp)
THEN
3883 crainv = 1.0_dp/(c - ra)
3885 f = aa*bb*4.0_dp/(c4*c)*exp(crainv) + aa*(bb/(c4) - 1.0_dp)*exp(crainv)*crainv*crainv
3897 REAL(kind=
dp)
FUNCTION pe(d)
3900 REAL(kind=
dp),
PARAMETER :: aa = 7.049556277_dp, &
3901 bb = 0.6022245584_dp, ra = 1.8_dp
3903 IF ((d - ra) < 0._dp)
THEN
3904 pe = aa*(bb/(d*d*d*d) - 1.0_dp)*exp(1.0_dp/(d - ra))
3931 SUBROUTINE sw_sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
3932 rxyz, icell, lstb, lay, rel, cut2, indlst)
3935 INTEGER :: iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, &
3937 REAL(kind=
dp) :: rxyz(3, nn)
3938 INTEGER :: icell(0:ncx, -1:ll1, -1:ll2, -1:ll3), lstb(0:myspace - 1), lay(nn)
3939 REAL(kind=
dp) :: rel(5, 0:myspace - 1), cut2
3942 INTEGER :: jat, jj, k1, k2, k3
3943 REAL(kind=
dp) :: rr2, tt, tti, xrel, yrel, zrel
3945 DO k3 = l3 - 1, l3 + 1
3946 DO k2 = l2 - 1, l2 + 1
3947 DO k1 = l1 - 1, l1 + 1
3948 DO jj = 1, icell(0, k1, k2, k3)
3949 jat = icell(jj, k1, k2, k3)
3950 IF (jat == iat) cycle
3951 xrel = rxyz(1, iat) - rxyz(1, jat)
3952 yrel = rxyz(2, iat) - rxyz(2, jat)
3953 zrel = rxyz(3, iat) - rxyz(3, jat)
3954 rr2 = xrel**2 + yrel**2 + zrel**2
3955 IF (rr2 <= cut2)
THEN
3956 indlst = min(indlst, myspace - 1)
3957 lstb(indlst) = lay(jat)
3961 rel(1, indlst) = xrel*tti
3962 rel(2, indlst) = yrel*tti
3963 rel(3, indlst) = zrel*tti
3965 rel(5, indlst) = tti
3974 END SUBROUTINE sw_sublstiat_l
3995 SUBROUTINE sw_subfeniat_l(i, nat, nnbrx, rel, p, p3, fx, fy, fz, fx3, fy3, fz3, lstb, lsta, isigma, sigma)
3996 INTEGER,
INTENT(IN) :: i, nat, nnbrx
3997 REAL(kind=
dp),
INTENT(IN) :: rel(5, nnbrx*nat)
3998 REAL(kind=
dp),
INTENT(INOUT) :: p, p3, fx(nat), fy(nat), fz(nat), &
3999 fx3(nat), fy3(nat), fz3(nat)
4000 INTEGER,
INTENT(IN) :: lstb(nnbrx*nat), lsta(2, nat)
4001 REAL(kind=
dp),
INTENT(IN) :: isigma, sigma
4003 REAL(kind=
dp),
PARAMETER :: aa = 7.049556277_dp, &
4004 bb = 0.6022245584_dp, gam = 1.2_dp, &
4005 ra = 1.8_dp, ramda = 21.0_dp
4007 INTEGER :: ipb, ipe, j, k, l, m, nij
4008 REAL(kind=
dp) :: c4, cosijk, cosijk3, cosikj, cosikj3, cosjik, cosjik3, crainv, force, hi, &
4009 hixij, hixij0, hixij1, hixik, hixik0, hixik1, hiyij, hiyij0, hiyij1, hiyik, hiyik0, &
4010 hiyik1, hizij, hizij0, hizij1, hizik, hizik0, hizik1, hj, hjxij, hjxij0, hjxij1, hjxjk, &
4011 hjxjk0, hjxjk1, hjyij, hjyij0, hjyij1, hjyjk, hjyjk0, hjyjk1, hjzij, hjzij0, hjzij1, &
4012 hjzjk, hjzjk0, hjzjk1, hk, hkxik, hkxik0, hkxik1, hkxkj, hkxkj0, hkxkj1, hkyik, hkyik0, &
4013 hkyik1, hkykj, hkykj0, hkykj1, hkzik, hkzik0, hkzik1, hkzkj, hkzkj0, hkzkj1, invrij, &
4014 invrija, invrik, invrika, invrjk, invrjka, refi, refj, refk, rij, rija, rik
4015 REAL(kind=
dp) :: rika, rjk, rjka, xij, xik, xjk, yij, yik, yjk, zij, zik, zjk
4024 rij = rel(4, l)*isigma
4025 invrij = rel(5, l)*sigma
4030 IF (rij >= 2._dp*ra) cycle
4032 crainv = 1.0_dp/(rij - ra)
4033 c4 = rij*rij*rij*rij
4034 force = aa*bb*4.0_dp/(c4*rij)*exp(crainv) + aa*(bb/(c4) - 1.0_dp)*exp(crainv)*crainv*crainv
4036 fx(i) = force*xij*invrij + fx(i)
4037 fy(i) = force*yij*invrij + fy(i)
4038 fz(i) = force*zij*invrij + fz(i)
4040 fx(j) = -force*xij*invrij + fx(j)
4041 fy(j) = -force*yij*invrij + fy(j)
4042 fz(j) = -force*zij*invrij + fz(j)
4044 p = p + aa*(bb/(rij*rij*rij*rij) - 1.0_dp)*exp(1.0_dp/(rij - ra))
4052 invrik = rel(5, m)*sigma
4053 rik = rel(4, m)*isigma
4058 IF ((rik >= ra) .AND. (nij == 0)) cycle
4064 rjk = sqrt(xjk*xjk + yjk*yjk + zjk*zjk)
4067 IF ((rjk >= ra) .AND. (nij == 0)) cycle
4068 cosjik = (xij*xik + yij*yik + zij*zik)*(invrij*invrik)
4069 cosijk = (-xij*xjk - yij*yjk - zij*zjk)*(invrij*invrjk)
4070 cosikj = (xik*xjk + yik*yjk + zik*zjk)*(invrik*invrjk)
4071 cosjik3 = cosjik + 1.0_dp/3.0_dp
4072 cosijk3 = cosijk + 1.0_dp/3.0_dp
4073 cosikj3 = cosikj + 1.0_dp/3.0_dp
4079 invrija = 1._dp/rija
4080 invrika = 1._dp/rika
4081 invrjka = 1._dp/rjka
4083 IF (rija >= 0.0_dp)
THEN
4086 refk = ramda*exp(gam*invrika + gam*invrjka)
4087 ELSE IF ((rija < 0.0_dp) .AND. (rika < 0.0_dp))
THEN
4088 IF (rjka < 0.0_dp)
THEN
4089 refi = ramda*exp(gam*invrija + gam*invrika)
4090 refj = ramda*exp(gam*invrija + gam*invrjka)
4091 refk = ramda*exp(gam*invrika + gam*invrjka)
4093 refi = ramda*exp(gam*invrija + gam*invrika)
4097 ELSE IF ((rija < 0.0_dp) .AND. (rjka < 0.0_dp))
THEN
4099 refj = ramda*exp(gam*invrija + gam*invrjka)
4105 hi = refi*cosjik3*cosjik3
4106 hj = refj*cosijk3*cosijk3
4107 hk = refk*cosikj3*cosikj3
4108 p3 = p3 + hi + hj + hk
4110 hixij0 = 2.0_dp*(xik*invrik - xij*cosjik*invrij)
4111 hixij1 = gam*xij*cosjik3*(invrija*invrija)
4112 hixij = refi*cosjik3*(hixij0 - hixij1)*invrij
4113 hixik0 = 2.0_dp*(xij*invrij - xik*cosjik*invrik)
4114 hixik1 = gam*xik*cosjik3*(invrika*invrika)
4115 hixik = refi*cosjik3*(hixik0 - hixik1)*invrik
4116 hjxij0 = 2.0_dp*(-xjk*invrjk - xij*cosijk*invrij)
4117 hjxij1 = gam*xij*cosijk3*(invrija*invrija)
4118 hjxij = refj*cosijk3*(hjxij0 - hjxij1)*invrij
4119 hkxik0 = 2.0_dp*(xjk*invrjk - xik*cosikj*invrik)
4120 hkxik1 = gam*xik*cosikj3*(invrika*invrika)
4121 hkxik = refk*cosikj3*(hkxik0 - hkxik1)*invrik
4122 hjxjk0 = 2.0_dp*(-xij*invrij - xjk*cosijk*invrjk)
4123 hjxjk1 = gam*xjk*cosijk3*(invrjka*invrjka)
4124 hjxjk = refj*cosijk3*(hjxjk0 - hjxjk1)*invrjk
4125 hkxkj0 = 2.0_dp*(-xik*invrik + xjk*cosikj*invrjk)
4126 hkxkj1 = gam*xjk*cosikj3*(invrjka*invrjka)
4127 hkxkj = refk*cosikj3*(hkxkj0 + hkxkj1)*invrjk
4129 hiyij0 = 2.0_dp*(yik*invrik - yij*cosjik*invrij)
4130 hiyij1 = gam*yij*cosjik3*(invrija*invrija)
4131 hiyij = refi*cosjik3*(hiyij0 - hiyij1)*invrij
4132 hiyik0 = 2.0_dp*(yij*invrij - yik*cosjik*invrik)
4133 hiyik1 = gam*yik*cosjik3*(invrika*invrika)
4134 hiyik = refi*cosjik3*(hiyik0 - hiyik1)*invrik
4135 hjyij0 = 2.0_dp*(-yjk*invrjk - yij*cosijk*invrij)
4136 hjyij1 = gam*yij*cosijk3*(invrija*invrija)
4137 hjyij = refj*cosijk3*(hjyij0 - hjyij1)*invrij
4138 hkyik0 = 2.0_dp*(yjk*invrjk - yik*cosikj*invrik)
4139 hkyik1 = gam*yik*cosikj3*(invrika*invrika)
4140 hkyik = refk*cosikj3*(hkyik0 - hkyik1)*invrik
4141 hjyjk0 = 2.0_dp*(-yij*invrij - yjk*cosijk*invrjk)
4142 hjyjk1 = gam*yjk*cosijk3*(invrjka*invrjka)
4143 hjyjk = refj*cosijk3*(hjyjk0 - hjyjk1)*invrjk
4144 hkykj0 = 2.0_dp*(-yik*invrik + yjk*cosikj*invrjk)
4145 hkykj1 = gam*yjk*cosikj3*(invrjka*invrjka)
4146 hkykj = refk*cosikj3*(hkykj0 + hkykj1)*invrjk
4148 hizij0 = 2.0_dp*(zik*invrik - zij*cosjik*invrij)
4149 hizij1 = gam*zij*cosjik3*(invrija*invrija)
4150 hizij = refi*cosjik3*(hizij0 - hizij1)*invrij
4151 hizik0 = 2.0_dp*(zij*invrij - zik*cosjik*invrik)
4152 hizik1 = gam*zik*cosjik3*(invrika*invrika)
4153 hizik = refi*cosjik3*(hizik0 - hizik1)*invrik
4154 hjzij0 = 2.0_dp*(-zjk*invrjk - zij*cosijk*invrij)
4155 hjzij1 = gam*zij*cosijk3*(invrija*invrija)
4156 hjzij = refj*cosijk3*(hjzij0 - hjzij1)*invrij
4157 hkzik0 = 2.0_dp*(zjk*invrjk - zik*cosikj*invrik)
4158 hkzik1 = gam*zik*cosikj3*(invrika*invrika)
4159 hkzik = refk*cosikj3*(hkzik0 - hkzik1)*invrik
4160 hjzjk0 = 2.0_dp*(-zij*invrij - zjk*cosijk*invrjk)
4161 hjzjk1 = gam*zjk*cosijk3*(invrjka*invrjka)
4162 hjzjk = refj*cosijk3*(hjzjk0 - hjzjk1)*invrjk
4163 hkzkj0 = 2.0_dp*(-zik*invrik + zjk*cosikj*invrjk)
4164 hkzkj1 = gam*zjk*cosikj3*(invrjka*invrjka)
4165 hkzkj = refk*cosikj3*(hkzkj0 + hkzkj1)*invrjk
4167 fx3(i) = fx3(i) - hixij - hixik - hjxij - hkxik
4168 fy3(i) = fy3(i) - hiyij - hiyik - hjyij - hkyik
4169 fz3(i) = fz3(i) - hizij - hizik - hjzij - hkzik
4171 fx3(j) = fx3(j) + hixij + hjxij - hjxjk + hkxkj
4172 fy3(j) = fy3(j) + hiyij + hjyij - hjyjk + hkykj
4173 fz3(j) = fz3(j) + hizij + hjzij - hjzjk + hkzkj
4175 fx3(k) = fx3(k) + hixik + hkxik - hkxkj + hjxjk
4176 fy3(k) = fy3(k) + hiyik + hkyik - hkykj + hjyjk
4177 fz3(k) = fz3(k) + hizik + hkzik - hkzkj + hjzjk
4180 END SUBROUTINE sw_subfeniat_l
4191 SUBROUTINE eip_tersoff_silicon(nat, alat, rxyz, fxyz, etot, count)
4219 REAL(kind=
dp) :: alat(3), rxyz(3, nat), fxyz(3, nat), &
4222 INTEGER :: iat, nnmax, npmax
4223 INTEGER,
ALLOCATABLE,
DIMENSION(:) ::
kinds, lstb
4224 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: lsta
4225 REAL(kind=
dp) :: uatot, urtot, xbox, ybox, zbox
4226 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: dkeij, uadurdf, xyzrrefdf
4227 REAL(kind=
dp),
DIMENSION(1:2) :: bcsq, co_bcd, dsq, h, pmass, pn
4228 REAL(kind=
dp),
DIMENSION(1:2, 1:2) :: ala, alr, ca, cr, r1, r2, x
4230 INTEGER:: nnbrx, nnbrxt
4233 count = count + 1._dp
4236 rxyz(1, iat) =
modulo(
modulo(rxyz(1, iat), alat(1)), alat(1))
4237 rxyz(2, iat) =
modulo(
modulo(rxyz(2, iat), alat(2)), alat(2))
4238 rxyz(3, iat) =
modulo(
modulo(rxyz(3, iat), alat(3)), alat(3))
4241 ALLOCATE (
kinds(1:nat))
4247 ALLOCATE (lsta(2, nat), lstb(nnbrxt*nat))
4248 ALLOCATE (xyzrrefdf(1:6*npmax), uadurdf(1:3*npmax), dkeij(1:3*nnmax))
4254 xbox = alat(1); ybox = alat(2); zbox = alat(3)
4255 CALL tersoff_parameters(r1, r2, cr, ca, alr, ala, x, pn, co_bcd, bcsq, dsq, h, pmass)
4256 CALL tersoff_pairlist_energy_forces(nat, npmax, nnmax, xbox, ybox, zbox,
kinds, rxyz, r1, r2, cr, &
4257 ca, alr, ala, x, xyzrrefdf, uadurdf, urtot, lsta, lstb, nnbrx, &
4258 pn, co_bcd, bcsq, dsq, h, fxyz, uatot, dkeij)
4259 etot = urtot + uatot
4260 DEALLOCATE (
kinds, xyzrrefdf, uadurdf, dkeij, lsta, lstb)
4261 END SUBROUTINE eip_tersoff_silicon
4279 SUBROUTINE tersoff_parameters(R1, R2, Cr, Ca, alr, ala, X, Pn, Co_bcd, bcsq, dsq, h, Pmass)
4281 REAL(kind=
dp),
DIMENSION(1:2, 1:2),
INTENT(out) :: r1, r2, cr, ca, alr, ala, x
4282 REAL(kind=
dp),
DIMENSION(1:2),
INTENT(out) :: pn, co_bcd, bcsq, dsq, h, pmass
4284 REAL(kind=
dp),
PARAMETER :: c_ala = 2.2119_dp, c_alr = 3.4879_dp, c_b = 1.5724e-7_dp, &
4285 c_c = 3.8049e4_dp, c_ca = 3.4674e2_dp, c_cr = 1.3936e3_dp, c_d = 4.3484_dp, &
4286 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, &
4287 si_ala = 1.7322_dp, si_alr = 2.4799_dp, si_b = 1.1000e-6_dp, si_c = 1.0039e5_dp, &
4288 si_ca = 4.7118e2_dp, si_cr = 1.8308e3_dp, si_d = 1.6217e1_dp, si_h = -5.9825e-1_dp, &
4289 si_mass = 28.0855_dp, si_n = 7.8734e-1_dp, si_r1 = 2.7_dp, si_r2 = 3.3_dp
4307 cr(1, 2) = sqrt(cr(1, 1)*cr(2, 2))
4312 ca(1, 2) = sqrt(ca(1, 1)*ca(2, 2))
4317 r1(1, 2) = sqrt(r1(1, 1)*r1(2, 2))
4322 r2(1, 2) = sqrt(r2(1, 1)*r2(2, 2))
4332 alr(1, 2) = 0.5_dp*(alr(1, 1) + alr(2, 2))
4333 alr(2, 1) = alr(1, 2)
4337 ala(1, 2) = 0.5_dp*(ala(1, 1) + ala(2, 2))
4338 ala(2, 1) = ala(1, 2)
4343 co_bcd(1) = c_b*(1.0_dp + c_c*c_c/(c_d*c_d))
4344 co_bcd(2) = si_b*(1.0_dp + si_c*si_c/(si_d*si_d))
4346 bcsq(1) = c_b*c_c*c_c
4347 bcsq(2) = si_b*si_c*si_c
4359 END SUBROUTINE tersoff_parameters
4393 SUBROUTINE tersoff_pairlist_energy_forces(Nmol, Npmax, NNmax, xbox, ybox, zbox, Kinds, R, R1, R2, Cr, Ca, alr, ala, X, &
4394 XYZRrefdf, UadUrdf, Urtot, lsta, lstb, nnbrx, &
4395 Pn, Co_bcd, bcsq, dsq, h, F, Uatot, dkEij)
4396 INTEGER,
INTENT(in) :: nmol, npmax, nnmax
4397 REAL(kind=
dp),
INTENT(in) :: xbox, ybox, zbox
4398 INTEGER,
DIMENSION(1:Nmol),
INTENT(in) ::
kinds
4399 REAL(kind=
dp),
DIMENSION(1:3*Nmol),
INTENT(in) :: r
4400 REAL(kind=
dp),
DIMENSION(1:2, 1:2),
INTENT(in) :: r1, r2, cr, ca, alr, ala, x
4401 REAL(kind=
dp),
DIMENSION(1:6*Npmax),
INTENT(out) :: xyzrrefdf
4402 REAL(kind=
dp),
DIMENSION(1:3*Npmax),
INTENT(out) :: uadurdf
4403 REAL(kind=
dp),
INTENT(out) :: urtot
4404 INTEGER :: lsta(2, nmol)
4405 INTEGER,
INTENT(inout) :: nnbrx
4406 INTEGER :: lstb(nnbrx*nmol)
4407 REAL(kind=
dp),
DIMENSION(1:2),
INTENT(in) :: pn, co_bcd, bcsq, dsq, h
4408 REAL(kind=
dp),
DIMENSION(1:3*Nmol),
INTENT(out) :: f
4409 REAL(kind=
dp),
INTENT(out) :: uatot
4410 REAL(kind=
dp),
DIMENSION(1:3*NNmax) :: dkeij
4412 INTEGER :: i, iam, iat, ii, il, in, indlst, indlstx, ipb, istopg, jat, l1, l2, l3, laymx, &
4413 ll1, ll2, ll3, myspace, myspaceout, nat, ncx, ndat, nn, npjkx, npjx, npr, nptot
4414 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: lay
4415 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :, :) :: icell
4416 REAL(kind=
dp) :: alat(3), cut, cut2, rlc1i, rlc2i, rlc3i, &
4417 rxyz0(3, nmol), xhalf, yhalf, zhalf
4418 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rel, rxyz
4432 rxyz0(1, iat) = r(jat + 1)
4433 rxyz0(2, iat) = r(jat + 2)
4434 rxyz0(3, iat) = r(jat + 3)
4437 cut = r2(2, 2) - 1.d-9
4440 ll1 = int(alat(1)/cut)
4441 IF (ll1 < 1) cpabort(
"alat(1) too small")
4442 ll2 = int(alat(2)/cut)
4443 IF (ll2 < 1) cpabort(
"alat(2) too small")
4444 ll3 = int(alat(3)/cut)
4445 IF (ll3 < 1) cpabort(
"alat(3) too small")
4454 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
4455 icell(0, :, :, :) = 0
4461 l1 = int(rxyz0(1, iat)*rlc1i)
4462 l2 = int(rxyz0(2, iat)*rlc2i)
4463 l3 = int(rxyz0(3, iat)*rlc3i)
4465 ii = icell(0, l1, l2, l3)
4467 icell(0, l1, l2, l3) = ii
4472 icell(ii, l1, l2, l3) = iat
4474 IF (
ALLOCATED(icell))
EXIT
4478 laymx = ncx*(2*ll1*ll2 + 2*ll1*ll3 + 2*ll2*ll3 + 4*ll1 + 4*ll2 + 4*ll3 + 8)
4480 ALLOCATE (rxyz(3, nn), lay(nn))
4483 rxyz(1, iat) = rxyz0(1, iat)
4484 rxyz(2, iat) = rxyz0(2, iat)
4485 rxyz(3, iat) = rxyz0(3, iat)
4492 in = icell(0, l1, l2, 0)
4493 icell(0, l1, l2, ll3) = in
4495 i = icell(ii, l1, l2, 0)
4497 IF (il > nn) cpabort(
"enlarge laymx")
4499 icell(ii, l1, l2, ll3) = il
4500 rxyz(1, il) = rxyz(1, i)
4501 rxyz(2, il) = rxyz(2, i)
4502 rxyz(3, il) = rxyz(3, i) + alat(3)
4505 in = icell(0, l1, l2, ll3 - 1)
4506 icell(0, l1, l2, -1) = in
4508 i = icell(ii, l1, l2, ll3 - 1)
4510 IF (il > nn) cpabort(
"enlarge laymx")
4512 icell(ii, l1, l2, -1) = il
4513 rxyz(1, il) = rxyz(1, i)
4514 rxyz(2, il) = rxyz(2, i)
4515 rxyz(3, il) = rxyz(3, i) - alat(3)
4525 in = icell(0, 0, l2, l3)
4526 icell(0, ll1, l2, l3) = in
4528 i = icell(ii, 0, l2, l3)
4530 IF (il > nn) cpabort(
"enlarge laymx")
4532 icell(ii, ll1, l2, l3) = il
4533 rxyz(1, il) = rxyz(1, i) + alat(1)
4534 rxyz(2, il) = rxyz(2, i)
4535 rxyz(3, il) = rxyz(3, i)
4538 in = icell(0, ll1 - 1, l2, l3)
4539 icell(0, -1, l2, l3) = in
4541 i = icell(ii, ll1 - 1, l2, l3)
4543 IF (il > nn) cpabort(
"enlarge laymx")
4545 icell(ii, -1, l2, l3) = il
4546 rxyz(1, il) = rxyz(1, i) - alat(1)
4547 rxyz(2, il) = rxyz(2, i)
4548 rxyz(3, il) = rxyz(3, i)
4558 in = icell(0, l1, 0, l3)
4559 icell(0, l1, ll2, l3) = in
4561 i = icell(ii, l1, 0, l3)
4563 IF (il > nn) cpabort(
"enlarge laymx")
4565 icell(ii, l1, ll2, l3) = il
4566 rxyz(1, il) = rxyz(1, i)
4567 rxyz(2, il) = rxyz(2, i) + alat(2)
4568 rxyz(3, il) = rxyz(3, i)
4571 in = icell(0, l1, ll2 - 1, l3)
4572 icell(0, l1, -1, l3) = in
4574 i = icell(ii, l1, ll2 - 1, l3)
4576 IF (il > nn) cpabort(
"enlarge laymx")
4578 icell(ii, l1, -1, l3) = il
4579 rxyz(1, il) = rxyz(1, i)
4580 rxyz(2, il) = rxyz(2, i) - alat(2)
4581 rxyz(3, il) = rxyz(3, i)
4590 in = icell(0, l1, 0, 0)
4591 icell(0, l1, ll2, ll3) = in
4593 i = icell(ii, l1, 0, 0)
4595 IF (il > nn) cpabort(
"enlarge laymx")
4597 icell(ii, l1, ll2, ll3) = il
4598 rxyz(1, il) = rxyz(1, i)
4599 rxyz(2, il) = rxyz(2, i) + alat(2)
4600 rxyz(3, il) = rxyz(3, i) + alat(3)
4603 in = icell(0, l1, 0, ll3 - 1)
4604 icell(0, l1, ll2, -1) = in
4606 i = icell(ii, l1, 0, ll3 - 1)
4608 IF (il > nn) cpabort(
"enlarge laymx")
4610 icell(ii, l1, ll2, -1) = il
4611 rxyz(1, il) = rxyz(1, i)
4612 rxyz(2, il) = rxyz(2, i) + alat(2)
4613 rxyz(3, il) = rxyz(3, i) - alat(3)
4616 in = icell(0, l1, ll2 - 1, 0)
4617 icell(0, l1, -1, ll3) = in
4619 i = icell(ii, l1, ll2 - 1, 0)
4621 IF (il > nn) cpabort(
"enlarge laymx")
4623 icell(ii, l1, -1, ll3) = il
4624 rxyz(1, il) = rxyz(1, i)
4625 rxyz(2, il) = rxyz(2, i) - alat(2)
4626 rxyz(3, il) = rxyz(3, i) + alat(3)
4629 in = icell(0, l1, ll2 - 1, ll3 - 1)
4630 icell(0, l1, -1, -1) = in
4632 i = icell(ii, l1, ll2 - 1, ll3 - 1)
4634 IF (il > nn) cpabort(
"enlarge laymx")
4636 icell(ii, l1, -1, -1) = il
4637 rxyz(1, il) = rxyz(1, i)
4638 rxyz(2, il) = rxyz(2, i) - alat(2)
4639 rxyz(3, il) = rxyz(3, i) - alat(3)
4647 in = icell(0, 0, l2, 0)
4648 icell(0, ll1, l2, ll3) = in
4650 i = icell(ii, 0, l2, 0)
4652 IF (il > nn) cpabort(
"enlarge laymx")
4654 icell(ii, ll1, l2, ll3) = il
4655 rxyz(1, il) = rxyz(1, i) + alat(1)
4656 rxyz(2, il) = rxyz(2, i)
4657 rxyz(3, il) = rxyz(3, i) + alat(3)
4660 in = icell(0, 0, l2, ll3 - 1)
4661 icell(0, ll1, l2, -1) = in
4663 i = icell(ii, 0, l2, ll3 - 1)
4665 IF (il > nn) cpabort(
"enlarge laymx")
4667 icell(ii, ll1, l2, -1) = il
4668 rxyz(1, il) = rxyz(1, i) + alat(1)
4669 rxyz(2, il) = rxyz(2, i)
4670 rxyz(3, il) = rxyz(3, i) - alat(3)
4673 in = icell(0, ll1 - 1, l2, 0)
4674 icell(0, -1, l2, ll3) = in
4676 i = icell(ii, ll1 - 1, l2, 0)
4678 IF (il > nn) cpabort(
"enlarge laymx")
4680 icell(ii, -1, l2, ll3) = il
4681 rxyz(1, il) = rxyz(1, i) - alat(1)
4682 rxyz(2, il) = rxyz(2, i)
4683 rxyz(3, il) = rxyz(3, i) + alat(3)
4686 in = icell(0, ll1 - 1, l2, ll3 - 1)
4687 icell(0, -1, l2, -1) = in
4689 i = icell(ii, ll1 - 1, l2, ll3 - 1)
4691 IF (il > nn) cpabort(
"enlarge laymx")
4693 icell(ii, -1, l2, -1) = il
4694 rxyz(1, il) = rxyz(1, i) - alat(1)
4695 rxyz(2, il) = rxyz(2, i)
4696 rxyz(3, il) = rxyz(3, i) - alat(3)
4704 in = icell(0, 0, 0, l3)
4705 icell(0, ll1, ll2, l3) = in
4707 i = icell(ii, 0, 0, l3)
4709 IF (il > nn) cpabort(
"enlarge laymx")
4711 icell(ii, ll1, ll2, l3) = il
4712 rxyz(1, il) = rxyz(1, i) + alat(1)
4713 rxyz(2, il) = rxyz(2, i) + alat(2)
4714 rxyz(3, il) = rxyz(3, i)
4717 in = icell(0, ll1 - 1, 0, l3)
4718 icell(0, -1, ll2, l3) = in
4720 i = icell(ii, ll1 - 1, 0, l3)
4722 IF (il > nn) cpabort(
"enlarge laymx")
4724 icell(ii, -1, ll2, l3) = il
4725 rxyz(1, il) = rxyz(1, i) - alat(1)
4726 rxyz(2, il) = rxyz(2, i) + alat(2)
4727 rxyz(3, il) = rxyz(3, i)
4730 in = icell(0, 0, ll2 - 1, l3)
4731 icell(0, ll1, -1, l3) = in
4733 i = icell(ii, 0, ll2 - 1, l3)
4735 IF (il > nn) cpabort(
"enlarge laymx")
4737 icell(ii, ll1, -1, l3) = il
4738 rxyz(1, il) = rxyz(1, i) + alat(1)
4739 rxyz(2, il) = rxyz(2, i) - alat(2)
4740 rxyz(3, il) = rxyz(3, i)
4743 in = icell(0, ll1 - 1, ll2 - 1, l3)
4744 icell(0, -1, -1, l3) = in
4746 i = icell(ii, ll1 - 1, ll2 - 1, l3)
4748 IF (il > nn) cpabort(
"enlarge laymx")
4750 icell(ii, -1, -1, l3) = il
4751 rxyz(1, il) = rxyz(1, i) - alat(1)
4752 rxyz(2, il) = rxyz(2, i) - alat(2)
4753 rxyz(3, il) = rxyz(3, i)
4759 in = icell(0, 0, 0, 0)
4760 icell(0, ll1, ll2, ll3) = in
4762 i = icell(ii, 0, 0, 0)
4764 IF (il > nn) cpabort(
"enlarge laymx")
4766 icell(ii, ll1, ll2, ll3) = il
4767 rxyz(1, il) = rxyz(1, i) + alat(1)
4768 rxyz(2, il) = rxyz(2, i) + alat(2)
4769 rxyz(3, il) = rxyz(3, i) + alat(3)
4772 in = icell(0, ll1 - 1, 0, 0)
4773 icell(0, -1, ll2, ll3) = in
4775 i = icell(ii, ll1 - 1, 0, 0)
4777 IF (il > nn) cpabort(
"enlarge laymx")
4779 icell(ii, -1, ll2, ll3) = il
4780 rxyz(1, il) = rxyz(1, i) - alat(1)
4781 rxyz(2, il) = rxyz(2, i) + alat(2)
4782 rxyz(3, il) = rxyz(3, i) + alat(3)
4785 in = icell(0, 0, ll2 - 1, 0)
4786 icell(0, ll1, -1, ll3) = in
4788 i = icell(ii, 0, ll2 - 1, 0)
4790 IF (il > nn) cpabort(
"enlarge laymx")
4792 icell(ii, ll1, -1, ll3) = il
4793 rxyz(1, il) = rxyz(1, i) + alat(1)
4794 rxyz(2, il) = rxyz(2, i) - alat(2)
4795 rxyz(3, il) = rxyz(3, i) + alat(3)
4798 in = icell(0, ll1 - 1, ll2 - 1, 0)
4799 icell(0, -1, -1, ll3) = in
4801 i = icell(ii, ll1 - 1, ll2 - 1, 0)
4803 IF (il > nn) cpabort(
"enlarge laymx")
4805 icell(ii, -1, -1, ll3) = il
4806 rxyz(1, il) = rxyz(1, i) - alat(1)
4807 rxyz(2, il) = rxyz(2, i) - alat(2)
4808 rxyz(3, il) = rxyz(3, i) + alat(3)
4811 in = icell(0, 0, 0, ll3 - 1)
4812 icell(0, ll1, ll2, -1) = in
4814 i = icell(ii, 0, 0, ll3 - 1)
4816 IF (il > nn) cpabort(
"enlarge laymx")
4818 icell(ii, ll1, ll2, -1) = il
4819 rxyz(1, il) = rxyz(1, i) + alat(1)
4820 rxyz(2, il) = rxyz(2, i) + alat(2)
4821 rxyz(3, il) = rxyz(3, i) - alat(3)
4824 in = icell(0, ll1 - 1, 0, ll3 - 1)
4825 icell(0, -1, ll2, -1) = in
4827 i = icell(ii, ll1 - 1, 0, ll3 - 1)
4829 IF (il > nn) cpabort(
"enlarge laymx")
4831 icell(ii, -1, ll2, -1) = il
4832 rxyz(1, il) = rxyz(1, i) - alat(1)
4833 rxyz(2, il) = rxyz(2, i) + alat(2)
4834 rxyz(3, il) = rxyz(3, i) - alat(3)
4837 in = icell(0, 0, ll2 - 1, ll3 - 1)
4838 icell(0, ll1, -1, -1) = in
4840 i = icell(ii, 0, ll2 - 1, ll3 - 1)
4842 IF (il > nn) cpabort(
"enlarge laymx")
4844 icell(ii, ll1, -1, -1) = il
4845 rxyz(1, il) = rxyz(1, i) + alat(1)
4846 rxyz(2, il) = rxyz(2, i) - alat(2)
4847 rxyz(3, il) = rxyz(3, i) - alat(3)
4850 in = icell(0, ll1 - 1, ll2 - 1, ll3 - 1)
4851 icell(0, -1, -1, -1) = in
4853 i = icell(ii, ll1 - 1, ll2 - 1, ll3 - 1)
4855 IF (il > nn) cpabort(
"enlarge laymx")
4857 icell(ii, -1, -1, -1) = il
4858 rxyz(1, il) = rxyz(1, i) - alat(1)
4859 rxyz(2, il) = rxyz(2, i) - alat(2)
4860 rxyz(3, il) = rxyz(3, i) - alat(3)
4864 ALLOCATE (rel(5, nnbrx*nat))
4872 myspace = (nat*nnbrx)/npr
4873 IF (iam == 0) myspaceout = myspace
4879 DO ii = 1, icell(0, l1, l2, l3)
4880 iat = icell(ii, l1, l2, l3)
4881 IF (((iat - 1)*npr)/nat == iam)
THEN
4883 lsta(1, iat) = iam*myspace + indlst + 1
4884 CALL tersoff_sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
4885 rxyz, icell, lstb(iam*myspace + 1), lay, rel(1, iam*myspace + 1), cut2, indlst)
4886 lsta(2, iat) = iam*myspace + indlst
4888 ndat = lsta(2, iat) - lsta(1, iat) + 1
4895 indlstx = max(indlstx, indlst)
4897 IF (indlstx >= myspaceout) cpabort(
"NNBRX too small")
4901 npjx = 300; npjkx = 6000
4910 do_i:
DO i = 1, nmol
4911 CALL tersoff_subeniat_l(i, nmol, npmax,
kinds, x, r1, r2, cr, ca, alr, ala, xyzrrefdf, uadurdf, urtot, lsta, lstb, nnbrx, rel)
4914 urtot = 0.5_dp*urtot
4919 do_if:
DO i = 1, nmol
4920 CALL tersoff_subfiat_l(i,nmol,npmax,nnmax,
kinds,pn,co_bcd,bcsq,dsq,h,xyzrrefdf,uadurdf,f,uatot,dkeij,lsta,lstb,nnbrx)
4924 uatot = 0.5_dp*uatot
4926 DEALLOCATE (rxyz, icell, lay, rel)
4927 END SUBROUTINE tersoff_pairlist_energy_forces
4950 SUBROUTINE tersoff_sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
4951 rxyz, icell, lstb, lay, rel, cut2, indlst)
4954 INTEGER :: iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, &
4956 REAL(kind=
dp) :: rxyz(3, nn)
4957 INTEGER :: icell(0:ncx, -1:ll1, -1:ll2, -1:ll3), lstb(0:myspace - 1), lay(nn)
4958 REAL(kind=
dp) :: rel(5, 0:myspace - 1), cut2
4961 INTEGER :: jat, jj, k1, k2, k3
4962 REAL(kind=
dp) :: rr2, tt, tti, xrel, yrel, zrel
4964 DO k3 = l3 - 1, l3 + 1
4965 DO k2 = l2 - 1, l2 + 1
4966 DO k1 = l1 - 1, l1 + 1
4967 DO jj = 1, icell(0, k1, k2, k3)
4968 jat = icell(jj, k1, k2, k3)
4969 IF (jat == iat) cycle
4970 xrel = rxyz(1, iat) - rxyz(1, jat)
4971 yrel = rxyz(2, iat) - rxyz(2, jat)
4972 zrel = rxyz(3, iat) - rxyz(3, jat)
4973 rr2 = xrel**2 + yrel**2 + zrel**2
4974 IF (rr2 <= cut2)
THEN
4975 indlst = min(indlst, myspace - 1)
4976 lstb(indlst) = lay(jat)
4980 rel(1, indlst) = xrel*tti
4981 rel(2, indlst) = yrel*tti
4982 rel(3, indlst) = zrel*tti
4984 rel(5, indlst) = tti
4993 END SUBROUTINE tersoff_sublstiat_l
5016SUBROUTINE tersoff_subeniat_l(i, Nmol, Npmax, Kinds, X, R1, R2, Cr, Ca, alr, ala, XYZRrefdf, UadUrdf, Urtot, lsta, lstb, nnbrx, rel)
5018 INTEGER,
INTENT(in) :: nmol, npmax
5019 INTEGER,
DIMENSION(1:Nmol),
INTENT(in) ::
kinds
5020 REAL(kind=
dp),
DIMENSION(1:2, 1:2),
INTENT(in) :: x, r1, r2, cr, ca, alr, ala
5021 REAL(kind=
dp),
DIMENSION(1:6*Npmax),
INTENT(inout) :: xyzrrefdf
5022 REAL(kind=
dp),
DIMENSION(1:3*Npmax),
INTENT(inout) :: uadurdf
5023 REAL(kind=
dp),
INTENT(inout) :: urtot
5024 INTEGER,
INTENT(in) :: lsta(2, nmol), nnbrx, lstb(nnbrx*nmol)
5025 REAL(kind=
dp),
INTENT(in) :: rel(5, nnbrx*nmol)
5027 INTEGER :: j, ki, kj, l, nppt3, nppt6, nptot
5028 REAL(kind=
dp) :: alaij, alrij, dfij, fij, pl1, pl2, r1ij, &
5029 r2ij, rij, rreij, ua, ur, xij, yij, zij
5036 do_j:
DO l = lsta(1, i), lsta(2, i)
5047 nppt3 = 3*(nptot - 1)
5048 nppt6 = 6*(nptot - 1)
5051 xyzrrefdf(nppt6 + 1) = xij
5052 xyzrrefdf(nppt6 + 2) = yij
5053 xyzrrefdf(nppt6 + 3) = zij
5054 xyzrrefdf(nppt6 + 4) = rreij
5059 ur = cr(ki, kj)*exp(-alrij*rij)
5060 ua = -ca(ki, kj)*exp(-alaij*rij)*x(ki, kj)
5063 IF (rij <= r1ij)
THEN
5064 xyzrrefdf(nppt6 + 5) = 1.0_dp
5065 xyzrrefdf(nppt6 + 6) = 0.0_dp
5067 uadurdf(nppt3 + 1) = ua
5068 uadurdf(nppt3 + 2) = -alrij*ur
5069 uadurdf(nppt3 + 3) = -alaij*ua
5071 pl1 =
pi/(r2ij - r1ij)
5072 pl2 = pl1*(rij - r1ij)
5073 fij = 0.5_dp + 0.5_dp*cos(pl2)
5074 dfij = -0.5_dp*pl1*sin(pl2)
5075 xyzrrefdf(nppt6 + 5) = fij
5076 xyzrrefdf(nppt6 + 6) = dfij
5077 urtot = urtot + fij*ur
5078 uadurdf(nppt3 + 1) = fij*ua
5079 uadurdf(nppt3 + 2) = (dfij - alrij*fij)*ur
5080 uadurdf(nppt3 + 3) = (dfij - alaij*fij)*ua
5083 END SUBROUTINE tersoff_subeniat_l
5106 SUBROUTINE tersoff_subfiat_l(i,Nmol,Npmax,NNmax,Kinds,Pn,Co_bcd,bcsq,dsq,h,XYZRrefdf,UadUrdf,F,Uatot,dkEij,lsta,lstb,nnbrx)
5108 INTEGER,
INTENT(in) :: nmol, npmax, nnmax
5109 INTEGER,
DIMENSION(1:Nmol),
INTENT(in) ::
kinds
5110 REAL(kind=
dp),
DIMENSION(1:2),
INTENT(in) :: pn, co_bcd, bcsq, dsq, h
5111 REAL(kind=
dp),
DIMENSION(1:6*Npmax),
INTENT(in) :: xyzrrefdf
5112 REAL(kind=
dp),
DIMENSION(1:3*Npmax),
INTENT(in) :: uadurdf
5113 REAL(kind=
dp),
DIMENSION(1:3*Nmol),
INTENT(inout) :: f
5114 REAL(kind=
dp),
INTENT(inout) :: uatot
5115 REAL(kind=
dp),
DIMENSION(1:3*NNmax) :: dkeij
5116 INTEGER,
INTENT(in) :: lsta(2, nmol), nnbrx, lstb(nnbrx*nmol)
5118 INTEGER :: ij, ijpt3, ijpt6, ik, ikpt6, ipb, ipe, &
5119 ipt3, jpt3, ki, kpt3, nkpt3
5120 REAL(kind=
dp) :: bcsqi, bij, co1_dkeij, co2_dkeij, co_cdi, co_dhcosi, co_hcosi, co_mb1, &
5121 co_mb2, co_pa, cosijk, dfij, dfik, dfxi, dfxj, dfxk, dfyi, dfyj, dfyk, dfzi, dfzj, dfzk, &
5122 dgi, djeij, dsqi, dxjeij2, dyjeij2, dzjeij2, eij, fdg, fdgcos, fij, fik, gi, hi, pni, &
5123 rreij, rreik, ua, xrreij, xrreik, yrreij, yrreik, zrreij, zrreik
5140 do_j:
DO ij = ipb, ipe, +1
5145 xrreij = xyzrrefdf(ijpt6 + 1)
5146 yrreij = xyzrrefdf(ijpt6 + 2)
5147 zrreij = xyzrrefdf(ijpt6 + 3)
5148 rreij = xyzrrefdf(ijpt6 + 4)
5149 fij = xyzrrefdf(ijpt6 + 5)
5150 dfij = xyzrrefdf(ijpt6 + 6)
5159 do_k:
DO ik = ipb, ipe, +1
5163 ikij:
IF (ik /= ij)
THEN
5167 xrreik = xyzrrefdf(ikpt6 + 1)
5168 yrreik = xyzrrefdf(ikpt6 + 2)
5169 zrreik = xyzrrefdf(ikpt6 + 3)
5170 rreik = xyzrrefdf(ikpt6 + 4)
5171 fik = xyzrrefdf(ikpt6 + 5)
5172 dfik = xyzrrefdf(ikpt6 + 6)
5174 cosijk = xrreij*xrreik + yrreij*yrreik + zrreij*zrreik
5176 co_hcosi = hi - cosijk
5177 co_dhcosi = 1.0_dp/(dsqi + co_hcosi*co_hcosi)
5178 gi = -bcsqi*co_dhcosi
5179 dgi = 2.0_dp*co_hcosi*co_dhcosi*gi
5187 djeij = djeij + fdgcos
5189 dxjeij2 = dxjeij2 + fdg*xrreik
5190 dyjeij2 = dyjeij2 + fdg*yrreik
5191 dzjeij2 = dzjeij2 + fdg*zrreik
5193 co1_dkeij = -dfik*gi + fdgcos*rreik
5194 co2_dkeij = -fdg*rreik
5196 dkeij(nkpt3 + 1) = co1_dkeij*xrreik + co2_dkeij*xrreij
5197 dkeij(nkpt3 + 2) = co1_dkeij*yrreik + co2_dkeij*yrreij
5198 dkeij(nkpt3 + 3) = co1_dkeij*zrreik + co2_dkeij*zrreij
5201 dkeij(nkpt3 + 1) = 0.0_dp
5202 dkeij(nkpt3 + 2) = 0.0_dp
5203 dkeij(nkpt3 + 3) = 0.0_dp
5208 bij = 1.0_dp + eij**pni
5209 ua = uadurdf(ijpt3 + 1)*bij**(-0.5_dp/pni)
5212 co_pa = uadurdf(ijpt3 + 2) + uadurdf(ijpt3 + 3)*bij**(-0.5_dp/pni)
5214 ceij:
IF (nkpt3 > 0)
THEN
5216 co_mb1 = ua*0.5_dp*eij**(pni - 1.0_dp)/bij
5217 co_mb2 = co_mb1*rreij
5220 DO ik = ipb, ipe, +1
5223 dfxk = co_mb1*dkeij(nkpt3 + 1)
5224 dfyk = co_mb1*dkeij(nkpt3 + 2)
5225 dfzk = co_mb1*dkeij(nkpt3 + 3)
5227 kpt3 = 3*(lstb(ik) - 1)
5228 f(kpt3 + 1) = f(kpt3 + 1) + dfxk
5229 f(kpt3 + 2) = f(kpt3 + 2) + dfyk
5230 f(kpt3 + 3) = f(kpt3 + 3) + dfzk
5238 dfxj = co_pa*xrreij + co_mb2*(xrreij*djeij - dxjeij2)
5239 dfyj = co_pa*yrreij + co_mb2*(yrreij*djeij - dyjeij2)
5240 dfzj = co_pa*zrreij + co_mb2*(zrreij*djeij - dzjeij2)
5250 jpt3 = 3*(lstb(ij) - 1)
5252 f(jpt3 + 1) = f(jpt3 + 1) + dfxj
5253 f(jpt3 + 2) = f(jpt3 + 2) + dfyj
5254 f(jpt3 + 3) = f(jpt3 + 3) + dfzj
5263 f(ipt3 + 1) = f(ipt3 + 1) - dfxi
5264 f(ipt3 + 2) = f(ipt3 + 2) - dfyi
5265 f(ipt3 + 3) = f(ipt3 + 3) - dfzi
5266 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.
Utility routines to open and close files.
subroutine, public open_file(file_name, unit_number, file_status, file_form, file_action, file_position, file_pad, file_access, debug)
Opens a file and returns its logical unit number.
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...
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...
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, file_access)
...
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