00001 SUBROUTINE SGET01( M, N, A, LDA, AFAC, LDAFAC, IPIV, RWORK,
00002 $ RESID )
00003
00004
00005
00006
00007
00008
00009 INTEGER LDA, LDAFAC, M, N
00010 REAL RESID
00011
00012
00013 INTEGER IPIV( * )
00014 REAL 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 REAL ZERO, ONE
00062 PARAMETER ( ZERO = 0.0E+0, ONE = 1.0E+0 )
00063
00064
00065 INTEGER I, J, K
00066 REAL ANORM, EPS, T
00067
00068
00069 REAL SDOT, SLAMCH, SLANGE
00070 EXTERNAL SDOT, SLAMCH, SLANGE
00071
00072
00073 EXTERNAL SGEMV, SLASWP, SSCAL, STRMV
00074
00075
00076 INTRINSIC MIN, REAL
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 = SLAMCH( 'Epsilon' )
00090 ANORM = SLANGE( '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 STRMV( '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 SSCAL( M-K, T, AFAC( K+1, K ), 1 )
00107 CALL SGEMV( '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 + SDOT( K-1, AFAC( K, 1 ), LDAFAC,
00115 $ AFAC( 1, K ), 1 )
00116
00117
00118
00119 CALL STRMV( 'Lower', 'No transpose', 'Unit', K-1, AFAC,
00120 $ LDAFAC, AFAC( 1, K ), 1 )
00121 END IF
00122 10 CONTINUE
00123 CALL SLASWP( 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 = SLANGE( '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 / REAL( N ) ) / ANORM ) / EPS
00142 END IF
00143
00144 RETURN
00145
00146
00147
00148 END