166 SUBROUTINE dget22( TRANSA, TRANSE, TRANSW, N, A, LDA, E, LDE, WR,
174 CHARACTER TRANSA, TRANSE, TRANSW
178 DOUBLE PRECISION A( LDA, * ), E( LDE, * ), RESULT( 2 ), WI( * ),
185 DOUBLE PRECISION ZERO, ONE
186 parameter( zero = 0.0d0, one = 1.0d0 )
189 CHARACTER NORMA, NORME
190 INTEGER IECOL, IEROW, INCE, IPAIR, ITRNSE, J, JCOL,
192 DOUBLE PRECISION ANORM, ENORM, ENRMAX, ENRMIN, ERRNRM, TEMP1,
196 DOUBLE PRECISION WMAT( 2, 2 )
200 DOUBLE PRECISION DLAMCH, DLANGE
201 EXTERNAL lsame, dlamch, dlange
207 INTRINSIC abs, dble,
max,
min
218 unfl = dlamch(
'Safe minimum' )
219 ulp = dlamch( 'precision
' )
226 IF( LSAME( TRANSA, 't.OR.
' ) LSAME( TRANSA, 'c
' ) ) THEN
229 IF( LSAME( TRANSE, 't.OR.
' ) LSAME( TRANSE, 'c
' ) ) THEN
239.EQ.
IF( ITRNSE0 ) THEN
246.EQ..AND..LT..AND..NE.
IF( IPAIR0 JVECN WI( JVEC )ZERO )
248.EQ.
IF( IPAIR1 ) THEN
253 TEMP1 = MAX( TEMP1, ABS( E( J, JVEC ) )+
254 $ ABS( E( J, JVEC+1 ) ) )
256 ENRMIN = MIN( ENRMIN, TEMP1 )
257 ENRMAX = MAX( ENRMAX, TEMP1 )
259.EQ.
ELSE IF( IPAIR2 ) THEN
266 TEMP1 = MAX( TEMP1, ABS( E( J, JVEC ) ) )
268 ENRMIN = MIN( ENRMIN, TEMP1 )
269 ENRMAX = MAX( ENRMAX, TEMP1 )
285.EQ..AND..LT..AND..NE.
IF( IPAIR0 JVECN WI( JVEC )ZERO )
287.EQ.
IF( IPAIR1 ) THEN
288 WORK( JVEC ) = MAX( WORK( JVEC ),
289 $ ABS( E( J, JVEC ) )+ABS( E( J,
291 WORK( JVEC+1 ) = WORK( JVEC )
292.EQ.
ELSE IF( IPAIR2 ) THEN
295 WORK( JVEC ) = MAX( WORK( JVEC ),
296 $ ABS( E( J, JVEC ) ) )
303 ENRMIN = MIN( ENRMIN, WORK( JVEC ) )
304 ENRMAX = MAX( ENRMAX, WORK( JVEC ) )
310 ANORM = MAX( DLANGE( NORMA, N, N, A, LDA, WORK ), UNFL )
314 ENORM = MAX( DLANGE( NORME, N, N, E, LDE, WORK ), ULP )
320 CALL DLASET( 'full
', N, N, ZERO, ZERO, WORK, N )
327.EQ.
IF( ITRNSE1 ) THEN
333.EQ..AND..NE.
IF( IPAIR0 WI( JCOL )ZERO )
336.EQ.
IF( IPAIR1 ) THEN
337 WMAT( 1, 1 ) = WR( JCOL )
338 WMAT( 2, 1 ) = -WI( JCOL )
339 WMAT( 1, 2 ) = WI( JCOL )
340 WMAT( 2, 2 ) = WR( JCOL )
341 CALL DGEMM( TRANSE, TRANSW, N, 2, 2, ONE, E( IEROW, IECOL ),
342 $ LDE, WMAT, 2, ZERO, WORK( N*( JCOL-1 )+1 ), N )
344.EQ.
ELSE IF( IPAIR2 ) THEN
349 CALL DAXPY( N, WR( JCOL ), E( IEROW, IECOL ), INCE,
350 $ WORK( N*( JCOL-1 )+1 ), 1 )
356 CALL DGEMM( TRANSA, TRANSE, N, N, N, ONE, A, LDA, E, LDE, -ONE,
359 ERRNRM = DLANGE( 'one
', N, N, WORK, N, WORK( N*N+1 ) ) / ENORM
363.GT.
IF( ANORMERRNRM ) THEN
364 RESULT( 1 ) = ( ERRNRM / ANORM ) / ULP
366.LT.
IF( ANORMONE ) THEN
367 RESULT( 1 ) = ONE / ULP
369 RESULT( 1 ) = MIN( ERRNRM / ANORM, ONE ) / ULP
375 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