📄 linpackd.c
字号:
/* 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 + -