165 SUBROUTINE dget22( TRANSA, TRANSE, TRANSW, N, A, LDA, E, LDE, WR,
173 CHARACTER TRANSA, TRANSE, TRANSW
177 DOUBLE PRECISION A( LDA, * ), E( LDE, * ), RESULT( 2 ), WI( * ),
184 DOUBLE PRECISION ZERO, ONE
185 parameter( zero = 0.0d0, one = 1.0d0 )
188 CHARACTER NORMA, NORME
189 INTEGER IECOL, IEROW, INCE, IPAIR, ITRNSE, J, JCOL,
191 DOUBLE PRECISION ANORM, ENORM, ENRMAX, ENRMIN, ERRNRM, TEMP1,
195 DOUBLE PRECISION WMAT( 2, 2 )
199 DOUBLE PRECISION DLAMCH, DLANGE
200 EXTERNAL lsame, dlamch, dlange
206 INTRINSIC abs, dble, max, min
217 unfl = dlamch(
'Safe minimum' )
218 ulp = dlamch(
'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( dlange( norma, n, n, a, lda, work ), unfl )
313 enorm = max( dlange( norme, n, n, e, lde, work ), ulp )
319 CALL dlaset(
'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 dgemm( 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 daxpy( n, wr( jcol ), e( ierow, iecol ), ince,
349 $ work( n*( jcol-1 )+1 ), 1 )
355 CALL dgemm( transa, transe, n, n, n, one, a, lda, e, lde, -one,
358 errnrm = dlange(
'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 dlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine daxpy(N, DA, DX, INCX, DY, INCY)
DAXPY
subroutine dgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
DGEMM
subroutine dget22(TRANSA, TRANSE, TRANSW, N, A, LDA, E, LDE, WR, WI, WORK, RESULT)
DGET22