OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
csol_distrhs.F
Go to the documentation of this file.
1C
2C This file is part of MUMPS 5.5.1, released
3C on Tue Jul 12 13:17:24 UTC 2022
4C
5C
6C Copyright 1991-2022 CERFACS, CNRS, ENS Lyon, INP Toulouse, Inria,
7C Mumps Technologies, University of Bordeaux.
8C
9C This version of MUMPS is provided to you free of charge. It is
10C released under the CeCILL-C license
11C (see doc/CeCILL-C_V1-en.txt, doc/CeCILL-C_V1-fr.txt, and
12C https://cecill.info/licences/Licence_CeCILL-C_V1-en.html)
13C
15 & NSLAVES, N,
16 & MYID_NODES, COMM_NODES,
17 & NRHS_COL, NRHS_loc, LRHS_loc,
18 & MAP_RHS_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 )
25!$ USE OMP_LIB
26 IMPLICIT NONE
27 INTEGER, INTENT(IN) :: NSLAVES, N, 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)
38 INTEGER :: KEEP(500)
39 LOGICAL, INTENT(IN) :: LSCAL
40 type scaling_data_t
41 sequence
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
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, 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
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, PARAMETER :: ZERO = (0.0e0, 0.0e0)
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 IF (allocok .GT. 0) RETURN
90 nbrowstosend(1:nslaves) = 0
91 DO iloc = 1, nrhs_loc
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
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 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
110 ENDIF
111 ENDDO
113 max_active_sends = min(10, nslaves)
114 IF (keep(72) .EQ.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 IF (allocok .GT. 0) THEN
132 IF (lp .GT. 0) WRITE(lp, '(A)')
133 & 'error: allocation problem in cmumps_scatter_dist_rhs'
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 CMUMPS_DR_ASSEMBLE_LOCAL()
161 ELSE
162 CALL CMUMPS_DR_TRY_SEND(IPROC_MAX)
163 ENDIF
164 CALL CMUMPS_DR_TRY_RECV()
165 CALL CMUMPS_DR_TRY_FREE_SEND()
166 IPROC_MAX=maxloc(NBROWSTOSEND,DIM=1)-1
167 ENDDO
168.NE. DO WHILE ( NBROWSTORECV 0)
169 CALL CMUMPS_DR_TRY_RECV()
170 CALL CMUMPS_DR_TRY_FREE_SEND()
171 ENDDO
172.NE. DO WHILE (NB_ACTIVE_SENDS 0)
173 CALL CMUMPS_DR_TRY_FREE_SEND()
174 ENDDO
175 CALL CMUMPS_DR_EMPTY_ROWS()
176 RETURN
177 CONTAINS
178 SUBROUTINE CMUMPS_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 CMUMPS_DR_BUILD_NBROWSTORECV
186 SUBROUTINE CMUMPS_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_COMPLEX,
203 & MSGSOU, DistRhsR,
204 & COMM_NODES, MPI_STATUS, IERR_MPI)
205 CALL CMUMPS_DR_ASSEMBLE_FROM_BUFREC(NBRECORDS,
206 & BUFRECI, BUFRECR)
207 ENDIF
208 RETURN
209 END SUBROUTINE CMUMPS_DR_TRY_RECV
210 SUBROUTINE CMUMPS_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, 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 CMUMPS_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 CMUMPS_DR_ASSEMBLE_FROM_BUFREC
277 SUBROUTINE CMUMPS_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 CMUMPS_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 CMUMPS_DR_ASSEMBLE_LOCAL
360 SUBROUTINE CMUMPS_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 CMUMPS_DR_GET_NEW_BUF
374 SUBROUTINE CMUMPS_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 CMUMPS_DR_TRY_FREE_SEND
395 SUBROUTINE CMUMPS_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 CMUMPS_DR_TRY_SEND"
404 CALL MUMPS_ABORT()
405 ENDIF
406.EQ. IF (NBROWSTOSEND(IPROC_ARG+1) 0) THEN
407 WRITE(*,*) "Internal error 2 in CMUMPS_DR_TRY_SEND"
408 CALL MUMPS_ABORT()
409 ENDIF
410 CALL CMUMPS_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_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 CMUMPS_DR_TRY_SEND
467 SUBROUTINE CMUMPS_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 CMUMPS_DR_EMPTY_ROWS
503 END SUBROUTINE CMUMPS_SCATTER_DIST_RHS
504 SUBROUTINE CMUMPS_SOL_INIT_IRHS_loc(id)
505 USE CMUMPS_STRUC_DEF
506 IMPLICIT NONE
507 TYPE (CMUMPS_STRUC) :: id
508 INTEGER, PARAMETER :: MASTER = 0
509 INTEGER :: ROW_OR_COL_INDICES
510 INTEGER :: IERR_MPI
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)
516 INCLUDE 'mpif.h'
517 NULLIFY(uns_perm)
518 IF (id%JOB .NE. 9) THEN
519 WRITE(*,*) "Internal error 1 in CMUMPS_SOL_INIT_IRHS_loc"
520 CALL mumps_abort()
521 ENDIF
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
530 ELSE
531 row_or_col_indices = 0
532 ENDIF
533 IF (id%ICNTL(9) .NE. 1) THEN
534 row_or_col_indices = 1 - row_or_col_indices
535 ENDIF
536 IF (id%KEEP(23).NE.0 .AND. id%ICNTL(9) .NE.1) THEN
537 uns_perm_to_be_done = 1
538 ELSE
539 uns_perm_to_be_done = 0
540 ENDIF
541 ENDIF
542 CALL mpi_bcast(row_or_col_indices,1,mpi_integer,master,
543 & id%COMM,ierr_mpi)
544 CALL mpi_bcast(uns_perm_to_be_done,1,mpi_integer,master,
545 & id%COMM,ierr_mpi)
546 IF ( i_am_slave ) THEN
547 IF (id%KEEP(89) .GT. 0) THEN
548 IF (.NOT. associated(id%IRHS_loc)) THEN
549 id%INFO(1)=-22
550 id%INFO(2)=17
551 ELSE IF (size(id%IRHS_loc) < id%KEEP(89) ) THEN
552 id%INFO(1)=-22
553 id%INFO(2)=17
554 ENDIF
555 ENDIF
556 ENDIF
557 CALL mumps_propinfo( id%ICNTL(1),
558 & id%INFO(1),
559 & id%COMM, id%MYID )
560 IF (id%INFO(1).LT.0) goto 500
561 IF (i_am_slave) THEN
562 IF (associated(id%IRHS_loc)) THEN
563 IF (size(id%IRHS_loc) .GT. 0) THEN
564 idirhs_loc => id%IRHS_loc
565 ELSE
566 idirhs_loc => idummy
567 ENDIF
568 ELSE
569 idirhs_loc => idummy
570 ENDIF
571 CALL mumps_build_irhs_loc(id%MYID_NODES, id%NSLAVES, id%N,
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)
576 ENDIF
577 IF (uns_perm_to_be_done .EQ. 1) THEN
578 IF (id%MYID.NE.master) THEN
579 ALLOCATE(uns_perm(id%N),stat=allocok)
580 IF (allocok > 0) THEN
581 id%INFO(1)=-13
582 id%INFO(2)=id%N
583 GOTO 100
584 ENDIF
585 ENDIF
586 100 CONTINUE
587 CALL mumps_propinfo( id%ICNTL(1),
588 & id%INFO(1),
589 & id%COMM, id%MYID )
590 IF (id%INFO(1) .LT. 0) GOTO 500
591 IF ( id%MYID .EQ. master ) THEN
592 uns_perm => id%UNS_PERM
593 ENDIF
594 CALL mpi_bcast(uns_perm(1),id%N,mpi_integer,master,
595 & id%COMM,ierr_mpi)
596 IF (i_am_slave .AND. id%KEEP(89) .NE.0) THEN
597 DO i=1, id%KEEP(89)
598 id%IRHS_loc(i)=uns_perm(id%IRHS_loc(i))
599 ENDDO
600 ENDIF
601 ENDIF
602 500 CONTINUE
603 IF (id%MYID.NE.master) THEN
604 IF (associated(uns_perm)) DEALLOCATE(uns_perm)
605 ENDIF
606 NULLIFY(uns_perm)
607 RETURN
608 END SUBROUTINE cmumps_sol_init_irhs_loc
#define mumps_abort
Definition VE_Metis.h:25
subroutine mumps_propinfo(icntl, info, comm, id)
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 cmumps_dr_build_nbrowstorecv()
subroutine cmumps_sol_init_irhs_loc(id)
#define min(a, b)
Definition macros.h:20
subroutine mpi_allreduce(sendbuf, recvbuf, cnt, datatype, operation, comm, ierr)
Definition mpi.f:103
subroutine mpi_bcast(buffer, cnt, datatype, root, comm, ierr)
Definition mpi.f:205
initmumps id
subroutine mumps_build_irhs_loc(myid_nodes, nslaves, n, ptrist, keep, keep8, iw, liw, step, procnode_steps, irhs_loc, row_or_col_indices)
Definition sol_common.F:55