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

📄 dlasq2.c

📁 最著名最快的分子模拟软件
💻 C
字号:
#include <math.h>#include "gmx_lapack.h"#include "lapack_limits.h"#include <types/simple.h>void F77_FUNC(dlasq2,DLASQ2)(int *n,                         double *z__,                         int *info){    int i__1, i__2, i__3;    double d__1, d__2;    double d__, e;    int k;    double s, t;    int i0, i4, n0, pp;    double dee, eps, tol;    int ipn4;    double tol2;    int ieee;    int nbig;    double dmin__, emin, emax;    int kmin, ndiv, iter;    double qmin, temp, qmax, zmax;    int splt, nfail;    double desig, trace, sigma;    int iinfo;    double deemin;    int iwhila, iwhilb;    double oldemn, safmin, minval;    double posinf,neginf,negzro,newzro;    double zero = 0.0;    double one = 1.0;    --z__;    *info = 0;    eps = GMX_DOUBLE_EPS;    minval = GMX_DOUBLE_MIN;    safmin = minval*(1.0+eps);    tol = eps * 100.;    d__1 = tol;    tol2 = d__1 * d__1;    if (*n < 0) {	*info = -1;	return;    } else if (*n == 0) {	return;    } else if (*n == 1) {	if (z__[1] < 0.) {	    *info = -201;	}	return;    } else if (*n == 2) {	if (z__[2] < 0. || z__[3] < 0.) {	    *info = -2;	    return;	} else if (z__[3] > z__[1]) {	    d__ = z__[3];	    z__[3] = z__[1];	    z__[1] = d__;	}	z__[5] = z__[1] + z__[2] + z__[3];	if (z__[2] > z__[3] * tol2) {	    t = (z__[1] - z__[3] + z__[2]) * .5;	    s = z__[3] * (z__[2] / t);	    if (s <= t) {		s = z__[3] * (z__[2] / (t * (sqrt(s / t + 1.) + 1.)));	    } else {		s = z__[3] * (z__[2] / (t + sqrt(t) * sqrt(t + s)));	    }	    t = z__[1] + (s + z__[2]);	    z__[3] *= z__[1] / t;	    z__[1] = t;	}	z__[2] = z__[3];	z__[6] = z__[2] + z__[1];	return;    }    z__[*n * 2] = 0.;    emin = z__[2];    qmax = 0.;    zmax = 0.;    d__ = 0.;    e = 0.;    i__1 = 2*(*n - 1);    for (k = 1; k <= i__1; k += 2) {	if (z__[k] < 0.) {	    *info = -(k + 200);	    return;	} else if (z__[k + 1] < 0.) {	    *info = -(k + 201);	    return;	}	d__ += z__[k];	e += z__[k + 1];	d__1 = qmax, d__2 = z__[k];	qmax = (d__1>d__2) ? d__1 : d__2;	d__1 = emin, d__2 = z__[k + 1];	emin = (d__1<d__2) ? d__1 : d__2;	d__1 = (qmax>zmax) ? qmax : zmax;	d__2 = z__[k + 1];	zmax = (d__1>d__2) ? d__1 : d__2;    }    if (z__[(*n << 1) - 1] < 0.) {	*info = -((*n << 1) + 199);	return;    }    d__ += z__[(*n << 1) - 1];    d__1 = qmax, d__2 = z__[(*n << 1) - 1];    qmax = (d__1>d__2) ? d__1 : d__2;    zmax = (qmax>zmax) ? qmax : zmax;    if (fabs(e)<GMX_DOUBLE_MIN) {	i__1 = *n;	for (k = 2; k <= i__1; ++k) {	    z__[k] = z__[(k << 1) - 1];	}	F77_FUNC(dlasrt,DLASRT)("D", n, &z__[1], &iinfo);	z__[(*n << 1) - 1] = d__;	return;    }    trace = d__ + e;    if (fabs(trace)<GMX_DOUBLE_MIN) {	z__[(*n << 1) - 1] = 0.;	return;    }    ieee = 1;    posinf = one/zero;    if(posinf<=1.0)      ieee = 0;    neginf = -one/zero;    if(neginf>=0.0)      ieee = 0;    negzro = one/(neginf+one);    if(fabs(negzro)>GMX_DOUBLE_MIN)      ieee = 0;    neginf = one/negzro;    if(neginf>=0)      ieee = 0;    newzro = negzro + zero;    if(fabs(newzro-zero)>GMX_DOUBLE_MIN)      ieee = 0;    posinf = one /newzro;    if(posinf<=one)      ieee = 0;    neginf = neginf*posinf;    if(neginf>=zero)      ieee = 0;    posinf = posinf*posinf;    if(posinf<=1.0)      ieee = 0;    for (k = *n << 1; k >= 2; k += -2) {	z__[k * 2] = 0.;	z__[(k << 1) - 1] = z__[k];	z__[(k << 1) - 2] = 0.;	z__[(k << 1) - 3] = z__[k - 1];    }    i0 = 1;    n0 = *n;    if (z__[(i0 << 2) - 3] * 1.5 < z__[(n0 << 2) - 3]) {	ipn4 = 4*(i0 + n0);	i__1 = 2*(i0 + n0 - 1);	for (i4 = i0 << 2; i4 <= i__1; i4 += 4) {	    temp = z__[i4 - 3];	    z__[i4 - 3] = z__[ipn4 - i4 - 3];	    z__[ipn4 - i4 - 3] = temp;	    temp = z__[i4 - 1];	    z__[i4 - 1] = z__[ipn4 - i4 - 5];	    z__[ipn4 - i4 - 5] = temp;	}    }    pp = 0;    for (k = 1; k <= 2; ++k) {	d__ = z__[(n0 << 2) + pp - 3];	i__1 = (i0 << 2) + pp;	for (i4 = 4*(n0 - 1) + pp; i4 >= i__1; i4 += -4) {	    if (z__[i4 - 1] <= tol2 * d__) {		z__[i4 - 1] = -0.;		d__ = z__[i4 - 3];	    } else {		d__ = z__[i4 - 3] * (d__ / (d__ + z__[i4 - 1]));	    }	}	emin = z__[(i0 << 2) + pp + 1];	d__ = z__[(i0 << 2) + pp - 3];	i__1 = 4*(n0 - 1) + pp;	for (i4 = (i0 << 2) + pp; i4 <= i__1; i4 += 4) {	    z__[i4 - (pp << 1) - 2] = d__ + z__[i4 - 1];	    if (z__[i4 - 1] <= tol2 * d__) {		z__[i4 - 1] = -0.;		z__[i4 - (pp << 1) - 2] = d__;		z__[i4 - (pp << 1)] = 0.;		d__ = z__[i4 + 1];	    } else if (safmin * z__[i4 + 1] < z__[i4 - (pp << 1) - 2] && 		    safmin * z__[i4 - (pp << 1) - 2] < z__[i4 + 1]) {		temp = z__[i4 + 1] / z__[i4 - (pp << 1) - 2];		z__[i4 - (pp << 1)] = z__[i4 - 1] * temp;		d__ *= temp;	    } else {		z__[i4 - (pp << 1)] = z__[i4 + 1] * (z__[i4 - 1] / z__[i4 - (			pp << 1) - 2]);		d__ = z__[i4 + 1] * (d__ / z__[i4 - (pp << 1) - 2]);	    }	    d__1 = emin, d__2 = z__[i4 - (pp << 1)];	    emin = (d__1<d__2) ? d__1 : d__2;	}	z__[(n0 << 2) - pp - 2] = d__;	qmax = z__[(i0 << 2) - pp - 2];	i__1 = (n0 << 2) - pp - 2;	for (i4 = (i0 << 2) - pp + 2; i4 <= i__1; i4 += 4) {	    d__1 = qmax, d__2 = z__[i4];	    qmax = (d__1>d__2) ? d__1 : d__2;	}	pp = 1 - pp;    }    iter = 2;    nfail = 0;    ndiv = 2*(n0 - i0);    i__1 = *n + 1;    for (iwhila = 1; iwhila <= i__1; ++iwhila) {	if (n0 < 1) {	    goto L170;	}	desig = 0.;	if (n0 == *n) {	    sigma = 0.;	} else {	    sigma = -z__[(n0 << 2) - 1];	}	if (sigma < 0.) {	    *info = 1;	    return;	}	emax = 0.;	if (n0 > i0) {	    emin = fabs(z__[(n0 << 2) - 5]);	} else {	    emin = 0.;	}	qmin = z__[(n0 << 2) - 3];	qmax = qmin;	for (i4 = n0 << 2; i4 >= 8; i4 += -4) {	    if (z__[i4 - 5] <= 0.) {		goto L100;	    }	    if (qmin >= emax * 4.) {		d__1 = qmin, d__2 = z__[i4 - 3];		qmin = (d__1<d__2) ? d__1 : d__2;		d__1 = emax, d__2 = z__[i4 - 5];		emax = (d__1>d__2) ? d__1 : d__2;	    }	    d__1 = qmax, d__2 = z__[i4 - 7] + z__[i4 - 5];	    qmax = (d__1>d__2) ? d__1 : d__2;	    d__1 = emin, d__2 = z__[i4 - 5];	    emin = (d__1<d__2) ? d__1 : d__2;	}	i4 = 4;L100:	i0 = i4 / 4;	pp = 0;	if (n0 - i0 > 1) {	    dee = z__[(i0 << 2) - 3];	    deemin = dee;	    kmin = i0;	    i__2 = (n0 << 2) - 3;	    for (i4 = (i0 << 2) - 3; i4 <= i__2; i4 += 4) {		dee = z__[i4] * (dee / (dee + z__[i4 - 2]));		if (dee <= deemin) {		    deemin = dee;		    kmin = (i4 + 3) / 4;		}	    }	    if (2*(kmin - i0) < n0 - kmin && deemin <= z__[(n0 << 2) - 3] * 		    .5) {		ipn4 = 4*(i0 + n0);		pp = 2;		i__2 = 2*(i0 + n0 - 1);		for (i4 = i0 << 2; i4 <= i__2; i4 += 4) {		    temp = z__[i4 - 3];		    z__[i4 - 3] = z__[ipn4 - i4 - 3];		    z__[ipn4 - i4 - 3] = temp;		    temp = z__[i4 - 2];		    z__[i4 - 2] = z__[ipn4 - i4 - 2];		    z__[ipn4 - i4 - 2] = temp;		    temp = z__[i4 - 1];		    z__[i4 - 1] = z__[ipn4 - i4 - 5];		    z__[ipn4 - i4 - 5] = temp;		    temp = z__[i4];		    z__[i4] = z__[ipn4 - i4 - 4];		    z__[ipn4 - i4 - 4] = temp;		}	    }	}	d__1 = 0., d__2 = qmin - sqrt(qmin) * 2. * sqrt(emax);	dmin__ = -((d__1>d__2) ? d__1 : d__2);	nbig = (n0 - i0 + 1) * 30;	i__2 = nbig;	for (iwhilb = 1; iwhilb <= i__2; ++iwhilb) {	    if (i0 > n0) {		goto L150;	    }	    F77_FUNC(dlasq3,DLASQ3)(&i0, &n0, &z__[1], &pp, &dmin__, &sigma, &desig, &qmax, &		    nfail, &iter, &ndiv, &ieee);	    pp = 1 - pp;	    if (pp == 0 && n0 - i0 >= 3) {		if (z__[n0 * 4] <= tol2 * qmax || z__[(n0 << 2) - 1] <= tol2 *			 sigma) {		    splt = i0 - 1;		    qmax = z__[(i0 << 2) - 3];		    emin = z__[(i0 << 2) - 1];		    oldemn = z__[i0 * 4];		    i__3 = 4*(n0 - 3);		    for (i4 = i0 << 2; i4 <= i__3; i4 += 4) {			if (z__[i4] <= tol2 * z__[i4 - 3] || z__[i4 - 1] <= 				tol2 * sigma) {			    z__[i4 - 1] = -sigma;			    splt = i4 / 4;			    qmax = 0.;			    emin = z__[i4 + 3];			    oldemn = z__[i4 + 4];			} else {			    d__1 = qmax, d__2 = z__[i4 + 1];			    qmax = (d__1>d__2) ? d__1 : d__2;			    d__1 = emin, d__2 = z__[i4 - 1];			    emin = (d__1<d__2) ? d__1 : d__2;			    d__1 = oldemn, d__2 = z__[i4];			    oldemn = (d__1<d__2) ? d__1 : d__2;			}		    }		    z__[(n0 << 2) - 1] = emin;		    z__[n0 * 4] = oldemn;		    i0 = splt + 1;		}	    }	}	*info = 2;	return;L150:	;    }    *info = 3;    return;L170:    i__1 = *n;    for (k = 2; k <= i__1; ++k) {	z__[k] = z__[(k << 2) - 3];    }    F77_FUNC(dlasrt,DLASRT)("D", n, &z__[1], &iinfo);    e = 0.;    for (k = *n; k >= 1; --k) {	e += z__[k];    }    z__[(*n << 1) + 1] = trace;    z__[(*n << 1) + 2] = e;    z__[(*n << 1) + 3] = (double) iter;    i__1 = *n;    z__[(*n << 1) + 4] = (double) ndiv / (double) (i__1 * i__1);    z__[(*n << 1) + 5] = nfail * 100. / (double) iter;    return;}

⌨️ 快捷键说明

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