2 #include "gmx_lapack.h"
5 F77_FUNC(slaebz,SLAEBZ)(int *ijob,
26 int nab_dim1, nab_offset, ab_dim1, ab_offset, i__1, i__2, i__3, i__4,
28 float d__1, d__2, d__3, d__4;
30 int j, kf, ji, kl, jp, jit;
32 int itmp1, itmp2, kfnew, klnew;
35 nab_offset = 1 + nab_dim1;
38 ab_offset = 1 + ab_dim1;
49 if (*ijob < 1 || *ijob > 3) {
59 for (ji = 1; ji <= i__1; ++ji) {
60 for (jp = 1; jp <= 2; ++jp) {
61 tmp1 = d__[1] - ab[ji + jp * ab_dim1];
62 if (fabs(tmp1) < *pivmin) {
65 nab[ji + jp * nab_dim1] = 0;
67 nab[ji + jp * nab_dim1] = 1;
71 for (j = 2; j <= i__2; ++j) {
72 tmp1 = d__[j] - e2[j - 1] / tmp1 - ab[ji + jp * ab_dim1];
73 if (fabs(tmp1) < *pivmin) {
77 ++nab[ji + jp * nab_dim1];
81 *mout = *mout + nab[ji + (nab_dim1 << 1)] - nab[ji + nab_dim1];
91 for (ji = 1; ji <= i__1; ++ji) {
92 c__[ji] = (ab[ji + ab_dim1] + ab[ji + (ab_dim1 << 1)]) * .5;
97 for (jit = 1; jit <= i__1; ++jit) {
99 if (kl - kf + 1 >= *nbmin && *nbmin > 0) {
102 for (ji = kf; ji <= i__2; ++ji) {
104 work[ji] = d__[1] - c__[ji];
106 if (work[ji] <= *pivmin) {
108 d__1 = work[ji], d__2 = -(*pivmin);
109 work[ji] = (d__1<d__2) ? d__1 : d__2;
113 for (j = 2; j <= i__3; ++j) {
114 work[ji] = d__[j] - e2[j - 1] / work[ji] - c__[ji];
115 if (work[ji] <= *pivmin) {
117 d__1 = work[ji], d__2 = -(*pivmin);
118 work[ji] = (d__1<d__2) ? d__1 : d__2;
127 for (ji = kf; ji <= i__2; ++ji) {
129 i__5 = nab[ji + nab_dim1];
131 i__3 = nab[ji + (nab_dim1 << 1)];
132 i__4 = (i__5>i__6) ? i__5 : i__6;
133 iwork[ji] = (i__3<i__4) ? i__3 : i__4;
135 if (iwork[ji] == nab[ji + (nab_dim1 << 1)]) {
137 ab[ji + (ab_dim1 << 1)] = c__[ji];
139 } else if (iwork[ji] == nab[ji + nab_dim1]) {
141 ab[ji + ab_dim1] = c__[ji];
144 if (klnew <= *mmax) {
146 ab[klnew + (ab_dim1 << 1)] = ab[ji + (ab_dim1 <<
148 nab[klnew + (nab_dim1 << 1)] = nab[ji + (nab_dim1
150 ab[klnew + ab_dim1] = c__[ji];
151 nab[klnew + nab_dim1] = iwork[ji];
152 ab[ji + (ab_dim1 << 1)] = c__[ji];
153 nab[ji + (nab_dim1 << 1)] = iwork[ji];
166 for (ji = kf; ji <= i__2; ++ji) {
167 if (iwork[ji] <= nval[ji]) {
168 ab[ji + ab_dim1] = c__[ji];
169 nab[ji + nab_dim1] = iwork[ji];
171 if (iwork[ji] >= nval[ji]) {
172 ab[ji + (ab_dim1 << 1)] = c__[ji];
173 nab[ji + (nab_dim1 << 1)] = iwork[ji];
182 for (ji = kf; ji <= i__2; ++ji) {
185 tmp2 = d__[1] - tmp1;
187 if (tmp2 <= *pivmin) {
189 d__1 = tmp2, d__2 = -(*pivmin);
190 tmp2 = (d__1<d__2) ? d__1 : d__2;
194 for (j = 2; j <= i__3; ++j) {
195 tmp2 = d__[j] - e2[j - 1] / tmp2 - tmp1;
196 if (tmp2 <= *pivmin) {
198 d__1 = tmp2, d__2 = -(*pivmin);
199 tmp2 = (d__1<d__2) ? d__1 : d__2;
205 i__5 = nab[ji + nab_dim1];
206 i__3 = nab[ji + (nab_dim1 << 1)];
207 i__4 = (i__5>itmp1) ? i__5 : itmp1;
208 itmp1 = (i__3<i__4) ? i__3 : i__4;
210 if (itmp1 == nab[ji + (nab_dim1 << 1)]) {
212 ab[ji + (ab_dim1 << 1)] = tmp1;
214 } else if (itmp1 == nab[ji + nab_dim1]) {
216 ab[ji + ab_dim1] = tmp1;
217 } else if (klnew < *mmax) {
220 ab[klnew + (ab_dim1 << 1)] = ab[ji + (ab_dim1 << 1)];
221 nab[klnew + (nab_dim1 << 1)] = nab[ji + (nab_dim1 <<
223 ab[klnew + ab_dim1] = tmp1;
224 nab[klnew + nab_dim1] = itmp1;
225 ab[ji + (ab_dim1 << 1)] = tmp1;
226 nab[ji + (nab_dim1 << 1)] = itmp1;
233 if (itmp1 <= nval[ji]) {
234 ab[ji + ab_dim1] = tmp1;
235 nab[ji + nab_dim1] = itmp1;
237 if (itmp1 >= nval[ji]) {
238 ab[ji + (ab_dim1 << 1)] = tmp1;
239 nab[ji + (nab_dim1 << 1)] = itmp1;
249 for (ji = kf; ji <= i__2; ++ji) {
250 tmp1 = fabs(ab[ji + (ab_dim1 << 1)] - ab[ji + ab_dim1]);
251 d__3 = fabs(ab[ji + (ab_dim1 << 1)]);
252 d__4 = fabs(ab[ji + ab_dim1]);
253 tmp2 = (d__3>d__4) ? d__3 : d__4;
254 d__1 = (*abstol>*pivmin) ? *abstol : *pivmin;
255 d__2 = *reltol * tmp2;
256 if (tmp1 < ((d__1>d__2) ? d__1 : d__2) || nab[ji + nab_dim1] >= nab[ji + (
260 tmp1 = ab[ji + ab_dim1];
261 tmp2 = ab[ji + (ab_dim1 << 1)];
262 itmp1 = nab[ji + nab_dim1];
263 itmp2 = nab[ji + (nab_dim1 << 1)];
264 ab[ji + ab_dim1] = ab[kfnew + ab_dim1];
265 ab[ji + (ab_dim1 << 1)] = ab[kfnew + (ab_dim1 << 1)];
266 nab[ji + nab_dim1] = nab[kfnew + nab_dim1];
267 nab[ji + (nab_dim1 << 1)] = nab[kfnew + (nab_dim1 << 1)];
268 ab[kfnew + ab_dim1] = tmp1;
269 ab[kfnew + (ab_dim1 << 1)] = tmp2;
270 nab[kfnew + nab_dim1] = itmp1;
271 nab[kfnew + (nab_dim1 << 1)] = itmp2;
274 nval[ji] = nval[kfnew];
284 for (ji = kf; ji <= i__2; ++ji) {
285 c__[ji] = (ab[ji + ab_dim1] + ab[ji + (ab_dim1 << 1)]) * .5;