1 SUBROUTINE pcunglq( M, N, K, A, IA, JA, DESCA, TAU, WORK, LWORK,
10 INTEGER IA, INFO, JA, K, LWORK, M, N
14 COMPLEX A( * ), TAU( * ), WORK( * )
157 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
158 $ lld_, mb_, m_, nb_, n_, rsrc_
159 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
160 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
161 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
163 parameter( zero = ( 0.0e+0, 0.0e+0 ) )
167 CHARACTER COLBTOP, ROWBTOP
168 INTEGER I, IACOL, IAROW, IB, ICTXT, IINFO, IL, IN, IPW,
169 $ j, lwmin, mpa0, mycol, myrow, npcol, nprow,
173 INTEGER IDUM1( 2 ), IDUM2( 2 )
181 INTEGER ICEIL, INDXG2P, NUMROC
182 EXTERNAL iceil, indxg2p, numroc
191 ictxt = desca( ctxt_ )
197 IF( nprow.EQ.-1 )
THEN
200 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 7, info )
202 iarow = indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
204 iacol = indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
206 mpa0 = numroc( m+mod( ia-1, desca( mb_ ) ), desca( mb_ ),
207 $ myrow, iarow, nprow )
208 nqa0 = numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
209 $ mycol, iacol, npcol )
210 lwmin = desca( mb_ ) * ( mpa0 + nqa0 + desca( mb_ ) )
212 work( 1 ) =
cmplx( real( lwmin ) )
213 lquery = ( lwork.EQ.-1 )
216 ELSE IF( k.LT.0 .OR. k.GT.m )
THEN
218 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
224 IF( lwork.EQ.-1 )
THEN
230 CALL pchk1mat( m, 1, n, 2, ia, ja, desca, 7, 2, idum1, idum2,
235 CALL pxerbla( ictxt,
'PCUNGLQ', -info )
237 ELSE IF( lquery )
THEN
246 ipw = desca( mb_ ) * desca( mb_ ) + 1
247 in =
min( iceil( ia, desca( mb_ ) ) * desca( mb_ ), ia+k-1 )
248 il =
max( ( (ia+k-2) / desca( mb_ ) ) * desca( mb_ ) + 1, ia )
249 CALL pb_topget( ictxt,
'Broadcast',
'Rowwise', rowbtop )
250 CALL pb_topget( ictxt, 'broadcast
', 'columnwise
', COLBTOP )
251 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', ' ' )
252 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', 'd-ring
' )
254 CALL PCLASET( 'all
', IA+M-IL, IL-IA, ZERO, ZERO, A, IL, JA,
259 CALL PCUNGL2( IA+M-IL, N-IL+IA, IA+K-IL, A, IL, JA+IL-IA, DESCA,
260 $ TAU, WORK, LWORK, IINFO )
264.GT.
IF( ILIN+1 ) THEN
268 DO 10 I = IL-DESCA( MB_ ), IN+1, -DESCA( MB_ )
269 IB = MIN( DESCA( MB_ ), IA+M-I )
272.LE.
IF( I+IBIA+M-1 ) THEN
277 CALL PCLARFT( 'forward
', 'rowwise
', N-I+IA, IB, A, I, J,
278 $ DESCA, TAU, WORK, WORK( IPW ) )
282 CALL PCLARFB( 'right
', 'conjugate transpose
', 'forward
',
283 $ 'rowwise
', M-I-IB+IA, N-I+IA, IB, A, I, J,
284 $ DESCA, WORK, A, I+IB, J, DESCA,
290 CALL PCUNGL2( IB, N-I+IA, IB, A, I, J, DESCA, TAU, WORK,
295 CALL PCLASET( 'all
', IB, I-IA, ZERO, ZERO, A, I, JA, DESCA )
309 CALL PCLARFT( 'forward
', 'rowwise
', N, IB, A, IA, JA, DESCA,
310 $ TAU, WORK, WORK( IPW ) )
314 CALL PCLARFB( 'right
', 'conjugate transpose
', 'forward
',
315 $ 'rowwise
', M-IB, N, IB, A, IA, JA, DESCA, WORK,
316 $ A, IA+IB, JA, DESCA, WORK( IPW ) )
320 CALL PCUNGL2( IB, N, IB, A, IA, JA, DESCA, TAU, WORK, LWORK,
325 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
326 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
328 WORK( 1 ) = CMPLX( REAL( LWMIN ) )
subroutine pclarfb(side, trans, direct, storev, m, n, k, v, iv, jv, descv, t, c, ic, jc, descc, work)