1 SUBROUTINE psgebd2( M, N, A, IA, JA, DESCA, D, E, TAUQ, TAUP,
10 INTEGER IA, INFO, JA, LWORK, M, N
14 REAL A( * ), D( * ), E( * ), TAUP( * ), TAUQ( * ),
238 INTEGER , CSRC_, CTXT_, DLEN_, DTYPE_,
239 $ lld_, mb_, m_, nb_, n_, rsrc_
240 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
241 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
242 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
244 parameter( one = 1.0e+0, zero = 0.0e+0 )
248 INTEGER I, , IAROW, ICOFFA, ICTXT, II, IROFFA, J,
249 $ jj, k, lwmin, mpa0, mycol, myrow, npcol, nprow,
254 INTEGER DESCD( DLEN_ ), DESCE( DLEN_ )
262 INTEGER INDXG2P, NUMROC
263 EXTERNAL indxg2p, numroc
266 INTRINSIC max,
min, mod, real
272 ictxt = desca( ctxt_ )
278 IF( nprow.EQ.-1 )
THEN
281 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 6, info )
283 iroffa = mod( ia-1, desca( mb_ ) )
284 icoffa = mod( ja-1, desca( nb_ ) )
285 iarow = indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
287 iacol = indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
289 mpa0 = numroc( m+iroffa, desca( mb_ ), myrow, iarow, nprow )
290 nqa0 = numroc( n+icoffa, desca( nb_ ), mycol, iacol, npcol )
291 lwmin =
max( mpa0, nqa0 )
293 work( 1 ) = real( lwmin )
294 lquery = ( lwork.EQ.-1 )
295 IF( iroffa.NE.icoffa )
THEN
297 ELSE IF( desca( mb_ ).NE.desca( nb_ ) )
THEN
299 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
306 CALL pxerbla( ictxt,
'PSGEBD2', -info )
307 CALL blacs_abort( ictxt, 1 )
309 ELSE IF( lquery )
THEN
313 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, ii, jj,
316 IF( m.EQ.1 .AND. n.EQ.1 )
THEN
317 IF( mycol.EQ.iacol )
THEN
318 IF( myrow.EQ.iarow )
THEN
319 i = ii+(jj-1)*desca( lld_ )
320 CALL slarfg( 1, a( i ), a( i ), 1, tauq( jj ) )
322 CALL sgebs2d( ictxt,
'Columnwise',
' ', 1, 1, d( jj ),
324 CALL sgebs2d( ictxt, 'columnwise
', ' ', 1, 1, TAUQ( JJ ),
327 CALL SGEBR2D( ICTXT, 'columnwise
', ' ', 1, 1, D( JJ ),
329 CALL SGEBR2D( ICTXT, 'columnwise
', ' ', 1, 1, TAUQ( JJ ),
344 CALL DESCSET( DESCD, 1, JA+MIN(M,N)-1, 1, DESCA( NB_ ), MYROW,
345 $ DESCA( CSRC_ ), DESCA( CTXT_ ), 1 )
346 CALL DESCSET( DESCE, IA+MIN(M,N)-1, 1, DESCA( MB_ ), 1,
347 $ DESCA( RSRC_ ), MYCOL, DESCA( CTXT_ ),
356 CALL PSLARFG( M-K+1, ALPHA, I, J, A, MIN( I+1, M+IA-1 ),
357 $ J, DESCA, 1, TAUQ )
358 CALL PSELSET( D, 1, J, DESCD, ALPHA )
359 CALL PSELSET( A, I, J, DESCA, ONE )
363 CALL PSLARF( 'left
', M-K+1, N-K, A, I, J, DESCA, 1, TAUQ, A,
364 $ I, J+1, DESCA, WORK )
365 CALL PSELSET( A, I, J, DESCA, ALPHA )
372 CALL PSLARFG( N-K, ALPHA, I, J+1, A, I,
373 $ MIN( J+2, JA+N-1 ), DESCA, DESCA( M_ ),
375 CALL PSELSET( E, I, 1, DESCE, ALPHA )
376 CALL PSELSET( A, I, J+1, DESCA, ONE )
380 CALL PSLARF( 'right
', M-K, N-K, A, I, J+1, DESCA,
381 $ DESCA( M_ ), TAUP, A, I+1, J+1, DESCA,
383 CALL PSELSET( A, I, J+1, DESCA, ALPHA )
385 CALL PSELSET( TAUP, I, 1, DESCE, ZERO )
393 CALL DESCSET( DESCD, IA+MIN(M,N)-1, 1, DESCA( MB_ ), 1,
394 $ DESCA( RSRC_ ), MYCOL, DESCA( CTXT_ ),
396 CALL DESCSET( DESCE, 1, JA+MIN(M,N)-1, 1, DESCA( NB_ ), MYROW,
397 $ DESCA( CSRC_ ), DESCA( CTXT_ ), 1 )
405 CALL PSLARFG( N-K+1, ALPHA, I, J, A, I,
406 $ MIN( J+1, JA+N-1 ), DESCA, DESCA( M_ ), TAUP )
407 CALL PSELSET( D, I, 1, DESCD, ALPHA )
408 CALL PSELSET( A, I, J, DESCA, ONE )
412 CALL PSLARF( 'right
', M-K, N-K+1, A, I, J, DESCA,
413 $ DESCA( M_ ), TAUP, A, MIN( I+1, IA+M-1 ), J,
415 CALL PSELSET( A, I, J, DESCA, ALPHA )
422 CALL PSLARFG( M-K, ALPHA, I+1, J, A,
423 $ MIN( I+2, IA+M-1 ), J, DESCA, 1, TAUQ )
424 CALL PSELSET( E, 1, J, DESCE, ALPHA )
425 CALL PSELSET( A, I+1, J, DESCA, ONE )
429 CALL PSLARF( 'left
', M-K, N-K, A, I+1, J, DESCA, 1, TAUQ,
430 $ A, I+1, J+1, DESCA, WORK )
431 CALL PSELSET( A, I+1, J, DESCA, ALPHA )
433 CALL PSELSET( TAUQ, 1, J, DESCE, ZERO )
438 WORK( 1 ) = REAL( LWMIN )
subroutine pslarf(side, m, n, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)