31
42 USE omp_lib
46 IMPLICIT NONE
47 TYPE (CMUMPS_ROOT_STRUC) :: root
48 INTEGER N, LIW, LPTRAR, NSTEPSDONE, INFO(80)
49 DOUBLE PRECISION, INTENT(INOUT) :: OPASS, OPELI
50 INTEGER, INTENT(INOUT) :: NELVA, COMP
51 INTEGER, INTENT(INOUT) :: MAXFRT, NTOTPV, NMAXNPIV, NOFFNEGPV
52 INTEGER, INTENT(INOUT) :: NB22T1, NB22T2, NBTINY
53 INTEGER, INTENT(INOUT) :: DET_SIGN, DET_EXP
54 COMPLEX, INTENT(INOUT) :: DET_MANT
55 INTEGER(8) :: LA
56 COMPLEX, TARGET :: A(LA)
57 INTEGER SLAVEF, COMM_NODES, MYID, MYID_NODES
58 INTEGER, DIMENSION(0: SLAVEF - 1) :: MEM_DISTRIB
59 INTEGER KEEP(500), ICNTL(60)
60 INTEGER(8) KEEP8(150)
61 INTEGER LPOOL
62 INTEGER PROCNODE_STEPS(KEEP(28))
63 INTEGER ITLOC(N+KEEP(253))
64 COMPLEX :: RHS_MUMPS(KEEP(255))
65 INTEGER IW(LIW), NSTK_STEPS(KEEP(28))
66 INTEGER(8), INTENT(IN) :: PTRARW(LPTRAR), PTRAIW(LPTRAR)
67 INTEGER ND(KEEP(28))
68 INTEGER FILS(N),PTRIST(KEEP(28))
69 INTEGER STEP(N), FRERE(KEEP(28)), DAD(KEEP(28))
70 INTEGER PIMASTER(KEEP(28))
71 INTEGER PTLUST(KEEP(28)), PERM(N)
72 INTEGER CAND(SLAVEF+1,max(1,KEEP(56)))
73 INTEGER ISTEP_TO_INIV2(KEEP(71)),
74 & TAB_POS_IN_PERE(SLAVEF+2,max(1,KEEP(56)))
75 INTEGER IPOOL(LPOOL)
76 INTEGER NE(KEEP(28))
77 REAL RINFO(40)
78 INTEGER(8) :: PAMASTER(KEEP(28)), PTRAST(KEEP(28))
79 INTEGER(8) :: PTRFAC(KEEP(28))
80 INTEGER(8) :: POSFAC, LRLU, LRLUS, IPTRLU
81 INTEGER IWPOS, LEAF, NBROOT, NBRTOT
82 INTEGER, INTENT(in) :: NBROOT_UNDER_L0
83 INTEGER COMM_LOAD, ASS_IRECV
84 REAL UU, SEUIL, SEUIL_LDLT_NIV2
85 INTEGER NELT
86 INTEGER FRTPTR( N+1 ), FRTELT( NELT )
87 INTEGER LBUFR, LBUFR_BYTES
88 INTEGER BUFR( LBUFR )
89 COMPLEX DBLARR( KEEP8(26) )
90 INTEGER INTARR( KEEP8(27) )
91 LOGICAL IS_ISOLATED_NODE
92 INTEGER LPN_LIST
93 INTEGER PIVNUL_LIST(LPN_LIST)
94 REAL DKEEP(230)
95 INTEGER LRGROUPS(N)
96 INTEGER, INTENT( IN ) :: LTPS_ARR
97 TYPE (MUMPS_TPS_T), TARGET :: MUMPS_TPS_ARR( LTPS_ARR )
98 TYPE (CMUMPS_TPS_T), TARGET :: CMUMPS_TPS_ARR( LTPS_ARR )
99 INTEGER, INTENT( IN ) :: LL0_OMP_MAPPING
100 INTEGER, INTENT( IN ) :: L0_OMP_MAPPING( LL0_OMP_MAPPING )
101 include 'mpif.h'
102 include 'mumps_tags.h'
103 INTEGER :: STATUS(MPI_STATUS_SIZE)
104 INTEGER :: IERR
105 DOUBLE PRECISION, PARAMETER :: DZERO = 0.0d0, done = 1.0d0
106 INTEGER INODE
107 INTEGER IWPOSCB
108 INTEGER FPERE, TYPEF
109 INTEGER MP, LP, DUMMY(1)
110 INTEGER NBFIN, NBROOT_TRAITEES
111 INTEGER NFRONT, IOLDPS, NASS, HF, XSIZE
112 INTEGER(8) :: NFRONT8
113 INTEGER(8) :: POSELT
114 INTEGER IPOSROOT, IPOSROOTROWINDICES
115 INTEGER GLOBK109
116 INTEGER(8) :: LBUFRX
117 COMPLEX, POINTER, DIMENSION(:) :: BUFRX
118 LOGICAL :: IS_BUFRX_ALLOCATED
119 DOUBLE PRECISION FLOP1
120 INTEGER TYPE
121 LOGICAL SON_LEVEL2, SET_IRECV, BLOCKING,
122 & MESSAGE_RECEIVED
123 LOGICAL AVOID_DELAYED
124 LOGICAL LAST_CALL
125 INTEGER MASTER_ROOT
126 INTEGER LOCAL_M, LOCAL_N
127 INTEGER LRHS_CNTR_MASTER_ROOT, FWD_LOCAL_N_RHS
128 LOGICAL ROOT_OWNER
130 INTEGER MUMPS_TYPENODE, MUMPS_PROCNODE
131 LOGICAL MUMPS_INSSARBR,MUMPS_ROOTSSARBR
133 LOGICAL CMUMPS_POOL_EMPTY
135 LOGICAL STACK_RIGHT_AUTHORIZED
136 INTEGER numroc
138 INTEGER JOBASS, ETATASS
139 INTEGER(8) :: LAFAC
140 INTEGER LIWFAC, STRAT, TYPEFile, NextPiv2beWritten,
141 & IDUMMY
142 INTEGER(8) :: ITMP8
143 TYPE(IO_BLOCK) :: MonBloc
144 include 'mumps_headers.h'
145 INTEGER MPA
146 DOUBLE PRECISION OPLAST_PRINTED
147 INTEGER:: ITH
148 DOUBLE PRECISION :: DUMMY_FLOP_ESTIM_ACC
149#if defined(multicore_profiling)
150 DOUBLE PRECISION :: LATIME, LFTIME, LSTIME
151 DOUBLE PRECISION :: GATIME, GFTIME, GSTIME
152 gatime = 0
153 gftime = 0
154 gstime = 0
155#endif
156 dummy_flop_estim_acc = 0.0d0
157 itloc(1:n+keep(253)) =0
158 ass_irecv = mpi_request_null
159 mp = icntl(2)
160 lp = icntl(1)
161 iwposcb = liw
162 NULLIFY(bufrx)
163 is_bufrx_allocated = .false.
164 keep(143) = -1
165 IF ( info(1) .LT. 0 ) THEN
166 GOTO 640
167 ENDIF
168 oplast_printed = done
169 mpa = icntl(2)
170 IF (icntl(4).LT.2) mpa=0
171 IF (mpa.GT.0)
173 & dble(dkeep(17)),
174 & opeli,
175 & oplast_printed, mpa)
176 stack_right_authorized = .true.
178 & .false., .false., myid_nodes, n, keep, keep8, dkeep,
179 & iw, liw, a, la, lrlu, iptrlu, iwpos, iwposcb,
180 & slavef, procnode_steps, dad,
181 & ptrist, ptrast, step, pimaster,
182 & pamaster, keep(ixsz), 0_8, -444, -444, .true.,
183 &
comp, lrlus, keep8(67),
184 & info(1), info(2)
185 & )
186 jobass = 0
187 etatass = 0
188 nbfin = nbrtot
189 nbroot_traitees = 0
190 keep(121)=0
191 IF ( keep(38).NE.0 ) THEN
192 IF (root%yes) THEN
194 & root, keep(38), n, iw, liw,
195 & a, la,
196 & fils, dad, myid_nodes, slavef, procnode_steps,
197 & lptrar, nelt, frtptr, frtelt,
198 & ptraiw, ptrarw,
199 & intarr, dblarr,
200 & lrlu, iptrlu,
201 & iwpos, iwposcb, ptrist, ptrast,
202 & step, pimaster, pamaster, itloc, rhs_mumps,
203 &
comp, lrlus, info(1), keep,keep8, dkeep, info(2) )
204 ENDIF
205 IF ( info(1) .LT. 0 ) GOTO 635
206 END IF
207 IF (keep(400).GT.0) THEN
208 nbroot_traitees = nbroot_under_l0
209 IF (nbroot_traitees .GT.0) THEN
210 IF (nbroot_traitees.EQ.nbroot) THEN
211 nbfin = nbfin - nbroot
212 IF (slavef .GT. 1) THEN
214 & myid_nodes,
comm_nodes, racine, slavef, keep )
215 ENDIF
216 ENDIF
217 ENDIF
218 IF (nbfin .EQ. 0) GOTO 640
219 ENDIF
220 keep(429)=0
221 20 CONTINUE
223 set_irecv = .true.
224 blocking = .false.
225 message_received = .false.
227 & comm_load, ass_irecv, blocking, set_irecv,
228 & message_received,
229 & mpi_any_source, mpi_any_tag,
230 & status, bufr, lbufr,
231 & lbufr_bytes, procnode_steps, posfac,
232 & iwpos, iwposcb, iptrlu,
233 & lrlu, lrlus, n, iw, liw, a, la,
234 & ptrist, ptlust, ptrfac,
235 & ptrast, step, pimaster, pamaster, nstk_steps,
237 & ipool, lpool, leaf, nbfin, myid_nodes, slavef,
238 & root, opass, opeli, itloc, rhs_mumps, fils, dad,
239 & ptrarw, ptraiw,
240 & intarr, dblarr, icntl, keep,keep8,dkeep, nd, frere,
241 & lptrar, nelt, frtptr, frtelt,
242 & istep_to_iniv2, tab_pos_in_pere,
243 & stack_right_authorized
244 & , lrgroups
245 & )
247 IF (mpa.GT.0)
249 & dble(dkeep(17)),
250 & opeli,
251 & oplast_printed, mpa)
252 IF (message_received) THEN
253 IF ( info(1) .LT. 0 ) GO TO 640
254 IF ( nbfin .eq. 0 ) GOTO 640
255 ELSE
258 & procnode_steps,
259 & slavef, step, inode, keep,keep8, myid_nodes, nd,
260 & (.NOT. stack_right_authorized) )
261 stack_right_authorized = .true.
262 IF (keep(47) .GE. 3) THEN
264 & ipool, lpool,
265 & procnode_steps, keep,keep8, slavef, comm_load,
266 & myid_nodes, step, n, nd, fils )
267 ENDIF
268 IF (keep(47).EQ.4) THEN
269 IF(inode.GT.0.AND.inode.LE.n)THEN
270 IF((ne(step(inode)).EQ.0).AND.
271 & (frere(step(inode)).EQ.0))THEN
272 is_isolated_node=.true.
273 ELSE
274 is_isolated_node=.false.
275 ENDIF
276 ENDIF
278 & is_isolated_node,inode,ipool,lpool,
279 & myid_nodes,slavef,comm_load,keep,keep8)
280 ENDIF
281 IF ((( keep(80) == 2 .OR. keep(80)==3 ) .AND.
282 & ( keep(47) == 4 )).OR.
283 & (keep(80) == 1 .AND. keep(47) .GE. 1)) THEN
285 & procnode_steps,frere,nd,comm_load,slavef,
286 & myid_nodes,keep,keep8,n)
287 END IF
288 GOTO 30
289 ENDIF
290 ENDIF
291 GO TO 20
292 30 CONTINUE
293 IF ( inode .LT. 0 ) THEN
294 inode = -inode
295 fpere = dad(step(inode))
296 GOTO 130
297 ELSE IF (inode.GT.n) THEN
298 inode = inode - n
299 IF (inode.EQ.keep(38)) THEN
300 nbroot_traitees = nbroot_traitees + 1
301 IF ( nbroot_traitees .EQ. nbroot ) THEN
302 nbfin = nbfin - nbroot
303 IF (slavef.GT.1) THEN
304 dummy(1) = nbroot
307 END IF
308 ENDIF
309 IF (nbfin.EQ.0) GOTO 640
310 GOTO 20
311 ENDIF
313 IF (type.EQ.1) GOTO 100
314 fpere = dad(step(inode))
315 avoid_delayed = ( (fpere .eq. keep(20) .OR. fpere .eq. keep(38))
316 & .AND. keep(60).ne.0 )
317 IF ( keep(50) .eq. 0 ) THEN
319 & n, inode, fpere, iw, liw, a, la, uu,
320 & noffnegpv, ntotpv, nbtiny,
321 & det_exp, det_mant, det_sign,
322 &
comm_nodes, myid_nodes, bufr, lbufr,lbufr_bytes,
323 & nbfin,leaf, info(1), info(2), ipool,lpool,
324 & slavef, posfac, iwpos, iwposcb, iptrlu, lrlu,
325 & lrlus,
comp, ptrist, ptrast, ptlust, ptrfac,
326 & step, pimaster, pamaster,
327 & nstk_steps,perm,procnode_steps,
328 & root, opass, opeli, itloc, rhs_mumps,
329 & fils, dad, ptrarw, ptraiw,
330 & intarr, dblarr, icntl, keep,keep8, nd, frere,
331 & lptrar, nelt, frtptr, frtelt, seuil,
332 & istep_to_iniv2, tab_pos_in_pere, avoid_delayed,
333 & dkeep(1),pivnul_list(1),lpn_list
334 & , lrgroups
335 & )
336 IF ( info(1) .LT. 0 ) GOTO 640
337 IF (mpa.GT.0)
339 & dble(dkeep(17)),
340 & opeli,
341 & oplast_printed, mpa)
342 ELSE
344 & n, inode, fpere, iw, liw, a, la, uu,
345 & noffnegpv, ntotpv,
346 & nb22t2, nbtiny, det_exp, det_mant, det_sign,
347 &
comm_nodes, myid_nodes, bufr, lbufr,lbufr_bytes,
348 & nbfin,leaf, info(1), info(2), ipool,lpool,
349 & slavef, posfac, iwpos, iwposcb, iptrlu, lrlu,
350 & lrlus,
comp, ptrist, ptrast, ptlust, ptrfac,
351 & step, pimaster, pamaster,
352 & nstk_steps,perm,procnode_steps,
353 & root, opass, opeli, itloc, rhs_mumps,
354 & fils, dad, ptrarw, ptraiw,
355 & intarr, dblarr, icntl, keep,keep8, nd, frere,
356 & lptrar, nelt, frtptr, frtelt, seuil_ldlt_niv2,
357 & istep_to_iniv2, tab_pos_in_pere, avoid_delayed,
358 & dkeep(1),pivnul_list(1),lpn_list
359 & , lrgroups
360 & )
361 IF ( info(1) .LT. 0 ) GOTO 640
362 IF (mpa.GT.0)
364 & dble(dkeep(17)),
365 & opeli,
366 & oplast_printed, mpa)
367 IF ( iw( ptlust(step(inode)) + keep(ixsz) + 5 ) .GT. 1 ) THEN
368 GOTO 20
369 END IF
370 END IF
371 GOTO 130
372 ENDIF
373 IF (inode.EQ.keep(38)) THEN
375 & root, frere,
376 & inode,
377 & bufr, lbufr, lbufr_bytes, procnode_steps, posfac,
378 & iwpos, iwposcb, iptrlu,
379 & lrlu, lrlus, n, iw, liw, a, la, ptrist,
380 & ptlust, ptrfac,
381 & ptrast, step, pimaster, pamaster, nstk_steps,
comp,
383 & perm,
384 & ipool, lpool, leaf,
385 & nbfin, myid_nodes, slavef,
386 &
387 & opass, opeli, itloc, rhs_mumps,
388 & fils, dad, ptrarw, ptraiw,
389 & intarr, dblarr,icntl,keep,keep8,dkeep, nd,
390 & lptrar, nelt, frtptr, frtelt,
391 & istep_to_iniv2, tab_pos_in_pere
392 & , lrgroups
393 & )
394 IF ( info(1) .LT. 0 ) GOTO 640
395 IF (mpa.GT.0)
397 & dble(dkeep(17)),
398 & opeli,
399 & oplast_printed, mpa)
400 GOTO 20
401 ENDIF
403 IF (type.EQ.1) THEN
404 IF (keep(55).NE.0) THEN
406 & nelt, frtptr, frtelt,
407 & n,inode,iw,liw,a,la,
408 & info(1),nd,
409 & fils,frere,dad,maxfrt,root,opass, opeli,
410 & ptrist,ptlust,ptrfac,ptrast,step, pimaster,pamaster,
411 & ptrarw,ptraiw,
412 & itloc, rhs_mumps, nstepsdone, son_level2,
413 &
comp, lrlu, iptrlu,
414 & iwpos,iwposcb, posfac, lrlus, keep8(67),
415 & icntl, keep,keep8,dkeep,
416 & intarr,keep8(27),dblarr,keep8(26),
417 & nstk_steps,procnode_steps, slavef,
419 & bufr, lbufr, lbufr_bytes, nbfin, ipool, lpool, leaf,
420 & perm, istep_to_iniv2, tab_pos_in_pere
421 & , lrgroups
422 & , mumps_tps_arr, cmumps_tps_arr,
423 & l0_omp_mapping
424 & )
425 ELSE
426 jobass = 0
428 & n,inode,iw,liw,a,la,
429 & info(1),nd,
430 & fils,frere,dad,maxfrt,root,opass, opeli,
431 & ptrist,ptlust,ptrfac,ptrast,step, pimaster,pamaster,
432 & ptrarw,ptraiw,
433 & itloc, rhs_mumps, nstepsdone, son_level2,
434 &
comp, lrlu, iptrlu,
435 & iwpos,iwposcb, posfac, lrlus, keep8(67),
436 & icntl, keep,keep8,dkeep, intarr,keep8(27),
437 & dblarr,keep8(26),
438 & nstk_steps,procnode_steps, slavef,
440 & bufr, lbufr, lbufr_bytes, nbfin, ipool, lpool, leaf,
441 & perm,
442 & istep_to_iniv2, tab_pos_in_pere, jobass,etatass
443 & , lrgroups
444 & , mumps_tps_arr, cmumps_tps_arr,
445 & l0_omp_mapping
446 & )
447 ENDIF
448 IF (mpa.GT.0)
450 & dble(dkeep(17)),
451 & opeli,
452 & oplast_printed, mpa)
453 IF ( info(1) .LT. 0 ) GOTO 640
454 IF ((iw(ptlust(step(inode))+xxnbpr).GT.0).OR.(son_level2)) THEN
455 GOTO 20
456 ENDIF
457 ELSE
458 IF ( keep(55) .eq. 0 ) THEN
460 & n, inode, iw, liw, a, la,
461 & info(1),
462 & nd, fils, frere, dad, cand,
463 & istep_to_iniv2, tab_pos_in_pere,
464 & maxfrt,
465 & root, opass, opeli, ptrist, ptlust, ptrfac,
466 & ptrast, step, pimaster, pamaster, ptrarw, nstk_steps,
467 & ptraiw, itloc, rhs_mumps, nstepsdone,
468 &
comp, lrlu, iptrlu, iwpos, iwposcb, posfac, lrlus,
469 & icntl, keep,keep8,dkeep,intarr,keep8(27),dblarr,keep8(26),
471 & myid_nodes,
472 & bufr, lbufr, lbufr_bytes,
473 & nbfin, leaf, ipool, lpool, perm,
474 & mem_distrib(0)
475 & , lrgroups
476 & )
477 ELSE
479 & nelt, frtptr, frtelt,
480 & n, inode, iw, liw, a, la, info(1),
481 & nd, fils, frere, dad, cand,
482 & istep_to_iniv2, tab_pos_in_pere,
483 & maxfrt,
484 & root, opass, opeli, ptrist, ptlust, ptrfac,
485 & ptrast, step, pimaster, pamaster, ptrarw, nstk_steps,
486 & ptraiw, itloc, rhs_mumps, nstepsdone,
487 &
comp, lrlu, iptrlu, iwpos, iwposcb, posfac, lrlus,
488 & icntl, keep,keep8,dkeep,intarr,keep8(27),dblarr,keep8(26),
490 & myid_nodes,
491 & bufr, lbufr, lbufr_bytes,
492 & nbfin, leaf, ipool, lpool, perm,
493 & mem_distrib(0)
494 & , lrgroups
495 & )
496 END IF
497 IF (mpa.GT.0)
499 & dble(dkeep(17)),
500 & opeli,
501 & oplast_printed, mpa)
502 IF (info(1).LT.0) GOTO 640
503 GOTO 20
504 ENDIF
505 100 CONTINUE
506 fpere = dad(step(inode))
507 IF ( inode .eq. keep(20) ) THEN
508 poselt = ptrast(step(inode))
509 IF (ptrfac(step(inode)).NE.poselt) THEN
510 WRITE(*,*) "ERROR 2 in CMUMPS_FAC_PAR", poselt
511 GOTO 635
512 ENDIF
513 CALL cmumps_change_header
514 & ( iw(ptlust(step(inode))+keep(ixsz)), keep(253) )
515 GOTO 200
516 END IF
517 poselt = ptrast(step(inode))
518 ioldps = ptlust(step(inode))
519 xsize = keep(ixsz)
520 hf = 6 + iw(ioldps+5+xsize)+xsize
521 nfront = iw(ioldps+xsize)
522 nass = iabs(iw(ioldps+2+xsize))
523 avoid_delayed = ( (fpere .eq. keep(20) .OR. fpere .eq. keep(38))
524 & .AND. keep(60).ne.0 )
525 IF (keep(50).EQ.0) THEN
527 & n, inode, iw, liw, a, la,
528 & ioldps, poselt,
529 & info(1), info(2), uu, noffnegpv, ntotpv, nbtiny,
530 & det_exp, det_mant, det_sign,
531 & keep,keep8,
532 & step, procnode_steps, myid_nodes, slavef,
533 & seuil, avoid_delayed, etatass,
534 & dkeep(1),pivnul_list(1),lpn_list, iwpos
535 & , lrgroups
536 & , perm
537 & )
538 IF (info(1).LT.0) GOTO 635
539#if defined(multicore_profiling)
541 gftime = gftime + lftime
542 WRITE(*,*)'FAC ',lftime
543#endif
544 ELSE
545 iw( ioldps+4+keep(ixsz) ) = 1
547 & iw, liw, a, la,
548 & ioldps, poselt,
549 & info(1), info(2), uu, noffnegpv, ntotpv,
550 & nb22t1, nbtiny, det_exp, det_mant, det_sign,
551 & keep,keep8, myid_nodes, seuil, avoid_delayed,
552 & etatass,
553 & dkeep(1),pivnul_list(1),lpn_list, iwpos
554 & , lrgroups
555 & , perm
556 & )
557 IF (info(1).LT.0) GOTO 635
558 iw( ioldps+4+keep(ixsz) ) = step(inode)
559 ENDIF
560 jobass = etatass
561 IF (jobass.EQ.1) THEN
562#if defined(multicore_profiling)
564#endif
566 & n,inode,iw,liw,a,la,
567 & info(1),nd,
568 & fils,frere,dad,maxfrt,root,opass, opeli,
569 & ptrist,ptlust,ptrfac,ptrast,step,pimaster,pamaster,
570 & ptrarw,ptraiw,
571 & itloc, rhs_mumps, nstepsdone, son_level2,
572 &
comp, lrlu, iptrlu,
573 & iwpos,iwposcb, posfac, lrlus, keep8(67),
574 & icntl, keep,keep8,dkeep,intarr,keep8(27),dblarr,keep8(26),
575 & nstk_steps, procnode_steps, slavef,
577 & bufr, lbufr, lbufr_bytes, nbfin, ipool, lpool, leaf,
578 & perm,
579 & istep_to_iniv2, tab_pos_in_pere,
580 & jobass,etatass
581 & , lrgroups
582 & )
583#if defined(multicore_profiling)
585 gatime = gatime + latime
586 WRITE(*,*)'ASS ',latime
587#endif
588 ENDIF
589 IF (mpa.GT.0)
591 & dble(dkeep(17)),
592 & opeli,
593 & oplast_printed, mpa)
594 IF (info(1).LT.0) GOTO 635
595 130 CONTINUE
597 IF ( fpere .NE. 0 ) THEN
599 ELSE
600 typef = -9999
601 END IF
602#if defined(multicore_profiling)
604#endif
606 & n,inode,TYPE,TYPEF,LA,IW,LIW,A,
607 & INFO(1),INFO(2),OPELI,NELVA,NMAXNPIV,
608 & PTRIST,PTLUST,PTRFAC,
609 & PTRAST, STEP, PIMASTER, PAMASTER,
610 & NE, POSFAC,LRLU, LRLUS,KEEP8(67),
611 & IPTRLU,ICNTL,KEEP,KEEP8,DKEEP,COMP,IWPOS,IWPOSCB,
612 & PROCNODE_STEPS,SLAVEF,FPERE,COMM_NODES,MYID_NODES,
613 & IPOOL, LPOOL, LEAF,
614 & NSTK_STEPS, PERM, BUFR, LBUFR, LBUFR_BYTES, NBFIN,
615 & root, OPASS, ITLOC, RHS_MUMPS, FILS, DAD, PTRARW, PTRAIW,
616 & INTARR, DBLARR,
617 & ND, FRERE, LPTRAR, NELT, FRTPTR, FRTELT,
618 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
619 & , LRGROUPS
620 & ,DUMMY_FLOP_ESTIM_ACC
621 & )
622#if defined(multicore_profiling)
624 gstime = gstime + lstime
625 WRITE(*,*)'STK ',lstime
626#endif
627 IF (mpa.GT.0)
629 & dble(dkeep(17)),
630 & opeli,
631 & oplast_printed, mpa)
632 IF (info(1).LT.0) GOTO 640
633 200 CONTINUE
634 IF ( inode .eq. keep(38) ) THEN
635 WRITE(*,*) 'Error .. in CMUMPS_FAC_PAR: ',
636 & ' INODE == KEEP(38)'
638 END IF
639 IF ( fpere.EQ.0 ) THEN
640 nbroot_traitees = nbroot_traitees + 1
641 IF ( nbroot_traitees .EQ. nbroot ) THEN
642 IF (keep(201).EQ.1) THEN
644 ELSE IF ( keep(201).EQ.2) THEN
646 ENDIF
647 nbfin = nbfin - nbroot
648 IF ( nbfin .LT. 0 ) THEN
649 WRITE(*,*) ' ERROR 1 in CMUMPS_FAC_PAR: ',
650 & ' NBFIN=', nbfin
652 END IF
653 IF ( nbroot .LT. 0 ) THEN
654 WRITE(*,*) ' ERROR 1 in CMUMPS_FAC_PAR: ',
655 & ' NBROOT=', nbroot
657 END IF
658 IF (slavef.GT.1) THEN
659 dummy(1) = nbroot
661 & myid_nodes,
comm_nodes, racine, slavef, keep )
662 END IF
663 ENDIF
664 IF (nbfin.EQ.0)THEN
665 GOTO 640
666 ENDIF
667 ELSEIF ( fpere.NE.keep(38) .AND.
669 & keep(199)) .EQ. myid_nodes ) THEN
670 nstk_steps(step(fpere)) = nstk_steps(step(fpere))-1
671 IF ( nstk_steps( step( fpere )).EQ.0) THEN
672 IF (keep(234).NE.0 .AND.
674 & THEN
675 stack_right_authorized = .false.
676 ENDIF
678 & procnode_steps, slavef, keep(199), keep(28), keep(76),
679 & keep(80), keep(47), step, fpere )
680 IF (keep(47) .GE. 3) THEN
682 & ipool, lpool,
683 & procnode_steps, keep,keep8, slavef, comm_load,
684 & myid_nodes, step, n, nd, fils )
685 ENDIF
687 & nd, fils, frere, step, pimaster, keep(28),
688 & keep(50), keep(253), flop1,
689 & iw, liw, keep(ixsz) )
690 IF (fpere.NE.keep(20))
692 ENDIF
693 ENDIF
694 GO TO 20
695 635 CONTINUE
697 640 CONTINUE
699 & keep,
700 & ass_irecv, bufr, lbufr,
701 & lbufr_bytes,
703 & myid_nodes, slavef)
705 & bufr, lbufr,
706 & lbufr_bytes,
708 & .true.,
709 & .true.)
711 IF (info(1) .LT. 0) THEN
713 & iw, liw, iwposcb, iwpos,
714 & step, ptrast, pamaster, procnode_steps, dad,
715 & .false. )
716 IF (keep(400) .GT. 0) THEN
717
718 DO ith = 1, keep(400)
719 IF (associated(mumps_tps_arr(ith)%IW)) THEN
721 & keep, keep8,
722 & mumps_tps_arr(ith)%IW(1), mumps_tps_arr(ith)%LIW,
723 & mumps_tps_arr(ith)%IWPOSCB, mumps_tps_arr(ith)%IWPOS,
724 & step, ptrast, pamaster, procnode_steps, dad,
725 & .true. )
726 ENDIF
727 ENDDO
728
729 ENDIF
730 ENDIF
731 IF ( info(1) .GE. 0 ) THEN
732 IF( keep(38) .NE. 0 .OR. keep(20).NE.0) THEN
734 & procnode_steps(step(
max(keep(38),keep(20)))),
735 & keep(199))
736 root_owner = (master_root .EQ. myid_nodes)
737 IF ( keep(38) .NE. 0 ) THEN
738 IF (keep(60).EQ.0) THEN
739 ioldps = ptlust(step(keep(38)))
740 local_m = iw(ioldps+2+keep(ixsz))
741 local_n = iw(ioldps+1+keep(ixsz))
742 ELSE
743 ioldps = -999
744 local_m = root%SCHUR_MLOC
745 local_n = root%SCHUR_NLOC
746 ENDIF
747 itmp8 = int(local_m,8)*int(local_n,8)
748 lbufrx =
min(int(root%MBLOCK,8)*int(root%NBLOCK,8),
749 & int(root%TOT_ROOT_SIZE,8)*int(root%TOT_ROOT_SIZE,8) )
750 is_bufrx_allocated = .false.
751 IF ( lrlu .GT. lbufrx ) THEN
752 bufrx => a(posfac:posfac+lrlu-1_8)
753 lbufrx=lrlu
754 ELSE
755 ALLOCATE( bufrx( lbufrx ), stat = ierr )
756 IF (ierr.gt.0) THEN
757 info(1) = -13
759 IF (lp > 0 )
760 & write(lp,*) ' Error allocating, real array ',
761 & 'of size before CMUMPS_FACTO_ROOT', lbufrx
763 ENDIF
764 is_bufrx_allocated = .true.
765 ENDIF
767 & mpa, myid_nodes, master_root,
768 & root, n, keep(38),
770 & a, la, ptrast, ptlust, ptrfac, step,
771 & info(1), keep(50), keep(19),
772 & bufrx(1), lbufrx, keep,keep8, dkeep,
773 & opeli, det_exp, det_mant, det_sign )
774 IF (is_bufrx_allocated) DEALLOCATE ( bufrx )
775 NULLIFY(bufrx)
776 is_bufrx_allocated = .false.
777 IF ( myid_nodes .eq.
779 & keep(199))
780 & ) THEN
781 IF ( info(1) .EQ. -10 .OR. info(1) .EQ. -40 ) THEN
782 ntotpv = ntotpv + info(2)
783 ELSE
784 ntotpv = ntotpv + root%TOT_ROOT_SIZE
785 nmaxnpiv =
max(nmaxnpiv,root%TOT_ROOT_SIZE)
786 END IF
787 END IF
788 IF (root%yes.AND.keep(60).EQ.0) THEN
789 IF (keep(252).EQ.0) THEN
790 IF (keep(201).EQ.1) THEN
792 liwfac = iw(ioldps+xxi)
793 typefile = typef_l
794 nextpiv2bewritten = 1
795 monbloc%INODE = keep(38)
796 monbloc%MASTER = .true.
797 monbloc%Typenode = 3
798 monbloc%NROW = local_m
799 monbloc%NCOL = local_n
800 monbloc%NFS = monbloc%NCOL
801 monbloc%Last = .true.
802 monbloc%LastPiv = monbloc%NCOL
803 monbloc%LastPanelWritten_L=-9999
804 monbloc%LastPanelWritten_U=-9999
805 NULLIFY(monbloc%INDICES)
806 strat = strat_write_max
807 monbloc%Last = .true.
808 last_call = .true.
810 & ( strat, typefile,
811 & a(ptrfac(step(keep(38)))),
812 & lafac, monbloc,
813 & nextpiv2bewritten, idummy,
814 & iw(ioldps), liwfac,
815 &
myid, keep8(31), ierr,last_call)
816 ELSE IF (keep(201).EQ.2) THEN
817 keep8(31)=keep8(31)+ itmp8
819 & keep,keep8,a,la, itmp8, ierr)
820 IF(ierr.LT.0)THEN
822 & ': Internal error in CMUMPS_NEW_FACTOR'
824 ENDIF
825 ENDIF
826 ENDIF
827 IF (keep(201).NE.0 .OR. keep(252).NE.0) THEN
828 lrlus = lrlus + itmp8
829 keep8(69) = keep8(69) - itmp8
830 IF (keep(252).NE.0) THEN
832 & la-lrlus
833 & ,0_8,-itmp8,
834 & keep,keep8,lrlus)
835 ELSE
837 & la-lrlus
838 & ,itmp8,
839 & 0_8,
840 & keep,keep8,lrlus)
841 ENDIF
842 IF (ptrfac(step(keep(38))).EQ.posfac-itmp8) THEN
843 posfac = posfac - itmp8
844 lrlu = lrlu + itmp8
845 ENDIF
846 ELSE
848 & la-lrlus
849 & ,itmp8,
850 & 0_8,
851 & keep,keep8,lrlus)
852 ENDIF
853 ENDIF
854 IF (root%yes. and. keep(252) .NE. 0 .AND.
855 & (keep(60).EQ.0 .OR. keep(221).EQ.1)) THEN
856 IF (myid_nodes .EQ. master_root) THEN
857 lrhs_cntr_master_root = root%TOT_ROOT_SIZE*keep(253)
858 ELSE
859 lrhs_cntr_master_root = 1
860 ENDIF
861 ALLOCATE(root%RHS_CNTR_MASTER_ROOT(
862 & lrhs_cntr_master_root), stat=ierr )
863 IF (ierr.gt.0) THEN
864 info(1) = -13
865 info(2) = lrhs_cntr_master_root
866 IF (lp > 0 )
867 & write(lp,*) ' Error allocating, real array ',
868 & 'of size before CMUMPS_FACTO_ROOT',
869 & lrhs_cntr_master_root
871 ENDIF
872 fwd_local_n_rhs =
numroc(keep(253), root%NBLOCK,
873 & root%MYCOL, 0, root%NPCOL)
874 fwd_local_n_rhs =
max(1,fwd_local_n_rhs)
876 & root%TOT_ROOT_SIZE, keep(253),
877 & root%RHS_CNTR_MASTER_ROOT(1), local_m,
878 & fwd_local_n_rhs, root%MBLOCK, root%NBLOCK,
879 & root%RHS_ROOT(1,1), master_root,
881 &
882 ENDIF
883 ELSE
884 IF (keep(19).NE.0) THEN
886 & mpi_integer, mpi_sum,
887 & master_root,
889 ENDIF
890 IF (root_owner) THEN
891 iposroot = ptlust(step(keep(20)))
892 nfront = iw(iposroot+keep(ixsz)+3)
893 nfront8 = int(nfront,8)
894 iposrootrowindices=iposroot+6+keep(ixsz)+
895 & iw(iposroot+5+keep(ixsz))
896 ntotpv = ntotpv + nfront
897 nmaxnpiv =
max(nmaxnpiv,nfront)
898 END IF
899 IF (root_owner.AND.keep(60).NE.0) THEN
900 itmp8 = nfront8*nfront8
901 IF ( ptrfac(step(keep(20))) .EQ. posfac -
902 & itmp8 ) THEN
903 posfac = posfac - itmp8
904 lrlus = lrlus + itmp8
905 lrlu = lrlus + itmp8
906 keep8(69) = keep8(69) - itmp8
908 & la-lrlus,0_8,-itmp8,keep,keep8,lrlus)
909 ENDIF
910 ENDIF
911 END IF
912 IF (info(1).LT.0) GOTO 500
913 END IF
914 END IF
915 500 CONTINUE
916 IF ( keep(38) .NE. 0 ) THEN
917 IF (myid_nodes.EQ.
919 & ) THEN
920 maxfrt =
max( maxfrt, root%TOT_ROOT_SIZE)
921 END IF
922 END IF
923 RETURN
subroutine cmumps_bdc_error(myid, slavef, comm, keep)
subroutine cmumps_mcast2(data, ldata, mpitype, root, commw, tag, slavef, keep)
subroutine cmumps_last_rtnelind(comm_load, ass_irecv, root, frere, iroot, bufr, lbufr, lbufr_bytes, procnode_steps, posfac, iwpos, iwposcb, iptrlu, lrlu, lrlus, n, iw, liw, a, la, ptrist, ptlust_s, ptrfac, ptrast, step, pimaster, pamaster, nstk_s, comp, iflag, ierror, comm, perm, ipool, lpool, leaf, nbfin, myid, slavef opassw, opeliw, itloc, rhs_mumps, fils, dad, ptrarw, ptraiw, intarr, dblarr, icntl, keep, keep8, dkeep, nd, lptrar, nelt, frtptr, frtelt, istep_to_iniv2, tab_pos_in_pere, lrgroups)
subroutine cmumps_alloc_cb(inplace, min_space_in_place, ssarbr, process_bande, myid, n, keep, keep8, dkeep, iw, liw, a, la, lrlu, iptrlu, iwpos, iwposcb, slavef, procnode_steps, dad, ptrist, ptrast, step, pimaster, pamaster, lreq, lreqcb, node_arg, state_arg, set_header, comp, lrlus, lrlusm, iflag, ierror)
subroutine cmumps_dm_freealldynamiccb_i(myid, n, slavef, keep, keep8, iw, liw, iwposcb, iwpos, step, ptrast, pamaster, procnode_steps, dad, atomic_updates)
subroutine cmumps_fac_stack(comm_load, ass_irecv, n, inode, type, typef, la, iw, liw, a, iflag, ierror, opeliw, nelvaw, nmaxnpiv, ptrist, ptlust_s, ptrfac, ptrast, step, pimaster, pamaster, ne, posfac, lrlu, lrlus, lrlusm, iptrlu, icntl, keep, keep8, dkeep, comp, iwpos, iwposcb, procnode_steps, slavef, fpere, comm, myid, ipool, lpool, leaf, nstk_s, perm, bufr, lbufr, lbufr_bytes, nbfin, root, opassw, itloc, rhs_mumps, fils, dad, ptrarw, ptraiw, intarr, dblarr, nd, frere, lptrar, nelt, frtptr, frtelt, istep_to_iniv2, tab_pos_in_pere, lrgroups, flop_estim_acc)
recursive subroutine cmumps_try_recvtreat(comm_load, ass_irecv, blocking, set_irecv, message_received, msgsou, msgtag, status, 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, stack_right_authorized, lrgroups)
subroutine cmumps_clean_pending(info1, keep, bufr, lbufr, lbufr_bytes, comm_nodes, comm_load, slavef, clean_comm_nodes, clean_comm_load)
subroutine cmumps_cancel_irecv(info1, keep, ass_irecv, bufr, lbufr, lbufr_bytes, comm, myid, slavef)
subroutine cmumps_facto_root(mpa, myid, master_of_root, root, n, iroot, comm, iw, liw, ifree, a, la, ptrast, ptlust_s, ptrfac, step, info, ldlt, qr, wk, lwk, keep, keep8, dkeep, opeliw, det_exp, det_mant, det_sign)
subroutine cmumps_insert_pool_n(n, pool, lpool, procnode, slavef, keep199, k28, k76, k80, k47, step, inode)
subroutine cmumps_extract_pool(n, pool, lpool, procnode, slavef, step, inode, keep, keep8, myid, nd, force_extract_top_sbtr)
logical function cmumps_pool_empty(pool, lpool)
subroutine cmumps_root_alloc_static(root, iroot, n, iw, liw, a, la, fils, dad, myid, slavef, procnode_steps, lptrar, nelt, frtptr, frtelt, ptraiw, ptrarw, intarr, dblarr, lrlu, iptrlu, iwpos, iwposcb, ptrist, ptrast, step, pimaster, pamaster, itloc, rhs_mumps, comp, lrlus, iflag, keep, keep8, dkeep, ierror)
subroutine cmumps_gather_root(myid, m, n, aseq, local_m, local_n, mblock, nblock, apar, master_root, nprow, npcol, comm)
subroutine mumps_print_still_active(myid, keep, dkeep17, opeliw, oplast_printed, mpa)
subroutine mumps_estim_flops(inode, n, procnode_steps, keep199, nd, fils, frere_steps, step, pimaster, keep28, keep50, keep253, flop1, iw, liw, xsize)
subroutine mpi_reduce(sendbuf, recvbuf, cnt, datatype, op, root, comm, ierr)
double precision function mpi_wtime()
subroutine mpi_barrier(comm, ierr)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine cmumps_dm_freealldynamiccb(myid, n, slavef, keep, keep8, iw, liw, iwposcb, iwpos, step, ptrast, pamaster, procnode_steps, dad, atomic_updates)
subroutine cmumps_fac1_ldlt(n, inode, iw, liw, a, la, ioldps, poselt, iflag, ierror, uu, nnegw, npvw, nb22t1w, nbtinyw, det_expw, det_mantw, det_signw, keep, keep8, myid, seuil, avoid_delayed, etatass, dkeep, pivnul_list, lpn_list, iwpos, lrgroups, perm)
subroutine cmumps_fac1_lu(n, inode, iw, liw, a, la, ioldps, poselt, iflag, ierror, uu, noffw, npvw, nbtinyw, det_expw, det_mantw, det_signw, keep, keep8, step, procnode_steps, myid, slavef, seuil, avoid_delayed, etatass, dkeep, pivnul_list, lpn_list, iwpos, lrgroups, perm)
subroutine cmumps_fac2_ldlt(comm_load, ass_irecv, n, inode, fpere, iw, liw, a, la, uu, nnegw, npvw, nb22t2w, nbtinyw, det_expw, det_mantw, det_signw, comm, myid, bufr, lbufr, lbufr_bytes, nbfin, leaf, iflag, ierror, ipool, lpool, slavef, posfac, iwpos, iwposcb, iptrlu, lrlu, lrlus, comp, ptrist, ptrast, ptlust_s, ptrfac, step, pimaster, pamaster, nstk_s, perm, procnode_steps, root, opassw, opeliw, itloc, rhs_mumps, fils, dad, ptrarw, ptraiw, intarr, dblarr, icntl, keep, keep8, nd, frere, lptrar, nelt, frtptr, frtelt, seuil, istep_to_iniv2, tab_pos_in_pere, avoid_delayed, dkeep, pivnul_list, lpn_list, lrgroups)
subroutine cmumps_fac2_lu(comm_load, ass_irecv, n, inode, fpere, iw, liw, a, la, uu, noffw, npvw, nbtinyw, det_expw, det_mantw, det_signw, comm, myid, bufr, lbufr, lbufr_bytes, nbfin, leaf, iflag, ierror, ipool, lpool, slavef, posfac, iwpos, iwposcb, iptrlu, lrlu, lrlus, comp, ptrist, ptrast, ptlust_s, ptrfac, step, pimaster, pamaster, nstk_s, perm, procnode_steps, root, opassw, opeliw, itloc, rhs_mumps, fils, dad, ptrarw, ptraiw, intarr, dblarr, icntl, keep, keep8, nd, frere, lptrar, nelt, frtptr, frtelt, seuil, istep_to_iniv2, tab_pos_in_pere, avoid_delayed, dkeep, pivnul_list, lpn_list, lrgroups)
subroutine cmumps_fac_asm_niv2_elt(comm_load, ass_irecv, nelt, frt_ptr, frt_elt, n, inode, iw, liw, a, la, info, nd, fils, frere, dad, cand, istep_to_iniv2, tab_pos_in_pere, maxfrw, root, opassw, opeliw, ptrist, ptlust, ptrfac, ptrast, step, pimaster, pamaster, ptrarw, nstk_s, ptraiw, itloc, rhs_mumps, nsteps, comp, lrlu, iptrlu, iwpos, iwposcb, posfac, lrlus, icntl, keep, keep8, dkeep, intarr, lintarr, dblarr, ldblarr, procnode_steps, slavef, comm, myid, bufr, lbufr, lbufr_bytes, nbfin, leaf, ipool, lpool, perm, mem_distrib, lrgroups)
subroutine cmumps_fac_asm_niv1_elt(comm_load, ass_irecv, nelt, frt_ptr, frt_elt, n, inode, iw, liw, a, la, info, nd, fils, frere, dad, maxfrw, root, opassw, opeliw, ptrist, ptlust, ptrfac, ptrast, step, pimaster, pamaster, ptrarw, ptraiw, itloc, rhs_mumps, nsteps, son_level2, comp, lrlu, iptrlu, iwpos, iwposcb, posfac, lrlus, lrlusm, icntl, keep, keep8, dkeep, intarr, lintarr, dblarr, ldblarr nstk_s, procnode_steps, slavef, comm, myid, bufr, lbufr, lbufr_bytes, nbfin, ipool, lpool, leaf, perm, istep_to_iniv2, tab_pos_in_pere, lrgroups, mumps_tps_arr, cmumps_tps_arr, l0_omp_mapping)
subroutine cmumps_fac_asm_niv1(comm_load, ass_irecv, n, inode, iw, liw, a, la, info, nd, fils, frere, dad, maxfrw, root, opassw, opeliw, ptrist, ptlust, ptrfac, ptrast, step, pimaster, pamaster, ptrarw, ptraiw, itloc, rhs_mumps, nsteps, son_level2, comp, lrlu, iptrlu, iwpos, iwposcb, posfac, lrlus, lrlusm, icntl, keep, keep8, dkeep, intarr, lintarr, dblarr, ldblarr nstk_s, procnode_steps, slavef, comm, myid, bufr, lbufr, lbufr_bytes, nbfin, ipool, lpool, leaf, perm, istep_to_iniv2, tab_pos_in_pere, jobass, etatass, lrgroups, mumps_tps_arr, cmumps_tps_arr, l0_omp_mapping)
subroutine cmumps_fac_asm_niv2(comm_load, ass_irecv, n, inode, iw, liw, a, la, info, nd, fils, frere, dad, cand, istep_to_iniv2, tab_pos_in_pere, maxfrw, root, opassw, opeliw, ptrist, ptlust, ptrfac, ptrast, step, pimaster, pamaster, ptrarw, nstk_s, ptraiw, itloc, rhs_mumps, nsteps, comp, lrlu, iptrlu, iwpos, iwposcb, posfac, lrlus, icntl, keep, keep8, dkeep, intarr, lintarr, dblarr, ldblarr, procnode_steps, slavef, comm, myid, bufr, lbufr, lbufr_bytes, nbfin, leaf, ipool, lpool, perm, mem_distrib, lrgroups)
recursive subroutine, public cmumps_load_recv_msgs(comm)
subroutine, public cmumps_load_pool_upd_new_pool(pool, lpool, procnode, keep, keep8, slavef, comm, myid, step, n, nd, fils)
integer, public niv1_flag
integer, save, private myid
subroutine, public cmumps_load_mem_update(ssarbr, process_bande_arg, mem_value, new_lu, inc_mem_arg, keep, keep8, lrlus)
subroutine, public cmumps_upper_predict(inode, step, nsteps, procnode, frere, ne, comm, slavef, myid, keep, keep8, n)
integer, save, private comm_nodes
subroutine, public cmumps_load_sbtr_upd_new_pool(ok, inode, pool, lpool, myid, slavef, comm, keep, keep8)
subroutine, public cmumps_load_update(check_flops, process_bande, inc_load, keep, keep8)
subroutine, public cmumps_ooc_io_lu_panel(strat, typefile, afac, lafac, monbloc, lnextpiv2bewritten, unextpiv2bewritten, iw, liwfac, myid, filesize, ierr, last_call)
subroutine, public cmumps_new_factor(inode, ptrfac, keep, keep8, a, la, size, ierr)
subroutine cmumps_force_write_buf(ierr)
subroutine cmumps_ooc_force_wrt_buf_panel(ierr)