1 SUBROUTINE psgelqf( M, N, A, IA, JA, DESCA, TAU, WORK, LWORK,
10 INTEGER IA, INFO, JA, LWORK, M, N
14 REAL 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 )
172 CHARACTER COLBTOP, ROWBTOP
173 INTEGER , IACOL, IAROW, IB, , IINFO, IN, IPW,
178 INTEGER IDUM1( 1 ), ( 1 )
185 INTEGER ICEIL, INDXG2P, NUMROC
189 INTRINSIC 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 iroff = mod( ia-1, desca( mb_ ) )
207 iarow = indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
209 iacol = indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
211 mp0 = numroc( m+iroff, desca( mb_ ), myrow, iarow, nprow )
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 )
221 IF( lwork.EQ.-1 )
THEN
227 CALL pchk1mat( m, 1, n, 2, ia, ja, desca, 6, 1, idum1, idum2,
232 CALL pxerbla( ictxt,
'PSGELQF', -info )
234 ELSE IF( lquery )
THEN
240 IF( m.EQ.0 .OR. n.EQ.0 )
244 ipw = desca( mb_ ) * desca( mb_ ) + 1
245 CALL pb_topget( ictxt,
'Broadcast',
'Rowwise', rowbtop )
246 CALL pb_topget( ictxt,
'Broadcast', 'columnwise
', COLBTOP )
247 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', ' ' )
248 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', 'i-ring
' )
252 IN = MIN( ICEIL( IA, DESCA( MB_ ) ) * DESCA( MB_ ), IA+K-1 )
257 CALL PSGELQ2( IB, N, A, IA, JA, DESCA, TAU, WORK, LWORK, IINFO )
259.LE.
IF( IA+IBIA+M-1 ) THEN
264 CALL PSLARFT( 'forward
', 'rowwise
', N, IB, A, IA, JA, DESCA,
265 $ TAU, WORK, WORK( IPW ) )
269 CALL PSLARFB( 'right
', 'no transpose
', 'forward
', 'rowwise
',
270 $ M-IB, N, IB, A, IA, JA, DESCA, WORK, A, IA+IB,
271 $ JA, DESCA, WORK( IPW ) )
276 DO 10 I = IN+1, IA+K-1, DESCA( MB_ )
277 IB = MIN( K-I+IA, DESCA( MB_ ) )
283 CALL PSGELQ2( IB, N-I+IA, A, I, J, DESCA, TAU, WORK, LWORK,
286.LE.
IF( I+IBIA+M-1 ) THEN
291 CALL PSLARFT( 'forward
', 'rowwise
', N-I+IA, IB, A, I, J,
292 $ DESCA, TAU, WORK, WORK( IPW ) )
296 CALL PSLARFB( 'right
', 'no transpose
', 'forward
', 'rowwise',
297 $ m-i-ib+ia, n-j+ja, ib, a, i, j, desca, work,
298 $ a, i+ib, j, desca, work( ipw ) )
303 CALL pb_topset( ictxt,
'Broadcast',
'Rowwise', rowbtop )
304 CALL pb_topset( ictxt,
'Broadcast',
'Columnwise', colbtop )
306 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)