OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
sfac_mem_stack.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
14 SUBROUTINE smumps_fac_stack(COMM_LOAD, ASS_IRECV,
15 & N, INODE, TYPE, TYPEF,
16 & LA, IW, LIW, A,
17 & IFLAG, IERROR, OPELIW, NELVAW, NMAXNPIV,
18 & PTRIST, PTLUST_S,
19 & PTRFAC, PTRAST,
20 & STEP, PIMASTER, PAMASTER, NE,
21 & POSFAC, LRLU, LRLUS, LRLUSM, IPTRLU, ICNTL, KEEP,KEEP8,DKEEP,
22 & COMP, IWPOS, IWPOSCB, PROCNODE_STEPS, SLAVEF,
23 & FPERE, COMM, MYID, IPOOL, LPOOL, LEAF, NSTK_S,
24 & PERM, BUFR, LBUFR, LBUFR_BYTES, NBFIN, root,
25 & OPASSW, ITLOC, RHS_MUMPS,
26 & FILS, DAD, PTRARW, PTRAIW, INTARR, DBLARR,
27 & ND, FRERE, LPTRAR, NELT, FRTPTR, FRTELT,
28 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
29 & , LRGROUPS
30 & , FLOP_ESTIM_ACC
31 & )
32 USE smumps_buf
33 USE smumps_load
34 USE smumps_struc_def, ONLY : smumps_root_struc
35 IMPLICIT NONE
36 TYPE (SMUMPS_ROOT_STRUC) :: root
37 INTEGER COMM_LOAD, ASS_IRECV
38 INTEGER COMM, MYID, TYPE, TYPEF
39 INTEGER N, LIW, INODE,IFLAG,IERROR
40 INTEGER ICNTL(60), KEEP(500)
41 REAL DKEEP(230)
42 INTEGER(8) KEEP8(150)
43 INTEGER(8) :: LA, POSFAC, LRLU, LRLUS, LRLUSM, IPTRLU
44 INTEGER IWPOSCB, IWPOS,
45 & FPERE, SLAVEF, NELVAW, NMAXNPIV
46 INTEGER IW(LIW),PROCNODE_STEPS(KEEP(28))
47 INTEGER(8) :: PTRAST (KEEP(28))
48 INTEGER(8) :: PTRFAC (KEEP(28))
49 INTEGER(8) :: PAMASTER(KEEP(28))
50 INTEGER PTRIST(KEEP(28)), PTLUST_S(KEEP(28))
51 INTEGER STEP(N), PIMASTER(KEEP(28)), NE(KEEP(28))
52 REAL A(LA)
53 INTEGER, intent(in) :: LRGROUPS(N)
54 DOUBLE PRECISION OPASSW, OPELIW
55 REAL DBLARR(KEEP8(26))
56 INTEGER INTARR(KEEP8(27))
57 INTEGER ITLOC( N + KEEP(253) ), FILS( N ), DAD( KEEP(28) ),
58 & nd( keep(28) ), frere( keep(28) )
59 REAL :: RHS_MUMPS(KEEP(255))
60 INTEGER ISTEP_TO_INIV2(KEEP(71)),
61 & tab_pos_in_pere(slavef+2,max(1,keep(56)))
62 INTEGER NELT, LPTRAR
63 INTEGER FRTPTR( N+1 ), FRTELT( NELT )
64 INTEGER(8), INTENT(IN) :: PTRAIW( LPTRAR ), PTRARW( LPTRAR )
65 INTEGER LPOOL, LEAF, COMP
66 INTEGER IPOOL( LPOOL )
67 INTEGER NSTK_S( KEEP(28) )
68 INTEGER PERM(N)
69 INTEGER LBUFR, LBUFR_BYTES
70 INTEGER BUFR( LBUFR )
71 INTEGER NBFIN
72 INTEGER NFRONT_ESTIM,NELIM_ESTIM
73 DOUBLE PRECISION FLOP_ESTIM_ACC
74 INTEGER MUMPS_PROCNODE
75 EXTERNAL MUMPS_PROCNODE
76 include 'mpif.h'
77 include 'mumps_tags.h'
78 INTEGER :: STATUS(MPI_STATUS_SIZE)
79 INTEGER LP
80 INTEGER NBROWS_ALREADY_SENT
81 INTEGER(8) :: POSELT, OPSFAC
82 INTEGER(8) :: IOLD, INEW, FACTOR_POS
83 INTEGER NSLAVES, NCB,
84 & h_inode, ierr, nbcol, nbrow, nbrow_send,
85 & nelim
86 INTEGER NBROW_STACK, NBROW_INDICES, NBCOL_STACK
87 INTEGER NCBROW_ALREADY_MOVED, NCBROW_PREVIOUSLY_MOVED,
88 &ncbrow_newly_moved
89 INTEGER(8) :: LAST_ALLOWED_POS
90 INTEGER(8) :: LREQCB, MIN_SPACE_IN_PLACE
91 INTEGER(8) :: SHIFT_VAL_SON
92 INTEGER SHIFT_LIST_ROW_SON,
93 & shift_list_col_son,
94 & list_row_son, list_col_son, list_slaves
95 INTEGER IOLDPS,NFRONT,NPIV,NASS,IOLDP1,PTROWEND,
96 & lreqi, lcont
97 INTEGER I,LDA, INIV2
98 INTEGER MSGDEST, MSGTAG, CHK_LOAD
99 include 'mumps_headers.h'
100 LOGICAL MUST_COMPACT_FACTORS
101 LOGICAL PACKED_CB, COMPRESS_PANEL, COMPRESS_CB, LR_SOLVE
102 LOGICAL INPLACE
103 INTEGER(8) :: SIZE_INPLACE, FAC_ENTRIES, COUNT_EXTRA_IP_COPIES
104 INTEGER INTSIZ
105 DOUBLE PRECISION FLOP1, FLOP1_EFFECTIVE
106 LOGICAL BLOCKING, SET_IRECV, MESSAGE_RECEIVED
107 LOGICAL SSARBR, SSARBR_ROOT, MUMPS_INSSARBR,
109 EXTERNAL mumps_inssarbr, mumps_in_or_root_ssarbr,
111 lp = icntl(1)
112 IF (icntl(4) .LE. 0) lp = -1
113 inplace = .false.
114 min_space_in_place = 0_8
115 ioldps = ptlust_s(step(inode))
116 intsiz = iw(ioldps+xxi)
117 nfront = iw(ioldps+keep(ixsz))
118 npiv = iw(ioldps + 1+keep(ixsz))
119 nmaxnpiv = max(npiv, nmaxnpiv)
120 nass = iabs(iw(ioldps + 2+keep(ixsz)))
121 nslaves= iw(ioldps+5+keep(ixsz))
122 h_inode= 6 + nslaves + keep(ixsz)
123 lcont = nfront - npiv
124 nbcol = lcont
125 ssarbr = mumps_inssarbr(procnode_steps(step(inode)),keep(199))
126 ssarbr_root = mumps_in_or_root_ssarbr
127 & (procnode_steps(step(inode)),keep(199))
128 lreqcb = 0_8
129 inplace = .false.
130 packed_cb = ((keep(215).EQ.0)
131 & .AND.(keep(50).NE.0)
132 & .AND.(typef.EQ.1
133 & .OR.typef.EQ.2
134 & )
135 & .AND.(type.EQ.1))
136 compress_panel = (iw(ioldps+xxlr).GE.2)
137 compress_cb = (iw(ioldps+xxlr).EQ.1.OR.iw(ioldps+xxlr).EQ.3)
138 lr_solve = (keep(486).EQ.2)
139 must_compact_factors = .true.
140 IF (keep(201).EQ.1 .OR. keep(201).EQ.-1
141 & .OR. (compress_panel.AND.lr_solve)
142 & ) THEN
143 must_compact_factors = .false.
144 ENDIF
145 IF ((fpere.EQ.0).AND.(nass.NE.npiv)) THEN
146 iflag = -10
147 GOTO 600
148 ENDIF
149 nbrow = lcont
150 IF (type.EQ.2) nbrow = nass - npiv
151 IF ((keep(50).NE.0).AND.(type.EQ.2)) THEN
152 lda = nass
153 ELSE
154 lda = nfront
155 ENDIF
156 nbrow_send = nbrow
157 nelim = nass-npiv
158 IF (typef.EQ.2) nbrow_send = nelim
159 poselt = ptrast(step(inode))
160 IF (poselt .ne. ptrfac(step(inode))) THEN
161 WRITE(*,*) myid,":Error 1 in SMUMPS_FAC_STACK:"
162 WRITE(*,*) "INODE, PTRAST, PTRFAC =",
163 & inode, ptrast(step(inode)), ptrfac(step(inode))
164 WRITE(*,*) "PACKED_CB, NFRONT, NPIV, NASS, NSLAVES",
165 & packed_cb, nfront, npiv, nass, nslaves
166 WRITE(*,*) "TYPE, TYPEF, FPERE ",
167 & TYPE, typef, fpere
168 CALL mumps_abort()
169 END IF
170 nelvaw = nelvaw + nass - npiv
171 IF (keep(50) .eq. 0) THEN
172 fac_entries = int(npiv,8) * int(nfront,8)
173 ELSE
174 fac_entries = ( int(npiv,8)*int(npiv+1,8) )/ 2_8
175 ENDIF
176 fac_entries = fac_entries + int(nbrow,8) * int(npiv,8)
177 IF ( keep(405) .EQ. 0 ) THEN
178 keep8(10) = keep8(10) + fac_entries
179 keep(429) = keep(429) - 1
180 ELSE
181!$OMP ATOMIC UPDATE
182 keep8(10) = keep8(10) + fac_entries
183!$omp END atomic
184 ENDIF
185 CALL mumps_get_flops_cost( nfront, npiv, nass,
186 & keep(50), TYPE,flop1 )
187 IF ( (.NOT. ssarbr_root) .and. TYPE == 1) then
188 IF (ne(step(inode))==0) THEN
189 chk_load=0
190 ELSE
191 chk_load=1
192 ENDIF
193 CALL smumps_load_update(chk_load, .false., -flop1,
194 & keep,keep8)
195 ENDIF
196 flop1_effective = flop1
197 opeliw = opeliw + flop1
198 IF ( npiv .NE. nass ) THEN
199 CALL mumps_get_flops_cost( nfront, nass, nass,
200 & keep(50), TYPE,flop1 )
201 IF (.NOT. ssarbr_root ) THEN
202 IF (ne(step(inode))==0) THEN
203 chk_load=0
204 ELSE
205 chk_load=1
206 ENDIF
207 CALL smumps_load_update(chk_load, .false.,
208 & flop1_effective-flop1,
209 & keep,keep8)
210 ENDIF
211 END IF
212 IF ( ssarbr_root ) THEN
213 nfront_estim=nd(step(inode)) + keep(253)
214 nelim_estim=nass-(nfront-nfront_estim)
215 CALL mumps_get_flops_cost(nfront_estim,nelim_estim,nelim_estim,
216 & keep(50),1,flop1)
217 END IF
218 flop1=-flop1
219 IF (keep(400).GT.0) THEN
220 flop_estim_acc = flop_estim_acc + flop1
221 ENDIF
222 IF (ssarbr_root) THEN
223 CALL smumps_load_update(0,.false.,flop1,keep,keep8)
224 ELSE
225 CALL smumps_load_update(2,.false.,flop1,keep,keep8)
226 ENDIF
227 IF ( fpere .EQ. 0 ) THEN
228 IF ( keep(253) .NE. 0 .AND. keep(201).NE.-1
229 & .AND. keep(201).NE.1
230 & .AND. (.NOT.compress_panel.OR..NOT.lr_solve)
231 & ) THEN
232 must_compact_factors = .true.
233 GOTO 190
234 ELSE IF ( keep(50) .NE. 0 .AND. keep(459).GT.1) THEN
235 must_compact_factors = .true.
236 GOTO 190
237 ELSE
238 must_compact_factors = .false.
239 GOTO 190
240 ENDIF
241 ENDIF
242 IF ( fpere.EQ.keep(38) ) THEN
243 ncb = nfront - nass
244 shift_list_row_son = h_inode + nass
245 shift_list_col_son = h_inode + nfront + nass
246 shift_val_son = int(nass,8)*int(nfront+1,8)
247 IF (type.EQ.1) THEN
249 & comm_load, ass_irecv,
250 & n, inode, fpere,
251 & ptlust_s, ptrast,
252 & root, ncb, ncb, shift_list_row_son,
253 & shift_list_col_son , shift_val_son, nfront,
254 & root_cont_static, myid, comm,
255 &
256 & bufr, lbufr, lbufr_bytes, procnode_steps, posfac,
257 & iwpos, iwposcb, iptrlu, lrlu, lrlus, iw, liw, a, la,
258 & ptrist, ptlust_s, ptrfac,
259 & ptrast, step, pimaster, pamaster,
260 & nstk_s, comp, iflag, ierror, perm,
261 & ipool, lpool, leaf, nbfin, slavef,
262 & opassw, opeliw, itloc, rhs_mumps, fils, dad, ptrarw, ptraiw,
263 & intarr,dblarr,icntl,keep,keep8,dkeep,.false., nd, frere,
264 & lptrar, nelt, frtptr, frtelt,
265 & istep_to_iniv2, tab_pos_in_pere
266 & , lrgroups
267 & )
268 IF (iflag < 0 ) GOTO 500
269 ENDIF
270 msgdest= mumps_procnode(procnode_steps(step(fpere)),keep(199))
271 ioldps = ptlust_s(step(inode))
272 list_row_son = ioldps + h_inode + npiv
273 list_col_son = ioldps + h_inode + nfront + npiv
274 list_slaves = ioldps + 6 + keep(ixsz)
275 IF (msgdest.EQ.myid) THEN
276 CALL smumps_process_rtnelind( root,
277 & inode, nelim, nslaves, iw(list_row_son),
278 & iw(list_col_son), iw(list_slaves),
279 &
280 & procnode_steps, iwpos, iwposcb, iptrlu,
281 & lrlu, lrlus, n, iw, liw, a, la, ptrist,
282 & ptlust_s, ptrfac,
283 & ptrast, step, pimaster, pamaster, nstk_s,
284 & itloc, rhs_mumps, comp,
285 & iflag, ierror,
286 & ipool, lpool, leaf, myid, slavef,
287 & keep, keep8, dkeep,
288 & comm, comm_load, fils, dad, nd)
289 IF (iflag.LT.0) GOTO 600
290 ELSE
291 ierr = -1
292 DO WHILE (ierr.EQ.-1)
293 CALL smumps_buf_send_rtnelind( inode, nelim,
294 & iw(list_row_son), iw(list_col_son), nslaves,
295 & iw(list_slaves), msgdest, comm, keep, ierr)
296 IF ( ierr .EQ. -1 ) THEN
297 blocking =.false.
298 set_irecv =.true.
299 message_received = .false.
300 CALL smumps_try_recvtreat( comm_load, ass_irecv,
301 & blocking, set_irecv, message_received,
302 & mpi_any_source, mpi_any_tag, status,
303 & bufr, lbufr, lbufr_bytes, procnode_steps, posfac,
304 & iwpos, iwposcb, iptrlu,
305 & lrlu, lrlus, n, iw, liw, a, la, ptrist, ptlust_s, ptrfac,
306 & ptrast, step, pimaster, pamaster, nstk_s, comp,
307 & iflag, ierror, comm, perm,
308 & ipool, lpool, leaf, nbfin, myid, slavef,
309 & root, opassw, opeliw, itloc, rhs_mumps,
310 & fils, dad, ptrarw, ptraiw,
311 & intarr, dblarr, icntl, keep,keep8,dkeep,
312 & nd, frere, lptrar, nelt,
313 & frtptr, frtelt,
314 & istep_to_iniv2, tab_pos_in_pere,
315 & .true., lrgroups
316 & )
317 IF ( iflag .LT. 0 ) GOTO 500
318 ioldps = ptlust_s(step(inode))
319 list_row_son = ioldps + h_inode + npiv
320 list_col_son = ioldps + h_inode + nfront + npiv
321 list_slaves = ioldps + 6 + keep(ixsz)
322 ENDIF
323 ENDDO
324 IF ( ierr .EQ. -2 ) THEN
325 ierror = ( 3 + nslaves + 2 * nelim ) * keep( 34 )
326 iflag = - 17
327 GOTO 600
328 ELSE IF ( ierr .EQ. -3 ) THEN
329 ierror = ( 3 + nslaves + 2 * nelim ) * keep( 34 )
330 iflag = -20
331 GOTO 600
332 ENDIF
333 ENDIF
334 IF (nelim.EQ.0) THEN
335 poselt = ptrast(step(inode))
336 opsfac = poselt + int(npiv,8) * int(nfront,8) + int(npiv,8)
337 GOTO 190
338 ELSE
339 GOTO 500
340 ENDIF
341 ENDIF
342 opsfac = poselt + int(npiv,8) * int(lda,8) + int(npiv,8)
343 IF ( mumps_procnode(procnode_steps(step(fpere)),
344 & keep(199)) .NE. myid ) THEN
345 msgtag =noeud
346 msgdest=mumps_procnode( procnode_steps(step(fpere)), keep(199) )
347 ierr = -1
348 nbrows_already_sent = 0
349 DO WHILE (ierr.EQ.-1)
350 IF ( (type.EQ.1) .AND. (typef.EQ.1) ) THEN
351 CALL smumps_buf_send_cb( nbrows_already_sent,
352 & inode, fpere, nfront,
353 & lcont, nass, npiv, iw( ioldps + h_inode + npiv ),
354 & iw( ioldps + h_inode + npiv + nfront ),
355 & a( opsfac ), packed_cb,
356 & msgdest, msgtag, comm, keep, ierr )
357 ELSE
358 IF ( type.EQ.2 ) THEN
359 iniv2 = istep_to_iniv2( step(inode) )
360 ELSE
361 iniv2 = -9999
362 ENDIF
363 CALL smumps_buf_send_maitre2( nbrows_already_sent,
364 & fpere, inode,
365 & nbrow_send, iw(ioldps + h_inode + npiv ),
366 & nbcol, iw(ioldps + h_inode + npiv + nfront ),
367 & a(opsfac), lda, nelim, TYPE,
368 & nslaves, iw(ioldps+6+keep(ixsz)), msgdest,
369 & comm, ierr,
370 &
371 & slavef, keep,keep8, iniv2, tab_pos_in_pere )
372 END IF
373 IF ( ierr .EQ. -1 ) THEN
374 blocking = .false.
375 set_irecv = .true.
376 message_received = .false.
377 CALL smumps_try_recvtreat( comm_load, ass_irecv,
378 & blocking, set_irecv, message_received,
379 & mpi_any_source, mpi_any_tag,
380 & status,
381 & bufr, lbufr, lbufr_bytes, procnode_steps, posfac,
382 & iwpos, iwposcb, iptrlu,
383 & lrlu, lrlus, n, iw, liw, a, la,
384 & ptrist, ptlust_s, ptrfac,
385 & ptrast, step, pimaster, pamaster, nstk_s, comp,
386 & iflag, ierror, comm,
387 & perm, ipool, lpool, leaf,
388 & nbfin, myid, slavef,
389 &
390 & root, opassw, opeliw, itloc, rhs_mumps,
391 & fils, dad, ptrarw, ptraiw,
392 & intarr, dblarr, icntl, keep,keep8,dkeep, nd, frere,
393 & lptrar, nelt, frtptr, frtelt,
394 & istep_to_iniv2, tab_pos_in_pere, .true.
395 & , lrgroups )
396 IF ( iflag .LT. 0 ) GOTO 500
397 ENDIF
398 ioldps = ptlust_s(step( inode ))
399 opsfac = poselt + int(npiv,8) * int(lda,8) + int(npiv,8)
400 END DO
401 IF ( ierr .EQ. -2 .OR. ierr .EQ. -3 ) THEN
402 IF ( (type.EQ.1) .AND. (typef.EQ.1) ) THEN
403 ierror = ( 2*lcont + 9 ) * keep( 34 ) +
404 & lcont*lcont * keep( 35 )
405 ELSE IF (keep(50).ne.0 .AND. TYPE .eq. 2 ) then
406 ierror = ( nbrow_send + nbcol+ 5 + nslaves)
407 & * keep( 34 ) +
408 & nbrow_send*nbrow_send*keep( 35 )
409 ELSE
410 ierror = ( nbrow_send + nbcol+ 5 + nslaves) * keep( 34 ) +
411 & nbrow_send*nbcol*keep( 35 )
412 ENDIF
413 IF (ierr .EQ. -2) THEN
414 iflag = -17
415 IF ( lp > 0 ) THEN
416 WRITE(lp, *) myid,
417 & ": FAILURE, SEND BUFFER TOO SMALL DURING
418 & SMUMPS_FAC_STACK", TYPE, typef
419 ENDIF
420 ENDIF
421 IF (ierr .EQ. -3) THEN
422 iflag = -20
423 IF ( lp > 0 ) THEN
424 WRITE(lp, *) myid,
425 & ": FAILURE, RECV BUFFER TOO SMALL DURING
426 & SMUMPS_FAC_STACK", TYPE, typef
427 ENDIF
428 ENDIF
429 GOTO 600
430 ENDIF
431 ENDIF
432 IF ( mumps_procnode(procnode_steps(step(fpere)),
433 & keep(199)) .EQ. myid ) THEN
434 nbrow_send = 0
435 lreqi = 2 + keep(ixsz)
436 nbrow_stack = nbrow
437 nbrow_indices = nbrow
438 IF ((keep(50).NE.0).AND.(type.EQ.2)) THEN
439 nbcol_stack = nelim
440 ELSE
441 nbcol_stack = nbcol
442 ENDIF
443 IF (compress_cb) THEN
444 nbrow_stack=nelim
445 IF (keep(50).NE.0) nbcol_stack = nelim
446 ENDIF
447 ELSE
448 nbrow_stack = nbrow-nbrow_send
449 nbrow_indices = nbrow-nbrow_send
450 nbcol_stack = nbcol
451 IF (compress_cb) THEN
452 nbrow_stack = 0
453 nbcol_stack = 0
454 ENDIF
455 lreqi = 6 + nbrow_indices + nbcol + keep(ixsz)
456 IF (.NOT. (type.EQ.1 .AND. typef.EQ.2 ) ) GOTO 190
457 IF (fpere.EQ.0) GOTO 190
458 ENDIF
459 IF (packed_cb) THEN
460 IF (nbrow_stack.EQ.0.OR.nbcol_stack.EQ.0) THEN
461 lreqcb = 0
462 ELSE
463 lreqcb = ( int(nbcol_stack,8) * int( nbcol_stack + 1, 8) ) / 2_8
464 & - ( int(nbrow_send ,8) * int( nbrow_send + 1, 8) ) / 2_8
465 ENDIF
466 ELSE
467 lreqcb = int(nbrow_stack,8) * int(nbcol_stack,8)
468 ENDIF
469 inplace = ( keep(234).NE.0 )
470 IF (keep(50).NE.0 .AND. TYPE .EQ. 2) inplace = .false.
471 inplace = inplace .OR. .NOT. must_compact_factors
472 inplace = inplace .AND.
473 & ( ptlust_s(step(inode)) + intsiz .EQ. iwpos )
474 min_space_in_place = 0_8
475 IF ( inplace .AND. keep(50).eq. 0 .AND.
476 & must_compact_factors) THEN
477 min_space_in_place = int(nbcol_stack,8)
478 ENDIF
479 IF ( min_space_in_place .GT. lreqcb ) THEN
480 inplace = .false.
481 ENDIF
482 CALL smumps_alloc_cb( inplace, min_space_in_place,
483 & ssarbr, .false.,
484 & myid,n,keep,keep8,dkeep,iw, liw, a, la,
485 & lrlu, iptrlu,iwpos,iwposcb, slavef, procnode_steps, dad,
486 & ptrist,ptrast,step, pimaster,pamaster,
487 & lreqi, lreqcb, inode, s_notfree, .true.,
488 & comp, lrlus, lrlusm, iflag, ierror )
489 IF (iflag.LT.0) GOTO 600
490 iw(iwposcb+1+xxf) = iw(ioldps+xxf)
491 iw(iwposcb+1+xxlr) = iw(ioldps+xxlr)
492 ptrist(step(inode)) = iwposcb+1
493 IF ( mumps_procnode(procnode_steps(step(fpere)),
494 & keep(199)) .EQ. myid ) THEN
495 pimaster(step(inode)) = ptlust_s(step(inode))
496 pamaster(step(inode)) = iptrlu + 1_8
497 ptrast(step(inode)) = -99999999_8
498 iw(iwposcb+1+keep(ixsz)) = min(-nbcol_stack,-1)
499 iw(iwposcb+2+keep(ixsz)) = nbrow_stack
500 IF (packed_cb) iw(iwposcb+1+xxs) = s_cb1comp
501 ELSE
502 ptrast(step(inode)) = iptrlu+1_8
503 IF (packed_cb) iw(iwposcb+1+xxs)=s_cb1comp
504 iw(iwposcb+1+keep(ixsz)) = nbcol
505 iw(iwposcb+2+keep(ixsz)) = 0
506 iw(iwposcb+3+keep(ixsz)) = nbrow_stack
507 iw(iwposcb+4+keep(ixsz)) = 0
508 iw(iwposcb+5+keep(ixsz)) = 1
509 iw(iwposcb+6+keep(ixsz)) = 0
510 ioldp1 = ptlust_s(step(inode))+h_inode
511 ptrowend = iwposcb+6+nbrow_stack+keep(ixsz)
512 DO i = 1, nbrow_stack
513 iw(iwposcb+7+keep(ixsz)+i-1) =
514 & iw(ioldp1+nfront-nbrow_stack+i-1)
515 ENDDO
516 DO i = 1, nbcol
517 iw(ptrowend+i)=iw(ioldp1+nfront+npiv+i-1)
518 ENDDO
519 END IF
520 IF ( keep(50).NE.0 .AND. TYPE .EQ. 1
521 & .AND. must_compact_factors ) THEN
522 poselt = ptrfac(step(inode))
523 CALL smumps_compact_factors( a(poselt), lda,
524 & npiv, nbrow, keep,
525 & int(lda,8)*int(nbrow+npiv,8),
526 & iw( ptlust_s(step(inode)) + h_inode + nfront ) )
527 must_compact_factors = .false.
528 ENDIF
529 IF (compress_cb.AND.(lreqcb.EQ.0)) GOTO 190
530 IF ( keep(50).EQ.0 .AND. must_compact_factors )
531 & THEN
532 last_allowed_pos = poselt + int(lda,8)*int(npiv+nbrow-1,8)
533 & + int(npiv,8)
534 ELSE
535 last_allowed_pos = -1_8
536 ENDIF
537 ncbrow_already_moved = 0
538 count_extra_ip_copies = 0_8
539 10 CONTINUE
540 ncbrow_previously_moved = ncbrow_already_moved
541 IF (iptrlu .LT. posfac ) THEN
542 CALL smumps_copy_cb_right_to_left( a, la, lda,
543 & poselt, iptrlu, npiv, nbcol_stack, nbrow_stack,
544 & nbrow_send, lreqcb, keep, packed_cb,
545 & last_allowed_pos, ncbrow_already_moved )
546 ELSE
547 CALL smumps_copy_cb_left_to_right( a, la, lda,
548 & poselt, iptrlu, npiv, nbcol_stack, nbrow_stack,
549 & nbrow_send, lreqcb, keep, packed_cb )
550 ncbrow_already_moved = nbrow_stack
551 ENDIF
552 IF (last_allowed_pos .NE. -1_8) THEN
553 must_compact_factors =.false.
554 IF ( ncbrow_already_moved .EQ. nbrow_stack ) THEN
555 IF (compress_cb) THEN
556 ncbrow_already_moved = nbrow
557 ELSE
558 ncbrow_already_moved = ncbrow_already_moved + nbrow_send
559 ENDIF
560 ENDIF
561 ncbrow_newly_moved = ncbrow_already_moved
562 & - ncbrow_previously_moved
563 factor_pos = poselt +
564 & int(lda,8)*int(npiv+nbrow-ncbrow_already_moved,8)
565 CALL smumps_compact_factors_unsym( a(factor_pos), lda, npiv,
566 & ncbrow_newly_moved,
567 & int(ncbrow_newly_moved,8) * int(lda,8) )
568 inew = factor_pos + int(npiv,8) * int(ncbrow_newly_moved,8)
569 iold = inew + int(ncbrow_newly_moved,8) * int(nbcol_stack,8)
570 DO i = 1, ncbrow_previously_moved*npiv
571 a(inew) = a(iold)
572 iold = iold + 1_8
573 inew = inew + 1_8
574 ENDDO
575 count_extra_ip_copies = count_extra_ip_copies +
576 & int(ncbrow_previously_moved,8)
577 & * int(npiv,8)
578 last_allowed_pos = inew
579 IF (ncbrow_already_moved.LT.nbrow_stack) THEN
580 GOTO 10
581 ENDIF
582 ENDIF
583 IF ( count_extra_ip_copies .GT. 0_8 ) THEN
584!$OMP ATOMIC UPDATE
585 keep8(8) = keep8(8) + count_extra_ip_copies
586!$OMP END ATOMIC
587 count_extra_ip_copies = 0_8
588 ENDIF
589 190 CONTINUE
590 IF (must_compact_factors) THEN
591 poselt = ptrfac(step(inode))
592 CALL smumps_compact_factors( a(poselt), lda,
593 & npiv, nbrow, keep,
594 & int(lda,8)*int(nbrow+npiv,8),
595 & iw( ptlust_s(step(inode)) + h_inode + nfront ) )
596 must_compact_factors = .false.
597 ENDIF
598 ioldps = ptlust_s(step(inode))
599 iw(ioldps+keep(ixsz)) = nbcol
600 iw(ioldps + 1+keep(ixsz)) = nass - npiv
601 IF (type.EQ.2) THEN
602 iw(ioldps + 2+keep(ixsz)) = nass
603 ELSE
604 iw(ioldps + 2+keep(ixsz)) = nfront
605 ENDIF
606 iw(ioldps + 3+keep(ixsz)) = npiv
607 IF (inplace) THEN
608 size_inplace = lreqcb - min_space_in_place
609 ELSE
610 size_inplace = 0_8
611 ENDIF
612 CALL smumps_compress_lu(size_inplace,myid,n,ioldps,TYPE, iw, liw,
613 & a, la, posfac, lrlu, lrlus,
614 & iwpos, ptrast, ptrfac, step, keep,keep8, ssarbr,inode,ierr
615 & , lrgroups, nass
616 & )
617 IF(ierr.LT.0)THEN
618 iflag=ierr
619 ierror=0
620 GOTO 600
621 ENDIF
622 500 CONTINUE
623 RETURN
624 600 CONTINUE
625 IF (iflag .NE. -1 .AND. keep(405) .EQ. 0) THEN
626 CALL smumps_bdc_error( myid, slavef, comm, keep )
627 ENDIF
628 RETURN
629 END SUBROUTINE smumps_fac_stack
#define mumps_abort
Definition VE_Metis.h:25
subroutine mumps_get_flops_cost(nfront, npiv, nass, keep50, level, cost)
Definition estim_flops.F:74
#define min(a, b)
Definition macros.h:20
#define max(a, b)
Definition macros.h:21
subroutine smumps_bdc_error(myid, slavef, comm, keep)
Definition sbcast_int.F:38
int comp(int a, int b)
subroutine smumps_alloc_cb(inplace, min_space_in_place, ssarbr, process_bande, myid, n, keep, keep8, dkeep, iw, liw, a, la, lrlu, iptrlu, iwpos, iwposcb, slavef, procnode_steps, dad, ptrist, ptrast, step, pimaster, pamaster, lreq, lreqcb, node_arg, state_arg, set_header, comp, lrlus, lrlusm, iflag, ierror)
subroutine smumps_fac_stack(comm_load, ass_irecv, n, inode, type, typef, la, iw, liw, a, iflag, ierror, opeliw, nelvaw, nmaxnpiv, ptrist, ptlust_s, ptrfac, ptrast, step, pimaster, pamaster, ne, posfac, lrlu, lrlus, lrlusm, iptrlu, icntl, keep, keep8, dkeep, comp, iwpos, iwposcb, procnode_steps, slavef, fpere, comm, myid, ipool, lpool, leaf, nstk_s, perm, bufr, lbufr, lbufr_bytes, nbfin, root, opassw, itloc, rhs_mumps, fils, dad, ptrarw, ptraiw, intarr, dblarr, nd, frere, lptrar, nelt, frtptr, frtelt, istep_to_iniv2, tab_pos_in_pere, lrgroups, flop_estim_acc)
subroutine smumps_compact_factors_unsym(a, lda, npiv, ncontig, sizea)
subroutine smumps_copy_cb_right_to_left(a, la, lda, poselt, iptrlu, npiv, nbcol_stack, nbrow_stack, nbrow_send, sizecb, keep, packed_cb, last_allowed, nbrow_already_stacked)
subroutine smumps_copy_cb_left_to_right(a, la, lda, poselt, iptrlu, npiv, nbcol_stack, nbrow_stack, nbrow_send, sizecb, keep, packed_cb)
subroutine smumps_compact_factors(a, lda, npiv, nbrow, keep, sizea, iw)
recursive subroutine smumps_try_recvtreat(comm_load, ass_irecv, blocking, set_irecv, message_received, msgsou, msgtag, status, bufr, lbufr, lbufr_bytes, procnode_steps, posfac, iwpos, iwposcb, iptrlu, lrlu, lrlus, n, iw, liw, a, la, ptrist, ptlust, ptrfac, ptrast, step, pimaster, pamaster, nstk_s, comp, iflag, ierror, comm, perm, ipool, lpool, leaf, nbfin, myid, slavef root, opassw, opeliw, itloc, rhs_mumps, fils, dad, ptrarw, ptraiw, intarr, dblarr, icntl, keep, keep8, dkeep, nd, frere, lptrar, nelt, frtptr, frtelt istep_to_iniv2, tab_pos_in_pere, stack_right_authorized, lrgroups)
subroutine smumps_process_rtnelind(root, inode, nelim, nslaves, row_list, col_list, slave_list, procnode_steps, iwpos, iwposcb, iptrlu, lrlu, lrlus, n, iw, liw, a, la, ptrist, ptlust_s, ptrfac, ptrast, step, pimaster, pamaster, nstk_s, itloc, rhs_mumps, comp, iflag, ierror, ipool, lpool, leaf, myid, slavef, keep, keep8, dkeep, comm, comm_load, fils, dad, nd)
subroutine smumps_compress_lu(size_inplace, myid, n, ioldps, type, iw, liw, a, la, posfac, lrlu, lrlus, iwpos, ptrast, ptrfac, step, keep, keep8, ssarbr, inode, ierr, lrgroups, nass)
Definition stools.F:20
recursive subroutine smumps_build_and_send_cb_root(comm_load, ass_irecv, n, ison, iroot, ptri, ptrr, root, nbrow, nbcol, shift_list_row_son, shift_list_col_son, shift_val_son_arg, lda_arg, tag, myid, comm, bufr, lbufr, lbufr_bytes, procnode_steps, posfac, iwpos, iwposcb, iptrlu, lrlu, lrlus, iw, liw, a, la, ptrist, ptlust_s, ptrfac, ptrast, step, pimaster, pamaster, nstk, comp, iflag, ierror, perm, ipool, lpool, leaf, nbfin, slavef, opassw, opeliw, itloc, rhs_mumps, fils, dad, ptrarw, ptraiw, intarr, dblarr, icntl, keep, keep8, dkeep, transpose_asm, nd, frere, lptrar, nelt, frtptr, frtelt, istep_to_iniv2, tab_pos_in_pere, lrgroups)
Definition stype3_root.F:84
logical function mumps_in_or_root_ssarbr(procinfo_inode, k199)
logical function mumps_rootssarbr(procinfo_inode, k199)
integer function mumps_procnode(procinfo_inode, k199)