1 SUBROUTINE pzgebd2( M, N, A, IA, JA, DESCA, D, E, TAUQ, TAUP,
10 INTEGER IA, INFO, JA, LWORK, M, N
14 DOUBLE PRECISION D( * ), E( * )
15 COMPLEX*16 A( * ), TAUP( * ), TAUQ( * ), WORK( * )
240 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
241 $ lld_, mb_, m_, nb_, n_, rsrc_
242 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
243 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
244 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
246 parameter( one = ( 1.0d+0, 0.0d+0 ),
247 $ zero = ( 0.0d+0, 0.0d+0 ) )
251 INTEGER I, IACOL, IAROW, ICOFFA, , II, IROFFA, J,
252 $ jj, k, lwmin, mpa0, mycol, myrow, npcol, nprow,
257 INTEGER DESCD( DLEN_ ), DESCE( DLEN_ )
267 INTEGER INDXG2P, NUMROC
268 EXTERNAL indxg2p, numroc
271 INTRINSIC dble, dcmplx,
max,
min, mod
277 ictxt = desca( ctxt_ )
283 IF( nprow.EQ.-1 )
THEN
286 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 6, info )
288 iroffa = mod( ia-1, desca( mb_ ) )
289 icoffa = mod( ja-1, desca( nb_ ) )
290 iarow = indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
292 iacol = indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
294 mpa0 = numroc( m+iroffa, desca( mb_ ), myrow, iarow, nprow )
295 nqa0 = numroc( n+icoffa, desca( nb_ ), mycol, iacol, npcol )
296 lwmin =
max( mpa0, nqa0 )
298 work( 1 ) = dcmplx( dble( lwmin ) )
299 lquery = ( lwork.EQ.-1 )
300 IF( iroffa.NE.icoffa )
THEN
302 ELSE IF( desca( mb_ ).NE.desca( nb_ ) )
THEN
304 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
311 CALL pxerbla( ictxt,
'PZGEBD2', -info )
312 CALL blacs_abort( ictxt, 1 )
314 ELSE IF( lquery )
THEN
318 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, ii, jj,
321 IF( m.EQ.1 .AND. n.EQ.1 )
THEN
322 IF( mycol.EQ.iacol )
THEN
323 IF( myrow.EQ.iarow )
THEN
324 i = ii+(jj-1)*desca( lld_ )
325 CALL zlarfg( 1, a( i ), a( i ), 1, tauq( jj ) )
326 d( jj ) = dble( a( i ) )
327 CALL dgebs2d( ictxt,
'Columnwise',
' ', 1, 1, d( jj ),
329 CALL zgebs2d( ictxt,
'Columnwise',
' ', 1, 1, tauq( jj ),
332 CALL dgebr2d( ictxt,
'Columnwise', '
', 1, 1, D( JJ ),
334 CALL ZGEBR2D( ICTXT, 'columnwise
', ' ', 1, 1, TAUQ( JJ ),
349 CALL DESCSET( DESCD, 1, JA+MIN(M,N)-1, 1, DESCA( NB_ ), MYROW,
350 $ DESCA( CSRC_ ), DESCA( CTXT_ ), 1 )
351 CALL DESCSET( DESCE, IA+MIN(M,N)-1, 1, DESCA( MB_ ), 1,
352 $ DESCA( RSRC_ ), MYCOL, DESCA( CTXT_ ),
361 CALL PZLARFG( M-K+1, ALPHA, I, J, A, MIN( I+1, M+IA-1 ),
362 $ J, DESCA, 1, TAUQ )
363 CALL PDELSET( D, 1, J, DESCD, DBLE( ALPHA ) )
364 CALL PZELSET( A, I, J, DESCA, ONE )
368 CALL PZLARFC( 'left
', M-K+1, N-K, A, I, J, DESCA, 1, TAUQ,
369 $ A, I, J+1, DESCA, WORK )
370 CALL PZELSET( A, I, J, DESCA, DCMPLX( DBLE( ALPHA ) ) )
377 CALL PZLACGV( N-K, A, I, J+1, DESCA, DESCA( M_ ) )
378 CALL PZLARFG( N-K, ALPHA, I, J+1, A, I,
379 $ MIN( J+2, JA+N-1 ), DESCA, DESCA( M_ ),
381 CALL PDELSET( E, I, 1, DESCE, DBLE( ALPHA ) )
382 CALL PZELSET( A, I, J+1, DESCA, ONE )
386 CALL PZLARF( 'right
', M-K, N-K, A, I, J+1, DESCA,
387 $ DESCA( M_ ), TAUP, A, I+1, J+1, DESCA,
389 CALL PZELSET( A, I, J+1, DESCA, DCMPLX( DBLE( ALPHA ) ) )
390 CALL PZLACGV( N-K, A, I, J+1, DESCA, DESCA( M_ ) )
392 CALL PZELSET( TAUP, I, 1, DESCE, ZERO )
400 CALL DESCSET( DESCD, IA+MIN(M,N)-1, 1, DESCA( MB_ ), 1,
401 $ DESCA( RSRC_ ), MYCOL, DESCA( CTXT_ ),
403 CALL DESCSET( DESCE, 1, JA+MIN(M,N)-1, 1, DESCA( NB_ ), MYROW,
404 $ DESCA( CSRC_ ), DESCA( CTXT_ ), 1 )
412 CALL PZLACGV( N-K+1, A, I, J, DESCA, DESCA( M_ ) )
413 CALL PZLARFG( N-K+1, ALPHA, I, J, A, I,
414 $ MIN( J+1, JA+N-1 ), DESCA, DESCA( M_ ), TAUP )
415 CALL PDELSET( D, I, 1, DESCD, DBLE( ALPHA ) )
416 CALL PZELSET( A, I, J, DESCA, ONE )
420 CALL PZLARF( 'right
', M-K, N-K+1, A, I, J, DESCA,
421 $ DESCA( M_ ), TAUP, A, MIN( I+1, IA+M-1 ), J,
423 CALL PZELSET( A, I, J, DESCA, DCMPLX( DBLE( ALPHA ) ) )
424 CALL PZLACGV( N-K+1, A, I, J, DESCA, DESCA( M_ ) )
431 CALL PZLARFG( M-K, ALPHA, I+1, J, A,
432 $ MIN( I+2, IA+M-1 ), J, DESCA, 1, TAUQ )
433 CALL PDELSET( E, 1, J, DESCE, DBLE( ALPHA ) )
434 CALL PZELSET( A, I+1, J, DESCA, ONE )
438 CALL PZLARFC( 'left
', M-K, N-K, A, I+1, J, DESCA, 1,
439 $ TAUQ, A, I+1, J+1, DESCA, WORK )
440 CALL PZELSET( A, I+1, J, DESCA, DCMPLX( DBLE( ALPHA ) ) )
442 CALL PZELSET( TAUQ, 1, J, DESCE, ZERO )
447 WORK( 1 ) = DCMPLX( DBLE( LWMIN ) )
subroutine pzlarf(side, m, n, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)
subroutine pzlarfc(side, m, n, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)