43#include "./base/base_uses.f90"
48 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'eip_silicon'
77 CHARACTER(len=*),
PARAMETER :: routinen =
'eip_bazant'
79 INTEGER :: handle, i, iparticle, iparticle_kind, &
80 iparticle_local, iw, natom, &
81 nparticle_kind, nparticle_local
82 REAL(kind=
dp) :: ekin, ener, ener_var, mass
83 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rxyz
84 REAL(kind=
dp),
DIMENSION(3) :: abc
98 CALL timeset(routinen, handle)
100 NULLIFY (cell, particle_set, eip_section, logger, atomic_kinds, &
101 atomic_kind, local_particles, subsys, atomic_kind_set, para_env)
107 cpassert(
ASSOCIATED(eip_env))
109 CALL eip_env_get(eip_env=eip_env, cell=cell, particle_set=particle_set, &
110 subsys=subsys, local_particles=local_particles, &
111 atomic_kind_set=atomic_kind_set)
115 natom =
SIZE(particle_set)
118 ALLOCATE (rxyz(3, natom))
122 rxyz(:, i) = particle_set(i)%r(:)*
angstrom
125 CALL eip_bazant_silicon(nat=natom, alat=abc*
angstrom, rxyz0=rxyz, &
126 fxyz=eip_env%eip_forces, ener=ener, &
127 coord=eip_env%coord_avg, ener_var=ener_var, &
128 coord_var=eip_env%coord_var, count=eip_env%count)
133 nparticle_kind = atomic_kinds%n_els
135 DO iparticle_kind = 1, nparticle_kind
136 atomic_kind => atomic_kind_set(iparticle_kind)
138 nparticle_local = local_particles%n_el(iparticle_kind)
139 DO iparticle_local = 1, nparticle_local
140 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
141 ekin = ekin + 0.5_dp*mass* &
142 (particle_set(iparticle)%v(1)*particle_set(iparticle)%v(1) &
143 + particle_set(iparticle)%v(2)*particle_set(iparticle)%v(2) &
144 + particle_set(iparticle)%v(3)*particle_set(iparticle)%v(3))
150 CALL para_env%sum(ekin)
151 eip_env%eip_kinetic_energy = ekin
153 eip_env%eip_potential_energy = ener/
evolt
154 eip_env%eip_energy = eip_env%eip_kinetic_energy + eip_env%eip_potential_energy
155 eip_env%eip_energy_var = ener_var/
evolt
158 particle_set(i)%f(:) = eip_env%eip_forces(:, i)/
evolt*
angstrom
165 eip_section,
"PRINT%ENERGIES"),
cp_p_file))
THEN
169 CALL eip_print_energies(eip_env=eip_env, output_unit=iw)
175 eip_section,
"PRINT%ENERGIES_VAR"),
cp_p_file))
THEN
179 CALL eip_print_energy_var(eip_env=eip_env, output_unit=iw)
181 "PRINT%ENERGIES_VAR")
185 eip_section,
"PRINT%FORCES"),
cp_p_file))
THEN
189 CALL eip_print_forces(eip_env=eip_env, output_unit=iw)
195 eip_section,
"PRINT%COORD_AVG"),
cp_p_file))
THEN
199 CALL eip_print_coord_avg(eip_env=eip_env, output_unit=iw)
205 eip_section,
"PRINT%COORD_VAR"),
cp_p_file))
THEN
209 CALL eip_print_coord_var(eip_env=eip_env, output_unit=iw)
215 eip_section,
"PRINT%COUNT"),
cp_p_file))
THEN
219 CALL eip_print_count(eip_env=eip_env, output_unit=iw)
224 CALL timestop(handle)
243 CHARACTER(len=*),
PARAMETER :: routinen =
'eip_lenosky'
245 INTEGER :: handle, i, iparticle, iparticle_kind, &
246 iparticle_local, iw, natom, &
247 nparticle_kind, nparticle_local
248 REAL(kind=
dp) :: ekin, ener, ener_var, mass
249 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rxyz
250 REAL(kind=
dp),
DIMENSION(3) :: abc
264 CALL timeset(routinen, handle)
266 NULLIFY (cell, particle_set, eip_section, logger, atomic_kinds, &
267 atomic_kind, local_particles, subsys, atomic_kind_set, para_env)
273 cpassert(
ASSOCIATED(eip_env))
275 CALL eip_env_get(eip_env=eip_env, cell=cell, particle_set=particle_set, &
276 subsys=subsys, local_particles=local_particles, &
277 atomic_kind_set=atomic_kind_set)
281 natom =
SIZE(particle_set)
284 ALLOCATE (rxyz(3, natom))
288 rxyz(:, i) = particle_set(i)%r(:)*
angstrom
291 CALL eip_lenosky_silicon(nat=natom, alat=abc*
angstrom, rxyz0=rxyz, &
292 fxyz=eip_env%eip_forces, ener=ener, &
293 coord=eip_env%coord_avg, ener_var=ener_var, &
294 coord_var=eip_env%coord_var, count=eip_env%count)
299 nparticle_kind = atomic_kinds%n_els
301 DO iparticle_kind = 1, nparticle_kind
302 atomic_kind => atomic_kind_set(iparticle_kind)
304 nparticle_local = local_particles%n_el(iparticle_kind)
305 DO iparticle_local = 1, nparticle_local
306 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
307 ekin = ekin + 0.5_dp*mass* &
308 (particle_set(iparticle)%v(1)*particle_set(iparticle)%v(1) &
309 + particle_set(iparticle)%v(2)*particle_set(iparticle)%v(2) &
310 + particle_set(iparticle)%v(3)*particle_set(iparticle)%v(3))
316 CALL para_env%sum(ekin)
317 eip_env%eip_kinetic_energy = ekin
319 eip_env%eip_potential_energy = ener/
evolt
320 eip_env%eip_energy = eip_env%eip_kinetic_energy + eip_env%eip_potential_energy
321 eip_env%eip_energy_var = ener_var/
evolt
324 particle_set(i)%f(:) = eip_env%eip_forces(:, i)/
evolt*
angstrom
331 eip_section,
"PRINT%ENERGIES"),
cp_p_file))
THEN
335 CALL eip_print_energies(eip_env=eip_env, output_unit=iw)
341 eip_section,
"PRINT%ENERGIES_VAR"),
cp_p_file))
THEN
345 CALL eip_print_energy_var(eip_env=eip_env, output_unit=iw)
347 "PRINT%ENERGIES_VAR")
351 eip_section,
"PRINT%FORCES"),
cp_p_file))
THEN
355 CALL eip_print_forces(eip_env=eip_env, output_unit=iw)
361 eip_section,
"PRINT%COORD_AVG"),
cp_p_file))
THEN
365 CALL eip_print_coord_avg(eip_env=eip_env, output_unit=iw)
371 eip_section,
"PRINT%COORD_VAR"),
cp_p_file))
THEN
375 CALL eip_print_coord_var(eip_env=eip_env, output_unit=iw)
381 eip_section,
"PRINT%COUNT"),
cp_p_file))
THEN
385 CALL eip_print_count(eip_env=eip_env, output_unit=iw)
390 CALL timestop(handle)
407 CHARACTER(len=*),
PARAMETER :: routinen =
'eip_stillinger_weber'
409 INTEGER :: handle, i, iparticle, iparticle_kind, &
410 iparticle_local, iw, natom, &
411 nparticle_kind, nparticle_local
412 REAL(kind=
dp) :: ekin, ener, mass
413 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rxyz
414 REAL(kind=
dp),
DIMENSION(3) :: abc
426 CALL timeset(routinen, handle)
428 NULLIFY (cell, particle_set, eip_section, logger, atomic_kinds, &
429 atomic_kind, local_particles, subsys, atomic_kind_set, para_env)
435 cpassert(
ASSOCIATED(eip_env))
437 CALL eip_env_get(eip_env=eip_env, cell=cell, particle_set=particle_set, &
438 subsys=subsys, local_particles=local_particles, &
439 atomic_kind_set=atomic_kind_set)
443 natom =
SIZE(particle_set)
445 ALLOCATE (rxyz(3, natom))
448 rxyz(:, i) = particle_set(i)%r(:)*
angstrom
451 CALL eip_stillinger_weber_silicon(nat=natom, alat=abc*
angstrom, &
452 rxyz0=rxyz, fxyz=eip_env%eip_forces, &
453 etot=ener, count=eip_env%count)
455 eip_env%coord_avg = 0.0_dp
456 eip_env%coord_var = 0.0_dp
460 nparticle_kind = atomic_kinds%n_els
462 DO iparticle_kind = 1, nparticle_kind
463 atomic_kind => atomic_kind_set(iparticle_kind)
465 nparticle_local = local_particles%n_el(iparticle_kind)
466 DO iparticle_local = 1, nparticle_local
467 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
468 ekin = ekin + 0.5_dp*mass* &
469 (particle_set(iparticle)%v(1)*particle_set(iparticle)%v(1) &
470 + particle_set(iparticle)%v(2)*particle_set(iparticle)%v(2) &
471 + particle_set(iparticle)%v(3)*particle_set(iparticle)%v(3))
476 CALL para_env%sum(ekin)
477 eip_env%eip_kinetic_energy = ekin
479 eip_env%eip_potential_energy = ener/
evolt
480 eip_env%eip_energy = eip_env%eip_kinetic_energy + eip_env%eip_potential_energy
481 eip_env%eip_energy_var = 0.0_dp
484 particle_set(i)%f(:) = eip_env%eip_forces(:, i)/
evolt*
angstrom
490 eip_section,
"PRINT%ENERGIES"),
cp_p_file))
THEN
494 CALL eip_print_energies(eip_env=eip_env, output_unit=iw)
500 eip_section,
"PRINT%ENERGIES_VAR"),
cp_p_file))
THEN
504 CALL eip_print_energy_var(eip_env=eip_env, output_unit=iw)
506 "PRINT%ENERGIES_VAR")
510 eip_section,
"PRINT%FORCES"),
cp_p_file))
THEN
514 CALL eip_print_forces(eip_env=eip_env, output_unit=iw)
520 eip_section,
"PRINT%COORD_AVG"),
cp_p_file))
THEN
524 CALL eip_print_coord_avg(eip_env=eip_env, output_unit=iw)
530 eip_section,
"PRINT%COORD_VAR"),
cp_p_file))
THEN
534 CALL eip_print_coord_var(eip_env=eip_env, output_unit=iw)
540 eip_section,
"PRINT%COUNT"),
cp_p_file))
THEN
544 CALL eip_print_count(eip_env=eip_env, output_unit=iw)
549 CALL timestop(handle)
569 CHARACTER(len=*),
PARAMETER :: routinen =
'eip_tersoff'
571 INTEGER :: handle, i, iparticle, iparticle_kind, &
572 iparticle_local, iw, natom, &
573 nparticle_kind, nparticle_local
574 REAL(kind=
dp) :: ekin, ener, mass
575 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rxyz
576 REAL(kind=
dp),
DIMENSION(3) :: abc
588 CALL timeset(routinen, handle)
590 NULLIFY (cell, particle_set, eip_section, logger, atomic_kinds, &
591 atomic_kind, local_particles, subsys, atomic_kind_set, para_env)
597 cpassert(
ASSOCIATED(eip_env))
599 CALL eip_env_get(eip_env=eip_env, cell=cell, particle_set=particle_set, &
600 subsys=subsys, local_particles=local_particles, &
601 atomic_kind_set=atomic_kind_set)
605 natom =
SIZE(particle_set)
607 ALLOCATE (rxyz(3, natom))
610 rxyz(:, i) = particle_set(i)%r(:)*
angstrom
613 CALL eip_tersoff_silicon(nat=natom, alat=abc*
angstrom, rxyz=rxyz, &
614 fxyz=eip_env%eip_forces, etot=ener, &
617 eip_env%coord_avg = 0.0_dp
618 eip_env%coord_var = 0.0_dp
622 nparticle_kind = atomic_kinds%n_els
624 DO iparticle_kind = 1, nparticle_kind
625 atomic_kind => atomic_kind_set(iparticle_kind)
627 nparticle_local = local_particles%n_el(iparticle_kind)
628 DO iparticle_local = 1, nparticle_local
629 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
630 ekin = ekin + 0.5_dp*mass* &
631 (particle_set(iparticle)%v(1)*particle_set(iparticle)%v(1) &
632 + particle_set(iparticle)%v(2)*particle_set(iparticle)%v(2) &
633 + particle_set(iparticle)%v(3)*particle_set(iparticle)%v(3))
638 CALL para_env%sum(ekin)
639 eip_env%eip_kinetic_energy = ekin
641 eip_env%eip_potential_energy = ener/
evolt
642 eip_env%eip_energy = eip_env%eip_kinetic_energy + eip_env%eip_potential_energy
643 eip_env%eip_energy_var = 0.0_dp
646 particle_set(i)%f(:) = eip_env%eip_forces(:, i)/
evolt*
angstrom
652 eip_section,
"PRINT%ENERGIES"),
cp_p_file))
THEN
656 CALL eip_print_energies(eip_env=eip_env, output_unit=iw)
662 eip_section,
"PRINT%ENERGIES_VAR"),
cp_p_file))
THEN
666 CALL eip_print_energy_var(eip_env=eip_env, output_unit=iw)
668 "PRINT%ENERGIES_VAR")
672 eip_section,
"PRINT%FORCES"),
cp_p_file))
THEN
676 CALL eip_print_forces(eip_env=eip_env, output_unit=iw)
682 eip_section,
"PRINT%COORD_AVG"),
cp_p_file))
THEN
686 CALL eip_print_coord_avg(eip_env=eip_env, output_unit=iw)
692 eip_section,
"PRINT%COORD_VAR"),
cp_p_file))
THEN
696 CALL eip_print_coord_var(eip_env=eip_env, output_unit=iw)
702 eip_section,
"PRINT%COUNT"),
cp_p_file))
THEN
706 CALL eip_print_count(eip_env=eip_env, output_unit=iw)
711 CALL timestop(handle)
726 SUBROUTINE eip_print_energies(eip_env, output_unit)
728 INTEGER,
INTENT(IN) :: output_unit
732 IF (output_unit > 0)
THEN
733 WRITE (unit=output_unit, fmt=
"(/,(T3,A,T55,F25.14))") &
734 "Kinetic energy [Hartree]: ", eip_env%eip_kinetic_energy, &
735 "Potential energy [Hartree]: ", eip_env%eip_potential_energy, &
736 "Total EIP energy [Hartree]: ", eip_env%eip_energy
739 END SUBROUTINE eip_print_energies
749 SUBROUTINE eip_print_energy_var(eip_env, output_unit)
751 INTEGER,
INTENT(IN) :: output_unit
757 unit_nr = output_unit
759 IF (unit_nr > 0)
THEN
761 WRITE (unit_nr, *)
""
762 WRITE (unit_nr, *)
"The variance of the EIP energy/atom!"
763 WRITE (unit_nr, *)
""
764 WRITE (unit_nr, *) eip_env%eip_energy_var
768 END SUBROUTINE eip_print_energy_var
778 SUBROUTINE eip_print_forces(eip_env, output_unit)
780 INTEGER,
INTENT(IN) :: output_unit
782 INTEGER :: iatom, natom, unit_nr
787 NULLIFY (particle_set)
789 unit_nr = output_unit
791 IF (unit_nr > 0)
THEN
793 CALL eip_env_get(eip_env=eip_env, particle_set=particle_set)
795 natom =
SIZE(particle_set)
797 WRITE (unit_nr, *)
""
798 WRITE (unit_nr, *)
"The EIP forces!"
799 WRITE (unit_nr, *)
""
800 WRITE (unit_nr, *)
"Total EIP forces [Hartree/Bohr]"
802 WRITE (unit_nr, *) eip_env%eip_forces(1:3, iatom)
807 END SUBROUTINE eip_print_forces
817 SUBROUTINE eip_print_coord_avg(eip_env, output_unit)
819 INTEGER,
INTENT(IN) :: output_unit
825 unit_nr = output_unit
827 IF (unit_nr > 0)
THEN
829 WRITE (unit_nr, *)
""
830 WRITE (unit_nr, *)
"The average coordination number!"
831 WRITE (unit_nr, *)
""
832 WRITE (unit_nr, *) eip_env%coord_avg
836 END SUBROUTINE eip_print_coord_avg
846 SUBROUTINE eip_print_coord_var(eip_env, output_unit)
848 INTEGER,
INTENT(IN) :: output_unit
854 unit_nr = output_unit
856 IF (unit_nr > 0)
THEN
858 WRITE (unit_nr, *)
""
859 WRITE (unit_nr, *)
"The variance of the coordination number!"
860 WRITE (unit_nr, *)
""
861 WRITE (unit_nr, *) eip_env%coord_var
865 END SUBROUTINE eip_print_coord_var
875 SUBROUTINE eip_print_count(eip_env, output_unit)
877 INTEGER,
INTENT(IN) :: output_unit
883 unit_nr = output_unit
885 IF (unit_nr > 0)
THEN
887 WRITE (unit_nr, *)
""
888 WRITE (unit_nr, *)
"The function call counter!"
889 WRITE (unit_nr, *)
""
890 WRITE (unit_nr, *) eip_env%count
894 END SUBROUTINE eip_print_count
925 SUBROUTINE eip_bazant_silicon(nat, alat, rxyz0, fxyz, ener, coord, ener_var, &
929 REAL(kind=
dp) :: alat, rxyz0, fxyz, ener, coord, &
930 ener_var, coord_var, count
932 dimension rxyz0(3, nat), fxyz(3, nat), alat(3)
933 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rxyz
934 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: lsta
935 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: lstb
936 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: lay
937 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :, :) :: icell
938 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rel
939 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: txyz
940 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: s2, s3, sz
941 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: num2, num3, numz
943 REAL(kind=
dp) :: coord2, cut, cut2, ener2, rlc1i, rlc2i, rlc3i, tcoord, &
944 tcoord2, tener, tener2
945 INTEGER :: iam, iat, iat1, iat2, ii, i, il, in, indlst, indlstx, istop, &
946 istopg, l2, l3, laymx, ll1, ll2, ll3, lot, max_nbrs, myspace, &
947 l1, myspaceout, ncx, nn, nnbrx, npr
950 cut = 3.1213820e0_dp + 1.e-14_dp
952 IF (count == 0)
OPEN (unit=10, file=
'bazant.mon', status=
'unknown')
953 count = count + 1.e0_dp
956 ll1 = int(alat(1)/cut)
957 IF (ll1 < 1) cpabort(
"alat(1) too small")
958 ll2 = int(alat(2)/cut)
959 IF (ll2 < 1) cpabort(
"alat(2) too small")
960 ll3 = int(alat(3)/cut)
961 IF (ll3 < 1) cpabort(
"alat(3) too small")
977 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
978 icell(0, -1:ll1, -1:ll2, -1:ll3) = 0
983 loop_iat_s:
DO iat = 1, nat
984 rxyz0(1, iat) =
modulo(
modulo(rxyz0(1, iat), alat(1)), alat(1))
985 rxyz0(2, iat) =
modulo(
modulo(rxyz0(2, iat), alat(2)), alat(2))
986 rxyz0(3, iat) =
modulo(
modulo(rxyz0(3, iat), alat(3)), alat(3))
987 l1 = int(rxyz0(1, iat)*rlc1i)
988 l2 = int(rxyz0(2, iat)*rlc2i)
989 l3 = int(rxyz0(3, iat)*rlc3i)
991 ii = icell(0, l1, l2, l3)
993 icell(0, l1, l2, l3) = ii
995 WRITE (10, *) count,
'NCX too small', ncx
1000 icell(ii, l1, l2, l3) = iat
1010 rxyz0(1, iat) =
modulo(
modulo(rxyz0(1, iat), alat(1)), alat(1))
1011 rxyz0(2, iat) =
modulo(
modulo(rxyz0(2, iat), alat(2)), alat(2))
1012 rxyz0(3, iat) =
modulo(
modulo(rxyz0(3, iat), alat(3)), alat(3))
1020 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
1021 icell(0, -1:ll1, -1:ll2, -1:ll3) = 0
1027 loop_iat_p:
DO iat = 1, nat
1028 l1 = int(rxyz0(1, iat)*rlc1i)
1029 l2 = int(rxyz0(2, iat)*rlc2i)
1030 l3 = int(rxyz0(3, iat)*rlc3i)
1031 ii = icell(0, l1, l2, l3)
1033 icell(0, l1, l2, l3) = ii
1035 WRITE (10, *) count,
'NCX too small', ncx
1040 icell(ii, l1, l2, l3) = iat
1048 laymx = ncx*(2*ll1*ll2 + 2*ll1*ll3 + 2*ll2*ll3 + 4*ll1 + 4*ll2 + 4*ll3 + 8)
1050 ALLOCATE (rxyz(3, nn), lay(nn))
1053 rxyz(1, iat) = rxyz0(1, iat)
1054 rxyz(2, iat) = rxyz0(2, iat)
1055 rxyz(3, iat) = rxyz0(3, iat)
1062 in = icell(0, l1, l2, 0)
1063 icell(0, l1, l2, ll3) = in
1065 i = icell(ii, l1, l2, 0)
1067 IF (il > nn) cpabort(
"enlarge laymx")
1069 icell(ii, l1, l2, ll3) = il
1070 rxyz(1, il) = rxyz(1, i)
1071 rxyz(2, il) = rxyz(2, i)
1072 rxyz(3, il) = rxyz(3, i) + alat(3)
1075 in = icell(0, l1, l2, ll3 - 1)
1076 icell(0, l1, l2, -1) = in
1078 i = icell(ii, l1, l2, ll3 - 1)
1080 IF (il > nn) cpabort(
"enlarge laymx")
1082 icell(ii, l1, l2, -1) = il
1083 rxyz(1, il) = rxyz(1, i)
1084 rxyz(2, il) = rxyz(2, i)
1085 rxyz(3, il) = rxyz(3, i) - alat(3)
1095 in = icell(0, 0, l2, l3)
1096 icell(0, ll1, l2, l3) = in
1098 i = icell(ii, 0, l2, l3)
1100 IF (il > nn) cpabort(
"enlarge laymx")
1102 icell(ii, ll1, l2, l3) = il
1103 rxyz(1, il) = rxyz(1, i) + alat(1)
1104 rxyz(2, il) = rxyz(2, i)
1105 rxyz(3, il) = rxyz(3, i)
1108 in = icell(0, ll1 - 1, l2, l3)
1109 icell(0, -1, l2, l3) = in
1111 i = icell(ii, ll1 - 1, l2, l3)
1113 IF (il > nn) cpabort(
"enlarge laymx")
1115 icell(ii, -1, l2, l3) = il
1116 rxyz(1, il) = rxyz(1, i) - alat(1)
1117 rxyz(2, il) = rxyz(2, i)
1118 rxyz(3, il) = rxyz(3, i)
1128 in = icell(0, l1, 0, l3)
1129 icell(0, l1, ll2, l3) = in
1131 i = icell(ii, l1, 0, l3)
1133 IF (il > nn) cpabort(
"enlarge laymx")
1135 icell(ii, l1, ll2, l3) = il
1136 rxyz(1, il) = rxyz(1, i)
1137 rxyz(2, il) = rxyz(2, i) + alat(2)
1138 rxyz(3, il) = rxyz(3, i)
1141 in = icell(0, l1, ll2 - 1, l3)
1142 icell(0, l1, -1, l3) = in
1144 i = icell(ii, l1, ll2 - 1, l3)
1146 IF (il > nn) cpabort(
"enlarge laymx")
1148 icell(ii, l1, -1, l3) = il
1149 rxyz(1, il) = rxyz(1, i)
1150 rxyz(2, il) = rxyz(2, i) - alat(2)
1151 rxyz(3, il) = rxyz(3, i)
1160 in = icell(0, l1, 0, 0)
1161 icell(0, l1, ll2, ll3) = in
1163 i = icell(ii, l1, 0, 0)
1165 IF (il > nn) cpabort(
"enlarge laymx")
1167 icell(ii, l1, ll2, ll3) = il
1168 rxyz(1, il) = rxyz(1, i)
1169 rxyz(2, il) = rxyz(2, i) + alat(2)
1170 rxyz(3, il) = rxyz(3, i) + alat(3)
1173 in = icell(0, l1, 0, ll3 - 1)
1174 icell(0, l1, ll2, -1) = in
1176 i = icell(ii, l1, 0, ll3 - 1)
1178 IF (il > nn) cpabort(
"enlarge laymx")
1180 icell(ii, l1, ll2, -1) = il
1181 rxyz(1, il) = rxyz(1, i)
1182 rxyz(2, il) = rxyz(2, i) + alat(2)
1183 rxyz(3, il) = rxyz(3, i) - alat(3)
1186 in = icell(0, l1, ll2 - 1, 0)
1187 icell(0, l1, -1, ll3) = in
1189 i = icell(ii, l1, ll2 - 1, 0)
1191 IF (il > nn) cpabort(
"enlarge laymx")
1193 icell(ii, l1, -1, ll3) = il
1194 rxyz(1, il) = rxyz(1, i)
1195 rxyz(2, il) = rxyz(2, i) - alat(2)
1196 rxyz(3, il) = rxyz(3, i) + alat(3)
1199 in = icell(0, l1, ll2 - 1, ll3 - 1)
1200 icell(0, l1, -1, -1) = in
1202 i = icell(ii, l1, ll2 - 1, ll3 - 1)
1204 IF (il > nn) cpabort(
"enlarge laymx")
1206 icell(ii, l1, -1, -1) = il
1207 rxyz(1, il) = rxyz(1, i)
1208 rxyz(2, il) = rxyz(2, i) - alat(2)
1209 rxyz(3, il) = rxyz(3, i) - alat(3)
1217 in = icell(0, 0, l2, 0)
1218 icell(0, ll1, l2, ll3) = in
1220 i = icell(ii, 0, l2, 0)
1222 IF (il > nn) cpabort(
"enlarge laymx")
1224 icell(ii, ll1, l2, ll3) = il
1225 rxyz(1, il) = rxyz(1, i) + alat(1)
1226 rxyz(2, il) = rxyz(2, i)
1227 rxyz(3, il) = rxyz(3, i) + alat(3)
1230 in = icell(0, 0, l2, ll3 - 1)
1231 icell(0, ll1, l2, -1) = in
1233 i = icell(ii, 0, l2, ll3 - 1)
1235 IF (il > nn) cpabort(
"enlarge laymx")
1237 icell(ii, ll1, l2, -1) = il
1238 rxyz(1, il) = rxyz(1, i) + alat(1)
1239 rxyz(2, il) = rxyz(2, i)
1240 rxyz(3, il) = rxyz(3, i) - alat(3)
1243 in = icell(0, ll1 - 1, l2, 0)
1244 icell(0, -1, l2, ll3) = in
1246 i = icell(ii, ll1 - 1, l2, 0)
1248 IF (il > nn) cpabort(
"enlarge laymx")
1250 icell(ii, -1, l2, ll3) = il
1251 rxyz(1, il) = rxyz(1, i) - alat(1)
1252 rxyz(2, il) = rxyz(2, i)
1253 rxyz(3, il) = rxyz(3, i) + alat(3)
1256 in = icell(0, ll1 - 1, l2, ll3 - 1)
1257 icell(0, -1, l2, -1) = in
1259 i = icell(ii, ll1 - 1, l2, ll3 - 1)
1261 IF (il > nn) cpabort(
"enlarge laymx")
1263 icell(ii, -1, l2, -1) = il
1264 rxyz(1, il) = rxyz(1, i) - alat(1)
1265 rxyz(2, il) = rxyz(2, i)
1266 rxyz(3, il) = rxyz(3, i) - alat(3)
1274 in = icell(0, 0, 0, l3)
1275 icell(0, ll1, ll2, l3) = in
1277 i = icell(ii, 0, 0, l3)
1279 IF (il > nn) cpabort(
"enlarge laymx")
1281 icell(ii, ll1, ll2, l3) = il
1282 rxyz(1, il) = rxyz(1, i) + alat(1)
1283 rxyz(2, il) = rxyz(2, i) + alat(2)
1284 rxyz(3, il) = rxyz(3, i)
1287 in = icell(0, ll1 - 1, 0, l3)
1288 icell(0, -1, ll2, l3) = in
1290 i = icell(ii, ll1 - 1, 0, l3)
1292 IF (il > nn) cpabort(
"enlarge laymx")
1294 icell(ii, -1, ll2, l3) = il
1295 rxyz(1, il) = rxyz(1, i) - alat(1)
1296 rxyz(2, il) = rxyz(2, i) + alat(2)
1297 rxyz(3, il) = rxyz(3, i)
1300 in = icell(0, 0, ll2 - 1, l3)
1301 icell(0, ll1, -1, l3) = in
1303 i = icell(ii, 0, ll2 - 1, l3)
1305 IF (il > nn) cpabort(
"enlarge laymx")
1307 icell(ii, ll1, -1, l3) = il
1308 rxyz(1, il) = rxyz(1, i) + alat(1)
1309 rxyz(2, il) = rxyz(2, i) - alat(2)
1310 rxyz(3, il) = rxyz(3, i)
1313 in = icell(0, ll1 - 1, ll2 - 1, l3)
1314 icell(0, -1, -1, l3) = in
1316 i = icell(ii, ll1 - 1, ll2 - 1, l3)
1318 IF (il > nn) cpabort(
"enlarge laymx")
1320 icell(ii, -1, -1, l3) = il
1321 rxyz(1, il) = rxyz(1, i) - alat(1)
1322 rxyz(2, il) = rxyz(2, i) - alat(2)
1323 rxyz(3, il) = rxyz(3, i)
1329 in = icell(0, 0, 0, 0)
1330 icell(0, ll1, ll2, ll3) = in
1332 i = icell(ii, 0, 0, 0)
1334 IF (il > nn) cpabort(
"enlarge laymx")
1336 icell(ii, ll1, ll2, ll3) = il
1337 rxyz(1, il) = rxyz(1, i) + alat(1)
1338 rxyz(2, il) = rxyz(2, i) + alat(2)
1339 rxyz(3, il) = rxyz(3, i) + alat(3)
1342 in = icell(0, ll1 - 1, 0, 0)
1343 icell(0, -1, ll2, ll3) = in
1345 i = icell(ii, ll1 - 1, 0, 0)
1347 IF (il > nn) cpabort(
"enlarge laymx")
1349 icell(ii, -1, ll2, ll3) = il
1350 rxyz(1, il) = rxyz(1, i) - alat(1)
1351 rxyz(2, il) = rxyz(2, i) + alat(2)
1352 rxyz(3, il) = rxyz(3, i) + alat(3)
1355 in = icell(0, 0, ll2 - 1, 0)
1356 icell(0, ll1, -1, ll3) = in
1358 i = icell(ii, 0, ll2 - 1, 0)
1360 IF (il > nn) cpabort(
"enlarge laymx")
1362 icell(ii, ll1, -1, ll3) = il
1363 rxyz(1, il) = rxyz(1, i) + alat(1)
1364 rxyz(2, il) = rxyz(2, i) - alat(2)
1365 rxyz(3, il) = rxyz(3, i) + alat(3)
1368 in = icell(0, ll1 - 1, ll2 - 1, 0)
1369 icell(0, -1, -1, ll3) = in
1371 i = icell(ii, ll1 - 1, ll2 - 1, 0)
1373 IF (il > nn) cpabort(
"enlarge laymx")
1375 icell(ii, -1, -1, ll3) = il
1376 rxyz(1, il) = rxyz(1, i) - alat(1)
1377 rxyz(2, il) = rxyz(2, i) - alat(2)
1378 rxyz(3, il) = rxyz(3, i) + alat(3)
1381 in = icell(0, 0, 0, ll3 - 1)
1382 icell(0, ll1, ll2, -1) = in
1384 i = icell(ii, 0, 0, ll3 - 1)
1386 IF (il > nn) cpabort(
"enlarge laymx")
1388 icell(ii, ll1, ll2, -1) = il
1389 rxyz(1, il) = rxyz(1, i) + alat(1)
1390 rxyz(2, il) = rxyz(2, i) + alat(2)
1391 rxyz(3, il) = rxyz(3, i) - alat(3)
1394 in = icell(0, ll1 - 1, 0, ll3 - 1)
1395 icell(0, -1, ll2, -1) = in
1397 i = icell(ii, ll1 - 1, 0, ll3 - 1)
1399 IF (il > nn) cpabort(
"enlarge laymx")
1401 icell(ii, -1, ll2, -1) = il
1402 rxyz(1, il) = rxyz(1, i) - alat(1)
1403 rxyz(2, il) = rxyz(2, i) + alat(2)
1404 rxyz(3, il) = rxyz(3, i) - alat(3)
1407 in = icell(0, 0, ll2 - 1, ll3 - 1)
1408 icell(0, ll1, -1, -1) = in
1410 i = icell(ii, 0, ll2 - 1, ll3 - 1)
1412 IF (il > nn) cpabort(
"enlarge laymx")
1414 icell(ii, ll1, -1, -1) = il
1415 rxyz(1, il) = rxyz(1, i) + alat(1)
1416 rxyz(2, il) = rxyz(2, i) - alat(2)
1417 rxyz(3, il) = rxyz(3, i) - alat(3)
1420 in = icell(0, ll1 - 1, ll2 - 1, ll3 - 1)
1421 icell(0, -1, -1, -1) = in
1423 i = icell(ii, ll1 - 1, ll2 - 1, ll3 - 1)
1425 IF (il > nn) cpabort(
"enlarge laymx")
1427 icell(ii, -1, -1, -1) = il
1428 rxyz(1, il) = rxyz(1, i) - alat(1)
1429 rxyz(2, il) = rxyz(2, i) - alat(2)
1430 rxyz(3, il) = rxyz(3, i) - alat(3)
1433 ALLOCATE (lsta(2, nat))
1436 ALLOCATE (lstb(nnbrx*nat), rel(5, nnbrx*nat))
1452 myspace = (nat*nnbrx)/npr
1453 IF (iam == 0) myspaceout = myspace
1456 loop_l3:
DO l3 = 0, ll3 - 1
1457 loop_l2:
DO l2 = 0, ll2 - 1
1458 loop_l1:
DO l1 = 0, ll1 - 1
1459 loop_ii:
DO ii = 1, icell(0, l1, l2, l3)
1460 iat = icell(ii, l1, l2, l3)
1461 IF (((iat - 1)*npr)/nat == iam)
THEN
1463 lsta(1, iat) = iam*myspace + indlst + 1
1464 CALL sublstiat_b(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
1465 rxyz, icell, lstb(iam*myspace + 1), lay, &
1466 rel(1, iam*myspace + 1), cut2, indlst)
1467 lsta(2, iat) = iam*myspace + indlst
1477 indlstx = max(indlstx, indlst)
1481 IF (indlstx >= myspaceout)
THEN
1482 WRITE (10, *) count,
'NNBRX too small', nnbrx
1483 DEALLOCATE (lstb, rel)
1509 ALLOCATE (txyz(3, nat), s2(max_nbrs, 8), s3(max_nbrs, 7), sz(max_nbrs, 6), &
1510 num2(max_nbrs), num3(max_nbrs), numz(max_nbrs))
1520 fxyz(1, iat) = 0.e0_dp
1521 fxyz(2, iat) = 0.e0_dp
1522 fxyz(3, iat) = 0.e0_dp
1527 lot = int(real(nat, kind=
dp)/real(npr, kind=
dp) + .999999999999e0_dp)
1529 iat2 = min((iam + 1)*lot, nat)
1531 CALL subfeniat_b(iat1, iat2, nat, lsta, lstb, rel, tener, tener2, &
1532 tcoord, tcoord2, nnbrx, txyz, max_nbrs, istop, &
1533 s2(1, 1), s2(1, 2), s2(1, 3), s2(1, 4), s2(1, 5), s2(1, 6), s2(1, 7), s2(1, 8), &
1534 num2, s3(1, 1), s3(1, 2), s3(1, 3), s3(1, 4), s3(1, 5), s3(1, 6), s3(1, 7), &
1535 num3, sz(1, 1), sz(1, 2), sz(1, 3), sz(1, 4), sz(1, 5), sz(1, 6), numz)
1539 ener2 = ener2 + tener2
1540 coord = coord + tcoord
1541 coord2 = coord2 + tcoord2
1542 istopg = istopg + istop
1544 fxyz(1, iat) = fxyz(1, iat) + txyz(1, iat)
1545 fxyz(2, iat) = fxyz(2, iat) + txyz(2, iat)
1546 fxyz(3, iat) = fxyz(3, iat) + txyz(3, iat)
1548 DEALLOCATE (txyz, s2, s3, sz, num2, num3, numz)
1555 ALLOCATE (s2(max_nbrs, 8), s3(max_nbrs, 7), sz(max_nbrs, 6), &
1556 num2(max_nbrs), num3(max_nbrs), numz(max_nbrs))
1557 CALL subfeniat_b(iat1, iat2, nat, lsta, lstb, rel, ener, ener2, &
1558 coord, coord2, nnbrx, fxyz, max_nbrs, istopg, &
1559 s2(1, 1), s2(1, 2), s2(1, 3), s2(1, 4), s2(1, 5), s2(1, 6), s2(1, 7), s2(1, 8), &
1560 num2, s3(1, 1), s3(1, 2), s3(1, 3), s3(1, 4), s3(1, 5), s3(1, 6), s3(1, 7), &
1561 num3, sz(1, 1), sz(1, 2), sz(1, 3), sz(1, 4), sz(1, 5), sz(1, 6), numz)
1562 DEALLOCATE (s2, s3, sz, num2, num3, numz)
1569 IF (istopg > 0) cpabort(
"DIMENSION ERROR (see WARNING above)")
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
1749 WRITE (*, *)
'WARNING enlarge max_nbrs'
1756 IF (r <= 2.36e0_dp)
THEN
1757 coord_iat = coord_iat + 1.e0_dp
1758 ELSE IF (r >= 3.12e0_dp)
THEN
1760 xarg = (r - 2.36e0_dp)*(1.e0_dp/(3.12e0_dp - 2.36e0_dp))
1761 coord_iat = coord_iat + (2*xarg + 1.e0_dp)*(xarg - 1.e0_dp)**2
1766 IF (r < par_bg)
THEN
1769 rmbinv = 1.e0_dp/(r - par_bg)
1770 temp1 = par_gam*rmbinv
1773 s3_dg(n3) = -rmbinv*temp1*temp0
1780 IF (n3 > max_nbrs)
THEN
1781 WRITE (*, *)
'WARNING enlarge max_nbrs'
1792 xinv = bmc/(r - par_c)
1793 xinv3 = xinv*xinv*xinv
1794 den = 1.e0_dp/(1 - xinv3)
1799 sz_df(nz) = fz*temp1*den*3.e0_dp*xinv3*xinv*cmbinv
1806 IF (nz > max_nbrs)
THEN
1807 WRITE (*, *)
'WARNING enlarge max_nbrs'
1822 sz_sum(nl) = 0.e0_dp
1828 pz = par_palp*exp(-temp0*z)
1830 dp1 = -2.e0_dp*temp0*pz
1837 temp0 = s2_t1(nj) - pz
1841 ener_iat = ener_iat + temp0*s2_t0(nj)
1845 dv2j = -s2_t0(nj)*(s2_t1(nj)*s2_t2(nj) + temp0*s2_t3(nj))
1847 dv2ijx = dv2j*s2_dx(nj)
1848 dv2ijy = dv2j*s2_dy(nj)
1849 dv2ijz = dv2j*s2_dz(nj)
1850 ff(1, i) = ff(1, i) + dv2ijx
1851 ff(2, i) = ff(2, i) + dv2ijy
1852 ff(3, i) = ff(3, i) + dv2ijz
1854 ff(1, j) = ff(1, j) - dv2ijx
1855 ff(2, j) = ff(2, j) - dv2ijy
1856 ff(3, j) = ff(3, j) - dv2ijz
1860 dv2dz = -dp1*s2_t0(nj)
1862 sz_sum(nl) = sz_sum(nl) + dv2dz
1869 winv = qort*exp(-muhalf*z)
1871 dwinv = -muhalf*winv
1874 tau = u1 + u2*temp0*(u3 - temp0)
1876 dtau = u5*temp0*(2*temp0 - u3)
1887 DO nk = nj + 1, n3 - 1
1893 lcos = s3_dx(nj)*s3_dx(nk) + s3_dy(nj)*s3_dy(nk) + s3_dz(nj)*s3_dz(nk)
1894 x = (lcos + tau)*winv
1897 h = par_lam*(1 - temp0 + par_eta*x*x)
1898 dhdx = 2*par_lam*x*(temp0 + par_eta)
1904 temp1 = s3_g(nj)*s3_g(nk)
1905 ener_iat = ener_iat + temp1*h
1909 dv3rij = s3_dg(nj)*s3_g(nk)*h
1910 dv3rijx = dv3rij*s3_dx(nj)
1911 dv3rijy = dv3rij*s3_dy(nj)
1912 dv3rijz = dv3rij*s3_dz(nj)
1919 dv3rik = s3_g(nj)*s3_dg(nk)*h
1920 dv3rikx = dv3rik*s3_dx(nk)
1921 dv3riky = dv3rik*s3_dy(nk)
1922 dv3rikz = dv3rik*s3_dz(nk)
1930 dv3ljx = dv3l*(s3_dx(nk) - lcos*s3_dx(nj))*s3_rinv(nj)
1931 dv3ljy = dv3l*(s3_dy(nk) - lcos*s3_dy(nj))*s3_rinv(nj)
1932 dv3ljz = dv3l*(s3_dz(nk) - lcos*s3_dz(nj))*s3_rinv(nj)
1939 dv3lkx = dv3l*(s3_dx(nj) - lcos*s3_dx(nk))*s3_rinv(nk)
1940 dv3lky = dv3l*(s3_dy(nj) - lcos*s3_dy(nk))*s3_rinv(nk)
1941 dv3lkz = dv3l*(s3_dz(nj) - lcos*s3_dz(nk))*s3_rinv(nk)
1948 ff(1, j) = ff(1, j) - fjx
1949 ff(2, j) = ff(2, j) - fjy
1950 ff(3, j) = ff(3, j) - fjz
1951 ff(1, k) = ff(1, k) - fkx
1952 ff(2, k) = ff(2, k) - fky
1953 ff(3, k) = ff(3, k) - fkz
1954 ff(1, i) = ff(1, i) + fjx + fkx
1955 ff(2, i) = ff(2, i) + fjy + fky
1956 ff(3, i) = ff(3, i) + fjz + fkz
1959 dxdz = dwinv*(lcos + tau) + winv*dtau
1960 dv3dz = temp1*dhdx*dxdz
1965 sz_sum(nl) = sz_sum(nl) + dv3dz
1974 dedrl = sz_sum(nl)*sz_df(nl)
1975 dedrlx = dedrl*sz_dx(nl)
1976 dedrly = dedrl*sz_dy(nl)
1977 dedrlz = dedrl*sz_dz(nl)
1978 ff(1, i) = ff(1, i) + dedrlx
1979 ff(2, i) = ff(2, i) + dedrly
1980 ff(3, i) = ff(3, i) + dedrlz
1982 ff(1, l) = ff(1, l) - dedrlx
1983 ff(2, l) = ff(2, l) - dedrly
1984 ff(3, l) = ff(3, l) - dedrlz
1988 coord = coord + coord_iat
1989 coord2 = coord2 + coord_iat**2
1990 ener = ener + ener_iat
1991 ener2 = ener2 + ener_iat**2
1996 END SUBROUTINE subfeniat_b
2018 SUBROUTINE sublstiat_b(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
2019 rxyz, icell, lstb, lay, rel, cut2, indlst)
2022 INTEGER :: iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, &
2024 REAL(kind=
dp) :: rxyz
2025 INTEGER :: icell, lstb, lay
2026 REAL(kind=
dp) :: rel, cut2
2029 dimension rxyz(3, nn), lay(nn), icell(0:ncx, -1:ll1, -1:ll2, -1:ll3), &
2030 lstb(0:myspace - 1), rel(5, 0:myspace - 1)
2032 INTEGER :: jat, k1, k2, k3, jj
2033 REAL(kind=
dp) :: rr2, tt, tti, xrel, yrel, zrel
2035 DO k3 = l3 - 1, l3 + 1
2036 DO k2 = l2 - 1, l2 + 1
2037 DO k1 = l1 - 1, l1 + 1
2038 DO jj = 1, icell(0, k1, k2, k3)
2039 jat = icell(jj, k1, k2, k3)
2040 IF (jat == iat) cycle
2041 xrel = rxyz(1, iat) - rxyz(1, jat)
2042 yrel = rxyz(2, iat) - rxyz(2, jat)
2043 zrel = rxyz(3, iat) - rxyz(3, jat)
2044 rr2 = xrel**2 + yrel**2 + zrel**2
2045 IF (rr2 <= cut2)
THEN
2046 indlst = min(indlst, myspace - 1)
2047 lstb(indlst) = lay(jat)
2051 rel(1, indlst) = xrel*tti
2052 rel(2, indlst) = yrel*tti
2053 rel(3, indlst) = zrel*tti
2055 rel(5, indlst) = tti
2064 END SUBROUTINE sublstiat_b
2090 SUBROUTINE eip_lenosky_silicon(nat, alat, rxyz0, fxyz, ener, coord, ener_var, &
2094 REAL(kind=
dp) :: alat, rxyz0, fxyz, ener, coord, &
2095 ener_var, coord_var, count
2097 dimension rxyz0(3, nat), fxyz(3, nat), alat(3)
2098 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rxyz
2099 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: lsta
2100 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: lstb
2101 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: lay
2102 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :, :) :: icell
2103 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rel
2104 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: txyz
2105 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: f2ij, f3ij, f3ik
2107 REAL(kind=
dp) :: coord2, cut, cut2, ener2, tcoord, &
2108 tcoord2, tener, tener2
2109 INTEGER :: i, iam, iat, iat1, iat2, ii, il, in, indlst, indlstx, &
2110 istop, istopg, l1, l2, l3, ll1, ll2, ll3, lot, ncx, nn, &
2111 nnbrx, npjkx, npjx, laymx, npr, rlc1i, rlc2i, rlc3i, &
2116 cut = 0.4500000e+01_dp
2118 IF (count == 0)
OPEN (unit=10, file=
'lenosky.mon', status=
'unknown')
2119 count = count + 1.e0_dp
2122 ll1 = int(alat(1)/cut)
2123 IF (ll1 < 1) cpabort(
"alat(1) too small")
2124 ll2 = int(alat(2)/cut)
2125 IF (ll2 < 1) cpabort(
"alat(2) too small")
2126 ll3 = int(alat(3)/cut)
2127 IF (ll3 < 1) cpabort(
"alat(3) too small")
2143 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
2144 icell(0, -1:ll1, -1:ll2, -1:ll3) = 0
2145 rlc1i = int(ll1/alat(1))
2146 rlc2i = int(ll2/alat(2))
2147 rlc3i = int(ll3/alat(3))
2149 loop_iat_s:
DO iat = 1, nat
2150 rxyz0(1, iat) =
modulo(
modulo(rxyz0(1, iat), alat(1)), alat(1))
2151 rxyz0(2, iat) =
modulo(
modulo(rxyz0(2, iat), alat(2)), alat(2))
2152 rxyz0(3, iat) =
modulo(
modulo(rxyz0(3, iat), alat(3)), alat(3))
2153 l1 = int(rxyz0(1, iat)*rlc1i)
2154 l2 = int(rxyz0(2, iat)*rlc2i)
2155 l3 = int(rxyz0(3, iat)*rlc3i)
2157 ii = icell(0, l1, l2, l3)
2159 icell(0, l1, l2, l3) = ii
2161 WRITE (10, *) count,
'NCX too small', ncx
2166 icell(ii, l1, l2, l3) = iat
2176 rxyz0(1, iat) =
modulo(
modulo(rxyz0(1, iat), alat(1)), alat(1))
2177 rxyz0(2, iat) =
modulo(
modulo(rxyz0(2, iat), alat(2)), alat(2))
2178 rxyz0(3, iat) =
modulo(
modulo(rxyz0(3, iat), alat(3)), alat(3))
2186 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
2187 icell(0, -1:ll1, -1:ll2, -1:ll3) = 0
2188 rlc1i = int(ll1/alat(1))
2189 rlc2i = int(ll2/alat(2))
2190 rlc3i = int(ll3/alat(3))
2192 loop_iat_p:
DO iat = 1, nat
2193 l1 = int(rxyz0(1, iat)*rlc1i)
2194 l2 = int(rxyz0(2, iat)*rlc2i)
2195 l3 = int(rxyz0(3, iat)*rlc3i)
2196 ii = icell(0, l1, l2, l3)
2198 icell(0, l1, l2, l3) = ii
2200 WRITE (10, *) count,
'NCX too small', ncx
2205 icell(ii, l1, l2, l3) = iat
2213 laymx = ncx*(2*ll1*ll2 + 2*ll1*ll3 + 2*ll2*ll3 + 4*ll1 + 4*ll2 + 4*ll3 + 8)
2215 ALLOCATE (rxyz(3, nn), lay(nn))
2218 rxyz(1, iat) = rxyz0(1, iat)
2219 rxyz(2, iat) = rxyz0(2, iat)
2220 rxyz(3, iat) = rxyz0(3, iat)
2227 in = icell(0, l1, l2, 0)
2228 icell(0, l1, l2, ll3) = in
2230 i = icell(ii, l1, l2, 0)
2232 IF (il > nn) cpabort(
"enlarge laymx")
2234 icell(ii, l1, l2, ll3) = il
2235 rxyz(1, il) = rxyz(1, i)
2236 rxyz(2, il) = rxyz(2, i)
2237 rxyz(3, il) = rxyz(3, i) + alat(3)
2240 in = icell(0, l1, l2, ll3 - 1)
2241 icell(0, l1, l2, -1) = in
2243 i = icell(ii, l1, l2, ll3 - 1)
2245 IF (il > nn) cpabort(
"enlarge laymx")
2247 icell(ii, l1, l2, -1) = il
2248 rxyz(1, il) = rxyz(1, i)
2249 rxyz(2, il) = rxyz(2, i)
2250 rxyz(3, il) = rxyz(3, i) - alat(3)
2260 in = icell(0, 0, l2, l3)
2261 icell(0, ll1, l2, l3) = in
2263 i = icell(ii, 0, l2, l3)
2265 IF (il > nn) cpabort(
"enlarge laymx")
2267 icell(ii, ll1, l2, l3) = il
2268 rxyz(1, il) = rxyz(1, i) + alat(1)
2269 rxyz(2, il) = rxyz(2, i)
2270 rxyz(3, il) = rxyz(3, i)
2273 in = icell(0, ll1 - 1, l2, l3)
2274 icell(0, -1, l2, l3) = in
2276 i = icell(ii, ll1 - 1, l2, l3)
2278 IF (il > nn) cpabort(
"enlarge laymx")
2280 icell(ii, -1, l2, l3) = il
2281 rxyz(1, il) = rxyz(1, i) - alat(1)
2282 rxyz(2, il) = rxyz(2, i)
2283 rxyz(3, il) = rxyz(3, i)
2293 in = icell(0, l1, 0, l3)
2294 icell(0, l1, ll2, l3) = in
2296 i = icell(ii, l1, 0, l3)
2298 IF (il > nn) cpabort(
"enlarge laymx")
2300 icell(ii, l1, ll2, l3) = il
2301 rxyz(1, il) = rxyz(1, i)
2302 rxyz(2, il) = rxyz(2, i) + alat(2)
2303 rxyz(3, il) = rxyz(3, i)
2306 in = icell(0, l1, ll2 - 1, l3)
2307 icell(0, l1, -1, l3) = in
2309 i = icell(ii, l1, ll2 - 1, l3)
2311 IF (il > nn) cpabort(
"enlarge laymx")
2313 icell(ii, l1, -1, l3) = il
2314 rxyz(1, il) = rxyz(1, i)
2315 rxyz(2, il) = rxyz(2, i) - alat(2)
2316 rxyz(3, il) = rxyz(3, i)
2325 in = icell(0, l1, 0, 0)
2326 icell(0, l1, ll2, ll3) = in
2328 i = icell(ii, l1, 0, 0)
2330 IF (il > nn) cpabort(
"enlarge laymx")
2332 icell(ii, l1, ll2, ll3) = il
2333 rxyz(1, il) = rxyz(1, i)
2334 rxyz(2, il) = rxyz(2, i) + alat(2)
2335 rxyz(3, il) = rxyz(3, i) + alat(3)
2338 in = icell(0, l1, 0, ll3 - 1)
2339 icell(0, l1, ll2, -1) = in
2341 i = icell(ii, l1, 0, ll3 - 1)
2343 IF (il > nn) cpabort(
"enlarge laymx")
2345 icell(ii, l1, ll2, -1) = il
2346 rxyz(1, il) = rxyz(1, i)
2347 rxyz(2, il) = rxyz(2, i) + alat(2)
2348 rxyz(3, il) = rxyz(3, i) - alat(3)
2351 in = icell(0, l1, ll2 - 1, 0)
2352 icell(0, l1, -1, ll3) = in
2354 i = icell(ii, l1, ll2 - 1, 0)
2356 IF (il > nn) cpabort(
"enlarge laymx")
2358 icell(ii, l1, -1, ll3) = il
2359 rxyz(1, il) = rxyz(1, i)
2360 rxyz(2, il) = rxyz(2, i) - alat(2)
2361 rxyz(3, il) = rxyz(3, i) + alat(3)
2364 in = icell(0, l1, ll2 - 1, ll3 - 1)
2365 icell(0, l1, -1, -1) = in
2367 i = icell(ii, l1, ll2 - 1, ll3 - 1)
2369 IF (il > nn) cpabort(
"enlarge laymx")
2371 icell(ii, l1, -1, -1) = il
2372 rxyz(1, il) = rxyz(1, i)
2373 rxyz(2, il) = rxyz(2, i) - alat(2)
2374 rxyz(3, il) = rxyz(3, i) - alat(3)
2382 in = icell(0, 0, l2, 0)
2383 icell(0, ll1, l2, ll3) = in
2385 i = icell(ii, 0, l2, 0)
2387 IF (il > nn) cpabort(
"enlarge laymx")
2389 icell(ii, ll1, l2, ll3) = il
2390 rxyz(1, il) = rxyz(1, i) + alat(1)
2391 rxyz(2, il) = rxyz(2, i)
2392 rxyz(3, il) = rxyz(3, i) + alat(3)
2395 in = icell(0, 0, l2, ll3 - 1)
2396 icell(0, ll1, l2, -1) = in
2398 i = icell(ii, 0, l2, ll3 - 1)
2400 IF (il > nn) cpabort(
"enlarge laymx")
2402 icell(ii, ll1, l2, -1) = il
2403 rxyz(1, il) = rxyz(1, i) + alat(1)
2404 rxyz(2, il) = rxyz(2, i)
2405 rxyz(3, il) = rxyz(3, i) - alat(3)
2408 in = icell(0, ll1 - 1, l2, 0)
2409 icell(0, -1, l2, ll3) = in
2411 i = icell(ii, ll1 - 1, l2, 0)
2413 IF (il > nn) cpabort(
"enlarge laymx")
2415 icell(ii, -1, l2, ll3) = il
2416 rxyz(1, il) = rxyz(1, i) - alat(1)
2417 rxyz(2, il) = rxyz(2, i)
2418 rxyz(3, il) = rxyz(3, i) + alat(3)
2421 in = icell(0, ll1 - 1, l2, ll3 - 1)
2422 icell(0, -1, l2, -1) = in
2424 i = icell(ii, ll1 - 1, l2, ll3 - 1)
2426 IF (il > nn) cpabort(
"enlarge laymx")
2428 icell(ii, -1, l2, -1) = il
2429 rxyz(1, il) = rxyz(1, i) - alat(1)
2430 rxyz(2, il) = rxyz(2, i)
2431 rxyz(3, il) = rxyz(3, i) - alat(3)
2439 in = icell(0, 0, 0, l3)
2440 icell(0, ll1, ll2, l3) = in
2442 i = icell(ii, 0, 0, l3)
2444 IF (il > nn) cpabort(
"enlarge laymx")
2446 icell(ii, ll1, ll2, l3) = il
2447 rxyz(1, il) = rxyz(1, i) + alat(1)
2448 rxyz(2, il) = rxyz(2, i) + alat(2)
2449 rxyz(3, il) = rxyz(3, i)
2452 in = icell(0, ll1 - 1, 0, l3)
2453 icell(0, -1, ll2, l3) = in
2455 i = icell(ii, ll1 - 1, 0, l3)
2457 IF (il > nn) cpabort(
"enlarge laymx")
2459 icell(ii, -1, ll2, l3) = il
2460 rxyz(1, il) = rxyz(1, i) - alat(1)
2461 rxyz(2, il) = rxyz(2, i) + alat(2)
2462 rxyz(3, il) = rxyz(3, i)
2465 in = icell(0, 0, ll2 - 1, l3)
2466 icell(0, ll1, -1, l3) = in
2468 i = icell(ii, 0, ll2 - 1, l3)
2470 IF (il > nn) cpabort(
"enlarge laymx")
2472 icell(ii, ll1, -1, l3) = il
2473 rxyz(1, il) = rxyz(1, i) + alat(1)
2474 rxyz(2, il) = rxyz(2, i) - alat(2)
2475 rxyz(3, il) = rxyz(3, i)
2478 in = icell(0, ll1 - 1, ll2 - 1, l3)
2479 icell(0, -1, -1, l3) = in
2481 i = icell(ii, ll1 - 1, ll2 - 1, l3)
2483 IF (il > nn) cpabort(
"enlarge laymx")
2485 icell(ii, -1, -1, l3) = il
2486 rxyz(1, il) = rxyz(1, i) - alat(1)
2487 rxyz(2, il) = rxyz(2, i) - alat(2)
2488 rxyz(3, il) = rxyz(3, i)
2494 in = icell(0, 0, 0, 0)
2495 icell(0, ll1, ll2, ll3) = in
2497 i = icell(ii, 0, 0, 0)
2499 IF (il > nn) cpabort(
"enlarge laymx")
2501 icell(ii, ll1, ll2, ll3) = il
2502 rxyz(1, il) = rxyz(1, i) + alat(1)
2503 rxyz(2, il) = rxyz(2, i) + alat(2)
2504 rxyz(3, il) = rxyz(3, i) + alat(3)
2507 in = icell(0, ll1 - 1, 0, 0)
2508 icell(0, -1, ll2, ll3) = in
2510 i = icell(ii, ll1 - 1, 0, 0)
2512 IF (il > nn) cpabort(
"enlarge laymx")
2514 icell(ii, -1, ll2, ll3) = il
2515 rxyz(1, il) = rxyz(1, i) - alat(1)
2516 rxyz(2, il) = rxyz(2, i) + alat(2)
2517 rxyz(3, il) = rxyz(3, i) + alat(3)
2520 in = icell(0, 0, ll2 - 1, 0)
2521 icell(0, ll1, -1, ll3) = in
2523 i = icell(ii, 0, ll2 - 1, 0)
2525 IF (il > nn) cpabort(
"enlarge laymx")
2527 icell(ii, ll1, -1, ll3) = il
2528 rxyz(1, il) = rxyz(1, i) + alat(1)
2529 rxyz(2, il) = rxyz(2, i) - alat(2)
2530 rxyz(3, il) = rxyz(3, i) + alat(3)
2533 in = icell(0, ll1 - 1, ll2 - 1, 0)
2534 icell(0, -1, -1, ll3) = in
2536 i = icell(ii, ll1 - 1, ll2 - 1, 0)
2538 IF (il > nn) cpabort(
"enlarge laymx")
2540 icell(ii, -1, -1, ll3) = il
2541 rxyz(1, il) = rxyz(1, i) - alat(1)
2542 rxyz(2, il) = rxyz(2, i) - alat(2)
2543 rxyz(3, il) = rxyz(3, i) + alat(3)
2546 in = icell(0, 0, 0, ll3 - 1)
2547 icell(0, ll1, ll2, -1) = in
2549 i = icell(ii, 0, 0, ll3 - 1)
2551 IF (il > nn) cpabort(
"enlarge laymx")
2553 icell(ii, ll1, ll2, -1) = il
2554 rxyz(1, il) = rxyz(1, i) + alat(1)
2555 rxyz(2, il) = rxyz(2, i) + alat(2)
2556 rxyz(3, il) = rxyz(3, i) - alat(3)
2559 in = icell(0, ll1 - 1, 0, ll3 - 1)
2560 icell(0, -1, ll2, -1) = in
2562 i = icell(ii, ll1 - 1, 0, ll3 - 1)
2564 IF (il > nn) cpabort(
"enlarge laymx")
2566 icell(ii, -1, ll2, -1) = il
2567 rxyz(1, il) = rxyz(1, i) - alat(1)
2568 rxyz(2, il) = rxyz(2, i) + alat(2)
2569 rxyz(3, il) = rxyz(3, i) - alat(3)
2572 in = icell(0, 0, ll2 - 1, ll3 - 1)
2573 icell(0, ll1, -1, -1) = in
2575 i = icell(ii, 0, ll2 - 1, ll3 - 1)
2577 IF (il > nn) cpabort(
"enlarge laymx")
2579 icell(ii, ll1, -1, -1) = il
2580 rxyz(1, il) = rxyz(1, i) + alat(1)
2581 rxyz(2, il) = rxyz(2, i) - alat(2)
2582 rxyz(3, il) = rxyz(3, i) - alat(3)
2585 in = icell(0, ll1 - 1, ll2 - 1, ll3 - 1)
2586 icell(0, -1, -1, -1) = in
2588 i = icell(ii, ll1 - 1, ll2 - 1, ll3 - 1)
2590 IF (il > nn) cpabort(
"enlarge laymx")
2592 icell(ii, -1, -1, -1) = il
2593 rxyz(1, il) = rxyz(1, i) - alat(1)
2594 rxyz(2, il) = rxyz(2, i) - alat(2)
2595 rxyz(3, il) = rxyz(3, i) - alat(3)
2598 ALLOCATE (lsta(2, nat))
2601 ALLOCATE (lstb(nnbrx*nat), rel(5, nnbrx*nat))
2617 myspace = (nat*nnbrx)/npr
2618 IF (iam == 0) myspaceout = myspace
2621 loop_l3:
DO l3 = 0, ll3 - 1
2622 loop_l2:
DO l2 = 0, ll2 - 1
2623 loop_l1:
DO l1 = 0, ll1 - 1
2624 loop_ii:
DO ii = 1, icell(0, l1, l2, l3)
2625 iat = icell(ii, l1, l2, l3)
2626 IF (((iat - 1)*npr)/nat == iam)
THEN
2628 lsta(1, iat) = iam*myspace + indlst + 1
2629 CALL sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
2630 rxyz, icell, lstb(iam*myspace + 1), lay, &
2631 rel(1, iam*myspace + 1), cut2, indlst)
2632 lsta(2, iat) = iam*myspace + indlst
2643 indlstx = max(indlstx, indlst)
2647 IF (indlstx >= myspaceout)
THEN
2648 WRITE (10, *) count,
'NNBRX too small', nnbrx
2649 DEALLOCATE (lstb, rel)
2667 npjx = 300; npjkx = 6000
2674 ALLOCATE (txyz(3, nat), f2ij(3, npjx), f3ij(3, npjkx), f3ik(3, npjkx))
2684 fxyz(1, iat) = 0.e0_dp
2685 fxyz(2, iat) = 0.e0_dp
2686 fxyz(3, iat) = 0.e0_dp
2691 lot = int(real(nat, kind=
dp)/real(npr, kind=
dp) + .999999999999e0_dp)
2693 iat2 = min((iam + 1)*lot, nat)
2695 CALL subfeniat_l(iat1, iat2, nat, lsta, lstb, rel, tener, tener2, &
2696 tcoord, tcoord2, nnbrx, txyz, f2ij, npjx, f3ij, npjkx, f3ik, istop)
2699 ener2 = ener2 + tener2
2700 coord = coord + tcoord
2701 coord2 = coord2 + tcoord2
2702 istopg = istopg + istop
2704 fxyz(1, iat) = fxyz(1, iat) + txyz(1, iat)
2705 fxyz(2, iat) = fxyz(2, iat) + txyz(2, iat)
2706 fxyz(3, iat) = fxyz(3, iat) + txyz(3, iat)
2708 DEALLOCATE (txyz, f2ij, f3ij, f3ik)
2715 ALLOCATE (f2ij(3, npjx), f3ij(3, npjkx), f3ik(3, npjkx))
2716 CALL subfeniat_l(iat1, iat2, nat, lsta, lstb, rel, ener, ener2, &
2717 coord, coord2, nnbrx, fxyz, f2ij, npjx, f3ij, npjkx, f3ik, istopg)
2718 DEALLOCATE (f2ij, f3ij, f3ik)
2725 IF (istopg > 0) cpabort(
"DIMENSION ERROR (see WARNING above)")
2726 ener_var = ener2/nat - (ener/nat)**2
2728 coord_var = coord2/nat - coord**2
2730 DEALLOCATE (rxyz, icell, lay, lsta, lstb, rel)
2732 END SUBROUTINE eip_lenosky_silicon
2755 SUBROUTINE subfeniat_l(iat1, iat2, nat, lsta, lstb, rel, tener, tener2, &
2756 tcoord, tcoord2, nnbrx, txyz, f2ij, npjx, f3ij, npjkx, f3ik, istop)
2762 INTEGER :: iat1, iat2, nat, lsta, lstb
2763 REAL(kind=
dp) :: rel, tener, tener2, tcoord, tcoord2
2765 REAL(kind=
dp) :: txyz, f2ij
2767 REAL(kind=
dp) :: f3ij
2769 REAL(kind=
dp) :: f3ik
2772 dimension lsta(2, nat), lstb(nnbrx*nat), rel(5, nnbrx*nat), txyz(3, nat)
2773 dimension f2ij(3, npjx), f3ij(3, npjkx), f3ik(3, npjkx)
2774 REAL(kind=
dp),
PARAMETER :: tmin_phi = 0.1500000e+01_dp
2775 REAL(kind=
dp),
PARAMETER :: tmax_phi = 0.4500000e+01_dp
2776 REAL(kind=
dp),
PARAMETER :: hi_phi = 3.00000000000e0_dp
2777 REAL(kind=
dp),
PARAMETER :: hsixth_phi = 5.55555555555556e-002_dp
2778 REAL(kind=
dp),
PARAMETER :: h2sixth_phi = 1.85185185185185e-002_dp
2779 REAL(kind=
dp),
PARAMETER,
DIMENSION(0:9) :: cof_phi = &
2780 [0.69299400000000e+01_dp, -0.43995000000000e+00_dp, &
2781 -0.17012300000000e+01_dp, -0.16247300000000e+01_dp, &
2782 -0.99696000000000e+00_dp, -0.27391000000000e+00_dp, &
2783 -0.24990000000000e-01_dp, -0.17840000000000e-01_dp, &
2784 -0.96100000000000e-02_dp, 0.00000000000000e+00_dp]
2785 REAL(kind=
dp),
PARAMETER,
DIMENSION(0:9) :: dof_phi = &
2786 [0.16533229480429e+03_dp, 0.39415410391417e+02_dp, &
2787 0.68710036300407e+01_dp, 0.53406950884203e+01_dp, &
2788 0.15347960162782e+01_dp, -0.63347591535331e+01_dp, &
2789 -0.17987794021458e+01_dp, 0.47429676211617e+00_dp, &
2790 -0.40087646318907e-01_dp, -0.23942617684055e+00_dp]
2791 REAL(kind=
dp),
PARAMETER :: tmin_rho = 0.1500000e+01_dp
2792 REAL(kind=
dp),
PARAMETER :: tmax_rho = 0.3500000e+01_dp
2793 REAL(kind=
dp),
PARAMETER :: hi_rho = 5.00000000000e0_dp
2794 REAL(kind=
dp),
PARAMETER :: hsixth_rho = 3.33333333333333e-002_dp
2795 REAL(kind=
dp),
PARAMETER :: h2sixth_rho = 6.66666666666667e-003_dp
2796 REAL(kind=
dp),
PARAMETER,
DIMENSION(0:10) :: cof_rho = &
2797 [0.13747000000000e+00_dp, -0.14831000000000e+00_dp, &
2798 -0.55972000000000e+00_dp, -0.73110000000000e+00_dp, &
2799 -0.76283000000000e+00_dp, -0.72918000000000e+00_dp, &
2800 -0.66620000000000e+00_dp, -0.57328000000000e+00_dp, &
2801 -0.40690000000000e+00_dp, -0.16662000000000e+00_dp, &
2802 0.00000000000000e+00_dp]
2803 REAL(kind=
dp),
PARAMETER,
DIMENSION(0:10) :: dof_rho = &
2804 [-0.32275496741918e+01_dp, -0.64119006516165e+01_dp, &
2805 0.10030652280658e+02_dp, 0.22937915289857e+01_dp, &
2806 0.17416816033995e+01_dp, 0.54648205741626e+00_dp, &
2807 0.47189016693543e+00_dp, 0.20569572748420e+01_dp, &
2808 0.23192807336964e+01_dp, -0.24908020962757e+00_dp, &
2809 -0.12371959895186e+02_dp]
2810 REAL(kind=
dp),
PARAMETER :: tmin_fff = 0.1500000e+01_dp
2811 REAL(kind=
dp),
PARAMETER :: tmax_fff = 0.3500000e+01_dp
2812 REAL(kind=
dp),
PARAMETER :: hi_fff = 4.50000000000e0_dp
2813 REAL(kind=
dp),
PARAMETER :: hsixth_fff = 3.70370370370370e-002_dp
2814 REAL(kind=
dp),
PARAMETER :: h2sixth_fff = 8.23045267489712e-003_dp
2815 REAL(kind=
dp),
PARAMETER,
DIMENSION(0:9) :: cof_fff = &
2816 [0.12503100000000e+01_dp, 0.86821000000000e+00_dp, &
2817 0.60846000000000e+00_dp, 0.48756000000000e+00_dp, &
2818 0.44163000000000e+00_dp, 0.37610000000000e+00_dp, &
2819 0.27145000000000e+00_dp, 0.14814000000000e+00_dp, &
2820 0.48550000000000e-01_dp, 0.00000000000000e+00_dp]
2821 REAL(kind=
dp),
PARAMETER,
DIMENSION(0:9) :: dof_fff = &
2822 [0.27904652711432e+02_dp, -0.45230754228635e+01_dp, &
2823 0.50531739800222e+01_dp, 0.11806545027747e+01_dp, &
2824 -0.66693699112098e+00_dp, -0.89430653829079e+00_dp, &
2825 -0.50891685571587e+00_dp, 0.66278396115427e+00_dp, &
2826 0.73976101109878e+00_dp, 0.25795319944506e+01_dp]
2827 REAL(kind=
dp),
PARAMETER :: tmin_uuu = -0.1770930e+01_dp
2828 REAL(kind=
dp),
PARAMETER :: tmax_uuu = 0.7908520e+01_dp
2829 REAL(kind=
dp),
PARAMETER :: hi_uuu = 0.723181585730594e0_dp
2830 REAL(kind=
dp),
PARAMETER :: hsixth_uuu = 0.230463095238095e0_dp
2831 REAL(kind=
dp),
PARAMETER :: h2sixth_uuu = 0.318679429600340e0_dp
2832 REAL(kind=
dp),
PARAMETER,
DIMENSION(0:7) :: cof_uuu = &
2833 [-0.10749300000000e+01_dp, -0.20045000000000e+00_dp, &
2834 0.41422000000000e+00_dp, 0.87939000000000e+00_dp, &
2835 0.12668900000000e+01_dp, 0.16299800000000e+01_dp, &
2836 0.19773800000000e+01_dp, 0.23961800000000e+01_dp]
2837 REAL(kind=
dp),
PARAMETER,
DIMENSION(0:7) :: dof_uuu = &
2838 [-0.14827125747284e+00_dp, -0.14922155328475e+00_dp, &
2839 -0.70113224223509e-01_dp, -0.39449020349230e-01_dp, &
2840 -0.15815242579643e-01_dp, 0.26112640061855e-01_dp, &
2841 -0.13786974745095e+00_dp, 0.74941595372657e+00_dp]
2842 REAL(kind=
dp),
PARAMETER :: tmin_ggg = -0.1000000e+01_dp
2843 REAL(kind=
dp),
PARAMETER :: tmax_ggg = 0.8001400e+00_dp
2844 REAL(kind=
dp),
PARAMETER :: hi_ggg = 3.88858644327663e0_dp
2845 REAL(kind=
dp),
PARAMETER :: hsixth_ggg = 4.28604761904762e-002_dp
2846 REAL(kind=
dp),
PARAMETER :: h2sixth_ggg = 1.10221225156463e-002_dp
2847 REAL(kind=
dp),
PARAMETER,
DIMENSION(0:7) :: cof_ggg = &
2848 [0.52541600000000e+01_dp, 0.23591500000000e+01_dp, &
2849 0.11959500000000e+01_dp, 0.12299500000000e+01_dp, &
2850 0.20356500000000e+01_dp, 0.34247400000000e+01_dp, &
2851 0.49485900000000e+01_dp, 0.56179900000000e+01_dp]
2852 REAL(kind=
dp),
PARAMETER,
DIMENSION(0:7) :: dof_ggg = &
2853 [0.15826876132396e+02_dp, 0.31176239377907e+02_dp, &
2854 0.16589446539683e+02_dp, 0.11083892500520e+02_dp, &
2855 0.90887216383860e+01_dp, 0.54902279653967e+01_dp, &
2856 -0.18823313223755e+02_dp, -0.77183416481005e+01_dp]
2858 REAL(kind=
dp) :: a2_fff, a2_ggg, a_fff, a_ggg, b2_fff, b2_ggg, b_fff, &
2859 b_ggg, cof1_fff, cof1_ggg, cof2_fff, cof2_ggg, cof3_fff, &
2860 cof3_ggg, cof4_fff, cof4_ggg, cof_fff_khi, cof_fff_klo, &
2861 cof_ggg_khi, cof_ggg_klo, coord_iat, costheta, dens, &
2862 dens2, dens3, dof_fff_khi, dof_fff_klo, dof_ggg_khi, &
2863 dof_ggg_klo, e_phi, e_uuu, ener_iat, ep_phi, ep_uuu, &
2864 fij, fijp, fik, fikp, fxij, fxik, fyij, fyik, fzij, fzik, &
2865 gjik, gjikp, rho, rhop, rij, rik, sij, sik, t1, t2, t3, t4, &
2866 tt, tt_fff, tt_ggg, xarg, ypt1_fff, ypt1_ggg, ypt2_fff, &
2867 ypt2_ggg, yt1_fff, yt1_ggg, yt2_fff, yt2_ggg
2869 INTEGER :: iat, jat, jbr, jcnt, jkcnt, kat, kbr, khi_fff, khi_ggg, &
2880 txyz(1, iat) = 0.e0_dp
2881 txyz(2, iat) = 0.e0_dp
2882 txyz(3, iat) = 0.e0_dp
2887 forces_and_energy:
DO iat = iat1, iat2
2895 calculate:
DO jbr = lsta(1, iat), lsta(2, iat)
2898 IF (jcnt > npjx)
THEN
2899 WRITE (*, *)
'WARNING: enlarge npjx'
2912 IF (rij <= 2.36e0_dp)
THEN
2913 coord_iat = coord_iat + 1.e0_dp
2914 ELSE IF (rij >= 3.12e0_dp)
THEN
2916 xarg = (rij - 2.36e0_dp)*(1.e0_dp/(3.12e0_dp - 2.36e0_dp))
2917 coord_iat = coord_iat + (2*xarg + 1.e0_dp)*(xarg - 1.e0_dp)**2
2921 CALL splint(cof_phi, dof_phi, tmin_phi, tmax_phi, &
2922 hsixth_phi, h2sixth_phi, hi_phi, 10, rij, e_phi, ep_phi)
2923 ener_iat = ener_iat + (e_phi*.5e0_dp)
2924 txyz(1, iat) = txyz(1, iat) - fxij*(ep_phi*.5e0_dp)
2925 txyz(2, iat) = txyz(2, iat) - fyij*(ep_phi*.5e0_dp)
2926 txyz(3, iat) = txyz(3, iat) - fzij*(ep_phi*.5e0_dp)
2927 txyz(1, jat) = txyz(1, jat) + fxij*(ep_phi*.5e0_dp)
2928 txyz(2, jat) = txyz(2, jat) + fyij*(ep_phi*.5e0_dp)
2929 txyz(3, jat) = txyz(3, jat) + fzij*(ep_phi*.5e0_dp)
2932 CALL splint(cof_rho, dof_rho, tmin_rho, tmax_rho, &
2933 hsixth_rho, h2sixth_rho, hi_rho, 11, rij, rho, rhop)
2935 f2ij(1, jcnt) = fxij*rhop
2936 f2ij(2, jcnt) = fyij*rhop
2937 f2ij(3, jcnt) = fzij*rhop
2940 CALL splint(cof_fff, dof_fff, tmin_fff, tmax_fff, &
2941 hsixth_fff, h2sixth_fff, hi_fff, 10, rij, fij, fijp)
2943 embed_3body:
DO kbr = lsta(1, iat), lsta(2, iat)
2947 IF (jkcnt > npjkx)
THEN
2948 WRITE (*, *)
'WARNING: enlarge npjkx', npjkx
2969 IF (rik > tmax_fff)
THEN
2970 fikp = 0.e0_dp; fik = 0.e0_dp
2971 gjik = 0.e0_dp; gjikp = 0.e0_dp; sik = 0.e0_dp
2972 costheta = 0.e0_dp; fxik = 0.e0_dp; fyik = 0.e0_dp; fzik = 0.e0_dp
2973 ELSE IF (rik < tmin_fff)
THEN
2977 costheta = fxij*fxik + fyij*fyik + fzij*fzik
2979 fikp = hi_fff*(cof_fff(1) - cof_fff(0)) - &
2980 (dof_fff(1) + 2.e0_dp*dof_fff(0))*hsixth_fff
2981 fik = cof_fff(0) + (rik - tmin_fff)*fikp
2982 tt_ggg = (costheta - tmin_ggg)*hi_ggg
2983 IF (costheta > tmax_ggg)
THEN
2984 gjikp = hi_ggg*(cof_ggg(8 - 1) - cof_ggg(8 - 2)) + &
2985 (2.e0_dp*dof_ggg(8 - 1) + dof_ggg(8 - 2))*hsixth_ggg
2986 gjik = cof_ggg(8 - 1) + (costheta - tmax_ggg)*gjikp
2988 klo_ggg = int(tt_ggg)
2989 khi_ggg = klo_ggg + 1
2990 cof_ggg_klo = cof_ggg(klo_ggg)
2991 dof_ggg_klo = dof_ggg(klo_ggg)
2992 b_ggg = tt_ggg - klo_ggg
2993 a_ggg = 1.e0_dp - b_ggg
2994 cof_ggg_khi = cof_ggg(khi_ggg)
2995 dof_ggg_khi = dof_ggg(khi_ggg)
2996 b2_ggg = b_ggg*b_ggg
2997 gjik = a_ggg*cof_ggg_klo
2998 gjikp = cof_ggg_khi - cof_ggg_klo
2999 a2_ggg = a_ggg*a_ggg
3000 cof1_ggg = a2_ggg - 1.e0_dp
3001 cof2_ggg = b2_ggg - 1.e0_dp
3002 gjik = gjik + b_ggg*cof_ggg_khi
3003 gjikp = hi_ggg*gjikp
3004 cof3_ggg = 3.e0_dp*b2_ggg
3005 cof4_ggg = 3.e0_dp*a2_ggg
3006 cof1_ggg = a_ggg*cof1_ggg
3007 cof2_ggg = b_ggg*cof2_ggg
3008 cof3_ggg = cof3_ggg - 1.e0_dp
3009 cof4_ggg = cof4_ggg - 1.e0_dp
3010 yt1_ggg = cof1_ggg*dof_ggg_klo
3011 yt2_ggg = cof2_ggg*dof_ggg_khi
3012 ypt1_ggg = cof3_ggg*dof_ggg_khi
3013 ypt2_ggg = cof4_ggg*dof_ggg_klo
3014 gjik = gjik + (yt1_ggg + yt2_ggg)*h2sixth_ggg
3015 gjikp = gjikp + (ypt1_ggg - ypt2_ggg)*hsixth_ggg
3019 tt_fff = rik - tmin_fff
3020 costheta = fxij*fxik
3022 tt_fff = tt_fff*hi_fff
3023 costheta = costheta + fyij*fyik
3025 klo_fff = int(tt_fff)
3026 costheta = costheta + fzij*fzik
3028 tt_ggg = (costheta - tmin_ggg)*hi_ggg
3029 IF (costheta > tmax_ggg)
THEN
3030 gjikp = hi_ggg*(cof_ggg(8 - 1) - cof_ggg(8 - 2)) + &
3031 (2.e0_dp*dof_ggg(8 - 1) + dof_ggg(8 - 2))*hsixth_ggg
3032 gjik = cof_ggg(8 - 1) + (costheta - tmax_ggg)*gjikp
3033 khi_fff = klo_fff + 1
3034 cof_fff_klo = cof_fff(klo_fff)
3035 dof_fff_klo = dof_fff(klo_fff)
3036 b_fff = tt_fff - klo_fff
3037 a_fff = 1.e0_dp - b_fff
3038 cof_fff_khi = cof_fff(khi_fff)
3039 dof_fff_khi = dof_fff(khi_fff)
3040 b2_fff = b_fff*b_fff
3041 fik = a_fff*cof_fff_klo
3042 fikp = cof_fff_khi - cof_fff_klo
3043 a2_fff = a_fff*a_fff
3044 cof1_fff = a2_fff - 1.e0_dp
3045 cof2_fff = b2_fff - 1.e0_dp
3046 fik = fik + b_fff*cof_fff_khi
3048 cof3_fff = 3.e0_dp*b2_fff
3049 cof4_fff = 3.e0_dp*a2_fff
3050 cof1_fff = a_fff*cof1_fff
3051 cof2_fff = b_fff*cof2_fff
3052 cof3_fff = cof3_fff - 1.e0_dp
3053 cof4_fff = cof4_fff - 1.e0_dp
3054 yt1_fff = cof1_fff*dof_fff_klo
3055 yt2_fff = cof2_fff*dof_fff_khi
3056 ypt1_fff = cof3_fff*dof_fff_khi
3057 ypt2_fff = cof4_fff*dof_fff_klo
3058 fik = fik + (yt1_fff + yt2_fff)*h2sixth_fff
3059 fikp = fikp + (ypt1_fff - ypt2_fff)*hsixth_fff
3061 klo_ggg = int(tt_ggg)
3062 khi_ggg = klo_ggg + 1
3063 khi_fff = klo_fff + 1
3064 cof_ggg_klo = cof_ggg(klo_ggg)
3065 cof_fff_klo = cof_fff(klo_fff)
3066 dof_ggg_klo = dof_ggg(klo_ggg)
3067 dof_fff_klo = dof_fff(klo_fff)
3068 b_ggg = tt_ggg - klo_ggg
3069 b_fff = tt_fff - klo_fff
3070 a_ggg = 1.e0_dp - b_ggg
3071 a_fff = 1.e0_dp - b_fff
3072 cof_ggg_khi = cof_ggg(khi_ggg)
3073 cof_fff_khi = cof_fff(khi_fff)
3074 dof_ggg_khi = dof_ggg(khi_ggg)
3075 dof_fff_khi = dof_fff(khi_fff)
3076 b2_ggg = b_ggg*b_ggg
3077 b2_fff = b_fff*b_fff
3078 gjik = a_ggg*cof_ggg_klo
3079 fik = a_fff*cof_fff_klo
3080 gjikp = cof_ggg_khi - cof_ggg_klo
3081 fikp = cof_fff_khi - cof_fff_klo
3082 a2_ggg = a_ggg*a_ggg
3083 a2_fff = a_fff*a_fff
3084 cof1_ggg = a2_ggg - 1.e0_dp
3085 cof1_fff = a2_fff - 1.e0_dp
3086 cof2_ggg = b2_ggg - 1.e0_dp
3087 cof2_fff = b2_fff - 1.e0_dp
3088 gjik = gjik + b_ggg*cof_ggg_khi
3089 fik = fik + b_fff*cof_fff_khi
3090 gjikp = hi_ggg*gjikp
3092 cof3_ggg = 3.e0_dp*b2_ggg
3093 cof3_fff = 3.e0_dp*b2_fff
3094 cof4_ggg = 3.e0_dp*a2_ggg
3095 cof4_fff = 3.e0_dp*a2_fff
3096 cof1_ggg = a_ggg*cof1_ggg
3097 cof1_fff = a_fff*cof1_fff
3098 cof2_ggg = b_ggg*cof2_ggg
3099 cof2_fff = b_fff*cof2_fff
3100 cof3_ggg = cof3_ggg - 1.e0_dp
3101 cof3_fff = cof3_fff - 1.e0_dp
3102 cof4_ggg = cof4_ggg - 1.e0_dp
3103 cof4_fff = cof4_fff - 1.e0_dp
3104 yt1_ggg = cof1_ggg*dof_ggg_klo
3105 yt1_fff = cof1_fff*dof_fff_klo
3106 yt2_ggg = cof2_ggg*dof_ggg_khi
3107 yt2_fff = cof2_fff*dof_fff_khi
3108 ypt1_ggg = cof3_ggg*dof_ggg_khi
3109 ypt1_fff = cof3_fff*dof_fff_khi
3110 ypt2_ggg = cof4_ggg*dof_ggg_klo
3111 ypt2_fff = cof4_fff*dof_fff_klo
3112 gjik = gjik + (yt1_ggg + yt2_ggg)*h2sixth_ggg
3113 fik = fik + (yt1_fff + yt2_fff)*h2sixth_fff
3114 gjikp = gjikp + (ypt1_ggg - ypt2_ggg)*hsixth_ggg
3115 fikp = fikp + (ypt1_fff - ypt2_fff)*hsixth_fff
3121 dens3 = dens3 + tt*gjik
3125 f3ij(1, jkcnt) = fxij*t1 + (fxik - fxij*costheta)*t2
3126 f3ij(2, jkcnt) = fyij*t1 + (fyik - fyij*costheta)*t2
3127 f3ij(3, jkcnt) = fzij*t1 + (fzik - fzij*costheta)*t2
3131 f3ik(1, jkcnt) = fxik*t3 + (fxij - fxik*costheta)*t4
3132 f3ik(2, jkcnt) = fyik*t3 + (fyij - fyik*costheta)*t4
3133 f3ik(3, jkcnt) = fzik*t3 + (fzij - fzik*costheta)*t4
3139 dens = dens2 + dens3
3140 CALL splint(cof_uuu, dof_uuu, tmin_uuu, tmax_uuu, &
3141 hsixth_uuu, h2sixth_uuu, hi_uuu, 8, dens, e_uuu, ep_uuu)
3142 ener_iat = ener_iat + e_uuu
3147 loop_again:
DO jbr = lsta(1, iat), lsta(2, iat)
3150 txyz(1, iat) = txyz(1, iat) - ep_uuu*f2ij(1, jcnt)
3151 txyz(2, iat) = txyz(2, iat) - ep_uuu*f2ij(2, jcnt)
3152 txyz(3, iat) = txyz(3, iat) - ep_uuu*f2ij(3, jcnt)
3153 txyz(1, jat) = txyz(1, jat) + ep_uuu*f2ij(1, jcnt)
3154 txyz(2, jat) = txyz(2, jat) + ep_uuu*f2ij(2, jcnt)
3155 txyz(3, jat) = txyz(3, jat) + ep_uuu*f2ij(3, jcnt)
3158 DO kbr = lsta(1, iat), lsta(2, iat)
3163 txyz(1, iat) = txyz(1, iat) - ep_uuu*(f3ij(1, jkcnt) + f3ik(1, jkcnt))
3164 txyz(2, iat) = txyz(2, iat) - ep_uuu*(f3ij(2, jkcnt) + f3ik(2, jkcnt))
3165 txyz(3, iat) = txyz(3, iat) - ep_uuu*(f3ij(3, jkcnt) + f3ik(3, jkcnt))
3166 txyz(1, jat) = txyz(1, jat) + ep_uuu*f3ij(1, jkcnt)
3167 txyz(2, jat) = txyz(2, jat) + ep_uuu*f3ij(2, jkcnt)
3168 txyz(3, jat) = txyz(3, jat) + ep_uuu*f3ij(3, jkcnt)
3169 txyz(1, kat) = txyz(1, kat) + ep_uuu*f3ik(1, jkcnt)
3170 txyz(2, kat) = txyz(2, kat) + ep_uuu*f3ik(2, jkcnt)
3171 txyz(3, kat) = txyz(3, kat) + ep_uuu*f3ik(3, jkcnt)
3179 tener = tener + ener_iat
3180 tener2 = tener2 + ener_iat**2
3181 tcoord = tcoord + coord_iat
3182 tcoord2 = tcoord2 + coord_iat**2
3184 END DO forces_and_energy
3186 END SUBROUTINE subfeniat_l
3208 SUBROUTINE sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
3209 rxyz, icell, lstb, lay, rel, cut2, indlst)
3212 INTEGER :: iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, &
3214 REAL(kind=
dp) :: rxyz
3215 INTEGER :: icell, lstb, lay
3216 REAL(kind=
dp) :: rel, cut2
3219 dimension rxyz(3, nn), lay(nn), icell(0:ncx, -1:ll1, -1:ll2, -1:ll3), &
3220 lstb(0:myspace - 1), rel(5, 0:myspace - 1)
3222 INTEGER :: jat, jj, k1, k2, k3
3223 REAL(kind=
dp) :: rr2, tt, xrel, yrel, zrel, tti
3225 loop_k3:
DO k3 = l3 - 1, l3 + 1
3226 loop_k2:
DO k2 = l2 - 1, l2 + 1
3227 loop_k1:
DO k1 = l1 - 1, l1 + 1
3228 loop_jj:
DO jj = 1, icell(0, k1, k2, k3)
3229 jat = icell(jj, k1, k2, k3)
3230 IF (jat == iat) cycle loop_k3
3231 xrel = rxyz(1, iat) - rxyz(1, jat)
3232 yrel = rxyz(2, iat) - rxyz(2, jat)
3233 zrel = rxyz(3, iat) - rxyz(3, jat)
3234 rr2 = xrel**2 + yrel**2 + zrel**2
3235 IF (rr2 <= cut2)
THEN
3236 indlst = min(indlst, myspace - 1)
3237 lstb(indlst) = lay(jat)
3241 rel(1, indlst) = xrel*tti
3242 rel(2, indlst) = yrel*tti
3243 rel(3, indlst) = zrel*tti
3245 rel(5, indlst) = tti
3254 END SUBROUTINE sublstiat_l
3270 SUBROUTINE splint(ya, y2a, tmin, tmax, hsixth, h2sixth, hi, n, x, y, yp)
3271 REAL(kind=
dp) :: ya, y2a, tmin, tmax, hsixth, h2sixth, hi
3273 REAL(kind=
dp) :: x, y, yp
3275 dimension y2a(0:n - 1), ya(0:n - 1)
3276 REAL(kind=
dp) :: a, a2, b, b2, cof1, cof2, cof3, cof4, tt, &
3277 y2a_khi, ya_klo, y2a_klo, ya_khi, ypt1, ypt2, yt1, yt2
3283 yp = hi*(ya(1) - ya(0)) - &
3284 (y2a(1) + 2.e0_dp*y2a(0))*hsixth
3285 y = ya(0) + (x - tmin)*yp
3286 ELSE IF (x > tmax)
THEN
3287 yp = hi*(ya(n - 1) - ya(n - 2)) + &
3288 (2.e0_dp*y2a(n - 1) + y2a(n - 2))*hsixth
3289 y = ya(n - 1) + (x - tmax)*yp
3302 yp = ya_khi - ya_klo
3312 cof3 = cof3 - 1.e0_dp
3313 cof4 = cof4 - 1.e0_dp
3318 y = y + (yt1 + yt2)*h2sixth
3319 yp = yp + (ypt1 - ypt2)*hsixth
3322 END SUBROUTINE splint
3337 SUBROUTINE eip_stillinger_weber_silicon(nat, alat, rxyz0, fxyz, etot, count)
3380 REAL(8) :: alat(3), rxyz0(3, nat), fxyz(3, nat), &
3383 INTEGER :: i, iam, iat, ii, il, in, indlst, &
3384 indlstx, ipb, l1, l2, l3, laymx, ll1, &
3385 ll2, ll3, myspace, myspaceout, ncx, &
3386 ndat, nn, nnbrx, npjkx, npjx, npr
3387 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: lay, lstb
3388 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: lsta
3389 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :, :) :: icell
3390 REAL(8) :: cut, cut2, eps, esigma, fx(nat), &
3391 fx3(nat), fy(nat), fy3(nat), fz(nat), &
3392 fz3(nat), isigma, p, p3, pv3, ra, &
3393 rlc1i, rlc2i, rlc3i, sigma
3394 REAL(8),
ALLOCATABLE,
DIMENSION(:, :) :: rel, rxyz
3397 parameter(sigma=2.0951d0, eps=2.167239428587d0)
3399 count = count + 1.d0
3405 ll1 = int(alat(1)/cut)
3406 IF (ll1 < 1) cpabort(
"alat(1) too small")
3407 ll2 = int(alat(2)/cut)
3408 IF (ll2 < 1) cpabort(
"alat(2) too small")
3409 ll3 = int(alat(3)/cut)
3410 IF (ll3 < 1) cpabort(
"alat(3) too small")
3416 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
3417 icell(0, :, :, :) = 0
3423 rxyz0(1, iat) =
modulo(
modulo(rxyz0(1, iat), alat(1)), alat(1))
3424 rxyz0(2, iat) =
modulo(
modulo(rxyz0(2, iat), alat(2)), alat(2))
3425 rxyz0(3, iat) =
modulo(
modulo(rxyz0(3, iat), alat(3)), alat(3))
3426 l1 = int(rxyz0(1, iat)*rlc1i)
3427 l2 = int(rxyz0(2, iat)*rlc2i)
3428 l3 = int(rxyz0(3, iat)*rlc3i)
3430 ii = icell(0, l1, l2, l3)
3432 icell(0, l1, l2, l3) = ii
3437 icell(ii, l1, l2, l3) = iat
3439 IF (
ALLOCATED(icell))
EXIT
3443 laymx = ncx*(2*ll1*ll2 + 2*ll1*ll3 + 2*ll2*ll3 + 4*ll1 + 4*ll2 + 4*ll3 + 8)
3445 ALLOCATE (rxyz(3, nn), lay(nn))
3448 rxyz(1, iat) = rxyz0(1, iat)
3449 rxyz(2, iat) = rxyz0(2, iat)
3450 rxyz(3, iat) = rxyz0(3, iat)
3457 in = icell(0, l1, l2, 0)
3458 icell(0, l1, l2, ll3) = in
3460 i = icell(ii, l1, l2, 0)
3462 IF (il > nn) cpabort(
"enlarge laymx")
3464 icell(ii, l1, l2, ll3) = il
3465 rxyz(1, il) = rxyz(1, i)
3466 rxyz(2, il) = rxyz(2, i)
3467 rxyz(3, il) = rxyz(3, i) + alat(3)
3470 in = icell(0, l1, l2, ll3 - 1)
3471 icell(0, l1, l2, -1) = in
3473 i = icell(ii, l1, l2, ll3 - 1)
3475 IF (il > nn) cpabort(
"enlarge laymx")
3477 icell(ii, l1, l2, -1) = il
3478 rxyz(1, il) = rxyz(1, i)
3479 rxyz(2, il) = rxyz(2, i)
3480 rxyz(3, il) = rxyz(3, i) - alat(3)
3490 in = icell(0, 0, l2, l3)
3491 icell(0, ll1, l2, l3) = in
3493 i = icell(ii, 0, l2, l3)
3495 IF (il > nn) cpabort(
"enlarge laymx")
3497 icell(ii, ll1, l2, l3) = il
3498 rxyz(1, il) = rxyz(1, i) + alat(1)
3499 rxyz(2, il) = rxyz(2, i)
3500 rxyz(3, il) = rxyz(3, i)
3503 in = icell(0, ll1 - 1, l2, l3)
3504 icell(0, -1, l2, l3) = in
3506 i = icell(ii, ll1 - 1, l2, l3)
3508 IF (il > nn) cpabort(
"enlarge laymx")
3510 icell(ii, -1, l2, l3) = il
3511 rxyz(1, il) = rxyz(1, i) - alat(1)
3512 rxyz(2, il) = rxyz(2, i)
3513 rxyz(3, il) = rxyz(3, i)
3523 in = icell(0, l1, 0, l3)
3524 icell(0, l1, ll2, l3) = in
3526 i = icell(ii, l1, 0, l3)
3528 IF (il > nn) cpabort(
"enlarge laymx")
3530 icell(ii, l1, ll2, l3) = il
3531 rxyz(1, il) = rxyz(1, i)
3532 rxyz(2, il) = rxyz(2, i) + alat(2)
3533 rxyz(3, il) = rxyz(3, i)
3536 in = icell(0, l1, ll2 - 1, l3)
3537 icell(0, l1, -1, l3) = in
3539 i = icell(ii, l1, ll2 - 1, l3)
3541 IF (il > nn) cpabort(
"enlarge laymx")
3543 icell(ii, l1, -1, l3) = il
3544 rxyz(1, il) = rxyz(1, i)
3545 rxyz(2, il) = rxyz(2, i) - alat(2)
3546 rxyz(3, il) = rxyz(3, i)
3555 in = icell(0, l1, 0, 0)
3556 icell(0, l1, ll2, ll3) = in
3558 i = icell(ii, l1, 0, 0)
3560 IF (il > nn) cpabort(
"enlarge laymx")
3562 icell(ii, l1, ll2, ll3) = il
3563 rxyz(1, il) = rxyz(1, i)
3564 rxyz(2, il) = rxyz(2, i) + alat(2)
3565 rxyz(3, il) = rxyz(3, i) + alat(3)
3568 in = icell(0, l1, 0, ll3 - 1)
3569 icell(0, l1, ll2, -1) = in
3571 i = icell(ii, l1, 0, ll3 - 1)
3573 IF (il > nn) cpabort(
"enlarge laymx")
3575 icell(ii, l1, ll2, -1) = il
3576 rxyz(1, il) = rxyz(1, i)
3577 rxyz(2, il) = rxyz(2, i) + alat(2)
3578 rxyz(3, il) = rxyz(3, i) - alat(3)
3581 in = icell(0, l1, ll2 - 1, 0)
3582 icell(0, l1, -1, ll3) = in
3584 i = icell(ii, l1, ll2 - 1, 0)
3586 IF (il > nn) cpabort(
"enlarge laymx")
3588 icell(ii, l1, -1, ll3) = il
3589 rxyz(1, il) = rxyz(1, i)
3590 rxyz(2, il) = rxyz(2, i) - alat(2)
3591 rxyz(3, il) = rxyz(3, i) + alat(3)
3594 in = icell(0, l1, ll2 - 1, ll3 - 1)
3595 icell(0, l1, -1, -1) = in
3597 i = icell(ii, l1, ll2 - 1, ll3 - 1)
3599 IF (il > nn) cpabort(
"enlarge laymx")
3601 icell(ii, l1, -1, -1) = il
3602 rxyz(1, il) = rxyz(1, i)
3603 rxyz(2, il) = rxyz(2, i) - alat(2)
3604 rxyz(3, il) = rxyz(3, i) - alat(3)
3612 in = icell(0, 0, l2, 0)
3613 icell(0, ll1, l2, ll3) = in
3615 i = icell(ii, 0, l2, 0)
3617 IF (il > nn) cpabort(
"enlarge laymx")
3619 icell(ii, ll1, l2, ll3) = il
3620 rxyz(1, il) = rxyz(1, i) + alat(1)
3621 rxyz(2, il) = rxyz(2, i)
3622 rxyz(3, il) = rxyz(3, i) + alat(3)
3625 in = icell(0, 0, l2, ll3 - 1)
3626 icell(0, ll1, l2, -1) = in
3628 i = icell(ii, 0, l2, ll3 - 1)
3630 IF (il > nn) cpabort(
"enlarge laymx")
3632 icell(ii, ll1, l2, -1) = il
3633 rxyz(1, il) = rxyz(1, i) + alat(1)
3634 rxyz(2, il) = rxyz(2, i)
3635 rxyz(3, il) = rxyz(3, i) - alat(3)
3638 in = icell(0, ll1 - 1, l2, 0)
3639 icell(0, -1, l2, ll3) = in
3641 i = icell(ii, ll1 - 1, l2, 0)
3643 IF (il > nn) cpabort(
"enlarge laymx")
3645 icell(ii, -1, l2, ll3) = il
3646 rxyz(1, il) = rxyz(1, i) - alat(1)
3647 rxyz(2, il) = rxyz(2, i)
3648 rxyz(3, il) = rxyz(3, i) + alat(3)
3651 in = icell(0, ll1 - 1, l2, ll3 - 1)
3652 icell(0, -1, l2, -1) = in
3654 i = icell(ii, ll1 - 1, l2, ll3 - 1)
3656 IF (il > nn) cpabort(
"enlarge laymx")
3658 icell(ii, -1, l2, -1) = il
3659 rxyz(1, il) = rxyz(1, i) - alat(1)
3660 rxyz(2, il) = rxyz(2, i)
3661 rxyz(3, il) = rxyz(3, i) - alat(3)
3669 in = icell(0, 0, 0, l3)
3670 icell(0, ll1, ll2, l3) = in
3672 i = icell(ii, 0, 0, l3)
3674 IF (il > nn) cpabort(
"enlarge laymx")
3676 icell(ii, ll1, ll2, l3) = il
3677 rxyz(1, il) = rxyz(1, i) + alat(1)
3678 rxyz(2, il) = rxyz(2, i) + alat(2)
3679 rxyz(3, il) = rxyz(3, i)
3682 in = icell(0, ll1 - 1, 0, l3)
3683 icell(0, -1, ll2, l3) = in
3685 i = icell(ii, ll1 - 1, 0, l3)
3687 IF (il > nn) cpabort(
"enlarge laymx")
3689 icell(ii, -1, ll2, l3) = il
3690 rxyz(1, il) = rxyz(1, i) - alat(1)
3691 rxyz(2, il) = rxyz(2, i) + alat(2)
3692 rxyz(3, il) = rxyz(3, i)
3695 in = icell(0, 0, ll2 - 1, l3)
3696 icell(0, ll1, -1, l3) = in
3698 i = icell(ii, 0, ll2 - 1, l3)
3700 IF (il > nn) cpabort(
"enlarge laymx")
3702 icell(ii, ll1, -1, l3) = il
3703 rxyz(1, il) = rxyz(1, i) + alat(1)
3704 rxyz(2, il) = rxyz(2, i) - alat(2)
3705 rxyz(3, il) = rxyz(3, i)
3708 in = icell(0, ll1 - 1, ll2 - 1, l3)
3709 icell(0, -1, -1, l3) = in
3711 i = icell(ii, ll1 - 1, ll2 - 1, l3)
3713 IF (il > nn) cpabort(
"enlarge laymx")
3715 icell(ii, -1, -1, l3) = il
3716 rxyz(1, il) = rxyz(1, i) - alat(1)
3717 rxyz(2, il) = rxyz(2, i) - alat(2)
3718 rxyz(3, il) = rxyz(3, i)
3724 in = icell(0, 0, 0, 0)
3725 icell(0, ll1, ll2, ll3) = in
3727 i = icell(ii, 0, 0, 0)
3729 IF (il > nn) cpabort(
"enlarge laymx")
3731 icell(ii, ll1, ll2, ll3) = il
3732 rxyz(1, il) = rxyz(1, i) + alat(1)
3733 rxyz(2, il) = rxyz(2, i) + alat(2)
3734 rxyz(3, il) = rxyz(3, i) + alat(3)
3737 in = icell(0, ll1 - 1, 0, 0)
3738 icell(0, -1, ll2, ll3) = in
3740 i = icell(ii, ll1 - 1, 0, 0)
3742 IF (il > nn) cpabort(
"enlarge laymx")
3744 icell(ii, -1, ll2, ll3) = il
3745 rxyz(1, il) = rxyz(1, i) - alat(1)
3746 rxyz(2, il) = rxyz(2, i) + alat(2)
3747 rxyz(3, il) = rxyz(3, i) + alat(3)
3750 in = icell(0, 0, ll2 - 1, 0)
3751 icell(0, ll1, -1, ll3) = in
3753 i = icell(ii, 0, ll2 - 1, 0)
3755 IF (il > nn) cpabort(
"enlarge laymx")
3757 icell(ii, ll1, -1, ll3) = il
3758 rxyz(1, il) = rxyz(1, i) + alat(1)
3759 rxyz(2, il) = rxyz(2, i) - alat(2)
3760 rxyz(3, il) = rxyz(3, i) + alat(3)
3763 in = icell(0, ll1 - 1, ll2 - 1, 0)
3764 icell(0, -1, -1, ll3) = in
3766 i = icell(ii, ll1 - 1, ll2 - 1, 0)
3768 IF (il > nn) cpabort(
"enlarge laymx")
3770 icell(ii, -1, -1, ll3) = il
3771 rxyz(1, il) = rxyz(1, i) - alat(1)
3772 rxyz(2, il) = rxyz(2, i) - alat(2)
3773 rxyz(3, il) = rxyz(3, i) + alat(3)
3776 in = icell(0, 0, 0, ll3 - 1)
3777 icell(0, ll1, ll2, -1) = in
3779 i = icell(ii, 0, 0, ll3 - 1)
3781 IF (il > nn) cpabort(
"enlarge laymx")
3783 icell(ii, ll1, ll2, -1) = il
3784 rxyz(1, il) = rxyz(1, i) + alat(1)
3785 rxyz(2, il) = rxyz(2, i) + alat(2)
3786 rxyz(3, il) = rxyz(3, i) - alat(3)
3789 in = icell(0, ll1 - 1, 0, ll3 - 1)
3790 icell(0, -1, ll2, -1) = in
3792 i = icell(ii, ll1 - 1, 0, ll3 - 1)
3794 IF (il > nn) cpabort(
"enlarge laymx")
3796 icell(ii, -1, ll2, -1) = il
3797 rxyz(1, il) = rxyz(1, i) - alat(1)
3798 rxyz(2, il) = rxyz(2, i) + alat(2)
3799 rxyz(3, il) = rxyz(3, i) - alat(3)
3802 in = icell(0, 0, ll2 - 1, ll3 - 1)
3803 icell(0, ll1, -1, -1) = in
3805 i = icell(ii, 0, ll2 - 1, ll3 - 1)
3807 IF (il > nn) cpabort(
"enlarge laymx")
3809 icell(ii, ll1, -1, -1) = il
3810 rxyz(1, il) = rxyz(1, i) + alat(1)
3811 rxyz(2, il) = rxyz(2, i) - alat(2)
3812 rxyz(3, il) = rxyz(3, i) - alat(3)
3815 in = icell(0, ll1 - 1, ll2 - 1, ll3 - 1)
3816 icell(0, -1, -1, -1) = in
3818 i = icell(ii, ll1 - 1, ll2 - 1, ll3 - 1)
3820 IF (il > nn) cpabort(
"enlarge laymx")
3822 icell(ii, -1, -1, -1) = il
3823 rxyz(1, il) = rxyz(1, i) - alat(1)
3824 rxyz(2, il) = rxyz(2, i) - alat(2)
3825 rxyz(3, il) = rxyz(3, i) - alat(3)
3828 ALLOCATE (lsta(2, nat))
3832 ALLOCATE (lstb(nnbrx*nat), rel(5, nnbrx*nat))
3841 myspace = (nat*nnbrx)/npr
3842 IF (iam == 0) myspaceout = myspace
3848 DO ii = 1, icell(0, l1, l2, l3)
3849 iat = icell(ii, l1, l2, l3)
3850 IF (((iat - 1)*npr)/nat == iam)
THEN
3851 lsta(1, iat) = iam*myspace + indlst + 1
3852 CALL sw_sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
3853 rxyz, icell, lstb(iam*myspace + 1), lay, rel(1, iam*myspace + 1), cut2, indlst)
3854 lsta(2, iat) = iam*myspace + indlst
3856 ndat = lsta(2, iat) - lsta(1, iat) + 1
3862 indlstx = max(indlstx, indlst)
3864 IF (indlstx < myspaceout)
EXIT
3865 DEALLOCATE (lstb, rel)
3870 npjx = 300; npjkx = 6000
3893 CALL sw_subfeniat_l(i, nat, nnbrx, rel, p, p3, fx, fy, fz, fx3, fy3, fz3, lstb, lsta, isigma, sigma)
3898 fx(i) = fx(i) + fx3(i)
3899 fy(i) = fy(i) + fy3(i)
3900 fz(i) = fz(i) + fz3(i)
3905 fxyz(1, i) = fx(i)*esigma
3906 fxyz(2, i) = fy(i)*esigma
3907 fxyz(3, i) = fz(i)*esigma
3910 DEALLOCATE (rxyz, icell, lay, lsta, lstb, rel)
3911 END SUBROUTINE eip_stillinger_weber_silicon
3919 REAL(8) function f(c)
3922 REAL(8) :: aa, bb, c4, crainv, ra
3924 parameter(aa=7.049556277d0)
3925 parameter(ra=1.8d0, bb=0.6022245584d0)
3927 IF ((c - ra) < 0.d0)
THEN
3928 crainv = 1.0d0/(c - ra)
3930 f = aa*bb*4.0d0/(c4*c)*dexp(crainv) + aa*(bb/(c4) - 1.0d0)*dexp(crainv)*crainv*crainv
3943 REAL(8) function pe(d)
3946 REAL(8),
PARAMETER :: aa = 7.049556277d0, bb = 0.6022245584d0, &
3949 IF ((d - ra) < 0.d0)
THEN
3950 pe = aa*(bb/(d*d*d*d) - 1.0d0)*dexp(1.0d0/(d - ra))
3978 SUBROUTINE sw_sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
3979 rxyz, icell, lstb, lay, rel, cut2, indlst)
3982 INTEGER :: iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, &
3984 REAL(8) :: rxyz(3, nn)
3985 INTEGER :: icell(0:ncx, -1:ll1, -1:ll2, -1:ll3), lstb(0:myspace - 1), lay(nn)
3986 REAL(8) :: rel(5, 0:myspace - 1), cut2
3989 INTEGER :: jat, jj, k1, k2, k3
3990 REAL(8) :: rr2, tt, tti, xrel, yrel, zrel
3992 DO k3 = l3 - 1, l3 + 1
3993 DO k2 = l2 - 1, l2 + 1
3994 DO k1 = l1 - 1, l1 + 1
3995 DO jj = 1, icell(0, k1, k2, k3)
3996 jat = icell(jj, k1, k2, k3)
3997 IF (jat == iat) cycle
3998 xrel = rxyz(1, iat) - rxyz(1, jat)
3999 yrel = rxyz(2, iat) - rxyz(2, jat)
4000 zrel = rxyz(3, iat) - rxyz(3, jat)
4001 rr2 = xrel**2 + yrel**2 + zrel**2
4002 IF (rr2 <= cut2)
THEN
4003 indlst = min(indlst, myspace - 1)
4004 lstb(indlst) = lay(jat)
4008 rel(1, indlst) = xrel*tti
4009 rel(2, indlst) = yrel*tti
4010 rel(3, indlst) = zrel*tti
4012 rel(5, indlst) = tti
4021 END SUBROUTINE sw_sublstiat_l
4042 SUBROUTINE sw_subfeniat_l(i, nat, nnbrx, rel, p, p3, fx, fy, fz, fx3, fy3, fz3, lstb, lsta, isigma, sigma)
4043 INTEGER,
INTENT(IN) :: i, nat, nnbrx
4044 REAL(8),
INTENT(IN) :: rel(5, nnbrx*nat)
4045 REAL(8),
INTENT(INOUT) :: p, p3, fx(nat), fy(nat), fz(nat), &
4046 fx3(nat), fy3(nat), fz3(nat)
4047 INTEGER,
INTENT(IN) :: lstb(nnbrx*nat), lsta(2, nat)
4048 REAL(8),
INTENT(IN) :: isigma, sigma
4050 INTEGER :: ipb, ipe, j, k, l, m, nij
4051 REAL(8) :: aa, bb, c4, cosijk, cosijk3, cosikj, cosikj3, cosjik, cosjik3, crainv, force, &
4052 gam, hi, hixij, hixij0, hixij1, hixik, hixik0, hixik1, hiyij, hiyij0, hiyij1, hiyik, &
4053 hiyik0, hiyik1, hizij, hizij0, hizij1, hizik, hizik0, hizik1, hj, hjxij, hjxij0, hjxij1, &
4054 hjxjk, hjxjk0, hjxjk1, hjyij, hjyij0, hjyij1, hjyjk, hjyjk0, hjyjk1, hjzij, hjzij0, &
4055 hjzij1, hjzjk, hjzjk0, hjzjk1, hk, hkxik, hkxik0, hkxik1, hkxkj, hkxkj0, hkxkj1, hkyik, &
4056 hkyik0, hkyik1, hkykj, hkykj0, hkykj1, hkzik, hkzik0, hkzik1, hkzkj, hkzkj0, hkzkj1, &
4057 invrij, invrija, invrik, invrika, invrjk, invrjka, ra, ramda, refi, refj
4058 REAL(8) :: refk, rij, rija, rik, rika, rjk, rjka, xij, xik, xjk, yij, yik, yjk, zij, zik, zjk
4060 parameter(gam=1.2d0, ramda=21.0d0, aa=7.049556277d0)
4061 parameter(ra=1.8d0, bb=0.6022245584d0)
4070 rij = rel(4, l)*isigma
4071 invrij = rel(5, l)*sigma
4076 IF (rij >= 2.d0*ra) cycle
4078 crainv = 1.0d0/(rij - ra)
4079 c4 = rij*rij*rij*rij
4080 force = aa*bb*4.0d0/(c4*rij)*dexp(crainv) + aa*(bb/(c4) - 1.0d0)*dexp(crainv)*crainv*crainv
4082 fx(i) = force*xij*invrij + fx(i)
4083 fy(i) = force*yij*invrij + fy(i)
4084 fz(i) = force*zij*invrij + fz(i)
4086 fx(j) = -force*xij*invrij + fx(j)
4087 fy(j) = -force*yij*invrij + fy(j)
4088 fz(j) = -force*zij*invrij + fz(j)
4090 p = p + aa*(bb/(rij*rij*rij*rij) - 1.0d0)*dexp(1.0d0/(rij - ra))
4098 invrik = rel(5, m)*sigma
4099 rik = rel(4, m)*isigma
4104 IF ((rik >= ra) .AND. (nij == 0)) cycle
4110 rjk = sqrt(xjk*xjk + yjk*yjk + zjk*zjk)
4113 IF ((rjk >= ra) .AND. (nij == 0)) cycle
4114 cosjik = (xij*xik + yij*yik + zij*zik)*(invrij*invrik)
4115 cosijk = (-xij*xjk - yij*yjk - zij*zjk)*(invrij*invrjk)
4116 cosikj = (xik*xjk + yik*yjk + zik*zjk)*(invrik*invrjk)
4117 cosjik3 = cosjik + 1.0d0/3.0d0
4118 cosijk3 = cosijk + 1.0d0/3.0d0
4119 cosikj3 = cosikj + 1.0d0/3.0d0
4129 IF (rija >= 0.0d0)
THEN
4132 refk = ramda*exp(gam*invrika + gam*invrjka)
4133 ELSE IF ((rija < 0.0d0) .AND. (rika < 0.0d0))
THEN
4134 IF (rjka < 0.0d0)
THEN
4135 refi = ramda*exp(gam*invrija + gam*invrika)
4136 refj = ramda*exp(gam*invrija + gam*invrjka)
4137 refk = ramda*exp(gam*invrika + gam*invrjka)
4139 refi = ramda*exp(gam*invrija + gam*invrika)
4143 ELSE IF ((rija < 0.0d0) .AND. (rjka < 0.0d0))
THEN
4145 refj = ramda*exp(gam*invrija + gam*invrjka)
4151 hi = refi*cosjik3*cosjik3
4152 hj = refj*cosijk3*cosijk3
4153 hk = refk*cosikj3*cosikj3
4154 p3 = p3 + hi + hj + hk
4156 hixij0 = 2.0d0*(xik*invrik - xij*cosjik*invrij)
4157 hixij1 = gam*xij*cosjik3*(invrija*invrija)
4158 hixij = refi*cosjik3*(hixij0 - hixij1)*invrij
4159 hixik0 = 2.0d0*(xij*invrij - xik*cosjik*invrik)
4160 hixik1 = gam*xik*cosjik3*(invrika*invrika)
4161 hixik = refi*cosjik3*(hixik0 - hixik1)*invrik
4162 hjxij0 = 2.0d0*(-xjk*invrjk - xij*cosijk*invrij)
4163 hjxij1 = gam*xij*cosijk3*(invrija*invrija)
4164 hjxij = refj*cosijk3*(hjxij0 - hjxij1)*invrij
4165 hkxik0 = 2.0d0*(xjk*invrjk - xik*cosikj*invrik)
4166 hkxik1 = gam*xik*cosikj3*(invrika*invrika)
4167 hkxik = refk*cosikj3*(hkxik0 - hkxik1)*invrik
4168 hjxjk0 = 2.0d0*(-xij*invrij - xjk*cosijk*invrjk)
4169 hjxjk1 = gam*xjk*cosijk3*(invrjka*invrjka)
4170 hjxjk = refj*cosijk3*(hjxjk0 - hjxjk1)*invrjk
4171 hkxkj0 = 2.0d0*(-xik*invrik + xjk*cosikj*invrjk)
4172 hkxkj1 = gam*xjk*cosikj3*(invrjka*invrjka)
4173 hkxkj = refk*cosikj3*(hkxkj0 + hkxkj1)*invrjk
4175 hiyij0 = 2.0d0*(yik*invrik - yij*cosjik*invrij)
4176 hiyij1 = gam*yij*cosjik3*(invrija*invrija)
4177 hiyij = refi*cosjik3*(hiyij0 - hiyij1)*invrij
4178 hiyik0 = 2.0d0*(yij*invrij - yik*cosjik*invrik)
4179 hiyik1 = gam*yik*cosjik3*(invrika*invrika)
4180 hiyik = refi*cosjik3*(hiyik0 - hiyik1)*invrik
4181 hjyij0 = 2.0d0*(-yjk*invrjk - yij*cosijk*invrij)
4182 hjyij1 = gam*yij*cosijk3*(invrija*invrija)
4183 hjyij = refj*cosijk3*(hjyij0 - hjyij1)*invrij
4184 hkyik0 = 2.0d0*(yjk*invrjk - yik*cosikj*invrik)
4185 hkyik1 = gam*yik*cosikj3*(invrika*invrika)
4186 hkyik = refk*cosikj3*(hkyik0 - hkyik1)*invrik
4187 hjyjk0 = 2.0d0*(-yij*invrij - yjk*cosijk*invrjk)
4188 hjyjk1 = gam*yjk*cosijk3*(invrjka*invrjka)
4189 hjyjk = refj*cosijk3*(hjyjk0 - hjyjk1)*invrjk
4190 hkykj0 = 2.0d0*(-yik*invrik + yjk*cosikj*invrjk)
4191 hkykj1 = gam*yjk*cosikj3*(invrjka*invrjka)
4192 hkykj = refk*cosikj3*(hkykj0 + hkykj1)*invrjk
4194 hizij0 = 2.0d0*(zik*invrik - zij*cosjik*invrij)
4195 hizij1 = gam*zij*cosjik3*(invrija*invrija)
4196 hizij = refi*cosjik3*(hizij0 - hizij1)*invrij
4197 hizik0 = 2.0d0*(zij*invrij - zik*cosjik*invrik)
4198 hizik1 = gam*zik*cosjik3*(invrika*invrika)
4199 hizik = refi*cosjik3*(hizik0 - hizik1)*invrik
4200 hjzij0 = 2.0d0*(-zjk*invrjk - zij*cosijk*invrij)
4201 hjzij1 = gam*zij*cosijk3*(invrija*invrija)
4202 hjzij = refj*cosijk3*(hjzij0 - hjzij1)*invrij
4203 hkzik0 = 2.0d0*(zjk*invrjk - zik*cosikj*invrik)
4204 hkzik1 = gam*zik*cosikj3*(invrika*invrika)
4205 hkzik = refk*cosikj3*(hkzik0 - hkzik1)*invrik
4206 hjzjk0 = 2.0d0*(-zij*invrij - zjk*cosijk*invrjk)
4207 hjzjk1 = gam*zjk*cosijk3*(invrjka*invrjka)
4208 hjzjk = refj*cosijk3*(hjzjk0 - hjzjk1)*invrjk
4209 hkzkj0 = 2.0d0*(-zik*invrik + zjk*cosikj*invrjk)
4210 hkzkj1 = gam*zjk*cosikj3*(invrjka*invrjka)
4211 hkzkj = refk*cosikj3*(hkzkj0 + hkzkj1)*invrjk
4213 fx3(i) = fx3(i) - hixij - hixik - hjxij - hkxik
4214 fy3(i) = fy3(i) - hiyij - hiyik - hjyij - hkyik
4215 fz3(i) = fz3(i) - hizij - hizik - hjzij - hkzik
4217 fx3(j) = fx3(j) + hixij + hjxij - hjxjk + hkxkj
4218 fy3(j) = fy3(j) + hiyij + hjyij - hjyjk + hkykj
4219 fz3(j) = fz3(j) + hizij + hjzij - hjzjk + hkzkj
4221 fx3(k) = fx3(k) + hixik + hkxik - hkxkj + hjxjk
4222 fy3(k) = fy3(k) + hiyik + hkyik - hkykj + hjyjk
4223 fz3(k) = fz3(k) + hizik + hkzik - hkzkj + hjzjk
4226 END SUBROUTINE sw_subfeniat_l
4237 SUBROUTINE eip_tersoff_silicon(nat, alat, rxyz, fxyz, etot, count)
4265 REAL(8) :: alat(3), rxyz(3, nat), fxyz(3, nat), &
4268 INTEGER :: iat, nnmax, npmax
4269 INTEGER,
ALLOCATABLE,
DIMENSION(:) ::
kinds, lstb
4270 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: lsta
4271 REAL(8) :: uatot, urtot, xbox, ybox, zbox
4272 REAL(8),
ALLOCATABLE,
DIMENSION(:) :: dkeij, uadurdf, xyzrrefdf
4273 REAL(8),
DIMENSION(1:2) :: bcsq, co_bcd, dsq, h, pmass, pn
4274 REAL(8),
DIMENSION(1:2, 1:2) :: ala, alr, ca, cr, r1, r2, x
4276 INTEGER:: nnbrx, nnbrxt
4279 count = count + 1.d0
4282 rxyz(1, iat) =
modulo(
modulo(rxyz(1, iat), alat(1)), alat(1))
4283 rxyz(2, iat) =
modulo(
modulo(rxyz(2, iat), alat(2)), alat(2))
4284 rxyz(3, iat) =
modulo(
modulo(rxyz(3, iat), alat(3)), alat(3))
4287 ALLOCATE (
kinds(1:nat))
4293 ALLOCATE (lsta(2, nat), lstb(nnbrxt*nat))
4294 ALLOCATE (xyzrrefdf(1:6*npmax), uadurdf(1:3*npmax), dkeij(1:3*nnmax))
4300 xbox = alat(1); ybox = alat(2); zbox = alat(3)
4301 CALL tersoff_parameters(r1, r2, cr, ca, alr, ala, x, pn, co_bcd, bcsq, dsq, h, pmass)
4302 CALL tersoff_pairlist_energy_forces(nat, npmax, nnmax, xbox, ybox, zbox,
kinds, rxyz, r1, r2, cr, &
4303 ca, alr, ala, x, xyzrrefdf, uadurdf, urtot, lsta, lstb, nnbrx, &
4304 pn, co_bcd, bcsq, dsq, h, fxyz, uatot, dkeij)
4305 etot = urtot + uatot
4306 DEALLOCATE (
kinds, xyzrrefdf, uadurdf, dkeij, lsta, lstb)
4307 END SUBROUTINE eip_tersoff_silicon
4325 SUBROUTINE tersoff_parameters(R1, R2, Cr, Ca, alr, ala, X, Pn, Co_bcd, bcsq, dsq, h, Pmass)
4327 REAL(8),
DIMENSION(1:2, 1:2),
INTENT(out) :: r1, r2, cr, ca, alr, ala, x
4328 REAL(8),
DIMENSION(1:2),
INTENT(out) :: pn, co_bcd, bcsq, dsq, h, pmass
4330 REAL(8),
PARAMETER :: c_ala = 2.2119d0, c_alr = 3.4879d0, c_b = 1.5724d-7, c_c = 3.8049d4, &
4331 c_ca = 3.4674d2, c_cr = 1.3936d3, c_d = 4.3484d0, c_h = -5.7058d-1, c_mass = 12.0d0, &
4332 c_n = 7.2751d-1, c_r1 = 1.8d0, c_r2 = 2.1d0, si_ala = 1.7322d0, si_alr = 2.4799d0, &
4333 si_b = 1.1000d-6, si_c = 1.0039d5, si_ca = 4.7118d2, si_cr = 1.8308d3, si_d = 1.6217d1, &
4334 si_h = -5.9825d-1, si_mass = 28.0855d0, si_n = 7.8734d-1, si_r1 = 2.7d0, si_r2 = 3.3d0
4352 cr(1, 2) = dsqrt(cr(1, 1)*cr(2, 2))
4357 ca(1, 2) = dsqrt(ca(1, 1)*ca(2, 2))
4362 r1(1, 2) = dsqrt(r1(1, 1)*r1(2, 2))
4367 r2(1, 2) = dsqrt(r2(1, 1)*r2(2, 2))
4377 alr(1, 2) = 0.5d0*(alr(1, 1) + alr(2, 2))
4378 alr(2, 1) = alr(1, 2)
4382 ala(1, 2) = 0.5d0*(ala(1, 1) + ala(2, 2))
4383 ala(2, 1) = ala(1, 2)
4388 co_bcd(1) = c_b*(1.0d0 + c_c*c_c/(c_d*c_d))
4389 co_bcd(2) = si_b*(1.0d0 + si_c*si_c/(si_d*si_d))
4391 bcsq(1) = c_b*c_c*c_c
4392 bcsq(2) = si_b*si_c*si_c
4404 END SUBROUTINE tersoff_parameters
4438 SUBROUTINE tersoff_pairlist_energy_forces(Nmol, Npmax, NNmax, xbox, ybox, zbox, Kinds, R, R1, R2, Cr, Ca, alr, ala, X, &
4439 XYZRrefdf, UadUrdf, Urtot, lsta, lstb, nnbrx, &
4440 Pn, Co_bcd, bcsq, dsq, h, F, Uatot, dkEij)
4441 INTEGER,
INTENT(in) :: nmol, npmax, nnmax
4442 REAL(8),
INTENT(in) :: xbox, ybox, zbox
4443 INTEGER,
DIMENSION(1:Nmol),
INTENT(in) ::
kinds
4444 REAL(8),
DIMENSION(1:3*Nmol),
INTENT(in) :: r
4445 REAL(8),
DIMENSION(1:2, 1:2),
INTENT(in) :: r1, r2, cr, ca, alr, ala, x
4446 REAL(8),
DIMENSION(1:6*Npmax),
INTENT(out) :: xyzrrefdf
4447 REAL(8),
DIMENSION(1:3*Npmax),
INTENT(out) :: uadurdf
4448 REAL(8),
INTENT(out) :: urtot
4449 INTEGER :: lsta(2, nmol)
4450 INTEGER,
INTENT(inout) :: nnbrx
4451 INTEGER :: lstb(nnbrx*nmol)
4452 REAL(8),
DIMENSION(1:2),
INTENT(in) :: pn, co_bcd, bcsq, dsq, h
4453 REAL(8),
DIMENSION(1:3*Nmol),
INTENT(out) :: f
4454 REAL(8),
INTENT(out) :: uatot
4455 REAL(8),
DIMENSION(1:3*NNmax) :: dkeij
4457 INTEGER :: i, iam, iat, ii, il, in, indlst, indlstx, ipb, istopg, jat, l1, l2, l3, laymx, &
4458 ll1, ll2, ll3, myspace, myspaceout, nat, ncx, ndat, nn, npjkx, npjx, npr, nptot
4459 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: lay
4460 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :, :) :: icell
4461 REAL(8) :: alat(3), cut, cut2, pi, rlc1i, rlc2i, &
4462 rlc3i, rxyz0(3, nmol), xhalf, yhalf, &
4464 REAL(8),
ALLOCATABLE,
DIMENSION(:, :) :: rel, rxyz
4480 rxyz0(1, iat) = r(jat + 1)
4481 rxyz0(2, iat) = r(jat + 2)
4482 rxyz0(3, iat) = r(jat + 3)
4485 cut = r2(2, 2) - 1.d-9
4488 ll1 = int(alat(1)/cut)
4489 IF (ll1 < 1) cpabort(
"alat(1) too small")
4490 ll2 = int(alat(2)/cut)
4491 IF (ll2 < 1) cpabort(
"alat(2) too small")
4492 ll3 = int(alat(3)/cut)
4493 IF (ll3 < 1) cpabort(
"alat(3) too small")
4502 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
4503 icell(0, :, :, :) = 0
4509 l1 = int(rxyz0(1, iat)*rlc1i)
4510 l2 = int(rxyz0(2, iat)*rlc2i)
4511 l3 = int(rxyz0(3, iat)*rlc3i)
4513 ii = icell(0, l1, l2, l3)
4515 icell(0, l1, l2, l3) = ii
4520 icell(ii, l1, l2, l3) = iat
4522 IF (
ALLOCATED(icell))
EXIT
4526 laymx = ncx*(2*ll1*ll2 + 2*ll1*ll3 + 2*ll2*ll3 + 4*ll1 + 4*ll2 + 4*ll3 + 8)
4528 ALLOCATE (rxyz(3, nn), lay(nn))
4531 rxyz(1, iat) = rxyz0(1, iat)
4532 rxyz(2, iat) = rxyz0(2, iat)
4533 rxyz(3, iat) = rxyz0(3, iat)
4540 in = icell(0, l1, l2, 0)
4541 icell(0, l1, l2, ll3) = in
4543 i = icell(ii, l1, l2, 0)
4545 IF (il > nn) cpabort(
"enlarge laymx")
4547 icell(ii, l1, l2, ll3) = il
4548 rxyz(1, il) = rxyz(1, i)
4549 rxyz(2, il) = rxyz(2, i)
4550 rxyz(3, il) = rxyz(3, i) + alat(3)
4553 in = icell(0, l1, l2, ll3 - 1)
4554 icell(0, l1, l2, -1) = in
4556 i = icell(ii, l1, l2, ll3 - 1)
4558 IF (il > nn) cpabort(
"enlarge laymx")
4560 icell(ii, l1, l2, -1) = il
4561 rxyz(1, il) = rxyz(1, i)
4562 rxyz(2, il) = rxyz(2, i)
4563 rxyz(3, il) = rxyz(3, i) - alat(3)
4573 in = icell(0, 0, l2, l3)
4574 icell(0, ll1, l2, l3) = in
4576 i = icell(ii, 0, l2, l3)
4578 IF (il > nn) cpabort(
"enlarge laymx")
4580 icell(ii, ll1, l2, l3) = il
4581 rxyz(1, il) = rxyz(1, i) + alat(1)
4582 rxyz(2, il) = rxyz(2, i)
4583 rxyz(3, il) = rxyz(3, i)
4586 in = icell(0, ll1 - 1, l2, l3)
4587 icell(0, -1, l2, l3) = in
4589 i = icell(ii, ll1 - 1, l2, l3)
4591 IF (il > nn) cpabort(
"enlarge laymx")
4593 icell(ii, -1, l2, l3) = il
4594 rxyz(1, il) = rxyz(1, i) - alat(1)
4595 rxyz(2, il) = rxyz(2, i)
4596 rxyz(3, il) = rxyz(3, i)
4606 in = icell(0, l1, 0, l3)
4607 icell(0, l1, ll2, l3) = in
4609 i = icell(ii, l1, 0, l3)
4611 IF (il > nn) cpabort(
"enlarge laymx")
4613 icell(ii, l1, ll2, l3) = il
4614 rxyz(1, il) = rxyz(1, i)
4615 rxyz(2, il) = rxyz(2, i) + alat(2)
4616 rxyz(3, il) = rxyz(3, i)
4619 in = icell(0, l1, ll2 - 1, l3)
4620 icell(0, l1, -1, l3) = in
4622 i = icell(ii, l1, ll2 - 1, l3)
4624 IF (il > nn) cpabort(
"enlarge laymx")
4626 icell(ii, l1, -1, l3) = il
4627 rxyz(1, il) = rxyz(1, i)
4628 rxyz(2, il) = rxyz(2, i) - alat(2)
4629 rxyz(3, il) = rxyz(3, i)
4638 in = icell(0, l1, 0, 0)
4639 icell(0, l1, ll2, ll3) = in
4641 i = icell(ii, l1, 0, 0)
4643 IF (il > nn) cpabort(
"enlarge laymx")
4645 icell(ii, l1, ll2, ll3) = il
4646 rxyz(1, il) = rxyz(1, i)
4647 rxyz(2, il) = rxyz(2, i) + alat(2)
4648 rxyz(3, il) = rxyz(3, i) + alat(3)
4651 in = icell(0, l1, 0, ll3 - 1)
4652 icell(0, l1, ll2, -1) = in
4654 i = icell(ii, l1, 0, ll3 - 1)
4656 IF (il > nn) cpabort(
"enlarge laymx")
4658 icell(ii, l1, ll2, -1) = il
4659 rxyz(1, il) = rxyz(1, i)
4660 rxyz(2, il) = rxyz(2, i) + alat(2)
4661 rxyz(3, il) = rxyz(3, i) - alat(3)
4664 in = icell(0, l1, ll2 - 1, 0)
4665 icell(0, l1, -1, ll3) = in
4667 i = icell(ii, l1, ll2 - 1, 0)
4669 IF (il > nn) cpabort(
"enlarge laymx")
4671 icell(ii, l1, -1, ll3) = il
4672 rxyz(1, il) = rxyz(1, i)
4673 rxyz(2, il) = rxyz(2, i) - alat(2)
4674 rxyz(3, il) = rxyz(3, i) + alat(3)
4677 in = icell(0, l1, ll2 - 1, ll3 - 1)
4678 icell(0, l1, -1, -1) = in
4680 i = icell(ii, l1, ll2 - 1, ll3 - 1)
4682 IF (il > nn) cpabort(
"enlarge laymx")
4684 icell(ii, l1, -1, -1) = il
4685 rxyz(1, il) = rxyz(1, i)
4686 rxyz(2, il) = rxyz(2, i) - alat(2)
4687 rxyz(3, il) = rxyz(3, i) - alat(3)
4695 in = icell(0, 0, l2, 0)
4696 icell(0, ll1, l2, ll3) = in
4698 i = icell(ii, 0, l2, 0)
4700 IF (il > nn) cpabort(
"enlarge laymx")
4702 icell(ii, ll1, l2, ll3) = il
4703 rxyz(1, il) = rxyz(1, i) + alat(1)
4704 rxyz(2, il) = rxyz(2, i)
4705 rxyz(3, il) = rxyz(3, i) + alat(3)
4708 in = icell(0, 0, l2, ll3 - 1)
4709 icell(0, ll1, l2, -1) = in
4711 i = icell(ii, 0, l2, ll3 - 1)
4713 IF (il > nn) cpabort(
"enlarge laymx")
4715 icell(ii, ll1, l2, -1) = il
4716 rxyz(1, il) = rxyz(1, i) + alat(1)
4717 rxyz(2, il) = rxyz(2, i)
4718 rxyz(3, il) = rxyz(3, i) - alat(3)
4721 in = icell(0, ll1 - 1, l2, 0)
4722 icell(0, -1, l2, ll3) = in
4724 i = icell(ii, ll1 - 1, l2, 0)
4726 IF (il > nn) cpabort(
"enlarge laymx")
4728 icell(ii, -1, l2, ll3) = il
4729 rxyz(1, il) = rxyz(1, i) - alat(1)
4730 rxyz(2, il) = rxyz(2, i)
4731 rxyz(3, il) = rxyz(3, i) + alat(3)
4734 in = icell(0, ll1 - 1, l2, ll3 - 1)
4735 icell(0, -1, l2, -1) = in
4737 i = icell(ii, ll1 - 1, l2, ll3 - 1)
4739 IF (il > nn) cpabort(
"enlarge laymx")
4741 icell(ii, -1, l2, -1) = il
4742 rxyz(1, il) = rxyz(1, i) - alat(1)
4743 rxyz(2, il) = rxyz(2, i)
4744 rxyz(3, il) = rxyz(3, i) - alat(3)
4752 in = icell(0, 0, 0, l3)
4753 icell(0, ll1, ll2, l3) = in
4755 i = icell(ii, 0, 0, l3)
4757 IF (il > nn) cpabort(
"enlarge laymx")
4759 icell(ii, ll1, ll2, l3) = il
4760 rxyz(1, il) = rxyz(1, i) + alat(1)
4761 rxyz(2, il) = rxyz(2, i) + alat(2)
4762 rxyz(3, il) = rxyz(3, i)
4765 in = icell(0, ll1 - 1, 0, l3)
4766 icell(0, -1, ll2, l3) = in
4768 i = icell(ii, ll1 - 1, 0, l3)
4770 IF (il > nn) cpabort(
"enlarge laymx")
4772 icell(ii, -1, ll2, l3) = il
4773 rxyz(1, il) = rxyz(1, i) - alat(1)
4774 rxyz(2, il) = rxyz(2, i) + alat(2)
4775 rxyz(3, il) = rxyz(3, i)
4778 in = icell(0, 0, ll2 - 1, l3)
4779 icell(0, ll1, -1, l3) = in
4781 i = icell(ii, 0, ll2 - 1, l3)
4783 IF (il > nn) cpabort(
"enlarge laymx")
4785 icell(ii, ll1, -1, l3) = il
4786 rxyz(1, il) = rxyz(1, i) + alat(1)
4787 rxyz(2, il) = rxyz(2, i) - alat(2)
4788 rxyz(3, il) = rxyz(3, i)
4791 in = icell(0, ll1 - 1, ll2 - 1, l3)
4792 icell(0, -1, -1, l3) = in
4794 i = icell(ii, ll1 - 1, ll2 - 1, l3)
4796 IF (il > nn) cpabort(
"enlarge laymx")
4798 icell(ii, -1, -1, l3) = il
4799 rxyz(1, il) = rxyz(1, i) - alat(1)
4800 rxyz(2, il) = rxyz(2, i) - alat(2)
4801 rxyz(3, il) = rxyz(3, i)
4807 in = icell(0, 0, 0, 0)
4808 icell(0, ll1, ll2, ll3) = in
4810 i = icell(ii, 0, 0, 0)
4812 IF (il > nn) cpabort(
"enlarge laymx")
4814 icell(ii, ll1, ll2, ll3) = il
4815 rxyz(1, il) = rxyz(1, i) + alat(1)
4816 rxyz(2, il) = rxyz(2, i) + alat(2)
4817 rxyz(3, il) = rxyz(3, i) + alat(3)
4820 in = icell(0, ll1 - 1, 0, 0)
4821 icell(0, -1, ll2, ll3) = in
4823 i = icell(ii, ll1 - 1, 0, 0)
4825 IF (il > nn) cpabort(
"enlarge laymx")
4827 icell(ii, -1, ll2, ll3) = il
4828 rxyz(1, il) = rxyz(1, i) - alat(1)
4829 rxyz(2, il) = rxyz(2, i) + alat(2)
4830 rxyz(3, il) = rxyz(3, i) + alat(3)
4833 in = icell(0, 0, ll2 - 1, 0)
4834 icell(0, ll1, -1, ll3) = in
4836 i = icell(ii, 0, ll2 - 1, 0)
4838 IF (il > nn) cpabort(
"enlarge laymx")
4840 icell(ii, ll1, -1, ll3) = il
4841 rxyz(1, il) = rxyz(1, i) + alat(1)
4842 rxyz(2, il) = rxyz(2, i) - alat(2)
4843 rxyz(3, il) = rxyz(3, i) + alat(3)
4846 in = icell(0, ll1 - 1, ll2 - 1, 0)
4847 icell(0, -1, -1, ll3) = in
4849 i = icell(ii, ll1 - 1, ll2 - 1, 0)
4851 IF (il > nn) cpabort(
"enlarge laymx")
4853 icell(ii, -1, -1, ll3) = il
4854 rxyz(1, il) = rxyz(1, i) - alat(1)
4855 rxyz(2, il) = rxyz(2, i) - alat(2)
4856 rxyz(3, il) = rxyz(3, i) + alat(3)
4859 in = icell(0, 0, 0, ll3 - 1)
4860 icell(0, ll1, ll2, -1) = in
4862 i = icell(ii, 0, 0, ll3 - 1)
4864 IF (il > nn) cpabort(
"enlarge laymx")
4866 icell(ii, ll1, ll2, -1) = il
4867 rxyz(1, il) = rxyz(1, i) + alat(1)
4868 rxyz(2, il) = rxyz(2, i) + alat(2)
4869 rxyz(3, il) = rxyz(3, i) - alat(3)
4872 in = icell(0, ll1 - 1, 0, ll3 - 1)
4873 icell(0, -1, ll2, -1) = in
4875 i = icell(ii, ll1 - 1, 0, ll3 - 1)
4877 IF (il > nn) cpabort(
"enlarge laymx")
4879 icell(ii, -1, ll2, -1) = il
4880 rxyz(1, il) = rxyz(1, i) - alat(1)
4881 rxyz(2, il) = rxyz(2, i) + alat(2)
4882 rxyz(3, il) = rxyz(3, i) - alat(3)
4885 in = icell(0, 0, ll2 - 1, ll3 - 1)
4886 icell(0, ll1, -1, -1) = in
4888 i = icell(ii, 0, ll2 - 1, ll3 - 1)
4890 IF (il > nn) cpabort(
"enlarge laymx")
4892 icell(ii, ll1, -1, -1) = il
4893 rxyz(1, il) = rxyz(1, i) + alat(1)
4894 rxyz(2, il) = rxyz(2, i) - alat(2)
4895 rxyz(3, il) = rxyz(3, i) - alat(3)
4898 in = icell(0, ll1 - 1, ll2 - 1, ll3 - 1)
4899 icell(0, -1, -1, -1) = in
4901 i = icell(ii, ll1 - 1, ll2 - 1, ll3 - 1)
4903 IF (il > nn) cpabort(
"enlarge laymx")
4905 icell(ii, -1, -1, -1) = il
4906 rxyz(1, il) = rxyz(1, i) - alat(1)
4907 rxyz(2, il) = rxyz(2, i) - alat(2)
4908 rxyz(3, il) = rxyz(3, i) - alat(3)
4912 ALLOCATE (rel(5, nnbrx*nat))
4920 myspace = (nat*nnbrx)/npr
4921 IF (iam == 0) myspaceout = myspace
4927 DO ii = 1, icell(0, l1, l2, l3)
4928 iat = icell(ii, l1, l2, l3)
4929 IF (((iat - 1)*npr)/nat == iam)
THEN
4931 lsta(1, iat) = iam*myspace + indlst + 1
4932 CALL tersoff_sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
4933 rxyz, icell, lstb(iam*myspace + 1), lay, rel(1, iam*myspace + 1), cut2, indlst)
4934 lsta(2, iat) = iam*myspace + indlst
4936 ndat = lsta(2, iat) - lsta(1, iat) + 1
4943 indlstx = max(indlstx, indlst)
4945 IF (indlstx >= myspaceout) cpabort(
"NNBRX too small")
4949 npjx = 300; npjkx = 6000
4958 do_i:
DO i = 1, nmol
4959 CALL tersoff_subeniat_l(i, nmol, npmax,
kinds, x, r1, r2, cr, ca, alr, ala, xyzrrefdf, uadurdf, urtot, lsta, lstb, nnbrx, rel, pi)
4967 do_if:
DO i = 1, nmol
4968 CALL tersoff_subfiat_l(i,nmol,npmax,nnmax,
kinds,pn,co_bcd,bcsq,dsq,h,xyzrrefdf,uadurdf,f,uatot,dkeij,lsta,lstb,nnbrx)
4974 DEALLOCATE (rxyz, icell, lay, rel)
4976 END SUBROUTINE tersoff_pairlist_energy_forces
4999 SUBROUTINE tersoff_sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
5000 rxyz, icell, lstb, lay, rel, cut2, indlst)
5003 INTEGER :: iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, &
5005 REAL(8) :: rxyz(3, nn)
5006 INTEGER :: icell(0:ncx, -1:ll1, -1:ll2, -1:ll3), lstb(0:myspace - 1), lay(nn)
5007 REAL(8) :: rel(5, 0:myspace - 1), cut2
5010 INTEGER :: jat, jj, k1, k2, k3
5011 REAL(8) :: rr2, tt, tti, xrel, yrel, zrel
5013 DO k3 = l3 - 1, l3 + 1
5014 DO k2 = l2 - 1, l2 + 1
5015 DO k1 = l1 - 1, l1 + 1
5016 DO jj = 1, icell(0, k1, k2, k3)
5017 jat = icell(jj, k1, k2, k3)
5018 IF (jat == iat) cycle
5019 xrel = rxyz(1, iat) - rxyz(1, jat)
5020 yrel = rxyz(2, iat) - rxyz(2, jat)
5021 zrel = rxyz(3, iat) - rxyz(3, jat)
5022 rr2 = xrel**2 + yrel**2 + zrel**2
5023 IF (rr2 <= cut2)
THEN
5024 indlst = min(indlst, myspace - 1)
5025 lstb(indlst) = lay(jat)
5029 rel(1, indlst) = xrel*tti
5030 rel(2, indlst) = yrel*tti
5031 rel(3, indlst) = zrel*tti
5033 rel(5, indlst) = tti
5042 END SUBROUTINE tersoff_sublstiat_l
5066 SUBROUTINE tersoff_subeniat_l(i,Nmol,Npmax,Kinds,X,R1,R2,Cr,Ca,alr,ala,XYZRrefdf,UadUrdf,Urtot,lsta,lstb,nnbrx,rel,pi)
5068 INTEGER,
INTENT(in) :: nmol, npmax
5069 INTEGER,
DIMENSION(1:Nmol),
INTENT(in) ::
kinds
5070 REAL(8),
DIMENSION(1:2, 1:2),
INTENT(in) :: x, r1, r2, cr, ca, alr, ala
5071 REAL(8),
DIMENSION(1:6*Npmax),
INTENT(inout) :: xyzrrefdf
5072 REAL(8),
DIMENSION(1:3*Npmax),
INTENT(inout) :: uadurdf
5073 REAL(8),
INTENT(inout) :: urtot
5074 INTEGER,
INTENT(in) :: lsta(2, nmol), nnbrx, lstb(nnbrx*nmol)
5075 REAL(8),
INTENT(in) :: rel(5, nnbrx*nmol)
5078 INTEGER :: j, ki, kj, l, nppt3, nppt6, nptot
5079 REAL(8) :: alaij, alrij, dfij, fij, pl1, pl2, r1ij, &
5080 r2ij, rij, rreij, ua, ur, xij, yij, zij
5087 do_j:
DO l = lsta(1, i), lsta(2, i)
5098 nppt3 = 3*(nptot - 1)
5099 nppt6 = 6*(nptot - 1)
5102 xyzrrefdf(nppt6 + 1) = xij
5103 xyzrrefdf(nppt6 + 2) = yij
5104 xyzrrefdf(nppt6 + 3) = zij
5105 xyzrrefdf(nppt6 + 4) = rreij
5110 ur = cr(ki, kj)*dexp(-alrij*rij)
5111 ua = -ca(ki, kj)*dexp(-alaij*rij)*x(ki, kj)
5114 IF (rij <= r1ij)
THEN
5115 xyzrrefdf(nppt6 + 5) = 1.0d0
5116 xyzrrefdf(nppt6 + 6) = 0.0d0
5118 uadurdf(nppt3 + 1) = ua
5119 uadurdf(nppt3 + 2) = -alrij*ur
5120 uadurdf(nppt3 + 3) = -alaij*ua
5122 pl1 = pi/(r2ij - r1ij)
5123 pl2 = pl1*(rij - r1ij)
5124 fij = 0.5d0 + 0.5d0*dcos(pl2)
5125 dfij = -0.5d0*pl1*dsin(pl2)
5126 xyzrrefdf(nppt6 + 5) = fij
5127 xyzrrefdf(nppt6 + 6) = dfij
5128 urtot = urtot + fij*ur
5129 uadurdf(nppt3 + 1) = fij*ua
5130 uadurdf(nppt3 + 2) = (dfij - alrij*fij)*ur
5131 uadurdf(nppt3 + 3) = (dfij - alaij*fij)*ua
5134 END SUBROUTINE tersoff_subeniat_l
5157 SUBROUTINE tersoff_subfiat_l(i,Nmol,Npmax,NNmax,Kinds,Pn,Co_bcd,bcsq,dsq,h,XYZRrefdf,UadUrdf,F,Uatot,dkEij,lsta,lstb,nnbrx)
5159 INTEGER,
INTENT(in) :: nmol, npmax, nnmax
5160 INTEGER,
DIMENSION(1:Nmol),
INTENT(in) ::
kinds
5161 REAL(8),
DIMENSION(1:2),
INTENT(in) :: pn, co_bcd, bcsq, dsq, h
5162 REAL(8),
DIMENSION(1:6*Npmax),
INTENT(in) :: xyzrrefdf
5163 REAL(8),
DIMENSION(1:3*Npmax),
INTENT(in) :: uadurdf
5164 REAL(8),
DIMENSION(1:3*Nmol),
INTENT(inout) :: f
5165 REAL(8),
INTENT(inout) :: uatot
5166 REAL(8),
DIMENSION(1:3*NNmax) :: dkeij
5167 INTEGER,
INTENT(in) :: lsta(2, nmol), nnbrx, lstb(nnbrx*nmol)
5169 INTEGER :: ij, ijpt3, ijpt6, ik, ikpt6, ipb, ipe, &
5170 ipt3, jpt3, ki, kpt3, nkpt3
5171 REAL(8) :: bcsqi, bij, co1_dkeij, co2_dkeij, co_cdi, co_dhcosi, co_hcosi, co_mb1, co_mb2, &
5172 co_pa, cosijk, dfij, dfik, dfxi, dfxj, dfxk, dfyi, dfyj, dfyk, dfzi, dfzj, dfzk, dgi, &
5173 djeij, dsqi, dxjeij2, dyjeij2, dzjeij2, eij, fdg, fdgcos, fij, fik, gi, hi, pni, rreij, &
5174 rreik, ua, xrreij, xrreik, yrreij, yrreik, zrreij, zrreik
5191 do_j:
DO ij = ipb, ipe, +1
5196 xrreij = xyzrrefdf(ijpt6 + 1)
5197 yrreij = xyzrrefdf(ijpt6 + 2)
5198 zrreij = xyzrrefdf(ijpt6 + 3)
5199 rreij = xyzrrefdf(ijpt6 + 4)
5200 fij = xyzrrefdf(ijpt6 + 5)
5201 dfij = xyzrrefdf(ijpt6 + 6)
5210 do_k:
DO ik = ipb, ipe, +1
5214 ikij:
IF (ik /= ij)
THEN
5218 xrreik = xyzrrefdf(ikpt6 + 1)
5219 yrreik = xyzrrefdf(ikpt6 + 2)
5220 zrreik = xyzrrefdf(ikpt6 + 3)
5221 rreik = xyzrrefdf(ikpt6 + 4)
5222 fik = xyzrrefdf(ikpt6 + 5)
5223 dfik = xyzrrefdf(ikpt6 + 6)
5225 cosijk = xrreij*xrreik + yrreij*yrreik + zrreij*zrreik
5227 co_hcosi = hi - cosijk
5228 co_dhcosi = 1.0d0/(dsqi + co_hcosi*co_hcosi)
5229 gi = -bcsqi*co_dhcosi
5230 dgi = 2.0d0*co_hcosi*co_dhcosi*gi
5238 djeij = djeij + fdgcos
5240 dxjeij2 = dxjeij2 + fdg*xrreik
5241 dyjeij2 = dyjeij2 + fdg*yrreik
5242 dzjeij2 = dzjeij2 + fdg*zrreik
5244 co1_dkeij = -dfik*gi + fdgcos*rreik
5245 co2_dkeij = -fdg*rreik
5247 dkeij(nkpt3 + 1) = co1_dkeij*xrreik + co2_dkeij*xrreij
5248 dkeij(nkpt3 + 2) = co1_dkeij*yrreik + co2_dkeij*yrreij
5249 dkeij(nkpt3 + 3) = co1_dkeij*zrreik + co2_dkeij*zrreij
5252 dkeij(nkpt3 + 1) = 0.0d0
5253 dkeij(nkpt3 + 2) = 0.0d0
5254 dkeij(nkpt3 + 3) = 0.0d0
5259 bij = 1.0d0 + eij**pni
5260 ua = uadurdf(ijpt3 + 1)*bij**(-0.5d0/pni)
5263 co_pa = uadurdf(ijpt3 + 2) + uadurdf(ijpt3 + 3)*bij**(-0.5d0/pni)
5265 ceij:
IF (nkpt3 > 0)
THEN
5267 co_mb1 = ua*0.5d0*eij**(pni - 1.0d0)/bij
5268 co_mb2 = co_mb1*rreij
5271 DO ik = ipb, ipe, +1
5274 dfxk = co_mb1*dkeij(nkpt3 + 1)
5275 dfyk = co_mb1*dkeij(nkpt3 + 2)
5276 dfzk = co_mb1*dkeij(nkpt3 + 3)
5278 kpt3 = 3*(lstb(ik) - 1)
5279 f(kpt3 + 1) = f(kpt3 + 1) + dfxk
5280 f(kpt3 + 2) = f(kpt3 + 2) + dfyk
5281 f(kpt3 + 3) = f(kpt3 + 3) + dfzk
5289 dfxj = co_pa*xrreij + co_mb2*(xrreij*djeij - dxjeij2)
5290 dfyj = co_pa*yrreij + co_mb2*(yrreij*djeij - dyjeij2)
5291 dfzj = co_pa*zrreij + co_mb2*(zrreij*djeij - dzjeij2)
5301 jpt3 = 3*(lstb(ij) - 1)
5303 f(jpt3 + 1) = f(jpt3 + 1) + dfxj
5304 f(jpt3 + 2) = f(jpt3 + 2) + dfyj
5305 f(jpt3 + 3) = f(jpt3 + 3) + dfzj
5314 f(ipt3 + 1) = f(ipt3 + 1) - dfxi
5315 f(ipt3 + 2) = f(ipt3 + 2) - dfyi
5316 f(ipt3 + 3) = f(ipt3 + 3) - dfzi
5317 END SUBROUTINE tersoff_subfiat_l
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
represent a simple array based list of the given type
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
Handles all functions related to the CELL.
subroutine, public get_cell(cell, alpha, beta, gamma, deth, orthorhombic, abc, periodic, h, h_inv, symmetry_id, tag)
Get informations about a simulation cell.
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
types that represent a subsys, i.e. a part of the system
subroutine, public cp_subsys_get(subsys, ref_count, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell)
returns information about various attributes of the given subsys
stores a lists of integer that are local to a processor. The idea is that these integers represent ob...
The environment for the empirical interatomic potential methods.
subroutine, public eip_env_get(eip_env, eip_model, eip_energy, eip_energy_var, eip_forces, coord_avg, coord_var, count, subsys, atomic_kind_set, particle_set, local_particles, molecule_kind_set, molecule_set, local_molecules, eip_input, force_env_input, cell, cell_ref, use_ref_cell, eip_kinetic_energy, eip_potential_energy, virial)
Returns various attributes of the eip environment.
Empirical interatomic potentials for Silicon.
subroutine, public eip_stillinger_weber(eip_env)
Interface routine of the Stillinger-Weber force field to CP2K.
subroutine, public eip_lenosky(eip_env)
Interface routine of Goedecker's Lenosky force field to CP2K.
subroutine, public eip_tersoff(eip_env)
Interface routine of the Tersoff force field to CP2K.
subroutine, public eip_bazant(eip_env)
Interface routine of Goedecker's Bazant EDIP to CP2K.
Defines the basic variable types.
integer, parameter, public dp
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