1 SUBROUTINE pchetdrv( UPLO, N, A, IA, JA, DESCA, D, E, TAU, WORK,
16 COMPLEX 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_ = 5, nb_ = 6,
161 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
162 REAL REIGHT, RONE, RZERO
163 parameter( reight = 8.0e+0, rone = 1.0e+0,
165 COMPLEX HALF, ONE, ZERO
166 parameter( half = ( 0.5e+0, 0.0e+0 ),
167 $ one = ( 1.0e+0, 0.0e+0 ),
168 $ zero = ( 0.0e+0, 0.0e+0 ) )
172 INTEGER I, IACOL, IAROW, ICTXT, , IPT, IPV, IPX,
173 $ ipy, j, jb, jj, jl, k, mycol, myrow, nb, np,
179 INTEGER DESCD( ), DESCE( DLEN_ ), DESCV( DLEN_ ),
184 INTEGER INDXG2P, NUMROC
186 EXTERNAL indxg2p, lsame, numroc, pslamch
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 * pslamch( ictxt,
'eps' )
221 CALL descset( desce, 1, ja+n-1, 1, desca( nb_ ), myrow,
222 $ desca( csrc_ ), desca
229 CALL pselget(
' ',
' ', d2, d, 1, ja+j, descd )
230 CALL pcelget(
'Columnwise',
' ', d1, a, ia+j, ja+j, desca )
231 IF( j.LT.(n-1) )
THEN
232 CALL pselget(
' ',
' ', e2, e, 1, ja+j+1, desce )
233 CALL pcelget(
'Columnwise',
' ', e1, a, ia+j, ja+j+1,
237 IF( ( abs( d1 -
cmplx( d2 ) ).GT.( abs( d2 )*addbnd ) ) .OR.
238 $ ( abs( e1 -
cmplx( 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 pclarft(
'Backward',
'Columnwise', k+jb-1, jb, a, ia,
256 $ j, desca, tau, work( ipt ), work( ipv ) )
260 CALL pclacpy(
'All', k+jb-1, jb, a, ia, j, desca,
261 $ work( ipv ), 1, 1, descv )
264 CALL pclaset(
'Lower', jb+1, jb, zero, one, work( ipv ),
267 CALL pclaset(
'Lower', jb, jb-1, zero, one, work( ipv ),
269 CALL pclaset(
'Ge', jb, 1, zero, zero, work( ipv ), 1,
276 CALL pclaset(
'Ge', k-1, jb, zero, zero, a, ia, j,
278 CALL pclaset(
'Upper', jb-1, jb-1, zero, zero, a, i-1,
280 ELSE IF( jb.GT.1 )
THEN
281 CALL pclaset(
'Upper', jb-2, jb-2, zero, zero, a, ia,
287 CALL pchemm(
'Left',
'Upper', k+jb, jb, one, a, ia, ja,
289 $ work( ipx ), 1, 1, descv )
290 CALL pctrmm(
'Right',
'Lower', 'conjugate transpose
',
291 $ 'non-unit
', K+JB, JB, ONE, WORK( IPT ), 1, 1,
292 $ DESCT, WORK( IPX ), 1, 1, DESCV )
296 CALL PCGEMM( '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 pctrmm(
'Left',
'Lower',
'No transpose',
'Non-Unit',
301 $ jb, jb, one, work( ipt ), 1, 1, desct,
302 $ work( ipy ), 1, 1, desct )
303 CALL pcgemm(
'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 pcher2k(
'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
321 $ desca( csrc_ ), desca( ctxt_ ), 1 )
328 CALL pselget(
' ',
' ', d2, d, 1, ja+j, descd )
329 CALL pcelget(
'Columnwise',
' ', d1, a, ia+j, ja+j, desca )
331 CALL pselget(
' ',
' ', e2, e, 1, ja+j, desce )
332 CALL pcelget( 'columnwise
', ' ', E1, A, IA+J+1, JA+J,
336.GT..OR.
IF( ( ABS( D1 - CMPLX( D2 ) )( ABS( D2 )*ADDBND ) )
337.GT.
$ ( ABS( E1 - CMPLX( 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 PCLARFT( 'forward
', 'columnwise
', N-K, JB, A, I+1, J,
359 $ DESCA, TAU, WORK( IPT ), WORK( IPV ) )
363 CALL PCLACPY( 'lower
', N-K, JB, A, I+1, J, DESCA,
364 $ WORK( IPV ), K+1, 1, DESCV )
365 CALL PCLASET( 'upper
', N-K, JB, ZERO, ONE, WORK( IPV ),
367 CALL PCLASET( 'ge
', 1, JB, ZERO, ZERO, WORK( IPV ), K, 1,
372 CALL PCLASET( 'lower
', N-K-1, JB, ZERO, ZERO, A, I+2, J,
377 CALL PCHEMM( '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 PCTRMM( '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 PCGEMM( '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 PCTRMM( 'left
', 'upper
', 'no transpose
', 'non-unit
',
391 $ JB, JB, ONE, WORK( IPT ), 1, 1, DESCT,
392 $ WORK( IPY ), 1, 1, DESCT )
393 CALL PCGEMM( '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 PCHER2K( '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 )