15 & ( n, mapping, nnz, irn, jcn, procnode, step,
17 & rg2l, keep,keep8, mblock, nblock, nprow, npcol )
20 INTEGER N, SLAVEF, MBLOCK, NBLOCK, NPROW, NPCOL
24 INTEGER IRN( NNZ ), JCN( NNZ )
25 INTEGER MAPPING( NNZ ), STEP( N )
26 INTEGER PROCNODE( KEEP(28) ), PERM( N ), FILS( N ), RG2L( N )
27 INTEGER MUMPS_PROCNODE, MUMPS_TYPENODE
28 EXTERNAL mumps_procnode, mumps_typenode
29 INTEGER K4, IOLD, JOLD, INEW, JNEW, ISEND, JSEND, IARR, INODE
31 INTEGER TYPE_NODE, DEST
32 INTEGER IPOSROOT, JPOSROOT, IROW_GRID, JCOL_GRID
35 DO WHILE ( inode .GT. 0 )
43 IF ( iold .GT. n .OR. iold .LT. 1 .OR.
44 & jold .GT. n .OR. jold .LT. 1 )
THEN
48 IF ( iold .eq. jold )
THEN
54 IF ( inew .LT. jnew )
THEN
56 IF ( keep(50) .ne. 0 ) isend = -iold
64 type_node = mumps_typenode( procnode(abs(step(iarr))),
66 IF ( type_node .eq. 1 .or. type_node .eq. 2 )
THEN
67 IF ( keep(46) .eq. 0 )
THEN
68 dest = mumps_procnode( procnode(abs(step(iarr))),
71 dest = mumps_procnode( procnode(abs(step(iarr))),
75 IF ( isend .LT. 0 )
THEN
76 iposroot = rg2l( jsend )
77 jposroot = rg2l( iarr )
79 iposroot = rg2l( iarr )
80 jposroot = rg2l( jsend )
82 irow_grid = mod( ( iposroot - 1 )/mblock, nprow )
83 jcol_grid = mod( ( jposroot - 1 )/nblock, npcol )
84 IF ( keep( 46 ) .eq. 0 )
THEN
85 dest = irow_grid * npcol + jcol_grid + 1
87 dest = irow_grid * npcol + jcol_grid
96 & DBLARR, LDBLARR, INTARR, LINTARR,
97 & PTRAIW, PTRARW, KEEP,KEEP8, MYID, COMM, NBRECORDS,
99 & A, LA, root, PROCNODE_STEPS, SLAVEF, PERM, STEP,
100 & ICNTL, INFO, NSEND8, NLOCAL8,
101 & ISTEP_TO_INIV2, CANDIDATES
107 INTEGER(8) :: NZ_loc8
108 TYPE (DMUMPS_STRUC) :: id
109 INTEGER(8) :: , LINTARR
110 DOUBLE PRECISION DBLARR( LDBLARR )
111 INTEGER INTARR( LINTARR )
112 INTEGER(8),
INTENT(IN) :: PTRAIW( N ), PTRARW( N )
114 INTEGER(8) KEEP8(150)
115 INTEGER MYID, COMM, NBRECORDS
118 INTEGER ISTEP_TO_INIV2(KEEP(71))
119 INTEGER CANDIDATES(SLAVEF+1, max(1,KEEP(56)))
120 DOUBLE PRECISION A( LA )
121 TYPE (DMUMPS_ROOT_STRUC) :: root
122 INTEGER PROCNODE_STEPS(KEEP(28)), PERM( N ), STEP( N )
123 INTEGER INFO( 80 ), ICNTL(60)
124 INTEGER MUMPS_PROCNODE, MUMPS_TYPENODE, numroc,
126 EXTERNAL mumps_procnode, mumps_typenode, numroc,
128 include
'mumps_tags.h'
130 INTEGER :: IERR, MSGSOU
131 INTEGER :: STATUS(MPI_STATUS_SIZE)
132 DOUBLE PRECISION ZERO
133 PARAMETER( ZERO = 0.0d0 )
134 INTEGER,
ALLOCATABLE,
DIMENSION(:,:) ::
135 INTEGER END_MSG_2_RECV
137 INTEGER(8) :: I18, IA8
139 INTEGER TYPE_NODE, DEST, DEST_SHR
140 INTEGER IOLD, JOLD, IARR, ISEND, JSEND
141 INTEGER ISEND_SHR, JSEND_SHR
142 INTEGER allocok, TYPESPLIT, T4MASTER, INIV2, NCAND
143 LOGICAL T4_MASTER_CONCERNED, EARLYT3ROOTINS
144 DOUBLE PRECISION VAL, VAL_SHR
145 INTEGER(8) :: PTR_ROOT
146 INTEGER LOCAL_M, LOCAL_N, ARROW_ROOT
147 INTEGER IROW_GRID, JCOL_GRID, , JPOSROOT,
150 INTEGER KPROBE, FREQPROBE
151 INTEGER(8) :: IS18, IIW8, IS8, IAS8
153 INTEGER,
ALLOCATABLE,
DIMENSION(:,:,:) :: BUFI
154 DOUBLE PRECISION,
ALLOCATABLE,
DIMENSION(:,:,:) :: BUFR
155 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: BUFRECI
156 DOUBLE PRECISION,
ALLOCATABLE,
DIMENSION(:) :: BUFRECR
157 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: IACT, IREQI, IREQR
158 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: SEND_ACTIVE
160 INTEGER(8),
INTENT(OUT) :: NSEND8, NLOCAL8
161 INTEGER MASTER_NODE, ISTEP
162 LOGICAL :: DOIT, OMP_FLAG, OMP_FLAG_P
163 INTEGER NOMP, NOMP_P, IOMP, P2
168 end_msg_2_recv = slavef
169 ALLOCATE( iact(slavef), stat=allocok)
170 IF ( allocok .GT. 0 )
THEN
173 &
'** Error allocating IACT in matrix distribution'
179 ALLOCATE( ireqi(slavef), stat=allocok)
180 IF ( allocok .GT. 0 )
THEN
183 &
'** Error allocating IREQI in matrix distribution'
189 ALLOCATE( ireqr(slavef), stat=allocok)
190 IF ( allocok .GT. 0 )
THEN
193 &
'** Error allocating IREQR in matrix distribution'
199 ALLOCATE( send_active(slavef), stat=allocok)
200 IF ( allocok .GT. 0 )
THEN
203 &
'** Error allocating SEND_ACTIVE in matrix distribution'
209 ALLOCATE( bufi( nbrecords * 2 + 1, 2, slavef ), stat=allocok)
210 IF ( allocok .GT. 0 )
THEN
213 & '** error allocating int buffer
for matrix distribution
'
216 INFO(2) = ( NBRECORDS * 2 + 1 ) * SLAVEF * 2
219 ALLOCATE( BUFR( NBRECORDS, 2, SLAVEF), stat = allocok)
220.GT.
IF ( allocok 0 ) THEN
223 & '** error allocating real buffer
for matrix distribution
'
226 INFO(2) = NBRECORDS * SLAVEF * 2
229 ALLOCATE( BUFRECI( NBRECORDS * 2 + 1 ), stat = allocok )
230.GT.
IF ( allocok 0 ) THEN
233 & '** error allocating int recv buffer
for matrix distribution
'
236 INFO(2) = NBRECORDS * 2 + 1
239 ALLOCATE( BUFRECR( NBRECORDS ), stat = allocok )
240.GT.
IF ( allocok 0 ) THEN
243 & '** error allocating int recv buffer
for matrix distribution
'
249 ALLOCATE( IW4( N, 2 ), stat = allocok )
250.GT.
IF ( allocok 0 ) THEN
251 WRITE(LP,*) '** error allocating iw4
for matrix distribution
'
256 CALL MUMPS_PROPINFO( ICNTL, INFO, COMM, MYID )
257.LT.
IF ( INFO(1) 0 ) GOTO 100
262.GT.
IF ( IA8 0_8 ) THEN
264 IW4( I, 1 ) = INTARR( I18 )
265 IW4( I, 2 ) = -INTARR( I18 + 1_8 )
266 INTARR( I18 + 2_8 ) = I
269.EQ.
EARLYT3ROOTINS = KEEP(200) 0
270.OR..LT..AND..EQ.
& ( KEEP(200) 0 KEEP(400) 0 )
271.NE..AND.
IF ( KEEP(38) 0 EARLYT3ROOTINS ) THEN
272 CALL DMUMPS_GET_ROOT_INFO(root,LOCAL_M, LOCAL_N, PTR_ROOT, LA)
273 CALL DMUMPS_SET_ROOT_TO_ZERO(root, KEEP, A, LA)
275 LOCAL_M = -19999; LOCAL_N = -29999; PTR_ROOT = -99999_8
284 SEND_ACTIVE( I ) = .FALSE.
288 FREQPROBE = max(1,NBRECORDS/10)
289.EQ.
IF (SLAVEF 1) FREQPROBE = huge(FREQPROBE)
291!$ NOMP=omp_get_max_threads()
292.EQ..AND..GE..AND..EQ.
OMP_FLAG = KEEP(399)1 NOMP 2 SLAVEF1
293!$OMP PARALLEL PRIVATE( K8, I, DEST,
294!$OMP& T4MASTER, T4_MASTER_CONCERNED,
295!$OMP& INIV2, NCAND, IROW_GRID, JCOL_GRID, IPOSROOT, JPOSROOT,
296!$OMP& ILOCROOT, JLOCROOT,
297!$OMP& TYPE_NODE, TYPESPLIT, MASTER_NODE,
298!$OMP& IA8, ISHIFT, IIW8, IS18, IS8, IAS8, VAL,
299!$OMP& IARR, ISTEP, ISEND, JSEND,
300!$OMP& IOLD, JOLD, IOMP, DOIT, P2, NOMP_P, OMP_FLAG_P )
301!$OMP& REDUCTION(+:NSEND8, NLOCAL8, ARROW_ROOT) IF (OMP_FLAG)
303!$ IOMP=omp_get_thread_num()
305!$ NOMP_P=omp_get_num_threads()
307.AND..GT.
!$ OMP_FLAG_P = OMP_FLAG NOMP_P 1
309.GE.
IF ( NOMP_P 16 ) THEN
312.GE.
ELSE IF (NOMP_P8) THEN
315.GE.
ELSE IF (NOMP_P4) THEN
318.GE.
ELSE IF (NOMP_P2) THEN
326.LT.
IF ( IOMP NOMP_P ) THEN
328.GT.
IF ( SLAVEF 1 ) THEN
331.eq.
IF ( KPROBE FREQPROBE ) THEN
333 CALL MPI_IPROBE( MPI_ANY_SOURCE, ARR_INT, COMM,
334 & FLAG, STATUS, IERR )
336 MSGSOU = STATUS( MPI_SOURCE )
337 CALL MPI_RECV( BUFRECI(1), NBRECORDS * 2 + 1,
339 & MSGSOU, ARR_INT, COMM, STATUS, IERR )
340 CALL MPI_RECV( BUFRECR(1), NBRECORDS,
341 & MPI_DOUBLE_PRECISION,
342 & MSGSOU, ARR_REAL, COMM, STATUS, IERR )
343 CALL DMUMPS_DIST_TREAT_RECV_BUF(
344 & BUFRECI, BUFRECR, NBRECORDS, N, IW4(1,1),
345 & KEEP,KEEP8, LOCAL_M, LOCAL_N, root, PTR_ROOT,
347 & END_MSG_2_RECV, MYID, PROCNODE_STEPS, SLAVEF,
348 & PTRAIW, PTRARW, PERM, STEP,
349 & INTARR, LINTARR, DBLARR, LDBLARR
355 IOLD = id%IRN_loc(K8)
356 JOLD = id%JCN_loc(K8)
357.GT..OR..GT..OR..LT.
IF ( (IOLDN)(JOLDN)(IOLD1)
358.OR..LT.
& (JOLD1) ) THEN
362.EQ.
IF (IOLDJOLD) THEN
364.LT.
ELSE IF (PERM(IOLD)PERM(JOLD)) THEN
369.EQ.
DOIT = ( IOMP ibits(IARR, P2-1, P2))
374.EQ.
IF (IOLDJOLD) THEN
378.LT.
ELSE IF (PERM(IOLD)PERM(JOLD)) THEN
380.NE.
IF ( KEEP(50) 0 ) THEN
391 ISTEP = abs(STEP(IARR))
392 CALL MUMPS_TYPEANDPROCNODE( TYPE_NODE, MASTER_NODE,
393 & PROCNODE_STEPS(ISTEP), KEEP(199) )
394 T4_MASTER_CONCERNED = .FALSE.
397.EQ..OR..EQ.
IF ((KEEP(52)7)(KEEP(52)8)) THEN
398 VAL = VAL * id%ROWSCA(IOLD)*id%COLSCA(JOLD)
400.eq.
IF ( TYPE_NODE 1 ) THEN
402.EQ.
IF (DESTMYID) THEN
403 NLOCAL8 = NLOCAL8 + 1_8
404.EQ.
IF (ISENDJSEND) THEN
406 DBLARR(IA8) = DBLARR(IA8) + VAL
407.GE.
ELSE IF (ISEND0) THEN
409 ISHIFT = INTARR(IS18) + IW4(IARR,2)
410 INTARR(IS18+ISHIFT+2) = JSEND
411 DBLARR(PTRARW(IARR)+ISHIFT) = VAL
412 IW4(IARR,2) = IW4(IARR,2) - 1
415 INTARR(PTRAIW(IARR)+ISHIFT+2) = JSEND
416 DBLARR(PTRARW(IARR)+ISHIFT) = VAL
417 IW4(IARR,1) = IW4(IARR,1) - 1
418.EQ.
IF ( IW4(IARR,1) 0
419.AND.
& STEP(IARR) > 0 ) THEN
420 CALL DMUMPS_QUICK_SORT_ARROWHEADS( N, PERM,
421 & INTARR( PTRAIW(IARR) + 3 ),
422 & DBLARR( PTRARW(IARR) + 1 ),
423 & INTARR( PTRAIW(IARR) ), 1,
424 & INTARR( PTRAIW(IARR) ) )
429.eq.
ELSE IF ( TYPE_NODE 2 ) THEN
430.LT.
IF ( ISEND 0 ) THEN
435 INIV2 = ISTEP_TO_INIV2(ISTEP)
436.GT.
IF ( KEEP(79) 0) THEN
437 TYPESPLIT = MUMPS_TYPESPLIT( PROCNODE_STEPS(ISTEP),
439.EQ..OR..EQ.
IF ( (TYPESPLIT5)(TYPESPLIT6)) THEN
440 T4_MASTER_CONCERNED = .TRUE.
441 T4MASTER=CANDIDATES(CANDIDATES(SLAVEF+1,INIV2)+1,INIV2)
445 ARROW_ROOT = ARROW_ROOT + 1
446 IF (EARLYT3ROOTINS) THEN
447 IF ( ISEND < 0 ) THEN
448 IPOSROOT = root%RG2L_ROW(JSEND)
449 JPOSROOT = root%RG2L_ROW(IARR )
451 IPOSROOT = root%RG2L_ROW(IARR )
452 JPOSROOT = root%RG2L_ROW(JSEND)
454 IROW_GRID = mod( ( IPOSROOT-1 )/root%MBLOCK, root%NPROW )
455 JCOL_GRID = mod( ( JPOSROOT-1 )/root%NBLOCK, root%NPCOL )
456 DEST = IROW_GRID * root%NPCOL + JCOL_GRID
460 IF ( OMP_FLAG_P ) THEN
461 IF ( EARLYT3ROOTINS ) THEN
462 ILOCROOT = root%MBLOCK * ( ( IPOSROOT - 1 ) /
463 & ( root%MBLOCK * root%NPROW ) )
464 & + mod( IPOSROOT - 1, root%MBLOCK ) + 1
465 JLOCROOT = root%NBLOCK * ( ( JPOSROOT - 1 ) /
466 & ( root%NBLOCK * root%NPCOL ) )
467 & + mod( JPOSROOT - 1, root%NBLOCK ) + 1
468 IF (KEEP(60)==0) THEN
469 A( PTR_ROOT + int(JLOCROOT-1,8) * int(LOCAL_M,8)
470 & + int(ILOCROOT-1,8)) = A( PTR_ROOT
471 & + int(JLOCROOT - 1,8) * int(LOCAL_M,8)
472 & + int(ILOCROOT - 1,8) )
475 root%SCHUR_POINTER( int(JLOCROOT-1,8)
476 & * int(root%SCHUR_LLD,8)
477 & + int(ILOCROOT,8) )
478 & = root%SCHUR_POINTER( int(JLOCROOT - 1,8)
479 & * int(root%SCHUR_LLD,8)
484.EQ.
IF (ISENDJSEND) THEN
486 DBLARR(IA8) = DBLARR(IA8) + VAL
487.GE.
ELSE IF (ISEND0) THEN
489 ISHIFT = INTARR(IS18) + IW4(IARR,2)
490 IW4(IARR,2) = IW4(IARR,2) - 1
491 IIW8 = IS18 + ISHIFT + 2
497 IS8 = PTRAIW(IARR)+IW4(IARR,1)+2
499 IAS8 = PTRARW(IARR)+IW4(IARR,1)
500 IW4(IARR,1) = IW4(IARR,1) - 1
502.EQ.
IF ( IW4(IARR,1) 0
503.AND.
& STEP(IARR) > 0 ) THEN
504 CALL DMUMPS_QUICK_SORT_ARROWHEADS( N, PERM,
505 & INTARR( PTRAIW(IARR) + 3 ),
506 & DBLARR( PTRARW(IARR) + 1 ),
507 & INTARR( PTRAIW(IARR) ), 1,
508 & INTARR( PTRAIW(IARR) ) )
515.eq.
IF (DEST -1) THEN
516 NLOCAL8 = NLOCAL8 + 1_8
517 NSEND8 = NSEND8 + int(SLAVEF -1,8)
518.EQ.
ELSE IF (DEST -2) THEN
519 NLOCAL8 = NLOCAL8 + 1_8
520 NSEND8 = NSEND8 + int(SLAVEF -1,8)
522.eq.
IF (DEST MYID ) THEN
523 NLOCAL8 = NLOCAL8 + 1_8
525 NSEND8 = NSEND8 + 1_8
528.EQ.
IF ( DEST-1) THEN
529 INIV2 = ISTEP_TO_INIV2(ISTEP)
530 NCAND = CANDIDATES(SLAVEF+1,INIV2)
531.GT.
IF (KEEP(79) 0) THEN
533 DEST=CANDIDATES(I,INIV2)
535.EQ.
IF (INCAND+1) CYCLE
536 DEST_SHR=DEST;ISEND_SHR=ISEND
537 JSEND_SHR=JSEND;VAL_SHR=VAL
538 CALL DMUMPS_DIST_FILL_BUFFER()
542 DEST=CANDIDATES(I,INIV2)
543 DEST_SHR=DEST;ISEND_SHR=ISEND
544 JSEND_SHR=JSEND;VAL_SHR=VAL
545 CALL DMUMPS_DIST_FILL_BUFFER()
549 DEST_SHR=DEST;ISEND_SHR=ISEND
550 JSEND_SHR=JSEND;VAL_SHR=VAL
551 CALL DMUMPS_DIST_FILL_BUFFER()
552 IF (T4_MASTER_CONCERNED) THEN
554 DEST_SHR=DEST;ISEND_SHR=ISEND
555 JSEND_SHR=JSEND;VAL_SHR=VAL
556 CALL DMUMPS_DIST_FILL_BUFFER()
558.GE.
ELSE IF (DEST 0) THEN
559 DEST_SHR=DEST;ISEND_SHR=ISEND
560 JSEND_SHR=JSEND;VAL_SHR=VAL
561 CALL DMUMPS_DIST_FILL_BUFFER()
562 IF (T4_MASTER_CONCERNED) THEN
564 DEST_SHR=DEST;ISEND_SHR=ISEND
565 JSEND_SHR=JSEND;VAL_SHR=VAL
566 CALL DMUMPS_DIST_FILL_BUFFER()
568.EQ.
ELSE IF (DEST -2) THEN
571 DEST_SHR=DEST;ISEND_SHR=ISEND
572 JSEND_SHR=JSEND;VAL_SHR=VAL
573 CALL DMUMPS_DIST_FILL_BUFFER()
581 CALL DMUMPS_DIST_FILL_BUFFER()
582.NE.
DO WHILE ( END_MSG_2_RECV 0 )
583 CALL MPI_RECV( BUFRECI(1), NBRECORDS * 2 + 1, MPI_INTEGER,
584 & MPI_ANY_SOURCE, ARR_INT, COMM, STATUS, IERR )
585 MSGSOU = STATUS( MPI_SOURCE )
586 CALL MPI_RECV( BUFRECR(1), NBRECORDS, MPI_DOUBLE_PRECISION,
587 & MSGSOU, ARR_REAL, COMM, STATUS, IERR )
588 CALL DMUMPS_DIST_TREAT_RECV_BUF(
589 & BUFRECI, BUFRECR, NBRECORDS, N, IW4(1,1),
590 & KEEP,KEEP8, LOCAL_M, LOCAL_N, root, PTR_ROOT,
592 & END_MSG_2_RECV, MYID, PROCNODE_STEPS, SLAVEF,
593 & PTRAIW, PTRARW, PERM, STEP,
594 & INTARR, LINTARR, DBLARR, LDBLARR
598 IF ( SEND_ACTIVE( I ) ) THEN
599 CALL MPI_WAIT( IREQI( I ), STATUS, IERR )
600 CALL MPI_WAIT( IREQR( I ), STATUS, IERR )
603 KEEP(49) = ARROW_ROOT
605 IF (ALLOCATED(IW4)) DEALLOCATE( IW4 )
606 IF (ALLOCATED(BUFI)) DEALLOCATE( BUFI )
607 IF (ALLOCATED(BUFR)) DEALLOCATE( BUFR )
608 IF (ALLOCATED(BUFRECI)) DEALLOCATE( BUFRECI )
609 IF (ALLOCATED(BUFRECR)) DEALLOCATE( BUFRECR )
610 IF (ALLOCATED(IACT)) DEALLOCATE( IACT )
611 IF (ALLOCATED(IREQI)) DEALLOCATE( IREQI )
612 IF (ALLOCATED(IREQR)) DEALLOCATE( IREQR )
613 IF (ALLOCATED(SEND_ACTIVE)) DEALLOCATE( SEND_ACTIVE )
616 SUBROUTINE DMUMPS_DIST_FILL_BUFFER()
618 INTEGER ISLAVE, IBEG, IEND, NBREC, IREQ
619 INTEGER TAILLE_SEND_I, TAILLE_SEND_R
621.eq.
IF ( DEST_SHR -3 ) THEN
629 DO ISLAVE = IBEG, IEND
630 NBREC = BUFI(1,IACT(ISLAVE),ISLAVE)
631.eq.
IF ( DEST_SHR -3 ) THEN
632 BUFI(1,IACT(ISLAVE),ISLAVE) = - NBREC
634.eq..or.
IF ( DEST_SHR -3 NBREC + 1 > NBRECORDS ) THEN
635 DO WHILE ( SEND_ACTIVE( ISLAVE ) )
636 CALL MPI_TEST( IREQR( ISLAVE ), FLAG, STATUS, IERR )
637.NOT.
IF ( FLAG ) THEN
638 CALL MPI_IPROBE( MPI_ANY_SOURCE, ARR_INT, COMM,
639 & FLAG, STATUS, IERR )
641 MSGSOU = STATUS(MPI_SOURCE)
642 CALL MPI_RECV( BUFRECI(1), 2*NBRECORDS+1,
643 & MPI_INTEGER, MSGSOU, ARR_INT, COMM,
645 CALL MPI_RECV( BUFRECR(1), NBRECORDS,
646 & MPI_DOUBLE_PRECISION, MSGSOU,
647 & ARR_REAL, COMM, STATUS, IERR )
648 CALL DMUMPS_DIST_TREAT_RECV_BUF(
649 & BUFRECI, BUFRECR, NBRECORDS, N, IW4(1,1),
650 & KEEP,KEEP8, LOCAL_M, LOCAL_N, root, PTR_ROOT,
652 & END_MSG_2_RECV, MYID, PROCNODE_STEPS, SLAVEF,
653 & PTRAIW, PTRARW, PERM, STEP,
654 & INTARR, LINTARR, DBLARR, LDBLARR
658 CALL MPI_WAIT( IREQI( ISLAVE ), STATUS, IERR )
659 SEND_ACTIVE( ISLAVE ) = .FALSE.
662.ne.
IF ( ISLAVE - 1 MYID ) THEN
663 TAILLE_SEND_I = NBREC * 2 + 1
664 TAILLE_SEND_R = NBREC
665 CALL MPI_ISEND( BUFI(1, IACT(ISLAVE), ISLAVE ),
667 & MPI_INTEGER, ISLAVE - 1, ARR_INT, COMM,
668 & IREQI( ISLAVE ), IERR )
669 CALL MPI_ISEND( BUFR(1, IACT(ISLAVE), ISLAVE ),
671 & MPI_DOUBLE_PRECISION, ISLAVE - 1, ARR_REAL, COMM,
672 & IREQR( ISLAVE ), IERR )
673 SEND_ACTIVE( ISLAVE ) = .TRUE.
677 IACT( ISLAVE ) = 3 - IACT( ISLAVE )
678 BUFI( 1, IACT( ISLAVE ), ISLAVE ) = 0
680.ne.
IF ( DEST_SHR -3 ) THEN
681 IREQ = BUFI(1,IACT(ISLAVE),ISLAVE) + 1
682 BUFI(1,IACT(ISLAVE),ISLAVE) = IREQ
683 BUFI(IREQ*2,IACT(ISLAVE),ISLAVE) = ISEND_SHR
684 BUFI(IREQ*2+1,IACT(ISLAVE),ISLAVE) = JSEND_SHR
685 BUFR(IREQ,IACT(ISLAVE),ISLAVE ) = VAL_SHR
688 IF ( SEND_LOCAL ) THEN
690 CALL DMUMPS_DIST_TREAT_RECV_BUF(
691 & BUFI(1,3-IACT(ISLAVE),ISLAVE),
692 & BUFR(1,3-IACT(ISLAVE),ISLAVE),
693 & NBRECORDS, N, IW4(1,1),
694 & KEEP,KEEP8, LOCAL_M, LOCAL_N, root, PTR_ROOT,
696 & END_MSG_2_RECV, MYID, PROCNODE_STEPS, SLAVEF,
697 & PTRAIW, PTRARW, PERM, STEP,
698 & INTARR, LINTARR, DBLARR, LDBLARR
702 END SUBROUTINE DMUMPS_DIST_FILL_BUFFER
subroutine dmumps_build_mapping(n, mapping, nnz, irn, jcn, procnode, step, slavef, perm, fils, rg2l, keep, keep8, mblock, nblock, nprow, npcol)
subroutine dmumps_redistribution(n, nz_loc8, id, dblarr, ldblarr, intarr, lintarr, ptraiw, ptrarw, keep, keep8, myid, comm, nbrecords a, la, root, procnode_steps, slavef, perm, step, icntl, info, nsend8, nlocal8, istep_to_iniv2, candidates)