3 #include "types/simple.h"
5 #include "../gmx_blas.h"
6 #include "../gmx_lapack.h"
7 #include "lapack_limits.h"
11 F77_FUNC(slarrvx,SLARRVX)(int *n,
28 int z_dim1, z_offset, i__1, i__2, i__3, i__4, i__5, i__6;
40 int wend, iter, temp[1], ktot;
44 int ndone, iinfo, iindr;
48 int zfrom, iindc1, iindc2;
53 int oldien, oldncl, wbegin;
56 int ndepth, inderr, iindwk;
61 int newfrs, newftt, parity;
62 float mgstol, nrminv, rqcorr;
74 z_offset = 1 + z_dim1;
89 iindwk = (*n << 2) + 1;
94 for (i__ = 1; i__ <= i__1; ++i__) {
97 F77_FUNC(slaset,SLASET)("Full", n, m, &c_b5, &c_b5, &z__[z_offset], ldz);
103 for (jblk = 1; jblk <= i__1; ++jblk) {
109 if (iblock[wend + 1] == jblk) {
119 if (ibegin == iend) {
120 z__[ibegin + wbegin * z_dim1] = 1.;
121 isuppz[(wbegin << 1) - 1] = ibegin;
122 isuppz[wbegin * 2] = ibegin;
129 d__1 = .001, d__2 = 1. / (float) in;
130 reltol = (d__1<d__2) ? d__1 : d__2;
131 im = wend - wbegin + 1;
132 F77_FUNC(scopy,SCOPY)(&im, &w[wbegin], &c__1, &work[1], &c__1);
134 for (i__ = 1; i__ <= i__2; ++i__) {
135 work[inderr + i__] = eps * fabs(work[i__]);
136 work[indgap + i__] = work[i__ + 1] - work[i__];
138 work[inderr + im] = eps * fabs(work[im]);
139 d__2 = fabs(work[im]);
140 work[indgap + im] = (d__2>eps) ? d__2 : eps;
146 iwork[iindc1 + 1] = 1;
147 iwork[iindc1 + 2] = im;
162 for (i__ = 1; i__ <= i__2; ++i__) {
164 j = oldcls + (i__ << 1);
165 oldfst = iwork[j - 1];
168 j = wbegin + oldfst - 1;
169 F77_FUNC(scopy,SCOPY)(&in, &z__[ibegin + j * z_dim1], &c__1, &d__[ibegin]
172 F77_FUNC(scopy,SCOPY)(&i__3, &z__[ibegin + (j + 1) * z_dim1], &c__1, &l[
174 F77_FUNC(slaset,SLASET)("Full", &in, &c__2, &c_b5, &c_b5, &z__[ibegin + j
179 for (j = 1; j <= i__3; ++j) {
181 work[indld + j] = tmp;
182 work[indlld + j] = tmp * l[k];
187 p = indexw[wbegin - 1 + oldfst];
188 q = indexw[wbegin - 1 + oldlst];
191 F77_FUNC(slarrbx,SLARRBX)(&in, &d__[ibegin], &l[ibegin], &work[indld + 1], &
192 work[indlld + 1], &p, &q, &reltol, &d__1, &i__3, &
193 work[1], &work[indgap + 1], &work[inderr + 1], &
194 work[indwrk + in], &iwork[iindwk], &iinfo);
198 for (j = oldfst; j <= i__3; ++j) {
199 if (j == oldlst || work[indgap + j] >=
200 reltol * fabs(work[j])) {
204 relgap = work[indgap + j] / fabs(work[j]);
208 minrgp = (minrgp<relgap) ? minrgp : relgap;
212 newsiz = newlst - newfrs + 1;
213 newftt = wbegin + newfrs - 1;
214 nomgs = newsiz == 1 || newsiz > 1 || minrgp < mgstol;
215 if (newsiz > 1 && nomgs) {
217 F77_FUNC(slarrfx,SLARRFX)(&in, &d__[ibegin], &l[ibegin], &work[indld +
218 1], &work[indlld + 1], &newfrs, &newlst, &
219 work[1], &sigma, &z__[ibegin + newftt *
220 z_dim1], &z__[ibegin + (newftt + 1) * z_dim1],
221 &work[indwrk], info);
223 tmp = eps * fabs(sigma);
225 for (k = newfrs; k <= i__4; ++k) {
227 d__1 = work[indgap + k];
228 work[indgap + k] = (d__1>tmp) ? d__1 : tmp;
229 work[inderr + k] += tmp;
232 k = newcls + (nclus << 1);
233 iwork[k - 1] = newfrs;
237 if (minrgp >= mgstol) {
241 work[indwrk] = d__[ibegin];
243 for (k = 1; k <= i__4; ++k) {
244 work[indwrk + k] = d__[ibegin + k] + work[
248 for (k = 1; k <= i__4; ++k) {
249 iwork[iindwk + k - 1] = 1;
252 for (k = newfrs; k <= i__4; ++k) {
253 isuppz[2*(oldien + k) - 1] = 1;
254 isuppz[(oldien + k) * 2] = in;
257 F77_FUNC(sstein,SSTEIN)(&in, &work[indwrk], &work[indld + 1],
258 &newsiz, &work[newfrs], &iwork[iindwk]
259 , temp, &z__[ibegin + newftt * z_dim1]
260 , ldz, &work[indwrk + in], &iwork[
261 iindwk + in], &iwork[iindwk + (in*2)], &iinfo);
272 for (k = newfrs; k <= i__4; ++k) {
277 F77_FUNC(slar1vx,SLAR1VX)(&in, &c__1, &in, &lambda, &d__[ibegin], &
278 l[ibegin], &work[indld + 1], &work[indlld
279 + 1], &w[wbegin + k - 1], &gersch[(oldien
280 << 1) + 1], &z__[ibegin + ktot * z_dim1],
281 &ztz, &mingma, &iwork[iindr + ktot], &
282 isuppz[(ktot << 1) - 1], &work[indwrk]);
285 resid = fabs(mingma) * nrminv;
286 rqcorr = mingma * tmp;
288 gap = work[indgap + k - 1];
290 gap = work[indgap + k];
292 d__1 = work[indgap + k - 1], d__2 = work[
294 gap = (d__1<d__2) ? d__1 : d__2;
297 if (resid > *tol * gap && fabs(rqcorr) > eps * 4. *
299 work[k] = lambda + rqcorr;
308 zfrom = isuppz[(ktot << 1) - 1];
309 zto = isuppz[ktot * 2];
310 i__5 = zto - zfrom + 1;
311 F77_FUNC(sscal,SSCAL)(&i__5, &nrminv, &z__[ibegin + zfrom - 1 +
312 ktot * z_dim1], &c__1);
316 itmp1 = isuppz[(newftt << 1) - 1];
317 itmp2 = isuppz[newftt * 2];
318 ktot = oldien + newlst;
320 for (p = newftt + 1; p <= i__4; ++p) {
322 for (q = newftt; q <= i__5; ++q) {
323 tmp = -F77_FUNC(sdot,SDOT)(&in, &z__[ibegin + p *
324 z_dim1], &c__1, &z__[ibegin + q *
326 F77_FUNC(saxpy,SAXPY)(&in, &tmp, &z__[ibegin + q *
327 z_dim1], &c__1, &z__[ibegin + p *
330 tmp = 1. / F77_FUNC(snrm2,SNRM2)(&in, &z__[ibegin + p *
332 F77_FUNC(sscal,SSCAL)(&in, &tmp, &z__[ibegin + p * z_dim1], &
334 i__5 = itmp1, i__6 = isuppz[(p << 1) - 1];
335 itmp1 = (i__5<i__6) ? i__5 : i__6;
336 i__5 = itmp2, i__6 = isuppz[p * 2];
337 itmp2 = (i__5>i__6) ? i__5 : i__6;
340 for (p = newftt; p <= i__4; ++p) {
341 isuppz[(p << 1) - 1] = itmp1;
342 isuppz[p * 2] = itmp2;
355 for (i__ = wbegin; i__ <= i__2; ++i__) {
356 isuppz[j - 1] += oldien;