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 ssptrf_(char *uplo, integer *n, real *ap, integer *ipiv,
00021 integer *info)
00022 {
00023
00024 integer i__1, i__2;
00025 real r__1, r__2, r__3;
00026
00027
00028 double sqrt(doublereal);
00029
00030
00031 integer i__, j, k;
00032 real t, r1, d11, d12, d21, d22;
00033 integer kc, kk, kp;
00034 real wk;
00035 integer kx, knc, kpc, npp;
00036 real wkm1, wkp1;
00037 integer imax, jmax;
00038 extern int sspr_(char *, integer *, real *, real *,
00039 integer *, real *);
00040 real alpha;
00041 extern logical lsame_(char *, char *);
00042 extern int sscal_(integer *, real *, real *, integer *);
00043 integer kstep;
00044 logical upper;
00045 extern int sswap_(integer *, real *, integer *, real *,
00046 integer *);
00047 real absakk;
00048 extern int xerbla_(char *, integer *);
00049 extern integer isamax_(integer *, real *, integer *);
00050 real colmax, rowmax;
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
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170 --ipiv;
00171 --ap;
00172
00173
00174 *info = 0;
00175 upper = lsame_(uplo, "U");
00176 if (! upper && ! lsame_(uplo, "L")) {
00177 *info = -1;
00178 } else if (*n < 0) {
00179 *info = -2;
00180 }
00181 if (*info != 0) {
00182 i__1 = -(*info);
00183 xerbla_("SSPTRF", &i__1);
00184 return 0;
00185 }
00186
00187
00188
00189 alpha = (sqrt(17.f) + 1.f) / 8.f;
00190
00191 if (upper) {
00192
00193
00194
00195
00196
00197
00198 k = *n;
00199 kc = (*n - 1) * *n / 2 + 1;
00200 L10:
00201 knc = kc;
00202
00203
00204
00205 if (k < 1) {
00206 goto L110;
00207 }
00208 kstep = 1;
00209
00210
00211
00212
00213 absakk = (r__1 = ap[kc + k - 1], dabs(r__1));
00214
00215
00216
00217
00218 if (k > 1) {
00219 i__1 = k - 1;
00220 imax = isamax_(&i__1, &ap[kc], &c__1);
00221 colmax = (r__1 = ap[kc + imax - 1], dabs(r__1));
00222 } else {
00223 colmax = 0.f;
00224 }
00225
00226 if (dmax(absakk,colmax) == 0.f) {
00227
00228
00229
00230 if (*info == 0) {
00231 *info = k;
00232 }
00233 kp = k;
00234 } else {
00235 if (absakk >= alpha * colmax) {
00236
00237
00238
00239 kp = k;
00240 } else {
00241
00242
00243
00244
00245 rowmax = 0.f;
00246 jmax = imax;
00247 kx = imax * (imax + 1) / 2 + imax;
00248 i__1 = k;
00249 for (j = imax + 1; j <= i__1; ++j) {
00250 if ((r__1 = ap[kx], dabs(r__1)) > rowmax) {
00251 rowmax = (r__1 = ap[kx], dabs(r__1));
00252 jmax = j;
00253 }
00254 kx += j;
00255
00256 }
00257 kpc = (imax - 1) * imax / 2 + 1;
00258 if (imax > 1) {
00259 i__1 = imax - 1;
00260 jmax = isamax_(&i__1, &ap[kpc], &c__1);
00261
00262 r__2 = rowmax, r__3 = (r__1 = ap[kpc + jmax - 1], dabs(
00263 r__1));
00264 rowmax = dmax(r__2,r__3);
00265 }
00266
00267 if (absakk >= alpha * colmax * (colmax / rowmax)) {
00268
00269
00270
00271 kp = k;
00272 } else if ((r__1 = ap[kpc + imax - 1], dabs(r__1)) >= alpha *
00273 rowmax) {
00274
00275
00276
00277
00278 kp = imax;
00279 } else {
00280
00281
00282
00283
00284 kp = imax;
00285 kstep = 2;
00286 }
00287 }
00288
00289 kk = k - kstep + 1;
00290 if (kstep == 2) {
00291 knc = knc - k + 1;
00292 }
00293 if (kp != kk) {
00294
00295
00296
00297
00298 i__1 = kp - 1;
00299 sswap_(&i__1, &ap[knc], &c__1, &ap[kpc], &c__1);
00300 kx = kpc + kp - 1;
00301 i__1 = kk - 1;
00302 for (j = kp + 1; j <= i__1; ++j) {
00303 kx = kx + j - 1;
00304 t = ap[knc + j - 1];
00305 ap[knc + j - 1] = ap[kx];
00306 ap[kx] = t;
00307
00308 }
00309 t = ap[knc + kk - 1];
00310 ap[knc + kk - 1] = ap[kpc + kp - 1];
00311 ap[kpc + kp - 1] = t;
00312 if (kstep == 2) {
00313 t = ap[kc + k - 2];
00314 ap[kc + k - 2] = ap[kc + kp - 1];
00315 ap[kc + kp - 1] = t;
00316 }
00317 }
00318
00319
00320
00321 if (kstep == 1) {
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333 r1 = 1.f / ap[kc + k - 1];
00334 i__1 = k - 1;
00335 r__1 = -r1;
00336 sspr_(uplo, &i__1, &r__1, &ap[kc], &c__1, &ap[1]);
00337
00338
00339
00340 i__1 = k - 1;
00341 sscal_(&i__1, &r1, &ap[kc], &c__1);
00342 } else {
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356 if (k > 2) {
00357
00358 d12 = ap[k - 1 + (k - 1) * k / 2];
00359 d22 = ap[k - 1 + (k - 2) * (k - 1) / 2] / d12;
00360 d11 = ap[k + (k - 1) * k / 2] / d12;
00361 t = 1.f / (d11 * d22 - 1.f);
00362 d12 = t / d12;
00363
00364 for (j = k - 2; j >= 1; --j) {
00365 wkm1 = d12 * (d11 * ap[j + (k - 2) * (k - 1) / 2] -
00366 ap[j + (k - 1) * k / 2]);
00367 wk = d12 * (d22 * ap[j + (k - 1) * k / 2] - ap[j + (k
00368 - 2) * (k - 1) / 2]);
00369 for (i__ = j; i__ >= 1; --i__) {
00370 ap[i__ + (j - 1) * j / 2] = ap[i__ + (j - 1) * j /
00371 2] - ap[i__ + (k - 1) * k / 2] * wk - ap[
00372 i__ + (k - 2) * (k - 1) / 2] * wkm1;
00373
00374 }
00375 ap[j + (k - 1) * k / 2] = wk;
00376 ap[j + (k - 2) * (k - 1) / 2] = wkm1;
00377
00378 }
00379
00380 }
00381
00382 }
00383 }
00384
00385
00386
00387 if (kstep == 1) {
00388 ipiv[k] = kp;
00389 } else {
00390 ipiv[k] = -kp;
00391 ipiv[k - 1] = -kp;
00392 }
00393
00394
00395
00396 k -= kstep;
00397 kc = knc - k;
00398 goto L10;
00399
00400 } else {
00401
00402
00403
00404
00405
00406
00407 k = 1;
00408 kc = 1;
00409 npp = *n * (*n + 1) / 2;
00410 L60:
00411 knc = kc;
00412
00413
00414
00415 if (k > *n) {
00416 goto L110;
00417 }
00418 kstep = 1;
00419
00420
00421
00422
00423 absakk = (r__1 = ap[kc], dabs(r__1));
00424
00425
00426
00427
00428 if (k < *n) {
00429 i__1 = *n - k;
00430 imax = k + isamax_(&i__1, &ap[kc + 1], &c__1);
00431 colmax = (r__1 = ap[kc + imax - k], dabs(r__1));
00432 } else {
00433 colmax = 0.f;
00434 }
00435
00436 if (dmax(absakk,colmax) == 0.f) {
00437
00438
00439
00440 if (*info == 0) {
00441 *info = k;
00442 }
00443 kp = k;
00444 } else {
00445 if (absakk >= alpha * colmax) {
00446
00447
00448
00449 kp = k;
00450 } else {
00451
00452
00453
00454
00455 rowmax = 0.f;
00456 kx = kc + imax - k;
00457 i__1 = imax - 1;
00458 for (j = k; j <= i__1; ++j) {
00459 if ((r__1 = ap[kx], dabs(r__1)) > rowmax) {
00460 rowmax = (r__1 = ap[kx], dabs(r__1));
00461 jmax = j;
00462 }
00463 kx = kx + *n - j;
00464
00465 }
00466 kpc = npp - (*n - imax + 1) * (*n - imax + 2) / 2 + 1;
00467 if (imax < *n) {
00468 i__1 = *n - imax;
00469 jmax = imax + isamax_(&i__1, &ap[kpc + 1], &c__1);
00470
00471 r__2 = rowmax, r__3 = (r__1 = ap[kpc + jmax - imax], dabs(
00472 r__1));
00473 rowmax = dmax(r__2,r__3);
00474 }
00475
00476 if (absakk >= alpha * colmax * (colmax / rowmax)) {
00477
00478
00479
00480 kp = k;
00481 } else if ((r__1 = ap[kpc], dabs(r__1)) >= alpha * rowmax) {
00482
00483
00484
00485
00486 kp = imax;
00487 } else {
00488
00489
00490
00491
00492 kp = imax;
00493 kstep = 2;
00494 }
00495 }
00496
00497 kk = k + kstep - 1;
00498 if (kstep == 2) {
00499 knc = knc + *n - k + 1;
00500 }
00501 if (kp != kk) {
00502
00503
00504
00505
00506 if (kp < *n) {
00507 i__1 = *n - kp;
00508 sswap_(&i__1, &ap[knc + kp - kk + 1], &c__1, &ap[kpc + 1],
00509 &c__1);
00510 }
00511 kx = knc + kp - kk;
00512 i__1 = kp - 1;
00513 for (j = kk + 1; j <= i__1; ++j) {
00514 kx = kx + *n - j + 1;
00515 t = ap[knc + j - kk];
00516 ap[knc + j - kk] = ap[kx];
00517 ap[kx] = t;
00518
00519 }
00520 t = ap[knc];
00521 ap[knc] = ap[kpc];
00522 ap[kpc] = t;
00523 if (kstep == 2) {
00524 t = ap[kc + 1];
00525 ap[kc + 1] = ap[kc + kp - k];
00526 ap[kc + kp - k] = t;
00527 }
00528 }
00529
00530
00531
00532 if (kstep == 1) {
00533
00534
00535
00536
00537
00538
00539
00540 if (k < *n) {
00541
00542
00543
00544
00545
00546 r1 = 1.f / ap[kc];
00547 i__1 = *n - k;
00548 r__1 = -r1;
00549 sspr_(uplo, &i__1, &r__1, &ap[kc + 1], &c__1, &ap[kc + *n
00550 - k + 1]);
00551
00552
00553
00554 i__1 = *n - k;
00555 sscal_(&i__1, &r1, &ap[kc + 1], &c__1);
00556 }
00557 } else {
00558
00559
00560
00561
00562
00563
00564
00565
00566 if (k < *n - 1) {
00567
00568
00569
00570
00571
00572
00573 d21 = ap[k + 1 + (k - 1) * ((*n << 1) - k) / 2];
00574 d11 = ap[k + 1 + k * ((*n << 1) - k - 1) / 2] / d21;
00575 d22 = ap[k + (k - 1) * ((*n << 1) - k) / 2] / d21;
00576 t = 1.f / (d11 * d22 - 1.f);
00577 d21 = t / d21;
00578
00579 i__1 = *n;
00580 for (j = k + 2; j <= i__1; ++j) {
00581 wk = d21 * (d11 * ap[j + (k - 1) * ((*n << 1) - k) /
00582 2] - ap[j + k * ((*n << 1) - k - 1) / 2]);
00583 wkp1 = d21 * (d22 * ap[j + k * ((*n << 1) - k - 1) /
00584 2] - ap[j + (k - 1) * ((*n << 1) - k) / 2]);
00585
00586 i__2 = *n;
00587 for (i__ = j; i__ <= i__2; ++i__) {
00588 ap[i__ + (j - 1) * ((*n << 1) - j) / 2] = ap[i__
00589 + (j - 1) * ((*n << 1) - j) / 2] - ap[i__
00590 + (k - 1) * ((*n << 1) - k) / 2] * wk -
00591 ap[i__ + k * ((*n << 1) - k - 1) / 2] *
00592 wkp1;
00593
00594 }
00595
00596 ap[j + (k - 1) * ((*n << 1) - k) / 2] = wk;
00597 ap[j + k * ((*n << 1) - k - 1) / 2] = wkp1;
00598
00599
00600 }
00601 }
00602 }
00603 }
00604
00605
00606
00607 if (kstep == 1) {
00608 ipiv[k] = kp;
00609 } else {
00610 ipiv[k] = -kp;
00611 ipiv[k + 1] = -kp;
00612 }
00613
00614
00615
00616 k += kstep;
00617 kc = knc + *n - k + 2;
00618 goto L60;
00619
00620 }
00621
00622 L110:
00623 return 0;
00624
00625
00626
00627 }