2 #include "gromacs/utility/real.h"
4 #include "../gmx_lapack.h"
7 F77_FUNC(slasq4,SLASQ4)(int *i0,
27 float gam, gap1, gap2;
38 nn = (*n0 << 2) + *pp;
41 if ( fabs(*dmin__ - *dn)<GMX_FLOAT_EPS*fabs(*dmin__ + *dn) ||
42 fabs(*dmin__ - *dn1)<GMX_FLOAT_EPS*fabs(*dmin__ + *dn1)) {
44 b1 = sqrt(z__[nn - 3]) * sqrt(z__[nn - 5]);
45 b2 = sqrt(z__[nn - 7]) * sqrt(z__[nn - 9]);
46 a2 = z__[nn - 7] + z__[nn - 5];
48 if ( fabs(*dmin__ - *dn)<GMX_FLOAT_EPS*fabs(*dmin__ + *dn) &&
49 fabs(*dmin1 - *dn1)<GMX_FLOAT_EPS*fabs(*dmin1 + *dn1)) {
51 gap2 = *dmin2 - a2 - *dmin2 * .25;
52 if (gap2 > 0. && gap2 > b2) {
53 gap1 = a2 - *dn - b2 / gap2 * b2;
55 gap1 = a2 - *dn - (b1 + b2);
57 if (gap1 > 0. && gap1 > b1) {
58 d__1 = *dn - b1 / gap1 * b1, d__2 = *dmin__ * .5;
59 s = (d__1>d__2) ? d__1 : d__2;
67 d__1 = s, d__2 = a2 - (b1 + b2);
68 s = (d__1<d__2) ? d__1 : d__2;
70 d__1 = s, d__2 = *dmin__ * .333;
71 s = (d__1>d__2) ? d__1 : d__2;
79 if (fabs(*dmin__ - *dn)<GMX_FLOAT_EPS*fabs(*dmin__ + *dn)) {
82 if (z__[nn - 5] > z__[nn - 7]) {
85 b2 = z__[nn - 5] / z__[nn - 7];
91 if (z__[np - 4] > z__[np - 2]) {
94 a2 = z__[np - 4] / z__[np - 2];
95 if (z__[nn - 9] > z__[nn - 11]) {
98 b2 = z__[nn - 9] / z__[nn - 11];
104 i__1 = (*i0 << 2) - 1 + *pp;
105 for (i4 = np; i4 >= i__1; i4 += -4) {
106 if (fabs(b2)<GMX_FLOAT_MIN) {
110 if (z__[i4] > z__[i4 - 2]) {
113 b2 *= z__[i4] / z__[i4 - 2];
115 if (((b2>b1) ? b2 : b1) * 100. < a2 || .563 < a2) {
124 s = gam * (1. - sqrt(a2)) / (a2 + 1.);
127 } else if (fabs(*dmin__ - *dn2)<GMX_FLOAT_EPS*fabs(*dmin__ + *dn2)) {
132 np = nn - (*pp << 1);
136 if (z__[np - 8] > b2 || z__[np - 4] > b1) {
139 a2 = z__[np - 8] / b2 * (z__[np - 4] / b1 + 1.);
143 b2 = z__[nn - 13] / z__[nn - 15];
145 i__1 = (*i0 << 2) - 1 + *pp;
146 for (i4 = nn - 17; i4 >= i__1; i4 += -4) {
147 if (fabs(b2)<GMX_FLOAT_MIN) {
151 if (z__[i4] > z__[i4 - 2]) {
154 b2 *= z__[i4] / z__[i4 - 2];
156 if (((b2>b1) ? b2 : b1) * 100. < a2 || .563 < a2) {
165 s = gam * (1. - sqrt(a2)) / (a2 + 1.);
170 g += (1. - g) * .333;
171 } else if (*ttype == -18) {
172 g = .083250000000000005;
180 } else if (*n0in == *n0 + 1) {
182 if ( fabs(*dmin1 - *dn1)<GMX_FLOAT_EPS*fabs(*dmin1 + *dn1) &&
183 fabs(*dmin2 - *dn2)<GMX_FLOAT_EPS*fabs(*dmin2 + *dn2)) {
187 if (z__[nn - 5] > z__[nn - 7]) {
190 b1 = z__[nn - 5] / z__[nn - 7];
192 if (fabs(b2)<GMX_FLOAT_MIN) {
195 i__1 = (*i0 << 2) - 1 + *pp;
196 for (i4 = (*n0 << 2) - 9 + *pp; i4 >= i__1; i4 += -4) {
198 if (z__[i4] > z__[i4 - 2]) {
201 b1 *= z__[i4] / z__[i4 - 2];
203 if (((a2>b1) ? a2 : b1) * 100. < b2) {
208 b2 = sqrt(b2 * 1.05);
210 a2 = *dmin1 / (d__1 * d__1 + 1.);
211 gap2 = *dmin2 * .5 - a2;
212 if (gap2 > 0. && gap2 > b2 * a2) {
213 d__1 = s, d__2 = a2 * (1. - a2 * 1.01 * (b2 / gap2) * b2);
214 s = (d__1>d__2) ? d__1 : d__2;
216 d__1 = s, d__2 = a2 * (1. - b2 * 1.01);
217 s = (d__1>d__2) ? d__1 : d__2;
223 if (fabs(*dmin1 - *dn1)<GMX_FLOAT_EPS*fabs(*dmin1 + *dn1)) {
229 } else if (*n0in == *n0 + 2) {
231 if (fabs(*dmin2 - *dn2)<GMX_FLOAT_EPS*fabs(*dmin2 + *dn2) &&
232 z__[nn - 5] * 2. < z__[nn - 7]) {
235 if (z__[nn - 5] > z__[nn - 7]) {
238 b1 = z__[nn - 5] / z__[nn - 7];
240 if (fabs(b2)<GMX_FLOAT_MIN) {
243 i__1 = (*i0 << 2) - 1 + *pp;
244 for (i4 = (*n0 << 2) - 9 + *pp; i4 >= i__1; i4 += -4) {
245 if (z__[i4] > z__[i4 - 2]) {
248 b1 *= z__[i4] / z__[i4 - 2];
250 if (b1 * 100. < b2) {
255 b2 = sqrt(b2 * 1.05);
257 a2 = *dmin2 / (d__1 * d__1 + 1.);
258 gap2 = z__[nn - 7] + z__[nn - 9] - sqrt(z__[nn - 11]) * sqrt(z__[
260 if (gap2 > 0. && gap2 > b2 * a2) {
261 d__1 = s, d__2 = a2 * (1. - a2 * 1.01 * (b2 / gap2) * b2);
262 s = (d__1>d__2) ? d__1 : d__2;
264 d__1 = s, d__2 = a2 * (1. - b2 * 1.01);
265 s = (d__1>d__2) ? d__1 : d__2;
271 } else if (*n0in > *n0 + 2) {