15 & IWCB, LIWW, NRHS, NA, LNA, NE_STEPS, W2, MTYPE, ICNTL, FROM_PP,
16 & STEP, FRERE, DAD, FILS, PTRIST, PTRFAC, IW1, LIW1, PTRACB,
17 & LIWK_PTRACB, PROCNODE_STEPS, SLAVEF, INFO, KEEP,KEEP8, DKEEP,
18 & COMM_NODES, MYID, MYID_NODES, BUFR, LBUFR, LBUFR_BYTES,
19 & ISTEP_TO_INIV2, TAB_POS_IN_PERE, IBEG_ROOT_DEF, IEND_ROOT_DEF,
20 & IROOT_DEF_RHS_COL1, RHS_ROOT, LRHS_ROOT, SIZE_ROOT, MASTER_ROOT,
21 & RHSCOMP, LRHSCOMP, POSINRHSCOMP_FWD, POSINRHSCOMP_BWD,
22 & NZ_RHS, NBCOL_INBLOC, NRHS_ORIG, JBEG_RHS, Step2node, LStep2node,
23 & IRHS_SPARSE, IRHS_PTR, SIZE_PERM_RHS, PERM_RHS,
24 & SIZE_UNS_PERM_INV, UNS_PERM_INV, NB_FS_IN_RHSCOMP_F,
25 & NB_FS_IN_RHSCOMP_TOT, DO_NBSPARSE , RHS_BOUNDS, LRHS_BOUNDS
26 & ,IPOOL_B_L0_OMP, LPOOL_B_L0_OMP, IPOOL_A_L0_OMP, LPOOL_A_L0_OMP,
27 & L_VIRT_L0_OMP, VIRT_L0_OMP, L_PHYS_L0_OMP, PHYS_L0_OMP,
28 & PERM_L0_OMP, PTR_LEAFS_L0_OMP, L0_OMP_MAPPING, LL0_OMP_MAPPING,
29 & L0_OMP_FACTORS, LL0_OMP_FACTORS
41 TYPE ( SMUMPS_ROOT_STRUC ) :: root
44 INTEGER :: N,LIW,MTYPE,LIW1,LIWW,LNA
45 INTEGER ICNTL(60),INFO(80), KEEP(500)
46 REAL,
intent(inout) :: DKEEP(230)
48 INTEGER IW(LIW),IW1(LIW1),NA(LNA),NE_STEPS(KEEP(28)),IWCB(LIWW)
49 INTEGER STEP(N), FRERE(KEEP(28)), (N), PTRIST(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
57 REAL :: RHSCOMP(LRHSCOMP,NRHS)
58 INTEGER SLAVEF, , MYID, MYID_NODES
59 INTEGER PROCNODE_STEPS(KEEP(28)), POSINRHSCOMP_FWD(N),
61 INTEGER LBUFR, LBUFR_BYTES
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 REAL 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) :: UNS_PERM_INV(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 (SMUMPS_L0OMPFAC_T),
INTENT(IN) ::
97 & l0_omp_factors(ll0_omp_factors
101 INTEGER LPOOL,MYLEAF,MYROOT,NBROOT,LPANEL_POS
102 INTEGER MYLEAF_NOT_PRUNED
103 INTEGER NSTK_S,,IPANEL_POS,PTRICB
105 INTEGER MODE_RHS_BOUNDS
112 INTEGER soln_c_class, forw_soln, back_soln, root_soln
114 LOGICAL DOFORWARD, DOROOT, DOBACKWARD
115 LOGICAL :: DO_L0OMP_FWD, DO_L0OMP_BWD
116 LOGICAL I_WORKED_ON_ROOT, SPECIAL_ROOT_REACHED
118 LOGICAL , DOROOT_BWD_PANEL
119 LOGICAL SWITCH_OFF_ES
122 INTEGER :: NBROOT_UNDER_L0
123 REAL,
PARAMETER :: ZERO = 0.0e0
124 include
'mumps_headers.h'
125 INTEGER,
DIMENSION(:),
ALLOCATABLE :: 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
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
142 EXTERNAL :: mumps_ooc_get_fct_type
143 DOUBLE PRECISION TIME_FWD,TIME_BWD,TIME_SpecialRoot
145 INTEGER,
EXTERNAL :: MUMPS_PROCNODE
146 LOGICAL,
EXTERNAL :: MUMPS_IN_OR_ROOT_SSARBR
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)
157 IF (.NOT. from_pp)
THEN
161 ptricb = nstk_s + keep(28)
162 ipool = ptricb + keep(28)
164 ipanel_pos = ipool + lpool
165 IF (keep(201).EQ.1)
THEN
166 lpanel_pos = keep(228)+1
170 IF (ipanel_pos + lpanel_pos -1 .ne. liw1 )
THEN
171 WRITE(*,*) myid,
": Internal Error 1 in SMUMPS_SOL_C",
172 & ipanel_pos, lpanel_pos, liw1
177 special_root_reached = .true.
178 switch_off_es = .false.
179 IF ( keep(111).NE.0 .OR. keep(252).NE.0 )
THEN
182 IF (keep(221).eq.1) dobackward = .false.
183 IF (keep(221).eq.2) doforward = .false.
184 IF ( keep(60).EQ.0 .AND.
186 & (keep(38).NE.0 .AND. root%yes)
188 & (keep(20).NE.0 .AND. myid_nodes.EQ.master_root)
190 & .AND. keep(252).EQ.0
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)
204 exploit_sparsity = .false.
207 WRITE(*,*)
"Internal error 2 in SMUMPS_SOL_C"
211 do_l0omp_fwd= ( (keep(401).GT.0).AND.(keep(400).GT.0)
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)
216 do_l0omp_bwd = do_l0omp_bwd .AND. keep(201).EQ.0
218 ALLOCATE (pruned_sons(keep(28)), stat=i)
224 IF(info(1).LT.0)
GOTO 500
229 size_to_process = keep(28)
233 ALLOCATE (to_process(size_to_process), stat=i)
239 IF(info(1).LT.0)
GOTO 500
240 IF ( doforward .AND. do_prun )
THEN
244 IF ( exploit_sparsity )
THEN
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
254 ALLOCATE(nodes_rhs(nb_nodes_rhs), stat = allocok)
255 IF(allocok.GT.0)
THEN
260 IF(info(1).LT.0)
GOTO 500
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
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
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
288 ALLOCATE(nodes_rhs(nb_nodes_rhs), stat = allocok)
289 IF(allocok.GT.0)
THEN
294 IF(info(1).LT.0)
GOTO 500
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)
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
317 & nodes_rhs, nb_nodes_rhs,
318 & pruned_sons, to_process,
319 & nb_prun_nodes, nb_prun_roots,
321 ALLOCATE(pruned_list(nb_prun_nodes), stat=allocok)
322 IF(allocok.GT.0)
THEN
324 info(2)=nb_prun_nodes
327 IF(info(1).LT.0)
GOTO 500
328 ALLOCATE(pruned_roots(nb_prun_roots), stat=allocok)
329 IF(allocok.GT.0)
THEN
331 info(2)=nb_prun_roots
334 IF(info(1).LT.0)
GOTO 500
335 ALLOCATE(pruned_leaves(nb_prun_leaves), stat=allocok)
336 IF(allocok.GT.0)
THEN
338 info(2)=nb_prun_leaves
341 IF(info(1).LT.0)
GOTO 500
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,
354 IF ( keep(201) .GT. 0)
THEN
355 ooc_fct_type_tmp=mumps_ooc_get_fct_type
356 & (
'F',mtype,keep(201),keep(50))
358 ooc_fct_type_tmp = -5959
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
365 IF (do_nbsparse)
THEN
366 nb_sparse =
max(1,keep(497))
368 IF (exploit_sparsity) mode_rhs_bounds = 2
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,
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))
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.
393 DEALLOCATE(pruned_list)
395 IF (keep(201).GT.0)
THEN
396 IF (doforward .OR. doroot_fwd_ooc)
THEN
398 & a,la,doforward,ierr)
407 IF ( keep( 50 ) .eq. 0 )
THEN
413 CALL vtbegin(forw_soln,ierr)
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)
423 & nb_prun_roots, pruned_roots,
424 & myroot, myid_nodes, slavef, keep, step,
427 DEALLOCATE(pruned_roots)
429 IF ((exploit_sparsity).AND.(nb_prun_roots.EQ.na(2)))
THEN
430 DEALLOCATE(pruned_roots)
431 switch_off_es = .true.
433 DO istep = 1, keep(28)
434 iw1(nstk_s+istep-1) = pruned_sons(istep)
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,
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
458 myroot = myroot - nbroot_under_l0
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
467 DO i = 1, nb_prun_leaves
468 inode = pruned_leaves(i)
469 IF ( mumps_procnode(procnode_steps(step(inode)),keep(199))
470 & .EQ. myid_nodes )
THEN
471 IF (l0_omp_mapping( step(inode) ) .EQ. 0)
THEN
472 iw1(nstk_s+step(inode)-1) = -99
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
487 DO istep = keep(28), 1, -1
488 inode=step2node(istep)
489 IF (iw1(nstk_s+step(inode)-1).EQ.-99)
THEN
491 iw1(ipool+myleaf-1) = inode
492 iw1(nstk_s+step(inode)-1) = 0
495 DEALLOCATE(pruned_leaves)
497 myleaf = ipool_a_l0_omp(lpool_a_l0_omp)
499 iw1(ipool+i-1) = ipool_a_l0_omp(i)
505 & nb_prun_leaves, pruned_leaves, keep, keep8,
506 & step, procnode_steps, iw1(ipool), lpool )
508 DEALLOCATE(pruned_leaves)
511 & slavef, na, lna, keep, keep8, step,
512 & procnode_steps, iw1(ipool), lpool )
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,
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
537 CALL vtend(forw_soln,ierr)
541 IF ( info(1) .LT. 0 )
THEN
542 IF ( lp .GT. 0 )
THEN
544 &
': ** ERROR RETURN FROM SMUMPS_SOL_R,INFO(1:2)=',
550 IF (.NOT.from_pp)
THEN
552 dkeep(117)=real(time_fwd) + dkeep(117)
554 IF (do_prun.AND.switch_off_es)
THEN
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)
561 ALLOCATE(to_process(size_to_process),stat=i)
565 IF ( dobackward .AND. do_prun )
THEN
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'
573 info(2) = nb_nodes_rhs
576 nodes_rhs(1:nb_prun_roots)=pruned_roots(1:nb_prun_roots)
577 DEALLOCATE(pruned_roots)
583 IF (keep(23).NE.0) i = uns_perm_inv(i)
585 IF ( pruned_sons(istep) .eq. -1)
THEN
586 nb_nodes_rhs = nb_nodes_rhs +1
587 pruned_sons(istep) = 0
590 ALLOCATE(nodes_rhs(nb_nodes_rhs), stat = allocok)
591 IF(allocok.GT.0)
THEN
592 WRITE(*,*)
'Problem with allocation of nodes_RHS'
594 info(2) = nb_nodes_rhs
601 IF (keep(23).NE.0) i = uns_perm_inv(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
611 IF ( exploit_sparsity )
THEN
614 & dad, ne_steps, frere, keep(28),
616 & nodes_rhs, nb_nodes_rhs,
618 & nb_prun_nodes, nb_prun_roots, nb_prun_leaves
620 ALLOCATE(pruned_list(nb_prun_nodes), stat=allocok)
621 IF(allocok.GT.0)
THEN
623 info(2)=nb_prun_nodes
626 IF(info(1).LT.0)
GOTO 500
627 ALLOCATE(pruned_roots(nb_prun_roots), stat=allocok)
628 IF(allocok.GT.0)
THEN
630 info(2)=nb_prun_roots
633 IF(info(1).LT.0)
GOTO 500
634 ALLOCATE(pruned_leaves(nb_prun_leaves), stat=allocok)
635 IF(allocok.GT.0)
THEN
637 info(2)=nb_prun_leaves
640 IF(info(1).LT.0)
GOTO 500
643 & dad, ne_steps, frere, keep(28),
645 & nodes_rhs, nb_nodes_rhs,
647 & nb_prun_nodes, nb_prun_roots, nb_prun_leaves,
648 & pruned_list, pruned_roots, pruned_leaves
651 & keep(201), pruned_list, nb_prun_nodes,
653 IF(
allocated(nodes_rhs))
DEALLOCATE(nodes_rhs)
654 IF (keep(201).GT.0)
THEN
655 ooc_fct_type_tmp=mumps_ooc_get_fct_type
656 & (
'B',mtype,keep(201),keep(50))
658 ooc_fct_type_tmp = -5959
661 & myid_nodes, n, keep(28), keep(201),
662 & keep8(31)+keep8(64),
665 & nb_prun_nodes, ooc_fct_type_tmp)
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
677 IF (keep(201).EQ.1)
THEN
679 IF ( info(1) .LT. 0 )
GOTO 500
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
685 IF (.NOT. from_pp)
THEN
688 IF ( ( keep( 38 ) .NE. 0 ).AND. special_root_reached )
THEN
689 IF ( keep(60) .EQ. 0 .AND. keep(252) .EQ. 0 )
THEN
691 IF (keep(201).GT.0)
THEN
692 IF ( (exploit_sparsity.AND.(keep(111).NE.
697 ioldps = ptrist(step(keep(38)))
698 local_m = iw( ioldps + 2 + keep(ixsz))
699 local_n = iw( ioldps + 1 + keep(ixsz))
702 & keep(38),ptrfac,keep,a,la,
703 & step,keep8,n,dummy_bool,ierr)
707 WRITE(*,*)
'** ERROR after SMUMPS_SOLVE_GET_OOC_NODE',
712 iapos = ptrfac(iw( ioldps + 4 + keep(ixsz)))
713 IF (local_m * local_n .EQ. 0)
THEN
714 iapos =
min(iapos, la)
717 CALL vtbegin(root_soln,ierr)
720 & root%CNTXT_BLACS, local_m, local_n,
721 & root%MBLOCK, root%NBLOCK,
722 & root%IPIV(1), root%LPIV, master_root, myid_nodes,
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)
734 &
'** ERROR after SMUMPS_FREE_FACTORS_FOR_SOLVE ',
741 ELSE IF ( ( keep(20) .NE. 0) .AND. special_root_reached )
THEN
742 IF ( myid_nodes .eq. master_root )
THEN
745 IF (.NOT.from_pp)
THEN
747 dkeep(119)=real(time_specialroot) + dkeep(119)
750 CALL vtend(root_soln,ierr)
754 IF ( info(1) .LT. 0 )
RETURN
756 IF ( keep(201).GT.0 .AND. .NOT. doroot_bwd_panel )
758 i_worked_on_root = doroot
759 IF (keep(38).gt.0 )
THEN
760 IF ( ( exploit_sparsity.AND.(keep(111).EQ.0) )
766 IF (exploit_sparsity.AND.(keep(111).NE.0))
THEN
768 i_worked_on_root = .false.
774 do_nbsparse_bwd = .false.
776 do_nbsparse_bwd = do_nbsparse
779 prun_below_bwd = prun_below_bwd .OR. do_l0omp_bwd
785 & nodes_rhs, nb_nodes_rhs,
786 & pruned_sons, to_process,
787 & nb_prun_nodes, nb_prun_roots,
789 ALLOCATE(pruned_list(nb_prun_nodes), stat=allocok)
790 IF(allocok.GT.0)
THEN
792 info(2)=nb_prun_nodes
795 IF(info(1).LT.0)
GOTO 500
796 ALLOCATE(pruned_roots(nb_prun_roots), stat=allocok)
797 IF(allocok.GT.0)
THEN
799 info(2)=nb_prun_roots
802 IF(info(1).LT.0)
GOTO 500
803 ALLOCATE(pruned_leaves(nb_prun_leaves), stat=allocok)
804 IF(allocok.GT.0)
THEN
806 info(2)=nb_prun_leaves
809 IF(info(1).LT.0)
GOTO 500
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,
821 IF (keep(201).GT.0)
THEN
822 ooc_fct_type_tmp=mumps_ooc_get_fct_type
823 & (
'B',mtype,keep(201),keep(50))
825 ooc_fct_type_tmp = -5959
828 & myid_nodes, n, keep(28), keep(201), keep(485),
829 & step, pruned_list, nb_prun_nodes, ooc_fct_type_tmp
831 IF (do_nbsparse_bwd)
THEN
832 nb_sparse =
max(1,keep(497))
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,
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))
850 IF ( keep(201).GT.0 )
THEN
851 iroot =
max(keep(20),keep(38))
853 & i_worked_on_root, iroot, a, la, ierr)
855 IF ( keep( 50 ) .eq. 0 )
THEN
861 CALL vtbegin(back_soln,ierr)
863 IF (.NOT.from_pp)
THEN
866 IF ( .NOT.special_root_reached )
THEN
867 rhs_root(1:nrhs*size_root) = zero
869 IF (am1.AND.(nb_fs_in_rhscomp_f.NE.nb_fs_in_rhscomp_tot))
THEN
871 ii = posinrhscomp_bwd(i)
872 IF ((ii.GT.0).AND.(ii.GT.nb_fs_in_rhscomp_f))
THEN
874 rhscomp(ii, k) = zero
879 IF ( .NOT. do_prun )
THEN
880 IF ( .NOT. do_l0omp_bwd )
THEN
881 IF (do_l0omp_fwd)
THEN
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 )))
891 IF (myleaf .EQ. -1)
THEN
892 myleaf = ipool_a_l0_omp(lpool_a_l0_omp)
895 & na, lna, keep, keep8, step, procnode_steps,
896 & iw1(ipool), lpool, l0_omp_mapping )
899 & na, lna, keep, keep8, step, procnode_steps,
900 & iw1(ipool), lpool )
901 IF (myleaf .EQ. -1)
THEN
905 & myleaf, myid_nodes, slavef, keep, step,
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 )
918 DO istep = 1, keep(28)
919 IF ( mumps_procnode(procnode_steps(istep),keep(199))
920 & .NE. myid_nodes )
THEN
923 IF ( l0_omp_mapping( istep ) .NE. 0 )
THEN
926 IF ( .NOT. to_process( istep ) )
THEN
929 i = step2node( istep )
931 DO WHILE ( ichild .GT. 0 )
932 ichild = fils( ichild )
934 IF ( ichild .LT. 0 )
THEN
936 DO WHILE ( ichild .GT. 0 )
937 IF ( l0_omp_mapping( step( ichild ) ) .EQ. 0 .AND.
938 & to_process(step( ichild )) )
THEN
941 ichild = frere( step( ichild ) )
949 & na, lna, keep, keep8, step, procnode_steps,
950 & iw1(ipool), lpool, l0_omp_mapping, to_process )
954 & myroot, myid_nodes, keep, keep8, step, procnode_steps,
957 & nb_prun_leaves, pruned_leaves,
958 & myleaf, myid_nodes, slavef, keep, step,
968 IF (keep(31) .EQ. 1)
THEN
972 IF ( .NOT. mumps_in_or_root_ssarbr(procnode_steps(i),
974 IF ( l0_omp_mapping(i) .EQ. 0 )
THEN
978 IF ( to_process(i) )
THEN
979 keep(31) = keep(31) + 1
982 keep(31) = keep(31) + 1
991 & rhscomp, lrhscomp, posinrhscomp_bwd,
992 & iw1(ptricb),ptracb,iwcb,liww, w2,
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,
1000 & istep_to_iniv2, tab_pos_in_pere, iw1(ipanel_pos),
1002 & , rhs_bounds, lrhs_bounds, do_nbsparse_bwd
1004 & , l0_omp_mapping, ll0_omp_mapping,
1005 & l0_omp_factors, ll0_omp_factors
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.
1015 IF (do_l0omp_bwd .AND. info(1) .GE. 0)
THEN
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,
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 )
1036 & bufr, lbufr,lbufr_bytes,
1037 & comm_nodes, idummy,
1038 & slavef, .true., .false. )
1041 CALL vtend(back_soln,ierr)
1043 IF (.NOT.from_pp)
THEN
1045 dkeep(118)=real(time_bwd)+dkeep(118)
1048 IF (ldiag.GT.2 .AND. mp.GT.0)
THEN
1050 k = min0(10,
size(rhscomp,1))
1051 IF (ldiag.EQ.4) k =
size(rhscomp,1)
1052 IF ( .NOT. from_pp)
THEN
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)
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)
107199993
FORMAT (
' RHS (internal, first column)'/(1x,1p,5e14.6))
107299994
FORMAT (
' RHS (internal, 2 nd column)'/(1x,1p,5e14.6))
107399992
FORMAT (//
' LEAVING SOLVE (SMUMPS_SOL_C) WITH')