1 SUBROUTINE pdsytdrv( UPLO, N, A, IA, JA, DESCA, D, E, TAU, WORK,
11 INTEGER IA, INFO, JA, N
15 DOUBLE PRECISION A( * ), D( * ), E( * ), ( * ), ( * )
156 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
157 $ lld_, mb_, m_, nb_, n_, rsrc_
158 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
159 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
160 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
161 DOUBLE PRECISION EIGHT, HALF, ONE, ZERO
162 parameter( eight = 8.0d+0, half = 0.5d+0, one = 1.0d+0,
167 INTEGER I, IACOL, IAROW, ICTXT, II, IPT, IPV, ,
168 $ ipy, j, jb, jj, jl, k, mycol, myrow, nb, np,
170 DOUBLE PRECISION ADDBND, D1, D2, E1, E2
173 INTEGER DESCD( DLEN_ ), DESCE( DLEN_ ), DESCV( DLEN_ ),
178 INTEGER INDXG2P, NUMROC
179 DOUBLE PRECISION PDLAMCH
180 EXTERNAL indxg2p, lsame, numroc, pdlamch
189 INTRINSIC abs,
max,
min, mod
193 ictxt = desca( ctxt_ )
198 upper = lsame( uplo,
'U' )
199 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, ii
201 np = numroc( n, nb, myrow, iarow, nprow )
208 CALL descset( descd, 1, ja+n-1, 1, desca( nb_ ), myrow,
209 $ desca( csrc_ ), desca( ctxt_ ), 1 )
211 addbnd = eight * pdlamch( ictxt,
'eps' )
215 CALL descset( desce, 1, ja+n-1, 1, desca( nb_ ), myrow,
216 $ desca( csrc_ ), desca( ctxt_ ), 1 )
223 CALL pdelget(
' ',
' ', d2, d, 1, ja+j, descd )
224 CALL pdelget(
'Columnwise',
' ', d1, a, ia+j, ja+j, desca )
225 IF( j.LT.(n-1) )
THEN
226 CALL pdelget(
' ',
' ', e2, e, 1, ja+j+1, desce )
227 CALL pdelget(
'Columnwise',
' ', e1, a, ia+j, ja+j+1,
231 IF( ( abs( d1 - d2 ).GT.( abs( d2 ) * addbnd ) ) .OR.
232 $ ( abs( e1 - e2 ).GT.( abs( e2 ) * addbnd ) ) )
240 CALL descset( desct, nb, nb, nb, nb, iarow, iacol, ictxt, nb )
249 CALL pdlarft(
'Backward',
'Columnwise', k+jb-1, jb, a, ia,
250 $ j, desca, tau, work( ipt ), work( ipv ) )
254 CALL pdlacpy(
'All', k+jb-1, jb, a, ia, j, desca,
255 $ work( ipv ), 1, 1, descv )
258 CALL pdlaset( 'lower
', JB+1, JB, ZERO, ONE, WORK( IPV ),
261 CALL PDLASET( 'lower
', JB, JB-1, ZERO, ONE, WORK( IPV ),
263 CALL PDLASET( 'ge
', JB, 1, ZERO, ZERO, WORK( IPV ), 1,
270 CALL PDLASET( 'ge
', K-1, JB, ZERO, ZERO, A, IA, J,
272 CALL PDLASET( 'upper
', JB-1, JB-1, ZERO, ZERO, A, I-1,
274.GT.
ELSE IF( JB1 ) THEN
275 CALL PDLASET( 'upper
', JB-2, JB-2, ZERO, ZERO, A, IA,
281 CALL PDSYMM( 'left
', 'upper
', K+JB, JB, ONE, A, IA, JA,
282 $ DESCA, WORK( IPV ), 1, 1, DESCV, ZERO,
283 $ WORK( IPX ), 1, 1, DESCV )
284 CALL PDTRMM( 'right
', 'lower
', 'transpose
', 'non-unit
',
285 $ K+JB, JB, ONE, WORK( IPT ), 1, 1, DESCT,
286 $ WORK( IPX ), 1, 1, DESCV )
290 CALL PDGEMM( 'transpose
', 'no transpose
', JB, JB, K+JB, ONE,
291 $ WORK( IPV ), 1, 1, DESCV, WORK( IPX ), 1, 1,
292 $ DESCV, ZERO, WORK( IPY ), 1, 1, DESCT )
293 CALL PDTRMM( 'left
', 'lower
', 'no transpose
', 'non-unit
',
294 $ JB, JB, ONE, WORK( IPT ), 1, 1, DESCT,
295 $ WORK( IPY ), 1, 1, DESCT )
296 CALL PDGEMM( 'no tranpose
', 'no transpose
', K+JB, JB, JB,
297 $ -HALF, WORK( IPV ), 1, 1, DESCV, WORK( IPY ),
298 $ 1, 1, DESCT, ONE, WORK( IPX ), 1, 1, DESCV )
302 CALL PDSYR2K( 'upper
', 'no transpose
', K+JB, JB, -ONE,
303 $ WORK( IPV ), 1, 1, DESCV, WORK( IPX ), 1, 1,
304 $ DESCV, ONE, A, IA, JA, DESCA )
306 DESCV( CSRC_ ) = MOD( DESCV( CSRC_ ) + 1, NPCOL )
307 DESCT( CSRC_ ) = MOD( DESCT( CSRC_ ) + 1, NPCOL )
313 CALL DESCSET( DESCE, 1, JA+N-2, 1, DESCA( NB_ ), MYROW,
314 $ DESCA( CSRC_ ), DESCA( CTXT_ ), 1 )
321 CALL PDELGET( ' ', ' ', D2, D, 1, JA+J, DESCD )
322 CALL PDELGET( 'columnwise
', ' ', D1, A, IA+J, JA+J, DESCA )
323.LT.
IF( J(N-1) ) THEN
324 CALL PDELGET( ' ', ' ', E2, E, 1, JA+J, DESCE )
325 CALL PDELGET( 'columnwise
', ' ', E1, A, IA+J+1, JA+J,
329.GT..OR.
IF( ( ABS( D1 - D2 )( ABS( D2 ) * ADDBND ) )
330.GT.
$ ( ABS( E1 - E2 )( ABS( E2 ) * ADDBND ) ) )
336 JL = MAX( ( ( JA+N-2 ) / NB ) * NB + 1, JA )
337 IACOL = INDXG2P( JL, NB, MYCOL, DESCA( CSRC_ ), NPCOL )
338 CALL DESCSET( DESCV, N, NB, NB, NB, IAROW, IACOL, ICTXT,
340 CALL DESCSET( DESCT, NB, NB, NB, NB, INDXG2P( IA+JL-JA+1, NB,
341 $ MYROW, DESCA( RSRC_ ), NPROW ), IACOL, ICTXT,
344 DO 40 J = JL, JA, -NB
347 JB = MIN( N-K+1, NB )
351 CALL PDLARFT( 'forward
', 'columnwise
', N-K, JB, A, I+1, J,
352 $ DESCA, TAU, WORK( IPT ), WORK( IPV ) )
356 CALL PDLACPY( 'lower
', N-K, JB, A, I+1, J, DESCA,
357 $ WORK( IPV ), K+1, 1, DESCV )
358 CALL PDLASET( 'upper
', N-K, JB, ZERO, ONE, WORK( IPV ),
360 CALL PDLASET( 'ge
', 1, JB, ZERO, ZERO, WORK( IPV ), K, 1,
365 CALL PDLASET( 'lower
', N-K-1, JB, ZERO, ZERO, A, I+2, J,
370 CALL PDSYMM( 'left
', 'lower
', N-K+1, JB, ONE, A, I, J,
371 $ DESCA, WORK( IPV ), K, 1, DESCV, ZERO,
372 $ WORK( IPX ), K, 1, DESCV )
373 CALL PDTRMM( 'right
', 'upper
', 'transpose
', 'non-unit
',
374 $ N-K+1, JB, ONE, WORK( IPT ), 1, 1, DESCT,
375 $ WORK( IPX ), K, 1, DESCV )
379 CALL PDGEMM( 'transpose
', 'no transpose
', JB, JB, N-K+1,
380 $ ONE, WORK( IPV ), K, 1, DESCV, WORK( IPX ),
381 $ K, 1, DESCV, ZERO, WORK( IPY ), 1, 1, DESCT )
382 CALL PDTRMM( 'left
', 'upper
', 'no transpose
', 'non-unit
',
383 $ JB, JB, ONE, WORK( IPT ), 1, 1, DESCT,
384 $ WORK( IPY ), 1, 1, DESCT )
385 CALL PDGEMM( 'no transpose
', 'no transpose
', N-K+1, JB, JB,
386 $ -HALF, WORK( IPV ), K, 1, DESCV, WORK( IPY ),
387 $ 1, 1, DESCT, ONE, WORK( IPX ), K, 1, DESCV )
391 CALL PDSYR2K( 'lower
', 'no tranpose
', N-K+1, JB, -ONE,
392 $ WORK( IPV ), K, 1, DESCV, WORK( IPX ), K, 1,
393 $ DESCV, ONE, A, I, J, DESCA )
395 DESCV( CSRC_ ) = MOD( DESCV( CSRC_ ) + NPCOL - 1, NPCOL )
396 DESCT( RSRC_ ) = MOD( DESCT( RSRC_ ) + NPROW - 1, NPROW )
397 DESCT( CSRC_ ) = MOD( DESCT( CSRC_ ) + NPCOL - 1, NPCOL )
403 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, INFO, 1, -1, 0 )