1 SUBROUTINE pzungrq( M, N, K, A, IA, JA, DESCA, TAU, WORK, LWORK,
10 INTEGER IA, INFO, JA, K, LWORK, M, N
14 COMPLEX*16 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.0d+0, 0.0d+
168 CHARACTER COLBTOP, ROWBTOP
169 INTEGER , IACOL, IAROW, IB, ICTXT, IINFO, IN, IPW,
170 $ lwmin, mpa0, mycol, myrow, npcol, nprow, nqa0
173 INTEGER IDUM1( 2 ), IDUM2( 2 )
181 INTEGER ICEIL, INDXG2P, NUMROC
182 EXTERNAL iceil, indxg2p, numroc
185 INTRINSIC dble, dcmplx,
min, mod
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 ) = dcmplx( dble( 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,
'PZUNGRQ', -info )
237 ELSE IF( lquery )
THEN
246 ipw = desca( mb_ )*desca( mb_ ) + 1
247 in =
min( iceil( ia+m-k, desca( mb_ ) )*desca( mb_ ), ia+m-1 )
248 CALL pb_topget( ictxt,
'Broadcast',
'Rowwise', rowbtop )
249 CALL pb_topget( ictxt,
'Broadcast',
'Columnwise', colbtop )
250 CALL pb_topset( ictxt,
'Broadcast', 'rowwise
', ' ' )
251 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', 'i-ring
' )
255 CALL PZLASET( 'all
', IN-IA+1, M-IN+IA-1, ZERO, ZERO, A, IA,
256 $ JA+N-M+IN-IA+1, DESCA )
260 CALL PZUNGR2( IN-IA+1, N-M+IN-IA+1, IN-IA-M+K+1, A, IA, JA, DESCA,
261 $ TAU, WORK, LWORK, IINFO )
265 DO 10 I = IN+1, IA+M-1, DESCA( MB_ )
266 IB = MIN( IA+M-I, DESCA( MB_ ) )
271 CALL PZLARFT( 'backward
', 'rowwise
', N-M+I+IB-IA, IB, A, I, JA,
272 $ DESCA, TAU, WORK, WORK( IPW ) )
276 CALL PZLARFB( 'right
', 'conjugate transpose
', 'backward
',
277 $ 'rowwise
', I-IA, N-M+I+IB-IA, IB, A, I, JA,
278 $ DESCA, WORK, A, IA, JA, DESCA, WORK( IPW ) )
282 CALL PZUNGR2( IB, N-M+I+IB-IA, IB, A, I, JA, DESCA, TAU, WORK,
288 CALL PZLASET( 'all
', IB, M-I-IB+IA, ZERO, ZERO, A, I,
289 $ JA+N-M+I+IB-IA, DESCA )
293 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
294 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
296 WORK( 1 ) = DCMPLX( DBLE( LWMIN ) )
subroutine pchk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, nextra, ex, expos, info)
subroutine pzlarfb(side, trans, direct, storev, m, n, k, v, iv, jv, descv, t, c, ic, jc, descc, work)
subroutine pzlarft(direct, storev, n, k, v, iv, jv, descv, tau, t, work)