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
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 COMPLEX(kind=8) :: ZERO
118 parameter(zero=(0.0d0,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
164 INTEGER(8) :: KEEP8(150)
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 :: I, 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 COMPLEX(kind=8),
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 COMPLEX(kind=8),
POINTER :: LR_BLOCK_PTR(:,:)
286 COMPLEX(kind=8) :: ONE, MONE, ZERO
287 COMPLEX(kind=8) :: MULT1, MULT2, A11, DETPIV, A22, A12
288 PARAMETER (ONE=(1.0d0,0.0d0), mone=(-1.0d0,0.0d0))
289 parameter(zero=(0.0d0,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 ztrsm(
'R',
'L',
'T',
'N', m, n, one,
304 & a(poselt_local), nfront,
305 & lr_block_ptr(1,1), m)
307 CALL ztrsm(
'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 zscal(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 COMPLEX(kind=8),
intent(inout) :: a(la)
361 COMPLEX(kind=8),
intent(inout),
DIMENSION(:,:) :: SCALED
362 INTEGER,
INTENT(IN) :: LD_DIAG, NFRONT, IW2(*)
363 INTEGER(8),
INTENT(IN) :: POSELTT
364 COMPLEX(kind=8),
INTENT(IN),
OPTIONAL :: DIAG(*)
365 INTEGER,
INTENT(IN) :: MAXI_CLUSTER
366 COMPLEX(kind=8),
intent(inout) :: BLOCK(MAXI_CLUSTER)
368 COMPLEX(kind=8) :: PIV1, PIV2,
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 COMPLEX(kind=8),
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 COMPLEX(kind=8),
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 COMPLEX(kind=8) :: ALPHA,BETA
419 LOGICAL,
INTENT(OUT) :: BUILDQ
420 COMPLEX(kind=8),
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 COMPLEX(kind=8),
POINTER,
DIMENSION(:,:) :: XY_YZ
427 COMPLEX(kind=8),
ALLOCATABLE,
TARGET,
DIMENSION(:,:) :: XQ, R_Y
428 COMPLEX(kind=8),
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 COMPLEX(kind=8),
ALLOCATABLE :: WORK_RRQR(:), TAU_RRQR(:),
436 INTEGER,
ALLOCATABLE :: JPVT_RRQR(:)
437 INTEGER :: allocok, MREQ
438 DOUBLE PRECISION,
EXTERNAL ::dznrm2
439 COMPLEX(kind=8) :: ONE, MONE, ZERO
440 parameter(one=(1.0d0,0.0d0), mone=(-1.0d0,0.0d0))
441 parameter(zero=(0.0d0,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 zgemm(
'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 zgemm(
'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 ZMUMPS_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 ZMUMPS_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 zgemm(
'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 zgemm(
'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 ZMUMPS_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 ZMUMPS_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 zgemm(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 zgemm(
'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 zgemm(
'N',
'T', lrb1%M, lrb2%M, k_xy
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 COMPLEX(kind=8),
intent(inout) :: A(LA)
766 INTEGER,
INTENT(IN) :: NFRONT, NIV
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 COMPLEX(kind=8) :: ONE, MONE, ZERO
773 parameter(one=(1.0d0,0.0d0), mone=(-1.0d0,0.0d0))
774 parameter(zero=(0.0d0,0.0d0))
775 IF (
present(count_flops))
THEN
776 count_flops_loc=count_flops
778 count_flops_loc=.true.
780 CALL zgemm(
'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 COMPLEX(kind=8),
intent(inout) :: A(LA)
791 INTEGER,
INTENT(IN) :: NFRONT, NIV, , 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) ::
797 DOUBLE PRECISION,
ALLOCATABLE :: (:)
798 COMPLEX(kind=8),
ALLOCATABLE :: WORK_RRQR(:), TAU_RRQR(:)
799 INTEGER,
ALLOCATABLE :: JPVT_RRQR(:)
800 INTEGER :: INFO, RANK, MAXRANK, LWORK
802 INTEGER :: allocok, MREQ
803 COMPLEX(kind=8) :: , MONE, ZERO
804 PARAMETER (ONE=(1.0d0,0.0d0), mone=(-1.0d0,0.0d0))
805 parameter(zero=(0.0d0,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 & ZMUMPS_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 COMPLEX(kind=8),
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) ::
875 INTEGER(8),
INTENT(IN) :: POSELTT
876 INTEGER,
intent(in) :: , KPERCENT_RMB
877 DOUBLE PRECISION,
intent(in) :: TOLEPS
878 DOUBLE PRECISION,
ALLOCATABLE :: RWORK_RRQR(:)
879 COMPLEX(kind=8),
ALLOCATABLE :: WORK_RRQR(:), TAU_RRQR(:)
880 COMPLEX(kind=8),
ALLOCATABLE,
DIMENSION(:,:),
TARGET :: Q1
882 INTEGER,
ALLOCATABLE :: JPVT_RRQR(:)
883 TYPE(LRB_TYPE) :: LRB1, LRB2
884 INTEGER :: , RANK1, RANK2, RANK, MAXRANK, LWORK
885 LOGICAL :: BUILDQ, BUILDQ1, BUILDQ2, SKIP1, SKIP2
886 INTEGER :: I, J, M, N, K
887 INTEGER :: allocok, MREQ
888 COMPLEX(kind=8) :: ONE, MONE, ZERO
889 parameter(one=(1.0d0,0.0d0), mone=(-1.0d0,0.0d0))
890 parameter(zero=(0.0d0,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
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,
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 & ZMUMPS_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 COMPLEX(kind=8),
intent(inout) :: a(la)
1057 INTEGER,
INTENT(IN) :: nfront
1058INTEGER,
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 COMPLEX(kind=8) :: one, mone, zero
1072 parameter(one=(1.0d0,0.0d0), mone=(-1.0d0,0.0d0))
1073 parameter(zero=(0.0d0,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 ZMUMPS_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 ZMUMPS_RECOMPRESS_ACC_NARYTREE'
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 &
'ZMUMPS_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) :: LA
1202 COMPLEX(kind=8),
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 COMPLEX(kind=8),
ALLOCATABLE :: WORK_RRQR(:), TAU_RRQR(:)
1211 COMPLEX(kind=8),
ALLOCATABLE,
DIMENSION(:,:),
TARGET ::
1213 INTEGER,
ALLOCATABLE :: JPVT_RRQR(:)
1214 INTEGER :: INFO, RANK1, MAXRANK, LWORK
1216 INTEGER :: I, J, M, N, K, K1
1218 COMPLEX(kind=8) :: ONE, MONE, ZERO
1219 parameter(one=(1.0d0,0.0d0), mone=(-1.0d0,0.0d0))
1220 parameter(zero=(0.0d0,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 zgemm(
'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 zgemm(
'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 zgemm(
'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 zgemm(
'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 & ZMUMPS_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(), RANK(NB_BLOCKS),
1324 LOGICAL,
OPTIONAL,
INTENT(IN) :: LBANDSLAVE_IN
1325 INTEGER,
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 ZMUMPS_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) :: , POSEL1
1412 INTEGER :: LIW, NFRONT, NASS1, LSTK, NELIM, K1, K2, IWHANDLER
1413 COMPLEX(kind=8) :: A(LA)
1416 INTEGER :: KEEP(500)
1417 INTEGER(8) :: KEEP8(150)
1419 DOUBLE PRECISION,
INTENT(INOUT) :: OPASSW
1424 COMPLEX(kind=8),
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 COMPLEX(kind=8) :: ONE, ZERO
1434 parameter(one=(1.0d0,0.0d0))
1435 parameter(zero=(0.0d0,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
1453!$omp& apos, iachk, kk1, jj2, promote_cost, allocok, son_apos)
1455 DO ibis = 1,ibis_end
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 ZMUMPS_BLR_ASM_NIV1',
1490 &
", Memory requested = ", son_la
1495 CALL zgemm(
'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
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)
1558 jj2 = apos + int(son_iw(k1+kk1-1),8) - 1_8
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
1565 a(jj2) = a(jj2) + son_a(iachk + int(kk1-first_col,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 COMPLEX(kind=8) :: A(LDA,*), TAU(*)
1685 COMPLEX(kind=8) :: WORK(,*)
1687 DOUBLE PRECISION :: 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 DOUBLE PRECISION :: TEMP, TEMP2, TOL3Z
1693 COMPLEX(kind=8) :: AKK
1694 LOGICAL INADMISSIBLE
1695 DOUBLE PRECISION,
PARAMETER :: RZERO=0.0d+0, rone=1.0d+0
1696 COMPLEX(kind=8) :: ZERO
1697 COMPLEX(kind=8) :: ONE
1698 PARAMETER ( ONE = ( 1.0d+0, 0.0d+0 ) )
1699 PARAMETER ( zero = ( 0.0d+0, 0.0d+0 ) )
1700 DOUBLE PRECISION :: dlamch
1702 EXTERNAL :: idamax, dlamch
1703 EXTERNAL zgeqrf, zunmqr, xerbla
1705 EXTERNAL zgemm, zgemv, zlarfg, zswap
1706 DOUBLE PRECISION,
EXTERNAL :: dznrm2
1707 DOUBLE PRECISION,
EXTERNAL :: dnrm2
1712 ELSE IF( n.LT.0 )
THEN
1714 ELSE IF( lda.LT.
max( 1, m ) )
THEN
1717 IF( info.EQ.0 )
THEN
1722 IF( info.NE.0 )
THEN
1727 IF( minmn.EQ.0 )
THEN
1731 nb = ilaenv( inb,
'CGEQRF',
' ', m, n, -1, -1 )
1732 SELECT CASE(abs(tol_opt))
1738 write(*,*)
'Internal error in ZMUMPS_TRUNCATED_RRQR: TOL_OPT =',
1756 rwork( j ) = dznrm2( m, a( 1, j ), 1 )
1758 rwork( n + j ) = rwork( j )
1761 IF (tol_opt.LT.0)
THEN
1764 trunc_err = dnrm2( n, rwork( 1 ), 1 )
1767 tol3z = sqrt(dlamch(
'Epsilon'))
1769 jb =
min(nb,minmn-offset)
1777 pvt = ( rk-1 ) + idamax( n-rk+1, rwork( rk ), 1 )
1780 IF (abs(tol_opt).EQ.2) toleps_eff = rwork(pvt)*toleps
1782 IF (tol_opt.GT.0)
THEN
1784 trunc_err = rwork(pvt)
1788 IF(trunc_err.LT.toleps_eff)
THEN
1793 inadmissible = (rk.GT.maxrank)
1794 IF (inadmissible)
THEN
1800 IF( pvt.NE.rk )
THEN
1801 CALL zswap( m, a( 1, pvt ), 1, a( 1, rk ), 1 )
1804 CALL zswap( k-1, work( pvt-offset, 2 ), ldw,
1805 & work( k, 2 ), ldw )
1807 jpvt(pvt) = jpvt(rk)
1811 rwork(pvt) = rwork(rk)
1812 rwork(n+pvt) = rwork(n+rk)
1819 work( k, j+1 ) = conjg( work( k, j+1 ) )
1821 CALL zgemv(
'No transpose', m-rk+1, k-1, -one,
1823 & a(rk,offset+1), lda, work(k,2), ldw,
1824 & one, a(rk,rk), 1 )
1832 CALL zlarfg( m-rk+1, a(rk,rk), a(rk+1,rk), 1, tau(rk) )
1834 CALL zlarfg( 1, a(rk,rk), a(rk,rk), 1, tau(rk) )
1841 CALL zgemv(
'Conjugate transpose', m-rk+1, n-rk, tau(rk),
1842 & a(rk,rk+1), lda, a(rk,rk), 1, zero
1844 & work( k+1, k+1 ), 1 )
1849 work( j, k+1 ) = zero
1855 CALL zgemv(
'Conjugate transpose', m-rk+1, k-1, -tau(rk),
1856 & a(rk,offset+1), lda, a(rk,rk), 1, zero,
1859 CALL zgemv(
'No transpose', n-offset, k-1, one,
1860 & work(1,2), ldw, work(1,1), 1, one, work(1,k+1), 1 )
1866 CALL zgemm(
'No transpose',
'Conjugate transpose',
1869 & k, -one, a( rk, offset+1 ), lda, work( k+1,2 ), ldw,
1870 & one, a( rk, rk+1 ), lda )
1874 IF( rk.LT.minmn )
THEN
1877 IF( rwork( j ).NE.rzero )
THEN
1883 temp = abs( a( rk, j ) ) / rwork( j )
1884 temp =
max( rzero, ( rone+temp )*( rone-temp ) )
1886 temp2 = temp*( rwork( j ) / rwork( n+j ) )**2
1887 IF( temp2 .LE. tol3z )
THEN
1889 rwork( n+j ) = dble( lsticc )
1893 rwork( j ) = rwork( j )*sqrt( temp )
1899 IF (lsticc.NE.0)
EXIT
1900 IF (tol_opt.LT.0)
THEN
1903 trunc_err = dnrm2( n-rk, rwork( rk+1 ), 1 )
1909 IF( rk.LT.
min(n,m) )
THEN
1910 CALL zgemm(
'No transpose',
'Conjugate transpose', m-rk,
1911 & n-rk, k, -one, a(rk+1,offset+1), lda,
1913 & work(k+1,2), ldw, one, a(rk+1,rk+1), lda )
1916 DO WHILE( lsticc.GT.0 )
1918 itemp = nint( rwork( n + lsticc ) )
1927 rwork( n + lsticc ) = rwork( lsticc )
1930 IF(rk.GE.minmn)
EXIT
1932 IF (tol_opt.LT.0)
THEN
1935 trunc_err = dnrm2( n-rk, rwork( rk+1 ), 1 )
1939 islr = .NOT.(rk.GT.maxrank)
1941 999
FORMAT (
'On entry to ZMUMPS_TRUNCATED_RRQR, parameter number',
1942 & i2,
' had an illegal value')
subroutine zungqr(m, n, k, a, lda, tau, work, lwork, info)
ZUNGQR
subroutine zscal(n, za, zx, incx)
ZSCAL
subroutine zgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
ZGEMM
subroutine ztrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
ZTRSM
subroutine compute_blr_vcs(k472, ibcksz, maxsize, nass)
subroutine zmumps_lrgemm_scaling(lrb, scaled, a, la, diag, ld_diag, iw2, poseltt, nfront, block, maxi_cluster)
subroutine max_cluster(cut, cut_size, maxi_cluster)
subroutine zmumps_get_lua_order(nb_blocks, order, rank, iwhandler, sym, fs_or_cb, i, j, frfr_updates, lbandslave_in, k474, blr_u_col)
subroutine alloc_lrb_from_acc(acc_lrb, lrb_out, k, m, n, loru, iflag, ierror, keep8)
subroutine zmumps_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 zmumps_lrtrsm(a, la, poselt_local, nfront, lda, lrb, niv, sym, loru, iw, offset_iw)
subroutine zmumps_decompress_acc(acc_lrb, maxi_cluster, maxi_rank, a, la, poseltt, nfront, niv, loru, count_flops)
subroutine init_lrb(lrb_out, k, m, n, islr)
subroutine is_front_blr_candidate(inode, niv, nfront, nass, blron, k489, k490, k491, k492, k20, k60, idad, k38, lrstatus, n, lrgroups)
subroutine zmumps_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 zmumps_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)
recursive subroutine zmumps_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 alloc_lrb(lrb_out, k, m, n, islr, iflag, ierror, keep8)
subroutine zmumps_blr_asm_niv1(a, la, posel1, nfront, nass1, iwhandler, son_iw, liw, lstk, nelim, k1, k2, sym, keep, keep8, opassw)
subroutine regrouping2(cut, npartsass, nass, npartscb, ncb, ibcksz, onlycb, k472)
subroutine zmumps_compress_fr_updates(acc_lrb, maxi_cluster, maxi_rank, a, la, poseltt, nfront, niv, toleps, tol_opt, kpercent, buildq, loru, cb_compress)
subroutine, public zmumps_blr_end_front(iwhandler, info1, keep8, k34, lrsolve_act_opt, mtk405)
subroutine, public zmumps_blr_retrieve_panel_loru(iwhandler, loru, ipanel, thelrbpanel)
subroutine, public zmumps_blr_retrieve_cb_lrb(iwhandler, thecb)
subroutine, public zmumps_blr_free_cb_lrb(iwhandler, free_only_struct, keep8, k34)
subroutine, public zmumps_blr_retrieve_begsblr_dyn(iwhandler, begs_blr_dynamic)
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 zmumps_truncated_rrqr(m, n, a, lda, jpvt, tau, work, ldw, rwork, toleps, tol_opt, rank, maxrank, info, islr)