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)
33 DOUBLE PRECISION :: DKEEP(230)
34 DOUBLE PRECISION UU, SEUIL
35 DOUBLE PRECISION A(LA)
37 DOUBLE PRECISION,
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
42 DOUBLE PRECISION AMROW
43 DOUBLE PRECISION RMAX, SEUIL_LOC
45 INTEGER(8) :: , 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 DOUBLE PRECISION,
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, PP_LastPanelonDisk_L,
60 & pp_lastpivrptrfilled_l,
61 & pp_first2swap_u, pp_lastpanelondisk_u,
62 & pp_lastpivrptrfilled_u
65 include
'mumps_headers.h'
67 DOUBLE PRECISION,
PARAMETER :: RZERO = 0.0d0
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 = dmumps_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
137!$omp& reduction(
max:rmax)
IF (j3.GE.k360)
139 rmax =
max(abs(a(j1_ini + int(j-1,8) * nfront8)),
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)
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,,IFINB
244 DOUBLE PRECISION A(LA)
246 DOUBLE PRECISION ALPHA,VALPIV
247 INTEGER(8) :: APOS, POSELT, UUPOS, LPOS, IRWPOS
248 INTEGER(8) :: NFRONT8
249 INTEGER IOLDPS,NPIV,XSIZE
250 INTEGER,
intent(in) :: KEEP(500)
251 DOUBLE PRECISION,
intent(inout) :: MAXFROMN
252 LOGICAL,
intent(inout) :: IS_MAXFROMN_AVAIL
253 INTEGER,
intent(in) :: NVSCHUR
254 INTEGER NEL,IROW,NEL2,JCOL,NELMAXM
256 DOUBLE PRECISION,
PARAMETER :: ONE = 1.0d0
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.
295!$omp& firstprivate(apos,nfront8,valpiv,nel,nel2)
296!$omp& reduction(
max:maxfromn)
IF(omp_flag)
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) :: LA,POSELT,LAFAC
358 DOUBLE PRECISION A(LA)
359 INTEGER NFRONT, NPIV,
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
372 DOUBLE PRECISION ALPHA, ONE
373 parameter(one = 1.0d0, alpha=-1.0d0)
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 dtrsm(
'R',
'U',
'N',
'U', nel1, npiv, one,
383 & a(poselt), nfront, a(upos), nfront)
385 CALL dtrsm(
'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 dgemm(
'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 dgemm(
'N',
'N',nel1,nass-npiv,npiv,alpha,a(upos),
406 & nfront,a(lpos2),nfront,one,a(lpos),nfront)
416 DOUBLE PRECISION A(LA)
417 INTEGER(8) :: APOS, POSELT
418 INTEGER NFRONT, NPIV, NASSL
419 INTEGER(8) :: LPOS, LPOS1, LPOS2
420 INTEGER NEL1, NEL11, NPIVE
421 DOUBLE PRECISION ALPHA, ONE
422 parameter(one = 1.0d0, alpha=-1.0d0)
424 nel11 = nfront - npiv
427 apos = poselt + int(npivb,8)*int(nfront,8)
429 lpos2 = apos + int(nassl,8)
430 CALL dtrsm(
'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 dgemm(
'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 DOUBLE PRECISION,
intent(inout) :: A(LA)
453 INTEGER(8),
intent(in) :: POSELT
454 LOGICAL,
intent(in) :: CALL_LTRSM, CALL_UTRSM,
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
459 DOUBLE PRECISION ALPHA, ONE
460 PARAMETER (ONE = 1.0d0, alpha=-1.0d0)
464 nfront8= int(nfront,8)
465 nelim = iend_block - npiv
466 nel1 = last_row - iend_block
469 &
"Internal error 1 in DMUMPS_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 dtrsm(
'L',
'L',
'N',
'N',lkjiw,nel1,one,
484 & a(poselt_local),nfront,
488 CALL dtrsm(
'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 dgemm(
'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 dgemm(
'N',
'N',nel11,nel1,lkjiw,alpha,a(lpos1),
501 & nfront,a(lpos2),nfront,one,a(lpos),nfront)
513#if defined(WORKAROUNDINTELILP64OPENMPLIMITATION)
519 CALL dtrsm(
'L',
'L',
'N',
'N',lkjiw,nel1,one,
520 & a(poselt_local),nfront,
524 CALL dtrsm(
'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 dgemm(
'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 dgemm(
'N',
'N',nel11,nel1,lkjiw,alpha,a(lpos1),
537 & nfront,a(lpos2),nfront,one,a(lpos),nfront)
549#if defined(WORKAROUNDINTELILP64OPENMPLIMITATION)
550!$
CALL omp_set_num_threads(int(nomp,4))
556 IF (call_utrsm.AND.utrsm_ncols.NE.0)
THEN
557 CALL dtrsm(
'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 dgemm(
'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,
576 INTEGER,
intent(out) ::
577 INTEGER(8),
intent(in) :: LA, POSELT
578 DOUBLE PRECISION,
intent(inout) :: A(LA)
579 LOGICAL,
intent(in) :: LR_ACTIVATED
580 DOUBLE PRECISION :: VALPIV
581 INTEGER(8) :: APOS, UUPOS, LPOS
582 INTEGER(8) :: NFRONT8
583 DOUBLE PRECISION :: ONE, ALPHA
584 INTEGER :: NEL2,NPIVP1,KROW,
585 parameter(one = 1.0d0, alpha=-1.0d0)
586 nfront8= int(nfront,8)
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 dger(nel,nel2,alpha,a(uupos),1,a(lpos),nfront,
609 & a(lpos+1_8),nfront)
611 CALL dgemm(
'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 DOUBLE PRECISION,
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 DOUBLE PRECISION,
intent(inout) :: A()
643 DOUBLE PRECISION,
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
652 DOUBLE PRECISION :: MAXFROMN
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 DOUBLE PRECISION,
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 DOUBLE PRECISION,
intent(inout) ::
731 DOUBLE PRECISION,
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) :: (LPN_LIST)
739 DOUBLE PRECISION DKEEP(230)
740 INTEGER , 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'
751 DOUBLE PRECISION SWOP
753 INTEGER(8) :: APOS, IDIAG
754 INTEGER(8) :: J1, J2, JJ, J3
755 INTEGER(8) :: NFRONT8
757 DOUBLE PRECISION ZERO
758 PARAMETER( ZERO = 0.0d0 )
759 DOUBLE PRECISION RZERO, RMAX, AMROW, MAX_PREV_in_PARPIV
760 INTEGER(8) :: APOSMAX, APOSROW
762 DOUBLE PRECISION PIVNUL, ABS_PIVOT
763 DOUBLE PRECISION FIXA, CSEUIL, PIVOT
764 INTEGER NPIV,IPIV, LRLOC
765 INTEGER NPIVP1,JMAX,J,ISW,ISWPS1
766 INTEGER ISWPS2,KSW, HF, IPIVNUL
767 INTEGER DMUMPS_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, , NBPANELS_U
778 nomp = omp_get_max_threads()
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 (dble(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 (dble(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 = dmumps_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
919 abs_pivot = abs(a(idiag))
920 IF (parpiv_t1.NE.0)
THEN
921 rmax_norelax = dble(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
933 IF (iend_block.NE.nass )
THEN
936 j1=poselt+int(ipiv-1,8)+int(npiv,8)*nfront8
937 j2=poselt+int(ipiv-1,8)+int(lrloc-1,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 & dble(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(dble(fixa).GT.rzero)
THEN
971 IF(dble(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 DOUBLE PRECISION,
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
1116 DOUBLE PRECISION A(LA)
1117 DOUBLE PRECISION UU, UULOC, SEUIL
1120 INTEGER(8) KEEP8(150)
1122 INTEGER PIVNUL_LIST()
1123 DOUBLE PRECISION DKEEP(230)
1124 INTEGER PP_FIRST2SWAP_L, PP_LastPanelonDisk
1125 INTEGER PP_LastPIVRPTRIndexFilled
1126 DOUBLE PRECISION,
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 DOUBLE PRECISION RMAX,AMAX,TMAX, MAX_PREV_in_PARPIV, ABS_PIVOT
1135 DOUBLE PRECISION RMAX_NORELAX, TMAX_NORELAX, UULOCM1
1136 INTEGER(8) :: APOSMAX, APOSROW
1137 DOUBLE PRECISION MAXPIV
1138 DOUBLE PRECISION PIVNUL
1139 DOUBLE PRECISION MAXFROMM_UPDATED
1140 DOUBLE PRECISION FIXA, CSEUIL
1141 DOUBLE PRECISION PIVOT,DETPIV
1142 DOUBLE PRECISION ABSDETPIV
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
1153 DOUBLE PRECISION ZERO, ONE
1154 parameter( zero = 0.0d0 )
1155 parameter( one = 1.0d0 )
1156 DOUBLE PRECISION RZERO,RONE
1157 parameter(rzero=0.0d0, rone=1.0d0)
1160 INTEGER :: NOMP, CHUNK, J1_end
1162 INTEGER I_PIVRPTR, I_PIVR, NBPANELS_L
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(dble(a(apos)) .GE. rzero)
THEN
1199 nbtinyw = nbtinyw + 1
1201 IF (keep(258) .NE. 0)
THEN
1205 IF (keep(50).NE.1 .AND. ooc_effective_on_front)
THEN
1207 & iw(i_pivr), nass, npivp1, npivp1,
1208 & pp_lastpanelondisk,
1209 & pp_lastpivrptrindexfilled)
1215 ipiv_end = iend_block
1217 IF (inextpiv.GT.npivp1.AND.inextpiv.LE.iend_block)
THEN
1218 ishift = inextpiv - npivp1
1221 & .OR. (k206 .GT.1 .AND. iend_block.EQ.iend_blr) )
THEN
1222 ipiv_end = iend_block + ishift
1224 IF (ishift.GT.0.AND.is_maxfromm_avail)
THEN
1226 apos = poselt + lda8*int(ipiv-1,8) + int(npiv,8)
1227 pospv1 = apos + int(ipiv - npivp1,8)
1230 IF (parpiv_t1.NE.0)
THEN
1231 maxfromm_updated =
max
1233 & abs(dble(a(aposmax+int(ipiv,8))))
1236 maxfromm_updated = maxfromm
1238 IF ( (abs(pivot) .GE. uuloc*maxfromm_updated).AND.
1239 & abs(pivot) .GT.
max(seuil,tiny
1245 IF ( ishift .GT. 0)
THEN
1246 is_maxfromm_avail = .false.
1249 DO 460 ipiv_shift = npivp1+ishift, ipiv_end
1250 IF (ipiv_shift .LE. iend_block)
THEN
1253 ipiv = ipiv_shift-iend_block-1+npivp1
1254 IF (ibeg_block.EQ.npivp1)
THEN
1258 apos = poselt + lda8*int(ipiv-1,8) + int(npiv,8)
1259 pospv1 = apos + int(ipiv - npivp1,8)
1261 abs_pivot = abs(pivot)
1262 IF (uuloc.EQ.rzero.OR.pivot_option.EQ.0
THEN
1263 IF(abs_pivot.LT.seuil)
THEN
1265 & ( abs_pivot, dkeep, keep, .true.)
1266 IF(dble(pivot) .GE. rzero)
THEN
1272 nbtinyw = nbtinyw + 1
1273 ELSE IF (abs_pivot.EQ.rzero)
THEN
1276 IF (pivot.LT.rzero) nnegw = nnegw+1
1278 & ( abs_pivot, dkeep, keep, .false.)
1279 IF (keep(258) .NE. 0)
THEN
1285 IF ( is_maxfromm_avail )
THEN
1286 IF ( maxfromm .GT. pivnul )
THEN
1287 IF (parpiv_t1.NE.0)
THEN
1288 maxfromm_updated =
max
1290 & abs(dble(a(aposmax+int(ipiv,8))))
1293 maxfromm_updated = maxfromm
1295 IF ( (abs_pivot .GE. uuloc*maxfromm_updated).AND.
1296 & (abs_pivot .GT.
max(seuil,tiny(maxfromm_updated)))
1298 IF (pivot .LT. rzero) nnegw = nnegw+1
1301 & dkeep, keep, .false.)
1302 IF (keep(258) .NE. 0)
THEN
1308 is_maxfromm_avail = .false.
1312 IF (pivot_option.EQ.3
1314 lim = nfront - keep(253)-nvschur
1315 ELSEIF (pivot_option.GE.2
1318 ELSEIF (pivot_option.GE.1)
THEN
1321 write(*,*)
'Internal error in FAC_I_LDLT 1x1:',
1328 IF(abs(a(jj)) .GT. amax)
THEN
1330 jmax = ipiv - int(pospv1-jj)
1334 DO j=1, iend_block - ipiv
1335 IF(abs(a(j1)) .GT. amax)
THEN
1344 j1_end = lim - iend_block
1345 chunk =
max(j1_end,1)
1346 IF ( j1_end.GE.keep(360))
THEN
1348 chunk =
max(keep(360)/2,(j1_end+nomp-1)/nomp)
1355 DO j=1, lim - iend_block
1356 j1 = j1_ini + int(j-1,8) * lda8
1357 rmax =
max(abs(a(j1)),rmax)
1360 IF (parpiv_t1.NE.0)
THEN
1361 rmax_norelax = dble(a(aposmax+int(ipiv,8)))
1363 rmax_norelax = rzero
1365 rmax =
max(rmax,rmax_norelax)
1366 IF (
max(amax,rmax,abs(pivot)).LE.pivnul)
THEN
1367 IF ((parpiv_t1.NE.0)
1368 & .AND.(parpiv_t1.NE.-1)
1369 & .AND.(rmax_norelax.LT.0)
1370 & .AND.(ipiv.GT.1))
THEN
1371 max_prev_in_parpiv = rzero
1373 max_prev_in_parpiv=
max( max_prev_in_parpiv,
1374 & dble(a(aposmax+int(jj,8))) )
1376 IF (max_prev_in_parpiv.GT.pivnul)
THEN
1377 aposrow = poselt + nfront8*int(ipiv-1,8)
1379 IF (abs(a(aposrow+jj-1)).GT.pivnul)
THEN
1386 & ( abs(a(pospv1)), dkeep, keep, .true.)
1388 keep(109) = keep(109) + 1
1391 pivnul_list(ipivnul) = iw( ioldps+hf
1392 IF(dble(fixa).GT.rzero)
THEN
1393 IF(dble(pivot) .GE. rzero)
THEN
1405 DO j=1, iend_block - ipiv
1409 DO j=1,lim - iend_block
1418 rmax =
max(rmax,abs(rmax_norelax))
1419 IF ( abs(pivot).GE.uuloc*
max(rmax,amax)
1420 & .AND. abs(pivot) .GT.
max(seuil,tiny(rmax)) )
THEN
1421 IF (pivot .LT. zero) nnegw = nnegw+1
1424 & dkeep, keep, .false.)
1425 IF (keep(258) .NE.0 )
THEN
1430 IF (npivp1.EQ.iend_block)
THEN
1432 ELSE IF (jmax.EQ.0)
THEN
1435 IF (
max(abs(pivot),rmax,amax).LE.tiny(rmax))
THEN
1439 & (keep(19).NE.0).AND.(
max(amax,rmax,abs(pivot)).LE.seuil)
1444 IF (rmax.LT.amax)
THEN
1448 IF(int(pospv1-jj) .NE. ipiv-jmax)
THEN
1449 rmax =
max(rmax,abs(a(jj)))
1453 DO j=1,iend_block-ipiv
1454 IF(ipiv+j .NE. jmax)
THEN
1455 rmax =
max(abs(a(j1)),rmax)
1460 aposj = poselt + int(jmax-1,8)*lda8 + int(npiv,8)
1461 pospv2 = aposj + int(jmax - npivp1,8)
1462 IF (ipiv.LT.jmax)
THEN
1463 offdag = aposj + int(ipiv - npivp1,8)
1465 offdag = apos + int(jmax - npivp1,8)
1470 chunk =
max(j1_end,1)
1471 IF (j1_end.GE.keep(360))
THEN
1473 chunk =
max(keep(360)/2,(j1_end+nomp-1)/nomp)
1478 IF (jmax .LT. ipiv)
THEN
1482 DO k = 1, lim - jmax
1483 jj = jj_ini+ int(k,8)*nfront8
1484 IF (jmax+k.NE.ipiv)
THEN
1485 tmax=
max(tmax,abs(a(jj)))
1489 DO kk = aposj, pospv2-1_8
1490 tmax =
max(tmax,abs(a(kk)))
1497 jj = jj_ini + int(k,8)*nfront8
1498 tmax=
max(tmax,abs(a(jj)))
1501 DO kk = aposj, pospv2 - 1_8
1502 IF (kk.NE.offdag)
THEN
1503 tmax =
max(tmax,abs(a(kk)))
1507 IF (parpiv_t1.NE.0)
THEN
1508 tmax_norelax =
max(seuil*uulocm1,
1509 & abs(dble(a(aposmax+int(jmax,8))))
1512 tmax_norelax = seuil*uulocm1
1514 tmax =
max(tmax,tmax_norelax)
1515 detpiv = a(pospv1)*a(pospv2) - a(offdag)**2
1516 absdetpiv = abs(detpiv)
1517 IF (seuil.GT.rzero)
THEN
1518 IF (sqrt(absdetpiv) .LE. seuil )
THEN
1522 maxpiv =
max(abs(a(pospv1)),abs(a(pospv2)))
1523 IF (maxpiv.EQ.rzero) maxpiv = rone
1524 IF ((abs(a(pospv2))*rmax+amax*tmax)*uuloc.GT.
1525 & absdetpiv .OR. (absdetpiv .EQ. rzero) )
THEN
1528 IF ((abs(a(pospv1))*tmax+amax*rmax)*uuloc.GT.
1529 & absdetpiv .OR. (absdetpiv.EQ. rzero) )
THEN
1533 & ( sqrt(absdetpiv),
1534 & dkeep, keep, .false.)
1535 IF (keep(258) .NE.0 )
THEN
1539 nb22t1w = nb22t1w + 1
1540 IF(detpiv .LT. rzero)
THEN
1542 ELSE IF(a(pospv2) .LT. rzero)
THEN
1547 inextpiv =
max(npivp1+pivsiz, ipiv+1)
1550 IF (pivsiz .EQ. 2)
THEN
1552 lpiv =
min(ipiv,jmax)
1554 lpiv =
max(ipiv,jmax)
1559 IF (lpiv.EQ.npivp1)
GOTO 416
1560 IF (keep(405) .EQ. 0)
THEN
1561 keep8(80) = keep8(80)+1
1564 keep8(80) = keep8(80)+1
1569 & ioldps, npivp1, lpiv, poselt, lim_swap,
1571 & keep(ixsz), -9999)
1573 IF (keep(50).NE.1 .AND. ooc_effective_on_front)
THEN
1575 & iw(i_pivr), nass, npivp1, lpiv, pp_lastpanelondisk,
1576 & pp_lastpivrptrindexfilled)
1580 IF(pivsiz .EQ. 2)
THEN
1581 a(poselt+(lda8+1_8)*int(npiv,8)+1_8) = detpiv
1585 IF (k206 .GE. 1)
THEN
1586 inextpiv=iend_block+1
1588 IF (iend_block.EQ.nass)
THEN
1598 is_maxfromm_avail = .false.
1602 & NFRONT,NASS,NPIV,INODE,
1604 & POSELT,IFINB,PIVSIZ,
1605 & MAXFROMM, IS_MAXFROMM_AVAIL, IS_MAX_USEFUL,
1606 & PARPIV_T1, LAST_ROW, IEND_BLR, NVSCHUR_K253,
1610 INTEGER,
intent(out):: IFINB
1611 INTEGER,
intent(in) :: INODE, NFRONT, NASS, NPIV
1612 INTEGER,
intent(in) :: IEND_BLOCK
1613 INTEGER,
intent(in) :: LDA
1614 INTEGER(8),
intent(in) :: LA
1615 DOUBLE PRECISION,
intent(inout) :: A()
1616 INTEGER,
intent(in) :: LAST_ROW
1617 INTEGER,
intent(in) :: IEND_BLR
1618 INTEGER(8) :: POSELT
1619 DOUBLE PRECISION,
intent(out) :: MAXFROMM
1620 LOGICAL,
intent(out) :: IS_MAXFROMM_AVAIL
1621 LOGICAL,
intent(in) :: IS_MAX_USEFUL
1622 INTEGER,
intent(in) :: PARPIV_T1
1623 INTEGER,
INTENT(in) :: NVSCHUR_K253
1624 LOGICAL,
intent(in) :: LR_ACTIVATED
1625 DOUBLE PRECISION VALPIV
1626 DOUBLE PRECISION :: MAXFROMMTMP
1628 INTEGER(8) :: NFRONT8
1632 DOUBLE PRECISION ONE, ZERO
1633 DOUBLE PRECISION A11,A22,A12
1634 INTEGER(8) :: APOS, LPOS, LPOS1, LPOS2
1635 INTEGER(8) :: POSPV1, POSPV2
1636 INTEGER :: PIVSIZ,NPIV_NEW,J2,I
1637 INTEGER(8) :: OFFDAG, OFFDAG_OLD, K1, K2, IROW
1639 INTEGER(8) :: J2_8, KU1, KU2
1641 INTEGER(8) :: IBEG, IEND, JJ_LOC, JJ, ROW_SHIFT
1642 INTEGER(8) :: IBEG_LOC, IEND_LOC
1644 DOUBLE PRECISION SWOP,,MULT1,MULT2
1645 INTEGER(8) :: APOSMAX
1647 include
'mumps_headers.h'
1648 parameter(one = 1.0d0,
1651 nfront8 = int(nfront,8)
1652 npiv_new = npiv + pivsiz
1654 is_maxfromm_avail = .false.
1655 ncb1 = last_row - iend_block
1656 nel2 = iend_block - npiv_new
1658 IF (iend_block.EQ.nass)
THEN
1665 IF(pivsiz .EQ. 1)
THEN
1666 apos = poselt + int(npiv,8)*(nfront8 + 1_8)
1667 valpiv = one/a(apos)
1670 IF (nel2+ncb1.GT.0)
THEN
1675 k1pos = lpos+ int(i-1,8)*lda8
1676 a(apos+int(i,8))=a(k1pos)
1682 k1pos = lpos+ int(i-1,8)*lda8
1683 a(k1pos) = a(k1pos) * valpiv
1686 IF (.NOT. is_max_useful)
THEN
1693 DO i=j2, nel2 + ncb1
1694 k1pos = lpos+ int(i-1,8)*lda8
1695 a(k1pos+j2_8)=a(k1pos+j2_8)-(a(k1pos)*a(apos+j2_8))
1706 DO i=1, nel2 + ncb1 - nvschur_k253
1707 k1pos = lpos+ int(i-1,8)*lda8
1708 a(k1pos+1_8)=a(k1pos+1_8) - a(k1pos) * a(apos+1_8)
1709 maxfrommtmp=
max(maxfrommtmp, abs(a(k1pos+1_8)))
1712 is_maxfromm_avail = .true.
1713 maxfromm=
max(maxfromm, maxfrommtmp)
1714 IF (nvschur_k253.GT.0)
THEN
1715 DO i= nel2 + ncb1- nvschur_k253 +1, nel2
1716 k1pos = lpos+ int(i-1,8)*lda8
1717 a(k1pos+1_8)=a(k1pos+1_8) - a(k1pos) * a(apos+1_8)
1728 DO i=j2, nel2 + ncb1
1729 k1pos = lpos+ int(i-1,8)*lda8
1730 a(k1pos+j2_8)=a(k1pos+j2_8)-(a(k1pos)*a(apos+j2_8))
1739 IF (.NOT. is_max_useful)
THEN
1741 k1pos = lpos + int(i-1,8)*lda8
1742 a(apos+int(i,8))=a(k1pos)
1743 a(k1pos) = a(k1pos) * valpiv
1745 a(k1pos+jj)=a(k1pos+jj) - a(k1pos) * a(apos+jj)
1749 is_maxfromm_avail = .true.
1751 k1pos = lpos + int(i-1,8)*lda8
1752 a(apos+int(i,8))=a(k1pos)
1753 a(k1pos) = a(k1pos) * valpiv
1754 a(k1pos+1_8)=a(k1pos+1_8) - a(k1pos) * a(apos+1_8)
1755 maxfromm=
max( maxfromm,abs(a(k1pos+1_8)) )
1756 DO jj = 2_8, int(i,8)
1757 a(k1pos+jj)=a(k1pos+jj) - a(k1pos) * a(apos+jj)
1763 IF (.NOT. is_max_useful)
THEN
1765 DO i=nel2+1, nel2 + ncb1
1766 k1pos = lpos+ int(i-1,8)*lda8
1767 a(apos+int(i,8))=a(k1pos)
1768 a(k1pos) = a(k1pos) * valpiv
1769 DO jj = 1_8, int(nel2,8)
1770 a(k1pos+jj)=a(k1pos+jj) - a(k1pos) * a(apos+jj)
1779 DO i=nel2+1, nel2 + ncb1 - nvschur_k253
1780 k1pos = lpos+ int(i-1,8)*lda8
1781 a(apos+int(i,8))=a(k1pos)
1782 a(k1pos) = a(k1pos) * valpiv
1784 a(k1pos+1_8) = a(k1pos+1_8) - a(k1pos) * a(apos+1_8)
1785 maxfrommtmp=
max(maxfrommtmp, abs(a(k1pos+1_8)))
1786 DO jj = 2_8, int(nel2,8)
1787 a(k1pos+jj)=a(k1pos+jj) - a(k1pos) * a(apos+jj)
1792 DO i = nel2 + ncb1 - nvschur_k253 + 1, nel2 + ncb1
1793 k1pos = lpos+ int(i-1,8)*lda8
1794 a(apos+int(i,8))=a(k1pos)
1795 a(k1pos) = a(k1pos) * valpiv
1796 DO jj = 1_8, int(nel2,8)
1797 a(k1pos+jj)=a(k1pos+jj) - a(k1pos) * a(apos+jj)
1800 maxfromm=
max(maxfromm, maxfrommtmp)
1805 pospv1 = poselt + int(npiv,8)*(nfront8 + 1_8)
1806 pospv2 = pospv1 + nfront8 + 1_8
1807 offdag_old = pospv2 - 1_8
1808 offdag = pospv1 + 1_8
1811 a22 = a(pospv1)/detpiv
1813 a12 = -a(offdag_old)/detpiv
1814 a(offdag) = a(offdag_old)
1815 a(offdag_old) = zero
1816 lpos1 = pospv2 + lda8 - 1_8
1821 IF (nel2 + ncb1.NE.last_row-npiv_new)
CALL mumps_abort()
1823 CALL dcopy(last_row-npiv_new, a(lpos1), lda, a(pospv1+2_8), 1)
1824 CALL dcopy(last_row-npiv_new, a(lpos2), lda, a(pospv2+1_8), 1)
1829 DO j2=1, nel2 + ncb1
1831 ku1 = pospv1 + 2_8 + (j2_8-1_8)
1832 ku2 = pospv2 + 1_8 + (j2_8-1_8)
1833 k1 = lpos1 + (j2_8-1_8)*nfront8
1835 a(k1) = a11*a(ku1)+a12*a(ku2)
1836 a(k2) = a12*a(ku1)+a22*a(ku2)
1845 mult1 = -a(pospv1 + 2_8 + j2_8-1_8)
1846 mult2 = -a(pospv2 + 1_8 + j2_8-1_8)
1848 DO i= j2, nel2 + ncb1
1849 k1 = lpos1 + (int(i,8)-1_8)*nfront8
1852 a(irow) = a(irow) + mult1*a(k1) +
1858 jj = pospv2 + nfront8-1_8
1864 mult1 = - (a11*a(k1)+a12*a(k2))
1865 mult2 = - (a12*a(k1)+a22*a(k2))
1866 a(pospv1 + 2_8 + (int(j2,8)-1_8)) = a
1867 a(pospv2 + 1_8 + (int(j2,8)-1_8)) = a(k2)
1870 DO irow = ibeg, iend
1871 a(irow) = a(irow) + mult1*a(k1) + mult2*a(k2)
1876 a( jj + 1_8 ) = -mult2
1877 ibeg = ibeg + nfront8
1878 iend = iend + nfront8 + 1_8
1884 DO j2 = 1,last_row-iend_block
1885 row_shift = (j2-1_8)*nfront8
1886 jj_loc = jj + row_shift
1887 ibeg_loc = ibeg + row_shift
1888 iend_loc = iend + row_shift
1891 mult1 = - (a11*a(k1)+a12*a(k2))
1892 mult2 = - (a12*a(k1)+a22*a(k2))
1893 a(pospv1 + 2_8 + nel2 + (j2-1_8)) = a(k1)
1894 a(pospv2 + 1_8 + nel2 + (j2-1_8)) = a(k2)
1897 DO irow = ibeg_loc, iend_loc
1898 a(irow) = a(irow) + mult1*a(k1) + mult2*a(k2)
1902 a( jj_loc ) = -mult1
1903 a( jj_loc + 1_8 ) = -mult2
1908 IF ((is_maxfromm_avail).AND.(nel2.GT.0))
THEN
1909 IF (parpiv_t1.NE.0)
THEN
1910 aposmax = poselt+lda8*lda8-1_8 + int(npiv_new+1,8)
1911 maxfromm =
max(maxfromm,
1919 & NFRONT,NASS,INODE,A,LA,
1923 & FIRST_ROW_TRSM, LAST_ROW_TRSM,
1924 & LAST_COL_GEMM, LAST_ROW_GEMM,
1925 & CALL_TRSM, CALL_GEMM, LR_ACTIVATED,
1926 & IW, LIW, OFFSET_IW
1929 INTEGER,
intent(in) :: NPIV
1930 INTEGER,
intent(in) :: NFRONT, , IBEG_BLOCK, IEND_BLOCK
1931 INTEGER(8),
intent(in) :: LA
1932 DOUBLE PRECISION,
intent(inout) :: A(LA)
1933 INTEGER,
intent(in) :: INODE
1934 INTEGER :: KEEP(500)
1935 INTEGER(8) :: KEEP8(150)
1936 INTEGER(8),
intent(in) :: POSELT
1937 INTEGER,
intent(in) :: LDA
1938 INTEGER,
intent(in) :: LAST_COL_GEMM
1939 INTEGER,
intent(in) :: LAST_ROW_GEMM, LAST_ROW_TRSM,
1941 LOGICAL,
intent(in) :: CALL_TRSM, CALL_GEMM, LR_ACTIVATED
1942 INTEGER :: OFFSET_IW, LIW
1945 INTEGER NPIV_BLOCK, NEL1
1947 INTEGER(8) :: LPOS, UPOS, APOS
1951 DOUBLE PRECISION ONE, ALPHA
1952 include
'mumps_headers.h'
1953 parameter(one=1.0d0, alpha=-1.0d0)
1955 nel1 = last_col_gemm - iend_block
1956 nrhs_trsm = last_row_trsm-first_row_trsm
1957 npiv_block = npiv - ibeg_block + 1
1958 IF (npiv_block.EQ.0)
GO TO 500
1961 apos = poselt + lda8*int(ibeg_block-1,8) + int(ibeg_block-1,8)
1962 lpos = poselt + lda8*int(first_row_trsm,8)+int(ibeg_block-1,8)
1963 upos = poselt + lda8*int(ibeg_block-1,8)+int(first_row_trsm,8)
1964 CALL dtrsm(
'L',
'U',
'T',
'U', npiv_block, nrhs_trsm,
1965 & one, a(apos), lda, a(lpos), lda)
1967 & nfront, npiv_block, liw, iw, offset_iw, la, a,
1968 & poselt, lpos, upos, apos, .NOT.lr_activated)
1971#if defined(GEMMT_AVAILABLE)
1972 IF ( keep(421).EQ. -1)
THEN
1973 lpos = poselt + lda8*int(iend_block,8) + int(ibeg_block-1,8)
1974 upos = poselt + lda8*int(ibeg_block-1,8) + int(iend_block,8)
1975 apos = poselt + lda8*int(iend_block,8) + int(iend_block,8)
1976 CALL dgemmt(
'U',
'N',
'N', nel1,
1978 & alpha, a( upos ), lda,
1982 IF ( last_col_gemm - iend_block > keep(7) )
THEN
1985 blsize = last_col_gemm - iend_block
1987 IF ( last_col_gemm - iend_block .GT. 0 )
THEN
1988#if defined(SAK_BYROW)
1989 DO irow = iend_block+1, last_col_gemm, blsize
1990 block =
min( blsize, last_col_gemm - irow + 1 )
1991 lpos = poselt + int(irow - 1,8) * lda8 +
1992 & int(ibeg_block - 1,8)
1993 upos = poselt + int(ibeg_block - 1,8) * lda8 +
1995 apos = poselt + int(irow - 1,8) * lda8 +
1997 CALL dgemm(
'N',
'N', irow + block - iend_block - 1,
1998 & block, npiv_block,
1999 & alpha, a( upos ), lda,
2000 & a( lpos ), lda, one, a( apos ), lda )
2003 DO irow = iend_block+1, last_col_gemm, blsize
2004 block =
min( blsize, last_col_gemm - irow + 1 )
2005 lpos = poselt + int( irow - 1,8) * lda8 +
2006 & int(ibeg_block - 1,8)
2007 upos = poselt + int(ibeg_block - 1,8) * lda8 +
2009 apos = poselt + int( irow - 1,8) * lda8 + int( irow - 1,8)
2010 CALL dgemm(
'N',
'N', block, last_col_gemm - irow + 1,
2011 & npiv_block, alpha, a( upos ), lda,
2012 & a( lpos ), lda, one, a( apos ), lda )
2016#if defined(GEMMT_AVAILABLE)
2019 lpos = poselt + int(last_col_gemm,8)*lda8 + int(ibeg_block-1,8)
2020 upos = poselt + int(ibeg_block-1,8) * lda8 +
2022 apos = poselt + int(last_col_gemm,8)*lda8 + int(iend_block,8)
2023 IF (last_row_gemm .GT. last_col_gemm)
THEN
2024 CALL dgemm(
'N',
'N', nel1, last_row_gemm-last_col_gemm,
2025 & npiv_block, alpha, a(upos), lda, a(lpos), lda,
2026 & one, a(apos), lda)
2034 & IOLDPS, NPIVP1, IPIV, POSELT, LASTROW2SWAP,
2035 & LDA, NFRONT, LEVEL, PARPIV, K50, XSIZE,
2036 & IBEG_BLOCK_TO_SEND )
2038 INTEGER(8) :: POSELT, LA
2039 INTEGER LIW, IOLDPS, NPIVP1, IPIV
2040 INTEGER LDA, NFRONT, LEVEL, PARPIV, K50, XSIZE
2041 INTEGER LASTROW2SWAP
2042 DOUBLE PRECISION A( LA )
2044 INTEGER,
INTENT(IN) :: IBEG_BLOCK_TO_SEND
2045 INCLUDE
'mumps_headers.h'
2047 INTEGER ISW, ISWPS1, ISWPS2, HF
2048 INTEGER(8) :: IDIAG, APOS
2050 DOUBLE PRECISION SWOP
2052 apos = poselt + lda8*int(ipiv-1,8) + int(npivp1-1,8)
2053 idiag = apos + int(ipiv - npivp1,8)
2054 hf = 6 + iw( ioldps + 5 + xsize) + xsize
2055 iswps1 = ioldps + hf + npivp1 - 1
2056 iswps2 = ioldps + hf + ipiv - 1
2058 iw(iswps1) = iw(iswps2)
2060 isw = iw(iswps1+nfront)
2061 iw(iswps1+nfront) = iw(iswps2+nfront)
2062 iw(iswps2+nfront) = isw
2063 IF ( level .eq. 2 )
THEN
2064 ibeg = ibeg_block_to_send
2065 CALL dswap( npivp1 - 1 - ibeg + 1,
2066 & a( poselt + int(npivp1-1,8) +
2067 & int(ibeg-1,8) * lda8
2068 & a( poselt + int(ipiv-1,8) +
2069 & int(ibeg-1,8) * lda8), lda )
2071 CALL dswap( npivp1-1,
2072 & a( poselt+int(npivp1-1,8) * lda8 ), 1,
2073 & a( poselt + int(ipiv-1,8) * lda8 ), 1 )
2074 CALL dswap( ipiv - npivp1 - 1,
2075 & a( poselt+int(npivp1,8) * lda8 + int(npivp1-1,8) ),
2076 & lda, a( apos + 1_8 ), 1 )
2078 a(idiag) = a( poselt+int(npivp1-1,8)*lda8+int(npivp1-1,8) )
2079 a( poselt + int(npivp1-1,8)*lda8 + int(npivp1-1,8) ) = swop
2080 IF (lastrow2swap - ipiv.GT.0)
THEN
2081 CALL dswap( lastrow2swap - ipiv,
2082 & a( apos + lda8 ), lda,
2083 & a( idiag + lda8 ), lda )
2085 IF (parpiv.NE.0 .AND.k50.EQ.2)
THEN
2086 IF ( level .eq. 2 .OR. level.eq.1)
THEN
2087 apos = poselt+lda8*lda8-1_8
2088 swop = a(apos+int(npivp1,8))
2089 a(apos+int(npivp1,8))= a(apos+int(ipiv,8))
2090 a(apos+int(ipiv,8)) = swop
2096 & SIZECOPY, LDA, NCOLS, LIW, IW, OFFSET_IW,
2097 & LA, A, POSELT, A_LPOS, A_UPOS, A_DPOS,
2100 INTEGER,
INTENT(IN) :: IROWMAX, IROWMIN
2101 INTEGER,
INTENT(IN) :: SIZECOPY
2102 INTEGER,
INTENT(IN) :: LDA, NCOLS
2103 INTEGER,
INTENT(IN) :: LIW
2104 INTEGER,
INTENT(IN) :: IW(LIW)
2105 INTEGER,
INTENT(IN) :: OFFSET_IW
2106 INTEGER(8),
INTENT(IN) :: LA
2107 DOUBLE PRECISION,
INTENT(INOUT) :: A()
2108 INTEGER(8),
INTENT(IN) :: POSELT, A_LPOS, A_UPOS, A_DPOS
2109 LOGICAL,
INTENT(IN) :: COPY_NEEDED
2110 INTEGER(8) :: LPOS, UPOS
2111 INTEGER(8) :: DPOS, POSPV1, POSPV2, OFFDAG
2113 INTEGER :: IROWEND, IROW, Block2
2115 DOUBLE PRECISION :: MULT1, MULT2, A11, DETPIV, A22, A12
2116 INTEGER :: BLSIZECOPY
2117 DOUBLE PRECISION :: ONE
2118 parameter(one = 1.0d0)
2119 INTEGER(8) :: LPOSI, UPOSI
2120 LOGICAL :: PIVOT_2X2
2124 IF (sizecopy.NE.0)
THEN
2125 blsizecopy = sizecopy
2130!$ omp_flag = .false.
2136 DO irowend = irowmax, irowmin, -blsizecopy
2137 block2 =
min(blsizecopy, irowend)
2138 irow = irowend - block2 + 1
2139 lpos = a_lpos + int(irow-1,8)*lda8
2140 upos = a_upos + int(irow-1,8)
2148 IF(iw(offset_iw+i-1) .LE. 0)
THEN
2152 IF (iw(offset_iw+i-2) .LE. 0)
THEN
2157 dpos = a_dpos + lda8*int(i-1,8) + int(i-1,8)
2158 IF(.not. pivot_2x2)
THEN
2160 lposi = lpos+int(i-1,8)
2161 IF (copy_needed)
THEN
2162 uposi = upos+int(i-1,8)*lda8
2167 a(uposi+int(j-1,8)) = a(lposi+int(j-1,8)*lda8)
2174 a(lposi+int(j-1,8)*lda8) = a(lposi+int(j-1,8)*lda8)*a11
2177 IF (copy_needed)
THEN
2178 CALL dcopy(block2, a(lpos+int(i-1,8)),
2179 & lda, a(upos+int(i-1,8)*lda8), 1)
2180 CALL dcopy(block2, a(lpos+int(i,8)),
2181 & lda, a(upos+int(i,8)*lda8), 1)
2184 pospv2 = dpos + int(lda+1,8)
2189 detpiv = a11*a22 - a12**2
2191 a11 = a(pospv2)/detpiv
2197 mult1 = a11*a(lpos+int(j-1,8)*lda8+int(i-1,8))
2198 & + a12*a(lpos+int(j-1,8)*lda8+int(i,8))
2199 mult2 = a12*a(lpos+int(j-1,8)*lda8+int(i-1,8))
2200 & + a22*a(lpos+int(j-1,8)*lda8+int(i,8))
2201 a(lpos+int(j-1,8)*lda8+int(i-1,8)) = mult1
2202 a(lpos+int(j-1,8)*lda8+int(i,8)) = mult2
2210 & SIZECOPY, LDA, NCOLS, LIW, IW, OFFSET_IW,
2211 & LA, A, POSELT, A_LPOS, A_UPOS, A_DPOS )
2213 INTEGER,
INTENT(IN) :: IROWMAX, IROWMIN
2214 INTEGER,
INTENT(IN) ::
2215 INTEGER,
INTENT(IN) :: LDA, NCOLS
2216 INTEGER,
INTENT(IN) :: LIW
2217 INTEGER,
INTENT(IN) :: IW(LIW)
2218 INTEGER,
INTENT(IN) :: OFFSET_IW
2219 INTEGER(8),
INTENT(IN) :: LA
2220 DOUBLE PRECISION,
INTENT(INOUT) :: A(LA)
2221 INTEGER(8),
INTENT(IN) :: POSELT, A_LPOS, A_UPOS, A_DPOS
2222 INTEGER(8) :: LPOS, UPOS
2223 INTEGER(8) :: DPOS, POSPV1, POSPV2, OFFDAG
2225 INTEGER :: IROWEND, IROW, Block2
2227 DOUBLE PRECISION :: MULT1, MULT2, A11, A22,
2228 INTEGER :: BLSIZECOPY
2229 DOUBLE PRECISION :: ONE
2230 parameter(one = 1.0d0)
2231 INTEGER(8) :: LPOSI, UPOSI
2232 LOGICAL :: PIVOT_2X2
2236 IF (sizecopy.NE.0)
THEN
2237 blsizecopy = sizecopy
2248 DO irowend = irowmax, irowmin, -blsizecopy
2249 block2 =
min(blsizecopy, irowend)
2250 irow = irowend - block2 + 1
2251 lpos = a_lpos + int(irow-1,8)*lda8
2252 upos = a_upos + int(irow-1,8)
2260 IF(iw(offset_iw+i-1) .LE. 0)
THEN
2264 IF (iw(offset_iw+i-2) .LE. 0)
THEN
2269 dpos = a_dpos + lda8*int(i-1,8) + int(i-1,8)
2270 IF(.not. pivot_2x2)
THEN
2272 lposi = lpos+int(i-1,8)
2273 uposi = upos+int(i-1,8)*lda8
2278 a(uposi+int(j-1,8)) = a(lposi+int(j-1,8)*lda8)*a11
2282 pospv2 = dpos + int(lda+1,8)
2291 mult1 = a11*a(lpos+int(j-1,8)*lda8+int(i-1,8))
2292 & + a12*a(lpos+int(j-1,8)*lda8+int(i,8))
2293 mult2 = a12*a(lpos+int(j-1,8)*lda8+int(i-1,8))
2294 & + a22*a(lpos+int(j-1,8)*lda8+int(i,8))
2295 a(upos+int(i-1,8)*lda8+int(j-1,8)) = mult1
2296 a(upos+int(i,8)*lda8+int(j-1,8)) = mult2
2307 & IOLDPS,POSELT,KEEP,KEEP8,
2308 & POSTPONE_COL_UPDATE, ETATASS,
2309 & TYPEFile, LAFAC, MonBloc, NextPiv2beWritten,
2310 & LIWFAC, MYID, IFLAG, OFFSET_IW, INODE )
2313 INTEGER NFRONT, NASS,LIW
2315 DOUBLE PRECISION A(LA)
2318 INTEGER(8) KEEP8(150)
2319 INTEGER(8) :: POSELT
2321 INTEGER IOLDPS, ETATASS
2322 LOGICAL POSTPONE_COL_UPDATE
2324 INTEGER TYPEFile, NextPiv2beWritten
2325 INTEGER LIWFAC, MYID, IFLAG
2326 TYPE(IO_BLOCK):: MonBloc
2329 INTEGER :: OFFSET_IW
2330 INTEGER,
intent(in):: INODE
2331 include
'mumps_headers.h'
2332 INTEGER(8) :: UPOS, APOS, LPOS
2334 INTEGER BLSIZE, BLSIZE2, Block, IROW, NPIV, IROWEND
2335 INTEGER I2, I2END, Block2
2336 DOUBLE PRECISION ONE, ALPHA, BETA, ZERO
2337 parameter(one = 1.0d0, alpha=-1.0d0)
2338 parameter(zero=0.0d0)
2340 IF (etatass.EQ.1)
THEN
2345 IF ( nfront - nass > keep(58) )
THEN
2346 IF ( nfront - nass > keep(57) )
THEN
2349 blsize = (nfront - nass)/2
2352 blsize = nfront - nass
2355 npiv = iw( ioldps + 1 + keep(ixsz))
2356 IF ( nfront - nass .GT. 0 )
THEN
2357 IF ( postpone_col_update )
THEN
2358 lpos = poselt + lda8 * int(nass,8)
2359 CALL dtrsm(
'L',
'U',
'T',
'U',
2360 & npiv, nfront-nass, one,
2364#if defined(GEMMT_AVAILABLE)
2365 IF ( keep(421).EQ. -1)
THEN
2366 lpos = poselt + int(nass,8)*lda8
2367 upos = poselt + int(nass,8)
2368 apos = poselt + int(nass,8)*lda8 + int(nass,8)
2369 IF (postpone_col_update)
THEN
2371 & keep(424), nfront, npiv,
2372 & liw, iw, offset_iw, la, a, poselt, lpos, upos,
2375 CALL dgemmt(
'U',
'N',
'N', nfront-nass, npiv,
2376 & alpha, a( upos ), lda,
2382 DO irowend = nfront - nass, 1, -blsize
2383 block =
min( blsize, irowend )
2384 irow = irowend - block + 1
2385 lpos = poselt + int(nass,8)*lda8 + int(irow-1,8) * lda8
2386 apos = poselt + int(nass,8)*lda8 + int(irow-1,8) * lda8 +
2387 & int(nass + irow - 1,8)
2388 upos = poselt + int(nass,8)
2389 IF (.NOT. postpone_col_update)
THEN
2390 upos = poselt + int(nass + irow - 1,8)
2392 IF (postpone_col_update)
THEN
2394 & keep(424), nfront, npiv,
2395 & liw, iw, offset_iw, la, a, poselt, lpos, upos,
2398 DO i2end = block, 1, -blsize2
2399 block2 =
min(blsize2, i2end)
2400 i2 = i2end - block2+1
2401 CALL dgemm(
'N',
'N', block2, block-i2+1, npiv, alpha,
2402 & a(upos+int(i2-1,8)), lda,
2403 & a(lpos+int(i2-1,8)*lda8), lda,
2405 & a(apos + int(i2-1,8) + int(i2-1,8)*lda8), lda)
2406 IF (keep(201).EQ.1)
THEN
2407 IF (nextpiv2bewritten.LE.npiv)
THEN
2410 & strat_try_write, typefile,
2411 & a(poselt), lafac, monbloc,
2412 & nextpiv2bewritten, idummy,
2413 & iw(ioldps), liwfac, myid,
2416 IF (iflag .LT. 0 )
RETURN
2420 IF ( nfront - nass - irow + 1 - block > 0 )
THEN
2421 CALL dgemm(
'N',
'N', block, nfront-nass-block-irow+1, npiv,
2422 & alpha, a( upos ), lda,
2423 & a( lpos + lda8 * int(block,8) ), lda,
2425 & a( apos + lda8 * int(block,8) ), lda )
2428#if defined(GEMMT_AVAILABLE)
2431 IF ( (postpone_col_update).AND.(nass-npiv.GT.0) )
THEN
2432 lpos = poselt + int(npiv,8)*lda8
2433 upos = poselt + int(npiv,8)
2435 & keep(424), nfront, npiv,
2436 & liw, iw, offset_iw, la, a, poselt, lpos, upos, poselt)
2437 lpos = poselt + lda8 * int(nass,8)
2438 CALL dgemm(
'N',
'N', nass-npiv, nfront-nass, npiv, alpha,
2439 & a( poselt + int(npiv,8)), lda,
2442 & a( lpos + int(npiv,8) ), lda)
2448 & K, P, LastPanelonDisk,
2449 & LastPIVRPTRIndexFilled )
2451 INTEGER,
intent(in) :: NBPANELS, NASS, K, P
2452 INTEGER,
intent(inout) :: PIVRPTR(NBPANELS), PIVR(NASS)
2453 INTEGER LastPanelonDisk, LastPIVRPTRIndexFilled
2455 IF ( lastpanelondisk+1 > nbpanels )
THEN
2456 WRITE(*,*)
"INTERNAL ERROR IN DMUMPS_STORE_PERMINFO!"
2457 WRITE(*,*)
"NASS=",nass,
"PIVRPTR=",pivrptr(1:nbpanels)
2458 WRITE(*,*)
"K=",k,
"P=",p,
"LastPanelonDisk=",lastpanelondisk
2459 WRITE(*,*)
"LastPIVRPTRIndexFilled=", lastpivrptrindexfilled
2462 pivrptr(lastpanelondisk+1) = k + 1
2463 IF (lastpanelondisk.NE.0)
THEN
2464 pivr(k - pivrptr(1) + 1) = p
2465 DO i = lastpivrptrindexfilled + 1, lastpanelondisk
2466 pivrptr(i)=pivrptr(lastpivrptrindexfilled)
2469 lastpivrptrindexfilled = lastpanelondisk + 1
2473 & ( diag, dkeep, keep, nullpivot)
2476 DOUBLE PRECISION,
INTENT(IN) :: DIAG
2477 DOUBLE PRECISION,
INTENT(INOUT) :: DKEEP(230)
2478 LOGICAL,
INTENT(IN) :: NULLPIVOT
2479 INTEGER,
INTENT(IN) :: KEEP(500)
2480 IF (keep(405).EQ.0)
THEN
2481 dkeep(21) =
max(dkeep(21), diag)
2482 dkeep(19) =
min(dkeep(19), diag)
2483 IF (.NOT.nullpivot)
THEN
2484 dkeep(20) =
min(dkeep(20), diag)
2488 dkeep(21) =
max(dkeep(21), diag)
2491 dkeep(19) =
min(dkeep(19), diag)
2493 IF (.NOT.nullpivot)
THEN
2495 dkeep(20) =
min(dkeep(20), diag)
2502 & N, NCB, SIZE_SCHUR, ROW_INDICES, PERM,
2506 INTEGER,
intent(in) :: N, NCB, SIZE_SCHUR
2507 INTEGER,
intent(in) :: ROW_INDICES(NCB), PERM(N)
2508 INTEGER,
intent(out):: NVSCHUR
2509 INTEGER :: I, IPOS, IBEG_SCHUR
2510 ibeg_schur = n - size_schur +1
2514 IF (abs(row_indices(i)).LE.n)
THEN
2515 IF (perm(row_indices(i)).LT.ibeg_schur)
EXIT
subroutine dmumps_updatedeter(piv, deter, nexp)
subroutine dmumps_get_ooc_perm_ptr(typef, nbpanels, i_pivptr, i_piv, ipos, iw, liw)
subroutine dswap(n, dx, incx, dy, incy)
DSWAP
subroutine dcopy(n, dx, incx, dy, incy)
DCOPY
subroutine dger(m, n, alpha, x, incx, y, incy, a, lda)
DGER
subroutine dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
DGEMM
subroutine dtrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
DTRSM
subroutine dmumps_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 dmumps_store_perminfo(pivrptr, nbpanels, pivr, nass, k, p, lastpanelondisk, lastpivrptrindexfilled)
subroutine dmumps_fac_ldlt_copyscale_u(irowmax, irowmin, sizecopy, lda, ncols, liw, iw, offset_iw, la, a, poselt, a_lpos, a_upos, a_dpos)
subroutine dmumps_fac_n(nfront, nass, iw, liw, a, la, ioldps, poselt, ifinb, xsize, keep, maxfromn, is_maxfromn_avail, nvschur)
subroutine dmumps_fac_t(a, la, npivb, nfront, npiv, nass, poselt)
subroutine dmumps_fac_mq(ibeg_block, iend_block, nfront, nass, npiv, last_col, a, la, poselt, ifinb, lr_activated)
subroutine dmumps_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 dmumps_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 dmumps_fac_p(a, la, nfront, npiv, nass, poselt, call_utrsm, keep, inode, call_ooc, iwfac, liwfac, lafac, monbloc, myid, keep8, lnextpiv2bewritten, unextpiv2bewritten, iflag)
subroutine dmumps_get_size_schur_in_front(n, ncb, size_schur, row_indices, perm, nvschur)
subroutine dmumps_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 dmumps_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 dmumps_swap_ldlt(a, la, iw, liw, ioldps, npivp1, ipiv, poselt, lastrow2swap, lda, nfront, level, parpiv, k50, xsize, ibeg_block_to_send)
subroutine dmumps_update_minmax_pivot(diag, dkeep, keep, nullpivot)
subroutine dmumps_fac_pt_setlock427(k427_out, k427, k405, k222, nel1, nass)
subroutine dmumps_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 dmumps_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 dmumps_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 dmumps_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, public dmumps_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