00001 SUBROUTINE DGET10( M, N, A, LDA, B, LDB, WORK, RESULT )
00002
00003
00004
00005
00006
00007
00008 INTEGER LDA, LDB, M, N
00009 DOUBLE PRECISION RESULT
00010
00011
00012 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), WORK( * )
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050 DOUBLE PRECISION ONE, ZERO
00051 PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 )
00052
00053
00054 INTEGER J
00055 DOUBLE PRECISION ANORM, EPS, UNFL, WNORM
00056
00057
00058 DOUBLE PRECISION DASUM, DLAMCH, DLANGE
00059 EXTERNAL DASUM, DLAMCH, DLANGE
00060
00061
00062 EXTERNAL DAXPY, DCOPY
00063
00064
00065 INTRINSIC DBLE, MAX, MIN
00066
00067
00068
00069
00070
00071 IF( M.LE.0 .OR. N.LE.0 ) THEN
00072 RESULT = ZERO
00073 RETURN
00074 END IF
00075
00076 UNFL = DLAMCH( 'Safe minimum' )
00077 EPS = DLAMCH( 'Precision' )
00078
00079 WNORM = ZERO
00080 DO 10 J = 1, N
00081 CALL DCOPY( M, A( 1, J ), 1, WORK, 1 )
00082 CALL DAXPY( M, -ONE, B( 1, J ), 1, WORK, 1 )
00083 WNORM = MAX( WNORM, DASUM( N, WORK, 1 ) )
00084 10 CONTINUE
00085
00086 ANORM = MAX( DLANGE( '1', M, N, A, LDA, WORK ), UNFL )
00087
00088 IF( ANORM.GT.WNORM ) THEN
00089 RESULT = ( WNORM / ANORM ) / ( M*EPS )
00090 ELSE
00091 IF( ANORM.LT.ONE ) THEN
00092 RESULT = ( MIN( WNORM, M*ANORM ) / ANORM ) / ( M*EPS )
00093 ELSE
00094 RESULT = MIN( WNORM / ANORM, DBLE( M ) ) / ( M*EPS )
00095 END IF
00096 END IF
00097
00098 RETURN
00099
00100
00101
00102 END