1 SUBROUTINE pdgeqlf( M, N, A, IA, JA, DESCA, TAU, WORK, LWORK,
10 INTEGER IA, INFO, JA, LWORK, M, N
14 DOUBLE PRECISION A( * ), TAU( * ), WORK( * )
165 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
166 $ lld_, mb_, m_, nb_, n_, rsrc_
167 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
168 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
169 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
173 CHARACTER COLBTOP, ROWBTOP
174 INTEGER IACOL, IAROW, IINFO, ICTXT, IPW, J, JB, JL, JN,
175 $ k, lwmin, mp0, mu, mycol, myrow, npcol, nprow,
179 INTEGER IDUM1( 1 ), IDUM2( 1 )
187 INTEGER ICEIL, INDXG2P, NUMROC
188 EXTERNAL iceil, indxg2p, numroc
191 INTRINSIC dble,
min, mod
197 ictxt = desca( ctxt_ )
203 IF( nprow.EQ.-1 )
THEN
206 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 6, info )
208 iarow = indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_
210 iacol = indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
212 mp0 = numroc( m+mod( ia-1, desca( mb_
213 $ myrow, iarow, nprow )
214 nq0 = numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
215 $ mycol, iacol, npcol )
216 lwmin = desca( nb_ ) * ( mp0 + nq0 + desca( nb_ ) )
218 work( 1 ) = dble( lwmin )
219 lquery = ( lwork.EQ.-1 )
220 IF( lwork.LT.lwmin .AND. .NOT.lquery )
223 IF( lwork.EQ.-1 )
THEN
229 CALL pchk1mat( m, 1, n, 2, ia, ja, desca, 6, 1, idum1, idum2,
234 CALL pxerbla( ictxt,
'PDGEQLF', -info )
236 ELSE IF( lquery )
THEN
242 IF( m.EQ.0 .OR. n.EQ.0 )
246 ipw = desca( nb_ ) * desca( nb_ ) + 1
247 jn =
min( iceil( ja+n-k, desca( nb_ ) ) * desca( nb_ ), ja+n-1 )
248 jl =
max( ( (ja+n-2) / desca( nb_ ) ) * desca( nb_ ) + 1, ja )
249 CALL pb_topget( ictxt,
'Broadcast',
'Rowwise', rowbtop )
250 CALL pb_topget( ictxt,
'Broadcast',
'Columnwise', colbtop )
251 CALL pb_topset( ictxt,
'Broadcast',
'Rowwise',
'D-ring' )
252 CALL pb_topset( ictxt,
'Broadcast',
'Columnwise', '
' )
254.GE.
IF( JLJN+1 ) THEN
258 DO 10 J = JL, JN+1, -DESCA( NB_ )
259 JB = MIN( JA+N-J, DESCA( NB_ ) )
264 CALL PDGEQL2( M-N+J+JB-JA, JB, A, IA, J, DESCA, TAU, WORK,
272 CALL PDLARFT( 'backward
', 'columnwise
', M-N+J+JB-JA, JB,
273 $ A, IA, J, DESCA, TAU, WORK, WORK( IPW ) )
278 CALL PDLARFB( 'left
', 'transpose
', 'backward
',
279 $ 'columnwise
', M-N+J+JB-JA, J-JA, JB, A, IA,
280 $ J, DESCA, WORK, A, IA, JA, DESCA,
286 MU = M - N + JN - JA + 1
298.GT..AND..GT.
IF( MU0 NU0 )
299 $ CALL PDGEQL2( MU, NU, A, IA, JA, DESCA, TAU, WORK, LWORK,
302 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
303 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
305 WORK( 1 ) = DBLE( LWMIN )
subroutine pchk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, nextra, ex, expos, info)
subroutine pdlarfb(side, trans, direct, storev, m, n, k, v, iv, jv, descv, t, c, ic, jc, descc, work)