1 SUBROUTINE pclarft( DIRECT, STOREV, N, K, V, IV, JV, DESCV, TAU,
15 COMPLEX TAU( * ), T( * ), V( * ), WORK( * )
173 INTEGER BLOCK_CYCLIC_2D, CSRC_, , DLEN_, DTYPE_,
174 $ lld_, mb_, m_, nb_, n_, rsrc_
175 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
177 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
179 parameter( one = ( 1.0e+0, 0.0e+0 ),
180 $ zero = ( 0.0e+0, 0.0e+0 ) )
184 INTEGER ICOFF, ICTXT, II, IIV, IROFF, IVCOL, ,
185 $ itmp0, itmp1, iw, jj, jjv, ldv, micol, mirow,
186 $ mycol, myrow, np, npcol, nprow, nq
195 INTEGER INDXG2P, NUMROC
196 EXTERNAL indxg2p, lsame, numroc
205 IF( n.LE.0 .OR. k.LE.0 )
208 ictxt = descv( ctxt_ )
211 forward = lsame( direct,
'F' )
212 CALL infog2l( iv, jv, descv, nprow, npcol, myrow, mycol,
213 $ iiv, jjv, ivrow, ivcol )
215 IF( lsame( storev,
'C' ) .AND. mycol.EQ.ivcol )
THEN
219 iroff = mod( iv-1, descv( mb_ ) )
225 np = numroc( n+iroff, descv( mb_ ), myrow, ivrow, nprow )
226 IF( myrow.EQ.ivrow )
THEN
232 IF( iroff+1.EQ.descv( mb_ ) )
THEN
233 mirow = mod( ivrow+1, nprow )
239 DO 10 jj = jjv+1, jjv+k-1
241 IF( myrow.EQ.mirow )
THEN
242 vii = v( ii+(jj-1)*ldv )
243 v( ii+(jj-1)*ldv ) = one
250 IF( np-ii+iiv.GT.0 )
THEN
251 CALL cgemv(
'Conjugate transpose', np-ii+iiv, itmp0,
252 $ -tau( jj ), v( ii+(jjv-1)*ldv ), ldv,
253 $ v( ii+(jj-1)*ldv ), 1, zero,
256 CALL claset(
'All', itmp0, 1, zero, zero, work( iw ),
261 IF( myrow.EQ.mirow )
THEN
262 v( ii+(jj-1)*ldv ) = vii
266 IF( mod( iv+itmp0, descv( mb_ ) ).EQ.0 )
267 $ mirow = mod( mirow+1, nprow )
271 CALL cgsum2d( ictxt,
'Columnwise',
' ', iw-1, 1, work, iw-1,
274 IF( myrow.EQ.ivrow )
THEN
280 t( itmp1 ) = tau( jjv )
282 DO 20 jj = jjv+1, jjv+k-1
287 itmp1 = itmp1 + descv( nb_ )
288 CALL ccopy( itmp0, work( iw ), 1, t( itmp1 ), 1 )
291 CALL ctrmv( 'upper
', 'no transpose
', 'non-unit
',
292 $ ITMP0, T, DESCV( NB_ ), T( ITMP1 ), 1 )
293 T(ITMP1+ITMP0) = TAU( JJ )
303 NP = NUMROC( N+IROFF-1, DESCV( MB_ ), MYROW, IVROW, NPROW )
306 MIROW = INDXG2P( IV+N-2, DESCV( MB_ ), MYROW,
307 $ DESCV( RSRC_ ), NPROW )
311 DO 30 JJ = JJV+K-2, JJV, -1
313.EQ.
IF( MYROWMIROW ) THEN
314 VII = V( II+(JJ-1)*LDV )
315 V( II+(JJ-1)*LDV ) = ONE
322.GT.
IF( II-IIV+10 ) THEN
323 CALL CGEMV( 'conjugate transpose
', II-IIV+1, ITMP0,
324 $ -TAU( JJ ), V( IIV+JJ*LDV ), LDV,
325 $ V( IIV+(JJ-1)*LDV ), 1, ZERO,
328 CALL CLASET( 'all
', ITMP0, 1, ZERO, ZERO, WORK( IW ),
333.EQ.
IF( MYROWMIROW ) THEN
334 V( II+(JJ-1)*LDV ) = VII
338.EQ.
IF( MOD( IV+N-ITMP0-2, DESCV(MB_) )0 )
339 $ MIROW = MOD( MIROW+NPROW-1, NPROW )
343 CALL CGSUM2D( ICTXT, 'columnwise
', ' ', IW-1, 1, WORK, IW-1,
346.EQ.
IF( MYROWIVROW ) THEN
350 ITMP1 = K + 1 + (K-1) * DESCV( NB_ )
352 T( ITMP1-1 ) = TAU( JJV+K-1 )
354 DO 40 JJ = JJV+K-2, JJV, -1
359 ITMP1 = ITMP1 - DESCV( NB_ ) - 1
360 CALL CCOPY( ITMP0, WORK( IW ), 1, T( ITMP1 ), 1 )
363 CALL CTRMV( 'lower
', 'no transpose
', 'non-unit
',
364 $ ITMP0, T( ITMP1+DESCV( NB_ ) ),
365 $ DESCV( NB_ ), T( ITMP1 ), 1 )
366 T( ITMP1-1 ) = TAU( JJ )
374 ELSE IF( LSAME( STOREV, 'r.AND..EQ.
' ) MYROWIVROW ) THEN
378 ICOFF = MOD( JV-1, DESCV( NB_ ) )
384 NQ = NUMROC( N+ICOFF, DESCV( NB_ ), MYCOL, IVCOL, NPCOL )
385.EQ.
IF( MYCOLIVCOL ) THEN
391.EQ.
IF( ICOFF+1DESCV( NB_ ) ) THEN
392 MICOL = MOD( IVCOL+1, NPCOL )
398 DO 50 II = IIV+1, IIV+K-1
400.EQ.
IF( MYCOLMICOL ) THEN
401 VII = V( II+(JJ-1)*LDV )
402 V( II+(JJ-1)*LDV ) = ONE
409.GT.
IF( NQ-JJ+JJV0 ) THEN
410 CALL CLACGV( NQ-JJ+JJV, V( II+(JJ-1)*LDV ), LDV )
411 CALL CGEMV( 'no
', ITMP0, NQ-JJ+JJV,
412 $ -TAU(II), V( IIV+(JJ-1)*LDV ), LDV,
413 $ V( II+(JJ-1)*LDV ), LDV, ZERO,
415 CALL CLACGV( NQ-JJ+JJV, V( II+(JJ-1)*LDV ), LDV )
417 CALL CLASET( 'all
', ITMP0, 1, ZERO, ZERO,
418 $ WORK( IW ), ITMP0 )
422.EQ.
IF( MYCOLMICOL ) THEN
423 V( II+(JJ-1)*LDV ) = VII
427.EQ.
IF( MOD( JV+ITMP0, DESCV( NB_ ) )0 )
428 $ MICOL = MOD( MICOL+1, NPCOL )
432 CALL CGSUM2D( ICTXT, 'rowwise
', ' ', IW-1, 1, WORK, IW-1,
435.EQ.
IF( MYCOLIVCOL ) THEN
441 T( ITMP1 ) = TAU( IIV )
443 DO 60 II = IIV+1, IIV+K-1
448 ITMP1 = ITMP1 + DESCV( MB_ )
449 CALL CCOPY( ITMP0, WORK( IW ), 1, T( ITMP1 ), 1 )
452 CALL CTRMV( 'upper
', 'no transpose
', 'non-unit
',
453 $ ITMP0, T, DESCV( MB_ ), T( ITMP1 ), 1 )
454 T( ITMP1+ITMP0 ) = TAU( II )
464 NQ = NUMROC( N+ICOFF-1, DESCV( NB_ ), MYCOL, IVCOL, NPCOL )
467 MICOL = INDXG2P( JV+N-2, DESCV( NB_ ), MYCOL,
468 $ DESCV( CSRC_ ), NPCOL )
472 DO 70 II = IIV+K-2, IIV, -1
474.EQ.
IF( MYCOLMICOL ) THEN
475 VII = V( II+(JJ-1)*LDV )
476 V( II+(JJ-1)*LDV ) = ONE
483.GT.
IF( JJ-JJV+10 ) THEN
484 CALL CLACGV( JJ-JJV+1, V( II+(JJV-1)*LDV ), LDV )
485 CALL CGEMV( 'no transpose', itmp0, jj-jjv+1,
486 $ -tau( ii ), v( ii+1+(jjv-1)*ldv ), ldv,
487 $ v( ii+(jjv-1)*ldv ), ldv, zero,
489 CALL clacgv( jj-jjv+1, v( ii+(jjv-1)*ldv ), ldv )
491 CALL claset(
'All', itmp0, 1, zero, zero,
492 $ work( iw ), itmp0 )
496 IF( mycol.EQ.micol )
THEN
497 v( ii+(jj-1)*ldv ) = vii
501 IF( mod( jv+n-itmp0-2, descv( nb_ ) ).EQ.0 )
502 $ micol = mod( micol+npcol-1, npcol )
506 CALL cgsum2d( ictxt,
'Rowwise',
' ', iw-1, 1, work, iw-1,
509 IF( mycol.EQ.ivcol )
THEN
513 itmp1 = k + 1 + (k-1) * descv( mb_ )
515 t( itmp1-1 ) = tau( iiv+k-1 )
517 DO 80 ii = iiv+k-2, iiv, -1
522 itmp1 = itmp1 - descv( mb_ ) - 1
523 CALL ccopy( itmp0, work( iw ), 1, t( itmp1 ), 1 )
526 CALL ctrmv(
'Lower',
'No transpose',
'Non-unit',
527 $ itmp0, t( itmp1+descv( mb_ ) ),
528 $ descv( mb_ ), t( itmp1 ), 1 )
529 t( itmp1-1 ) = tau( ii )