00001 SUBROUTINE DSTT21( N, KBAND, AD, AE, SD, SE, U, LDU, WORK,
00002 $ RESULT )
00003
00004
00005
00006
00007
00008
00009 INTEGER KBAND, LDU, N
00010
00011
00012 DOUBLE PRECISION AD( * ), AE( * ), RESULT( 2 ), SD( * ),
00013 $ SE( * ), U( LDU, * ), WORK( * )
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
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 DOUBLE PRECISION ZERO, ONE
00078 PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 )
00079
00080
00081 INTEGER J
00082 DOUBLE PRECISION ANORM, TEMP1, TEMP2, ULP, UNFL, WNORM
00083
00084
00085 DOUBLE PRECISION DLAMCH, DLANGE, DLANSY
00086 EXTERNAL DLAMCH, DLANGE, DLANSY
00087
00088
00089 EXTERNAL DGEMM, DLASET, DSYR, DSYR2
00090
00091
00092 INTRINSIC ABS, DBLE, MAX, MIN
00093
00094
00095
00096
00097
00098 RESULT( 1 ) = ZERO
00099 RESULT( 2 ) = ZERO
00100 IF( N.LE.0 )
00101 $ RETURN
00102
00103 UNFL = DLAMCH( 'Safe minimum' )
00104 ULP = DLAMCH( 'Precision' )
00105
00106
00107
00108
00109
00110 CALL DLASET( 'Full', N, N, ZERO, ZERO, WORK, N )
00111
00112 ANORM = ZERO
00113 TEMP1 = ZERO
00114
00115 DO 10 J = 1, N - 1
00116 WORK( ( N+1 )*( J-1 )+1 ) = AD( J )
00117 WORK( ( N+1 )*( J-1 )+2 ) = AE( J )
00118 TEMP2 = ABS( AE( J ) )
00119 ANORM = MAX( ANORM, ABS( AD( J ) )+TEMP1+TEMP2 )
00120 TEMP1 = TEMP2
00121 10 CONTINUE
00122
00123 WORK( N**2 ) = AD( N )
00124 ANORM = MAX( ANORM, ABS( AD( N ) )+TEMP1, UNFL )
00125
00126
00127
00128 DO 20 J = 1, N
00129 CALL DSYR( 'L', N, -SD( J ), U( 1, J ), 1, WORK, N )
00130 20 CONTINUE
00131
00132 IF( N.GT.1 .AND. KBAND.EQ.1 ) THEN
00133 DO 30 J = 1, N - 1
00134 CALL DSYR2( 'L', N, -SE( J ), U( 1, J ), 1, U( 1, J+1 ), 1,
00135 $ WORK, N )
00136 30 CONTINUE
00137 END IF
00138
00139 WNORM = DLANSY( '1', 'L', N, WORK, N, WORK( N**2+1 ) )
00140
00141 IF( ANORM.GT.WNORM ) THEN
00142 RESULT( 1 ) = ( WNORM / ANORM ) / ( N*ULP )
00143 ELSE
00144 IF( ANORM.LT.ONE ) THEN
00145 RESULT( 1 ) = ( MIN( WNORM, N*ANORM ) / ANORM ) / ( N*ULP )
00146 ELSE
00147 RESULT( 1 ) = MIN( WNORM / ANORM, DBLE( N ) ) / ( N*ULP )
00148 END IF
00149 END IF
00150
00151
00152
00153
00154
00155 CALL DGEMM( 'N', 'C', N, N, N, ONE, U, LDU, U, LDU, ZERO, WORK,
00156 $ N )
00157
00158 DO 40 J = 1, N
00159 WORK( ( N+1 )*( J-1 )+1 ) = WORK( ( N+1 )*( J-1 )+1 ) - ONE
00160 40 CONTINUE
00161
00162 RESULT( 2 ) = MIN( DBLE( N ), DLANGE( '1', N, N, WORK, N,
00163 $ WORK( N**2+1 ) ) ) / ( N*ULP )
00164
00165 RETURN
00166
00167
00168
00169 END