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, , ICOFFA, ICTXT,
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 lquery = ( lwork.EQ.-1 )
324 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
330 ELSE IF( iroffa.NE.icoffa .OR. icoffa.NE.0 )
THEN
332 ELSE IF( desca( mb_ ).NE.desca( nb_ ) )
THEN
334 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
339 idum1( 1 ) = ichar(
'U' )
341 idum1( 1 ) = ichar(
'L' )
344 IF( lwork.EQ.-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 )