📄 linpackd.c
字号:
/* IF REQUIRED, GENERATE U. */ if (! wantu) { goto L300; } if (ncu < nctp1) { goto L200; } i__1 = ncu; for (j = nctp1; j <= i__1; ++j) { i__2 = *n; for (i = 1; i <= i__2; ++i) { u[i + j * u_dim1] = 0.;/* L180: */ } u[j + j * u_dim1] = 1.;/* L190: */ }L200: if (nct < 1) { goto L290; } i__1 = nct; for (ll = 1; ll <= i__1; ++ll) { l = nct - ll + 1; if (s[l] == 0.) { goto L250; } lp1 = l + 1; if (ncu < lp1) { goto L220; } i__2 = ncu; for (j = lp1; j <= i__2; ++j) { i__3 = *n - l + 1; t = -ddot_(&i__3, &u[l + l * u_dim1], &c__1, &u[l + j * u_dim1], & c__1) / u[l + l * u_dim1]; i__3 = *n - l + 1; daxpy_(&i__3, &t, &u[l + l * u_dim1], &c__1, &u[l + j * u_dim1], & c__1);/* L210: */ }L220: i__2 = *n - l + 1; dscal_(&i__2, &c_b90, &u[l + l * u_dim1], &c__1); u[l + l * u_dim1] += 1.; lm1 = l - 1; if (lm1 < 1) { goto L240; } i__2 = lm1; for (i = 1; i <= i__2; ++i) { u[i + l * u_dim1] = 0.;/* L230: */ }L240: goto L270;L250: i__2 = *n; for (i = 1; i <= i__2; ++i) { u[i + l * u_dim1] = 0.;/* L260: */ } u[l + l * u_dim1] = 1.;L270:/* L280: */ ; }L290:L300:/* IF IT IS REQUIRED, GENERATE V. */ if (! wantv) { goto L350; } i__1 = *p; for (ll = 1; ll <= i__1; ++ll) { l = *p - ll + 1; lp1 = l + 1; if (l > nrt) { goto L320; } if (e[l] == 0.) { goto L320; } i__2 = *p; for (j = lp1; j <= i__2; ++j) { i__3 = *p - l; t = -ddot_(&i__3, &v[lp1 + l * v_dim1], &c__1, &v[lp1 + j * v_dim1], &c__1) / v[lp1 + l * v_dim1]; i__3 = *p - l; daxpy_(&i__3, &t, &v[lp1 + l * v_dim1], &c__1, &v[lp1 + j * v_dim1], &c__1);/* L310: */ }L320: i__2 = *p; for (i = 1; i <= i__2; ++i) { v[i + l * v_dim1] = 0.;/* L330: */ } v[l + l * v_dim1] = 1.;/* L340: */ }L350:/* MAIN ITERATION LOOP FOR THE SINGULAR VALUES. */ mm = m; iter = 0;L360:/* QUIT IF ALL THE SINGULAR VALUES HAVE BEEN FOUND. *//* ...EXIT */ if (m == 0) { goto L620; }/* IF TOO MANY ITERATIONS HAVE BEEN PERFORMED, SET *//* FLAG AND RETURN. */ if (iter < maxit) { goto L370; } *info = m;/* ......EXIT */ goto L620;L370:/* THIS SECTION OF THE PROGRAM INSPECTS FOR *//* NEGLIGIBLE ELEMENTS IN THE S AND E ARRAYS. ON *//* COMPLETION THE VARIABLES KASE AND L ARE SET AS FOLLOWS. *//* KASE = 1 IF S(M) AND E(L-1) ARE NEGLIGIBLE AND L.LT.M *//* KASE = 2 IF S(L) IS NEGLIGIBLE AND L.LT.M *//* KASE = 3 IF E(L-1) IS NEGLIGIBLE, L.LT.M, AND *//* S(L), ..., S(M) ARE NOT NEGLIGIBLE (QR STEP). *//* KASE = 4 IF E(M-1) IS NEGLIGIBLE (CONVERGENCE). */ i__1 = m; for (ll = 1; ll <= i__1; ++ll) { l = m - ll;/* ...EXIT */ if (l == 0) { goto L400; } test = (d__1 = s[l], fabs(d__1)) + (d__2 = s[l + 1], fabs(d__2)); ztest = test + (d__1 = e[l], fabs(d__1)); if (ztest != test) { goto L380; } e[l] = 0.;/* ......EXIT */ goto L400;L380:/* L390: */ ; }L400: if (l != m - 1) { goto L410; } kase = 4; goto L480;L410: lp1 = l + 1; mp1 = m + 1; i__1 = mp1; for (lls = lp1; lls <= i__1; ++lls) { ls = m - lls + lp1;/* ...EXIT */ if (ls == l) { goto L440; } test = 0.; if (ls != m) { test += (d__1 = e[ls], fabs(d__1)); } if (ls != l + 1) { test += (d__1 = e[ls - 1], fabs(d__1)); } ztest = test + (d__1 = s[ls], fabs(d__1)); if (ztest != test) { goto L420; } s[ls] = 0.;/* ......EXIT */ goto L440;L420:/* L430: */ ; }L440: if (ls != l) { goto L450; } kase = 3; goto L470;L450: if (ls != m) { goto L460; } kase = 1; goto L470;L460: kase = 2; l = ls;L470:L480: ++l;/* PERFORM THE TASK INDICATED BY KASE. */ switch ((int)kase) { case 1: goto L490; case 2: goto L520; case 3: goto L540; case 4: goto L570; }/* DEFLATE NEGLIGIBLE S(M). */L490: mm1 = m - 1; f = e[m - 1]; e[m - 1] = 0.; i__1 = mm1; for (kk = l; kk <= i__1; ++kk) { k = mm1 - kk + l; t1 = s[k]; drotg_(&t1, &f, &cs, &sn); s[k] = t1; if (k == l) { goto L500; } f = -sn * e[k - 1]; e[k - 1] = cs * e[k - 1];L500: if (wantv) { drot_(p, &v[k * v_dim1 + 1], &c__1, &v[m * v_dim1 + 1], &c__1, & cs, &sn); }/* L510: */ } goto L610;/* SPLIT AT NEGLIGIBLE S(L). */L520: f = e[l - 1]; e[l - 1] = 0.; i__1 = m; for (k = l; k <= i__1; ++k) { t1 = s[k]; drotg_(&t1, &f, &cs, &sn); s[k] = t1; f = -sn * e[k]; e[k] = cs * e[k]; if (wantu) { drot_(n, &u[k * u_dim1 + 1], &c__1, &u[(l - 1) * u_dim1 + 1], & c__1, &cs, &sn); }/* L530: */ } goto L610;/* PERFORM ONE QR STEP. */L540:/* CALCULATE THE SHIFT. *//* Computing MAX */ d__6 = (d__1 = s[m], fabs(d__1)), d__7 = (d__2 = s[m - 1], fabs(d__2)), d__6 = max(d__6,d__7), d__7 = (d__3 = e[m - 1], fabs(d__3)), d__6 = max(d__6,d__7), d__7 = (d__4 = s[l], fabs(d__4)), d__6 = max(d__6, d__7), d__7 = (d__5 = e[l], fabs(d__5)); scale = max(d__6,d__7); sm = s[m] / scale; smm1 = s[m - 1] / scale; emm1 = e[m - 1] / scale; sl = s[l] / scale; el = e[l] / scale;/* Computing 2nd power */ d__1 = emm1; b = ((smm1 + sm) * (smm1 - sm) + d__1 * d__1) / 2.;/* Computing 2nd power */ d__1 = sm * emm1; c = d__1 * d__1; shift = 0.; if (b == 0. && c == 0.) { goto L550; }/* Computing 2nd power */ d__1 = b; shift = sqrt(d__1 * d__1 + c); if (b < 0.) { shift = -shift; } shift = c / (b + shift);L550: f = (sl + sm) * (sl - sm) - shift; g = sl * el;/* CHASE ZEROS. */ mm1 = m - 1; i__1 = mm1; for (k = l; k <= i__1; ++k) { drotg_(&f, &g, &cs, &sn); if (k != l) { e[k - 1] = f; } f = cs * s[k] + sn * e[k]; e[k] = cs * e[k] - sn * s[k]; g = sn * s[k + 1]; s[k + 1] = cs * s[k + 1]; if (wantv) { drot_(p, &v[k * v_dim1 + 1], &c__1, &v[(k + 1) * v_dim1 + 1], & c__1, &cs, &sn); } drotg_(&f, &g, &cs, &sn); s[k] = f; f = cs * e[k] + sn * s[k + 1]; s[k + 1] = -sn * e[k] + cs * s[k + 1]; g = sn * e[k + 1]; e[k + 1] = cs * e[k + 1]; if (wantu && k < *n) { drot_(n, &u[k * u_dim1 + 1], &c__1, &u[(k + 1) * u_dim1 + 1], & c__1, &cs, &sn); }/* L560: */ } e[m - 1] = f; ++iter; goto L610;/* CONVERGENCE. */L570:/* MAKE THE SINGULAR VALUE POSITIVE. */ if (s[l] >= 0.) { goto L580; } s[l] = -s[l]; if (wantv) { dscal_(p, &c_b90, &v[l * v_dim1 + 1], &c__1); }L580:/* ORDER THE SINGULAR VALUE. */L590: if (l == mm) { goto L600; }/* ...EXIT */ if (s[l] >= s[l + 1]) { goto L600; } t = s[l]; s[l] = s[l + 1]; s[l + 1] = t; if (wantv && l < *p) { dswap_(p, &v[l * v_dim1 + 1], &c__1, &v[(l + 1) * v_dim1 + 1], &c__1); } if (wantu && l < *n) { dswap_(n, &u[l * u_dim1 + 1], &c__1, &u[(l + 1) * u_dim1 + 1], &c__1); } ++l; goto L590;L600: iter = 0; --m;L610: goto L360;L620: return 0;} /* dsvdc_ *//* Subroutine */ int drotg_(da, db, c, s)doublereal *da, *db, *c, *s;{ /* System generated locals */ doublereal d__1, d__2; /* Local variables */ static doublereal r, scale, z, roe;/* CONSTRUCT GIVENS PLANE ROTATION. *//* JACK DONGARRA, LINPACK, 3/11/78. */ roe = *db; if (fabs(*da) > fabs(*db)) { roe = *da; } scale = fabs(*da) + fabs(*db); if (scale != 0.) { goto L10; } *c = 1.; *s = 0.; r = 0.; goto L20;L10:/* Computing 2nd power */ d__1 = *da / scale;/* Computing 2nd power */ d__2 = *db / scale; r = scale * sqrt(d__1 * d__1 + d__2 * d__2); r = d_sign(&c_b149, &roe) * r; *c = *da / r; *s = *db / r;L20: z = 1.; if (fabs(*da) > fabs(*db)) { z = *s; } if (fabs(*db) >= fabs(*da) && *c != 0.) { z = 1. / *c; } *da = r; *db = z; return 0;} /* drotg_ *//* Subroutine */ int drot_(n, dx, incx, dy, incy, c, s)integer *n;doublereal *dx;integer *incx;doublereal *dy;integer *incy;doublereal *c, *s;{ /* System generated locals */ integer i__1; /* Local variables */ static integer i; static doublereal dtemp; static integer ix, iy;/* APPLIES A PLANE ROTATION. *//* JACK DONGARRA, LINPACK, 3/11/78. */ /* Parameter adjustments */ --dy; --dx; /* Function Body */ if (*n <= 0) { return 0; } if (*incx == 1 && *incy == 1) { goto L20; }/* CODE FOR UNEQUAL INCREMENTS OR EQUAL INCREMENTS NOT EQUAL *//* TO 1 */ ix = 1; iy = 1; if (*incx < 0) { ix = (-(*n) + 1) * *incx + 1; } if (*incy < 0) { iy = (-(*n) + 1) * *incy + 1; } i__1 = *n; for (i = 1; i <= i__1; ++i) { dtemp = *c * dx[ix] + *s * dy[iy]; dy[iy] = *c * dy[iy] - *s * dx[ix]; dx[ix] = dtemp; ix += *incx; iy += *incy;/* L10: */ } return 0;/* CODE FOR BOTH INCREMENTS EQUAL TO 1 */L20: i__1 = *n; for (i = 1; i <= i__1; ++i) { dtemp = *c * dx[i] + *s * dy[i]; dy[i] = *c * dy[i] - *s * dx[i]; dx[i] = dtemp;/* L30: */ } return 0;} /* drot_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -