559 LOGICAL,
INTENT(IN) :: do_zbl, shift_cutoff
561 CHARACTER(len=*),
PARAMETER :: routinen =
'get_nonbond_storage'
563 INTEGER :: handle, i, idim, iend, istart, j, k, &
564 locij, n, ndim, nk, ntype, nunique, &
565 nvar, pot_target, tmpij(2), tmpij0(2)
566 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: iwork1, iwork2, my_index
567 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: tmp_index
568 LOGICAL :: at_least_one, check
569 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: cwork, rwork, wtmp
570 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: pot_par
572 CALL timeset(routinen, handle)
574 ntype =
SIZE(atomic_kind_set)
577 potparm%pot(i, j)%pot%undef = .false.
580 ALLOCATE (tmp_index(ntype, ntype))
588 IF (
SIZE(potparm%pot(i, j)%pot%type) /= 1) cycle
589 IF (potparm%pot(i, j)%pot%type(1) == pot_target)
THEN
598 SELECT CASE (pot_target)
643 ALLOCATE (my_index(ndim))
649 IF (
SIZE(potparm%pot(i, j)%pot%type) /= 1) cycle
650 IF (potparm%pot(i, j)%pot%type(1) == pot_target)
THEN
657 ALLOCATE (pot_par(ndim, nvar))
663 IF (
SIZE(potparm%pot(i, j)%pot%type) /= 1) cycle
664 IF (potparm%pot(i, j)%pot%type(1) == pot_target)
THEN
667 SELECT CASE (pot_target)
669 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%lj%epsilon
670 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%lj%sigma6
671 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%lj%sigma12
673 pot_par(nk, 1) =
str2id(potparm%pot(i, j)%pot%set(1)%gp%potential)
674 pot_par(nk, 2) =
str2id(potparm%pot(i, j)%pot%set(1)%gp%variables)
676 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%willis%a
677 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%willis%b
678 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%willis%c
680 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%goodwin%vr0
681 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%goodwin%m
682 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%goodwin%mc
683 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%goodwin%d
684 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%goodwin%dc
686 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%eam%drar
687 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%eam%drhoar
688 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%eam%acutal
689 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%eam%npoints
691 pot_par(nk, 1) =
str2id( &
692 trim(potparm%pot(i, j)%pot%set(1)%quip%quip_file_name)// &
693 trim(potparm%pot(i, j)%pot%set(1)%quip%init_args)// &
694 trim(potparm%pot(i, j)%pot%set(1)%quip%calc_args))
696 pot_par(nk, 1) =
str2id( &
697 trim(potparm%pot(i, j)%pot%set(1)%nequip%nequip_file_name))
699 pot_par(nk, 1) =
str2id( &
700 trim(potparm%pot(i, j)%pot%set(1)%allegro%allegro_file_name))
702 pot_par(nk, 1) =
str2id( &
703 trim(potparm%pot(i, j)%pot%set(1)%deepmd%deepmd_file_name))
704 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%deepmd%atom_deepmd_type
706 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%ft%A
707 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%ft%B
708 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%ft%C
709 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%ft%D
711 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%ftd%A
712 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%ftd%B
713 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%ftd%C
714 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%ftd%D
715 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%ftd%BD(1)
716 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%ftd%BD(2)
718 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%ipbv%rcore
719 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%ipbv%m
720 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%ipbv%b
722 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%buck4r%a
723 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%buck4r%b
724 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%buck4r%c
725 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%buck4r%r1
726 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%buck4r%r2
727 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%buck4r%r3
729 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%buckmo%f0
730 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%buckmo%a1
731 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%buckmo%a2
732 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%buckmo%b1
733 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%buckmo%b2
734 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%buckmo%c
735 pot_par(nk, 7) = potparm%pot(i, j)%pot%set(1)%buckmo%d
736 pot_par(nk, 8) = potparm%pot(i, j)%pot%set(1)%buckmo%r0
737 pot_par(nk, 9) = potparm%pot(i, j)%pot%set(1)%buckmo%beta
739 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%tersoff%A
740 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%tersoff%B
741 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%tersoff%lambda1
742 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%tersoff%lambda2
743 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%tersoff%alpha
744 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%tersoff%beta
745 pot_par(nk, 7) = potparm%pot(i, j)%pot%set(1)%tersoff%n
746 pot_par(nk, 8) = potparm%pot(i, j)%pot%set(1)%tersoff%c
747 pot_par(nk, 9) = potparm%pot(i, j)%pot%set(1)%tersoff%d
748 pot_par(nk, 10) = potparm%pot(i, j)%pot%set(1)%tersoff%h
749 pot_par(nk, 11) = potparm%pot(i, j)%pot%set(1)%tersoff%lambda3
750 pot_par(nk, 12) = potparm%pot(i, j)%pot%set(1)%tersoff%bigR
751 pot_par(nk, 13) = potparm%pot(i, j)%pot%set(1)%tersoff%bigD
753 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%siepmann%B
754 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%siepmann%D
755 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%siepmann%E
756 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%siepmann%F
757 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%siepmann%beta
759 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%gal%epsilon
760 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%gal%bxy
761 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%gal%bz
762 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%gal%r1
763 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%gal%r2
764 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%gal%a1
765 pot_par(nk, 7) = potparm%pot(i, j)%pot%set(1)%gal%a2
766 pot_par(nk, 8) = potparm%pot(i, j)%pot%set(1)%gal%a3
767 pot_par(nk, 9) = potparm%pot(i, j)%pot%set(1)%gal%a4
768 pot_par(nk, 10) = potparm%pot(i, j)%pot%set(1)%gal%a
769 pot_par(nk, 11) = potparm%pot(i, j)%pot%set(1)%gal%b
770 pot_par(nk, 12) = potparm%pot(i, j)%pot%set(1)%gal%c
772 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%gal21%epsilon1
773 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%gal21%epsilon2
774 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%gal21%epsilon3
775 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%gal21%bxy1
776 pot_par(nk, 5) = potparm%pot(i, j)%pot%set(1)%gal21%bxy2
777 pot_par(nk, 6) = potparm%pot(i, j)%pot%set(1)%gal21%bz1
778 pot_par(nk, 7) = potparm%pot(i, j)%pot%set(1)%gal21%bz2
779 pot_par(nk, 8) = potparm%pot(i, j)%pot%set(1)%gal21%r1
780 pot_par(nk, 9) = potparm%pot(i, j)%pot%set(1)%gal21%r2
781 pot_par(nk, 10) = potparm%pot(i, j)%pot%set(1)%gal21%a11
782 pot_par(nk, 11) = potparm%pot(i, j)%pot%set(1)%gal21%a12
783 pot_par(nk, 12) = potparm%pot(i, j)%pot%set(1)%gal21%a13
784 pot_par(nk, 13) = potparm%pot(i, j)%pot%set(1)%gal21%a21
785 pot_par(nk, 14) = potparm%pot(i, j)%pot%set(1)%gal21%a22
786 pot_par(nk, 15) = potparm%pot(i, j)%pot%set(1)%gal21%a23
787 pot_par(nk, 16) = potparm%pot(i, j)%pot%set(1)%gal21%a31
788 pot_par(nk, 17) = potparm%pot(i, j)%pot%set(1)%gal21%a32
789 pot_par(nk, 18) = potparm%pot(i, j)%pot%set(1)%gal21%a33
790 pot_par(nk, 19) = potparm%pot(i, j)%pot%set(1)%gal21%a41
791 pot_par(nk, 20) = potparm%pot(i, j)%pot%set(1)%gal21%a42
792 pot_par(nk, 21) = potparm%pot(i, j)%pot%set(1)%gal21%a43
793 pot_par(nk, 22) = potparm%pot(i, j)%pot%set(1)%gal21%AO1
794 pot_par(nk, 23) = potparm%pot(i, j)%pot%set(1)%gal21%AO2
795 pot_par(nk, 24) = potparm%pot(i, j)%pot%set(1)%gal21%BO1
796 pot_par(nk, 25) = potparm%pot(i, j)%pot%set(1)%gal21%BO2
797 pot_par(nk, 26) = potparm%pot(i, j)%pot%set(1)%gal21%c
798 pot_par(nk, 27) = potparm%pot(i, j)%pot%set(1)%gal21%AH1
799 pot_par(nk, 28) = potparm%pot(i, j)%pot%set(1)%gal21%AH2
800 pot_par(nk, 29) = potparm%pot(i, j)%pot%set(1)%gal21%BH1
801 pot_par(nk, 30) = potparm%pot(i, j)%pot%set(1)%gal21%BH2
803 pot_par(nk, 1) = potparm%pot(i, j)%pot%set(1)%tab%dr
804 pot_par(nk, 2) = potparm%pot(i, j)%pot%set(1)%tab%rcut
805 pot_par(nk, 3) = potparm%pot(i, j)%pot%set(1)%tab%npoints
806 pot_par(nk, 4) = potparm%pot(i, j)%pot%set(1)%tab%index
813 pot_par(nk, :) = real(pot_target, kind=
dp)
819 ALLOCATE (rwork(ndim))
820 ALLOCATE (iwork1(ndim))
821 ALLOCATE (iwork2(ndim))
822 ALLOCATE (wtmp(nvar))
823 CALL sort(pot_par(:, 1), ndim, iwork1)
826 rwork(:) = pot_par(:, k)
828 pot_par(i, k) = rwork(iwork1(i))
833 my_index(i) = iwork2(iwork1(i))
837 wtmp(1:k - 1) = pot_par(1, 1:k - 1)
839 at_least_one = .false.
841 rwork(j) = pot_par(j, k)
842 IF (all(pot_par(j, 1:k - 1) == wtmp(1:k - 1))) cycle
844 wtmp(1:k - 1) = pot_par(j, 1:k - 1)
848 idim = iend - istart + 1
849 CALL sort(rwork(istart:iend), idim, iwork1(istart:iend))
850 iwork1(istart:iend) = iwork1(istart:iend) - 1 + istart
851 IF (idim /= 1) at_least_one = .true.
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.
859 pot_par(:, k) = rwork
860 IF (.NOT. at_least_one)
EXIT
863 rwork(:) = pot_par(:, j)
865 pot_par(i, j) = rwork(iwork1(i))
870 my_index(i) = iwork2(iwork1(i))
880 ALLOCATE (cwork(nvar))
881 cwork(:) = pot_par(1, :)
883 CALL get_indexes(locij, ntype, tmpij0)
888 CALL get_indexes(locij, ntype, tmpij)
889 SELECT CASE (pot_target)
893 CALL compare_pot(potparm%pot(tmpij(1), tmpij(2))%pot, &
894 potparm%pot(tmpij0(1), tmpij0(2))%pot, &
898 IF (
ASSOCIATED(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%parameters) .AND. &
899 ASSOCIATED(potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%parameters))
THEN
900 IF (
SIZE(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%parameters) == &
901 SIZE(potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%parameters))
THEN
902 IF (any(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%parameters /= &
903 potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%parameters)) check = .false.
906 IF (
ASSOCIATED(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%values) .AND. &
907 ASSOCIATED(potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%values))
THEN
908 IF (
SIZE(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%values) == &
909 SIZE(potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%values))
THEN
910 IF (any(potparm%pot(tmpij(1), tmpij(2))%pot%set(1)%gp%values /= &
911 potparm%pot(tmpij0(1), tmpij0(2))%pot%set(1)%gp%values)) check = .false.
917 IF (all(cwork == pot_par(j, :)) .AND. check) cycle
918 cwork(:) = pot_par(j, :)
919 nunique = nunique + 1
921 CALL set_potparm_index(potparm, my_index(istart:iend), pot_target, &
922 ntype, tmpij, atomic_kind_set, shift_cutoff, do_zbl)
926 CALL get_indexes(locij, ntype, tmpij)
927 tmp_index(tmpij(1), tmpij(2)) = nunique
928 tmp_index(tmpij(2), tmpij(1)) = nunique
932 CALL get_indexes(locij, ntype, tmpij0)
934 nunique = nunique + 1
936 CALL set_potparm_index(potparm, my_index(istart:iend), pot_target, &
937 ntype, tmpij, atomic_kind_set, shift_cutoff, do_zbl)
940 CALL get_indexes(locij, ntype, tmpij)
941 tmp_index(tmpij(1), tmpij(2)) = nunique
942 tmp_index(tmpij(2), tmpij(1)) = nunique
947 nunique = nunique + 1
948 CALL set_potparm_index(potparm, my_index, pot_target, ntype, tmpij, &
949 atomic_kind_set, shift_cutoff, do_zbl)
951 DEALLOCATE (my_index)
958 IF (
SIZE(potparm%pot(i, j)%pot%type) == 1) cycle
959 nunique = nunique + 1
960 tmp_index(i, j) = nunique
961 tmp_index(j, i) = nunique
963 CALL set_potparm_index(potparm, (/n/),
multi_type, ntype, tmpij, &
964 atomic_kind_set, shift_cutoff, do_zbl)
968 ALLOCATE (spline_env)
970 spline_env%spltab = tmp_index
971 DEALLOCATE (tmp_index)
972 CALL timestop(handle)