00001
00002
00003
00004
00005
00006 #include "f2c.h"
00007
00008
00009
00010 static integer c__1 = 1;
00011
00012 int dgecon_(norm, n, a, lda, anorm, rcond, work, iwork, info,
00013 norm_len)
00014 char *norm;
00015 integer *n;
00016 doublereal *a;
00017 integer *lda;
00018 doublereal *anorm, *rcond, *work;
00019 integer *iwork, *info;
00020 ftnlen norm_len;
00021 {
00022
00023 integer a_dim1, a_offset, i__1;
00024 doublereal d__1;
00025
00026
00027 static integer kase, kase1;
00028 static doublereal scale;
00029 extern logical lsame_();
00030 extern int drscl_();
00031 extern doublereal dlamch_();
00032 static doublereal sl;
00033 static integer ix;
00034 extern int dlacon_();
00035 extern integer idamax_();
00036 static doublereal su;
00037 extern int xerbla_();
00038 static doublereal ainvnm;
00039 extern int dlatrs_();
00040 static logical onenrm;
00041 static char normin[1];
00042 static doublereal smlnum;
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
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120 a_dim1 = *lda;
00121 a_offset = a_dim1 + 1;
00122 a -= a_offset;
00123 --work;
00124 --iwork;
00125
00126
00127 *info = 0;
00128 onenrm = *(unsigned char *)norm == '1' || lsame_(norm, "O", 1L, 1L);
00129 if (! onenrm && ! lsame_(norm, "I", 1L, 1L)) {
00130 *info = -1;
00131 } else if (*n < 0) {
00132 *info = -2;
00133 } else if (*lda < max(1,*n)) {
00134 *info = -4;
00135 } else if (*anorm < 0.) {
00136 *info = -5;
00137 }
00138 if (*info != 0) {
00139 i__1 = -(*info);
00140 xerbla_("DGECON", &i__1, 6L);
00141 return 0;
00142 }
00143
00144
00145
00146 *rcond = 0.;
00147 if (*n == 0) {
00148 *rcond = 1.;
00149 return 0;
00150 } else if (*anorm == 0.) {
00151 return 0;
00152 }
00153
00154 smlnum = dlamch_("Safe minimum", 12L);
00155
00156
00157
00158 ainvnm = 0.;
00159 *(unsigned char *)normin = 'N';
00160 if (onenrm) {
00161 kase1 = 1;
00162 } else {
00163 kase1 = 2;
00164 }
00165 kase = 0;
00166 L10:
00167 dlacon_(n, &work[*n + 1], &work[1], &iwork[1], &ainvnm, &kase);
00168 if (kase != 0) {
00169 if (kase == kase1) {
00170
00171
00172
00173 dlatrs_("Lower", "No transpose", "Unit", normin, n, &a[a_offset],
00174 lda, &work[1], &sl, &work[(*n << 1) + 1], info, 5L, 12L,
00175 4L, 1L);
00176
00177
00178
00179 dlatrs_("Upper", "No transpose", "Non-unit", normin, n, &a[
00180 a_offset], lda, &work[1], &su, &work[*n * 3 + 1], info,
00181 5L, 12L, 8L, 1L);
00182 } else {
00183
00184
00185
00186 dlatrs_("Upper", "Transpose", "Non-unit", normin, n, &a[a_offset],
00187 lda, &work[1], &su, &work[*n * 3 + 1], info, 5L, 9L, 8L,
00188 1L);
00189
00190
00191
00192 dlatrs_("Lower", "Transpose", "Unit", normin, n, &a[a_offset],
00193 lda, &work[1], &sl, &work[(*n << 1) + 1], info, 5L, 9L,
00194 4L, 1L);
00195 }
00196
00197
00198
00199
00200 scale = sl * su;
00201 *(unsigned char *)normin = 'Y';
00202 if (scale != 1.) {
00203 ix = idamax_(n, &work[1], &c__1);
00204 if (scale < (d__1 = work[ix], abs(d__1)) * smlnum || scale == 0.)
00205 {
00206 goto L20;
00207 }
00208 drscl_(n, &scale, &work[1], &c__1);
00209 }
00210 goto L10;
00211 }
00212
00213
00214
00215 if (ainvnm != 0.) {
00216 *rcond = 1. / ainvnm / *anorm;
00217 }
00218
00219 L20:
00220 return 0;
00221
00222
00223
00224 }
00225