1 SUBROUTINE pdgehrd( N, ILO, IHI, A, IA, JA, DESCA, TAU, WORK,
10 INTEGER IA, IHI, ILO, INFO, JA, LWORK, N
14 DOUBLE PRECISION A( * ), TAU( * ), WORK( * )
197 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
198 $ lld_, mb_, m_, nb_, n_, rsrc_
199 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
200 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
201 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
202 DOUBLE PRECISION ONE, ZERO
203 parameter( one = 1.0d+0, zero = 0.0d+0 )
207 CHARACTER COLCTOP, ROWCTOP
208 INTEGER I, IACOL, IAROW, IB, ICOFFA, ICTXT, IHIP,
209 $ ihlp, iia, iinfo, ilcol, ilrow, imcol, inlq,
210 $ ioff, ipt, ipw, ipy, iroffa, j, jj, jja, jy,
211 $ k, l, lwmin, mycol, myrow, nb, npcol, nprow,
216 INTEGER DESCY( DLEN_ ), IDUM1( 3 ), IDUM2( 3 )
228 INTRINSIC dble,
max,
min, mod
234 ictxt = desca( ctxt_ )
240 IF( nprow.EQ.-1 )
THEN
243 CALL chk1mat( n, 1, n, 1, ia, ja, desca, 7, info )
246 iroffa = mod( ia-1, nb )
247 icoffa = mod( ja-1, nb )
248 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol,
249 $ iia, jja, iarow, iacol )
250 ihip =
numroc( ihi+iroffa, nb, myrow, iarow, nprow )
251 ioff = mod( ia+ilo-2, nb )
252 ilrow = indxg2p( ia+ilo-1, nb, myrow, desca( rsrc_ ),
254 ihlp =
numroc( ihi-ilo+ioff+1, nb, myrow, ilrow, nprow )
255 ilcol = indxg2p( ja+ilo-1, nb, mycol, desca( csrc_ ),
257 inlq =
numroc( n-ilo+ioff+1, nb, mycol, ilcol, npcol )
258 lwmin = nb*( nb +
max( ihip+1, ihlp+inlq ) )
260 work( 1 ) = dble( lwmin )
261 lquery = ( lwork.EQ.-1 )
262 IF( ilo.LT.1 .OR. ilo.GT.
max( 1, n ) )
THEN
264 ELSE IF( ihi.LT.
min( ilo, n ) .OR. ihi.GT.n )
THEN
267 ELSE IF( iroffa.NE.icoffa )
THEN
269 ELSE IF( desca( mb_ ).NE.desca( nb_ ) )
THEN
271 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
279 IF( lwork.EQ.-1 )
THEN
285 CALL pchk1mat( n, 1, n, 1, ia, ja, desca, 7, 3, idum1, idum2,
290 CALL pxerbla( ictxt,
'PDGEHRD', -info )
292 ELSE IF( lquery )
THEN
299 CALL infog1l( ja+ilo-2, nb, npcol, mycol, desca( csrc_ ), jj,
301 DO 10 j = jja,
min( jj, nq )
305 CALL infog1l( ja+ihi-1, nb, npcol, mycol, desca( csrc_ ), jj,
316 CALL pb_topget( ictxt,
'Combine',
'Columnwise', colctop )
317 CALL pb_topget( ictxt,
'Combine',
'Rowwise', rowctop )
318 CALL pb_topset( ictxt,
'Combine', 'columnwise
', '1-tree
' )
319 CALL PB_TOPSET( ICTXT, 'combine
', 'rowwise
', '1-tree
' )
323 IPW = IPY + IHIP * NB
324 CALL DESCSET( DESCY, IHI+IROFFA, NB, NB, NB, IAROW, ILCOL, ICTXT,
333 DO 30 L = 1, IHI-ILO+IOFF-NB, NB
341 CALL PDLAHRD( IHI, K, IB, A, IA, J, DESCA, TAU, WORK( IPT ),
342 $ WORK( IPY ), 1, JY, DESCY, WORK( IPW ) )
348 CALL PDELSET2( EI, A, I+IB, J+IB-1, DESCA, ONE )
349 CALL PDGEMM( 'no transpose
', 'transpose
', IHI, IHI-K-IB+1, IB,
350 $ -ONE, WORK( IPY ), 1, JY, DESCY, A, I+IB, J,
351 $ DESCA, ONE, A, IA, J+IB, DESCA )
352 CALL PDELSET( A, I+IB, J+IB-1, DESCA, EI )
357 CALL PDLARFB( 'left
', 'transpose
', 'forward
', 'columnwise
',
358 $ IHI-K, N-K-IB+1, IB, A, I+1, J, DESCA,
359 $ WORK( IPT ), A, I+1, J+IB, DESCA, WORK( IPY ) )
364 DESCY( CSRC_ ) = MOD( DESCY( CSRC_ ) + 1, NPCOL )
370 CALL PDGEHD2( N, K, IHI, A, IA, JA, DESCA, TAU, WORK, LWORK,
373 CALL PB_TOPSET( ICTXT, 'combine
', 'columnwise
', COLCTOP )
374 CALL PB_TOPSET( ICTXT, 'combine
', 'rowwise
', ROWCTOP )
376 WORK( 1 ) = DBLE( LWMIN )