229 $ D, E, HOUS, LHOUS, WORK, LWORK, INFO )
242 CHARACTER STAGE1, UPLO, VECT
243 INTEGER N, KD, LDAB, LHOUS, LWORK, INFO
246 DOUBLE PRECISION D( * ), E( * )
247 DOUBLE PRECISION AB( LDAB, * ), HOUS( * ), WORK( * )
253 DOUBLE PRECISION RZERO
254 DOUBLE PRECISION ZERO, ONE
255 parameter( rzero = 0.0d+0,
261INTEGER , M, K, IB, SWEEPID, MYID, SHIFT, , ST,
262 $ ed, stind, edind, blklastind, colpt, thed,
264 $ nbtiles, ttype, tid, nthreads, debug,
265 $ abdpos, abofdpos, dpos, ofdpos, awpos,
266 $ inda, indw, apos, sizea, lda, indv, indtau,
267 $ sidev, sizetau, ldv, lhmin, lwmin
273 INTRINSIC min,
max, ceiling, real
278 EXTERNAL lsame, ilaenv2stage
287 afters1 =
lsame( stage1,
'Y' )
288 wantq =
lsame( vect,
'V' )
289 upper =
lsame( uplo,
'U' )
290 lquery = ( lwork.EQ.-1 ) .OR. ( lhous.EQ.-1 )
294 ib = ilaenv2stage( 2,
'DSYTRD_SB2ST', vect, n, kd, -1, -1 )
295 lhmin = ilaenv2stage( 3, '
dsytrd_sb2st', VECT, N, KD, IB, -1 )
296 LWMIN = ILAENV2STAGE( 4, 'dsytrd_sb2st', VECT, N, KD, IB, -1 )
298.NOT..AND..NOT.
IF( AFTERS1 LSAME( STAGE1, 'n
' ) ) THEN
300.NOT.
ELSE IF( LSAME( VECT, 'n
' ) ) THEN
302.NOT..AND..NOT.
ELSE IF( UPPER LSAME( UPLO, 'l
' ) ) THEN
304.LT.
ELSE IF( N0 ) THEN
306.LT.
ELSE IF( KD0 ) THEN
308.LT.
ELSE IF( LDAB(KD+1) ) THEN
310.LT..AND..NOT.
ELSE IF( LHOUSLHMIN LQUERY ) THEN
312.LT..AND..NOT.
ELSE IF( LWORKLWMIN LQUERY ) THEN
324 ELSE IF( LQUERY ) THEN
342 INDV = INDTAU + SIZETAU
359 AWPOS = INDA + KD + 1
375 D( I ) = ( AB( ABDPOS, I ) )
398 D( I ) = ( AB( ABDPOS, I ) )
403 E( I ) = ( AB( ABOFDPOS, I+1 ) )
407 E( I ) = ( AB( ABOFDPOS, I ) )
422 NBTILES = CEILING( REAL(N)/REAL(KD) )
423 STEPERCOL = CEILING( REAL(SHIFT)/REAL(GRSIZ) )
424 THGRNB = CEILING( REAL(N-1)/REAL(THGRSIZ) )
426 CALL DLACPY( "A", KD+1, N, AB, LDAB, WORK( APOS ), LDA )
427 CALL DLASET( "A", KD, N, ZERO, ZERO, WORK( AWPOS ), LDA )
433!$OMP PARALLEL PRIVATE( TID, THGRID, BLKLASTIND )
434!$OMP$ PRIVATE( THED, I, M, K, ST, ED, STT, SWEEPID )
435!$OMP$ PRIVATE( MYID, TTYPE, COLPT, STIND, EDIND )
436!$OMP$ SHARED ( UPLO, WANTQ, INDV, INDTAU, HOUS, WORK)
437!$OMP$ SHARED ( N, KD, IB, NBTILES, LDA, LDV, INDA )
438!$OMP$ SHARED ( STEPERCOL, THGRNB, THGRSIZ, GRSIZ, SHIFT )
444 DO 100 THGRID = 1, THGRNB
445 STT = (THGRID-1)*THGRSIZ+1
446 THED = MIN( (STT + THGRSIZ -1), (N-1))
450 DO 120 M = 1, STEPERCOL
452 DO 130 SWEEPID = ST, ED
454 MYID = (I-SWEEPID)*(STEPERCOL*GRSIZ)
456.EQ.
IF ( MYID1 ) THEN
459 TTYPE = MOD( MYID, 2 ) + 2
462.EQ.
IF( TTYPE2 ) THEN
463 COLPT = (MYID/2)*KD + SWEEPID
468 COLPT = ((MYID+1)/2)*KD + SWEEPID
471.GE..AND.
IF( ( STINDEDIND-1 )
472.EQ.
$ ( EDINDN ) ) THEN
481#if defined(_OPENMP) && _OPENMP >= 201307
482.NE.
IF( TTYPE1 ) THEN
483!$OMP TASK DEPEND(in:WORK(MYID+SHIFT-1))
484!$OMP$ DEPEND(in:WORK(MYID-1))
485!$OMP$ DEPEND(out:WORK(MYID))
486 TID = OMP_GET_THREAD_NUM()
487 CALL DSB2ST_KERNELS( UPLO, WANTQ, TTYPE,
488 $ STIND, EDIND, SWEEPID, N, KD, IB,
489 $ WORK ( INDA ), LDA,
490 $ HOUS( INDV ), HOUS( INDTAU ), LDV,
491 $ WORK( INDW + TID*KD ) )
494!$OMP TASK DEPEND(in:WORK(MYID+SHIFT-1))
495!$OMP$ DEPEND(out:WORK(MYID))
496 TID = OMP_GET_THREAD_NUM()
497 CALL DSB2ST_KERNELS( UPLO, WANTQ, TTYPE,
498 $ STIND, EDIND, SWEEPID, N, KD, IB,
499 $ WORK ( INDA ), LDA,
500 $ HOUS( INDV ), HOUS( INDTAU ), LDV,
501 $ WORK( INDW + TID*KD ) )
505 CALL DSB2ST_KERNELS( UPLO, WANTQ, TTYPE,
506 $ STIND, EDIND, SWEEPID, N, KD, IB,
507 $ WORK ( INDA ), LDA,
508 $ HOUS( INDV ), HOUS( INDTAU ), LDV,
509 $ WORK( INDW + TID*KD ) )
511.GE.
IF ( BLKLASTIND(N-1) ) THEN
530 D( I ) = ( WORK( DPOS+(I-1)*LDA ) )
538 E( I ) = ( WORK( OFDPOS+I*LDA ) )
542 E( I ) = ( WORK( OFDPOS+(I-1)*LDA ) )
subroutine dsb2st_kernels(uplo, wantz, ttype, st, ed, sweep, n, nb, ib, a, lda, v, tau, ldvt, work)
DSB2ST_KERNELS
subroutine dsytrd_sb2st(stage1, vect, uplo, n, kd, ab, ldab, d, e, hous, lhous, work, lwork, info)
DSYTRD_SB2ST reduces a real symmetric band matrix A to real symmetric tridiagonal form T
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dlaset(uplo, m, n, alpha, beta, a, lda)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.