29 TYPE(
lrb_type),
INTENT(OUT) :: LRB_OUT
30 INTEGER,
INTENT(IN) :: K,M,N
31 LOGICAL,
INTENT(IN) :: ISLR
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
110 SUBROUTINE alloc_lrb(LRB_OUT,K,M,N,ISLR,IFLAG,IERROR,KEEP8)
111 TYPE(
lrb_type),
INTENT(OUT) :: LRB_OUT
112 INTEGER,
INTENT(IN) :: K,M,N
113 INTEGER,
INTENT(INOUT) :: IFLAG, IERROR
114 LOGICAL,
INTENT(IN) :: ISLR
115 INTEGER(8) :: KEEP8(150)
116 INTEGER :: MEM, allocok
117 DOUBLE PRECISION :: ZERO
118 parameter(zero = 0.0d0)
123 IF ((m.EQ.0).OR.(n.EQ.0))
THEN
133 allocate(lrb_out%Q(m,k),lrb_out%R(k,n),stat=allocok)
134 IF (allocok > 0)
THEN
142 allocate(lrb_out%Q(m,n),stat=allocok)
143 IF (allocok > 0)
THEN
155 & .true., keep8, iflag, ierror, .true., .true.)
159 & IFLAG, IERROR, KEEP8)
160 TYPE(
lrb_type),
INTENT(IN) :: ACC_LRB
161 TYPE(
lrb_type),
INTENT(OUT) :: LRB_OUT
162 INTEGER,
INTENT(IN) :: K, M, N, LorU
163 INTEGER,
INTENT(INOUT) :: IFLAG, IERROR
167 CALL alloc_lrb(lrb_out,k,m,n,.true.,iflag,ierror,keep8)
168 IF (iflag.LT.0)
RETURN
170 lrb_out%Q(1:m,i) = acc_lrb%Q(1:m,i)
171 lrb_out%R(i,1:n) = -acc_lrb%R(i,1:n)
174 CALL alloc_lrb(lrb_out,k,n,m,.true.,iflag,ierror,keep8)
175 IF (iflag.LT.0)
RETURN
177 lrb_out%Q(1:n,i) = acc_lrb%R(i,1:n)
178 lrb_out%R(i,1:m) = -acc_lrb%Q(1:m,i)
183 & NPARTSCB, NCB, IBCKSZ, ONLYCB, K472)
184 INTEGER,
INTENT(IN) :: IBCKSZ, NASS, NCB
185 INTEGER,
INTENT(INOUT) :: NPARTSCB, NPARTSASS
186 INTEGER,
POINTER,
DIMENSION(:) :: CUT
187 INTEGER,
POINTER,
DIMENSION(:) :: NEW_CUT
188 INTEGER :: , INEW, MINSIZE, NEW_NPARTSASS, allocok
189 LOGICAL :: ONLYCB, TRACE
190 INTEGER,
INTENT(IN) :: K472
191 INTEGER :: IBCKSZ2,IFLAG,IERROR
192 ALLOCATE(new_cut(
max(npartsass,1)+npartscb+1),stat=allocok)
193 IF (allocok > 0)
THEN
195 ierror =
max(npartsass,1)+npartscb+1
196 write(*,*)
'Allocation problem in BLR routine REGROUPING2:',
197 &
' not enough memory? memory requested = ' , ierror
201 minsize = int(ibcksz2 / 2)
202 new_npartsass =
max(npartsass,1)
203 IF (.NOT. onlycb)
THEN
207 DO WHILE (i .LE. npartsass + 1)
208 new_cut(inew) = cut(i)
210 IF (new_cut(inew) - new_cut(inew-1) .GT. minsize)
THEN
219 IF (inew .NE. 2)
THEN
220 new_cut(inew-1) = new_cut(inew)
224 new_npartsass = inew - 1
227 DO i=1,
max(npartsass,1)+1
231 IF (ncb .EQ. 0)
GO TO 50
232 inew = new_npartsass+2
233 i =
max(npartsass,1) + 2
234 DO WHILE (i .LE.
max(npartsass,1) + npartscb + 1)
235 new_cut(inew) = cut(i)
237 IF (new_cut(inew) - new_cut(inew-1) .GT. minsize)
THEN
246 IF (inew .NE. new_npartsass+2)
THEN
247 new_cut(inew-1) = new_cut(inew)
251 npartscb = inew - 1 - new_npartsass
253 npartsass = new_npartsass
255 ALLOCATE(cut(npartsass+npartscb+1),stat=allocok)
256 IF (allocok > 0)
THEN
258 ierror = npartsass+npartscb+1
259 write(*,*)
'Allocation problem in BLR routine REGROUPING2:',
260 &
' not enough memory? memory requested = ' , ierror
263 DO i=1,npartsass+npartscb+1
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 DOUBLE PRECISION,
intent(inout) :: A(LA)
277 TYPE(LRB_TYPE),
intent(inout) :: LRB
278 INTEGER,
OPTIONAL:: OFFSET_IW
279 INTEGER,
OPTIONAL :: IW(*)
283 INTEGER(8) :: DPOS, , POSPV2, OFFDAG
284 INTEGER :: M, N, I, J
285 DOUBLE PRECISION,
POINTER :: LR_BLOCK_PTR(:,:)
286 DOUBLE PRECISION :: ONE, MONE, ZERO
287 DOUBLE PRECISION :: MULT1, MULT2, A11, DETPIV, A22, A12
288 PARAMETER ( = 1.0d0, mone=-1.0d0)
289 parameter(zero=0.0d0)
293 lr_block_ptr => lrb%R
296 lr_block_ptr => lrb%Q
302 IF (sym.EQ.0.AND.loru.EQ.0)
THEN
303 CALL dtrsm(
'R',
'L',
'T',
'N', m, n, one,
304 & a(poselt_local), nfront,
305 & lr_block_ptr(1,1), m)
307 CALL dtrsm(
'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 dscal(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)
355 & LD_DIAG, IW2, POSELTT, NFRONT, BLOCK, MAXI_CLUSTER)
359 INTEGER(8),
intent(in) :: la
360 DOUBLE PRECISION,
intent(inout) :: a(la)
361 DOUBLE PRECISION,
intent(inout),
DIMENSION(:,:) :: SCALED
362 INTEGER,
INTENT(IN) :: LD_DIAG, NFRONT, IW2(*)
363 INTEGER(8),
INTENT(IN) :: POSELTT
364 DOUBLE PRECISION,
INTENT(IN),
OPTIONAL :: DIAG(*)
365 INTEGER,
INTENT(IN) :: MAXI_CLUSTER
366 DOUBLE PRECISION,
intent(inout) :: BLOCK(MAXI_CLUSTER)
375 DO WHILE (j <= lrb%N)
377 scaled(1:nrows,j) = diag(1+ld_diag*(j-1)+j-1)
378 & * scaled(1:nrows,j)
381 piv1 = diag(1+ld_diag*(j-1)+j-1)
382 piv2 = diag(1+ld_diag*j+j)
383 offdiag = diag(1+ld_diag*(j-1)+j)
384 block(1:nrows) = scaled(1:nrows,j)
385 scaled(1:nrows,j) = piv1 * scaled(1:nrows,j)
386 & + offdiag * scaled(1:nrows,j+1)
387 scaled(1:nrows,j+1) = offdiag * block(1:nrows)
388 & + piv2 * scaled(1:nrows,j+1)
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 DOUBLE PRECISION,
intent(inout) :: A(LA)
411 INTEGER,
INTENT(IN) :: , SYM, TOL_OPT
412 INTEGER,
INTENT(INOUT) :: IFLAG, IERROR
413 INTEGER(8),
INTENT(IN) :: POSELTT
414 DOUBLE PRECISION,
INTENT(IN),
OPTIONAL :: DIAG(*)
415 INTEGER,
INTENT(IN),
OPTIONAL :: LD_DIAG, IW2(*)
416 INTEGER,
intent(in) :: MIDBLK_COMPRESS, KPERCENT
417 DOUBLE PRECISION,
intent(in) :: TOLEPS
418 DOUBLE PRECISION :: ALPHA,BETA
419 LOGICAL,
INTENT(OUT) :: BUILDQ
420 DOUBLE PRECISION,
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 DOUBLE PRECISION,
POINTER,
DIMENSION(:,:) :: XY_YZ
427 DOUBLE PRECISION,
ALLOCATABLE,
TARGET,
DIMENSION(:,:) :: XQ, R_Y
428 DOUBLE PRECISION,
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 DOUBLE PRECISION,
ALLOCATABLE :: RWORK_RRQR(:)
434 DOUBLE PRECISION,
ALLOCATABLE :: WORK_RRQR(:), TAU_RRQR(:),
436 INTEGER,
ALLOCATABLE :: JPVT_RRQR(:)
437 INTEGER :: allocok, MREQ
438 DOUBLE PRECISION,
EXTERNAL ::dnrm2
439 DOUBLE PRECISION :: , MONE, ZERO
440 parameter(one = 1.0d0, mone=-1.0d0)
441 parameter(zero=0.0d0)
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 dgemm(
'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
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 dgemm(
'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
567 IF (lrb1%K .GE. lrb2%K)
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=allocok)
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 DMUMPS_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 DMUMPS_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 dgemm(
'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 dgemm(
'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 DMUMPS_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 DMUMPS_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 dgemm(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 dgemm(
'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 dgemm(
'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
761 & MAXI_RANK, A, LA, POSELTT, NFRONT, NIV, LorU,
763 TYPE(
lrb_type),
INTENT(INOUT) :: ACC_LRB
764 INTEGER(8),
intent(in) :: LA
765 DOUBLE PRECISION,
intent(inout) :: A(LA)
766 INTEGER,
INTENT(IN) :: NFRONT,
767 INTEGER,
INTENT(IN) :: MAXI_CLUSTER, MAXI_RANK
768 INTEGER(8),
INTENT(IN) :: POSELTT
769 LOGICAL,
OPTIONAL :: COUNT_FLOPS
770 LOGICAL :: COUNT_FLOPS_LOC
772 DOUBLE PRECISION :: ONE, MONE, ZERO
773 parameter(one = 1.0d0, mone=-1.0d0)
774 parameter(zero=0.0d0)
775 IF (
present(count_flops))
THEN
776 count_flops_loc=count_flops
778 count_flops_loc=.true.
780 CALL dgemm(
'N',
'N', acc_lrb%M, acc_lrb%N, acc_lrb%K,
781 & mone, acc_lrb%Q(1,1), maxi_cluster, acc_lrb%R(1,1),
782 & maxi_rank, one, a(poseltt), nfront)
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 DOUBLE PRECISION,
intent(inout) :: A(LA)
791 INTEGER,
INTENT(IN) :: NFRONT, NIV, LorU, TOL_OPT
792 INTEGER,
INTENT(IN) :: MAXI_CLUSTER, MAXI_RANK, KPERCENT
793 INTEGER(8),
INTENT(IN) :: POSELTT
794 DOUBLE PRECISION,
intent(in) :: TOLEPS
795 LOGICAL,
INTENT(OUT) :: BUILDQ
796 LOGICAL,
INTENT(IN) :: CB_COMPRESS
797 DOUBLE PRECISION,
ALLOCATABLE :: RWORK_RRQR(:)
798 DOUBLE PRECISION,
ALLOCATABLE :: WORK_RRQR(:), TAU_RRQR(:)
799 INTEGER,
ALLOCATABLE :: JPVT_RRQR(:)
800 INTEGER :: INFO, RANK, MAXRANK, LWORK
801 INTEGER :: I, J, M, N
802 INTEGER :: allocok, MREQ
803 DOUBLE PRECISION :: ONE, MONE, ZERO
804 PARAMETER (ONE = 1.0d0, mone=-1.0d0)
805 parameter(zero=0.0d0)
808 maxrank = floor(dble(m*n)/dble(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 & DMUMPS_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 DOUBLE PRECISION,
intent(inout) :: a(la)
871 INTEGER,
INTENT(IN) :: , 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) :: POSELTT
876 INTEGER,
intent(in) :: MIDBLK_COMPRESS, KPERCENT_RMB
877 DOUBLE PRECISION,
intent(in) :: TOLEPS
878 DOUBLE PRECISION,
ALLOCATABLE :: RWORK_RRQR(:)
879 DOUBLE PRECISION,
ALLOCATABLE :: WORK_RRQR(:), TAU_RRQR(:)
880 DOUBLE PRECISION,
ALLOCATABLE,
DIMENSION(:,:),
TARGET :: Q1, R1,
882 INTEGER,
ALLOCATABLE :: JPVT_RRQR(:)
883 TYPE(LRB_TYPE) :: LRB1, LRB2
884 INTEGER :: INFO, RANK1, RANK2, RANK, MAXRANK, LWORK
885 LOGICAL :: BUILDQ, BUILDQ1, BUILDQ2, SKIP1, SKIP2
886 INTEGER :: I, J, M, N, K
887 INTEGER :: allocok, MREQ
888 DOUBLE PRECISION :: ONE, MONE, ZERO
889 parameter(one = 1.0d0, mone=-1.0d0)
890 parameter(zero=0.0d0)
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
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 & DMUMPS_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) ::
1056 DOUBLE PRECISION,
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 DOUBLE PRECISION,
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 DOUBLE PRECISION :: one, mone, zero
1072 parameter(one = 1.0d0, mone=-1.0d0)
1073 parameter(zero=0.0d0)
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 DMUMPS_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 DMUMPS_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 &
'DMUMPS_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)
1197 & MAXI_RANK, A, LA, POSELTT, NFRONT, NIV,
1198 & MIDBLK_COMPRESS, TOLEPS, TOL_OPT, KPERCENT_RMB,
1199 & KPERCENT_LUA, NEW_ACC_RANK)
1200 TYPE(
lrb_type),
INTENT(INOUT) :: ACC_LRB
1201 INTEGER(8),
intent(in) ::
1202 DOUBLE PRECISION,
intent(inout) :: A(LA)
1203 INTEGER,
INTENT(IN) :: NFRONT, NIV, TOL_OPT
1204 INTEGER,
INTENT(IN) :: MAXI_CLUSTER, MAXI_RANK, KPERCENT_LUA
1205 INTEGER,
INTENT(INOUT) :: NEW_ACC_RANK
1206 INTEGER(8),
INTENT(IN) :: POSELTT
1207 INTEGER,
intent(in) :: MIDBLK_COMPRESS, KPERCENT_RMB
1208 DOUBLE PRECISION,
intent(in) :: TOLEPS
1209 DOUBLE PRECISION,
ALLOCATABLE :: RWORK_RRQR(:)
1210 DOUBLE PRECISION,
ALLOCATABLE :: WORK_RRQR(:), TAU_RRQR(:)
1211 DOUBLE PRECISION,
ALLOCATABLE,
DIMENSION(:,:),
TARGET ::
1213 INTEGER,
ALLOCATABLE :: JPVT_RRQR(:)
1214 INTEGER :: INFO, RANK1, MAXRANK, LWORK
1216 INTEGER :: I, J, M, N, K, K1
1217 INTEGER :: allocok, MREQ
1218 DOUBLE PRECISION :: ONE, MONE, ZERO
1219 parameter(one = 1.0d0, mone=-1.0d0)
1220 parameter(zero=0.0d0)
1226 maxrank =
max(1, int((maxrank*kpercent_lua/100)))
1228 allocate(q1(m,k), proj(k1, k),
1229 & work_rrqr(lwork), rwork_rrqr(2*k),
1231 & jpvt_rrqr(k), stat=allocok)
1232 IF (allocok > 0)
THEN
1233 mreq = m * k + k1 * k + lwork + 4 * k
1238 q1(i,j) = acc_lrb%Q(i,j+k1)
1241 CALL dgemm(
'T',
'N', k1, k, m, one, acc_lrb%Q(1,1),
1242 & maxi_cluster, q1(1,1), m, zero, proj(1,1), k1)
1243 CALL dgemm(
'N',
'N', m, k, k1, mone, acc_lrb%Q(1,1),
1244 & maxi_cluster, proj(1,1), k1, one, q1(1,1), m)
1247 & m, jpvt_rrqr(1), tau_rrqr(1), work_rrqr(1),
1248 & k, rwork_rrqr(1), toleps, tol_opt,
1249 & rank1, maxrank, info,
1252 allocate(q2(n,k), stat=allocok)
1253 IF (allocok > 0)
THEN
1259 q2(i,j) = acc_lrb%R(j+k1,i)
1262 CALL dgemm(
'N',
'T', k1, n, k, one, proj(1,1), k1,
1263 & q2(1,1), n, one, acc_lrb%R(1,1), maxi_rank)
1264 IF (rank1.GT.0)
THEN
1265 allocate(r1(rank1,k), stat=allocok)
1266 IF (allocok > 0)
THEN
1271 r1(1:
min(rank1,j),jpvt_rrqr(j)) =
1272 & q1(1:
min(rank1,j),j)
1273 IF(j.LT.rank1) r1(
min(rank1,j)+1:
1274 & rank1,jpvt_rrqr(j))= zero
1277 & (m, rank1, rank1, q1(1,1),
1279 & work_rrqr(1), lwork, info )
1282 acc_lrb%Q(i,j+k1) = q1(i,j)
1285 CALL dgemm(
'N',
'T', rank1, n, k, one, r1(1,1), rank1,
1286 & q2(1,1), n, zero, acc_lrb%R(k1+1,1), maxi_rank)
1290 acc_lrb%K = k1 + rank1
1293 deallocate(q1, jpvt_rrqr, tau_rrqr, work_rrqr, rwork_rrqr)
1297 write(*,*)
'Allocation problem in BLR routine
1298 & DMUMPS_RECOMPRESS_ACC_V2: ',
1299 &
'not enough memory? memory requested = ' , mreq
1304 INTEGER,
intent(in) :: CUT_SIZE
1305 INTEGER,
intent(out) :: MAXI_CLUSTER
1306 INTEGER,
POINTER,
DIMENSION(:) :: CUT
1310 IF (cut(i+1) - cut(i) .GE. maxi_cluster)
THEN
1311 maxi_cluster = cut(i+1) - cut(i)
1316 & SYM, FS_OR_CB, I, J, FRFR_UPDATES,
1317 & LBANDSLAVE_IN, K474, BLR_U_COL)
1321 INTEGER,
INTENT(IN) :: NB_BLOCKS, IWHANDLER, SYM, FS_OR_CB, I, J
1322 INTEGER,
INTENT(OUT) :: ORDER(NB_BLOCKS), RANK(NB_BLOCKS),
1324 LOGICAL,
OPTIONAL,
INTENT(IN)
1325INTEGER,
OPTIONAL,
INTENT(IN) :: K474
1326 TYPE(
lrb_type),
POINTER,
OPTIONAL :: BLR_U_COL(:)
1330 INTEGER :: K, IND_L, IND_U
1331 LOGICAL :: LBANDSLAVE
1332 TYPE(LRB_TYPE),
POINTER :: BLR_L(:), BLR_U(:)
1333 IF (
PRESENT(lbandslave_in))
THEN
1334 lbandslave = lbandslave_in
1336 lbandslave = .false.
1338 IF ((sym.NE.0).AND.(fs_or_cb.EQ.0).AND.(j.NE.0))
THEN
1339 write(6,*)
'Internal error in DMUMPS_GET_LUA_ORDER',
1340 &
'SYM, FS_OR_CB, J = ',sym,fs_or_cb,j
1346 IF (fs_or_cb.EQ.0)
THEN
1348 ind_l = nb_blocks+i-k
1349 ind_u = nb_blocks+1-k
1351 ind_l = nb_blocks+1-k
1352 ind_u = nb_blocks+i-k
1358 IF (lbandslave)
THEN
1369 IF (lbandslave.AND.k474.GE.2)
THEN
1380 IF (blr_l(ind_l)%ISLR)
THEN
1381 IF (blr_u(ind_u)%ISLR)
THEN
1382 rank(k) =
min(blr_l(ind_l)%K, blr_u(ind_u)%K)
1384 rank(k) = blr_l(ind_l)%K
1387 IF (blr_u(ind_u)%ISLR)
THEN
1388 rank(k) = blr_u(ind_u)%K
1391 frfr_updates = frfr_updates + 1
1398 & IWHANDLER, SON_IW, LIW, LSTK, NELIM, K1, K2, SYM,
1399 & KEEP, KEEP8, OPASSW)
1411 INTEGER(8) :: LA, POSEL1
1412 INTEGER :: LIW, NFRONT, NASS1, LSTK, NELIM, K1, K2, IWHANDLER
1413 DOUBLE PRECISION :: A(LA)
1415 INTEGER :: SON_IW(:)
1416 INTEGER :: KEEP(500)
1417 INTEGER(8) :: KEEP8(150)
1419 DOUBLE PRECISION,
INTENT(INOUT) :: OPASSW
1424 DOUBLE PRECISION,
ALLOCATABLE :: SON_A(:)
1425 INTEGER(8) :: APOS, SON_APOS, IACHK, JJ2, NFRONT8
1426 INTEGER :: KK, KK1, allocok, SON_LA
1427 TYPE(
lrb_type),
POINTER :: CB_LRB(:,:), LRB
1428 INTEGER,
POINTER,
DIMENSION(:) :: BEGS_BLR_DYNAMIC
1429 INTEGER :: NB_INCB, NB_INASM, NB_BLR, I, J, M, N, II, NPIV,
1430 & ibis, ibis_end, first_row, last_row, first_col, last_col,
1432 DOUBLE PRECISION :: PROMOTE_COST
1433 DOUBLE PRECISION :: ONE, ZERO
1434 parameter(one = 1.0d0)
1435 parameter(zero = 0.0d0)
1439 nb_blr =
size(begs_blr_dynamic)-1
1440 nb_incb =
size(cb_lrb,1)
1441 nb_inasm = nb_blr - nb_incb
1442 npiv = begs_blr_dynamic(nb_inasm+1)-1
1443 nfront8 = int(nfront,8)
1445 ibis_end = nb_incb*nb_incb
1447 ibis_end = nb_incb*(nb_incb+1)/2
1458 i = (ibis-1)/nb_incb+1
1459 j = ibis - (i-1)*nb_incb
1461 i = ceiling((1.0d0+sqrt(1.0d0+8.0d0*dble(ibis)))/2.0d0)-1
1462 j = ibis - i*(i-1)/2
1466 IF (i.EQ.nb_inasm+1)
THEN
1468 first_row = begs_blr_dynamic(i)-npiv+nelim
1470 first_row = begs_blr_dynamic(i)-npiv
1472 last_row = begs_blr_dynamic(i+1)-1-npiv
1473 m=last_row-first_row+1
1474 first_col = begs_blr_dynamic(j)-npiv
1475 last_col = begs_blr_dynamic(j+1)-1-npiv
1476 n = begs_blr_dynamic(j+1)-begs_blr_dynamic(j)
1480 lrb => cb_lrb(i-nb_inasm,j-nb_inasm)
1481 IF (lrb%ISLR.AND.lrb%K.EQ.0)
THEN
1487 allocate(son_a(son_la),stat=allocok)
1488 IF (allocok.GT.0)
THEN
1489 write(*,*)
'Not enough memory in DMUMPS_BLR_ASM_NIV1',
1490 &
", Memory requested = ", son_la
1495 CALL dgemm(
'T',
'T', n, m, lrb%K, one, lrb%R(1,1), lrb%K,
1496 & lrb%Q(1,1), m, zero, son_a(son_apos), son_lda)
1497 promote_cost = 2.0d0*m*n*lrb%K
1500 IF (i.EQ.j.AND.sym.NE.0)
THEN
1502 IF (j-nb_inasm.EQ.1.AND.nelim.GT.0)
THEN
1507 son_a(son_apos+int(ii-1,8)*int(son_lda,8) +
1515 son_a(son_apos+int(ii-1,8)*int(son_lda,8) +
1524 son_a(son_apos+int(ii-1,8)*int(son_lda,8) +
1535 IF (sym.NE.0.AND.j-nb_inasm.EQ.1.AND.nelim.GT.0)
THEN
1539 DO kk = first_row, last_row
1540 iachk = 1_8 + int(kk-first_row,8)*int(son_lda,8)
1541 IF (son_iw(kk+k1-1).LE.nass1)
THEN
1545 apos = posel1 + int(son_iw(kk+k1-1),8) - 1_8
1546 DO kk1 = first_col, first_col+nelim-1
1547 jj2 = apos + int(son_iw(k1+kk1-1)-1,8)*nfront8
1548 a(jj2) = a(jj2) + son_a(iachk + int(kk1-first_col,8))
1551 apos = posel1 + int(son_iw(kk+k1-1)-1,8)*nfront8
1557 DO kk1 = first_col+nelim,
min(last_col,kk)
1559 a(jj2) = a(jj2) + son_a(iachk + int(kk1-first_col,8))
1562 apos = posel1 + int(son_iw(kk+k1-1)-1,8)*nfront8
1563 DO kk1 = first_col,
min(last_col,kk)
1564 jj2 = apos + int(son_iw(k1+kk1-1),8) - 1_8
1571 DO kk = first_row, last_row
1572 apos = posel1 + int(son_iw(kk+k1-1)-1,8)*nfront8
1573 iachk = 1_8 + int(kk-first_row,8)*int(son_lda,8)
1574 IF (i.EQ.j.AND.sym.NE.0)
THEN
1576 DO kk1 = first_col, kk
1577 jj2 = apos + int(son_iw(k1+kk1-1),8) - 1_8
1578 a(jj2) = a(jj2) + son_a(iachk + int(kk1-first_col,8))
1581 DO kk1 = first_col, last_col
1582 jj2 = apos + int(son_iw(k1+kk1-1),8) - 1_8
1583 a(jj2) = a(jj2) + son_a(iachk + int(kk1-first_col,8))
1597 & .true., keep8, keep(34))
1598 IF ((keep(486).EQ.3).OR.keep(486).EQ.0)
THEN
1609 & LDW, RWORK, TOLEPS, TOL_OPT, RANK, MAXRANK, INFO,
1668 INTEGER :: INFO, LDA, LDW, M, N, RANK, MAXRANK
1681 DOUBLE PRECISION :: TOLEPS
1683 DOUBLE PRECISION :: RWORK(*)
1684 DOUBLE PRECISION :: A(LDA,*), TAU(*)
1685 DOUBLE PRECISION :: WORK(LDW,*)
1687 DOUBLE PRECISION :: TOLEPS_EFF, TRUNC_ERR
1688 INTEGER,
PARAMETER :: INB=1, inbmin=2
1689 INTEGER :: J, JB, MINMN, NB
1691 INTEGER :: LSTICC, PVT, K, RK
1692 DOUBLE PRECISION :: TEMP, TEMP2, TOL3Z
1693 DOUBLE PRECISION :: AKK
1694 LOGICAL INADMISSIBLE
1695 DOUBLE PRECISION,
PARAMETER
1696 DOUBLE PRECISION :: ZERO
1697 DOUBLE PRECISION :: ONE
1698 PARAMETER ( ONE = 1.0d+0 )
1699 parameter( zero = 0.0d+0 )
1700 DOUBLE PRECISION :: dlamch
1701 INTEGER :: ilaenv, idamax
1702 EXTERNAL :: idamax, dlamch
1703 EXTERNAL dgeqrf, dormqr, xerbla
1705 EXTERNAL , dgemv, dlarfg, dswap
1706 DOUBLE PRECISION,
EXTERNAL :: dnrm2
1711 ELSE IF( n.LT.0 )
THEN
1713 ELSE IF( lda.LT.
max( 1, m ) )
THEN
1716 IF( info.EQ.0 )
THEN
1721 IF( info.NE.0 )
THEN
1726 IF( minmn.EQ.0 )
THEN
1730 nb = ilaenv( inb,
'CGEQRF',
' ', m, n, -1, -1 )
1731 SELECT CASE(abs(tol_opt))
1737 write(*,*)
'Internal error in DMUMPS_TRUNCATED_RRQR: TOL_OPT =',
1755 rwork( j ) = dnrm2( m, a( 1, j ), 1 )
1757 rwork( n + j ) = rwork( j )
1760 IF (tol_opt.LT.0)
THEN
1763 trunc_err = dnrm2( n, rwork( 1 ), 1 )
1766 tol3z = sqrt(dlamch(
'Epsilon'))
1768 jb =
min(nb,minmn-offset)
1776 pvt = ( rk-1 ) + idamax( n-rk+1, rwork( rk ), 1 )
1779 IF (abs(tol_opt).EQ.2) toleps_eff = rwork(pvt)*toleps
1781 IF (tol_opt.GT.0)
THEN
1783 trunc_err = rwork(pvt)
1787 IF(trunc_err.LT.toleps_eff)
THEN
1792 inadmissible = (rk.GT.maxrank)
1793 IF (inadmissible)
THEN
1799 IF( pvt.NE.rk )
THEN
1800 CALL dswap( m, a( 1, pvt ), 1, a( 1, rk ), 1 )
1803 CALL dswap( 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 dgemv(
'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 dlarfg( m-rk+1, a(rk,rk), a(rk+1,rk), 1, tau(rk) )
1825 CALL dlarfg( 1, a(rk,rk), a(rk,rk), 1, tau(rk) )
1832 CALL dgemv(
'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 dgemv(
'Transpose', m-rk+1, k-1, -tau(rk),
1847 & a(rk,offset+1), lda, a(rk,rk), 1, zero,
1850 CALL dgemv(
'No transpose', n-offset, k-1, one,
1851 & work(1,2), ldw, work(1,1), 1, one, work(1,k+1), 1 )
1858 CALL dgemv(
'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 ) = dble( lsticc )
1883 rwork( j ) = rwork( j )*sqrt( temp )
1889 IF (lsticc.NE.0)
EXIT
1890 IF (tol_opt.LT.0)
THEN
1893 trunc_err = dnrm2( n-rk, rwork( rk+1 ), 1 )
1899 IF( rk.LT.
min(n,m) )
THEN
1900 CALL dgemm(
'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 ) = dnrm2( 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 = dnrm2( n-rk, rwork( rk+1 ), 1 )
1929 islr = .NOT.(rk.GT.maxrank)
1931 999
FORMAT (
'On entry to DMUMPS_TRUNCATED_RRQR, parameter number',
1932 & i2,
' had an illegal value')
subroutine dmumps_truncated_rrqr(m, n, a, lda, jpvt, tau, work, ldw, rwork, toleps, tol_opt, rank, maxrank, info, islr)
subroutine dorgqr(m, n, k, a, lda, tau, work, lwork, info)
DORGQR
subroutine dscal(n, da, dx, incx)
DSCAL
subroutine dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
DGEMM
subroutine dtrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
DTRSM
subroutine dmumps_get_lua_order(nb_blocks, order, rank, iwhandler, sym, fs_or_cb, i, j, frfr_updates, lbandslave_in, k474, blr_u_col)
subroutine dmumps_decompress_acc(acc_lrb, maxi_cluster, maxi_rank, a, la, poseltt, nfront, niv, loru, count_flops)
subroutine dmumps_lrgemm4(alpha, lrb1, lrb2, beta, a, la, poseltt, nfront, sym, iflag, ierror, midblk_compress, toleps, tol_opt, kpercent, rank, buildq, lua_activated, loru, lrb3, maxi_rank, maxi_cluster, diag, ld_diag, iw2, block)
subroutine init_lrb(lrb_out, k, m, n, islr)
recursive subroutine dmumps_recompress_acc_narytree(acc_lrb, maxi_cluster, maxi_rank, a, la, poseltt, keep8, nfront, niv, midblk_compress, toleps, tol_opt, kpercent_rmb, kpercent_lua, k478, rank_list, pos_list, nb_nodes, level, acc_tmp)
subroutine dmumps_lrtrsm(a, la, poselt_local, nfront, lda, lrb, niv, sym, loru, iw, offset_iw)
subroutine regrouping2(cut, npartsass, nass, npartscb, ncb, ibcksz, onlycb, k472)
subroutine alloc_lrb(lrb_out, k, m, n, islr, iflag, ierror, keep8)
subroutine dmumps_recompress_acc_v2(acc_lrb, maxi_cluster, maxi_rank, a, la, poseltt, nfront, niv, midblk_compress, toleps, tol_opt, kpercent_rmb, kpercent_lua, new_acc_rank)
subroutine dmumps_compress_fr_updates(acc_lrb, maxi_cluster, maxi_rank, a, la, poseltt, nfront, niv, toleps, tol_opt, kpercent, buildq, loru, cb_compress)
subroutine dmumps_recompress_acc(acc_lrb, maxi_cluster, maxi_rank, a, la, poseltt, nfront, niv, midblk_compress, toleps, tol_opt, kpercent_rmb, kpercent_lua, new_acc_rank)
subroutine is_front_blr_candidate(inode, niv, nfront, nass, blron, k489, k490, k491, k492, k20, k60, idad, k38, lrstatus, n, lrgroups)
subroutine dmumps_blr_asm_niv1(a, la, posel1, nfront, nass1, iwhandler, son_iw, liw, lstk, nelim, k1, k2, sym, keep, keep8, opassw)
subroutine dmumps_lrgemm_scaling(lrb, scaled, a, la, diag, ld_diag, iw2, poseltt, nfront, block, maxi_cluster)
subroutine alloc_lrb_from_acc(acc_lrb, lrb_out, k, m, n, loru, iflag, ierror, keep8)
subroutine max_cluster(cut, cut_size, maxi_cluster)
subroutine, public dmumps_blr_retrieve_begsblr_dyn(iwhandler, begs_blr_dynamic)
subroutine, public dmumps_blr_retrieve_panel_loru(iwhandler, loru, ipanel, thelrbpanel)
subroutine, public dmumps_blr_end_front(iwhandler, info1, keep8, k34, lrsolve_act_opt, mtk405)
subroutine, public dmumps_blr_free_cb_lrb(iwhandler, free_only_struct, keep8, k34)
subroutine, public dmumps_blr_retrieve_cb_lrb(iwhandler, thecb)
subroutine upd_flop_compress(lr_b, rec_acc, cb_compress, frswap)
subroutine upd_flop_decompress(f, cb)
subroutine upd_flop_trsm(lrb, loru)
subroutine upd_flop_update(lrb1, lrb2, midblk_compress, rank_in, buildq, is_symdiag, lua_activated, rec_acc)
subroutine dealloc_lrb(lrb_out, keep8, k34)
subroutine compute_blr_vcs(k472, ibcksz, maxsize, nass)