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

📄 slaebz.c

📁 最著名最快的分子模拟软件
💻 C
字号:
#include <math.h>#include "gmx_lapack.h"voidF77_FUNC(slaebz,SLAEBZ)(int *ijob,	int *nitmax,	int *n, 	int *mmax,	int *minp,	int *nbmin,	float *abstol, 	float *reltol, 	float *pivmin, 	float *d__,	float *e,	float *e2, 	int *nval,	float *ab, 	float *c__, 	int *mout, 	int *nab,	float *work,	int *iwork, 	int *info){    int nab_dim1, nab_offset, ab_dim1, ab_offset, i__1, i__2, i__3, i__4, 	    i__5, i__6;    float d__1, d__2, d__3, d__4;    int j, kf, ji, kl, jp, jit;    float tmp1, tmp2;    int itmp1, itmp2, kfnew, klnew;    nab_dim1 = *mmax;    nab_offset = 1 + nab_dim1;    nab -= nab_offset;    ab_dim1 = *mmax;    ab_offset = 1 + ab_dim1;    ab -= ab_offset;    --d__;    --e;    --e2;    --nval;    --c__;    --work;    --iwork;    *info = 0;    if (*ijob < 1 || *ijob > 3) {	*info = -1;	return;    }    if (*ijob == 1) {	*mout = 0;	i__1 = *minp;	for (ji = 1; ji <= i__1; ++ji) {	    for (jp = 1; jp <= 2; ++jp) {		tmp1 = d__[1] - ab[ji + jp * ab_dim1];		if (fabs(tmp1) < *pivmin) {		    tmp1 = -(*pivmin);		}		nab[ji + jp * nab_dim1] = 0;		if (tmp1 <= 0.) {		    nab[ji + jp * nab_dim1] = 1;		}		i__2 = *n;		for (j = 2; j <= i__2; ++j) {		    tmp1 = d__[j] - e2[j - 1] / tmp1 - ab[ji + jp * ab_dim1];		    if (fabs(tmp1) < *pivmin) {			tmp1 = -(*pivmin);		    }		    if (tmp1 <= 0.) {			++nab[ji + jp * nab_dim1];		    }		}	    }	    *mout = *mout + nab[ji + (nab_dim1 << 1)] - nab[ji + nab_dim1];	}	return;    }    kf = 1;    kl = *minp;    if (*ijob == 2) {	i__1 = *minp;	for (ji = 1; ji <= i__1; ++ji) {	    c__[ji] = (ab[ji + ab_dim1] + ab[ji + (ab_dim1 << 1)]) * .5;	}    }    i__1 = *nitmax;    for (jit = 1; jit <= i__1; ++jit) {	if (kl - kf + 1 >= *nbmin && *nbmin > 0) {	    i__2 = kl;	    for (ji = kf; ji <= i__2; ++ji) {		work[ji] = d__[1] - c__[ji];		iwork[ji] = 0;		if (work[ji] <= *pivmin) {		    iwork[ji] = 1;		    d__1 = work[ji], d__2 = -(*pivmin);		    work[ji] = (d__1<d__2) ? d__1 : d__2;		}		i__3 = *n;		for (j = 2; j <= i__3; ++j) {		    work[ji] = d__[j] - e2[j - 1] / work[ji] - c__[ji];		    if (work[ji] <= *pivmin) {			++iwork[ji];			d__1 = work[ji], d__2 = -(*pivmin);			work[ji] = (d__1<d__2) ? d__1 : d__2;		    }		}	    }	    if (*ijob <= 2) {		klnew = kl;		i__2 = kl;		for (ji = kf; ji <= i__2; ++ji) {		  i__5 = nab[ji + nab_dim1];		  i__6 = iwork[ji];		  i__3 = nab[ji + (nab_dim1 << 1)];		  i__4 = (i__5>i__6) ? i__5 : i__6;		    iwork[ji] = (i__3<i__4) ? i__3 : i__4;		    if (iwork[ji] == nab[ji + (nab_dim1 << 1)]) {			ab[ji + (ab_dim1 << 1)] = c__[ji];		    } else if (iwork[ji] == nab[ji + nab_dim1]) {			ab[ji + ab_dim1] = c__[ji];		    } else {			++klnew;			if (klnew <= *mmax) {			    ab[klnew + (ab_dim1 << 1)] = ab[ji + (ab_dim1 << 				    1)];			    nab[klnew + (nab_dim1 << 1)] = nab[ji + (nab_dim1 				    << 1)];			    ab[klnew + ab_dim1] = c__[ji];			    nab[klnew + nab_dim1] = iwork[ji];			    ab[ji + (ab_dim1 << 1)] = c__[ji];			    nab[ji + (nab_dim1 << 1)] = iwork[ji];			} else {			    *info = *mmax + 1;			}		    }		}		if (*info != 0) {		    return;		}		kl = klnew;	    } else {		i__2 = kl;		for (ji = kf; ji <= i__2; ++ji) {		    if (iwork[ji] <= nval[ji]) {			ab[ji + ab_dim1] = c__[ji];			nab[ji + nab_dim1] = iwork[ji];		    }		    if (iwork[ji] >= nval[ji]) {			ab[ji + (ab_dim1 << 1)] = c__[ji];			nab[ji + (nab_dim1 << 1)] = iwork[ji];		    }		}	    }	} else {	    klnew = kl;	    i__2 = kl;	    for (ji = kf; ji <= i__2; ++ji) {		tmp1 = c__[ji];		tmp2 = d__[1] - tmp1;		itmp1 = 0;		if (tmp2 <= *pivmin) {		    itmp1 = 1;		    d__1 = tmp2, d__2 = -(*pivmin);		    tmp2 = (d__1<d__2) ? d__1 : d__2;		}		i__3 = *n;		for (j = 2; j <= i__3; ++j) {		    tmp2 = d__[j] - e2[j - 1] / tmp2 - tmp1;		    if (tmp2 <= *pivmin) {			++itmp1;			d__1 = tmp2, d__2 = -(*pivmin);			tmp2 = (d__1<d__2) ? d__1 : d__2;		    }		}		if (*ijob <= 2) {		    i__5 = nab[ji + nab_dim1];		    i__3 = nab[ji + (nab_dim1 << 1)];		    i__4 = (i__5>itmp1) ? i__5 : itmp1;		    itmp1 = (i__3<i__4) ? i__3 : i__4;		    if (itmp1 == nab[ji + (nab_dim1 << 1)]) {			ab[ji + (ab_dim1 << 1)] = tmp1;		    } else if (itmp1 == nab[ji + nab_dim1]) {			ab[ji + ab_dim1] = tmp1;		    } else if (klnew < *mmax) {			++klnew;			ab[klnew + (ab_dim1 << 1)] = ab[ji + (ab_dim1 << 1)];			nab[klnew + (nab_dim1 << 1)] = nab[ji + (nab_dim1 << 				1)];			ab[klnew + ab_dim1] = tmp1;			nab[klnew + nab_dim1] = itmp1;			ab[ji + (ab_dim1 << 1)] = tmp1;			nab[ji + (nab_dim1 << 1)] = itmp1;		    } else {			*info = *mmax + 1;			return;		    }		} else {		    if (itmp1 <= nval[ji]) {			ab[ji + ab_dim1] = tmp1;			nab[ji + nab_dim1] = itmp1;		    }		    if (itmp1 >= nval[ji]) {			ab[ji + (ab_dim1 << 1)] = tmp1;			nab[ji + (nab_dim1 << 1)] = itmp1;		    }		}	    }	    kl = klnew;	}	kfnew = kf;	i__2 = kl;	for (ji = kf; ji <= i__2; ++ji) {	    tmp1 = fabs(ab[ji + (ab_dim1 << 1)] - ab[ji + ab_dim1]);	    d__3 = fabs(ab[ji + (ab_dim1 << 1)]);	    d__4 = fabs(ab[ji + ab_dim1]);	    tmp2 = (d__3>d__4) ? d__3 : d__4;	    d__1 = (*abstol>*pivmin) ? *abstol : *pivmin;	    d__2 = *reltol * tmp2;	    if (tmp1 < ((d__1>d__2) ? d__1 : d__2) || nab[ji + nab_dim1] >= nab[ji + (		    nab_dim1 << 1)]) {		if (ji > kfnew) {		    tmp1 = ab[ji + ab_dim1];		    tmp2 = ab[ji + (ab_dim1 << 1)];		    itmp1 = nab[ji + nab_dim1];		    itmp2 = nab[ji + (nab_dim1 << 1)];		    ab[ji + ab_dim1] = ab[kfnew + ab_dim1];		    ab[ji + (ab_dim1 << 1)] = ab[kfnew + (ab_dim1 << 1)];		    nab[ji + nab_dim1] = nab[kfnew + nab_dim1];		    nab[ji + (nab_dim1 << 1)] = nab[kfnew + (nab_dim1 << 1)];		    ab[kfnew + ab_dim1] = tmp1;		    ab[kfnew + (ab_dim1 << 1)] = tmp2;		    nab[kfnew + nab_dim1] = itmp1;		    nab[kfnew + (nab_dim1 << 1)] = itmp2;		    if (*ijob == 3) {			itmp1 = nval[ji];			nval[ji] = nval[kfnew];			nval[kfnew] = itmp1;		    }		}		++kfnew;	    }	}	kf = kfnew;	i__2 = kl;	for (ji = kf; ji <= i__2; ++ji) {	    c__[ji] = (ab[ji + ab_dim1] + ab[ji + (ab_dim1 << 1)]) * .5;	}	if (kf > kl) {	    break;	}    }    i__1 = kl + 1 - kf;    if(i__1>0)      *info = i__1;    *mout = kl;    return;}

⌨️ 快捷键说明

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