43 & K490, K491, K492, K20, K60, IDAD, K38,
44 & LRSTATUS, N, LRGROUPS)
45 INTEGER,
INTENT(IN) :: INODE, NFRONT, NASS, BLRON, K489, K490,
46 & K491, K492, NIV, K20, K60, IDAD, K38
47 INTEGER,
INTENT(OUT):: LRSTATUS
48 INTEGER,
INTENT(IN):: N
49 INTEGER,
INTENT(IN),
OPTIONAL :: LRGROUPS(N)
52 LOGICAL :: COMPRESS_PANEL, COMPRESS_CB
54 compress_panel = .false.
55 IF ((blron.NE.0).and.(
56 & ((k492.LT.0).and.inode.EQ.abs(k492))
58 & ( (k492.GT.0).and.(k491.LE.nfront)
59 & .and.(k490.LE.nass))))
THEN
60 compress_panel = .true.
63 compress_panel =.false.
65 IF (
present(lrgroups))
THEN
66 IF (lrgroups(inode) .LT. 0) compress_panel = .false.
71 & (k489.GT.0.AND.(k489.NE.2.OR.niv.EQ.2))
73 & ((k492.LT.0).and.inode.EQ.abs(k492))
75 & ((k492.GT.0).AND.(nfront-nass.GT.k491))))
79 IF (.NOT.compress_panel) compress_cb=.false.
80 IF (compress_panel.OR.compress_cb)
THEN
81 IF (compress_cb.AND.(.NOT.compress_panel))
THEN
83 ELSE IF (compress_panel.AND.(.NOT.compress_cb))
THEN
94 IF ( inode .EQ. k20 .AND. k60 .NE. 0 )
THEN
100 IF ( idad .EQ. k38 .AND. k38 .NE.0 )
THEN
101 compress_cb = .false.
102 IF (lrstatus.GE.2)
THEN
269 & NIV, SYM, LorU, IW, OFFSET_IW)
273 INTEGER(8),
intent(in) :: LA
274 INTEGER,
intent(in) :: NFRONT, NIV, SYM, LorU, LDA
275 INTEGER(8),
intent(in) :: POSELT_LOCAL
276 REAL,
intent(inout) :: A(LA)
277 TYPE(LRB_TYPE),
intent(inout) :: LRB
278 INTEGER,
OPTIONAL:: OFFSET_IW
279 INTEGER,
OPTIONAL :: IW(*)
283 INTEGER(8) :: DPOS, POSPV1, POSPV2, OFFDAG
284 INTEGER :: M, N, I, J
285 REAL,
POINTER :: LR_BLOCK_PTR(:,:)
286 REAL :: ONE, MONE, ZERO
287 REAL :: MULT1, MULT2, A11, DETPIV, A22, A12
288 PARAMETER (ONE = 1.0e0, mone=-1.0e0)
289 parameter(zero=0.0e0)
293 lr_block_ptr => lrb%R
296 lr_block_ptr => lrb%Q
302 IF (sym.EQ.0.AND.loru.EQ.0)
THEN
303 CALL strsm(
'R',
'L',
'T',
'N', m, n, one,
304 & a(poselt_local), nfront,
305 & lr_block_ptr(1,1), m)
307 CALL strsm(
'R',
'U',
'N',
'U', m, n, one,
308 & a(poselt_local), lda,
309 & lr_block_ptr(1,1), m)
312 IF (.NOT.
present(offset_iw))
THEN
313 write(*,*)
'Internal error in ',
321 IF(iw(offset_iw+i-1) .GT. 0)
THEN
324 CALL sscal(m, a11, lr_block_ptr(1,i), 1)
325 dpos = dpos + int(lda + 1,8)
330 pospv2 = dpos+ int(lda + 1,8)
335 detpiv = a11*a22 - a12**2
337 a11 = a(pospv2)/detpiv
340 mult1 = a11*lr_block_ptr(j,i)+a12*lr_block_ptr(j,i+1)
341 mult2 = a12*lr_block_ptr(j,i)+a22*lr_block_ptr(j,i+1)
342 lr_block_ptr(j,i) = mult1
343 lr_block_ptr(j,i+1) = mult2
345 dpos = pospv2 + int(lda + 1,8)
395 & A, LA, POSELTT, NFRONT, SYM,
397 & MIDBLK_COMPRESS, TOLEPS, TOL_OPT, KPERCENT,
400C Start of OPTIONAL arguments
404 & DIAG, LD_DIAG, IW2, BLOCK
408 TYPE(
lrb_type),
INTENT(IN) :: LRB1,LRB2
409 INTEGER(8),
intent(in) :: LA
410 REAL,
intent(inout) :: A(LA)
411 INTEGER,
INTENT(IN) :: NFRONT, SYM, TOL_OPT
412 INTEGER,
INTENT(INOUT) :: IFLAG, IERROR
413 INTEGER(8),
INTENT(IN) :: POSELTT
414 REAL,
INTENT(IN),
OPTIONAL :: DIAG(*)
415 INTEGER,
INTENT(IN),
OPTIONAL :: LD_DIAG, IW2(*)
416 INTEGER,
intent(in) :: MIDBLK_COMPRESS, KPERCENT
417 REAL,
intent(in) :: TOLEPS
419 LOGICAL,
INTENT(OUT) :: BUILDQ
420 REAL,
intent(inout),
OPTIONAL :: BLOCK(*)
421 INTEGER,
INTENT(IN),
OPTIONAL :: LorU
422 LOGICAL,
INTENT(IN) :: LUA_ACTIVATED
423 INTEGER,
INTENT(IN),
OPTIONAL :: MAXI_CLUSTER
424 INTEGER,
INTENT(IN),
OPTIONAL :: MAXI_RANK
425 TYPE(LRB_TYPE),
INTENT(INOUT),
OPTIONAL :: LRB3
426 REAL,
POINTER,
DIMENSION(:,:) :: XY_YZ
427 REAL,
ALLOCATABLE,
TARGET,
DIMENSION(:,:) :: XQ, R_Y
428 REAL,
POINTER,
DIMENSION(:,:) :: X, Y, Y1, Y2, Z
429 CHARACTER(len=1) :: SIDE, TRANSY
430 INTEGER :: K_XY, K_YZ, LDY, LDY1, LDY2, K_Y
431 INTEGER :: LDXY_YZ, SAVE_K
432 INTEGER :: I, J, RANK, MAXRANK, INFO, LWORK
433 REAL,
ALLOCATABLE :: RWORK_RRQR(:)
434 REAL,
ALLOCATABLE :: WORK_RRQR(:), TAU_RRQR(:),
436 INTEGER,
ALLOCATABLE :: JPVT_RRQR(:)
437 INTEGER :: allocok, MREQ
438 REAL,
EXTERNAL ::snrm2
439 REAL :: ONE, MONE, ZERO
440 parameter(one = 1.0e0, mone=-1.0e0)
441 parameter(zero=0.0e0)
442 IF (lrb1%M.EQ.0)
THEN
445 IF (lrb2%M.EQ.0)
THEN
449 IF (lrb1%ISLR.AND.lrb2%ISLR)
THEN
450 IF ((lrb1%K.EQ.0).OR.(lrb2%K.EQ.0))
THEN
453 allocate(y(lrb1%K,lrb2%K),stat=allocok)
454 IF (allocok > 0)
THEN
463 allocate(y1(lrb1%K,lrb1%N),stat=allocok)
464 IF (allocok > 0)
THEN
470 y1(i,j) = lrb1%R(i,j)
474 & ld_diag, iw2, poseltt, nfront, block,
481 CALL sgemm(
'N',
'T', lrb1%K, lrb2%K, k_y, one,
482 & y1(1,1), ldy1, y2(1,1), ldy2, zero, y(1,1), lrb1%K )
483 IF (midblk_compress.GE.1)
THEN
484 lwork = lrb2%K*(lrb2%K+1)
485 allocate(y_rrqr(lrb1%K,lrb2%K),
486 & work_rrqr(lwork), rwork_rrqr(2*lrb2%K),
487 & tau_rrqr(
min(lrb1%K,lrb2%K)),
488 & jpvt_rrqr(lrb2%K),stat=allocok)
489 IF (allocok > 0)
THEN
490 mreq = lrb1%K*lrb2%K + lwork + 2*lrb2%K +
491 &
min(lrb1%K,lrb2%K) + lrb2%K
499 maxrank =
min(lrb1%K, lrb2%K)-1
500 maxrank =
max(1, int((maxrank*kpercent/100)))
503 & lrb1%K, jpvt_rrqr, tau_rrqr, work_rrqr,
504 & lrb2%K, rwork_rrqr, toleps, tol_opt, rank,
507 IF (rank.GT.maxrank)
THEN
508 deallocate(y_rrqr, work_rrqr, rwork_rrqr, tau_rrqr,
516 deallocate(y_rrqr, work_rrqr, rwork_rrqr, tau_rrqr,
523 IF (sym .NE. 0)
deallocate(y1)
526 allocate(xq(lrb1%M,rank), r_y(rank,lrb2%K),
528 IF (allocok > 0)
THEN
529 mreq = lrb1%M*rank + rank*lrb2%K
533 r_y(1:
min(rank,j),jpvt_rrqr(j)) =
534 & y_rrqr(1:
min(rank,j),j)
535 IF(j.LT.rank) r_y(
min(rank,j)+1:
536 & rank,jpvt_rrqr(j))= zero
541 & (lrb1%K, rank, rank, y_rrqr(1,1),
542 & lrb1%K, tau_rrqr(1),
543 & work_rrqr(1), lwork, info )
544 CALL sgemm(
'N',
'N', lrb1%M, rank, lrb1%K, one,
545 & x(1,1), lrb1%M, y_rrqr(1,1), lrb1%K, zero,
547 deallocate(y_rrqr, work_rrqr, rwork_rrqr, tau_rrqr,
562 IF (.NOT.buildq)
THEN
574 IF (lrb1%ISLR.AND.(.NOT.lrb2%ISLR))
THEN
575 IF (lrb1%K.EQ.0)
THEN
587 allocate(y(lrb1%K,lrb1%N),stat
588 IF (allocok > 0)
THEN
598 & ld_diag, iw2, poseltt, nfront, block,
603 IF ((.NOT.lrb1%ISLR).AND.lrb2%ISLR)
THEN
604 IF (lrb2%K.EQ.0)
THEN
615 allocate(y(lrb2%K,lrb2%N),stat=allocok)
616 IF (allocok > 0)
THEN
626 & ld_diag, iw2, poseltt, nfront, block,
632 IF ((.NOT.lrb1%ISLR).AND.(.NOT.lrb2%ISLR))
THEN
636 allocate(x(lrb1%M,lrb1%N),stat=allocok)
637 IF (allocok > 0)
THEN
647 & ld_diag, iw2, poseltt, nfront, block,
654 IF (lua_activated)
THEN
656 IF (side ==
'L')
THEN
658 ELSEIF (side ==
'R')
THEN
662 IF (side ==
'L')
THEN
663 IF (.NOT.lua_activated)
THEN
664 allocate(xy_yz(lrb1%M,k_yz),stat=allocok)
665 IF (allocok > 0)
THEN
671 IF (save_k+k_yz.GT.maxi_rank)
THEN
672 write(*,*)
'Internal error in SMUMPS_LRGEMM4 1a',
673 &
'K_ACC+K_CUR>K_MAX:',save_k,k_yz,maxi_rank
676 IF (lrb3%M.NE.lrb1%M)
THEN
677 write(*,*)
'Internal error in SMUMPS_LRGEMM4 1b',
678 &
'LRB1%M =/= LRB3%M',lrb1%M,lrb3%M
681 xy_yz => lrb3%Q(1:lrb1%M,save_k+1:save_k+k_yz)
682 ldxy_yz = maxi_cluster
684 lrb3%R(save_k+i,1:lrb2%M) = z(1:lrb2%M,i)
687 CALL sgemm(
'N', transy, lrb1%M, k_yz, k_xy, one,
688 & x(1,1), lrb1%M, y(1,1), ldy, zero, xy_yz(1,1),
690 IF (.NOT.lua_activated)
THEN
691 CALL sgemm(
'N',
'T', lrb1%M, lrb2%M, k_yz, alpha,
692 & xy_yz(1,1), lrb1%M, z(1,1), lrb2%M, beta,
693 & a(poseltt), nfront)
696 ELSEIF (side ==
'R')
THEN
697 IF (.NOT.lua_activated)
THEN
698 allocate(xy_yz(k_xy,lrb2%M),stat=allocok)
699 IF (allocok > 0)
THEN
705 IF (save_k+k_xy.GT.maxi_rank)
THEN
706 write(*,*)
'Internal error in SMUMPS_LRGEMM4 2a',
707 &
'K_ACC+K_CUR>K_MAX:',save_k,k_xy,maxi_rank
710 IF (lrb3%N.NE.lrb2%M)
THEN
711 write(*,*)
'Internal error in SMUMPS_LRGEMM4 2b',
712 &
'LRB2%M =/= LRB3%N',lrb2%M,lrb3%N
715 xy_yz => lrb3%R(save_k+1:save_k+k_xy,1:lrb2%M)
718 lrb3%Q(1:lrb1%M,save_k+i) = x(1:lrb1%M,i)
721 CALL sgemm(transy,
'T', k_xy, lrb2%M, k_yz, one,
722 & y(1,1), ldy, z(1,1), lrb2%M, zero, xy_yz(1,1),
724 IF (.NOT.lua_activated)
THEN
725 CALL sgemm(
'N',
'N', lrb1%M, lrb2%M, k_xy, alpha,
726 & x(1,1), lrb1%M, xy_yz(1,1), k_xy, beta, a(poseltt),
731 CALL sgemm(
'N',
'T', lrb1%M, lrb2%M, k_xy, alpha,
732 & x(1,1), lrb1%M, z(1,1), lrb2%M, beta, a(poseltt),
743 IF ((.NOT.lrb1%ISLR).AND.(.NOT.lrb2%ISLR))
THEN
744 IF (sym .NE. 0)
deallocate(x)
745 ELSEIF ((.NOT.lrb1%ISLR).AND.lrb2%ISLR)
THEN
746 IF (sym .NE. 0)
deallocate(y)
747 ELSEIF (lrb1%ISLR.AND.(.NOT.lrb2%ISLR))
THEN
748 IF (sym .NE. 0)
deallocate(y)
750 IF (sym .NE. 0)
deallocate(y1)
751 IF ((midblk_compress.GE.1).AND.buildq)
THEN
786 & MAXI_RANK, A, LA, POSELTT, NFRONT, NIV,
787 & TOLEPS, TOL_OPT, KPERCENT, BUILDQ, LorU, CB_COMPRESS)
788 TYPE(
lrb_type),
INTENT(INOUT) :: ACC_LRB
789 INTEGER(8),
intent(in) :: LA
790 REAL,
intent(inout) :: A(LA)
791 INTEGER,
INTENT(IN) :: NFRONT, , LorU, TOL_OPT
792 INTEGER,
INTENT(IN) :: MAXI_CLUSTER, MAXI_RANK, KPERCENT
793 INTEGER(8),
INTENT(IN) :: POSELTT
794 REAL,
intent(in) :: TOLEPS
795 LOGICAL,
INTENT(OUT) :: BUILDQ
796 LOGICAL,
INTENT(IN) :: CB_COMPRESS
797 REAL,
ALLOCATABLE :: RWORK_RRQR(:)
798 REAL,
ALLOCATABLE :: WORK_RRQR(:), TAU_RRQR(:)
799 INTEGER,
ALLOCATABLE :: JPVT_RRQR(:)
800 INTEGER :: INFO, RANK, MAXRANK, LWORK
802 INTEGER :: allocok, MREQ
804 PARAMETER (ONE = 1.0e0, mone=-1.0e0)
805 parameter(zero=0.0e0)
808 maxrank = floor(real(m*n)/real(m+n))
809 maxrank =
max(1, int((maxrank*kpercent/100)))
811 allocate(work_rrqr(lwork), rwork_rrqr(2*n),
813 & jpvt_rrqr(n), stat=allocok)
814 IF (allocok > 0)
THEN
820 & - a(poseltt+int(i-1,8)*int(nfront,8) :
821 & poseltt+int(i-1,8)*int(nfront,8) + int(m-1,8) )
825 & maxi_cluster, jpvt_rrqr(1), tau_rrqr(1),
827 & n, rwork_rrqr(1), toleps, tol_opt,
828 & rank, maxrank, info,
832 acc_lrb%R(1:
min(rank,j),jpvt_rrqr(j)) =
833 & acc_lrb%Q(1:
min(rank,j),j)
834 IF(j.LT.rank) acc_lrb%R(
min(rank,j)+1:
835 & rank,jpvt_rrqr(j))= zero
838 & (m, rank, rank, acc_lrb%Q(1,1),
839 & maxi_cluster, tau_rrqr(1),
840 & work_rrqr(1), lwork, info )
842 a( poseltt+int(i-1,8)*int(nfront,8) :
843 & poseltt+int(i-1,8)*int(nfront,8)+int(m-1,8) ) = zero
849 acc_lrb%ISLR = .false.
851 acc_lrb%ISLR = .true.
854 deallocate(jpvt_rrqr, tau_rrqr, work_rrqr, rwork_rrqr)
858 write(*,*)
'Allocation problem in BLR routine
859 & SMUMPS_COMPRESS_FR_UPDATES: ',
860 &
'not enough memory? memory requested = ' , mreq
865 & MAXI_RANK, A, LA, POSELTT, NFRONT, NIV,
866 & MIDBLK_COMPRESS, TOLEPS, TOL_OPT, KPERCENT_RMB,
867 & KPERCENT_LUA, NEW_ACC_RANK)
868 TYPE(
lrb_type),
INTENT(INOUT) :: acc_lrb
869 INTEGER(8),
intent(in) :: la
870 REAL,
intent(inout) :: a(la)
871 INTEGER,
INTENT(IN) :: NFRONT, NIV, TOL_OPT
872 INTEGER :: IFLAG, IERROR
873 INTEGER,
INTENT(IN) :: MAXI_CLUSTER, MAXI_RANK, KPERCENT_LUA
874 INTEGER,
INTENT(INOUT) :: NEW_ACC_RANK
875 INTEGER(8),
INTENT(IN) ::
876 INTEGER,
intent(in) :: MIDBLK_COMPRESS, KPERCENT_RMB
877 REAL,
intent(in) :: TOLEPS
878 REAL,
ALLOCATABLE :: RWORK_RRQR(:)
879 REAL,
ALLOCATABLE :: WORK_RRQR(:), TAU_RRQR(:)
880 REAL,
ALLOCATABLE,
DIMENSION(:,:),
TARGET :: Q1, R1,
882 INTEGER,
ALLOCATABLE :: JPVT_RRQR(:)
883 TYPE(LRB_TYPE) :: LRB1, LRB2
884 INTEGER :: INFO, RANK1, RANK2, RANK, , LWORK
885 LOGICAL :: BUILDQ, BUILDQ1, BUILDQ2, SKIP1, SKIP2
886 INTEGER :: , J, M, N, K
887 INTEGER :: allocok, MREQ
889 parameter(one = 1.0e0, mone=-1.0e0)
890 parameter(zero=0.0e0)
899 maxrank =
max(1, int((maxrank*kpercent_lua/100)))
903 & maxi_cluster, maxi_rank, a, la, poseltt,
904 & nfront, niv, midblk_compress, toleps,
905 & tol_opt, kpercent_rmb, kpercent_lua,
909 maxrank =
max (1, int((maxrank*kpercent_lua/100)))
914 IF (skip1.AND.skip2)
GOTO 1600
915 allocate(q1(m,k), q2(n,k),
919 & jpvt_rrqr(k), stat=allocok)
920 IF (allocok > 0)
THEN
921 mreq = lwork + m*n + n*k+ 4 * k
929 q1(i,j) = acc_lrb%Q(i,j)
934 & m, jpvt_rrqr(1), tau_rrqr(1), work_rrqr(1),
935 & k, rwork_rrqr(1), toleps, tol_opt, rank1,
940 allocate(r1(rank1,k), stat=allocok)
941 IF (allocok > 0)
THEN
946 r1(1:
min(rank1,j),jpvt_rrqr(j)) =
947 & q1(1:
min(rank1,j),j)
948 IF(j.LT.rank1) r1(
min(rank1,j)+1:
949 & rank1,jpvt_rrqr(j))= zero
952 & (m, rank1, rank1, q1(1,1),
954 & work_rrqr(1), lwork, info )
961 q2(i,j) = acc_lrb%R(j,i)
966 & n, jpvt_rrqr(1), tau_rrqr(1), work_rrqr(1),
967 & k, rwork_rrqr(1), toleps, tol_opt,
968 & rank2, maxrank, info,
972 allocate(r2(rank2,k), stat=allocok)
973 IF (allocok > 0)
THEN
978 r2(1:
min(rank2,j),jpvt_rrqr(j)) =
979 & q2(1:
min(rank2,j),j)
980 IF(j.LT.rank2) r2(
min(rank2,j)+1:
981 & rank2,jpvt_rrqr(j))= zero
984 & (n, rank2, rank2, q2(1,1),
986 & work_rrqr(1), lwork, info )
988 CALL init_lrb(lrb1,rank1,m,k,buildq1)
989 CALL init_lrb(lrb2,rank2,n,k,buildq2)
990 IF (buildq1.OR.buildq2)
THEN
996 q1(i,j) = acc_lrb%Q(i,j)
1006 q2(i,j) = acc_lrb%R(j,i)
1013 & a, la, poseltt, nfront, 0, iflag, ierror,
1014 & midblk_compress-1, toleps, tol_opt,
1016 & rank, buildq, .true., lrb3=acc_lrb,
1017 & maxi_rank=maxi_rank, maxi_cluster=maxi_cluster)
1018 IF (iflag.LT.0)
GOTO 100
1020 & midblk_compress-1, rank, buildq,
1021 & .true., .false., rec_acc=.true.)
1028 IF (buildq1)
deallocate(r1)
1029 IF (buildq2)
deallocate(r2)
1030 deallocate(jpvt_rrqr, tau_rrqr, work_rrqr, rwork_rrqr)
1031 IF (skip1.AND.(rank2.GT.0))
THEN
1041 write(*,*)
'Allocation problem in BLR routine
1042 & SMUMPS_RECOMPRESS_ACC: ',
1043 &
'not enough memory? memory requested = ' , mreq
1048 & ACC_LRB, MAXI_CLUSTER, MAXI_RANK, A, LA, POSELTT, KEEP8,
1049 & NFRONT, NIV, MIDBLK_COMPRESS, TOLEPS, TOL_OPT,
1051 & KPERCENT_LUA, K478, RANK_LIST, POS_LIST, NB_NODES,
1053 TYPE(
lrb_type),
TARGET,
INTENT(INOUT) :: acc_lrb
1054 TYPE(
lrb_type),
TARGET,
INTENT(INOUT),
OPTIONAL :: acc_tmp
1055 INTEGER(8),
intent(in) :: la
1056 REAL,
intent(inout) :: a(la)
1057 INTEGER,
INTENT(IN) :: nfront, niv, tol_opt
1058 INTEGER,
INTENT(IN) :: maxi_cluster, maxi_rank, kpercent_lua
1059 INTEGER(8),
INTENT(IN) :: poseltt
1060 INTEGER(8) :: keep8(150)
1061 INTEGER,
intent(in) :: midblk_compress, kpercent_rmb
1062 REAL,
intent(in) :: toleps
1063 INTEGER,
INTENT(IN) :: k478, nb_nodes, level
1064 INTEGER,
INTENT(INOUT) :: rank_list(nb_nodes), pos_list(nb_nodes)
1068 INTEGER :: i, j, m, n, l, node_rank, nary, ioff, imax, curpos
1069 INTEGER :: nb_nodes_new, ktot, new_acc_rank
1070 INTEGER,
ALLOCATABLE :: rank_list_new(:), pos_list_new(:)
1071 REAL :: one, mone, zero
1072 parameter(one = 1.0e0, mone=-1.0e0)
1073 parameter(zero=0.0e0)
1080 nb_nodes_new = nb_nodes/nary
1081 IF (nb_nodes_new*nary.NE.nb_nodes)
THEN
1082 nb_nodes_new = nb_nodes_new + 1
1084 ALLOCATE(rank_list_new(nb_nodes_new),pos_list_new(nb_nodes_new),
1086 IF (allocok > 0)
THEN
1087 write(*,*)
'Allocation error of RANK_LIST_NEW/POS_LIST_NEW ',
1088 &
'in SMUMPS_RECOMPRESS_ACC_NARYTREE'
1092 node_rank = rank_list(ioff+1)
1093 curpos = pos_list(ioff+1)
1094 imax =
min(nary,nb_nodes-ioff)
1097 IF (pos_list(ioff+i).NE.curpos+node_rank)
THEN
1098 DO l=0,rank_list(ioff+i)-1
1099 acc_lrb%Q(1:m,curpos+node_rank+l) =
1100 & acc_lrb%Q(1:m,pos_list(ioff+i)+l)
1101 acc_lrb%R(curpos+node_rank+l,1:n) =
1102 & acc_lrb%R(pos_list(ioff+i)+l,1:n)
1104 pos_list(ioff+i) = curpos+node_rank
1106 node_rank = node_rank+rank_list(ioff+i)
1108 CALL init_lrb(lrb,node_rank,m,n,.true.)
1109 IF (.NOT.resort.OR.level.EQ.0)
THEN
1110 lrb%Q => acc_lrb%Q(1:m,curpos:curpos+node_rank)
1111 lrb%R => acc_lrb%R(curpos:curpos+node_rank,1:n)
1113 lrb%Q => acc_tmp%Q(1:m,curpos:curpos+node_rank)
1114 lrb%R => acc_tmp%R(curpos:curpos+node_rank,1:n)
1116 new_acc_rank = node_rank-rank_list(ioff+1)
1117 IF (new_acc_rank.GT.0)
THEN
1119 & maxi_cluster, maxi_rank, a, la, poseltt,
1120 & nfront, niv, midblk_compress, toleps,
1121 & tol_opt, kpercent_rmb, kpercent_lua, new_acc_rank)
1123 rank_list_new(j) = lrb%K
1124 pos_list_new(j) = curpos
1126 rank_list_new(j) = node_rank
1127 pos_list_new(j) = curpos
1131 IF (nb_nodes_new.GT.1)
THEN
1133 ktot = sum(rank_list_new)
1134 CALL init_lrb(acc_new,ktot,m,n,.true.)
1135 ALLOCATE(acc_new%Q(maxi_cluster,maxi_rank),
1136 & acc_new%R(maxi_rank,maxi_cluster), stat=allocok)
1137 IF (allocok > 0)
THEN
1138 write(*,*)
'Allocation error of ACC_NEW%Q/ACC_NEW%R ',
1139 &
'in SMUMPS_RECOMPRESS_ACC_NARYTREE'
1145 IF (level.EQ.0)
THEN
1151 DO l=0,rank_list_new(j)-1
1152 acc_new%Q(1:m,curpos+l) =
1153 & lrb_ptr%Q(1:m,pos_list_new(j)+l)
1154 acc_new%R(curpos+l,1:n) =
1155 & lrb_ptr%R(pos_list_new(j)+l,1:n)
1157 pos_list_new(j) = curpos
1158 curpos = curpos + rank_list_new(j)
1160 IF (level.GT.0)
THEN
1164 & maxi_cluster, maxi_rank, a, la, poseltt, keep8,
1165 & nfront, niv, midblk_compress, toleps, tol_opt,
1166 & kpercent_rmb, kpercent_lua, k478,
1167 & rank_list_new, pos_list_new, nb_nodes_new,
1171 & maxi_cluster, maxi_rank, a, la, poseltt, keep8,
1172 & nfront, niv, midblk_compress, toleps, tol_opt,
1173 & kpercent_rmb, kpercent_lua, k478,
1174 & rank_list_new, pos_list_new, nb_nodes_new, level+1)
1177 IF (pos_list_new(1).NE.1)
THEN
1178 write(*,*)
'Internal error in ',
1179 &
'SMUMPS_RECOMPRESS_ACC_NARYTREE', pos_list_new(1)
1181 acc_lrb%K = rank_list_new(1)
1182 IF (resort.AND.level.GT.0)
THEN
1185 acc_lrb%Q(i,l) = acc_tmp%Q(i,l)
1188 acc_lrb%R(l,i) = acc_tmp%R(l,i)
1194 DEALLOCATE(rank_list_new, pos_list_new)
1608 SUBROUTINE SMUMPS_TRUNCATED_RRQR( M, N, A, LDA, JPVT, TAU, WORK,
1609 & LDW, RWORK, TOLEPS, TOL_OPT, RANK, MAXRANK, INFO,
1668 INTEGER :: INFO, LDA, LDW, M, N, RANK, MAXRANK
1684 REAL :: A(LDA,*), TAU(*)
1687 REAL :: TOLEPS_EFF, TRUNC_ERR
1688 INTEGER, PARAMETER :: INB=1, INBMIN=2
1689 INTEGER :: J, JB, MINMN, NB
1690 INTEGER :: OFFSET, ITEMP
1691 INTEGER :: LSTICC, PVT, K, RK
1692 REAL :: TEMP, TEMP2, TOL3Z
1694 LOGICAL INADMISSIBLE
1695 REAL, PARAMETER :: RZERO=0.0E+0, RONE=1.0E+0
1698 PARAMETER ( ONE = 1.0E+0 )
1699 PARAMETER ( ZERO = 0.0E+0 )
1701 INTEGER :: ilaenv, isamax
1702 EXTERNAL :: isamax, slamch
1703 EXTERNAL sgeqrf, sormqr, xerbla
1705 EXTERNAL sgemm, sgemv, slarfg, sswap
1706 REAL, EXTERNAL :: snrm2
1711.LT.
ELSE IF( N0 ) THEN
1713.LT.
ELSE IF( LDAMAX( 1, M ) ) THEN
1716.EQ.
IF( INFO0 ) THEN
1721.NE.
IF( INFO0 ) THEN
1726.EQ.
IF( MINMN0 ) THEN
1730 NB = ilaenv( INB, 'cgeqrf', ' ', M, N, -1, -1 )
1731 SELECT CASE(abs(TOL_OPT))
1755 RWORK( J ) = snrm2( M, A( 1, J ), 1 )
1757 RWORK( N + J ) = RWORK( J )
1760.LT.
IF (TOL_OPT0) THEN
1763 TRUNC_ERR = snrm2( N, RWORK( 1 ), 1 )
1766 TOL3Z = SQRT(slamch('epsilon
'))
1768 JB = MIN(NB,MINMN-OFFSET)
1776 PVT = ( RK-1 ) + isamax( N-RK+1, RWORK( RK ), 1 )
1779.EQ.
IF (abs(TOL_OPT)2) TOLEPS_EFF = RWORK(PVT)*TOLEPS
1781.GT.
IF (TOL_OPT0) THEN
1783 TRUNC_ERR = RWORK(PVT)
1787.LT.
IF(TRUNC_ERRTOLEPS_EFF) THEN
1792.GT.
INADMISSIBLE = (RKMAXRANK)
1793 IF (INADMISSIBLE) THEN
1799.NE.
IF( PVTRK ) THEN
1800 CALL sswap( M, A( 1, PVT ), 1, A( 1, RK ), 1 )
1803 CALL sswap( K-1, WORK( PVT-OFFSET, 2 ), LDW,
1804 & WORK( K, 2 ), LDW )
1806 JPVT(PVT) = JPVT(RK)
1810 RWORK(PVT) = RWORK(RK)
1811 RWORK(N+PVT) = RWORK(N+RK)
1816 CALL sgemv( 'no transpose
', M-RK+1, K-1, -ONE,
1818 & A(RK,OFFSET+1), LDA, WORK(K,2), LDW,
1819 & ONE, A(RK,RK), 1 )
1823 CALL slarfg( M-RK+1, A(RK,RK), A(RK+1,RK), 1, TAU(RK) )
1825 CALL slarfg( 1, A(RK,RK), A(RK,RK), 1, TAU(RK) )
1832 CALL sgemv( 'transpose
', M-RK+1, N-RK, TAU(RK),
1833 & A(RK,RK+1), LDA, A(RK,RK), 1, ZERO,
1835 & WORK( K+1, K+1 ), 1 )
1840 WORK( J, K+1 ) = ZERO
1846 CALL sgemv( 'transpose
', M-RK+1, K-1, -TAU(RK),
1847 & A(RK,OFFSET+1), LDA, A(RK,RK), 1, ZERO,
1850 CALL sgemv( 'no transpose', n-offset, k-1, one,
1851 & work(1,2), ldw, work(1,1), 1, one, work(1,k+1), 1 )
1858 CALL sgemv(
'No Transpose', n-rk, k, -one, work( k+1,2 ),
1860 & a( rk, offset+1 ), lda, one, a( rk, rk+1 ), lda )
1864 IF( rk.LT.minmn )
THEN
1867 IF( rwork( j ).NE.rzero )
THEN
1873 temp = abs( a( rk, j ) ) / rwork( j )
1874 temp =
max( rzero, ( rone+temp )*( rone-temp ) )
1876 temp2 = temp*( rwork( j ) / rwork( n+j ) )**2
1877 IF( temp2 .LE. tol3z )
THEN
1879 rwork( n+j ) = real( lsticc )
1883 rwork( j ) = rwork( j )*sqrt( temp )
1889 IF (lsticc.NE.0)
EXIT
1890 IF (tol_opt.LT.0)
THEN
1893 trunc_err =
snrm2( n-rk, rwork( rk+1 ), 1 )
1899 IF( rk.LT.
min(n,m) )
THEN
1900 CALL sgemm(
'No transpose',
'Transpose', m-rk,
1901 & n-rk, k, -one, a(rk+1,offset+1), lda,
1903 & work(k+1,2), ldw, one, a(rk+1,rk+1), lda )
1906 DO WHILE( lsticc.GT.0 )
1908 itemp = nint( rwork( n + lsticc ) )
1910 rwork( lsticc ) =
snrm2( m-rk, a( rk+1, lsticc ), 1 )
1917 rwork( n + lsticc ) = rwork( lsticc )
1920 IF(rk.GE.minmn)
EXIT
1922 IF (tol_opt.LT.0)
THEN
1925 trunc_err =
snrm2( n-rk, rwork( rk+1 ), 1 )
1929 islr = .NOT.(rk.GT.maxrank)
1931 999
FORMAT (
'On entry to SMUMPS_TRUNCATED_RRQR, parameter number',
1932 & i2,
' had an illegal value')