1 SUBROUTINE pssyntrd( UPLO, N, A, IA, JA, DESCA, D, E, TAU, WORK,
11 INTEGER IA, INFO, JA, LWORK, N
15 REAL A( * ), D( * ), E( * ), TAU( * ), WORK( * )
251 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
252 $ mb_, nb_, rsrc_, csrc_, lld_
253 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
254 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
255 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
257 parameter( one = 1.0e+0 )
260 LOGICAL LQUERY, UPPER
261 CHARACTER COLCTOP, ROWCTOP
262 INTEGER ANB, CTXTB, I, IACOL, IAROW, ICOFFA, ,
263 $ iinfo, indb, indd, inde, indtau, indw, ipw,
264 $ iroffa, j, jb, jx, k, kk, llwork, lwmin, minsz,
265 $ mycol, mycolb, myrow, myrowb, nb, np, npcol,
266 $ npcolb, nprow, nprowb, nps, nq, onepmin, sqnpc,
270 INTEGER DESCB( DLEN_ ), DESCW( DLEN_ ), IDUM1( 2 ),
282 INTEGER INDXG2L, INDXG2P, NUMROC, PJLAENV
283 EXTERNAL lsame, indxg2l, indxg2p, numroc, pjlaenv
286 INTRINSIC ichar, int,
max,
min, mod, real, sqrt
291 IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dtype_*lld_*mb_*m_*nb_*n_*
295 ictxt = desca( ctxt_ )
301 IF( nprow.EQ.-1 )
THEN
302 info = -( 600+ctxt_ )
304 CALL chk1mat( n, 2, n, 2, ia, ja, desca, 6, info )
305 upper = lsame( uplo, 'u
' )
308 IROFFA = MOD( IA-1, DESCA( MB_ ) )
309 ICOFFA = MOD( JA-1, DESCA( NB_ ) )
310 IAROW = INDXG2P( IA, NB, MYROW, DESCA( RSRC_ ), NPROW )
311 IACOL = INDXG2P( JA, NB, MYCOL, DESCA( CSRC_ ), NPCOL )
312 NP = NUMROC( N, NB, MYROW, IAROW, NPROW )
313 NQ = MAX( 1, NUMROC( N+JA-1, NB, MYCOL, DESCA( CSRC_ ),
315 LWMIN = MAX( ( NP+1 )*NB, 3*NB )
316 ANB = PJLAENV( ICTXT, 3, 'pssyttrd', 'l
', 0, 0, 0, 0 )
317 MINSZ = PJLAENV( ICTXT, 5, 'pssyttrd', 'l
', 0, 0, 0, 0 )
318 SQNPC = INT( SQRT( REAL( NPROW*NPCOL ) ) )
319 NPS = MAX( NUMROC( N, 1, 0, 0, SQNPC ), 2*ANB )
320 TTLWMIN = 2*( ANB+1 )*( 4*NPS+2 ) + ( NPS+4 )*NPS
322 WORK( 1 ) = REAL( TTLWMIN )
323.EQ.
LQUERY = ( LWORK-1 )
324.NOT..AND..NOT.
IF( UPPER LSAME( UPLO, 'l
' ) ) THEN
330.NE..OR..NE.
ELSE IF( IROFFAICOFFA ICOFFA0 ) THEN
332.NE.
ELSE IF( DESCA( MB_ )DESCA( NB_ ) ) THEN
334.LT..AND..NOT.
ELSE IF( LWORKLWMIN LQUERY ) THEN
339 IDUM1( 1 ) = ICHAR( 'u
' )
341 IDUM1( 1 ) = ICHAR( 'l
' )
344.EQ.
IF( LWORK-1 ) THEN
350 CALL PCHK1MAT( N, 2, N, 2, IA, JA, DESCA, 6, 2, IDUM1, IDUM2,
355 CALL PXERBLA( ICTXT, 'pssyntrd', -INFO )
357 ELSE IF( LQUERY ) THEN
367 ONEPMIN = N*N + 3*N + 1
369 CALL IGAMN2D( ICTXT, 'a
', ' ', 1, 1, LLWORK, 1, 1, -1, -1, -1,
378.LT..OR..EQ..AND..GE..AND.
IF( ( NMINSZ SQNPC1 ) LLWORKONEPMIN
383.GE..AND..NOT.
IF( LLWORKTTLWMIN UPPER ) THEN
388.GE.
IF( NPROWB1 ) THEN
392 INDD = INDB + NPS*NPS
396 LLWORK = LLWORK - INDW + 1
398 CALL BLACS_GET( ICTXT, 10, CTXTB )
399 CALL BLACS_GRIDINIT( CTXTB, 'row major
', SQNPC, SQNPC )
400 CALL BLACS_GRIDINFO( CTXTB, NPROWB, NPCOLB, MYROWB, MYCOLB )
401 CALL DESCSET( DESCB, N, N, 1, 1, 0, 0, CTXTB, NPS )
403 CALL PSTRMR2D( UPLO, 'n
', N, N, A, IA, JA, DESCA, WORK( INDB ),
404 $ 1, 1, DESCB, ICTXT )
409.GT.
IF( NPROWB0 ) THEN
411.EQ.
IF( NPROWB1 ) THEN
412 CALL SSYTRD( UPLO, N, WORK( INDB ), NPS, WORK( INDD ),
413 $ WORK( INDE ), WORK( INDTAU ), WORK( INDW ),
417 CALL PSSYTTRD( 'l
', N, WORK( INDB ), 1, 1, DESCB,
418 $ WORK( INDD ), WORK( INDE ),
419 $ WORK( INDTAU ), WORK( INDW ), LLWORK,
428 CALL PSLAMR1D( N-1, WORK( INDE ), 1, 1, DESCB, E, 1, JA,
431 CALL PSLAMR1D( N, WORK( INDD ), 1, 1, DESCB, D, 1, JA, DESCA )
433 CALL PSLAMR1D( N, WORK( INDTAU ), 1, 1, DESCB, TAU, 1, JA,
436 CALL PSTRMR2D( UPLO, 'n
', N, N, WORK( INDB ), 1, 1, DESCB, A,
437 $ IA, JA, DESCA, ICTXT )
440 $ CALL BLACS_GRIDEXIT( CTXTB )
444 CALL PB_TOPGET( ICTXT, 'combine
', 'columnwise
', COLCTOP )
445 CALL PB_TOPGET( ICTXT, 'combine
', 'rowwise
', ROWCTOP )
446 CALL PB_TOPSET( ICTXT, 'combine
', 'columnwise
', '1-tree
' )
447 CALL PB_TOPSET( ICTXT, 'combine
', 'rowwise
', '1-tree
' )
455 KK = MOD( JA+N-1, NB )
458 CALL DESCSET( DESCW, N, NB, NB, NB, IAROW,
459 $ INDXG2P( JA+N-KK, NB, MYCOL, DESCA( CSRC_ ),
460 $ NPCOL ), ICTXT, MAX( 1, NP ) )
462 DO 10 K = N - KK + 1, NB + 1, -NB
463 JB = MIN( N-K+1, NB )
471 CALL PSLATRD( UPLO, K+JB-1, JB, A, IA, JA, DESCA, D, E,
472 $ TAU, WORK, 1, 1, DESCW, WORK( IPW ) )
478 CALL PSSYR2K( UPLO, 'no transpose
', K-1, JB, -ONE, A, IA,
479 $ J, DESCA, WORK, 1, 1, DESCW, ONE, A, IA,
484 JX = MIN( INDXG2L( J, NB, 0, IACOL, NPCOL ), NQ )
485 CALL PSELSET( A, I-1, J, DESCA, E( JX ) )
487 DESCW( CSRC_ ) = MOD( DESCW( CSRC_ )+NPCOL-1, NPCOL )
493 CALL PSSYTD2( UPLO, MIN( N, NB ), A, IA, JA, DESCA, D, E,
494 $ TAU, WORK, LWORK, IINFO )
500 KK = MOD( JA+N-1, NB )
503 CALL DESCSET( DESCW, N, NB, NB, NB, IAROW, IACOL, ICTXT,
506 DO 20 K = 1, N - NB, NB
514 CALL PSLATRD( UPLO, N-K+1, NB, A, I, J, DESCA, D, E, TAU,
515 $ WORK, K, 1, DESCW, WORK( IPW ) )
521 CALL PSSYR2K( UPLO, 'no transpose
', N-K-NB+1, NB, -ONE,
522 $ A, I+NB, J, DESCA, WORK, K+NB, 1, DESCW,
523 $ ONE, A, I+NB, J+NB, DESCA )
527 JX = MIN( INDXG2L( J+NB-1, NB, 0, IACOL, NPCOL ), NQ )
528 CALL PSELSET( A, I+NB, J+NB-1, DESCA, E( JX ) )
530 DESCW( CSRC_ ) = MOD( DESCW( CSRC_ )+1, NPCOL )
536 CALL PSSYTD2( UPLO, KK, A, IA+K-1, JA+K-1, DESCA, D, E, TAU,
537 $ WORK, LWORK, IINFO )
540 CALL PB_TOPSET( ICTXT, 'combine
', 'columnwise
', COLCTOP )
541 CALL PB_TOPSET( ICTXT, 'combine
', 'rowwise
', ROWCTOP )
545 WORK( 1 ) = REAL( TTLWMIN )
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 pssyntrd(uplo, n, a, ia, ja, desca, d, e, tau, work, lwork, info)
subroutine pssytd2(uplo, n, a, ia, ja, desca, d, e, tau, work, lwork, info)
subroutine pssyttrd(uplo, n, a, ia, ja, desca, d, e, tau, work, lwork, info)