2 #include "../gmx_blas.h"
3 #include "../gmx_lapack.h"
4 #include "lapack_limits.h"
6 #include "types/simple.h"
9 F77_FUNC(dlasd2,DLASD2)(int *nl,
33 int u_dim1, u_offset, u2_dim1, u2_offset, vt_dim1, vt_offset;
34 int vt2_dim1, vt2_offset, i__1;
44 int psm[4], nlp1, nlp2, idxi, idxj;
55 u_offset = 1 + u_dim1;
58 vt_offset = 1 + vt_dim1;
62 u2_offset = 1 + u2_dim1;
65 vt2_offset = 1 + vt2_dim1;
81 z1 = *alpha * vt[nlp1 + nlp1 * vt_dim1];
83 for (i__ = *nl; i__ >= 1; --i__) {
84 z__[i__ + 1] = *alpha * vt[i__ + nlp1 * vt_dim1];
85 d__[i__ + 1] = d__[i__];
86 idxq[i__ + 1] = idxq[i__] + 1;
90 for (i__ = nlp2; i__ <= i__1; ++i__) {
91 z__[i__] = *beta * vt[i__ + nlp2 * vt_dim1];
95 for (i__ = 2; i__ <= i__1; ++i__) {
99 for (i__ = nlp2; i__ <= i__1; ++i__) {
104 for (i__ = nlp2; i__ <= i__1; ++i__) {
109 for (i__ = 2; i__ <= i__1; ++i__) {
110 dsigma[i__] = d__[idxq[i__]];
111 u2[i__ + u2_dim1] = z__[idxq[i__]];
112 idxc[i__] = coltyp[idxq[i__]];
115 F77_FUNC(dlamrg,DLAMRG)(nl, nr, &dsigma[2], &c__1, &c__1, &idx[2]);
118 for (i__ = 2; i__ <= i__1; ++i__) {
120 d__[i__] = dsigma[idxi];
121 z__[i__] = u2[idxi + u2_dim1];
122 coltyp[i__] = idxc[idxi];
125 eps = GMX_DOUBLE_EPS;
126 d__1 = fabs(*alpha), d__2 = fabs(*beta);
127 tol = (d__1 > d__2) ? d__1 : d__2;
129 tol = eps * 8. * ((d__2 > tol) ? d__2 : tol);
134 for (j = 2; j <= i__1; ++j) {
135 if (fabs(z__[j]) <= tol) {
155 if (fabs(z__[j]) <= tol) {
162 if (fabs(d__[j] - d__[jprev]) <= tol) {
167 tau = F77_FUNC(dlapy2,DLAPY2)(&c__, &s);
173 idxjp = idxq[idx[jprev] + 1];
174 idxj = idxq[idx[j] + 1];
181 F77_FUNC(drot,DROT)(&n, &u[idxjp * u_dim1 + 1], &c__1, &u[idxj * u_dim1 + 1], &
183 F77_FUNC(drot,DROT)(&m, &vt[idxjp + vt_dim1], ldvt, &vt[idxj + vt_dim1], ldvt, &
185 if (coltyp[j] != coltyp[jprev]) {
194 u2[*k + u2_dim1] = z__[jprev];
195 dsigma[*k] = d__[jprev];
204 u2[*k + u2_dim1] = z__[jprev];
205 dsigma[*k] = d__[jprev];
210 for (j = 1; j <= 4; ++j) {
214 for (j = 2; j <= i__1; ++j) {
220 psm[1] = ctot[0] + 2;
221 psm[2] = psm[1] + ctot[1];
222 psm[3] = psm[2] + ctot[2];
225 for (j = 2; j <= i__1; ++j) {
228 idxc[psm[ct - 1]] = j;
233 for (j = 2; j <= i__1; ++j) {
236 idxj = idxq[idx[idxp[idxc[j]]] + 1];
240 F77_FUNC(dcopy,DCOPY)(&n, &u[idxj * u_dim1 + 1], &c__1, &u2[j * u2_dim1 + 1], &c__1);
241 F77_FUNC(dcopy,DCOPY)(&m, &vt[idxj + vt_dim1], ldvt, &vt2[j + vt2_dim1], ldvt2);
246 if (fabs(dsigma[2]) <= hlftol) {
250 z__[1] = F77_FUNC(dlapy2,DLAPY2)(&z1, &z__[m]);
260 if (fabs(z1) <= tol) {
268 F77_FUNC(dcopy,DCOPY)(&i__1, &u2[u2_dim1 + 2], &c__1, &z__[2], &c__1);
270 F77_FUNC(dlaset,DLASET)("A", &n, &c__1, &zero, &zero, &u2[u2_offset], ldu2);
271 u2[nlp1 + u2_dim1] = 1.;
274 for (i__ = 1; i__ <= i__1; ++i__) {
275 vt[m + i__ * vt_dim1] = -s * vt[nlp1 + i__ * vt_dim1];
276 vt2[i__ * vt2_dim1 + 1] = c__ * vt[nlp1 + i__ * vt_dim1];
279 for (i__ = nlp2; i__ <= i__1; ++i__) {
280 vt2[i__ * vt2_dim1 + 1] = s * vt[m + i__ * vt_dim1];
281 vt[m + i__ * vt_dim1] = c__ * vt[m + i__ * vt_dim1];
284 F77_FUNC(dcopy,DCOPY)(&m, &vt[nlp1 + vt_dim1], ldvt, &vt2[vt2_dim1 + 1], ldvt2);
287 F77_FUNC(dcopy,DCOPY)(&m, &vt[m + vt_dim1], ldvt, &vt2[m + vt2_dim1], ldvt2);
292 F77_FUNC(dcopy,DCOPY)(&i__1, &dsigma[*k + 1], &c__1, &d__[*k + 1], &c__1);
294 F77_FUNC(dlacpy,DLACPY)("A", &n, &i__1, &u2[(*k + 1) * u2_dim1 + 1], ldu2, &u[(*k + 1)
297 F77_FUNC(dlacpy,DLACPY)("A", &i__1, &m, &vt2[*k + 1 + vt2_dim1], ldvt2, &vt[*k + 1 +
300 for (j = 1; j <= 4; ++j) {
301 coltyp[j] = ctot[j - 1];