16 & MYID_NODES, COMM_NODES,
17 & NRHS_COL, NRHS_loc, LRHS_loc,
19 & IRHS_loc, RHS_loc, RHS_loc_size,
20 & RHSCOMP, LD_RHSCOMP,
21 & POSINRHSCOMP_FWD, NB_FS_IN_RHSCOMP,
22 & LSCAL, scaling_data_dr,
23 & LP, LPOK, KEEP, NB_BYTES_LOC, INFO )
27 INTEGER,
INTENT(IN) :: NSLAVES, , MYID_NODES
28 INTEGER,
INTENT(IN) :: NRHS_loc, LRHS_loc
29 INTEGER,
INTENT(IN) :: NRHS_COL
30 INTEGER,
INTENT(IN) :: COMM_NODES
31 INTEGER,
INTENT(IN) :: MAP_RHS_loc(max(1,NRHS_loc))
32 INTEGER,
INTENT(IN) :: IRHS_loc(NRHS_loc)
33 INTEGER(8),
INTENT(IN) :: RHS_loc_size
34 COMPLEX,
INTENT(IN) :: RHS_loc(RHS_loc_size)
35 INTEGER,
INTENT(IN) :: NB_FS_IN_RHSCOMP, LD_RHSCOMP
36 INTEGER,
INTENT(IN) :: POSINRHSCOMP_FWD(N)
37 COMPLEX,
INTENT(OUT) :: RHSCOMP(LD_RHSCOMP, NRHS_COL)
39 LOGICAL,
INTENT(IN) :: LSCAL
42 REAL,
dimension(:),
pointer :: SCALING
43 REAL,
dimension(:),
pointer :: SCALING_LOC
44 end type scaling_data_t
45 type(scaling_data_t),
INTENT(IN) :: scaling_data_dr
46 LOGICAL,
INTENT(IN) :: LPOK
47 INTEGER,
INTENT(IN) :: LP
48 INTEGER,
INTENT(INOUT) :: INFO(2)
49 INTEGER(8),
INTENT(OUT):: NB_BYTES_LOC
57 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: NBROWSTOSEND
58 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: NEXTROWTOSEND
59 COMPLEX,
ALLOCATABLE,
DIMENSION(:,:) :: BUFR
60 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: BUFRECI
61 COMPLEX,
ALLOCATABLE,
DIMENSION(:) :: BUFRECR
62 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: IS_SEND_ACTIVE, TOUCHED
63 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: MPI_REQI, MPI_REQR
64 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: IRHS_loc_sorted
66 INTEGER :: Iloc_sorted
68 INTEGER :: IMAP, IPROC_MAX
70 INTEGER :: MAX_ACTIVE_SENDS
71 INTEGER :: NB_ACTIVE_SENDS
72 INTEGER :: NB_FS_TOUCHED
74 COMPLEX,
PARAMETER :: ZERO = (0.0e0, 0.0e0)
77 ALLOCATE( nbrowstosend(nslaves),
78 & nextrowtosend(nslaves),
79 & irhs_loc_sorted(nrhs_loc),
83 info(2) = nslaves+nslaves+nrhs_loc
85 nb_bytes_loc = int(2*nslaves+nrhs_loc,8)*keep(34)
87 & mpi_integer, mpi_sum,
88 & comm_nodes, ierr_mpi )
89 IF (allocok .GT. 0)
RETURN
90 nbrowstosend(1:nslaves) = 0
92 IF (irhs_loc(iloc) .GE. 1 .AND.
93 & irhs_loc(iloc) .LE. n)
THEN
94 imap = map_rhs_loc(iloc)
95 nbrowstosend(imap+1) = nbrowstosend(imap+1)+1
100 nextrowtosend(imap+1)=nextrowtosend(imap)+nbrowstosend(imap)
103 DO iloc = 1, nrhs_loc
104 IF (irhs_loc(iloc) .GE. 1 .AND.
105 & irhs_loc(iloc) .LE. n)
THEN
106 imap = map_rhs_loc(iloc)
107 iloc_sorted = nextrowtosend(imap+1)+nbrowstosend(imap+1)
108 irhs_loc_sorted(iloc_sorted) = iloc
109 nbrowstosend(imap+1)=nbrowstosend(imap+1)+1
113 max_active_sends =
min(10, nslaves)
114 IF (keep(72) .EQ.1 )
THEN
117 maxrecords =
min(200000,2000000/nrhs_col)
118 maxrecords =
min(maxrecords,
119 & 50000000 / max_active_sends / nrhs_col)
120 maxrecords = max(maxrecords, 50)
122 ALLOCATE(bufr(maxrecords*nrhs_col,
124 & mpi_reqi(max_active_sends),
125 & mpi_reqr(max_active_sends),
126 & is_send_active(max_active_sends),
127 & bufreci(maxrecords),
128 & bufrecr(maxrecords*nrhs_col),
129 & touched(nb_fs_in_rhscomp),
131 IF (allocok .GT. 0)
THEN
132 IF (lp .GT. 0)
WRITE(lp,
'(A)')
135 INFO(2)=NRHS_COL*MAXRECORDS*MAX_ACTIVE_SENDS+
136 & 3*MAX_ACTIVE_SENDS+MAXRECORDS*(1+NRHS_COL)
139 NB_BYTES_LOC=NB_BYTES_LOC +
140 & KEEP(34) * ( int(2*MAX_ACTIVE_SENDS,8) + int(MAXRECORDS,8) ) +
141 & KEEP(34) * (int(MAX_ACTIVE_SENDS,8) + int(NB_FS_IN_RHSCOMP,8)) +
143 & int( MAXRECORDS,8)*int(NRHS_COL,8)*int(MAX_ACTIVE_SENDS,8)
144 & + int(MAXRECORDS,8) * int(NRHS_COL,8) )
145 CALL MPI_ALLREDUCE( MPI_IN_PLACE, allocok, 1,
146 & MPI_INTEGER, MPI_SUM,
147 & COMM_NODES, IERR_MPI )
148.NE.
IF (allocok 0) RETURN
150 DO IREQ = 1, MAX_ACTIVE_SENDS
151 IS_SEND_ACTIVE(IREQ) = .FALSE.
154 DO IFS = 1, NB_FS_IN_RHSCOMP
155 TOUCHED(IFS) = .FALSE.
157 IPROC_MAX=maxloc(NBROWSTOSEND,DIM=1)-1
158.NE.
DO WHILE (NBROWSTOSEND(IPROC_MAX+1) 0)
159.EQ.
IF (IPROC_MAX MYID_NODES) THEN
160 CALL CMUMPS_DR_ASSEMBLE_LOCAL()
162 CALL CMUMPS_DR_TRY_SEND(IPROC_MAX)
164 CALL CMUMPS_DR_TRY_RECV()
165 CALL CMUMPS_DR_TRY_FREE_SEND()
166 IPROC_MAX=maxloc(NBROWSTOSEND,DIM=1)-1
168.NE.
DO WHILE ( NBROWSTORECV 0)
169 CALL CMUMPS_DR_TRY_RECV()
170 CALL CMUMPS_DR_TRY_FREE_SEND()
172.NE.
DO WHILE (NB_ACTIVE_SENDS 0)
173 CALL CMUMPS_DR_TRY_FREE_SEND()
175 CALL CMUMPS_DR_EMPTY_ROWS()
178 SUBROUTINE CMUMPS_DR_BUILD_NBROWSTORECV()
180 DO IPROC = 0, NSLAVES-1
181 CALL MPI_REDUCE( NBROWSTOSEND(IPROC+1), NBROWSTORECV,
183 & MPI_SUM, IPROC, COMM_NODES, IERR_MPI )
185 END SUBROUTINE CMUMPS_DR_BUILD_NBROWSTORECV
186 SUBROUTINE CMUMPS_DR_TRY_RECV()
188 INCLUDE 'mumps_tags.h
'
189 INTEGER :: MPI_STATUS(MPI_STATUS_SIZE), MSGSOU
192 CALL MPI_IPROBE( MPI_ANY_SOURCE, DistRhsI, COMM_NODES,
193 & FLAG, MPI_STATUS, IERR_MPI )
195 MSGSOU = MPI_STATUS( MPI_SOURCE )
196 CALL MPI_GET_COUNT(MPI_STATUS, MPI_INTEGER,
197 & NBRECORDS, IERR_MPI)
198 CALL MPI_RECV(BUFRECI(1), NBRECORDS, MPI_INTEGER,
200 & COMM_NODES, MPI_STATUS, IERR_MPI)
201 CALL MPI_RECV(BUFRECR(1), NBRECORDS*NRHS_COL,
204 & COMM_NODES, MPI_STATUS, IERR_MPI)
205 CALL CMUMPS_DR_ASSEMBLE_FROM_BUFREC(NBRECORDS,
209 END SUBROUTINE CMUMPS_DR_TRY_RECV
210 SUBROUTINE CMUMPS_DR_ASSEMBLE_FROM_BUFREC
211 & (NBRECORDS, BUFRECI_ARG, BUFRECR_ARG)
213 INTEGER, INTENT(IN) :: NBRECORDS
214 INTEGER, INTENT(INOUT) :: BUFRECI_ARG(NBRECORDS)
215 COMPLEX, INTENT(IN) :: BUFRECR_ARG(NBRECORDS,
217 INTEGER :: I, K, IRHSCOMP, IFIRSTNOTTOUCHED, ILASTNOTTOUCHED
218 IFIRSTNOTTOUCHED = NBRECORDS+1
221.LE.
IF (BUFRECI(I) 0) THEN
222 WRITE(*,*) "Internal error 1 in CMUMPS_DR_TRY_RECV",
223 & I, BUFRECI(I), BUFRECI(1)
226 IRHSCOMP=POSINRHSCOMP_FWD(BUFRECI(I))
227 BUFRECI_ARG(I)=IRHSCOMP
228.NOT.
IF ( TOUCHED(IRHSCOMP) ) THEN
229 IFIRSTNOTTOUCHED=min(IFIRSTNOTTOUCHED,I)
230 ILASTNOTTOUCHED=max(ILASTNOTTOUCHED,I)
234.GE..AND.
!$ OMP_FLAG = ( NRHS_COLKEEP(362)
235.GE.
!$ & NRHS_COL*NBRECORDS KEEP(363)/2)
237!$OMP PARALLEL DO PRIVATE(I,IRHSCOMP) IF (OMP_FLAG)
239 DO I = IFIRSTNOTTOUCHED, ILASTNOTTOUCHED
240 IRHSCOMP=BUFRECI_ARG(I)
241.NOT.
IF ( TOUCHED(IRHSCOMP)) THEN
242 RHSCOMP(IRHSCOMP,K)=ZERO
246 IRHSCOMP=BUFRECI_ARG(I)
247 RHSCOMP(IRHSCOMP,K) = RHSCOMP(IRHSCOMP,K) +
254 DO I = IFIRSTNOTTOUCHED, ILASTNOTTOUCHED
255 IRHSCOMP=BUFRECI_ARG(I)
256.NOT.
IF ( TOUCHED(IRHSCOMP)) THEN
257 RHSCOMP(IRHSCOMP,K)=ZERO
261 IRHSCOMP=BUFRECI_ARG(I)
262 RHSCOMP(IRHSCOMP,K) = RHSCOMP(IRHSCOMP,K) +
268 IRHSCOMP = BUFRECI_ARG(I)
269.NOT.
IF ( TOUCHED(IRHSCOMP)) THEN
270 NB_FS_TOUCHED = NB_FS_TOUCHED + 1
271 TOUCHED(IRHSCOMP) = .TRUE.
274 NBROWSTORECV = NBROWSTORECV - NBRECORDS
276 END SUBROUTINE CMUMPS_DR_ASSEMBLE_FROM_BUFREC
277 SUBROUTINE CMUMPS_DR_ASSEMBLE_LOCAL()
278 INTEGER :: NBRECORDS, I, K, IFIRSTNOTTOUCHED
283.EQ.
IF ( NBROWSTOSEND(MYID_NODES+1) 0) THEN
284 WRITE(*,*) "Internal error in CMUMPS_DR_ASSEMBLE_LOCAL"
287 NBRECORDS=min(MAXRECORDS, NBROWSTOSEND(MYID_NODES+1))
288 IFIRSTNOTTOUCHED=NBRECORDS+1
290 IRHSCOMP = POSINRHSCOMP_FWD(IRHS_loc(
291 & IRHS_loc_sorted(NEXTROWTOSEND(MYID_NODES+1)+I-1)))
292.NOT.
IF ( TOUCHED(IRHSCOMP)) THEN
298.GE..AND.
!$ OMP_FLAG = (NRHS_COLKEEP(362)
299.GE.
!$ & NRHS_COL*NBRECORDS KEEP(363)/2)
300!$OMP PARALLEL DO PRIVATE(K, ISHIFT, I, IRHSCOMP, Iloc, Iglob)
301!$OMP& FIRSTPRIVATE(NBRECORDS) IF (OMP_FLAG)
303 ISHIFT = (K-1) * LRHS_loc
304 DO I = IFIRSTNOTTOUCHED, NBRECORDS
305 IRHSCOMP = POSINRHSCOMP_FWD(IRHS_loc(
306 & IRHS_loc_sorted(NEXTROWTOSEND(MYID_NODES+1)+I-1)))
307.NOT.
IF ( TOUCHED(IRHSCOMP)) THEN
308 RHSCOMP(IRHSCOMP,K)=ZERO
312 Iloc = IRHS_loc_sorted(NEXTROWTOSEND(MYID_NODES+1)+I-1)
313 Iglob = IRHS_loc(Iloc)
314 IRHSCOMP = POSINRHSCOMP_FWD(Iglob)
315 RHSCOMP(IRHSCOMP,K) = RHSCOMP(IRHSCOMP,K)+
316 & RHS_loc(Iloc+ISHIFT)*
317 & scaling_data_dr%SCALING_LOC(Iloc)
322.GE..AND.
!$ OMP_FLAG = (NRHS_COLKEEP(362)
323.GE.
!$ & NRHS_COL*NBRECORDS KEEP(363)/2)
324!$OMP PARALLEL DO PRIVATE(K, ISHIFT, I, IRHSCOMP, Iloc, Iglob)
325!$OMP& FIRSTPRIVATE(NBRECORDS) IF (OMP_FLAG)
327 ISHIFT = (K-1) * LRHS_loc
328 DO I = IFIRSTNOTTOUCHED, NBRECORDS
329 IRHSCOMP = POSINRHSCOMP_FWD(IRHS_loc(
330 & IRHS_loc_sorted(NEXTROWTOSEND(MYID_NODES+1)+I-1)))
331.NOT.
IF ( TOUCHED(IRHSCOMP)) THEN
332 RHSCOMP(IRHSCOMP,K)=ZERO
336 Iloc = IRHS_loc_sorted(NEXTROWTOSEND(MYID_NODES+1)+I-1)
337 Iglob = IRHS_loc(Iloc)
338 IRHSCOMP = POSINRHSCOMP_FWD(Iglob)
339 RHSCOMP(IRHSCOMP,K) = RHSCOMP(IRHSCOMP,K)+
340 & RHS_loc(Iloc+ISHIFT)
346 IRHSCOMP = POSINRHSCOMP_FWD(IRHS_loc(
347 & IRHS_loc_sorted(NEXTROWTOSEND(MYID_NODES+1)+I-1)))
348.NOT.
IF ( TOUCHED(IRHSCOMP)) THEN
349 NB_FS_TOUCHED = NB_FS_TOUCHED + 1
350 TOUCHED(IRHSCOMP) = .TRUE.
353 NEXTROWTOSEND(MYID_NODES+1)=NEXTROWTOSEND(MYID_NODES+1)+
355 NBROWSTOSEND(MYID_NODES+1)=NBROWSTOSEND(MYID_NODES+1)-
357 NBROWSTORECV = NBROWSTORECV - NBRECORDS
359 END SUBROUTINE CMUMPS_DR_ASSEMBLE_LOCAL
360 SUBROUTINE CMUMPS_DR_GET_NEW_BUF( IBUF )
361 INTEGER, INTENT(OUT) :: IBUF
364.NE.
IF (NB_ACTIVE_SENDS MAX_ACTIVE_SENDS) THEN
365 DO I=1, MAX_ACTIVE_SENDS
366.NOT.
IF ( IS_SEND_ACTIVE(I)) THEN
373 END SUBROUTINE CMUMPS_DR_GET_NEW_BUF
374 SUBROUTINE CMUMPS_DR_TRY_FREE_SEND()
375 INTEGER :: MPI_STATUS(MPI_STATUS_SIZE)
378.GT.
IF (NB_ACTIVE_SENDS 0) THEN
379 DO I=1, MAX_ACTIVE_SENDS
380 IF (IS_SEND_ACTIVE(I)) THEN
381 CALL MPI_TEST( MPI_REQR(I), FLAG, MPI_STATUS, IERR_MPI )
383 CALL MPI_WAIT(MPI_REQI(I), MPI_STATUS, IERR_MPI)
384 NB_ACTIVE_SENDS = NB_ACTIVE_SENDS - 1
385 IS_SEND_ACTIVE(I)=.FALSE.
386.EQ.
IF (NB_ACTIVE_SENDS 0) THEN
394 END SUBROUTINE CMUMPS_DR_TRY_FREE_SEND
395 SUBROUTINE CMUMPS_DR_TRY_SEND(IPROC_ARG)
397 INTEGER, INTENT(IN) :: IPROC_ARG
398 INCLUDE 'mumps_tags.h
'
399 INTEGER :: NBRECORDS, IBUF, I, K
400 INTEGER(8) :: IPOSRHS
402.EQ.
IF (IPROC_ARG MYID_NODES) THEN
403 WRITE(*,*) "Internal error 1 in CMUMPS_DR_TRY_SEND"
406.EQ.
IF (NBROWSTOSEND(IPROC_ARG+1) 0) THEN
407 WRITE(*,*) "Internal error 2 in CMUMPS_DR_TRY_SEND"
410 CALL CMUMPS_DR_GET_NEW_BUF(IBUF)
412 NBRECORDS = min(MAXRECORDS,NBROWSTOSEND(IPROC_ARG+1))
414!$ CHUNK = NRHS_COL*NBRECORDS
415.GE.
!$ IF (CHUNK KEEP(363)) THEN
417!$ CHUNK = max((CHUNK+NOMP-1)/NOMP,KEEP(363)/2)
420!$OMP PARALLEL DO COLLAPSE(2) SCHEDULE(STATIC,CHUNK)
421!$OMP& PRIVATE(K, I, IPOSBUF, IPOSRHS, Iloc) IF (OMP_FLAG)
424 IPOSBUF = (K-1)*NBRECORDS
425 IPOSRHS = int(K-1,8)*int(LRHS_loc,8)
426 Iloc = IRHS_loc_sorted(NEXTROWTOSEND(IPROC_ARG+1)+I-1)
427 BUFR( IPOSBUF + I, IBUF )
428 & = RHS_loc( IPOSRHS + Iloc ) *
429 & scaling_data_dr%SCALING_LOC(Iloc)
434!$OMP PARALLEL DO COLLAPSE(2) SCHEDULE(STATIC,CHUNK)
435!$OMP& PRIVATE(K, I, IPOSBUF, IPOSRHS, Iloc) IF (OMP_FLAG)
438 IPOSBUF = (K-1)*NBRECORDS
439 IPOSRHS = int(K-1,8)*int(LRHS_loc,8)
440 Iloc = IRHS_loc_sorted(NEXTROWTOSEND(IPROC_ARG+1)+I-1)
441 BUFR( IPOSBUF + I, IBUF )
442 & = RHS_loc( IPOSRHS + Iloc )
448 Iloc = IRHS_loc_sorted(NEXTROWTOSEND(IPROC_ARG+1)+I-1)
449 IRHS_loc_sorted(NEXTROWTOSEND(IPROC_ARG+1)+I-1)
452 CALL MPI_ISEND( IRHS_loc_sorted(NEXTROWTOSEND(IPROC_ARG+1)),
453 & NBRECORDS, MPI_INTEGER, IPROC_ARG, DistRhsI,
454 & COMM_NODES, MPI_REQI(IBUF), IERR_MPI )
455 CALL MPI_ISEND( BUFR(1,IBUF), NBRECORDS*NRHS_COL,
457 & IPROC_ARG, DistRhsR,
458 & COMM_NODES, MPI_REQR(IBUF), IERR_MPI )
459 NEXTROWTOSEND(IPROC_ARG+1)=NEXTROWTOSEND(IPROC_ARG+1)+
461 NBROWSTOSEND(IPROC_ARG+1)=NBROWSTOSEND(IPROC_ARG+1)-NBRECORDS
462 NB_ACTIVE_SENDS = NB_ACTIVE_SENDS + 1
463 IS_SEND_ACTIVE(IBUF)=.TRUE.
466 END SUBROUTINE CMUMPS_DR_TRY_SEND
467 SUBROUTINE CMUMPS_DR_EMPTY_ROWS()
469.NE.
IF ( NB_FS_TOUCHED NB_FS_IN_RHSCOMP ) THEN
470.GE..AND.
!$ OMP_FLAG = (NRHS_COL KEEP(362))
471!$ & (NRHS_COL*NB_FS_IN_RHSCOMP > KEEP(363)/2)
472!$OMP PARALLEL DO FIRSTPRIVATE(NB_FS_IN_RHSCOMP) IF (OMP_FLAG)
474 DO IFS = 1, NB_FS_IN_RHSCOMP
475.NOT.
IF ( TOUCHED(IFS) ) THEN
476 RHSCOMP( IFS, K) = ZERO
479 DO IFS = NB_FS_IN_RHSCOMP +1, LD_RHSCOMP
480 RHSCOMP (IFS, K) = ZERO
486!$ CHUNK8 = int(NRHS_COL,8)*int(LD_RHSCOMP-NB_FS_IN_RHSCOMP,8)
487!$ CHUNK8 = max(CHUNK8,1_8)
488.GE.
!$ IF (CHUNK8 int(KEEP(363),8)) THEN
490!$ CHUNK8 = max((CHUNK8+NOMP-1)/NOMP,int(KEEP(363)/2,8))
492!$OMP PARALLEL DO COLLAPSE(2) SCHEDULE(STATIC,CHUNK8)
495 DO IFS = NB_FS_IN_RHSCOMP +1, LD_RHSCOMP
496 RHSCOMP (IFS, K) = ZERO
502 END SUBROUTINE CMUMPS_DR_EMPTY_ROWS
504 SUBROUTINE CMUMPS_SOL_INIT_IRHS_loc(id)
507 TYPE (CMUMPS_STRUC) :: id
508 INTEGER, PARAMETER :: MASTER = 0
509 INTEGER :: ROW_OR_COL_INDICES
511 LOGICAL :: I_AM_SLAVE
512 INTEGER, POINTER :: idIRHS_loc(:)
513 INTEGER, POINTER :: UNS_PERM(:)
514 INTEGER :: UNS_PERM_TO_BE_DONE, I, allocok
515 INTEGER, TARGET :: IDUMMY(1)
518 IF (
id%JOB .NE. 9)
THEN
519 WRITE(*,*)
"Internal error 1 in CMUMPS_SOL_INIT_IRHS_loc"
522 i_am_slave = (
id%MYID .ne. master .OR.
523 & (
id%MYID .eq. master .AND.
524 &
id%KEEP(46) .eq. 1 ) )
525 IF (
id%MYID .EQ. master)
THEN
526 IF (
id%ICNTL(20).EQ.10)
THEN
527 row_or_col_indices = 0
528 ELSE IF (
id%ICNTL(20).EQ.11)
THEN
529 row_or_col_indices = 1
531 row_or_col_indices = 0
533 IF (
id%ICNTL(9) .NE. 1)
THEN
534 row_or_col_indices = 1 - row_or_col_indices
536 IF (
id%KEEP(23).NE.0 .AND.
id%ICNTL(9) .NE.1)
THEN
537 uns_perm_to_be_done = 1
539 uns_perm_to_be_done = 0
542 CALL mpi_bcast(row_or_col_indices,1,mpi_integer,master,
544 CALL mpi_bcast(uns_perm_to_be_done,1,mpi_integer,master,
546 IF ( i_am_slave )
THEN
547 IF (
id%KEEP(89) .GT. 0)
THEN
548 IF (.NOT.
associated(
id%IRHS_loc))
THEN
551 ELSE IF (
size(
id%IRHS_loc) <
id%KEEP(89) )
THEN
560 IF (
id%INFO(1).LT.0)
goto 500
562 IF (
associated(
id%IRHS_loc))
THEN
563 IF (
size(
id%IRHS_loc) .GT. 0)
THEN
564 idirhs_loc =>
id%IRHS_loc
572 &
id%PTLUST_S(1),
id%KEEP(1),
id%KEEP8(1),
id%IS(1),
573 & max(1,
id%KEEP(32)),
574 &
id%STEP(1),
id%PROCNODE_STEPS(1), idirhs_loc(1),
575 & row_or_col_indices)
577 IF (uns_perm_to_be_done .EQ. 1)
THEN
578 IF (
id%MYID.NE.master)
THEN
579 ALLOCATE(uns_perm(
id%N
580 IF (allocok > 0)
THEN
590 IF (
id%INFO(1) .LT. 0)
GOTO 500
591 IF (
id%MYID .EQ. master )
THEN
592 uns_perm =>
id%UNS_PERM
594 CALL mpi_bcast(uns_perm(1),
id%N,mpi_integer,master,
596 IF (i_am_slave .AND.
id%KEEP(89) .NE.0)
THEN
598 id%IRHS_loc(i)=uns_perm(
id%IRHS_loc(i))
603 IF (
id%MYID.NE.master)
THEN
604 IF (
associated(uns_perm))
DEALLOCATE(uns_perm)
subroutine cmumps_scatter_dist_rhs(nslaves, n, myid_nodes, comm_nodes, nrhs_col, nrhs_loc, lrhs_loc, map_rhs_loc, irhs_loc, rhs_loc, rhs_loc_size, rhscomp, ld_rhscomp, posinrhscomp_fwd, nb_fs_in_rhscomp, lscal, scaling_data_dr, lp, lpok, keep, nb_bytes_loc, info)
subroutine mumps_build_irhs_loc(myid_nodes, nslaves, n, ptrist, keep, keep8, iw, liw, step, procnode_steps, irhs_loc, row_or_col_indices)