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 static real c_b9 = -1.f;
00020
00021 int cpbstf_(char *uplo, integer *n, integer *kd, complex *ab,
00022 integer *ldab, integer *info)
00023 {
00024
00025 integer ab_dim1, ab_offset, i__1, i__2, i__3;
00026 real r__1;
00027
00028
00029 double sqrt(doublereal);
00030
00031
00032 integer j, m, km;
00033 real ajj;
00034 integer kld;
00035 extern int cher_(char *, integer *, real *, complex *,
00036 integer *, complex *, integer *);
00037 extern logical lsame_(char *, char *);
00038 logical upper;
00039 extern int clacgv_(integer *, complex *, integer *),
00040 csscal_(integer *, real *, complex *, integer *), xerbla_(char *,
00041 integer *);
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
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
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155 ab_dim1 = *ldab;
00156 ab_offset = 1 + ab_dim1;
00157 ab -= ab_offset;
00158
00159
00160 *info = 0;
00161 upper = lsame_(uplo, "U");
00162 if (! upper && ! lsame_(uplo, "L")) {
00163 *info = -1;
00164 } else if (*n < 0) {
00165 *info = -2;
00166 } else if (*kd < 0) {
00167 *info = -3;
00168 } else if (*ldab < *kd + 1) {
00169 *info = -5;
00170 }
00171 if (*info != 0) {
00172 i__1 = -(*info);
00173 xerbla_("CPBSTF", &i__1);
00174 return 0;
00175 }
00176
00177
00178
00179 if (*n == 0) {
00180 return 0;
00181 }
00182
00183
00184 i__1 = 1, i__2 = *ldab - 1;
00185 kld = max(i__1,i__2);
00186
00187
00188
00189 m = (*n + *kd) / 2;
00190
00191 if (upper) {
00192
00193
00194
00195 i__1 = m + 1;
00196 for (j = *n; j >= i__1; --j) {
00197
00198
00199
00200 i__2 = *kd + 1 + j * ab_dim1;
00201 ajj = ab[i__2].r;
00202 if (ajj <= 0.f) {
00203 i__2 = *kd + 1 + j * ab_dim1;
00204 ab[i__2].r = ajj, ab[i__2].i = 0.f;
00205 goto L50;
00206 }
00207 ajj = sqrt(ajj);
00208 i__2 = *kd + 1 + j * ab_dim1;
00209 ab[i__2].r = ajj, ab[i__2].i = 0.f;
00210
00211 i__2 = j - 1;
00212 km = min(i__2,*kd);
00213
00214
00215
00216
00217 r__1 = 1.f / ajj;
00218 csscal_(&km, &r__1, &ab[*kd + 1 - km + j * ab_dim1], &c__1);
00219 cher_("Upper", &km, &c_b9, &ab[*kd + 1 - km + j * ab_dim1], &c__1,
00220 &ab[*kd + 1 + (j - km) * ab_dim1], &kld);
00221
00222 }
00223
00224
00225
00226 i__1 = m;
00227 for (j = 1; j <= i__1; ++j) {
00228
00229
00230
00231 i__2 = *kd + 1 + j * ab_dim1;
00232 ajj = ab[i__2].r;
00233 if (ajj <= 0.f) {
00234 i__2 = *kd + 1 + j * ab_dim1;
00235 ab[i__2].r = ajj, ab[i__2].i = 0.f;
00236 goto L50;
00237 }
00238 ajj = sqrt(ajj);
00239 i__2 = *kd + 1 + j * ab_dim1;
00240 ab[i__2].r = ajj, ab[i__2].i = 0.f;
00241
00242 i__2 = *kd, i__3 = m - j;
00243 km = min(i__2,i__3);
00244
00245
00246
00247
00248 if (km > 0) {
00249 r__1 = 1.f / ajj;
00250 csscal_(&km, &r__1, &ab[*kd + (j + 1) * ab_dim1], &kld);
00251 clacgv_(&km, &ab[*kd + (j + 1) * ab_dim1], &kld);
00252 cher_("Upper", &km, &c_b9, &ab[*kd + (j + 1) * ab_dim1], &kld,
00253 &ab[*kd + 1 + (j + 1) * ab_dim1], &kld);
00254 clacgv_(&km, &ab[*kd + (j + 1) * ab_dim1], &kld);
00255 }
00256
00257 }
00258 } else {
00259
00260
00261
00262 i__1 = m + 1;
00263 for (j = *n; j >= i__1; --j) {
00264
00265
00266
00267 i__2 = j * ab_dim1 + 1;
00268 ajj = ab[i__2].r;
00269 if (ajj <= 0.f) {
00270 i__2 = j * ab_dim1 + 1;
00271 ab[i__2].r = ajj, ab[i__2].i = 0.f;
00272 goto L50;
00273 }
00274 ajj = sqrt(ajj);
00275 i__2 = j * ab_dim1 + 1;
00276 ab[i__2].r = ajj, ab[i__2].i = 0.f;
00277
00278 i__2 = j - 1;
00279 km = min(i__2,*kd);
00280
00281
00282
00283
00284 r__1 = 1.f / ajj;
00285 csscal_(&km, &r__1, &ab[km + 1 + (j - km) * ab_dim1], &kld);
00286 clacgv_(&km, &ab[km + 1 + (j - km) * ab_dim1], &kld);
00287 cher_("Lower", &km, &c_b9, &ab[km + 1 + (j - km) * ab_dim1], &kld,
00288 &ab[(j - km) * ab_dim1 + 1], &kld);
00289 clacgv_(&km, &ab[km + 1 + (j - km) * ab_dim1], &kld);
00290
00291 }
00292
00293
00294
00295 i__1 = m;
00296 for (j = 1; j <= i__1; ++j) {
00297
00298
00299
00300 i__2 = j * ab_dim1 + 1;
00301 ajj = ab[i__2].r;
00302 if (ajj <= 0.f) {
00303 i__2 = j * ab_dim1 + 1;
00304 ab[i__2].r = ajj, ab[i__2].i = 0.f;
00305 goto L50;
00306 }
00307 ajj = sqrt(ajj);
00308 i__2 = j * ab_dim1 + 1;
00309 ab[i__2].r = ajj, ab[i__2].i = 0.f;
00310
00311 i__2 = *kd, i__3 = m - j;
00312 km = min(i__2,i__3);
00313
00314
00315
00316
00317 if (km > 0) {
00318 r__1 = 1.f / ajj;
00319 csscal_(&km, &r__1, &ab[j * ab_dim1 + 2], &c__1);
00320 cher_("Lower", &km, &c_b9, &ab[j * ab_dim1 + 2], &c__1, &ab[(
00321 j + 1) * ab_dim1 + 1], &kld);
00322 }
00323
00324 }
00325 }
00326 return 0;
00327
00328 L50:
00329 *info = j;
00330 return 0;
00331
00332
00333
00334 }