763
764 INTEGER(8), intent(in) :: LA
765 INTEGER(8), intent(in) :: POSELT
766 INTEGER, intent(in) :: NFRONT, NB_BLR, NPARTSASS,
767 & CURRENT_BLR, IWHANDLER, LorU,
768 & NELIM, NIV, SYM, K480, K479, K478,
769 & MAXI_CLUSTER, MAXI_RANK,
770 & KPERCENT_LUA, KPERCENT, ISHIFT,
771 & K474, FSorCB
772 LOGICAL, intent(in) :: LBANDSLAVE
773 COMPLEX, TARGET, intent(inout) :: A(LA)
774 TYPE(LRB_TYPE), POINTER :: ACC_LUA(:), BLR_U_COL(:)
775 INTEGER(8) :: KEEP8(150)
776 INTEGER, DIMENSION(:) :: BEGS_BLR, BEGS_BLR_U
777 INTEGER,intent(in) :: MIDBLK_COMPRESS, KPERCENT_RMB, TOL_OPT
778 REAL,intent(in) :: TOLEPS
779 INTEGER,intent(inout) :: IFLAG, IERROR
780 INTEGER,OPTIONAL,intent(in) :: FIRST_BLOCK
781 INTEGER,OPTIONAL,intent(in) :: BEG_I_IN, END_I_IN
782 TYPE(LRB_TYPE), POINTER :: BLR_U(:), BLR_L(:), NEXT_BLR(:)
783 TYPE(LRB_TYPE), POINTER :: ACC_LRB
784 INTEGER :: OLD_ACC_RANK, MAX_ACC_RANK, NEW_ACC_RANK, FRFR_UPDATES,
785 & NB_DEC, FR_RANK, MAXRANK, BEG_I, END_I
786 INTEGER :: I,II,J,JJ, NB_BLOCKS_PANEL, IND_U, IND_L, K_MAX
787 INTEGER :: MID_RANK, allocok
788 INTEGER :: J_ORDER(CURRENT_BLR), J_RANK(CURRENT_BLR)
789 INTEGER, ALLOCATABLE :: POS_LIST(:), RANK_LIST(:)
790 LOGICAL :: BUILDQ, COMPRESSED_FR
791#if defined(BLR_MT)
792 INTEGER :: OMP_NUM
793 INTEGER :: CHUNK
794#endif
795 INTEGER(8) :: POSELT_INCB
796 COMPLEX :: ONE, MONE, ZERO
797 parameter(one=(1.0e0,0.0e0), mone=(-1.0e0,0.0e0))
798 parameter(zero=(0.0e0,0.0e0))
799 IF (niv.EQ.2.AND.loru.EQ.0) THEN
800 IF (lbandslave) THEN
801 nb_blocks_panel = nb_blr
802 ELSE
803 nb_blocks_panel = npartsass-current_blr
804 ENDIF
805 ELSE
806 nb_blocks_panel = nb_blr-current_blr
807 ENDIF
808 acc_lrb => acc_lua(1)
809 IF (k480.GE.5) THEN
810 IF (nb_blocks_panel.GT.1) THEN
811 CALL cmumps_blr_retrieve_panel_loru(
812 & iwhandler,
813 & loru,
814 & current_blr+1, next_blr)
815 ENDIF
816 IF (.not.(present(first_block))) THEN
817 write(*,*) "Internal error in
818 & CMUMPS_BLR_UPD_PANEL_LEFT: KEEP(480)=",k480,
819 & ">=5, but FIRST_BLOCK argument is missing"
821 ENDIF
822 ENDIF
823 IF (loru.EQ.0) THEN
824 beg_i = 1
825 ELSE
826 beg_i = 2
827 ENDIF
828 end_i = nb_blocks_panel
829 IF (k474.EQ.3) THEN
830 IF(present(beg_i_in)) THEN
831 beg_i = beg_i_in - current_blr
832 ENDIF
833 IF(present(end_i_in)) THEN
834 end_i = end_i_in - current_blr
835 ENDIF
836 ENDIF
837#if defined(BLR_MT)
838 chunk = 1
839
840
841
842
843
844
845#endif
846 DO i = beg_i, end_i
847 IF (iflag.LT.0) cycle
848#if defined(BLR_MT)
849 omp_num = 0
850
851 acc_lrb => acc_lua(omp_num+1)
852#endif
853 IF (loru.EQ.0) THEN
854 IF (lbandslave) THEN
855 poselt_incb = poselt
856 & + int(nfront,8) * int((begs_blr(i+1)-1),8)
857 & + int(begs_blr_u(2)+ishift-1,8)
858 acc_lrb%N = begs_blr(i+2)-begs_blr(i+1)
859 acc_lrb%M = begs_blr_u(3)-begs_blr_u(2)
860 IF (k474.GE.2) THEN
861 blr_u => blr_u_col
862 ENDIF
863 ELSE
864 poselt_incb = poselt
865 & + int(nfront,8) * int((begs_blr(current_blr+i)-1),8)
866 & + int(begs_blr(current_blr+1)-1,8)
867 acc_lrb%N = begs_blr(current_blr+i+1)
868 & -begs_blr(current_blr+i)
869 acc_lrb%M = begs_blr(current_blr+2)-begs_blr(current_blr+1)
870 ENDIF
871 ELSE
872 poselt_incb = poselt
873 & + int(nfront,8) * int((begs_blr(current_blr+1)-1),8)
874 & + int(begs_blr(current_blr+i)-1,8)
875 acc_lrb%N = begs_blr(current_blr+2)-begs_blr(current_blr+1)
876 acc_lrb%M = begs_blr(current_blr+i+1)-begs_blr(current_blr+i)
877 ENDIF
878 max_acc_rank = 0
879 new_acc_rank = 0
880 compressed_fr = .false.
881 IF (k480.EQ.2) THEN
882 DO j = 1, current_blr
883 j_order(j) = j
884 ENDDO
885 ELSE
886 CALL cmumps_get_lua_order(current_blr, j_order, j_rank,
887 & iwhandler,
888 & 0, 0, i, loru,
889 & frfr_updates,
890 & lbandslave, k474, blr_u_col)
891 ENDIF
892 fr_rank = 0
893 IF ((k480.GE.5).AND.(i.NE.1)) THEN
894 IF (i.GT.first_block) THEN
895 IF (frfr_updates.EQ.0) THEN
896 CALL cmumps_compress_fr_updates(acc_lrb,
897 & maxi_cluster, maxi_rank, a, la, poselt_incb,
898 & nfront, niv, toleps, tol_opt, kpercent,
899 & compressed_fr, loru, .false.)
900 max_acc_rank = acc_lrb%K
901 new_acc_rank = acc_lrb%K
902 fr_rank = acc_lrb%K
903 ENDIF
904 ENDIF
905 ENDIF
906 nb_dec = frfr_updates
907 DO jj = 1, current_blr
908 j = j_order(jj)
909 k_max = j_rank(jj)
910 IF (loru.EQ.0) THEN
911 IF (lbandslave) THEN
912 ind_l = i
913 IF (k474.LT.2) THEN
914 ind_u = current_blr+1-j
915 ELSE
916 ind_u = j
917 ENDIF
918 ELSE
919 ind_l = current_blr+i-j
920 ind_u = current_blr+1-j
921 ENDIF
922 ELSE
923 ind_l = current_blr+1-j
924 ind_u = current_blr+i-j
925 ENDIF
926 CALL cmumps_blr_retrieve_panel_loru(
927 & iwhandler,
928 & 0,
929 & j, blr_l)
930 IF (blr_l(ind_l)%M.EQ.0) THEN
931 cycle
932 ENDIF
933 IF (.NOT.lbandslave.OR.k474.LT.2) THEN
934 CALL cmumps_blr_retrieve_panel_loru(
935 & iwhandler,
936 & 1,
937 & j, blr_u)
938 ENDIF
939 IF (k480.GE.3) THEN
940 IF (acc_lrb%K+k_max.GT.maxi_rank) THEN
941 nb_dec = jj-1
942 CALL cmumps_decompress_acc(acc_lrb, maxi_cluster,
943 & maxi_rank, a, la, poselt_incb, nfront, niv, loru)
944 compressed_fr = .false.
945 max_acc_rank = 0
946 ENDIF
947 old_acc_rank = acc_lrb%K
948 ENDIF
949 CALL cmumps_lrgemm4(mone,
950 & blr_u(ind_u), blr_l(ind_l), one,
951 & a, la, poselt_incb,
952 & nfront, 0, iflag, ierror,
953 & midblk_compress, toleps, tol_opt,
954 & kpercent_rmb, mid_rank, buildq,
955 & (k480.GE.3), loru=loru,
956 & lrb3=acc_lrb, maxi_rank=maxi_rank,
957 & maxi_cluster=maxi_cluster
958 & )
959 IF (iflag.LT.0) GOTO 100
960 CALL upd_flop_update(blr_u(ind_u), blr_l(ind_l),
961 & midblk_compress, mid_rank, buildq,
962 & .false., (k480.GE.3))
963 IF ((midblk_compress.GE.1).AND.buildq) THEN
964 j_rank(jj) = mid_rank
965 ENDIF
966 IF (k480.GE.3) THEN
967 new_acc_rank = new_acc_rank + acc_lrb%K - old_acc_rank
968 max_acc_rank =
max(max_acc_rank, acc_lrb%K - old_acc_rank)
969 IF (k480.EQ.4) THEN
970 IF ((k478.GT.0).AND.((acc_lrb%K-max_acc_rank).GE.k478))
971 & THEN
972 CALL cmumps_recompress_acc(acc_lrb,maxi_cluster,
973 & maxi_rank, a, la, poselt_incb, nfront, niv,
974 & midblk_compress, toleps, tol_opt, kpercent_rmb,
975 & kpercent_lua, new_acc_rank)
976 max_acc_rank = acc_lrb%K
977 ENDIF
978 ENDIF
979 ENDIF
980 IF ((k480.GE.5).AND.(i.NE.1)) THEN
981 IF (i.GT.first_block) THEN
982 IF (jj.EQ.frfr_updates) THEN
983 CALL cmumps_compress_fr_updates(acc_lrb,
984 & maxi_cluster, maxi_rank, a, la, poselt_incb,
985 & nfront, niv, toleps, tol_opt, kpercent,
986 & compressed_fr, loru, .false.)
987 max_acc_rank = acc_lrb%K
988 new_acc_rank = acc_lrb%K
989 IF (compressed_fr) THEN
990 j_rank(jj) = acc_lrb%K
991 nb_dec = frfr_updates-1
992 ENDIF
993 ENDIF
994 ENDIF
995 ENDIF
996 ENDDO
997 IF (k480.GE.3) THEN
998 IF ((k480.GE.5)) THEN
999 IF (compressed_fr.OR.(k480.GE.6)) THEN
1000 IF (acc_lrb%K.GT.0) THEN
1001 IF (k478.EQ.-1) THEN
1002 IF (current_blr-frfr_updates.GT.1) THEN
1003 CALL cmumps_recompress_acc(acc_lrb,
1004 & maxi_cluster, maxi_rank, a, la, poselt_incb,
1005 & nfront, niv, midblk_compress, toleps, tol_opt,
1006 & kpercent_rmb, kpercent_lua, new_acc_rank)
1007 ENDIF
1008 ELSEIF (k478.LE.-2) THEN
1009 IF (frfr_updates.GT.0) THEN
1010 allocate(pos_list(current_blr-nb_dec),stat=allocok)
1011 IF (allocok .GT. 0) THEN
1012 iflag = -13
1013 ierror = current_blr-nb_dec
1014 write(*,*) 'Allocation problem in BLR routine ',
1015 & 'CMUMPS_BLR_UPD_PANEL_LEFT: ',
1016 & 'not enough memory? memory requested = ',
1017 & ierror
1018 GOTO 100
1019 ENDIF
1020 pos_list(1) = 1
1021 DO ii = 1,current_blr-nb_dec-1
1022 pos_list(ii+1)=pos_list(ii)+j_rank(nb_dec+ii)
1023 ENDDO
1024 CALL cmumps_recompress_acc_narytree(acc_lrb,
1025 & maxi_cluster, maxi_rank, a, la, poselt_incb, keep8,
1026 & nfront, niv, midblk_compress, toleps, tol_opt,
1027 & kpercent_rmb, kpercent_lua, k478,
1028 & j_rank(nb_dec+1:current_blr), pos_list,
1029 & current_blr-nb_dec, 0)
1030 ELSE
1031 allocate(pos_list(current_blr+1),stat=allocok)
1032 IF (allocok .GT. 0) THEN
1033 iflag = -13
1034 ierror = current_blr+1
1035 write(*,*) 'Allocation problem in BLR routine ',
1036 & 'CMUMPS_BLR_UPD_PANEL_LEFT: ',
1037 & 'not enough memory? memory requested = ',
1038 & ierror
1039 GOTO 100
1040 ENDIF
1041 pos_list(1) = 1
1042 pos_list(2) = 1 + fr_rank
1043 DO ii = 2,current_blr
1044 pos_list(ii+1)=pos_list(ii)+j_rank(ii-1)
1045 ENDDO
1046 allocate(rank_list(current_blr+1),stat=allocok)
1047 IF (allocok .GT. 0) THEN
1048 iflag = -13
1049 ierror = current_blr+1
1050 write(*,*) 'Allocation problem in BLR routine ',
1051 & 'CMUMPS_BLR_UPD_PANEL_LEFT: ',
1052 & 'not enough memory? memory requested = ',
1053 & ierror
1054 GOTO 100
1055 ENDIF
1056 rank_list(1) = fr_rank
1057 DO ii = 2,current_blr+1
1058 rank_list(ii) = j_rank(ii-1)
1059 ENDDO
1060 CALL cmumps_recompress_acc_narytree(acc_lrb,
1061 & maxi_cluster, maxi_rank, a, la, poselt_incb, keep8,
1062 & nfront, niv, midblk_compress, toleps, tol_opt,
1063 & kpercent_rmb, kpercent_lua, k478,
1064 & rank_list, pos_list,
1065 & current_blr+1, 0)
1066 deallocate(rank_list)
1067 ENDIF
1068 deallocate(pos_list)
1069 ENDIF
1070 ENDIF
1071 ENDIF
1072 maxrank = floor(real(acc_lrb%M*acc_lrb%N)/real(acc_lrb%M+
1073 & acc_lrb%N))
1074 IF (compressed_fr.AND.(acc_lrb%K.LE.maxrank)) THEN
1075 CALL alloc_lrb_from_acc(acc_lrb, next_blr(i-1),
1076 & acc_lrb%K, acc_lrb%M, acc_lrb%N, loru,
1077 & iflag, ierror, keep8)
1078 IF (iflag.LT.0) cycle
1079 acc_lrb%K = 0
1080 ELSE
1081 IF (i.NE.1) next_blr(i-1)%ISLR=.false.
1082 CALL cmumps_decompress_acc(acc_lrb,maxi_cluster,
1083 & maxi_rank, a, la, poselt_incb, nfront, niv, loru)
1084 ENDIF
1085 ELSE
1086 IF ((k480.EQ.4).AND.(k478.EQ.-1).AND.(acc_lrb%K.GT.0)) THEN
1087 IF (current_blr-frfr_updates.GT.1) THEN
1088 CALL cmumps_recompress_acc(acc_lrb,
1089 & maxi_cluster, maxi_rank, a, la, poselt_incb,
1090 & nfront, niv, midblk_compress, toleps, tol_opt,
1091 & kpercent_rmb, kpercent_lua, new_acc_rank)
1092 ENDIF
1093 ELSEIF ((k480.EQ.4).AND.(k478.LE.-2).AND.(acc_lrb%K.GT.0))
1094 & THEN
1095 allocate(pos_list(current_blr-nb_dec),stat=allocok)
1096 IF (allocok .GT. 0) THEN
1097 iflag = -13
1098 ierror = current_blr-nb_dec
1099 GOTO 100
1100 ENDIF
1101 pos_list(1) = 1
1102 DO ii = 1,current_blr-nb_dec-1
1103 pos_list(ii+1)=pos_list(ii)+j_rank(nb_dec+ii)
1104 ENDDO
1105 CALL cmumps_recompress_acc_narytree(acc_lrb,
1106 & maxi_cluster, maxi_rank, a, la, poselt_incb, keep8,
1107 & nfront, niv, midblk_compress, toleps, tol_opt,
1108 & kpercent_rmb, kpercent_lua, k478,
1109 & j_rank(nb_dec+1:current_blr), pos_list,
1110 & current_blr-nb_dec, 0)
1111 deallocate(pos_list)
1112 ENDIF
1113 CALL cmumps_decompress_acc(acc_lrb,maxi_cluster,
1114 & maxi_rank, a, la, poselt_incb, nfront, niv, loru)
1115 ENDIF
1116 ENDIF
1117 100 CONTINUE
1118 ENDDO
1119#if defined(BLR_MT)
1120
1121#endif