1 SUBROUTINE pcungqr( M, N, K, A, IA, JA, DESCA, TAU, WORK, LWORK,
10 INTEGER IA, INFO, JA, K, LWORK, M, N
14 COMPLEX A( * ), TAU( * ), WORK( * )
158 INTEGER BLOCK_CYCLIC_2D, , CTXT_, DLEN_, DTYPE_,
159 $ lld_, mb_, m_, nb_, n_, rsrc_
160 PARAMETER ( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
162 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
164 parameter( zero = ( 0.0e+0, 0.0e+0 ) )
169 INTEGER I, IACOL, IAROW, ICTXT, IINFO, IPW, J, JB, JL,
170 $ jn, lwmin, mpa0, mycol, myrow, npcol, nprow,
174 INTEGER IDUM1( 2 ), IDUM2( 2 )
182 INTEGER ICEIL, INDXG2P, NUMROC
183 EXTERNAL iceil, indxg2p, numroc
192 ictxt = desca( ctxt_ )
198 IF( nprow.EQ.-1 )
THEN
201 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 7, info )
203 iarow = indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
205 iacol = indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
207 mpa0 = numroc( m+mod( ia-1, desca( mb_ ) ), desca( mb_ ),
208 $ myrow, iarow, nprow )
209 nqa0 = numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
210 $ mycol, iacol, npcol )
211 lwmin = desca( nb_ ) * ( mpa0 + nqa0 + desca( nb_ ) )
213 work( 1 ) =
cmplx( real( lwmin ) )
214 lquery = ( lwork.EQ.-1 )
217 ELSE IF( k.LT.0 .OR. k.GT.n )
THEN
219 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery
THEN
225 IF( lwork.EQ.-1 )
THEN
236 CALL pxerbla( ictxt,
'PCUNGQR', -info )
238 ELSE IF( lquery )
THEN
247 ipw = desca( nb_ )*desca( nb_ ) + 1
248 jn =
min( iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+k-1 )
249 jl =
max( ( (ja+k-2) / desca( nb_ ) ) * desca( nb_ ) + 1, ja )
250 CALL pb_topget( ictxt,
'Broadcast', 'rowwise
', ROWBTOP )
251 CALL PB_TOPGET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
252 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', 'd-ring
' )
253 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', '' )
255 CALL PCLASET( 'all
', JL-JA, JA+N-JL, ZERO, ZERO, A, IA, JL,
260 CALL PCUNG2R( M-JL+JA, JA+N-JL, JA+K-JL, A, IA+JL-JA, JL, DESCA,
261 $ TAU, WORK, LWORK, IINFO )
265.GT.
IF( JLJN+1 ) THEN
269 DO 10 J = JL-DESCA( NB_ ), JN+1, -DESCA( NB_ )
270 JB = MIN( DESCA( NB_ ), JA+N-J )
273.LE.
IF( J+JBJA+N-1 ) THEN
278 CALL PCLARFT( 'forward
', 'columnwise
', M-I+IA, JB, A, I,
279 $ J, DESCA, TAU, WORK, WORK( IPW ) )
283 CALL PCLARFB( 'left
', 'no transpose
', 'forward
',
284 $ 'columnwise
', M-I+IA, N-J-JB+JA, JB, A, I,
285 $ J, DESCA, WORK, A, I, J+JB, DESCA,
291 CALL PCUNG2R( M-I+IA, JB, JB, A, I, J, DESCA, TAU, WORK,
296 CALL PCLASET( 'all
', I-IA, JB, ZERO, ZERO, A, IA, J, DESCA )
311 CALL PCLARFT( 'forward
', 'columnwise
', M, JB, A, IA, JA, DESCA,
312 $ TAU, WORK, WORK( IPW ) )
316 CALL PCLARFB( 'left
', 'no transpose
', 'forward
', 'columnwise
',
317 $ M, N-JB, JB, A, IA, JA, DESCA, WORK, A, IA,
318 $ JA+JB, DESCA, WORK( IPW ) )
322 CALL PCUNG2R( M, JB, JB, A, IA, JA, DESCA, TAU, WORK, LWORK,
327 CALL PB_TOPGET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
328 CALL PB_TOPGET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
330 WORK( 1 ) = CMPLX( REAL( LWMIN ) )
subroutine pchk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, nextra, ex, expos, info)
subroutine pclarfb(side, trans, direct, storev, m, n, k, v, iv, jv, descv, t, c, ic, jc, descc, work)
subroutine pclarft(direct, storev, n, k, v, iv, jv, descv, tau, t, work)
subroutine pcung2r(m, n, k, a, ia, ja, desca, tau, work, lwork, info)
subroutine pcungqr(m, n, k, a, ia, ja, desca, tau, work, lwork, info)