1 SUBROUTINE pzunmqr( SIDE, TRANS, M, N, K, A, IA, JA, DESCA, TAU,
2 $ C, IC, JC, DESCC, WORK, LWORK, INFO )
11 INTEGER IA, IC, INFO, JA, JC, K, LWORK, M, N
14 INTEGER DESCA( * ), DESCC( * )
15 COMPLEX*16 A( * ), C( * ), TAU( * ), WORK( * )
219 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
220 $ lld_, mb_, m_, nb_, n_, rsrc_
221 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
222 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
223 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
226 LOGICAL LEFT, LQUERY, NOTRAN
227 CHARACTER COLBTOP, ROWBTOP
228 INTEGER IAROW, ICC, ICCOL, ICOFFC, ICROW, ICTXT, IINFO,
229 $ ipw, iroffa, iroffc, j, j1, j2, j3, jb, jcc,
230 $ lcm, lcmq, lwmin, mi, mpc0, mycol, myrow, ni,
231 $ npa0, npcol, nprow, nq, nqc0
234 INTEGER IDUM1( 4 ), IDUM2( 4 )
243 INTEGER ICEIL, ILCM, INDXG2P, NUMROC
244 EXTERNAL iceil, ilcm, indxg2p, lsame, numroc
247 INTRINSIC dble, dcmplx, ichar,
max,
min, mod
253 ictxt = desca( ctxt_ )
254 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
259 IF( nprow.EQ.-1 )
THEN
262 left = lsame( side,
'L' )
263 notran = lsame( trans,
'N' )
269 CALL chk1mat( m, 3, k, 5, ia, ja, desca, 9, info )
272 CALL chk1mat( n, 4, k, 5, ia, ja, desca, 9, info )
274 CALL chk1mat( m, 3, n, 4, ic, jc, descc, 14, info )
276 iroffa = mod( ia-1, desca( mb_ ) )
277 iroffc = mod( ic-1, descc( mb_ ) )
278 icoffc = mod( jc-1, descc( nb_ ) )
279 iarow = indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
281 icrow = indxg2p( ic, descc( mb_ ), myrow, descc( rsrc_ ),
283 iccol = indxg2p( jc, descc( nb_ ), mycol, descc( csrc_ ),
285 mpc0 = numroc( m+iroffc, descc( mb_ ), myrow, icrow, nprow )
286 nqc0 = numroc( n+icoffc, descc( nb_ ), mycol, iccol, npcol )
289 lwmin =
max( ( desca( nb_ ) * ( desca( nb_ ) - 1 ) ) / 2,
290 $ ( mpc0 + nqc0 ) * desca( nb_ ) ) +
291 $ desca( nb_ ) * desca( nb_ )
293 npa0 = numroc( n+iroffa, desca( mb_ ), myrow, iarow,
295 lcm = ilcm( nprow, npcol )
297 lwmin =
max( ( desca( nb_ ) * ( desca( nb_ ) - 1 ) )
298 $ / 2, ( nqc0 +
max( npa0 + numroc( numroc(
299 $ n+icoffc, desca( nb_ ), 0, 0, npcol ),
300 $ desca( nb_ ), 0, 0, lcmq ), mpc0 ) ) *
301 $ desca( nb_ ) ) + desca( nb_ ) * desca( nb_ )
304 work( 1 ) = dcmplx( dble( lwmin ) )
305 lquery = ( lwork.EQ.-1 )
306 IF( .NOT.left .AND. .NOT.lsame( side,
'R' ) )
THEN
308 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'C' ) )
THEN
310 ELSE IF( k.LT.0 .OR. k.GT.nq )
THEN
312 ELSE IF( .NOT.left .AND. desca( mb_ ).NE.descc( nb_ ) )
THEN
314 ELSE IF( left .AND. iroffa.NE.iroffc )
THEN
316 ELSE IF( left .AND. iarow.NE.icrow )
THEN
318 ELSE IF( .NOT.left .AND. iroffa.NE.icoffc )
THEN
320 ELSE IF( left .AND. desca( mb_ ).NE.descc( mb_ ) )
THEN
322 ELSE IF( ictxt.NE.descc( ctxt_ ) )
THEN
324 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
330 idum1( 1 ) = ichar(
'L' )
332 idum1( 1 ) = ichar(
'R' )
336 idum1( 2 ) = ichar(
'N' )
338 idum1( 2 ) = ichar(
'C' )
343 IF( lwork.EQ.-1 )
THEN
350 CALL pchk2mat( m, 3, k, 5, ia, ja, desca, 9, m, 3, n, 4, ic,
351 $ jc, descc, 14, 4, idum1, idum2, info )
353 CALL pchk2mat( n, 4, k, 5, ia, ja, desca, 9, m, 3, n, 4, ic,
354 $ jc, descc, 14, 4, idum1, idum2, info )
359 CALL pxerbla( ictxt,
'PZUNMQR', -info )
361 ELSE IF( lquery )
THEN
367 IF( m.EQ.0 .OR. n.EQ.0 .OR. k.EQ.0 )
370 CALL pb_topget( ictxt,
'Broadcast',
'Rowwise', rowbtop )
371 CALL pb_topget( ictxt,
'Broadcast',
'Columnwise', colbtop )
373 IF( ( left .AND. .NOT.notran ) .OR.
374 $ ( .NOT.left .AND. notran ) )
THEN
375 j1 =
min( iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+k-1 )
380 j1 =
max( ( (ja+k-2) / desca( nb_ ) ) * desca( nb_ ) + 1, ja )
381 j2 =
min( iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+k-1 )
390 CALL pb_topset( ictxt,
'Broadcast',
'Rowwise',
'D-ring' )
392 CALL pb_topset( ictxt,
'Broadcast',
'Rowwise',
'I-ring' )
394 CALL pb_topset( ictxt,
'Broadcast',
'Columnwise',
' ' )
402 IF( ( left .AND. .NOT.notran ) .OR. ( .NOT.left .AND. notran ) )
403 $
CALL pzunm2r( side, trans, m, n, j1-ja, a, ia, ja, desca, tau,
404 $ c, ic, jc, descc, work, lwork, iinfo )
406 ipw = desca( nb_ ) * desca( nb_ ) + 1
408 jb =
min( desca( nb_ ), k-j+ja )
413 CALL pzlarft(
'Forward',
'Columnwise', nq-j+ja, jb, a,
414 $ ia+j-ja, j, desca, tau, work, work( ipw ) )
431 CALL pzlarfb( side, trans,
'Forward',
'Columnwise', mi, ni,
432 $ jb, a, ia+j-ja, j, desca, work, c, icc, jcc,
433 $ descc, work( ipw ) )
438 IF( ( left .AND. notran ) .OR. ( .NOT.left .AND. .NOT.notran ) )
439 $
CALL pzunm2r( side, trans, m, n, j2-ja, a, ia, ja, desca, tau,
440 $ c, ic, jc, descc, work, lwork, iinfo )
442 CALL pb_topset( ictxt,
'Broadcast',
'Rowwise', rowbtop )
443 CALL pb_topset( ictxt,
'Broadcast',
'Columnwise', colbtop )
445 work( 1 ) = dcmplx( dble( lwmin ) )