43 #include "./base/base_uses.f90"
48 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'eip_silicon'
75 TYPE(eip_environment_type),
POINTER :: eip_env
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
85 TYPE(atomic_kind_list_type),
POINTER :: atomic_kinds
86 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
87 TYPE(atomic_kind_type),
POINTER :: atomic_kind
88 TYPE(cell_type),
POINTER :: cell
89 TYPE(cp_logger_type),
POINTER :: logger
90 TYPE(cp_subsys_type),
POINTER :: subsys
91 TYPE(distribution_1d_type),
POINTER :: local_particles
92 TYPE(mp_para_env_type),
POINTER :: para_env
93 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
94 TYPE(section_vals_type),
POINTER :: eip_section
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)
241 TYPE(eip_environment_type),
POINTER :: eip_env
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
251 TYPE(atomic_kind_list_type),
POINTER :: atomic_kinds
252 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
253 TYPE(atomic_kind_type),
POINTER :: atomic_kind
254 TYPE(cell_type),
POINTER :: cell
255 TYPE(cp_logger_type),
POINTER :: logger
256 TYPE(cp_subsys_type),
POINTER :: subsys
257 TYPE(distribution_1d_type),
POINTER :: local_particles
258 TYPE(mp_para_env_type),
POINTER :: para_env
259 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
260 TYPE(section_vals_type),
POINTER :: eip_section
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)
405 SUBROUTINE eip_print_energies(eip_env, output_unit)
406 TYPE(eip_environment_type),
POINTER :: eip_env
407 INTEGER,
INTENT(IN) :: output_unit
411 IF (output_unit > 0)
THEN
412 WRITE (unit=output_unit, fmt=
"(/,(T3,A,T55,F25.14))") &
413 "Kinetic energy [Hartree]: ", eip_env%eip_kinetic_energy, &
414 "Potential energy [Hartree]: ", eip_env%eip_potential_energy, &
415 "Total EIP energy [Hartree]: ", eip_env%eip_energy
418 END SUBROUTINE eip_print_energies
428 SUBROUTINE eip_print_energy_var(eip_env, output_unit)
429 TYPE(eip_environment_type),
POINTER :: eip_env
430 INTEGER,
INTENT(IN) :: output_unit
436 unit_nr = output_unit
438 IF (unit_nr > 0)
THEN
440 WRITE (unit_nr, *)
""
441 WRITE (unit_nr, *)
"The variance of the EIP energy/atom!"
442 WRITE (unit_nr, *)
""
443 WRITE (unit_nr, *) eip_env%eip_energy_var
447 END SUBROUTINE eip_print_energy_var
457 SUBROUTINE eip_print_forces(eip_env, output_unit)
458 TYPE(eip_environment_type),
POINTER :: eip_env
459 INTEGER,
INTENT(IN) :: output_unit
461 INTEGER :: iatom, natom, unit_nr
462 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
466 NULLIFY (particle_set)
468 unit_nr = output_unit
470 IF (unit_nr > 0)
THEN
472 CALL eip_env_get(eip_env=eip_env, particle_set=particle_set)
474 natom =
SIZE(particle_set)
476 WRITE (unit_nr, *)
""
477 WRITE (unit_nr, *)
"The EIP forces!"
478 WRITE (unit_nr, *)
""
479 WRITE (unit_nr, *)
"Total EIP forces [Hartree/Bohr]"
481 WRITE (unit_nr, *) eip_env%eip_forces(1:3, iatom)
486 END SUBROUTINE eip_print_forces
496 SUBROUTINE eip_print_coord_avg(eip_env, output_unit)
497 TYPE(eip_environment_type),
POINTER :: eip_env
498 INTEGER,
INTENT(IN) :: output_unit
504 unit_nr = output_unit
506 IF (unit_nr > 0)
THEN
508 WRITE (unit_nr, *)
""
509 WRITE (unit_nr, *)
"The average coordination number!"
510 WRITE (unit_nr, *)
""
511 WRITE (unit_nr, *) eip_env%coord_avg
515 END SUBROUTINE eip_print_coord_avg
525 SUBROUTINE eip_print_coord_var(eip_env, output_unit)
526 TYPE(eip_environment_type),
POINTER :: eip_env
527 INTEGER,
INTENT(IN) :: output_unit
533 unit_nr = output_unit
535 IF (unit_nr > 0)
THEN
537 WRITE (unit_nr, *)
""
538 WRITE (unit_nr, *)
"The variance of the coordination number!"
539 WRITE (unit_nr, *)
""
540 WRITE (unit_nr, *) eip_env%coord_var
544 END SUBROUTINE eip_print_coord_var
554 SUBROUTINE eip_print_count(eip_env, output_unit)
555 TYPE(eip_environment_type),
POINTER :: eip_env
556 INTEGER,
INTENT(IN) :: output_unit
562 unit_nr = output_unit
564 IF (unit_nr > 0)
THEN
566 WRITE (unit_nr, *)
""
567 WRITE (unit_nr, *)
"The function call counter!"
568 WRITE (unit_nr, *)
""
569 WRITE (unit_nr, *) eip_env%count
573 END SUBROUTINE eip_print_count
604 SUBROUTINE eip_bazant_silicon(nat, alat, rxyz0, fxyz, ener, coord, ener_var, &
608 REAL(kind=
dp) :: alat, rxyz0, fxyz, ener, coord, &
609 ener_var, coord_var, count
611 dimension rxyz0(3, nat), fxyz(3, nat), alat(3)
612 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rxyz
613 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: lsta
614 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: lstb
615 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: lay
616 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :, :) :: icell
617 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rel
618 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: txyz
619 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: s2, s3, sz
620 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: num2, num3, numz
622 REAL(kind=
dp) :: coord2, cut, cut2, ener2, rlc1i, rlc2i, rlc3i, tcoord, &
623 tcoord2, tener, tener2
624 INTEGER :: iam, iat, iat1, iat2, ii, i, il, in, indlst, indlstx, istop, &
625 istopg, l2, l3, laymx, ll1, ll2, ll3, lot, max_nbrs, myspace, &
626 l1, myspaceout, ncx, nn, nnbrx, npr
629 cut = 3.1213820e0_dp + 1.e-14_dp
631 IF (count .EQ. 0)
OPEN (unit=10, file=
'bazant.mon', status=
'unknown')
632 count = count + 1.e0_dp
635 ll1 = int(alat(1)/cut)
636 IF (ll1 .LT. 1) cpabort(
"alat(1) too small")
637 ll2 = int(alat(2)/cut)
638 IF (ll2 .LT. 1) cpabort(
"alat(2) too small")
639 ll3 = int(alat(3)/cut)
640 IF (ll3 .LT. 1) cpabort(
"alat(3) too small")
656 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
657 icell(0, -1:ll1, -1:ll2, -1:ll3) = 0
662 loop_iat_s:
DO iat = 1, nat
663 rxyz0(1, iat) =
modulo(
modulo(rxyz0(1, iat), alat(1)), alat(1))
664 rxyz0(2, iat) =
modulo(
modulo(rxyz0(2, iat), alat(2)), alat(2))
665 rxyz0(3, iat) =
modulo(
modulo(rxyz0(3, iat), alat(3)), alat(3))
666 l1 = int(rxyz0(1, iat)*rlc1i)
667 l2 = int(rxyz0(2, iat)*rlc2i)
668 l3 = int(rxyz0(3, iat)*rlc3i)
670 ii = icell(0, l1, l2, l3)
672 icell(0, l1, l2, l3) = ii
673 IF (ii .GT. ncx)
THEN
674 WRITE (10, *) count,
'NCX too small', ncx
679 icell(ii, l1, l2, l3) = iat
689 rxyz0(1, iat) =
modulo(
modulo(rxyz0(1, iat), alat(1)), alat(1))
690 rxyz0(2, iat) =
modulo(
modulo(rxyz0(2, iat), alat(2)), alat(2))
691 rxyz0(3, iat) =
modulo(
modulo(rxyz0(3, iat), alat(3)), alat(3))
699 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
700 icell(0, -1:ll1, -1:ll2, -1:ll3) = 0
706 loop_iat_p:
DO iat = 1, nat
707 l1 = int(rxyz0(1, iat)*rlc1i)
708 l2 = int(rxyz0(2, iat)*rlc2i)
709 l3 = int(rxyz0(3, iat)*rlc3i)
710 ii = icell(0, l1, l2, l3)
712 icell(0, l1, l2, l3) = ii
713 IF (ii .GT. ncx)
THEN
714 WRITE (10, *) count,
'NCX too small', ncx
719 icell(ii, l1, l2, l3) = iat
727 laymx = ncx*(2*ll1*ll2 + 2*ll1*ll3 + 2*ll2*ll3 + 4*ll1 + 4*ll2 + 4*ll3 + 8)
729 ALLOCATE (rxyz(3, nn), lay(nn))
732 rxyz(1, iat) = rxyz0(1, iat)
733 rxyz(2, iat) = rxyz0(2, iat)
734 rxyz(3, iat) = rxyz0(3, iat)
741 in = icell(0, l1, l2, 0)
742 icell(0, l1, l2, ll3) = in
744 i = icell(ii, l1, l2, 0)
746 IF (il .GT. nn) cpabort(
"enlarge laymx")
748 icell(ii, l1, l2, ll3) = il
749 rxyz(1, il) = rxyz(1, i)
750 rxyz(2, il) = rxyz(2, i)
751 rxyz(3, il) = rxyz(3, i) + alat(3)
754 in = icell(0, l1, l2, ll3 - 1)
755 icell(0, l1, l2, -1) = in
757 i = icell(ii, l1, l2, ll3 - 1)
759 IF (il .GT. nn) cpabort(
"enlarge laymx")
761 icell(ii, l1, l2, -1) = il
762 rxyz(1, il) = rxyz(1, i)
763 rxyz(2, il) = rxyz(2, i)
764 rxyz(3, il) = rxyz(3, i) - alat(3)
774 in = icell(0, 0, l2, l3)
775 icell(0, ll1, l2, l3) = in
777 i = icell(ii, 0, l2, l3)
779 IF (il .GT. nn) cpabort(
"enlarge laymx")
781 icell(ii, ll1, l2, l3) = il
782 rxyz(1, il) = rxyz(1, i) + alat(1)
783 rxyz(2, il) = rxyz(2, i)
784 rxyz(3, il) = rxyz(3, i)
787 in = icell(0, ll1 - 1, l2, l3)
788 icell(0, -1, l2, l3) = in
790 i = icell(ii, ll1 - 1, l2, l3)
792 IF (il .GT. nn) cpabort(
"enlarge laymx")
794 icell(ii, -1, l2, l3) = il
795 rxyz(1, il) = rxyz(1, i) - alat(1)
796 rxyz(2, il) = rxyz(2, i)
797 rxyz(3, il) = rxyz(3, i)
807 in = icell(0, l1, 0, l3)
808 icell(0, l1, ll2, l3) = in
810 i = icell(ii, l1, 0, l3)
812 IF (il .GT. nn) cpabort(
"enlarge laymx")
814 icell(ii, l1, ll2, l3) = il
815 rxyz(1, il) = rxyz(1, i)
816 rxyz(2, il) = rxyz(2, i) + alat(2)
817 rxyz(3, il) = rxyz(3, i)
820 in = icell(0, l1, ll2 - 1, l3)
821 icell(0, l1, -1, l3) = in
823 i = icell(ii, l1, ll2 - 1, l3)
825 IF (il .GT. nn) cpabort(
"enlarge laymx")
827 icell(ii, l1, -1, l3) = il
828 rxyz(1, il) = rxyz(1, i)
829 rxyz(2, il) = rxyz(2, i) - alat(2)
830 rxyz(3, il) = rxyz(3, i)
839 in = icell(0, l1, 0, 0)
840 icell(0, l1, ll2, ll3) = in
842 i = icell(ii, l1, 0, 0)
844 IF (il .GT. nn) cpabort(
"enlarge laymx")
846 icell(ii, l1, ll2, ll3) = il
847 rxyz(1, il) = rxyz(1, i)
848 rxyz(2, il) = rxyz(2, i) + alat(2)
849 rxyz(3, il) = rxyz(3, i) + alat(3)
852 in = icell(0, l1, 0, ll3 - 1)
853 icell(0, l1, ll2, -1) = in
855 i = icell(ii, l1, 0, ll3 - 1)
857 IF (il .GT. nn) cpabort(
"enlarge laymx")
859 icell(ii, l1, ll2, -1) = il
860 rxyz(1, il) = rxyz(1, i)
861 rxyz(2, il) = rxyz(2, i) + alat(2)
862 rxyz(3, il) = rxyz(3, i) - alat(3)
865 in = icell(0, l1, ll2 - 1, 0)
866 icell(0, l1, -1, ll3) = in
868 i = icell(ii, l1, ll2 - 1, 0)
870 IF (il .GT. nn) cpabort(
"enlarge laymx")
872 icell(ii, l1, -1, ll3) = il
873 rxyz(1, il) = rxyz(1, i)
874 rxyz(2, il) = rxyz(2, i) - alat(2)
875 rxyz(3, il) = rxyz(3, i) + alat(3)
878 in = icell(0, l1, ll2 - 1, ll3 - 1)
879 icell(0, l1, -1, -1) = in
881 i = icell(ii, l1, ll2 - 1, ll3 - 1)
883 IF (il .GT. nn) cpabort(
"enlarge laymx")
885 icell(ii, l1, -1, -1) = il
886 rxyz(1, il) = rxyz(1, i)
887 rxyz(2, il) = rxyz(2, i) - alat(2)
888 rxyz(3, il) = rxyz(3, i) - alat(3)
896 in = icell(0, 0, l2, 0)
897 icell(0, ll1, l2, ll3) = in
899 i = icell(ii, 0, l2, 0)
901 IF (il .GT. nn) cpabort(
"enlarge laymx")
903 icell(ii, ll1, l2, ll3) = il
904 rxyz(1, il) = rxyz(1, i) + alat(1)
905 rxyz(2, il) = rxyz(2, i)
906 rxyz(3, il) = rxyz(3, i) + alat(3)
909 in = icell(0, 0, l2, ll3 - 1)
910 icell(0, ll1, l2, -1) = in
912 i = icell(ii, 0, l2, ll3 - 1)
914 IF (il .GT. nn) cpabort(
"enlarge laymx")
916 icell(ii, ll1, l2, -1) = il
917 rxyz(1, il) = rxyz(1, i) + alat(1)
918 rxyz(2, il) = rxyz(2, i)
919 rxyz(3, il) = rxyz(3, i) - alat(3)
922 in = icell(0, ll1 - 1, l2, 0)
923 icell(0, -1, l2, ll3) = in
925 i = icell(ii, ll1 - 1, l2, 0)
927 IF (il .GT. nn) cpabort(
"enlarge laymx")
929 icell(ii, -1, l2, ll3) = il
930 rxyz(1, il) = rxyz(1, i) - alat(1)
931 rxyz(2, il) = rxyz(2, i)
932 rxyz(3, il) = rxyz(3, i) + alat(3)
935 in = icell(0, ll1 - 1, l2, ll3 - 1)
936 icell(0, -1, l2, -1) = in
938 i = icell(ii, ll1 - 1, l2, ll3 - 1)
940 IF (il .GT. nn) cpabort(
"enlarge laymx")
942 icell(ii, -1, l2, -1) = il
943 rxyz(1, il) = rxyz(1, i) - alat(1)
944 rxyz(2, il) = rxyz(2, i)
945 rxyz(3, il) = rxyz(3, i) - alat(3)
953 in = icell(0, 0, 0, l3)
954 icell(0, ll1, ll2, l3) = in
956 i = icell(ii, 0, 0, l3)
958 IF (il .GT. nn) cpabort(
"enlarge laymx")
960 icell(ii, ll1, ll2, l3) = il
961 rxyz(1, il) = rxyz(1, i) + alat(1)
962 rxyz(2, il) = rxyz(2, i) + alat(2)
963 rxyz(3, il) = rxyz(3, i)
966 in = icell(0, ll1 - 1, 0, l3)
967 icell(0, -1, ll2, l3) = in
969 i = icell(ii, ll1 - 1, 0, l3)
971 IF (il .GT. nn) cpabort(
"enlarge laymx")
973 icell(ii, -1, ll2, l3) = il
974 rxyz(1, il) = rxyz(1, i) - alat(1)
975 rxyz(2, il) = rxyz(2, i) + alat(2)
976 rxyz(3, il) = rxyz(3, i)
979 in = icell(0, 0, ll2 - 1, l3)
980 icell(0, ll1, -1, l3) = in
982 i = icell(ii, 0, ll2 - 1, l3)
984 IF (il .GT. nn) cpabort(
"enlarge laymx")
986 icell(ii, ll1, -1, l3) = il
987 rxyz(1, il) = rxyz(1, i) + alat(1)
988 rxyz(2, il) = rxyz(2, i) - alat(2)
989 rxyz(3, il) = rxyz(3, i)
992 in = icell(0, ll1 - 1, ll2 - 1, l3)
993 icell(0, -1, -1, l3) = in
995 i = icell(ii, ll1 - 1, ll2 - 1, l3)
997 IF (il .GT. nn) cpabort(
"enlarge laymx")
999 icell(ii, -1, -1, l3) = il
1000 rxyz(1, il) = rxyz(1, i) - alat(1)
1001 rxyz(2, il) = rxyz(2, i) - alat(2)
1002 rxyz(3, il) = rxyz(3, i)
1008 in = icell(0, 0, 0, 0)
1009 icell(0, ll1, ll2, ll3) = in
1011 i = icell(ii, 0, 0, 0)
1013 IF (il .GT. nn) cpabort(
"enlarge laymx")
1015 icell(ii, ll1, ll2, ll3) = il
1016 rxyz(1, il) = rxyz(1, i) + alat(1)
1017 rxyz(2, il) = rxyz(2, i) + alat(2)
1018 rxyz(3, il) = rxyz(3, i) + alat(3)
1021 in = icell(0, ll1 - 1, 0, 0)
1022 icell(0, -1, ll2, ll3) = in
1024 i = icell(ii, ll1 - 1, 0, 0)
1026 IF (il .GT. nn) cpabort(
"enlarge laymx")
1028 icell(ii, -1, ll2, ll3) = il
1029 rxyz(1, il) = rxyz(1, i) - alat(1)
1030 rxyz(2, il) = rxyz(2, i) + alat(2)
1031 rxyz(3, il) = rxyz(3, i) + alat(3)
1034 in = icell(0, 0, ll2 - 1, 0)
1035 icell(0, ll1, -1, ll3) = in
1037 i = icell(ii, 0, ll2 - 1, 0)
1039 IF (il .GT. nn) cpabort(
"enlarge laymx")
1041 icell(ii, ll1, -1, ll3) = il
1042 rxyz(1, il) = rxyz(1, i) + alat(1)
1043 rxyz(2, il) = rxyz(2, i) - alat(2)
1044 rxyz(3, il) = rxyz(3, i) + alat(3)
1047 in = icell(0, ll1 - 1, ll2 - 1, 0)
1048 icell(0, -1, -1, ll3) = in
1050 i = icell(ii, ll1 - 1, ll2 - 1, 0)
1052 IF (il .GT. nn) cpabort(
"enlarge laymx")
1054 icell(ii, -1, -1, ll3) = il
1055 rxyz(1, il) = rxyz(1, i) - alat(1)
1056 rxyz(2, il) = rxyz(2, i) - alat(2)
1057 rxyz(3, il) = rxyz(3, i) + alat(3)
1060 in = icell(0, 0, 0, ll3 - 1)
1061 icell(0, ll1, ll2, -1) = in
1063 i = icell(ii, 0, 0, ll3 - 1)
1065 IF (il .GT. nn) cpabort(
"enlarge laymx")
1067 icell(ii, ll1, ll2, -1) = il
1068 rxyz(1, il) = rxyz(1, i) + alat(1)
1069 rxyz(2, il) = rxyz(2, i) + alat(2)
1070 rxyz(3, il) = rxyz(3, i) - alat(3)
1073 in = icell(0, ll1 - 1, 0, ll3 - 1)
1074 icell(0, -1, ll2, -1) = in
1076 i = icell(ii, ll1 - 1, 0, ll3 - 1)
1078 IF (il .GT. nn) cpabort(
"enlarge laymx")
1080 icell(ii, -1, ll2, -1) = il
1081 rxyz(1, il) = rxyz(1, i) - alat(1)
1082 rxyz(2, il) = rxyz(2, i) + alat(2)
1083 rxyz(3, il) = rxyz(3, i) - alat(3)
1086 in = icell(0, 0, ll2 - 1, ll3 - 1)
1087 icell(0, ll1, -1, -1) = in
1089 i = icell(ii, 0, ll2 - 1, ll3 - 1)
1091 IF (il .GT. nn) cpabort(
"enlarge laymx")
1093 icell(ii, ll1, -1, -1) = il
1094 rxyz(1, il) = rxyz(1, i) + alat(1)
1095 rxyz(2, il) = rxyz(2, i) - alat(2)
1096 rxyz(3, il) = rxyz(3, i) - alat(3)
1099 in = icell(0, ll1 - 1, ll2 - 1, ll3 - 1)
1100 icell(0, -1, -1, -1) = in
1102 i = icell(ii, ll1 - 1, ll2 - 1, ll3 - 1)
1104 IF (il .GT. nn) cpabort(
"enlarge laymx")
1106 icell(ii, -1, -1, -1) = il
1107 rxyz(1, il) = rxyz(1, i) - alat(1)
1108 rxyz(2, il) = rxyz(2, i) - alat(2)
1109 rxyz(3, il) = rxyz(3, i) - alat(3)
1112 ALLOCATE (lsta(2, nat))
1115 ALLOCATE (lstb(nnbrx*nat), rel(5, nnbrx*nat))
1131 myspace = (nat*nnbrx)/npr
1132 IF (iam .EQ. 0) myspaceout = myspace
1135 loop_l3:
DO l3 = 0, ll3 - 1
1136 loop_l2:
DO l2 = 0, ll2 - 1
1137 loop_l1:
DO l1 = 0, ll1 - 1
1138 loop_ii:
DO ii = 1, icell(0, l1, l2, l3)
1139 iat = icell(ii, l1, l2, l3)
1140 IF (((iat - 1)*npr)/nat .EQ. iam)
THEN
1142 lsta(1, iat) = iam*myspace + indlst + 1
1143 CALL sublstiat_b(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
1144 rxyz, icell, lstb(iam*myspace + 1), lay, &
1145 rel(1, iam*myspace + 1), cut2, indlst)
1146 lsta(2, iat) = iam*myspace + indlst
1156 indlstx = max(indlstx, indlst)
1160 IF (indlstx .GE. myspaceout)
THEN
1161 WRITE (10, *) count,
'NNBRX too small', nnbrx
1162 DEALLOCATE (lstb, rel)
1183 IF (npr .NE. 1)
THEN
1188 ALLOCATE (txyz(3, nat), s2(max_nbrs, 8), s3(max_nbrs, 7), sz(max_nbrs, 6), &
1189 num2(max_nbrs), num3(max_nbrs), numz(max_nbrs))
1191 IF (iam .EQ. 0)
THEN
1199 fxyz(1, iat) = 0.e0_dp
1200 fxyz(2, iat) = 0.e0_dp
1201 fxyz(3, iat) = 0.e0_dp
1206 lot = int(real(nat, kind=
dp)/real(npr, kind=
dp) + .999999999999e0_dp)
1208 iat2 = min((iam + 1)*lot, nat)
1210 CALL subfeniat_b(iat1, iat2, nat, lsta, lstb, rel, tener, tener2, &
1211 tcoord, tcoord2, nnbrx, txyz, max_nbrs, istop, &
1212 s2(1, 1), s2(1, 2), s2(1, 3), s2(1, 4), s2(1, 5), s2(1, 6), s2(1, 7), s2(1, 8), &
1213 num2, s3(1, 1), s3(1, 2), s3(1, 3), s3(1, 4), s3(1, 5), s3(1, 6), s3(1, 7), &
1214 num3, sz(1, 1), sz(1, 2), sz(1, 3), sz(1, 4), sz(1, 5), sz(1, 6), numz)
1218 ener2 = ener2 + tener2
1219 coord = coord + tcoord
1220 coord2 = coord2 + tcoord2
1221 istopg = istopg + istop
1223 fxyz(1, iat) = fxyz(1, iat) + txyz(1, iat)
1224 fxyz(2, iat) = fxyz(2, iat) + txyz(2, iat)
1225 fxyz(3, iat) = fxyz(3, iat) + txyz(3, iat)
1227 DEALLOCATE (txyz, s2, s3, sz, num2, num3, numz)
1234 ALLOCATE (s2(max_nbrs, 8), s3(max_nbrs, 7), sz(max_nbrs, 6), &
1235 num2(max_nbrs), num3(max_nbrs), numz(max_nbrs))
1236 CALL subfeniat_b(iat1, iat2, nat, lsta, lstb, rel, ener, ener2, &
1237 coord, coord2, nnbrx, fxyz, max_nbrs, istopg, &
1238 s2(1, 1), s2(1, 2), s2(1, 3), s2(1, 4), s2(1, 5), s2(1, 6), s2(1, 7), s2(1, 8), &
1239 num2, s3(1, 1), s3(1, 2), s3(1, 3), s3(1, 4), s3(1, 5), s3(1, 6), s3(1, 7), &
1240 num3, sz(1, 1), sz(1, 2), sz(1, 3), sz(1, 4), sz(1, 5), sz(1, 6), numz)
1241 DEALLOCATE (s2, s3, sz, num2, num3, numz)
1248 IF (istopg .GT. 0) cpabort(
"DIMENSION ERROR (see WARNING above)")
1249 ener_var = ener2/nat - (ener/nat)**2
1251 coord_var = coord2/nat - coord**2
1253 DEALLOCATE (rxyz, icell, lay, lsta, lstb, rel)
1255 END SUBROUTINE eip_bazant_silicon
1298 SUBROUTINE subfeniat_b(iat1, iat2, nat, lsta, lstb, rel, ener, ener2, &
1299 coord, coord2, nnbrx, ff, max_nbrs, istop, &
1300 s2_t0, s2_t1, s2_t2, s2_t3, s2_dx, s2_dy, s2_dz, s2_r, &
1301 num2, s3_g, s3_dg, s3_rinv, s3_dx, s3_dy, s3_dz, s3_r, &
1302 num3, sz_df, sz_sum, sz_dx, sz_dy, sz_dz, sz_r, numz)
1310 INTEGER :: iat1, iat2, nat, lsta(2, nat)
1311 REAL(kind=
dp) :: ener, ener2, coord, coord2
1313 REAL(kind=
dp) :: rel(5, nnbrx*nat)
1314 INTEGER :: lstb(nnbrx*nat)
1315 REAL(kind=
dp) :: ff(3, nat)
1316 INTEGER :: max_nbrs, istop
1317 REAL(kind=
dp) :: s2_t0(max_nbrs), s2_t1(max_nbrs), s2_t2(max_nbrs), s2_t3(max_nbrs), &
1318 s2_dx(max_nbrs), s2_dy(max_nbrs), s2_dz(max_nbrs), s2_r(max_nbrs)
1319 INTEGER :: num2(max_nbrs)
1320 REAL(kind=
dp) :: s3_g(max_nbrs), s3_dg(max_nbrs), s3_rinv(max_nbrs), s3_dx(max_nbrs), &
1321 s3_dy(max_nbrs), s3_dz(max_nbrs), s3_r(max_nbrs)
1322 INTEGER :: num3(max_nbrs)
1323 REAL(kind=
dp) :: sz_df(max_nbrs), sz_sum(max_nbrs), &
1324 sz_dx(max_nbrs), sz_dy(max_nbrs), &
1325 sz_dz(max_nbrs), sz_r(max_nbrs)
1326 INTEGER :: numz(max_nbrs)
1328 INTEGER :: i, j, k, l, n, n2, n3, nj, nk, nl, nz
1329 REAL(kind=
dp) :: bmc, cmbinv, coord_iat, dedrl, dedrlx, dedrly, dedrlz, den, dhdl, dhdx, &
1330 dp1, dtau, dv2dz, dv2ijx, dv2ijy, dv2ijz, dv2j, dv3dz, dv3l, dv3ljx, dv3ljy, dv3ljz, &
1331 dv3lkx, dv3lky, dv3lkz, dv3rij, dv3rijx, dv3rijy, dv3rijz, dv3rik, dv3rikx, dv3riky, &
1332 dv3rikz, dwinv, dx, dxdz, dy, dz, ener_iat, fjx, fjy, fjz, fkx, fky, fkz, fz, h, lcos, &
1333 muhalf, par_a, par_alp, par_b, par_bet, par_bg, par_c, par_cap_a, par_cap_b, par_delta, &
1334 par_eta, par_gam, par_lam, par_mu, par_palp, par_qo, par_rh, par_sig, pz, qort, r, rinv, &
1335 rmainv, rmbinv, tau, temp0, temp1, u1, u2, u3, u4, u5, winv, x, xarg
1336 REAL(kind=
dp) :: xinv, xinv3, z
1347 par_cap_a = 5.6714030e0_dp
1348 par_cap_b = 2.0002804e0_dp
1349 par_rh = 1.2085196e0_dp
1350 par_a = 3.1213820e0_dp
1351 par_sig = 0.5774108e0_dp
1352 par_lam = 1.4533108e0_dp
1353 par_gam = 1.1247945e0_dp
1354 par_b = 3.1213820e0_dp
1355 par_c = 2.5609104e0_dp
1356 par_delta = 78.7590539e0_dp
1357 par_mu = 0.6966326e0_dp
1358 par_qo = 312.1341346e0_dp
1359 par_palp = 1.4074424e0_dp
1360 par_bet = 0.0070975e0_dp
1361 par_alp = 3.1083847e0_dp
1369 par_eta = par_delta/par_qo
1386 muhalf = par_mu*0.5e0_dp
1389 cmbinv = 1.0e0_dp/(par_c - par_b)
1393 atoms:
DO i = iat1, iat2
1406 DO n = lsta(1, i), lsta(2, i)
1417 rmainv = 1.e0_dp/(r - par_a)
1418 s2_t0(n2) = par_cap_a*exp(par_sig*rmainv)
1419 s2_t1(n2) = (par_cap_b*rinv)**par_rh
1420 s2_t2(n2) = par_rh*rinv
1421 s2_t3(n2) = par_sig*rmainv*rmainv
1427 IF (n2 .GT. max_nbrs)
THEN
1428 WRITE (*, *)
'WARNING enlarge max_nbrs'
1435 IF (r .LE. 2.36e0_dp)
THEN
1436 coord_iat = coord_iat + 1.e0_dp
1437 ELSE IF (r .GE. 3.12e0_dp)
THEN
1439 xarg = (r - 2.36e0_dp)*(1.e0_dp/(3.12e0_dp - 2.36e0_dp))
1440 coord_iat = coord_iat + (2*xarg + 1.e0_dp)*(xarg - 1.e0_dp)**2
1445 IF (r .LT. par_bg)
THEN
1448 rmbinv = 1.e0_dp/(r - par_bg)
1449 temp1 = par_gam*rmbinv
1452 s3_dg(n3) = -rmbinv*temp1*temp0
1459 IF (n3 .GT. max_nbrs)
THEN
1460 WRITE (*, *)
'WARNING enlarge max_nbrs'
1467 IF (r .LT. par_b)
THEN
1468 IF (r .LT. par_c)
THEN
1471 xinv = bmc/(r - par_c)
1472 xinv3 = xinv*xinv*xinv
1473 den = 1.e0_dp/(1 - xinv3)
1478 sz_df(nz) = fz*temp1*den*3.e0_dp*xinv3*xinv*cmbinv
1485 IF (nz .GT. max_nbrs)
THEN
1486 WRITE (*, *)
'WARNING enlarge max_nbrs'
1501 sz_sum(nl) = 0.e0_dp
1507 pz = par_palp*exp(-temp0*z)
1509 dp1 = -2.e0_dp*temp0*pz
1516 temp0 = s2_t1(nj) - pz
1520 ener_iat = ener_iat + temp0*s2_t0(nj)
1524 dv2j = -s2_t0(nj)*(s2_t1(nj)*s2_t2(nj) + temp0*s2_t3(nj))
1526 dv2ijx = dv2j*s2_dx(nj)
1527 dv2ijy = dv2j*s2_dy(nj)
1528 dv2ijz = dv2j*s2_dz(nj)
1529 ff(1, i) = ff(1, i) + dv2ijx
1530 ff(2, i) = ff(2, i) + dv2ijy
1531 ff(3, i) = ff(3, i) + dv2ijz
1533 ff(1, j) = ff(1, j) - dv2ijx
1534 ff(2, j) = ff(2, j) - dv2ijy
1535 ff(3, j) = ff(3, j) - dv2ijz
1539 dv2dz = -dp1*s2_t0(nj)
1541 sz_sum(nl) = sz_sum(nl) + dv2dz
1548 winv = qort*exp(-muhalf*z)
1550 dwinv = -muhalf*winv
1553 tau = u1 + u2*temp0*(u3 - temp0)
1555 dtau = u5*temp0*(2*temp0 - u3)
1566 DO nk = nj + 1, n3 - 1
1572 lcos = s3_dx(nj)*s3_dx(nk) + s3_dy(nj)*s3_dy(nk) + s3_dz(nj)*s3_dz(nk)
1573 x = (lcos + tau)*winv
1576 h = par_lam*(1 - temp0 + par_eta*x*x)
1577 dhdx = 2*par_lam*x*(temp0 + par_eta)
1583 temp1 = s3_g(nj)*s3_g(nk)
1584 ener_iat = ener_iat + temp1*h
1588 dv3rij = s3_dg(nj)*s3_g(nk)*h
1589 dv3rijx = dv3rij*s3_dx(nj)
1590 dv3rijy = dv3rij*s3_dy(nj)
1591 dv3rijz = dv3rij*s3_dz(nj)
1598 dv3rik = s3_g(nj)*s3_dg(nk)*h
1599 dv3rikx = dv3rik*s3_dx(nk)
1600 dv3riky = dv3rik*s3_dy(nk)
1601 dv3rikz = dv3rik*s3_dz(nk)
1609 dv3ljx = dv3l*(s3_dx(nk) - lcos*s3_dx(nj))*s3_rinv(nj)
1610 dv3ljy = dv3l*(s3_dy(nk) - lcos*s3_dy(nj))*s3_rinv(nj)
1611 dv3ljz = dv3l*(s3_dz(nk) - lcos*s3_dz(nj))*s3_rinv(nj)
1618 dv3lkx = dv3l*(s3_dx(nj) - lcos*s3_dx(nk))*s3_rinv(nk)
1619 dv3lky = dv3l*(s3_dy(nj) - lcos*s3_dy(nk))*s3_rinv(nk)
1620 dv3lkz = dv3l*(s3_dz(nj) - lcos*s3_dz(nk))*s3_rinv(nk)
1627 ff(1, j) = ff(1, j) - fjx
1628 ff(2, j) = ff(2, j) - fjy
1629 ff(3, j) = ff(3, j) - fjz
1630 ff(1, k) = ff(1, k) - fkx
1631 ff(2, k) = ff(2, k) - fky
1632 ff(3, k) = ff(3, k) - fkz
1633 ff(1, i) = ff(1, i) + fjx + fkx
1634 ff(2, i) = ff(2, i) + fjy + fky
1635 ff(3, i) = ff(3, i) + fjz + fkz
1638 dxdz = dwinv*(lcos + tau) + winv*dtau
1639 dv3dz = temp1*dhdx*dxdz
1644 sz_sum(nl) = sz_sum(nl) + dv3dz
1653 dedrl = sz_sum(nl)*sz_df(nl)
1654 dedrlx = dedrl*sz_dx(nl)
1655 dedrly = dedrl*sz_dy(nl)
1656 dedrlz = dedrl*sz_dz(nl)
1657 ff(1, i) = ff(1, i) + dedrlx
1658 ff(2, i) = ff(2, i) + dedrly
1659 ff(3, i) = ff(3, i) + dedrlz
1661 ff(1, l) = ff(1, l) - dedrlx
1662 ff(2, l) = ff(2, l) - dedrly
1663 ff(3, l) = ff(3, l) - dedrlz
1667 coord = coord + coord_iat
1668 coord2 = coord2 + coord_iat**2
1669 ener = ener + ener_iat
1670 ener2 = ener2 + ener_iat**2
1675 END SUBROUTINE subfeniat_b
1697 SUBROUTINE sublstiat_b(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
1698 rxyz, icell, lstb, lay, rel, cut2, indlst)
1701 INTEGER :: iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, &
1703 REAL(kind=
dp) :: rxyz
1704 INTEGER :: icell, lstb, lay
1705 REAL(kind=
dp) :: rel, cut2
1708 dimension rxyz(3, nn), lay(nn), icell(0:ncx, -1:ll1, -1:ll2, -1:ll3), &
1709 lstb(0:myspace - 1), rel(5, 0:myspace - 1)
1711 INTEGER :: jat, k1, k2, k3, jj
1712 REAL(kind=
dp) :: rr2, tt, tti, xrel, yrel, zrel
1714 DO k3 = l3 - 1, l3 + 1
1715 DO k2 = l2 - 1, l2 + 1
1716 DO k1 = l1 - 1, l1 + 1
1717 DO jj = 1, icell(0, k1, k2, k3)
1718 jat = icell(jj, k1, k2, k3)
1719 IF (jat .EQ. iat) cycle
1720 xrel = rxyz(1, iat) - rxyz(1, jat)
1721 yrel = rxyz(2, iat) - rxyz(2, jat)
1722 zrel = rxyz(3, iat) - rxyz(3, jat)
1723 rr2 = xrel**2 + yrel**2 + zrel**2
1724 IF (rr2 .LE. cut2)
THEN
1725 indlst = min(indlst, myspace - 1)
1726 lstb(indlst) = lay(jat)
1730 rel(1, indlst) = xrel*tti
1731 rel(2, indlst) = yrel*tti
1732 rel(3, indlst) = zrel*tti
1734 rel(5, indlst) = tti
1743 END SUBROUTINE sublstiat_b
1769 SUBROUTINE eip_lenosky_silicon(nat, alat, rxyz0, fxyz, ener, coord, ener_var, &
1773 REAL(kind=
dp) :: alat, rxyz0, fxyz, ener, coord, &
1774 ener_var, coord_var, count
1776 dimension rxyz0(3, nat), fxyz(3, nat), alat(3)
1777 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rxyz
1778 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: lsta
1779 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: lstb
1780 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: lay
1781 INTEGER,
ALLOCATABLE,
DIMENSION(:, :, :, :) :: icell
1782 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rel
1783 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: txyz
1784 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: f2ij, f3ij, f3ik
1786 REAL(kind=
dp) :: coord2, cut, cut2, ener2, tcoord, &
1787 tcoord2, tener, tener2
1788 INTEGER :: i, iam, iat, iat1, iat2, ii, il, in, indlst, indlstx, &
1789 istop, istopg, l1, l2, l3, ll1, ll2, ll3, lot, ncx, nn, &
1790 nnbrx, npjkx, npjx, laymx, npr, rlc1i, rlc2i, rlc3i, &
1795 cut = 0.4500000e+01_dp
1797 IF (count .EQ. 0)
OPEN (unit=10, file=
'lenosky.mon', status=
'unknown')
1798 count = count + 1.e0_dp
1801 ll1 = int(alat(1)/cut)
1802 IF (ll1 .LT. 1) cpabort(
"alat(1) too small")
1803 ll2 = int(alat(2)/cut)
1804 IF (ll2 .LT. 1) cpabort(
"alat(2) too small")
1805 ll3 = int(alat(3)/cut)
1806 IF (ll3 .LT. 1) cpabort(
"alat(3) too small")
1817 IF (npr .LE. 1)
THEN
1822 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
1823 icell(0, -1:ll1, -1:ll2, -1:ll3) = 0
1824 rlc1i = int(ll1/alat(1))
1825 rlc2i = int(ll2/alat(2))
1826 rlc3i = int(ll3/alat(3))
1828 loop_iat_s:
DO iat = 1, nat
1829 rxyz0(1, iat) =
modulo(
modulo(rxyz0(1, iat), alat(1)), alat(1))
1830 rxyz0(2, iat) =
modulo(
modulo(rxyz0(2, iat), alat(2)), alat(2))
1831 rxyz0(3, iat) =
modulo(
modulo(rxyz0(3, iat), alat(3)), alat(3))
1832 l1 = int(rxyz0(1, iat)*rlc1i)
1833 l2 = int(rxyz0(2, iat)*rlc2i)
1834 l3 = int(rxyz0(3, iat)*rlc3i)
1836 ii = icell(0, l1, l2, l3)
1838 icell(0, l1, l2, l3) = ii
1839 IF (ii .GT. ncx)
THEN
1840 WRITE (10, *) count,
'NCX too small', ncx
1845 icell(ii, l1, l2, l3) = iat
1855 rxyz0(1, iat) =
modulo(
modulo(rxyz0(1, iat), alat(1)), alat(1))
1856 rxyz0(2, iat) =
modulo(
modulo(rxyz0(2, iat), alat(2)), alat(2))
1857 rxyz0(3, iat) =
modulo(
modulo(rxyz0(3, iat), alat(3)), alat(3))
1865 ALLOCATE (icell(0:ncx, -1:ll1, -1:ll2, -1:ll3))
1866 icell(0, -1:ll1, -1:ll2, -1:ll3) = 0
1867 rlc1i = int(ll1/alat(1))
1868 rlc2i = int(ll2/alat(2))
1869 rlc3i = int(ll3/alat(3))
1871 loop_iat_p:
DO iat = 1, nat
1872 l1 = int(rxyz0(1, iat)*rlc1i)
1873 l2 = int(rxyz0(2, iat)*rlc2i)
1874 l3 = int(rxyz0(3, iat)*rlc3i)
1875 ii = icell(0, l1, l2, l3)
1877 icell(0, l1, l2, l3) = ii
1878 IF (ii .GT. ncx)
THEN
1879 WRITE (10, *) count,
'NCX too small', ncx
1884 icell(ii, l1, l2, l3) = iat
1892 laymx = ncx*(2*ll1*ll2 + 2*ll1*ll3 + 2*ll2*ll3 + 4*ll1 + 4*ll2 + 4*ll3 + 8)
1894 ALLOCATE (rxyz(3, nn), lay(nn))
1897 rxyz(1, iat) = rxyz0(1, iat)
1898 rxyz(2, iat) = rxyz0(2, iat)
1899 rxyz(3, iat) = rxyz0(3, iat)
1906 in = icell(0, l1, l2, 0)
1907 icell(0, l1, l2, ll3) = in
1909 i = icell(ii, l1, l2, 0)
1911 IF (il .GT. nn) cpabort(
"enlarge laymx")
1913 icell(ii, l1, l2, ll3) = il
1914 rxyz(1, il) = rxyz(1, i)
1915 rxyz(2, il) = rxyz(2, i)
1916 rxyz(3, il) = rxyz(3, i) + alat(3)
1919 in = icell(0, l1, l2, ll3 - 1)
1920 icell(0, l1, l2, -1) = in
1922 i = icell(ii, l1, l2, ll3 - 1)
1924 IF (il .GT. nn) cpabort(
"enlarge laymx")
1926 icell(ii, l1, l2, -1) = il
1927 rxyz(1, il) = rxyz(1, i)
1928 rxyz(2, il) = rxyz(2, i)
1929 rxyz(3, il) = rxyz(3, i) - alat(3)
1939 in = icell(0, 0, l2, l3)
1940 icell(0, ll1, l2, l3) = in
1942 i = icell(ii, 0, l2, l3)
1944 IF (il .GT. nn) cpabort(
"enlarge laymx")
1946 icell(ii, ll1, l2, l3) = il
1947 rxyz(1, il) = rxyz(1, i) + alat(1)
1948 rxyz(2, il) = rxyz(2, i)
1949 rxyz(3, il) = rxyz(3, i)
1952 in = icell(0, ll1 - 1, l2, l3)
1953 icell(0, -1, l2, l3) = in
1955 i = icell(ii, ll1 - 1, l2, l3)
1957 IF (il .GT. nn) cpabort(
"enlarge laymx")
1959 icell(ii, -1, l2, l3) = il
1960 rxyz(1, il) = rxyz(1, i) - alat(1)
1961 rxyz(2, il) = rxyz(2, i)
1962 rxyz(3, il) = rxyz(3, i)
1972 in = icell(0, l1, 0, l3)
1973 icell(0, l1, ll2, l3) = in
1975 i = icell(ii, l1, 0, l3)
1977 IF (il .GT. nn) cpabort(
"enlarge laymx")
1979 icell(ii, l1, ll2, l3) = il
1980 rxyz(1, il) = rxyz(1, i)
1981 rxyz(2, il) = rxyz(2, i) + alat(2)
1982 rxyz(3, il) = rxyz(3, i)
1985 in = icell(0, l1, ll2 - 1, l3)
1986 icell(0, l1, -1, l3) = in
1988 i = icell(ii, l1, ll2 - 1, l3)
1990 IF (il .GT. nn) cpabort(
"enlarge laymx")
1992 icell(ii, l1, -1, l3) = il
1993 rxyz(1, il) = rxyz(1, i)
1994 rxyz(2, il) = rxyz(2, i) - alat(2)
1995 rxyz(3, il) = rxyz(3, i)
2004 in = icell(0, l1, 0, 0)
2005 icell(0, l1, ll2, ll3) = in
2007 i = icell(ii, l1, 0, 0)
2009 IF (il .GT. nn) cpabort(
"enlarge laymx")
2011 icell(ii, l1, ll2, ll3) = il
2012 rxyz(1, il) = rxyz(1, i)
2013 rxyz(2, il) = rxyz(2, i) + alat(2)
2014 rxyz(3, il) = rxyz(3, i) + alat(3)
2017 in = icell(0, l1, 0, ll3 - 1)
2018 icell(0, l1, ll2, -1) = in
2020 i = icell(ii, l1, 0, ll3 - 1)
2022 IF (il .GT. nn) cpabort(
"enlarge laymx")
2024 icell(ii, l1, ll2, -1) = il
2025 rxyz(1, il) = rxyz(1, i)
2026 rxyz(2, il) = rxyz(2, i) + alat(2)
2027 rxyz(3, il) = rxyz(3, i) - alat(3)
2030 in = icell(0, l1, ll2 - 1, 0)
2031 icell(0, l1, -1, ll3) = in
2033 i = icell(ii, l1, ll2 - 1, 0)
2035 IF (il .GT. nn) cpabort(
"enlarge laymx")
2037 icell(ii, l1, -1, ll3) = il
2038 rxyz(1, il) = rxyz(1, i)
2039 rxyz(2, il) = rxyz(2, i) - alat(2)
2040 rxyz(3, il) = rxyz(3, i) + alat(3)
2043 in = icell(0, l1, ll2 - 1, ll3 - 1)
2044 icell(0, l1, -1, -1) = in
2046 i = icell(ii, l1, ll2 - 1, ll3 - 1)
2048 IF (il .GT. nn) cpabort(
"enlarge laymx")
2050 icell(ii, l1, -1, -1) = il
2051 rxyz(1, il) = rxyz(1, i)
2052 rxyz(2, il) = rxyz(2, i) - alat(2)
2053 rxyz(3, il) = rxyz(3, i) - alat(3)
2061 in = icell(0, 0, l2, 0)
2062 icell(0, ll1, l2, ll3) = in
2064 i = icell(ii, 0, l2, 0)
2066 IF (il .GT. nn) cpabort(
"enlarge laymx")
2068 icell(ii, ll1, l2, ll3) = il
2069 rxyz(1, il) = rxyz(1, i) + alat(1)
2070 rxyz(2, il) = rxyz(2, i)
2071 rxyz(3, il) = rxyz(3, i) + alat(3)
2074 in = icell(0, 0, l2, ll3 - 1)
2075 icell(0, ll1, l2, -1) = in
2077 i = icell(ii, 0, l2, ll3 - 1)
2079 IF (il .GT. nn) cpabort(
"enlarge laymx")
2081 icell(ii, ll1, l2, -1) = il
2082 rxyz(1, il) = rxyz(1, i) + alat(1)
2083 rxyz(2, il) = rxyz(2, i)
2084 rxyz(3, il) = rxyz(3, i) - alat(3)
2087 in = icell(0, ll1 - 1, l2, 0)
2088 icell(0, -1, l2, ll3) = in
2090 i = icell(ii, ll1 - 1, l2, 0)
2092 IF (il .GT. nn) cpabort(
"enlarge laymx")
2094 icell(ii, -1, l2, ll3) = il
2095 rxyz(1, il) = rxyz(1, i) - alat(1)
2096 rxyz(2, il) = rxyz(2, i)
2097 rxyz(3, il) = rxyz(3, i) + alat(3)
2100 in = icell(0, ll1 - 1, l2, ll3 - 1)
2101 icell(0, -1, l2, -1) = in
2103 i = icell(ii, ll1 - 1, l2, ll3 - 1)
2105 IF (il .GT. nn) cpabort(
"enlarge laymx")
2107 icell(ii, -1, l2, -1) = il
2108 rxyz(1, il) = rxyz(1, i) - alat(1)
2109 rxyz(2, il) = rxyz(2, i)
2110 rxyz(3, il) = rxyz(3, i) - alat(3)
2118 in = icell(0, 0, 0, l3)
2119 icell(0, ll1, ll2, l3) = in
2121 i = icell(ii, 0, 0, l3)
2123 IF (il .GT. nn) cpabort(
"enlarge laymx")
2125 icell(ii, ll1, ll2, l3) = il
2126 rxyz(1, il) = rxyz(1, i) + alat(1)
2127 rxyz(2, il) = rxyz(2, i) + alat(2)
2128 rxyz(3, il) = rxyz(3, i)
2131 in = icell(0, ll1 - 1, 0, l3)
2132 icell(0, -1, ll2, l3) = in
2134 i = icell(ii, ll1 - 1, 0, l3)
2136 IF (il .GT. nn) cpabort(
"enlarge laymx")
2138 icell(ii, -1, ll2, l3) = il
2139 rxyz(1, il) = rxyz(1, i) - alat(1)
2140 rxyz(2, il) = rxyz(2, i) + alat(2)
2141 rxyz(3, il) = rxyz(3, i)
2144 in = icell(0, 0, ll2 - 1, l3)
2145 icell(0, ll1, -1, l3) = in
2147 i = icell(ii, 0, ll2 - 1, l3)
2149 IF (il .GT. nn) cpabort(
"enlarge laymx")
2151 icell(ii, ll1, -1, l3) = il
2152 rxyz(1, il) = rxyz(1, i) + alat(1)
2153 rxyz(2, il) = rxyz(2, i) - alat(2)
2154 rxyz(3, il) = rxyz(3, i)
2157 in = icell(0, ll1 - 1, ll2 - 1, l3)
2158 icell(0, -1, -1, l3) = in
2160 i = icell(ii, ll1 - 1, ll2 - 1, l3)
2162 IF (il .GT. nn) cpabort(
"enlarge laymx")
2164 icell(ii, -1, -1, l3) = il
2165 rxyz(1, il) = rxyz(1, i) - alat(1)
2166 rxyz(2, il) = rxyz(2, i) - alat(2)
2167 rxyz(3, il) = rxyz(3, i)
2173 in = icell(0, 0, 0, 0)
2174 icell(0, ll1, ll2, ll3) = in
2176 i = icell(ii, 0, 0, 0)
2178 IF (il .GT. nn) cpabort(
"enlarge laymx")
2180 icell(ii, ll1, ll2, ll3) = il
2181 rxyz(1, il) = rxyz(1, i) + alat(1)
2182 rxyz(2, il) = rxyz(2, i) + alat(2)
2183 rxyz(3, il) = rxyz(3, i) + alat(3)
2186 in = icell(0, ll1 - 1, 0, 0)
2187 icell(0, -1, ll2, ll3) = in
2189 i = icell(ii, ll1 - 1, 0, 0)
2191 IF (il .GT. nn) cpabort(
"enlarge laymx")
2193 icell(ii, -1, ll2, ll3) = il
2194 rxyz(1, il) = rxyz(1, i) - alat(1)
2195 rxyz(2, il) = rxyz(2, i) + alat(2)
2196 rxyz(3, il) = rxyz(3, i) + alat(3)
2199 in = icell(0, 0, ll2 - 1, 0)
2200 icell(0, ll1, -1, ll3) = in
2202 i = icell(ii, 0, ll2 - 1, 0)
2204 IF (il .GT. nn) cpabort(
"enlarge laymx")
2206 icell(ii, ll1, -1, ll3) = il
2207 rxyz(1, il) = rxyz(1, i) + alat(1)
2208 rxyz(2, il) = rxyz(2, i) - alat(2)
2209 rxyz(3, il) = rxyz(3, i) + alat(3)
2212 in = icell(0, ll1 - 1, ll2 - 1, 0)
2213 icell(0, -1, -1, ll3) = in
2215 i = icell(ii, ll1 - 1, ll2 - 1, 0)
2217 IF (il .GT. nn) cpabort(
"enlarge laymx")
2219 icell(ii, -1, -1, ll3) = il
2220 rxyz(1, il) = rxyz(1, i) - alat(1)
2221 rxyz(2, il) = rxyz(2, i) - alat(2)
2222 rxyz(3, il) = rxyz(3, i) + alat(3)
2225 in = icell(0, 0, 0, ll3 - 1)
2226 icell(0, ll1, ll2, -1) = in
2228 i = icell(ii, 0, 0, ll3 - 1)
2230 IF (il .GT. nn) cpabort(
"enlarge laymx")
2232 icell(ii, ll1, ll2, -1) = il
2233 rxyz(1, il) = rxyz(1, i) + alat(1)
2234 rxyz(2, il) = rxyz(2, i) + alat(2)
2235 rxyz(3, il) = rxyz(3, i) - alat(3)
2238 in = icell(0, ll1 - 1, 0, ll3 - 1)
2239 icell(0, -1, ll2, -1) = in
2241 i = icell(ii, ll1 - 1, 0, ll3 - 1)
2243 IF (il .GT. nn) cpabort(
"enlarge laymx")
2245 icell(ii, -1, ll2, -1) = il
2246 rxyz(1, il) = rxyz(1, i) - alat(1)
2247 rxyz(2, il) = rxyz(2, i) + alat(2)
2248 rxyz(3, il) = rxyz(3, i) - alat(3)
2251 in = icell(0, 0, ll2 - 1, ll3 - 1)
2252 icell(0, ll1, -1, -1) = in
2254 i = icell(ii, 0, ll2 - 1, ll3 - 1)
2256 IF (il .GT. nn) cpabort(
"enlarge laymx")
2258 icell(ii, ll1, -1, -1) = il
2259 rxyz(1, il) = rxyz(1, i) + alat(1)
2260 rxyz(2, il) = rxyz(2, i) - alat(2)
2261 rxyz(3, il) = rxyz(3, i) - alat(3)
2264 in = icell(0, ll1 - 1, ll2 - 1, ll3 - 1)
2265 icell(0, -1, -1, -1) = in
2267 i = icell(ii, ll1 - 1, ll2 - 1, ll3 - 1)
2269 IF (il .GT. nn) cpabort(
"enlarge laymx")
2271 icell(ii, -1, -1, -1) = il
2272 rxyz(1, il) = rxyz(1, i) - alat(1)
2273 rxyz(2, il) = rxyz(2, i) - alat(2)
2274 rxyz(3, il) = rxyz(3, i) - alat(3)
2277 ALLOCATE (lsta(2, nat))
2280 ALLOCATE (lstb(nnbrx*nat), rel(5, nnbrx*nat))
2296 myspace = (nat*nnbrx)/npr
2297 IF (iam .EQ. 0) myspaceout = myspace
2300 loop_l3:
DO l3 = 0, ll3 - 1
2301 loop_l2:
DO l2 = 0, ll2 - 1
2302 loop_l1:
DO l1 = 0, ll1 - 1
2303 loop_ii:
DO ii = 1, icell(0, l1, l2, l3)
2304 iat = icell(ii, l1, l2, l3)
2305 IF (((iat - 1)*npr)/nat .EQ. iam)
THEN
2307 lsta(1, iat) = iam*myspace + indlst + 1
2308 CALL sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
2309 rxyz, icell, lstb(iam*myspace + 1), lay, &
2310 rel(1, iam*myspace + 1), cut2, indlst)
2311 lsta(2, iat) = iam*myspace + indlst
2322 indlstx = max(indlstx, indlst)
2326 IF (indlstx .GE. myspaceout)
THEN
2327 WRITE (10, *) count,
'NNBRX too small', nnbrx
2328 DEALLOCATE (lstb, rel)
2346 npjx = 300; npjkx = 6000
2348 IF (npr .NE. 1)
THEN
2353 ALLOCATE (txyz(3, nat), f2ij(3, npjx), f3ij(3, npjkx), f3ik(3, npjkx))
2355 IF (iam .EQ. 0)
THEN
2363 fxyz(1, iat) = 0.e0_dp
2364 fxyz(2, iat) = 0.e0_dp
2365 fxyz(3, iat) = 0.e0_dp
2370 lot = int(real(nat, kind=
dp)/real(npr, kind=
dp) + .999999999999e0_dp)
2372 iat2 = min((iam + 1)*lot, nat)
2374 CALL subfeniat_l(iat1, iat2, nat, lsta, lstb, rel, tener, tener2, &
2375 tcoord, tcoord2, nnbrx, txyz, f2ij, npjx, f3ij, npjkx, f3ik, istop)
2378 ener2 = ener2 + tener2
2379 coord = coord + tcoord
2380 coord2 = coord2 + tcoord2
2381 istopg = istopg + istop
2383 fxyz(1, iat) = fxyz(1, iat) + txyz(1, iat)
2384 fxyz(2, iat) = fxyz(2, iat) + txyz(2, iat)
2385 fxyz(3, iat) = fxyz(3, iat) + txyz(3, iat)
2387 DEALLOCATE (txyz, f2ij, f3ij, f3ik)
2394 ALLOCATE (f2ij(3, npjx), f3ij(3, npjkx), f3ik(3, npjkx))
2395 CALL subfeniat_l(iat1, iat2, nat, lsta, lstb, rel, ener, ener2, &
2396 coord, coord2, nnbrx, fxyz, f2ij, npjx, f3ij, npjkx, f3ik, istopg)
2397 DEALLOCATE (f2ij, f3ij, f3ik)
2404 IF (istopg .GT. 0) cpabort(
"DIMENSION ERROR (see WARNING above)")
2405 ener_var = ener2/nat - (ener/nat)**2
2407 coord_var = coord2/nat - coord**2
2409 DEALLOCATE (rxyz, icell, lay, lsta, lstb, rel)
2411 END SUBROUTINE eip_lenosky_silicon
2434 SUBROUTINE subfeniat_l(iat1, iat2, nat, lsta, lstb, rel, tener, tener2, &
2435 tcoord, tcoord2, nnbrx, txyz, f2ij, npjx, f3ij, npjkx, f3ik, istop)
2441 INTEGER :: iat1, iat2, nat, lsta, lstb
2442 REAL(kind=
dp) :: rel, tener, tener2, tcoord, tcoord2
2444 REAL(kind=
dp) :: txyz, f2ij
2446 REAL(kind=
dp) :: f3ij
2448 REAL(kind=
dp) :: f3ik
2451 dimension lsta(2, nat), lstb(nnbrx*nat), rel(5, nnbrx*nat), txyz(3, nat)
2452 dimension f2ij(3, npjx), f3ij(3, npjkx), f3ik(3, npjkx)
2453 REAL(kind=
dp),
PARAMETER :: tmin_phi = 0.1500000e+01_dp
2454 REAL(kind=
dp),
PARAMETER :: tmax_phi = 0.4500000e+01_dp
2455 REAL(kind=
dp),
PARAMETER :: hi_phi = 3.00000000000e0_dp
2456 REAL(kind=
dp),
PARAMETER :: hsixth_phi = 5.55555555555556e-002_dp
2457 REAL(kind=
dp),
PARAMETER :: h2sixth_phi = 1.85185185185185e-002_dp
2458 REAL(kind=
dp),
PARAMETER,
DIMENSION(0:9) :: cof_phi = &
2459 (/0.69299400000000e+01_dp, -0.43995000000000e+00_dp, &
2460 -0.17012300000000e+01_dp, -0.16247300000000e+01_dp, &
2461 -0.99696000000000e+00_dp, -0.27391000000000e+00_dp, &
2462 -0.24990000000000e-01_dp, -0.17840000000000e-01_dp, &
2463 -0.96100000000000e-02_dp, 0.00000000000000e+00_dp/)
2464 REAL(kind=
dp),
PARAMETER,
DIMENSION(0:9) :: dof_phi = &
2465 (/0.16533229480429e+03_dp, 0.39415410391417e+02_dp, &
2466 0.68710036300407e+01_dp, 0.53406950884203e+01_dp, &
2467 0.15347960162782e+01_dp, -0.63347591535331e+01_dp, &
2468 -0.17987794021458e+01_dp, 0.47429676211617e+00_dp, &
2469 -0.40087646318907e-01_dp, -0.23942617684055e+00_dp/)
2470 REAL(kind=
dp),
PARAMETER :: tmin_rho = 0.1500000e+01_dp
2471 REAL(kind=
dp),
PARAMETER :: tmax_rho = 0.3500000e+01_dp
2472 REAL(kind=
dp),
PARAMETER :: hi_rho = 5.00000000000e0_dp
2473 REAL(kind=
dp),
PARAMETER :: hsixth_rho = 3.33333333333333e-002_dp
2474 REAL(kind=
dp),
PARAMETER :: h2sixth_rho = 6.66666666666667e-003_dp
2475 REAL(kind=
dp),
PARAMETER,
DIMENSION(0:10) :: cof_rho = &
2476 (/0.13747000000000e+00_dp, -0.14831000000000e+00_dp, &
2477 -0.55972000000000e+00_dp, -0.73110000000000e+00_dp, &
2478 -0.76283000000000e+00_dp, -0.72918000000000e+00_dp, &
2479 -0.66620000000000e+00_dp, -0.57328000000000e+00_dp, &
2480 -0.40690000000000e+00_dp, -0.16662000000000e+00_dp, &
2481 0.00000000000000e+00_dp/)
2482 REAL(kind=
dp),
PARAMETER,
DIMENSION(0:10) :: dof_rho = &
2483 (/-0.32275496741918e+01_dp, -0.64119006516165e+01_dp, &
2484 0.10030652280658e+02_dp, 0.22937915289857e+01_dp, &
2485 0.17416816033995e+01_dp, 0.54648205741626e+00_dp, &
2486 0.47189016693543e+00_dp, 0.20569572748420e+01_dp, &
2487 0.23192807336964e+01_dp, -0.24908020962757e+00_dp, &
2488 -0.12371959895186e+02_dp/)
2489 REAL(kind=
dp),
PARAMETER :: tmin_fff = 0.1500000e+01_dp
2490 REAL(kind=
dp),
PARAMETER :: tmax_fff = 0.3500000e+01_dp
2491 REAL(kind=
dp),
PARAMETER :: hi_fff = 4.50000000000e0_dp
2492 REAL(kind=
dp),
PARAMETER :: hsixth_fff = 3.70370370370370e-002_dp
2493 REAL(kind=
dp),
PARAMETER :: h2sixth_fff = 8.23045267489712e-003_dp
2494 REAL(kind=
dp),
PARAMETER,
DIMENSION(0:9) :: cof_fff = &
2495 (/0.12503100000000e+01_dp, 0.86821000000000e+00_dp, &
2496 0.60846000000000e+00_dp, 0.48756000000000e+00_dp, &
2497 0.44163000000000e+00_dp, 0.37610000000000e+00_dp, &
2498 0.27145000000000e+00_dp, 0.14814000000000e+00_dp, &
2499 0.48550000000000e-01_dp, 0.00000000000000e+00_dp/)
2500 REAL(kind=
dp),
PARAMETER,
DIMENSION(0:9) :: dof_fff = &
2501 (/0.27904652711432e+02_dp, -0.45230754228635e+01_dp, &
2502 0.50531739800222e+01_dp, 0.11806545027747e+01_dp, &
2503 -0.66693699112098e+00_dp, -0.89430653829079e+00_dp, &
2504 -0.50891685571587e+00_dp, 0.66278396115427e+00_dp, &
2505 0.73976101109878e+00_dp, 0.25795319944506e+01_dp/)
2506 REAL(kind=
dp),
PARAMETER :: tmin_uuu = -0.1770930e+01_dp
2507 REAL(kind=
dp),
PARAMETER :: tmax_uuu = 0.7908520e+01_dp
2508 REAL(kind=
dp),
PARAMETER :: hi_uuu = 0.723181585730594e0_dp
2509 REAL(kind=
dp),
PARAMETER :: hsixth_uuu = 0.230463095238095e0_dp
2510 REAL(kind=
dp),
PARAMETER :: h2sixth_uuu = 0.318679429600340e0_dp
2511 REAL(kind=
dp),
PARAMETER,
DIMENSION(0:7) :: cof_uuu = &
2512 (/-0.10749300000000e+01_dp, -0.20045000000000e+00_dp, &
2513 0.41422000000000e+00_dp, 0.87939000000000e+00_dp, &
2514 0.12668900000000e+01_dp, 0.16299800000000e+01_dp, &
2515 0.19773800000000e+01_dp, 0.23961800000000e+01_dp/)
2516 REAL(kind=
dp),
PARAMETER,
DIMENSION(0:7) :: dof_uuu = &
2517 (/-0.14827125747284e+00_dp, -0.14922155328475e+00_dp, &
2518 -0.70113224223509e-01_dp, -0.39449020349230e-01_dp, &
2519 -0.15815242579643e-01_dp, 0.26112640061855e-01_dp, &
2520 -0.13786974745095e+00_dp, 0.74941595372657e+00_dp/)
2521 REAL(kind=
dp),
PARAMETER :: tmin_ggg = -0.1000000e+01_dp
2522 REAL(kind=
dp),
PARAMETER :: tmax_ggg = 0.8001400e+00_dp
2523 REAL(kind=
dp),
PARAMETER :: hi_ggg = 3.88858644327663e0_dp
2524 REAL(kind=
dp),
PARAMETER :: hsixth_ggg = 4.28604761904762e-002_dp
2525 REAL(kind=
dp),
PARAMETER :: h2sixth_ggg = 1.10221225156463e-002_dp
2526 REAL(kind=
dp),
PARAMETER,
DIMENSION(0:7) :: cof_ggg = &
2527 (/0.52541600000000e+01_dp, 0.23591500000000e+01_dp, &
2528 0.11959500000000e+01_dp, 0.12299500000000e+01_dp, &
2529 0.20356500000000e+01_dp, 0.34247400000000e+01_dp, &
2530 0.49485900000000e+01_dp, 0.56179900000000e+01_dp/)
2531 REAL(kind=
dp),
PARAMETER,
DIMENSION(0:7) :: dof_ggg = &
2532 (/0.15826876132396e+02_dp, 0.31176239377907e+02_dp, &
2533 0.16589446539683e+02_dp, 0.11083892500520e+02_dp, &
2534 0.90887216383860e+01_dp, 0.54902279653967e+01_dp, &
2535 -0.18823313223755e+02_dp, -0.77183416481005e+01_dp/)
2537 REAL(kind=
dp) :: a2_fff, a2_ggg, a_fff, a_ggg, b2_fff, b2_ggg, b_fff, &
2538 b_ggg, cof1_fff, cof1_ggg, cof2_fff, cof2_ggg, cof3_fff, &
2539 cof3_ggg, cof4_fff, cof4_ggg, cof_fff_khi, cof_fff_klo, &
2540 cof_ggg_khi, cof_ggg_klo, coord_iat, costheta, dens, &
2541 dens2, dens3, dof_fff_khi, dof_fff_klo, dof_ggg_khi, &
2542 dof_ggg_klo, e_phi, e_uuu, ener_iat, ep_phi, ep_uuu, &
2543 fij, fijp, fik, fikp, fxij, fxik, fyij, fyik, fzij, fzik, &
2544 gjik, gjikp, rho, rhop, rij, rik, sij, sik, t1, t2, t3, t4, &
2545 tt, tt_fff, tt_ggg, xarg, ypt1_fff, ypt1_ggg, ypt2_fff, &
2546 ypt2_ggg, yt1_fff, yt1_ggg, yt2_fff, yt2_ggg
2548 INTEGER :: iat, jat, jbr, jcnt, jkcnt, kat, kbr, khi_fff, khi_ggg, &
2559 txyz(1, iat) = 0.e0_dp
2560 txyz(2, iat) = 0.e0_dp
2561 txyz(3, iat) = 0.e0_dp
2566 forces_and_energy:
DO iat = iat1, iat2
2574 calculate:
DO jbr = lsta(1, iat), lsta(2, iat)
2577 IF (jcnt .GT. npjx)
THEN
2578 WRITE (*, *)
'WARNING: enlarge npjx'
2591 IF (rij .LE. 2.36e0_dp)
THEN
2592 coord_iat = coord_iat + 1.e0_dp
2593 ELSE IF (rij .GE. 3.12e0_dp)
THEN
2595 xarg = (rij - 2.36e0_dp)*(1.e0_dp/(3.12e0_dp - 2.36e0_dp))
2596 coord_iat = coord_iat + (2*xarg + 1.e0_dp)*(xarg - 1.e0_dp)**2
2600 CALL splint(cof_phi, dof_phi, tmin_phi, tmax_phi, &
2601 hsixth_phi, h2sixth_phi, hi_phi, 10, rij, e_phi, ep_phi)
2602 ener_iat = ener_iat + (e_phi*.5e0_dp)
2603 txyz(1, iat) = txyz(1, iat) - fxij*(ep_phi*.5e0_dp)
2604 txyz(2, iat) = txyz(2, iat) - fyij*(ep_phi*.5e0_dp)
2605 txyz(3, iat) = txyz(3, iat) - fzij*(ep_phi*.5e0_dp)
2606 txyz(1, jat) = txyz(1, jat) + fxij*(ep_phi*.5e0_dp)
2607 txyz(2, jat) = txyz(2, jat) + fyij*(ep_phi*.5e0_dp)
2608 txyz(3, jat) = txyz(3, jat) + fzij*(ep_phi*.5e0_dp)
2611 CALL splint(cof_rho, dof_rho, tmin_rho, tmax_rho, &
2612 hsixth_rho, h2sixth_rho, hi_rho, 11, rij, rho, rhop)
2614 f2ij(1, jcnt) = fxij*rhop
2615 f2ij(2, jcnt) = fyij*rhop
2616 f2ij(3, jcnt) = fzij*rhop
2619 CALL splint(cof_fff, dof_fff, tmin_fff, tmax_fff, &
2620 hsixth_fff, h2sixth_fff, hi_fff, 10, rij, fij, fijp)
2622 embed_3body:
DO kbr = lsta(1, iat), lsta(2, iat)
2624 IF (kat .LT. jat)
THEN
2626 IF (jkcnt .GT. npjkx)
THEN
2627 WRITE (*, *)
'WARNING: enlarge npjkx', npjkx
2648 IF (rik .GT. tmax_fff)
THEN
2649 fikp = 0.e0_dp; fik = 0.e0_dp
2650 gjik = 0.e0_dp; gjikp = 0.e0_dp; sik = 0.e0_dp
2651 costheta = 0.e0_dp; fxik = 0.e0_dp; fyik = 0.e0_dp; fzik = 0.e0_dp
2652 ELSE IF (rik .LT. tmin_fff)
THEN
2656 costheta = fxij*fxik + fyij*fyik + fzij*fzik
2658 fikp = hi_fff*(cof_fff(1) - cof_fff(0)) - &
2659 (dof_fff(1) + 2.e0_dp*dof_fff(0))*hsixth_fff
2660 fik = cof_fff(0) + (rik - tmin_fff)*fikp
2661 tt_ggg = (costheta - tmin_ggg)*hi_ggg
2662 IF (costheta .GT. tmax_ggg)
THEN
2663 gjikp = hi_ggg*(cof_ggg(8 - 1) - cof_ggg(8 - 2)) + &
2664 (2.e0_dp*dof_ggg(8 - 1) + dof_ggg(8 - 2))*hsixth_ggg
2665 gjik = cof_ggg(8 - 1) + (costheta - tmax_ggg)*gjikp
2667 klo_ggg = int(tt_ggg)
2668 khi_ggg = klo_ggg + 1
2669 cof_ggg_klo = cof_ggg(klo_ggg)
2670 dof_ggg_klo = dof_ggg(klo_ggg)
2671 b_ggg = tt_ggg - klo_ggg
2672 a_ggg = 1.e0_dp - b_ggg
2673 cof_ggg_khi = cof_ggg(khi_ggg)
2674 dof_ggg_khi = dof_ggg(khi_ggg)
2675 b2_ggg = b_ggg*b_ggg
2676 gjik = a_ggg*cof_ggg_klo
2677 gjikp = cof_ggg_khi - cof_ggg_klo
2678 a2_ggg = a_ggg*a_ggg
2679 cof1_ggg = a2_ggg - 1.e0_dp
2680 cof2_ggg = b2_ggg - 1.e0_dp
2681 gjik = gjik + b_ggg*cof_ggg_khi
2682 gjikp = hi_ggg*gjikp
2683 cof3_ggg = 3.e0_dp*b2_ggg
2684 cof4_ggg = 3.e0_dp*a2_ggg
2685 cof1_ggg = a_ggg*cof1_ggg
2686 cof2_ggg = b_ggg*cof2_ggg
2687 cof3_ggg = cof3_ggg - 1.e0_dp
2688 cof4_ggg = cof4_ggg - 1.e0_dp
2689 yt1_ggg = cof1_ggg*dof_ggg_klo
2690 yt2_ggg = cof2_ggg*dof_ggg_khi
2691 ypt1_ggg = cof3_ggg*dof_ggg_khi
2692 ypt2_ggg = cof4_ggg*dof_ggg_klo
2693 gjik = gjik + (yt1_ggg + yt2_ggg)*h2sixth_ggg
2694 gjikp = gjikp + (ypt1_ggg - ypt2_ggg)*hsixth_ggg
2698 tt_fff = rik - tmin_fff
2699 costheta = fxij*fxik
2701 tt_fff = tt_fff*hi_fff
2702 costheta = costheta + fyij*fyik
2704 klo_fff = int(tt_fff)
2705 costheta = costheta + fzij*fzik
2707 tt_ggg = (costheta - tmin_ggg)*hi_ggg
2708 IF (costheta .GT. tmax_ggg)
THEN
2709 gjikp = hi_ggg*(cof_ggg(8 - 1) - cof_ggg(8 - 2)) + &
2710 (2.e0_dp*dof_ggg(8 - 1) + dof_ggg(8 - 2))*hsixth_ggg
2711 gjik = cof_ggg(8 - 1) + (costheta - tmax_ggg)*gjikp
2712 khi_fff = klo_fff + 1
2713 cof_fff_klo = cof_fff(klo_fff)
2714 dof_fff_klo = dof_fff(klo_fff)
2715 b_fff = tt_fff - klo_fff
2716 a_fff = 1.e0_dp - b_fff
2717 cof_fff_khi = cof_fff(khi_fff)
2718 dof_fff_khi = dof_fff(khi_fff)
2719 b2_fff = b_fff*b_fff
2720 fik = a_fff*cof_fff_klo
2721 fikp = cof_fff_khi - cof_fff_klo
2722 a2_fff = a_fff*a_fff
2723 cof1_fff = a2_fff - 1.e0_dp
2724 cof2_fff = b2_fff - 1.e0_dp
2725 fik = fik + b_fff*cof_fff_khi
2727 cof3_fff = 3.e0_dp*b2_fff
2728 cof4_fff = 3.e0_dp*a2_fff
2729 cof1_fff = a_fff*cof1_fff
2730 cof2_fff = b_fff*cof2_fff
2731 cof3_fff = cof3_fff - 1.e0_dp
2732 cof4_fff = cof4_fff - 1.e0_dp
2733 yt1_fff = cof1_fff*dof_fff_klo
2734 yt2_fff = cof2_fff*dof_fff_khi
2735 ypt1_fff = cof3_fff*dof_fff_khi
2736 ypt2_fff = cof4_fff*dof_fff_klo
2737 fik = fik + (yt1_fff + yt2_fff)*h2sixth_fff
2738 fikp = fikp + (ypt1_fff - ypt2_fff)*hsixth_fff
2740 klo_ggg = int(tt_ggg)
2741 khi_ggg = klo_ggg + 1
2742 khi_fff = klo_fff + 1
2743 cof_ggg_klo = cof_ggg(klo_ggg)
2744 cof_fff_klo = cof_fff(klo_fff)
2745 dof_ggg_klo = dof_ggg(klo_ggg)
2746 dof_fff_klo = dof_fff(klo_fff)
2747 b_ggg = tt_ggg - klo_ggg
2748 b_fff = tt_fff - klo_fff
2749 a_ggg = 1.e0_dp - b_ggg
2750 a_fff = 1.e0_dp - b_fff
2751 cof_ggg_khi = cof_ggg(khi_ggg)
2752 cof_fff_khi = cof_fff(khi_fff)
2753 dof_ggg_khi = dof_ggg(khi_ggg)
2754 dof_fff_khi = dof_fff(khi_fff)
2755 b2_ggg = b_ggg*b_ggg
2756 b2_fff = b_fff*b_fff
2757 gjik = a_ggg*cof_ggg_klo
2758 fik = a_fff*cof_fff_klo
2759 gjikp = cof_ggg_khi - cof_ggg_klo
2760 fikp = cof_fff_khi - cof_fff_klo
2761 a2_ggg = a_ggg*a_ggg
2762 a2_fff = a_fff*a_fff
2763 cof1_ggg = a2_ggg - 1.e0_dp
2764 cof1_fff = a2_fff - 1.e0_dp
2765 cof2_ggg = b2_ggg - 1.e0_dp
2766 cof2_fff = b2_fff - 1.e0_dp
2767 gjik = gjik + b_ggg*cof_ggg_khi
2768 fik = fik + b_fff*cof_fff_khi
2769 gjikp = hi_ggg*gjikp
2771 cof3_ggg = 3.e0_dp*b2_ggg
2772 cof3_fff = 3.e0_dp*b2_fff
2773 cof4_ggg = 3.e0_dp*a2_ggg
2774 cof4_fff = 3.e0_dp*a2_fff
2775 cof1_ggg = a_ggg*cof1_ggg
2776 cof1_fff = a_fff*cof1_fff
2777 cof2_ggg = b_ggg*cof2_ggg
2778 cof2_fff = b_fff*cof2_fff
2779 cof3_ggg = cof3_ggg - 1.e0_dp
2780 cof3_fff = cof3_fff - 1.e0_dp
2781 cof4_ggg = cof4_ggg - 1.e0_dp
2782 cof4_fff = cof4_fff - 1.e0_dp
2783 yt1_ggg = cof1_ggg*dof_ggg_klo
2784 yt1_fff = cof1_fff*dof_fff_klo
2785 yt2_ggg = cof2_ggg*dof_ggg_khi
2786 yt2_fff = cof2_fff*dof_fff_khi
2787 ypt1_ggg = cof3_ggg*dof_ggg_khi
2788 ypt1_fff = cof3_fff*dof_fff_khi
2789 ypt2_ggg = cof4_ggg*dof_ggg_klo
2790 ypt2_fff = cof4_fff*dof_fff_klo
2791 gjik = gjik + (yt1_ggg + yt2_ggg)*h2sixth_ggg
2792 fik = fik + (yt1_fff + yt2_fff)*h2sixth_fff
2793 gjikp = gjikp + (ypt1_ggg - ypt2_ggg)*hsixth_ggg
2794 fikp = fikp + (ypt1_fff - ypt2_fff)*hsixth_fff
2800 dens3 = dens3 + tt*gjik
2804 f3ij(1, jkcnt) = fxij*t1 + (fxik - fxij*costheta)*t2
2805 f3ij(2, jkcnt) = fyij*t1 + (fyik - fyij*costheta)*t2
2806 f3ij(3, jkcnt) = fzij*t1 + (fzik - fzij*costheta)*t2
2810 f3ik(1, jkcnt) = fxik*t3 + (fxij - fxik*costheta)*t4
2811 f3ik(2, jkcnt) = fyik*t3 + (fyij - fyik*costheta)*t4
2812 f3ik(3, jkcnt) = fzik*t3 + (fzij - fzik*costheta)*t4
2818 dens = dens2 + dens3
2819 CALL splint(cof_uuu, dof_uuu, tmin_uuu, tmax_uuu, &
2820 hsixth_uuu, h2sixth_uuu, hi_uuu, 8, dens, e_uuu, ep_uuu)
2821 ener_iat = ener_iat + e_uuu
2826 loop_again:
DO jbr = lsta(1, iat), lsta(2, iat)
2829 txyz(1, iat) = txyz(1, iat) - ep_uuu*f2ij(1, jcnt)
2830 txyz(2, iat) = txyz(2, iat) - ep_uuu*f2ij(2, jcnt)
2831 txyz(3, iat) = txyz(3, iat) - ep_uuu*f2ij(3, jcnt)
2832 txyz(1, jat) = txyz(1, jat) + ep_uuu*f2ij(1, jcnt)
2833 txyz(2, jat) = txyz(2, jat) + ep_uuu*f2ij(2, jcnt)
2834 txyz(3, jat) = txyz(3, jat) + ep_uuu*f2ij(3, jcnt)
2837 DO kbr = lsta(1, iat), lsta(2, iat)
2839 IF (kat .LT. jat)
THEN
2842 txyz(1, iat) = txyz(1, iat) - ep_uuu*(f3ij(1, jkcnt) + f3ik(1, jkcnt))
2843 txyz(2, iat) = txyz(2, iat) - ep_uuu*(f3ij(2, jkcnt) + f3ik(2, jkcnt))
2844 txyz(3, iat) = txyz(3, iat) - ep_uuu*(f3ij(3, jkcnt) + f3ik(3, jkcnt))
2845 txyz(1, jat) = txyz(1, jat) + ep_uuu*f3ij(1, jkcnt)
2846 txyz(2, jat) = txyz(2, jat) + ep_uuu*f3ij(2, jkcnt)
2847 txyz(3, jat) = txyz(3, jat) + ep_uuu*f3ij(3, jkcnt)
2848 txyz(1, kat) = txyz(1, kat) + ep_uuu*f3ik(1, jkcnt)
2849 txyz(2, kat) = txyz(2, kat) + ep_uuu*f3ik(2, jkcnt)
2850 txyz(3, kat) = txyz(3, kat) + ep_uuu*f3ik(3, jkcnt)
2858 tener = tener + ener_iat
2859 tener2 = tener2 + ener_iat**2
2860 tcoord = tcoord + coord_iat
2861 tcoord2 = tcoord2 + coord_iat**2
2863 END DO forces_and_energy
2865 END SUBROUTINE subfeniat_l
2887 SUBROUTINE sublstiat_l(iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, myspace, &
2888 rxyz, icell, lstb, lay, rel, cut2, indlst)
2891 INTEGER :: iat, nn, ncx, ll1, ll2, ll3, l1, l2, l3, &
2893 REAL(kind=
dp) :: rxyz
2894 INTEGER :: icell, lstb, lay
2895 REAL(kind=
dp) :: rel, cut2
2898 dimension rxyz(3, nn), lay(nn), icell(0:ncx, -1:ll1, -1:ll2, -1:ll3), &
2899 lstb(0:myspace - 1), rel(5, 0:myspace - 1)
2901 INTEGER :: jat, jj, k1, k2, k3
2902 REAL(kind=
dp) :: rr2, tt, xrel, yrel, zrel, tti
2904 loop_k3:
DO k3 = l3 - 1, l3 + 1
2905 loop_k2:
DO k2 = l2 - 1, l2 + 1
2906 loop_k1:
DO k1 = l1 - 1, l1 + 1
2907 loop_jj:
DO jj = 1, icell(0, k1, k2, k3)
2908 jat = icell(jj, k1, k2, k3)
2909 IF (jat .EQ. iat) cycle loop_k3
2910 xrel = rxyz(1, iat) - rxyz(1, jat)
2911 yrel = rxyz(2, iat) - rxyz(2, jat)
2912 zrel = rxyz(3, iat) - rxyz(3, jat)
2913 rr2 = xrel**2 + yrel**2 + zrel**2
2914 IF (rr2 .LE. cut2)
THEN
2915 indlst = min(indlst, myspace - 1)
2916 lstb(indlst) = lay(jat)
2920 rel(1, indlst) = xrel*tti
2921 rel(2, indlst) = yrel*tti
2922 rel(3, indlst) = zrel*tti
2924 rel(5, indlst) = tti
2933 END SUBROUTINE sublstiat_l
2949 SUBROUTINE splint(ya, y2a, tmin, tmax, hsixth, h2sixth, hi, n, x, y, yp)
2950 REAL(kind=
dp) :: ya, y2a, tmin, tmax, hsixth, h2sixth, hi
2952 REAL(kind=
dp) :: x, y, yp
2954 dimension y2a(0:n - 1), ya(0:n - 1)
2955 REAL(kind=
dp) :: a, a2, b, b2, cof1, cof2, cof3, cof4, tt, &
2956 y2a_khi, ya_klo, y2a_klo, ya_khi, ypt1, ypt2, yt1, yt2
2961 IF (x .LT. tmin)
THEN
2962 yp = hi*(ya(1) - ya(0)) - &
2963 (y2a(1) + 2.e0_dp*y2a(0))*hsixth
2964 y = ya(0) + (x - tmin)*yp
2965 ELSE IF (x .GT. tmax)
THEN
2966 yp = hi*(ya(n - 1) - ya(n - 2)) + &
2967 (2.e0_dp*y2a(n - 1) + y2a(n - 2))*hsixth
2968 y = ya(n - 1) + (x - tmax)*yp
2981 yp = ya_khi - ya_klo
2991 cof3 = cof3 - 1.e0_dp
2992 cof4 = cof4 - 1.e0_dp
2997 y = y + (yt1 + yt2)*h2sixth
2998 yp = yp + (ypt1 - ypt2)*hsixth
3001 END SUBROUTINE splint
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)
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_lenosky(eip_env)
Interface routine of Goedecker's Lenosky 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