560 LOGICAL,
INTENT(IN) :: do_zbl, shift_cutoff
562 CHARACTER(len=*),
PARAMETER :: routinen =
'get_nonbond_storage'
564 INTEGER :: handle, i, idim, iend, istart, j, k, &
565 locij, n, ndim, nk, ntype, nunique, &
566 nvar, pot_target, tmpij(2), tmpij0(2)
567 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: iwork1, iwork2, my_index
568 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: tmp_index
569 LOGICAL :: at_least_one, check
570 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: cwork, rwork, wtmp
571 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: pot_par
573 CALL timeset(routinen, handle)
575 ntype =
SIZE(atomic_kind_set)
578 potparm%pot(i, j)%pot%undef = .false.
581 ALLOCATE (tmp_index(ntype, ntype))
589 IF (
SIZE(potparm%pot(i, j)%pot%type) /= 1) cycle
590 IF (potparm%pot(i, j)%pot%type(1) == pot_target)
THEN
599 SELECT CASE (pot_target)
644 ALLOCATE (my_index(ndim))
650 IF (
SIZE(potparm%pot(i, j)%pot%type) /= 1) cycle
651 IF (potparm%pot(i, j)%pot%type(1) == pot_target)
THEN
658 ALLOCATE (pot_par(ndim, nvar))
664 IF (
SIZE(potparm%pot(i, j)%pot%type) /= 1) cycle
665 IF (potparm%pot(i, j)%pot%type(1) == pot_target)
THEN
668 SELECT CASE (pot_target)
670 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%lj%epsilon
671 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%lj%sigma6
672 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%lj%sigma12
674 pot_par(nk, 1) =
str2id(potparm%pot(i, j)%pot%set(1)%gp%potential)
675 pot_par(nk, 2) =
str2id(potparm%pot(i, j)%pot%set(1)%gp%variables)
677 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%willis%a
678 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%willis%b
679 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%willis%c
681 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%goodwin%vr0
682 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%goodwin%m
683 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%goodwin%mc
684 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%goodwin%d
685 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%goodwin%dc
687 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%eam%drar
688 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%eam%drhoar
689 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%eam%acutal
690 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%eam%npoints
692 pot_par(nk, 1) =
str2id( &
693 trim(potparm%pot(i, j)%pot%set(1)%nequip%pot_file_name))
695 pot_par(nk, 1) =
str2id( &
696 trim(potparm%pot(i, j)%pot%set(1)%ace%ace_file_name))
697 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%ace%atom_ace_type
699 pot_par(nk, 1) =
str2id( &
700 trim(potparm%pot(i, j)%pot%set(1)%deepmd%deepmd_file_name))
701 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%deepmd%atom_deepmd_type
703 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%ft%A
704 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%ft%B
705 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%ft%C
706 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%ft%D
708 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%ftd%A
709 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%ftd%B
710 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%ftd%C
711 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%ftd%D
712 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%ftd%BD(1)
713 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%ftd%BD(2)
715 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%ipbv%rcore
716 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%ipbv%m
717 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%ipbv%b
719 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%buck4r%a
720 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%buck4r%b
721 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%buck4r%c
722 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%buck4r%r1
723 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%buck4r%r2
724 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%buck4r%r3
726 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%buckmo%f0
727 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%buckmo%a1
728 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%buckmo%a2
729 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%buckmo%b1
730 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%buckmo%b2
731 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%buckmo%c
732 pot_par(nk, 7) = potparm%pot(i, j)%pot%set(1)%buckmo%d
733 pot_par(nk, 8) = potparm%pot(i, j)%pot%set(1)%buckmo%r0
734 pot_par(nk, 9) = potparm%pot(i, j)%pot%set(1)%buckmo%beta
736 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%tersoff%A
737 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%tersoff%B
738 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%tersoff%lambda1
739 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%tersoff%lambda2
740 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%tersoff%alpha
741 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%tersoff%beta
742 pot_par(nk, 7) = potparm%pot(i, j)%pot%set(1)%tersoff%n
743 pot_par(nk, 8) = potparm%pot(i, j)%pot%set(1)%tersoff%c
744 pot_par(nk, 9) = potparm%pot(i, j)%pot%set(1)%tersoff%d
745 pot_par(nk, 10) = potparm%pot(i, j)%pot%set(1)%tersoff%h
746 pot_par(nk, 11) = potparm%pot(i, j)%pot%set(1)%tersoff%lambda3
747 pot_par(nk, 12) = potparm%pot(i, j)%pot%set(1)%tersoff%bigR
748 pot_par(nk, 13) = potparm%pot(i, j)%pot%set(1)%tersoff%bigD
750 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%siepmann%B
751 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%siepmann%D
752 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%siepmann%E
753 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%siepmann%F
754 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%siepmann%beta
756 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%gal%epsilon
757 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%gal%bxy
758 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%gal%bz
759 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%gal%r1
760 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%gal%r2
761 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%gal%a1
762 pot_par(nk, 7) = potparm%pot(i, j)%pot%set(1)%gal%a2
763 pot_par(nk, 8) = potparm%pot(i, j)%pot%set(1)%gal%a3
764 pot_par(nk, 9) = potparm%pot(i, j)%pot%set(1)%gal%a4
765 pot_par(nk, 10) = potparm%pot(i, j)%pot%set(1)%gal%a
766 pot_par(nk, 11) = potparm%pot(i, j)%pot%set(1)%gal%b
767 pot_par(nk, 12) = potparm%pot(i, j)%pot%set(1)%gal%c
769 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%gal21%epsilon1
770 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%gal21%epsilon2
771 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%gal21%epsilon3
772 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%gal21%bxy1
773 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%gal21%bxy2
774 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%gal21%bz1
775 pot_par(nk, 7) = potparm%pot(i, j)%pot%set(1)%gal21%bz2
776 pot_par(nk, 8) = potparm%pot(i, j)%pot%set(1)%gal21%r1
777 pot_par(nk, 9) = potparm%pot(i, j)%pot%set(1)%gal21%r2
778 pot_par(nk, 10) = potparm%pot(i, j)%pot%set(1)%gal21%a11
779 pot_par(nk, 11) = potparm%pot(i, j)%pot%set(1)%gal21%a12
780 pot_par(nk, 12) = potparm%pot(i, j)%pot%set(1)%gal21%a13
781 pot_par(nk, 13) = potparm%pot(i, j)%pot%set(1)%gal21%a21
782 pot_par(nk, 14) = potparm%pot(i, j)%pot%set(1)%gal21%a22
783 pot_par(nk, 15) = potparm%pot(i, j)%pot%set(1)%gal21%a23
784 pot_par(nk, 16) = potparm%pot(i, j)%pot%set(1)%gal21%a31
785 pot_par(nk, 17) = potparm%pot(i, j)%pot%set(1)%gal21%a32
786 pot_par(nk, 18) = potparm%pot(i, j)%pot%set(1)%gal21%a33
787 pot_par(nk, 19) = potparm%pot(i, j)%pot%set(1)%gal21%a41
788 pot_par(nk, 20) = potparm%pot(i, j)%pot%set(1)%gal21%a42
789 pot_par(nk, 21) = potparm%pot(i, j)%pot%set(1)%gal21%a43
790 pot_par(nk, 22) = potparm%pot(i, j)%pot%set(1)%gal21%AO1
791 pot_par(nk, 23) = potparm%pot(i, j)%pot%set(1)%gal21%AO2
792 pot_par(nk, 24) = potparm%pot(i, j)%pot%set(1)%gal21%BO1
793 pot_par(nk, 25) = potparm%pot(i, j)%pot%set(1)%gal21%BO2
794 pot_par(nk, 26) = potparm%pot(i, j)%pot%set(1)%gal21%c
795 pot_par(nk, 27) = potparm%pot(i, j)%pot%set(1)%gal21%AH1
796 pot_par(nk, 28) = potparm%pot(i, j)%pot%set(1)%gal21%AH2
797 pot_par(nk, 29) = potparm%pot(i, j)%pot%set(1)%gal21%BH1
798 pot_par(nk, 30) = potparm%pot(i, j)%pot%set(1)%gal21%BH2
800 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%tab%dr
801 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%tab%rcut
802 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%tab%npoints
803 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%tab%index
810 pot_par(nk, :) = real(pot_target, kind=
dp)
816 ALLOCATE (rwork(ndim))
817 ALLOCATE (iwork1(ndim))
818 ALLOCATE (iwork2(ndim))
819 ALLOCATE (wtmp(nvar))
820 CALL sort(pot_par(:, 1), ndim, iwork1)
823 rwork(:) = pot_par(:, k)
825 pot_par(i, k) = rwork(iwork1(i))
830 my_index(i) = iwork2(iwork1(i))
834 wtmp(1:k - 1) = pot_par(1, 1:k - 1)
836 at_least_one = .false.
838 rwork(j) = pot_par(j, k)
839 IF (all(pot_par(j, 1:k - 1) == wtmp(1:k - 1))) cycle
841 wtmp(1:k - 1) = pot_par(j, 1:k - 1)
845 idim = iend - istart + 1
846 CALL sort(rwork(istart:iend), idim, iwork1(istart:iend))
847 iwork1(istart:iend) = iwork1(istart:iend) - 1 + istart
848 IF (idim /= 1) at_least_one = .true.
852 idim = iend - istart + 1
853 CALL sort(rwork(istart:iend), idim, iwork1(istart:iend))
854 iwork1(istart:iend) = iwork1(istart:iend) - 1 + istart
855 IF (idim /= 1) at_least_one = .true.
856 pot_par(:, k) = rwork
857 IF (.NOT. at_least_one)
EXIT
860 rwork(:) = pot_par(:, j)
862 pot_par(i, j) = rwork(iwork1(i))
867 my_index(i) = iwork2(iwork1(i))
877 ALLOCATE (cwork(nvar))
878 cwork(:) = pot_par(1, :)
880 CALL get_indexes(locij, ntype, tmpij0)
885 CALL get_indexes(locij, ntype, tmpij)
886 SELECT CASE (pot_target)
889 CALL compare_pot(potparm%pot(tmpij(1), tmpij(2))%pot, &
890 potparm%pot(tmpij0(1), tmpij0(2))%pot, &
894 IF (
ASSOCIATED(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%parameters) .AND. &
895 ASSOCIATED(potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%parameters))
THEN
896 IF (
SIZE(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%parameters) == &
897 SIZE(potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%parameters))
THEN
898 IF (any(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%parameters /= &
899 potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%parameters)) check = .false.
902 IF (
ASSOCIATED(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%values) .AND. &
903 ASSOCIATED(potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%values))
THEN
904 IF (
SIZE(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%values) == &
905 SIZE(potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%values))
THEN
906 IF (any(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%values /= &
907 potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%values)) check = .false.
913 IF (all(cwork == pot_par(j, :)) .AND. check) cycle
914 cwork(:) = pot_par(j, :)
915 nunique = nunique + 1
917 CALL set_potparm_index(potparm, my_index(istart:iend), pot_target, &
918 ntype, tmpij, atomic_kind_set, shift_cutoff, do_zbl)
922 CALL get_indexes(locij, ntype, tmpij)
923 tmp_index(tmpij(1), tmpij(2)) = nunique
924 tmp_index(tmpij(2), tmpij(1)) = nunique
928 CALL get_indexes(locij, ntype, tmpij0)
930 nunique = nunique + 1
932 CALL set_potparm_index(potparm, my_index(istart:iend), pot_target, &
933 ntype, tmpij, atomic_kind_set, shift_cutoff, do_zbl)
936 CALL get_indexes(locij, ntype, tmpij)
937 tmp_index(tmpij(1), tmpij(2)) = nunique
938 tmp_index(tmpij(2), tmpij(1)) = nunique
943 nunique = nunique + 1
944 CALL set_potparm_index(potparm, my_index, pot_target, ntype, tmpij, &
945 atomic_kind_set, shift_cutoff, do_zbl)
947 DEALLOCATE (my_index)
954 IF (
SIZE(potparm%pot(i, j)%pot%type) == 1) cycle
955 nunique = nunique + 1
956 tmp_index(i, j) = nunique
957 tmp_index(j, i) = nunique
959 CALL set_potparm_index(potparm, [n],
multi_type, ntype, tmpij, &
960 atomic_kind_set, shift_cutoff, do_zbl)
964 ALLOCATE (spline_env)
966 spline_env%spltab = tmp_index
967 DEALLOCATE (tmp_index)
968 CALL timestop(handle)