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 (cmumps_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,
103 LOGICAL transpose_asm
105 INTEGER lbufr, lbufr_bytes
106 INTEGER bufr( lbufr )
107 INTEGER(8) :: posfac, iptrlu, lrlu, , la
112 INTEGER,
intent(in) :: lrgroups(n)
114 INTEGER frtptr( n+1 ), frtelt( nelt )
115 INTEGER(8) :: (keep(28))
116 INTEGER(8) :: ptrfac(keep(28))
117 INTEGER(8) :: pamaster(keep(28))
118 INTEGER ptrist( keep(28) ), ptlust_s((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) ), ( n ), dad(keep(28))
128 COMPLEX :: rhs_mumps(keep(255))
129 INTEGER nd( keep(28) ), frere( keep(28) )
130 INTEGER(8),
INTENT(IN) :: ptrarw( lptrar ), ptraiw( lptrar )
131 INTEGER intarr( keep8(27) )
132 COMPLEX dblarr( keep8(26) )
133 INTEGER istep_to_iniv2(keep(71)),
134 & tab_pos_in_pere(slavef+2,
max(1,keep(56)))
135 COMPLEX,
DIMENSION(:),
POINTER :: sona_ptr
136 INTEGER(8) :: lsona_ptr,
138 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ptrrow, ptrcol
139 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: nsuprow,
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
147 INTEGER nsubset_row, nsubset_col
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 CMUMPS_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
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(
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 )
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 ) ),
456 & col_index_list( ptrcol( jcol + 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 &
"CMUMPS_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 CMUMPS_BUILD_AND_SEND_CB_ROOT"
554 IF ( ierr == -3 )
THEN
555 IF (lp > 0)
WRITE(lp, *)
"FAILURE, RECV BUFFER TOO
556 & SMALL DURING CMUMPS_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(LIW)
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
598 & IW(IOLDPS+XXS), "ison=
",ISON
602 END SUBROUTINE CMUMPS_SET_LDA_SHIFT_VAL_SON
recursive subroutine cmumps_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)