26 include
'mumps_headers.h'
30 INTEGER,
INTENT(IN) :: keep201
31 INTEGER(8),
POINTER,
DIMENSION(:,:) :: size_of_block_arg
41 & DAD, NE_STEPS, FRERE, KEEP28,
43 & nodes_RHS, nb_nodes_RHS,
45 & nb_prun_nodes, nb_prun_roots, nb_prun_leaves,
46 & Pruned_List, Pruned_Roots, Pruned_Leaves
49 LOGICAL,
INTENT(IN) ::
50 INTEGER,
INTENT(IN) :: n, keep28
51 INTEGER,
INTENT(IN) :: (keep28),ne_steps(keep28),frere(keep28)
52 INTEGER,
INTENT(IN) :: fils(n), step(n)
53 INTEGER,
INTENT(IN) :: nodes_rhs(keep28), nb_nodes_rhs
54 INTEGER :: nb_prun_nodes
55 INTEGER,
OPTIONAL,
INTENT(INOUT):: pruned_list(nb_prun_nodes)
57 INTEGER,
OPTIONAL,
INTENT(INOUT):: pruned_roots(nb_prun_roots)
58 INTEGER :: nb_prun_leaves
59 INTEGER,
OPTIONAL,
INTENT(INOUT):
60LOGICAL :: to_process(keep28)
61 INTEGER :: in, i, , tmp, tmpsave
65 to_process(:) = .false.
66 DO i = 1, nb_nodes_rhs
70 DO WHILE(.NOT.to_process(istep))
71 to_process(istep) = .true.
72 nb_prun_nodes = nb_prun_nodes + 1
74 pruned_list(nb_prun_nodes) = tmp
80 fils_visited = .false.
82 fils_visited = to_process(step(-in))
84 IF ( in.LT.0.and..NOT.fils_visited)
90 nb_prun_leaves = nb_prun_leaves + 1
92 pruned_leaves(nb_prun_leaves) = tmp
98 DO WHILE (tmp.NE.tmpsave)
99 tmp = abs(frere(istep))
114 IF(dad(istep).NE.0)
THEN
115 IF(.NOT.to_process(step
THEN
116 nb_prun_roots = nb_prun_roots + 1
118 pruned_roots(nb_prun_roots) = tmp
122 nb_prun_roots = nb_prun_roots + 1
124 pruned_roots(nb_prun_roots) = tmp
134 & nodes_RHS, nb_nodes_RHS,
135 & Pruned_SONS, TO_PROCESS,
136 & nb_prun_nodes,nb_prun_roots, nb_prun_leaves,
137 & Pruned_List, Pruned_Roots, Pruned_Leaves
140 LOGICAL,
INTENT(IN) :: fill
141 INTEGER,
INTENT(IN) :: n
142 INTEGER,
INTENT(IN) :: step(n)
143 INTEGER,
INTENT(IN) :: keep28
144 INTEGER,
INTENT(IN) :: dad(keep28)
145 INTEGER,
INTENT(IN) :: nb_nodes_rhs
146 INTEGER,
INTENT(IN) :: (nb_nodes_rhs)
147 INTEGER :: nb_prun_nodes
148 INTEGER,
OPTIONAL,
INTENT(INOUT):: pruned_list(nb_prun_nodes)
150 INTEGER,
OPTIONAL,
INTENT(INOUT):: pruned_roots(nb_prun_roots)
152 INTEGER,
OPTIONAL,
INTENT(INOUT):: pruned_leaves(nb_prun_leaves)
153 INTEGER :: pruned_sons(keep28)
154 LOGICAL :: to_process(keep28)
155 INTEGER :: in, i, istep, tmp
158 to_process(:) = .false.
160 DO i = 1, nb_nodes_rhs
163 to_process(istep) = .true.
164 IF (pruned_sons(istep) .eq. -1)
THEN
165 pruned_sons(istep) = 0
166 nb_prun_nodes = nb_prun_nodes + 1
168 pruned_list(nb_prun_nodes) = nodes_rhs(i)
173 to_process(step(in)) = .true.
174 IF (pruned_sons(step(in)).eq.-1)
THEN
175 nb_prun_nodes = nb_prun_nodes + 1
177 pruned_list(nb_prun_nodes) = in
179 pruned_sons(step(in)) = 1
183 pruned_sons(step(in)) = pruned_sons(step(in)) + 1
187 nb_prun_roots = nb_prun_roots +1
189 pruned_roots(nb_prun_roots) = tmp
195 DO i = 1, nb_nodes_rhs
198 IF (pruned_sons(istep).EQ.0)
THEN
199 nb_prun_leaves = nb_prun_leaves +1
201 pruned_leaves(nb_prun_leaves) = tmp
209 & IRHS_PTR, NBCOL, IRHS_SPARSE, NZ_RHS,
210 & JBEG_RHS, PERM_RHS, SIZE_PERM_RHS, K242, K243,
211 & UNS_PERM_INV, SIZE_UNS_PERM_INV, K23,
212 & RHS_BOUNDS, NSTEPS,
216 INTEGER,
INTENT(IN) :: myid, n, nsteps, k242, k243, k23
217 INTEGER,
INTENT(IN) :: jbeg_rhs, size_perm_rhs, nb_sparse
218 INTEGER,
INTENT(IN) :: nbcol, nz_rhs, size_uns_perm_inv
219 INTEGER,
INTENT(IN) :: step(n), perm_rhs(size_perm_rhs)
220 INTEGER,
INTENT(IN) :: irhs_ptr(nbcol+1),irhs_sparse(nz_rhs)
221 INTEGER,
INTENT(IN) :: uns_perm_inv(size_uns_perm_inv)
222 INTEGER,
INTENT(INOUT):: rhs_bounds(2*nsteps)
223 INTEGER,
INTENT(IN) :: mode
224 INTEGER :: i, icol, jptr, j, jam1, node, bound
228 IF ( (irhs_ptr(i+1)-irhs_ptr(i)).EQ.0) cycle
230 bound = icol - mod(icol, nb_sparse) + 1
231 IF(mod(icol, nb_sparse).EQ.0) bound = bound - nb_sparse
233 IF ((k242.NE.0).OR.(k243.NE.0))
THEN
234 jam1 = perm_rhs(jbeg_rhs+i-1)
238 node = abs(step(jam1))
239 IF(rhs_bounds(2*node - 1).EQ.0)
THEN
240 rhs_bounds(2*node - 1) = bound
241 rhs_bounds(2*node) = bound + nb_sparse - 1
243 rhs_bounds(2*node) = bound + nb_sparse - 1
246 DO jptr = irhs_ptr(i), irhs_ptr(i+1)-1
247 j = irhs_sparse(jptr)
248 IF ( mode .EQ. 1 )
THEN
249 IF (k23.NE.0) j = uns_perm_inv(j)
252 IF(rhs_bounds(2*node - 1).EQ.0)
THEN
253 rhs_bounds(2*node - 1) = bound
254 rhs_bounds(2*node) = bound + nb_sparse - 1
256 rhs_bounds(2*node) = bound + nb_sparse - 1
264 & pruned_leaves, nb_pruned_leaves,
265 & STEP, N, Pruned_SONS,
266 & DAD, RHS_BOUNDS, NSTEPS,
267 & MYID, COMM, KEEP485,
268 & IW, LIW, PTRIST, KIXSZ,OOC_FCT_LOC, PHASE, LDLT, K38)
271 include
'mumps_headers.h'
272 INTEGER,
INTENT(IN) :: nb_pruned_leaves, n, nsteps
273 INTEGER,
INTENT(IN) :: step(n), (nsteps), pruned_sons(nsteps)
274 INTEGER,
INTENT(IN) :: myid, comm, keep485
275 INTEGER,
INTENT(IN) :: pruned_leaves(nb_pruned_leaves)
276 INTEGER,
INTENT(IN) :: liw, iw(liw), ptrist(nsteps)
277 INTEGER,
INTENT(IN) :: kixsz, ooc_fct_loc, phase, ldlt, k38
278 INTEGER,
INTENT(INOUT):: rhs_bounds(2*nsteps)
279 INTEGER :: i, node,
father, size_pool, next_size_pool
281 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: pool, nbsons
282 ALLOCATE(pool(nb_pruned_leaves),
286 WRITE(6,*)
'Allocation problem in CMUMPS_PROPAGATE_RHS_BOUNDS'
289 size_pool = nb_pruned_leaves
292 DO WHILE (size_pool.ne.0)
296 IF (dad(node).NE.0)
THEN
299 IF (rhs_bounds(2*
father-1).EQ.0)
THEN
300 rhs_bounds(2*
father-1) = rhs_bounds(2*node-1)
301 rhs_bounds(2*
father) = rhs_bounds(2*node)
304 & rhs_bounds(2*node-1))
306 & rhs_bounds(2*node))
308 IF(nbsons(
father).EQ.0)
THEN
309 next_size_pool = next_size_pool+1
310 pool(next_size_pool) = dad(node)
314 size_pool = next_size_pool
316 DEALLOCATE(pool, nbsons)
320 & PHASE, LDLT, IS_ROOT)
321 INTEGER,
INTENT(IN) :: liw, , phase, ldlt
322 INTEGER,
INTENT(IN) :: iw(liw)
323 LOGICAL,
INTENT(IN) :: is_root
324 INTEGER(8) :: ncb, nelim, liell, npiv, nrow
326 nelim = int(iw(ptr+1),8)
327 nrow = int(iw(ptr+2),8)
328 npiv = int(iw(ptr+3),8)
332 & int(iw(ptr+2),8) / 2_8
337 & .OR. (phase.EQ.1.AND.ldlt.NE.0)
340 & npiv*(npiv-1_8)/2_8 + (nrow-npiv)*npiv
343 & npiv*(npiv+1_8)/2_8 + (liell-npiv)*npiv
352 & LRSTATUS, IWHANDLER,
353 & PHASE, LDLT, IS_ROOT)
356 INTEGER,
INTENT(IN) :: liw, ptr, phase, ldlt
357 INTEGER,
INTENT(IN) :: lrstatus, iwhandler
358 INTEGER,
INTENT(IN) :: iw(liw)
359 LOGICAL,
INTENT(IN) :: is_root
360 INTEGER(8) :: ncb, nelim, liell, npiv, nrow, factor_size
361 INTEGER :: nb_panels, ipanel, loru, iblock
362 LOGICAL :: lr_activated
363 TYPE(
lrb_type),
POINTER,
DIMENSION(:) :: lrb_panel
365 nelim = int(iw(ptr+1),8)
366 nrow = int(iw(ptr+2),8)
367 npiv = int(iw(ptr+3),8)
369 lr_activated=(lrstatus.GE.2)
370 IF (lr_activated)
THEN
378 DO ipanel=1,nb_panels
379 IF (is_root.AND.ipanel.EQ.nb_panels)
THEN
388 IF (
size(lrb_panel).GT.0)
THEN
390 factor_size = factor_size +
391 & int(lrb_panel(1)%N,8)*(int(lrb_panel(1)%N,8)-1_8)/2_8
393 factor_size = factor_size +
394 & int(lrb_panel(1)%N,8)*(int(lrb_panel(1)%N,8)+1_8)/2_8
397 DO iblock=1,
size(lrb_panel)
398 IF (lrb_panel(iblock)%ISLR)
THEN
399 factor_size = factor_size + int(lrb_panel(iblock)%K,8)*
400 & int(lrb_panel(iblock)%M+lrb_panel(iblock)%M,8)
402 factor_size = factor_size +
403 & int(lrb_panel(iblock)%M*lrb_panel(iblock)%N,8)
416 & STEP, Pruned_List, nb_prun_nodes, OOC_FCT_TYPE_LOC)
417 INTEGER,
intent(in) :: keep28, keep201, ooc_fct_type_loc, myid, n
418 INTEGER(8),
intent(in) :: fr_fact
419 INTEGER,
intent(in) :: nb_prun_nodes
420 INTEGER,
intent(in) :: pruned_list(nb_prun_nodes)
421 INTEGER,
intent(in) :: step(n)
423 INTEGER(8) :: pruned_size
424 if (keep201 .GT. 0) then
426 DO i = 1, nb_prun_nodes
427 istep = step(pruned_list(i))
429 & (istep, ooc_fct_type_loc)
436 & (myid, n, keep28, keep201, keep485, fr_fact,
437 & step, pruned_list, nb_prun_nodes, ooc_fct_type_loc
440 INTEGER,
intent(in) :: keep28, keep201, ooc_fct_type_loc, n,
442 INTEGER(8),
intent(in) :: fr_fact
443 INTEGER,
intent(in) :: nb_prun_nodes, myid
444 INTEGER,
intent(in) :: pruned_list(nb_prun_nodes)
445 INTEGER,
intent(in) :: step(n)
448 INTEGER(8) :: pruned_size
450 DO i = 1, nb_prun_nodes
451 istep = step(pruned_list(i))
452 IF (keep201 .GT. 0)
THEN
454 & (istep, ooc_fct_type_loc)
457 IF (keep201.GT.0)
THEN
458 IF (fr_fact .NE. 0_8)
THEN
466 & (lp, lpok, prokg, mpg, perm_strat,
468 & irhs_ptr, size_irhs_ptr,
469 & irhs_sparse, nzrhs,
473 INTEGER,
INTENT(IN) :: LP, MPG, PERM_STRAT, , NRHS,
476 LOGICAL,
INTENT(IN) :: LPOK, PROKG
477 INTEGER,
INTENT(IN) :: (N)
478 INTEGER,
INTENT(IN) :: IRHS_PTR(SIZE_IRHS_PTR)
479 INTEGER,
INTENT(IN) :: IRHS_SPARSE(NZRHS)
480 INTEGER,
INTENT(OUT) :: PERM_RHS(NRHS)
481 INTEGER,
INTENT(OUT) :: IERR
482 INTEGER :: I,J,K, POSINPERMRHS, JJ,
484 INTEGER,
ALLOCATABLE :: ROW_REFINDEX(:)
486 IF ((perm_strat.NE.-1).AND.(perm_strat.NE.1))
THEN
489 &
WRITE(lp,*)
" INTERNAL ERROR -1 in ",
490 &
" CMUMPS_PERMUTE_RHS_GS, PERM_STRAT =", perm_strat,
491 &
" is out of range "
494 IF (perm_strat.EQ.-1)
THEN
500 ALLOCATE(row_refindex(nrhs), stat=ierr)
504 WRITE(lp,*)
" ERROR -2 : ",
505 &
" ALLOCATE IN CMUMPS_PERMUTE_RHS_GS OF SIZE :",
511 IF (irhs_ptr(i+1)-irhs_ptr(i).LE.0)
THEN
514 row_refindex(i) = irhs_sparse(irhs_ptr(i))
516 row_refindex(i) = row_refindex(i-1)
519 row_refindex(i) = irhs_sparse(irhs_ptr(i))
529 IF (sym_perm(k).LT.kpos)
THEN
537 &
WRITE(lp,*)
" INTERNAL ERROR -3 in ",
538 &
" CMUMPS_PERMUTE_RHS_GS "
541 posinpermrhs = posinpermrhs + 1
542 perm_rhs(posinpermrhs) = jj
543 row_refindex(jj) = -row_refindex(jj)
545 IF (posinpermrhs.NE.nrhs)
THEN
547 &
WRITE(lp,*)
" INTERNAL ERROR -4 in ",
548 &
" CMUMPS_PERMUTE_RHS_GS ", maxval(row_refindex)
554 IF (
allocated(row_refindex))
DEALLOCATE(row_refindex)
557 & (perm_strat, sym_perm,
559 & perm_rhs, sizeperm, ierr
562 INTEGER,
INTENT(IN) :: PERM_STRAT, NHRS, SIZEPERM
563 INTEGER,
INTENT(IN) :: SYM_PERM(SIZEPERM)
564 INTEGER,
INTENT(IN) :: IRHS_PTR(NHRS)
565 INTEGER,
INTENT(OUT):: IERR
566 INTEGER,
INTENT(OUT):: (SIZEPERM)
567 DOUBLE PRECISION :: RAND_NUM
571 IF( (strat.NE.-3).AND.
576 & (strat.NE. 6) )
THEN
577 WRITE(*,*)
"Warning: incorrect value for the RHS permutation; ",
578 &
"defaulting to post-order"
581 IF (strat .EQ. -3)
THEN
582 perm_rhs(1:sizeperm)=0
584 CALL random_number(rand_num)
585 rand_num = rand_num*dble(sizeperm)
586 j = ceiling(rand_num)
587 DO WHILE (perm_rhs(j).NE.0)
588 CALL random_number(rand_num)
589 rand_num = rand_num*dble(sizeperm)
590 j = ceiling(rand_num)
594 ELSEIF (strat .EQ. -2)
THEN
596 perm_rhs(sizeperm -i +1) = i
598 ELSEIF (strat .EQ. -1)
THEN
602 ELSEIF (strat .EQ. 1)
THEN
604 perm_rhs(sym_perm(i)) = i
606 ELSEIF (strat .EQ. 2)
THEN
608 perm_rhs(sizeperm-sym_perm(i)+1) = i
613 & PERM_RHS, SIZE_PERM,
614 & IPTR_WORKING, SIZE_IPTR_WORKING, WORKING, SIZE_WORKING,
616 & STEP, SYM_PERM, N, NBRHS,
617 & PROCNODE, NSTEPS, SLAVEF, KEEP199,
618 & behaviour_L0, reorder, n_select, PROKG, MPG
621 INTEGER,
INTENT(IN) :: SIZE_PERM,
623 & iptr_working(size_iptr_working),
625 & working(size_working),
635 LOGICAL,
INTENT(IN) :: behaviour_L0,
637 INTEGER,
INTENT(INOUT) :: PERM_RHS(SIZE_PERM)
654 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: TMP_RHS,
661 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: USED
662 LOGICAL :: allow_above_L0
663 INTEGER,
EXTERNAL :: MUMPS_TYPENODE_ROUGH
664 = size_iptr_working - 1
665 ALLOCATE(tmp_rhs(size_perm),
667 & load_procs(nprocs),
669 & iptr_perm_working(nprocs+1),
670 & mytypenode(nsteps),
673 WRITE(*,*)
'Allocation error in CMUMPS_INTERLEAVE_RHS_AM1'
677 mytypenode(i) = mumps_typenode_rough( procnode(i), keep199 )
681 IF(irhs_ptr(i+1)-irhs_ptr(i).NE.0)
THEN
682 nb_non_empty = nb_non_empty + 1
686 iptr_perm_working(1)=1
689 DO j=iptr_working(i),iptr_working(i+1)-1
690 used(working(j)) = .true.
693 IF (used(abs(step(perm_rhs(j)))).AND.
694 & ((irhs_ptr(perm_rhs(j)+1)-irhs_ptr(perm_rhs(j))).NE.0))
699 iptr_perm_working(i+1) = k+1
701 size_perm_working = k
702 ALLOCATE(perm_working(size_perm_working),
705 WRITE(*,*)
'Allocation error in CMUMPS_INTERLEAVE_RHS_AM1'
711 DO j=iptr_working(i),iptr_working(i+1)-1
712 used(working(j)) = .true.
715 IF (used(abs(step(perm_rhs(j)))).AND.
716 & ((irhs_ptr(perm_rhs(j)+1)-irhs_ptr(perm_rhs(j))).NE.0))
719 perm_working(k) = perm_rhs(j)
723 IF(behaviour_l0)
THEN
725 allow_above_l0 = .false.
728 IF((mytypenode(abs(step(i))).LE.1).AND.
729 & (irhs_ptr(i+1)-irhs_ptr(i).NE.0))
731 to_be_found = to_be_found + 1
736 allow_above_l0 = .true.
737 to_be_found = nb_non_empty
739 ptr_procs(1:nprocs) = iptr_perm_working(1:nprocs)
743 n_select_loc = n_select
744 IF (n_select_loc.LE.0)
THEN
750 DO WHILE(selected.LT.to_be_found)
752 DO WHILE(local_selected.LT.n_select_loc)
753 IF(ptr_procs(current_proc).EQ.
754 & iptr_perm_working(current_proc+1))
758 entry = perm_working(ptr_procs(current_proc))
759 node = abs(step(entry))
760 IF(.NOT.used(entry))
THEN
761 IF(allow_above_l0.OR.(mytypenode(node).LE.1))
THEN
763 selected = selected + 1
764 local_selected = local_selected + 1
765 posintmprhs = posintmprhs + 1
766 tmp_rhs(posintmprhs) = entry
767 IF(selected.EQ.to_be_found)
EXIT
770 ptr_procs(current_proc) = ptr_procs(current_proc) + 1
773 current_proc = mod(current_proc,nprocs)+1
775 to_be_found = nb_non_empty - to_be_found
776 allow_above_l0 = .true.
777 ptr_procs(1:nprocs) = iptr_perm_working(1:nprocs)
780 IF(irhs_ptr(perm_rhs(i)+1)-irhs_ptr(perm_rhs(i)).EQ.0)
THEN
781 posintmprhs = posintmprhs+1
782 tmp_rhs(posintmprhs) = perm_rhs(i)
783 IF(posintmprhs.EQ.size_perm)
EXIT
788 ALLOCATE(perm_po(n),stat=ierr)
790 WRITE(*,*)
'Allocation error in INTERLEAVE_RHS_AM1'
794 perm_po(sym_perm(j))=j
800 used(tmp_rhs(nbrhs*(i-1)+j))=.true.
803 IF(used(perm_po(j)))
THEN
804 posintmprhs = posintmprhs + 1
805 perm_rhs(posintmprhs) = perm_po(j)
809 IF(mod(n,nbrhs).NE.0)
THEN
812 used(tmp_rhs(nbrhs*nblocks+j))=.true.
815 IF(used(perm_po(j)))
THEN
816 posintmprhs = posintmprhs + 1
817 perm_rhs(posintmprhs) = perm_po(j)
integer function father(nn, ixc, ipartc, ipart, sontype)
subroutine cmumps_permute_rhs_gs(lp, lpok, prokg, mpg, perm_strat, sym_perm, n, nrhs, irhs_ptr, size_irhs_ptr, irhs_sparse, nzrhs, perm_rhs, ierr)
subroutine cmumps_interleave_rhs_am1(perm_rhs, size_perm, iptr_working, size_iptr_working, working, size_working, irhs_ptr, step, sym_perm, n, nbrhs, procnode, nsteps, slavef, keep199, behaviour_l0, reorder, n_select, prokg, mpg)
subroutine cmumps_permute_rhs_am1(perm_strat, sym_perm, irhs_ptr, nhrs, perm_rhs, sizeperm, ierr)
if(complex_arithmetic) id
subroutine, public cmumps_blr_retrieve_nb_panels(iwhandler, nb_panels)
subroutine, public cmumps_blr_retrieve_panel_loru(iwhandler, loru, ipanel, thelrbpanel)
logical function, public cmumps_blr_empty_panel_loru(iwhandler, loru, ipanel)
subroutine, public cmumps_chain_prun_nodes_stats(myid, n, keep28, keep201, keep485, fr_fact, step, pruned_list, nb_prun_nodes, ooc_fct_type_loc)
integer(8) function cmumps_local_factor_size(iw, liw, ptr, phase, ldlt, is_root)
subroutine, public cmumps_tree_prun_nodes_stats(myid, n, keep28, keep201, fr_fact, step, pruned_list, nb_prun_nodes, ooc_fct_type_loc)
integer(8), public pruned_size_loaded
subroutine, public cmumps_sol_es_init(size_of_block_arg, keep201)
subroutine, public cmumps_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 cmumps_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 cmumps_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)
integer(8), dimension(:,:), pointer size_of_block
integer(8) function cmumps_local_factor_size_blr(iw, liw, ptr, lrstatus, iwhandler, phase, ldlt, is_root)
subroutine, public cmumps_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)