1 SUBROUTINE pzgerqf( M, N, A, IA, JA, DESCA, TAU, WORK, LWORK,
10 INTEGER IA, INFO, JA, LWORK, M, N
14 COMPLEX*16 A( * ), TAU( * ), WORK( * )
164 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, , DTYPE_,
165 $ lld_, mb_, m_, nb_, n_, rsrc_
166 parameter( block_cyclic_2d = 1, dlen_
168 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
172 CHARACTER COLBTOP, ROWBTOP
173 INTEGER I, IACOL, IAROW, IB,, IL, IN, IPW,
174 $ k, lwmin, mp0, mu, mycol, myrow, npcol, nprow,
178 INTEGER IDUM1( 1 ), IDUM2( 1 )
186 INTEGER ICEIL, INDXG2P, NUMROC
187 EXTERNAL iceil, indxg2p, numroc
190 INTRINSIC dble, dcmplx,
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 mp0 = numroc( m+mod( ia-1, desca( mb_ ) ), desca( mb_ ),
212 $ myrow, iarow, nprow )
213 nq0 = numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
214 $ mycol, iacol, npcol )
215 lwmin = desca( mb_ ) * ( mp0 + nq0 + desca( mb_ ) )
217 work( 1 ) = dcmplx( dble( lwmin ) )
218 lquery = ( lwork.EQ.-1 )
219 IF( lwork.LT.lwmin .AND. .NOT.lquery )
228 CALL pchk1mat( m, 1, n, 2, ia, ja, desca, 6, 1, idum1, idum2,
233 CALL pxerbla( ictxt,
'PZGERQF', -info )
235 ELSE IF( lquery )
THEN
241 IF( m.EQ.0 .OR. n.EQ.0 )
245 ipw = desca( mb_ ) * desca( mb_ ) + 1
246 in =
min( iceil( ia+m-k, desca( mb_ ) ) * desca( mb_ ), ia+m-1 )
247 il =
max( ( (ia+m-2) / desca( mb_ ) ) * desca( mb_ ) + 1, ia )
248 CALL pb_topget( ictxt,
'Broadcast',
'Rowwise', rowbtop )
249 CALL pb_topget( ictxt,
'Broadcast',
'Columnwise', colbtop
250 CALL pb_topset( ictxt,
'Broadcast',
'Rowwise', '
' )
251 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', 'd-ring
' )
253.GE.
IF( ILIN+1 ) THEN
257 DO 10 I = IL, IN+1, -DESCA( MB_ )
258 IB = MIN( IA+M-I, DESCA( MB_ ) )
263 CALL PZGERQ2( IB, N-M+I+IB-IA, A, I, JA, DESCA, TAU, WORK,
271 CALL PZLARFT( 'backward
', 'rowwise
', N-M+I+IB-IA, IB, A,
272 $ I, JA, DESCA, TAU, WORK, WORK( IPW ) )
277 CALL PZLARFB( 'right
', 'no transpose
', 'backward
',
278 $ 'rowwise
', I-IA, N-M+I+IB-IA, IB, A, I, JA,
279 $ DESCA, WORK, A, IA, JA, DESCA,
286 NU = N - M + IN - IA + 1
297.GT..AND..GT.
IF( MU0 NU0 )
298 $ CALL PZGERQ2( MU, NU, A, IA, JA, DESCA, TAU, WORK, LWORK,
301 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
302 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
304 WORK( 1 ) = DCMPLX( DBLE( LWMIN ) )
subroutine pchk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, nextra, ex, expos, info)
subroutine pzlarfb(side, trans, direct, storev, m, n, k, v, iv, jv, descv, t, c, ic, jc, descc, work)
subroutine pzlarft(direct, storev, n, k, v, iv, jv, descv, tau, t, work)