22 & (inode, n, iwhdlr, npiv_global, nslaves,
25 & ld_wcbpiv, ld_wcbcb,
26 & ppiv_init, pcb_init,
27 & rhscomp, lrhscomp, nrhs,
28 & posinrhscomp_fwd, jbdeb, jbfin,
29 & mtype, keep, keep8, oocwrite_compatible_with_blr,
31 INTEGER,
INTENT(IN) :: INODE, N, , NPIV_GLOBAL, NSLAVES
32 INTEGER,
INTENT(IN) :: MTYPE, LIELL, KEEP(500)
33 INTEGER(8),
INTENT(IN) :: KEEP8(150)
34 INTEGER,
INTENT(IN) :: LIW, IPOS_INIT, LRHSCOMP
35 INTEGER,
INTENT(IN) :: IW(LIW), POSINRHSCOMP_FWD(N)
36 INTEGER(8),
INTENT(IN) :: LWCB, PPIV_INIT, PCB_INIT
37 INTEGER,
INTENT(IN) :: LD_WCBPIV, LD_WCBCB, NRHS, JBDEB, JBFIN
38 COMPLEX,
INTENT(INOUT) :: WCB(LWCB)
39 INTEGER,
INTENT(INOUT) :: IFLAG, IERROR
40 COMPLEX,
INTENT(INOUT) :: RHSCOMP(LRHSCOMP, NRHS)
41 LOGICAL,
INTENT(IN) :: OOCWRITE_COMPATIBLE_WITH_BLR
42 INTEGER :: , NPARTSASS, NB_BLR , NELIM, LDADIAG,
43 & DIAGSIZ_DYN, DIAGSIZ_STA, IBEG_BLR, IEND_BLR,
44 & LD_CB, NELIM_GLOBAL, NRHS_B, , KCB
45 INTEGER(8) :: PPIV, PCB
47 COMPLEX,
POINTER,
DIMENSION(:) :: DIAG
48 TYPE(
lrb_type),
POINTER,
DIMENSION(:) :: BLR_PANEL
49 COMPLEX :: ONE, MONE, ZERO
50 parameter(one=(1.0e0,0.0e0), mone=(-1.0e0,0.0e0))
51 parameter(zero=(0.0e0,0.0e0))
52 nrhs_b = jbfin-jbdeb+1
54 IF (
associated(
blr_array(iwhdlr)%PANELS_L))
56 npartsass=
size(
blr_array(iwhdlr)%PANELS_L)
57 nb_blr =
size(
blr_array(iwhdlr)%BEGS_BLR_STATIC) -1
59 WRITE(6,*)
" Internal error in CMUMPS_SOL_FWD_SU_MASTER"
62 IF (
associated(
blr_array(iwhdlr)%PANELS_U))
64 npartsass=
size(
blr_array(iwhdlr)%PANELS_U)
65 nb_blr =
size(
blr_array(iwhdlr)%BEGS_BLR_STATIC) -1
68 IF (nslaves.EQ.0 .OR. (keep(50).eq.0 .and. mtype .NE.1))
THEN
76 &
blr_array(iwhdlr)%BEGS_BLR_STATIC(npartsass+1)
77 & -
blr_array(iwhdlr)%BEGS_BLR_DYNAMIC(npartsass+1)
79 ibeg_blr =
blr_array(iwhdlr)%BEGS_BLR_DYNAMIC(i)
80 iend_blr =
blr_array(iwhdlr)%BEGS_BLR_DYNAMIC(i+1) -1
81 diagsiz_dyn =
blr_array(iwhdlr)%BEGS_BLR_DYNAMIC(i+1) -
83 diagsiz_sta =
blr_array(iwhdlr)%BEGS_BLR_STATIC(i+1) -
85 IF (keep(50).NE.0)
THEN
90 IF (iend_blr.EQ.npiv_global)
THEN
93 pcb = ppiv + int(diagsiz_dyn,8)
95 IF ( diagsiz_dyn.EQ.0) cycle
96 nelim = diagsiz_sta - diagsiz_dyn
97 IF ( mtype .EQ. 1 )
THEN
98 blr_panel =>
blr_array(iwhdlr)%PANELS_L(i)%LRB_PANEL
100 blr_panel =>
blr_array(iwhdlr)%PANELS_U(i)%LRB_PANEL
102 diag =>
blr_array(iwhdlr)%DIAG_BLOCKS(i)%DIAG_BLOCK
104 & diagsiz_dyn , ldadiag, nrhs_b, wcb, lwcb, npiv_global,
107 kcb = int(pcb-ppiv_init+1)
108 IF (iend_blr.EQ.npiv_global)
THEN
114 IF (kcb.LE.npiv_global .AND.
115 & kcb+nelim-1.GT.npiv_global)
THEN
116 CALL cgemm(
'T',
'N', npiv_global-kcb+1, nrhs_b,
118 & diag(1+diagsiz_dyn*ldadiag), diagsiz_dyn,
119 & wcb(ppiv), ld_wcbpiv,
120 & one, wcb(pcb), ld_cb)
121 CALL cgemm(
'T',
'N', kcb+nelim-npiv_global-1,
122 & nrhs_b, diagsiz_dyn, mone,
123 & diag(1+diagsiz_dyn*ldadiag +
124 & (npiv_global-kcb+1)*diagsiz_dyn),
126 & wcb(ppiv), ld_wcbpiv,
127 & one, wcb(pcb_init), ld_wcbcb)
129 CALL cgemm(
'T',
'N', nelim, nrhs_b, diagsiz_dyn, mone,
130 & diag(1+diagsiz_dyn*ldadiag), diagsiz_dyn,
131 & wcb(ppiv), ld_wcbpiv,
132 & one, wcb(pcb), ld_cb)
135 IF (kcb.LE.npiv_global .AND.
136 & kcb+nelim-1.GT.npiv_global)
THEN
138 & nrhs_b, diagsiz_dyn, mone,
139 & diag(1+diagsiz_dyn), diagsiz_sta,
140 & wcb(ppiv), ld_wcbpiv,
142 CALL cgemm('n
', 'n
', KCB+NELIM-NPIV_GLOBAL-1,
143 & NRHS_B, DIAGSIZ_DYN, MONE,
144 & DIAG(1+DIAGSIZ_DYN+NPIV_GLOBAL-KCB+1),
146 & WCB(PPIV), LD_WCBPIV,
147 & ONE, WCB(PCB_INIT), LD_WCBCB)
149 CALL cgemm('n
', 'n
', NELIM, NRHS_B, DIAGSIZ_DYN, MONE,
150 & DIAG(1+DIAGSIZ_DYN), DIAGSIZ_STA,
151 & WCB(PPIV), LD_WCBPIV,
152 & ONE, WCB(PCB), LD_CB)
156 CALL CMUMPS_SOL_FWD_BLR_UPDATE (
157 & WCB, LWCB, 1, LD_WCBPIV, PPIV_INIT, 1,
158 & WCB, LWCB, LD_WCBCB, PCB_INIT,
160 & NRHS_B, NPIV_GLOBAL,
161 & BLR_PANEL, LAST_BLR, I,
162 & BLR_ARRAY(IWHDLR)%BEGS_BLR_STATIC,
163 & KEEP8, KEEP(34), KEEP(450), .FALSE.,
165.LT.
IF (IFLAG0) RETURN
166 CALL CMUMPS_SOL_LD_AND_RELOAD_PANEL (
167 & INODE, N, DIAGSIZ_DYN, LIELL, NELIM, NSLAVES,
170 & DIAG(1), int(size(DIAG),8), 1_8,
171 & WCB, LWCB, LD_WCBPIV,
172 & RHSCOMP, LRHSCOMP, NRHS,
173 & POSINRHSCOMP_FWD, JBDEB, JBFIN,
174 & MTYPE, KEEP, OOCWRITE_COMPATIBLE_WITH_BLR,
177 PPIV = PPIV + int(DIAGSIZ_DYN,8)
178 IPOS = IPOS + DIAGSIZ_DYN
246 SUBROUTINE CMUMPS_SOL_FWD_BLR_UPDATE (
247 & ARRAYPIV, LPIV, LPIVCOL, LDPIV, POSPIV, POSPIVCOL,
248 & ARRAYCB, LCB, LDCB, POSCB,
251 & BLR_PANEL, LAST_BLR,
252 & CURRENT_BLR, BEGS_BLR_STATIC,
253 & KEEP8, K34, K450, IS_T2_SLAVE, IFLAG, IERROR )
255 INTEGER(8), INTENT(IN) :: LPIV, LCB, POSPIV, POSCB, POSDIAG
256 INTEGER, INTENT(IN) :: LPIVCOL, POSPIVCOL
257 COMPLEX, INTENT(INOUT) :: ARRAYPIV(LPIV,LPIVCOL)
258 COMPLEX, INTENT(INOUT) :: ARRAYCB(LCB)
259 INTEGER, INTENT(IN) :: LAST_BLR, NRHS_B, LDPIV, LDCB,
260 & CURRENT_BLR, NPIV, K34, K450
261 TYPE(LRB_TYPE), TARGET,INTENT(IN) ::
263 INTEGER :: BEGS_BLR_STATIC(:)
264 LOGICAL, INTENT(IN) :: IS_T2_SLAVE
265 INTEGER(8), INTENT(IN) :: KEEP8(150)
266 INTEGER, INTENT(INOUT) :: IFLAG, IERROR
267 INTEGER :: I, K, M, N, IBEG_BLOCK, IEND_BLOCK
269 INTEGER(8) :: POSBLOCK
271 TYPE(LRB_TYPE), POINTER :: LRB
272 COMPLEX, ALLOCATABLE,DIMENSION(:) :: TEMP_BLOCK
273 COMPLEX :: ONE, MONE, ZERO
274 PARAMETER (ONE=(1.0E0,0.0E0), MONE=(-1.0E0,0.0E0))
275 PARAMETER (ZERO=(0.0E0,0.0E0))
277 DO I = CURRENT_BLR+1, LAST_BLR
278 KMAX = max(KMAX, BLR_PANEL(I-CURRENT_BLR)%K)
281!$OMP PARALLEL PRIVATE(TEMP_BLOCK, allocok)
284 allocate(TEMP_BLOCK(KMAX*NRHS_B), stat=allocok )
285.GT.
IF (allocok 0) THEN
287 IERROR = NRHS_B * KMAX
288 write(*,*) 'allocation problem in blr routine
290 & 'not enough memory? memory requested =
', IERROR
297!$OMP DO SCHEDULE(DYNAMIC,1)
298!$OMP& PRIVATE(IBEG_BLOCK, IEND_BLOCK, LRB, K, M, N,
301 DO I = CURRENT_BLR+1, LAST_BLR
302.LT.
IF (IFLAG0) CYCLE
303 IBEG_BLOCK = BEGS_BLR_STATIC(I)
304 IEND_BLOCK = BEGS_BLR_STATIC(I+1)-1
305.EQ.
IF (IBEG_BLOCK IEND_BLOCK + 1) CYCLE
306 LRB => BLR_PANEL(I-CURRENT_BLR)
312 CALL cgemm('n
', 'n
', K, NRHS_B, N, ONE,
313 & LRB%R(1,1), K, ARRAYPIV(POSDIAG,POSPIVCOL), LDPIV,
314 & ZERO, TEMP_BLOCK(1), K)
315 IF (IS_T2_SLAVE) THEN
316 POSBLOCK = POSCB+int(IBEG_BLOCK-1,8)
317 CALL cgemm('n
', 'n
', M, NRHS_B, K, MONE,
318 & LRB%Q(1,1), M, TEMP_BLOCK(1), K,
319 & ONE, ARRAYCB(POSBLOCK), LDCB)
320.LE..AND..GT.
ELSEIF (IBEG_BLOCKNPIVIEND_BLOCKNPIV) THEN
321 POSBLOCK = POSPIV+int(IBEG_BLOCK-1,8)
322 CALL cgemm('n
', 'n
', NPIV-IBEG_BLOCK+1, NRHS_B, K,
323 & MONE, LRB%Q(1,1), M, TEMP_BLOCK(1), K,
324 & ONE, ARRAYPIV(POSBLOCK,POSPIVCOL), LDPIV)
325 CALL cgemm('n
', 'n
', IBEG_BLOCK+M-NPIV-1, NRHS_B, K,
326 & MONE, LRB%Q(NPIV-IBEG_BLOCK+2,1), M, TEMP_BLOCK(1),
327 & K, ONE, ARRAYCB(POSCB), LDCB)
328.LE.
ELSEIF (IBEG_BLOCKNPIV) THEN
329 POSBLOCK = POSPIV+int(IBEG_BLOCK-1,8)
330 CALL cgemm('n
', 'n
', M, NRHS_B, K, MONE,
331 & LRB%Q(1,1), M, TEMP_BLOCK(1), K,
332 & ONE, ARRAYPIV(POSBLOCK,POSPIVCOL), LDPIV)
334 POSBLOCK = POSCB+int(IBEG_BLOCK-1-NPIV,8)
335 CALL cgemm('n
', 'n
', M, NRHS_B, K, MONE,
336 & LRB%Q(1,1), M, TEMP_BLOCK(1), K,
337 & ONE, ARRAYCB(POSBLOCK), LDCB)
341 IF (IS_T2_SLAVE) THEN
342 POSBLOCK = POSCB + int(IBEG_BLOCK-1,8)
343 CALL cgemm('n
', 'n', m, nrhs_b, n, mone,
344 & lrb%Q(1,1), m, arraypiv(posdiag,pospivcol), ldpiv,
345 & one, arraycb(posblock), ldcb)
346 ELSEIF (ibeg_block.LE.npiv.AND.iend_block.GT.npiv)
THEN
347 posblock = pospiv+int(ibeg_block-1,8)
348 CALL cgemm(
'N',
'N', npiv-ibeg_block+1, nrhs_b, n, mone,
349 & lrb%Q(1,1), m, arraypiv(posdiag,pospivcol), ldpiv,
350 & one, arraypiv(posblock,pospivcol), ldpiv)
351 CALL cgemm(
'N',
'N', ibeg_block+m-npiv
352 & lrb%Q(npiv-ibeg_block+2,1), m,
353 & arraypiv(posdiag,pospivcol),
354 & ldpiv, one, arraycb(poscb), ldcb)
355 ELSEIF (ibeg_block.LE.npiv)
THEN
356 posblock = pospiv+int(ibeg_block-1,8)
357 CALL cgemm(
'N',
'N', m, nrhs_b, n, mone,
358 & lrb%Q(1,1), m, arraypiv(posdiag,pospivcol), ldpiv,
359 & one, arraypiv(posblock,pospivcol), ldpiv)
361 posblock = poscb + int(ibeg_block-1-npiv,8)
362 CALL cgemm(
'N',
'N', m, nrhs_b, n, mone,
363 & lrb%Q(1,1), m, arraypiv(posdiag,pospivcol), ldpiv,
364 & one, arraycb(posblock), ldcb)
372 IF (
allocated(temp_block))
deallocate(temp_block)
380 & ( inode, iwhdlr, npiv_global, nslaves,
381 & liell, wcb, lwcb, nrhs_b, ptwcb,
382 & rhscomp, lrhscomp, nrhs,
383 & iposinrhscomp, jbdeb,
384 & mtype, keep, keep8,
386 INTEGER,
INTENT(IN) :: INODE, IWHDLR, NPIV_GLOBAL, NSLAVES
387 INTEGER,
INTENT(IN) :: MTYPE, LIELL, KEEP(500)
388 INTEGER(8),
INTENT(IN) :: KEEP8(150)
389 INTEGER,
INTENT(IN) :: IPOSINRHSCOMP, JBDEB, LRHSCOMP, NRHS
390 INTEGER(8),
INTENT(IN) :: LWCB, PTWCB
391 INTEGER,
INTENT(IN) :: NRHS_B
392 INTEGER,
INTENT(INOUT) :: IFLAG, IERROR
393 COMPLEX,
INTENT(INOUT) :: WCB(LWCB)
394 COMPLEX RHSCOMP(LRHSCOMP,NRHS)
395 INTEGER :: I, NPARTSASS, NB_BLR, LAST_BLR,
396 & NELIM_PANEL, LD_WCB,
397 & DIAGSIZ_DYN, DIAGSIZ_STA, LDADIAG,
398 & IEND_BLR, IBEG_BLR, PCBINRHSCOMP
400 INTEGER :: IPIV_PANEL
401 COMPLEX,
POINTER,
DIMENSION(:) :: DIAG
402 TYPE(
lrb_type),
POINTER,
DIMENSION(:) ::
403 COMPLEX :: ONE, MONE, ZERO
404 parameter(one=(1.0e0,0.0e0), mone=(-1.
405 parameter(zero=(0.0e0,0.0e0))
406 IF ((mtype.EQ.1).AND.(keep(50).EQ.0))
THEN
407 IF (
associated(
blr_array(iwhdlr)%PANELS_U))
409 npartsass=
size(
blr_array(iwhdlr)%PANELS_U)
410 nb_blr =
size(
blr_array(iwhdlr)%BEGS_BLR_STATIC) -1
413 IF (
associated(
blr_array(iwhdlr)%PANELS_L))
415 npartsass=
size(
blr_array(iwhdlr)%PANELS_L)
416 nb_blr =
size(
blr_array(iwhdlr)%BEGS_BLR_STATIC) -1
418 WRITE(6,*)
" Internal error in CMUMPS_SOL_FWD_SU_MASTER"
421 pcbinrhscomp= iposinrhscomp + npiv_global
422 pcb_last = ptwcb + int(liell ,8)
423 pwcb = ptwcb + int(npiv_global,8)
426 ibeg_blr =
blr_array(iwhdlr)%BEGS_BLR_DYNAMIC(i)
427 iend_blr =
blr_array(iwhdlr)%BEGS_BLR_DYNAMIC(i+1) -1
428 diagsiz_dyn =
blr_array(iwhdlr)%BEGS_BLR_DYNAMIC(i+1) -
430 diagsiz_sta =
blr_array(iwhdlr)%BEGS_BLR_STATIC(i+1) -
432 IF (keep(50).NE.0)
THEN
433 ldadiag = diagsiz_dyn
435 ldadiag = diagsiz_sta
437 IF (diagsiz_dyn.EQ.0) cycle
438 nelim_panel = diagsiz_sta - diagsiz_dyn
439 ipiv_panel = iposinrhscomp + ibeg_blr -1
440 IF ( mtype .EQ. 1 .AND. keep(50).EQ.0)
THEN
441 blr_panel =>
blr_array(iwhdlr)%PANELS_U(i)%LRB_PANEL
443 blr_panel =>
blr_array(iwhdlr)%PANELS_L(i)%LRB_PANEL
445 IF (keep(50).EQ.0 .AND. nslaves.GT.0 .AND. mtype.NE.1)
THEN
451 & rhscomp, int(lrhscomp,8), nrhs, lrhscomp,
452 & int(iposinrhscomp,8), jbdeb,
453 & wcb, lwcb, ld_wcb, pwcb
455 & nrhs_b, npiv_global,
456 & blr_panel, last_blr,
458 & keep8, keep(34), keep(450), .false., iflag, ierror)
459 IF (iflag.LT.0)
RETURN
460 diag =>
blr_array(iwhdlr)%DIAG_BLOCKS(i)%DIAG_BLOCK
461 IF (nelim_panel.GT.0)
THEN
462 IF (mtype.EQ.1.AND.keep(50).EQ.0)
THEN
463 IF (iend_blr.EQ.npiv_global)
THEN
464 CALL cgemm(
'T',
'N', diagsiz_dyn, nrhs_b, nelim_panel,
465 & mone, diag(1+diagsiz_dyn), diagsiz_sta, wcb(pwcb),
466 & ld_wcb, one , rhscomp(ipiv_panel,jbdeb),lrhscomp)
468 IF (iend_blr+1.LE.npiv_global .AND.
469 & iend_blr+nelim_panel.GT.npiv_global)
THEN
470 CALL cgemm(
'T',
'N', diagsiz_dyn, nrhs_b,
471 & npiv_global-iend_blr,
472 & mone, diag(1+diagsiz_dyn), diagsiz_sta,
473 & rhscomp(ipiv_panel+diagsiz_dyn,jbdeb), lrhscomp,
474 & one, rhscomp(ipiv_panel,jbdeb), lrhscomp)
475 CALL cgemm(
'T',
'N', diagsiz_dyn, nrhs_b,
476 & iend_blr+nelim_panel-npiv_global,
477 & mone, diag(1+diagsiz_dyn+npiv_global-iend_blr),
480 & one, rhscomp(ipiv_panel,jbdeb), lrhscomp)
482 CALL cgemm(
'T',
'N', diagsiz_dyn, nrhs_b, nelim_panel,
483 & mone, diag(1+diagsiz_dyn), diagsiz_sta,
484 & rhscomp(ipiv_panel+diagsiz_dyn,jbdeb), lrhscomp,
485 & one, rhscomp(ipiv_panel,jbdeb), lrhscomp)
489 IF (iend_blr.EQ.npiv_global)
THEN
490 CALL cgemm(
'N', 'n
', DIAGSIZ_DYN, NRHS_B, NELIM_PANEL,
491 & MONE, DIAG(1+DIAGSIZ_DYN*LDADIAG), DIAGSIZ_DYN,
492 & WCB(PWCB), LD_WCB, ONE,
493 & RHSCOMP(IPIV_PANEL,JBDEB), LRHSCOMP)
495.LE..AND.
IF (IEND_BLR+1NPIV_GLOBAL
496.GT.
& IEND_BLR+NELIM_PANELNPIV_GLOBAL) THEN
497 CALL cgemm('n
', 'n
', DIAGSIZ_DYN, NRHS_B,
498 & NPIV_GLOBAL-IEND_BLR,
499 & MONE, DIAG(1+DIAGSIZ_DYN*LDADIAG), DIAGSIZ_DYN,
500 & RHSCOMP(IPIV_PANEL+DIAGSIZ_DYN,JBDEB), LRHSCOMP,
501 & ONE, RHSCOMP(IPIV_PANEL,JBDEB), LRHSCOMP)
502 CALL cgemm('n
', 'n
', DIAGSIZ_DYN, NRHS_B,
503 & IEND_BLR+NELIM_PANEL-NPIV_GLOBAL,
504 & MONE, DIAG(1+DIAGSIZ_DYN*LDADIAG +
505 & (NPIV_GLOBAL-IEND_BLR)*DIAGSIZ_DYN),
508 & ONE, RHSCOMP(IPIV_PANEL,JBDEB), LRHSCOMP)
510 CALL cgemm('n
', 'n
', DIAGSIZ_DYN, NRHS_B, NELIM_PANEL,
511 & MONE, DIAG(1+DIAGSIZ_DYN*LDADIAG), DIAGSIZ_DYN,
512 & RHSCOMP(IPIV_PANEL+DIAGSIZ_DYN,JBDEB), LRHSCOMP,
513 & ONE, RHSCOMP(IPIV_PANEL,JBDEB), LRHSCOMP)
518.LT.
IF (IFLAG0) RETURN
519 CALL CMUMPS_SOLVE_BWD_LR_TRSOLVE (
520 & DIAG(1), size(DIAG), DIAGSIZ_DYN, NELIM_PANEL, LIELL,
522 & RHSCOMP, LRHSCOMP, NRHS,
subroutine cmumps_sol_bwd_blr_update(arraypiv, lpiv, lpivcol, ldpiv, pospiv, pospivcol, arraycb, lcb, ldcb, poscb, posdiag, nrhs_b, npiv, blr_panel, last_blr, current_blr, begs_blr_static, keep8, k34, k450, is_t2_slave, iflag, ierror)
subroutine cmumps_sol_bwd_lr_su(inode, iwhdlr, npiv_global, nslaves, liell, wcb, lwcb, nrhs_b, ptwcb, rhscomp, lrhscomp, nrhs, iposinrhscomp, jbdeb, mtype, keep, keep8, iflag, ierror)
subroutine cmumps_sol_fwd_lr_su(inode, n, iwhdlr, npiv_global, nslaves, iw, ipos_init, liw, liell, wcb, lwcb, ld_wcbpiv, ld_wcbcb, ppiv_init, pcb_init, rhscomp, lrhscomp, nrhs, posinrhscomp_fwd, jbdeb, jbfin, mtype, keep, keep8, oocwrite_compatible_with_blr, iflag, ierror)
subroutine cmumps_sol_fwd_blr_update(arraypiv, lpiv, lpivcol, ldpiv, pospiv, pospivcol, arraycb, lcb, ldcb, poscb, posdiag, nrhs_b, npiv, blr_panel, last_blr, current_blr, begs_blr_static, keep8, k34, k450, is_t2_slave, iflag, ierror)