1 SUBROUTINE pdsyntrd( UPLO, N, A, IA, JA, DESCA, D, E, TAU, WORK,
11 INTEGER IA, INFO, JA, LWORK, N
15 DOUBLE PRECISION A( * ), D( * ), E( * ), TAU( * ), WORK( * )
252 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, , M_, N_,
253 $ mb_, nb_, rsrc_, csrc_, lld_
254 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
255 $ ctxt_ = 2, m_ = 3, n_
258 parameter( one = 1.0d+0 )
261 LOGICAL LQUERY, UPPER
263 INTEGER ANB, CTXTB, I, IACOL, IAROW, ICOFFA, ICTXT,
264 $ iinfo, indb, indd, inde, indtau, indw, ipw,
265 $ iroffa, j, jb, jx, k, kk, llwork, lwmin
266 $ mycol, mycolb, myrow, myrowb, nb, np, npcol,
267 $ npcolb, nprow, nprowb, nps, nq, onepmin, sqnpc,
271 INTEGER DESCB( DLEN_ ), DESCW( DLEN_ ), IDUM1( 2 ),
279 $ pb_topget, pb_topset,
pxerbla
283 INTEGER INDXG2L, INDXG2P, NUMROC, PJLAENV
284 EXTERNAL lsame, indxg2l, indxg2p, numroc, pjlaenv
287 INTRINSIC dble, ichar, int,
max,
min, mod, sqrt
292 IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dtype_*lld_*mb_*m_*nb_*n_*
296 ictxt = desca( ctxt_ )
302 IF( nprow.EQ.-1 )
THEN
303 info = -( 600+ctxt_ )
305 CALL chk1mat( n, 2, n, 2, ia, ja, desca, 6, info )
306 upper = lsame( uplo,
'U' )
309 iroffa = mod( ia-1, desca( mb_ ) )
310 icoffa = mod( ja-1, desca( nb_ ) )
311 iarow = indxg2p( ia, nb, myrow, desca( rsrc_ ), nprow )
312 iacol = indxg2p( ja, nb, mycol, desca( csrc_ ), npcol )
313 np = numroc( n, nb, myrow, iarow, nprow )
314 nq =
max( 1, numroc( n+ja-1, nb, mycol, desca( csrc_ ),
316 lwmin =
max( ( np+1 )*nb, 3*nb )
317 anb = pjlaenv( ictxt, 3,
'PDSYTTRD',
'L', 0, 0, 0, 0 )
318 minsz = pjlaenv( ictxt, 5,
'PDSYTTRD',
'L', 0, 0, 0, 0 )
319 sqnpc = int( sqrt( dble( nprow*npcol ) ) )
320 nps =
max( numroc( n, 1, 0, 0, sqnpc ), 2*anb )
321 ttlwmin = 2*( anb+1 )*( 4*nps+2 ) + ( nps+4 )*nps
323 work( 1 ) = dble( ttlwmin )
324 lquery = ( lwork.EQ.-1 )
325 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
331 ELSE IF( iroffa.NE.icoffa .OR. icoffa.NE.0 )
THEN
333 ELSE IF( desca( mb_ ).NE.desca( nb_ ) )
THEN
335 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
340 idum1( 1 ) = ichar(
'U' )
342 idum1( 1 ) = ichar(
'L' )
345 IF( lwork.EQ.-1 )
THEN
351 CALL pchk1mat( n, 2, n, 2, ia, ja, desca, 6, 2, idum1, idum2,
356 CALL pxerbla( ictxt,
'PDSYNTRD', -info )
358 ELSE IF( lquery )
THEN
368 onepmin = n*n + 3*n + 1
370 CALL igamn2d( ictxt,
'A',
' ', 1, 1, llwork, 1, 1, -1, -1, -1,
379 IF( ( n.LT.minsz .OR. sqnpc.EQ.1 ) .AND. llwork.GE.onepmin .AND.
384 IF( llwork.GE.ttlwmin .AND. .NOT.upper )
THEN
389 IF( nprowb.GE.1 )
THEN
393 indd = indb + nps*nps
397 llwork = llwork - indw + 1
399 CALL blacs_get( ictxt, 10, ctxtb )
402 CALL descset( descb, n, n, 1, 1, 0, 0, ctxtb, nps )
404 CALL pdtrmr2d( uplo,
'N', n, n, a, ia, ja, desca, work( indb ),
405 $ 1, 1, descb, ictxt )
410 IF( nprowb.GT.0 )
THEN
412 IF( nprowb.EQ.1 )
THEN
413 CALL dsytrd( uplo, n, work( indb ), nps, work( indd ),
414 $ work( inde ), work( indtau ), work( indw ),
418 CALL pdsyttrd(
'L', n, work( indb ), 1, 1, descb,
419 $ work( indd ), work( inde ),
420 $ work( indtau ), work( indw ), llwork,
429 CALL pdlamr1d( n-1, work( inde ), 1, 1, descb, e, 1, ja,
432 CALL pdlamr1d( n, work( indd ), 1, 1, descb, d, 1, ja, desca )
434 CALL pdlamr1d( n, work( indtau ), 1, 1, descb, tau, 1, ja,
437 CALL pdtrmr2d( uplo,
'N', n, n, work( indb ), 1, 1, descb, a,
438 $ ia, ja, desca, ictxt )
445 CALL pb_topget( ictxt,
'Combine', 'columnwise
', COLCTOP )
446 CALL PB_TOPGET( ICTXT, 'combine
', 'rowwise
', ROWCTOP )
447 CALL PB_TOPSET( ICTXT, 'combine
', 'columnwise
', '1-tree
' )
448 CALL PB_TOPSET( ICTXT, 'combine
', 'rowwise
', '1-tree
' )
456 KK = MOD( JA+N-1, NB )
459 CALL DESCSET( DESCW, N, NB, NB, NB, IAROW,
460 $ INDXG2P( JA+N-KK, NB, MYCOL, DESCA( CSRC_ ),
461 $ NPCOL ), ICTXT, MAX( 1, NP ) )
463 DO 10 K = N - KK + 1, NB + 1, -NB
464 JB = MIN( N-K+1, NB )
472 CALL PDLATRD( UPLO, K+JB-1, JB, A, IA, JA, DESCA, D, E,
473 $ TAU, WORK, 1, 1, DESCW, WORK( IPW ) )
479 CALL PDSYR2K( UPLO, 'no transpose
', K-1, JB, -ONE, A, IA,
480 $ J, DESCA, WORK, 1, 1, DESCW, ONE, A, IA,
485 JX = MIN( INDXG2L( J, NB, 0, IACOL, NPCOL ), NQ )
486 CALL PDELSET( A, I-1, J, DESCA, E( JX ) )
488 DESCW( CSRC_ ) = MOD( DESCW( CSRC_ )+NPCOL-1, NPCOL )
494 CALL PDSYTD2( UPLO, MIN( N, NB ), A, IA, JA, DESCA, D, E,
495 $ TAU, WORK, LWORK, IINFO )
501 KK = MOD( JA+N-1, NB )
504 CALL DESCSET( DESCW, N, NB, NB, NB, IAROW, IACOL, ICTXT,
507 DO 20 K = 1, N - NB, NB
515 CALL PDLATRD( UPLO, N-K+1, NB, A, I, J, DESCA, D, E, TAU,
516 $ WORK, K, 1, DESCW, WORK( IPW ) )
522 CALL PDSYR2K( UPLO, 'no transpose
', N-K-NB+1, NB, -ONE,
523 $ A, I+NB, J, DESCA, WORK, K+NB, 1, DESCW,
524 $ ONE, A, I+NB, J+NB, DESCA )
528 JX = MIN( INDXG2L( J+NB-1, NB, 0, IACOL, NPCOL ), NQ )
529 CALL PDELSET( A, I+NB, J+NB-1, DESCA, E( JX ) )
531 DESCW( CSRC_ ) = MOD( DESCW( CSRC_ )+1, NPCOL )
537 CALL PDSYTD2( UPLO, KK, A, IA+K-1, JA+K-1, DESCA, D, E, TAU,
538 $ WORK, LWORK, IINFO )
541 CALL PB_TOPSET( ICTXT, 'combine
', 'columnwise', colctop )
542 CALL pb_topset( ictxt,
'Combine',
'Rowwise', rowctop )
546 work( 1 ) = dble( ttlwmin )