1 SUBROUTINE psgerqf( M, N, A, IA, JA, DESCA, TAU, WORK, LWORK,
10 INTEGER IA, INFO, JA, LWORK, M, N
14 REAL ( * ), 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 )
172 CHARACTER COLBTOP, ROWBTOP
173 INTEGER I, IACOL, IAROW, IB, ICTXT, IINFO, IL, IN, IPW,
174 $ k, lwmin, mp0, mu, mycol, myrow, npcol, nprow,
178 INTEGER IDUM1( 1 ), IDUM2( 1 )
185 INTEGER ICEIL, INDXG2P, NUMROC
186 EXTERNAL iceil, indxg2p, numroc
189 INTRINSIC max,
min, mod, real
195 ictxt = desca( ctxt_ )
201 IF( nprow.EQ.-1 )
THEN
204 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 6, info )
206 iarow = indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
208 iacol = indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
210 mp0 = numroc( m+mod( ia-1, desca( mb_ ) ), desca( mb_ ),
212 nq0 = numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
213 $ mycol, iacol, npcol )
214 lwmin = desca( mb_ ) * ( mp0 + nq0 + desca( mb_ ) )
216 work( 1 ) = real( lwmin )
217 lquery = ( lwork.EQ.-1 )
218 IF( lwork.LT.lwmin .AND. .NOT.lquery )
227 CALL pchk1mat( m, 1, n, 2, ia, ja, desca, 6, 1, idum1, idum2,
232 CALL pxerbla( ictxt,
'PSGERQF', -info )
234 ELSE IF( lquery )
THEN
240 IF( m.EQ.0 .OR. n.EQ.0 )
244 ipw = desca( mb_ ) * desca( mb_ ) + 1
245 in =
min( iceil( ia+m-k, desca( mb_ ) ) * desca( mb_ ), ia+m-1 )
246 il =
max( ( (ia+m-2) / desca( mb_ ) ) * desca( mb_ ) + 1, ia )
247 CALL pb_topget( ictxt,
'Broadcast',
'Rowwise', rowbtop )
248 CALL pb_topget( ictxt,
'Broadcast',
'Columnwise', colbtop )
249 CALL pb_topset( ictxt,
'Broadcast',
'Rowwise',
' ' )
250 CALL pb_topset( ictxt,
'Broadcast',
'Columnwise', 'd-ring
' )
252.GE.
IF( ILIN+1 ) THEN
256 DO 10 I = IL, IN+1, -DESCA( MB_ )
257 IB = MIN( IA+M-I, DESCA( MB_ ) )
262 CALL PSGERQ2( IB, N-M+I+IB-IA, A, I, JA, DESCA, TAU, WORK,
270 CALL PSLARFT( 'backward
', 'rowwise
', N-M+I+IB-IA, IB, A,
271 $ I, JA, DESCA, TAU, WORK, WORK( IPW ) )
276 CALL PSLARFB( 'right
', 'no transpose
', 'backward
',
277 $ 'rowwise
', I-IA, N-M+I+IB-IA, IB, A, I, JA,
278 $ DESCA, WORK, A, IA, JA, DESCA,
285 NU = N - M + IN - IA + 1
296.GT..AND..GT.
IF( MU0 NU0 )
297 $ CALL PSGERQ2( MU, NU, A, IA, JA, DESCA, TAU, WORK, LWORK,
300 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
301 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
303 WORK( 1 ) = REAL( LWMIN )
subroutine pchk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, nextra, ex, expos, info)
subroutine pslarfb(side, trans, direct, storev, m, n, k, v, iv, jv, descv, t, c, ic, jc, descc, work)