1 SUBROUTINE pzungl2( 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( * )
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( one = ( 1.0d+0, 0.0d+0 ),
164 $ zero = ( 0.0d+0, 0.0d+0 ) )
168 CHARACTER COLBTOP, ROWBTOP
169 INTEGER IACOL, IAROW, I, ICTXT, II, J, KP, LWMIN, MPA0,
170 $ mycol, myrow, npcol, nprow, nqa0
179 INTEGER INDXG2L, INDXG2P, NUMROC
180 EXTERNAL indxg2l, indxg2p, numroc
183 INTRINSIC dble, dcmplx, dconjg,
max,
min, mod
189 ictxt = desca( ctxt_ )
195 IF( nprow.EQ.-1 )
THEN
198 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 7, info )
200 iarow = indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
202 iacol = indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
204 mpa0 = numroc( m+mod( ia-1, desca( mb_ ) ), desca( mb_ ),
205 $ myrow, iarow, nprow )
206 nqa0 = numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
207 $ mycol, iacol, npcol )
208 lwmin = nqa0 +
max( 1, mpa0 )
210 work( 1 ) = dcmplx( dble( lwmin ) )
211 lquery = ( lwork.EQ.-1 )
214 ELSE IF( k.LT.0 .OR. k.GT.m )
THEN
216 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
222 CALL pxerbla( ictxt,
'PZUNGL2', -info )
223 CALL blacs_abort( ictxt, 1 )
225 ELSE IF( lquery )
THEN
234 CALL pb_topget( ictxt,
'Broadcast', 'rowwise
', ROWBTOP )
235 CALL PB_TOPGET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
236 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', ' ' )
237 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', 'd-ring
' )
243 CALL PZLASET( 'all
', M-K, K, ZERO, ZERO, A, IA+K, JA, DESCA )
244 CALL PZLASET( 'all
', M-K, N-K, ZERO, ONE, A, IA+K, JA+K,
250 KP = NUMROC( IA+K-1, DESCA( MB_ ), MYROW, DESCA( RSRC_ ), NPROW )
252 DO 10 I = IA+K-1, IA, -1
257 II = INDXG2L( I, DESCA( MB_ ), MYROW, DESCA( RSRC_ ), NPROW )
258 IAROW = INDXG2P( I, DESCA( MB_ ), MYROW, DESCA( RSRC_ ),
261 $ TAUI = TAU( MIN( II, KP ) )
262.LT.
IF( JJA+N-1 ) THEN
263 CALL PZLACGV( N-J+JA-1, A, I, J+1, DESCA, DESCA( M_ ) )
264.LT.
IF( IIA+M-1 ) THEN
265 CALL PZELSET( A, I, J, DESCA, ONE )
266 CALL PZLARFC( 'right
', M-I+IA-1, N-J+JA, A, I, J, DESCA,
267 $ DESCA( M_ ), TAU, A, I+1, J, DESCA, WORK )
269 CALL PZSCAL( N-J+JA-1, -TAUI, A, I, J+1, DESCA,
271 CALL PZLACGV( N-J+JA-1, A, I, J+1, DESCA, DESCA( M_ ) )
273 CALL PZELSET( A, I, J, DESCA, ONE-DCONJG( TAUI ) )
277 CALL PZLASET( 'all
', 1, J-JA, ZERO, ZERO, A, I, JA, DESCA )
281 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
282 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
284 WORK( 1 ) = DCMPLX( DBLE( LWMIN ) )
subroutine pzlarfc(side, m, n, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)
subroutine pzungl2(m, n, k, a, ia, ja, desca, tau, work, lwork, info)