1 SUBROUTINE pdlatrd( 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 A( * ), D( * ), E( * ), TAU( * ), W( * ),
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 DOUBLE PRECISION HALF, ONE, ZERO
228 parameter( half = 0.5d+0, one = 1.0d+0, zero = 0.0d+0 )
231 INTEGER I, IACOL, IAROW, ICTXT, II, J, JJ, JP, JWK, K,
232 $ kw, mycol, myrow, npcol, nprow, nq
233 DOUBLE PRECISION ALPHA
236 INTEGER DESCD( DLEN_ ), DESCE( DLEN_ ), DESCWK( DLEN_ )
239 EXTERNAL blacs_gridinfo,
descset, dgebr2d, dgebs2d,
247 EXTERNAL lsame, numroc
259 ictxt = desca( ctxt_ )
260 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
261 nq =
max( 1, numroc( ja+n-1, desca( nb_ ), mycol, desca( csrc_ ),
263 CALL descset( descd, 1, ja+n-1, 1, desca( nb_ ), myrow,
264 $ desca( csrc_ ), desca( ctxt_ ), 1 )
266 IF( lsame( uplo,
'U' ) )
THEN
268 CALL infog2l( n+ia-nb, n+ja-nb, desca, nprow, npcol, myrow,
269 $ mycol, ii, jj, iarow, iacol )
270 CALL descset( descwk, 1, descw( nb_ ), 1, descw( nb_ ), iarow,
272 CALL descset( desce, 1, ja+n-1, 1, desca( nb_ ), myrow,
273 $ desca( csrc_ ), desca( ctxt_ ), 1 )
277 DO 10 j = ja+n-1, ja+n-nb, -1
280 kw = mod( k-1, desca( mb_ ) ) + 1
284 CALL pdgemv(
'No transpose', k, n-k, -one, a, ia, j+1,
285 $ desca, w, iw+k-1, jw+kw, descw, descw( m_ ),
286 $ one, a, ia, j, desca, 1 )
287 CALL pdgemv(
'No transpose', k, n-k, -one, w, iw, jw+kw,
288 $ descw, a, i, j+1, desca, desca( m_ ), one, a,
291 $
CALL pdelset( a, i, j+1, desca, e( jp ) )
296 jp =
min( jj+kw-1, nq )
297 CALL pdlarfg( k-1, e( jp ), i-1, j, a, ia, j, desca, 1,
299 CALL pdelset( a, i-1, j, desca, one )
303 CALL pdsymv(
'Upper', k-1, one, a, ia, ja, desca, a, ia, j,
304 $ desca, 1, zero, w, iw, jw+kw-1, descw, 1 )
306 jwk = mod( k-1, descwk( nb_ ) ) + 2
307 CALL pdgemv(
'Transpose', k-1, n-k, one, w, iw, jw+kw,
308 $ descw, a, ia, j, desca, 1, zero, work, 1, jwk,
309 $ descwk, descwk( m_ ) )
310 CALL pdgemv(
'No transpose', k-1, n-k, -one, a, ia, j+1,
311 $ desca, work, 1, jwk, descwk, descwk( m_ ), one,
312 $ w, iw, jw+kw-1, descw, 1 )
313 CALL pdgemv(
'Transpose', k-1, n-k, one, a, ia, j+1, desca,
314 $ a, ia, j, desca, 1, zero, work, 1, jwk, descwk,
316 CALL pdgemv(
'No transpose', k-1, n-k, -one, w, iw, jw+kw,
317 $ descw, work, 1, jwk, descwk, descwk( m_ ), one,
318 $ w, iw, jw+kw-1, descw, 1 )
319 CALL pdscal( k-1, tau( jp ), w, iw, jw+kw-1, descw, 1 )
321 CALL pddot( k-1, alpha, w, iw, jw+kw-1, descw, 1, a, ia, j,
324 $ alpha = -half*tau( jp )*alpha
325 CALL pdaxpy( k-1, alpha, a, ia, j, desca, 1, w, iw, jw+kw-1,
327 IF( mycol.EQ.iacol )
THEN
328 CALL pdelget(
'E',
' ', d( jp ), a, i, j, desca )
335 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, ii,
337 CALL descset( descwk, 1, descw( nb_ ), 1, descw( nb_ ), iarow,
339 CALL descset( desce, 1, ja+n-2, 1, desca( nb_ ), myrow,
340 $ desca( csrc_ ), desca( ctxt_ ), 1 )
344 DO 20 j = ja, ja+nb-1
350 CALL pdgemv(
'No transpose', n-k+1, k-1, -one, a, i, ja,
351 $ desca, w, iw+k-1, jw, descw, descw( m_ ), one,
352 $ a, i, j, desca, 1 )
353 CALL pdgemv(
'No transpose', n-k+1, k-1, -one, w, iw+k-1,
354 $ jw, descw, a, i, ja, desca, desca( m_ ), one,
355 $ a, i, j, desca, 1 )
357 $
CALL pdelset( a, i, j-1, desca, e( jp ) )
363 jp =
min( jj+k-1, nq )
364 CALL pdlarfg( n-k, e( jp ), i+1, j, a, i+2, j, desca, 1,
366 CALL pdelset( a, i+1, j, desca, one )
370 CALL pdsymv(
'Lower', n-k, one, a, i+1, j+1, desca, a, i+1,
371 $ j, desca, 1, zero, w, iw+k, jw+k-1, descw, 1 )
373 CALL pdgemv(
'Transpose', n-k, k-1, one, w, iw+k, jw, descw,
374 $ a, i+1, j, desca, 1, zero, work, 1, 1, descwk,
376 CALL pdgemv(
'No transpose', n-k, k-1, -one, a, i+1, ja,
377 $ desca, work, 1, 1, descwk, descwk( m_ ), one, w,
378 $ iw+k, jw+k-1, descw, 1 )
379 CALL pdgemv(
'Transpose', n-k, k-1, one, a, i+1, ja, desca,
380 $ a, i+1, j, desca, 1, zero, work, 1, 1, descwk,
382 CALL pdgemv(
'No transpose', n-k, k-1, -one, w, iw+k, jw,
383 $ descw, work, 1, 1, descwk, descwk( m_ ), one, w,
384 $ iw+k, jw+k-1, descw, 1 )
385 CALL pdscal( n-k, tau( jp ), w, iw+k, jw+k-1, descw, 1 )
386 CALL pddot( n-k, alpha, w, iw+k, jw+k-1, descw, 1, a, i+1,
389 $ alpha = -half*tau( jp )*alpha
390 CALL pdaxpy( n-k, alpha, a, i+1, j, desca, 1, w, iw+k,
392 IF( mycol.EQ.iacol )
THEN
393 CALL pdelget(
'E',
' ', d( jp ), a, i, j, desca )
402 IF( mycol.EQ.iacol )
THEN
403 IF( myrow.EQ.iarow )
THEN
404 CALL dgebs2d( ictxt,
'Columnwise',
' ', 1, nb, d( jj ), 1 )
406 CALL dgebr2d( ictxt,
'Columnwise',
' ', 1, nb, d( jj ), 1,