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 REAL,
INTENT(INOUT) :: WCB(LWCB)
39 INTEGER,
INTENT(INOUT) :: IFLAG, IERROR
40 REAL,
INTENT(INOUT) :: RHSCOMP(LRHSCOMP, NRHS)
41 LOGICAL,
INTENT(IN) :: OOCWRITE_COMPATIBLE_WITH_BLR
42 INTEGER :: I, NPARTSASS, NB_BLR , NELIM, LDADIAG,
43 & DIAGSIZ_DYN, DIAGSIZ_STA, IBEG_BLR, IEND_BLR,
44 & LD_CB, NELIM_GLOBAL, NRHS_B, IPOS, KCB
45 INTEGER(8) :: PPIV, PCB
47 REAL,
POINTER,
DIMENSION(:) :: DIAG
48 TYPE(
lrb_type),
POINTER,
DIMENSION(:) :: BLR_PANEL
50 parameter(one = 1.0e0, mone=-1.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 SMUMPS_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 sgemm(
'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 sgemm(
'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 sgemm(
'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
137 CALL sgemm(
'N',
'N', npiv_global-kcb+1,
138 & nrhs_b, diagsiz_dyn, mone,
139 & diag(1+diagsiz_dyn), diagsiz_sta,
141 & one, wcb(pcb), ld_cb)
142 CALL sgemm(
'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 sgemm(
'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)
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,
163 & keep8, keep(34), keep(
165 IF (iflag.LT.0)
RETURN
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
183 & (inode, iwhdlr, npiv_global,
186 & ptrx_init, ptry_init,
188 & mtype, keep, keep8, iflag, ierror )
189 INTEGER,
INTENT(IN) :: INODE, IWHDLR, NPIV_GLOBAL
190 INTEGER,
INTENT(IN) :: MTYPE, KEEP(500)
191 INTEGER(8),
INTENT(IN) :: KEEP8(150)
192 INTEGER(8),
INTENT(IN) :: LWCB, PTRX_INIT, PTRY_INIT
193 INTEGER,
INTENT(IN) :: LDX, LDY, JBDEB, JBFIN
194 REAL,
INTENT(INOUT) :: WCB(LWCB)
195 INTEGER,
INTENT(INOUT) :: IFLAG, IERROR
197INTEGER(8) :: PTRX, PTRY
198 TYPE(
lrb_type),
POINTER,
DIMENSION(:) :: BLR_PANEL
199 REAL :: ONE, MONE, ZERO
200 parameter(one = 1.0e0, mone=-1.0e0)
201 parameter(zero=0.0e0)
203 IF (
associated(
blr_array(iwhdlr)%PANELS_L))
205 npartsass=
size(
blr_array(iwhdlr)%PANELS_L)
206 nb_blr =
size(
blr_array(iwhdlr)%BEGS_BLR_STATIC)
209 WRITE(6,*)
" Internal error 1 in SMUMPS_SOL_SLAVE_LR_U"
215 blr_panel =>
blr_array(iwhdlr)%PANELS_L(i)%LRB_PANEL
216 IF (
associated(blr_panel))
THEN
219 & wcb, lwcb, 1, ldx, -99999_8, 1,
220 & wcb, lwcb, ldy, ptry,
222 & nrhs_b, npiv_global,
223 & blr_panel, nb_blr, 0,
224 &
blr_array(iwhdlr)%BEGS_BLR_STATIC(2:nb_blr+2),
228 & wcb, lwcb, 1, ldy, -99999_8, 1,
229 & wcb, lwcb, ldx, ptrx,
231 & nrhs_b, npiv_global,
232 & blr_panel, nb_blr, 0,
233 &
blr_array(iwhdlr)%BEGS_BLR_STATIC(2:nb_blr+2),
234 & keep8, keep(34), keep(450), .true., iflag, ierror )
236 IF (mtype .EQ. 1)
THEN
237 ptrx = ptrx + blr_panel(1)%N
239 ptry = ptry + blr_panel(1)%N
241 IF (iflag.LT.0)
RETURN
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,
256 INTEGER,
INTENT(IN) :: LPIVCOL, POSPIVCOL
257 REAL,
INTENT(INOUT) :: ARRAYPIV(LPIV,LPIVCOL)
258 REAL,
INTENT(INOUT) :: ARRAYCB(LCB)
259 INTEGER,
INTENT(IN) :: , 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
272 REAL,
ALLOCATABLE,
DIMENSION(:) :: TEMP_BLOCK
273 REAL :: ONE, MONE, ZERO
274 parameter(one = 1.0e0, mone=-1.0e0)
275 parameter(zero=0.0e0)
277 DO i = current_blr+1, last_blr
278 kmax =
max(kmax, blr_panel(i-current_blr)%K)
284 allocate(temp_block(kmax*nrhs_b), stat=allocok )
285 IF (allocok .GT. 0)
THEN
287 ierror = nrhs_b * kmax
288 write(*,*)
'Allocation problem in BLR routine
289 & SMUMPS_SOL_FWD_BLR_UPDATE: ',
290 &
'not enough memory? memory requested = ', ierror
301 DO i = current_blr+1, last_blr
302 IF (iflag.LT.0) cycle
303 ibeg_block = begs_blr_static(i)
304 iend_block = begs_blr_static(i+1)-1
305 IF (ibeg_block .EQ. iend_block + 1) cycle
306 lrb => blr_panel(i-current_blr)
312 CALL sgemm(
'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 sgemm(
'N',
'N', m, nrhs_b, k, mone,
318 & lrb%Q(1,1), m, temp_block(1), k,
319 & one, arraycb(posblock), ldcb)
320 ELSEIF (ibeg_block.LE.npiv.AND.iend_block.GT.npiv)
THEN
321 posblock = pospiv+int(ibeg_block-1,8)
322 CALL sgemm(
'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 sgemm(
'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 ELSEIF (ibeg_block.LE.npiv)
THEN
329 posblock = pospiv+int(ibeg_block-1,8)
330 CALL sgemm(
'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 sgemm(
'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 sgemm(
'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 sgemm(
'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 sgemm(
'N',
'N', ibeg_block+m-npiv-1, nrhs_b, n, mone,
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 sgemm(
'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 sgemm(
'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, , 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) :: , PTWCB
391 INTEGER,
INTENT(IN) :: NRHS_B
392 INTEGER,
INTENT(INOUT) :: IFLAG, IERROR
393 REAL,
INTENT(INOUT) :: WCB(LWCB)
394 REAL 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
399 INTEGER(8) :: PCB_LAST, PWCB
400 INTEGER :: IPIV_PANEL
401 REAL,
POINTER,
DIMENSION(:) :: DIAG
402 TYPE(
lrb_type),
POINTER,
DIMENSION(:) :: BLR_PANEL
403 REAL :: ONE, MONE, ZERO
404 PARAMETER (ONE = 1.0e0, mone=-1.0e0)
405 parameter(zero=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 SMUMPS_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 sgemm(
'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 sgemm(
'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 sgemm(
'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 sgemm(
'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 sgemm(
'N',
'N', diagsiz_dyn, nrhs_b, nelim_panel,
491 & mone, diag(1+diagsiz_dyn*ldadiag),
492 & wcb(pwcb), ld_wcb, one,
493 & rhscomp(ipiv_panel,jbdeb), lrhscomp)
495 IF (iend_blr+1.LE.npiv_global .AND.
496 & iend_blr+nelim_panel.GT.npiv_global)
THEN
497 CALL sgemm(
'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 sgemm(
'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 sgemm(
'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 IF (iflag.LT.0)
RETURN
520 & diag(1),
size(diag), diagsiz_dyn, nelim_panel, liell,
522 & rhscomp, lrhscomp, nrhs,
529 & ARRAYPIV, LPIV, LPIVCOL, LDPIV, POSPIV, POSPIVCOL,
530 & ARRAYCB, LCB, LDCB, POSCB,
533 & BLR_PANEL, LAST_BLR, CURRENT_BLR,
535 & KEEP8, K34, K450, IS_T2_SLAVE,
538 INTEGER(8),
INTENT(IN) :: LPIV, LCB, POSPIV, POSCB, POSDIAG
539 INTEGER,
INTENT(IN) :: LPIVCOL, POSPIVCOL
541 REAL,
INTENT(INOUT) :: ARRAYCB(LCB)
542 INTEGER,
INTENT(IN) :: LAST_BLR, NRHS_B, LDPIV, LDCB,
543 & current_blr, npiv, k34, k450
544 TYPE(
lrb_type),
TARGET,
INTENT(IN) ::
546 INTEGER(8),
INTENT(IN) :: (150)
547 LOGICAL,
INTENT(IN) :: IS_T2_SLAVE
548 INTEGER :: BEGS_BLR_STATIC(:)
549 INTEGER,
INTENT(INOUT) :: IFLAG, IERROR
550 INTEGER :: I, K, M, N, IBEG_BLOCK, IEND_BLOCK
554 REAL,
ALLOCATABLE,
DIMENSION(:) :: TEMP_BLOCK
555 REAL,
ALLOCATABLE,
DIMENSION(:) :: DEST_ARRAY
557 REAL :: ONE, MONE, ZERO
558 PARAMETER (ONE = 1.0e0, mone=-1.0e0)
559 parameter(zero=0.0e0)
561 DO i = current_blr+1, last_blr
562 kmax =
max(kmax, blr_panel(i-current_blr)%K)
564 IF (current_blr.LT.last_blr)
THEN
569 allocate(dest_array(n*nrhs_b),stat=allocok)
570 IF (allocok .GT. 0)
THEN
580 allocate(temp_block(kmax*nrhs_b), stat=allocok )
581 IF (allocok .GT. 0)
THEN
583 ierror = nrhs_b * kmax
584 write(*,*)
'Allocation problem in BLR routine
585 & SMUMPS_SOL_BWD_BLR_UPDATE: ',
586 &
'not enough memory? memory requested = ', ierror
598 DO i = current_blr+1, last_blr
599 IF (iflag.LT.0) cycle
600 ibeg_block = begs_blr_static(i)
601 iend_block = begs_blr_static(i+1)-1
602 lrb => blr_panel(i-current_blr)
607 IF (is_t2_slave)
THEN
608 posblock = poscb +int(ibeg_block-1,8)
609 CALL sgemm(
'T',
'N', k, nrhs_b, m, one,
611 & arraycb(posblock), ldcb, zero,
613 ELSE IF (ibeg_block.LE.npiv.AND.iend_block.GT.npiv)
THEN
614 posblock = pospiv+int(ibeg_block-1,8)
615 CALL sgemm(
'T',
'N', k, nrhs_b, npiv-ibeg_block+1, one,
617 & arraypiv(posblock,pospivcol), ldpiv,
618 & zero, temp_block(1), k)
619 CALL sgemm(
'T',
'N', k, nrhs_b, ibeg_block+m-npiv-1,
620 & one, lrb%Q(npiv-ibeg_block+2,1), m,
621 & arraycb(poscb), ldcb,
624 ELSEIF (ibeg_block.LE.npiv)
THEN
625 posblock = pospiv+int(ibeg_block-1,8)
626 CALL sgemm(
'T',
'N', k, nrhs_b, m, one,
628 & arraypiv(posblock,pospivcol), ldpiv,
629 & zero, temp_block(1), k)
631 posblock = poscb+int(ibeg_block-1-npiv,8)
632 CALL sgemm(
'T',
'N', k, nrhs_b, m, one,
634 & arraycb(posblock), ldcb, zero,
637 CALL sgemm(
'T', 'n
', N, NRHS_B, K, MONE,
639 & TEMP_BLOCK(1), K, ONE,
643 IF (IS_T2_SLAVE) THEN
644 POSBLOCK = POSCB+int(IBEG_BLOCK-1,8)
645 CALL sgemm('t
', 'n
', N, NRHS_B, M, MONE,
646 & LRB%Q(1,1), M, ARRAYCB(POSBLOCK), LDCB,
647 & ONE, DEST_ARRAY(1), N)
648.LE..AND..GT.
ELSE IF (IBEG_BLOCKNPIVIEND_BLOCKNPIV) THEN
649 POSBLOCK = POSPIV+int(IBEG_BLOCK-1,8)
650 CALL sgemm('t
', 'n
', N, NRHS_B, NPIV-IBEG_BLOCK+1, MONE,
651 & LRB%Q(1,1), M, ARRAYPIV(POSBLOCK,POSPIVCOL), LDPIV,
652 & ONE, DEST_ARRAY(1), N)
653 CALL sgemm('t
', 'n
', N, NRHS_B, IBEG_BLOCK+M-NPIV-1, MONE,
654 & LRB%Q(NPIV-IBEG_BLOCK+2,1), M, ARRAYCB(POSCB),
655 & LDCB, ONE, DEST_ARRAY(1), N)
656.LE.
ELSEIF (IBEG_BLOCKNPIV) THEN
657 POSBLOCK = POSPIV+int(IBEG_BLOCK-1,8)
658 CALL sgemm('t
', 'n
', N, NRHS_B, M, MONE,
659 & LRB%Q(1,1), M, ARRAYPIV(POSBLOCK,POSPIVCOL), LDPIV,
660 & ONE, DEST_ARRAY(1), N)
662 POSBLOCK = POSCB+int(IBEG_BLOCK-1-NPIV,8)
663 CALL sgemm('t
', 'n
', N, NRHS_B, M, MONE,
664 & LRB%Q(1,1), M, ARRAYCB(POSBLOCK), LDCB,
665 & ONE, DEST_ARRAY(1), N)
673 IF (allocated(TEMP_BLOCK)) deallocate(TEMP_BLOCK)
678 IF (IS_T2_SLAVE) THEN
680 call saxpy(N, ONE, DEST_ARRAY((I-1)*N+1), 1,
681 & ARRAYPIV(POSDIAG+(I-1)*LDPIV,POSPIVCOL), 1)
685 call saxpy(N, ONE, DEST_ARRAY((I-1)*N+1), 1,
686 & ARRAYPIV(POSDIAG,POSPIVCOL+I-1), 1)
690 IF (allocated(DEST_ARRAY)) DEALLOCATE(DEST_ARRAY)
subroutine smumps_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 smumps_sol_ld_and_reload_panel(inode, n, npiv, liell, nelim, nslaves, ppiv_courant, iw, ipos, liw, a, la, apos, wcb, lwcb, ld_wcbpiv, rhscomp, lrhscomp, nrhs, posinrhscomp_fwd, jbdeb, jbfin, mtype, keep, oocwrite_compatible_with_blr, ignore_k459)