15 & N, IPOOL, LPOOL, IIPOOL, NBFINF,
16 & A, LA, IW, LIW, W, LWC, NRHS,
17 & POSWCB, PLEFTW, POSIWCB,
18 & RHSCOMP, LRHSCOMP, POSINRHSCOMP_BWD,
19 & PTRICB, PTRACB, IWCB, LIWW, W2,
21 & FRERE, FILS, PTRIST, PTRFAC,
23 & PROCNODE_STEPS, DEJA_SEND,
24 & SLAVEF, COMM, MYID, BUFR, LBUFR, LBUFR_BYTES,
25 & KEEP,KEEP8, DKEEP, RHS_ROOT, LRHS_ROOT, MTYPE,
26 & ISTEP_TO_INIV2, TAB_POS_IN_PERE, PANEL_POS, LPANEL_POS,
27 & PRUN_BELOW, TO_PROCESS, SIZE_TO_PROCESS
28 & , RHS_BOUNDS, LRHS_BOUNDS, DO_NBSPARSE, FROM_PP
29 & , ERROR_WAS_BROADCASTED
36 INTEGER :: KEEP( 500 )
37 INTEGER(8) :: KEEP8(150)
38 REAL,
INTENT(INOUT) :: DKEEP(230)
40 INTEGER,
INTENT( IN ) :: INODE, N, NRHS, MTYPE, LIW, LIWW
41 INTEGER,
INTENT( IN ) :: SLAVEF, COMM, MYID
42 INTEGER,
INTENT (IN ) :: PROCNODE_STEPS(KEEP(28))
43 INTEGER,
INTENT( IN ) :: (KEEP(28))
44 INTEGER(8),
INTENT( IN ) :: LA, LWC
45 INTEGER(8),
INTENT( INOUT ) :: POSWCB, PLEFTW
46 INTEGERINTENT( INOUT )
47INTEGER,
INTENT( IN ) :: LPANEL_POS
48 INTEGER :: PANEL_POS(LPANEL_POS)
49 LOGICAL,
INTENT(INOUT) :: DEJA_SEND(0:SLAVEF-1)
50 INTEGER,
INTENT(IN) :: LPOOL
51 INTEGER,
INTENT(INOUT) :: IPOOL(), IIPOOL
52 INTEGER,
INTENT(INOUT) :: NBFINF, MYLEAF_LEFT
53 INTEGER :: PTRIST(KEEP(28)), PTRICB(KEEP(28))
54 INTEGER(8) :: PTRACB(KEEP(28))
55 INTEGER(8) :: PTRFAC(KEEP(28))
58 COMPLEX :: W2(KEEP(133))
59 INTEGER :: IW(LIW),IWCB(LIWW)
60 INTEGER STEP(N), FRERE(KEEP(28)),FILS(N)
61 INTEGER LBUFR, LBUFR_BYTES
63 INTEGER ISTEP_TO_INIV2(KEEP(71)),
64 & tab_pos_in_pere(slavef+2,
max(1,keep(56)))
65 INTEGER LRHSCOMP, POSINRHSCOMP_BWD(N)
66 COMPLEX RHSCOMP(LRHSCOMP,NRHS)
67 INTEGER(8),
intent(in) :: LRHS_ROOT
68 COMPLEX RHS_ROOT( LRHS_ROOT )
69 LOGICAL,
INTENT( IN ) :: PRUN_BELOW
70 INTEGER,
INTENT(IN) :: SIZE_TO_PROCESS
71 LOGICAL,
INTENT(IN) :: TO_PROCESS(SIZE_TO_PROCESS)
72 LOGICAL,
INTENT(IN) :: DO_NBSPARSE
73 INTEGER,
INTENT(IN) :: LRHS_BOUNDS
74 INTEGER,
INTENT(IN) :: RHS_BOUNDS(LRHS_BOUNDS)
75 LOGICAL,
INTENT(IN) :: FROM_PP
76 LOGICAL,
INTENT( OUT ) :: ERROR_WAS_BROADCASTED
77 LOGICAL,
INTENT( OUT ) :: DO_MCAST2_TERMBWD
79 include
'mumps_tags.h'
82 include
'mumps_headers.h'
83 LOGICAL COMPRESS_PANEL, LR_ACTIVATED
84 LOGICAL OOCWRITE_COMPATIBLE_WITH_BLR
85 LOGICAL LTLEVEL2, IN_SUBTREE
87 INTEGER TMP_NBPANELS, I_PIVRPTR, I_PIVR
88 LOGICAL MUST_BE_PERMUTED
90 LOGICAL :: ALLOW_OTHERS_TO_LEAVE
91 INTEGER :: K, JBDEB, JBFIN, NRHS_B
94 INTEGER IPOS,LIELL,NELIM,JJ,I
97 INTEGER IN,IF,LONG,POOL_FIRST_POS,TMP
99 INTEGER :: PROCDEST, DEST
100 INTEGER(8) :: PTWCB, PPIV_COURANT
101 INTEGER :: , EffectiveSize, ISLAVE, FirstIndex
102 INTEGER :: POSINDICES, IPOSINRHSCOMP, IPOSINRHSCOMP_PANEL
103 INTEGER(8) :: APOS, IST
105 INTEGER(8) :: APOSDEB, NBENTRIES_ALLPANELS
106 INTEGER(8) :: PTWCB_PANEL
107 INTEGER LDAJ, NBJ, LIWFAC,
108 & nbjlast, npiv_last, panel_size,
112 INTEGER NPANELS, IPANEL
113 COMPLEX ALPHA,ONE,ZERO
114 parameter(zero=(0.0e0,0.0e0),
116 & alpha=(-1.0e0,0.0e0))
117 LOGICAL,
EXTERNAL :: MUMPS_IN_OR_ROOT_SSARBR
118 INTEGER,
EXTERNAL :: MUMPS_TYPENODE
119 INTEGER,
EXTERNAL :: MUMPS_PROCNODE
120 error_was_broadcasted = .false.
121 do_mcast2_termbwd = .false.
122 no_children = .false.
123 IF (do_nbsparse)
THEN
124 jbdeb= rhs_bounds(2*step(inode)-1)
125 jbfin= rhs_bounds(2*step(inode))
126 nrhs_b = jbfin-jbdeb+1
132 IF ( inode .EQ. keep( 38 ) .OR. inode .EQ. keep( 20 ) )
THEN
133 ipos = ptrist(step(inode))+keep(ixsz)
135 liell = iw(ipos) + npiv
136 ipos = ptrist(step(inode)) + 5 + keep(ixsz)
137 IF ( mtype .EQ. 1 .AND. keep(50) .EQ. 0)
THEN
138 j1 = ipos + liell + 1
139 j2 = ipos + liell + npiv
145 iposinrhscomp = posinrhscomp_bwd(iw(j1))
147 & keep, rhscomp, nrhs, lrhscomp, iposinrhscomp,
148 & rhs_root(1+npiv*(jbdeb-1)), npiv, 1)
151 IF (in .GT. 0)
GOTO 270
153 myleaf_left = myleaf_left - 1
154 allow_others_to_leave = ( myleaf_left .EQ. 0 .AND.
156 IF (keep(31) .NE. 0)
THEN
157 IF ( .NOT. mumps_in_or_root_ssarbr(
158 & procnode_steps(step(inode)), keep(199) ) )
THEN
159 keep(31) = keep(31) - 1
160 IF (keep(31) .EQ. 1)
THEN
161 allow_others_to_leave = .true.
165 IF (allow_others_to_leave)
THEN
166 do_mcast2_termbwd = .true.
173 nbfils = ne_steps(step(inode))
174 IF ( prun_below )
THEN
178 IF ( to_process(step(if)) ) nbfils = nbfils+1
182 IF (nbfils.EQ.0)
THEN
185 no_children = .false.
190 deja_send( i ) = .false.
192 pool_first_pos=iipool
194 IF ( prun_below )
THEN
195 1030
IF ( .NOT.to_process(step(if)) )
THEN
199 no_children = .false.
201 IF (mumps_procnode(procnode_steps(step(if)),keep(199))
206 procdest = mumps_procnode(procnode_steps(step(if)),
208 IF (.NOT. deja_send( procdest ))
THEN
211 & long, long, iw( j1 ),
212 & rhs_root( 1+npiv*(jbdeb-1) ),
214 & rhscomp(1, 1), nrhs, lrhscomp,
215 & iposinrhscomp, npiv,
217 & noeud, comm, ierr )
218 IF ( ierr .EQ. -1 )
THEN
221 & bufr, lbufr, lbufr_bytes,
222 & myid, slavef, comm,
223 & n, iwcb, liww, posiwcb,
225 & iipool, nbfinf, ptricb, ptracb, info,
226 & ipool, lpool, panel_pos, lpanel_pos,
227 & step, frere, fils, procnode_steps,
228 & pleftw, keep,keep8, dkeep,
229 & ptrist, ptrfac, iw, liw, a, la, w2,
232 & rhscomp, lrhscomp, posinrhscomp_bwd,
233 & prun_below, to_process, size_to_process
236 IF ( info( 1 ) .LT. 0 )
THEN
237 error_was_broadcasted = .true.
241 ELSE IF ( ierr .EQ. -2 )
THEN
243 info( 2 ) = nrhs_b * long * keep(35) +
244 & ( long + 4 ) * keep(34)
245 error_was_broadcasted = .false.
247 ELSE IF ( ierr .EQ. -3 )
THEN
249 info( 2 ) = nrhs_b * long * keep(35) +
250 & ( long + 4 ) * keep(34)
251 error_was_broadcasted = .false.
253 ELSE IF ( ierr .NE. 0 )
THEN
258 DEJA_SEND( PROCDEST ) = .TRUE.
263 ALLOW_OTHERS_TO_LEAVE = .FALSE.
264.AND.
IF ( PRUN_BELOW NO_CHILDREN ) THEN
265 MYLEAF_LEFT = MYLEAF_LEFT - 1
266.EQ..AND.
ALLOW_OTHERS_TO_LEAVE = ( MYLEAF_LEFT 0
269 IF ( KEEP(31). NE. 0) THEN
270.NOT.
IF ( MUMPS_IN_OR_ROOT_SSARBR(
271 & PROCNODE_STEPS(STEP(INODE)), KEEP(199) ) ) THEN
272 KEEP(31) = KEEP(31) - 1
273.EQ.
IF (KEEP(31) 1) THEN
274 ALLOW_OTHERS_TO_LEAVE = .TRUE.
278 IF ( ALLOW_OTHERS_TO_LEAVE ) THEN
279 DO_MCAST2_TERMBWD = .TRUE.
282.NE.
IF (IIPOOLPOOL_FIRST_POS) THEN
283 DO I=1,(IIPOOL-POOL_FIRST_POS)/2
284 TMP = IPOOL(POOL_FIRST_POS+I-1)
285 IPOOL(POOL_FIRST_POS+I-1) = IPOOL(IIPOOL-I)
286 IPOOL(IIPOOL-I) = TMP
291 IN_SUBTREE = MUMPS_IN_OR_ROOT_SSARBR(
292 & PROCNODE_STEPS(STEP(INODE)), KEEP(199) )
293 TYPENODE = MUMPS_TYPENODE(PROCNODE_STEPS(STEP(INODE)),
296.eq..AND.
& (TYPENODE 2 )
298 NPIV = IW(PTRIST(STEP(INODE))+2+KEEP(IXSZ)+1)
299.NE..AND.
IF ((NPIV0)(LTLEVEL2)) THEN
300 IPOS = PTRIST(STEP(INODE)) + 2 + KEEP(IXSZ)
301 LIELL = IW(IPOS-2)+IW(IPOS+1)
305 NCB = LIELL - NPIV - NELIM
309 IPOS = IPOS + NSLAVES
310 IW(PTRIST(STEP(INODE))+XXS)= C_FINI+NSLAVES
311.LT..or.
IF ( POSIWCB - 2 0
312.LT.
& POSWCB-int(NCB,8)*int(NRHS_B,8) PLEFTW-1_8 ) THEN
313 CALL CMUMPS_COMPSO( N, KEEP(28), IWCB, LIWW, W, LWC,
314 & POSWCB, POSIWCB, PTRICB, PTRACB)
315.LT.
IF ( POSWCB-int(NCB,8)*int(NRHS_B,8) PLEFTW-1_8 ) THEN
317 CALL MUMPS_SET_IERROR(NCB * NRHS_B - POSWCB-PLEFTW+1_8,
319 ERROR_WAS_BROADCASTED = .FALSE.
322.LT.
IF ( POSIWCB - 2 0 ) THEN
324 INFO( 2 ) = 2 - POSIWCB
325 ERROR_WAS_BROADCASTED = .FALSE.
329 POSIWCB = POSIWCB - 2
330 POSWCB = POSWCB - int(NCB,8)*int(NRHS_B,8)
331 PTRICB(STEP( INODE )) = POSIWCB + 1
332 PTRACB(STEP( INODE )) = POSWCB + 1_8
333 IWCB( PTRICB(STEP( INODE )) ) = NCB*NRHS_B
334 IWCB( PTRICB(STEP( INODE )) + 1 ) = 1
335.EQ..AND..EQ.
IF ( MTYPE1 KEEP(50)0 ) THEN
336 POSINDICES = IPOS + LIELL + 1
338 POSINDICES = IPOS + 1
341 write(6,*) ' Internal Error type 2 node with no CB '
344.EQ..AND..EQ.
IF ( MTYPE 1 KEEP(50)0 ) THEN
345 J1 = IPOS + LIELL + NPIV + NELIM +1
346 J2 = IPOS + 2 * LIELL
348 J1 = IPOS + NPIV + NELIM +1
351 IFR8 = PTRACB(STEP( INODE )) - 1_8
352 CALL CMUMPS_SOL_BWD_GTHR( JBDEB, JBFIN, J1, J2,
353 & RHSCOMP, NRHS, LRHSCOMP,
354 & W(PTRACB(STEP(INODE))), NCB, 1,
355 & IW, LIW, KEEP, N, POSINRHSCOMP_BWD )
356 IFR8 = IFR8 + int(J2-KEEP(253)-J1+1,8)
357.NE.
IF (KEEP(252)0) THEN
358 DO JJ = J2-KEEP(253)+1, J2
361.EQ.
IF (KJJ-J2+KEEP(253)) THEN
362 W(IFR8+int(K-JBDEB,8)*int(NCB,8)) = ALPHA
364 W(IFR8+int(K-JBDEB,8)*int(NCB,8)) = ZERO
369 DO ISLAVE = 1, NSLAVES
370 CALL MUMPS_BLOC2_GET_SLAVE_INFO(
371 & KEEP,KEEP8, INODE, STEP, N, SLAVEF,
372 & ISTEP_TO_INIV2, TAB_POS_IN_PERE,
378 DEST = IW( PTRIST(STEP(INODE))+5+ISLAVE+KEEP(IXSZ))
379 CALL CMUMPS_BUF_SEND_BACKVEC(NRHS_B, INODE,
380 & W(Offset+PTRACB(STEP(INODE))),
383 & BACKSLV_MASTER2SLAVE, JBDEB, JBFIN,
385.EQ.
IF ( IERR -1 ) THEN
386 CALL CMUMPS_BACKSLV_RECV_AND_TREAT(
388 & BUFR, LBUFR, LBUFR_BYTES,
389 & MYID, SLAVEF, COMM,
390 & N, IWCB, LIWW, POSIWCB,
392 & IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
393 & IPOOL, LPOOL, PANEL_POS, LPANEL_POS,
395 & PROCNODE_STEPS, PLEFTW, KEEP,KEEP8, DKEEP,
396 & PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAF_LEFT,
398 & RHSCOMP, LRHSCOMP, POSINRHSCOMP_BWD,
399 & PRUN_BELOW , TO_PROCESS, SIZE_TO_PROCESS
402.LT.
IF ( INFO( 1 ) 0 ) THEN
403 ERROR_WAS_BROADCASTED = .TRUE.
407.EQ.
ELSE IF ( IERR -2 ) THEN
409 INFO( 2 ) = NRHS_B * EffectiveSize * KEEP(35) +
411 ERROR_WAS_BROADCASTED = .FALSE.
413.EQ.
ELSE IF ( IERR -3 ) THEN
415 INFO( 2 ) = NRHS_B * EffectiveSize * KEEP(35) +
417 ERROR_WAS_BROADCASTED = .FALSE.
420 Offset = Offset + EffectiveSize
422 IWCB( PTRICB(STEP( INODE )) + 1 ) = 0
423 CALL CMUMPS_FREETOPSO(N, KEEP(28), IWCB, LIWW, W, LWC,
424 & POSWCB,POSIWCB,PTRICB,PTRACB)
427.GT.
LR_ACTIVATED = (IW(PTRIST(STEP(INODE))+XXLR)0)
428.GE.
COMPRESS_PANEL = (IW(PTRIST(STEP(INODE))+XXLR)2)
429 OOCWRITE_COMPATIBLE_WITH_BLR =
430.NOT..OR..NOT..OR.
& (LR_ACTIVATED(COMPRESS_PANEL)
433 IPOS = PTRIST(STEP(INODE)) + 2 + KEEP(IXSZ)
434 LIELL = IW(IPOS-2)+IW(IPOS+1)
440.GT..AND.
IF (KEEP(201)0OOCWRITE_COMPATIBLE_WITH_BLR) THEN
441 CALL CMUMPS_SOLVE_GET_OOC_NODE(
442 & INODE,PTRFAC,KEEP,A,LA,STEP,
443 & KEEP8,N,MUST_BE_PERMUTED,IERR)
447 ERROR_WAS_BROADCASTED = .FALSE.
451 APOS = PTRFAC( STEP(INODE))
452 NSLAVES = IW( PTRIST(STEP(INODE)) + 5 + KEEP(IXSZ) )
453 IPOS = IPOS + 1 + NSLAVES
454.EQ..AND.
IF (KEEP(201)1OOCWRITE_COMPATIBLE_WITH_BLR) THEN
455 LIWFAC = IW(PTRIST(STEP(INODE))+XXI)
461 PANEL_SIZE = CMUMPS_OOC_PANEL_SIZE( LIELL )
462.NE.
IF (KEEP(50)1) THEN
463 CALL CMUMPS_OOC_PP_CHECK_PERM_FREED(
464 & IW(IPOS+1+2*LIELL),
469.EQ..AND..EQ.
IF ( MTYPE 1 KEEP(50)0 ) THEN
470 J1 = IPOS + LIELL + 1
471 J2 = IPOS + NPIV + LIELL
478.LT.
IF ( POSWCB int(LIELL,8)*int(NRHS_B,8) ) THEN
479 CALL CMUMPS_COMPSO( N, KEEP(28), IWCB, LIWW, W, LWC,
480 & POSWCB, POSIWCB, PTRICB, PTRACB)
481.LT.
IF ( POSWCB int(LIELL,8)*int(NRHS_B,8) ) THEN
483 CALL MUMPS_SET_IERROR(int(LIELL,8)*int(NRHS_B,8)-POSWCB,
485 ERROR_WAS_BROADCASTED = .FALSE.
490.LT..or.
IF ( POSIWCB - 2 0
491.LT.
& POSWCB-int(LIELL,8)*int(NRHS_B,8) PLEFTW-1_8 ) THEN
492 CALL CMUMPS_COMPSO( N, KEEP(28), IWCB, LIWW, W, LWC,
493 & POSWCB, POSIWCB, PTRICB, PTRACB )
494.LT.
IF ( POSWCB-int(LIELL,8)*int(NRHS_B,8) PLEFTW-1_8 ) THEN
496 CALL MUMPS_SET_IERROR( int(LIELL,8)*int(NRHS_B,8)-
499 ERROR_WAS_BROADCASTED = .FALSE.
502.LT.
IF ( POSIWCB - 2 0 ) THEN
504 INFO( 2 ) = 2 - POSIWCB
505 ERROR_WAS_BROADCASTED = .FALSE.
509 POSIWCB = POSIWCB - 2
510 POSWCB = POSWCB - int(LIELL,8)*int(NRHS_B,8)
511 PTRICB(STEP( INODE )) = POSIWCB + 1
512 PTRACB(STEP( INODE )) = POSWCB + 1_8
513 IWCB( PTRICB(STEP( INODE )) ) = LIELL*NRHS_B
514 IWCB( PTRICB(STEP( INODE )) + 1 ) = 1
515.EQ..AND..EQ.
IF ( MTYPE1 KEEP(50)0 ) THEN
516 POSINDICES = IPOS + LIELL + 1
518 POSINDICES = IPOS + 1
520 PTWCB = PTRACB(STEP( INODE ))
523 IPOSINRHSCOMP = POSINRHSCOMP_BWD(IW(J1))
525 IPOSINRHSCOMP = -99999
529.NE.
IF (KEEP(252)0) THEN
531 RHSCOMP(IPOSINRHSCOMP+JJ-J1,K) = ZERO
536 IFR8 = PTWCB + int(NPIV - 1,8)
537.GT.
IF ( LIELL NPIV ) THEN
538.EQ..AND..EQ.
IF ( MTYPE 1 KEEP(50)0 ) THEN
539 J1 = IPOS + LIELL + NPIV + 1
540 J2 = IPOS + 2 * LIELL
545 CALL CMUMPS_SOL_BWD_GTHR( JBDEB, JBFIN, J1, J2,
546 & RHSCOMP, NRHS, LRHSCOMP,
547 & W(PTWCB), LIELL, NPIV+1,
548 & IW, LIW, KEEP, N, POSINRHSCOMP_BWD )
549 IFR8 = IFR8 + int(J2-KEEP(253)-J1+1,8)
550.NE.
IF (KEEP(252)0) THEN
551 DO JJ = J2-KEEP(253)+1, J2
554.EQ.
IF (KJJ-J2+KEEP(253)) THEN
555 W(IFR8+int(K-JBDEB,8)*int(LIELL,8)) = ALPHA
557 W(IFR8+int(K-JBDEB,8)*int(LIELL,8)) = ZERO
563.EQ.
IF (NPIV 0) GOTO 160
565.EQ..AND.
IF (KEEP(201)1OOCWRITE_COMPATIBLE_WITH_BLR) THEN
566 J = NPIV / PANEL_SIZE
567.EQ..AND.
TWOBYTWO = KEEP(50)2
568.EQ..AND..GT..OR.
& ((TYPENODE1KEEP(103)0)
569.EQ..AND..GT.
& (TYPENODE2KEEP(105)0))
571 CALL CMUMPS_BUILD_PANEL_POS(PANEL_SIZE, PANEL_POS, LPANEL_POS,
572 & IW(IPOS+1+LIELL), NPIV, NPANELS, LIELL,
573 & NBENTRIES_ALLPANELS)
575.EQ.
IF (NPIVJ*PANEL_SIZE) THEN
580 NPIV_LAST = (J+1)* PANEL_SIZE
581 NBJLAST = NPIV-J*PANEL_SIZE
584 NBENTRIES_ALLPANELS =
585 & int(LIELL,8) * int(NPIV,8)
586 & - int( ( J * ( J - 1 ) ) /2,8 )
587 & * int(PANEL_SIZE,8) * int(PANEL_SIZE,8)
589 & * int(mod(NPIV, PANEL_SIZE),8)
590 & * int(PANEL_SIZE,8)
593 APOSDEB = APOS + NBENTRIES_ALLPANELS
594 DO IPANEL = NPANELS, 1, -1
596 NBJ = PANEL_POS(IPANEL+1)-PANEL_POS(IPANEL)
597 BEG_PANEL = PANEL_POS(IPANEL)
599.EQ.
IF (JJNPIV_LAST) THEN
604 BEG_PANEL = JJ- PANEL_SIZE+1
606 LDAJ = LIELL-BEG_PANEL+1
607 APOSDEB = APOSDEB - int(NBJ,8)*int(LDAJ,8)
608 PTWCB_PANEL = PTWCB + int(BEG_PANEL - 1,8)
609 IPOSINRHSCOMP_PANEL = IPOSINRHSCOMP + BEG_PANEL - 1
610 NCB_PANEL = LDAJ - NBJ
611.NE..AND.
IF (KEEP(50)1MUST_BE_PERMUTED) THEN
612 CALL CMUMPS_GET_OOC_PERM_PTR(TYPEF, TMP_NBPANELS,
613 & I_PIVRPTR, I_PIVR, IPOS + 1 + 2 * LIELL, IW, LIW)
614.EQ.
IF (NPIV(IW(I_PIVRPTR)-1)) THEN
615 MUST_BE_PERMUTED=.FALSE.
617 CALL CMUMPS_PERMUTE_PANEL(
618 & IW(I_PIVR + IW(I_PIVRPTR+IPANEL-1)-IW(I_PIVRPTR)),
619 & NPIV-IW(I_PIVRPTR+IPANEL-1)+1,
620 & IW(I_PIVRPTR+IPANEL-1)-1,
622 & LDAJ, NBJ, BEG_PANEL-1)
625#if defined(MUMPS_USE_BLAS2)
626 IF ( NRHS_B == 1 ) THEN
627.NE.
IF (NCB_PANEL0) THEN
628.NE.
IF (NCB_PANEL - NCB 0) THEN
629 CALL cgemv( 'T', NCB_PANEL-NCB, NBJ, ALPHA,
630 & A( APOSDEB + int(NBJ,8) ), LDAJ,
631 & RHSCOMP(IPOSINRHSCOMP_PANEL+NBJ,JBDEB),
633 & RHSCOMP(IPOSINRHSCOMP_PANEL,JBDEB), 1 )
636 CALL cgemv( 'T', NCB, NBJ, ALPHA,
637 & A( APOSDEB + int(LDAJ-NCB,8) ), LDAJ,
638 & W( PTWCB + int(NPIV,8) ),
640 & RHSCOMP(IPOSINRHSCOMP_PANEL,JBDEB), 1 )
644 CALL ctrsv('L','T','U', NBJ, A(APOSDEB), LDAJ,
645 & RHSCOMP(IPOSINRHSCOMP_PANEL,JBDEB), 1)
647 CALL ctrsv('L','T','N', NBJ, A(APOSDEB), LDAJ,
648 & RHSCOMP(IPOSINRHSCOMP_PANEL,JBDEB), 1)
652.NE.
IF (NCB_PANEL0) THEN
653.NE.
IF (NCB_PANEL - NCB 0) THEN
654 CALL cgemm( 'T', 'N', NBJ, NRHS_B,
655 & NCB_PANEL-NCB, ALPHA,
656 & A(APOSDEB +int(NBJ,8)), LDAJ,
657 & RHSCOMP(IPOSINRHSCOMP_PANEL+NBJ,JBDEB), LRHSCOMP,
658 & ONE, RHSCOMP(IPOSINRHSCOMP_PANEL,JBDEB), LRHSCOMP)
661 CALL cgemm( 'T', 'N', NBJ, NRHS_B, NCB, ALPHA,
662 & A(APOSDEB +int(LDAJ-NCB,8)), LDAJ,
663 & W( PTWCB+int(NPIV,8) ), LIELL,
664 & ONE, RHSCOMP(IPOSINRHSCOMP_PANEL,JBDEB),LRHSCOMP)
668 CALL ctrsm('L','L','T','U',NBJ, NRHS_B, ONE,
670 & LDAJ, RHSCOMP(IPOSINRHSCOMP_PANEL,JBDEB), LRHSCOMP)
672 CALL ctrsm('L','L','T','N',NBJ, NRHS_B, ONE,
674 & LDAJ, RHSCOMP(IPOSINRHSCOMP_PANEL,JBDEB), LRHSCOMP)
676#if defined(MUMPS_USE_BLAS2)
679.NOT.
IF ( TWOBYTWO) JJ=BEG_PANEL-1
682.GE.
IF ( IW(PTRIST(STEP(INODE))+XXLR) 2
683.AND..EQ.
& KEEP(485) 1 ) THEN
684 IWHDLR = IW(PTRIST(STEP(INODE))+XXF)
685 CALL CMUMPS_SOL_BWD_LR_SU (
686 & INODE, IWHDLR, NPIV, NSLAVES,
687 & LIELL, W, LWC, NRHS_B, PTWCB,
688 & RHSCOMP, LRHSCOMP, NRHS,
689 & IPOSINRHSCOMP, JBDEB,
690 & MTYPE, KEEP, KEEP8,
692.LT.
IF (INFO(1)0) THEN
693 ERROR_WAS_BROADCASTED = .FALSE.
697.GT.
IF ( LIELL NPIV ) THEN
698#if defined(LDLTPANEL_DEBUG)
699 WRITE(*,*) 'before gemm LIELL, NPIV, PTWCB=',LIELL,NPIV,PTWCB
700 WRITE(*,*) 'before gemm RHSCOMP=',
701 & RHSCOMP(IPOSINRHSCOMP:IPOSINRHSCOMP+NPIV-1,1)
702 WRITE(*,*) 'before gemm W',
703 & W(PTWCB+NPIV:PTWCB+LIELL-1)
704 CALL MUMPS_GETI8(IST, IW(PTRIST(STEP(INODE))+XXR))
705 WRITE(*,*) "factors=
",A(APOS:APOS+IST-1)
707.eq.
IF ( MTYPE 1 ) THEN
708 IST = APOS + int(NPIV,8)
709#if defined(MUMPS_USE_BLAS2)
710 IF (NRHS_B == 1) THEN
711 CALL cgemv( 'T', NCB, NPIV, ALPHA, A(IST), LIELL,
712 & W(PTWCB+int(NPIV,8)), 1,
714 & RHSCOMP(IPOSINRHSCOMP,JBDEB), 1 )
717 CALL cgemm('T','N', NPIV, NRHS_B, NCB, ALPHA,
719 & LIELL, W(PTWCB+int(NPIV,8)), LIELL, ONE,
720 & RHSCOMP(IPOSINRHSCOMP,JBDEB), LRHSCOMP)
721#if defined(MUMPS_USE_BLAS2)
725.eq.
IF ( KEEP(50) 0 ) THEN
726 IST = APOS + int(NPIV,8) * int(LIELL,8)
728.GT.
IF( KEEP(459) 1) THEN
729 CALL MUMPS_GETI8(IST, IW(PTRIST(STEP(INODE))+XXR))
730 IST = APOS + IST - int(NPIV,8) * int(LIELL-NPIV,8)
732 IST = APOS + int(NPIV,8) * int(NPIV,8)
735#if defined(MUMPS_USE_BLAS2)
736 IF ( NRHS_B == 1 ) THEN
737 CALL cgemv( 'N', NPIV, NCB, ALPHA, A( IST ), NPIV,
738 & W( PTWCB + int(NPIV,8) ),
740 & RHSCOMP(IPOSINRHSCOMP,JBDEB), 1 )
743 CALL cgemm( 'N', 'N', NPIV, NRHS_B, NCB, ALPHA,
745 & NPIV, W(PTWCB+int(NPIV,8)), LIELL,
746 & ONE, RHSCOMP(IPOSINRHSCOMP,JBDEB), LRHSCOMP)
747#if defined(MUMPS_USE_BLAS2)
752.eq.
IF ( MTYPE 1 ) THEN
755.EQ.
IF ( KEEP(50) 0 ) THEN
758.GT.
IF (KEEP(459)1) THEN
765 PPIV_COURANT = int(JBDEB-1,8)*int(LRHSCOMP,8)
766 & + int(IPOSINRHSCOMP,8)
767.GT..AND..NE.
IF (KEEP(459)1 KEEP(50)0) THEN
768 CALL CMUMPS_SOLVE_BWD_PANELS( A, LA, APOS,
769 & NPIV, IW(IPOS+1+LIELL),
770 & NRHS_B, RHSCOMP(1,1), KEEP8(25), LRHSCOMP, PPIV_COURANT,
773 CALL CMUMPS_SOLVE_BWD_TRSOLVE( A, LA, APOS,
775 & NRHS_B, RHSCOMP(1,1), KEEP8(25), LRHSCOMP, PPIV_COURANT,
780.EQ..AND..EQ.
IF ( MTYPE 1 KEEP(50)0) THEN
781 J1 = IPOS + LIELL + 1
785 IPOSINRHSCOMP = POSINRHSCOMP_BWD(IW(J1))
787.GT..AND.
IF (KEEP(201)0OOCWRITE_COMPATIBLE_WITH_BLR) THEN
788 CALL CMUMPS_FREE_FACTORS_FOR_SOLVE(INODE,PTRFAC,KEEP(28),
793 ERROR_WAS_BROADCASTED = .FALSE.
799.GT.
IF (IN 0) GOTO 170
801 MYLEAF_LEFT = MYLEAF_LEFT - 1
802.NOT.
IF ( IN_SUBTREE ) THEN
803 IWCB(PTRICB(STEP(INODE))+1) = IWCB(PTRICB(STEP(INODE))+1)-1
804 CALL CMUMPS_FREETOPSO(N, KEEP(28), IWCB, LIWW,
806 & POSWCB,POSIWCB,PTRICB,PTRACB)
808.EQ..AND.
ALLOW_OTHERS_TO_LEAVE = ( MYLEAF_LEFT 0
810.NE..AND.
IF ( KEEP(31) 0
811.NOT.
& IN_SUBTREE ) THEN
812 KEEP(31) = KEEP(31) - 1
813.EQ.
IF (KEEP(31) 1) THEN
814 ALLOW_OTHERS_TO_LEAVE = .TRUE.
817 IF (ALLOW_OTHERS_TO_LEAVE) THEN
818 DO_MCAST2_TERMBWD = .TRUE.
824 NBFILS = NE_STEPS(STEP(INODE))
825 IF ( PRUN_BELOW ) THEN
829 IF ( TO_PROCESS(STEP(IF)) ) NBFILS = NBFILS+1
833.EQ.
IF (NBFILS0) THEN
836 NO_CHILDREN = .FALSE.
842 IF ( PRUN_BELOW ) THEN
844.NOT.
IF ( TO_PROCESS(STEP(IF)) ) THEN
848 NO_CHILDREN = .FALSE.
850 IPOOL((IIPOOL-I+1)+NBFILS-I) = IF
854.AND.
IF (PRUN_BELOW NO_CHILDREN) THEN
855 MYLEAF_LEFT = MYLEAF_LEFT - 1
856.EQ..AND.
ALLOW_OTHERS_TO_LEAVE = ( MYLEAF_LEFT 0
858 IF (ALLOW_OTHERS_TO_LEAVE ) THEN
859 DO_MCAST2_TERMBWD = .TRUE.
866 DEJA_SEND( I ) = .FALSE.
868 POOL_FIRST_POS=IIPOOL
870 IF ( PRUN_BELOW ) THEN
871.NOT.
1020 IF ( TO_PROCESS(STEP(IF)) ) THEN
875 NO_CHILDREN = .FALSE.
877 IF (MUMPS_PROCNODE(PROCNODE_STEPS(STEP(IF)),
878.EQ.
& KEEP(199)) MYID) THEN
883 PROCDEST = MUMPS_PROCNODE(PROCNODE_STEPS(STEP(IF)),
885.not.
IF ( DEJA_SEND( PROCDEST )) THEN
887 CALL CMUMPS_BUF_SEND_VCB( NRHS_B, IF, 0, 0,
888 & LIELL, LIELL - KEEP(253),
890 & W( PTRACB(STEP(INODE)) ), JBDEB, JBFIN,
891 & RHSCOMP(1, 1), NRHS, LRHSCOMP,
892 & IPOSINRHSCOMP, NPIV,
893 & KEEP, PROCDEST, NOEUD, COMM, IERR )
894.EQ.
IF ( IERR -1 ) THEN
895 CALL CMUMPS_BACKSLV_RECV_AND_TREAT(
897 & BUFR, LBUFR, LBUFR_BYTES,
898 & MYID, SLAVEF, COMM,
899 & N, IWCB, LIWW, POSIWCB,
901 & IIPOOL, NBFINF, PTRICB, PTRACB, INFO,
902 & IPOOL, LPOOL, PANEL_POS, LPANEL_POS,
903 & STEP, FRERE, FILS, PROCNODE_STEPS,
904 & PLEFTW, KEEP, KEEP8, DKEEP,
905 & PTRIST, PTRFAC, IW, LIW, A, LA, W2, MYLEAF_LEFT,
907 & RHSCOMP, LRHSCOMP, POSINRHSCOMP_BWD,
908 & PRUN_BELOW, TO_PROCESS, SIZE_TO_PROCESS
911.LT.
IF ( INFO( 1 ) 0 ) THEN
912 ERROR_WAS_BROADCASTED = .TRUE.
916.EQ.
ELSE IF ( IERR -2 ) THEN
918 INFO( 2 ) = NRHS_B * LIELL * KEEP(35) + 4 * KEEP(34)
919 ERROR_WAS_BROADCASTED = .FALSE.
921.EQ.
ELSE IF ( IERR -3 ) THEN
923 INFO( 2 ) = NRHS_B * LIELL * KEEP(35) + 4 * KEEP(34)
924 ERROR_WAS_BROADCASTED = .FALSE.
927 DEJA_SEND( PROCDEST ) = .TRUE.
932.AND.
IF ( PRUN_BELOW NO_CHILDREN ) THEN
933 MYLEAF_LEFT = MYLEAF_LEFT - 1
934.EQ..AND.
ALLOW_OTHERS_TO_LEAVE = ( MYLEAF_LEFT 0
936 IF ( ALLOW_OTHERS_TO_LEAVE ) THEN
937 DO_MCAST2_TERMBWD = .TRUE.
942 DO I=1,(IIPOOL-POOL_FIRST_POS)/2
943 TMP=IPOOL(POOL_FIRST_POS+I-1)
944 IPOOL(POOL_FIRST_POS+I-1)=IPOOL(IIPOOL-I)
947.NE.
IF ( KEEP(31) 0 )
949 KEEP(31) = KEEP(31) - 1
950.EQ.
ALLOW_OTHERS_TO_LEAVE = (KEEP(31) 1)
951 IF (ALLOW_OTHERS_TO_LEAVE) THEN
952 DO_MCAST2_TERMBWD = .TRUE.
956 IWCB(PTRICB(STEP(INODE))+1) = IWCB(PTRICB(STEP(INODE))+1)-1
957 CALL CMUMPS_FREETOPSO(N, KEEP(28), IWCB, LIWW,
959 & POSWCB,POSIWCB,PTRICB,PTRACB)
recursive subroutine cmumps_backslv_recv_and_treat(bloq, flag, bufr, lbufr, lbufr_bytes, myid, slavef, comm, n, iwcb, liww, posiwcb, w, lwc, poswcb, iipool, nbfinf, ptricb, ptracb, info, ipool, lpool, panel_pos, lpanel_pos, step, frere, fils, procnode_steps, pleftw, keep, keep8, dkeep, ptrist, ptrfac, iw, liw, a, la, w2, myleaf_left, nrhs, mtype, rhscomp, lrhscomp, posinrhscomp_bwd, prun_below, to_process, size_to_process, from_pp)
subroutine cmumps_solve_node_bwd(inode, n, ipool, lpool, iipool, nbfinf, a, la, iw, liw, w, lwc, nrhs, poswcb, pleftw, posiwcb, rhscomp, lrhscomp, posinrhscomp_bwd, ptricb, ptracb, iwcb, liww, w2, ne_steps, step, frere, fils, ptrist, ptrfac, myleaf_left, info, procnode_steps, deja_send, slavef, comm, myid, bufr, lbufr, lbufr_bytes, keep, keep8, dkeep, rhs_root, lrhs_root, mtype, istep_to_iniv2, tab_pos_in_pere, panel_pos, lpanel_pos, prun_below, to_process, size_to_process, rhs_bounds, lrhs_bounds, do_nbsparse, from_pp, error_was_broadcasted, do_mcast2_termbwd)