36 & , zmumps_l0ompfac_t
37 IMPLICIT NONE
38#if defined(V_T)
39 include 'VT.inc'
40#endif
41 TYPE ( ZMUMPS_ROOT_STRUC ) :: root
42 INTEGER(8) :: LA
43 INTEGER(8) :: LWC
44 INTEGER :: N,LIW,MTYPE,LIW1,LIWW,LNA
45 INTEGER ICNTL(60),INFO(80), KEEP(500)
46 DOUBLE PRECISION, intent(inout) :: DKEEP(230)
47 INTEGER(8) KEEP8(150)
48 INTEGER IW(LIW),IW1(LIW1),NA(LNA),NE_STEPS(KEEP(28)),IWCB(LIWW)
49 INTEGER STEP(N), FRERE(KEEP(28)), FILS(N), PTRIST(KEEP(28)),
50 & DAD(KEEP(28))
51 INTEGER(8) :: PTRFAC(KEEP(28))
52 INTEGER :: LIWK_PTRACB
53 INTEGER(8) :: PTRACB(LIWK_PTRACB)
54 INTEGER NRHS, LRHSCOMP, NB_FS_IN_RHSCOMP_F, NB_FS_IN_RHSCOMP_TOT
55 COMPLEX(kind=8) A(LA), W(LWC),
56 & W2(KEEP(133))
57 COMPLEX(kind=8) :: RHSCOMP(LRHSCOMP,NRHS)
58 INTEGER SLAVEF, COMM_NODES, MYID, MYID_NODES
59 INTEGER PROCNODE_STEPS(KEEP(28)), POSINRHSCOMP_FWD(N),
60 & POSINRHSCOMP_BWD()
61 INTEGER LBUFR, LBUFR_BYTES
62 INTEGER BUFR(LBUFR)
63 INTEGER ISTEP_TO_INIV2(KEEP(71)),
64 & TAB_POS_IN_PERE(SLAVEF+2,max(1,KEEP(56)))
65 INTEGER IBEG_ROOT_DEF, IEND_ROOT_DEF, IROOT_DEF_RHS_COL1
66 INTEGER SIZE_ROOT, MASTER_ROOT
67 INTEGER(8) :: LRHS_ROOT
68 COMPLEX(kind=8) RHS_ROOT(LRHS_ROOT)
69 LOGICAL, intent(in) :: FROM_PP
70 INTEGER, intent(in) :: NZ_RHS, NBCOL_INBLOC, NRHS_ORIG
71 INTEGER, intent(in) :: SIZE_UNS_PERM_INV
72 INTEGER, intent(in) :: SIZE_PERM_RHS
73 INTEGER, intent(in) :: JBEG_RHS
74 INTEGER, intent(in) :: IRHS_SPARSE(NZ_RHS)
75 INTEGER, intent(in) :: IRHS_PTR(NBCOL_INBLOC+1)
76 INTEGER, intent(in) :: PERM_RHS(SIZE_PERM_RHS)
77 INTEGER, intent(in) :: (SIZE_UNS_PERM_INV)
78 INTEGER, intent(in) :: LStep2node
79 INTEGER, intent(in) :: Step2node(LStep2node)
80 LOGICAL, intent(in) :: DO_NBSPARSE
81 INTEGER, intent(in) :: LRHS_BOUNDS
82 INTEGER, intent(inout) :: RHS_BOUNDS (LRHS_BOUNDS)
83 INTEGER, INTENT (IN) :: LPOOL_B_L0_OMP
84 INTEGER, INTENT (IN) :: IPOOL_B_L0_OMP( LPOOL_B_L0_OMP )
85 INTEGER, INTENT (IN) :: LPOOL_A_L0_OMP
86 INTEGER, INTENT (IN) :: IPOOL_A_L0_OMP( LPOOL_A_L0_OMP )
87 INTEGER, INTENT (IN) :: L_PHYS_L0_OMP
88 INTEGER, INTENT (INOUT) :: PHYS_L0_OMP( L_PHYS_L0_OMP )
89 INTEGER, INTENT (IN) :: L_VIRT_L0_OMP
90 INTEGER, INTENT (IN) :: VIRT_L0_OMP( L_VIRT_L0_OMP )
91 INTEGER, INTENT (IN) :: PERM_L0_OMP( L_PHYS_L0_OMP )
92 INTEGER, INTENT (IN) :: PTR_LEAFS_L0_OMP( L_PHYS_L0_OMP + 1)
93 INTEGER, INTENT (IN) :: LL0_OMP_MAPPING
94 INTEGER, INTENT (IN) :: L0_OMP_MAPPING( LL0_OMP_MAPPING )
95 INTEGER, INTENT (IN) :: LL0_OMP_FACTORS
96 TYPE (ZMUMPS_L0OMPFAC_T), INTENT(IN) ::
97 & L0_OMP_FACTORS(LL0_OMP_FACTORS)
98 INTEGER MP, LP, LDIAG
99 INTEGER K,I,II
100 INTEGER allocok
101 INTEGER LPOOL,MYLEAF,MYROOT,NBROOT,LPANEL_POS
102 INTEGER MYLEAF_NOT_PRUNED
103 INTEGER ,IPOOL,IPANEL_POS,PTRICB
104 INTEGER MTYPE_LOC
105 INTEGER MODE_RHS_BOUNDS
106 INTEGER IERR
107 INTEGER(8) :: IAPOS
108 INTEGER IOLDPS,
109 & LOCAL_M,
110 & LOCAL_N
111#if defined(V_T)
112 INTEGER soln_c_class, forw_soln, back_soln, root_soln
113#endif
114 LOGICAL DOFORWARD, DOROOT, DOBACKWARD
115 LOGICAL :: DO_L0OMP_FWD, DO_L0OMP_BWD
116 LOGICAL I_WORKED_ON_ROOT, SPECIAL_ROOT_REACHED
117 INTEGER IROOT
118 LOGICAL DOROOT_FWD_OOC, DOROOT_BWD_PANEL
119 LOGICAL SWITCH_OFF_ES
120 LOGICAL DUMMY_BOOL
121 INTEGER :: IDUMMY
122 INTEGER :: NBROOT_UNDER_L0
123 COMPLEX(kind=8), PARAMETER :: ZERO = (0.0d0,0.0d0)
124 include 'mumps_headers.h'
125 INTEGER, DIMENSION(:), ALLOCATABLE :: nodes_RHS
126 INTEGER nb_nodes_RHS
127 INTEGER nb_prun_leaves
128 INTEGER, DIMENSION(:), ALLOCATABLE :: Pruned_Leaves
129 INTEGER, DIMENSION(:), ALLOCATABLE :: Pruned_List
130 INTEGER nb_prun_nodes
131 INTEGER nb_prun_roots, JAM1
132 INTEGER, DIMENSION(:), ALLOCATABLE :: Pruned_SONS, Pruned_Roots
133 INTEGER :: SIZE_TO_PROCESS
134 LOGICAL, DIMENSION(:), ALLOCATABLE :: TO_PROCESS
135 INTEGER ISTEP, INODE_PRINC
136 INTEGER :: INODE, ICHILD
137 LOGICAL AM1, DO_PRUN
138 LOGICAL Exploit_Sparsity
139 LOGICAL DO_NBSPARSE_BWD, PRUN_BELOW_BWD
140 INTEGER :: OOC_FCT_TYPE_TMP
141 INTEGER :: MUMPS_OOC_GET_FCT_TYPE
143 DOUBLE PRECISION TIME_FWD,TIME_BWD,TIME_SpecialRoot
144 INTEGER :: nb_sparse
145 INTEGER, EXTERNAL :: MUMPS_PROCNODE
146 LOGICAL, EXTERNAL :: MUMPS_IN_OR_ROOT_SSARBR
147 myleaf = -1
148 lp = icntl(1)
149 mp = icntl(2)
150 ldiag = icntl(4)
151#if defined(V_T)
152 CALL vtclassdef( 'Soln_c',soln_c_class,ierr)
153 CALL vtfuncdef( 'forw_soln',soln_c_class,forw_soln,ierr)
154 CALL vtfuncdef( 'back_soln',soln_c_class,back_soln,ierr)
155 CALL vtfuncdef( 'root_soln',soln_c_class,root_soln,ierr)
156#endif
157 IF (.NOT. from_pp) THEN
159 ENDIF
160 nstk_s = 1
161 ptricb = nstk_s + keep(28)
162 ipool = ptricb + keep(28)
163 lpool = na(1) + 1
164 ipanel_pos = ipool + lpool
165 IF (keep(201).EQ.1) THEN
166 lpanel_pos = keep(228)+1
167 ELSE
168 lpanel_pos = 1
169 ENDIF
170 IF (ipanel_pos + lpanel_pos -1 .ne. liw1 ) THEN
171 WRITE(*,*) myid, ": Internal Error 1 in ZMUMPS_SOL_C",
172 & ipanel_pos, lpanel_pos, liw1
174 ENDIF
175 doforward = .true.
176 dobackward= .true.
177 special_root_reached = .true.
178 switch_off_es = .false.
179 IF ( keep(111).NE.0 .OR. keep(252).NE.0 ) THEN
180 doforward = .false.
181 ENDIF
182 IF (keep(221).eq.1) dobackward = .false.
183 IF (keep(221).eq.2) doforward = .false.
184 IF ( keep(60).EQ.0 .AND.
185 & (
186 & (keep(38).NE.0 .AND. root%yes)
187 & .OR.
188 & (keep(20).NE.0 .AND. myid_nodes.EQ.master_root)
189 & )
190 & .AND. keep(252).EQ.0
191 & )
192 &THEN
193 doroot = .true.
194 ELSE
195 doroot = .false.
196 ENDIF
197 doroot_bwd_panel = doroot .AND. mtype.NE.1 .AND. keep(50).EQ.0
198 & .AND. keep(201).EQ.1
199 doroot_fwd_ooc = doroot .AND. .NOT.doroot_bwd_panel
200 am1 = (keep(237) .NE. 0)
201 exploit_sparsity = (keep(235) .NE. 0) .AND. (.NOT. am1)
202 do_prun = (exploit_sparsity.OR.am1)
203 IF (from_pp) THEN
204 exploit_sparsity = .false.
205 do_prun = .false.
206 IF ( am1 ) THEN
207 WRITE(*,*) "Internal error 2 in ZMUMPS_SOL_C"
209 ENDIF
210 ENDIF
211 do_l0omp_fwd= ( (keep(401).GT.0).AND.(keep(400).GT.0)
212 & .AND.doforward )
213 do_l0omp_fwd = do_l0omp_fwd .AND. keep(201).EQ.0
214 do_l0omp_bwd = ( (keep(401).GT.0).AND.(keep(400).GT.0)
215 & .AND.dobackward )
216 do_l0omp_bwd = do_l0omp_bwd .AND. keep(201).EQ.0
217 IF ( do_prun ) THEN
218 ALLOCATE (pruned_sons(keep(28)), stat=i)
219 IF(i.GT.0) THEN
220 info(1)=-13
221 info(2)=keep(28)
222 END IF
224 IF(info(1).LT.0) GOTO 500
225 ENDIF
226 IF ( do_prun
227 & .OR. do_l0omp_bwd
228 & ) THEN
229 size_to_process = keep(28)
230 ELSE
231 size_to_process = 1
232 ENDIF
233 ALLOCATE (to_process(size_to_process), stat=i)
234 IF(i.GT.0) THEN
235 info(1)=-13
236 info(2)=keep(28)
237 END IF
239 IF(info(1).LT.0) GOTO 500
240 IF ( doforward .AND. do_prun ) THEN
241 nb_prun_nodes = 0
242 nb_prun_roots = 0
243 pruned_sons(:) = -1
244 IF ( exploit_sparsity ) THEN
245 nb_nodes_rhs = 0
246 DO i = 1, nz_rhs
247 istep = abs( step(irhs_sparse(i)) )
248 inode_princ = step2node( istep )
249 IF ( pruned_sons(istep) .eq. -1) THEN
250 nb_nodes_rhs = nb_nodes_rhs +1
251 pruned_sons(istep) = 0
252 ENDIF
253 ENDDO
254 ALLOCATE(nodes_rhs(nb_nodes_rhs), stat = allocok)
255 IF(allocok.GT.0) THEN
256 info(1)=-13
257 info(2)=nb_nodes_rhs
258 END IF
260 IF(info(1).LT.0) GOTO 500
261 nb_nodes_rhs = 0
262 pruned_sons = -1
263 DO i = 1, nz_rhs
264 istep = abs( step(irhs_sparse(i)) )
265 inode_princ = step2node( istep )
266 IF ( pruned_sons(istep) .eq. -1) THEN
267 nb_nodes_rhs = nb_nodes_rhs +1
268 nodes_rhs(nb_nodes_rhs) = inode_princ
269 pruned_sons(istep) = 0
270 ENDIF
271 ENDDO
272 ELSE IF ( am1 ) THEN
273 nb_nodes_rhs = 0
274 DO i = 1, nbcol_inbloc
275 IF ( (irhs_ptr(i+1)-irhs_ptr(i)).EQ.0) cycle
276 IF ( (keep(242) .NE. 0 ).OR. (keep(243).NE.0) ) THEN
277 jam1 = perm_rhs(jbeg_rhs+i-1)
278 ELSE
279 jam1 = jbeg_rhs+i-1
280 ENDIF
281 istep = abs(step(jam1))
282 inode_princ = step2node(istep)
283 IF ( pruned_sons(istep) .eq. -1) THEN
284 nb_nodes_rhs = nb_nodes_rhs +1
285 pruned_sons(istep) = 0
286 ENDIF
287 ENDDO
288 ALLOCATE(nodes_rhs(nb_nodes_rhs), stat = allocok)
289 IF(allocok.GT.0) THEN
290 info(1)=-13
291 info(2)=nb_nodes_rhs
292 END IF
294 IF(info(1).LT.0) GOTO 500
295 nb_nodes_rhs = 0
296 pruned_sons = -1
297 DO i = 1, nbcol_inbloc
298 IF ( (irhs_ptr(i+1)-irhs_ptr(i)).EQ.0) cycle
299 IF ( (keep(242) .NE. 0 ).OR. (keep(243).NE.0) ) THEN
300 jam1 = perm_rhs(jbeg_rhs+i-1)
301 ELSE
302 jam1 = jbeg_rhs+i-1
303 ENDIF
304 istep = abs(step(jam1))
305 inode_princ = step2node(istep)
306 IF ( pruned_sons(istep) .eq. -1) THEN
307 nb_nodes_rhs = nb_nodes_rhs +1
308 nodes_rhs(nb_nodes_rhs) = inode_princ
309 pruned_sons(istep) = 0
310 ENDIF
311 ENDDO
312 ENDIF
314 & .false.,
315 & dad, keep(28),
316 & step, n,
317 & nodes_rhs, nb_nodes_rhs,
318 & pruned_sons, to_process,
319 & nb_prun_nodes, nb_prun_roots,
320 & nb_prun_leaves )
321 ALLOCATE(pruned_list(nb_prun_nodes), stat=allocok)
322 IF(allocok.GT.0) THEN
323 info(1)=-13
324 info(2)=nb_prun_nodes
325 END IF
327 IF(info(1).LT.0) GOTO 500
328 ALLOCATE(pruned_roots(nb_prun_roots), stat=allocok)
329 IF(allocok.GT.0) THEN
330 info(1)=-13
331 info(2)=nb_prun_roots
332 END IF
334 IF(info(1).LT.0) GOTO 500
335 ALLOCATE(pruned_leaves(nb_prun_leaves), stat=allocok)
336 IF(allocok.GT.0) THEN
337 info(1)=-13
338 info(2)=nb_prun_leaves
339 END IF
341 IF(info(1).LT.0) GOTO 500
343 & .true.,
344 & dad, keep(28),
345 & step, n,
346 & nodes_rhs, nb_nodes_rhs,
347 & pruned_sons, to_process,
348 & nb_prun_nodes, nb_prun_roots, nb_prun_leaves,
349 & pruned_list, pruned_roots, pruned_leaves )
350 IF(allocated(nodes_rhs)) DEALLOCATE(nodes_rhs)
352 & keep(201), pruned_list, nb_prun_nodes,
353 & step)
354 IF ( keep(201) .GT. 0) THEN
356 & ('F',mtype,keep(201),keep(50))
357 ELSE
358 ooc_fct_type_tmp = -5959
359 ENDIF
361 & myid_nodes, n, keep(28), keep(201), keep(485),
362 & keep8(31)+keep8(64),
363 & step, pruned_list, nb_prun_nodes, ooc_fct_type_tmp
364 & )
365 IF (do_nbsparse) THEN
366 nb_sparse =
max(1,keep(497))
367 mode_rhs_bounds = 0
368 IF (exploit_sparsity) mode_rhs_bounds = 2
370 & step, n,
371 & irhs_ptr, nbcol_inbloc, irhs_sparse, nz_rhs,
372 & jbeg_rhs, perm_rhs, size_perm_rhs, keep(242), keep(243),
373 & uns_perm_inv, size_uns_perm_inv, keep(23),
374 & rhs_bounds, keep(28),
375 & nb_sparse, myid_nodes,
376 & mode_rhs_bounds)
378 & pruned_leaves, nb_prun_leaves,
379 & step, n, pruned_sons,
380 & dad, rhs_bounds, keep(28),
381 & myid_nodes, comm_nodes, keep(485),
382 & iw, liw, ptrist,keep(ixsz),ooc_fct_type_tmp,0,
383 & keep(50), keep(38))
384 END IF
385 special_root_reached = .false.
386 DO i= 1, nb_prun_roots
387 IF ( (pruned_roots(i).EQ.keep(38)).OR.
388 & (pruned_roots(i).EQ.keep(20)) ) THEN
389 special_root_reached = .true.
390 EXIT
391 ENDIF
392 ENDDO
393 DEALLOCATE(pruned_list)
394 ENDIF
395 IF (keep(201).GT.0) THEN
396 IF (doforward .OR. doroot_fwd_ooc) THEN
398 & a,la,doforward,ierr)
399 IF(ierr.LT.0)THEN
400 info(1)=ierr
401 info(2)=0
403 ENDIF
404 ENDIF
405 ENDIF
406 IF (doforward) THEN
407 IF ( keep( 50 ) .eq. 0 ) THEN
408 mtype_loc = mtype
409 ELSE
410 mtype_loc = 1
411 ENDIF
412#if defined(v_t)
413 CALL vtbegin(forw_soln,ierr)
414#endif
415 IF ( .NOT. do_prun ) THEN
417 & slavef, na, lna, keep, step, procnode_steps)
418 DO istep =1, keep(28)
419 iw1(nstk_s+istep-1) = ne_steps(istep)
420 ENDDO
421 ELSE
423 & nb_prun_roots, pruned_roots,
424 & myroot, myid_nodes, slavef, keep, step,
425 & procnode_steps )
426 IF (am1) THEN
427 DEALLOCATE(pruned_roots)
428 END IF
429 IF ((exploit_sparsity).AND.(nb_prun_roots.EQ.na(2))) THEN
430 DEALLOCATE(pruned_roots)
431 switch_off_es = .true.
432 ENDIF
433 DO istep = 1, keep(28)
434 iw1(nstk_s+istep-1) = pruned_sons(istep)
435 ENDDO
436 ENDIF
437 IF ( do_l0omp_fwd ) THEN
439 & iw1(ptricb), rhscomp, lrhscomp, posinrhscomp_fwd,
440 & step, frere, dad, fils, iw1(nstk_s),
441 & ptrist, ptrfac, info,
442 & keep, keep8, dkeep, procnode_steps, slavef,
443 & comm_nodes, myid_nodes,
444 & bufr, lbufr, lbufr_bytes,
445 & rhs_root, lrhs_root,
446 & istep_to_iniv2, tab_pos_in_pere,
447 & rhs_bounds, lrhs_bounds, do_nbsparse,
448 & from_pp,
449 & nbroot_under_l0,
450 & lpool_b_l0_omp, ipool_b_l0_omp,
451 & l_virt_l0_omp, virt_l0_omp,
452 & l_phys_l0_omp, phys_l0_omp,
453 & perm_l0_omp, ptr_leafs_l0_omp,
454 & l0_omp_mapping, ll0_omp_mapping,
455 & l0_omp_factors, ll0_omp_factors,
456 & do_prun, to_process
457 & )
458 myroot = myroot - nbroot_under_l0
459 IF ( do_prun ) THEN
460 myleaf_not_pruned = ipool_a_l0_omp(lpool_a_l0_omp)
461 DO i=1, myleaf_not_pruned
462 IF ( to_process( step( ipool_a_l0_omp(i) ))) THEN
463 iw1(ipool+myleaf-1) = ipool_a_l0_omp(i)
464 iw1(nstk_s+step(ipool_a_l0_omp(i))-1) = -99
465 ENDIF
466 ENDDO
467 DO i = 1, nb_prun_leaves
468 inode = pruned_leaves(i)
470 & .EQ. myid_nodes ) THEN
471 IF (l0_omp_mapping( step(inode) ) .EQ. 0) THEN
472 iw1(nstk_s+step(inode)-1) = -99
473 ENDIF
474 ENDIF
475 ENDDO
476 DO i = 1, l_phys_l0_omp
477 inode = dad(step(phys_l0_omp(i)))
478 IF (inode .NE. 0) THEN
479 IF ( to_process( step( inode ))) THEN
480 IF ( iw1(nstk_s+step(inode)-1) .EQ. 0 ) THEN
481 iw1(nstk_s+step(inode)-1) = -99
482 ENDIF
483 ENDIF
484 ENDIF
485 ENDDO
486 myleaf = 0
487 DO istep = keep(28), 1, -1
488 inode=step2node(istep)
489 IF (iw1(nstk_s+step(inode)-1).EQ.-99) THEN
490 myleaf = myleaf + 1
491 iw1(ipool+myleaf-1) = inode
492 iw1(nstk_s+step(inode)-1) = 0
493 ENDIF
494 ENDDO
495 DEALLOCATE(pruned_leaves)
496 ELSE
497 myleaf = ipool_a_l0_omp(lpool_a_l0_omp)
498 DO i=1, myleaf
499 iw1(ipool+i-1) = ipool_a_l0_omp(i)
500 ENDDO
501 ENDIF
502 ELSE
503 IF ( do_prun ) THEN
505 & nb_prun_leaves, pruned_leaves, keep, keep8,
506 & step, procnode_steps, iw1(ipool), lpool )
507 myleaf = myleaf - 1
508 DEALLOCATE(pruned_leaves)
509 ELSE
511 & slavef, na, lna, keep, keep8, step,
512 & procnode_steps, iw1(ipool), lpool )
513 myleaf = myleaf - 1
514 ENDIF
515 ENDIF
517 & lwc, nrhs,
518 & iw1(ptricb), iwcb, liww,
519 & rhscomp,lrhscomp,posinrhscomp_fwd,
520 & step, frere,dad,fils,
521 & iw1(nstk_s),iw1(ipool),lpool,ptrist,ptrfac,
522 & myleaf, myroot, info,
523 & keep, keep8, dkeep,
524 & procnode_steps, slavef, comm_nodes, myid_nodes,
525 & bufr, lbufr, lbufr_bytes,
526 & rhs_root, lrhs_root, mtype_loc,
527 &
528 & istep_to_iniv2, tab_pos_in_pere
529 & , rhs_bounds, lrhs_bounds, do_nbsparse, from_pp
530 & , l0_omp_mapping, ll0_omp_mapping,
531 & l0_omp_factors, ll0_omp_factors
532 & )
533 IF (do_prun) THEN
534 myleaf = -1
535 ENDIF
536#if defined(V_T)
537 CALL vtend(forw_soln,ierr)
538#endif
539 ENDIF
541 IF ( info(1) .LT. 0 ) THEN
542 IF ( lp .GT. 0 ) THEN
543 WRITE(lp,*) myid,
544 & ': ** ERROR RETURN FROM ZMUMPS_SOL_R,INFO(1:2)=',
545 & info(1:2)
546 END IF
547 GOTO 500
548 END IF
550 IF (.NOT.from_pp) THEN
552 dkeep(117)=time_fwd + dkeep(117)
553 ENDIF
554 IF (do_prun.AND.switch_off_es) THEN
555 do_prun = .false.
556 exploit_sparsity = .false.
557 IF (.NOT. do_l0omp_bwd ) THEN
558 IF ( allocated(to_process) .AND. size_to_process.NE.1 ) THEN
559 DEALLOCATE (to_process)
560 size_to_process = 1
561 ALLOCATE(to_process(size_to_process),stat=i)
562 ENDIF
563 ENDIF
564 ENDIF
565 IF ( dobackward .AND. do_prun ) THEN
566 nb_prun_leaves = 0
567 IF ( exploit_sparsity .AND. (keep(111).EQ.0) ) THEN
568 nb_nodes_rhs = nb_prun_roots
569 ALLOCATE(nodes_rhs(nb_nodes_rhs), stat = allocok)
570 IF(allocok.GT.0) THEN
571 WRITE(*,*)'Problem with allocation of nodes_RHS'
572 info(1) = -13
573 info(2) = nb_nodes_rhs
575 END IF
576 nodes_rhs(1:nb_prun_roots)=pruned_roots(1:nb_prun_roots)
577 DEALLOCATE(pruned_roots)
578 ELSE
579 nb_nodes_rhs = 0
580 pruned_sons(:) = -1
581 DO ii = 1, nz_rhs
582 i = irhs_sparse(ii)
583 IF (keep(23).NE.0) i = uns_perm_inv(i)
584 istep = abs(step(i))
585 IF ( pruned_sons(istep) .eq. -1) THEN
586 nb_nodes_rhs = nb_nodes_rhs +1
587 pruned_sons(istep) = 0
588 ENDIF
589 ENDDO
590 ALLOCATE(nodes_rhs(nb_nodes_rhs), stat = allocok)
591 IF(allocok.GT.0) THEN
592 WRITE(*,*)'Problem with allocation of nodes_RHS'
593 info(1) = -13
594 info(2) = nb_nodes_rhs
596 END IF
597 nb_nodes_rhs = 0
598 pruned_sons(:) = -1
599 DO ii = 1, nz_rhs
600 i = irhs_sparse(ii)
601 IF (keep(23).NE.0) i = uns_perm_inv(i)
602 istep = abs(step(i))
603 inode_princ = step2node(istep)
604 IF ( pruned_sons(istep) .eq. -1) THEN
605 nb_nodes_rhs = nb_nodes_rhs +1
606 nodes_rhs(nb_nodes_rhs) = inode_princ
607 pruned_sons(istep) = 0
608 ENDIF
609 ENDDO
610 ENDIF
611 IF ( exploit_sparsity ) THEN
613 & .false.,
614 & dad, ne_steps, frere, keep(28),
615 & fils, step, n,
616 & nodes_rhs, nb_nodes_rhs,
617 & to_process,
618 & nb_prun_nodes, nb_prun_roots, nb_prun_leaves
619 & )
620 ALLOCATE(pruned_list(nb_prun_nodes), stat=allocok)
621 IF(allocok.GT.0) THEN
622 info(1)=-13
623 info(2)=nb_prun_nodes
624 END IF
626 IF(info(1).LT.0) GOTO 500
627 ALLOCATE(pruned_roots(nb_prun_roots), stat=allocok)
628 IF(allocok.GT.0) THEN
629 info(1)=-13
630 info(2)=nb_prun_roots
631 END IF
633 IF(info(1).LT.0) GOTO 500
634 ALLOCATE(pruned_leaves(nb_prun_leaves), stat=allocok)
635 IF(allocok.GT.0) THEN
636 info(1)=-13
637 info(2)=nb_prun_leaves
638 END IF
640 IF(info(1).LT.0) GOTO 500
642 & .true.,
643 & dad, ne_steps, frere, keep(28),
644 & fils, step, n,
645 & nodes_rhs, nb_nodes_rhs,
646 & to_process,
647 & nb_prun_nodes, nb_prun_roots, nb_prun_leaves,
648 & pruned_list, pruned_roots, pruned_leaves
649 & )
651 & keep(201), pruned_list, nb_prun_nodes,
652 & step)
653 IF(allocated(nodes_rhs)) DEALLOCATE(nodes_rhs)
654 IF (keep(201).GT.0) THEN
656 & ('B',mtype,keep(201),keep(50))
657 ELSE
658 ooc_fct_type_tmp = -5959
659 ENDIF
661 & myid_nodes, n, keep(28), keep(201),
662 & keep8(31)+keep8(64),
663 & step,
664 & pruned_list,
665 & nb_prun_nodes, ooc_fct_type_tmp)
666 ENDIF
667 ENDIF
668 IF(keep(201).EQ.1.AND.doroot_bwd_panel) THEN
669 i_worked_on_root = .false.
671 & i_worked_on_root, iroot, a, la, ierr)
672 IF (ierr .LT. 0) THEN
673 info(1) = -90
674 info(2) = ierr
675 ENDIF
676 ENDIF
677 IF (keep(201).EQ.1) THEN
679 IF ( info(1) .LT. 0 ) GOTO 500
680 ENDIF
681 IF (keep(60).NE.0 .AND. keep(221).EQ.0
682 & .AND. myid_nodes .EQ. master_root) THEN
683 rhs_root(1:nrhs*size_root) = zero
684 ENDIF
685 IF (.NOT. from_pp) THEN
687 ENDIF
688 IF ( ( keep( 38 ) .NE. 0 ).AND. special_root_reached ) THEN
689 IF ( keep(60) .EQ. 0 .AND. keep(252) .EQ. 0 ) THEN
690 IF ( root%yes ) THEN
691 IF (keep(201).GT.0) THEN
692 IF ( (exploit_sparsity.AND.(keep(111).NE.0)) .and.
694 GOTO 1010
695 ENDIF
696 ENDIF
697 ioldps = ptrist(step(keep(38)))
698 local_m = iw( ioldps + 2 + keep(ixsz))
699 local_n = iw( ioldps + 1 + keep(ixsz))
700 IF (keep(201).GT.0) THEN
702 & keep(38),ptrfac,keep,a,la,
703 & step,keep8,n,dummy_bool,ierr)
704 IF(ierr.LT.0)THEN
705 info(1)=ierr
706 info(2)=0
707 WRITE(*,*) '** ERROR after ZMUMPS_SOLVE_GET_OOC_NODE',
708 & info(1)
710 ENDIF
711 ENDIF
712 iapos = ptrfac(iw( ioldps + 4 + keep(ixsz)))
713 IF (local_m * local_n .EQ. 0) THEN
714 iapos =
min(iapos, la)
715 ENDIF
716#if defined(V_T)
717 CALL vtbegin(root_soln,ierr)
718#endif
720 & root%CNTXT_BLACS, local_m, local_n,
721 & root%MBLOCK, root%NBLOCK,
722 & root%IPIV(1), root%LPIV, master_root, myid_nodes,
723 & comm_nodes,
724 & rhs_root(1),
725 & root%TOT_ROOT_SIZE, a( iapos ),
726 & info(1), mtype, keep(50), from_pp)
727 IF(keep(201).GT.0)THEN
729 & ptrfac,keep(28),a,la,.false.,ierr)
730 IF(ierr.LT.0)THEN
731 info(1)=ierr
732 info(2)=0
733 WRITE(*,*)
734 & '** ERROR after ZMUMPS_FREE_FACTORS_FOR_SOLVE ',
735 & info(1)
737 ENDIF
738 ENDIF
739 ENDIF
740 ENDIF
741 ELSE IF ( ( keep(20) .NE. 0) .AND. special_root_reached ) THEN
742 IF ( myid_nodes .eq. master_root ) THEN
743 END IF
744 END IF
745 IF (.NOT.from_pp) THEN
747 dkeep(119)=time_specialroot + dkeep(119)
748 ENDIF
749#if defined(V_T)
750 CALL vtend(root_soln,ierr)
751#endif
752 1010 CONTINUE
754 IF ( info(1) .LT. 0 ) RETURN
755 IF (dobackward) THEN
756 IF ( keep(201).GT.0 .AND. .NOT. doroot_bwd_panel )
757 & THEN
758 i_worked_on_root = doroot
759 IF (keep(38).gt.0 ) THEN
760 IF ( ( exploit_sparsity.AND.(keep(111).EQ.0) )
761 & .OR. am1 ) THEN
764 ENDIF
765 ENDIF
766 IF (exploit_sparsity.AND.(keep(111).NE.0)) THEN
768 i_worked_on_root = .false.
769 ENDIF
770 ENDIF
771 ENDIF
772 ENDIF
773 IF (.NOT.am1) THEN
774 do_nbsparse_bwd = .false.
775 ELSE
776 do_nbsparse_bwd = do_nbsparse
777 ENDIF
778 prun_below_bwd = am1
779 prun_below_bwd = prun_below_bwd .OR. do_l0omp_bwd
780 IF ( am1 ) THEN
782 & .false.,
783 & dad, keep(28),
784 & step, n,
785 & nodes_rhs, nb_nodes_rhs,
786 & pruned_sons, to_process,
787 & nb_prun_nodes, nb_prun_roots,
788 & nb_prun_leaves)
789 ALLOCATE(pruned_list(nb_prun_nodes), stat=allocok)
790 IF(allocok.GT.0) THEN
791 info(1)=-13
792 info(2)=nb_prun_nodes
793 END IF
795 IF(info(1).LT.0) GOTO 500
796 ALLOCATE(pruned_roots(nb_prun_roots), stat=allocok)
797 IF(allocok.GT.0) THEN
798 info(1)=-13
799 info(2)=nb_prun_roots
800 END IF
802 IF(info(1).LT.0) GOTO 500
803 ALLOCATE(pruned_leaves(nb_prun_leaves), stat=allocok)
804 IF(allocok.GT.0) THEN
805 info(1)=-13
806 info(2)=nb_prun_leaves
807 END IF
809 IF(info(1).LT.0) GOTO 500
811 & .true.,
812 & dad, keep(28),
813 & step, n,
814 & nodes_rhs, nb_nodes_rhs,
815 & pruned_sons, to_process,
816 & nb_prun_nodes, nb_prun_roots, nb_prun_leaves,
817 & pruned_list, pruned_roots, pruned_leaves )
819 & keep(201), pruned_list, nb_prun_nodes,
820 & step)
821 IF (keep(201).GT.0) THEN
823 & ('B',mtype,keep(201),keep(50))
824 ELSE
825 ooc_fct_type_tmp
826 ENDIF
828 & myid_nodes, n, keep(28), keep(201), keep(485), keep8(31),
829 & step, pruned_list, nb_prun_nodes, ooc_fct_type_tmp
830 & )
831 IF (do_nbsparse_bwd) THEN
832 nb_sparse =
max(1,keep(497))
834 & step, n,
835 & irhs_ptr, nbcol_inbloc, irhs_sparse, nz_rhs,
836 & jbeg_rhs, perm_rhs, size_perm_rhs, keep(242), keep(243),
837 & uns_perm_inv, size_uns_perm_inv, keep(23),
838 & rhs_bounds, keep(28),
839 & nb_sparse, myid_nodes,
840 & 1)
842 & pruned_leaves, nb_prun_leaves,
843 & step, n, pruned_sons,
844 & dad, rhs_bounds, keep(28),
845 & myid_nodes, comm_nodes, keep(485),
846 & iw, liw, ptrist,keep(ixsz),ooc_fct_type_tmp,1,
847 & keep(50), keep(38))
848 END IF
849 ENDIF
850 IF ( keep(201).GT.0 ) THEN
851 iroot =
max(keep(20),keep(38))
853 & i_worked_on_root, iroot, a, la, ierr)
854 ENDIF
855 IF ( keep( 50 ) .eq. 0 ) THEN
856 mtype_loc = mtype
857 ELSE
858 mtype_loc = 0
859 ENDIF
860#if defined(V_T)
861 CALL vtbegin(back_soln,ierr)
862#endif
863 IF (.NOT.from_pp) THEN
865 ENDIF
866 IF ( .NOT.special_root_reached ) THEN
867 rhs_root(1:nrhs*size_root) = zero
868 ENDIF
869 IF (am1.AND.(nb_fs_in_rhscomp_f.NE.nb_fs_in_rhscomp_tot)) THEN
870 DO i =1, n
871 ii = posinrhscomp_bwd(i)
872 IF ((ii.GT.0).AND.(ii.GT.nb_fs_in_rhscomp_f)) THEN
873 DO k=1,nrhs
874 rhscomp(ii, k) = zero
875 ENDDO
876 ENDIF
877 ENDDO
878 ENDIF
879 IF ( .NOT. do_prun ) THEN
880 IF ( .NOT. do_l0omp_bwd ) THEN
881 IF (do_l0omp_fwd) THEN
882 myleaf = -1
883 ENDIF
884 ENDIF
885 IF ( do_l0omp_bwd ) THEN
886 to_process(:) = .true.
887 DO i=1, l_phys_l0_omp
888 to_process( step(phys_l0_omp( i )))
889 & = .false.
890 ENDDO
891 IF (myleaf .EQ. -1) THEN
892 myleaf = ipool_a_l0_omp(lpool_a_l0_omp)
893 ENDIF
895 & na, lna, keep, keep8, step, procnode_steps,
896 & iw1(ipool), lpool, l0_omp_mapping )
897 ELSE
899 & na, lna, keep, keep8, step, procnode_steps
900 & iw1(ipool), lpool )
901 IF (myleaf .EQ. -1) THEN
903 & na(1),
904 & na(3),
905 & myleaf, myid_nodes, slavef, keep, step,
906 & procnode_steps )
907 ENDIF
908 ENDIF
909 ELSE
910 IF ( do_l0omp_bwd ) THEN
911 DO i=1, l_phys_l0_omp
912 IF ( to_process( step(phys_l0_omp( i ))) ) THEN
913 to_process( step(phys_l0_omp( i ))) = .false.
914 phys_l0_omp( i ) = -phys_l0_omp( i )
915 ENDIF
916 ENDDO
917 myleaf=0
918 DO istep = 1, keep(28)
920 & .NE. myid_nodes ) THEN
921 cycle
922 ENDIF
923 IF ( l0_omp_mapping( istep ) .NE. 0 ) THEN
924 cycle
925 ENDIF
926 IF ( .NOT. to_process( istep ) ) THEN
927 cycle
928 ENDIF
929 i = step2node( istep )
930 ichild = fils( i )
931 DO WHILE ( ichild .GT. 0 )
932 ichild = fils( ichild )
933 END DO
934 IF ( ichild .LT. 0 ) THEN
935 ichild = -ichild
936 DO WHILE ( ichild .GT. 0 )
937 IF ( l0_omp_mapping( step( ichild ) ) .EQ. 0 .AND.
938 & to_process(step( ichild )) ) THEN
939 GOTO 10
940 ENDIF
941 ichild = frere( step( ichild ) )
942 ENDDO
943 ENDIF
944 myleaf = myleaf + 1
945 10 CONTINUE
946 ENDDO
948 & myid_nodes,
949 & na, lna, keep, keep8, step, procnode_steps,
950 & iw1(ipool), lpool, l0_omp_mapping, to_process )
951 ELSE
953 & pruned_roots,
954 & myroot, myid_nodes, keep, keep8, step, procnode_steps,
955 & iw1(ipool), lpool)
957 & nb_prun_leaves, pruned_leaves,
958 & myleaf, myid_nodes, slavef, keep, step,
959 & procnode_steps )
960 ENDIF
961 ENDIF
962 IF ( do_l0omp_bwd
963 & ) THEN
964 keep(31) = 1
965 ELSE
966 keep(31) = 0
967 ENDIF
968 IF (keep(31) .EQ. 1) THEN
969 DO i = 1, keep(28)
971 & myid_nodes) THEN
973 & keep(199)) ) THEN
974 IF ( l0_omp_mapping(i) .EQ. 0 ) THEN
975 IF ( do_prun
976 & .OR. do_l0omp_bwd
977 & ) THEN
978 IF ( to_process(i) ) THEN
979 keep(31) = keep(31) + 1
980 ENDIF
981 ELSE
982 keep(31) = keep(31) + 1
983 ENDIF
984 ENDIF
985 ENDIF
986 ENDIF
987 ENDDO
988 ENDIF
990 & nrhs,
991 & rhscomp, lrhscomp, posinrhscomp_bwd,
992 & iw1(ptricb),ptracb,iwcb,liww, w2,
993 & ne_steps,
994 & step, frere,dad,fils,
995 & iw1(ipool),lpool,ptrist,ptrfac,myleaf,myroot,icntl,info,
996 & procnode_steps, slavef, comm_nodes, myid_nodes,
997 & bufr, lbufr, lbufr_bytes, keep, keep8, dkeep,
998 & rhs_root, lrhs_root,
999 & mtype_loc,
1000 & istep_to_iniv2, tab_pos_in_pere, iw1(ipanel_pos),
1001 & lpanel_pos, prun_below_bwd, to_process, size_to_process
1002 & , rhs_bounds, lrhs_bounds, do_nbsparse_bwd
1003 & , from_pp
1004 & , l0_omp_mapping, ll0_omp_mapping,
1005 & l0_omp_factors, ll0_omp_factors
1006 & )
1007 IF ( do_l0omp_bwd .AND. do_prun ) THEN
1008 DO i = 1, l_phys_l0_omp
1009 IF ( phys_l0_omp( i ) .LT. 0 ) THEN
1010 phys_l0_omp( i ) = -phys_l0_omp( i )
1011 to_process(step(phys_l0_omp( i ) )) = .true.
1012 ENDIF
1013 ENDDO
1014 ENDIF
1015 IF (do_l0omp_bwd .AND. info(1) .GE. 0) THEN
1016 keep(31) = 0
1017 prun_below_bwd = am1
1019 & iw1(ptricb), ptracb, rhscomp, lrhscomp, posinrhscomp_bwd,
1020 & step, frere, fils, ne_steps, ptrist, ptrfac, info,
1021 & keep, keep8, dkeep, procnode_steps, slavef,
1022 & comm_nodes, myid_nodes, bufr, lbufr, lbufr_bytes,
1023 & rhs_root, lrhs_root, istep_to_iniv2, tab_pos_in_pere,
1024 & iw1(ipanel_pos), lpanel_pos,
1025 & prun_below_bwd, to_process, size_to_process,
1026 & rhs_bounds, lrhs_bounds, do_nbsparse_bwd,
1027 & from_pp,
1028 & lpool_b_l0_omp,
1029 & l_virt_l0_omp, virt_l0_omp,
1030 & l_phys_l0_omp, phys_l0_omp,
1031 & perm_l0_omp, ptr_leafs_l0_omp,
1032 & l0_omp_mapping, ll0_omp_mapping,
1033 & l0_omp_factors, ll0_omp_factors )
1034 ENDIF
1036 & bufr, lbufr,lbufr_bytes,
1037 & comm_nodes, idummy,
1038 & slavef, .true., .false. )
1040#if defined(V_T)
1041 CALL vtend(back_soln,ierr)
1042#endif
1043 IF (.NOT.from_pp) THEN
1045 dkeep(118)=time_bwd+dkeep(118)
1046 ENDIF
1047 ENDIF
1048 IF (ldiag.GT.2 .AND. mp.GT.0) THEN
1049 IF (doforward) THEN
1050 k = min0(10,size(rhscomp,1))
1051 IF (ldiag.EQ.4) k = size(rhscomp,1)
1052 IF ( .NOT. from_pp) THEN
1053 WRITE (mp,99992)
1054 IF (size(rhscomp,1).GT.0)
1055 & WRITE (mp,99993) (rhscomp(i,1),i=1,k)
1056 IF (size(rhscomp,1).GT.0.and.nrhs>1)
1057 & WRITE (mp,99994) (rhscomp(i,2),i=1,k)
1058 ENDIF
1059 ENDIF
1060 ENDIF
1061500 CONTINUE
1062 IF ( allocated(to_process)) DEALLOCATE (to_process)
1063 IF (exploit_sparsity.OR.am1.OR.switch_off_es) THEN
1064 IF ( allocated(nodes_rhs)) DEALLOCATE (nodes_rhs)
1065 IF ( allocated(pruned_sons)) DEALLOCATE (pruned_sons)
1066 IF ( allocated(pruned_roots)) DEALLOCATE (pruned_roots)
1067 IF ( allocated(pruned_list)) DEALLOCATE (pruned_list)
1068 IF ( allocated(pruned_leaves)) DEALLOCATE (pruned_leaves)
1069 ENDIF
1070 RETURN
107199993 FORMAT (' RHS (internal, first column)'/(1x,1p,5d14.6))
107299994 FORMAT (' RHS (internal, 2 nd column)'/(1x,1p,5d14.6))
107399992 FORMAT (//' LEAVING SOLVE (ZMUMPS_SOL_C) WITH')
subroutine mpi_barrier(comm, ierr)
integer function mumps_ooc_get_fct_type(fwdorbwd, mtype, k201, k50)
integer, dimension(:), allocatable ooc_state_node
subroutine zmumps_free_factors_for_solve(inode, ptrfac, nsteps, a, la, flag, ierr)
subroutine zmumps_ooc_set_states_es(n, keep201, pruned_list, nb_prun_nodes, step)
subroutine, public zmumps_solve_init_ooc_fwd(ptrfac, nsteps, mtype, a, la, doprefetch, ierr)
subroutine, public zmumps_solve_init_ooc_bwd(ptrfac, nsteps, mtype, i_worked_on_root, iroot, a, la, ierr)
subroutine, public zmumps_chain_prun_nodes(fill, dad, keep28, step, n, nodes_rhs, nb_nodes_rhs, pruned_sons, to_process, nb_prun_nodes, nb_prun_roots, nb_prun_leaves, pruned_list, pruned_roots, pruned_leaves)
subroutine, public zmumps_chain_prun_nodes_stats(myid, n, keep28, keep201, keep485, fr_fact, step, pruned_list, nb_prun_nodes, ooc_fct_type_loc)
subroutine, public zmumps_propagate_rhs_bounds(pruned_leaves, nb_pruned_leaves, step, n, pruned_sons, dad, rhs_bounds, nsteps, myid, comm, keep485, iw, liw, ptrist, kixsz, ooc_fct_loc, phase, ldlt, k38)
subroutine, public zmumps_tree_prun_nodes(fill, dad, ne_steps, frere, keep28, fils, step, n, nodes_rhs, nb_nodes_rhs, to_process, nb_prun_nodes, nb_prun_roots, nb_prun_leaves, pruned_list, pruned_roots, pruned_leaves)
subroutine, public zmumps_initialize_rhs_bounds(step, n, irhs_ptr, nbcol, irhs_sparse, nz_rhs, jbeg_rhs, perm_rhs, size_perm_rhs, k242, k243, uns_perm_inv, size_uns_perm_inv, k23, rhs_bounds, nsteps, nb_sparse, myid, mode)
subroutine, public zmumps_tree_prun_nodes_stats(myid, n, keep28, keep201, fr_fact, step, pruned_list, nb_prun_nodes, ooc_fct_type_loc)
subroutine zmumps_sol_l0omp_s(n, mtype, nrhs, liw, iw, ptricb, ptracb, rhscomp, lrhscomp, posinrhscomp_bwd, step, frere, fils, ne_steps, ptrist, ptrfac, info, keep, keep8, dkeep, procnode_steps, slavef, comm, myid, bufr, lbufr, lbufr_bytes, rhs_root, lrhs_root, istep_to_iniv2, tab_pos_in_pere, panel_pos, lpanel_pos, prun_below_bwd, to_process, size_to_process, rhs_bounds, lrhs_bounds, do_nbsparse, from_pp, lpool_b_l0_omp, l_virt_l0_omp, virt_l0_omp, l_phys_l0_omp, phys_l0_omp, perm_l0_omp, ptr_leafs_l0_omp, l0_omp_mapping, ll0_omp_mapping, l0_omp_factors, ll0_omp_factors)
subroutine zmumps_sol_l0omp_r(n, mtype, nrhs, liw, iw, ptricb, rhscomp, lrhscomp, posinrhscomp_fwd, step, frere, dad, fils, nstk, ptrist, ptrfac, info, keep, keep8, dkeep, procnode_steps, slavef, comm, myid, bufr, lbufr, lbufr_bytes, rhs_root, lrhs_root, istep_to_iniv2, tab_pos_in_pere, rhs_bounds, lrhs_bounds, do_nbsparse, from_pp, nbroot_under_l0, lpool_b_l0_omp, ipool_b_l0_omp, l_virt_l0_omp, virt_l0_omp, l_phys_l0_omp, phys_l0_omp, perm_l0_omp, ptr_leafs_l0_omp, l0_omp_mapping, ll0_omp_mapping, l0_omp_factors, ll0_omp_factors, do_prun, to_process)
subroutine zmumps_clean_pending(info1, keep, bufr, lbufr, lbufr_bytes, comm_nodes, comm_load, slavef, clean_comm_nodes, clean_comm_load)
subroutine zmumps_solve_get_ooc_node(inode, ptrfac, keep, a, la, step, keep8, n, must_be_permuted, ierr)
subroutine zmumps_sol_s(n, a, la, iw, liw, w, lwc, nrhs, rhscomp, lrhscomp, posinrhscomp_bwd, ptricb, ptracb, iwcb, liww, w2, ne_steps, step, frere, dad, fils, ipool, lpool, ptrist, ptrfac, myleaf, myroot, icntl, info, procnode_steps, slavef, comm, myid, bufr, lbufr, lbufr_bytes, keep, keep8, dkeep, rhs_root, lrhs_root, mtype, istep_to_iniv2, tab_pos_in_pere, panel_pos, lpanel_pos, prun_below, to_process, size_to_process, rhs_bounds, lrhs_bounds, do_nbsparse, from_pp, l0_omp_mapping, ll0_omp_mapping, l0_omp_factors, ll0_omp_factors)
subroutine zmumps_sol_r(n, a, la, iw, liw, wcb, lwcb, nrhs, ptricb, iwcb, liwcb, rhscomp, lrhscomp, posinrhscomp_fwd, step, frere, dad, fils, nstk, ipool, lpool, ptrist, ptrfac, myleaf, myroot, info, keep, keep8, dkeep, procnode_steps, slavef, comm, myid, bufr, lbufr, lbufr_bytes, rhs_root, lrhs_root, mtype, istep_to_iniv2, tab_pos_in_pere, rhs_bounds, lrhs_bounds, do_nbsparse, from_pp, l0_omp_mapping, ll0_omp_mapping, l0_omp_factors, ll0_omp_factors)
subroutine zmumps_root_solve(nrhs, desca_par, cntxt_par, local_m, local_n, mblock, nblock, ipiv, lpiv, master_root, myid, comm, rhs_seq, size_root, a, info, mtype, ldlt)