00001 SUBROUTINE DGET01( M, N, A, LDA, AFAC, LDAFAC, IPIV, RWORK,
00002 $ RESID )
00003
00004
00005
00006
00007
00008
00009 INTEGER LDA, LDAFAC, M, N
00010 DOUBLE PRECISION RESID
00011
00012
00013 INTEGER IPIV( * )
00014 DOUBLE PRECISION A( LDA, * ), AFAC( LDAFAC, * ), RWORK( * )
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 DOUBLE PRECISION ZERO, ONE
00062 PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 )
00063
00064
00065 INTEGER I, J, K
00066 DOUBLE PRECISION ANORM, EPS, T
00067
00068
00069 DOUBLE PRECISION DDOT, DLAMCH, DLANGE
00070 EXTERNAL DDOT, DLAMCH, DLANGE
00071
00072
00073 EXTERNAL DGEMV, DLASWP, DSCAL, DTRMV
00074
00075
00076 INTRINSIC DBLE, MIN
00077
00078
00079
00080
00081
00082 IF( M.LE.0 .OR. N.LE.0 ) THEN
00083 RESID = ZERO
00084 RETURN
00085 END IF
00086
00087
00088
00089 EPS = DLAMCH( 'Epsilon' )
00090 ANORM = DLANGE( '1', M, N, A, LDA, RWORK )
00091
00092
00093
00094
00095
00096 DO 10 K = N, 1, -1
00097 IF( K.GT.M ) THEN
00098 CALL DTRMV( 'Lower', 'No transpose', 'Unit', M, AFAC,
00099 $ LDAFAC, AFAC( 1, K ), 1 )
00100 ELSE
00101
00102
00103
00104 T = AFAC( K, K )
00105 IF( K+1.LE.M ) THEN
00106 CALL DSCAL( M-K, T, AFAC( K+1, K ), 1 )
00107 CALL DGEMV( 'No transpose', M-K, K-1, ONE,
00108 $ AFAC( K+1, 1 ), LDAFAC, AFAC( 1, K ), 1, ONE,
00109 $ AFAC( K+1, K ), 1 )
00110 END IF
00111
00112
00113
00114 AFAC( K, K ) = T + DDOT( K-1, AFAC( K, 1 ), LDAFAC,
00115 $ AFAC( 1, K ), 1 )
00116
00117
00118
00119 CALL DTRMV( 'Lower', 'No transpose', 'Unit', K-1, AFAC,
00120 $ LDAFAC, AFAC( 1, K ), 1 )
00121 END IF
00122 10 CONTINUE
00123 CALL DLASWP( N, AFAC, LDAFAC, 1, MIN( M, N ), IPIV, -1 )
00124
00125
00126
00127 DO 30 J = 1, N
00128 DO 20 I = 1, M
00129 AFAC( I, J ) = AFAC( I, J ) - A( I, J )
00130 20 CONTINUE
00131 30 CONTINUE
00132
00133
00134
00135 RESID = DLANGE( '1', M, N, AFAC, LDAFAC, RWORK )
00136
00137 IF( ANORM.LE.ZERO ) THEN
00138 IF( RESID.NE.ZERO )
00139 $ RESID = ONE / EPS
00140 ELSE
00141 RESID = ( ( RESID / DBLE( N ) ) / ANORM ) / EPS
00142 END IF
00143
00144 RETURN
00145
00146
00147
00148 END