OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
dfac_process_message.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
14 RECURSIVE SUBROUTINE dmumps_traiter_message(
15 & COMM_LOAD, ASS_IRECV,
16 & MSGSOU, MSGTAG, MSGLEN,
17 & BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
18 & IWPOS, IWPOSCB, IPTRLU,
19 & LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
20 & PTLUST, PTRFAC,
21 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
22 & IFLAG, IERROR, COMM,
23 & PERM, IPOOL, LPOOL, LEAF, NBFIN, MYID, SLAVEF,
24 &
25 & root, OPASSW, OPELIW, ITLOC, RHS_MUMPS,
26 & FILS, DAD, PTRARW, PTRAIW,
27 & INTARR, DBLARR, ICNTL, KEEP,KEEP8,DKEEP, ND, FRERE,
28 & LPTRAR, NELT, FRTPTR, FRTELT,
29 &
30 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
31 & , LRGROUPS
32 & )
33 USE dmumps_load
34 USE dmumps_struc_def, ONLY : dmumps_root_struc
35 IMPLICIT NONE
36 include 'mumps_headers.h'
37 TYPE (DMUMPS_ROOT_STRUC) :: root
38 INTEGER msgsou, msgtag, msglen
39 INTEGER lbufr, lbufr_bytes
40 INTEGER bufr( lbufr )
41 INTEGER keep(500), icntl( 60 )
42 INTEGER(8) keep8(150)
43 DOUBLE PRECISION dkeep(230)
44 INTEGER(8) :: posfac, iptrlu, lrlu, lrlus, la
45 INTEGER iwpos, iwposcb
46 INTEGER n, liw
47 INTEGER iw( liw )
48 INTEGER, intent(in) :: lrgroups(n)
49 DOUBLE PRECISION a( la )
50 INTEGER(8) :: ptrfac(keep(28))
51 INTEGER(8) :: ptrast(keep(28))
52 INTEGER(8) :: pamaster(keep(28))
53 INTEGER ptrist(keep(28)), ptlust(keep(28))
54 INTEGER step(n), pimaster(keep(28))
55 INTEGER comp
56 INTEGER nstk_s(keep(28)), procnode_steps( keep(28) )
57 INTEGER perm(n)
58 INTEGER iflag, ierror, comm
59 INTEGER lpool, leaf
60 INTEGER ipool( lpool )
61 INTEGER comm_load, ass_irecv
62 INTEGER myid, slavef, nbfin
63 DOUBLE PRECISION opassw, opeliw
64 INTEGER nelt, lptrar
65 INTEGER frtptr( n+1), frtelt( nelt )
66 INTEGER itloc( n+keep(253) ), fils( n ), dad(keep(28))
67 DOUBLE PRECISION :: rhs_mumps(keep(255))
68 INTEGER(8), INTENT(IN) :: ptrarw( lptrar ), ptraiw( lptrar )
69 INTEGER nd( keep(28) ), frere( keep(28) )
70 INTEGER istep_to_iniv2(keep(71)),
71 & tab_pos_in_pere(slavef+2,max(1,keep(56)))
72 INTEGER intarr( keep8(27) )
73 DOUBLE PRECISION dblarr( keep8(26) )
74 INTEGER iniv2, ishift, ibeg
75 INTEGER ishift_hdr
78 LOGICAL flag
79 INTEGER mp, lp
80 INTEGER tmp( 2 )
81 INTEGER nbrecu, position, inode, ison, iroot
82 INTEGER nslaves_pere, nfront_pere, nass_pere,
83 & lmap, fpere, nelim,
84 & hdmaplig,nfs4father,
85 & tot_root_size, tot_cont_to_recv
86 DOUBLE PRECISION flop1
87 CHARACTER(LEN=35) :: subname
88 include 'mumps_tags.h'
89 include 'mpif.h'
90 INTEGER :: ierr
91 INTEGER :: status(mpi_status_size)
92 mp = icntl(2)
93 lp = icntl(1)
94 subname="??????"
95 CALL dmumps_load_recv_msgs(comm_load)
96 IF ( msgtag .EQ. racine ) THEN
97 position = 0
98 CALL mpi_unpack( bufr, lbufr_bytes, position, nbrecu,
99 & 1, mpi_integer, comm, ierr)
100 nbrecu = bufr( 1 )
101 nbfin = nbfin - nbrecu
102 ELSEIF ( msgtag .EQ. noeud ) THEN
103 CALL dmumps_process_node( myid, keep, keep8, dkeep,
104 & bufr, lbufr, lbufr_bytes,
105 & iwpos, iwposcb, iptrlu,
106 & lrlu, lrlus, n, iw, liw, a, la, slavef, procnode_steps, dad,
107 & ptrist, ptrast,
108 & step, pimaster, pamaster,
109 & nstk_s, comp, fpere, flag, iflag, ierror, comm,
110 & itloc, rhs_mumps )
111 subname="dmumps_process_node"
112.LT. IF ( IFLAG 0 ) GO TO 500
113 IF ( FLAG ) THEN
114 CALL DMUMPS_INSERT_POOL_N(N, IPOOL, LPOOL,
115 & PROCNODE_STEPS, SLAVEF, KEEP(199), KEEP(28), KEEP(76),
116 & KEEP(80), KEEP(47), STEP, FPERE )
117.GE. IF (KEEP(47) 3) THEN
118 CALL DMUMPS_LOAD_POOL_UPD_NEW_POOL(
119 & IPOOL, LPOOL,
120 & PROCNODE_STEPS, KEEP,KEEP8, SLAVEF, COMM_LOAD,
121 & MYID, STEP, N, ND, FILS )
122 ENDIF
123 CALL MUMPS_ESTIM_FLOPS( FPERE, N,
124 & PROCNODE_STEPS,KEEP(199),
125 & ND, FILS, FRERE, STEP, PIMASTER,
126 & KEEP(28), KEEP(50), KEEP(253), FLOP1,
127 & IW, LIW, KEEP(IXSZ) )
128.NE. IF (FPEREKEEP(20))
129 & CALL DMUMPS_LOAD_UPDATE(1,.FALSE.,FLOP1,KEEP,KEEP8)
130 ENDIF
131.EQ. ELSEIF ( MSGTAG END_NIV2_LDLT ) THEN
132 INODE = BUFR( 1 )
133 CALL DMUMPS_INSERT_POOL_N(N, IPOOL, LPOOL,
134 & PROCNODE_STEPS, SLAVEF, KEEP(199),
135 & KEEP(28), KEEP(76), KEEP(80), KEEP(47),
136 & STEP, -INODE )
137.GE. IF (KEEP(47) 3) THEN
138 CALL DMUMPS_LOAD_POOL_UPD_NEW_POOL(
139 & IPOOL, LPOOL,
140 & PROCNODE_STEPS, KEEP,KEEP8, SLAVEF, COMM_LOAD,
141 & MYID, STEP, N, ND, FILS )
142 ENDIF
143.EQ. ELSEIF ( MSGTAG TERREUR ) THEN
144 IFLAG = -001
145 IERROR = MSGSOU
146 GOTO 100
147.EQ. ELSEIF ( MSGTAG MAITRE_DESC_BANDE ) THEN
148 CALL DMUMPS_PROCESS_DESC_BANDE( MYID,BUFR, LBUFR,
149 & LBUFR_BYTES, IWPOS,
150 & IWPOSCB,
151 & IPTRLU, LRLU, LRLUS,
152 & N, IW, LIW, A, LA, SLAVEF, PROCNODE_STEPS, DAD,
153 & PTRIST, PTRAST, STEP, PIMASTER, PAMASTER, COMP,
154 & KEEP, KEEP8, DKEEP, ITLOC, RHS_MUMPS, ISTEP_TO_INIV2,
155#if ! defined (NO_FDM_DESCBAND)
156 & -1,
157#endif
158 & IFLAG, IERROR )
160.LT. IF ( IFLAG 0 ) GO to 500
161.EQ. ELSEIF ( MSGTAG MAITRE2 ) THEN
162 CALL DMUMPS_PROCESS_MASTER2(MYID,BUFR, LBUFR, LBUFR_BYTES,
163 & PROCNODE_STEPS, SLAVEF, IWPOS, IWPOSCB,
164 & IPTRLU, LRLU, LRLUS, N, IW, LIW, A, LA,
165 & PTRIST, PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
166 & IFLAG, IERROR, COMM, COMM_LOAD,
167 & IPOOL, LPOOL, LEAF,
168 & KEEP, KEEP8, DKEEP, ND, FILS, DAD, FRERE, ITLOC, RHS_MUMPS,
169 & ISTEP_TO_INIV2, TAB_POS_IN_PERE )
170 SUBNAME="dmumps_process_master2"
171.LT. IF ( IFLAG 0 ) GO to 500
172.EQ..OR. ELSEIF ( MSGTAG BLOC_FACTO
173.EQ. & MSGTAG BLOC_FACTO_RELAY ) THEN
174 CALL DMUMPS_PROCESS_BLOCFACTO( COMM_LOAD, ASS_IRECV,
175 & BUFR, LBUFR, LBUFR_BYTES,
176 & PROCNODE_STEPS, MSGSOU,
177 & SLAVEF, IWPOS, IWPOSCB, IPTRLU, LRLU, LRLUS, N, IW, LIW,
178 & A, LA, PTRIST, PTRAST, NSTK_S, PERM,
179 & COMP, STEP, PIMASTER, PAMASTER, POSFAC,
180 & MYID, COMM , IFLAG, IERROR, NBFIN,
181 &
182 & PTLUST, PTRFAC, root, OPASSW, OPELIW, ITLOC, RHS_MUMPS,
183 & FILS, DAD, PTRARW, PTRAIW, INTARR, DBLARR,
184 & ICNTL, KEEP,KEEP8,DKEEP, IPOOL, LPOOL, LEAF, ND, FRERE,
185 & LPTRAR, NELT, FRTPTR, FRTELT,
186 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
187 & , LRGROUPS
188 & )
189.EQ. ELSEIF ( MSGTAG BLOC_FACTO_SYM_SLAVE ) THEN
190 CALL DMUMPS_PROCESS_BLFAC_SLAVE( COMM_LOAD, ASS_IRECV,
191 & BUFR, LBUFR,
192 & LBUFR_BYTES, PROCNODE_STEPS, MSGSOU,
193 & SLAVEF, IWPOS, IWPOSCB, IPTRLU, LRLU, LRLUS, N, IW, LIW,
194 & A, LA, PTRIST, PTRAST, NSTK_S, PERM,
195 & COMP, STEP, PIMASTER, PAMASTER, POSFAC,
196 & MYID, COMM, IFLAG, IERROR, NBFIN,
197 &
198 & PTLUST, PTRFAC, root, OPASSW, OPELIW, ITLOC, RHS_MUMPS,
199 & FILS, DAD, PTRARW, PTRAIW, INTARR, DBLARR,
200 & ICNTL, KEEP,KEEP8,DKEEP, IPOOL, LPOOL, LEAF, ND, FRERE,
201 & LPTRAR, NELT, FRTPTR, FRTELT,
202 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
203 & , LRGROUPS
204 & )
205.EQ. ELSEIF ( MSGTAG BLOC_FACTO_SYM ) THEN
206 CALL DMUMPS_PROCESS_SYM_BLOCFACTO( COMM_LOAD, ASS_IRECV,
207 & BUFR, LBUFR,
208 & LBUFR_BYTES, PROCNODE_STEPS, MSGSOU,
209 & SLAVEF, IWPOS, IWPOSCB, IPTRLU, LRLU, LRLUS, N, IW, LIW,
210 & A, LA, PTRIST, PTRAST, NSTK_S, PERM,
211 & COMP, STEP, PIMASTER, PAMASTER, POSFAC,
212 & MYID, COMM, IFLAG, IERROR, NBFIN,
213 &
214 & PTLUST, PTRFAC, root, OPASSW, OPELIW, ITLOC, RHS_MUMPS,
215 & FILS, DAD, PTRARW, PTRAIW, INTARR, DBLARR,
216 & ICNTL,KEEP,KEEP8,DKEEP,IPOOL, LPOOL, LEAF, ND, FRERE,
217 & LPTRAR, NELT, FRTPTR, FRTELT,
218 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
219 & , LRGROUPS
220 & )
221.EQ. ELSEIF ( MSGTAG CONTRIB_TYPE2 ) THEN
222 CALL DMUMPS_PROCESS_CONTRIB_TYPE2( COMM_LOAD, ASS_IRECV,
223 & MSGLEN, BUFR, LBUFR,
224 & LBUFR_BYTES, PROCNODE_STEPS,
225 & SLAVEF, IWPOS, IWPOSCB, IPTRLU, LRLU, LRLUS, POSFAC,
226 & N, IW, LIW, A, LA, PTRIST,
227 & PTLUST, PTRFAC, PTRAST,
228 & STEP, PIMASTER, PAMASTER, PERM, COMP, root,
229 & OPASSW, OPELIW, ITLOC, RHS_MUMPS, NSTK_S, FILS, DAD,
230 & PTRARW, PTRAIW, INTARR, DBLARR, NBFIN, MYID, COMM,
231 & ICNTL,KEEP,KEEP8,DKEEP,IFLAG, IERROR, IPOOL, LPOOL, LEAF,
232 & ND, FRERE, LPTRAR, NELT, FRTPTR, FRTELT,
233 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
234 & , LRGROUPS
235 & )
236.LT. IF ( IFLAG 0 ) GO TO 100
237.EQ. ELSEIF ( MSGTAG MAPLIG ) THEN
238 HDMAPLIG = 7
239 INODE = BUFR( 1 )
240 ISON = BUFR( 2 )
241 NSLAVES_PERE = BUFR( 3 )
242 NFRONT_PERE = BUFR( 4 )
243 NASS_PERE = BUFR( 5 )
244 LMAP = BUFR( 6 )
245 NFS4FATHER = BUFR( 7 )
246.NE. IF ( NSLAVES_PERE0 ) THEN
247 INIV2 = ISTEP_TO_INIV2 ( STEP(INODE) )
248 ISHIFT = NSLAVES_PERE+1
249 TAB_POS_IN_PERE(1:NSLAVES_PERE+1, INIV2) =
250 & BUFR(HDMAPLIG+1:HDMAPLIG+1+NSLAVES_PERE)
251 TAB_POS_IN_PERE(SLAVEF+2, INIV2) = NSLAVES_PERE
252 ELSE
253 ISHIFT = 0
254 ENDIF
255 IBEG = HDMAPLIG+1+ISHIFT
256 CALL DMUMPS_MAPLIG( COMM_LOAD, ASS_IRECV,
257 & BUFR, LBUFR, LBUFR_BYTES,
258 & INODE, ISON, NSLAVES_PERE,
259 & BUFR(IBEG),
260 & NFRONT_PERE, NASS_PERE, NFS4FATHER,LMAP,
261 & BUFR(IBEG+NSLAVES_PERE),
262 & PROCNODE_STEPS, SLAVEF, POSFAC, IWPOS, IWPOSCB,
263 & IPTRLU, LRLU, LRLUS, N, IW, LIW, A, LA,
264 & PTRIST, PTLUST, PTRFAC, PTRAST, STEP, PIMASTER, PAMASTER,
265 & NSTK_S, COMP,
266 & IFLAG, IERROR, MYID, COMM, PERM,
267 & IPOOL, LPOOL, LEAF, NBFIN, ICNTL, KEEP,KEEP8,DKEEP, root,
268 & OPASSW, OPELIW,
269 & ITLOC, RHS_MUMPS, FILS, DAD, PTRARW, PTRAIW, INTARR, DBLARR,
270 & ND, FRERE, LPTRAR, NELT, FRTPTR, FRTELT,
271 &
272 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
273 & , LRGROUPS
274 & )
275.LT. IF ( IFLAG 0 ) GO TO 100
276.EQ. ELSE IF ( MSGTAG ROOT_CONT_STATIC ) THEN
277 CALL DMUMPS_PROCESS_CONTRIB_TYPE3(
278 & BUFR, LBUFR, LBUFR_BYTES,
279 & root, N, IW, LIW, A, LA,
280 & LRLU, IPTRLU, IWPOS, IWPOSCB,
281 & PTRIST, PTLUST, PTRFAC, PTRAST,
282 & STEP, PIMASTER, PAMASTER,
283 & COMP, LRLUS, IPOOL, LPOOL, LEAF,
284 & FILS, DAD, MYID,
285 & LPTRAR, NELT, FRTPTR, FRTELT,
286 & PTRAIW, PTRARW, INTARR, DBLARR,
287 & KEEP, KEEP8, DKEEP, IFLAG, IERROR, COMM, COMM_LOAD,
288 & ITLOC, RHS_MUMPS,
289 & ND, PROCNODE_STEPS, SLAVEF, OPASSW)
291.LT. IF ( IFLAG 0 ) GO TO 500
292.EQ. ELSE IF ( MSGTAG ROOT_NON_ELIM_CB ) THEN
293 IROOT = KEEP( 38 )
294 MSGSOU = MUMPS_PROCNODE( PROCNODE_STEPS(STEP(IROOT)),
295 & KEEP(199) )
296.EQ. IF ( PTLUST( STEP(IROOT)) 0 ) THEN
297 KEEP(266)=KEEP(266)-1
298 CALL MPI_RECV( TMP, 2 * KEEP(34), MPI_PACKED,
299 & MSGSOU, ROOT_2SLAVE,
300 & COMM, STATUS, IERR )
301 CALL DMUMPS_PROCESS_ROOT2SLAVE( TMP( 1 ), TMP( 2 ),
302 & root,
303 & BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
304 & IWPOS, IWPOSCB, IPTRLU,
305 & LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
306 & PTLUST, PTRFAC,
307 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
308 & IFLAG, IERROR, COMM, COMM_LOAD,
309 & IPOOL, LPOOL, LEAF,
310 & NBFIN, MYID, SLAVEF,
311 &
312 & OPASSW, OPELIW, ITLOC, RHS_MUMPS, FILS, DAD,
313 & LPTRAR, NELT, FRTPTR, FRTELT,
314 & PTRARW, PTRAIW,
315 & INTARR, DBLARR, ICNTL, KEEP,KEEP8, DKEEP,ND )
317.LT. IF ( IFLAG 0 ) GOTO 500
318 END IF
319 CALL DMUMPS_PROCESS_CONTRIB_TYPE3(
320 & BUFR, LBUFR, LBUFR_BYTES,
321 & root, N, IW, LIW, A, LA,
322 & LRLU, IPTRLU, IWPOS, IWPOSCB,
323 & PTRIST, PTLUST, PTRFAC, PTRAST, STEP, PIMASTER, PAMASTER,
324 & COMP, LRLUS, IPOOL, LPOOL, LEAF,
325 & FILS, DAD, MYID,
326 & LPTRAR, NELT, FRTPTR, FRTELT,
327 & PTRAIW, PTRARW, INTARR, DBLARR,
328 & KEEP, KEEP8, DKEEP, IFLAG, IERROR, COMM, COMM_LOAD,
329 & ITLOC, RHS_MUMPS,
330 & ND, PROCNODE_STEPS, SLAVEF, OPASSW )
332.LT. IF ( IFLAG 0 ) GO TO 500
333.EQ. ELSE IF ( MSGTAG ROOT_2SON ) THEN
334 ISON = BUFR( 1 )
335 NELIM = BUFR( 2 )
336 CALL DMUMPS_PROCESS_ROOT2SON( COMM_LOAD, ASS_IRECV,
337 & ISON, NELIM, root,
338 & BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
339 & IWPOS, IWPOSCB, IPTRLU,
340 & LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
341 & PTLUST, PTRFAC,
342 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
343 & IFLAG, IERROR, COMM,
344 & PERM, IPOOL, LPOOL, LEAF, NBFIN, MYID, SLAVEF,
345 &
346 & OPASSW, OPELIW, ITLOC, RHS_MUMPS,
347 & FILS, DAD, PTRARW, PTRAIW,
348 & INTARR,DBLARR,ICNTL,KEEP,KEEP8,DKEEP,ND, FRERE,
349 & LPTRAR, NELT, FRTPTR, FRTELT,
350 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
351 & , LRGROUPS
352 & )
353.LT. IF ( IFLAG 0 ) GO TO 100
354.NE. IF ( MYIDMUMPS_PROCNODE(PROCNODE_STEPS(STEP(ISON)),
355 & KEEP(199)) ) THEN
356.EQ. IF (KEEP(50)0) THEN
357 ISHIFT_HDR = 6
358 ELSE
359 ISHIFT_HDR = 8
360 ENDIF
361.EQ. IF (IW(PTRIST(STEP(ISON))+ISHIFT_HDR+KEEP(IXSZ))
362 & S_REC_CONTSTATIC) THEN
363 IW(PTRIST(STEP(ISON))+ISHIFT_HDR+KEEP(IXSZ)) =
364 & S_ROOT2SON_CALLED
365 ELSE
366 CALL DMUMPS_FREE_BAND( N, ISON, PTRIST, PTRAST,
367 & IW, LIW, A, LA, LRLU, LRLUS, IWPOSCB,
368 & IPTRLU, STEP, MYID, KEEP, KEEP8,
369 & MUMPS_TYPENODE(PROCNODE_STEPS(STEP(ISON)),KEEP(199))
370 & )
371 ENDIF
372 ENDIF
373.EQ. ELSE IF ( MSGTAG ROOT_2SLAVE ) THEN
374 TOT_ROOT_SIZE = BUFR( 1 )
375 TOT_CONT_TO_RECV = BUFR( 2 )
376 CALL DMUMPS_PROCESS_ROOT2SLAVE( TOT_ROOT_SIZE,
377 & TOT_CONT_TO_RECV, root,
378 & BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
379 & IWPOS, IWPOSCB, IPTRLU,
380 & LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
381 & PTLUST, PTRFAC,
382 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
383 & IFLAG, IERROR, COMM, COMM_LOAD,
384 & IPOOL, LPOOL, LEAF,
385 & NBFIN, MYID, SLAVEF,
386 &
387 & OPASSW, OPELIW, ITLOC, RHS_MUMPS, FILS, DAD,
388 & LPTRAR, NELT, FRTPTR, FRTELT,
389 & PTRARW, PTRAIW,
390 & INTARR, DBLARR, ICNTL, KEEP,KEEP8, DKEEP, ND )
391.LT. IF ( IFLAG 0 ) GO TO 100
392.EQ. ELSE IF ( MSGTAG ROOT_NELIM_INDICES ) THEN
393 ISON = BUFR( 1 )
394 NELIM = BUFR( 2 )
395 NSLAVES_PERE = BUFR( 3 )
396 CALL DMUMPS_PROCESS_RTNELIND( root,
397 & ISON, NELIM, NSLAVES_PERE, BUFR(4), BUFR(4+BUFR(2)),
398 & BUFR(4+2*BUFR(2)),
399 &
400 & PROCNODE_STEPS,
401 & IWPOS, IWPOSCB, IPTRLU,
402 & LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
403 & PTLUST, PTRFAC,
404 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S,
405 & ITLOC, RHS_MUMPS, COMP,
406 & IFLAG, IERROR,
407 & IPOOL, LPOOL, LEAF, MYID, SLAVEF,
408 & KEEP, KEEP8, DKEEP,
409 & COMM, COMM_LOAD, FILS, DAD, ND)
411.LT. IF ( IFLAG 0 ) GO TO 500
412.EQ. ELSE IF ( MSGTAG UPDATE_LOAD ) THEN
413 WRITE(*,*) "internal error 3 in dmumps_traiter_message"
414 CALL MUMPS_ABORT()
415.EQ. ELSE IF ( MSGTAG TAG_DUMMY ) THEN
416 ELSE
417 IF ( LP > 0 )
418 & WRITE(LP,*) MYID,
419 &': Internal error, routine DMUMPS_TRAITER_MESSAGE.',MSGTAG
420 IFLAG = -100
421 IERROR= MSGTAG
422 GOTO 500
423 ENDIF
424 100 CONTINUE
425 RETURN
426 500 CONTINUE
427.GT..AND..GE. IF ( ICNTL(1) 0 ICNTL(4)1 ) THEN
428 LP=ICNTL(1)
429.EQ. IF (IFLAG-9) THEN
430 WRITE(LP,*) 'FAILURE, WORKSPACE TOO SMALL DURING ',SUBNAME
431 ENDIF
432.EQ. IF (IFLAG-8) THEN
433 WRITE(LP,*) 'FAILURE IN INTEGER ALLOCATION DURING ',SUBNAME
434 ENDIF
435.EQ. IF (IFLAG-13) THEN
436 WRITE(LP,*) 'FAILURE IN DYNAMIC ALLOCATION DURING ',SUBNAME
437 ENDIF
438 ENDIF
439 CALL DMUMPS_BDC_ERROR( MYID, SLAVEF, COMM, KEEP )
440 RETURN
441 END SUBROUTINE DMUMPS_TRAITER_MESSAGE
442 RECURSIVE SUBROUTINE DMUMPS_RECV_AND_TREAT(
443 & COMM_LOAD, ASS_IRECV,
444 & STATUS,
445 & BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
446 & IWPOS, IWPOSCB, IPTRLU,
447 & LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
448 & PTLUST, PTRFAC,
449 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
450 & IFLAG, IERROR, COMM,
451 & PERM, IPOOL, LPOOL, LEAF, NBFIN, MYID, SLAVEF,
452 &
453 & root, OPASSW, OPELIW, ITLOC, RHS_MUMPS,
454 & FILS, DAD, PTRARW, PTRAIW,
455 & INTARR, DBLARR, ICNTL, KEEP,KEEP8,DKEEP, ND, FRERE,
456 & LPTRAR, NELT, FRTPTR, FRTELT ,
457 &
458 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
459 & , LRGROUPS
460 & )
461 USE DMUMPS_STRUC_DEF, ONLY : DMUMPS_ROOT_STRUC
462 IMPLICIT NONE
463 INCLUDE 'mpif.h'
464 INCLUDE 'mumps_tags.h'
465 TYPE (DMUMPS_ROOT_STRUC) :: root
466 INTEGER :: STATUS(MPI_STATUS_SIZE)
467 INTEGER KEEP(500), ICNTL(60)
468 INTEGER(8) KEEP8(150)
469 DOUBLE PRECISION DKEEP(230)
470 INTEGER COMM_LOAD, ASS_IRECV
471 INTEGER LBUFR, LBUFR_BYTES
472 INTEGER BUFR( LBUFR )
473 INTEGER(8) :: POSFAC, LA, IPTRLU, LRLU, LRLUS
474 INTEGER IWPOS, IWPOSCB
475 INTEGER N, LIW
476 INTEGER IW( LIW )
477 DOUBLE PRECISION A( LA )
478 INTEGER, intent(in) :: LRGROUPS(N)
479 INTEGER(8) :: PTRFAC(KEEP(28))
480 INTEGER(8) :: PTRAST(KEEP(28))
481 INTEGER(8) :: PAMASTER(KEEP(28))
482 INTEGER PTRIST( KEEP(28) ),
483 & PTLUST( KEEP(28) )
484 INTEGER STEP(N), PIMASTER(KEEP(28))
485 INTEGER COMP
486 INTEGER NSTK_S(KEEP(28)), PROCNODE_STEPS( KEEP(28) )
487 INTEGER PERM(N)
488 INTEGER IFLAG, IERROR, COMM
489 INTEGER LPOOL, LEAF
490 INTEGER IPOOL( LPOOL )
491 INTEGER MYID, SLAVEF, NBFIN
492 DOUBLE PRECISION OPASSW, OPELIW
493 INTEGER NELT, LPTRAR
494 INTEGER FRTPTR( N+1 ), FRTELT( NELT )
495 INTEGER ITLOC( N+KEEP(253) ), FILS( N ), DAD( KEEP(28) )
496 DOUBLE PRECISION :: RHS_MUMPS(KEEP(255))
497 INTEGER(8), INTENT(IN) :: PTRARW( LPTRAR ), PTRAIW( LPTRAR )
498 INTEGER ND( KEEP(28) ), FRERE( KEEP(28) )
499 INTEGER ISTEP_TO_INIV2(KEEP(71)),
500 & TAB_POS_IN_PERE(SLAVEF+2,max(1,KEEP(56)))
501 INTEGER INTARR( KEEP8(27) )
502 DOUBLE PRECISION DBLARR( KEEP8(26) )
503 INTEGER MSGSOU, MSGTAG, MSGLEN, IERR
504 MSGSOU = STATUS( MPI_SOURCE )
505 MSGTAG = STATUS( MPI_TAG )
506 CALL MPI_GET_COUNT( STATUS, MPI_PACKED, MSGLEN, IERR )
507.GT. IF ( MSGLEN LBUFR_BYTES ) THEN
508 IFLAG = -20
509 IERROR = MSGLEN
510 WRITE(*,*) ' RECEPTION BUF TOO SMALL, Msgtag/len=',
511 & MSGTAG,MSGLEN
512 CALL DMUMPS_BDC_ERROR( MYID, SLAVEF, COMM, KEEP )
513 RETURN
514 ENDIF
515 KEEP(266)=KEEP(266)-1
516 CALL MPI_RECV( BUFR, LBUFR_BYTES, MPI_PACKED, MSGSOU,
517 & MSGTAG,
518 & COMM, STATUS, IERR )
519 CALL DMUMPS_TRAITER_MESSAGE(
520 & COMM_LOAD, ASS_IRECV,
521 & MSGSOU, MSGTAG, MSGLEN, BUFR, LBUFR,
522 & LBUFR_BYTES,
523 & PROCNODE_STEPS, POSFAC,
524 & IWPOS, IWPOSCB, IPTRLU,
525 & LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
526 & PTLUST, PTRFAC,
527 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP, IFLAG,
528 & IERROR, COMM,
529 & PERM, IPOOL, LPOOL, LEAF, NBFIN, MYID, SLAVEF,
530 &
531 & root, OPASSW, OPELIW, ITLOC, RHS_MUMPS,
532 & FILS, DAD, PTRARW, PTRAIW,
533 & INTARR, DBLARR, ICNTL, KEEP,KEEP8,DKEEP, ND, FRERE,
534 & LPTRAR, NELT, FRTPTR, FRTELT,
535 &
536 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
537 & , LRGROUPS
538 & )
539 RETURN
540 END SUBROUTINE DMUMPS_RECV_AND_TREAT
541 RECURSIVE SUBROUTINE DMUMPS_TRY_RECVTREAT(
542 & COMM_LOAD, ASS_IRECV, BLOCKING, SET_IRECV,
543 & MESSAGE_RECEIVED, MSGSOU, MSGTAG,
544 & STATUS,
545 & BUFR, LBUFR, LBUFR_BYTES, PROCNODE_STEPS, POSFAC,
546 & IWPOS, IWPOSCB, IPTRLU,
547 & LRLU, LRLUS, N, IW, LIW, A, LA, PTRIST,
548 & PTLUST, PTRFAC,
549 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP,
550 & IFLAG, IERROR, COMM, PERM,
551 & IPOOL, LPOOL, LEAF, NBFIN, MYID, SLAVEF,
552 &
553 & root, OPASSW, OPELIW, ITLOC, RHS_MUMPS,
554 & FILS, DAD, PTRARW, PTRAIW,
555 & INTARR, DBLARR, ICNTL, KEEP,KEEP8,DKEEP, ND, FRERE,
556 & LPTRAR, NELT, FRTPTR, FRTELT,
557 &
558 & ISTEP_TO_INIV2, TAB_POS_IN_PERE,
559 & STACK_RIGHT_AUTHORIZED, LRGROUPS )
560 USE DMUMPS_LOAD
561 USE DMUMPS_STRUC_DEF, ONLY : DMUMPS_ROOT_STRUC
562 IMPLICIT NONE
563 INCLUDE 'mpif.h'
564 INCLUDE 'mumps_tags.h'
565 TYPE (DMUMPS_ROOT_STRUC) :: root
566 INTEGER :: STATUS(MPI_STATUS_SIZE)
567 LOGICAL, INTENT (IN) :: BLOCKING
568 LOGICAL, INTENT (IN) :: SET_IRECV
569 LOGICAL, INTENT (INOUT) :: MESSAGE_RECEIVED
570 INTEGER, INTENT (IN) :: MSGSOU, MSGTAG
571 INTEGER KEEP(500), ICNTL(60)
572 INTEGER(8) KEEP8(150)
573 DOUBLE PRECISION DKEEP(230)
574 INTEGER LBUFR, LBUFR_BYTES
575 INTEGER COMM_LOAD, ASS_IRECV
576 INTEGER BUFR( LBUFR )
577 INTEGER(8) :: LA, POSFAC, IPTRLU, LRLU, LRLUS
578 INTEGER IWPOS, IWPOSCB
579 INTEGER N, LIW
580 INTEGER IW( LIW )
581 DOUBLE PRECISION A( LA )
582 INTEGER, intent(in) :: LRGROUPS(N)
583 INTEGER(8) :: PTRAST(KEEP(28))
584 INTEGER(8) :: PTRFAC(KEEP(28))
585 INTEGER(8) :: PAMASTER(KEEP(28))
586 INTEGER PTRIST( KEEP(28) ),
587 & PTLUST(KEEP(28))
588 INTEGER STEP(N),
589 & PIMASTER(KEEP(28))
590 INTEGER COMP
591 INTEGER NSTK_S(KEEP(28)), PROCNODE_STEPS( KEEP(28) )
592 INTEGER PERM(N)
593 INTEGER IFLAG, IERROR, COMM
594 INTEGER LPOOL, LEAF
595 INTEGER IPOOL( LPOOL )
596 INTEGER MYID, SLAVEF, NBFIN
597 DOUBLE PRECISION OPASSW, OPELIW
598 INTEGER NELT, LPTRAR
599 INTEGER FRTPTR( N+1 ), FRTELT( NELT )
600 INTEGER ITLOC( N + KEEP(253) ), FILS( N ), DAD( KEEP(28) )
601 DOUBLE PRECISION :: RHS_MUMPS(KEEP(255))
602 INTEGER(8), INTENT(IN) :: PTRARW( LPTRAR ), PTRAIW( LPTRAR )
603 INTEGER ND( KEEP(28) ), FRERE( KEEP(28) )
604 INTEGER ISTEP_TO_INIV2(KEEP(71)),
605 & TAB_POS_IN_PERE(SLAVEF+2,max(1,KEEP(56)))
606 INTEGER INTARR( KEEP8(27) )
607 DOUBLE PRECISION DBLARR( KEEP8(26) )
608 LOGICAL, intent(in) :: STACK_RIGHT_AUTHORIZED
609 LOGICAL FLAG, RIGHT_MESS, FLAGbis
610 INTEGER LP, MSGSOU_LOC, MSGTAG_LOC, MSGLEN_LOC
611 INTEGER IERR
612 INTEGER :: STATUS_BIS(MPI_STATUS_SIZE)
613 INTEGER, SAVE :: RECURS = 0
614 CALL DMUMPS_LOAD_RECV_MSGS(COMM_LOAD)
615.NOT. IF ( STACK_RIGHT_AUTHORIZED ) THEN
616 RETURN
617 ENDIF
618 RECURS = RECURS + 1
619 LP = ICNTL(1)
620.LT. IF (ICNTL(4)1) LP=-1
621 IF ( MESSAGE_RECEIVED ) THEN
622 MSGSOU_LOC = MPI_ANY_SOURCE
623 MSGTAG_LOC = MPI_ANY_TAG
624 GOTO 250
625 ENDIF
626.NE. IF ( ASS_IRECV MPI_REQUEST_NULL) THEN
627.NE. IF (KEEP(117)0) THEN
628 WRITE(*,*) "problem of active irecv with keep(117)=",KEEP(117)
629 CALL MUMPS_ABORT()
630 ENDIF
631 RIGHT_MESS = .TRUE.
632 IF (BLOCKING) THEN
633 CALL MPI_WAIT(ASS_IRECV,
634 & STATUS, IERR)
635 FLAG = .TRUE.
636.NE..OR. IF ( ( (MSGSOUMPI_ANY_SOURCE)
637.NE. & (MSGTAGMPI_ANY_TAG) ) ) THEN
638.NE. IF ( MSGSOUMPI_ANY_SOURCE) THEN
639.EQ. RIGHT_MESS = MSGSOUSTATUS(MPI_SOURCE)
640 ENDIF
641.NE. IF ( MSGTAGMPI_ANY_TAG) THEN
642 RIGHT_MESS =
643.EQ..AND. & ( (MSGTAGSTATUS(MPI_TAG))RIGHT_MESS )
644 ENDIF
645.NOT. IF (RIGHT_MESS) THEN
646 CALL MPI_PROBE(MSGSOU,MSGTAG,
647 & COMM, STATUS_BIS, IERR)
648 ENDIF
649 ENDIF
650 ELSE
651 CALL MPI_TEST(ASS_IRECV,
652 & FLAG, STATUS, IERR)
653 ENDIF
654.LT. IF (IERR0) THEN
655 IFLAG = -20
656.GT. IF (LP0)
657 & write(LP,*) ' Error return from MPI_TEST ',
658 & IFLAG, ' in DMUMPS_TRY_RECVTREAT'
659 CALL DMUMPS_BDC_ERROR( MYID, SLAVEF, COMM, KEEP )
660 RETURN
661 ENDIF
662 IF ( FLAG ) THEN
663 KEEP(266)=KEEP(266)-1
664 MESSAGE_RECEIVED = .TRUE.
665 MSGSOU_LOC = STATUS( MPI_SOURCE )
666 MSGTAG_LOC = STATUS( MPI_TAG )
667 CALL MPI_GET_COUNT( STATUS, MPI_PACKED, MSGLEN_LOC, IERR )
668.NOT. IF (RIGHT_MESS) RECURS = RECURS + 10
669 CALL DMUMPS_TRAITER_MESSAGE( COMM_LOAD, ASS_IRECV,
670 & MSGSOU_LOC, MSGTAG_LOC, MSGLEN_LOC, BUFR, LBUFR,
671 & LBUFR_BYTES,
672 & PROCNODE_STEPS, POSFAC,
673 & IWPOS, IWPOSCB, IPTRLU,
674 & LRLU, LRLUS, N, IW, LIW, A, LA,
675 & PTRIST, PTLUST, PTRFAC,
676 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP, IFLAG,
677 & IERROR, COMM,
678 & PERM, IPOOL, LPOOL, LEAF, NBFIN, MYID, SLAVEF,
679 &
680 & root, OPASSW, OPELIW, ITLOC, RHS_MUMPS, FILS, DAD,
681 & PTRARW, PTRAIW,
682 & INTARR, DBLARR, ICNTL, KEEP,KEEP8,DKEEP, ND, FRERE,
683 & LPTRAR, NELT, FRTPTR, FRTELT,
684 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
685 & , LRGROUPS
686 & )
687.NOT. IF (RIGHT_MESS) RECURS = RECURS - 10
688.LT. IF ( IFLAG 0 ) RETURN
689.NOT. IF (RIGHT_MESS) THEN
690.NE. IF (ASS_IRECV MPI_REQUEST_NULL) THEN
691 CALL MUMPS_ABORT()
692 ENDIF
693 CALL MPI_IPROBE(MSGSOU,MSGTAG,
694 & COMM, FLAGbis, STATUS, IERR)
695 IF (FLAGbis) THEN
696 MSGSOU_LOC = STATUS( MPI_SOURCE )
697 MSGTAG_LOC = STATUS( MPI_TAG )
698 CALL DMUMPS_RECV_AND_TREAT( COMM_LOAD, ASS_IRECV,
699 & STATUS, BUFR, LBUFR,
700 & LBUFR_BYTES,
701 & PROCNODE_STEPS, POSFAC,
702 & IWPOS, IWPOSCB, IPTRLU,
703 & LRLU, LRLUS, N, IW, LIW, A, LA,
704 & PTRIST, PTLUST, PTRFAC,
705 & PTRAST, STEP, PIMASTER, PAMASTER,
706 & NSTK_S, COMP, IFLAG,
707 & IERROR, COMM,
708 & PERM, IPOOL, LPOOL,LEAF,NBFIN,MYID,SLAVEF,
709 &
710 & root, OPASSW, OPELIW, ITLOC, RHS_MUMPS,
711 & FILS, DAD, PTRARW, PTRAIW,
712 & INTARR, DBLARR, ICNTL,
713 & KEEP,KEEP8, DKEEP,ND, FRERE,
714 & LPTRAR, NELT, FRTPTR, FRTELT,
715 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
716 & , LRGROUPS
717 & )
718.LT. IF ( IFLAG 0 ) RETURN
719 ENDIF
720 ENDIF
721 ENDIF
722 ELSE
723 IF (BLOCKING) THEN
724 CALL MPI_PROBE(MSGSOU,MSGTAG,
725 & COMM, STATUS, IERR)
726 FLAG = .TRUE.
727 ELSE
728 CALL MPI_IPROBE( MPI_ANY_SOURCE, MPI_ANY_TAG,
729 & COMM, FLAG, STATUS, IERR)
730 ENDIF
731 IF (FLAG) THEN
732 MSGSOU_LOC = STATUS( MPI_SOURCE )
733 MSGTAG_LOC = STATUS( MPI_TAG )
734 MESSAGE_RECEIVED = .TRUE.
735 CALL DMUMPS_RECV_AND_TREAT( COMM_LOAD, ASS_IRECV,
736 & STATUS, BUFR, LBUFR,
737 & LBUFR_BYTES,
738 & PROCNODE_STEPS, POSFAC,
739 & IWPOS, IWPOSCB, IPTRLU,
740 & LRLU, LRLUS, N, IW, LIW, A, LA,
741 & PTRIST, PTLUST, PTRFAC,
742 & PTRAST, STEP, PIMASTER, PAMASTER, NSTK_S, COMP, IFLAG,
743 & IERROR, COMM,
744 & PERM, IPOOL, LPOOL, LEAF, NBFIN, MYID, SLAVEF,
745 &
746 & root, OPASSW, OPELIW, ITLOC, RHS_MUMPS,
747 & FILS, DAD, PTRARW, PTRAIW,
748 & INTARR, DBLARR, ICNTL, KEEP,KEEP8,DKEEP, ND, FRERE,
749 & LPTRAR, NELT, FRTPTR, FRTELT,
750 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
751 & , LRGROUPS
752 & )
753.LT. IF ( IFLAG 0 ) RETURN
754 ENDIF
755 ENDIF
756 250 CONTINUE
757 RECURS = RECURS - 1
758.EQ. IF ( NBFIN 0 ) RETURN
759.GT. IF ( RECURS 3 ) RETURN
760.EQ..AND..AND. IF ( KEEP(36)1 SET_IRECV
761.EQ..AND. & (ASS_IRECVMPI_REQUEST_NULL)
762 & MESSAGE_RECEIVED ) THEN
763 CALL MPI_IRECV ( BUFR(1),
764 & LBUFR_BYTES, MPI_PACKED, MPI_ANY_SOURCE,
765 & MPI_ANY_TAG, COMM,
766 & ASS_IRECV, IERR )
767 ENDIF
768 RETURN
769 END SUBROUTINE DMUMPS_TRY_RECVTREAT
770 SUBROUTINE DMUMPS_CANCEL_IRECV( INFO1,
771 & KEEP, ASS_IRECV,
772 & BUFR, LBUFR, LBUFR_BYTES,
773 & COMM,
774 & MYID, SLAVEF)
775 USE DMUMPS_BUF
776 IMPLICIT NONE
777 INCLUDE 'mpif.h'
778 INCLUDE 'mumps_tags.h'
779 INTEGER LBUFR, LBUFR_BYTES
780 INTEGER ASS_IRECV
781 INTEGER BUFR( LBUFR )
782 INTEGER COMM
783 INTEGER MYID, SLAVEF, INFO1, DEST
784 INTEGER, INTENT(INOUT) :: KEEP(500)
785 INTEGER :: STATUS(MPI_STATUS_SIZE)
786 LOGICAL NO_ACTIVE_IRECV
787 INTEGER IERR, DUMMY
788 INTRINSIC mod
789.EQ. IF (SLAVEF 1) RETURN
790.EQ. IF (ASS_IRECVMPI_REQUEST_NULL) THEN
791 NO_ACTIVE_IRECV=.TRUE.
792 ELSE
793 CALL MPI_TEST(ASS_IRECV, NO_ACTIVE_IRECV,
794 & STATUS, IERR)
795 IF (NO_ACTIVE_IRECV) THEN
796 KEEP(266) = KEEP(266) - 1
797 ENDIF
798 ENDIF
799 CALL MPI_BARRIER(COMM,IERR)
800 DUMMY = 1
801 DEST = mod(MYID+1, SLAVEF)
802 CALL DMUMPS_BUF_SEND_1INT
803 & (DUMMY, DEST, TAG_DUMMY, COMM, KEEP, IERR)
804 IF (NO_ACTIVE_IRECV) THEN
805 CALL MPI_RECV( BUFR, LBUFR,
806 & MPI_INTEGER, MPI_ANY_SOURCE,
807 & TAG_DUMMY, COMM, STATUS, IERR )
808 ELSE
809 CALL MPI_WAIT(ASS_IRECV,
810 & STATUS, IERR)
811 ENDIF
812 KEEP(266)=KEEP(266)-1
813 RETURN
814 END SUBROUTINE DMUMPS_CANCEL_IRECV
815 SUBROUTINE DMUMPS_CLEAN_PENDING(
816 & INFO1, KEEP, BUFR, LBUFR, LBUFR_BYTES,
817 & COMM_NODES, COMM_LOAD, SLAVEF,
818 & CLEAN_COMM_NODES, CLEAN_COMM_LOAD )
819 USE DMUMPS_BUF
820 IMPLICIT NONE
821 INTEGER, INTENT(IN) :: LBUFR, LBUFR_BYTES
822 INTEGER, INTENT(OUT) :: BUFR( LBUFR )
823 INTEGER, INTENT(IN) :: COMM_NODES, COMM_LOAD, SLAVEF, INFO1
824 INTEGER, INTENT(INOUT) :: KEEP(500)
825 LOGICAL, INTENT(IN) :: CLEAN_COMM_LOAD, CLEAN_COMM_NODES
826 INCLUDE 'mpif.h'
827 INCLUDE 'mumps_tags.h'
828 INTEGER :: STATUS(MPI_STATUS_SIZE)
829 LOGICAL :: FLAG, BUFFERS_EMPTY, BUFFERS_EMPTY_ON_ALL_PROCS
830 INTEGER :: MSGSOU_LOC, MSGTAG_LOC, MSGLEN_LOC
831 INTEGER :: COMM_EFF
832 INTEGER :: IERR
833 INTEGER :: IBUF_EMPTY, IBUF_EMPTY_ON_ALL_PROCS
834 INTEGER :: TOTAL_SEND_MINUS_RECV266
835 INTEGER :: TOTAL_SEND_MINUS_RECV267
836.EQ. IF (SLAVEF1) RETURN
837.NOT..AND..NOT. IF ( CLEAN_COMM_NODES CLEAN_COMM_LOAD) THEN
838 RETURN
839 ENDIF
840 DO WHILE (.TRUE.)
841 FLAG = .TRUE.
842 DO WHILE ( FLAG )
843 FLAG = .FALSE.
844 IF (CLEAN_COMM_NODES) THEN
845.NOT. IF ( FLAG ) THEN
846 COMM_EFF = COMM_NODES
847 CALL MPI_IPROBE(MPI_ANY_SOURCE,MPI_ANY_TAG,
848 & COMM_NODES, FLAG, STATUS, IERR)
849 END IF
850 END IF
851 IF (CLEAN_COMM_LOAD) THEN
852.NOT. IF ( FLAG ) THEN
853 COMM_EFF = COMM_LOAD
854 CALL MPI_IPROBE( MPI_ANY_SOURCE, MPI_ANY_TAG,
855 & COMM_LOAD, FLAG, STATUS, IERR)
856 END IF
857 END IF
858 IF (FLAG) THEN
859 MSGSOU_LOC = STATUS( MPI_SOURCE )
860 MSGTAG_LOC = STATUS( MPI_TAG )
861.EQ. IF (COMM_EFF COMM_NODES) THEN
862 KEEP(266) = KEEP(266) - 1
863 ELSE
864 KEEP(267) = KEEP(267) - 1
865 ENDIF
866 CALL MPI_GET_COUNT( STATUS, MPI_PACKED, MSGLEN_LOC, IERR )
867.LE. IF (MSGLEN_LOC LBUFR_BYTES) THEN
868 CALL MPI_RECV( BUFR, LBUFR_BYTES,
869 & MPI_PACKED, MSGSOU_LOC,
870 & MSGTAG_LOC, COMM_EFF, STATUS, IERR )
871 ENDIF
872 ENDIF
873 END DO
874 CALL DMUMPS_BUF_ALL_EMPTY( CLEAN_COMM_NODES,
875 & CLEAN_COMM_LOAD,
876 & BUFFERS_EMPTY )
877 IF ( BUFFERS_EMPTY ) THEN
878 IBUF_EMPTY = 0
879 ELSE
880 IBUF_EMPTY = 1
881 ENDIF
882 IF (CLEAN_COMM_NODES) THEN
883 COMM_EFF = COMM_NODES
884 ELSE
885 COMM_EFF = COMM_LOAD
886 ENDIF
887 CALL MPI_ALLREDUCE(IBUF_EMPTY,
888 & IBUF_EMPTY_ON_ALL_PROCS,
889 & 1, MPI_INTEGER, MPI_MAX,
890 & COMM_EFF, IERR)
891 IF ( IBUF_EMPTY_ON_ALL_PROCS == 0) THEN
892 BUFFERS_EMPTY_ON_ALL_PROCS = .TRUE.
893 ELSE
894 BUFFERS_EMPTY_ON_ALL_PROCS = .FALSE.
895 ENDIF
896 IF (BUFFERS_EMPTY_ON_ALL_PROCS) THEN
897 IF (CLEAN_COMM_NODES) THEN
898 CALL MPI_ALLREDUCE(KEEP(266),
899 & TOTAL_SEND_MINUS_RECV266,
900 & 1, MPI_INTEGER, MPI_SUM,
901 & COMM_EFF, IERR)
902 ELSE
903 TOTAL_SEND_MINUS_RECV266 = 0
904 ENDIF
905 IF (CLEAN_COMM_LOAD) THEN
906 CALL MPI_ALLREDUCE(KEEP(267),
907 & TOTAL_SEND_MINUS_RECV267,
908 & 1, MPI_INTEGER, MPI_SUM,
909 & COMM_EFF, IERR)
910 ELSE
911 TOTAL_SEND_MINUS_RECV267 = 0
912 ENDIF
913.EQ..AND. IF (TOTAL_SEND_MINUS_RECV266 0
914.EQ. & TOTAL_SEND_MINUS_RECV267 0) THEN
915 EXIT
916 ENDIF
917 ENDIF
918 ENDDO
919 RETURN
920 END SUBROUTINE DMUMPS_CLEAN_PENDING
subroutine dmumps_process_desc_bande(myid, bufr, lbufr, lbufr_bytes, iwpos, iwposcb, iptrlu, lrlu, lrlus, n, iw, liw, a, la, slavef, procnode_steps, dad, ptrist, ptrast, step, pimaster, pamaster, comp, keep, keep8, dkeep, itloc, rhs_mumps, istep_to_iniv2, iwhandler_in, iflag, ierror)
subroutine dmumps_process_node(myid, keep, keep8, dkeep, bufr, lbufr, lbufr_bytes, iwpos, iwposcb, iptrlu, lrlu, lrlus, n, iw, liw, a, la, slavef, procnode_steps, dad, ptrist, ptrast, step, pimaster, pamaster, nstk_s, comp, fpere, flag, iflag, ierror, comm, itloc, rhs_mumps)
subroutine dmumps_process_contrib_type3(bufr, lbufr, lbufr_bytes, root, n, iw, liw, a, la, lrlu, iptrlu, iwpos, iwposcb, ptrist, ptlust, ptrfac, ptrast, step, pimaster, pamaster, comp, lrlus, ipool, lpool, leaf, fils, dad, myid, lptrar, nelt, frtptr, frtelt, ptraiw, ptrarw, intarr, dblarr, keep, keep8, dkeep, iflag, ierror, comm, comm_load, itloc, rhs_mumps, nd, procnode_steps, slavef, opassw)
subroutine dmumps_process_master2(myid, bufr, lbufr, lbufr_bytes, procnode_steps, slavef, iwpos, iwposcb, iptrlu, lrlu, lrlus, n, iw, liw, a, la, ptrist, ptrast, step, pimaster, pamaster, nstk_s, comp, iflag, ierror, comm, comm_load, ipool, lpool, leaf, keep, keep8, dkeep, nd, fils, dad, frere, itloc, rhs_mumps, istep_to_iniv2, tab_pos_in_pere)
recursive subroutine dmumps_traiter_message(comm_load, ass_irecv, msgsou, msgtag, msglen, bufr, lbufr, lbufr_bytes, procnode_steps, posfac, iwpos, iwposcb, iptrlu, lrlu, lrlus, n, iw, liw, a, la, ptrist, ptlust, ptrfac, ptrast, step, pimaster, pamaster, nstk_s, comp, iflag, ierror, comm, perm, ipool, lpool, leaf, nbfin, myid, slavef root, opassw, opeliw, itloc, rhs_mumps, fils, dad, ptrarw, ptraiw, intarr, dblarr, icntl, keep, keep8, dkeep, nd, frere, lptrar, nelt, frtptr, frtelt istep_to_iniv2, tab_pos_in_pere, lrgroups)
subroutine dmumps_process_root2slave(tot_root_size, tot_cont_to_recv, root, bufr, lbufr, lbufr_bytes, procnode_steps, posfac, iwpos, iwposcb, iptrlu, lrlu, lrlus, n, iw, liw, a, la, ptrist, ptlust, ptrfac, ptrast, step, pimaster, pamaster, nstk_s, comp, iflag, ierror, comm, comm_load, ipool, lpool, leaf, nbfin, myid, slavef opassw, opeliw, itloc, rhs_mumps, fils, dad, lptrar, nelt, frtptr, frtelt, ptrarw, ptraiw, intarr, dblarr, icntl, keep, keep8, dkeep, nd)
subroutine dmumps_process_rtnelind(root, inode, nelim, nslaves, row_list, col_list, slave_list, procnode_steps, iwpos, iwposcb, iptrlu, lrlu, lrlus, n, iw, liw, a, la, ptrist, ptlust_s, ptrfac, ptrast, step, pimaster, pamaster, nstk_s, itloc, rhs_mumps, comp, iflag, ierror, ipool, lpool, leaf, myid, slavef, keep, keep8, dkeep, comm, comm_load, fils, dad, nd)
#define max(a, b)
Definition macros.h:21
subroutine mpi_unpack(inbuf, insize, position, outbuf, outcnt, datatype, comm, ierr)
Definition mpi.f:514
recursive subroutine, public dmumps_load_recv_msgs(comm)
integer, save, private myid
Definition dmumps_load.F:57
int comp(int a, int b)
integer function mumps_typenode(procinfo_inode, k199)
integer function mumps_procnode(procinfo_inode, k199)