36 & , smumps_l0ompfac_t
37 IMPLICIT NONE
38#if defined(V_T)
39 include 'VT.inc'
40#endif
41 TYPE ( SMUMPS_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 REAL, intent(inout) :: DKEEP(230)
47 INTEGER(8) (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 REAL (LA), W(LWC),
56 & W2(KEEP(133))
57 REAL :: RHSCOMP(LRHSCOMP,NRHS)
58 INTEGER SLAVEF, COMM_NODES, MYID, MYID_NODES
59 INTEGER PROCNODE_STEPS(KEEP(28)), POSINRHSCOMP_FWD(N),
60 & POSINRHSCOMP_BWD(N)
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 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) :: ( 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) ::
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)
98 INTEGER MP, LP, LDIAG
99 INTEGER ,I,II
100 INTEGER allocok
101 INTEGER LPOOL,MYLEAF,,NBROOT,LPANEL_POS
102 INTEGER MYLEAF_NOT_PRUNED
103 INTEGER NSTK_S,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 (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
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 REAL, PARAMETER :: ZERO = 0.0e0
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.NOT. IF ( FROM_PP) THEN
158 CALL MUMPS_SECDEB(TIME_FWD)
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.EQ. IF (KEEP(201)1) THEN
166 LPANEL_POS = KEEP(228)+1
167 ELSE
168 LPANEL_POS = 1
169 ENDIF
170.ne. IF (IPANEL_POS + LPANEL_POS -1 LIW1 ) THEN
171 WRITE(*,*) MYID, ": Internal Error 1 in SMUMPS_SOL_C",
172 & IPANEL_POS, LPANEL_POS, LIW1
173 CALL MUMPS_ABORT()
174 ENDIF
175 DOFORWARD = .TRUE.
176 DOBACKWARD= .TRUE.
177 SPECIAL_ROOT_REACHED = .TRUE.
178 SWITCH_OFF_ES = .FALSE.
179.NE..OR..NE. IF ( KEEP(111)0 KEEP(252)0 ) THEN
180 DOFORWARD = .FALSE.
181 ENDIF
182.eq. IF (KEEP(221)1) DOBACKWARD = .FALSE.
183.eq. IF (KEEP(221)2) DOFORWARD = .FALSE.
184.EQ..AND. IF ( KEEP(60)0
185 & (
186.NE..AND. & (KEEP(38)0 root%yes)
187.OR. &
188.NE..AND..EQ. & (KEEP(20)0 MYID_NODESMASTER_ROOT)
189 & )
190.AND..EQ. & KEEP(252)0
191 & )
192 &THEN
193 DOROOT = .TRUE.
194 ELSE
195 DOROOT = .FALSE.
196 ENDIF
197.AND..NE..AND..EQ. DOROOT_BWD_PANEL = DOROOT MTYPE1 KEEP(50)0
198.AND..EQ. & KEEP(201)1
199.AND..NOT. DOROOT_FWD_OOC = DOROOT DOROOT_BWD_PANEL
200.NE. AM1 = (KEEP(237) 0)
201.NE..AND..NOT. Exploit_Sparsity = (KEEP(235) 0) ( AM1)
202.OR. DO_PRUN = (Exploit_SparsityAM1)
203 IF (FROM_PP) THEN
204 Exploit_Sparsity = .FALSE.
205 DO_PRUN = .FALSE.
206 IF ( AM1 ) THEN
207 WRITE(*,*) "Internal error 2 in SMUMPS_SOL_C"
208 CALL MUMPS_ABORT()
209 ENDIF
210 ENDIF
211.GT..AND..GT. DO_L0OMP_FWD= ( (KEEP(401)0)(KEEP(400)0)
212.AND. & DOFORWARD )
213.AND..EQ. DO_L0OMP_FWD = DO_L0OMP_FWD KEEP(201)0
214.GT..AND..GT. DO_L0OMP_BWD = ( (KEEP(401)0)(KEEP(400)0)
215.AND. & DOBACKWARD )
216.AND..EQ. DO_L0OMP_BWD = DO_L0OMP_BWD KEEP(201)0
217 IF ( DO_PRUN ) THEN
218 ALLOCATE (Pruned_SONS(KEEP(28)), stat=I)
219.GT. IF(I0) THEN
220 INFO(1)=-13
221 INFO(2)=KEEP(28)
222 END IF
223 CALL MUMPS_PROPINFO(ICNTL, INFO, COMM_NODES, MYID )
224.LT. IF(INFO(1)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.GT. IF(I0) THEN
235 INFO(1)=-13
236 INFO(2)=KEEP(28)
237 END IF
238 CALL MUMPS_PROPINFO(ICNTL, INFO, COMM_NODES, MYID )
239.LT. IF(INFO(1)0) GOTO 500
240.AND. IF ( DOFORWARD 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.eq. IF ( Pruned_SONS(ISTEP) -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.GT. IF(allocok0) THEN
256 INFO(1)=-13
257 INFO(2)=nb_nodes_RHS
258 END IF
259 CALL MUMPS_PROPINFO(ICNTL, INFO, COMM_NODES, MYID )
260.LT. IF(INFO(1)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.eq. IF ( Pruned_SONS(ISTEP) -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.EQ. IF ( (IRHS_PTR(I+1)-IRHS_PTR(I))0) CYCLE
276.NE..OR..NE. IF ( (KEEP(242) 0 ) (KEEP(243)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.eq. IF ( Pruned_SONS(ISTEP) -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.GT. IF(allocok0) THEN
290 INFO(1)=-13
291 INFO(2)=nb_nodes_RHS
292 END IF
293 CALL MUMPS_PROPINFO(ICNTL, INFO, COMM_NODES, MYID )
294.LT. IF(INFO(1)0) GOTO 500
295 nb_nodes_RHS = 0
296 Pruned_SONS = -1
297 DO I = 1, NBCOL_INBLOC
298.EQ. IF ( (IRHS_PTR(I+1)-IRHS_PTR(I))0) CYCLE
299.NE..OR..NE. IF ( (KEEP(242) 0 ) (KEEP(243)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.eq. IF ( Pruned_SONS(ISTEP) -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
313 CALL SMUMPS_CHAIN_PRUN_NODES(
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.GT. IF(allocok0) THEN
323 INFO(1)=-13
324 INFO(2)=nb_prun_nodes
325 END IF
326 CALL MUMPS_PROPINFO(ICNTL, INFO, COMM_NODES, MYID )
327.LT. IF(INFO(1)0) GOTO 500
328 ALLOCATE(Pruned_Roots(nb_prun_roots), STAT=allocok)
329.GT. IF(allocok0) THEN
330 INFO(1)=-13
331 INFO(2)=nb_prun_roots
332 END IF
333 CALL MUMPS_PROPINFO(ICNTL, INFO, COMM_NODES, MYID )
334.LT. IF(INFO(1)0) GOTO 500
335 ALLOCATE(Pruned_Leaves(nb_prun_leaves), STAT=allocok)
336.GT. IF(allocok0) THEN
337 INFO(1)=-13
338 INFO(2)=nb_prun_leaves
339 END IF
340 CALL MUMPS_PROPINFO(ICNTL, INFO, COMM_NODES, MYID )
341.LT. IF(INFO(1)0) GOTO 500
342 CALL SMUMPS_CHAIN_PRUN_NODES(
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)
351 CALL SMUMPS_OOC_SET_STATES_ES(N,
352 & KEEP(201), Pruned_List, nb_prun_nodes,
353 & STEP)
354.GT. IF ( KEEP(201) 0) THEN
355 OOC_FCT_TYPE_TMP=MUMPS_OOC_GET_FCT_TYPE
356 & ('f',MTYPE,KEEP(201),KEEP(50))
357 ELSE
358 OOC_FCT_TYPE_TMP = -5959
359 ENDIF
360 CALL SMUMPS_CHAIN_PRUN_NODES_STATS(
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
369 CALL SMUMPS_INITIALIZE_RHS_BOUNDS(
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)
377 CALL SMUMPS_PROPAGATE_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.EQ..OR. IF ( (Pruned_Roots(I)KEEP(38))
388.EQ. & (Pruned_Roots(I)KEEP(20)) ) THEN
389 SPECIAL_ROOT_REACHED = .TRUE.
390 EXIT
391 ENDIF
392 ENDDO
393 DEALLOCATE(Pruned_List)
394 ENDIF
395.GT. IF (KEEP(201)0) THEN
396.OR. IF (DOFORWARD DOROOT_FWD_OOC) THEN
397 CALL SMUMPS_SOLVE_INIT_OOC_FWD(PTRFAC,KEEP(28),MTYPE,
398 & A,LA,DOFORWARD,IERR)
399.LT. IF(IERR0)THEN
400 INFO(1)=IERR
401 INFO(2)=0
402 CALL MUMPS_ABORT()
403 ENDIF
404 ENDIF
405 ENDIF
406 IF (DOFORWARD) THEN
407.eq. IF ( KEEP( 50 ) 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.NOT. IF ( DO_PRUN ) THEN
416 CALL MUMPS_INIT_NROOT_DIST(N, NBROOT, MYROOT, MYID_NODES,
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
422 CALL MUMPS_NBLOCAL_ROOTS_OR_LEAVES( N,
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.AND..EQ. IF ((Exploit_Sparsity)(nb_prun_rootsNA(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
438 CALL SMUMPS_SOL_L0OMP_R( N, MTYPE_LOC, NRHS, LIW, IW,
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)
469 IF ( MUMPS_PROCNODE(PROCNODE_STEPS(STEP(INODE)),KEEP(199))
470.EQ. & MYID_NODES ) THEN
471.EQ. IF (L0_OMP_MAPPING( STEP(INODE) ) 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.NE. IF (INODE 0) THEN
479 IF ( TO_PROCESS( STEP( INODE ))) THEN
480.EQ. IF ( IW1(NSTK_S+STEP(INODE)-1) 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.EQ. IF (IW1(NSTK_S+STEP(INODE)-1)-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
504 CALL MUMPS_INIT_POOL_DIST_NONA( N, MYLEAF, MYID_NODES,
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
510 CALL MUMPS_INIT_POOL_DIST( N, MYLEAF, MYID_NODES,
511 & SLAVEF, NA, LNA, KEEP, KEEP8, STEP,
512 & PROCNODE_STEPS, IW1(IPOOL), LPOOL )
513 MYLEAF = MYLEAF - 1
514 ENDIF
515 ENDIF
516 CALL SMUMPS_SOL_R(N, A(1), LA, IW(1), LIW, W(1),
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
540 CALL MUMPS_PROPINFO(ICNTL, INFO, COMM_NODES, MYID )
541.LT. IF ( INFO(1) 0 ) THEN
542.GT. IF ( LP 0 ) THEN
543 WRITE(LP,*) MYID,
545 & INFO(1:2)
546 END IF
547 GOTO 500
548 END IF
549 CALL MPI_BARRIER( COMM_NODES, IERR )
550.NOT. IF (FROM_PP) THEN
551 CALL MUMPS_SECFIN(TIME_FWD)
552 DKEEP(117)=real(TIME_FWD) + DKEEP(117)
553 ENDIF
554.AND. IF (DO_PRUNSWITCH_OFF_ES) THEN
555 DO_PRUN = .FALSE.
556 Exploit_Sparsity = .FALSE.
557.NOT. IF ( DO_L0OMP_BWD ) THEN
558.AND..NE. IF ( allocated(TO_PROCESS) SIZE_TO_PROCESS1 ) 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.AND. IF ( DOBACKWARD DO_PRUN ) THEN
566 nb_prun_leaves = 0
567.AND..EQ. IF ( Exploit_Sparsity (KEEP(111)0) ) THEN
568 nb_nodes_RHS = nb_prun_roots
569 ALLOCATE(nodes_RHS(nb_nodes_RHS), STAT = allocok)
570.GT. IF(allocok0) THEN
571 WRITE(*,*)'problem with allocation of nodes_rhs'
572 INFO(1) = -13
573 INFO(2) = nb_nodes_RHS
574 CALL MUMPS_ABORT()
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.NE. IF (KEEP(23)0) I = UNS_PERM_INV(I)
584 ISTEP = abs(STEP(I))
585.eq. IF ( Pruned_SONS(ISTEP) -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.GT. IF(allocok0) THEN
592 WRITE(*,*)'problem with allocation of nodes_rhs'
593 INFO(1) = -13
594 INFO(2) = nb_nodes_RHS
595 CALL MUMPS_ABORT()
596 END IF
597 nb_nodes_RHS = 0
598 Pruned_SONS(:) = -1
599 DO II = 1, NZ_RHS
600 I = IRHS_SPARSE(II)
601.NE. IF (KEEP(23)0) I = UNS_PERM_INV(I)
602 ISTEP = abs(STEP(I))
603 INODE_PRINC = Step2node(ISTEP)
604.eq. IF ( Pruned_SONS(ISTEP) -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
612 CALL SMUMPS_TREE_PRUN_NODES(
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.GT. IF(allocok0) THEN
622 INFO(1)=-13
623 INFO(2)=nb_prun_nodes
624 END IF
625 CALL MUMPS_PROPINFO(ICNTL, INFO, COMM_NODES, MYID )
626.LT. IF(INFO(1)0) GOTO 500
627 ALLOCATE(Pruned_Roots(nb_prun_roots), STAT=allocok)
628.GT. IF(allocok0) THEN
629 INFO(1)=-13
630 INFO(2)=nb_prun_roots
631 END IF
632 CALL MUMPS_PROPINFO(ICNTL, INFO, COMM_NODES, MYID )
633.LT. IF(INFO(1)0) GOTO 500
634 ALLOCATE(Pruned_Leaves(nb_prun_leaves), STAT=allocok)
635.GT. IF(allocok0) THEN
636 INFO(1)=-13
637 INFO(2)=nb_prun_leaves
638 END IF
639 CALL MUMPS_PROPINFO(ICNTL, INFO, COMM_NODES, MYID )
640.LT. IF(INFO(1)0) GOTO 500
641 CALL SMUMPS_TREE_PRUN_NODES(
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 & )
650 CALL SMUMPS_OOC_SET_STATES_ES(N,
651 & KEEP(201), Pruned_List, nb_prun_nodes,
652 & STEP)
653 IF(allocated(nodes_RHS)) DEALLOCATE(nodes_RHS)
654.GT. IF (KEEP(201)0) THEN
655 OOC_FCT_TYPE_TMP=MUMPS_OOC_GET_FCT_TYPE
656 & ('b',MTYPE,KEEP(201),KEEP(50))
657 ELSE
658 OOC_FCT_TYPE_TMP = -5959
659 ENDIF
660 CALL SMUMPS_TREE_PRUN_NODES_STATS(
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.EQ..AND. IF(KEEP(201)1DOROOT_BWD_PANEL) THEN
669 I_WORKED_ON_ROOT = .FALSE.
670 CALL SMUMPS_SOLVE_INIT_OOC_BWD(PTRFAC,KEEP(28),MTYPE,
671 & I_WORKED_ON_ROOT, IROOT, A, LA, IERR)
672.LT. IF (IERR 0) THEN
673 INFO(1) = -90
674 INFO(2) = IERR
675 ENDIF
676 ENDIF
677.EQ. IF (KEEP(201)1) THEN
678 CALL MUMPS_PROPINFO(ICNTL, INFO, COMM_NODES, MYID )
679.LT. IF ( INFO(1) 0 ) GOTO 500
680 ENDIF
681.NE..AND..EQ. IF (KEEP(60)0 KEEP(221)0
682.AND..EQ. & MYID_NODES MASTER_ROOT) THEN
683 RHS_ROOT(1:NRHS*SIZE_ROOT) = ZERO
684 ENDIF
685.NOT. IF ( FROM_PP) THEN
686 CALL MUMPS_SECDEB(TIME_SpecialRoot)
687 ENDIF
688.NE..AND. IF ( ( KEEP( 38 ) 0 ) SPECIAL_ROOT_REACHED ) THEN
689.EQ..AND..EQ. IF ( KEEP(60) 0 KEEP(252) 0 ) THEN
690 IF ( root%yes ) THEN
691.GT. IF (KEEP(201)0) THEN
692.AND..NE..and. IF ( (Exploit_Sparsity(KEEP(111)0))
693.eq. & (OOC_STATE_NODE(STEP(KEEP(38)))-6) ) THEN
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.GT. IF (KEEP(201)0) THEN
701 CALL SMUMPS_SOLVE_GET_OOC_NODE(
702 & KEEP(38),PTRFAC,KEEP,A,LA,
703 & STEP,KEEP8,N,DUMMY_BOOL,IERR)
704.LT. IF(IERR0)THEN
705 INFO(1)=IERR
706 INFO(2)=0
708 & INFO(1)
709 call MUMPS_ABORT()
710 ENDIF
711 ENDIF
712 IAPOS = PTRFAC(IW( IOLDPS + 4 + KEEP(IXSZ)))
713.EQ. IF (LOCAL_M * LOCAL_N 0) THEN
714 IAPOS = min(IAPOS, LA)
715 ENDIF
716#if defined(V_T)
717 CALL VTBEGIN(root_soln,ierr)
718#endif
719 CALL SMUMPS_ROOT_SOLVE( NRHS, root%DESCRIPTOR(1),
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.GT. IF(KEEP(201)0)THEN
728 CALL SMUMPS_FREE_FACTORS_FOR_SOLVE(KEEP(38),
729 & PTRFAC,KEEP(28),A,LA,.FALSE.,IERR)
730.LT. IF(IERR0)THEN
731 INFO(1)=IERR
732 INFO(2)=0
733 WRITE(*,*)
735 & INFO(1)
736 call MUMPS_ABORT()
737 ENDIF
738 ENDIF
739 ENDIF
740 ENDIF
741.NE..AND. ELSE IF ( ( KEEP(20) 0) SPECIAL_ROOT_REACHED ) THEN
742.eq. IF ( MYID_NODES MASTER_ROOT ) THEN
743 END IF
744 END IF
745.NOT. IF (FROM_PP) THEN
746 CALL MUMPS_SECFIN(TIME_SpecialRoot)
747 DKEEP(119)=real(TIME_SpecialRoot) + DKEEP(119)
748 ENDIF
749#if defined(V_T)
750 CALL VTEND(root_soln,ierr)
751#endif
752 1010 CONTINUE
753 CALL MUMPS_PROPINFO(ICNTL, INFO, COMM_NODES, MYID )
754.LT. IF ( INFO(1) 0 ) RETURN
755 IF (DOBACKWARD) THEN
756.GT..AND..NOT. IF ( KEEP(201)0 DOROOT_BWD_PANEL )
757 & THEN
758 I_WORKED_ON_ROOT = DOROOT
759.gt. IF (KEEP(38)0 ) THEN
760.AND..EQ. IF ( ( Exploit_Sparsity(KEEP(111)0) )
761.OR. & AM1 ) THEN
762.eq. IF (OOC_STATE_NODE(STEP(KEEP(38)))-6) THEN
763 OOC_STATE_NODE(STEP(KEEP(38)))=-4
764 ENDIF
765 ENDIF
766.AND..NE. IF (Exploit_Sparsity(KEEP(111)0)) THEN
767.eq. IF (OOC_STATE_NODE(STEP(KEEP(38)))-6) THEN
768 I_WORKED_ON_ROOT = .FALSE.
769 ENDIF
770 ENDIF
771 ENDIF
772 ENDIF
773.NOT. IF (AM1) THEN
774 DO_NBSPARSE_BWD = .FALSE.
775 ELSE
776 DO_NBSPARSE_BWD = DO_NBSPARSE
777 ENDIF
778 PRUN_BELOW_BWD = AM1
779.OR. PRUN_BELOW_BWD = PRUN_BELOW_BWD DO_L0OMP_BWD
780 IF ( AM1 ) THEN
781 CALL SMUMPS_CHAIN_PRUN_NODES(
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.GT. IF(allocok0) THEN
791 INFO(1)=-13
792 INFO(2)=nb_prun_nodes
793 END IF
794 CALL MUMPS_PROPINFO(ICNTL, INFO, COMM_NODES, MYID )
795.LT. IF(INFO(1)0) GOTO 500
796 ALLOCATE(Pruned_Roots(nb_prun_roots), STAT=allocok)
797.GT. IF(allocok0) THEN
798 INFO(1)=-13
799 INFO(2)=nb_prun_roots
800 END IF
801 CALL MUMPS_PROPINFO(ICNTL, INFO, COMM_NODES, MYID )
802.LT. IF(INFO(1)0) GOTO 500
803 ALLOCATE(Pruned_Leaves(nb_prun_leaves), STAT=allocok)
804.GT. IF(allocok0) THEN
805 INFO(1)=-13
806 INFO(2)=nb_prun_leaves
807 END IF
808 CALL MUMPS_PROPINFO(ICNTL, INFO, COMM_NODES, MYID )
809.LT. IF(INFO(1)0) GOTO 500
810 CALL SMUMPS_CHAIN_PRUN_NODES(
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 )
818 CALL SMUMPS_OOC_SET_STATES_ES(N,
819 & KEEP(201), Pruned_List, nb_prun_nodes,
820 & STEP)
821.GT. IF (KEEP(201)0) THEN
822 OOC_FCT_TYPE_TMP=MUMPS_OOC_GET_FCT_TYPE
823 & ('b',MTYPE,KEEP(201),KEEP(50))
824 ELSE
825 OOC_FCT_TYPE_TMP = -5959
826 ENDIF
827 CALL SMUMPS_CHAIN_PRUN_NODES_STATS(
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))
833 CALL SMUMPS_INITIALIZE_RHS_BOUNDS(
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)
841 CALL SMUMPS_PROPAGATE_RHS_BOUNDS(
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.GT. IF ( KEEP(201)0 ) THEN
851 IROOT = max(KEEP(20),KEEP(38))
852 CALL SMUMPS_SOLVE_INIT_OOC_BWD(PTRFAC,KEEP(28),MTYPE,
853 & I_WORKED_ON_ROOT, IROOT, A, LA, IERR)
854 ENDIF
855.eq. IF ( KEEP( 50 ) 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.NOT. IF (FROM_PP) THEN
864 CALL MUMPS_SECDEB(TIME_BWD)
865 ENDIF
866.NOT. IF ( SPECIAL_ROOT_REACHED ) THEN
867 RHS_ROOT(1:NRHS*SIZE_ROOT) = ZERO
868 ENDIF
869.AND..NE. IF (AM1(NB_FS_IN_RHSCOMP_FNB_FS_IN_RHSCOMP_TOT)) THEN
870 DO I =1, N
871 II = POSINRHSCOMP_BWD(I)
872.GT..AND..GT. IF ((II0)(IINB_FS_IN_RHSCOMP_F)) THEN
873 DO K=1,NRHS
874 RHSCOMP(II, K) = ZERO
875 ENDDO
876 ENDIF
877 ENDDO
878 ENDIF
879.NOT. IF ( DO_PRUN ) THEN
880.NOT. IF ( 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.EQ. IF (MYLEAF -1) THEN
892 MYLEAF = IPOOL_A_L0_OMP(LPOOL_A_L0_OMP)
893 ENDIF
894 CALL MUMPS_INIT_POOL_DIST_NA_BWD_L0( N, MYROOT, MYID_NODES,
895 & NA, LNA, KEEP, KEEP8, STEP, PROCNODE_STEPS,
896 & IW1(IPOOL), LPOOL, L0_OMP_MAPPING )
897 ELSE
898 CALL MUMPS_INIT_POOL_DIST_NA_BWD( N, MYROOT, MYID_NODES,
899 & NA, LNA, KEEP, KEEP8, STEP, PROCNODE_STEPS,
900 & IW1(IPOOL), LPOOL )
901.EQ. IF (MYLEAF -1) THEN
902 CALL MUMPS_NBLOCAL_ROOTS_OR_LEAVES( N,
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)
919 IF ( MUMPS_PROCNODE(PROCNODE_STEPS(ISTEP),KEEP(199))
920.NE. & MYID_NODES ) THEN
921 CYCLE
922 ENDIF
923.NE. IF ( L0_OMP_MAPPING( ISTEP ) 0 ) THEN
924 CYCLE
925 ENDIF
926.NOT. IF ( TO_PROCESS( ISTEP ) ) THEN
927 CYCLE
928 ENDIF
929 I = Step2Node( ISTEP )
930 ICHILD = FILS ( I )
931.GT. DO WHILE ( ICHILD 0 )
932 ICHILD = FILS( ICHILD )
933 END DO
934.LT. IF ( ICHILD 0 ) THEN
935 ICHILD = -ICHILD
936.GT. DO WHILE ( ICHILD 0 )
937.EQ..AND. IF ( L0_OMP_MAPPING( STEP( ICHILD ) ) 0
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
947 CALL MUMPS_INIT_POOL_DIST_NA_BWDL0ES( N, MYROOT,
948 & MYID_NODES,
949 & NA, LNA, KEEP, KEEP8, STEP, PROCNODE_STEPS,
950 & IW1(IPOOL), LPOOL, L0_OMP_MAPPING, TO_PROCESS )
951 ELSE
952 CALL MUMPS_INIT_POOL_DIST_BWD(N, nb_prun_roots,
953 & Pruned_Roots,
954 & MYROOT, MYID_NODES, KEEP, KEEP8, STEP, PROCNODE_STEPS,
955 & IW1(IPOOL), LPOOL)
956 CALL MUMPS_NBLOCAL_ROOTS_OR_LEAVES( N,
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.EQ. IF (KEEP(31) 1) THEN
969 DO I = 1, KEEP(28)
970.EQ. IF (MUMPS_PROCNODE(PROCNODE_STEPS(I),KEEP(199))
971 & MYID_NODES) THEN
972.NOT. IF ( MUMPS_IN_OR_ROOT_SSARBR(PROCNODE_STEPS(I),
973 & KEEP(199)) ) THEN
974.EQ. IF ( L0_OMP_MAPPING(I) 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
989 CALL SMUMPS_SOL_S( N, A, LA, IW, LIW, W(1), LWC,
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.AND. IF ( DO_L0OMP_BWD DO_PRUN ) THEN
1008 DO I = 1, L_PHYS_L0_OMP
1009.LT. IF ( PHYS_L0_OMP( I ) 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.AND..GE. IF (DO_L0OMP_BWD INFO(1) 0) THEN
1016 KEEP(31) = 0
1017 PRUN_BELOW_BWD = AM1
1018 CALL SMUMPS_SOL_L0OMP_S(N, MTYPE_LOC, NRHS, LIW, IW,
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
1035 CALL SMUMPS_CLEAN_PENDING( INFO(1), KEEP,
1036 & BUFR, LBUFR,LBUFR_BYTES,
1037 & COMM_NODES, IDUMMY,
1038 & SLAVEF, .TRUE., .FALSE. )
1039 CALL MUMPS_PROPINFO(ICNTL, INFO, COMM_NODES, MYID )
1040#if defined(V_T)
1041 CALL VTEND(back_soln,ierr)
1042#endif
1043.NOT. IF (FROM_PP) THEN
1044 CALL MUMPS_SECFIN(TIME_BWD)
1045 DKEEP(118)=real(TIME_BWD)+DKEEP(118)
1046 ENDIF
1047 ENDIF
1048.GT..AND..GT. IF (LDIAG2 MP0) THEN
1049 IF (DOFORWARD) THEN
1050 K = min0(10,size(RHSCOMP,1))
1051.EQ. IF (LDIAG4) K = size(RHSCOMP,1)
1052.NOT. IF ( FROM_PP) THEN
1053 WRITE (MP,99992)
1054.GT. IF (size(RHSCOMP,1)0)
1055 & WRITE (MP,99993) (RHSCOMP(I,1),I=1,K)
1056.GT..and. IF (size(RHSCOMP,1)0NRHS>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.OR..OR. IF (Exploit_SparsityAM1SWITCH_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,5E14.6))
107299994 FORMAT (' rhs(internal, 2 nd column)'/(1X,1P,5E14.6))
integer function mumps_ooc_get_fct_type(fwdorbwd, mtype, k201, k50)
subroutine smumps_free_factors_for_solve(inode, ptrfac, nsteps, a, la, flag, ierr)
subroutine smumps_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 smumps_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 smumps_solve_get_ooc_node(inode, ptrfac, keep, a, la, step, keep8, n, must_be_permuted, ierr)
subroutine smumps_sol_c(root, n, a, la, iw, liw, w, lwc, iwcb, liww, nrhs, na, lna, ne_steps, w2, mtype, icntl, from_pp, step, frere, dad, fils, ptrist, ptrfac, iw1, liw1, ptracb, liwk_ptracb, procnode_steps, slavef, info, keep, keep8, dkeep, comm_nodes, myid, myid_nodes, bufr, lbufr, lbufr_bytes, istep_to_iniv2, tab_pos_in_pere, ibeg_root_def, iend_root_def, iroot_def_rhs_col1, rhs_root, lrhs_root, size_root, master_root, rhscomp, lrhscomp, posinrhscomp_fwd, posinrhscomp_bwd, nz_rhs, nbcol_inbloc, nrhs_orig, jbeg_rhs, step2node, lstep2node, irhs_sparse, irhs_ptr, size_perm_rhs, perm_rhs, size_uns_perm_inv, uns_perm_inv, nb_fs_in_rhscomp_f, nb_fs_in_rhscomp_tot, do_nbsparse, rhs_bounds, lrhs_bounds, ipool_b_l0_omp, lpool_b_l0_omp, ipool_a_l0_omp, lpool_a_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 smumps_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)