00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "f2c.h"
00014 #include "blaswrap.h"
00015
00016
00017
00018 static integer c__1 = 1;
00019
00020 int ctpcon_(char *norm, char *uplo, char *diag, integer *n,
00021 complex *ap, real *rcond, complex *work, real *rwork, integer *info)
00022 {
00023
00024 integer i__1;
00025 real r__1, r__2;
00026
00027
00028 double r_imag(complex *);
00029
00030
00031 integer ix, kase, kase1;
00032 real scale;
00033 extern logical lsame_(char *, char *);
00034 integer isave[3];
00035 real anorm;
00036 logical upper;
00037 extern int clacn2_(integer *, complex *, complex *, real
00038 *, integer *, integer *);
00039 real xnorm;
00040 extern integer icamax_(integer *, complex *, integer *);
00041 extern doublereal slamch_(char *);
00042 extern int xerbla_(char *, integer *);
00043 extern doublereal clantp_(char *, char *, char *, integer *, complex *,
00044 real *);
00045 extern int clatps_(char *, char *, char *, char *,
00046 integer *, complex *, complex *, real *, real *, integer *);
00047 real ainvnm;
00048 extern int csrscl_(integer *, real *, complex *, integer
00049 *);
00050 logical onenrm;
00051 char normin[1];
00052 real smlnum;
00053 logical nounit;
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
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142 --rwork;
00143 --work;
00144 --ap;
00145
00146
00147 *info = 0;
00148 upper = lsame_(uplo, "U");
00149 onenrm = *(unsigned char *)norm == '1' || lsame_(norm, "O");
00150 nounit = lsame_(diag, "N");
00151
00152 if (! onenrm && ! lsame_(norm, "I")) {
00153 *info = -1;
00154 } else if (! upper && ! lsame_(uplo, "L")) {
00155 *info = -2;
00156 } else if (! nounit && ! lsame_(diag, "U")) {
00157 *info = -3;
00158 } else if (*n < 0) {
00159 *info = -4;
00160 }
00161 if (*info != 0) {
00162 i__1 = -(*info);
00163 xerbla_("CTPCON", &i__1);
00164 return 0;
00165 }
00166
00167
00168
00169 if (*n == 0) {
00170 *rcond = 1.f;
00171 return 0;
00172 }
00173
00174 *rcond = 0.f;
00175 smlnum = slamch_("Safe minimum") * (real) max(1,*n);
00176
00177
00178
00179 anorm = clantp_(norm, uplo, diag, n, &ap[1], &rwork[1]);
00180
00181
00182
00183 if (anorm > 0.f) {
00184
00185
00186
00187 ainvnm = 0.f;
00188 *(unsigned char *)normin = 'N';
00189 if (onenrm) {
00190 kase1 = 1;
00191 } else {
00192 kase1 = 2;
00193 }
00194 kase = 0;
00195 L10:
00196 clacn2_(n, &work[*n + 1], &work[1], &ainvnm, &kase, isave);
00197 if (kase != 0) {
00198 if (kase == kase1) {
00199
00200
00201
00202 clatps_(uplo, "No transpose", diag, normin, n, &ap[1], &work[
00203 1], &scale, &rwork[1], info);
00204 } else {
00205
00206
00207
00208 clatps_(uplo, "Conjugate transpose", diag, normin, n, &ap[1],
00209 &work[1], &scale, &rwork[1], info);
00210 }
00211 *(unsigned char *)normin = 'Y';
00212
00213
00214
00215 if (scale != 1.f) {
00216 ix = icamax_(n, &work[1], &c__1);
00217 i__1 = ix;
00218 xnorm = (r__1 = work[i__1].r, dabs(r__1)) + (r__2 = r_imag(&
00219 work[ix]), dabs(r__2));
00220 if (scale < xnorm * smlnum || scale == 0.f) {
00221 goto L20;
00222 }
00223 csrscl_(n, &scale, &work[1], &c__1);
00224 }
00225 goto L10;
00226 }
00227
00228
00229
00230 if (ainvnm != 0.f) {
00231 *rcond = 1.f / anorm / ainvnm;
00232 }
00233 }
00234
00235 L20:
00236 return 0;
00237
00238
00239
00240 }