OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
dsol_omp_m.F
Go to the documentation of this file.
1C
2C This file is part of MUMPS 5.5.1, released
3C on Tue Jul 12 13:17:24 UTC 2022
4C
5C
6C Copyright 1991-2022 CERFACS, CNRS, ENS Lyon, INP Toulouse, Inria,
7C Mumps Technologies, University of Bordeaux.
8C
9C This version of MUMPS is provided to you free of charge. It is
10C released under the CeCILL-C license
11C (see doc/CeCILL-C_V1-en.txt, doc/CeCILL-C_V1-fr.txt, and
12C https://cecill.info/licences/Licence_CeCILL-C_V1-en.html)
13C
15!$ USE OMP_LIB, ONLY: OMP_LOCK_KIND
16 INTEGER, PARAMETER :: nb_lock_max = 18
17!$ INTEGER(OMP_LOCK_KIND),
18!$ &ALLOCATABLE, DIMENSION(:), SAVE :: LOCK_FOR_SCATTER
19 CONTAINS
20 SUBROUTINE dmumps_sol_l0omp_li( K400 )
21!$ USE OMP_LIB, ONLY: OMP_INIT_LOCK
22 IMPLICIT NONE
23 INTEGER, INTENT(IN) :: K400
24!$ INTEGER :: I
25!$ IF (K400 .GT. 0) THEN
26!$ ALLOCATE(LOCK_FOR_SCATTER(min(NB_LOCK_MAX,K400)))
27!$ DO I = 1, min(NB_LOCK_MAX,K400)
28!$ CALL OMP_INIT_LOCK(LOCK_FOR_SCATTER(I))
29!$ ENDDO
30!$ ENDIF
31 RETURN
32 END SUBROUTINE dmumps_sol_l0omp_li
33 SUBROUTINE dmumps_sol_l0omp_ld( K400 )
34!$ USE OMP_LIB, ONLY : OMP_DESTROY_LOCK
35 IMPLICIT NONE
36 INTEGER, INTENT(IN) :: K400
37!$ INTEGER :: I
38!$ IF (K400 .GT. 0) THEN
39!$ DO I = 1, min(NB_LOCK_MAX,K400)
40!$ CALL OMP_DESTROY_LOCK(LOCK_FOR_SCATTER(I))
41!$ ENDDO
42!$ DEALLOCATE(LOCK_FOR_SCATTER)
43!$ ENDIF
44 RETURN
45 END SUBROUTINE dmumps_sol_l0omp_ld
46 SUBROUTINE dmumps_sol_l0omp_r(N, MTYPE,
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,
50 & COMM, MYID,
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,
55 & FROM_PP,
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 )
62 USE dmumps_struc_def, ONLY : dmumps_l0ompfac_t
63!$ USE OMP_LIB
64 IMPLICIT NONE
65 INTEGER, INTENT( in ) :: N, MTYPE, 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 ),
75 & DAD( KEEP(28) )
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 ) :: RHS_BOUNDS(LRHS_BOUNDS)
89 LOGICAL, INTENT( in ) :: FROM_PP
90 INTEGER, INTENT( out ):: NBROOT_UNDER_L0
91 INTEGER, INTENT( in ) :: LPOOL_B_L0_OMP
92 INTEGER, INTENT( in ) :: IPOOL_B_L0_OMP
93 & ( lpool_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 ) :: LL0_OMP_MAPPING
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
113 INTEGER(8) :: LWCB_P
114 INTEGER(8) :: POSWCB_P, PLEFTWCB_P
115 INTEGER :: POSIWCB_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
123!$ INTEGER :: NOMP_SAVE
124 INTEGER :: NBFIN_DUMMY
125 nbfin_dummy = huge(nbfin_dummy)
126 nbroot_processed = 0
127 ptricb = 0
128 next_task_dyn = keep(400)+1
129!$OMP PARALLEL
130!$OMP& SHARED ( NEXT_TASK_DYN, IPOOL_B_L0_OMP,
131!$OMP& LPOOL_B_L0_OMP, NBFIN_DUMMY )
132!$OMP& PRIVATE ( THREAD_ID, IL0OMPFAC, VIRTUAL_TASK, PHYSICAL_TASK,
133!$omp& ipool_p, lpool_p, leaf_p,
134!$OMP& LIWCB_P, LWCB_P, IWCB_P, WCB_P,
135!$OMP& PLEFTWCB_P, POSWCB_P, POSIWCB_P,
136!$OMP& LASTFSSBTRSTA_P, LASTFSSBTRDYN_P,
137!$OMP& INODE, IROOT_SBTR, IFATH,
138!$OMP& IS_INODE_PROCESSED_P,
139!$OMP& INFO_P, ERROR_WAS_BROADCASTED_P, NOMP_SAVE, allocok )
140!$OMP& REDUCTION( + : NBROOT_PROCESSED )
141!$ nomp_save = omp_get_max_threads()
142 thread_id = 1
143!$ THREAD_ID = OMP_GET_THREAD_NUM() + 1
144!$OMP BARRIER
145!$ CALL omp_set_num_threads(1)
146 lpool_p = lpool_b_l0_omp
147 info_p(1:2) = 0
148 lwcb_p = int(keep(133),8)*int(nrhs,8)
149 liwcb_p = keep(133)
150 pleftwcb_p = 1_8
151 poswcb_p = lwcb_p
152 posiwcb_p = liwcb_p
153 ALLOCATE(ipool_p(lpool_p), iwcb_p(liwcb_p), wcb_p( lwcb_p),
154 & stat=allocok)
155 IF ( allocok > 0 ) THEN
156 info_p(1) = -13
157 CALL mumps_seti8toi4(lpool_p + liwcb_p + lwcb_p,
158 & info(2))
159!$OMP CRITICAL(critical_info)
160 info(1) = -13
161 info(2) = info_p(2)
162!$OMP END CRITICAL(critical_info)
163 ENDIF
164!$OMP BARRIER
165 IF (info(1) .LT. 0) THEN
166 GOTO 50
167 ENDIF
168 virtual_task = thread_id
169 600 CONTINUE
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
173 leaf_p = 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)
178 leaf_p = leaf_p + 1
179 ENDIF
180 ENDDO
181 IF ( leaf_p .EQ. 1 ) THEN
182 WRITE(*,*) " Internal error 1 in DMUMPS_SOL_L0OMP_R",
183 & leaf_p
184 ENDIF
185 iroot_sbtr = phys_l0_omp( perm_l0_omp( physical_task ))
186 IF (do_prun) THEN
187 IF (.NOT. to_process(step(iroot_sbtr))) THEN
188 cycle
189 ENDIF
190 ENDIF
191 inode = iroot_sbtr
192 DO WHILE (inode .GT. 0)
193 lastfssbtrsta_p = inode
194 inode=fils(inode)
195 ENDDO
196 CALL mumps_compute_lastfs_dyn( iroot_sbtr, lastfssbtrdyn_p,
197 & mtype, keep, iw, liw, n, step, ptrist, fils, frere )
198 DO WHILE (leaf_p .NE.1 .AND. info_p(1) .GE. 0)
199 leaf_p = leaf_p - 1
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
204 ENDIF
205 IF (do_prun) THEN
206 is_inode_processed_p = to_process(step(inode))
207 ELSE
208 is_inode_processed_p = .true.
209 ENDIF
210 IF ( is_inode_processed_p ) THEN
211 CALL dmumps_solve_node_fwd( inode,
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,
218 & iw, liw,
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
228!$OMP CRITICAL(critical_info)
229 info(1) = info_p(1)
230 info(2) = info_p(2)
231!$OMP END CRITICAL(critical_info)
232 ENDIF
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
237 ENDIF
238 ENDIF
239 IF ( ifath .EQ. 0 ) THEN
240 IF ( is_inode_processed_p ) THEN
241 nbroot_processed = nbroot_processed + 1
242 ENDIF
243 ELSE
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
249 ENDIF
250 IF (nstk(step(ifath)) .EQ. 0 .OR.
251 & nstk(step(ifath)) .EQ. -1 ) THEN
252 ipool_p( leaf_p ) = ifath
253 leaf_p = leaf_p + 1
254 IF (do_prun) THEN
255 nstk(step(ifath)) = huge(nstk(step(ifath)))
256 ENDIF
257 ENDIF
258 ELSE
259 IF ( is_inode_processed_p ) THEN
260!$OMP ATOMIC UPDATE
261 nstk(step(ifath)) = nstk(step(ifath)) - 1
262!$OMP END ATOMIC
263 ENDIF
264 ENDIF
265 ENDIF
266 ENDIF
267 ENDDO
268 ENDDO
269!$OMP ATOMIC CAPTURE
270 virtual_task = next_task_dyn
271 next_task_dyn = next_task_dyn + 1
272!$OMP END ATOMIC
273 GOTO 600
274 ENDIF
275 50 CONTINUE
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)
280!$ CALL omp_set_num_threads(int(NOMP_SAVE,4))
281#else
282!$ CALL omp_set_num_threads(NOMP_SAVE)
283#endif
284!$OMP END PARALLEL
285 nbroot_under_l0 = nbroot_processed
286 RETURN
287 END SUBROUTINE dmumps_sol_l0omp_r
288 SUBROUTINE dmumps_sol_l0omp_s(N, MTYPE, NRHS, LIW, IW,
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 )
299 USE dmumps_struc_def, ONLY : dmumps_l0ompfac_t
300 USE omp_lib
301 IMPLICIT NONE
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
352 INTEGER(8) :: LWCB_P
353 INTEGER(8) :: POSWCB_P, PLEFTWCB_P
354 INTEGER :: POSIWCB_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
359 INTEGER :: INODE
360 INTEGER :: NEXT_TASK_DYN
361!$ INTEGER :: NOMP_SAVE
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 '
369 info(1)=-13
370 info(2)=slavef
371 GOTO 100
372 endif
373 ptricb = 0
374 next_task_dyn = keep(400)+1
375!$OMP PARALLEL
376!$OMP& SHARED ( NEXT_TASK_DYN, LPOOL_B_L0_OMP,
377!$omp& nbfin_dummy, deja_send_dummy )
378!$OMP& PRIVATE ( THREAD_ID, IL0OMPFAC, VIRTUAL_TASK, PHYSICAL_TASK,
379!$OMP& IPOOL_P, LPOOL_P, IIPOOL_P, MYLEAF_LEFT_HUGE_P,
380!$OMP& LIWCB_P, LWCB_P, IWCB_P, WCB_P, W2_P, LPANEL_POS_P,
381!$OMP& PANEL_POS_P,
382!$OMP& PLEFTWCB_P, POSWCB_P, POSIWCB_P,
383!$OMP& INODE,
384!$OMP& INFO_P, DO_MCAST2_TERMBWD_P,
385!$OMP& ERROR_WAS_BROADCASTED_P, NOMP_SAVE, allocok )
386!$ NOMP_SAVE = omp_get_max_threads()
387 thread_id = 1
388!$ thread_id = omp_get_thread_num() + 1
389!$OMP BARRIER
390!$ CALL omp_set_num_threads(1)
391 lpool_p = lpool_b_l0_omp
392 info_p(1:2) = 0
393 lwcb_p = int(keep(133),8)*int(nrhs,8)
394 liwcb_p = keep(133)
395 pleftwcb_p = 1_8
396 poswcb_p = lwcb_p
397 posiwcb_p = liwcb_p
398 IF (keep(201).EQ.1) THEN
399 lpanel_pos_p = keep(228)+1
400 CALL mumps_abort()
401 ELSE
402 lpanel_pos_p = 1
403 ENDIF
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
407 info_p(1) = -13
408 CALL mumps_seti8toi4(lpool_p + liwcb_p + lwcb_p +
409 & keep(133)+lpanel_pos_p, info(2))
410!$OMP CRITICAL(critical_info)
411 info(1) = -13
412 info(2) = info_p(2)
413!$omp END CRITICAL(critical_info)
414 ENDIF
415!$OMP BARRIER
416 IF (info(1) .LT. 0) THEN
417 GOTO 50
418 ENDIF
419 virtual_task = thread_id
420 600 CONTINUE
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 ) )
425 ipool_p(1) = inode
426 iipool_p = 2
427 myleaf_left_huge_p = huge(myleaf_left_huge_p)
428 IF ( prun_below_bwd ) THEN
429 IF ( .NOT. to_process(step(inode)) ) THEN
430 cycle
431 ENDIF
432 ENDIF
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
438 ENDIF
439 CALL dmumps_solve_node_bwd( inode, n, ipool_p, lpool_p,
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,
446 & procnode_steps,
447 & deja_send_dummy,
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
455 & )
456 IF (info_p(1) .LT. 0) THEN
457!$OMP CRITICAL(critical_info)
458 info(1) = info_p(1)
459 info(2) = info_p(2)
460!$OMP END CRITICAL(critical_info)
461 ENDIF
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
466 ENDIF
467 IF (do_mcast2_termbwd_p) THEN
468 WRITE(*,*) " Internal error 2 in DMUMPS_SOL_L0OMP_R",
469 & do_mcast2_termbwd_p
470 ENDIF
471 ENDDO
472 ENDDO
473!$OMP ATOMIC CAPTURE
474 virtual_task = next_task_dyn
475 next_task_dyn = next_task_dyn + 1
476!$OMP END ATOMIC
477 GOTO 600
478 ENDIF
479 50 CONTINUE
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)
486!$ CALL omp_set_num_threads(int(NOMP_SAVE,4))
487#else
488!$ CALL omp_set_num_threads(NOMP_SAVE)
489#endif
490!$OMP END PARALLEL
491 100 CONTINUE
492 IF (allocated(deja_send_dummy)) DEALLOCATE(deja_send_dummy)
493 RETURN
494 END SUBROUTINE dmumps_sol_l0omp_s
495 END MODULE dmumps_sol_l0omp_m
#define mumps_abort
Definition VE_Metis.h:25
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)
#define max(a, b)
Definition macros.h:21
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)
Definition dsol_omp_m.F:299
subroutine dmumps_sol_l0omp_li(k400)
Definition dsol_omp_m.F:21
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)
Definition dsol_omp_m.F:62
subroutine dmumps_sol_l0omp_ld(k400)
Definition dsol_omp_m.F:34
integer, parameter nb_lock_max
Definition dsol_omp_m.F:16
subroutine mumps_compute_lastfs_dyn(inode, lastfssbtr_dyn, mtype, keep, iw, liw, n, step, ptrist, fils, frere)
Definition sol_common.F:163
subroutine mumps_seti8toi4(i8, i)