199 SUBROUTINE dget52( LEFT, N, A, LDA, B, LDB, E, LDE, ALPHAR,
200 $ alphai, beta, work, result )
209 INTEGER LDA, LDB, LDE, N
212 DOUBLE PRECISION A( lda, * ), ALPHAI( * ), ALPHAR( * ),
213 $ b( ldb, * ), beta( * ), e( lde, * ),
214 $ result( 2 ), work( * )
220 DOUBLE PRECISION ZERO, ONE, TEN
221 parameter ( zero = 0.0d0, one = 1.0d0, ten = 10.0d0 )
225 CHARACTER NORMAB, TRANS
227 DOUBLE PRECISION ABMAX, ACOEF, ALFMAX, ANORM, BCOEFI, BCOEFR,
228 $ betmax, bnorm, enorm, enrmer, errnrm, safmax,
229 $ safmin, salfi, salfr, sbeta, scale, temp1, ulp
232 DOUBLE PRECISION DLAMCH, DLANGE
233 EXTERNAL dlamch, dlange
239 INTRINSIC abs, dble, max
248 safmin = dlamch(
'Safe minimum' )
249 safmax = one / safmin
250 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
262 anorm = max( dlange( normab, n, n, a, lda, work ), safmin )
263 bnorm = max( dlange( normab, n, n, b, ldb, work ), safmin )
264 enorm = max( dlange(
'O', n, n, e, lde, work ), ulp )
265 alfmax = safmax / max( one, bnorm )
266 betmax = safmax / max( one, anorm )
279 salfr = alphar( jvec )
280 salfi = alphai( jvec )
282 IF( salfi.EQ.zero )
THEN
286 abmax = max( abs( salfr ), abs( sbeta ) )
287 IF( abs( salfr ).GT.alfmax .OR. abs( sbeta ).GT.
288 $ betmax .OR. abmax.LT.one )
THEN
289 scale = one / max( abmax, safmin )
293 scale = one / max( abs( salfr )*bnorm,
294 $ abs( sbeta )*anorm, safmin )
297 CALL dgemv( trans, n, n, acoef, a, lda, e( 1, jvec ), 1,
298 $ zero, work( n*( jvec-1 )+1 ), 1 )
299 CALL dgemv( trans, n, n, -bcoefr, b, lda, e( 1, jvec ),
300 $ 1, one, work( n*( jvec-1 )+1 ), 1 )
307 result( 1 ) = ten / ulp
310 abmax = max( abs( salfr )+abs( salfi ), abs( sbeta ) )
311 IF( abs( salfr )+abs( salfi ).GT.alfmax .OR.
312 $ abs( sbeta ).GT.betmax .OR. abmax.LT.one )
THEN
313 scale = one / max( abmax, safmin )
318 scale = one / max( ( abs( salfr )+abs( salfi ) )*bnorm,
319 $ abs( sbeta )*anorm, safmin )
327 CALL dgemv( trans, n, n, acoef, a, lda, e( 1, jvec ), 1,
328 $ zero, work( n*( jvec-1 )+1 ), 1 )
329 CALL dgemv( trans, n, n, -bcoefr, b, lda, e( 1, jvec ),
330 $ 1, one, work( n*( jvec-1 )+1 ), 1 )
331 CALL dgemv( trans, n, n, bcoefi, b, lda, e( 1, jvec+1 ),
332 $ 1, one, work( n*( jvec-1 )+1 ), 1 )
334 CALL dgemv( trans, n, n, acoef, a, lda, e( 1, jvec+1 ),
335 $ 1, zero, work( n*jvec+1 ), 1 )
336 CALL dgemv( trans, n, n, -bcoefi, b, lda, e( 1, jvec ),
337 $ 1, one, work( n*jvec+1 ), 1 )
338 CALL dgemv( trans, n, n, -bcoefr, b, lda, e( 1, jvec+1 ),
339 $ 1, one, work( n*jvec+1 ), 1 )
344 errnrm = dlange(
'One', n, n, work, n, work( n**2+1 ) ) / enorm
348 result( 1 ) = errnrm / ulp
359 IF( alphai( jvec ).EQ.zero )
THEN
361 temp1 = max( temp1, abs( e( j, jvec ) ) )
363 enrmer = max( enrmer, temp1-one )
367 temp1 = max( temp1, abs( e( j, jvec ) )+
368 $ abs( e( j, jvec+1 ) ) )
370 enrmer = max( enrmer, temp1-one )
377 result( 2 ) = enrmer / ( dble( n )*ulp )
subroutine dgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
DGEMV
subroutine dget52(LEFT, N, A, LDA, B, LDB, E, LDE, ALPHAR, ALPHAI, BETA, WORK, RESULT)
DGET52