3 #include "../gmx_lapack.h"
5 #include "gromacs/utility/real.h"
8 F77_FUNC(slaed6,SLAED6)(int *kniter,
18 float r__1, r__2, r__3, r__4;
22 float fc, df, ddf, eta, eps, base;
24 float temp, temp1, temp2, temp3, temp4;
27 float small1, small2, sminv1, sminv2, dscale[3], sclfac;
28 float zscale[3], erretm;
41 temp = (d__[3] - d__[2]) / 2.f;
42 c__ = *rho + z__[1] / (d__[1] - d__[2] - temp);
43 a = c__ * (d__[2] + d__[3]) + z__[2] + z__[3];
44 b = c__ * d__[2] * d__[3] + z__[2] * d__[3] + z__[3] * d__[2];
46 temp = (d__[1] - d__[2]) / 2.f;
47 c__ = *rho + z__[3] / (d__[3] - d__[2] - temp);
48 a = c__ * (d__[1] + d__[2]) + z__[1] + z__[2];
49 b = c__ * d__[1] * d__[2] + z__[1] * d__[2] + z__[2] * d__[1];
51 r__1 = fabs(a), r__2 = fabs(b), r__1 = ((r__1>r__2)? r__1:r__2), r__2 = fabs(c__);
52 temp = (r__1>r__2) ? r__1 : r__2;
58 } else if (a <= 0.f) {
59 *tau = (a - sqrt((r__1 = a * a - b * 4.f * c__, fabs(r__1)))) / (
62 *tau = b * 2.f / (a + sqrt((r__1 = a * a - b * 4.f * c__, fabs(r__1))));
65 temp = *rho + z__[1] / (d__[1] - *tau) + z__[2] / (d__[2] - *tau) +
66 z__[3] / (d__[3] - *tau);
67 if (fabs(*finit) <= fabs(temp)) {
74 safemin = GMX_FLOAT_MIN*(1.0+GMX_FLOAT_EPS);
75 i__1 = (int) (log(safemin) / log(base) / 3.f);
76 small1 = pow(base, i__1);
77 sminv1 = 1.f / small1;
78 small2 = small1 * small1;
79 sminv2 = sminv1 * sminv1;
82 r__3 = (r__1 = d__[2] - *tau, fabs(r__1)), r__4 = (r__2 = d__[3] - *
84 temp = (r__3<r__4) ? r__3 : r__4;
86 r__3 = (r__1 = d__[1] - *tau, fabs(r__1)), r__4 = (r__2 = d__[2] - *
88 temp = (r__3<r__4) ? r__3 : r__4;
104 for (i__ = 1; i__ <= 3; ++i__) {
105 dscale[i__ - 1] = d__[i__] * sclfac;
106 zscale[i__ - 1] = z__[i__] * sclfac;
111 for (i__ = 1; i__ <= 3; ++i__) {
112 dscale[i__ - 1] = d__[i__];
113 zscale[i__ - 1] = z__[i__];
119 for (i__ = 1; i__ <= 3; ++i__) {
120 temp = 1.f / (dscale[i__ - 1] - *tau);
121 temp1 = zscale[i__ - 1] * temp;
122 temp2 = temp1 * temp;
123 temp3 = temp2 * temp;
124 fc += temp1 / dscale[i__ - 1];
128 f = *finit + *tau * fc;
130 if (fabs(f) <= 0.f) {
134 for (niter = iter; niter <= 20; ++niter) {
136 temp1 = dscale[1] - *tau;
137 temp2 = dscale[2] - *tau;
139 temp1 = dscale[0] - *tau;
140 temp2 = dscale[1] - *tau;
142 a = (temp1 + temp2) * f - temp1 * temp2 * df;
143 b = temp1 * temp2 * f;
144 c__ = f - (temp1 + temp2) * df + temp1 * temp2 * ddf;
145 r__1 = fabs(a), r__2 = fabs(b), r__1 = ((r__1>r__2)? r__1:r__2), r__2 = fabs(c__);
146 temp = (r__1>r__2) ? r__1 : r__2;
152 } else if (a <= 0.f) {
153 eta = (a - sqrt((r__1 = a * a - b * 4.f * c__, fabs(r__1)))) / ( c__ * 2.f);
155 eta = b * 2.f / (a + sqrt((r__1 = a * a - b * 4.f * c__, fabs( r__1))));
157 if (f * eta >= 0.f) {
162 if (eta > 0.f && temp >= dscale[2]) {
163 eta = (dscale[2] - *tau) / 2.f;
166 if (eta < 0.f && temp <= dscale[1]) {
167 eta = (dscale[1] - *tau) / 2.f;
170 if (eta > 0.f && temp >= dscale[1]) {
171 eta = (dscale[1] - *tau) / 2.f;
173 if (eta < 0.f && temp <= dscale[0]) {
174 eta = (dscale[0] - *tau) / 2.f;
182 for (i__ = 1; i__ <= 3; ++i__) {
183 temp = 1.f / (dscale[i__ - 1] - *tau);
184 temp1 = zscale[i__ - 1] * temp;
185 temp2 = temp1 * temp;
186 temp3 = temp2 * temp;
187 temp4 = temp1 / dscale[i__ - 1];
189 erretm += fabs(temp4);
193 f = *finit + *tau * fc;
194 erretm = (fabs(*finit) + fabs(*tau) * erretm) * 8.f + fabs(*tau) * df;
195 if (fabs(f) <= eps * erretm) {