⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linpackd.c

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 C
📖 第 1 页 / 共 3 页
字号:
/*     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 + -