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)
646 ALLOCATE (my_index(ndim))
652 IF (
SIZE(potparm%pot(i, j)%pot%type) /= 1) cycle
653 IF (potparm%pot(i, j)%pot%type(1) == pot_target)
THEN
660 ALLOCATE (pot_par(ndim, nvar))
666 IF (
SIZE(potparm%pot(i, j)%pot%type) /= 1) cycle
667 IF (potparm%pot(i, j)%pot%type(1) == pot_target)
THEN
670 SELECT CASE (pot_target)
672 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%lj%epsilon
673 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%lj%sigma6
674 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%lj%sigma12
676 pot_par(nk, 1) =
str2id(potparm%pot(i, j)%pot%set(1)%gp%potential)
677 pot_par(nk, 2) =
str2id(potparm%pot(i, j)%pot%set(1)%gp%variables)
679 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%willis%a
680 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%willis%b
681 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%willis%c
683 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%goodwin%vr0
684 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%goodwin%m
685 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%goodwin%mc
686 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%goodwin%d
687 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%goodwin%dc
689 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%eam%drar
690 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%eam%drhoar
691 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%eam%acutal
692 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%eam%npoints
694 pot_par(nk, 1) =
str2id( &
695 trim(potparm%pot(i, j)%pot%set(1)%quip%quip_file_name)// &
696 trim(potparm%pot(i, j)%pot%set(1)%quip%init_args)// &
697 trim(potparm%pot(i, j)%pot%set(1)%quip%calc_args))
699 pot_par(nk, 1) =
str2id( &
700 trim(potparm%pot(i, j)%pot%set(1)%nequip%nequip_file_name))
702 pot_par(nk, 1) =
str2id( &
703 trim(potparm%pot(i, j)%pot%set(1)%allegro%allegro_file_name))
705 pot_par(nk, 1) =
str2id( &
706 trim(potparm%pot(i, j)%pot%set(1)%ace%ace_file_name))
707 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%ace%atom_ace_type
709 pot_par(nk, 1) =
str2id( &
710 trim(potparm%pot(i, j)%pot%set(1)%deepmd%deepmd_file_name))
711 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%deepmd%atom_deepmd_type
713 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%ft%A
714 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%ft%B
715 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%ft%C
716 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%ft%D
718 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%ftd%A
719 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%ftd%B
720 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%ftd%C
721 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%ftd%D
722 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%ftd%BD(1)
723 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%ftd%BD(2)
725 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%ipbv%rcore
726 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%ipbv%m
727 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%ipbv%b
729 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%buck4r%a
730 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%buck4r%b
731 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%buck4r%c
732 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%buck4r%r1
733 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%buck4r%r2
734 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%buck4r%r3
736 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%buckmo%f0
737 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%buckmo%a1
738 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%buckmo%a2
739 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%buckmo%b1
740 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%buckmo%b2
741 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%buckmo%c
742 pot_par(nk, 7) = potparm%pot(i, j)%pot%set(1)%buckmo%d
743 pot_par(nk, 8) = potparm%pot(i, j)%pot%set(1)%buckmo%r0
744 pot_par(nk, 9) = potparm%pot(i, j)%pot%set(1)%buckmo%beta
746 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%tersoff%A
747 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%tersoff%B
748 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%tersoff%lambda1
749 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%tersoff%lambda2
750 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%tersoff%alpha
751 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%tersoff%beta
752 pot_par(nk, 7) = potparm%pot(i, j)%pot%set(1)%tersoff%n
753 pot_par(nk, 8) = potparm%pot(i, j)%pot%set(1)%tersoff%c
754 pot_par(nk, 9) = potparm%pot(i, j)%pot%set(1)%tersoff%d
755 pot_par(nk, 10) = potparm%pot(i, j)%pot%set(1)%tersoff%h
756 pot_par(nk, 11) = potparm%pot(i, j)%pot%set(1)%tersoff%lambda3
757 pot_par(nk, 12) = potparm%pot(i, j)%pot%set(1)%tersoff%bigR
758 pot_par(nk, 13) = potparm%pot(i, j)%pot%set(1)%tersoff%bigD
760 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%siepmann%B
761 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%siepmann%D
762 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%siepmann%E
763 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%siepmann%F
764 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%siepmann%beta
766 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%gal%epsilon
767 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%gal%bxy
768 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%gal%bz
769 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%gal%r1
770 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%gal%r2
771 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%gal%a1
772 pot_par(nk, 7) = potparm%pot(i, j)%pot%set(1)%gal%a2
773 pot_par(nk, 8) = potparm%pot(i, j)%pot%set(1)%gal%a3
774 pot_par(nk, 9) = potparm%pot(i, j)%pot%set(1)%gal%a4
775 pot_par(nk, 10) = potparm%pot(i, j)%pot%set(1)%gal%a
776 pot_par(nk, 11) = potparm%pot(i, j)%pot%set(1)%gal%b
777 pot_par(nk, 12) = potparm%pot(i, j)%pot%set(1)%gal%c
779 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%gal21%epsilon1
780 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%gal21%epsilon2
781 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%gal21%epsilon3
782 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%gal21%bxy1
783 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%gal21%bxy2
784 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%gal21%bz1
785 pot_par(nk, 7) = potparm%pot(i, j)%pot%set(1)%gal21%bz2
786 pot_par(nk, 8) = potparm%pot(i, j)%pot%set(1)%gal21%r1
787 pot_par(nk, 9) = potparm%pot(i, j)%pot%set(1)%gal21%r2
788 pot_par(nk, 10) = potparm%pot(i, j)%pot%set(1)%gal21%a11
789 pot_par(nk, 11) = potparm%pot(i, j)%pot%set(1)%gal21%a12
790 pot_par(nk, 12) = potparm%pot(i, j)%pot%set(1)%gal21%a13
791 pot_par(nk, 13) = potparm%pot(i, j)%pot%set(1)%gal21%a21
792 pot_par(nk, 14) = potparm%pot(i, j)%pot%set(1)%gal21%a22
793 pot_par(nk, 15) = potparm%pot(i, j)%pot%set(1)%gal21%a23
794 pot_par(nk, 16) = potparm%pot(i, j)%pot%set(1)%gal21%a31
795 pot_par(nk, 17) = potparm%pot(i, j)%pot%set(1)%gal21%a32
796 pot_par(nk, 18) = potparm%pot(i, j)%pot%set(1)%gal21%a33
797 pot_par(nk, 19) = potparm%pot(i, j)%pot%set(1)%gal21%a41
798 pot_par(nk, 20) = potparm%pot(i, j)%pot%set(1)%gal21%a42
799 pot_par(nk, 21) = potparm%pot(i, j)%pot%set(1)%gal21%a43
800 pot_par(nk, 22) = potparm%pot(i, j)%pot%set(1)%gal21%AO1
801 pot_par(nk, 23) = potparm%pot(i, j)%pot%set(1)%gal21%AO2
802 pot_par(nk, 24) = potparm%pot(i, j)%pot%set(1)%gal21%BO1
803 pot_par(nk, 25) = potparm%pot(i, j)%pot%set(1)%gal21%BO2
804 pot_par(nk, 26) = potparm%pot(i, j)%pot%set(1)%gal21%c
805 pot_par(nk, 27) = potparm%pot(i, j)%pot%set(1)%gal21%AH1
806 pot_par(nk, 28) = potparm%pot(i, j)%pot%set(1)%gal21%AH2
807 pot_par(nk, 29) = potparm%pot(i, j)%pot%set(1)%gal21%BH1
808 pot_par(nk, 30) = potparm%pot(i, j)%pot%set(1)%gal21%BH2
810 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%tab%dr
811 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%tab%rcut
812 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%tab%npoints
813 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%tab%index
820 pot_par(nk, :) = real(pot_target, kind=
dp)
826 ALLOCATE (rwork(ndim))
827 ALLOCATE (iwork1(ndim))
828 ALLOCATE (iwork2(ndim))
829 ALLOCATE (wtmp(nvar))
830 CALL sort(pot_par(:, 1), ndim, iwork1)
833 rwork(:) = pot_par(:, k)
835 pot_par(i, k) = rwork(iwork1(i))
840 my_index(i) = iwork2(iwork1(i))
844 wtmp(1:k - 1) = pot_par(1, 1:k - 1)
846 at_least_one = .false.
848 rwork(j) = pot_par(j, k)
849 IF (all(pot_par(j, 1:k - 1) == wtmp(1:k - 1))) cycle
851 wtmp(1:k - 1) = pot_par(j, 1:k - 1)
855 idim = iend - istart + 1
856 CALL sort(rwork(istart:iend), idim, iwork1(istart:iend))
857 iwork1(istart:iend) = iwork1(istart:iend) - 1 + istart
858 IF (idim /= 1) at_least_one = .true.
862 idim = iend - istart + 1
863 CALL sort(rwork(istart:iend), idim, iwork1(istart:iend))
864 iwork1(istart:iend) = iwork1(istart:iend) - 1 + istart
865 IF (idim /= 1) at_least_one = .true.
866 pot_par(:, k) = rwork
867 IF (.NOT. at_least_one)
EXIT
870 rwork(:) = pot_par(:, j)
872 pot_par(i, j) = rwork(iwork1(i))
877 my_index(i) = iwork2(iwork1(i))
887 ALLOCATE (cwork(nvar))
888 cwork(:) = pot_par(1, :)
890 CALL get_indexes(locij, ntype, tmpij0)
895 CALL get_indexes(locij, ntype, tmpij)
896 SELECT CASE (pot_target)
900 CALL compare_pot(potparm%pot(tmpij(1), tmpij(2))%pot, &
901 potparm%pot(tmpij0(1), tmpij0(2))%pot, &
905 IF (
ASSOCIATED(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%parameters) .AND. &
906 ASSOCIATED(potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%parameters))
THEN
907 IF (
SIZE(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%parameters) == &
908 SIZE(potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%parameters))
THEN
909 IF (any(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%parameters /= &
910 potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%parameters)) check = .false.
913 IF (
ASSOCIATED(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%values) .AND. &
914 ASSOCIATED(potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%values))
THEN
915 IF (
SIZE(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%values) == &
916 SIZE(potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%values))
THEN
917 IF (any(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%values /= &
918 potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%values)) check = .false.
924 IF (all(cwork == pot_par(j, :)) .AND. check) cycle
925 cwork(:) = pot_par(j, :)
926 nunique = nunique + 1
928 CALL set_potparm_index(potparm, my_index(istart:iend), pot_target, &
929 ntype, tmpij, atomic_kind_set, shift_cutoff, do_zbl)
933 CALL get_indexes(locij, ntype, tmpij)
934 tmp_index(tmpij(1), tmpij(2)) = nunique
935 tmp_index(tmpij(2), tmpij(1)) = nunique
939 CALL get_indexes(locij, ntype, tmpij0)
941 nunique = nunique + 1
943 CALL set_potparm_index(potparm, my_index(istart:iend), pot_target, &
944 ntype, tmpij, atomic_kind_set, shift_cutoff, do_zbl)
947 CALL get_indexes(locij, ntype, tmpij)
948 tmp_index(tmpij(1), tmpij(2)) = nunique
949 tmp_index(tmpij(2), tmpij(1)) = nunique
954 nunique = nunique + 1
955 CALL set_potparm_index(potparm, my_index, pot_target, ntype, tmpij, &
956 atomic_kind_set, shift_cutoff, do_zbl)
958 DEALLOCATE (my_index)
965 IF (
SIZE(potparm%pot(i, j)%pot%type) == 1) cycle
966 nunique = nunique + 1
967 tmp_index(i, j) = nunique
968 tmp_index(j, i) = nunique
970 CALL set_potparm_index(potparm, (/n/),
multi_type, ntype, tmpij, &
971 atomic_kind_set, shift_cutoff, do_zbl)
975 ALLOCATE (spline_env)
977 spline_env%spltab = tmp_index
978 DEALLOCATE (tmp_index)
979 CALL timestop(handle)