1 SUBROUTINE pssytdrv( UPLO, N, A, IA, JA, DESCA, D, E, TAU, WORK,
11 INTEGER IA, INFO, JA, N
15 REAL A( * ), D( * ), E( * ), TAU( * ), WORK( * )
156 INTEGER BLOCK_CYCLIC_2D, , 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 REAL EIGHT, HALF, ONE, ZERO
162 parameter( eight = 8.0e+0, half = 0.5e+0, one = 1.0e+0,
167 INTEGER I, IACOL, IAROW, ICTXT, II
170 REAL ADDBND, D1, D2, E1, E2
173 INTEGER DESCD( DLEN_ ), DESCE( DLEN_ ), DESCV( DLEN_ ),
178 INTEGER INDXG2P, NUMROC
180EXTERNAL indxg2p, lsame, numroc, pslamch
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, jj,
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 * pslamch( ictxt,
'eps' )
215 CALL descset( desce, 1, ja+n-1, 1, desca( nb_ ), myrow,
216 $ desca( csrc_ ), desca( ctxt_
223 CALL pselget(
' ',
' ', d2, d, 1, ja+j, descd )
224 CALL pselget(
'Columnwise',
' ', d1, a, ia+j, ja+j, desca )
225 IF( j.LT.(n-1) )
THEN
226 CALL pselget(
' ',
' ', e2, e, 1, ja+j+1, desce )
227 CALL pselget(
'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 ) ) )
238 CALL descset( descv, n, nb, nb, nb, iarow, iacol, ictxt,
240 CALL descset( desct, nb, nb, nb, nb, iarow, iacol, ictxt, nb )
249 CALL pslarft(
'Backward',
'Columnwise', k+jb-1, jb, a, ia,
250 $ j, desca, tau, work( ipt ), work( ipv ) )
254 CALL pslacpy(
'All', k+jb-1, jb, a, ia, j, desca,
255 $ work( ipv ), 1, 1, descv )
258 CALL pslaset(
'Lower', jb+1, jb, zero, one, work( ipv ),
261 CALL pslaset(
'Lower', jb, jb-1, zero, one, work( ipv ),
263 CALL pslaset(
'Ge', jb, 1, zero, zero, work( ipv ), 1,
270 CALL pslaset( 'ge
', K-1, JB, ZERO, ZERO, A, IA, J,
272 CALL PSLASET( 'upper
', JB-1, JB-1, ZERO, ZERO, A, I-1,
274.GT.
ELSE IF( JB1 ) THEN
275 CALL PSLASET( 'upper
', JB-2, JB-2, ZERO, ZERO, A, IA,
281 CALL PSSYMM( '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 PSTRMM( 'right
', 'lower
', 'transpose
', 'non
',
285 $ K+JB, JB, ONE, WORK( IPT ), 1, 1, DESCT,
286 $ WORK( IPX ), 1, 1, DESCV )
290 CALL PSGEMM( '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 pstrmm(
'Left', 'lower
', 'no transpose
', 'non-unit
',
294 $ JB, JB, ONE, WORK( IPT ), 1, 1, DESCT,
295 $ WORK( IPY ), 1, 1, DESCT )
296 CALL PSGEMM( '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 PSSYR2K( '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 PSELGET( ' ', ' ', D2, D, 1, JA+J, DESCD )
322 CALL PSELGET( 'columnwise
', ' ', D1, A, IA+J, JA+J, DESCA )
323.LT.
IF( J(N-1) ) THEN
324 CALL PSELGET( ' ', ' ', E2, E, 1, JA+J, DESCE )
325 CALL PSELGET( '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 PSLARFT( 'forward
', 'columnwise
', N-K, JB, A, I+1, J,
352 $ DESCA, TAU, WORK( IPT ), WORK( IPV ) )
356 CALL PSLACPY( 'lower
', N-K, JB, A, I+1, J, DESCA,
357 $ WORK( IPV ), K+1, 1, DESCV )
358 CALL PSLASET( 'upper
', N-K, JB, ZERO, ONE, WORK( IPV ),
360 CALL PSLASET( 'ge
', 1, JB, ZERO, ZERO, WORK( IPV ), K, 1,
365 CALL PSLASET( 'lower
', N-K-1, JB, ZERO, ZERO, A, I+2, J,
370 CALL PSSYMM( '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 PSTRMM( 'right
', 'upper
', 'transpose
', 'non-unit
',
374 $ N-K+1, JB, ONE, WORK( IPT ), 1, 1, DESCT,
375 $ WORK( IPX ), K, 1, DESCV )
379 CALL PSGEMM( '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 PSTRMM( 'left
', 'upper
', 'no transpose
', 'non-unit
',
383 $ JB, JB, ONE, WORK( IPT ), 1, 1, DESCT,
384 $ WORK( IPY ), 1, 1, DESCT )
385 CALL PSGEMM( '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 PSSYR2K( '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 )