1 SUBROUTINE pdlarft( DIRECT, STOREV, N, K, V, IV, JV, DESCV, TAU,
10 CHARACTER DIRECT, STOREV
15 DOUBLE PRECISION TAU( * ), T( * ), V( * ), WORK( * )
173 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
174 $ lld_, mb_, m_, nb_, n_, rsrc_
175 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
176 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
177 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
178 DOUBLE PRECISION ONE, ZERO
179 parameter( one = 1.0d+0, zero = 0.0d+0 )
183 INTEGER ICOFF, ICTXT, II, IIV, IROFF, IVCOL, IVROW,
184 $ itmp0, itmp1, iw, jj, jjv, ldv, micol, mirow,
185 $ mycol, myrow, np, npcol, nprow, nq
194 INTEGER INDXG2P, NUMROC
195 EXTERNAL indxg2p, lsame, numroc
204 IF( n.LE.0 .OR. k.LE.0 )
207 ictxt = descv( ctxt_ )
210 forward = lsame( direct,
'F' )
211 CALL infog2l( iv, jv, descv, nprow, npcol, myrow, mycol,
212 $ iiv, jjv, ivrow, ivcol )
214 IF( lsame( storev,
'C' ) .AND. mycol.EQ.ivcol )
THEN
218 iroff = mod( iv-1, descv( mb_ ) )
224 np = numroc( n+iroff, descv( mb_ ), myrow, ivrow, nprow )
225 IF( myrow.EQ.ivrow )
THEN
231 IF( iroff+1.EQ.descv( mb_ ) )
THEN
232 mirow = mod( ivrow+1, nprow )
238 DO 10 jj = jjv+1, jjv+k-1
240 IF( myrow.EQ.mirow )
THEN
241 vii = v( ii+(jj-1)*ldv )
242 v( ii+(jj-1)*ldv ) = one
249 IF( np-ii+iiv.GT.0 )
THEN
250 CALL dgemv(
'Transpose', np-ii+iiv, itmp0,
251 $ -tau( jj ), v( ii+(jjv-1)*ldv ), ldv,
252 $ v( ii+(jj-1)*ldv ), 1, zero,
255 CALL dlaset(
'All', itmp0, 1, zero, zero, work( iw ),
260 IF( myrow.EQ.mirow )
THEN
261 v( ii+(jj-1)*ldv ) = vii
265 IF( mod( iv+itmp0, descv( mb_ ) ).EQ.0 )
266 $ mirow = mod( mirow+1, nprow )
270 CALL dgsum2d( ictxt,
'Columnwise',
' ', iw-1, 1, work, iw-1,
273 IF( myrow.EQ.ivrow )
THEN
279 t( itmp1 ) = tau( jjv )
281 DO 20 jj = jjv+1, jjv+k-1
286 itmp1 = itmp1 + descv( nb_ )
287 CALL dcopy( itmp0, work( iw ), 1, t( itmp1 ), 1 )
290 CALL dtrmv(
'Upper',
'No transpose',
'Non-unit',
291 $ itmp0, t, descv( nb_ ), t( itmp1 ), 1 )
292 t(itmp1+itmp0) = tau( jj )
302 np = numroc( n+iroff-1, descv( mb_ ), myrow, ivrow, nprow )
305 mirow = indxg2p( iv+n-2, descv( mb_ ), myrow,
306 $ descv( rsrc_ ), nprow )
310 DO 30 jj = jjv+k-2, jjv, -1
312 IF( myrow.EQ.mirow )
THEN
313 vii = v( ii+(jj-1)*ldv )
314 v( ii+(jj-1)*ldv ) = one
321 IF( ii-iiv+1.GT.0 )
THEN
322 CALL dgemv(
'Transpose', ii-iiv+1, itmp0, -tau( jj ),
323 $ v( iiv+jj*ldv ), ldv,
324 $ v( iiv+(jj-1)*ldv ), 1, zero,
327 CALL dlaset(
'All', itmp0, 1, zero, zero, work( iw ),
332 IF( myrow.EQ.mirow )
THEN
333 v( ii+(jj-1)*ldv ) = vii
337 IF( mod( iv+n-itmp0-2, descv(mb_) ).EQ.0 )
338 $ mirow = mod( mirow+nprow-1, nprow )
342 CALL dgsum2d( ictxt,
'Columnwise',
' ', iw-1, 1, work, iw-1,
345 IF( myrow.EQ.ivrow )
THEN
349 itmp1 = k + 1 + (k-1) * descv( nb_ )
351 t( itmp1-1 ) = tau( jjv+k-1 )
353 DO 40 jj = jjv+k-2, jjv, -1
358 itmp1 = itmp1 - descv( nb_ ) - 1
359 CALL dcopy( itmp0, work( iw ), 1, t( itmp1 ), 1 )
362 CALL dtrmv(
'Lower', 'no transpose
', 'non-unit
',
363 $ ITMP0, T( ITMP1+DESCV( NB_ ) ),
364 $ DESCV( NB_ ), T( ITMP1 ), 1 )
365 T( ITMP1-1 ) = TAU( JJ )
373 ELSE IF( LSAME( STOREV, 'r.AND..EQ.
' ) MYROWIVROW ) THEN
377 ICOFF = MOD( JV-1, DESCV( NB_ ) )
383 NQ = NUMROC( N+ICOFF, DESCV( NB_ ), MYCOL, IVCOL, NPCOL )
384.EQ.
IF( MYCOLIVCOL ) THEN
390.EQ.
IF( ICOFF+1DESCV( NB_ ) ) THEN
391 MICOL = MOD( IVCOL+1, NPCOL )
397 DO 50 II = IIV+1, IIV+K-1
399.EQ.
IF( MYCOLMICOL ) THEN
400 VII = V( II+(JJ-1)*LDV )
401 V( II+(JJ-1)*LDV ) = ONE
408.GT.
IF( NQ-JJ+JJV0 ) THEN
409 CALL DGEMV( 'no transpose
', ITMP0, NQ-JJ+JJV,
410 $ -TAU(II), V( IIV+(JJ-1)*LDV ), LDV,
411 $ V( II+(JJ-1)*LDV ), LDV, ZERO,
414 CALL DLASET( 'all
', ITMP0, 1, ZERO, ZERO,
415 $ WORK( IW ), ITMP0 )
419.EQ.
IF( MYCOLMICOL ) THEN
420 V( II+(JJ-1)*LDV ) = VII
424.EQ.
IF( MOD( JV+ITMP0, DESCV( NB_ ) )0 )
425 $ MICOL = MOD( MICOL+1, NPCOL )
429 CALL DGSUM2D( ICTXT, 'rowwise
', ' ', IW-1, 1, WORK, IW-1,
432.EQ.
IF( MYCOLIVCOL ) THEN
438 T( ITMP1 ) = TAU( IIV )
440 DO 60 II = IIV+1, IIV+K-1
445 ITMP1 = ITMP1 + DESCV( MB_ )
446 CALL DCOPY( ITMP0, WORK( IW ), 1, T( ITMP1 ), 1 )
449 CALL DTRMV( 'upper
', 'no transpose
', 'non-unit
',
450 $ ITMP0, T, DESCV( MB_ ), T( ITMP1 ), 1 )
451 T( ITMP1+ITMP0 ) = TAU( II )
461 NQ = NUMROC( N+ICOFF-1, DESCV( NB_ ), MYCOL, IVCOL, NPCOL )
464 MICOL = INDXG2P( JV+N-2, DESCV( NB_ ), MYCOL,
465 $ DESCV( CSRC_ ), NPCOL )
469 DO 70 II = IIV+K-2, IIV, -1
471.EQ.
IF( MYCOLMICOL ) THEN
472 VII = V( II+(JJ-1)*LDV )
473 V( II+(JJ-1)*LDV ) = ONE
480.GT.
IF( JJ-JJV+10 ) THEN
481 CALL DGEMV( 'no transpose
', ITMP0, JJ-JJV+1,
482 $ -TAU( II ), V( II+1+(JJV-1)*LDV ), LDV,
483 $ V( II+(JJV-1)*LDV ), LDV, ZERO,
486 CALL DLASET( 'all
', ITMP0, 1, ZERO, ZERO,
487 $ WORK( IW ), ITMP0 )
491.EQ.
IF( MYCOLMICOL ) THEN
492 V( II+(JJ-1)*LDV ) = VII
496.EQ.
IF( MOD( JV+N-ITMP0-2, DESCV( NB_ ) )0 )
497 $ MICOL = MOD( MICOL+NPCOL-1, NPCOL )
501 CALL DGSUM2D( ICTXT, 'rowwise
', ' ', IW-1, 1, WORK, IW-1,
504.EQ.
IF( MYCOLIVCOL ) THEN
508 ITMP1 = K + 1 + (K-1) * DESCV( MB_ )
510 T( ITMP1-1 ) = TAU( IIV+K-1 )
512 DO 80 II = IIV+K-2, IIV, -1
517 ITMP1 = ITMP1 - DESCV( MB_ ) - 1
518 CALL DCOPY( ITMP0, WORK( IW ), 1, T( ITMP1 ), 1 )
521 CALL DTRMV( 'lower
', 'no transpose
', 'non-unit',
522 $ itmp0, t( itmp1+descv( mb_ ) ),
523 $ descv( mb_ ), t( itmp1 ), 1 )
524 t( itmp1-1 ) = tau( ii )