165 SUBROUTINE sget22( TRANSA, TRANSE, TRANSW, N, A, LDA, E, LDE, WR,
173 CHARACTER TRANSA, TRANSE, TRANSW
177 REAL A( LDA, * ), E( LDE, * ), RESULT( 2 ), WI( * ),
185 parameter( zero = 0.0, one = 1.0 )
188 CHARACTER NORMA, NORME
189 INTEGER IECOL, IEROW, INCE, IPAIR, ITRNSE, J, JCOL,
191 REAL ANORM, ENORM, ENRMAX, ENRMIN, ERRNRM, TEMP1,
200 EXTERNAL lsame, slamch, slange
206 INTRINSIC abs, max, min, real
217 unfl = slamch(
'Safe minimum' )
218 ulp = slamch(
'Precision' )
225 IF( lsame( transa,
'T' ) .OR. lsame( transa,
'C' ) )
THEN
228 IF( lsame( transe,
'T' ) .OR. lsame( transe,
'C' ) )
THEN
238 IF( itrnse.EQ.0 )
THEN
245 IF( ipair.EQ.0 .AND. jvec.LT.n .AND. wi( jvec ).NE.zero )
247 IF( ipair.EQ.1 )
THEN
252 temp1 = max( temp1, abs( e( j, jvec ) )+
253 $ abs( e( j, jvec+1 ) ) )
255 enrmin = min( enrmin, temp1 )
256 enrmax = max( enrmax, temp1 )
258 ELSE IF( ipair.EQ.2 )
THEN
265 temp1 = max( temp1, abs( e( j, jvec ) ) )
267 enrmin = min( enrmin, temp1 )
268 enrmax = max( enrmax, temp1 )
284 IF( ipair.EQ.0 .AND. jvec.LT.n .AND. wi( jvec ).NE.zero )
286 IF( ipair.EQ.1 )
THEN
287 work( jvec ) = max( work( jvec ),
288 $ abs( e( j, jvec ) )+abs( e( j,
290 work( jvec+1 ) = work( jvec )
291 ELSE IF( ipair.EQ.2 )
THEN
294 work( jvec ) = max( work( jvec ),
295 $ abs( e( j, jvec ) ) )
302 enrmin = min( enrmin, work( jvec ) )
303 enrmax = max( enrmax, work( jvec ) )
309 anorm = max( slange( norma, n, n, a, lda, work ), unfl )
313 enorm = max( slange( norme, n, n, e, lde, work ), ulp )
319 CALL slaset(
'Full', n, n, zero, zero, work, n )
326 IF( itrnse.EQ.1 )
THEN
332 IF( ipair.EQ.0 .AND. wi( jcol ).NE.zero )
335 IF( ipair.EQ.1 )
THEN
336 wmat( 1, 1 ) = wr( jcol )
337 wmat( 2, 1 ) = -wi( jcol )
338 wmat( 1, 2 ) = wi( jcol )
339 wmat( 2, 2 ) = wr( jcol )
340 CALL sgemm( transe, transw, n, 2, 2, one, e( ierow, iecol ),
341 $ lde, wmat, 2, zero, work( n*( jcol-1 )+1 ), n )
343 ELSE IF( ipair.EQ.2 )
THEN
348 CALL saxpy( n, wr( jcol ), e( ierow, iecol ), ince,
349 $ work( n*( jcol-1 )+1 ), 1 )
355 CALL sgemm( transa, transe, n, n, n, one, a, lda, e, lde, -one,
358 errnrm = slange(
'One', n, n, work, n, work( n*n+1 ) ) / enorm
362 IF( anorm.GT.errnrm )
THEN
363 result( 1 ) = ( errnrm / anorm ) / ulp
365 IF( anorm.LT.one )
THEN
366 result( 1 ) = ( min( errnrm, anorm ) / anorm ) / ulp
368 result( 1 ) = min( errnrm / anorm, one ) / ulp
374 result( 2 ) = max( abs( enrmax-one ), abs( enrmin-one ) ) /
subroutine slaset(UPLO, M, N, ALPHA, BETA, A, LDA)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine saxpy(N, SA, SX, INCX, SY, INCY)
SAXPY
subroutine sgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
SGEMM
subroutine sget22(TRANSA, TRANSE, TRANSW, N, A, LDA, E, LDE, WR, WI, WORK, RESULT)
SGET22