1 SUBROUTINE pcgebrd( M, N, A, IA, JA, DESCA, D, E, TAUQ, TAUP,
10 INTEGER IA, INFO, JA, LWORK, M, N
15 COMPLEX A( * ), TAUP( * ), ( * ), WORK( * )
241 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
242 $ lld_, mb_, m_, nb_, n_, rsrc_
243 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
244 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
245 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
247 parameter( one = ( 1.0e+0, 0.0e+0 ) )
251 CHARACTER COLCTOP, ROWCTOP
252 INTEGER I, IACOL, IAROW, ICTXT, IINFO, IOFF, IPW, IPY,
253 $ iw, j, jb, js, jw, k, l, lwmin, mn, mp, mycol,
254 $ myrow, nb, npcol, nprow, nq
257 INTEGER DESCWX( DLEN_ ), DESCWY( DLEN_ ), IDUM1( 1 ),
263 $ pb_topget, pb_topset,
pxerbla
266 INTEGER INDXG2L, INDXG2P, NUMROC
267 EXTERNAL indxg2l, indxg2p, numroc
276 ictxt = desca( ctxt_ )
282 IF( nprow.EQ.-1 )
THEN
285 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 6, info )
288 ioff = mod( ia-1, desca( mb_ ) )
289 iarow = indxg2p( ia, nb, myrow, desca( rsrc_ ), nprow )
290 iacol = indxg2p( ja, nb, mycol, desca( csrc_ ), npcol )
291 mp = numroc( m+ioff, nb, myrow, iarow, nprow )
292 nq = numroc( n+ioff, nb, mycol, iacol, npcol )
293 lwmin = nb*( mp+nq+1 ) + nq
295 work( 1 ) =
cmplx( real( lwmin ) )
296 lquery = ( lwork.EQ.-1 )
297 IF( ioff.NE.mod( ja-1, desca( nb_ ) ) )
THEN
299 ELSE IF( nb.NE.desca( nb_ ) )
THEN
301 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
311 CALL pchk1mat( m, 1, n, 2, ia, ja, desca, 6, 1, idum1, idum2,
316 CALL pxerbla( ictxt,
'PCGEBRD', -info )
318 ELSE IF( lquery )
THEN
330 CALL pb_topget( ictxt,
'Combine',
'Columnwise', colctop )
331 CALL pb_topget( ictxt,
'Combine',
'Rowwise', rowctop )
332 CALL pb_topset( ictxt,
'Combine',
'Columnwise',
'1-tree' )
333 CALL pb_topset( ictxt, 'combine
', 'rowwise
', '1-tree
' )
338 CALL DESCSET( DESCWX, M+IOFF, NB, NB, NB, IAROW, IACOL, ICTXT,
340 CALL DESCSET( DESCWY, NB, N+IOFF, NB, NB, IAROW, IACOL, ICTXT,
343 MP = NUMROC( M+IA-1, NB, MYROW, DESCA( RSRC_ ), NPROW )
344 NQ = NUMROC( N+JA-1, NB, MYCOL, DESCA( CSRC_ ), NPCOL )
350 DO 10 L = 1, MN+IOFF-NB, NB
358 CALL PCLABRD( M-K+1, N-K+1, JB, A, I, J, DESCA, D, E, TAUQ,
359 $ TAUP, WORK, IW, JW, DESCWX, WORK( IPY ), IW,
360 $ JW, DESCWY, WORK( IPW ) )
365 CALL PCGEMM( 'no transpose
', 'no transpose
', M-K-JB+1,
366 $ N-K-JB+1, JB, -ONE, A, I+JB, J, DESCA,
367 $ WORK( IPY ), IW, JW+JB, DESCWY, ONE, A, I+JB,
369 CALL PCGEMM( 'no transpose
', 'no transpose
', M-K-JB+1,
370 $ N-K-JB+1, JB, -ONE, WORK, IW+JB, JW, DESCWX, A, I,
371 $ J+JB, DESCA, ONE, A, I+JB, J+JB, DESCA )
376 JS = MIN( INDXG2L( I+JB-1, NB, 0, DESCA( RSRC_ ), NPROW ),
379 $ CALL PCELSET( A, I+JB-1, J+JB, DESCA, CMPLX( E( JS ) ) )
381 JS = MIN( INDXG2L( J+JB-1, NB, 0, DESCA( CSRC_ ), NPCOL ),
384 $ CALL PCELSET( A, I+JB, J+JB-1, DESCA, CMPLX( E( JS ) ) )
391 DESCWX( M_ ) = DESCWX( M_ ) - JB
392 DESCWX( RSRC_ ) = MOD( DESCWX( RSRC_ ) + 1, NPROW )
393 DESCWX( CSRC_ ) = MOD( DESCWX( CSRC_ ) + 1, NPCOL )
394 DESCWY( N_ ) = DESCWY( N_ ) - JB
395 DESCWY( RSRC_ ) = MOD( DESCWY( RSRC_ ) + 1, NPROW )
396 DESCWY( CSRC_ ) = MOD( DESCWY( CSRC_ ) + 1, NPCOL )
402 CALL PCGEBD2( M-K+1, N-K+1, A, IA+K-1, JA+K-1, DESCA, D, E, TAUQ,
403 $ TAUP, WORK, LWORK, IINFO )
405 CALL PB_TOPSET( ICTXT, 'combine
', 'columnwise
', COLCTOP )
406 CALL PB_TOPSET( ICTXT, 'combine
', 'rowwise
', ROWCTOP )
408 WORK( 1 ) = CMPLX( REAL( LWMIN ) )
subroutine pclabrd(m, n, nb, a, ia, ja, desca, d, e, tauq, taup, x, ix, jx, descx, y, iy, jy, descy, work)