1 SUBROUTINE pssytrd( UPLO, N, A, IA, JA, DESCA, D, E, TAU, WORK,
11 INTEGER IA, INFO, JA, LWORK, N
15 REAL A( * ), D( * ), E( * ), TAU( * ), WORK( * )
223 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
224 $ lld_, mb_, m_, nb_, n_, rsrc_
225 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
226 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
227 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
229 parameter( one = 1.0e+0 )
232 LOGICAL LQUERY, UPPER
233 CHARACTER COLCTOP, ROWCTOP
234 INTEGER I, IACOL, IAROW, ICOFFA, ICTXT, IINFO, IPW,
235 $ iroffa, j, jb, jx, k, kk, lwmin, mycol, myrow,
236 $ nb, np, npcol, nprow, nq
239 INTEGER DESCW( DLEN_ ), IDUM1( 2 ), IDUM2( 2 )
248 INTEGER INDXG2L, INDXG2P, NUMROC
249 EXTERNAL lsame, indxg2l, indxg2p, numroc
252 INTRINSIC ichar,
max,
min, mod, real
258 ictxt = desca( ctxt_ )
264 IF( nprow.EQ.-1 )
THEN
267 CALL chk1mat( n, 2, n, 2, ia, ja, desca, 6, info )
268 upper = lsame( uplo,
'U' )
271 iroffa = mod( ia-1, desca( mb_ ) )
272 icoffa = mod( ja-1, desca( nb_ ) )
273 iarow = indxg2p( ia, nb, myrow, desca( rsrc_ ), nprow )
274 iacol = indxg2p( ja, nb, mycol, desca( csrc_ ), npcol )
275 np = numroc( n, nb, myrow, iarow, nprow )
276 nq =
max( 1, numroc( n+ja-1, nb, mycol, desca( csrc_ ),
278 lwmin =
max( (np+1)*nb, 3*nb )
280 work( 1 ) = real( lwmin )
281 lquery = ( lwork.EQ.-1 )
282 IF( .NOT.upper .AND. .NOT.lsame( uplo, 'l
' ) ) THEN
284.NE..OR..NE.
ELSE IF( IROFFAICOFFA ICOFFA0 ) THEN
286.NE.
ELSE IF( DESCA( MB_ )DESCA( NB_ ) ) THEN
288.LT..AND..NOT.
ELSE IF( LWORKLWMIN LQUERY ) THEN
293 IDUM1( 1 ) = ICHAR( 'u
' )
295 IDUM1( 1 ) = ICHAR( 'l
' )
298.EQ.
IF( LWORK-1 ) THEN
304 CALL PCHK1MAT( N, 2, N, 2, IA, JA, DESCA, 6, 2, IDUM1, IDUM2,
309 CALL PXERBLA( ICTXT, 'pssytrd', -INFO )
311 ELSE IF( LQUERY ) THEN
320 CALL PB_TOPGET( ICTXT, 'combine
', 'columnwise
', COLCTOP )
321 CALL PB_TOPGET( ICTXT, 'combine
', 'rowwise
', ROWCTOP )
322 CALL PB_TOPSET( ICTXT, 'combine
', 'columnwise
', '1-tree
' )
323 CALL PB_TOPSET( ICTXT, 'combine
', 'rowwise
', '1-tree
' )
331 KK = MOD( JA+N-1, NB )
334 CALL DESCSET( DESCW, N, NB, NB, NB, IAROW, INDXG2P( JA+N-KK,
335 $ NB, MYCOL, DESCA( CSRC_ ), NPCOL ), ICTXT,
338 DO 10 K = N-KK+1, NB+1, -NB
339 JB = MIN( N-K+1, NB )
347 CALL PSLATRD( UPLO, K+JB-1, JB, A, IA, JA, DESCA, D, E, TAU,
348 $ WORK, 1, 1, DESCW, WORK( IPW ) )
354 CALL PSSYR2K( UPLO, 'no transpose
', K-1, JB, -ONE, A, IA, J,
355 $ DESCA, WORK, 1, 1, DESCW, ONE, A, IA, JA,
360 JX = MIN( INDXG2L( J, NB, 0, IACOL, NPCOL ), NQ )
361 CALL PSELSET( A, I-1, J, DESCA, E( JX ) )
363 DESCW( CSRC_ ) = MOD( DESCW( CSRC_ ) + NPCOL - 1, NPCOL )
369 CALL PSSYTD2( UPLO, MIN( N, NB ), A, IA, JA, DESCA, D, E,
370 $ TAU, WORK, LWORK, IINFO )
376 KK = MOD( JA+N-1, NB )
379 CALL DESCSET( DESCW, N, NB, NB, NB, IAROW, IACOL, ICTXT,
382 DO 20 K = 1, N-NB, NB
390 CALL PSLATRD( UPLO, N-K+1, NB, A, I, J, DESCA, D, E, TAU,
391 $ WORK, K, 1, DESCW, WORK( IPW ) )
397 CALL PSSYR2K( UPLO, 'no transpose
', N-K-NB+1, NB, -ONE, A,
398 $ I+NB, J, DESCA, WORK, K+NB, 1, DESCW, ONE, A,
399 $ I+NB, J+NB, DESCA )
403 JX = MIN( INDXG2L( J+NB-1, NB, 0, IACOL, NPCOL ), NQ )
404 CALL PSELSET( A, I+NB, J+NB-1, DESCA, E( JX ) )
406 DESCW( CSRC_ ) = MOD( DESCW( CSRC_ ) + 1, NPCOL )
412 CALL PSSYTD2( UPLO, KK, A, IA+K-1, JA+K-1, DESCA, D, E,
413 $ TAU, WORK, LWORK, IINFO )
416 CALL PB_TOPSET( ICTXT, 'combine
', 'columnwise
', COLCTOP )
417 CALL PB_TOPSET( ICTXT, 'combine
', 'rowwise
', ROWCTOP )
419 WORK( 1 ) = REAL( LWMIN )
subroutine pchk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, nextra, ex, expos, info)
subroutine pslatrd(uplo, n, nb, a, ia, ja, desca, d, e, tau, w, iw, jw, descw, work)
subroutine pssytd2(uplo, n, a, ia, ja, desca, d, e, tau, work, lwork, info)
subroutine pssytrd(uplo, n, a, ia, ja, desca, d, e, tau, work, lwork, info)