00001 REAL FUNCTION CLA_GERCOND_C( TRANS, N, A, LDA, AF, LDAF, IPIV, C,
00002 $ CAPPLY, INFO, WORK, RWORK )
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 IMPLICIT NONE
00013
00014
00015 CHARACTER TRANS
00016 LOGICAL CAPPLY
00017 INTEGER N, LDA, LDAF, INFO
00018
00019
00020 INTEGER IPIV( * )
00021 COMPLEX A( LDA, * ), AF( LDAF, * ), WORK( * )
00022 REAL C( * ), RWORK( * )
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
00081 LOGICAL NOTRANS
00082 INTEGER KASE, I, J
00083 REAL AINVNM, ANORM, TMP
00084 COMPLEX ZDUM
00085
00086
00087 INTEGER ISAVE( 3 )
00088
00089
00090 LOGICAL LSAME
00091 EXTERNAL LSAME
00092
00093
00094 EXTERNAL CLACN2, CGETRS, XERBLA
00095
00096
00097 INTRINSIC ABS, MAX, REAL, AIMAG
00098
00099
00100 REAL CABS1
00101
00102
00103 CABS1( ZDUM ) = ABS( REAL( ZDUM ) ) + ABS( AIMAG( ZDUM ) )
00104
00105
00106 CLA_GERCOND_C = 0.0E+0
00107
00108 INFO = 0
00109 NOTRANS = LSAME( TRANS, 'N' )
00110 IF ( .NOT. NOTRANS .AND. .NOT. LSAME( TRANS, 'T' ) .AND. .NOT.
00111 $ LSAME( TRANS, 'C' ) ) THEN
00112 ELSE IF( N.LT.0 ) THEN
00113 INFO = -2
00114 END IF
00115 IF( INFO.NE.0 ) THEN
00116 CALL XERBLA( 'CLA_GERCOND_C', -INFO )
00117 RETURN
00118 END IF
00119
00120
00121
00122 ANORM = 0.0E+0
00123 IF ( NOTRANS ) THEN
00124 DO I = 1, N
00125 TMP = 0.0E+0
00126 IF ( CAPPLY ) THEN
00127 DO J = 1, N
00128 TMP = TMP + CABS1( A( I, J ) ) / C( J )
00129 END DO
00130 ELSE
00131 DO J = 1, N
00132 TMP = TMP + CABS1( A( I, J ) )
00133 END DO
00134 END IF
00135 RWORK( I ) = TMP
00136 ANORM = MAX( ANORM, TMP )
00137 END DO
00138 ELSE
00139 DO I = 1, N
00140 TMP = 0.0E+0
00141 IF ( CAPPLY ) THEN
00142 DO J = 1, N
00143 TMP = TMP + CABS1( A( J, I ) ) / C( J )
00144 END DO
00145 ELSE
00146 DO J = 1, N
00147 TMP = TMP + CABS1( A( J, I ) )
00148 END DO
00149 END IF
00150 RWORK( I ) = TMP
00151 ANORM = MAX( ANORM, TMP )
00152 END DO
00153 END IF
00154
00155
00156
00157 IF( N.EQ.0 ) THEN
00158 CLA_GERCOND_C = 1.0E+0
00159 RETURN
00160 ELSE IF( ANORM .EQ. 0.0E+0 ) THEN
00161 RETURN
00162 END IF
00163
00164
00165
00166 AINVNM = 0.0E+0
00167
00168 KASE = 0
00169 10 CONTINUE
00170 CALL CLACN2( N, WORK( N+1 ), WORK, AINVNM, KASE, ISAVE )
00171 IF( KASE.NE.0 ) THEN
00172 IF( KASE.EQ.2 ) THEN
00173
00174
00175
00176 DO I = 1, N
00177 WORK( I ) = WORK( I ) * RWORK( I )
00178 END DO
00179
00180 IF (NOTRANS) THEN
00181 CALL CGETRS( 'No transpose', N, 1, AF, LDAF, IPIV,
00182 $ WORK, N, INFO )
00183 ELSE
00184 CALL CGETRS( 'Conjugate transpose', N, 1, AF, LDAF, IPIV,
00185 $ WORK, N, INFO )
00186 ENDIF
00187
00188
00189
00190 IF ( CAPPLY ) THEN
00191 DO I = 1, N
00192 WORK( I ) = WORK( I ) * C( I )
00193 END DO
00194 END IF
00195 ELSE
00196
00197
00198
00199 IF ( CAPPLY ) THEN
00200 DO I = 1, N
00201 WORK( I ) = WORK( I ) * C( I )
00202 END DO
00203 END IF
00204
00205 IF ( NOTRANS ) THEN
00206 CALL CGETRS( 'Conjugate transpose', N, 1, AF, LDAF, IPIV,
00207 $ WORK, N, INFO )
00208 ELSE
00209 CALL CGETRS( 'No transpose', N, 1, AF, LDAF, IPIV,
00210 $ WORK, N, INFO )
00211 END IF
00212
00213
00214
00215 DO I = 1, N
00216 WORK( I ) = WORK( I ) * RWORK( I )
00217 END DO
00218 END IF
00219 GO TO 10
00220 END IF
00221
00222
00223
00224 IF( AINVNM .NE. 0.0E+0 )
00225 $ CLA_GERCOND_C = 1.0E+0 / AINVNM
00226
00227 RETURN
00228
00229 END