1 SUBROUTINE pcgeql2( M, N, A, IA, JA, DESCA, TAU, WORK, LWORK,
10 INTEGER IA, INFO, JA, LWORK, M, N
14 COMPLEX 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 )
171 parameter( one = ( 1.0e+0, 0.0e+0 ) )
175 CHARACTER COLBTOP, ROWBTOP
176 INTEGER I, IACOL, IAROW, ICTXT, II, J, JJ, K, ,
177 $ mp, mycol, myrow, npcol, nprow, nq
187 INTEGER INDXG2P, NUMROC
188 EXTERNAL indxg2p, numroc
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 mp = numroc( m+mod( ia-1, desca( mb_ ) ), desca( mb_ ),
213 $ myrow, iarow, nprow )
214 nq = numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
215 $ mycol, iacol, npcol )
216 lwmin = mp +
max( 1, nq )
218 work( 1 ) =
cmplx( real( lwmin ) )
219 lquery = ( lwork.EQ.-1 )
220 IF( lwork.LT.lwmin .AND. .NOT.lquery )
227 CALL BLACS_ABORT( ICTXT, 1 )
229 ELSE IF( LQUERY ) THEN
235.EQ..OR..EQ.
IF( M0 N0 )
238 CALL PB_TOPGET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
239 CALL PB_TOPGET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
240 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', 'd-ring
' )
241 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', ' ' )
243.EQ.
IF( DESCA( M_ )1 ) THEN
245 $ NQ = NQ - MOD( JA-1, DESCA( NB_ ) )
246 CALL INFOG2L( IA, JA, DESCA, NPROW, NPCOL, MYROW, MYCOL, II,
248 IACOL = INDXG2P( JA+N-1, DESCA( NB_ ), MYCOL, DESCA( CSRC_ ),
250.EQ.
IF( MYROWIAROW ) THEN
251.EQ.
IF( MYCOLIACOL ) THEN
252 I = II+(JJ+NQ-2)*DESCA( LLD_ )
254 CALL CLARFG( 1, AJJ, A( I ), 1, TAU( JJ+NQ-1 ) )
256 ALPHA = ONE - CONJG( TAU( JJ+NQ-1 ) )
257 CALL CGEBS2D( ICTXT, 'rowwise
', ' ', 1, 1, ALPHA, 1 )
258 CALL CSCAL( NQ-1, ALPHA, A( II+(JJ-1)*DESCA( LLD_ ) ),
261 CALL CGEBS2D( ICTXT, 'columnwise
', ' ', 1, 1,
262 $ TAU( JJ+NQ-1 ), 1 )
266 CALL CGEBR2D( ICTXT, 'rowwise
', ' ', 1, 1, ALPHA,
268 CALL CSCAL( NQ, ALPHA, A( II+(JJ-1)*DESCA( LLD_ ) ),
272.EQ.
ELSE IF( MYCOLIACOL ) THEN
273 CALL CGEBR2D( ICTXT, 'columnwise
', ' ', 1, 1,
274 $ TAU( JJ+NQ-1 ), 1, IAROW, IACOL )
280 DO 10 J = JA+K-1, JA, -1
286 CALL PCLARFG( M-K+I-IA+1, AJJ, M-K+I, N-K+J, A, IA,
287 $ N-K+J, DESCA, 1, TAU )
291 CALL PCELSET( A, I+M-K, J+N-K, DESCA, ONE )
292 CALL PCLARFC( 'left
', M-K+I-IA+1, N-K+J-JA, A, IA, N-K+J,
293 $ DESCA, 1, TAU, A, IA, JA, DESCA, WORK )
294 CALL PCELSET( A, I+M-K, J+N-K, DESCA, AJJ )
300 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
301 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
303 WORK( 1 ) = CMPLX( REAL( 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 pcgeql2(m, n, a, ia, ja, desca, tau, work, lwork, info)
subroutine pclarfc(side, m, n, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)
subroutine pclarfg(n, alpha, iax, jax, x, ix, jx, descx, incx, tau)