1 SUBROUTINE pdgeqr2( M, N, A, IA, JA, DESCA, TAU, WORK, LWORK,
10 INTEGER IA, INFO, JA, LWORK, M, N
14 DOUBLE PRECISION A( * ), TAU( * ), WORK( * )
164 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
165 $ lld_, mb_, m_, nb_, n_, rsrc_
166 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
167 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
168 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
170 parameter( one = 1.0d+0 )
174 CHARACTER COLBTOP, ROWBTOP
175 INTEGER I, II, IACOL, IAROW, ICTXT, J, JJ, K, LWMIN,
176 $ mp, mycol, myrow, npcol, nprow, nq
177 DOUBLE PRECISION AJJ, ALPHA
190 INTRINSIC dble,
max,
min, mod
196 ictxt = desca( ctxt_ )
202 IF( nprow.EQ.-1 )
THEN
205 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 6, info )
207 iarow =
indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
209 iacol =
indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
211 mp = numroc( m+mod( ia-1, desca( mb_ ) ), desca( mb_ ),
212 $ myrow, iarow, nprow )
213 nq = numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
214 $ mycol, iacol, npcol )
215 lwmin = mp +
max( 1, nq )
217 work( 1 ) = dble( lwmin )
218 lquery = ( lwork.EQ.-1 )
219 IF( lwork.LT.lwmin .AND. .NOT.lquery )
225 CALL pxerbla( ictxt,
'PDGEQR2', -info )
226 CALL blacs_abort( ictxt, 1 )
228 ELSE IF( lquery )
THEN
234 IF( m.EQ.0 .OR. n.EQ.0 )
237 CALL pb_topget( ictxt,
'Broadcast',
'Rowwise', rowbtop )
238 CALL pb_topget( ictxt,
'Broadcast',
'Columnwise', colbtop )
239 CALL pb_topset( ictxt,
'Broadcast',
'Rowwise',
'I-ring' )
240 CALL pb_topset( ictxt, 'broadcast
', 'columnwise
', ' ' )
242.EQ.
IF( DESCA( M_ )1 ) THEN
243 CALL INFOG2L( IA, JA, DESCA, NPROW, NPCOL, MYROW, MYCOL, II,
245.EQ.
IF( MYROWIAROW ) THEN
246 NQ = NUMROC( JA+N-1, DESCA( NB_ ), MYCOL, DESCA( CSRC_ ),
248 I = II+(JJ-1)*DESCA( LLD_ )
249.EQ.
IF( MYCOLIACOL ) THEN
251 CALL DLARFG( 1, AJJ, A( I ), 1, TAU( JJ ) )
253 ALPHA = ONE - TAU( JJ )
254 CALL DGEBS2D( ICTXT, 'rowwise
', ' ', 1, 1, ALPHA, 1 )
255 CALL DSCAL( NQ-JJ, ALPHA, A( I+DESCA( LLD_ ) ),
258 CALL DGEBS2D( ICTXT, 'columnwise
', ' ', 1, 1, TAU( JJ ),
263 CALL DGEBR2D( ICTXT, 'rowwise
', ' ', 1, 1, ALPHA,
265 CALL DSCAL( NQ-JJ+1, ALPHA, A( I ), DESCA( LLD_ ) )
268.EQ.
ELSE IF( MYCOLIACOL ) THEN
269 CALL DGEBR2D( ICTXT, 'columnwise
', ' ', 1, 1, TAU( JJ ), 1,
282 CALL PDLARFG( M-J+JA, AJJ, I, J, A, MIN( I+1, IA+M-1 ), J,
284.LT.
IF( JJA+N-1 ) THEN
288 CALL PDELSET( A, I, J, DESCA, ONE )
290 CALL PDLARF( 'left
', M-J+JA, N-J+JA-1, A, I, J, DESCA, 1,
291 $ TAU, A, I, J+1, DESCA, WORK )
293 CALL PDELSET( A, I, J, DESCA, AJJ )
299 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
300 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
302 WORK( 1 ) = DBLE( LWMIN )
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
subroutine pdgeqr2(m, n, a, ia, ja, desca, tau, work, lwork, info)
subroutine pdlarf(side, m, n, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)
subroutine pdlarfg(n, alpha, iax, jax, x, ix, jx, descx, incx, tau)