47 & NRHS, LIW, IW, PTRICB, RHSCOMP, LRHSCOMP, POSINRHSCOMP_FWD,
48 & STEP, FRERE, DAD, FILS, NSTK, PTRIST, PTRFAC, INFO,
49 & KEEP, KEEP8, DKEEP, PROCNODE_STEPS, SLAVEF,
51 & BUFR, LBUFR, LBUFR_BYTES,
52 & RHS_ROOT, LRHS_ROOT,
53 & ISTEP_TO_INIV2, TAB_POS_IN_PERE,
54 & RHS_BOUNDS, LRHS_BOUNDS, DO_NBSPARSE,
56 & NBROOT_UNDER_L0, LPOOL_B_L0_OMP, IPOOL_B_L0_OMP,
57 & L_VIRT_L0_OMP, VIRT_L0_OMP, L_PHYS_L0_OMP, PHYS_L0_OMP,
58 & PERM_L0_OMP, PTR_LEAFS_L0_OMP,
59 & L0_OMP_MAPPING, LL0_OMP_MAPPING,
60 & L0_OMP_FACTORS, LL0_OMP_FACTORS,
61 & DO_PRUN, TO_PROCESS )
65 INTEGER,
INTENT( in ) :: N, , NRHS, SLAVEF, LIW
66 INTEGER,
INTENT( in ) :: IW(LIW)
67 INTEGER :: INFO( 80 ), KEEP(500)
68 INTEGER(8) :: KEEP8(150)
69 DOUBLE PRECISION :: DKEEP(230)
70 INTEGER,
INTENT( in ) :: PROCNODE_STEPS( KEEP(28) )
71 INTEGER :: PTRICB( KEEP(28) )
72 INTEGER,
INTENT( in ) :: POSINRHSCOMP_FWD(N), LRHSCOMP
73 DOUBLE PRECISION,
INTENT(inout):: RHSCOMP(LRHSCOMP,NRHS)
74 INTEGER,
INTENT( in ) :: STEP(N), FRERE( KEEP(28) ), FILS( N ),
76 INTEGER,
INTENT( inout ) :: NSTK(KEEP(28))
77 INTEGER,
INTENT( in ) :: PTRIST(KEEP(28))
78 INTEGER(8),
INTENT( in ) :: PTRFAC(KEEP(28))
79 INTEGER,
INTENT( IN ) :: COMM, MYID
80 INTEGER,
INTENT( IN ) :: LBUFR, LBUFR_BYTES
81 INTEGER :: BUFR(LBUFR)
82 INTEGER(8),
INTENT(IN) :: LRHS_ROOT
83 DOUBLE PRECISION :: RHS_ROOT(LRHS_ROOT)
84 INTEGER ISTEP_TO_INIV2(KEEP(71)),
85 & tab_pos_in_pere(slavef+2,
max(1,keep(56)))
86 LOGICAL,
INTENT( in ) :: DO_NBSPARSE
87 INTEGER,
INTENT( in ) :: LRHS_BOUNDS
88 INTEGER,
INTENT( in ) :: (LRHS_BOUNDS)
89 LOGICAL,
INTENT( in ) ::
90 INTEGER,
INTENT( out ):: NBROOT_UNDER_L0
91 INTEGER,
INTENT( in ) :: LPOOL_B_L0_OMP
92 INTEGER,
INTENT( in ) :: IPOOL_B_L0_OMP
94 INTEGER,
INTENT( in ) :: L_PHYS_L0_OMP
95 INTEGER,
INTENT( in ) :: PHYS_L0_OMP( L_PHYS_L0_OMP )
96 INTEGER,
INTENT( in ) :: L_VIRT_L0_OMP
97 INTEGER,
INTENT( in ) :: VIRT_L0_OMP( L_VIRT_L0_OMP )
98 INTEGER,
INTENT( in ) :: PERM_L0_OMP( L_PHYS_L0_OMP )
99 INTEGER,
INTENT( in ) :: PTR_LEAFS_L0_OMP( L_PHYS_L0_OMP + 1)
100 INTEGER,
INTENT( in ) ::
101 INTEGER,
INTENT( in ) :: L0_OMP_MAPPING( LL0_OMP_MAPPING )
102 INTEGER,
INTENT( in ) :: LL0_OMP_FACTORS
103 LOGICAL,
INTENT( in ) :: DO_PRUN
104 LOGICAL,
INTENT( in ) :: TO_PROCESS( KEEP(28) )
105 TYPE (DMUMPS_L0OMPFAC_T),
INTENT(IN) ::
106 & l0_omp_factors(ll0_omp_factors)
107 INTEGER :: LASTFSSBTRSTA_P, LASTFSSBTRDYN_P
108 INTEGER :: THREAD_ID, IL0OMPFAC
109 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: IPOOL_P
110 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: IWCB_P
111 DOUBLE PRECISION,
ALLOCATABLE,
DIMENSION(:) :: WCB_P
112 INTEGER :: LPOOL_P, LEAF_P, LIWCB_P
114 INTEGER(8) :: POSWCB_P
116 LOGICAL :: IS_INODE_PROCESSED_P
117 LOGICAL :: ERROR_WAS_BROADCASTED_P
118 INTEGER :: INFO_P(2), allocok
119 INTEGER :: I, VIRTUAL_TASK, PHYSICAL_TASK
120 INTEGER :: INODE, IFATH, IROOT_SBTR
121 INTEGER :: NBROOT_PROCESSED
122 INTEGER :: NEXT_TASK_DYN
124 INTEGER :: NBFIN_DUMMY
125 nbfin_dummy = huge(nbfin_dummy)
128 next_task_dyn = keep(400)+1
133!$omp& ipool_p, lpool_p, leaf_p,
141!$ nomp_save = omp_get_max_threads()
146 lpool_p = lpool_b_l0_omp
148 lwcb_p = int(keep(133),8)*int(nrhs,8)
153 ALLOCATE(ipool_p(lpool_p), iwcb_p(liwcb_p), wcb_p( lwcb_p),
155 IF ( allocok > 0 )
THEN
165 IF (info(1) .LT. 0)
THEN
168 virtual_task = thread_id
170 IF (virtual_task .LT. l_virt_l0_omp)
THEN
171 DO physical_task = virt_l0_omp( virtual_task ),
172 & virt_l0_omp( virtual_task + 1 ) - 1
174 DO i = ptr_leafs_l0_omp( perm_l0_omp( physical_task )+1 )+1,
175 & ptr_leafs_l0_omp( perm_l0_omp( physical_task ) )
176 IF ( ipool_b_l0_omp(i) .GT. 0 )
THEN
177 ipool_p(leaf_p) = ipool_b_l0_omp(i)
181 IF ( leaf_p .EQ. 1 )
THEN
182 WRITE(*,*)
" Internal error 1 in DMUMPS_SOL_L0OMP_R",
185 iroot_sbtr = phys_l0_omp( perm_l0_omp( physical_task ))
187 IF (.NOT. to_process(step(iroot_sbtr)))
THEN
192 DO WHILE (inode .GT. 0)
193 lastfssbtrsta_p = inode
197 & mtype, keep, iw, liw, n, step, ptrist, fils, frere )
198 DO WHILE (leaf_p .NE.1 .AND. info_p(1) .GE. 0)
200 inode = ipool_p(leaf_p)
201 ifath = dad(step(inode) )
202 il0ompfac = l0_omp_mapping(step(inode))
203 IF (il0ompfac .NE. thread_id)
THEN
206 is_inode_processed_p = to_process(step(inode))
208 is_inode_processed_p = .true.
210 IF ( is_inode_processed_p )
THEN
212 & lastfssbtrsta_p, lastfssbtrdyn_p,
213 & bufr, lbufr, lbufr_bytes, myid, slavef, comm,
214 & n, ipool_p, lpool_p, leaf_p, nbfin_dummy, nstk,
215 & iwcb_p, liwcb_p, wcb_p, lwcb_p,
216 & l0_omp_factors(il0ompfac)%A(1),
217 & l0_omp_factors(il0ompfac)%LA,
219 & nrhs, poswcb_p, pleftwcb_p, posiwcb_p,
220 & ptricb, ptrist, ptrfac, procnode_steps,
221 & fils, step, frere, dad, info_p, keep, keep8, dkeep,
222 & rhs_root, lrhs_root, mtype,
223 & rhscomp, lrhscomp, posinrhscomp_fwd,
224 & istep_to_iniv2, tab_pos_in_pere,
225 & rhs_bounds, lrhs_bounds, do_nbsparse, from_pp
226 & , error_was_broadcasted_p )
227 IF (info_p(1) .LT. 0)
THEN
233 IF ( info(1) .LT. 0 )
GOTO 50
234 IF (error_was_broadcasted_p)
THEN
235 WRITE(*,*)
" Internal error 2 in DMUMPS_SOL_L0OMP_R",
236 & error_was_broadcasted_p
239 IF ( ifath .EQ. 0 )
THEN
240 IF ( is_inode_processed_p )
THEN
241 nbroot_processed = nbroot_processed + 1
244 ptricb(step(inode)) = 0
245 IF (ifath .NE. 0)
THEN
246 IF ( inode .NE. iroot_sbtr )
THEN
247 IF ( is_inode_processed_p )
THEN
248 nstk(step(ifath)) = nstk(step(ifath)) - 1
250 IF (nstk(step(ifath)) .EQ. 0 .OR.
251 & nstk(step(ifath)) .EQ. -1 )
THEN
252 ipool_p( leaf_p ) = ifath
255 nstk(step(ifath)) = huge(nstk(step(ifath)))
259 IF ( is_inode_processed_p )
THEN
261 nstk(step(ifath)) = nstk(step(ifath)) - 1
270 virtual_task = next_task_dyn
271 next_task_dyn = next_task_dyn + 1
276 IF (
allocated(ipool_p))
DEALLOCATE(ipool_p)
277 IF (
allocated(iwcb_p))
DEALLOCATE(iwcb_p)
278 IF (
allocated(wcb_p))
DEALLOCATE(wcb_p)
279#if defined(WORKAROUNDINTELILP64OPENMPLIMITATION)
285 nbroot_under_l0 = nbroot_processed
289 & PTRICB, PTRACB, RHSCOMP, LRHSCOMP, POSINRHSCOMP_BWD,
290 & STEP, FRERE, FILS, NE_STEPS, PTRIST, PTRFAC, INFO,
291 & KEEP, KEEP8, DKEEP, PROCNODE_STEPS, SLAVEF,
292 & COMM, MYID, BUFR, LBUFR, LBUFR_BYTES, RHS_ROOT, LRHS_ROOT,
293 & ISTEP_TO_INIV2, TAB_POS_IN_PERE, PANEL_POS, LPANEL_POS,
294 & PRUN_BELOW_BWD, TO_PROCESS, SIZE_TO_PROCESS,
295 & RHS_BOUNDS, LRHS_BOUNDS, DO_NBSPARSE, FROM_PP, LPOOL_B_L0_OMP,
296 & L_VIRT_L0_OMP, VIRT_L0_OMP, L_PHYS_L0_OMP, PHYS_L0_OMP,
297 & PERM_L0_OMP, PTR_LEAFS_L0_OMP, L0_OMP_MAPPING, LL0_OMP_MAPPING,
298 & L0_OMP_FACTORS, LL0_OMP_FACTORS )
302 INTEGER,
INTENT( in ) :: N, MTYPE, NRHS, SLAVEF, LIW
303 INTEGER,
INTENT( in ) :: IW(LIW)
304 INTEGER :: INFO( 80 ), KEEP(500)
305 INTEGER(8) :: KEEP8(150)
306 DOUBLE PRECISION :: DKEEP(230)
307 INTEGER,
INTENT( in ) :: PROCNODE_STEPS( KEEP(28) )
308 INTEGER :: PTRICB( KEEP(28) )
309 INTEGER(8) :: PTRACB( KEEP(28) )
310 INTEGER,
INTENT( in ) :: POSINRHSCOMP_BWD(N), LRHSCOMP
311 DOUBLE PRECISION,
INTENT(inout):: RHSCOMP(LRHSCOMP,NRHS)
312 INTEGER,
INTENT( in ) :: STEP(N), FRERE( KEEP(28) ), FILS( N )
313 INTEGER,
INTENT( inout ) :: NE_STEPS(KEEP(28))
314 INTEGER,
INTENT( in ) :: PTRIST(KEEP(28))
315 INTEGER(8),
INTENT( in ) :: PTRFAC(KEEP(28))
316 INTEGER,
INTENT( IN ) :: COMM, MYID
317 INTEGER,
INTENT( IN ) :: LBUFR, LBUFR_BYTES
318 INTEGER :: BUFR(LBUFR)
319 INTEGER(8),
INTENT(IN) :: LRHS_ROOT
320 DOUBLE PRECISION :: RHS_ROOT(LRHS_ROOT)
321 INTEGER ISTEP_TO_INIV2(KEEP(71)),
322 & TAB_POS_IN_PERE(SLAVEF+2,max(1,KEEP(56)))
323 INTEGER :: LPANEL_POS
324 INTEGER :: PANEL_POS(LPANEL_POS)
325 LOGICAL,
INTENT( in ) :: DO_NBSPARSE
326 INTEGER,
INTENT( in ) :: LRHS_BOUNDS
327 INTEGER,
INTENT( in ) :: RHS_BOUNDS(LRHS_BOUNDS)
328 LOGICAL,
INTENT( in ) :: PRUN_BELOW_BWD
329 INTEGER,
INTENT( in ) :: SIZE_TO_PROCESS
330 LOGICAL,
INTENT( in ) :: TO_PROCESS(SIZE_TO_PROCESS)
331 LOGICAL,
INTENT( in ) :: FROM_PP
332 INTEGER,
INTENT( in ) :: LPOOL_B_L0_OMP
333 INTEGER,
INTENT( in ) :: L_PHYS_L0_OMP
334 INTEGER,
INTENT( in ) :: PHYS_L0_OMP( L_PHYS_L0_OMP )
335 INTEGER,
INTENT( in ) :: L_VIRT_L0_OMP
336 INTEGER,
INTENT( in ) :: VIRT_L0_OMP( L_VIRT_L0_OMP )
337 INTEGER,
INTENT( in ) :: PERM_L0_OMP( L_PHYS_L0_OMP )
338 INTEGER,
INTENT( in ) :: PTR_LEAFS_L0_OMP( L_PHYS_L0_OMP + 1)
339 INTEGER,
INTENT( in ) :: LL0_OMP_MAPPING
340 INTEGER,
INTENT( in ) :: L0_OMP_MAPPING( LL0_OMP_MAPPING )
341 INTEGER,
INTENT( in ) :: LL0_OMP_FACTORS
342 TYPE (DMUMPS_L0OMPFAC_T),
INTENT(IN) ::
343 & l0_omp_factors(ll0_omp_factors)
344 INTEGER :: THREAD_ID, IL0OMPFAC
345 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: IPOOL_P
346 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: IWCB_P
347 DOUBLE PRECISION,
ALLOCATABLE,
DIMENSION(:) :: WCB_P
348 DOUBLE PRECISION,
ALLOCATABLE,
DIMENSION(:) :: W2_P
349 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: PANEL_POS_P
350 INTEGER :: LPOOL_P, IIPOOL_P, LIWCB_P, LPANEL_POS_P
351 INTEGER :: MYLEAF_LEFT_HUGE_P
353 INTEGER(8) :: POSWCB_P, PLEFTWCB_P
355 LOGICAL :: DO_MCAST2_TERMBWD_P
356 LOGICAL :: ERROR_WAS_BROADCASTED_P
357 INTEGER :: INFO_P(2), allocok
358 INTEGER :: VIRTUAL_TASK, PHYSICAL_TASK
360 INTEGER :: NEXT_TASK_DYN
362 INTEGER :: NBFIN_DUMMY
363 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: DEJA_SEND_DUMMY
364 nbfin_dummy = huge(nbfin_dummy)
365 ALLOCATE(deja_send_dummy( 0:slavef-1 ), stat=allocok)
366 if(allocok.ne.0)
then
367 WRITE(6,*)
' Allocation error of DEJA_SEND_DUMMY in '
368 & //
'routine DMUMPS_SOL_S '
374 next_task_dyn = keep(400)+1
377!$omp& nbfin_dummy, deja_send_dummy )
388!$ thread_id = omp_get_thread_num() + 1
391 lpool_p = lpool_b_l0_omp
393 lwcb_p = int(keep(133),8)*int(nrhs,8)
398 IF (keep(201).EQ.1)
THEN
399 lpanel_pos_p = keep(228)+1
404 ALLOCATE(ipool_p(lpool_p), iwcb_p(liwcb_p), wcb_p( lwcb_p),
405 & w2_p(keep(133)), panel_pos_p(lpanel_pos_p), stat=allocok)
406 IF ( allocok > 0 )
THEN
409 & keep(133)+lpanel_pos_p, info(2))
413!$omp
END CRITICAL(critical_info)
416 IF (info(1) .LT. 0)
THEN
419 virtual_task = thread_id
421 IF (virtual_task .LT. l_virt_l0_omp)
THEN
422 DO physical_task = virt_l0_omp( virtual_task ),
423 & virt_l0_omp( virtual_task + 1 ) - 1
424 inode = phys_l0_omp( perm_l0_omp( physical_task ) )
427 myleaf_left_huge_p = huge(myleaf_left_huge_p)
428 IF ( prun_below_bwd )
THEN
429 IF ( .NOT. to_process(step(inode)) )
THEN
433 DO WHILE (iipool_p .NE.1 .AND. info_p(1) .GE. 0)
434 iipool_p = iipool_p - 1
435 inode = ipool_p(iipool_p)
436 il0ompfac = l0_omp_mapping(step(inode))
437 IF (il0ompfac .NE. thread_id)
THEN
440 & iipool_p, nbfin_dummy, l0_omp_factors(il0ompfac)%A(1),
441 & l0_omp_factors(il0ompfac)%LA, iw, liw,
442 & wcb_p, lwcb_p, nrhs, poswcb_p, pleftwcb_p, posiwcb_p,
443 & rhscomp, lrhscomp, posinrhscomp_bwd,
444 & ptricb, ptracb, iwcb_p, liwcb_p, w2_p, ne_steps, step,
445 & frere, fils, ptrist, ptrfac, myleaf_left_huge_p, info_p,
448 & slavef, comm, myid, bufr, lbufr, lbufr_bytes,
449 & keep, keep8, dkeep, rhs_root, lrhs_root, mtype,
450 & istep_to_iniv2, tab_pos_in_pere, panel_pos_p, lpanel_pos_p,
451 & prun_below_bwd, to_process, size_to_process,
452 & rhs_bounds, lrhs_bounds, do_nbsparse, from_pp
453 & , error_was_broadcasted_p
454 & , do_mcast2_termbwd_p
456 IF (info_p(1) .LT. 0)
THEN
462 IF ( info(1) .LT. 0 )
GOTO 50
463 IF (error_was_broadcasted_p)
THEN
464 WRITE(*,*)
" Internal error 1 in DMUMPS_SOL_L0OMP_R",
465 & error_was_broadcasted_p
467 IF (do_mcast2_termbwd_p)
THEN
468 WRITE(*,*)
" Internal error 2 in DMUMPS_SOL_L0OMP_R",
469 & do_mcast2_termbwd_p
474 virtual_task = next_task_dyn
475 next_task_dyn = next_task_dyn + 1
480 IF (
allocated(ipool_p))
DEALLOCATE(ipool_p)
481 IF (
allocated(iwcb_p))
DEALLOCATE(iwcb_p)
482 IF (
allocated(wcb_p))
DEALLOCATE(wcb_p)
483 IF (
allocated(w2_p))
DEALLOCATE(w2_p)
484 IF (
allocated(panel_pos_p))
DEALLOCATE(panel_pos_p)
485#
if defined(workaroundintelilp64openmplimitation)
492 IF (
allocated(deja_send_dummy))
DEALLOCATE(deja_send_dummy)
subroutine dmumps_solve_node_bwd(inode, n, ipool, lpool, iipool, nbfinf, a, la, iw, liw, w, lwc, nrhs, poswcb, pleftw, posiwcb, rhscomp, lrhscomp, posinrhscomp_bwd, ptricb, ptracb, iwcb, liww, w2, ne_steps, step, frere, fils, ptrist, ptrfac, myleaf_left, info, procnode_steps, deja_send, 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, error_was_broadcasted, do_mcast2_termbwd)
subroutine dmumps_solve_node_fwd(inode, lastfsl0sta, lastfsl0dyn, bufr, lbufr, lbufr_bytes, myid, slavef, comm, n, ipool, lpool, leaf, nbfin, nstk_s, iwcb, liwcb, wcb, lwcb, a, la, iw, liw, nrhs, poswcb, pleftwcb, posiwcb, ptricb, ptrist, ptrfac, procnode_steps, fils, step, frere, dad, info, keep, keep8, dkeep, rhs_root, lrhs_root, mtype, rhscomp, lrhscomp, posinrhscomp_fwd istep_to_iniv2, tab_pos_in_pere, rhs_bounds, lrhs_bounds, do_nbsparse, from_pp, error_was_broadcasted)
subroutine dmumps_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 dmumps_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)