18 & DET_EXPW, DET_MANTW, DET_SIGNW,
19 & IOLDPS,POSELT,UU,SEUIL,KEEP, KEEP8, DKEEP,
20 & PP_FIRST2SWAP_L, PP_LastPanelonDisk_L,
21 & PP_LastPIVRPTRFilled_L,
22 & PP_FIRST2SWAP_U, PP_LastPanelonDisk_U,
23 & PP_LastPIVRPTRFilled_U,MAXFROMN,IS_MAXFROMN_AVAIL,
24 & Inextpiv, OOC_EFFECTIVE_ON_FRONT, NVSCHUR
29 INTEGER NFRONT,NASS,LIW,INOPV
32 INTEGER(8) :: KEEP8(150)
37 REAL,
intent(in) :: MAXFROMN
38 LOGICAL,
intent(inout) :: IS_MAXFROMN_AVAIL
39 INTEGER,
intent(inout) :: Inextpiv
40 LOGICAL,
intent(in) :: OOC_EFFECTIVE_ON_FRONT
41 INTEGER,
intent(in) :: NVSCHUR
45 INTEGER(8) :: APOS, POSELT
46 INTEGER(8) :: J1, J2, J3_8, JJ, IDIAG
50 INTEGER NPIV,IPIV,IPIV_SHIFT
51 INTEGER,
intent(inout) :: NOFFW
52 INTEGER,
intent(inout) :: DET_EXPW, DET_SIGNW
53 REAL,
intent(inout) :: DET_MANTW
55 INTEGER NPIVP1,JMAX,ISW,ISWPS1
56 INTEGER ISWPS2,KSW,XSIZE
57 INTEGER I_PIVRPTR_L, I_PIVR_L, NBPANELS_L
58 INTEGER I_PIVRPTR_U, I_PIVR_U, NBPANELS_U
59 INTEGER PP_FIRST2SWAP_L, ,
60 & pp_lastpivrptrfilled_l,
61 & pp_first2swap_u, pp_lastpanelondisk_u,
62 & pp_lastpivrptrfilled_u
65 include
'mumps_headers.h'
67 REAL,
PARAMETER :: RZERO = 0.0e0
69 INTEGER :: NOMP, CHUNK, K360
71 nomp = omp_get_max_threads()
73 seuil_loc =
max(dkeep(1), seuil)
74 nfront8 = int(nfront,8)
77 npiv = iw(ioldps+1+xsize)
80 IF ((keep(50).NE.1).AND.ooc_effective_on_front)
THEN
82 & i_pivrptr_l, i_pivr_l,
83 & ioldps+2*nfront+6+iw(ioldps+5+xsize)
87 & i_pivrptr_u, i_pivr_u,
88 & ioldps+2*nfront+6+iw(ioldps+5+xsize)+xsize,
93 IF (inextpiv.GT.npivp1.AND.inextpiv.LE.nass)
THEN
94 ishift = inextpiv - npivp1
96 IF (ishift.GT.0.AND.is_maxfromn_avail)
THEN
98 apos = poselt + nfront8*int(npiv,8) + int(ipiv-1,8)
99 idiag = apos + int(ipiv - npivp1,8)*nfront8
100 IF (abs(a(idiag)) .GE. uu*maxfromn .AND.
101 & abs(a(idiag)) .GT.
max(seuil_loc,tiny(rmax))
106 IF ( ishift .GT. 0)
THEN
107 is_maxfromn_avail = .false.
110 DO 460 ipiv_shift=npivp1+ishift,nass+ishift
111 IF (ipiv_shift .LE. nass)
THEN
114 ipiv=ipiv_shift-nass-1+npivp1
116 apos = poselt + nfront8*int(npiv,8) + int(ipiv-1,8)
121 jmax = smumps_ixamax(j3,a(j1),nfront,keep(360))
122 jj = j1 + int(jmax-1,8)*nfront8
125 j1 = apos + int(nass-npiv,8) * nfront8
126 j3 = nfront - nass - keep(253)-nvschur
127 IF (is_maxfromn_avail)
THEN
128 rmax =
max(maxfromn,rmax)
129 is_maxfromn_avail = .false.
131 IF (j3.EQ.0)
GOTO 370
132 IF (keep(351).EQ.1)
THEN
139 rmax =
max(abs(a(j1_ini + int(j-1,8) * nfront8)),
145 rmax =
max(abs(a(j1)), rmax)
150 370
IF (rmax.LE.tiny(rmax))
GO TO 460
151 idiag = apos + int(ipiv - npivp1,8)*nfront8
152 IF (abs(a(idiag)) .GE. uu*rmax .AND.
153 & abs(a(idiag)) .GT.
max(seuil_loc,tiny(rmax)) )
THEN
157 IF ( .NOT. ( amrow .GE. uu*rmax .AND.
158 & amrow .GT.
max(seuil_loc,tiny(rmax))
167 & ( abs(a(apos + int(jmax - 1,8) * nfront8 )),
168 & dkeep, keep, .false.)
169 IF (keep(258) .NE. 0)
THEN
171 & a(apos + int(jmax - 1,8) * nfront8 ),
172 & det_mantw, det_expw )
174 IF (ipiv.EQ.npivp1)
GO TO 400
175 IF (keep(405) .EQ.0)
THEN
176 keep8(80) = keep8(80)+1
179 keep8(80) = keep8(80)+1
182 det_signw = - det_signw
183 j1 = poselt + int(npiv,8)
184 j3_8 = poselt + int(ipiv-1,8)
190 j3_8 = j3_8 + nfront8
192 iswps1 = ioldps + 5 + npivp1 + nfront + xsize
193 iswps2 = ioldps + 5 + ipiv + nfront + xsize
195 iw(iswps1) = iw(iswps2)
197 400
IF (jmax.EQ.1)
GO TO 420
198 det_signw = -det_signw
199 j1 = poselt + int(npiv,8) * nfront8
200 j2 = poselt + int(npiv + jmax - 1,8) * nfront8
208 iswps1 = ioldps + 5 + npiv + 1 + xsize
209 iswps2 = ioldps + 5 + npiv + jmax + xsize
211 iw(iswps1) = iw(iswps2)
218 IF (ooc_effective_on_front)
THEN
219 IF (keep(251).EQ.0)
THEN
222 & iw(i_pivr_l), nass, npivp1, npiv+jmax,
223 & pp_lastpanelondisk_l,
224 & pp_lastpivrptrfilled_l)
228 & iw(i_pivr_u), nass, npivp1, ipiv,
229 & pp_lastpanelondisk_u,
230 & pp_lastpivrptrfilled_u)
233 is_maxfromn_avail = .false.
237 & IOLDPS,POSELT,IFINB,XSIZE,
238 & KEEP,MAXFROMN,IS_MAXFROMN_AVAIL,NVSCHUR)
241 include
'mumps_headers.h'
242 INTEGER NFRONT,NASS,LIW,IFINB
247 INTEGER(8) :: APOS, POSELT, UUPOS, LPOS, IRWPOS
248 INTEGER(8) :: NFRONT8
249 INTEGER IOLDPS,NPIV,XSIZE
250 INTEGER,
intent(in) :: KEEP(500)
251 REAL,
intent(inout) :: MAXFROMN
252 LOGICAL,
intent(inout) :: IS_MAXFROMN_AVAIL
253 INTEGER,
intent(in) :: NVSCHUR
254 INTEGER NEL,IROW,NEL2,JCOL,NELMAXM
256 REAL,
PARAMETER :: ONE = 1.0e0
259 INTEGER:: NOMP, K360, CHUNK
260 nomp = omp_get_max_threads()
263 nfront8=int(nfront,8)
264 npiv = iw(ioldps+1+xsize)
266 nel = nfront - npivp1
267 nelmaxm= nel -keep(253)-nvschur
270 IF (npivp1.EQ.nass) ifinb = 1
271 apos = poselt + int(npiv,8)*(nfront8 + 1_8)
277 IF (nel.LT.k360)
THEN
278 IF (nel*nel2.GE.keep(361))
THEN
280 chunk =
max(20, (nel+nomp-1)/nomp)
284 chunk =
max(k360/2, (nel+nomp-1)/nomp)
288 IF (keep(351).EQ.2)
THEN
291 is_maxfromn_avail = .true.
298 lpos = apos + nfront8*int(irow,8)
299 a(lpos) = a(lpos)*valpiv
304 a(irwpos) = a(irwpos) + alpha*a(uupos)
306 & maxfromn=
max(maxfromn, abs(a(irwpos)))
310 a(irwpos) = a(irwpos) + alpha*a(uupos)
322 lpos = apos + nfront8*int(irow,8)
323 a(lpos) = a(lpos)*valpiv
328 a(irwpos) = a(irwpos) + alpha*a(uupos)
349 & NPIV,NASS,POSELT,CALL_UTRSM, KEEP, INODE,
350 & CALL_OOC, IWFAC, LIWFAC, LAFAC, MonBloc, MYID, KEEP8,
351 & LNextPiv2beWritten, UNextPiv2beWritten,
357 INTEGER(8) :: LA,POSELT,LAFAC
359 INTEGER NFRONT, NPIV, NASS
360 LOGICAL,
INTENT(IN) :: CALL_UTRSM
361 INTEGER,
INTENT(INOUT) :: IFLAG
362 LOGICAL,
INTENT(IN) :: CALL_OOC
363 INTEGER LIWFAC, MYID,
364 & lnextpiv2bewritten, unextpiv2bewritten
365 INTEGER IWFAC(LIWFAC)
366 TYPE(IO_BLOCK) :: MonBloc
368 INTEGER(8) :: KEEP8(150)
369 INTEGER(8) :: LPOS, LPOS1, LPOS2, UPOS
370 INTEGER NEL1, NEL11, IFLAG_OOC
373 parameter(one = 1.0e0, alpha=-1.0e0)
374 include
'mumps_headers.h'
376 nel11 = nfront - npiv
377 lpos2 = poselt + int(nass,8)*int(nfront,8)
378 lpos = lpos2 + int(npiv,8)
379 lpos1 = poselt + int(npiv,8)
380 upos = poselt + int(nass,8)
381 IF ( call_utrsm )
THEN
382 CALL strsm(
'R',
'U',
'N',
'U', nel1, npiv, one,
383 & a(poselt), nfront, a(upos), nfront)
385 CALL strsm(
'L',
'L',
'N',
'N',npiv,nel1,one,a(poselt),nfront,
390 & a(poselt), lafac, monbloc,
391 & lnextpiv2bewritten, unextpiv2bewritten,
393 & myid, keep8(31), iflag_ooc,
395 IF (iflag_ooc .LT. 0)
THEN
400 CALL sgemm(
'N',
'N',nel11,nel1,npiv,alpha,a(lpos1),
401 & nfront,a(lpos2),nfront,one,a(lpos),nfront)
402 IF ((call_utrsm).AND.(nass-npiv.GT.0))
THEN
403 lpos2 = poselt + int(npiv,8)*int(nfront,8)
404 lpos = lpos2 + int(nass,8)
405 CALL sgemm(
'N',
'N',nel1,nass-npiv,npiv,alpha,a(upos),
406 & nfront,a(lpos2),nfront,one,a(lpos),nfront)
417 INTEGER(8) :: APOS, POSELT
418 INTEGER NFRONT, NPIV, NASSL
419 INTEGER(8) :: LPOS, LPOS1, LPOS2
420 INTEGER NEL1, NEL11, NPIVE
422 parameter(one = 1.0e0, alpha=-1.0e0)
424 nel11 = nfront - npiv
427 apos = poselt + int(npivb,8)*int(nfront,8)
429 lpos2 = apos + int(nassl,8)
430 CALL strsm(
'R',
'U',
'N',
'U',nel1,npive,one,a(apos),nfront,
432 lpos = lpos2 + int(nfront,8)*int(npive,8)
433 lpos1 = apos + int(nfront,8)*int(npive,8)
434 CALL sgemm(
'N',
'N',nel1,nel11,npive,alpha,a(lpos2),
435 & nfront,a(lpos1),nfront,one,a(lpos),nfront
439 & NFRONT, LAST_ROW, LAST_COL, A, LA, POSELT,
440 & FIRST_COL, CALL_LTRSM, CALL_UTRSM, CALL_GEMM,
441 & WITH_COMM_THREAD, LR_ACTIVATED
448 INTEGER,
intent(in) :: IBEG_BLOCK, IEND_BLOCK
449 INTEGER,
intent(in) :: NPIV, NFRONT, LAST_ROW, LAST_COL
450 INTEGER,
intent(in) :: FIRST_COL
451 INTEGER(8),
intent(in) :: LA
452 REAL,
intent(inout) :: A(LA)
453 INTEGER(8),
intent(in) :: POSELT
454 LOGICAL,
intent(in) :: CALL_LTRSM, CALL_UTRSM, CALL_GEMM
455 LOGICAL,
intent(in) :: WITH_COMM_THREAD, LR_ACTIVATED
456 INTEGER(8) :: NFRONT8, LPOSN, LPOS2N
457 INTEGER(8) :: LPOS, LPOS1, LPOS2, UPOS, POSELT_LOCAL
458 INTEGER :: NELIM, LKJIW, NEL1, NEL11, UTRSM_NCOLS
460 PARAMETER (ONE = 1.0e0, alpha=-1.0e0)
464 nfront8= int(nfront,8)
465 nelim = iend_block - npiv
466 nel1 = last_row - iend_block
469 &
"Internal error 1 in SMUMPS_FAC_SQ,IEND_BLOCK>LAST_ROW",
470 & iend_block, last_row
473 lkjiw = npiv - ibeg_block + 1
474 nel11 = last_col - npiv
475 lpos2 = poselt + int(iend_block,8)*nfront8 + int(ibeg_block-1,8)
476 utrsm_ncols = last_col - first_col
477 upos = poselt + int(ibeg_block-1,8)*nfront8 + int(first_col,8)
478 poselt_local = poselt + int(ibeg_block-1,8)*nfront8
479 & + int(ibeg_block-1,8)
480 IF ((nel1.NE.0).AND.(lkjiw.NE.0))
THEN
481 IF (with_comm_thread .EQV. .false.)
THEN
483 CALL strsm(
'L',
'L',
'N',
'N',lkjiw,nel1,one,
484 & a(poselt_local),nfront,
488 CALL strsm(
'R',
'U',
'N',
'U',utrsm_ncols,lkjiw,one,
489 & a(poselt_local),nfront,
491 lpos2n = poselt + int(npiv,8)*nfront8 + int(ibeg_block-1,8)
492 lposn = poselt + int(npiv,8)*nfront8 + int(first_col,8)
493 CALL sgemm(
'N',
'N',utrsm_ncols,nelim,
494 & lkjiw,alpha,a(upos),nfront,a(lpos2n),
495 & nfront,one,a(lposn),nfront
498 lpos = lpos2 + int(lkjiw,8)
499 lpos1 = poselt_local + int(lkjiw,8)
500 CALL sgemm(
'N',
'N',nel11,nel1,lkjiw,alpha,a(lpos1),
501 & nfront,a(lpos2),nfront,one,a(lpos),nfront)
513#if defined(WORKAROUNDINTELILP64OPENMPLIMITATION)
519 CALL strsm(
'L',
'L',
'N',
'N',lkjiw,nel1,one,
520 & a(poselt_local),nfront,
524 CALL strsm(
'R',
'U',
'N',
'U',utrsm_ncols,lkjiw,one,
525 & a(poselt_local),nfront,
527 lpos2n = poselt + int(npiv,8)*nfront8 + int(ibeg_block-1,8)
528 lposn = poselt + int(npiv,8)*nfront8 + int(first_col,8)
529 CALL sgemm(
'N',
'N',utrsm_ncols,nelim,
530 & lkjiw,alpha,a(upos),nfront,a(lpos2n),
531 & nfront,one,a(lposn),nfront)
534 lpos = lpos2 + int(lkjiw,8)
535 lpos1 = poselt_local + int(lkjiw,8)
536 CALL sgemm(
'N',
'N',nel11,nel1,lkjiw,alpha,a(lpos1),
537 & nfront,a(lpos2),nfront,one,a(lpos),nfront)
549#if defined(WORKAROUNDINTELILP64OPENMPLIMITATION)
556 IF (call_utrsm.AND.utrsm_ncols.NE.0)
THEN
557 CALL strsm('r
','u
','n
','u
',UTRSM_NCOLS,LKJIW,ONE,
558 & A(POSELT_LOCAL),NFRONT,
560 LPOS2N = POSELT + int(NPIV,8)*NFRONT8 + int(IBEG_BLOCK-1,8)
561 LPOSN = POSELT + int(NPIV,8)*NFRONT8 + int(FIRST_COL,8)
562 CALL sgemm('n
','n
',UTRSM_NCOLS,NELIM,
563 & LKJIW,ALPHA,A(UPOS),NFRONT,A(LPOS2N),
564 & NFRONT,ONE,A(LPOSN),NFRONT)
subroutine smumps_fac_p(a, la, nfront, npiv, nass, poselt, call_utrsm, keep, inode, call_ooc, iwfac, liwfac, lafac, monbloc, myid, keep8, lnextpiv2bewritten, unextpiv2bewritten, iflag)
subroutine smumps_fac_h(nfront, nass, iw, liw, a, la, inopv, noffw, det_expw, det_mantw, det_signw, ioldps, poselt, uu, seuil, keep, keep8, dkeep, pp_first2swap_l, pp_lastpanelondisk_l, pp_lastpivrptrfilled_l, pp_first2swap_u, pp_lastpanelondisk_u, pp_lastpivrptrfilled_u, maxfromn, is_maxfromn_avail, inextpiv, ooc_effective_on_front, nvschur)