25
26 IMPLICIT NONE
27 INTEGER, INTENT(IN) :: NSLAVES, N,
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(kind=8), 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(kind=8), INTENT(OUT) :: RHSCOMP(LD_RHSCOMP, NRHS_COL)
38 INTEGER :: KEEP(500)
39 LOGICAL, INTENT(IN) :: LSCAL
40 type scaling_data_t
41 sequence
42 DOUBLE PRECISION, dimension(:), pointer :: SCALING
43 DOUBLE PRECISION, 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
50 include 'mpif.h'
51 INTEGER :: IERR_MPI
52 LOGICAL :: OMP_FLAG
53!$ INTEGER :: CHUNK, NOMP
54!$ INTEGER(8) :: CHUNK8
55 INTEGER :: allocok
56 INTEGER :: MAXRECORDS
57 INTEGER, ALLOCATABLE, DIMENSION(:) :: NBROWSTOSEND
58 INTEGER, ALLOCATABLE, DIMENSION(:) :: NEXTROWTOSEND
59 COMPLEX(kind=8), ALLOCATABLE, DIMENSION(:,:) :: BUFR
60 INTEGER, ALLOCATABLE, DIMENSION(:) :: BUFRECI
61 COMPLEX(kind=8), 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
65 INTEGER :: Iloc
66 INTEGER :: Iloc_sorted
67 INTEGER :: IREQ
68 INTEGER :: IMAP, IPROC_MAX
69 INTEGER :: IFS
70 INTEGER :: MAX_ACTIVE_SENDS
71 INTEGER :: NB_ACTIVE_SENDS
72 INTEGER :: NB_FS_TOUCHED
73 INTEGER :: NBROWSTORECV
74 COMPLEX(kind=8), PARAMETER :: ZERO = (0.0D0, 0.0D0)
75!$ NOMP = OMP_GET_MAX_THREADS()
76 NB_BYTES_LOC = 0_8
77 ALLOCATE( NBROWSTOSEND (NSLAVES),
78 & NEXTROWTOSEND (NSLAVES),
79 & IRHS_loc_sorted (NRHS_loc),
80 & stat=allocok )
81 IF (allocok > 0) THEN
82 INFO(1) = -13
83 INFO(2) = NSLAVES+NSLAVES+NRHS_loc
84 ENDIF
85 NB_BYTES_LOC = int(2*NSLAVES+NRHS_loc,8)*KEEP(34)
86 CALL MPI_ALLREDUCE( MPI_IN_PLACE, allocok, 1,
87 & MPI_INTEGER, MPI_SUM,
88 & COMM_NODES, IERR_MPI )
89.GT. IF (allocok 0) RETURN
90 NBROWSTOSEND(1:NSLAVES) = 0
91 DO Iloc = 1, NRHS_loc
92.GE..AND. IF (IRHS_loc(Iloc) 1
93.LE. & IRHS_loc(Iloc) N) THEN
94 IMAP = MAP_RHS_loc(Iloc)
95 NBROWSTOSEND(IMAP+1) = NBROWSTOSEND(IMAP+1)+1
96 ENDIF
97 ENDDO
98 NEXTROWTOSEND(1)=1
99 DO IMAP=1, NSLAVES-1
100 NEXTROWTOSEND(IMAP+1)=NEXTROWTOSEND(IMAP)+NBROWSTOSEND(IMAP)
101 ENDDO
102 NBROWSTOSEND=0
103 DO Iloc = 1, NRHS_loc
104.GE..AND. IF (IRHS_loc(Iloc) 1
105.LE. & IRHS_loc(Iloc) 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
110 ENDIF
111 ENDDO
112 CALL ZMUMPS_DR_BUILD_NBROWSTORECV()
113 MAX_ACTIVE_SENDS = min(10, NSLAVES)
114.EQ. IF (KEEP(72) 1 ) THEN
115 MAXRECORDS = 15
116 ELSE
117 MAXRECORDS = min(200000,2000000/NRHS_COL)
118 MAXRECORDS = min(MAXRECORDS,
119 & 50000000 / MAX_ACTIVE_SENDS / NRHS_COL)
120 MAXRECORDS = max(MAXRECORDS, 50)
121 ENDIF
122 ALLOCATE(BUFR(MAXRECORDS*NRHS_COL,
123 & MAX_ACTIVE_SENDS),
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),
130 & stat=allocok)
131.GT. IF (allocok 0) THEN
132.GT. IF (LP 0) WRITE(LP, '(a)')
134 INFO(1)=-13
135 INFO(2)=NRHS_COL*MAXRECORDS*MAX_ACTIVE_SENDS+
136 & 3*MAX_ACTIVE_SENDS+MAXRECORDS*(1+NRHS_COL)
137 & + NB_FS_IN_RHSCOMP
138 ENDIF
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)) +
142 & KEEP(35) * (
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
149 NB_ACTIVE_SENDS = 0
150 DO IREQ = 1, MAX_ACTIVE_SENDS
151 IS_SEND_ACTIVE(IREQ) = .FALSE.
152 ENDDO
153 NB_FS_TOUCHED = 0
154 DO IFS = 1, NB_FS_IN_RHSCOMP
155 TOUCHED(IFS) = .FALSE.
156 ENDDO
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 ZMUMPS_DR_ASSEMBLE_LOCAL()
161 ELSE
162 CALL ZMUMPS_DR_TRY_SEND(IPROC_MAX)
163 ENDIF
164 CALL ZMUMPS_DR_TRY_RECV()
165 CALL ZMUMPS_DR_TRY_FREE_SEND()
166 IPROC_MAX=maxloc(NBROWSTOSEND,DIM=1)-1
167 ENDDO
168.NE. DO WHILE ( NBROWSTORECV 0)
169 CALL ZMUMPS_DR_TRY_RECV()
170 CALL ZMUMPS_DR_TRY_FREE_SEND()
171 ENDDO
172.NE. DO WHILE (NB_ACTIVE_SENDS 0)
173 CALL ZMUMPS_DR_TRY_FREE_SEND()
174 ENDDO
175 CALL ZMUMPS_DR_EMPTY_ROWS()
176 RETURN
177 CONTAINS
178 SUBROUTINE ZMUMPS_DR_BUILD_NBROWSTORECV()
179 INTEGER :: IPROC
180 DO IPROC = 0, NSLAVES-1
181 CALL MPI_REDUCE( NBROWSTOSEND(IPROC+1), NBROWSTORECV,
182 & 1, MPI_INTEGER,
183 & MPI_SUM, IPROC, COMM_NODES, IERR_MPI )
184 ENDDO
185 END SUBROUTINE ZMUMPS_DR_BUILD_NBROWSTORECV
186 SUBROUTINE ZMUMPS_DR_TRY_RECV()
187 IMPLICIT NONE
188 INCLUDE 'mumps_tags.h'
189 INTEGER :: MPI_STATUS(MPI_STATUS_SIZE), MSGSOU
190 INTEGER :: NBRECORDS
191 LOGICAL :: FLAG
192 CALL MPI_IPROBE( MPI_ANY_SOURCE, DistRhsI, COMM_NODES,
193 & FLAG, MPI_STATUS, IERR_MPI )
194 IF (FLAG) THEN
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,
199 & MSGSOU, DistRhsI,
200 & COMM_NODES, MPI_STATUS, IERR_MPI)
201 CALL MPI_RECV(BUFRECR(1), NBRECORDS*NRHS_COL,
202 & MPI_DOUBLE_COMPLEX,
203 & MSGSOU, DistRhsR,
204 & COMM_NODES, MPI_STATUS, IERR_MPI)
205 CALL ZMUMPS_DR_ASSEMBLE_FROM_BUFREC(NBRECORDS,
206 & BUFRECI, BUFRECR)
207 ENDIF
208 RETURN
209 END SUBROUTINE ZMUMPS_DR_TRY_RECV
210 SUBROUTINE ZMUMPS_DR_ASSEMBLE_FROM_BUFREC
211 & (NBRECORDS, BUFRECI_ARG, BUFRECR_ARG)
212 IMPLICIT NONE
213 INTEGER, INTENT(IN) :: NBRECORDS
214 INTEGER, INTENT(INOUT) :: BUFRECI_ARG(NBRECORDS)
215 COMPLEX(kind=8), INTENT(IN) :: BUFRECR_ARG(NBRECORDS,
216 & NRHS_COL)
217 INTEGER :: I, K, IRHSCOMP, IFIRSTNOTTOUCHED, ILASTNOTTOUCHED
218 IFIRSTNOTTOUCHED = NBRECORDS+1
219 ILASTNOTTOUCHED = 0
220 DO I = 1, NBRECORDS
221.LE. IF (BUFRECI(I) 0) THEN
222 WRITE(*,*) "Internal error 1 in ZMUMPS_DR_TRY_RECV",
223 & I, BUFRECI(I), BUFRECI(1)
224 CALL MUMPS_ABORT()
225 ENDIF
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)
231 ENDIF
232 ENDDO
233 OMP_FLAG = .FALSE.
234.GE..AND.!$ OMP_FLAG = ( NRHS_COLKEEP(362)
235.GE.!$ & NRHS_COL*NBRECORDS KEEP(363)/2)
236 IF (OMP_FLAG) THEN
237!$OMP PARALLEL DO PRIVATE(I,IRHSCOMP) IF (OMP_FLAG)
238 DO K = 1, NRHS_COL
239 DO I = IFIRSTNOTTOUCHED, ILASTNOTTOUCHED
240 IRHSCOMP=BUFRECI_ARG(I)
241.NOT. IF ( TOUCHED(IRHSCOMP)) THEN
242 RHSCOMP(IRHSCOMP,K)=ZERO
243 ENDIF
244 ENDDO
245 DO I = 1, NBRECORDS
246 IRHSCOMP=BUFRECI_ARG(I)
247 RHSCOMP(IRHSCOMP,K) = RHSCOMP(IRHSCOMP,K) +
248 & BUFRECR_ARG(I,K)
249 ENDDO
250 ENDDO
251!$OMP END PARALLEL DO
252 ELSE
253 DO K = 1, NRHS_COL
254 DO I = IFIRSTNOTTOUCHED, ILASTNOTTOUCHED
255 IRHSCOMP=BUFRECI_ARG(I)
256.NOT. IF ( TOUCHED(IRHSCOMP)) THEN
257 RHSCOMP(IRHSCOMP,K)=ZERO
258 ENDIF
259 ENDDO
260 DO I = 1, NBRECORDS
261 IRHSCOMP=BUFRECI_ARG(I)
262 RHSCOMP(IRHSCOMP,K) = RHSCOMP(IRHSCOMP,K) +
263 & BUFRECR_ARG(I,K)
264 ENDDO
265 ENDDO
266 ENDIF
267 DO I = 1, NBRECORDS
268 IRHSCOMP = BUFRECI_ARG(I)
269.NOT. IF ( TOUCHED(IRHSCOMP)) THEN
270 NB_FS_TOUCHED = NB_FS_TOUCHED + 1
271 TOUCHED(IRHSCOMP) = .TRUE.
272 ENDIF
273 ENDDO
274 NBROWSTORECV = NBROWSTORECV - NBRECORDS
275 RETURN
276 END SUBROUTINE ZMUMPS_DR_ASSEMBLE_FROM_BUFREC
277 SUBROUTINE ZMUMPS_DR_ASSEMBLE_LOCAL()
278 INTEGER :: NBRECORDS, I, K, IFIRSTNOTTOUCHED
279 INTEGER :: Iloc
280 INTEGER :: Iglob
281 INTEGER :: IRHSCOMP
282 INTEGER(8) :: ISHIFT
283.EQ. IF ( NBROWSTOSEND(MYID_NODES+1) 0) THEN
284 WRITE(*,*) "Internal error in ZMUMPS_DR_ASSEMBLE_LOCAL"
285 CALL MUMPS_ABORT()
286 ENDIF
287 NBRECORDS=min(MAXRECORDS, NBROWSTOSEND(MYID_NODES+1))
288 IFIRSTNOTTOUCHED=NBRECORDS+1
289 DO I = 1, NBRECORDS
290 IRHSCOMP = POSINRHSCOMP_FWD(IRHS_loc(
291 & IRHS_loc_sorted(NEXTROWTOSEND(MYID_NODES+1)+I-1)))
292.NOT. IF ( TOUCHED(IRHSCOMP)) THEN
293 IFIRSTNOTTOUCHED=I
294 EXIT
295 ENDIF
296 ENDDO
297 IF (LSCAL) 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)
302 DO K = 1, NRHS_COL
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
309 ENDIF
310 ENDDO
311 DO I = 1, NBRECORDS
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)
318 ENDDO
319 ENDDO
320!$OMP END PARALLEL DO
321 ELSE
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)
326 DO K = 1, NRHS_COL
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
333 ENDIF
334 ENDDO
335 DO I = 1, NBRECORDS
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)
341 ENDDO
342 ENDDO
343!$OMP END PARALLEL DO
344 ENDIF
345 DO I = 1, NBRECORDS
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.
351 ENDIF
352 ENDDO
353 NEXTROWTOSEND(MYID_NODES+1)=NEXTROWTOSEND(MYID_NODES+1)+
354 & NBRECORDS
355 NBROWSTOSEND(MYID_NODES+1)=NBROWSTOSEND(MYID_NODES+1)-
356 & NBRECORDS
357 NBROWSTORECV = NBROWSTORECV - NBRECORDS
358 RETURN
359 END SUBROUTINE ZMUMPS_DR_ASSEMBLE_LOCAL
360 SUBROUTINE ZMUMPS_DR_GET_NEW_BUF( IBUF )
361 INTEGER, INTENT(OUT) :: IBUF
362 INTEGER :: I
363 IBUF = -1
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
367 IBUF = I
368 EXIT
369 ENDIF
370 ENDDO
371 ENDIF
372 RETURN
373 END SUBROUTINE ZMUMPS_DR_GET_NEW_BUF
374 SUBROUTINE ZMUMPS_DR_TRY_FREE_SEND()
375 INTEGER :: MPI_STATUS(MPI_STATUS_SIZE)
376 INTEGER :: I
377 LOGICAL :: FLAG
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 )
382 IF (FLAG) THEN
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
387 RETURN
388 ENDIF
389 ENDIF
390 ENDIF
391 ENDDO
392 ENDIF
393 RETURN
394 END SUBROUTINE ZMUMPS_DR_TRY_FREE_SEND
395 SUBROUTINE ZMUMPS_DR_TRY_SEND(IPROC_ARG)
396 IMPLICIT NONE
397 INTEGER, INTENT(IN) :: IPROC_ARG
398 INCLUDE 'mumps_tags.h'
399 INTEGER :: NBRECORDS, IBUF, I, K
400 INTEGER(8) :: IPOSRHS
401 INTEGER :: IPOSBUF
402.EQ. IF (IPROC_ARG MYID_NODES) THEN
403 WRITE(*,*) "Internal error 1 in ZMUMPS_DR_TRY_SEND"
404 CALL MUMPS_ABORT()
405 ENDIF
406.EQ. IF (NBROWSTOSEND(IPROC_ARG+1) 0) THEN
407 WRITE(*,*) "Internal error 2 in ZMUMPS_DR_TRY_SEND"
408 CALL MUMPS_ABORT()
409 ENDIF
410 CALL ZMUMPS_DR_GET_NEW_BUF(IBUF)
411.GT. IF (IBUF 0) THEN
412 NBRECORDS = min(MAXRECORDS,NBROWSTOSEND(IPROC_ARG+1))
413!$ OMP_FLAG = .FALSE.
414!$ CHUNK = NRHS_COL*NBRECORDS
415.GE.!$ IF (CHUNK KEEP(363)) THEN
416!$ OMP_FLAG = .TRUE.
417!$ CHUNK = max((CHUNK+NOMP-1)/NOMP,KEEP(363)/2)
418!$ ENDIF
419 IF (LSCAL) THEN
420!$OMP PARALLEL DO COLLAPSE(2) SCHEDULE(STATIC,CHUNK)
421!$OMP& PRIVATE(K, I, IPOSBUF, IPOSRHS, Iloc) IF (OMP_FLAG)
422 DO K=1, NRHS_COL
423 DO I = 1, NBRECORDS
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)
430 ENDDO
431 ENDDO
432!$OMP END PARALLEL DO
433 ELSE
434!$OMP PARALLEL DO COLLAPSE(2) SCHEDULE(STATIC,CHUNK)
435!$OMP& PRIVATE(K, I, IPOSBUF, IPOSRHS, Iloc) IF (OMP_FLAG)
436 DO K=1, NRHS_COL
437 DO I = 1, NBRECORDS
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 )
443 ENDDO
444 ENDDO
445!$OMP END PARALLEL DO
446 ENDIF
447 DO I = 1, NBRECORDS
448 Iloc = IRHS_loc_sorted(NEXTROWTOSEND(IPROC_ARG+1)+I-1)
449 IRHS_loc_sorted(NEXTROWTOSEND(IPROC_ARG+1)+I-1)
450 & = IRHS_loc(Iloc)
451 ENDDO
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,
456 & MPI_DOUBLE_COMPLEX,
457 & IPROC_ARG, DistRhsR,
458 & COMM_NODES, MPI_REQR(IBUF), IERR_MPI )
459 NEXTROWTOSEND(IPROC_ARG+1)=NEXTROWTOSEND(IPROC_ARG+1)+
460 & NBRECORDS
461 NBROWSTOSEND(IPROC_ARG+1)=NBROWSTOSEND(IPROC_ARG+1)-NBRECORDS
462 NB_ACTIVE_SENDS = NB_ACTIVE_SENDS + 1
463 IS_SEND_ACTIVE(IBUF)=.TRUE.
464 ENDIF
465 RETURN
466 END SUBROUTINE ZMUMPS_DR_TRY_SEND
467 SUBROUTINE ZMUMPS_DR_EMPTY_ROWS()
468 INTEGER :: K, IFS
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)
473 DO K = 1, NRHS_COL
474 DO IFS = 1, NB_FS_IN_RHSCOMP
475.NOT. IF ( TOUCHED(IFS) ) THEN
476 RHSCOMP( IFS, K) = ZERO
477 ENDIF
478 ENDDO
479 DO IFS = NB_FS_IN_RHSCOMP +1, LD_RHSCOMP
480 RHSCOMP (IFS, K) = ZERO
481 ENDDO
482 ENDDO
483!$OMP END PARALLEL DO
484 ELSE
485!$ OMP_FLAG = .FALSE.
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
489!$ OMP_FLAG = .TRUE.
490!$ CHUNK8 = max((CHUNK8+NOMP-1)/NOMP,int(KEEP(363)/2,8))
491!$ ENDIF
492!$OMP PARALLEL DO COLLAPSE(2) SCHEDULE(STATIC,CHUNK8)
493!$OMP& IF (OMP_FLAG)
494 DO K = 1, NRHS_COL
495 DO IFS = NB_FS_IN_RHSCOMP +1, LD_RHSCOMP
496 RHSCOMP (IFS, K) = ZERO
497 ENDDO
498 ENDDO
499!$OMP END PARALLEL DO
500 ENDIF
501 RETURN
502 END SUBROUTINE ZMUMPS_DR_EMPTY_ROWS
subroutine zmumps_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)