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

📄 linpackd.c

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 C
📖 第 1 页 / 共 3 页
字号:
/* Modified by c janssen to be a standalone C program. */#include <math/linpackd/linpackd.h>/* linpackd.f -- translated by f2c (version 19940305).   You must link the resulting object file with the libraries:	-lf2c -lm   (in that order)*/#include <math.h>typedef double doublereal;typedef double real;typedef int integer;typedef int logical;#define TRUE_ 1#define FALSE_ 0#define min(a,b) (((a)<(b))?(a):(b))#define max(a,b) (((a)>(b))?(a):(b))static doubled_sign(a,b)    doublereal *a, *b;{  double x;  x = (*a >= 0 ? *a : - *a);  return( *b >= 0 ? x : -x);}/* Table of constant values */static integer c__1 = 1;static doublereal c_b90 = -1.;static doublereal c_b149 = 1.;/* Subroutine */ int daxpy_(n, da, dx, incx, dy, incy)integer *n;doublereal *da, *dx;integer *incx;doublereal *dy;integer *incy;{    /* System generated locals */    integer i__1;    /* Local variables */    static integer i, m, ix, iy, mp1;/*     CONSTANT TIMES A VECTOR PLUS A VECTOR. *//*     USES UNROLLED LOOPS FOR INCREMENTS EQUAL TO ONE. *//*     JACK DONGARRA, LINPACK, 3/11/78. */    /* Parameter adjustments */    --dy;    --dx;    /* Function Body */    if (*n <= 0) {	return 0;    }    if (*da == 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) {	dy[iy] += *da * dx[ix];	ix += *incx;	iy += *incy;/* L10: */    }    return 0;/*        CODE FOR BOTH INCREMENTS EQUAL TO 1 *//*        CLEAN-UP LOOP */L20:    m = *n % 4;    if (m == 0) {	goto L40;    }    i__1 = m;    for (i = 1; i <= i__1; ++i) {	dy[i] += *da * dx[i];/* L30: */    }    if (*n < 4) {	return 0;    }L40:    mp1 = m + 1;    i__1 = *n;    for (i = mp1; i <= i__1; i += 4) {	dy[i] += *da * dx[i];	dy[i + 1] += *da * dx[i + 1];	dy[i + 2] += *da * dx[i + 2];	dy[i + 3] += *da * dx[i + 3];/* L50: */    }    return 0;} /* daxpy_ *//* Subroutine */ int dcopy_(n, dx, incx, dy, incy)integer *n;doublereal *dx;integer *incx;doublereal *dy;integer *incy;{    /* System generated locals */    integer i__1;    /* Local variables */    static integer i, m, ix, iy, mp1;/*     COPIES A VECTOR, X, TO A VECTOR, Y. *//*     USES UNROLLED LOOPS FOR INCREMENTS EQUAL TO ONE. *//*     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) {	dy[iy] = dx[ix];	ix += *incx;	iy += *incy;/* L10: */    }    return 0;/*        CODE FOR BOTH INCREMENTS EQUAL TO 1 *//*        CLEAN-UP LOOP */L20:    m = *n % 7;    if (m == 0) {	goto L40;    }    i__1 = m;    for (i = 1; i <= i__1; ++i) {	dy[i] = dx[i];/* L30: */    }    if (*n < 7) {	return 0;    }L40:    mp1 = m + 1;    i__1 = *n;    for (i = mp1; i <= i__1; i += 7) {	dy[i] = dx[i];	dy[i + 1] = dx[i + 1];	dy[i + 2] = dx[i + 2];	dy[i + 3] = dx[i + 3];	dy[i + 4] = dx[i + 4];	dy[i + 5] = dx[i + 5];	dy[i + 6] = dx[i + 6];/* L50: */    }    return 0;} /* dcopy_ */doublereal ddot_(n, dx, incx, dy, incy)integer *n;doublereal *dx;integer *incx;doublereal *dy;integer *incy;{    /* System generated locals */    integer i__1;    doublereal ret_val;    /* Local variables */    static integer i, m;    static doublereal dtemp;    static integer ix, iy, mp1;/*     FORMS THE DOT PRODUCT OF TWO VECTORS. *//*     USES UNROLLED LOOPS FOR INCREMENTS EQUAL TO ONE. *//*     JACK DONGARRA, LINPACK, 3/11/78. */    /* Parameter adjustments */    --dy;    --dx;    /* Function Body */    ret_val = 0.;    dtemp = 0.;    if (*n <= 0) {	return ret_val;    }    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 += dx[ix] * dy[iy];	ix += *incx;	iy += *incy;/* L10: */    }    ret_val = dtemp;    return ret_val;/*        CODE FOR BOTH INCREMENTS EQUAL TO 1 *//*        CLEAN-UP LOOP */L20:    m = *n % 5;    if (m == 0) {	goto L40;    }    i__1 = m;    for (i = 1; i <= i__1; ++i) {	dtemp += dx[i] * dy[i];/* L30: */    }    if (*n < 5) {	goto L60;    }L40:    mp1 = m + 1;    i__1 = *n;    for (i = mp1; i <= i__1; i += 5) {	dtemp = dtemp + dx[i] * dy[i] + dx[i + 1] * dy[i + 1] + dx[i + 2] * 		dy[i + 2] + dx[i + 3] * dy[i + 3] + dx[i + 4] * dy[i + 4];/* L50: */    }L60:    ret_val = dtemp;    return ret_val;} /* ddot_ */doublereal dnrm2_(n, dx, incx)integer *n;doublereal *dx;integer *incx;{    /* Initialized data */    static doublereal zero = 0.;    static doublereal one = 1.;    static doublereal cutlo = 8.232e-11;    static doublereal cuthi = 1.304e19;    /* Format strings */    static char fmt_30[] = "";    static char fmt_50[] = "";    static char fmt_70[] = "";    static char fmt_110[] = "";    /* System generated locals */    integer i__1, i__2;    doublereal ret_val, d__1;    /* Local variables */    static doublereal xmax;    static integer next, i, j, nn;    static doublereal hitest, sum;    /* Assigned format variables */    char *next_fmt;    /* Parameter adjustments */    --dx;    /* Function Body *//*     EUCLIDEAN NORM OF THE N-VECTOR STORED IN DX() WITH STORAGE *//*     INCREMENT INCX . *//*     IF    N .LE. 0 RETURN WITH RESULT = 0. *//*     IF N .GE. 1 THEN INCX MUST BE .GE. 1 *//*           C.L.LAWSON, 1978 JAN 08 *//*     FOUR PHASE METHOD     USING TWO BUILT-IN CONSTANTS THAT ARE *//*     HOPEFULLY APPLICABLE TO ALL MACHINES. *//*         CUTLO = MAXIMUM OF  DSQRT(U/EPS)  OVER ALL KNOWN MACHINES. *//*         CUTHI = MINIMUM OF  DSQRT(V)      OVER ALL KNOWN MACHINES. *//*     WHERE *//*         EPS = SMALLEST NO. SUCH THAT EPS + 1. .GT. 1. *//*         U   = SMALLEST POSITIVE NO.   (UNDERFLOW LIMIT) *//*         V   = LARGEST  NO.            (OVERFLOW  LIMIT) *//*     BRIEF OUTLINE OF ALGORITHM.. *//*     PHASE 1    SCANS ZERO COMPONENTS. *//*     MOVE TO PHASE 2 WHEN A COMPONENT IS NONZERO AND .LE. CUTLO *//*     MOVE TO PHASE 3 WHEN A COMPONENT IS .GT. CUTLO *//*     MOVE TO PHASE 4 WHEN A COMPONENT IS .GE. CUTHI/M *//*     WHERE M = N FOR X() REAL AND M = 2*N FOR COMPLEX. *//*     VALUES FOR CUTLO AND CUTHI.. *//*     FROM THE ENVIRONMENTAL PARAMETERS LISTED IN THE IMSL CONVERTER *//*     DOCUMENT THE LIMITING VALUES ARE AS FOLLOWS.. *//*     CUTLO, S.P.   U/EPS = 2**(-102) FOR  HONEYWELL.  CLOSE SECONDS ARE *//*                   UNIVAC AND DEC AT 2**(-103) *//*                   THUS CUTLO = 2**(-51) = 4.44089E-16 *//*     CUTHI, S.P.   V = 2**127 FOR UNIVAC, HONEYWELL, AND DEC. *//*                   THUS CUTHI = 2**(63.5) = 1.30438E19 *//*     CUTLO, D.P.   U/EPS = 2**(-67) FOR HONEYWELL AND DEC. *//*                   THUS CUTLO = 2**(-33.5) = 8.23181D-11 *//*     CUTHI, D.P.   SAME AS S.P.  CUTHI = 1.30438D19 *//*     DATA CUTLO, CUTHI / 8.232D-11,  1.304D19 / *//*     DATA CUTLO, CUTHI / 4.441E-16,  1.304E19 / */    if (*n > 0) {	goto L10;    }    ret_val = zero;    goto L300;L10:    next = 0;    next_fmt = fmt_30;    sum = zero;    nn = *n * *incx;/*                                                 BEGIN MAIN LOOP */    i = 1;L20:    switch ((int)next) {	case 0: goto L30;	case 1: goto L50;	case 2: goto L70;	case 3: goto L110;    }L30:    if ((d__1 = dx[i], fabs(d__1)) > cutlo) {	goto L85;    }    next = 1;    next_fmt = fmt_50;    xmax = zero;/*                        PHASE 1.  SUM IS ZERO */L50:    if (dx[i] == zero) {	goto L200;    }    if ((d__1 = dx[i], fabs(d__1)) > cutlo) {	goto L85;    }/*                                PREPARE FOR PHASE 2. */    next = 2;    next_fmt = fmt_70;    goto L105;/*                                PREPARE FOR PHASE 4. */L100:    i = j;    next = 3;    next_fmt = fmt_110;    sum = sum / dx[i] / dx[i];L105:    xmax = (d__1 = dx[i], fabs(d__1));    goto L115;/*                   PHASE 2.  SUM IS SMALL. *//*                             SCALE TO AVOID DESTRUCTIVE UNDERFLOW. */L70:    if ((d__1 = dx[i], fabs(d__1)) > cutlo) {	goto L75;    }/*                     COMMON CODE FOR PHASES 2 AND 4. *//*                     IN PHASE 4 SUM IS LARGE.  SCALE TO AVOID OVERFLOW. */L110:    if ((d__1 = dx[i], fabs(d__1)) <= xmax) {	goto L115;    }/* Computing 2nd power */    d__1 = xmax / dx[i];    sum = one + sum * (d__1 * d__1);    xmax = (d__1 = dx[i], fabs(d__1));    goto L200;L115:/* Computing 2nd power */    d__1 = dx[i] / xmax;    sum += d__1 * d__1;    goto L200;/*                  PREPARE FOR PHASE 3. */L75:    sum = sum * xmax * xmax;/*     FOR REAL OR D.P. SET HITEST = CUTHI/N *//*     FOR COMPLEX      SET HITEST = CUTHI/(2*N) */L85:    hitest = cuthi / (real) (*n);/*                   PHASE 3.  SUM IS MID-RANGE.  NO SCALING. */    i__1 = nn;    i__2 = *incx;    for (j = i; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) {	if ((d__1 = dx[j], fabs(d__1)) >= hitest) {	    goto L100;	}/* L95: *//* Computing 2nd power */	d__1 = dx[j];	sum += d__1 * d__1;    }    ret_val = sqrt(sum);    goto L300;L200:    i += *incx;    if (i <= nn) {	goto L20;    }/*              END OF MAIN LOOP. *//*              COMPUTE SQUARE ROOT AND ADJUST FOR SCALING. */    ret_val = xmax * sqrt(sum);L300:    return ret_val;} /* dnrm2_ *//* Subroutine */ int dscal_(n, da, dx, incx)integer *n;doublereal *da, *dx;integer *incx;{    /* System generated locals */    integer i__1, i__2;    /* Local variables */    static integer i, m, nincx, mp1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -