19 & A, LA, POSELT, IFLAG, IERROR, NFRONT,
20 & BEGS_BLR, NB_BLR, CURRENT_BLR, BLR_L,
22 & MAXI_CLUSTER, NPIV, NIV,
23 & MIDBLK_COMPRESS, TOLEPS, TOL_OPT, KPERCENT)
25 INTEGER(8),
intent(in) :: LA
26 INTEGER(8),
intent(in) :: POSELT
27 INTEGER,
intent(in) :: NFRONT, NB_BLR, CURRENT_BLR,
28 & , MAXI_CLUSTER, NPIV, NIV, TOL_OPT
29 INTEGER,
intent(inout) :: IFLAG, IERROR
30 COMPLEX(kind=8),
intent(inout) :: A(LA)
31 TYPE(lrb_type),
intent(in) :: BLR_L(:)
32 COMPLEX(kind=8),
INTENT(INOUT) :: BLOCK(MAXI_CLUSTER,*)
33 INTEGER,
intent(in) :: IW2(*)
34 INTEGER,
DIMENSION(:) :: BEGS_BLR
35 INTEGER,
intent(in) :: MIDBLK_COMPRESS, KPERCENT
36 DOUBLE PRECISION,
intent(in) :: TOLEPS
37 INTEGER :: I, NB_BLOCKS_PANEL, J,
44 INTEGER(8) :: POSELTT, POSELTD
45 COMPLEX(kind=8) :: ONE, MONE, ZERO
46 PARAMETER (ONE=(1.0d0,0.0d0), mone=(-1.0d0,0.0d0))
47 parameter(zero=(0.0d0,0.0d0))
48 nb_blocks_panel = nb_blr-current_blr
49 poseltd = poselt + int(nfront,8) * int(begs_blr(current_blr)-1,8)
50 & + int(begs_blr(current_blr) - 1,8)
58 DO ibis = 1, (nb_blocks_panel*(nb_blocks_panel+1)/2)
60 i = ceiling((1.0d0+sqrt(1.0d0+8.0d0*dble(ibis)))/2.0d0)-1
66 poseltt = poselt + int(nfront,8) *
67 & int(begs_blr(current_blr+i)-1,8)
68 & + int(begs_blr(current_blr+j) - 1, 8)
70 & blr_l(j), blr_l(i), one, a, la,
71 & poseltt, nfront, 1, iflag, ierror,
72 & midblk_compress, toleps, tol_opt, kpercent,
74 & .false., maxi_cluster=maxi_cluster,
75 & diag=a(poseltd), ld_diag=nfront, iw2=iw2,
76 & block=block(1:maxi_cluster,omp_num*maxi_cluster+1))
78 CALL upd_flop_update(blr_l(j), blr_l(i),
79 & midblk_compress, mid_rank, buildq,
87 & IFLAG, IERROR, NCOL, NROW,
88 & A_BLOCFACTO, LA_BLOCFACTO, LD_BLOCFACTO,
89 & BEGS_BLR_LM, NB_BLR_LM, BLR_LM, ISHIFT_LM,
90 & BEGS_BLR_LS, NB_BLR_LS, BLR_LS, ISHIFT_LS,
91 & CURRENT_BLR_LM, CURRENT_BLR_LS,
94 & MIDBLK_COMPRESS, TOLEPS, TOL_OPT, KPERCENT
97 INTEGER(8),
intent(in) :: LA, LA_BLOCFACTO
98 COMPLEX(kind=8),
intent(inout) :: A(LA)
99 COMPLEX(kind=8),
intent(in) :: A_BLOCFACTO(LA_BLOCFACTO)
100 INTEGER(8),
intent(in) :: POSELT
101 INTEGER,
intent(inout) :: IFLAG, IERROR
102 INTEGER,
intent(in) :: NCOL, , IW2(*), TOL_OPT,
104 INTEGER,
intent(in) :: , NB_BLR_LS,
106 & CURRENT_BLR_LM, CURRENT_BLR_LS
107 COMPLEX(kind=8),
INTENT(INOUT) :: BLOCK(MAXI_CLUSTER,*)
108 INTEGER,
DIMENSION(:) :: BEGS_BLR_LM, BEGS_BLR_LS
109 TYPE(LRB_TYPE),
intent(in) :: (NB_BLR_LM-CURRENT_BLR_LM),
110 & BLR_LS(NB_BLR_LS-CURRENT_BLR_LS)
111 INTEGER,
intent(in) :: MIDBLK_COMPRESS, KPERCENT
112 DOUBLE PRECISION,
intent(in) ::
113 INTEGER :: I, NB_BLOCKS_PANEL_LM, NB_BLOCKS_PANEL_LS, J, MID_RANK
120 INTEGER(8) :: POSELTT, POSELTD
121 COMPLEX(kind=8) :: ONE, MONE, ZERO
122 parameter(one=(1.0d0,0.0d0), mone=(-1.0d0,0.0d0))
123 parameter(zero=(0.0d0,0.0d0))
124 nb_blocks_panel_lm = nb_blr_lm-current_blr_lm
125 nb_blocks_panel_ls = nb_blr_ls-current_blr_ls
133 DO ibis = 1, (nb_blocks_panel_ls*nb_blocks_panel_lm)
134 IF (iflag.LT.0) cycle
135 i = (ibis-1)/nb_blocks_panel_lm+1
136 j = ibis - (i-1)*nb_blocks_panel_lm
143 & int((begs_blr_ls(current_blr_ls+i)+ishift_ls-1),8)
144 & + int((begs_blr_lm(current_blr_lm+j)+ishift_lm-1),8)
146 & blr_lm(j), blr_ls(i), one, a, la,
149 & midblk_compress, toleps, tol_opt, kpercent,
151 & .false., maxi_cluster=maxi_cluster,
152 & diag=a_blocfacto, ld_diag=ld_blocfacto, iw2=iw2,
153 & block=block(1:maxi_cluster,omp_num*maxi_cluster+1))
154 IF (iflag.LT.0) cycle
155 CALL upd_flop_update(blr_lm(j), blr_ls(i),
156 & midblk_compress, mid_rank, buildq,
161 IF (iflag.LT.0)
RETURN
165 DO ibis = 1, (nb_blocks_panel_ls*(nb_blocks_panel_ls+1)/2)
166 IF (iflag.LT.0) cycle
167 i = ceiling((1.0d0+sqrt(1.0d0+8.0d0*dble(ibis)))/2.0d0)-1
175 & int((begs_blr_ls(current_blr_ls+i)+ishift_ls-1),8)
176 & + int((ncol-nrow+(begs_blr_ls(current_blr_ls+j)-1)),8)
178 & blr_ls(j),blr_ls(i), one, a, la,
181 & midblk_compress, toleps, tol_opt, kpercent,
183 & .false., maxi_cluster=maxi_cluster,
184 & diag=a_blocfacto, ld_diag=ld_blocfacto, iw2=iw2,
185 & block=block(1:maxi_cluster,omp_num*maxi_cluster+1))
186 IF (iflag.LT.0) cycle
187 CALL upd_flop_update(blr_ls(j), blr_ls(i),
188 & midblk_compress, mid_rank, buildq,
197 & A, LA, POSELT, IFLAG, IERROR, NFRONT,
198 & BEGS_BLR, CURRENT_BLR, BLR_U, NB_BLR,
199 & FIRST_BLOCK, IBEG_BLR, NPIV, NELIM)
201 INTEGER(8),
intent(in) :: LA
202 INTEGER(8),
intent(in) :: POSELT
203 INTEGER,
intent(in) :: NFRONT, NB_BLR, CURRENT_BLR,
204 & ibeg_blr, npiv, nelim, first_block
205 INTEGER,
intent(inout) :: IFLAG, IERROR
206 COMPLEX(kind=8),
TARGET,
intent(inout) :: A(LA)
207 TYPE(),
TARGET,
intent(in) :: BLR_U(:)
208 INTEGER,
DIMENSION(:) :: BEGS_BLR
209 TYPE(LRB_TYPE),
POINTER :: LRB
212 INTEGER(8) :: LPOS, UPOS
213 COMPLEX(kind=8),
ALLOCATABLE,
DIMENSION(:,:) :: TEMP_BLOCK
214 COMPLEX(kind=8) :: ONE, MONE, ZERO
215 PARAMETER (ONE=(1.0d0,0.0d0), mone=(-1.0d0,0.0d0))
216 parameter(zero=(0.0d0,0.0d0))
218 lpos = poselt + int(nfront,8)*int(npiv,8) + int(ibeg_blr-1,8)
222 DO ip = first_block, nb_blr
223 IF (iflag.LT.0) cycle
224 lrb => blr_u(ip-current_blr)
225 upos = poselt + int(nfront,8)*int(npiv,8)
226 & + int(begs_blr(ip)-1,8)
229 allocate(temp_block( lrb%K, nelim ), stat
230 IF (allocok .GT. 0)
THEN
232 ierror = nelim * lrb%K
235 CALL zgemm(
'N',
'N', lrb%K, nelim, lrb%N, one,
236 & lrb%R(1,1), lrb%K, a(lpos), nfront,
237 & zero, temp_block, lrb%K)
238 CALL zgemm(
'N',
'N', lrb%M, nelim, lrb%K, mone,
239 & lrb%Q(1,1), lrb%M, temp_block, lrb%K,
240 & one, a(upos), nfront)
241 deallocate(temp_block)
244 CALL zgemm(
'N',
'N', lrb%M, nelim, lrb%N, mone,
245 & lrb%Q(1,1), lrb%M, a(lpos), nfront,
246 & one, a(upos), nfront)
256 & A_U, LA_U, UPOS, A_L, LA_L, LPOS, IFLAG, IERROR, LDU, LDL,
257 & BEGS_BLR_L, CURRENT_BLR, BLR_L, NB_BLR_L,
258 & FIRST_BLOCK, NELIM, UTRANS)
260 INTEGER(8),
intent(in) :: LA_U, LA_L
261 INTEGER(8),
intent(in) :: UPOS, LPOS
262 INTEGER,
intent(in) :: LDU, LDL, NB_BLR_L, CURRENT_BLR,
264 CHARACTER(len=1),
INTENT(IN) :: UTRANS
265 INTEGER,
intent(inout) :: IFLAG, IERROR
266 COMPLEX(kind=8),
TARGET,
intent(inout) :: A_L(LA_L), A_U(LA_U)
267 TYPE(lrb_type),
intent(in) :: BLR_L(:)
268 INTEGER :: BEGS_BLR_L(:)
269 INTEGER :: I, NB_BLOCKS_PANEL_L, KL, ML, NL
272 COMPLEX(kind=8),
ALLOCATABLE,
DIMENSION(:,:) :: TEMP_BLOCK
273 COMPLEX(kind=8) :: ONE, MONE, ZERO
274 parameter(one=(1.0d0,0.0d0), mone=(-1.0d0,
275 parameter(zero=(0.0d0,0.0d0))
276 nb_blocks_panel_l = nb_blr_l-current_blr
281 DO i = first_block-current_blr, nb_blocks_panel_l
282 IF (iflag.LT.0) cycle
286 ipos = lpos + int(ldl,8) *
287 & int(begs_blr_l(current_blr+i)-begs_blr_l(current_blr
288 IF (blr_l(i)%ISLR)
THEN
290 allocate(temp_block( nelim, kl ), stat=allocok )
291 IF (allocok .GT. 0)
THEN
294 write(*,*)
'Allocation problem in BLR routine
295 & ZMUMPS_BLR_UPD_NELIM_VAR_L: ',
296 &
'not enough memory? memory requested = ', ierror
299 CALL zgemm(utrans ,
'T' , nelim, kl, nl , one ,
300 & a_u(upos) , ldu , blr_l(i)%R(1,1) , kl ,
302 CALL zgemm(
'N' ,
'T' , nelim , ml , kl , mone ,
303 & temp_block , nelim , blr_l(i)%Q(1,1) , ml ,
304 & one , a_l(ipos) , ldl)
305 deallocate(temp_block)
308 CALL zgemm(utrans ,
'T' , nelim, ml, nl , mone ,
309 & a_u(upos) , ldu , blr_l(i)%Q(1,1) , ml ,
310 & one , a_l(ipos) , ldl)
320 & A, LA, POSELT, IFLAG, IERROR, NFRONT,
321 & BEGS_BLR_L, BEGS_BLR_U, CURRENT_BLR, BLR_L, NB_BLR_L,
323 & NB_BLR_U, NELIM, LBANDSLAVE, ISHIFT, NIV, SYM,
324 & MIDBLK_COMPRESS, TOLEPS, TOL_OPT, KPERCENT)
326 INTEGER(8),
intent(in) :: LA
327 INTEGER(8),
intent(in) :: POSELT
328 INTEGER,
intent(in) :: NFRONT, NB_BLR_L, NB_BLR_U,
330 & nelim, niv, sym, tol_opt
331 INTEGER,
intent(inout) :: IFLAG, IERROR
332 LOGICAL,
intent(in) :: LBANDSLAVE
333 INTEGER,
intent(in) :: ISHIFT
334 COMPLEX(kind=8),
intent(inout) :: A(LA)
335 TYPE(LRB_TYPE),
TARGET,
intent(in) :: BLR_U(:)
336 TYPE(lrb_type),
TARGET,
intent(in) :: BLR_L(:)
337 INTEGER :: BEGS_BLR_L(:), BEGS_BLR_U(:)
338 INTEGER,
intent(in) :: MIDBLK_COMPRESS, KPERCENT
339 DOUBLE PRECISION,
intent(in) :: TOLEPS
340 INTEGER :: I, NB_BLOCKS_PANEL_L, NB_BLOCKS_PANEL_U,
341 & KL, ML, NL, J, IS, MID_RANK
349 INTEGER(8) :: POSELT_INCB, POSELT_TOP
350 COMPLEX(kind=8),
ALLOCATABLE,
DIMENSION(:,:) :: TEMP_BLOCK
351 COMPLEX(kind=8) :: ONE, MONE, ZERO
352 parameter(one=(1.0d0,0.0d0), mone=(-1.0d0,0.0d0))
353 parameter(zero=(0.0d0,0.0d0))
354 nb_blocks_panel_l = nb_blr_l-current_blr
355 nb_blocks_panel_u = nb_blr_u-current_blr
365 DO i = 1, nb_blocks_panel_l
369 IF (blr_l(i)%ISLR)
THEN
371 allocate(temp_block( nelim, kl ), stat=allocok )
372 IF (allocok .GT. 0)
THEN
378 & + int(nfront,8) * int((begs_blr_u(current_blr)-1),8)
379 & + int(begs_blr_u(current_blr+1) + is - nelim - 1,8)
381 & + int(nfront,8) * int((begs_blr_l(current_blr+i)-1),8)
382 & + int(begs_blr_u(current_blr+1)+is-nelim-1,8)
383 CALL zgemm(
'N' ,
'T' , nelim, kl, nl , one ,
384 & a(poselt_top) , nfront , blr_l(i)%R(1,1) , kl ,
385 & zero , temp_block , nelim)
386 CALL zgemm(
'N' ,
'T' , nelim , ml , kl , mone ,
387 & temp_block , nelim , blr_l(i)%Q(1,1) , ml ,
388 & one , a(poselt_incb) , nfront)
389 deallocate(temp_block)
393 & + int(nfront,8) * int((begs_blr_l(current_blr)-1),8)
394 & + int(begs_blr_u(current_blr+1)+is-nelim-1,8)
396 & + int(nfront,8) * int((begs_blr_l(current_blr+i)-1),8)
397 & + int(begs_blr_u(current_blr+1) + is - nelim - 1, 8)
398 CALL zgemm(
'N' ,
'T' , nelim, ml, nl , mone ,
399 & a(poselt_top) , nfront , blr_l(i)%Q(1,1) , ml ,
400 & one , a(poselt_incb) , nfront)
408 IF (iflag.LT.0)
GOTO 200
415 DO ibis = 1, (nb_blocks_panel_l*nb_blocks_panel_u)
416 IF (iflag.LT.0) cycle
417 i = (ibis-1)/nb_blocks_panel_u+1
418 j = ibis - (i-1)*nb_blocks_panel_u
420 & + int(nfront,8) * int((begs_blr_l(current_blr+i)-1),8)
421 & + int(begs_blr_u(current_blr+j) +is - 1,8)
423 & blr_l(i), one, a, la, poselt_incb,
424 & nfront, 0, iflag, ierror,
425 & midblk_compress, toleps, tol_opt,
426 & kpercent, mid_rank, buildq, .false.)
427 IF (iflag.LT.0) cycle
428 CALL upd_flop_update(blr_u(j), blr_l(i),
429 & midblk_compress, mid_rank, buildq,
438 & A, LA, POSELT, NFRONT, IWHANDLER,
439 & BEGS_BLR, CURRENT_BLR, NB_BLR, NPARTSASS,
440 & NELIM, IW2, BLOCK, ACC_LUA,
441 & MAXI_CLUSTER, MAXI_RANK, NIV, IFLAG, IERROR,
442 & MIDBLK_COMPRESS, TOLEPS, TOL_OPT, KPERCENT_RMB,
443 & K480, K479, K478, KPERCENT_LUA, KPERCENT,
448 INTEGER(8),
intent(in) :: LA
449 INTEGER(8),
intent(in) :: POSELT
450 INTEGER,
intent(in) :: NFRONT, NB_BLR, NPARTSASS,
451 & current_blr, iwhandler, tol_opt,
452 & nelim, niv, k480, k479, k478,
453 & maxi_cluster, maxi_rank,
454 & kpercent_lua, kpercent
455 COMPLEX(kind=8),
intent(inout) :: A(LA)
456 INTEGER,
intent(in) :: IW2(*)
457 COMPLEX(kind=8) :: BLOCK(MAXI_CLUSTER,*)
458 TYPE(LRB_TYPE),
POINTER :: ACC_LUA(:)
459 INTEGER(8) :: KEEP8(150)
460 INTEGER,
DIMENSION(:) :: BEGS_BLR
461 INTEGER,
intent(in) :: MIDBLK_COMPRESS, KPERCENT_RMB
462 DOUBLE PRECISION,
intent(in) :: TOLEPS
463 INTEGER,
intent(inout) :: IFLAG, IERROR
464 INTEGER,
OPTIONAL,
intent(in) :: FIRST_BLOCK
465 TYPE(lrb_type),
POINTER :: (:), (:)
466 TYPE(LRB_TYPE),
POINTER :: ACC_LRB
467 INTEGER :: OLD_ACC_RANK, MAX_ACC_RANK, NEW_ACC_RANK, FRFR_UPDATES,
468 & I, II, J, JJ, NB_BLOCKS_PANEL, IND_U, IND_L, K_MAX,
469 & maxrank, nb_dec, fr_rank
470 INTEGER :: MID_RANK, allocok
471 INTEGER :: J_ORDER(CURRENT_BLR), J_RANK(CURRENT_BLR)
472 INTEGER,
ALLOCATABLE :: POS_LIST(:), RANK_LIST(:)
473 LOGICAL :: BUILDQ, COMPRESSED_FR
479 INTEGER(8) :: POSELT_INCB, POSELTD
480 COMPLEX(kind=8) :: ONE, MONE, ZERO
481 PARAMETER (ONE=(1.0d0,0.0d0), mone=(-1.0d0,0.0d0))
482 parameter(zero=(0.0d0,0.0d0))
483 nb_blocks_panel = nb_blr-current_blr
484 acc_lrb => acc_lua(1)
486 IF (nb_blocks_panel.GT.1)
THEN
487 CALL zmumps_blr_retrieve_panel_loru(
490 & current_blr+1, next_blr_l)
492 IF (.not.(
present(first_block)))
THEN
493 write(*,*)
"Internal error in
494 & ZMUMPS_BLR_UPD_PANEL_LEFT_LDLT: KEEP(480)=",k480,
495 &
">= 5, but FIRST_BLOCK argument is missing"
509 DO i = 1, nb_blocks_panel
511 IF (iflag.LT.0) cycle
514 acc_lrb => acc_lua(omp_num+1)
517 & + int(nfront,8) * int((begs_blr(current_blr+i)-1),8)
518 & + int(begs_blr(current_blr+1)-1,8)
519 acc_lrb%N = begs_blr(current_blr+i+1)-begs_blr(current_blr+i)
520 acc_lrb%M = begs_blr(current_blr+2)-begs_blr(current_blr+1)
523 compressed_fr = .false.
525 DO j = 1, current_blr
535 IF ((k480.GE.5).AND.(i.NE.1))
THEN
536 IF (i.GT.first_block)
THEN
537 IF (frfr_updates.EQ.0)
THEN
539 & maxi_cluster, maxi_rank, a, la, poselt_incb,
540 & nfront, niv, toleps, tol_opt, kpercent,
541 & compressed_fr, 0, .false.)
542 max_acc_rank = acc_lrb%K
543 new_acc_rank = acc_lrb%K
548 nb_dec = frfr_updates
549 DO jj = 1, current_blr
552 poseltd = poselt + int(nfront,8) * int(begs_blr(j)-1,8)
553 & + int(begs_blr(j) - 1,8)
554 offset_iw = begs_blr(j)
555 ind_l = current_blr+i-j
556 ind_u = current_blr+1-j
557 CALL zmumps_blr_retrieve_panel_loru(
561 IF (blr_l(ind_l)%M.EQ.0)
THEN
565 IF (acc_lrb%K+k_max.GT.maxi_rank)
THEN
568 & maxi_rank, a, la, poselt_incb, nfront, niv, 0)
569 compressed_fr = .false.
572 old_acc_rank = acc_lrb%K
575 & blr_l(ind_u), blr_l(ind_l), one,
576 & a, la, poselt_incb,
577 & nfront, 1, iflag, ierror,
578 & midblk_compress, toleps, tol_opt,
579 & kpercent_rmb, mid_rank, buildq,
580 & (k480.GE.3), loru=0,
581 & lrb3=acc_lrb, maxi_rank=maxi_rank,
582 & maxi_cluster=maxi_cluster,
583 & diag=a(poseltd), ld_diag=nfront,
584 & iw2=iw2(offset_iw),
585 & block=block(1:maxi_cluster,omp_num*maxi_cluster+1))
586 IF (iflag.LT.0)
GOTO 100
587 CALL upd_flop_update(blr_l(ind_u),
588 & blr_l(ind_l), midblk_compress,
589 & mid_rank, buildq, (i.EQ.1), (k480.GE.3))
590 IF ((midblk_compress.GE.1).AND.buildq)
THEN
591 j_rank(jj) = mid_rank
594 new_acc_rank = new_acc_rank + acc_lrb%K - old_acc_rank
595 max_acc_rank =
max(max_acc_rank, acc_lrb%K - old_acc_rank)
597 IF ((k478.GT.0).AND.((acc_lrb%K-max_acc_rank).GE.k478))
599 IF (acc_lrb%K.GT.0)
THEN
601 & maxi_cluster, maxi_rank, a, la, poselt_incb,
602 & nfront, niv, midblk_compress, toleps,
604 & kpercent_rmb, kpercent_lua, new_acc_rank)
605 max_acc_rank = acc_lrb%K
609 IF ((k480.GE.5).AND.(i.NE.1))
THEN
610 IF (i.GT.first_block)
THEN
611 IF (jj.EQ.frfr_updates)
THEN
613 & maxi_cluster, maxi_rank, a, la, poselt_incb,
614 & nfront, niv, toleps, tol_opt, kpercent,
615 & compressed_fr, 0, .false.)
616 max_acc_rank = acc_lrb%K
617 new_acc_rank = acc_lrb%K
618 IF (compressed_fr)
THEN
619 j_rank(jj) = acc_lrb%K
620 nb_dec = frfr_updates-1
628 IF ((k480.GE.5))
THEN
629 IF (compressed_fr.OR.(k480.GE.6))
THEN
630 IF (acc_lrb%K.GT.0)
THEN
632 IF (current_blr-frfr_updates.GT.1)
THEN
634 & maxi_cluster, maxi_rank, a, la, poselt_incb,
635 & nfront, niv, midblk_compress, toleps, tol_opt,
636 & kpercent_rmb, kpercent_lua, new_acc_rank)
638 ELSEIF (k478.LE.-2)
THEN
639 IF (frfr_updates.GT.0)
THEN
640 allocate(pos_list(current_blr-nb_dec
641 IF (allocok .GT. 0)
THEN
643 ierror = current_blr-nb_dec
644 write(*,*)
'Allocation problem in BLR routine ',
645 &
'ZMUMPS_BLR_UPD_PANEL_LEFT_LDLT: ',
646 &
'not enough memory? memory requested = ',
651 DO ii = 1,current_blr-nb_dec-1
652 pos_list(ii+1)=pos_list(ii)+j_rank(nb_dec+ii)
655 & maxi_cluster, maxi_rank, a, la, poselt_incb, keep8,
656 & nfront, niv, midblk_compress, toleps, tol_opt,
657 & kpercent_rmb, kpercent_lua, k478,
658 & j_rank(nb_dec+1:current_blr), pos_list,
659 & current_blr-nb_dec, 0)
661 allocate(pos_list(current_blr+1),stat=allocok)
662 IF (allocok .GT. 0)
THEN
664 ierror = current_blr+1
665 write(*,*)
'Allocation problem in BLR routine ',
666 &
'ZMUMPS_BLR_UPD_PANEL_LEFT_LDLT: ',
667 &
'not enough memory? memory requested = ',
672 pos_list(2) = 1 + fr_rank
673 DO ii = 2,current_blr
674 pos_list(ii+1)=pos_list(ii)+j_rank(ii-1)
676 allocate(rank_list(current_blr+1),stat
677 IF (allocok .GT. 0)
THEN
679 ierror = current_blr+1
680 write(*,*)
'Allocation problem in BLR routine ',
681 &
'ZMUMPS_BLR_UPD_PANEL_LEFT_LDLT: ',
682 &
'not enough memory? memory requested = ',
686 rank_list(1) = fr_rank
687 DO ii = 2,current_blr+1
688 rank_list(ii) = j_rank(ii-1)
691 & maxi_cluster, maxi_rank, a, la, poselt_incb, keep8,
692 & nfront, niv, midblk_compress, toleps, tol_opt,
693 & kpercent_rmb, kpercent_lua, k478,
694 & rank_list, pos_list,
696 deallocate(rank_list)
702 maxrank = floor(dble(acc_lrb%M*acc_lrb%N)/dble(acc_lrb%M+
704 IF (compressed_fr.AND.(acc_lrb%K.LE.maxrank))
THEN
706 & acc_lrb%K, acc_lrb%M, acc_lrb%N, 0,
707 & iflag, ierror, keep8)
708 IF (iflag.LT.0) cycle
711 IF (i.NE.1) next_blr_l(i-1)%ISLR=.false.
713 & maxi_rank, a, la, poselt_incb, nfront, niv, 0)
716 IF ((k480.EQ.4).AND.(k478.EQ.-1).AND.(acc_lrb%K.GT.0))
THEN
717 IF (current_blr-frfr_updates.GT.1)
THEN
719 & maxi_cluster, maxi_rank, a, la, poselt_incb,
720 & nfront, niv, midblk_compress, toleps, tol_opt,
721 & kpercent_rmb, kpercent_lua, new_acc_rank)
723 ELSEIF ((k480.EQ.4).AND.(k478.LE.-2).AND.(acc_lrb%K.GT.0))
725 allocate(pos_list(current_blr-nb_dec),stat=allocok)
726 IF (allocok .GT. 0)
THEN
728 ierror = current_blr-nb_dec
732 DO ii = 1,current_blr-nb_dec-1
733 pos_list(ii+1)=pos_list(ii)+j_rank(nb_dec+ii)
736 & maxi_cluster, maxi_rank, a, la, poselt_incb, keep8,
737 & nfront, niv, midblk_compress, toleps, tol_opt,
738 & kpercent_rmb, kpercent_lua, k478,
739 & j_rank(nb_dec+1:current_blr), pos_list,
740 & current_blr-nb_dec, 0)
744 & maxi_rank, a, la, poselt_incb, nfront, niv, 0)
754 & A, LA, POSELT, NFRONT, IWHANDLER, LorU,
755 & BEGS_BLR, BEGS_BLR_U, CURRENT_BLR, ACC_LUA,
756 & NB_BLR, NPARTSASS, NELIM, NIV, SYM,
757 & LBANDSLAVE, IFLAG, IERROR, ISHIFT,
758 & MIDBLK_COMPRESS, TOLEPS, TOL_OPT, KPERCENT_RMB,
759 & K480, K479, K478, KPERCENT_LUA, KPERCENT,
760 & MAXI_CLUSTER, MAXI_RANK,
761 & K474, FSorCB, BLR_U_COL, KEEP8,
762 & FIRST_BLOCK, BEG_I_IN, END_I_IN)
764 INTEGER(8),
intent(in) :: LA
765 INTEGER(8),
intent(in) :: POSELT
766 INTEGER,
intent(in) :: NFRONT, NB_BLR, NPARTSASS,
767 & CURRENT_BLR, IWHANDLER, LorU,
768 & nelim, niv, sym, k480, k479, k478,
769 & maxi_cluster, maxi_rank,
770 & kpercent_lua, kpercent, ishift,
772 LOGICAL,
intent(in) :: LBANDSLAVE
773 COMPLEX(kind=8),
TARGET,
intent(inout) :: A()
774 TYPE(lrb_type),
POINTER :: ACC_LUA(:), BLR_U_COL(:)
775 INTEGER(8) :: KEEP8(150)
776 INTEGER,
DIMENSION(:) :: BEGS_BLR, BEGS_BLR_U
777 INTEGER,
intent(in) :: MIDBLK_COMPRESS, KPERCENT_RMB, TOL_OPT
778 DOUBLE PRECISION,
intent(in) :: TOLEPS
779 INTEGER,
intent(inout) :: IFLAG, IERROR
780 INTEGER,
OPTIONAL,
intent(in) :: FIRST_BLOCK
781 INTEGER,
OPTIONAL,
intent(in) :: BEG_I_IN, END_I_IN
782 TYPE(LRB_TYPE),
POINTER :: BLR_U(:), BLR_L(:), NEXT_BLR(:)
783 TYPE(LRB_TYPE),
POINTER :: ACC_LRB
784 INTEGER :: OLD_ACC_RANK, MAX_ACC_RANK, NEW_ACC_RANK, FRFR_UPDATES,
785 & nb_dec, fr_rank, maxrank, beg_i, end_i
786 INTEGER :: I,II,J,JJ, NB_BLOCKS_PANEL, IND_U, IND_L, K_MAX
787 INTEGER :: MID_RANK, allocok
788 INTEGER :: J_ORDER(CURRENT_BLR), J_RANK(CURRENT_BLR)
789 INTEGER,
ALLOCATABLE :: POS_LIST(:), RANK_LIST(:)
790 LOGICAL :: BUILDQ, COMPRESSED_FR
795 INTEGER(8) :: POSELT_INCB
796 COMPLEX(kind=8) :: ONE, MONE, ZERO
797 PARAMETER (ONE=(1.0d0,0.0d0), mone=(-1.0d0,0.0d0))
798 parameter(zero=(0.0d0,0.0d0))
799 IF (niv.EQ.2.AND.loru.EQ.0)
THEN
801 nb_blocks_panel = nb_blr
803 nb_blocks_panel = npartsass-current_blr
806 nb_blocks_panel = nb_blr-current_blr
808 acc_lrb => acc_lua(1)
810 IF (nb_blocks_panel.GT.1)
THEN
811 CALL zmumps_blr_retrieve_panel_loru(
814 & current_blr+1, next_blr)
816 IF (.not.(
present(first_block)))
THEN
817 write(*,*)
"Internal error in
818 & ZMUMPS_BLR_UPD_PANEL_LEFT: KEEP(480)=",k480,
819 & ">=5, but first_block argument is missing
"
828 END_I = NB_BLOCKS_PANEL
830 IF(present(BEG_I_IN)) THEN
831 BEG_I = BEG_I_IN - CURRENT_BLR
833 IF(present(END_I_IN)) THEN
834 END_I = END_I_IN - CURRENT_BLR
839!$OMP DO SCHEDULE(DYNAMIC,CHUNK)
840!$OMP& PRIVATE(I, J, JJ, POSELT_INCB, MID_RANK, BUILDQ,
841!$OMP& BLR_U, BLR_L, J_ORDER, J_RANK, K_MAX,
842!$OMP& IND_U, IND_L, OMP_NUM, ACC_LRB,
843!$OMP& MAX_ACC_RANK, OLD_ACC_RANK, NEW_ACC_RANK,
844!$OMP& FRFR_UPDATES, FR_RANK, COMPRESSED_FR)
847.LT.
IF (IFLAG0) CYCLE
850!$ OMP_NUM = OMP_GET_THREAD_NUM()
851 ACC_LRB => ACC_LUA(OMP_NUM+1)
856 & + int(NFRONT,8) * int((BEGS_BLR(I+1)-1),8)
857 & + int(BEGS_BLR_U(2)+ISHIFT-1,8)
858 ACC_LRB%N = BEGS_BLR(I+2)-BEGS_BLR(I+1)
859 ACC_LRB%M = BEGS_BLR_U(3)-BEGS_BLR_U(2)
865 & + int(NFRONT,8) * int((BEGS_BLR(CURRENT_BLR+I)-1),8)
866 & + int(BEGS_BLR(CURRENT_BLR+1)-1,8)
867 ACC_LRB%N = BEGS_BLR(CURRENT_BLR+I+1)
868 & -BEGS_BLR(CURRENT_BLR+I)
869 ACC_LRB%M = BEGS_BLR(CURRENT_BLR+2)-BEGS_BLR(CURRENT_BLR+1)
873 & + int(NFRONT,8) * int((BEGS_BLR(CURRENT_BLR+1)-1),8)
874 & + int(BEGS_BLR(CURRENT_BLR+I)-1,8)
875 ACC_LRB%N = BEGS_BLR(CURRENT_BLR+2)-BEGS_BLR(CURRENT_BLR+1)
876 ACC_LRB%M = BEGS_BLR(CURRENT_BLR+I+1)-BEGS_BLR(CURRENT_BLR+I)
880 COMPRESSED_FR = .FALSE.
882 DO J = 1, CURRENT_BLR
886 CALL ZMUMPS_GET_LUA_ORDER(CURRENT_BLR, J_ORDER, J_RANK,
890 & LBANDSLAVE, K474, BLR_U_COL)
893.GE..AND..NE.
IF ((K4805)(I1)) THEN
894.GT.
IF (IFIRST_BLOCK) THEN
895.EQ.
IF (FRFR_UPDATES0) THEN
896 CALL ZMUMPS_COMPRESS_FR_UPDATES(ACC_LRB,
897 & MAXI_CLUSTER, MAXI_RANK, A, LA, POSELT_INCB,
898 & NFRONT, NIV, TOLEPS, TOL_OPT, KPERCENT,
899 & COMPRESSED_FR, LorU, .FALSE.)
900 MAX_ACC_RANK = ACC_LRB%K
901 NEW_ACC_RANK = ACC_LRB%K
906 NB_DEC = FRFR_UPDATES
907 DO JJ = 1, CURRENT_BLR
914 IND_U = CURRENT_BLR+1-J
919 IND_L = CURRENT_BLR+I-J
920 IND_U = CURRENT_BLR+1-J
923 IND_L = CURRENT_BLR+1-J
924 IND_U = CURRENT_BLR+I-J
926 CALL ZMUMPS_BLR_RETRIEVE_PANEL_LORU(
930.EQ.
IF (BLR_L(IND_L)%M0) THEN
933.NOT..OR..LT.
IF (LBANDSLAVEK4742) THEN
934 CALL ZMUMPS_BLR_RETRIEVE_PANEL_LORU(
940.GT.
IF (ACC_LRB%K+K_MAXMAXI_RANK) THEN
942 CALL ZMUMPS_DECOMPRESS_ACC(ACC_LRB, MAXI_CLUSTER,
943 & MAXI_RANK, A, LA, POSELT_INCB, NFRONT, NIV, LorU)
944 COMPRESSED_FR = .FALSE.
947 OLD_ACC_RANK = ACC_LRB%K
949 CALL ZMUMPS_LRGEMM4(MONE,
950 & BLR_U(IND_U), BLR_L(IND_L), ONE,
951 & A, LA, POSELT_INCB,
952 & NFRONT, 0, IFLAG, IERROR,
953 & MIDBLK_COMPRESS, TOLEPS, TOL_OPT,
954 & KPERCENT_RMB, MID_RANK, BUILDQ,
955.GE.
& (K4803), LorU=LorU,
956 & LRB3=ACC_LRB, MAXI_RANK=MAXI_RANK,
957 & MAXI_CLUSTER=MAXI_CLUSTER
959.LT.
IF (IFLAG0) GOTO 100
960 CALL UPD_FLOP_UPDATE(BLR_U(IND_U), BLR_L(IND_L),
961 & MIDBLK_COMPRESS, MID_RANK, BUILDQ,
962.GE.
& .FALSE., (K4803))
963.GE..AND.
IF ((MIDBLK_COMPRESS1)BUILDQ) THEN
964 J_RANK(JJ) = MID_RANK
967 NEW_ACC_RANK = NEW_ACC_RANK + ACC_LRB%K - OLD_ACC_RANK
968 MAX_ACC_RANK = MAX(MAX_ACC_RANK, ACC_LRB%K - OLD_ACC_RANK)
970.GT..AND..GE.
IF ((K4780)((ACC_LRB%K-MAX_ACC_RANK)K478))
972 CALL ZMUMPS_RECOMPRESS_ACC(ACC_LRB,MAXI_CLUSTER,
973 & MAXI_RANK, A, LA, POSELT_INCB, NFRONT, NIV,
974 & MIDBLK_COMPRESS, TOLEPS, TOL_OPT, KPERCENT_RMB,
975 & KPERCENT_LUA, NEW_ACC_RANK)
976 MAX_ACC_RANK = ACC_LRB%K
980.GE..AND..NE.
IF ((K4805)(I1)) THEN
981.GT.
IF (IFIRST_BLOCK) THEN
982.EQ.
IF (JJFRFR_UPDATES) THEN
983 CALL ZMUMPS_COMPRESS_FR_UPDATES(ACC_LRB,
984 & MAXI_CLUSTER, MAXI_RANK, A, LA, POSELT_INCB,
985 & NFRONT, NIV, TOLEPS, TOL_OPT, KPERCENT,
986 & COMPRESSED_FR, LorU, .FALSE.)
987 MAX_ACC_RANK = ACC_LRB%K
988 NEW_ACC_RANK = ACC_LRB%K
989 IF (COMPRESSED_FR) THEN
990 J_RANK(JJ) = ACC_LRB%K
991 NB_DEC = FRFR_UPDATES-1
998.GE.
IF ((K4805)) THEN
999.OR..GE.
IF (COMPRESSED_FR(K4806)) THEN
1000.GT.
IF (ACC_LRB%K0) THEN
1001.EQ.
IF (K478-1) THEN
1002.GT.
IF (CURRENT_BLR-FRFR_UPDATES1) THEN
1003 CALL ZMUMPS_RECOMPRESS_ACC(ACC_LRB,
1004 & MAXI_CLUSTER, MAXI_RANK, A, LA, POSELT_INCB,
1005 & NFRONT, NIV, MIDBLK_COMPRESS, TOLEPS, TOL_OPT,
1006 & KPERCENT_RMB, KPERCENT_LUA, NEW_ACC_RANK)
1008.LE.
ELSEIF (K478-2) THEN
1009.GT.
IF (FRFR_UPDATES0) THEN
1010 allocate(POS_LIST(CURRENT_BLR-NB_DEC),stat=allocok)
1011.GT.
IF (allocok 0) THEN
1013 IERROR = CURRENT_BLR-NB_DEC
1014 write(*,*) 'Allocation problem in BLR routine ',
1015 & 'ZMUMPS_BLR_UPD_PANEL_LEFT: ',
1016 & 'not enough memory? memory requested = ',
1021 DO II = 1,CURRENT_BLR-NB_DEC-1
1022 POS_LIST(II+1)=POS_LIST(II)+J_RANK(NB_DEC+II)
1024 CALL ZMUMPS_RECOMPRESS_ACC_NARYTREE(ACC_LRB,
1025 & MAXI_CLUSTER, MAXI_RANK, A, LA, POSELT_INCB, KEEP8,
1026 & NFRONT, NIV, MIDBLK_COMPRESS, TOLEPS, TOL_OPT,
1027 & KPERCENT_RMB, KPERCENT_LUA, K478,
1028 & J_RANK(NB_DEC+1:CURRENT_BLR), POS_LIST,
1029 & CURRENT_BLR-NB_DEC, 0)
1031 allocate(POS_LIST(CURRENT_BLR+1),stat=allocok)
1032.GT.
IF (allocok 0) THEN
1034 IERROR = CURRENT_BLR+1
1035 write(*,*) 'Allocation problem in BLR routine ',
1036 & 'ZMUMPS_BLR_UPD_PANEL_LEFT: ',
1037 & 'not enough memory? memory requested = ',
1042 POS_LIST(2) = 1 + FR_RANK
1043 DO II = 2,CURRENT_BLR
1044 POS_LIST(II+1)=POS_LIST(II)+J_RANK(II-1)
1046 allocate(RANK_LIST(CURRENT_BLR+1),stat=allocok)
1047.GT.
IF (allocok 0) THEN
1049 IERROR = CURRENT_BLR+1
1050 write(*,*) 'Allocation problem in BLR routine ',
1051 & 'ZMUMPS_BLR_UPD_PANEL_LEFT: ',
1052 & 'not enough memory? memory requested = ',
1056 RANK_LIST(1) = FR_RANK
1057 DO II = 2,CURRENT_BLR+1
1058 RANK_LIST(II) = J_RANK(II-1)
1060 CALL ZMUMPS_RECOMPRESS_ACC_NARYTREE(ACC_LRB,
1061 & MAXI_CLUSTER, MAXI_RANK, A, LA, POSELT_INCB, KEEP8,
1062 & NFRONT, NIV, MIDBLK_COMPRESS, TOLEPS, TOL_OPT,
1063 & KPERCENT_RMB, KPERCENT_LUA, K478,
1064 & RANK_LIST, POS_LIST,
1066 deallocate(RANK_LIST)
1068 deallocate(POS_LIST)
1072 MAXRANK = FLOOR(dble(ACC_LRB%M*ACC_LRB%N)/dble(ACC_LRB%M+
1074.AND..LE.
IF (COMPRESSED_FR(ACC_LRB%KMAXRANK)) THEN
1075 CALL ALLOC_LRB_FROM_ACC(ACC_LRB, NEXT_BLR(I-1),
1076 & ACC_LRB%K, ACC_LRB%M, ACC_LRB%N, LorU,
1077 & IFLAG, IERROR, KEEP8)
1078.LT.
IF (IFLAG0) CYCLE
1081.NE.
IF (I1) NEXT_BLR(I-1)%ISLR=.FALSE.
1082 CALL ZMUMPS_DECOMPRESS_ACC(ACC_LRB,MAXI_CLUSTER,
1083 & MAXI_RANK, A, LA, POSELT_INCB, NFRONT, NIV, LorU)
1086.EQ..AND..EQ..AND..GT.
IF ((K4804)(K478-1)(ACC_LRB%K0)) THEN
1087.GT.
IF (CURRENT_BLR-FRFR_UPDATES1) THEN
1088 CALL ZMUMPS_RECOMPRESS_ACC(ACC_LRB,
1089 & MAXI_CLUSTER, MAXI_RANK, A, LA, POSELT_INCB,
1090 & NFRONT, NIV, MIDBLK_COMPRESS, TOLEPS, TOL_OPT,
1091 & KPERCENT_RMB, KPERCENT_LUA, NEW_ACC_RANK)
1093.EQ..AND..LE..AND..GT.
ELSEIF ((K4804)(K478-2)(ACC_LRB%K0))
1095 allocate(POS_LIST(CURRENT_BLR-NB_DEC),stat=allocok)
1096.GT.
IF (allocok 0) THEN
1098 IERROR = CURRENT_BLR-NB_DEC
1102 DO II = 1,CURRENT_BLR-NB_DEC-1
1103 POS_LIST(II+1)=POS_LIST(II)+J_RANK(NB_DEC+II)
1105 CALL ZMUMPS_RECOMPRESS_ACC_NARYTREE(ACC_LRB,
1106 & MAXI_CLUSTER, MAXI_RANK, A, LA, POSELT_INCB, KEEP8,
1107 & NFRONT, NIV, MIDBLK_COMPRESS, TOLEPS, TOL_OPT,
1108 & KPERCENT_RMB, KPERCENT_LUA, K478,
1109 & J_RANK(NB_DEC+1:CURRENT_BLR), POS_LIST,
1110 & CURRENT_BLR-NB_DEC, 0)
1111 deallocate(POS_LIST)
1113 CALL ZMUMPS_DECOMPRESS_ACC(ACC_LRB,MAXI_CLUSTER,
1114 & MAXI_RANK, A, LA, POSELT_INCB, NFRONT, NIV, LorU)