66 & ( comm_load, ass_irecv, n, ison, iroot,
68 & root, nbrow, nbcol, shift_list_row_son,
69 & shift_list_col_son, shift_val_son_arg, lda_arg, tag,
70 & myid, comm, bufr, lbufr, lbufr_bytes, procnode_steps, posfac,
71 & iwpos, iwposcb, iptrlu, lrlu, lrlus, iw, liw, a, la,
72 & ptrist, ptlust_s, ptrfac,
73 & ptrast, step, pimaster, pamaster,
74 & nstk,
comp, iflag, ierror, perm,
75 & ipool, lpool, leaf, nbfin, slavef,
76 & opassw, opeliw, itloc, rhs_mumps,
77 & fils, dad, ptrarw, ptraiw,
78 & intarr,dblarr,icntl,keep,keep8,dkeep,transpose_asm,
80 & lptrar, nelt, frtptr, frtelt,
81 & istep_to_iniv2, tab_pos_in_pere
90 INTEGER keep(500), icntl(60)
93 TYPE (smumps_root_struc) :: root
94 INTEGER comm_load, ass_irecv
95 INTEGER n, ison, iroot, tag
96 INTEGER ptri( keep(28) )
97 INTEGER(8) :: ptrr( keep(28) )
99 INTEGER,
INTENT(IN):: lda_arg
100 INTEGER(8),
INTENT(IN) :: shift_val_son_arg
101 INTEGER shift_list_row_son, shift_list_col_son
103 LOGICAL transpose_asm
105 INTEGER lbufr, lbufr_bytes
106 INTEGER bufr( lbufr )
107 INTEGER(8) :: posfac, iptrlu, lrlu, lrlus, la
108 INTEGER iwpos, iwposcb
112 INTEGER,
intent(in) :: lrgroups(n)
114 INTEGER frtptr( n+1 ), frtelt( nelt )
115 INTEGER(8) :: ptrast(keep(28))
116 INTEGER(8) :: ptrfac(keep(28))
117 INTEGER(8) :: pamaster(keep(28))
118 INTEGER ptrist( keep(28) ), ptlust_s(keep(28))
119 INTEGER step(n), pimaster(keep(28)), nstk( n )
120 INTEGER comp, iflag, ierror
123 INTEGER ipool( lpool )
124 INTEGER nbfin, slavef
125 DOUBLE PRECISION opassw, opeliw
126 INTEGER procnode_steps( keep(28) )
127 INTEGER itloc( n + keep(253) ), fils( n ), dad(keep(28))
129 INTEGER nd( keep(28) ), ( keep(28) )
130 INTEGER(8),
INTENT(IN) :: ptrarw( lptrar ), ptraiw( lptrar )
131 INTEGER intarr( keep8(27) )
132 REAL dblarr( keep8(26) )
133INTEGER istep_to_iniv2(keep(71)),
134 & tab_pos_in_pere(slavef+2,
max(1,keep(56)))
135 REAL,
DIMENSION(:),
POINTER :: sona_ptr
136 INTEGER(8) :: lsona_ptr, possona_ptr
138 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ptrrow, ptrcol
139 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: nsuprow, nsupcol
140 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: row_index_list
141 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: col_index_list
142 INTEGER :: status(mpi_status_size)
143 INTEGER i, pos_in_root, irow, jcol, iglob, jglob
145 INTEGER local_m, local_n
146 INTEGER(8) :: posroot
148 INTEGER nrlocal, nclocal
150 INTEGER(8) :: shift_val_son
151 LOGICAL set_irecv, blocking, message_received
152 INTEGER nbrows_already_sent
155 include
'mumps_headers.h'
156 LOGICAL skiplast_rhs_rows, bcp_sym_nonempty
162 IF ( icntl(4) .LE. 0 ) lp = -1
163 IF (lda_arg < 0)
THEN
165 & lda, shift_val_son)
168 shift_val_son = shift_val_son_arg
170 ALLOCATE(ptrrow(root%NPROW + 1 ), stat=allocok)
171 if (allocok .GT. 0)
THEN
173 ierror = root%NPROW + 1
175 ALLOCATE(ptrcol(root%NPCOL + 1 ), stat=allocok
176 if (allocok .GT. 0)
THEN
178 ierror = root%NPCOL + 1
180 ALLOCATE(nsuprow(root%NPROW + 1 ), stat=allocok)
181 if (allocok .GT. 0)
THEN
183 ierror = root%NPROW + 1
185 ALLOCATE(nsupcol(root%NPCOL + 1 ), stat=allocok)
186 if (allocok .GT. 0)
THEN
188 ierror = root%NPCOL + 1
191 IF (lp > 0)
write(6,*)
myid,
' : MEMORY ALLOCATION ',
192 &
'FAILURE in SMUMPS_BUILD_AND_SEND_CB_ROOT'
196 skiplast_rhs_rows = ((keep(253).GT.0).AND.(keep(50).EQ.0))
197 bcp_sym_nonempty = .false.
203 iglob = iw( ptri(step(ison)) +
204 & shift_list_row_son + i - 1 )
205 IF (skiplast_rhs_rows.AND.(iglob.GT.n)) cycle
206 IF ( .NOT. transpose_asm )
THEN
208 bcp_sym_nonempty = .true.
209 pos_in_root = iglob - n
210 jcol = mod((pos_in_root-1)/root%NBLOCK,root%NPCOL)
211 nsupcol(jcol+1) = nsupcol(jcol+1) + 1
212 ptrcol( jcol + 2 ) = ptrcol( jcol + 2 ) + 1
214 pos_in_root = root%RG2L_ROW( iglob )
215 irow = mod((pos_in_root-1)/root%MBLOCK,root%NPROW)
216 ptrrow( irow + 2 ) = ptrrow( irow + 2 ) + 1
219 IF (iglob .GT. n)
THEN
220 pos_in_root = iglob - n
222 pos_in_root = root%RG2L_COL( iglob )
224 jcol = mod( ( pos_in_root - 1 ) / root%NBLOCK, root%NPCOL )
226 & nsupcol(jcol+1) = nsupcol(jcol+1) + 1
227 ptrcol( jcol + 2 ) = ptrcol( jcol + 2 ) + 1
230 IF (keep(50).NE.0 .AND.(.NOT.transpose_asm).AND.bcp_sym_nonempty)
233 jglob = iw( ptri(step(ison)) +
234 & shift_list_col_son + i - 1 )
235 IF ((keep(50).GT.0) .AND. (jglob.GT.n)) cycle
236 IF ( .NOT. transpose_asm )
THEN
237 IF (keep(50).EQ.0)
THEN
239 pos_in_root = root%RG2L_COL(jglob)
241 pos_in_root = jglob-n
243 jcol = mod((pos_in_root-1) / root%NBLOCK, root%NPCOL )
245 nsupcol(jcol+1) = nsupcol(jcol+1) + 1
247 ptrcol( jcol + 2 ) = ptrcol( jcol + 2 ) + 1
249 pos_in_root = root%RG2L_COL(jglob)
250 jcol = mod((pos_in_root-1) / root%NBLOCK, root%NPCOL )
251 ptrcol( jcol + 2 ) = ptrcol( jcol + 2 ) + 1
252 IF (bcp_sym_nonempty)
THEN
253 pos_in_root = root%RG2L_ROW(jglob)
254 irow = mod((pos_in_root-1)/root%MBLOCK,root%NPROW)
255 nsuprow(irow+1) = nsuprow(irow+1)+1
256 ptrrow( irow + 2 ) = ptrrow( irow + 2 ) + 1
261 pos_in_root = root%RG2L_ROW( jglob )
263 pos_in_root = jglob-n
265 irow = mod( ( pos_in_root - 1 ) /
266 & root%MBLOCK, root%NPROW )
267 ptrrow( irow + 2 ) = ptrrow( irow + 2 ) + 1
271 DO irow = 2, root%NPROW + 1
272 ptrrow( irow ) = ptrrow( irow ) + ptrrow( irow - 1 )
275 DO jcol = 2, root%NPCOL + 1
276 ptrcol( jcol ) = ptrcol( jcol ) + ptrcol( jcol - 1 )
278 ALLOCATE(row_index_list(ptrrow(root%NPROW+1)-1+1),
280 if (allocok .GT. 0)
THEN
282 ierror = ptrrow(root%NPROW+1)-1+1
284 ALLOCATE(col_index_list(ptrcol(root%NPCOL+1)-1+1),
286 if (allocok .GT. 0)
THEN
288 ierror = ptrcol(root%NPCOL+1)-1+1
291 iglob = iw( ptri(step(ison)) +
292 & shift_list_row_son + i - 1 )
293 IF (skiplast_rhs_rows.AND.(iglob.GT.n)) cycle
294 IF ( .NOT. transpose_asm )
THEN
295 IF (iglob.GT.n) cycle
296 pos_in_root = root%RG2L_ROW( iglob )
297 irow = mod( ( pos_in_root - 1 ) / root%MBLOCK,
299 row_index_list( ptrrow( irow + 1 ) ) = i
300 ptrrow( irow + 1 ) = ptrrow( irow + 1 ) + 1
303 pos_in_root = root%RG2L_COL( iglob )
305 pos_in_root = iglob - n
307 jcol = mod( ( pos_in_root - 1 ) / root%NBLOCK,
309 col_index_list( ptrcol( jcol + 1 ) ) = i
310 ptrcol( jcol + 1 ) = ptrcol( jcol + 1 ) + 1
314 jglob = iw( ptri(step(ison))+shift_list_col_son+i - 1 )
315 IF ((keep(50).GT.0) .AND. (jglob.GT.n)) cycle
316 IF ( .NOT. transpose_asm )
THEN
317 IF ( jglob.LE.n )
THEN
318 pos_in_root = root%RG2L_COL( jglob )
320 pos_in_root = jglob - n
322 jcol = mod( ( pos_in_root - 1 ) /
323 & root%NBLOCK, root%NPCOL )
324 col_index_list( ptrcol( jcol + 1 ) ) = i
325 ptrcol( jcol + 1 ) = ptrcol( jcol + 1 ) + 1
327 IF ( jglob.LE.n )
THEN
328 pos_in_root = root%RG2L_ROW( jglob )
330 pos_in_root = jglob - n
332 irow = mod( ( pos_in_root - 1 ) /
333 & root%MBLOCK, root%NPROW )
334 row_index_list( ptrrow( irow + 1 ) ) = i
335 ptrrow( irow + 1 ) = ptrrow( irow + 1 ) + 1
338 IF (bcp_sym_nonempty)
THEN
340 iglob = iw( ptri(step(ison)) +
341 & shift_list_row_son + i - 1 )
342 IF (iglob.LE.n) cycle
343 pos_in_root = iglob - n
344 jcol = mod((pos_in_root-1)/root%NBLOCK,root%NPCOL)
345 col_index_list( ptrcol( jcol + 1 ) ) = i
346 ptrcol( jcol + 1 ) = ptrcol( jcol + 1 ) + 1
349 jglob = iw( ptri(step(ison))+shift_list_col_son+i - 1 )
353 pos_in_root = root%RG2L_ROW(jglob)
355 irow = mod((pos_in_root-1)/root%MBLOCK,root%NPROW)
356 row_index_list( ptrrow( irow + 1 ) ) = i
357 ptrrow( irow + 1 ) = ptrrow( irow + 1 ) + 1
360 DO irow = root%NPROW, 2, -1
361 ptrrow( irow ) = ptrrow( irow - 1 )
364 DO jcol = root%NPCOL, 2, -1
365 ptrcol( jcol ) = ptrcol( jcol - 1 )
371 if (irow .ne. root%MYROW .or. jcol.ne.root%MYCOL)
then
372 write(*,*)
' error in grid position buildandsendcbroot'
375 IF ( ptrist(step(iroot)).EQ.0.AND.
376 & ptlust_s(step(iroot)).EQ.0)
THEN
379 & fils, dad,
myid, slavef, procnode_steps,
380 & lptrar, nelt, frtptr, frtelt,
381 & ptraiw, ptrarw, intarr, dblarr,
383 & iwpos, iwposcb, ptrist, ptrast,
384 & step, pimaster, pamaster, itloc, rhs_mumps,
385 &
comp, lrlus, iflag, keep,keep8,dkeep, ierror )
392 keep(121) = keep(121) - 1
393 IF ( keep(121) .eq. 0 )
THEN
394 IF (keep(201).EQ.1)
THEN
396 ELSE IF (keep(201).EQ.2)
THEN
400 & slavef, keep(199), keep(28), keep(76), keep(80), keep(47),
402 IF (keep(47) .GE. 3)
THEN
405 & procnode_steps, keep,keep8, slavef, comm_load,
406 &
myid, step, n, nd, fils )
411 & ptrr(step(ison)), iw(ptri(step(ison))+xxd),
412 & iw(ptri(step(ison))+xxr),
413 & sona_ptr, possona_ptr, lsona_ptr )
414 IF (keep(60) .NE. 0 )
THEN
415 local_m = root%SCHUR_LLD
416 local_n = root%SCHUR_NLOC
417 nrlocal = ptrrow( irow + 2 ) - ptrrow( irow + 1 )
418 nclocal = ptrcol( jcol + 2 ) - ptrcol( jcol + 1 )
420 & root%SCHUR_POINTER(1),
422 & root%NPCOL, root%NPROW, root%MBLOCK, root%NBLOCK,
424 & iw( ptri(step(ison)) + shift_list_col_son ),
425 & iw( ptri(step(ison)) + shift_list_row_son ),
426 & lda, sona_ptr( possona_ptr + shift_val_son ),
427 & row_index_list( ptrrow( irow + 1 ) ),
428 & col_index_list( ptrcol( jcol + 1 ) ),
431 & nsuprow(irow+1), nsupcol(jcol+1),
432 & root%RG2L_ROW(1), root%RG2L_COL(1), transpose_asm,
434 & root%RHS_ROOT(1,1), root%RHS_NLOC )
436 IF ( ptrist(step( iroot )) .GE. 0 )
THEN
437 IF ( ptrist(step( iroot )) .EQ. 0 )
THEN
438 local_n = iw( ptlust_s(step(iroot)) + 1 + keep(ixsz))
439 local_m = iw( ptlust_s(step(iroot)) + 2 + keep(ixsz))
440 posroot = ptrfac(iw( ptlust_s(step(iroot)) +4+keep(ixsz) ))
442 local_n = - iw( ptrist(step(iroot)) +keep(ixsz))
443 local_m = iw( ptrist(step(iroot)) + 1 +keep(ixsz))
444 posroot = pamaster(step( iroot ))
446 nclocal = ptrcol( jcol + 2 ) - ptrcol( jcol + 1 )
447 nrlocal = ptrrow( irow + 2 ) - ptrrow( irow + 1 )
450 & root%NPCOL, root%NPROW, root%MBLOCK, root%NBLOCK,
452 & iw( ptri(step(ison)) + shift_list_col_son ),
453 & iw( ptri(step(ison)) + shift_list_row_son ),
454 & lda, sona_ptr( possona_ptr + shift_val_son ),
455 & row_index_list( ptrrow( irow + 1 ) ),
459 & nsuprow(irow+1), nsupcol(jcol+1),
460 & root%RG2L_ROW(1), root%RG2L_COL(1), transpose_asm,
462 & root%RHS_ROOT(1,1), root%RHS_NLOC )
466 DO irow = 0, root%NPROW - 1
467 DO jcol = 0, root%NPCOL - 1
468 pdest = irow * root%NPCOL + jcol
469 IF ( (root%MYROW.eq.irow.and.root%MYCOL.eq.jcol) .and.
470 &
myid.ne.pdest)
THEN
471 write(*,*)
'error: myrow,mycol=',root%MYROW,root%MYCOL
472 write(*,*)
' MYID,PDEST=',
myid,pdest
475 IF ( root%MYROW .NE. irow .OR. root%MYCOL .NE. jcol)
THEN
476 nbrows_already_sent = 0
478 DO WHILE ( ierr .EQ. -1 )
479 nsubset_row = ptrrow( irow + 2 ) - ptrrow( irow + 1 )
480 nsubset_col = ptrcol( jcol + 2 ) - ptrcol( jcol + 1 )
481 IF ( lrlu .LT. int(nsubset_row,8) * int(nsubset_col,8)
482 & .AND. lrlus .GT. int(nsubset_row,8) * int(nsubset_col,8) )
487 & iwpos, iwposcb, ptrist, ptrast,
488 & step, pimaster, pamaster, lrlus,
489 & keep(ixsz),
comp, dkeep(97),
490 &
myid, slavef, procnode_steps, dad)
491 IF ( lrlu .NE. lrlus )
THEN
492 WRITE(*,*)
myid,
": pb compress in",
493 &
"SMUMPS_BUILD_AND_SEND_CB_ROOT"
494 WRITE(*,*)
myid,
': LRLU, LRLUS=',lrlu,lrlus
499 & iw(ptri(step(ison))+xxs), a, la,
500 & ptrr(step(ison)), iw(ptri(step(ison))+xxd),
501 & iw(ptri(step(ison))+xxr),
502 & sona_ptr, possona_ptr, lsona_ptr )
505 & iw( ptri(step(ison)) + shift_list_col_son ),
506 & iw( ptri(step(ison)) + shift_list_row_son ),
507 & lda, sona_ptr( possona_ptr + shift_val_son ),
509 & row_index_list( ptrrow( irow + 1 ) ),
510 & col_index_list( ptrcol( jcol + 1 ) ),
511 & nsubset_row, nsubset_col,
512 & nsuprow(irow+1), nsupcol(jcol+1),
513 & root%NPROW, root%NPCOL, root%MBLOCK,
514 & root%RG2L_ROW(1), root%RG2L_COL(1),
515 & root%NBLOCK, pdest,
516 & comm, ierr, a( posfac ), lrlu, transpose_asm,
517 & size_msg, nbrows_already_sent, keep, bbpcbp )
518 IF ( ierr .EQ. -1 )
THEN
521 message_received = .false.
523 & blocking, set_irecv, message_received,
524 & mpi_any_source, mpi_any_tag,
525 & status, bufr, lbufr,
526 & lbufr_bytes, procnode_steps, posfac, iwpos, iwposcb,
527 & iptrlu, lrlu, lrlus, n, iw, liw, a, la,
528 & ptrist, ptlust_s, ptrfac, ptrast, step,
529 & pimaster, pamaster, nstk,
530 &
comp, iflag, ierror, comm, perm, ipool, lpool,
531 & leaf, nbfin,
myid, slavef, root,
532 & opassw, opeliw, itloc, rhs_mumps, fils, dad,
533 & ptrarw,ptraiw,intarr,dblarr,icntl,keep,keep8,dkeep,
534 & nd, frere, lptrar, nelt, frtptr, frtelt,
535 & istep_to_iniv2, tab_pos_in_pere, .true.
538 IF ( iflag .LT. 0 )
GOTO 500
539 IF (lda_arg < 0)
THEN
541 & iw, liw, ptri(step(ison)),
542 & lda, shift_val_son)
546 IF ( ierr == -2 )
THEN
549 IF (lp > 0)
WRITE(lp, *)
"FAILURE, SEND BUFFER TOO
550 & SMALL DURING SMUMPS_BUILD_AND_SEND_CB_ROOT"
554 IF ( ierr == -3 )
THEN
555 IF (lp > 0)
WRITE(lp, *)
"FAILURE, RECV BUFFER TOO
556 & SMALL DURING SMUMPS_BUILD_AND_SEND_CB_ROOT"
568 DEALLOCATE(row_index_list)
569 DEALLOCATE(col_index_list)
573 & LDA, SHIFT_VAL_SON)
574 INTEGER,
INTENT(IN) :: LIW, IOLDPS
575 INTEGER,
INTENT(IN) :: IW()
576 INTEGER,
INTENT(OUT) :: LDA
577 INTEGER(8),
INTENT(OUT) :: SHIFT_VAL_SON
578 INCLUDE
'mumps_headers.h'
579 INTEGER :: LCONT, NROW, NPIV, NASS, NELIM
580 lcont = iw(ioldps+keep(ixsz))
581 nrow = iw(ioldps+2+keep(ixsz))
582 npiv = iw(ioldps+3+keep(ixsz))
583 nass = iw(ioldps+4+keep(ixsz))
585 IF (iw(ioldps+xxs).EQ.s_nolcbnocontig38.OR.
586 & iw(ioldps+xxs).EQ.s_all)
THEN
587 shift_val_son = int(npiv,8)
589 ELSE IF (iw(ioldps+xxs).EQ.s_nolcbcontig38)
THEN
590 shift_val_son = int(nrow,8)*int(lcont+npiv-nelim,8)
592 ELSE IF (iw(ioldps+xxs).EQ.s_nolcleaned38)
THEN
597 &
": internal error in SMUMPS_SET_LDA_SHIFT_VAL_SON",
598 & iw(ioldps+xxs),
"ISON=",ison
606 & NPCOL, NPROW, MBLOCK, NBLOCK, NBCOL_SON, NBROW_SON, INDCOL_SON,
607 & INDROW_SON, LD_SON, VAL_SON, SUBSET_ROW, SUBSET_COL,
608 & NSUBSET_ROW, NSUBSET_COL, NSUPROW, NSUPCOL,
609 & RG2L_ROW, RG2L_COL, TRANSPOSE_ASM,
610 & KEEP, RHS_ROOT, NLOC )
613 INTEGER N, LOCAL_M, LOCAL_N
614 REAL VAL_ROOT( LOCAL_M, )
615 INTEGER NPCOL, NPROW, MBLOCK, NBLOCK
616 INTEGER NBCOL_SON, NBROW_SON
617 INTEGER INDCOL_SON( NBCOL_SON ), INDROW_SON( NBROW_SON )
619 INTEGER NSUPROW, NSUPCOL
620 REAL VAL_SON( LD_SON, NBROW_SON )
623 INTEGER SUBSET_ROW( NSUBSET_ROW ), SUBSET_COL( NSUBSET_COL )
624 INTEGER ( N ), RG2L_COL( N )
625 LOGICAL TRANSPOSE_ASM
627 REAL RHS_ROOT( LOCAL_M, NLOC)
628 INTEGER ISUB, JSUB, , J, IPOS_ROOT, JPOS_ROOT
629 INTEGER ILOC_ROOT, JLOC_ROOT, IGLOB, JGLOB
630 IF (keep(50).EQ.0)
THEN
631 DO isub = 1, nsubset_row
632 i = subset_row( isub )
633 iglob = indrow_son( i )
634 ipos_root = rg2l_row( iglob )
636 & * ( ( ipos_root - 1 ) / ( mblock * nprow ) )
637 & + mod( ipos_root - 1, mblock ) + 1
638 DO jsub = 1, nsubset_col-nsupcol
639 j = subset_col( jsub )
640 jglob = indcol_son( j )
641 jpos_root = rg2l_col( jglob )
643 & * ( ( jpos_root - 1 ) / ( nblock * npcol ) )
644 & + mod( jpos_root - 1, nblock ) + 1
645 val_root( iloc_root, jloc_root ) =
646 & val_root( iloc_root, jloc_root ) + val_son( j, i )
648 DO jsub = nsubset_col-nsupcol+1, nsubset_col
649 j = subset_col( jsub )
650 jglob = indcol_son( j )
651 jpos_root = jglob - n
653 & * ( ( jpos_root - 1 ) / ( nblock * npcol ) )
654 & + mod( jpos_root - 1, nblock ) + 1
655 rhs_root(iloc_root, jloc_root) =
656 & rhs_root(iloc_root, jloc_root) + val_son( j, i )
660 IF ( .NOT. transpose_asm )
THEN
661 DO isub = 1, nsubset_row - nsuprow
662 i = subset_row( isub )
663 iglob = indrow_son( i )
664 ipos_root = rg2l_row( iglob )
666 & * ( ( ipos_root - 1 ) / ( mblock * nprow ) )
667 & + mod( ipos_root - 1, mblock ) + 1
668 DO jsub = 1, nsubset_col -nsupcol
669 j = subset_col( jsub )
670 jglob = indcol_son( j )
671 jpos_root = rg2l_col( jglob )
672 IF (keep(50).NE.0. and. jpos_root .GT. ipos_root) cycle
674 & * ( ( jpos_root - 1 ) / ( nblock * npcol ) )
675 & + mod( jpos_root - 1, nblock ) + 1
676 val_root( iloc_root, jloc_root ) =
677 & val_root( iloc_root, jloc_root ) + val_son( j, i )
680 DO jsub = nsubset_col -nsupcol+1, nsubset_col
681 j = subset_col( jsub )
682 jglob = indrow_son( j )
683 jpos_root = jglob - n
685 & * ( ( jpos_root - 1 ) / ( nblock * npcol ) )
686 & + mod( jpos_root - 1, nblock ) + 1
687 DO isub = nsubset_row - nsuprow +1, nsubset_row
688 i = subset_row( isub )
689 iglob = indcol_son( i )
690 ipos_root = rg2l_row(iglob)
692 & * ( ( ipos_root - 1 ) / ( mblock * nprow ) )
693 & + mod( ipos_root - 1, mblock ) + 1
694 rhs_root(iloc_root, jloc_root) =
695 & rhs_root(iloc_root, jloc_root) + val_son( i, j )
699 DO isub = 1, nsubset_col-nsupcol
700 i = subset_col( isub )
701 iglob = indrow_son( i )
702 jpos_root = rg2l_col( iglob )
704 & * ( ( jpos_root - 1 ) / ( nblock * npcol ) )
705 & + mod( jpos_root - 1, nblock ) + 1
706 DO jsub = 1, nsubset_row
707 j = subset_row( jsub )
708 jglob = indcol_son( j )
709 ipos_root = rg2l_row( jglob )
711 & * ( ( ipos_root - 1 ) / ( mblock * nprow ) )
712 & + mod( ipos_root - 1, mblock ) + 1
713 val_root( iloc_root, jloc_root ) =
714 & val_root( iloc_root, jloc_root ) + val_son( j, i )
717 DO isub = nsubset_col-nsupcol+1, nsubset_col
718 i = subset_col( isub )
719 iglob = indrow_son( i )
720 jpos_root = iglob - n
722 & * ( ( jpos_root - 1 ) / ( nblock * npcol ) )
723 & + mod( jpos_root - 1, nblock ) + 1
724 DO jsub = 1, nsubset_row
725 j = subset_row( jsub )
726 jglob = indcol_son( j )
727 ipos_root = rg2l_row( jglob )
729 & * ( ( ipos_root - 1 ) / ( mblock * nprow ) )
730 & + mod( ipos_root - 1, mblock ) + 1
731 rhs_root( iloc_root, jloc_root ) =
732 & rhs_root( iloc_root, jloc_root ) + val_son( j, i )
1082 & FILS, DAD, MYID, SLAVEF, PROCNODE_STEPS,
1083 & LPTRAR, NELT, FRTPTR, FRTELT,
1084 & PTRAIW, PTRARW, INTARR, DBLARR,
1086 & IWPOS, IWPOSCB, PTRIST, PTRAST,
1087 & STEP, PIMASTER, PAMASTER, ITLOC, RHS_MUMPS,
1088 & COMP, LRLUS, IFLAG, KEEP,KEEP8,DKEEP,IERROR )
1093 INTEGER(8) KEEP8(150)
1095 TYPE (SMUMPS_ROOT_STRUC ) :: root
1096 INTEGER(8) :: LA, LRLU, IPTRLU, LRLUS
1097 INTEGER IROOT, LIW, N, IWPOS, IWPOSCB
1100 INTEGER,
INTENT(IN) :: SLAVEF
1101 INTEGER,
INTENT(IN) :: PROCNODE_STEPS(KEEP(28))
1102 INTEGER PTRIST(KEEP(28)), STEP(N)
1103 INTEGER(8) :: PTRAST(KEEP(28)), PAMASTER(KEEP(28))
1104 INTEGER PIMASTER(KEEP(28))
1105 INTEGER ITLOC( N + KEEP(253) )
1106 REAL :: RHS_MUMPS(KEEP(255))
1107 INTEGER COMP, IFLAG, IERROR
1108 include
'mumps_headers.h'
1109 INTEGER FILS( N ), DAD(KEEP(28))
1110 INTEGER LPTRAR, NELT
1111 INTEGER FRTPTR( N+1), FRTELT( NELT )
1112 INTEGER(8),
INTENT(IN) :: PTRAIW( LPTRAR ), PTRARW( LPTRAR )
1113 INTEGER INTARR(KEEP8(27))
1114 REAL DBLARR(KEEP8(26))
1118 PARAMETER( ZERO = 0.0e0 )
1119 INTEGER(8) :: LREQA_ROOT
1120 INTEGER LREQI_ROOT, LOCAL_M, LOCAL_N, allocok
1121 LOGICAL :: EARLYT3ROOTINS
1122 local_m = numroc( root%ROOT_SIZE, root%MBLOCK,
1123 & root%MYROW, 0, root%NPROW )
1124 local_m =
max( 1, local_m )
1125 local_n = numroc( root%ROOT_SIZE, root%NBLOCK,
1126 & root%MYCOL, 0, root%NPCOL )
1127 IF (keep(253).GT.0)
THEN
1128 root%RHS_NLOC = numroc( keep(253), root%NBLOCK,
1129 & root%MYCOL, 0, root%NPCOL )
1130 root%RHS_NLOC =
max(1, root%RHS_NLOC)
1134 IF (
associated( root%RHS_ROOT) )
1135 &
DEALLOCATE (root%RHS_ROOT)
1136 ALLOCATE(root%RHS_ROOT(local_m,root%RHS_NLOC),
1138 IF ( allocok.GT.0)
THEN
1140 ierror = local_m*root%RHS_NLOC
1143 IF (keep(253).NE.0)
THEN
1144 root%RHS_ROOT = zero
1146 & root, keep, rhs_mumps,
1148 IF ( iflag .LT. 0 )
RETURN
1150 IF (keep(60) .NE. 0)
THEN
1151 ptrist(step(iroot)) = -6666666
1153 lreqi_root = 2 + keep(ixsz)
1154 lreqa_root = int(local_m,8) * int(local_n,8)
1155 IF (lreqa_root.EQ.0_8)
THEN
1156 ptrist(step(iroot)) = -9999999
1160 & myid,n,keep,keep8,dkeep,iw,liw,a,la,
1162 & iwpos, iwposcb, slavef, procnode_steps, dad,
1164 & step, pimaster, pamaster, lreqi_root,
1165 & lreqa_root, iroot, s_notfree, .true., comp,
1166 & lrlus, keep8(67), iflag, ierror
1168 IF ( iflag .LT. 0 )
RETURN
1169 ptrist( step(iroot) ) = iwposcb + 1
1170 pamaster( step(iroot) ) = iptrlu + 1_8
1171 iw( iwposcb + 1 + keep(ixsz)) = - local_n
1172 iw( iwposcb + 2 + keep(ixsz)) = local_m
1174 earlyt3rootins = keep(200) .EQ.0
1175 & .OR. ( keep(200) .LT. 0 .AND. keep(400) .EQ. 0 )
1176 IF (local_n > 0 .AND. .NOT. earlyt3rootins )
THEN
1177 IF (keep(60) .EQ. 0)
THEN
1179 & local_m, local_n, keep)
1182 & root%SCHUR_LLD, local_m, local_n, keep)
1184 IF (keep(55) .eq. 0)
THEN
1185 IF (keep(60) .EQ. 0)
THEN
1187 & a(iptrlu+1_8), local_m, local_m, local_n,
1188 & fils, ptraiw, ptrarw, intarr, dblarr,
1189 & keep8(27), keep8(26), myid )
1192 & root%SCHUR_POINTER(1), root%SCHUR_LLD, local_m, local_n,
1193 & fils, ptraiw, ptrarw, intarr, dblarr,
1194 & keep8(27), keep8(26), myid )
1197 IF (keep(60) .EQ. 0)
THEN
1199 & a(iptrlu+1_8), local_m, local_m, local_n,
1200 & lptrar, nelt, frtptr, frtelt,
1201 & ptraiw, ptrarw, intarr, dblarr,
1202 & keep8(27), keep8(26), keep, keep8, myid )
1205 & root%SCHUR_POINTER(1), root%SCHUR_LLD,
1206 & root%SCHUR_MLOC, root%SCHUR_NLOC,
1207 & lptrar, nelt, frtptr, frtelt,
1208 & ptraiw, ptrarw, intarr, dblarr,
1209 & keep8(27), keep8(26), keep, keep8, myid )
recursive subroutine smumps_build_and_send_cb_root(comm_load, ass_irecv, n, ison, iroot, ptri, ptrr, root, nbrow, nbcol, shift_list_row_son, shift_list_col_son, shift_val_son_arg, lda_arg, tag, myid, comm, bufr, lbufr, lbufr_bytes, procnode_steps, posfac, iwpos, iwposcb, iptrlu, lrlu, lrlus, iw, liw, a, la, ptrist, ptlust_s, ptrfac, ptrast, step, pimaster, pamaster, nstk, comp, iflag, ierror, perm, ipool, lpool, leaf, nbfin, slavef, opassw, opeliw, itloc, rhs_mumps, fils, dad, ptrarw, ptraiw, intarr, dblarr, icntl, keep, keep8, dkeep, transpose_asm, nd, frere, lptrar, nelt, frtptr, frtelt, istep_to_iniv2, tab_pos_in_pere, lrgroups)