00001 SUBROUTINE ZUNT01( ROWCOL, M, N, U, LDU, WORK, LWORK, RWORK,
00002 $ RESID )
00003
00004
00005
00006
00007
00008
00009 CHARACTER ROWCOL
00010 INTEGER LDU, LWORK, M, N
00011 DOUBLE PRECISION RESID
00012
00013
00014 DOUBLE PRECISION RWORK( * )
00015 COMPLEX*16 U( LDU, * ), WORK( * )
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 DOUBLE PRECISION ZERO, ONE
00080 PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 )
00081
00082
00083 CHARACTER TRANSU
00084 INTEGER I, J, K, LDWORK, MNMIN
00085 DOUBLE PRECISION EPS
00086 COMPLEX*16 TMP, ZDUM
00087
00088
00089 LOGICAL LSAME
00090 DOUBLE PRECISION DLAMCH, ZLANSY
00091 COMPLEX*16 ZDOTC
00092 EXTERNAL LSAME, DLAMCH, ZLANSY, ZDOTC
00093
00094
00095 EXTERNAL ZHERK, ZLASET
00096
00097
00098 INTRINSIC ABS, DBLE, DCMPLX, DIMAG, MAX, MIN
00099
00100
00101 DOUBLE PRECISION CABS1
00102
00103
00104 CABS1( ZDUM ) = ABS( DBLE( ZDUM ) ) + ABS( DIMAG( ZDUM ) )
00105
00106
00107
00108 RESID = ZERO
00109
00110
00111
00112 IF( M.LE.0 .OR. N.LE.0 )
00113 $ RETURN
00114
00115 EPS = DLAMCH( 'Precision' )
00116 IF( M.LT.N .OR. ( M.EQ.N .AND. LSAME( ROWCOL, 'R' ) ) ) THEN
00117 TRANSU = 'N'
00118 K = N
00119 ELSE
00120 TRANSU = 'C'
00121 K = M
00122 END IF
00123 MNMIN = MIN( M, N )
00124
00125 IF( ( MNMIN+1 )*MNMIN.LE.LWORK ) THEN
00126 LDWORK = MNMIN
00127 ELSE
00128 LDWORK = 0
00129 END IF
00130 IF( LDWORK.GT.0 ) THEN
00131
00132
00133
00134 CALL ZLASET( 'Upper', MNMIN, MNMIN, DCMPLX( ZERO ),
00135 $ DCMPLX( ONE ), WORK, LDWORK )
00136 CALL ZHERK( 'Upper', TRANSU, MNMIN, K, -ONE, U, LDU, ONE, WORK,
00137 $ LDWORK )
00138
00139
00140
00141 RESID = ZLANSY( '1', 'Upper', MNMIN, WORK, LDWORK, RWORK )
00142 RESID = ( RESID / DBLE( K ) ) / EPS
00143 ELSE IF( TRANSU.EQ.'C' ) THEN
00144
00145
00146
00147 DO 20 J = 1, N
00148 DO 10 I = 1, J
00149 IF( I.NE.J ) THEN
00150 TMP = ZERO
00151 ELSE
00152 TMP = ONE
00153 END IF
00154 TMP = TMP - ZDOTC( M, U( 1, I ), 1, U( 1, J ), 1 )
00155 RESID = MAX( RESID, CABS1( TMP ) )
00156 10 CONTINUE
00157 20 CONTINUE
00158 RESID = ( RESID / DBLE( M ) ) / EPS
00159 ELSE
00160
00161
00162
00163 DO 40 J = 1, M
00164 DO 30 I = 1, J
00165 IF( I.NE.J ) THEN
00166 TMP = ZERO
00167 ELSE
00168 TMP = ONE
00169 END IF
00170 TMP = TMP - ZDOTC( N, U( J, 1 ), LDU, U( I, 1 ), LDU )
00171 RESID = MAX( RESID, CABS1( TMP ) )
00172 30 CONTINUE
00173 40 CONTINUE
00174 RESID = ( RESID / DBLE( N ) ) / EPS
00175 END IF
00176 RETURN
00177
00178
00179
00180 END