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

📄 slasd4.c

📁 最著名最快的分子模拟软件
💻 C
📖 第 1 页 / 共 2 页
字号:
	i__1 = iip1;	for (j = *n; j >= i__1; --j) {	    temp = z__[j] / (work[j] * delta[j]);	    phi += z__[j] * temp;	    dphi += temp * temp;	    erretm += phi;	}	w = rhoinv + phi + psi;	swtch3 = 0;	if (orgati) {	    if (w < 0.) {		swtch3 = 1;	    }	} else {	    if (w > 0.) {		swtch3 = 1;	    }	}	if (ii == 1 || ii == *n) {	    swtch3 = 0;	}	temp = z__[ii] / (work[ii] * delta[ii]);	dw = dpsi + dphi + temp * temp;	temp = z__[ii] * temp;	w += temp;	erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + fabs(temp) * 3. + 		fabs(tau) * dw;	if (fabs(w) <= eps * erretm) {	    goto L240;	}	if (w <= 0.) {	    sg2lb = (sg2lb > tau) ? sg2lb : tau;	} else {	    sg2ub = (sg2ub < tau) ? sg2ub : tau;	}	++niter;	if (! swtch3) {	    dtipsq = work[ip1] * delta[ip1];	    dtisq = work[*i__] * delta[*i__];	    if (orgati) {		d__1 = z__[*i__] / dtisq;		c__ = w - dtipsq * dw + delsq * (d__1 * d__1);	    } else {		d__1 = z__[ip1] / dtipsq;		c__ = w - dtisq * dw - delsq * (d__1 * d__1);	    }	    a = (dtipsq + dtisq) * w - dtipsq * dtisq * dw;	    b = dtipsq * dtisq * w;	    if ( fabs(c__)<GMX_FLOAT_MIN) {		if ( fabs(a)<GMX_FLOAT_MIN) {		    if (orgati) {			a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * (dpsi + 				dphi);		    } else {			a = z__[ip1] * z__[ip1] + dtisq * dtisq * (dpsi + 				dphi);		    }		}		eta = b / a;	    } else if (a <= 0.) {		eta = (a - sqrt(fabs(a * a - b * 4. * c__))) / (c__ * 2.);	    } else {		eta = b * 2. / (a + sqrt(fabs(a * a - b * 4. * c__)));	    }	} else {	    dtiim = work[iim1] * delta[iim1];	    dtiip = work[iip1] * delta[iip1];	    temp = rhoinv + psi + phi;	    if (orgati) {		temp1 = z__[iim1] / dtiim;		temp1 *= temp1;		c__ = temp - dtiip * (dpsi + dphi) - (d__[iim1] - d__[iip1]) *			 (d__[iim1] + d__[iip1]) * temp1;		zz[0] = z__[iim1] * z__[iim1];		if (dpsi < temp1) {		    zz[2] = dtiip * dtiip * dphi;		} else {		    zz[2] = dtiip * dtiip * (dpsi - temp1 + dphi);		}	    } else {		temp1 = z__[iip1] / dtiip;		temp1 *= temp1;		c__ = temp - dtiim * (dpsi + dphi) - (d__[iip1] - d__[iim1]) *			 (d__[iim1] + d__[iip1]) * temp1;		if (dphi < temp1) {		    zz[0] = dtiim * dtiim * dpsi;		} else {		    zz[0] = dtiim * dtiim * (dpsi + (dphi - temp1));		}		zz[2] = z__[iip1] * z__[iip1];	    }	    zz[1] = z__[ii] * z__[ii];	    dd[0] = dtiim;	    dd[1] = delta[ii] * work[ii];	    dd[2] = dtiip;	    F77_FUNC(slaed6,SLAED6)(&niter, &orgati, &c__, dd, zz, &w, &eta, info);	    if (*info != 0) {		goto L240;	    }	}	if (w * eta >= 0.) {	    eta = -w / dw;	}	if (orgati) {	    temp1 = work[*i__] * delta[*i__];	    temp = eta - temp1;	} else {	    temp1 = work[ip1] * delta[ip1];	    temp = eta - temp1;	}	if (temp > sg2ub || temp < sg2lb) {	    if (w < 0.) {		eta = (sg2ub - tau) / 2.;	    } else {		eta = (sg2lb - tau) / 2.;	    }	}	tau += eta;	eta /= *sigma + sqrt(*sigma * *sigma + eta);	prew = w;	*sigma += eta;	i__1 = *n;	for (j = 1; j <= i__1; ++j) {	    work[j] += eta;	    delta[j] -= eta;	}	dpsi = 0.;	psi = 0.;	erretm = 0.;	i__1 = iim1;	for (j = 1; j <= i__1; ++j) {	    temp = z__[j] / (work[j] * delta[j]);	    psi += z__[j] * temp;	    dpsi += temp * temp;	    erretm += psi;	}	erretm = fabs(erretm);	dphi = 0.;	phi = 0.;	i__1 = iip1;	for (j = *n; j >= i__1; --j) {	    temp = z__[j] / (work[j] * delta[j]);	    phi += z__[j] * temp;	    dphi += temp * temp;	    erretm += phi;	}	temp = z__[ii] / (work[ii] * delta[ii]);	dw = dpsi + dphi + temp * temp;	temp = z__[ii] * temp;	w = rhoinv + phi + psi + temp;	erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + fabs(temp) * 3. + 		fabs(tau) * dw;	if (w <= 0.) {	    sg2lb = (sg2lb > tau) ? sg2lb : tau;	} else {	    sg2ub = (sg2ub < tau) ? sg2ub : tau;	}	swtch = 0;	if (orgati) {	    if (-w > fabs(prew) / 10.) {		swtch = 1;	    }	} else {	    if (w > fabs(prew) / 10.) {		swtch = 1;	    }	}	iter = niter + 1;	for (niter = iter; niter <= 20; ++niter) {	    if (fabs(w) <= eps * erretm) {		goto L240;	    }	    if (! swtch3) {		dtipsq = work[ip1] * delta[ip1];		dtisq = work[*i__] * delta[*i__];		if (! swtch) {		    if (orgati) {			d__1 = z__[*i__] / dtisq;			c__ = w - dtipsq * dw + delsq * (d__1 * d__1);		    } else {			d__1 = z__[ip1] / dtipsq;			c__ = w - dtisq * dw - delsq * (d__1 * d__1);		    }		} else {		    temp = z__[ii] / (work[ii] * delta[ii]);		    if (orgati) {			dpsi += temp * temp;		    } else {			dphi += temp * temp;		    }		    c__ = w - dtisq * dpsi - dtipsq * dphi;		}		a = (dtipsq + dtisq) * w - dtipsq * dtisq * dw;		b = dtipsq * dtisq * w;		if (fabs(c__)<GMX_FLOAT_MIN) {		    if (fabs(a)<GMX_FLOAT_MIN) {			if (! swtch) {			    if (orgati) {				a = z__[*i__] * z__[*i__] + dtipsq * dtipsq * 					(dpsi + dphi);			    } else {				a = z__[ip1] * z__[ip1] + dtisq * dtisq * (					dpsi + dphi);			    }			} else {			    a = dtisq * dtisq * dpsi + dtipsq * dtipsq * dphi;			}		    }		    eta = b / a;		} else if (a <= 0.) {		  eta = (a - sqrt(fabs(a * a - b * 4. * c__))) / (c__ * 2.);		} else {		  eta = b * 2. / (a + sqrt(fabs(a * a - b * 4. * c__)));		}	    } else {		dtiim = work[iim1] * delta[iim1];		dtiip = work[iip1] * delta[iip1];		temp = rhoinv + psi + phi;		if (swtch) {		    c__ = temp - dtiim * dpsi - dtiip * dphi;		    zz[0] = dtiim * dtiim * dpsi;		    zz[2] = dtiip * dtiip * dphi;		} else {		    if (orgati) {			temp1 = z__[iim1] / dtiim;			temp1 *= temp1;			temp2 = (d__[iim1] - d__[iip1]) * (d__[iim1] + d__[				iip1]) * temp1;			c__ = temp - dtiip * (dpsi + dphi) - temp2;			zz[0] = z__[iim1] * z__[iim1];			if (dpsi < temp1) {			    zz[2] = dtiip * dtiip * dphi;			} else {			    zz[2] = dtiip * dtiip * (dpsi - temp1 + dphi);			}		    } else {			temp1 = z__[iip1] / dtiip;			temp1 *= temp1;			temp2 = (d__[iip1] - d__[iim1]) * (d__[iim1] + d__[				iip1]) * temp1;			c__ = temp - dtiim * (dpsi + dphi) - temp2;			if (dphi < temp1) {			    zz[0] = dtiim * dtiim * dpsi;			} else {			    zz[0] = dtiim * dtiim * (dpsi + (dphi - temp1));			}			zz[2] = z__[iip1] * z__[iip1];		    }		}		dd[0] = dtiim;		dd[1] = delta[ii] * work[ii];		dd[2] = dtiip;		F77_FUNC(slaed6,SLAED6)(&niter, &orgati, &c__, dd, zz, &w, &eta, info);		if (*info != 0) {		    goto L240;		}	    }	    if (w * eta >= 0.) {		eta = -w / dw;	    }	    if (orgati) {		temp1 = work[*i__] * delta[*i__];		temp = eta - temp1;	    } else {		temp1 = work[ip1] * delta[ip1];		temp = eta - temp1;	    }	    if (temp > sg2ub || temp < sg2lb) {		if (w < 0.) {		    eta = (sg2ub - tau) / 2.;		} else {		    eta = (sg2lb - tau) / 2.;		}	    }	    tau += eta;	    eta /= *sigma + sqrt(*sigma * *sigma + eta);	    *sigma += eta;	    i__1 = *n;	    for (j = 1; j <= i__1; ++j) {		work[j] += eta;		delta[j] -= eta;	    }	    prew = w;	    dpsi = 0.;	    psi = 0.;	    erretm = 0.;	    i__1 = iim1;	    for (j = 1; j <= i__1; ++j) {		temp = z__[j] / (work[j] * delta[j]);		psi += z__[j] * temp;		dpsi += temp * temp;		erretm += psi;	    }	    erretm = fabs(erretm);	    dphi = 0.;	    phi = 0.;	    i__1 = iip1;	    for (j = *n; j >= i__1; --j) {		temp = z__[j] / (work[j] * delta[j]);		phi += z__[j] * temp;		dphi += temp * temp;		erretm += phi;	    }	    temp = z__[ii] / (work[ii] * delta[ii]);	    dw = dpsi + dphi + temp * temp;	    temp = z__[ii] * temp;	    w = rhoinv + phi + psi + temp;	    erretm = (phi - psi) * 8. + erretm + rhoinv * 2. + fabs(temp) * 3. 		    + fabs(tau) * dw;	    if (w * prew > 0. && fabs(w) > fabs(prew) / 10.) {		swtch = ! swtch;	    }	    if (w <= 0.) {		sg2lb = (sg2lb > tau) ? sg2lb : tau;	    } else {		sg2ub = (sg2ub < tau) ? sg2ub : tau;	    }	}	*info = 1;    }L240:    return;} 

⌨️ 快捷键说明

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