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,
31 INTEGER,
INTENT(IN) :: INODE, N, IWHDLR, NPIV_GLOBAL, NSLAVES
32 INTEGER,
INTENT(IN) :: MTYPE, LIELL, KEEP(500)
33 INTEGER(8),
INTENT(IN) :: KEEP8(150)
34 INTEGER,
INTENT(IN) :: , 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
49 REAL :: ONE, MONE, ZERO
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.LE..AND.
IF (KCBNPIV_GLOBAL
136.GT.
& KCB+NELIM-1NPIV_GLOBAL) THEN
137 CALL sgemm('n
', 'n
', NPIV_GLOBAL-KCB+1,
138 & NRHS_B, DIAGSIZ_DYN, MONE,
139 & DIAG(1+DIAGSIZ_DYN), DIAGSIZ_STA,
140 & WCB(PPIV), LD_WCBPIV,
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)
156 CALL SMUMPS_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 SMUMPS_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
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) :: , POSPIVCOL
540 REAL,
INTENT(INOUT) :: ARRAYPIV(LPIV,LPIVCOL)
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) :: KEEP8(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
552 INTEGER(8) :: POSBLOCK
553 TYPE(LRB_TYPE),
POINTER :: LRB
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 ELSE IF (ibeg_block.LE.npiv.AND.iend_block.GT.npiv)
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 ELSEIF (ibeg_block.LE.npiv)
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)
695 & DIAG, LDIAG, NPIV, NELIM, LIELL,
697 & RHSCOMP, LRHSCOMP, NRHS,
698 & PPIVINRHSCOMP, JBDEB,
700 INTEGER,
INTENT(IN) :: MTYPE, LIELL, NPIV, NELIM, KEEP(500)
701 INTEGER,
INTENT(IN) :: NRHS_B, LDIAG
702 INTEGER,
INTENT(IN) :: PPIVINRHSCOMP, JBDEB, LRHSCOMP, NRHS
703 INTEGER(8),
INTENT(IN) :: LWC
704 REAL,
INTENT(IN) :: DIAG(LDIAG)
705 REAL,
INTENT(INOUT) :: W(LWC)
706 REAL RHSCOMP(LRHSCOMP,NRHS)
709 PARAMETER (ONE = 1.0e0)
710 IF ( mtype .eq. 1 )
THEN
712 CALL strsm(
'L',
'L',
'T',
'N', npiv, nrhs_b, one, diag(1),
713 & ldaj, rhscomp(ppivinrhscomp,jbdeb),
716 IF ( keep(50) .EQ. 0 )
THEN
721 CALL strsm(
'L',
'U',
'N',
'U', npiv, nrhs_b, one, diag(1),
722 & ldaj, rhscomp(ppivinrhscomp,jbdeb), lrhscomp)
subroutine smumps_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 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_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)