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
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 COMPLEX,
intent(inout) :: DET_MANTW
55 INTEGER NPIVP1,JMAX,ISW,
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, PP_LastPanelonDisk_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 = cmumps_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 COMPLEX,
PARAMETER :: ONE=(1.0e0,0.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)
338 & K405, K222, NEL1, NASS )
339 INTEGER,
INTENT(IN) :: K427, K405, K222, NEL1, NASS
340 INTEGER,
INTENT(OUT) :: K427_OUT
342 IF ( k427_out .GT. 0 ) k427_out = 0
343 IF ( k427_out .LT. 0 ) k427_out = -1
344 IF ( k427_out .GT. 99 ) k427_out = 0
345 IF ( k427_out .LT. -100 ) k427_out = -1
349 & NPIV,NASS,POSELT,CALL_UTRSM, KEEP, INODE,
350 & CALL_OOC, IWFAC, LIWFAC, LAFAC, MonBloc, MYID, KEEP8,
351 & LNextPiv2beWritten, UNextPiv2beWritten,
357 INTEGER(8) :: ,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,0.0e0), alpha=(-1.0e0,0.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 ctrsm(
'R',
'U',
'N',
'U', nel1, npiv, one,
383 & a(poselt), nfront, a(upos), nfront)
385 CALL ctrsm(
'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 cgemm(
'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 cgemm(
'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,0.0e0), alpha=(-1.0e0,0.0e0))
424 nel11 = nfront - npiv
427 apos = poselt + int(npivb,8)*int(nfront,8)
429 lpos2 = apos + int(nassl,8)
430 CALL ctrsm('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 cgemm('n
','n
',NEL1,NEL11,NPIVE,ALPHA,A(LPOS2),
435 & NFRONT,A(LPOS1),NFRONT,ONE,A(LPOS),NFRONT)
437 END SUBROUTINE CMUMPS_FAC_T
438 SUBROUTINE CMUMPS_FAC_SQ(IBEG_BLOCK, IEND_BLOCK, NPIV,
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 COMPLEX, 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,0.0E0), ALPHA=(-1.0E0,0.0E0))
462!$ LOGICAL :: TRSM_GEMM_FINISHED
463!$ LOGICAL :: SAVE_NESTED, SAVE_DYNAMIC
464 NFRONT8= int(NFRONT,8)
465 NELIM = IEND_BLOCK - NPIV
466 NEL1 = LAST_ROW - IEND_BLOCK
469 & "Internal error 1 in CMUMPS_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.NE..AND..NE.
IF ((NEL10)(LKJIW0)) THEN
481.EQV.
IF (WITH_COMM_THREAD .FALSE.) THEN
483 CALL ctrsm('l
','l
','n
','n
',LKJIW,NEL1,ONE,
484 & A(POSELT_LOCAL),NFRONT,
488 CALL ctrsm('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 cgemm('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 cgemm('n
','n
',NEL11,NEL1,LKJIW,ALPHA,A(LPOS1),
501 & NFRONT,A(LPOS2),NFRONT,ONE,A(LPOS),NFRONT)
504!$ NOMP = OMP_GET_MAX_THREADS()
505!$ CALL OMP_SET_NUM_THREADS(2)
506!$ SAVE_NESTED = OMP_GET_NESTED()
507!$ SAVE_DYNAMIC = OMP_GET_DYNAMIC()
508!$ CALL OMP_SET_NESTED(.TRUE.)
509!$ CALL OMP_SET_DYNAMIC(.FALSE.)
510!$ TRSM_GEMM_FINISHED = .FALSE.
511!$OMP PARALLEL SHARED(TRSM_GEMM_FINISHED)
512.EQ.
!$ IF (OMP_GET_THREAD_NUM() 1) THEN
513#if defined(WORKAROUNDINTELILP64OPENMPLIMITATION)
514!$ CALL OMP_SET_NUM_THREADS(int(NOMP,4))
516!$ CALL OMP_SET_NUM_THREADS(NOMP)
519 CALL ctrsm('l
','l
','n
','n
',LKJIW,NEL1,ONE,
520 & A(POSELT_LOCAL),NFRONT,
524 CALL ctrsm('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 cgemm('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 cgemm('n
','n
',NEL11,NEL1,LKJIW,ALPHA,A(LPOS1),
537 & NFRONT,A(LPOS2),NFRONT,ONE,A(LPOS),NFRONT)
539!$ TRSM_GEMM_FINISHED = .TRUE.
541.NOT.
!$ DO WHILE ( TRSM_GEMM_FINISHED)
542!$ CALL CMUMPS_BUF_TEST()
543!$ CALL MUMPS_USLEEP(10000)
547!$ CALL OMP_SET_NESTED(SAVE_NESTED)
548!$ CALL OMP_SET_DYNAMIC(SAVE_DYNAMIC)
549#if defined(WORKAROUNDINTELILP64OPENMPLIMITATION)
550!$ CALL OMP_SET_NUM_THREADS(int(NOMP,4))
552!$ CALL OMP_SET_NUM_THREADS(NOMP)
556.AND..NE.
IF (CALL_UTRSMUTRSM_NCOLS0) THEN
557 CALL ctrsm('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 cgemm(
'N',
'N',utrsm_ncols,nelim,
563 & lkjiw,alpha,a(upos),nfront,a(lpos2n),
564 & nfront,one,a(lposn),nfront)
570 & NFRONT, NASS, NPIV, LAST_COL, A, LA, POSELT, IFINB,
574 INTEGER,
intent(in) :: IBEG_BLOCK, IEND_BLOCK, NFRONT,
575 & nass, npiv, last_col
576 INTEGER,
intent(out) :: IFINB
577 INTEGER(8),
intent(in) :: LA, POSELT
578 COMPLEX,
intent(inout) :: A(LA)
579 LOGICAL,
intent(in) :: LR_ACTIVATED
581 INTEGER(8) :: APOS, UUPOS, LPOS
582 INTEGER(8) :: NFRONT8
583 COMPLEX :: ONE, ALPHA
584 INTEGER :: NEL2,NPIVP1,KROW,NEL
585 parameter(one=(1.0e0,0.0e0), alpha=(-1.0e0,0.0e0))
588 nel = last_col - npivp1
590 nel2 = iend_block - npivp1
592 IF (iend_block.EQ.nass)
THEN
598 apos = poselt + int(npiv,8)*(nfront8 + 1_8)
600 lpos = apos + nfront8
602 a(lpos) = a(lpos)*valpiv
603 lpos = lpos + nfront8
605 lpos = apos + nfront8
607#if defined(MUMPS_USE_BLAS2)
608 CALL cgeru(nel,nel2,alpha,a(uupos),1,a(lpos),nfront,
609 & a(lpos+1_8),nfront)
611 CALL cgemm(
'N',
'N',nel,nel2,1,alpha,a(uupos),nel,
612 & a(lpos),nfront,one,a(lpos+1_8),nfront)
618 & CALL_UTRSM, A, LA, LAFAC, POSELT, IW, LIW, IOLDPS,
619 & MonBloc, MYID, NOFFW,
620 & DET_EXPW, DET_MANTW, DET_SIGNW,
622 & PP_FIRST2SWAP_L, PP_FIRST2SWAP_U,
623 & LNextPiv2beWritten, UNextPiv2beWritten,
624 & PP_LastPIVRPTRFilled_L, PP_LastPIVRPTRFilled_U,
626 & XSIZE, SEUIL, UU, DKEEP, KEEP8, KEEP, IFLAG,
627 & OOC_EFFECTIVE_ON_FRONT, NVSCHUR)
630 INTEGER,
intent(in) :: INODE, NFRONT, NASS,
631 & liw, myid, xsize, ioldps, liwfac
632 INTEGER(8),
intent(in) :: LA, POSELT
633 INTEGER,
intent(inout) :: NOFFW
634 INTEGER,
intent(inout) :: DET_EXPW, DET_SIGNW
635 COMPLEX,
intent(inout) :: DET_MANTW
636 INTEGER,
intent(inout) :: PP_FIRST2SWAP_L, PP_FIRST2SWAP_U,
637 & LNextPiv2beWritten, UNextPiv2beWritten,
638 & pp_lastpivrptrfilled_l, pp_lastpivrptrfilled_u,
640 LOGICAL,
intent(in) :: CALL_UTRSM
641 INTEGER,
intent(inout) :: IW(LIW)
642 COMPLEX,
intent(inout) :: A(LA)
643 REAL,
intent(in) :: SEUIL, UU, DKEEP(230)
644 INTEGER,
intent(in) :: KEEP( 500 )
645 INTEGER(8),
intent(inout) :: LAFAC
646 INTEGER(8) :: KEEP8(150)
647 INTEGER,
intent(in) :: NVSCHUR
648 TYPE(IO_BLOCK),
intent(inout) :: MonBloc
649 LOGICAL,
intent(in) :: OOC_EFFECTIVE_ON_FRONT
650 INTEGER :: NPIV, NEL1, IBEG_BLOCK, IFINB, INOPV
653 LOGICAL :: IS_MAXFROMN_AVAIL
654 NPIV = iw(ioldps+1+xsize)
656 IF (keep(206).GE.1)
THEN
661 IF ((npiv.GT.0).AND.(nel1.GT.0))
THEN
662 IF (ooc_effective_on_front)
THEN
663 monbloc%LastPiv = npiv
666 & call_utrsm, keep, inode,
667 & ooc_effective_on_front, iw(ioldps),
669 & monbloc, myid, keep8,
670 & lnextpiv2bewritten, unextpiv2bewritten,
673 npiv = iw(ioldps+1+xsize)
675 IF (nass.EQ.npiv)
GOTO 500
676 is_maxfromn_avail = .false.
679 & det_expw, det_mantw, det_signw,
680 & ioldps,poselt,uu,seuil,
681 & keep, keep8, dkeep,
682 & pp_first2swap_l, monbloc%LastPanelWritten_L,
683 & pp_lastpivrptrfilled_l,
684 & pp_first2swap_u, monbloc%LastPanelWritten_U,
685 & pp_lastpivrptrfilled_u, maxfromn, is_maxfromn_avail,
686 & inextpiv, ooc_effective_on_front, nvschur
690 & ioldps,poselt,ifinb,xsize,
691 & keep, maxfromn, is_maxfromn_avail,
693 iw(ioldps+1+xsize) = iw(ioldps+1+xsize) + 1
694 IF (ifinb.EQ.0)
GOTO 120
696 npiv = iw(ioldps+1+xsize)
698 IF ((npiv.LE.ibeg_block).OR.(nel1.EQ.0))
GO TO 500
700 & nfront,npiv,nass,poselt)
705 & IBEG_BLOCK, IEND_BLOCK,
706 & N,INODE,IW,LIW,A,LA,
707 & INOPV,NOFFW,NBTINYW,
708 & DET_EXPW, DET_MANTW, DET_SIGNW,
709 & IFLAG,IOLDPS,POSELT,UU,SEUIL,KEEP,KEEP8,
710 & DKEEP,PIVNUL_LIST,LPN_LIST,
712 & PP_FIRST2SWAP_L, PP_LastPanelonDisk_L,
713 & PP_LastPIVRPTRFilled_L,
714 & PP_FIRST2SWAP_U, PP_LastPanelonDisk_U,
715 & PP_LastPIVRPTRFilled_U,
716 & PIVOT_OPTION, LR_ACTIVATED, IEND_BLR, Inextpiv,
717 & OOC_EFFECTIVE_ON_FRONT, NVSCHUR, PARPIV_T1,
723 INTEGER,
intent(in) :: IBEG_BLOCK, IEND_BLOCK
724 INTEGER,
intent(inout),
OPTIONAL :: TIPIV(:)
725 INTEGER(8),
intent(in) :: LA
726 COMPLEX,
intent(inout) :: A(LA)
727 INTEGER,
intent(in) :: NFRONT,NASS,N,LIW,INODE,LAST_ROW
728 INTEGER,
intent(inout) :: IFLAG,INOPV,NOFFW, NBTINYW
729 INTEGER,
intent(inout) :: DET_EXPW, DET_SIGNW
730 COMPLEX,
intent(inout) :: DET_MANTW
731 REAL,
intent(in) :: UU, SEUIL
732 INTEGER,
intent(inout) :: IW(LIW)
733 INTEGER,
intent(in) :: IOLDPS
734 INTEGER(8),
intent(in) :: POSELT
736 INTEGER(8) KEEP8(150)
737 INTEGER,
intent(in) :: LPN_LIST
738 INTEGER,
intent(inout) :: PIVNUL_LIST(LPN_LIST)
740 INTEGER PP_FIRST2SWAP_L, PP_LastPanelonDisk_L,
741 & pp_lastpivrptrfilled_l,
742 & pp_first2swap_u, pp_lastpanelondisk_u,
743 & pp_lastpivrptrfilled_u
744 INTEGER,
intent(in) :: PIVOT_OPTION, IEND_BLR
745 LOGICAL,
intent(in) :: LR_ACTIVATED
746 INTEGER,
intent(inout) :: Inextpiv
747 LOGICAL,
intent(in) :: OOC_EFFECTIVE_ON_FRONT
748 INTEGER,
intent(in) :: NVSCHUR
749 INTEGER,
intent(in) :: PARPIV_T1
750 INCLUDE
'mumps_headers.h'
753 INTEGER(8) :: APOS, IDIAG
754 INTEGER(8) :: J1, J2, JJ, J3
755 INTEGER(8) :: NFRONT8
758 PARAMETER( ZERO = (0.0e0,0.0e0) )
759 REAL RZERO, RMAX, AMROW, MAX_PREV_in_PARPIV
760 INTEGER(8) :: APOSMAX, APOSROW
762 REAL PIVNUL, ABS_PIVOT
763 COMPLEX FIXA, CSEUIL, PIVOT
764 INTEGER NPIV,IPIV, LRLOC
765 INTEGER NPIVP1,JMAX,J,ISW,ISWPS1
766 INTEGER ISWPS2,KSW, HF, IPIVNUL
767 INTEGER CMUMPS_IXAMAX
768 INTEGER :: ISHIFT, K206
769 INTEGER :: IPIV_SHIFT,IPIV_END
773 INTEGER :: NOMP,CHUNK,K361
775 INTEGER I_PIVRPTR_L, I_PIVR_L, NBPANELS_L
776 INTEGER I_PIVRPTR_U, I_PIVR_U, NBPANELS_U
778 nomp = omp_get_max_threads()
782 fixa =
cmplx(dkeep(2),kind=kind(fixa))
783 cseuil =
cmplx(seuil,kind=kind(cseuil))
784 nfront8 = int(nfront,8)
787 npiv = iw(ioldps+1+xsize)
788 hf = 6 + iw(ioldps+5+xsize)+xsize
790 aposmax = poselt+nfront8*nfront8-1_8
791 IF (ooc_effective_on_front)
THEN
793 & i_pivrptr_l, i_pivr_l,
794 & ioldps+2*nfront+6+iw(ioldps+5+xsize)+xsize,
797 & i_pivrptr_u, i_pivr_u,
798 & ioldps+2*nfront+6+iw(ioldps+5+xsize)+xsize,
801 IF (
present(tipiv) )
THEN
802 iloc = npivp1 - ibeg_block + 1
805 IF (inopv .EQ. -1)
THEN
806 apos = poselt + nfront8*int(npivp1-1,8) + int(npiv,8)
808 abs_pivot = abs(pivot)
811 & ( abs_pivot, dkeep, keep, .true.)
812 IF(abs_pivot.LT.seuil)
THEN
813 IF (real(pivot) .GE. rzero)
THEN
818 nbtinyw = nbtinyw + 1
819 ELSE IF (keep(258) .NE. 0)
THEN
822 IF (ooc_effective_on_front)
THEN
823 IF (keep(251).EQ.0)
THEN
826 & iw(i_pivr_l), nass, npivp1, npivp1,
827 & pp_lastpanelondisk_l,
828 & pp_lastpivrptrfilled_l)
832 & iw(i_pivr_u), nass, npivp1, npivp1,
833 & pp_lastpanelondisk_u,
834 & pp_lastpivrptrfilled_u)
840 ipiv_end = iend_block
842 IF (inextpiv.GT.npivp1.AND.inextpiv.LE.iend_block)
THEN
843 ishift = inextpiv - npivp1
846 & .OR. (k206 .GT.1 .AND. iend_block.EQ.iend_blr) )
THEN
847 ipiv_end = iend_block + ishift
850 DO 460 ipiv_shift = npivp1+ishift, ipiv_end
851 IF (ipiv_shift .LE. iend_block)
THEN
854 ipiv = ipiv_shift-iend_block-1+npivp1
855 IF (ibeg_block.EQ.npivp1)
THEN
859 apos = poselt + nfront8*int(ipiv-1,8) + int(npiv,8)
861 IF ((pivot_option.EQ.0).OR.(uu.EQ.rzero))
THEN
862 abs_pivot = abs(a(apos))
863 IF(abs_pivot.LT.seuil)
THEN
865 & ( abs_pivot, dkeep, keep, .true.)
866 IF (real(a(apos)) .GE. rzero)
THEN
871 nbtinyw = nbtinyw + 1
873 ELSE IF (abs_pivot.EQ.rzero)
THEN
880 IF (pivot_option.EQ.1 .OR. (lr_activated .AND.
888 jmax = cmumps_ixamax(j,a(j1),1,keep(361))
889 jj = j1 + int(jmax - 1,8)
892 IF (pivot_option.GE.2)
THEN
894 IF (pivot_option.GE.3
897 & int(- npiv + nfront - 1 - keep(253) - nvschur,8)
899 j2 = apos +int(- npiv + nass - 1 ,8)
901 IF (j2.LT.j1)
GO TO 370
902 IF (keep(351).EQ.1)
THEN
908 rmax =
max(abs(a(jj)),rmax)
913 rmax =
max(abs(a(jj)),rmax)
918 idiag = apos + int(ipiv - npivp1,8)
919 abs_pivot = abs(a(idiag))
920 IF (parpiv_t1.NE.0)
THEN
921 rmax_norelax = real(a(aposmax+int(ipiv,8)))
925 rmax =
max(rmax,rmax_norelax)
926 IF ( rmax .LE. pivnul )
THEN
927 IF (last_row.EQ.nfront)
THEN
928 lrloc = last_row -keep(253)-nvschur
932 IF (nfront - keep(253) .EQ. nass)
THEN
936 j1=poselt+int(ipiv-1,8)+int(npiv,8)*nfront8
939 j1=poselt+int(ipiv-1,8)
940 j2=poselt+int(ipiv-1,8)+int(lrloc-1,8)*nfront8
942 DO jj=j1, j2, nfront8
943 IF ( abs(a(jj)) .GT. pivnul )
THEN
948 & .AND.(parpiv_t1.NE.-1)
949 & .AND.(rmax_norelax.LT.0)
950 & .AND.(ipiv.GT.1))
THEN
951 max_prev_in_parpiv = rzero
953 max_prev_in_parpiv=
max( max_prev_in_parpiv,
954 & real(a(aposmax+int(jj,8))) )
956 IF (max_prev_in_parpiv.GT.pivnul)
THEN
957 aposrow = poselt + nfront8*int(ipiv-1,8)
959 IF (abs(a(aposrow+jj-1)).GT.pivnul)
GOTO 460
964 & ( abs_pivot, dkeep, keep, .true.)
966 keep(109) = keep(109)+1
969 pivnul_list(ipivnul) = iw( ioldps+hf+npiv+ipiv-npivp1 )
970 IF(real(fixa).GT.rzero)
THEN
971 IF(real(a(idiag)) .GE. rzero)
THEN
979 & int(- npiv + nfront - 1 - keep(253),8)
988 rmax =
max(rmax,abs(rmax_norelax))
989 IF (abs_pivot .GE. uu*rmax .AND.
990 & abs_pivot .GT.
max(seuil,tiny(rmax)))
THEN
994 IF ( .NOT. (amrow .GE. uu*rmax .AND.
995 & amrow .GT.
max(seuil,tiny(rmax))) )
GO TO 460
1002 & ( abs(a(apos+int(jmax-1,8))),
1003 & dkeep, keep, .false.)
1004 IF (keep(258) .NE. 0)
THEN
1010 IF (ipiv.EQ.npivp1)
GO TO 400
1011 IF (keep(405) .EQ. 0)
THEN
1012 keep8(80) = keep8(80)+1
1015 keep8(80) = keep8(80)+1
1018 IF (parpiv_t1.NE.0)
THEN
1019 swop = a(aposmax+int(npivp1,8))
1020 a(aposmax+int(npivp1,8)) = a(aposmax+int(ipiv,8))
1021 a(aposmax+int(ipiv,8)) = swop
1023 det_signw = - det_signw
1024 j1 = poselt + int(npiv,8)*nfront8
1025 j2 = j1 + nfront8 - 1_8
1026 j3 = poselt + int(ipiv-1,8)*nfront8
1033 iswps1 = ioldps + hf - 1 + npivp1
1034 iswps2 = ioldps + hf - 1 + ipiv
1036 iw(iswps1) = iw(iswps2)
1038 400
IF (jmax.EQ.1)
GO TO 420
1039 det_signw = - det_signw
1040 IF (
present(tipiv) )
THEN
1041 tipiv(iloc) = iloc + jmax - 1
1043 j1 = poselt + int(npiv,8)
1044 j2 = poselt + int(npiv + jmax - 1,8)
1045 DO 410 ksw=1,last_row
1052 iswps1 = ioldps + hf - 1 + nfront + npiv + 1
1053 iswps2 = ioldps + hf - 1 + nfront + npiv + jmax
1055 iw(iswps1) = iw(iswps2)
1059 IF (k206 .GE. 1)
THEN
1060 inextpiv=iend_block+1
1062 IF (iend_block.EQ.nass)
THEN
1072 IF (ooc_effective_on_front)
THEN
1073 IF (keep(251).EQ.0)
THEN
1076 & iw(i_pivr_l), nass, npivp1, ipiv,
1077 & pp_lastpanelondisk_l,
1078 & pp_lastpivrptrfilled_l)
1082 & iw(i_pivr_u), nass, npivp1, npiv+jmax,
1083 & pp_lastpanelondisk_u,
1084 & pp_lastpivrptrfilled_u)
1090 & ( nfront,nass,inode,ibeg_block,iend_block,
1091 & iw,liw, a,la, inopv,
1092 & nnegw, nb22t1w, nbtinyw,
1093 & det_expw, det_mantw, det_signw,
1094 & iflag,ioldps,poselt,uu, seuil,keep,keep8,pivsiz,
1095 & dkeep,pivnul_list,lpn_list, xsize,
1096 & pp_first2swap_l, pp_lastpanelondisk,
1097 & pp_lastpivrptrindexfilled,maxfromm,is_maxfromm_avail,
1098 & pivot_option, iend_blr, inextpiv,
1099 & ooc_effective_on_front,
1100 & nvschur, parpiv_t1, lr_activated
1105 INTEGER(8) :: POSELT, LA
1106 INTEGER NFRONT,NASS,LIW,INODE,IFLAG,INOPV,
1108 INTEGER,
intent(inout) :: NNEGW, NB22T1W, NBTINYW
1109 INTEGER,
intent(inout) :: DET_EXPW, DET_SIGNW
1110 COMPLEX,
intent(inout) :: DET_MANTW
1111 INTEGER,
intent(in) :: IBEG_BLOCK, IEND_BLOCK
1112 INTEGER,
intent(in) :: PIVOT_OPTION,IEND_BLR
1113 INTEGER,
intent(inout) :: Inextpiv
1114 LOGICAL,
intent(in) :: OOC_EFFECTIVE_ON_FRONT
1115 INTEGER PIVSIZ,LPIV, XSIZE
1117 REAL UU, UULOC, SEUIL
1122 INTEGER PIVNUL_LIST(LPN_LIST)
1124 INTEGER PP_FIRST2SWAP_L, PP_LastPanelonDisk
1126 REAL,
intent(in) :: MAXFROMM
1127 LOGICAL,
intent(inout) :: IS_MAXFROMM_AVAIL
1128 INTEGER,
intent(in) :: NVSCHUR
1129 INTEGER,
intent(in) :: PARPIV_T1
1130 LOGICAL,
intent(in) :: LR_ACTIVATED
1132 INTEGER (8) :: POSPV1,POSPV2,OFFDAG,APOSJ
1133 INTEGER JMAX, LIM, LIM_SWAP
1134 REAL RMAX,AMAX,TMAX, MAX_PREV_in_PARPIV, ABS_PIVOT
1135 REAL RMAX_NORELAX, TMAX_NORELAX, UULOCM1
1136 INTEGER(8) :: APOSMAX, APOSROW
1139 REAL MAXFROMM_UPDATED
1140 COMPLEX FIXA, CSEUIL
1141 COMPLEX PIVOT,DETPIV
1143 INCLUDE
'mumps_headers.h'
1144 INTEGER :: HF, IPIVNUL
1146 INTEGER(8) :: APOS, J1, J2, JJ, NFRONT8, KK, J1_ini, JJ_ini
1151 INTEGER :: ISHIFT, K206, IPIV_SHIFT, IPIV_END
1154 parameter( zero = (0.0e0,0.0e0) )
1155 parameter( one = (1.0e0,1.0e0) )
1157 parameter(rzero=0.0e0, rone=1.0e0)
1160 INTEGER :: NOMP, CHUNK, J1_end
1162 INTEGER I_PIVRPTR, I_PIVR, NBPANELS_L
1165 fixa =
cmplx(dkeep(2),kind=kind(fixa))
1166 cseuil =
cmplx(seuil,kind=kind(cseuil))
1169 nfront8 = int(nfront,8)
1172 IF (uuloc.GT.rzero)
THEN
1173 uulocm1 = rone/uuloc
1178 IF (keep(50).NE.1 .AND. ooc_effective_on_front)
THEN
1180 & i_pivrptr, i_pivr, ioldps+2*nfront+6+keep(ixsz),
1184 npiv = iw(ioldps+1+xsize)
1186 aposmax = poselt+lda8*lda8-1_8
1187 IF(inopv .EQ. -1)
THEN
1188 apos = poselt + (lda8+1_8) * int(npiv,8)
1191 & ( abs(a(apos)), dkeep, keep, .true.)
1192 IF(abs(a(apos)).LT.seuil)
THEN
1193 IF(real(a(apos)) .GE. rzero)
THEN
1198 nbtinyw = nbtinyw + 1
1200 IF (keep(258) .NE. 0)
THEN
1204 IF (keep(50).NE.1 .AND. ooc_effective_on_front)
THEN
1206 & iw(i_pivr), nass, npivp1, npivp1,
1207 & pp_lastpanelondisk,
1208 & pp_lastpivrptrindexfilled)
1214 ipiv_end = iend_block
1216 IF (inextpiv.GT.npivp1.AND.inextpiv.LE.iend_block)
THEN
1217 ishift = inextpiv - npivp1
1220 & .OR. (k206 .GT.1 .AND. iend_block.EQ.iend_blr) )
THEN
1221 ipiv_end = iend_block + ishift
1223 IF (ishift.GT.0.AND.is_maxfromm_avail)
THEN
1225 apos = poselt + lda8*int(ipiv-1,8) + int(npiv,8)
1226 pospv1 = apos + int(ipiv - npivp1,8)
1228 IF ( maxfromm .GT. pivnul )
THEN
1229 IF (parpiv_t1.NE.0)
THEN
1230 maxfromm_updated = max
1232 & abs(real(a(aposmax+int(ipiv,8))))
1235 maxfromm_updated = maxfromm
1237 IF ( (abs(pivot) .GE. uuloc*maxfromm_updated).AND.
1238 & abs(pivot) .GT. max(seuil,tiny(maxfromm_updated))
1244 IF ( ishift .GT. 0)
THEN
1245 is_maxfromm_avail = .false.
1248 DO 460 ipiv_shift = npivp1+ishift, ipiv_end
1249 IF (ipiv_shift .LE. iend_block)
THEN
1252 ipiv = ipiv_shift-iend_block-1+npivp1
1253 IF (ibeg_block.EQ.npivp1)
THEN
1257 apos = poselt + lda8*int(ipiv-1,8) + int(npiv,8)
1258 pospv1 = apos + int(ipiv - npivp1,8)
1260 abs_pivot = abs(pivot)
1261 IF (uuloc.EQ.rzero.OR.pivot_option.EQ.0)
THEN
1262 IF(abs_pivot.LT.seuil)
THEN
1264 & ( abs_pivot, dkeep, keep, .true.)
1265 IF(real(pivot) .GE. rzero)
THEN
1270 nbtinyw = nbtinyw + 1
1271 ELSE IF (abs_pivot.EQ.rzero)
THEN
1275 & ( abs_pivot, dkeep, keep, .false.)
1276 IF (keep(258) .NE. 0)
THEN
1282 IF ( is_maxfromm_avail )
THEN
1283 IF ( maxfromm .GT. pivnul )
THEN
1284 IF (parpiv_t1.NE.0)
THEN
1285 maxfromm_updated = max
1287 & abs(real(a(aposmax+int(ipiv,8))))
1290 maxfromm_updated = maxfromm
1292 IF ( (abs_pivot .GE. uuloc*maxfromm_updated).AND.
1293 & (abs_pivot .GT. max(seuil,tiny(maxfromm_updated)))
1297 & dkeep, keep, .false.)
1298 IF (keep(258) .NE. 0)
THEN
1304 is_maxfromm_avail = .false.
1308 IF (pivot_option.EQ.3
1310 lim = nfront - keep(253)-nvschur
1311 ELSEIF (pivot_option.GE.2
1314 ELSEIF (pivot_option.GE.1)
THEN
1317 write(*,*)
'Internal error in FAC_I_LDLT 1x1:',
1324 IF(abs(a(jj)) .GT. amax)
THEN
1326 jmax = ipiv - int(pospv1-jj)
1330 DO j=1, iend_block - ipiv
1331 IF(abs(a(j1)) .GT. amax)
THEN
1340 j1_end = lim - iend_block
1341 chunk = max(j1_end,1)
1342 IF ( j1_end.GE.keep(360))
THEN
1344 chunk = max(keep(360)/2,(j1_end+nomp-1)/nomp)
1351 DO j=1, lim - iend_block
1352 j1 = j1_ini + int(j-1,8) * lda8
1353 rmax = max(abs(a(j1)),rmax)
1356 IF (parpiv_t1.NE.0)
THEN
1357 rmax_norelax = real(a(aposmax+int(ipiv,8)))
1359 rmax_norelax = rzero
1361 rmax = max(rmax,rmax_norelax)
1362 IF (max(amax,rmax,abs(pivot)).LE.pivnul)
THEN
1363 IF ((parpiv_t1.NE.0)
1364 & .AND.(parpiv_t1.NE.-1)
1365 & .AND.(rmax_norelax.LT.0)
1366 & .AND.(ipiv.GT.1))
THEN
1367 max_prev_in_parpiv = rzero
1369 max_prev_in_parpiv= max( max_prev_in_parpiv,
1370 & real(a(aposmax+int(jj,8))) )
1372 IF (max_prev_in_parpiv.GT.pivnul)
THEN
1373 aposrow = poselt + nfront8*int(ipiv-1,8)
1375 IF (abs(a(aposrow+jj-1)).GT.pivnul)
THEN
1382 & ( abs(a(pospv1)), dkeep, keep, .true.)
1384 keep(109) = keep(109) + 1
1387 pivnul_list(ipivnul) = iw( ioldps+hf+npiv+ipiv-npivp1 )
1388 IF(real(fixa).GT.rzero
THEN
1389 IF(real(pivot) .GE. rzero)
THEN
1401 DO j=1, iend_block - ipiv
1405 DO j=1,lim - iend_block
1414 rmax = max(rmax,abs(rmax_norelax))
1415 IF ( abs(pivot).GE.uuloc*max(rmax,amax)
1416 & .AND. abs(pivot) .GT. max(seuil,tiny(rmax)) )
THEN
1419 & dkeep, keep, .false.)
1420 IF (keep(258) .NE.0 )
THEN
1425 IF (npivp1.EQ.iend_block)
THEN
1427 ELSE IF (jmax.EQ.0)
THEN
1430 IF (max(abs(pivot),rmax,amax).LE.tiny(rmax))
THEN
1434 & (keep(19).NE.0).AND.(max(amax,rmax,abs(pivot)).LE.seuil)
1439 IF (rmax.LT.amax)
THEN
1443 IF(int(pospv1-jj) .NE. ipiv-jmax)
THEN
1444 rmax = max(rmax,abs(a(jj)))
1448 DO j=1,iend_block-ipiv
1449 IF(ipiv+j .NE. jmax)
THEN
1450 rmax = max(abs(a(j1)),rmax)
1455 aposj = poselt + int(jmax-1,8)*lda8 + int(npiv,8)
1456 pospv2 = aposj + int(jmax - npivp1,8)
1457 IF (ipiv.LT.jmax)
THEN
1458 offdag = aposj + int(ipiv - npivp1,8)
1460 offdag = apos + int(jmax - npivp1,8)
1465 chunk = max(j1_end,1)
1466 IF (j1_end.GE.keep(360))
THEN
1468 chunk = max(keep(360)/2,(j1_end+nomp-1)/nomp)
1473 IF (jmax .LT. ipiv)
THEN
1477 DO k = 1, lim - jmax
1478 jj = jj_ini+ int(k,8)*nfront8
1479 IF (jmax+k.NE.ipiv)
THEN
1480 tmax=max(tmax,abs(a(jj)))
1484 DO kk = aposj, pospv2-1_8
1485 tmax = max(tmax,abs(a(kk)))
1490!$omp& reduction(max:tmax)
IF(omp_flag)
1492 jj = jj_ini + int(k,8)*nfront8
1493 tmax=max(tmax,abs(a(jj)))
1496 DO kk = aposj, pospv2 - 1_8
1497 IF (kk.NE.offdag)
THEN
1498 tmax = max(tmax,abs(a(kk)))
1502 IF (parpiv_t1.NE.0)
THEN
1503 tmax_norelax = max(seuil*uulocm1,
1504 & abs(real(a(aposmax+int(jmax,8))))
1507 tmax_norelax = seuil*uulocm1
1509 tmax = max(tmax,tmax_norelax)
1510 detpiv = a(pospv1)*a(pospv2) - a(offdag)**2
1511 absdetpiv = abs(detpiv)
1512 IF (seuil.GT.rzero)
THEN
1513 IF (sqrt(absdetpiv) .LE. seuil )
THEN
1517 maxpiv = max(abs(a(pospv1)),abs(a(pospv2)))
1518 IF (maxpiv.EQ.rzero) maxpiv = rone
1519 IF ((abs(a(pospv2))*rmax+amax*tmax)*uuloc.GT.
1520 & absdetpiv .OR. (absdetpiv .EQ. rzero) )
THEN
1523 IF ((abs(a(pospv1))*tmax+amax*rmax)*uuloc.GT.
1524 & absdetpiv .OR. (absdetpiv.EQ. rzero) )
THEN
1528 & ( sqrt(absdetpiv),
1529 & dkeep, keep, .false.)
1530 IF (keep(258) .NE.0 )
THEN
1534 nb22t1w = nb22t1w + 1
1537 inextpiv = max(npivp1+pivsiz, ipiv+1)
1540 IF (pivsiz .EQ. 2)
THEN
1542 lpiv =
min(ipiv,jmax)
1544 lpiv = max(ipiv,jmax)
1549 IF (lpiv.EQ.npivp1)
GOTO 416
1550 IF (keep(405) .EQ. 0)
THEN
1551 keep8(80) = keep8(80)+1
1554 keep8(80) = keep8(80)+1
1559 & ioldps, npivp1, lpiv, poselt, lim_swap,
1560 & lda, nfront, 1, parpiv_t1, keep(50),
1561 & keep(ixsz), -9999)
1563 IF (keep(50).NE.1 .AND. ooc_effective_on_front)
THEN
1565 & iw(i_pivr), nass, npivp1, lpiv, pp_lastpanelondisk,
1566 & pp_lastpivrptrindexfilled)
1570 IF(pivsiz .EQ. 2)
THEN
1571 a(poselt+(lda8+1_8)*int(npiv,8)+1_8) = detpiv
1575 IF (k206 .GE. 1)
THEN
1576 inextpiv=iend_block+1
1578 IF (iend_block.EQ.nass)
THEN
1588 is_maxfromm_avail = .false.
1592 & NFRONT,NASS,NPIV,INODE,
1594 & POSELT,IFINB,PIVSIZ,
1595 & MAXFROMM, IS_MAXFROMM_AVAIL, IS_MAX_USEFUL,
1596 & PARPIV_T1, LAST_ROW, IEND_BLR, NVSCHUR_K253,
1600 INTEGER,
intent(out):: IFINB
1601 INTEGER,
intent(in) :: INODE, NFRONT, NASS, NPIV
1602 INTEGER,
intent(in) :: IEND_BLOCK
1603 INTEGER,
intent(in) :: LDA
1604 INTEGER(8),
intent(in) :: LA
1605 COMPLEX,
intent(inout) :: A(LA)
1606 INTEGER,
intent(in) :: LAST_ROW
1607 INTEGER,
intent(in) :: IEND_BLR
1608 INTEGER(8) :: POSELT
1609 REAL,
intent(out) :: MAXFROMM
1610 LOGICAL,
intent(out) :: IS_MAXFROMM_AVAIL
1611 LOGICAL,
intent(in) ::
1612 INTEGER,
intent(in) :: PARPIV_T1
1613 INTEGER,
INTENT(in) ::
1614 LOGICAL,
intent(in) :: LR_ACTIVATED
1618 INTEGER(8) :: NFRONT8
1624 INTEGER(8) :: APOS, LPOS, LPOS1, LPOS2
1625 INTEGER(8) :: POSPV1, POSPV2
1626 INTEGER :: PIVSIZ,NPIV_NEW,J2,
1627 INTEGER(8) :: OFFDAG, OFFDAG_OLD, K1, K2, IROW
1629 INTEGER(8) :: J2_8, KU1, KU2
1631 INTEGER(8) :: IBEG, IEND, JJ_LOC, JJ, ROW_SHIFT
1632 INTEGER(8) :: IBEG_LOC, IEND_LOC
1634 COMPLEX SWOP,DETPIV,MULT1,MULT2
1635 INTEGER(8) :: APOSMAX
1637 include
'mumps_headers.h'
1638 parameter(one = (1.0e0,0.0e0),
1639 & zero = (0.0e0,0.0e0))
1641 nfront8 = int(nfront,8)
1642 npiv_new = npiv + pivsiz
1644 is_maxfromm_avail = .false.
1645 ncb1 = last_row - iend_block
1646 nel2 = iend_block - npiv_new
1648 IF (iend_block.EQ.nass)
THEN
1655 IF(pivsiz .EQ. 1)
THEN
1656 apos = poselt + int(npiv,8)*(nfront8 + 1_8)
1657 valpiv = one/a(apos)
1660 IF (nel2+ncb1.GT.0)
THEN
1665 k1pos = lpos+ int(i-1,8)*lda8
1666 a(apos+int(i,8))=a(k1pos)
1672 k1pos = lpos+ int(i-1,8)*lda8
1673 a(k1pos) = a(k1pos) * valpiv
1676 IF (.NOT. is_max_useful)
THEN
1678!$omp parallel
DO private(i,j2,j2_8,k1pos)
IF (omp_flag)
1683 DO i=j2, nel2 + ncb1
1684 k1pos = lpos+ int(i-1,8)*lda8
1685 a(k1pos+j2_8)=a(k1pos+j2_8)-(a(k1pos)*a(apos+j2_8))
1696 DO i=1, nel2 + ncb1 - nvschur_k253
1697 k1pos = lpos+ int(i-1,8)*lda8
1698 a(k1pos+1_8)=a(k1pos+1_8) - a(k1pos) * a(apos+1_8)
1699 maxfrommtmp=
max(maxfrommtmp, abs(a(k1pos+1_8)))
1702 is_maxfromm_avail = .true.
1703 maxfromm=
max(maxfromm, maxfrommtmp)
1704 IF (nvschur_k253.GT.0)
THEN
1705 DO i= nel2 + ncb1- nvschur_k253 +1, nel2 + ncb1
1706 k1pos = lpos+ int(i-1,8)*lda8
1707 a(k1pos+1_8)=a(k1pos+1_8) - a(k1pos) * a(apos+1_8)
1718 DO i=j2, nel2 + ncb1
1719 k1pos = lpos+ int(i-1,8)*lda8
1720 a(k1pos+j2_8)=a(k1pos+j2_8)-(a(k1pos)*a(apos+j2_8))
1729 IF (.NOT. is_max_useful)
THEN
1731 k1pos = lpos + int(i-1,8)*lda8
1732 a(apos+int(i,8))=a(k1pos)
1733 a(k1pos) = a(k1pos) * valpiv
1735 a(k1pos+jj)=a(k1pos+jj) - a(k1pos) * a(apos+jj)
1739 is_maxfromm_avail = .true.
1741 k1pos = lpos + int(i-1,8)*lda8
1742 a(apos+int(i,8))=a(k1pos)
1743 a(k1pos) = a(k1pos) * valpiv
1744 a(k1pos+1_8)=a(k1pos+1_8) - a(k1pos) * a(apos+1_8)
1745 maxfromm=
max( maxfromm,abs(a(k1pos+1_8)) )
1746 DO jj = 2_8, int(i,8)
1747 a(k1pos+jj)=a(k1pos+jj) - a(k1pos) * a(apos+jj)
1753 IF (.NOT. is_max_useful)
THEN
1755 DO i=nel2+1, nel2 + ncb1
1756 k1pos = lpos+ int(i-1,8)*lda8
1757 a(apos+int(i,8))=a(k1pos)
1758 a(k1pos) = a(k1pos) * valpiv
1759 DO jj = 1_8, int(nel2,8)
1760 a(k1pos+jj)=a(k1pos+jj) - a(k1pos) * a(apos+jj)
1769 DO i=nel2+1, nel2 + ncb1 - nvschur_k253
1770 k1pos = lpos+ int(i-1,8)*lda8
1771 a(apos+int(i,8))=a(k1pos)
1772 a(k1pos) = a(k1pos) * valpiv
1774 a(k1pos+1_8) = a(k1pos+1_8) - a(k1pos) * a(apos+1_8)
1775 maxfrommtmp=
max(maxfrommtmp, abs(a(k1pos+1_8)))
1776 DO jj = 2_8, int(nel2,8)
1777 a(k1pos+jj)=a(k1pos+jj) - a(k1pos) * a(apos+jj)
1782 DO i = nel2 + ncb1 - nvschur_k253 + 1, nel2 + ncb1
1783 k1pos = lpos+ int(i-1,8)*lda8
1784 a(apos+int(i,8))=a(k1pos)
1785 a(k1pos) = a(k1pos) * valpiv
1786 DO jj = 1_8, int(nel2,8)
1787 a(k1pos+jj)=a(k1pos+jj) - a(k1pos) * a(apos+jj)
1790 maxfromm=
max(maxfromm, maxfrommtmp)
1795 pospv1 = poselt + int(npiv,8)*(nfront8 + 1_8)
1796 pospv2 = pospv1 + nfront8 + 1_8
1797 offdag_old = pospv2 - 1_8
1798 offdag = pospv1 + 1_8
1801 a22 = a(pospv1)/detpiv
1803 a12 = -a(offdag_old)/detpiv
1804 a(offdag) = a(offdag_old)
1805 a(offdag_old) = zero
1806 lpos1 = pospv2 + lda8 - 1_8
1811 IF (nel2 + ncb1.NE.last_row-npiv_new)
CALL mumps_abort()
1813 CALL ccopy(last_row-npiv_new, a(lpos1), lda, a(pospv1+2_8), 1)
1814 CALL ccopy(last_row-npiv_new, a(lpos2), lda, a(pospv2+1_8), 1)
1819 DO j2=1, nel2 + ncb1
1821 ku1 = pospv1 + 2_8 + (j2_8-1_8)
1822 ku2 = pospv2 + 1_8 + (j2_8-1_8)
1823 k1 = lpos1 + (j2_8-1_8)*nfront8
1825 a(k1) = a11*a(ku1)+a12*a(ku2)
1826 a(k2) = a12*a(ku1)+a22*a(ku2)
1835 mult1 = -a(pospv1 + 2_8 + j2_8-1_8)
1838 DO i= j2, nel2 + ncb1
1839 k1 = lpos1 + (int(i,8)-1_8)*nfront8
1842 a(irow) = a(irow) + mult1*a(k1) +
1848 jj = pospv2 + nfront8-1_8
1854 mult1 = - (a11*a(k1)+a12*a(k2))
1855 mult2 = - (a12*a(k1)+a22*a(k2))
1856 a(pospv1 + 2_8 + (int(j2,8)-1_8)) = a(k1)
1857 a(pospv2 + 1_8 + (int(j2,8)-1_8)) = a(k2)
1860 DO irow = ibeg, iend
1861 a(irow) = a(irow) + mult1*a(k1) + mult2*a(k2)
1866 a( jj + 1_8 ) = -mult2
1867 ibeg = ibeg + nfront8
1868 iend = iend + nfront8 + 1_8
1874 DO j2 = 1,last_row-iend_block
1875 row_shift = (j2-1_8)*nfront8
1876 jj_loc = jj + row_shift
1877 ibeg_loc = ibeg + row_shift
1878 iend_loc = iend + row_shift
1881 mult1 = - (a11*a(k1)+a12*a(k2))
1882 mult2 = - (a12*a(k1)+a22*a(k2))
1883 a(pospv1 + 2_8 + nel2 + (j2-1_8)) = a(k1)
1884 a(pospv2 + 1_8 + nel2 + (j2-1_8)) = a(k2)
1887 DO irow = ibeg_loc, iend_loc
1888 a(irow) = a(irow) + mult1*a(k1) + mult2*a(k2)
1892 a( jj_loc ) = -mult1
1893 a( jj_loc + 1_8 ) = -mult2
1898 IF ((is_maxfromm_avail).AND.(nel2.GT.0))
THEN
1899 IF (parpiv_t1.NE.0)
THEN
1900 aposmax = poselt+lda8
1901 maxfromm =
max(maxfromm,
1909 & NFRONT,NASS,INODE,A,LA,
1913 & FIRST_ROW_TRSM, LAST_ROW_TRSM,
1914 & LAST_COL_GEMM, LAST_ROW_GEMM,
1915 & CALL_TRSM, CALL_GEMM, LR_ACTIVATED,
1916 & IW, LIW, OFFSET_IW
1919 INTEGER,
intent(in) :: NPIV
1920 INTEGER,
intent(in) :: NFRONT, NASS, IBEG_BLOCK, IEND_BLOCK
1921 INTEGER(8),
intent(in) :: LA
1922 COMPLEX,
intent(inout) :: A(LA)
1923 INTEGER,
intent(in) :: INODE
1924 INTEGER :: KEEP(500)
1925 INTEGER(8) :: KEEP8(150)
1926 INTEGER(8),
intent(in) :: POSELT
1927 INTEGER,
intent(in) :: LDA
1928 INTEGER,
intent(in) :: LAST_COL_GEMM
1929 INTEGER,
intent(in) :: LAST_ROW_GEMM, LAST_ROW_TRSM,
1931 LOGICAL,
intent(in) :: CALL_TRSM, CALL_GEMM, LR_ACTIVATED
1932 INTEGER :: OFFSET_IW, LIW
1935 INTEGER NPIV_BLOCK, NEL1
1937 INTEGER(8) :: LPOS, UPOS,
1942 include
'mumps_headers.h'
1943 parameter(one=(1.0e0,0.0e0), alpha=(-1.0e0,0.0e0))
1945 nel1 = last_col_gemm - iend_block
1946 nrhs_trsm = last_row_trsm-first_row_trsm
1947 npiv_block = npiv - ibeg_block + 1
1948 IF (npiv_block.EQ.0)
GO TO 500
1951 apos = poselt + lda8*int(ibeg_block-1,8) + int(ibeg_block-1,8)
1952 lpos = poselt + lda8*int(first_row_trsm,8)+int(ibeg_block-1,8)
1953 upos = poselt + lda8*int(ibeg_block-1,8)+int(first_row_trsm,8)
1954 CALL ctrsm(
'L',
'U',
'T',
'U', npiv_block, nrhs_trsm,
1955 & one, a(apos), lda, a(lpos), lda)
1957 & nfront, npiv_block, liw, iw, offset_iw, la, a,
1958 & poselt, lpos, upos, apos, .NOT.lr_activated)
1961#if defined(GEMMT_AVAILABLE)
1962 IF ( keep(421).EQ. -1)
THEN
1963 lpos = poselt + lda8*int(iend_block,8) + int(ibeg_block-1,8)
1964 upos = poselt + lda8*int(ibeg_block-1,8) + int(iend_block,8)
1965 apos = poselt + lda8*int(iend_block,8) + int(iend_block,8)
1966 CALL cgemmt(
'U',
'N',
'N', nel1,
1968 & alpha, a( upos ), lda,
1969 & a( lpos ), lda, one, a( apos ), lda )
1972 IF ( last_col_gemm - iend_block > keep(7) )
THEN
1975 blsize = last_col_gemm - iend_block
1977 IF ( last_col_gemm - iend_block .GT. 0 )
THEN
1978#if defined(SAK_BYROW)
1979 DO irow = iend_block+1, last_col_gemm, blsize
1980 block =
min( blsize, last_col_gemm - irow + 1 )
1981 lpos = poselt + int(irow - 1,8) * lda8 +
1982 & int(ibeg_block - 1,8)
1983 upos = poselt + int(ibeg_block - 1,8) * lda8 +
1985 apos = poselt + int(irow - 1,8) * lda8 +
1987 CALL cgemm(
'N',
'N', irow + block - iend_block - 1,
1988 & block, npiv_block,
1989 & alpha, a( upos ), lda,
1990 & a( lpos ), lda, one, a( apos ), lda )
1993 DO irow = iend_block+1, last_col_gemm, blsize
1994 block =
min( blsize, last_col_gemm - irow + 1 )
1995 lpos = poselt + int( irow - 1,8) * lda8 +
1996 & int(ibeg_block - 1,8)
1997 upos = poselt + int(ibeg_block - 1,8) * lda8 +
1999 apos = poselt + int( irow - 1,8) * lda8 + int( irow - 1,8)
2000 CALL cgemm(
'N',
'N', block, last_col_gemm - irow + 1,
2001 & npiv_block, alpha, a( upos ), lda,
2002 & a( lpos ), lda, one, a( apos ), lda )
2006#if defined(GEMMT_AVAILABLE)
2009 lpos = poselt + int(last_col_gemm,8)*lda8 + int(ibeg_block-1,8)
2010 upos = poselt + int(ibeg_block-1,8) * lda8 +
2012 apos = poselt + int(last_col_gemm,8)*lda8 + int(iend_block,8)
2013 IF (last_row_gemm .GT. last_col_gemm)
THEN
2014 CALL cgemm(
'N',
'N', nel1, last_row_gemm-last_col_gemm,
2015 & npiv_block, alpha, a(upos), lda, a(lpos), lda,
2016 & one, a(apos), lda)
2024 & IOLDPS, NPIVP1, IPIV, POSELT, LASTROW2SWAP,
2025 & LDA, NFRONT, LEVEL, PARPIV, K50, XSIZE,
2026 & IBEG_BLOCK_TO_SEND )
2028 INTEGER(8) :: POSELT, LA
2029 INTEGER LIW, IOLDPS, NPIVP1,
2030 INTEGER LDA, NFRONT, LEVEL, PARPIV, K50,
2031 INTEGER LASTROW2SWAP
2034 INTEGER,
INTENT(IN) :: IBEG_BLOCK_TO_SEND
2035 INCLUDE
'mumps_headers.h'
2037 INTEGER ISW, ISWPS1, ISWPS2, HF
2038 INTEGER(8) :: IDIAG, APOS
2042 apos = poselt + lda8*int(ipiv-1,8) + int(npivp1-1,8)
2043 idiag = apos + int(ipiv - npivp1,8)
2044 hf = 6 + iw( ioldps + 5 + xsize) + xsize
2045 iswps1 = ioldps + hf + npivp1 - 1
2046 iswps2 = ioldps + hf + ipiv - 1
2048 iw(iswps1) = iw(iswps2)
2050 isw = iw(iswps1+nfront)
2051 iw(iswps1+nfront) = iw(iswps2+nfront)
2052 iw(iswps2+nfront) = isw
2053 IF ( level .eq. 2 )
THEN
2054 ibeg = ibeg_block_to_send
2055 CALL cswap( npivp1 - 1 - ibeg + 1,
2056 & a( poselt + int(npivp1-1,8) +
2057 & int(ibeg-1,8) * lda8), lda,
2058 & a( poselt + int(ipiv-1,8) +
2059 & int(ibeg-1,8) * lda8), lda )
2061 CALL cswap( npivp1-1,
2062 & a( poselt+int(npivp1-1,8) * lda8 ), 1,
2063 & a( poselt + int(ipiv-1,8) * lda8 ), 1 )
2064 CALL cswap( ipiv - npivp1 - 1,
2065 & a( poselt+int(npivp1,8) * lda8 + int(npivp1-1,8) ),
2066 & lda, a( apos + 1_8 ), 1 )
2068 a(idiag) = a( poselt+int(npivp1-1,8)*lda8+int(npivp1-1,8) )
2069 a( poselt + int(npivp1-1,8)*lda8 + int(npivp1-1,8) ) = swop
2070 IF (lastrow2swap - ipiv.GT.0)
THEN
2071 CALL cswap( lastrow2swap - ipiv,
2072 & a( apos + lda8 ), lda,
2073 & a( idiag + lda8 ), lda )
2075 IF (parpiv.NE.0 .AND.k50.EQ.2)
THEN
2076 IF ( level .eq. 2 .OR. level.eq.1)
THEN
2077 apos = poselt+lda8*lda8-1_8
2078 swop = a(apos+int(npivp1,8))
2079 a(apos+int(npivp1,8))= a(apos+int(ipiv,8))
2080 a(apos+int(ipiv,8)) = swop
2086 & SIZECOPY, LDA, NCOLS, LIW, IW, OFFSET_IW,
2087 & LA, A, POSELT, A_LPOS, A_UPOS, A_DPOS,
2090 INTEGER,
INTENT(IN) :: IROWMAX, IROWMIN
2091 INTEGER,
INTENT(IN) :: SIZECOPY
2092 INTEGER,
INTENT(IN) :: LDA, NCOLS
2093 INTEGER,
INTENT(IN) ::
2094 INTEGER,
INTENT(IN) :: IW(LIW)
2095 INTEGER,
INTENT(IN) :: OFFSET_IW
2096 INTEGER(8),
INTENT(IN) :: LA
2097 COMPLEX,
INTENT(INOUT) :: A(LA)
2098 INTEGER(8),
INTENT(IN) :: POSELT, A_LPOS, A_UPOS, A_DPOS
2099 LOGICAL,
INTENT(IN) :: COPY_NEEDED
2100 INTEGER(8) :: LPOS, UPOS
2101 INTEGER(8) :: DPOS, POSPV1, POSPV2, OFFDAG
2103 INTEGER :: IROWEND, IROW, Block2
2105 COMPLEX :: MULT1, MULT2, A11, DETPIV, A22, A12
2106 INTEGER :: BLSIZECOPY
2108 parameter(one=(1.0e0,0.0e0))
2109 INTEGER(8) :: LPOSI, UPOSI
2110 LOGICAL :: PIVOT_2X2
2114 IF (sizecopy.NE.0)
THEN
2115 blsizecopy = sizecopy
2126 DO irowend = irowmax, irowmin, -blsizecopy
2127 block2 =
min(blsizecopy, irowend)
2128 irow = irowend - block2 + 1
2129 lpos = a_lpos + int(irow-1,8)*lda8
2130 upos = a_upos + int(irow-1,8)
2138 IF(iw(offset_iw+i-1) .LE. 0)
THEN
2142 IF (iw(offset_iw+i-2) .LE. 0)
THEN
2147 dpos = a_dpos + lda8*int(i-1,8) + int(i-1,8)
2148 IF(.not. pivot_2x2)
THEN
2150 lposi = lpos+int(i-1,8)
2151 IF (copy_needed)
THEN
2152 uposi = upos+int(i-1,8)*lda8
2157 a(uposi+int(j-1,8)) = a(lposi+int(j-1,8)*lda8)
2164 a(lposi+int(j-1,8)*lda8) = a(lposi+int(j-1,8)*lda8)*a11
2167 IF (copy_needed)
THEN
2168 CALL ccopy(block2, a(lpos+int(i-1,8)),
2169 & lda, a(upos+int(i-1,8)*lda8), 1)
2171 & lda, a(upos+int(i,8)*lda8), 1)
2174 pospv2 = dpos + int(lda+1,8)
2179 detpiv = a11*a22 - a12**2
2181 a11 = a(pospv2)/detpiv
2187 mult1 = a11*a(lpos+int(j-1,8)*lda8+int(i-1,8))
2188 & + a12*a(lpos+int(j-1,8)*lda8+int(i,8))
2189 mult2 = a12*a(lpos+int(j-1,8)*lda8+int(i-1,8))
2190 & + a22*a(lpos+int(j-1,8)*lda8+int(i,8))
2191 a(lpos+int(j-1,8)*lda8+int(i-1,8)) = mult1
2192 a(lpos+int(j-1,8)*lda8+int(i,8)) = mult2
2200 & SIZECOPY, LDA, NCOLS, LIW, IW, OFFSET_IW,
2201 & LA, A, POSELT, A_LPOS, A_UPOS, A_DPOS )
2203 INTEGER,
INTENT(IN) :: IROWMAX, IROWMIN
2204 INTEGER,
INTENT(IN) :: SIZECOPY
2205 INTEGER,
INTENT(IN) :: LDA, NCOLS
2206 INTEGER,
INTENT(IN) :: LIW
2207 INTEGER,
INTENT(IN) :: IW(LIW)
2208 INTEGER,
INTENT(IN) :: OFFSET_IW
2209 INTEGER(8),
INTENT(IN) :: LA
2210 COMPLEX,
INTENT(INOUT) :: A(LA)
2211 INTEGER(8),
INTENT(IN) :: POSELT, A_LPOS, A_UPOS, A_DPOS
2212 INTEGER(8) :: LPOS, UPOS
2213 INTEGER(8) :: DPOS, POSPV1, POSPV2, OFFDAG
2215 INTEGER :: IROWEND, IROW, Block2
2217 COMPLEX :: MULT1, MULT2, A11, A22, A12
2218 INTEGER :: BLSIZECOPY
2220 parameter(one=(1.0e0,0.0e0))
2221 INTEGER(8) :: LPOSI, UPOSI
2222 LOGICAL :: PIVOT_2X2
2226 IF (sizecopy.NE.0)
THEN
2227 blsizecopy = sizecopy
2238 DO irowend = irowmax, irowmin, -blsizecopy
2239 block2 =
min(blsizecopy, irowend)
2240 irow = irowend - block2 + 1
2241 lpos = a_lpos + int(irow-1,8)*lda8
2242 upos = a_upos + int(irow-1,8)
2250 IF(iw(offset_iw+i-1) .LE. 0)
THEN
2254 IF (iw(offset_iw+i-2) .LE. 0)
THEN
2259 dpos = a_dpos + lda8*int(i-1,8) + int(i-1,8)
2260 IF(.not. pivot_2x2)
THEN
2262 lposi = lpos+int(i-1,8)
2263 uposi = upos+int(i-1,8)*lda8
2268 a(uposi+int(j-1,8)) = a(lposi+int(j-1,8)*lda8)*a11
2272 pospv2 = dpos + int(lda+1,8)
2281 mult1 = a11*a(lpos+int(j-1,8)*lda8+int(i-1,8))
2282 & + a12*a(lpos+int(j-1,8)*lda8+int(i,8))
2283 mult2 = a12*a(lpos+int(j-1,8)*lda8+int(i-1,8))
2284 & + a22*a(lpos+int(j-1,8)*lda8+int
2285 a(upos+int(i-1,8)*lda8+int(j-1,8)) = mult1
2286 a(upos+int(i,8)*lda8+int(j-1,8)) = mult2
2297 & IOLDPS,POSELT,KEEP,KEEP8,
2298 & POSTPONE_COL_UPDATE, ETATASS,
2299 & TYPEFile, LAFAC, MonBloc, NextPiv2beWritten,
2300 & LIWFAC, MYID, IFLAG, OFFSET_IW, INODE )
2303 INTEGER NFRONT, NASS,LIW
2308 INTEGER(8) KEEP8(150)
2309 INTEGER(8) :: POSELT
2311 INTEGER IOLDPS, ETATASS
2312 LOGICAL POSTPONE_COL_UPDATE
2314 INTEGER TYPEFile, NextPiv2beWritten
2315 INTEGER LIWFAC, MYID, IFLAG
2316 TYPE(io_block):: MonBloc
2319 INTEGER :: OFFSET_IW
2320 INTEGER,
intent(in):: INODE
2321 INCLUDE
'mumps_headers.h'
2322 INTEGER(8) :: UPOS, APOS, LPOS
2324 INTEGER BLSIZE, BLSIZE2, Block, IROW, NPIV, IROWEND
2325 INTEGER I2, I2END, Block2
2326 COMPLEX ONE, ALPHA, BETA, ZERO
2327 parameter(one=(1.0e0,0.0e0), alpha=(-1.0e0,0.0e0))
2328 parameter(zero=(0.0e0,0.0e0))
2330 IF (etatass.EQ.1)
THEN
2335 IF ( nfront - nass > keep(58) )
THEN
2336 IF ( nfront - nass > keep(57) )
THEN
2339 blsize = (nfront - nass)/2
2342 blsize = nfront - nass
2345 npiv = iw( ioldps + 1 + keep(ixsz))
2346 IF ( nfront - nass .GT. 0 )
THEN
2347 IF ( postpone_col_update )
THEN
2348 lpos = poselt + lda8 * int(nass,8)
2349 CALL ctrsm(
'L',
'U',
'T',
'U',
2350 & npiv, nfront-nass, one,
2354#if defined(GEMMT_AVAILABLE)
2355 IF ( keep(421).EQ. -1)
THEN
2356 lpos = poselt + int(nass,8)*lda8
2357 upos = poselt + int(nass,8)
2358 apos = poselt + int(nass,8)*lda8 + int(nass,8)
2359 IF (postpone_col_update)
THEN
2361 & keep(424), nfront, npiv,
2362 & liw, iw, offset_iw, la, a, poselt, lpos, upos,
2365 CALL cgemmt(
'U',
'N',
'N', nfront-nass, npiv,
2366 & alpha, a( upos ), lda,
2372 DO irowend = nfront - nass, 1, -blsize
2373 block =
min( blsize, irowend )
2374 irow = irowend - block + 1
2375 lpos = poselt + int(nass,8)*lda8 + int(irow-1,8) * lda8
2376 apos = poselt + int(nass,8)*lda8 + int(irow-1,8) * lda8 +
2377 & int(nass + irow - 1,8)
2378 upos = poselt + int(nass,8)
2379 IF (.NOT. postpone_col_update)
THEN
2380 upos = poselt + int(nass + irow - 1,8)
2382 IF (postpone_col_update)
THEN
2384 & keep(424), nfront, npiv,
2385 & liw, iw, offset_iw, la, a, poselt, lpos, upos,
2388 DO i2end = block, 1, -blsize2
2389 block2 =
min(blsize2, i2end)
2390 i2 = i2end - block2+1
2391 CALL cgemm(
'N',
'N', block2, block-i2+1, npiv, alpha,
2392 & a(upos+int(i2-1,8)), lda,
2393 & a(lpos+int(i2-1,8)*lda8), lda,
2395 & a(apos + int(i2-1,8) + int(i2-1,8)*lda8), lda)
2396 IF (keep(201).EQ.1)
THEN
2397 IF (nextpiv2bewritten.LE.npiv)
THEN
2400 & strat_try_write, typefile,
2401 & a(poselt), lafac, monbloc,
2402 & nextpiv2bewritten, idummy,
2403 & iw(ioldps), liwfac, myid,
2410 IF ( nfront - nass - irow + 1 - block > 0 )
THEN
2411 CALL cgemm(
'N',
'N', block, nfront-nass-block-irow+1, npiv,
2412 & alpha, a( upos ), lda,
2413 & a( lpos + lda8 * int(block,8) ), lda,
2415 & a( apos + lda8 * int(block,8) ), lda )
2418#if defined(GEMMT_AVAILABLE)
2421 IF ( (postpone_col_update).AND.(nass-npiv.GT.0) )
THEN
2422 lpos = poselt + int(npiv,8)*lda8
2423 upos = poselt + int(npiv,8)
2425 & keep(424), nfront, npiv,
2426 & liw, iw, offset_iw, la, a, poselt, lpos, upos, poselt)
2427 lpos = poselt + lda8 * int(nass,8)
2428 CALL cgemm(
'N''N', nass-npiv, nfront-nass, npiv, alpha,
2429 & a( poselt + int(npiv,8)), lda,
2432 & a( lpos + int(npiv,8) ), lda)
2438 & K, P, LastPanelonDisk,
2439 & LastPIVRPTRIndexFilled )
2441 INTEGER,
intent(in) :: NBPANELS, NASS, K, P
2442 INTEGER,
intent(inout) :: PIVRPTR(NBPANELS), PIVR(NASS)
2443 INTEGER LastPanelonDisk, LastPIVRPTRIndexFilled
2445 IF ( LastPanelonDisk+1 > NBPANELS ) THEN
2446 WRITE(*,*)
"INTERNAL ERROR IN CMUMPS_STORE_PERMINFO!"
2447 WRITE(*,*)
"NASS=",nass,
"PIVRPTR=",pivrptr(1:nbpanels)
2448 WRITE(*,*)
"K=",k,
"P=",p,
"LastPanelonDisk=",lastpanelondisk
2449 WRITE(*,*)
"LastPIVRPTRIndexFilled=", lastpivrptrindexfilled
2452 pivrptr(lastpanelondisk+1) = k + 1
2453 IF (lastpanelondisk.NE.0)
THEN
2454 pivr(k - pivrptr(1) + 1) = p
2455 DO i = lastpivrptrindexfilled + 1, lastpanelondisk
2456 pivrptr(i)=pivrptr(lastpivrptrindexfilled)
2459 lastpivrptrindexfilled = lastpanelondisk + 1
2463 & ( diag, dkeep, keep, nullpivot)
2466 REAL,
INTENT(IN) :: DIAG
2467 REAL,
INTENT(INOUT) :: DKEEP(230)
2468 LOGICAL,
INTENT(IN) :: NULLPIVOT
2469 INTEGER,
INTENT(IN) :: KEEP(500)
2470 IF (KEEP(405).EQ.0) THEN
2471 DKEEP(21) =
max(dkeep(21), diag)
2472 dkeep(19) =
min(dkeep(19), diag)
2473 IF (.NOT.nullpivot)
THEN
2474 dkeep(20) =
min(dkeep(20), diag)
2478 dkeep(21) =
max(dkeep(21), diag)
2481 dkeep(19) =
min(dkeep(19), diag)
2483 IF (.NOT.nullpivot)
THEN
2485 dkeep(20) =
min(dkeep(20), diag)
2492 & N, NCB, SIZE_SCHUR, ROW_INDICES, PERM,
2496 INTEGER,
intent(in) :: N, NCB, SIZE_SCHUR
2497 INTEGER,
intent(in) :: ROW_INDICES(NCB)
2498INTEGER,
intent(out):: NVSCHUR
2499 INTEGER :: I, IPOS, IBEG_SCHUR
2500 IBEG_SCHUR = n - size_schur +1
2504 IF (abs(row_indices(i)).LE.n)
THEN
2505 IF (perm(row_indices(i)).LT.ibeg_schur)
EXIT
subroutine cmumps_updatedeter(piv, deter, nexp)
subroutine cmumps_get_ooc_perm_ptr(typef, nbpanels, i_pivptr, i_piv, ipos, iw, liw)
subroutine cswap(n, cx, incx, cy, incy)
CSWAP
subroutine ccopy(n, cx, incx, cy, incy)
CCOPY
subroutine cgeru(m, n, alpha, x, incx, y, incy, a, lda)
CGERU
subroutine ctrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
CTRSM
subroutine cgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
CGEMM
subroutine cmumps_fac_sq_ldlt(ibeg_block, iend_block, npiv, nfront, nass, inode, a, la, lda, poselt, keep, keep8, first_row_trsm, last_row_trsm, last_col_gemm, last_row_gemm, call_trsm, call_gemm, lr_activated, iw, liw, offset_iw)
subroutine cmumps_fac_mq_ldlt(iend_block, nfront, nass, npiv, inode, a, la, lda, poselt, ifinb, pivsiz, maxfromm, is_maxfromm_avail, is_max_useful, parpiv_t1, last_row, iend_blr, nvschur_k253, lr_activated)
subroutine cmumps_get_size_schur_in_front(n, ncb, size_schur, row_indices, perm, nvschur)
subroutine cmumps_fac_n(nfront, nass, iw, liw, a, la, ioldps, poselt, ifinb, xsize, keep, maxfromn, is_maxfromn_avail, nvschur)
subroutine cmumps_fac_t(a, la, npivb, nfront, npiv, nass, poselt)
subroutine cmumps_fac_sq(ibeg_block, iend_block, npiv, nfront, last_row, last_col, a, la, poselt, first_col, call_ltrsm, call_utrsm, call_gemm, with_comm_thread, lr_activated)
subroutine cmumps_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)
subroutine cmumps_fac_pt_setlock427(k427_out, k427, k405, k222, nel1, nass)
subroutine cmumps_fac_i(nfront, nass, last_row, ibeg_block, iend_block, n, inode, iw, liw, a, la, inopv, noffw, nbtinyw, det_expw, det_mantw, det_signw, iflag, ioldps, poselt, uu, seuil, keep, keep8, dkeep, pivnul_list, lpn_list pp_first2swap_l, pp_lastpanelondisk_l, pp_lastpivrptrfilled_l, pp_first2swap_u, pp_lastpanelondisk_u, pp_lastpivrptrfilled_u, pivot_option, lr_activated, iend_blr, inextpiv, ooc_effective_on_front, nvschur, parpiv_t1, tipiv)
subroutine cmumps_store_perminfo(pivrptr, nbpanels, pivr, nass, k, p, lastpanelondisk, lastpivrptrindexfilled)
subroutine cmumps_fac_ldlt_copy2u_scalel(irowmax, irowmin, sizecopy, lda, ncols, liw, iw, offset_iw, la, a, poselt, a_lpos, a_upos, a_dpos, copy_needed)
subroutine cmumps_fac_ldlt_copyscale_u(irowmax, irowmin, sizecopy, lda, ncols, liw, iw, offset_iw, la, a, poselt, a_lpos, a_upos, a_dpos)
subroutine cmumps_fac_fr_update_cbrows(inode, nfront, nass, call_utrsm, a, la, lafac, poselt, iw, liw, ioldps, monbloc, myid, noffw, det_expw, det_mantw, det_signw, liwfac, pp_first2swap_l, pp_first2swap_u, lnextpiv2bewritten, unextpiv2bewritten, pp_lastpivrptrfilled_l, pp_lastpivrptrfilled_u xsize, seuil, uu, dkeep, keep8, keep, iflag, ooc_effective_on_front, nvschur)
subroutine cmumps_fac_i_ldlt(nfront, nass, inode, ibeg_block, iend_block, iw, liw, a, la, inopv, nnegw, nb22t1w, nbtinyw, det_expw, det_mantw, det_signw, iflag, ioldps, poselt, uu, seuil, keep, keep8, pivsiz, dkeep, pivnul_list, lpn_list, xsize, pp_first2swap_l, pp_lastpanelondisk, pp_lastpivrptrindexfilled, maxfromm, is_maxfromm_avail, pivot_option, iend_blr, inextpiv, ooc_effective_on_front, nvschur, parpiv_t1, lr_activated)
subroutine cmumps_fac_p(a, la, nfront, npiv, nass, poselt, call_utrsm, keep, inode, call_ooc, iwfac, liwfac, lafac, monbloc, myid, keep8, lnextpiv2bewritten, unextpiv2bewritten, iflag)
subroutine cmumps_swap_ldlt(a, la, iw, liw, ioldps, npivp1, ipiv, poselt, lastrow2swap, lda, nfront, level, parpiv, k50, xsize, ibeg_block_to_send)
subroutine cmumps_fac_t_ldlt(nfront, nass, iw, liw, a, la, lda, ioldps, poselt, keep, keep8, postpone_col_update, etatass, typefile, lafac, monbloc, nextpiv2bewritten, liwfac, myid, iflag, offset_iw, inode)
subroutine cmumps_fac_mq(ibeg_block, iend_block, nfront, nass, npiv, last_col, a, la, poselt, ifinb, lr_activated)
subroutine cmumps_update_minmax_pivot(diag, dkeep, keep, nullpivot)
subroutine, public cmumps_ooc_io_lu_panel(strat, typefile, afac, lafac, monbloc, lnextpiv2bewritten, unextpiv2bewritten, iw, liwfac, myid, filesize, ierr, last_call)
integer, parameter, public typef_both_lu
integer, public strat_try_write