35 IMPLICIT NONE
36 INTEGER :: KEEP( 500 )
37 INTEGER(8) :: KEEP8(150)
38 DOUBLE PRECISION, INTENT(INOUT) :: DKEEP(230)
39 INTEGER :: INFO(80)
40 INTEGER, INTENT( IN ) :: INODE, N, NRHS, MTYPE, LIW, LIWW
41 INTEGER, INTENT( IN ) :: SLAVEF, COMM,
42 INTEGER, INTENT (IN ) :: PROCNODE_STEPS(KEEP(28))
43 INTEGER, INTENT( IN ) :: NE_STEPS(KEEP(28))
44 INTEGER(8), INTENT( IN ) :: LA, LWC
45 INTEGER(8), INTENT( INOUT ) :: POSWCB, PLEFTW
46 INTEGER, INTENT( INOUT ) :: POSIWCB
47 INTEGER, 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(LPOOL), 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))
56 DOUBLE PRECISION :: A( LA )
57 DOUBLE PRECISION :: W(LWC)
58 DOUBLE PRECISION :: W2(KEEP(133))
59 INTEGER :: IW(LIW),IWCB(LIWW)
60 INTEGER STEP(N), FRERE(KEEP(28)),FILS(N)
61 INTEGER LBUFR, LBUFR_BYTES
62 INTEGER BUFR(LBUFR)
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 DOUBLE PRECISION RHSCOMP(LRHSCOMP,NRHS)
67 INTEGER(8), intent(in) :: LRHS_ROOT
68 DOUBLE PRECISION 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
78 include 'mpif.h'
79 include 'mumps_tags.h'
80 INTEGER IERR
81 LOGICAL FLAG
82 include 'mumps_headers.h'
83 LOGICAL COMPRESS_PANEL, LR_ACTIVATED
84 LOGICAL OOCWRITE_COMPATIBLE_WITH_BLR
85 LOGICAL LTLEVEL2, IN_SUBTREE
86 INTEGER TYPENODE
87 INTEGER TMP_NBPANELS, I_PIVRPTR, I_PIVR
88 LOGICAL MUST_BE_PERMUTED
89 LOGICAL NO_CHILDREN
90 LOGICAL :: ALLOW_OTHERS_TO_LEAVE
91 INTEGER :: K, JBDEB, JBFIN, NRHS_B
92 INTEGER
93 INTEGER NPIV
94 INTEGER IPOS,LIELL,NELIM,JJ,I
95 INTEGER J1,J2,J,NCB
96 INTEGER NSLAVES
97 INTEGER IN,IF,LONG,POOL_FIRST_POS,TMP
98 INTEGER :: NBFILS
99 INTEGER :: PROCDEST, DEST
100 INTEGER(8) :: PTWCB, PPIV_COURANT
101 INTEGER :: Offset, EffectiveSize, ISLAVE,
102 INTEGER :: POSINDICES, IPOSINRHSCOMP, IPOSINRHSCOMP_PANEL
103 INTEGER(8) :: APOS, IST
104 INTEGER(8) :: IFR8
105 INTEGER(8) :: APOSDEB, NBENTRIES_ALLPANELS
106 INTEGER(8) :: PTWCB_PANEL
107 INTEGER LDAJ, NBJ, LIWFAC,
108 & NBJLAST, NPIV_LAST, PANEL_SIZE,
109 & NCB_PANEL, TYPEF
110 INTEGER BEG_PANEL
111 LOGICAL TWOBYTWO
112 INTEGER NPANELS, IPANEL
113 DOUBLE PRECISION ALPHA,ONE,ZERO
114 parameter(zero=0.0d0, one = 1.0d0,
alpha=-1.0d0)
115 LOGICAL, EXTERNAL :: MUMPS_IN_OR_ROOT_SSARBR
116 INTEGER, EXTERNAL :: MUMPS_TYPENODE
117 INTEGER, EXTERNAL :: MUMPS_PROCNODE
118 error_was_broadcasted = .false.
119 do_mcast2_termbwd = .false.
120 no_children = .false.
121 IF (do_nbsparse) THEN
122 jbdeb= rhs_bounds(2*step(inode)-1)
123 jbfin= rhs_bounds(2*step(inode))
124 nrhs_b = jbfin-jbdeb+1
125 ELSE
126 jbdeb = 1
127 jbfin = nrhs
128 nrhs_b = nrhs
129 ENDIF
130 IF ( inode .EQ. keep( 38 ) .OR. inode .EQ. keep( 20 ) ) THEN
131 ipos = ptrist(step(inode))+keep(ixsz)
132 npiv = iw(ipos+3)
133 liell = iw(ipos) + npiv
134 ipos = ptrist(step(inode)) + 5 + keep(ixsz)
135 IF ( mtype .EQ. 1 .AND. keep(50) .EQ. 0) THEN
136 j1 = ipos + liell + 1
137 j2 = ipos + liell + npiv
138 ELSE
139 j1 = ipos + 1
140 j2 = ipos + npiv
141 END IF
142 ifr8 = 0_8
143 iposinrhscomp = posinrhscomp_bwd(iw(j1))
145 & keep, rhscomp, nrhs, lrhscomp, iposinrhscomp,
146 & rhs_root(1+npiv*(jbdeb-1)), npiv, 1)
147 in = inode
148 270 in = fils(in)
149 IF (in .GT. 0) GOTO 270
150 IF (in .EQ. 0) THEN
151 myleaf_left = myleaf_left - 1
152 allow_others_to_leave = ( myleaf_left .EQ. 0 .AND.
153 & keep(31) .EQ. 0)
154 IF (keep(31) .NE. 0) THEN
156 & procnode_steps(step(inode)), keep(199) ) ) THEN
157 keep(31) = keep(31) - 1
158 IF (keep(31) .EQ. 1) THEN
159 allow_others_to_leave = .true.
160 ENDIF
161 ENDIF
162 ENDIF
163 IF (allow_others_to_leave) THEN
164 do_mcast2_termbwd = .true.
165 nbfinf = nbfinf - 1
166 ENDIF
167 RETURN
168 ENDIF
169 IF = -in
170 long = npiv
171 nbfils = ne_steps(step(inode))
172 IF ( prun_below ) THEN
173 i = nbfils
174 nbfils = 0
175 DO WHILE (i.GT.0)
176 IF ( to_process(step(
if)) ) nbfils = nbfils+1
178 i = i -1
179 ENDDO
180 IF (nbfils.EQ.0) THEN
181 no_children = .true.
182 ELSE
183 no_children = .false.
184 ENDIF
185 IF = -in
186 ENDIF
187 DO i = 0, slavef - 1
188 deja_send( i ) = .false.
189 END DO
190 pool_first_pos=iipool
191 DO i = 1, nbfils
192 IF ( prun_below ) THEN
193 1030
IF ( .NOT.to_process(step(
if)) )
THEN
195 GOTO 1030
196 ENDIF
197 no_children = .false.
198 ENDIF
200 & .EQ. myid) THEN
201 ipool(iipool) = IF
202 iipool = iipool + 1
203 ELSE
205 & keep(199))
206 IF (.NOT. deja_send( procdest )) THEN
207 600 CONTINUE
209 & long, long, iw( j1 ),
210 & rhs_root( 1+npiv*(jbdeb-1) ),
211 & jbdeb, jbfin,
212 & rhscomp(1, 1), nrhs, lrhscomp,
213 & iposinrhscomp, npiv,
214 & keep, procdest,
215 & noeud, comm, ierr )
216 IF ( ierr .EQ. -1 ) THEN
218 & .false., flag,
219 & bufr, lbufr, lbufr_bytes,
220 & myid, slavef, comm,
221 & n, iwcb, liww, posiwcb,
222 & w, lwc, poswcb,
223 & iipool, nbfinf, ptricb, ptracb, info,
224 & ipool, lpool, panel_pos, lpanel_pos,
225 & step, frere, fils, procnode_steps,
226 & pleftw, keep,keep8, dkeep,
227 & ptrist, ptrfac, iw, liw, a, la, w2,
228 & myleaf_left,
229 & nrhs, mtype,
230 & rhscomp, lrhscomp, posinrhscomp_bwd,
231 & prun_below, to_process, size_to_process
232 & , from_pp
233 & )
234 IF ( info( 1 ) .LT. 0 ) THEN
235 error_was_broadcasted = .true.
236 RETURN
237 ENDIF
238 GOTO 600
239 ELSE IF ( ierr .EQ. -2 ) THEN
240 info( 1 ) = -17
241 info( 2 ) = nrhs_b * long * keep(35) +
242 & ( long + 4 ) * keep(34)
243 error_was_broadcasted = .false.
244 RETURN
245 ELSE IF ( ierr .EQ. -3 ) THEN
246 info( 1 ) = -20
247 info( 2 ) = nrhs_b * long * keep(35) +
248 & ( long + 4 ) * keep(34)
249 error_was_broadcasted = .false.
250 RETURN
251 ELSE IF ( ierr .NE. 0 ) THEN
252 WRITE(*,*) "Internal error 2 DMUMPS_SOLVE_NODE_BWD",
253 & ierr
255 END IF
256 deja_send( procdest ) = .true.
257 END IF
258 ENDIF
260 ENDDO
261 allow_others_to_leave = .false.
262 IF ( prun_below .AND. no_children ) THEN
263 myleaf_left = myleaf_left - 1
264 allow_others_to_leave = ( myleaf_left .EQ. 0 .AND.
265 & keep(31) .EQ. 0)
266 ENDIF
267 IF ( keep(31). ne. 0) THEN
269 & procnode_steps(step(inode)), keep(199) ) ) THEN
270 keep(31) = keep(31) - 1
271 IF (keep(31) .EQ. 1) THEN
272 allow_others_to_leave = .true.
273 ENDIF
274 ENDIF
275 ENDIF
276 IF ( allow_others_to_leave ) THEN
277 do_mcast2_termbwd = .true.
278 nbfinf = nbfinf - 1
279 ENDIF
280 IF (iipool.NE.pool_first_pos) THEN
281 DO i=1,(iipool-pool_first_pos)/2
282 tmp = ipool(pool_first_pos+i-1)
283 ipool(pool_first_pos+i-1) = ipool(iipool-i)
284 ipool(iipool-i) = tmp
285 ENDDO
286 ENDIF
287 RETURN
288 END IF
290 & procnode_steps(step(inode)), keep(199) )
292 & keep(199))
293 ltlevel2= (
294 & (typenode .eq.2 ) .AND.
295 & (mtype.NE.1) )
296 npiv = iw(ptrist(step(inode))+2+keep(ixsz)+1)
297 IF ((npiv.NE.0).AND.(ltlevel2)) THEN
298 ipos = ptrist(step(inode)) + 2 + keep(ixsz)
299 liell = iw(ipos-2)+iw(ipos+1)
300 nelim = iw(ipos-1)
301 ipos = ipos + 1
302 npiv = iw(ipos)
303 ncb = liell - npiv - nelim
304 ipos = ipos + 2
305 nslaves = iw( ipos )
306 offset = 0
307 ipos = ipos + nslaves
308 iw(ptrist(step(inode))+xxs)= c_fini+nslaves
309 IF ( posiwcb - 2 .LT. 0 .or.
310 & poswcb-int(ncb,8)*int(nrhs_b,8) .LT. pleftw-1_8 ) THEN
312 & poswcb, posiwcb, ptricb, ptracb)
313 IF ( poswcb-int(ncb,8)*int(nrhs_b,8) .LT. pleftw-1_8 ) THEN
314 info( 1 ) = -11
316 & info(2))
317 error_was_broadcasted = .false.
318 RETURN
319 END IF
320 IF ( posiwcb - 2 .LT. 0 ) THEN
321 info( 1 ) = -14
322 info( 2 ) = 2 - posiwcb
323 error_was_broadcasted = .false.
324 RETURN
325 END IF
326 END IF
327 posiwcb = posiwcb - 2
328 poswcb = poswcb - int(ncb,8)*int(nrhs_b,8)
329 ptricb(step( inode )) = posiwcb + 1
330 ptracb(step( inode )) = poswcb + 1_8
331 iwcb( ptricb(step( inode )) ) = ncb*nrhs_b
332 iwcb( ptricb(step( inode )) + 1 ) = 1
333 IF ( mtype.EQ.1 .AND. keep(50).EQ.0 ) THEN
334 posindices = ipos + liell + 1
335 ELSE
336 posindices = ipos + 1
337 END IF
338 IF ( ncb.EQ.0 ) THEN
339 write(6,*) ' Internal Error type 2 node with no CB '
341 ENDIF
342 IF ( mtype .EQ. 1 .AND. keep(50).EQ.0 ) THEN
343 j1 = ipos + liell + npiv + nelim +1
344 j2 = ipos + 2 * liell
345 ELSE
346 j1 = ipos + npiv + nelim +1
347 j2 = ipos + liell
348 END IF
349 ifr8 = ptracb(step( inode )) - 1_8
351 & rhscomp, nrhs, lrhscomp,
352 & w(ptracb(step(inode))), ncb, 1,
353 & iw, liw, keep, n, posinrhscomp_bwd )
354 ifr8 = ifr8 + int(j2-keep(253)-j1+1,8)
355 IF (keep(252).NE.0) THEN
356 DO jj = j2-keep(253)+1, j2
357 ifr8 = ifr8 + 1_8
358 DO k=jbdeb, jbfin
359 IF (k.EQ.jj-j2+keep(253)) THEN
360 w(ifr8+int(k-jbdeb,8)*int(ncb,8)) =
alpha
361 ELSE
362 w(ifr8+int(k-jbdeb,8)*int(ncb,8)) = zero
363 ENDIF
364 ENDDO
365 ENDDO
366 ENDIF
367 DO islave = 1, nslaves
369 & keep,keep8, inode, step, n, slavef,
370 & istep_to_iniv2, tab_pos_in_pere,
371 & islave, ncb,
372 & nslaves,
373 & effectivesize,
374 & firstindex )
375 500 CONTINUE
376 dest = iw( ptrist(step(inode))+5+islave+keep(ixsz))
378 & w(offset+ptracb(step(inode))),
379 & effectivesize,
380 & ncb, dest,
381 & backslv_master2slave, jbdeb, jbfin,
382 & keep, comm, ierr )
383 IF ( ierr .EQ. -1 ) THEN
385 & .false., flag,
386 & bufr, lbufr, lbufr_bytes,
387 & myid, slavef, comm,
388 & n, iwcb, liww, posiwcb,
389 & w, lwc, poswcb,
390 & iipool, nbfinf, ptricb, ptracb, info,
391 & ipool, lpool, panel_pos, lpanel_pos,
392 & step, frere, fils,
393 & procnode_steps, pleftw, keep,keep8, dkeep,
394 & ptrist, ptrfac, iw, liw, a, la, w2, myleaf_left,
395 & nrhs, mtype,
396 & rhscomp, lrhscomp, posinrhscomp_bwd,
397 & prun_below , to_process, size_to_process
398 & , from_pp
399 & )
400 IF ( info( 1 ) .LT. 0 ) THEN
401 error_was_broadcasted = .true.
402 RETURN
403 ENDIF
404 GOTO 500
405 ELSE IF ( ierr .EQ. -2 ) THEN
406 info( 1 ) = -17
407 info( 2 ) = nrhs_b * effectivesize * keep(35) +
408 & 2 * keep(34)
409 error_was_broadcasted = .false.
410 RETURN
411 ELSE IF ( ierr .EQ. -3 ) THEN
412 info( 1 ) = -20
413 info( 2 ) = nrhs_b * effectivesize * keep(35) +
414 & 2 * keep(34)
415 error_was_broadcasted = .false.
416 RETURN
417 END IF
418 offset = offset + effectivesize
419 END DO
420 iwcb( ptricb(step( inode )) + 1 ) = 0
422 & poswcb,posiwcb,ptricb,ptracb)
423 RETURN
424 ENDIF
425 lr_activated = (iw(ptrist(step(inode))+xxlr).GT.0)
426 compress_panel = (iw(ptrist(step(inode))+xxlr).GE.2)
427 oocwrite_compatible_with_blr =
428 & (.NOT.lr_activated.OR.(.NOT.compress_panel).OR.
429 & (keep(485).EQ.0)
430 & )
431 ipos = ptrist(step(inode)) + 2 + keep(ixsz)
432 liell = iw(ipos-2)+iw(ipos+1)
433 nelim = iw(ipos-1)
434 ipos = ipos + 1
435 npiv = iw(ipos)
436 ncb = liell - npiv
437 ipos = ipos + 1
438 IF (keep(201).GT.0.AND.oocwrite_compatible_with_blr) THEN
440 & inode,ptrfac,keep,a,la,step,
441 & keep8,n,must_be_permuted,ierr)
442 IF(ierr.LT.0)THEN
443 info(1)=ierr
444 info(2)=0
445 error_was_broadcasted = .false.
446 RETURN
447 ENDIF
448 ENDIF
449 apos = ptrfac( step(inode))
450 nslaves = iw( ptrist(step(inode)) + 5 + keep(ixsz) )
451 ipos = ipos + 1 + nslaves
452 IF (keep(201).EQ.1.AND.oocwrite_compatible_with_blr) THEN
453 liwfac = iw(ptrist(step(inode))+xxi)
454 IF (mtype.NE.1) THEN
455 typef = typef_l
456 ELSE
457 typef = typef_u
458 ENDIF
460 IF (keep(50).NE.1) THEN
462 & iw(ipos+1+2*liell),
463 & must_be_permuted )
464 ENDIF
465 ENDIF
466 long = 0
467 IF ( mtype .EQ. 1 .AND. keep(50).EQ.0 ) THEN
468 j1 = ipos + liell + 1
469 j2 = ipos + npiv + liell
470 ELSE
471 j1 = ipos + 1
472 j2 = ipos + npiv
473 ENDIF
474 IF (in_subtree) THEN
475 ptwcb = pleftw
476 IF ( poswcb .LT. int(liell,8)*int(nrhs_b,8) ) THEN
478 & poswcb, posiwcb, ptricb, ptracb)
479 IF ( poswcb .LT. int(liell,8)*int(nrhs_b,8) ) THEN
480 info(1) = -11
482 & info(2))
483 error_was_broadcasted = .false.
484 RETURN
485 END IF
486 END IF
487 ELSE
488 IF ( posiwcb - 2 .LT. 0 .or.
489 & poswcb-int(liell,8)*int(nrhs_b,8) .LT. pleftw-1_8 ) THEN
491 & poswcb, posiwcb, ptricb, ptracb )
492 IF ( poswcb-int(liell,8)*int(nrhs_b,8) .LT. pleftw-1_8 ) THEN
493 info( 1 ) = -11
495 & poswcb-pleftw+1_8,
496 & info(2) )
497 error_was_broadcasted = .false.
498 RETURN
499 END IF
500 IF ( posiwcb - 2 .LT. 0 ) THEN
501 info( 1 ) = -14
502 info( 2 ) = 2 - posiwcb
503 error_was_broadcasted = .false.
504 RETURN
505 END IF
506 END IF
507 posiwcb = posiwcb - 2
508 poswcb = poswcb - int(liell,8)*int(nrhs_b,8)
509 ptricb(step( inode )) = posiwcb + 1
510 ptracb(step( inode )) = poswcb + 1_8
511 iwcb( ptricb(step( inode )) ) = liell*nrhs_b
512 iwcb( ptricb(step( inode )) + 1 ) = 1
513 IF ( mtype.EQ.1 .AND. keep(50).EQ.0 ) THEN
514 posindices = ipos + liell + 1
515 ELSE
516 posindices = ipos + 1
517 END IF
518 ptwcb = ptracb(step( inode ))
519 ENDIF
520 IF (j2.GE.j1) THEN
521 iposinrhscomp = posinrhscomp_bwd(iw(j1))
522 ELSE
523 iposinrhscomp = -99999
524 ENDIF
525 IF (j2.GE.j1) THEN
526 DO k=jbdeb, jbfin
527 IF (keep(252).NE.0) THEN
528 DO jj = j1, j2
529 rhscomp(iposinrhscomp+jj-j1,k) = zero
530 ENDDO
531 ENDIF
532 END DO
533 ENDIF
534 ifr8 = ptwcb + int(npiv - 1,8)
535 IF ( liell .GT. npiv ) THEN
536 IF ( mtype .EQ. 1 .AND. keep(50).EQ.0 ) THEN
537 j1 = ipos + liell + npiv + 1
538 j2 = ipos + 2 * liell
539 ELSE
540 j1 = ipos + npiv + 1
541 j2 = ipos + liell
542 END IF
544 & rhscomp, nrhs, lrhscomp,
545 & w(ptwcb), liell, npiv+1,
546 & iw, liw, keep, n, posinrhscomp_bwd )
547 ifr8 = ifr8 + int(j2-keep(253)-j1+1,8)
548 IF (keep(252).NE.0) THEN
549 DO jj = j2-keep(253)+1, j2
550 ifr8 = ifr8 + 1_8
551 DO k=jbdeb, jbfin
552 IF (k.EQ.jj-j2+keep(253)) THEN
553 w(ifr8+int(k-jbdeb,8)*int(liell,8)) =
alpha
554 ELSE
555 w(ifr8+int(k-jbdeb,8)*int(liell,8)) = zero
556 ENDIF
557 ENDDO
558 ENDDO
559 ENDIF
560 ncb = liell - npiv
561 IF (npiv .EQ. 0) GOTO 160
562 ENDIF
563 IF (keep(201).EQ.1.AND.oocwrite_compatible_with_blr) THEN
564 j = npiv / panel_size
565 twobytwo = keep(50).EQ.2 .AND.
566 & ((typenode.EQ.1.AND.keep(103).GT.0) .OR.
567 & (typenode.EQ.2.AND.keep(105).GT.0))
568 IF (twobytwo) THEN
570 & iw(ipos+1+liell), npiv, npanels, liell,
571 & nbentries_allpanels)
572 ELSE
573 IF (npiv.EQ.j*panel_size) THEN
574 npiv_last = npiv
575 nbjlast = panel_size
576 npanels = j
577 ELSE
578 npiv_last = (j+1)* panel_size
579 nbjlast = npiv-j*panel_size
580 npanels = j+1
581 ENDIF
582 nbentries_allpanels =
583 & int(liell,8) * int(npiv,8)
584 & - int( ( j * ( j - 1 ) ) /2,8 )
585 & * int(panel_size,8) * int(panel_size,8)
586 & - int(j,8)
587 & * int(mod(npiv, panel_size),8)
588 & * int(panel_size,8)
589 jj=npiv_last
590 ENDIF
591 aposdeb = apos + nbentries_allpanels
592 DO ipanel = npanels, 1, -1
593 IF (twobytwo) THEN
594 nbj = panel_pos(ipanel+1)-panel_pos(ipanel)
595 beg_panel = panel_pos(ipanel)
596 ELSE
597 IF (jj.EQ.npiv_last) THEN
598 nbj = nbjlast
599 ELSE
600 nbj = panel_size
601 ENDIF
602 beg_panel = jj- panel_size+1
603 ENDIF
604 ldaj = liell-beg_panel+1
605 aposdeb = aposdeb - int(nbj,8)*int(ldaj,8)
606 ptwcb_panel = ptwcb + int(beg_panel - 1,8)
607 iposinrhscomp_panel = iposinrhscomp + beg_panel - 1
608 ncb_panel = ldaj - nbj
609 IF (keep(50).NE.1.AND.must_be_permuted) THEN
611 & i_pivrptr, i_pivr, ipos + 1 + 2 * liell, iw, liw)
612 IF (npiv.EQ.(iw(i_pivrptr)-1)) THEN
613 must_be_permuted=.false.
614 ELSE
616 & iw(i_pivr + iw(i_pivrptr+ipanel-1)-iw(i_pivrptr)),
617 & npiv-iw(i_pivrptr+ipanel-1)+1,
618 & iw(i_pivrptr+ipanel-1)-1,
619 & a(aposdeb),
620 & ldaj, nbj, beg_panel-1)
621 ENDIF
622 ENDIF
623#if defined(MUMPS_USE_BLAS2)
624 IF ( nrhs_b == 1 ) THEN
625 IF (ncb_panel.NE.0) THEN
626 IF (ncb_panel - ncb.NE. 0) THEN
628 & a( aposdeb + int(nbj,8) ), ldaj,
629 & rhscomp(iposinrhscomp_panel+nbj,jbdeb),
630 & 1, one,
631 & rhscomp(iposinrhscomp_panel,jbdeb), 1 )
632 ENDIF
633 IF (ncb .NE. 0) THEN
635 & a( aposdeb + int(ldaj-ncb,8) ), ldaj,
636 & w( ptwcb + int(npiv,8) ),
637 & 1, one,
638 & rhscomp(iposinrhscomp_panel,jbdeb), 1 )
639 ENDIF
640 ENDIF
641 IF (mtype.NE.1) THEN
642 CALL dtrsv(
'L',
'T',
'U', nbj, a(aposdeb), ldaj,
643 & rhscomp(iposinrhscomp_panel,jbdeb), 1)
644 ELSE
645 CALL dtrsv(
'L',
'T',
'N', nbj, a(aposdeb), ldaj,
646 & rhscomp(iposinrhscomp_panel,jbdeb), 1)
647 ENDIF
648 ELSE
649#endif
650 IF (ncb_panel.NE.0) THEN
651 IF (ncb_panel - ncb .NE. 0) THEN
652 CALL dgemm(
'T',
'N', nbj, nrhs_b,
653 & ncb_panel-ncb,
alpha,
654 & a(aposdeb +int(nbj,8)), ldaj,
655 & rhscomp(iposinrhscomp_panel+nbj,jbdeb), lrhscomp,
656 & one, rhscomp(iposinrhscomp_panel,jbdeb), lrhscomp)
657 ENDIF
658 IF (ncb .NE. 0) THEN
659 CALL dgemm(
'T',
'N', nbj, nrhs_b, ncb,
alpha,
660 & a(aposdeb +int(ldaj-ncb,8)), ldaj,
661 & w( ptwcb+int(npiv,8) ), liell,
662 & one, rhscomp(iposinrhscomp_panel,jbdeb),lrhscomp)
663 ENDIF
664 ENDIF
665 IF (mtype.NE.1) THEN
666 CALL dtrsm(
'L',
'L',
'T',
'U',nbj, nrhs_b, one,
667 & a(aposdeb),
668 & ldaj, rhscomp(iposinrhscomp_panel,jbdeb), lrhscomp)
669 ELSE
670 CALL dtrsm(
'L',
'L',
'T',
'N',nbj, nrhs_b, one,
671 & a(aposdeb),
672 & ldaj, rhscomp(iposinrhscomp_panel,jbdeb), lrhscomp)
673 ENDIF
674#if defined(MUMPS_USE_BLAS2)
675 ENDIF
676#endif
677 IF (.NOT. twobytwo) jj=beg_panel-1
678 ENDDO
679 ELSE
680 IF ( iw(ptrist(step(inode))+xxlr) .GE. 2
681 & .AND. keep(485) .EQ. 1 ) THEN
682 iwhdlr = iw(ptrist(step(inode))+xxf)
684 & inode, iwhdlr, npiv, nslaves,
685 & liell, w, lwc, nrhs_b, ptwcb,
686 & rhscomp, lrhscomp, nrhs,
687 & iposinrhscomp, jbdeb,
688 & mtype, keep, keep8,
689 & info(1), info(2) )
690 IF (info(1).LT.0) THEN
691 error_was_broadcasted = .false.
692 RETURN
693 ENDIF
694 ELSE
695 IF ( liell .GT. npiv ) THEN
696#if defined(LDLTPANEL_DEBUG)
697 WRITE(*,*) 'before gemm LIELL, NPIV, PTWCB=',liell,npiv,ptwcb
698 WRITE(*,*) 'before gemm RHSCOMP=',
699 & rhscomp(iposinrhscomp:iposinrhscomp+npiv-1,1)
700 WRITE(*,*) 'before gemm W',
701 & w(ptwcb+npiv:ptwcb+liell-1)
703 WRITE(*,*) "FACTORS=",a(apos:apos+ist-1)
704#endif
705 IF ( mtype .eq. 1 ) THEN
706 ist = apos + int(npiv,8)
707#if defined(MUMPS_USE_BLAS2)
708 IF (nrhs_b == 1) THEN
709 CALL dgemv(
'T', ncb, npiv,
alpha, a(ist), liell,
710 & w(ptwcb+int(npiv,8)), 1,
711 & one,
712 & rhscomp(iposinrhscomp,jbdeb), 1 )
713 ELSE
714#endif
716 & a(ist),
717 & liell, w(ptwcb+int(npiv,8)), liell, one,
718 & rhscomp(iposinrhscomp,jbdeb), lrhscomp)
719#if defined(MUMPS_USE_BLAS2)
720 ENDIF
721#endif
722 ELSE
723 IF ( keep(50) .eq. 0 ) THEN
724 ist = apos + int(npiv,8) * int(liell,8)
725 ELSE
726 IF( keep(459) .GT. 1) THEN
728 ist = apos + ist - int(npiv,8) * int(liell-npiv,8)
729 ELSE
730 ist = apos + int(npiv,8) * int(npiv,8)
731 ENDIF
732 END IF
733#if defined(MUMPS_USE_BLAS2)
734 IF ( nrhs_b == 1 ) THEN
735 CALL dgemv(
'N', npiv, ncb,
alpha, a( ist ), npiv,
736 & w( ptwcb + int(npiv,8) ),
737 & 1, one,
738 & rhscomp(iposinrhscomp,jbdeb), 1 )
739 ELSE
740#endif
741 CALL dgemm(
'N',
'N', npiv, nrhs_b, ncb,
alpha,
742 & a(ist),
743 & npiv, w(ptwcb+int(npiv,8)), liell,
744 & one, rhscomp(iposinrhscomp,jbdeb), lrhscomp)
745#if defined(MUMPS_USE_BLAS2)
746 END IF
747#endif
748 END IF
749 ENDIF
750 IF ( mtype .eq. 1 ) THEN
751 ldaj = liell
752 ELSE
753 IF ( keep(50) .EQ. 0 ) THEN
754 ldaj=liell
755 ELSE
756 IF (keep(459).GT.1) THEN
757 ldaj=-999799
758 ELSE
759 ldaj=npiv
760 ENDIF
761 ENDIF
762 END IF
763 ppiv_courant = int(jbdeb-1,8)*int(lrhscomp,8)
764 & + int(iposinrhscomp,8)
765 IF (keep(459).GT.1 .AND. keep(50).NE.0) THEN
767 & npiv, iw(ipos+1+liell),
768 & nrhs_b, rhscomp(1,1), keep8(25), lrhscomp, ppiv_courant,
769 & mtype, keep )
770 ELSE
772 & npiv, ldaj,
773 & nrhs_b, rhscomp(1,1), keep8(25), lrhscomp, ppiv_courant,
774 & mtype, keep )
775 ENDIF
776 ENDIF
777 ENDIF
778 IF ( mtype .EQ. 1 .AND. keep(50).EQ.0) THEN
779 j1 = ipos + liell + 1
780 ELSE
781 j1 = ipos + 1
782 END IF
783 iposinrhscomp = posinrhscomp_bwd(iw(j1))
784 160 CONTINUE
785 IF (keep(201).GT.0.AND.oocwrite_compatible_with_blr) THEN
787 & a,la,.true.,ierr)
788 IF(ierr.LT.0)THEN
789 info(1)=ierr
790 info(2)=0
791 error_was_broadcasted = .false.
792 RETURN
793 ENDIF
794 ENDIF
795 in = inode
796 170 in = fils(in)
797 IF (in .GT. 0) GOTO 170
798 IF (in .EQ. 0) THEN
799 myleaf_left = myleaf_left - 1
800 IF (.NOT. in_subtree ) THEN
801 iwcb(ptricb(step(inode))+1) = iwcb(ptricb(step(inode))+1)-1
803 & w, lwc,
804 & poswcb,posiwcb,ptricb,ptracb)
805 ENDIF
806 allow_others_to_leave = ( myleaf_left .EQ. 0 .AND.
807 & keep(31) .EQ. 0)
808 IF ( keep(31) .NE. 0 .AND.
809 & .NOT. in_subtree ) THEN
810 keep(31) = keep(31) - 1
811 IF (keep(31).EQ. 1) THEN
812 allow_others_to_leave = .true.
813 ENDIF
814 ENDIF
815 IF (allow_others_to_leave) THEN
816 do_mcast2_termbwd = .true.
817 nbfinf = nbfinf - 1
818 ENDIF
819 RETURN
820 ENDIF
821 IF = -in
822 nbfils = ne_steps(step(inode))
823 IF ( prun_below ) THEN
824 i = nbfils
825 nbfils = 0
826 DO WHILE (i.GT.0)
827 IF ( to_process(step(
if)) ) nbfils = nbfils+1
829 i = i -1
830 ENDDO
831 IF (nbfils.EQ.0) THEN
832 no_children = .true.
833 ELSE
834 no_children = .false.
835 ENDIF
836 IF = -in
837 ENDIF
838 IF (in_subtree) THEN
839 DO i = 1, nbfils
840 IF ( prun_below ) THEN
841 1010 CONTINUE
842 IF ( .NOT.to_process(step(
if)) )
THEN
844 GOTO 1010
845 ENDIF
846 no_children = .false.
847 ENDIF
848 ipool((iipool-i+1)+nbfils-i) = IF
849 iipool = iipool + 1
851 ENDDO
852 IF (prun_below .AND. no_children) THEN
853 myleaf_left = myleaf_left - 1
854 allow_others_to_leave = ( myleaf_left .EQ. 0 .AND.
855 & keep(31) .EQ. 0)
856 IF (allow_others_to_leave ) THEN
857 do_mcast2_termbwd = .true.
858 nbfinf = nbfinf - 1
859 RETURN
860 ENDIF
861 ENDIF
862 ELSE
863 DO i = 0, slavef - 1
864 deja_send( i ) = .false.
865 END DO
866 pool_first_pos=iipool
867 DO 190 i = 1, nbfils
868 IF ( prun_below ) THEN
8691020
IF ( .NOT.to_process(step(
if)) )
THEN
871 GOTO 1020
872 ENDIF
873 no_children = .false.
874 ENDIF
876 & keep(199)) .EQ. myid) THEN
877 ipool(iipool) = IF
878 iipool = iipool + 1
880 ELSE
882 & keep(199))
883 IF (.not. deja_send( procdest )) THEN
884 400 CONTINUE
886 & liell, liell - keep(253),
887 & iw( posindices ),
888 & w( ptracb(step(inode)) ), jbdeb, jbfin,
889 & rhscomp(1, 1), nrhs, lrhscomp,
890 & iposinrhscomp, npiv,
891 & keep, procdest, noeud, comm, ierr )
892 IF ( ierr .EQ. -1 ) THEN
894 & .false., flag,
895 & bufr, lbufr, lbufr_bytes,
896 & myid, slavef, comm,
897 & n, iwcb, liww, posiwcb,
898 & w, lwc, poswcb,
899 & iipool, nbfinf, ptricb, ptracb, info,
900 & ipool, lpool, panel_pos, lpanel_pos,
901 & step, frere, fils, procnode_steps,
902 & pleftw, keep, keep8, dkeep,
903 & ptrist, ptrfac, iw, liw, a, la, w2, myleaf_left,
904 & nrhs, mtype,
905 & rhscomp, lrhscomp, posinrhscomp_bwd,
906 & prun_below, to_process, size_to_process
907 & , from_pp
908 & )
909 IF ( info( 1 ) .LT. 0 ) THEN
910 error_was_broadcasted = .true.
911 RETURN
912 ENDIF
913 GOTO 400
914 ELSE IF ( ierr .EQ. -2 ) THEN
915 info( 1 ) = -17
916 info( 2 ) = nrhs_b * liell * keep(35) + 4 * keep(34)
917 error_was_broadcasted = .false.
918 RETURN
919 ELSE IF ( ierr .EQ. -3 ) THEN
920 info( 1 ) = -20
921 info( 2 ) = nrhs_b * liell * keep(35) + 4 * keep(34)
922 error_was_broadcasted = .false.
923 RETURN
924 END IF
925 deja_send( procdest ) = .true.
926 END IF
928 ENDIF
929 190 CONTINUE
930 IF ( prun_below .AND. no_children ) THEN
931 myleaf_left = myleaf_left - 1
932 allow_others_to_leave = ( myleaf_left .EQ. 0 .AND.
933 & keep(31) .EQ. 0)
934 IF ( allow_others_to_leave ) THEN
935 do_mcast2_termbwd = .true.
936 nbfinf = nbfinf - 1
937 RETURN
938 ENDIF
939 ENDIF
940 DO i=1,(iipool-pool_first_pos)/2
941 tmp=ipool(pool_first_pos+i-1)
942 ipool(pool_first_pos+i-1)=ipool(iipool-i)
943 ipool(iipool-i)=tmp
944 ENDDO
945 IF ( keep(31) .NE. 0 )
946 & THEN
947 keep(31) = keep(31) - 1
948 allow_others_to_leave = (keep(31) .EQ. 1)
949 IF (allow_others_to_leave) THEN
950 do_mcast2_termbwd = .true.
951 nbfinf = nbfinf - 1
952 ENDIF
953 ENDIF
954 iwcb(ptricb(step(inode))+1) = iwcb(ptricb(step(inode))+1)-1
956 & w, lwc,
957 & poswcb,posiwcb,ptricb,ptracb)
958 ENDIF
959 RETURN
subroutine dmumps_solve_bwd_panels(a, la, apos, npiv, iw, nrhs_b, wcb, lwcb, lda_wcb, ppiv_courant, mtype, keep)
subroutine dmumps_freetopso(n, keep28, iwcb, liww, w, lwc, poswcb, iwposcb, ptricb, ptracb)
subroutine dmumps_solve_bwd_trsolve(a, la, apos, npiv, ldadiag, nrhs_b, wcb, lwcb, lda_wcb, ppiv_courant, mtype, keep)
subroutine dmumps_sol_cpy_fs2rhscomp(jbdeb, jbfin, nbrows, keep, rhscomp, nrhs, lrhscomp, first_row_rhscomp, w, ld_w, first_row_w)
subroutine mumps_bloc2_get_slave_info(keep, keep8, inode, step, n, slavef, istep_to_iniv2, tab_pos_in_pere islave, ncb, nslaves, size, first_index)
subroutine, public dmumps_buf_send_vcb(nrhs_b, node1, node2, ncb, ldw, long, iw, w, jbdeb, jbfin, rhscomp, nrhs, lrhscomp, iposinrhscomp, npiv, keep, dest, tag, comm, ierr)