00001 SUBROUTINE DGET53( A, LDA, B, LDB, SCALE, WR, WI, RESULT, INFO )
00002
00003
00004
00005
00006
00007
00008 INTEGER INFO, LDA, LDB
00009 DOUBLE PRECISION RESULT, SCALE, WI, WR
00010
00011
00012 DOUBLE PRECISION A( LDA, * ), B( LDB, * )
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
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
00078
00079
00080 DOUBLE PRECISION ZERO, ONE
00081 PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0 )
00082
00083
00084 DOUBLE PRECISION ABSW, ANORM, BNORM, CI11, CI12, CI22, CNORM,
00085 $ CR11, CR12, CR21, CR22, CSCALE, DETI, DETR, S1,
00086 $ SAFMIN, SCALES, SIGMIN, TEMP, ULP, WIS, WRS
00087
00088
00089 DOUBLE PRECISION DLAMCH
00090 EXTERNAL DLAMCH
00091
00092
00093 INTRINSIC ABS, MAX, SQRT
00094
00095
00096
00097
00098
00099 INFO = 0
00100 RESULT = ZERO
00101 SCALES = SCALE
00102 WRS = WR
00103 WIS = WI
00104
00105
00106
00107 SAFMIN = DLAMCH( 'Safe minimum' )
00108 ULP = DLAMCH( 'Epsilon' )*DLAMCH( 'Base' )
00109 ABSW = ABS( WRS ) + ABS( WIS )
00110 ANORM = MAX( ABS( A( 1, 1 ) )+ABS( A( 2, 1 ) ),
00111 $ ABS( A( 1, 2 ) )+ABS( A( 2, 2 ) ), SAFMIN )
00112 BNORM = MAX( ABS( B( 1, 1 ) ), ABS( B( 1, 2 ) )+ABS( B( 2, 2 ) ),
00113 $ SAFMIN )
00114
00115
00116
00117 TEMP = ( SAFMIN*BNORM )*ABSW + ( SAFMIN*ANORM )*SCALES
00118 IF( TEMP.GE.ONE ) THEN
00119
00120
00121
00122 INFO = 1
00123 TEMP = ONE / TEMP
00124 SCALES = SCALES*TEMP
00125 WRS = WRS*TEMP
00126 WIS = WIS*TEMP
00127 ABSW = ABS( WRS ) + ABS( WIS )
00128 END IF
00129 S1 = MAX( ULP*MAX( SCALES*ANORM, ABSW*BNORM ),
00130 $ SAFMIN*MAX( SCALES, ABSW ) )
00131
00132
00133
00134 IF( S1.LT.SAFMIN ) THEN
00135 INFO = 2
00136 IF( SCALES.LT.SAFMIN .AND. ABSW.LT.SAFMIN ) THEN
00137 INFO = 3
00138 RESULT = ONE / ULP
00139 RETURN
00140 END IF
00141
00142
00143
00144 TEMP = ONE / MAX( SCALES*ANORM+ABSW*BNORM, SAFMIN )
00145 SCALES = SCALES*TEMP
00146 WRS = WRS*TEMP
00147 WIS = WIS*TEMP
00148 ABSW = ABS( WRS ) + ABS( WIS )
00149 S1 = MAX( ULP*MAX( SCALES*ANORM, ABSW*BNORM ),
00150 $ SAFMIN*MAX( SCALES, ABSW ) )
00151 IF( S1.LT.SAFMIN ) THEN
00152 INFO = 3
00153 RESULT = ONE / ULP
00154 RETURN
00155 END IF
00156 END IF
00157
00158
00159
00160 CR11 = SCALES*A( 1, 1 ) - WRS*B( 1, 1 )
00161 CI11 = -WIS*B( 1, 1 )
00162 CR21 = SCALES*A( 2, 1 )
00163 CR12 = SCALES*A( 1, 2 ) - WRS*B( 1, 2 )
00164 CI12 = -WIS*B( 1, 2 )
00165 CR22 = SCALES*A( 2, 2 ) - WRS*B( 2, 2 )
00166 CI22 = -WIS*B( 2, 2 )
00167
00168
00169
00170
00171
00172
00173
00174 CNORM = MAX( ABS( CR11 )+ABS( CI11 )+ABS( CR21 ),
00175 $ ABS( CR12 )+ABS( CI12 )+ABS( CR22 )+ABS( CI22 ), SAFMIN )
00176 CSCALE = ONE / SQRT( CNORM )
00177 DETR = ( CSCALE*CR11 )*( CSCALE*CR22 ) -
00178 $ ( CSCALE*CI11 )*( CSCALE*CI22 ) -
00179 $ ( CSCALE*CR12 )*( CSCALE*CR21 )
00180 DETI = ( CSCALE*CR11 )*( CSCALE*CI22 ) +
00181 $ ( CSCALE*CI11 )*( CSCALE*CR22 ) -
00182 $ ( CSCALE*CI12 )*( CSCALE*CR21 )
00183 SIGMIN = ABS( DETR ) + ABS( DETI )
00184 RESULT = SIGMIN / S1
00185 RETURN
00186
00187
00188
00189 END