561 LOGICAL,
INTENT(IN) :: do_zbl, shift_cutoff
563 CHARACTER(len=*),
PARAMETER :: routinen =
'get_nonbond_storage'
565 INTEGER :: handle, i, idim, iend, istart, j, k, &
566 locij, n, ndim, nk, ntype, nunique, &
567 nvar, pot_target, tmpij(2), tmpij0(2)
568 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: iwork1, iwork2, my_index
569 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: tmp_index
570 LOGICAL :: at_least_one, check
571 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: cwork, rwork, wtmp
572 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: pot_par
574 CALL timeset(routinen, handle)
576 ntype =
SIZE(atomic_kind_set)
579 potparm%pot(i, j)%pot%undef = .false.
582 ALLOCATE (tmp_index(ntype, ntype))
590 IF (
SIZE(potparm%pot(i, j)%pot%type) /= 1) cycle
591 IF (potparm%pot(i, j)%pot%type(1) == pot_target)
THEN
600 SELECT CASE (pot_target)
642 cpabort(
"Unknown potential target for get_nonbond_storage")
645 ALLOCATE (my_index(ndim))
651 IF (
SIZE(potparm%pot(i, j)%pot%type) /= 1) cycle
652 IF (potparm%pot(i, j)%pot%type(1) == pot_target)
THEN
659 ALLOCATE (pot_par(ndim, nvar))
665 IF (
SIZE(potparm%pot(i, j)%pot%type) /= 1) cycle
666 IF (potparm%pot(i, j)%pot%type(1) == pot_target)
THEN
669 SELECT CASE (pot_target)
671 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%lj%epsilon
672 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%lj%sigma6
673 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%lj%sigma12
675 pot_par(nk, 1) =
str2id(potparm%pot(i, j)%pot%set(1)%gp%potential)
676 pot_par(nk, 2) =
str2id(potparm%pot(i, j)%pot%set(1)%gp%variables)
678 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%willis%a
679 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%willis%b
680 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%willis%c
682 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%goodwin%vr0
683 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%goodwin%m
684 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%goodwin%mc
685 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%goodwin%d
686 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%goodwin%dc
688 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%eam%drar
689 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%eam%drhoar
690 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%eam%acutal
691 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%eam%npoints
693 pot_par(nk, 1) =
str2id( &
694 trim(potparm%pot(i, j)%pot%set(1)%nequip%pot_file_name))
696 pot_par(nk, 1) =
str2id( &
697 trim(potparm%pot(i, j)%pot%set(1)%ace%ace_file_name))
698 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%ace%atom_ace_type
700 pot_par(nk, 1) =
str2id( &
701 trim(potparm%pot(i, j)%pot%set(1)%deepmd%deepmd_file_name))
702 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%deepmd%atom_deepmd_type
704 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%ft%A
705 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%ft%B
706 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%ft%C
707 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%ft%D
709 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%ftd%A
710 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%ftd%B
711 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%ftd%C
712 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%ftd%D
713 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%ftd%BD(1)
714 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%ftd%BD(2)
716 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%ipbv%rcore
717 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%ipbv%m
718 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%ipbv%b
720 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%buck4r%a
721 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%buck4r%b
722 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%buck4r%c
723 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%buck4r%r1
724 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%buck4r%r2
725 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%buck4r%r3
727 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%buckmo%f0
728 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%buckmo%a1
729 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%buckmo%a2
730 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%buckmo%b1
731 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%buckmo%b2
732 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%buckmo%c
733 pot_par(nk, 7) = potparm%pot(i, j)%pot%set(1)%buckmo%d
734 pot_par(nk, 8) = potparm%pot(i, j)%pot%set(1)%buckmo%r0
735 pot_par(nk, 9) = potparm%pot(i, j)%pot%set(1)%buckmo%beta
737 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%tersoff%A
738 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%tersoff%B
739 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%tersoff%lambda1
740 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%tersoff%lambda2
741 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%tersoff%alpha
742 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%tersoff%beta
743 pot_par(nk, 7) = potparm%pot(i, j)%pot%set(1)%tersoff%n
744 pot_par(nk, 8) = potparm%pot(i, j)%pot%set(1)%tersoff%c
745 pot_par(nk, 9) = potparm%pot(i, j)%pot%set(1)%tersoff%d
746 pot_par(nk, 10) = potparm%pot(i, j)%pot%set(1)%tersoff%h
747 pot_par(nk, 11) = potparm%pot(i, j)%pot%set(1)%tersoff%lambda3
748 pot_par(nk, 12) = potparm%pot(i, j)%pot%set(1)%tersoff%bigR
749 pot_par(nk, 13) = potparm%pot(i, j)%pot%set(1)%tersoff%bigD
751 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%siepmann%B
752 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%siepmann%D
753 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%siepmann%E
754 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%siepmann%F
755 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%siepmann%beta
757 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%gal%epsilon
758 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%gal%bxy
759 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%gal%bz
760 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%gal%r1
761 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%gal%r2
762 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%gal%a1
763 pot_par(nk, 7) = potparm%pot(i, j)%pot%set(1)%gal%a2
764 pot_par(nk, 8) = potparm%pot(i, j)%pot%set(1)%gal%a3
765 pot_par(nk, 9) = potparm%pot(i, j)%pot%set(1)%gal%a4
766 pot_par(nk, 10) = potparm%pot(i, j)%pot%set(1)%gal%a
767 pot_par(nk, 11) = potparm%pot(i, j)%pot%set(1)%gal%b
768 pot_par(nk, 12) = potparm%pot(i, j)%pot%set(1)%gal%c
770 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%gal21%epsilon1
771 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%gal21%epsilon2
772 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%gal21%epsilon3
773 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%gal21%bxy1
774 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%gal21%bxy2
775 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%gal21%bz1
776 pot_par(nk, 7) = potparm%pot(i, j)%pot%set(1)%gal21%bz2
777 pot_par(nk, 8) = potparm%pot(i, j)%pot%set(1)%gal21%r1
778 pot_par(nk, 9) = potparm%pot(i, j)%pot%set(1)%gal21%r2
779 pot_par(nk, 10) = potparm%pot(i, j)%pot%set(1)%gal21%a11
780 pot_par(nk, 11) = potparm%pot(i, j)%pot%set(1)%gal21%a12
781 pot_par(nk, 12) = potparm%pot(i, j)%pot%set(1)%gal21%a13
782 pot_par(nk, 13) = potparm%pot(i, j)%pot%set(1)%gal21%a21
783 pot_par(nk, 14) = potparm%pot(i, j)%pot%set(1)%gal21%a22
784 pot_par(nk, 15) = potparm%pot(i, j)%pot%set(1)%gal21%a23
785 pot_par(nk, 16) = potparm%pot(i, j)%pot%set(1)%gal21%a31
786 pot_par(nk, 17) = potparm%pot(i, j)%pot%set(1)%gal21%a32
787 pot_par(nk, 18) = potparm%pot(i, j)%pot%set(1)%gal21%a33
788 pot_par(nk, 19) = potparm%pot(i, j)%pot%set(1)%gal21%a41
789 pot_par(nk, 20) = potparm%pot(i, j)%pot%set(1)%gal21%a42
790 pot_par(nk, 21) = potparm%pot(i, j)%pot%set(1)%gal21%a43
791 pot_par(nk, 22) = potparm%pot(i, j)%pot%set(1)%gal21%AO1
792 pot_par(nk, 23) = potparm%pot(i, j)%pot%set(1)%gal21%AO2
793 pot_par(nk, 24) = potparm%pot(i, j)%pot%set(1)%gal21%BO1
794 pot_par(nk, 25) = potparm%pot(i, j)%pot%set(1)%gal21%BO2
795 pot_par(nk, 26) = potparm%pot(i, j)%pot%set(1)%gal21%c
796 pot_par(nk, 27) = potparm%pot(i, j)%pot%set(1)%gal21%AH1
797 pot_par(nk, 28) = potparm%pot(i, j)%pot%set(1)%gal21%AH2
798 pot_par(nk, 29) = potparm%pot(i, j)%pot%set(1)%gal21%BH1
799 pot_par(nk, 30) = potparm%pot(i, j)%pot%set(1)%gal21%BH2
801 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%tab%dr
802 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%tab%rcut
803 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%tab%npoints
804 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%tab%index
808 cpabort(
"Unknown potential target for get_nonbond_storage")
811 pot_par(nk, :) = real(pot_target, kind=
dp)
817 ALLOCATE (rwork(ndim))
818 ALLOCATE (iwork1(ndim))
819 ALLOCATE (iwork2(ndim))
820 ALLOCATE (wtmp(nvar))
821 CALL sort(pot_par(:, 1), ndim, iwork1)
824 rwork(:) = pot_par(:, k)
826 pot_par(i, k) = rwork(iwork1(i))
831 my_index(i) = iwork2(iwork1(i))
835 wtmp(1:k - 1) = pot_par(1, 1:k - 1)
837 at_least_one = .false.
839 rwork(j) = pot_par(j, k)
840 IF (all(pot_par(j, 1:k - 1) == wtmp(1:k - 1))) cycle
842 wtmp(1:k - 1) = pot_par(j, 1:k - 1)
846 idim = iend - istart + 1
847 CALL sort(rwork(istart:iend), idim, iwork1(istart:iend))
848 iwork1(istart:iend) = iwork1(istart:iend) - 1 + istart
849 IF (idim /= 1) at_least_one = .true.
853 idim = iend - istart + 1
854 CALL sort(rwork(istart:iend), idim, iwork1(istart:iend))
855 iwork1(istart:iend) = iwork1(istart:iend) - 1 + istart
856 IF (idim /= 1) at_least_one = .true.
857 pot_par(:, k) = rwork
858 IF (.NOT. at_least_one)
EXIT
861 rwork(:) = pot_par(:, j)
863 pot_par(i, j) = rwork(iwork1(i))
868 my_index(i) = iwork2(iwork1(i))
878 ALLOCATE (cwork(nvar))
879 cwork(:) = pot_par(1, :)
881 CALL get_indexes(locij, ntype, tmpij0)
886 CALL get_indexes(locij, ntype, tmpij)
887 SELECT CASE (pot_target)
890 CALL compare_pot(potparm%pot(tmpij(1), tmpij(2))%pot, &
891 potparm%pot(tmpij0(1), tmpij0(2))%pot, &
895 IF (
ASSOCIATED(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%parameters) .AND. &
896 ASSOCIATED(potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%parameters))
THEN
897 IF (
SIZE(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%parameters) == &
898 SIZE(potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%parameters))
THEN
899 IF (any(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%parameters /= &
900 potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%parameters)) check = .false.
903 IF (
ASSOCIATED(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%values) .AND. &
904 ASSOCIATED(potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%values))
THEN
905 IF (
SIZE(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%values) == &
906 SIZE(potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%values))
THEN
907 IF (any(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%values /= &
908 potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%values)) check = .false.
914 IF (all(cwork == pot_par(j, :)) .AND. check) cycle
915 cwork(:) = pot_par(j, :)
916 nunique = nunique + 1
918 CALL set_potparm_index(potparm, my_index(istart:iend), pot_target, &
919 ntype, tmpij, atomic_kind_set, shift_cutoff, do_zbl)
923 CALL get_indexes(locij, ntype, tmpij)
924 tmp_index(tmpij(1), tmpij(2)) = nunique
925 tmp_index(tmpij(2), tmpij(1)) = nunique
929 CALL get_indexes(locij, ntype, tmpij0)
931 nunique = nunique + 1
933 CALL set_potparm_index(potparm, my_index(istart:iend), pot_target, &
934 ntype, tmpij, atomic_kind_set, shift_cutoff, do_zbl)
937 CALL get_indexes(locij, ntype, tmpij)
938 tmp_index(tmpij(1), tmpij(2)) = nunique
939 tmp_index(tmpij(2), tmpij(1)) = nunique
944 nunique = nunique + 1
945 CALL set_potparm_index(potparm, my_index, pot_target, ntype, tmpij, &
946 atomic_kind_set, shift_cutoff, do_zbl)
948 DEALLOCATE (my_index)
955 IF (
SIZE(potparm%pot(i, j)%pot%type) == 1) cycle
956 nunique = nunique + 1
957 tmp_index(i, j) = nunique
958 tmp_index(j, i) = nunique
960 CALL set_potparm_index(potparm, [n],
multi_type, ntype, tmpij, &
961 atomic_kind_set, shift_cutoff, do_zbl)
965 ALLOCATE (spline_env)
967 spline_env%spltab = tmp_index
968 DEALLOCATE (tmp_index)
969 CALL timestop(handle)