1 SUBROUTINE pzhetdrv( UPLO, N, A, IA, JA, DESCA, D, E, TAU, WORK,
11 INTEGER IA, INFO, JA, N
15 DOUBLE PRECISION D( * )
16COMPLEX*16 A( * ), TAU( * ), WORK( * )
157 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
158 $ lld_, mb_, m_, nb_, n_, rsrc_
159 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
160 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_
161 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
162 DOUBLE PRECISION REIGHT, RONE, RZERO
163 parameter( reight = 8.0d+0, rone = 1.0d+0,
165 COMPLEX*16 HALF, ONE, ZERO
166 parameter( half = ( 0.5d+0, 0.0d+0 ),
167 $ one = ( 1.0d+0, 0.0d+0 ),
168 $ zero = ( 0.0d+0, 0.0d+0 ) )
172 INTEGER I, , IAROW, ICTXT, II, IPT, IPV, IPX,
173 $ ipy, j, jb, jj, jl, k, mycol, myrow, nb, np,
175 DOUBLE PRECISION ADDBND, D2, E2
179 INTEGER ( DLEN_ ), DESCE( DLEN_ ), DESCV( ),
184 INTEGER INDXG2P, NUMROC
185 DOUBLE PRECISION PDLAMCH
186 EXTERNAL indxg2p, lsame, numroc, pdlamch
195 INTRINSIC abs, dcmplx,
max,
min, mod
199 ictxt = desca( ctxt_ )
204 upper = lsame( uplo,
'U' )
205 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, ii, jj,
207 np = numroc( n, nb, myrow, iarow, nprow )
214 CALL descset( descd, 1, ja+n-1, 1, desca( nb_ ), myrow,
215 $ desca( csrc_ ), desca( ctxt_ ), 1 )
217 addbnd = reight * pdlamch( ictxt,
'eps' )
221 CALL descset( desce, 1, ja+n-1, 1, desca( nb_ ), myrow,
222 $ desca( csrc_ ), desca( ctxt_ ), 1 )
229 CALL pdelget(
' ',
' ', d2, d, 1, ja+j, descd )
230 CALL pzelget(
'Columnwise',
' ', d1, a, ia+j, ja+j, desca )
231 IF( j.LT.(n-1) )
THEN
232 CALL pdelget(
' ',
' ', e2, e, 1, ja+j+1, desce )
233 CALL pzelget(
'Columnwise',
' ', e1, a, ia+j, ja+j+1,
237 IF( ( abs( d1-dcmplx( d2 ) ).GT.( abs( d2 )*addbnd ) ) .OR.
238 $ ( abs( e1-dcmplx( e2 ) ).GT.( abs( e2 )*addbnd ) ) )
244 CALL descset( descv, n, nb, nb, nb, iarow, iacol, ictxt,
246 CALL descset( desct, nb, nb, nb, nb, iarow, iacol, ictxt, nb )
255 CALL pzlarft(
'Backward',
'Columnwise', k+jb-1, jb, a, ia,
256 $ j, desca, tau, work( ipt ), work( ipv ) )
260 CALL pzlacpy(
'All', k+jb-1, jb, a, ia, j, desca,
261 $ work( ipv ), 1, 1, descv )
264 CALL pzlaset(
'Lower', jb+1, jb, zero, one, work( ipv ),
267 CALL pzlaset(
'Lower', jb, jb-1, zero, one, work( ipv ),
269 CALL pzlaset(
'Ge', jb, 1, zero, zero, work( ipv ), 1,
276 CALL pzlaset(
'Ge', k-1, jb, zero, zero, a, ia, j,
278 CALL pzlaset(
'Upper', jb-1, jb-1, zero, zero, a, i-1,
280 ELSE IF( jb.GT.1 )
THEN
281 CALL pzlaset(
'Upper', jb-2, jb-2, zero, zero, a, ia,
287 CALL pzhemm(
'Left',
'Upper', k+jb, jb, one, a, ia, ja,
288 $ desca, work( ipv ), 1, 1, descv, zero,
289 $ work( ipx ), 1, 1, descv )
290 CALL pztrmm(
'Right',
'Lower',
'Conjugate transpose',
291 $
'Non-Unit', k+jb, jb, one, work( ipt ), 1, 1,
292 $ desct, work( ipx ), 1, 1, descv )
296 CALL pzgemm(
'Conjugate transpose',
'No transpose', jb, jb,
297 $ k+jb, one, work( ipv ), 1, 1, descv,
298 $ work( ipx ), 1, 1, descv, zero, work( ipy ),
300 CALL pztrmm(
'Left',
'Lower',
'No transpose',
'Non-Unit',
301 $ jb, jb, one, work( ipt ), 1, 1, desct,
302 $ work( ipy ), 1, 1, desct )
303 CALL pzgemm(
'No tranpose',
'No transpose', k+jb, jb, jb,
304 $ -half, work( ipv ), 1, 1, descv, work( ipy ),
305 $ 1, 1, desct, one, work( ipx ), 1, 1, descv )
309 CALL pzher2k(
'Upper',
'No transpose', k+jb, jb, -one,
310 $ work( ipv ), 1, 1, descv, work( ipx ), 1, 1,
311 $ descv, rone, a, ia, ja, desca )
313 descv( csrc_ ) = mod( descv( csrc_ ) + 1, npcol )
314 desct( csrc_ ) = mod( desct( csrc_ ) + 1, npcol )
320 CALL descset( desce, 1, ja+n-2, 1, desca( nb_ ), myrow,
321 $ desca( csrc_ ), desca(
328 CALL pdelget(
' ', '
', D2, D, 1, JA+J, DESCD )
329 CALL PZELGET( 'columnwise
', ' ', D1, A, IA+J, JA+J, DESCA )
330.LT.
IF( J(N-1) ) THEN
331 CALL PDELGET( ' ', ' ', E2, E, 1, JA+J, DESCE )
332 CALL PZELGET( 'columnwise
', ' ', E1, A, IA+J+1, JA+J,
336.GT..OR.
IF( ( ABS( D1-DCMPLX( D2 ) )( ABS( D2 )*ADDBND ) )
337.GT.
$ ( ABS( E1-DCMPLX( E2 ) )( ABS( E2 )*ADDBND ) ) )
343 JL = MAX( ( ( JA+N-2 ) / NB ) * NB + 1, JA )
344 IACOL = INDXG2P( JL, NB, MYCOL, DESCA( CSRC_ ), NPCOL )
345 CALL DESCSET( DESCV, N, NB, NB, NB, IAROW, IACOL, ICTXT,
347 CALL DESCSET( DESCT, NB, NB, NB, NB, INDXG2P( IA+JL-JA+1, NB,
348 $ MYROW, DESCA( RSRC_ ), NPROW ), IACOL, ICTXT,
351 DO 40 J = JL, JA, -NB
354 JB = MIN( N-K+1, NB )
358 CALL PZLARFT( 'forward
', 'columnwise
', N-K, JB, A, I+1, J,
359 $ DESCA, TAU, WORK( IPT ), WORK( IPV ) )
363 CALL PZLACPY( 'lower
', N-K, JB, A, I+1, J, DESCA,
364 $ WORK( IPV ), K+1, 1, DESCV )
365 CALL PZLASET( 'upper
', N-K, JB, ZERO, ONE, WORK( IPV ),
367 CALL PZLASET( 'ge
', 1, JB, ZERO, ZERO, WORK( IPV ), K, 1,
372 CALL PZLASET( 'lower
', N-K-1, JB, ZERO, ZERO, A, I+2, J,
377 CALL PZHEMM( 'left
', 'lower
', N-K+1, JB, ONE, A, I, J,
378 $ DESCA, WORK( IPV ), K, 1, DESCV, ZERO,
379 $ WORK( IPX ), K, 1, DESCV )
380 CALL PZTRMM( 'right
', 'upper
', 'conjugate transpose
',
381 $ 'non-unit
', N-K+1, JB, ONE, WORK( IPT ), 1, 1,
382 $ DESCT, WORK( IPX ), K, 1, DESCV )
386 CALL PZGEMM( 'conjugate transpose
', 'no transpose
', JB, JB,
387 $ N-K+1, ONE, WORK( IPV ), K, 1, DESCV,
388 $ WORK( IPX ), K, 1, DESCV, ZERO, WORK( IPY ),
390 CALL PZTRMM( 'left
', 'upper
', 'no transpose
', 'non-unit
',
391 $ JB, JB, ONE, WORK( IPT ), 1, 1, DESCT,
392 $ WORK( IPY ), 1, 1, DESCT )
393 CALL PZGEMM( 'no transpose
', 'no transpose
', N-K+1, JB, JB,
394 $ -HALF, WORK( IPV ), K, 1, DESCV, WORK( IPY ),
395 $ 1, 1, DESCT, ONE, WORK( IPX ), K, 1, DESCV )
399 CALL PZHER2K( 'lower
', 'no tranpose
', N-K+1, JB, -ONE,
400 $ WORK( IPV ), K, 1, DESCV, WORK( IPX ), K, 1,
401 $ DESCV, RONE, A, I, J, DESCA )
403 DESCV( CSRC_ ) = MOD( DESCV( CSRC_ ) + NPCOL - 1, NPCOL )
404 DESCT( RSRC_ ) = MOD( DESCT( RSRC_ ) + NPROW - 1, NPROW )
405 DESCT( CSRC_ ) = MOD( DESCT( CSRC_ ) + NPCOL - 1, NPCOL )
411 CALL IGSUM2D( ICTXT, 'all
', ' ', 1, 1, INFO, 1, -1, 0 )