1      SUBROUTINE pzhengst( IBTYPE, UPLO, N, A, IA, JA, DESCA, B, IB, JB,
 
    2     $                     DESCB, SCALE, WORK, LWORK, INFO )
 
   11      INTEGER            IA, IB, IBTYPE, INFO, JA, JB, LWORK, N
 
   12      DOUBLE PRECISION   SCALE
 
   15      INTEGER            DESCA( * ), DESCB( * )
 
   16      COMPLEX*16         A( * ), B( * ), WORK( * )
 
  208      COMPLEX*16         ONEHALF, ONE, MONE
 
  209      DOUBLE PRECISION   RONE
 
  210      parameter( onehalf = ( 0.5d0, 0.0d0 ),
 
  211     $                   one = ( 1.0d0, 0.0d0 ),
 
  212     $                   mone = ( -1.0d0, 0.0d0 ), rone = 1.0d0 )
 
  213      INTEGER            DLEN_, CTXT_, MB_, NB_, RSRC_, CSRC_, LLD_
 
  214      parameter( dlen_ = 9, ctxt_ = 2, mb_ = 5, nb_ = 6,
 
  215     $                   rsrc_ = 7, csrc_ = 8, lld_ = 9 )
 
  218      LOGICAL            LQUERY, UPPER
 
  219      INTEGER            I, IACOL, IAROW, IBCOL, IBROW, ICOFFA, ICOFFB,
 
  220     $                   ictxt, indaa, indg, indr, indrt, iroffa,
 
  221     $                   iroffb, j, k, kb, lwmin, lwopt, mycol, myrow,
 
  222     $                   nb, np0, npcol, npk, nprow, nq0, postk
 
  225      INTEGER            DESCAA( DLEN_ ), DESCG( DLEN_ ),
 
  226     $                   descr( dlen_ ), descrt( dlen_ ), idum1( 2 ),
 
  231      INTEGER            INDXG2P, NUMROC
 
  232      EXTERNAL           lsame, indxg2p, numroc
 
  240      INTRINSIC          dble, dcmplx, dconjg, ichar, 
max, 
min, mod
 
  243      ictxt = desca( ctxt_ )
 
  244      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
 
  253      IF( nprow.EQ.-1 ) 
THEN 
  254         info = -( 700+ctxt_ )
 
  256         upper = lsame( uplo, 
'U' )
 
  257         CALL chk1mat( n, 3, n, 3, ia, ja, desca, 7, info )
 
  258         CALL chk1mat( n, 3, n, 3, ib, jb, descb, 11, info )
 
  260            iarow = indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
 
  262            ibrow = indxg2p( ib, descb( mb_ ), myrow, descb( rsrc_ ),
 
  264            iacol = indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
 
  266            ibcol = indxg2p( jb, descb( nb_ ), mycol, descb( csrc_ ),
 
  268            iroffa = mod( ia-1, desca( mb_ ) )
 
  269            icoffa = mod( ja-1, desca( nb_ ) )
 
  270            iroffb = mod( ib-1, descb( mb_ ) )
 
  271            icoffb = mod( jb-1, descb( nb_ ) )
 
  272            np0 = numroc( n, nb, 0, 0, nprow )
 
  273            nq0 = numroc( n, nb, 0, 0, npcol )
 
  274            lwmin = 
max( nb*( np0+1 ), 3*nb )
 
  275            IF( ibtype.EQ.1 .AND. .NOT.upper ) 
THEN 
  276               lwopt = 2*np0*nb + nq0*nb + nb*nb
 
  280            work( 1 ) = dcmplx( dble( lwopt ) )
 
  281            lquery = ( lwork.EQ.-1 )
 
  282            IF( ibtype.LT.1 .OR. ibtype.GT.3 ) 
THEN 
  284            ELSE IF( .NOT.upper .AND. .NOT.lsame( uplo, 
'L' ) ) 
THEN 
  286            ELSE IF( n.LT.0 ) 
THEN 
  288            ELSE IF( iroffa.NE.0 ) 
THEN 
  290            ELSE IF( icoffa.NE.0 ) 
THEN 
  292            ELSE IF( desca( mb_ ).NE.desca( nb_ ) ) 
THEN 
  294            ELSE IF( iroffb.NE.0 .OR. ibrow.NE.iarow ) 
THEN 
  296            ELSE IF( icoffb.NE.0 .OR. ibcol.NE.iacol ) 
THEN 
  298            ELSE IF( descb( mb_ ).NE.desca( mb_ ) ) 
THEN 
  300            ELSE IF( descb( nb_ ).NE.desca( nb_ ) ) 
THEN 
  302            ELSE IF( ictxt.NE.descb( ctxt_ ) ) 
THEN 
  303               info = -( 1100+ctxt_ )
 
  304            ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery ) 
THEN 
  311            idum1( 2 ) = ichar( 
'U' )
 
  313            idum1( 2 ) = ichar( 
'L' )
 
  316         CALL pchk2mat( n, 3, n, 3, ia, ja, desca, 7, n, 3, n, 3, ib,
 
  317     $                  jb, descb, 11, 2, idum1, idum2, info )
 
  321         CALL pxerbla( ictxt, 
'PZHENGST', -info )
 
  323      ELSE IF( lquery ) 
THEN 
  333      IF( ibtype.NE.1 .OR. upper .OR. lwork.LT.lwopt ) 
THEN 
  334         CALL pzhegst( ibtype, uplo, n, a, ia, ja, desca, b, ib, jb,
 
  335     $                 descb, scale, info )
 
  339      CALL descset( descg, n, nb, nb, nb, iarow, iacol, ictxt, np0 )
 
  340      CALL descset( descr, n, nb, nb, nb, iarow, iacol, ictxt, np0 )
 
  341      CALL descset( descrt, nb, n, nb, nb, iarow, iacol, ictxt, nb )
 
  342      CALL descset( descaa, nb, nb, nb, nb, iarow, iacol, ictxt, nb )
 
  345      indr = indg + descg( lld_ )*nb
 
  346      indaa = indr + descr( lld_ )*nb
 
  347      indrt = indaa + descaa( lld_ )*nb
 
  351         kb = 
min( n-k+1, nb )
 
  356         CALL pzlacpy( 
'A', n-postk+1, kb, b, postk+ib-1, k+jb-1, descb,
 
  357     $                 work( indg ), postk, 1, descg )
 
  358         CALL pzlacpy( 
'A', n-postk+1, kb, a, postk+ia-1, k+ja-1, desca,
 
  359     $                 work( indr ), postk, 1, descr )
 
  360         CALL pzlacpy( 
'A', kb, k-1, a, k+ia-1, ja, desca,
 
  361     $                 work( indrt ), 1, 1, descrt )
 
  363         CALL pzlacpy( 
'L', kb, kb, a, k+ia-1, k+ja-1, desca,
 
  364     $                 work( indr ), k, 1, descr )
 
  365         CALL pztrsm( 
'Right', 
'L', 
'N', 
'N', npk, kb, mone, b, k+ib-1,
 
  366     $                k+jb-1, descb, work( indg ), postk, 1, descg )
 
  368         CALL pzhemm( 
'Right', 
'L', npk, kb, onehalf, a, k+ia-1, k+ja-1,
 
  369     $                desca, work( indg ), postk, 1, descg, one,
 
  370     $                work( indr ), postk, 1, descr )
 
  372         CALL pzher2k( 
'Lower', 
'No T', npk, kb, one, work( indg ),
 
  373     $                 postk, 1, descg, work( indr ), postk, 1, descr,
 
  374     $                 rone, a, postk+ia-1, postk+ja-1, desca )
 
  376         CALL pzgemm( 
'No T', 
'No Conj', npk, k-1, kb, one,
 
  377     $                work( indg ), postk, 1, descg, work( indrt ), 1,
 
  378     $                1, descrt, one, a, postk+ia-1, ja, desca )
 
  380         CALL pzhemm( 
'Right', 
'L', npk, kb, one, work( indr ), k, 1,
 
  381     $                descr, work( indg ), postk, 1, descg, one, a,
 
  382     $                postk+ia-1, k+ja-1, desca )
 
  384         CALL pztrsm( 
'Left', 
'Lower', 
'No Conj', 
'Non-unit', kb, k-1,
 
  385     $                one, b, k+ib-1, k+jb-1, descb, a, k+ia-1, ja,
 
  388         CALL pzlacpy( 
'L', kb, kb, a, k+ia-1, k+ja-1, desca,
 
  389     $                 work( indaa ), 1, 1, descaa )
 
  391         IF( myrow.EQ.descaa( rsrc_ ) .AND. mycol.EQ.descaa( csrc_ ) )
 
  395                  work( indaa+j-1+( i-1 )*descaa( lld_ ) )
 
  396     $               = dconjg( work( indaa+i-1+( j-1 )*
 
  402         CALL pztrsm( 
'Left', 
'Lower', 
'No Conj', 
'Non-unit', kb, kb,
 
  403     $                one, b, k+ib-1, k+jb-1, descb, work( indaa ), 1,
 
  406         CALL pztrsm( 
'Right', 
'Lower', 
'Conj', 
'Non-unit', kb, kb, one,
 
  407     $                b, k+ib-1, k+jb-1, descb, work( indaa ), 1, 1,
 
  410         CALL pzlacpy( 
'L', kb, kb, work( indaa ), 1, 1, descaa, a,
 
  411     $                 k+ia-1, k+ja-1, desca )
 
  413         CALL pztrsm( 
'Right', 
'Lower', 
'Conj', 
'Non-unit', npk, kb,
 
  414     $                one, b, k+ib-1, k+jb-1, descb, a, postk+ia-1,
 
  417         descr( csrc_ ) = mod( descr( csrc_ )+1, npcol )
 
  418         descg( csrc_ ) = mod( descg( csrc_ )+1, npcol )
 
  419         descrt( rsrc_ ) = mod( descrt( rsrc_ )+1, nprow )
 
  420         descaa( rsrc_ ) = mod( descaa( rsrc_ )+1, nprow )
 
  421         descaa( csrc_ ) = mod( descaa( csrc_ )+1, npcol )
 
  424      work( 1 ) = dcmplx( dble( lwopt ) )