1 SUBROUTINE pzlatrd( UPLO, N, NB, A, IA, JA, DESCA, D, E, TAU, W,
2 $ IW, JW, DESCW, WORK )
11 INTEGER IA, IW, JA, JW, N, NB
14 INTEGER DESCA( * ), DESCW( * )
15 DOUBLE PRECISION D( * ), E( * )
16 COMPLEX*16 A( * ), TAU( * ), W( * ), WORK( * )
222 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
223 $ lld_, mb_, m_, nb_, n_, rsrc_
224 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
225 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
226 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
227 COMPLEX*16 HALF, ONE, ZERO
228 parameter( half = ( 0.5d+0, 0.0d+0 ),
229 $ one = ( 1.0d+0, 0.0d+0 ),
230 $ zero = ( 0.0d+0, 0.0d+0 ) )
233 INTEGER I, IACOL, IAROW, ICTXT, II, J, JJ, JP, JWK, K,
234 $ kw, mycol, myrow, npcol, nprow, nq
235 COMPLEX*16 AII, ALPHA, BETA
238 INTEGER DESCD( DLEN_ ), DESCE( DLEN_ ), DESCWK( DLEN_ )
249 EXTERNAL lsame, numroc
252 INTRINSIC dble, dcmplx,
min
261 ictxt = desca( ctxt_ )
263 nq =
max( 1, numroc( ja+n-1, desca( nb_ ), mycol, desca( csrc_ ),
265 CALL descset( descd, 1, ja+n-1, 1, desca( nb_ ), myrow,
266 $ desca( csrc_ ), desca( ctxt_ ), 1 )
270 IF( lsame( uplo,
'U' ) )
THEN
272 CALL infog2l( n+ia-nb, n+ja-nb, desca, nprow, npcol, myrow,
273 $ mycol, ii, jj, iarow, iacol )
274 CALL descset( descwk, 1, descw( nb_ ), 1, descw( nb_
276 CALL descset( desce, 1, ja+n-1, 1, desca( nb_ ), myrow,
277 $ desca( csrc_ ), desca( ctxt_ ), 1 )
281 DO 10 j = ja+n-1, ja+n-nb,
284 kw = mod( k-1, desca( mb_ ) ) + 1
288 CALL pzelget(
'E', '
', AII, A, I, J, DESCA )
289 CALL PZELSET( A, I, J, DESCA, DCMPLX( DBLE( AII ) ) )
290 CALL PZLACGV( N-K, W, IW+K-1, JW+KW, DESCW, DESCW( M_ ) )
291 CALL PZGEMV( 'no transpose
', K, N-K, -ONE, A, IA, J+1,
292 $ DESCA, W, IW+K-1, JW+KW, DESCW, DESCW( M_ ),
293 $ ONE, A, IA, J, DESCA, 1 )
294 CALL PZLACGV( N-K, W, IW+K-1, JW+KW, DESCW, DESCW( M_ ) )
295 CALL PZLACGV( N-K, A, I, J+1, DESCA, DESCA( M_ ) )
296 CALL PZGEMV( 'no
', K, N-K, -ONE, W, IW, JW+KW,
297 $ DESCW, A, I, J+1, DESCA, DESCA( M_ ), ONE, A,
299 CALL PZLACGV( N-K, A, I, J+1, DESCA, DESCA( M_ ) )
300 CALL PZELGET( 'e
', ' ', AII, A, I, J, DESCA )
301 CALL PZELSET( A, I, J, DESCA, DCMPLX( DBLE( AII ) ) )
303 $ CALL PZELSET( A, I, J+1, DESCA, DCMPLX( E( JP ) ) )
308 JP = MIN( JJ+KW-1, NQ )
309 CALL PZLARFG( K-1, BETA, I-1, J, A, IA, J, DESCA, 1,
311 CALL PDELSET( E, 1, J, DESCE, DBLE( BETA ) )
312 CALL PZELSET( A, I-1, J, DESCA, ONE )
316 CALL PZHEMV( 'upper
', K-1, ONE, A, IA, JA, DESCA, A, IA, J,
317 $ DESCA, 1, ZERO, W, IW, JW+KW-1, DESCW, 1 )
319 JWK = MOD( K-1, DESCWK( NB_ ) ) + 2
320 CALL PZGEMV( 'conjugate transpose
', K-1, N-K, ONE, W, IW,
321 $ JW+KW, DESCW, A, IA, J, DESCA, 1, ZERO, WORK,
322 $ 1, JWK, DESCWK, DESCWK( M_ ) )
323 CALL PZGEMV( 'no transpose
', K-1, N-K, -ONE, A, IA, J+1,
324 $ DESCA, WORK, 1, JWK, DESCWK, DESCWK( M_ ), ONE,
325 $ W, IW, JW+KW-1, DESCW, 1 )
326 CALL PZGEMV( 'conjugate transpose
', K-1, N-K, ONE, A, IA,
327 $ J+1, DESCA, A, IA, J, DESCA, 1, ZERO, WORK, 1,
328 $ JWK, DESCWK, DESCWK( M_ ) )
329 CALL PZGEMV( 'no transpose
', K-1, N-K, -ONE, W, IW, JW+KW,
330 $ DESCW, WORK, 1, JWK, DESCWK, DESCWK( M_ ), ONE,
331 $ W, IW, JW+KW-1, DESCW, 1 )
332 CALL PZSCAL( K-1, TAU( JP ), W, IW, JW+KW-1, DESCW, 1 )
334 CALL PZDOTC( K-1, ALPHA, W, IW, JW+KW-1, DESCW, 1, A, IA, J,
337 $ ALPHA = -HALF*TAU( JP )*ALPHA
338 CALL PZAXPY( K-1, ALPHA, A, IA, J, DESCA, 1, W, IW, JW+KW-1,
340 CALL PZELGET( 'e
', ' ', BETA, A, I, J, DESCA )
341 CALL PDELSET( D, 1, J, DESCD, DBLE( BETA ) )
347 CALL INFOG2L( IA, JA, DESCA, NPROW, NPCOL, MYROW, MYCOL, II,
349 CALL DESCSET( DESCWK, 1, DESCW( NB_ ), 1, DESCW( NB_ ), IAROW,
351 CALL DESCSET( DESCE, 1, JA+N-2, 1, DESCA( NB_ ), MYROW,
352 $ DESCA( CSRC_ ), DESCA( CTXT_ ), 1 )
356 DO 20 J = JA, JA+NB-1
362 CALL PZELGET( 'e
', ' ', AII, A, I, J, DESCA )
363 CALL PZELSET( A, I, J, DESCA, DCMPLX( DBLE( AII ) ) )
364 CALL PZLACGV( K-1, W, IW+K-1, JW, DESCW, DESCW( M_ ) )
365 CALL PZGEMV( 'no transpose
', N-K+1, K-1, -ONE, A, I, JA,
366 $ DESCA, W, IW+K-1, JW, DESCW, DESCW( M_ ), ONE,
367 $ A, I, J, DESCA, 1 )
368 CALL PZLACGV( K-1, W, IW+K-1, JW, DESCW, DESCW( M_ ) )
369 CALL PZLACGV( K-1, A, I, JA, DESCA, DESCA( M_ ) )
370 CALL PZGEMV( 'no transpose
', N-K+1, K-1, -ONE, W, IW+K-1,
371 $ JW, DESCW, A, I, JA, DESCA, DESCA( M_ ), ONE,
372 $ A, I, J, DESCA, 1 )
373 CALL PZLACGV( K-1, A, I, JA, DESCA, DESCA( M_ ) )
374 CALL PZELGET( 'e
', ' ', AII, A, I, J, DESCA )
375 CALL PZELSET( A, I, J, DESCA, DCMPLX( DBLE( AII ) ) )
377 $ CALL PZELSET( A, I, J-1, DESCA, DCMPLX( E( JP ) ) )
383 JP = MIN( JJ+K-1, NQ )
384 CALL PZLARFG( N-K, BETA, I+1, J, A, I+2, J, DESCA, 1,
386 CALL PDELSET( E, 1, J, DESCE, DBLE( BETA ) )
387 CALL PZELSET( A, I+1, J, DESCA, ONE )
391 CALL PZHEMV( 'lower
', N-K, ONE, A, I+1, J+1, DESCA, A, I+1,
392 $ J, DESCA, 1, ZERO, W, IW+K, JW+K-1, DESCW, 1 )
394 CALL PZGEMV( 'conjugate transpose', n-k, k-1, one, w, iw+k,
395 $ jw, descw, a, i+1, j, desca, 1, zero, work, 1,
396 $ 1, descwk, descwk( m_ ) )
397 CALL pzgemv(
'No transpose', n-k, k-1, -one, a, i+1, ja,
398 $ desca, work, 1, 1, descwk, descwk( m_ ), one, w,
399 $ iw+k, jw+k-1, descw, 1 )
400 CALL pzgemv(
'Conjugate transpose', n-k, k-1, one, a, i+1,
401 $ ja, desca, a, i+1, j, desca, 1, zero, work, 1,
402 $ 1, descwk, descwk( m_ ) )
403 CALL pzgemv(
'No transpose', n-k, k-1, -one, w, iw+k, jw,
404 $ descw, work, 1, 1, descwk, descwk( m_ ), one, w,
405 $ iw+k, jw+k-1, descw, 1 )
406 CALL pzscal( n-k, tau( jp ), w, iw+k, jw+k-1, descw, 1 )
407 CALL pzdotc( n-k, alpha, w, iw+k, jw+k-1, descw, 1, a, i+1,
410 $ alpha = -half*tau( jp )*alpha
413 CALL pzelget(
'E',
' ', beta, a, i, j, desca )
414 CALL pdelset( d, 1, j, descd, dble( beta ) )
422 IF( mycol.EQ.iacol )
THEN
423 IF( myrow.EQ.iarow )
THEN
424 CALL dgebs2d( ictxt,
'Columnwise',
' ', 1, nb, d( jj ), 1 )
426 CALL dgebr2d( ictxt,
'Columnwise',
' ', 1, nb, d( jj ), 1,