1 /* -*- mode: c; tab-width: 4; indent-tabs-mode: m; c-basic-offset: 4 -*-
4 * This file is part of Gromacs Copyright (c) 1991-2004
5 * David van der Spoel, Erik Lindahl, University of Groningen.
7 * This file contains a subset of ARPACK functions to perform
8 * diagonalization and SVD for sparse matrices in Gromacs.
10 * The code has been translated to C to avoid being dependent on
11 * a Fotran compiler, and it has been made threadsafe by using
12 * additional workspace arrays to store data during reverse communication.
14 * You might prefer the original ARPACK library for general use, but
15 * in case you want to this version can be redistributed freely, just
16 * as the original library. However, please make clear that it is the
17 * hacked version from Gromacs so any bugs are blamed on us and not
18 * the original authors. You should also be aware that the double
19 * precision work array workd needs to be of size (3*N+4) here
20 * (4 more than the general library), and there is an extra argument
21 * iwork, which should be an integer work array of length 80.
23 * ARPACK was written by
25 * Danny Sorensen Phuong Vu
26 * Rihard Lehoucq CRPC / Rice University
27 * Dept. of Computational & Houston, Texas
39 #include "types/simple.h"
40 #include "gmx_lapack.h"
42 #include "gmx_arpack.h"
45 /* Default Fortran name mangling */
47 #define F77_FUNC(name,NAME) name ## _
53 F77_FUNC(dstqrb,DSTQRB)(int * n,
69 int l1, ii, mm, lm1, mm1, nm1;
73 int lend, jtot, lendm1, lendp1, iscale;
75 int lendsv, nmaxit, icompz;
76 double ssfmax, ssfmin,safmin,minval,safmax,anorm;
103 minval = GMX_DOUBLE_MIN;
104 safmin = minval / GMX_DOUBLE_EPS;
105 safmax = 1. / safmin;
106 ssfmax = sqrt(safmax) / 3.;
107 ssfmin = sqrt(safmin) / eps2;
111 for (j = 1; j <= i__1; ++j) {
133 for (m = l1; m <= i__1; ++m) {
138 if (tst <= sqrt(fabs(d__[m])) * sqrt(fabs(d__[m+1])) * eps) {
157 anorm =F77_FUNC(dlanst,DLANST)("i", &i__1, &d__[l], &e[l]);
162 if (anorm > ssfmax) {
165 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n,
168 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n,
170 } else if (anorm < ssfmin) {
173 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n,
176 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n,
180 if (fabs(d__[lend]) < fabs(d__[l])) {
191 for (m = l; m <= i__1; ++m) {
194 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m + 1]) + safmin) {
213 F77_FUNC(dlaev2,DLAEV2)(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s);
215 work[*n - 1 + l] = s;
218 z__[l + 1] = c__ * tst - s * z__[l];
219 z__[l] = s * tst + c__ * z__[l];
221 F77_FUNC(dlae2,DLAE2)(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2);
233 if (jtot == nmaxit) {
238 g = (d__[l + 1] - p) / (e[l] * 2.);
239 r__ =F77_FUNC(dlapy2,DLAPY2)(&g, &c_b31);
240 g = d__[m] - p + e[l] / (g + ((g>0) ? r__ : -r__ ));
248 for (i__ = mm1; i__ >= i__1; --i__) {
251 F77_FUNC(dlartg,DLARTG)(&g, &f, &c__, &s, &r__);
255 g = d__[i__ + 1] - p;
256 r__ = (d__[i__] - g) * s + c__ * 2. * b;
258 d__[i__ + 1] = g + p;
263 work[*n - 1 + i__] = -s;
271 F77_FUNC(dlasr,DLASR)("r", "v", "b", &c__1, &mm, &work[l], &work[*n - 1 + l], &
294 for (m = l; m >= i__1; --m) {
295 d__2 = fabs(e[m - 1]);
297 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m- 1]) + safmin) {
316 F77_FUNC(dlaev2,DLAEV2)(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s)
320 z__[l] = c__ * tst - s * z__[l - 1];
321 z__[l - 1] = s * tst + c__ * z__[l - 1];
323 F77_FUNC(dlae2,DLAE2)(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2);
335 if (jtot == nmaxit) {
341 g = (d__[l - 1] - p) / (e[l - 1] * 2.);
342 r__ =F77_FUNC(dlapy2,DLAPY2)(&g, &c_b31);
343 g = d__[m] - p + e[l - 1] / (g + ((g>0) ? r__ : -r__ ));
351 for (i__ = m; i__ <= i__1; ++i__) {
354 F77_FUNC(dlartg,DLARTG)(&g, &f, &c__, &s, &r__);
359 r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b;
366 work[*n - 1 + i__] = s;
374 F77_FUNC(dlasr,DLASR)("r", "v", "f", &c__1, &mm, &work[m], &work[*n - 1 + m], &
395 i__1 = lendsv - lsv + 1;
396 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv],
399 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n,
401 } else if (iscale == 2) {
402 i__1 = lendsv - lsv + 1;
403 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv],
406 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n,
414 for (i__ = 1; i__ <= i__1; ++i__) {
424 F77_FUNC(dlasrt,DLASRT)("i", n, &d__[1], info);
429 for (ii = 2; ii <= i__1; ++ii) {
434 for (j = ii; j <= i__2; ++j) {
457 F77_FUNC(dgetv0,DGETV0)(int * ido,
476 int v_dim1, v_offset, i__1;
484 v_offset = 1 + v_dim1;
498 F77_FUNC(dlarnv,DLARNV)(&idist, &iwork[1], n, &resid[1]);
504 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
520 F77_FUNC(dcopy,DCOPY)(n, &workd[*n + 1], &c__1, &resid[1], &c__1);
525 } else if (*bmat == 'I') {
526 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
534 workd[*n * 3 + 4] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
535 workd[*n * 3 + 4] = sqrt(fabs(workd[*n * 3 + 4]));
536 } else if (*bmat == 'I') {
537 workd[*n * 3 + 4] =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
539 *rnorm = workd[*n * 3 + 4];
548 F77_FUNC(dgemv,DGEMV)("T", n, &i__1, &c_b22, &v[v_offset], ldv, &workd[1], &c__1, &c_b24,
549 &workd[*n + 1], &c__1);
551 F77_FUNC(dgemv,DGEMV)("N", n, &i__1, &c_b27, &v[v_offset], ldv, &workd[*n + 1], &c__1, &
552 c_b22, &resid[1], &c__1);
555 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[*n + 1], &c__1);
560 } else if (*bmat == 'I') {
561 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
567 *rnorm =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
568 *rnorm = sqrt(fabs(*rnorm));
569 } else if (*bmat == 'I') {
570 *rnorm =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
573 if (*rnorm > workd[*n * 3 + 4] * .717f) {
580 workd[*n * 3 + 4] = *rnorm;
585 for (jj = 1; jj <= i__1; ++jj) {
605 F77_FUNC(dsapps,DSAPPS)(int * n,
622 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
626 double r__, s, a1, a2, a3, a4;
637 v_offset = 1 + v_dim1;
640 h_offset = 1 + h_dim1;
643 q_offset = 1 + q_dim1;
646 epsmch = GMX_DOUBLE_EPS;
652 F77_FUNC(dlaset,DLASET)("All", &kplusp, &kplusp, &c_b4, &c_b5, &q[q_offset], ldq);
659 for (jj = 1; jj <= i__1; ++jj) {
666 for (i__ = istart; i__ <= i__2; ++i__) {
667 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__ + 1 + (h_dim1*2)]);
668 if (h__[i__ + 1 + h_dim1] <= epsmch * big) {
669 h__[i__ + 1 + h_dim1] = 0.;
679 f = h__[istart + (h_dim1 << 1)] - shift[jj];
680 g = h__[istart + 1 + h_dim1];
681 F77_FUNC(dlartg,DLARTG)(&f, &g, &c__, &s, &r__);
683 a1 = c__ * h__[istart + (h_dim1 << 1)] + s * h__[istart + 1 +
685 a2 = c__ * h__[istart + 1 + h_dim1] + s * h__[istart + 1 + (
687 a4 = c__ * h__[istart + 1 + (h_dim1 << 1)] - s * h__[istart + 1 +
689 a3 = c__ * h__[istart + 1 + h_dim1] - s * h__[istart + (h_dim1 <<
691 h__[istart + (h_dim1 << 1)] = c__ * a1 + s * a2;
692 h__[istart + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
693 h__[istart + 1 + h_dim1] = c__ * a3 + s * a4;
696 i__2 = (i__3<kplusp) ? i__3 : kplusp;
697 for (j = 1; j <= i__2; ++j) {
698 a1 = c__ * q[j + istart * q_dim1] + s * q[j + (istart + 1) *
700 q[j + (istart + 1) * q_dim1] = -s * q[j + istart * q_dim1] +
701 c__ * q[j + (istart + 1) * q_dim1];
702 q[j + istart * q_dim1] = a1;
707 for (i__ = istart + 1; i__ <= i__2; ++i__) {
709 f = h__[i__ + h_dim1];
710 g = s * h__[i__ + 1 + h_dim1];
712 h__[i__ + 1 + h_dim1] = c__ * h__[i__ + 1 + h_dim1];
713 F77_FUNC(dlartg,DLARTG)(&f, &g, &c__, &s, &r__);
721 h__[i__ + h_dim1] = r__;
723 a1 = c__ * h__[i__ + (h_dim1 << 1)] + s * h__[i__ + 1 +
725 a2 = c__ * h__[i__ + 1 + h_dim1] + s * h__[i__ + 1 + (h_dim1
727 a3 = c__ * h__[i__ + 1 + h_dim1] - s * h__[i__ + (h_dim1 << 1)
729 a4 = c__ * h__[i__ + 1 + (h_dim1 << 1)] - s * h__[i__ + 1 +
732 h__[i__ + (h_dim1 << 1)] = c__ * a1 + s * a2;
733 h__[i__ + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
734 h__[i__ + 1 + h_dim1] = c__ * a3 + s * a4;
737 i__3 = (i__4<kplusp) ? i__4 : kplusp;
738 for (j = 1; j <= i__3; ++j) {
739 a1 = c__ * q[j + i__ * q_dim1] + s * q[j + (i__ + 1) *
741 q[j + (i__ + 1) * q_dim1] = -s * q[j + i__ * q_dim1] +
742 c__ * q[j + (i__ + 1) * q_dim1];
743 q[j + i__ * q_dim1] = a1;
752 if (h__[iend + h_dim1] < 0.) {
753 h__[iend + h_dim1] = -h__[iend + h_dim1];
754 F77_FUNC(dscal,DSCAL)(&kplusp, &c_b14, &q[iend * q_dim1 + 1], &c__1);
762 for (i__ = itop; i__ <= i__2; ++i__) {
763 if (h__[i__ + 1 + h_dim1] > 0.) {
774 for (i__ = itop; i__ <= i__1; ++i__) {
775 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__+ 1 + (h_dim1*2)]);
776 if (h__[i__ + 1 + h_dim1] <= epsmch * big) {
777 h__[i__ + 1 + h_dim1] = 0.;
782 if (h__[*kev + 1 + h_dim1] > 0.) {
783 F77_FUNC(dgemv,DGEMV)("N", n, &kplusp, &c_b5, &v[v_offset], ldv, &q[(*kev + 1) *
784 q_dim1 + 1], &c__1, &c_b4, &workd[*n + 1], &c__1);
788 for (i__ = 1; i__ <= i__1; ++i__) {
789 i__2 = kplusp - i__ + 1;
790 F77_FUNC(dgemv,DGEMV)("N", n, &i__2, &c_b5, &v[v_offset], ldv, &q[(*kev - i__ + 1) *
791 q_dim1 + 1], &c__1, &c_b4, &workd[1], &c__1);
792 F77_FUNC(dcopy,DCOPY)(n, &workd[1], &c__1, &v[(kplusp - i__ + 1) * v_dim1 + 1], &
797 F77_FUNC(dlacpy,DLACPY)("All", n, kev, &v[(*np + 1) * v_dim1 + 1], ldv, &v[v_offset], ldv);
799 if (h__[*kev + 1 + h_dim1] > 0.) {
800 F77_FUNC(dcopy,DCOPY)(n, &workd[*n + 1], &c__1, &v[(*kev + 1) * v_dim1 + 1], &c__1);
803 F77_FUNC(dscal,DSCAL)(n, &q[kplusp + *kev * q_dim1], &resid[1], &c__1);
804 if (h__[*kev + 1 + h_dim1] > 0.) {
805 F77_FUNC(daxpy,DAXPY)(n, &h__[*kev + 1 + h_dim1], &v[(*kev + 1) * v_dim1 + 1], &c__1,
819 F77_FUNC(dsortr,DSORTR)(const char * which,
834 if (!strncmp(which, "SA", 2)) {
841 for (i__ = igap; i__ <= i__1; ++i__) {
849 if (x1[j] < x1[j + igap]) {
851 x1[j] = x1[j + igap];
855 x2[j] = x2[j + igap];
869 } else if (!strncmp(which, "SM", 2)) {
876 for (i__ = igap; i__ <= i__1; ++i__) {
884 if (fabs(x1[j]) < fabs(x1[j + igap])) {
886 x1[j] = x1[j + igap];
890 x2[j] = x2[j + igap];
904 } else if (!strncmp(which, "LA", 2)) {
911 for (i__ = igap; i__ <= i__1; ++i__) {
919 if (x1[j] > x1[j + igap]) {
921 x1[j] = x1[j + igap];
925 x2[j] = x2[j + igap];
939 } else if (!strncmp(which, "LM", 2)) {
947 for (i__ = igap; i__ <= i__1; ++i__) {
955 if (fabs(x1[j]) > fabs(x1[j + igap])) {
957 x1[j] = x1[j + igap];
961 x2[j] = x2[j + igap];
985 F77_FUNC(dsesrt,DSESRT)(const char * which,
993 int a_dim1, a_offset, i__1;
1000 a_offset = 1 + a_dim1 * 0;
1005 if (!strncmp(which, "SA", 2)) {
1012 for (i__ = igap; i__ <= i__1; ++i__) {
1020 if (x[j] < x[j + igap]) {
1025 F77_FUNC(dswap,DSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1026 a_dim1 + 1], &c__1);
1039 } else if (!strncmp(which, "SM", 2)) {
1046 for (i__ = igap; i__ <= i__1; ++i__) {
1054 if (fabs(x[j]) < fabs(x[j + igap])) {
1059 F77_FUNC(dswap,DSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1060 a_dim1 + 1], &c__1);
1073 } else if (!strncmp(which, "LA", 2)) {
1080 for (i__ = igap; i__ <= i__1; ++i__) {
1088 if (x[j] > x[j + igap]) {
1093 F77_FUNC(dswap,DSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1094 a_dim1 + 1], &c__1);
1107 } else if (!strncmp(which, "LM", 2)) {
1114 for (i__ = igap; i__ <= i__1; ++i__) {
1122 if (fabs(x[j]) > fabs(x[j + igap])) {
1127 F77_FUNC(dswap,DSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1128 a_dim1 + 1], &c__1);
1151 F77_FUNC(dsgets,DSGETS)(int * ishift,
1167 if (!strncmp(which, "BE", 2)) {
1169 F77_FUNC(dsortr,DSORTR)("LA", &c__1, &i__1, &ritz[1], &bounds[1]);
1172 i__1 = (kevd2<*np) ? kevd2 : *np;
1173 i__2 = (kevd2>*np) ? kevd2 : *np;
1174 F77_FUNC(dswap,DSWAP)(&i__1, &ritz[1], &c__1,
1175 &ritz[i__2 + 1], &c__1);
1176 i__1 = (kevd2<*np) ? kevd2 : *np;
1177 i__2 = (kevd2>*np) ? kevd2 : *np;
1178 F77_FUNC(dswap,DSWAP)(&i__1, &bounds[1], &c__1,
1179 &bounds[i__2 + 1], &c__1);
1184 F77_FUNC(dsortr,DSORTR)(which, &c__1, &i__1, &ritz[1], &bounds[1]);
1187 if (*ishift == 1 && *np > 0) {
1189 F77_FUNC(dsortr,DSORTR)("SM", &c__1, np, &bounds[1], &ritz[1]);
1190 F77_FUNC(dcopy,DCOPY)(np, &ritz[1], &c__1, &shifts[1], &c__1);
1200 F77_FUNC(dsconv,DSCONV)(int * n,
1216 eps23 = GMX_DOUBLE_EPS;
1217 eps23 = pow(eps23, c_b3);
1221 for (i__ = 1; i__ <= i__1; ++i__) {
1224 d__3 = fabs(ritz[i__]);
1225 temp = (d__2 > d__3) ? d__2 : d__3;
1226 if (bounds[i__] <= *tol * temp) {
1236 F77_FUNC(dseigt,DSEIGT)(double * rnorm,
1246 int h_dim1, h_offset, i__1;
1255 h_offset = 1 + h_dim1;
1258 F77_FUNC(dcopy,DCOPY)(n, &h__[(h_dim1 << 1) + 1], &c__1, &eig[1], &c__1);
1260 F77_FUNC(dcopy,DCOPY)(&i__1, &h__[h_dim1 + 2], &c__1, &workl[1], &c__1);
1261 F77_FUNC(dstqrb,DSTQRB)(n, &eig[1], &workl[1], &bounds[1], &workl[*n + 1], ierr);
1267 for (k = 1; k <= i__1; ++k) {
1268 bounds[k] = *rnorm * fabs(bounds[k]);
1281 F77_FUNC(dsaitr,DSAITR)(int * ido,
1305 int h_dim1, h_offset, v_dim1, v_offset, i__1;
1309 double safmin,minval;
1315 v_offset = 1 + v_dim1;
1318 h_offset = 1 + h_dim1;
1322 minval = GMX_DOUBLE_MIN;
1323 safmin = minval / GMX_DOUBLE_EPS;
1336 iwork[9] = iwork[8] + *n;
1337 iwork[10] = iwork[9] + *n;
1340 if (iwork[5] == 1) {
1343 if (iwork[6] == 1) {
1346 if (iwork[2] == 1) {
1349 if (iwork[3] == 1) {
1352 if (iwork[4] == 1) {
1369 F77_FUNC(dgetv0,DGETV0)(ido, bmat, &iwork[11], &c__0, n, &iwork[12], &v[v_offset], ldv,
1370 &resid[1], rnorm, &ipntr[1], &workd[1], &iwork[21], &iwork[7]);
1376 if (iwork[11] <= 3) {
1380 *info = iwork[12] - 1;
1387 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &v[iwork[12] * v_dim1 + 1], &c__1);
1388 if (*rnorm >= safmin) {
1389 temp1 = 1. / *rnorm;
1390 F77_FUNC(dscal,DSCAL)(n, &temp1, &v[iwork[12] * v_dim1 + 1], &c__1);
1391 F77_FUNC(dscal,DSCAL)(n, &temp1, &workd[iwork[8]], &c__1);
1394 F77_FUNC(dlascl,DLASCL)("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &v[iwork[12] *
1395 v_dim1 + 1], n, &infol);
1396 F77_FUNC(dlascl,DLASCL)("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &workd[iwork[
1401 F77_FUNC(dcopy,DCOPY)(n, &v[iwork[12] * v_dim1 + 1], &c__1, &workd[iwork[10]], &c__1);
1402 ipntr[1] = iwork[10];
1403 ipntr[2] = iwork[9];
1404 ipntr[3] = iwork[8];
1413 F77_FUNC(dcopy,DCOPY)(n, &workd[iwork[9]], &c__1, &resid[1], &c__1);
1420 ipntr[1] = iwork[9];
1421 ipntr[2] = iwork[8];
1425 } else if (*bmat == 'I') {
1426 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1435 workd[*n * 3 + 3] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[iwork[10]], &
1437 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
1438 } else if (*bmat == 'G') {
1439 workd[*n * 3 + 3] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &
1441 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
1442 } else if (*bmat == 'I') {
1443 workd[*n * 3 + 3] =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
1447 F77_FUNC(dgemv,DGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]]
1448 , &c__1, &c_b42, &workd[iwork[9]], &c__1);
1449 } else if (*mode == 2) {
1450 F77_FUNC(dgemv,DGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[10]
1451 ], &c__1, &c_b42, &workd[iwork[9]], &c__1);
1454 F77_FUNC(dgemv,DGEMV)("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
1455 c__1, &c_b18, &resid[1], &c__1);
1457 h__[iwork[12] + (h_dim1 << 1)] = workd[iwork[9] + iwork[12] - 1];
1458 if (iwork[12] == 1 || iwork[4] == 1) {
1459 h__[iwork[12] + h_dim1] = 0.;
1461 h__[iwork[12] + h_dim1] = *rnorm;
1468 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
1469 ipntr[1] = iwork[9];
1470 ipntr[2] = iwork[8];
1474 } else if (*bmat == 'I') {
1475 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1482 *rnorm =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1483 *rnorm = sqrt(fabs(*rnorm));
1484 } else if (*bmat == 'I') {
1485 *rnorm =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
1488 if (*rnorm > workd[*n * 3 + 3] * .717f) {
1494 F77_FUNC(dgemv,DGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]], &
1495 c__1, &c_b42, &workd[iwork[9]], &c__1);
1497 F77_FUNC(dgemv,DGEMV)("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
1498 c__1, &c_b18, &resid[1], &c__1);
1500 if (iwork[12] == 1 || iwork[4] == 1) {
1501 h__[iwork[12] + h_dim1] = 0.;
1503 h__[iwork[12] + (h_dim1 << 1)] += workd[iwork[9] + iwork[12] - 1];
1507 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
1508 ipntr[1] = iwork[9];
1509 ipntr[2] = iwork[8];
1513 } else if (*bmat == 'I') {
1514 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1520 workd[*n * 3 + 2] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &
1522 workd[*n * 3 + 2] = sqrt(fabs(workd[*n * 3 + 2]));
1523 } else if (*bmat == 'I') {
1524 workd[*n * 3 + 2] =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
1528 if (workd[*n * 3 + 2] > *rnorm * .717f) {
1530 *rnorm = workd[*n * 3 + 2];
1534 *rnorm = workd[*n * 3 + 2];
1536 if (iwork[1] <= 1) {
1541 for (jj = 1; jj <= i__1; ++jj) {
1552 if (h__[iwork[12] + h_dim1] < 0.) {
1553 h__[iwork[12] + h_dim1] = -h__[iwork[12] + h_dim1];
1554 if (iwork[12] < *k + *np) {
1555 F77_FUNC(dscal,DSCAL)(n, &c_b50, &v[(iwork[12] + 1) * v_dim1 + 1], &c__1);
1557 F77_FUNC(dscal,DSCAL)(n, &c_b50, &resid[1], &c__1);
1562 if (iwork[12] > *k + *np) {
1581 F77_FUNC(dsaup2,DSAUP2)(int * ido,
1611 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
1630 v_offset = 1 + v_dim1;
1633 h_offset = 1 + h_dim1;
1636 q_offset = 1 + q_dim1;
1640 eps23 = GMX_DOUBLE_EPS;
1641 eps23 = pow(eps23, c_b3);
1653 iwork[7] = iwork[9] + iwork[10];
1671 if (iwork[2] == 1) {
1672 F77_FUNC(dgetv0,DGETV0)(ido, bmat, &c__1, &iwork[3], n, &c__1, &v[v_offset], ldv, &
1673 resid[1], &workd[*n * 3 + 1], &ipntr[1], &workd[1], &iwork[41]
1680 if (workd[*n * 3 + 1] == 0.) {
1689 if (iwork[4] == 1) {
1693 if (iwork[5] == 1) {
1697 if (iwork[1] == 1) {
1701 F77_FUNC(dsaitr,DSAITR)(ido, bmat, n, &c__0, &iwork[9], mode, &resid[1], &workd[*n * 3 +
1702 1], &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
1726 F77_FUNC(dsaitr,DSAITR)(ido, bmat, n, nev, np, mode, &resid[1], &workd[*n * 3 + 1],
1727 &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
1743 F77_FUNC(dseigt,DSEIGT)(&workd[*n * 3 + 1], &iwork[7], &h__[h_offset], ldh, &ritz[1], &
1744 bounds[1], &workl[1], &ierr);
1751 F77_FUNC(dcopy,DCOPY)(&iwork[7], &ritz[1], &c__1, &workl[iwork[7] + 1], &c__1);
1752 F77_FUNC(dcopy,DCOPY)(&iwork[7], &bounds[1], &c__1, &workl[(iwork[7] << 1) + 1], &c__1);
1756 F77_FUNC(dsgets,DSGETS)(ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
1758 F77_FUNC(dcopy,DCOPY)(nev, &bounds[*np + 1], &c__1, &workl[*np + 1], &c__1);
1759 F77_FUNC(dsconv,DSCONV)(nev, &ritz[*np + 1], &workl[*np + 1], tol, &iwork[8]);
1763 for (j = 1; j <= i__1; ++j) {
1764 if (bounds[j] == 0.) {
1770 if (iwork[8] >= iwork[9] || iwork[6] > *mxiter || *np == 0) {
1772 if (!strncmp(which, "BE", 2)) {
1774 strncpy(wprime, "SA",2);
1775 F77_FUNC(dsortr,DSORTR)(wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
1777 nevm2 = *nev - nevd2;
1779 i__1 = (nevd2 < *np) ? nevd2 : *np;
1780 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np + 1;
1781 F77_FUNC(dswap,DSWAP)(&i__1, &ritz[nevm2 + 1], &c__1,
1782 &ritz[((i__2>i__3) ? i__2 : i__3)],
1784 i__1 = (nevd2 < *np) ? nevd2 : *np;
1785 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np;
1786 F77_FUNC(dswap,DSWAP)(&i__1, &bounds[nevm2 + 1], &c__1,
1787 &bounds[((i__2>i__3) ? i__2 : i__3) + 1],
1793 if (!strncmp(which, "LM", 2)) {
1794 strncpy(wprime, "SM", 2);
1796 if (!strncmp(which, "SM", 2)) {
1797 strncpy(wprime, "LM", 2);
1799 if (!strncmp(which, "LA", 2)) {
1800 strncpy(wprime, "SA", 2);
1802 if (!strncmp(which, "SA", 2)) {
1803 strncpy(wprime, "LA", 2);
1806 F77_FUNC(dsortr,DSORTR)(wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
1811 for (j = 1; j <= i__1; ++j) {
1813 d__3 = fabs(ritz[j]);
1814 temp = (d__2>d__3) ? d__2 : d__3;
1818 strncpy(wprime, "LA",2);
1819 F77_FUNC(dsortr,DSORTR)(wprime, &c__1, &iwork[9], &bounds[1], &ritz[1]);
1822 for (j = 1; j <= i__1; ++j) {
1824 d__3 = fabs(ritz[j]);
1825 temp = (d__2>d__3) ? d__2 : d__3;
1829 if (!strncmp(which, "BE", 2)) {
1831 strncpy(wprime, "LA", 2);
1832 F77_FUNC(dsortr,DSORTR)(wprime, &c__1, &iwork[8], &ritz[1], &bounds[1]);
1835 F77_FUNC(dsortr,DSORTR)(which, &c__1, &iwork[8], &ritz[1], &bounds[1]);
1839 h__[h_dim1 + 1] = workd[*n * 3 + 1];
1842 if (iwork[6] > *mxiter && iwork[8] < *nev) {
1845 if (*np == 0 && iwork[8] < iwork[9]) {
1852 } else if (iwork[8] < *nev && *ishift == 1) {
1854 i__1 = iwork[8], i__2 = *np / 2;
1855 *nev += (i__1 < i__2) ? i__1 : i__2;
1856 if (*nev == 1 && iwork[7] >= 6) {
1857 *nev = iwork[7] / 2;
1858 } else if (*nev == 1 && iwork[7] > 2) {
1861 *np = iwork[7] - *nev;
1864 if (nevbef < *nev) {
1865 F77_FUNC(dsgets,DSGETS)(ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
1883 F77_FUNC(dcopy,DCOPY)(np, &workl[1], &c__1, &ritz[1], &c__1);
1886 F77_FUNC(dsapps,DSAPPS)(n, nev, np, &ritz[1], &v[v_offset], ldv, &h__[h_offset], ldh, &
1887 resid[1], &q[q_offset], ldq, &workd[1]);
1891 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[*n + 1], &c__1);
1897 } else if (*bmat == 'I') {
1898 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
1904 workd[*n * 3 + 1] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
1905 workd[*n * 3 + 1] = sqrt(fabs(workd[*n * 3 + 1]));
1906 } else if (*bmat == 'I') {
1907 workd[*n * 3 + 1] =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
1929 F77_FUNC(dsaupd,DSAUPD)(int * ido,
1947 int v_dim1, v_offset, i__1, i__2;
1953 v_offset = 1 + v_dim1;
1964 iwork[5] = iparam[1];
1965 iwork[10] = iparam[3];
1966 iwork[12] = iparam[4];
1969 iwork[11] = iparam[7];
1974 } else if (*nev <= 0) {
1976 } else if (*ncv <= *nev || *ncv > *n) {
1981 iwork[15] = *ncv - *nev;
1983 if (iwork[10] <= 0) {
1986 if (strncmp(which,"LM",2) && strncmp(which,"SM",2) &&
1987 strncmp(which,"LA",2) && strncmp(which,"SA",2) &&
1988 strncmp(which,"BE",2)) {
1991 if (*bmat != 'I' && *bmat != 'G') {
1996 if (*lworkl < i__1 * i__1 + (*ncv << 3)) {
1999 if (iwork[11] < 1 || iwork[11] > 5) {
2001 } else if (iwork[11] == 1 && *bmat == 'G') {
2003 } else if (iwork[5] < 0 || iwork[5] > 1) {
2005 } else if (*nev == 1 && !strncmp(which, "BE", 2)) {
2009 if (iwork[2] != 0) {
2015 if (iwork[12] <= 0) {
2019 *tol = GMX_DOUBLE_EPS;
2022 iwork[15] = *ncv - *nev;
2025 i__1 = i__2 * i__2 + (*ncv << 3);
2026 for (j = 1; j <= i__1; ++j) {
2033 iwork[16] = iwork[3] + (iwork[8] << 1);
2034 iwork[1] = iwork[16] + *ncv;
2035 iwork[4] = iwork[1] + *ncv;
2037 iwork[7] = iwork[4] + i__1 * i__1;
2038 iwork[14] = iwork[7] + *ncv * 3;
2040 ipntr[4] = iwork[14];
2041 ipntr[5] = iwork[3];
2042 ipntr[6] = iwork[16];
2043 ipntr[7] = iwork[1];
2044 ipntr[11] = iwork[7];
2047 F77_FUNC(dsaup2,DSAUP2)(ido, bmat, n, which, &iwork[13], &iwork[15], tol, &resid[1], &
2048 iwork[11], &iwork[6], &iwork[5], &iwork[10], &v[v_offset], ldv, &
2049 workl[iwork[3]], &iwork[8], &workl[iwork[16]], &workl[iwork[1]], &
2050 workl[iwork[4]], &iwork[9], &workl[iwork[7]], &ipntr[1], &workd[1]
2051 , &iwork[21], info);
2054 iparam[8] = iwork[15];
2060 iparam[3] = iwork[10];
2061 iparam[5] = iwork[15];
2079 F77_FUNC(dseupd,DSEUPD)(int * rvec,
2080 const char * howmny,
2105 int v_dim1, v_offset, z_dim1, z_offset, i__1;
2106 double d__1, d__2, d__3;
2108 int j, k, ih, iq, iw, ibd, ihb, ihd, ldh, ilg, ldq, ism, irz;
2120 double thres1=0, thres2=0;
2124 int leftptr, rghtptr;
2130 z_offset = 1 + z_dim1;
2135 v_offset = 1 + v_dim1;
2159 if (*ncv <= *nev || *ncv > *n) {
2162 if (strncmp(which,"LM",2) && strncmp(which,"SM",2) &&
2163 strncmp(which,"LA",2) && strncmp(which,"SA",2) &&
2164 strncmp(which,"BE",2)) {
2167 if (*bmat != 'I' && *bmat != 'G') {
2170 if (*howmny != 'A' && *howmny != 'P' &&
2171 *howmny != 'S' && *rvec) {
2174 if (*rvec && *howmny == 'S') {
2178 if (*rvec && *lworkl < i__1 * i__1 + (*ncv << 3)) {
2182 if (mode == 1 || mode == 2) {
2183 strncpy(type__, "REGULR",6);
2184 } else if (mode == 3) {
2185 strncpy(type__, "SHIFTI",6);
2186 } else if (mode == 4) {
2187 strncpy(type__, "BUCKLE",6);
2188 } else if (mode == 5) {
2189 strncpy(type__, "CAYLEY",6);
2193 if (mode == 1 && *bmat == 'G') {
2196 if (*nev == 1 && !strncmp(which, "BE",2)) {
2213 iw = iq + ldh * *ncv;
2214 next = iw + (*ncv << 1);
2220 irz = ipntr[11] + *ncv;
2224 eps23 = GMX_DOUBLE_EPS;
2225 eps23 = pow(eps23, c_b21);
2230 } else if (*bmat == 'G') {
2231 bnorm2 =F77_FUNC(dnrm2,DNRM2)(n, &workd[1], &c__1);
2236 if (!strncmp(which,"LM",2) || !strncmp(which,"SM",2) ||
2237 !strncmp(which,"LA",2) || !strncmp(which,"SA",2)) {
2239 } else if (!strncmp(which,"BE",2)) {
2242 ism = (*nev>nconv) ? *nev : nconv;
2245 thres1 = workl[ism];
2246 thres2 = workl[ilg];
2254 for (j = 0; j <= i__1; ++j) {
2256 if (!strncmp(which,"LM",2)) {
2257 if (fabs(workl[irz + j]) >= fabs(thres1)) {
2259 d__3 = fabs(workl[irz + j]);
2260 tempbnd = (d__2>d__3) ? d__2 : d__3;
2261 if (workl[ibd + j] <= *tol * tempbnd) {
2265 } else if (!strncmp(which,"SM",2)) {
2266 if (fabs(workl[irz + j]) <= fabs(thres1)) {
2268 d__3 = fabs(workl[irz + j]);
2269 tempbnd = (d__2>d__3) ? d__2 : d__3;
2270 if (workl[ibd + j] <= *tol * tempbnd) {
2274 } else if (!strncmp(which,"LA",2)) {
2275 if (workl[irz + j] >= thres1) {
2277 d__3 = fabs(workl[irz + j]);
2278 tempbnd = (d__2>d__3) ? d__2 : d__3;
2279 if (workl[ibd + j] <= *tol * tempbnd) {
2283 } else if (!strncmp(which,"SA",2)) {
2284 if (workl[irz + j] <= thres1) {
2286 d__3 = fabs(workl[irz + j]);
2287 tempbnd = (d__2>d__3) ? d__2 : d__3;
2288 if (workl[ibd + j] <= *tol * tempbnd) {
2292 } else if (!strncmp(which,"BE",2)) {
2293 if (workl[irz + j] <= thres1 || workl[irz + j] >= thres2) {
2295 d__3 = fabs(workl[irz + j]);
2296 tempbnd = (d__2>d__3) ? d__2 : d__3;
2297 if (workl[ibd + j] <= *tol * tempbnd) {
2302 if (j + 1 > nconv) {
2303 reord = select[j + 1] || reord;
2305 if (select[j + 1]) {
2311 F77_FUNC(dcopy,DCOPY)(&i__1, &workl[ih + 1], &c__1, &workl[ihb], &c__1);
2312 F77_FUNC(dcopy,DCOPY)(ncv, &workl[ih + ldh], &c__1, &workl[ihd], &c__1);
2314 F77_FUNC(dsteqr,DSTEQR)("Identity", ncv, &workl[ihd], &workl[ihb], &workl[iq], &ldq, &
2333 if (select[leftptr]) {
2337 } else if (! select[rghtptr]) {
2343 temp = workl[ihd + leftptr - 1];
2344 workl[ihd + leftptr - 1] = workl[ihd + rghtptr - 1];
2345 workl[ihd + rghtptr - 1] = temp;
2346 F77_FUNC(dcopy,DCOPY)(ncv, &workl[iq + *ncv * (leftptr - 1)], &c__1, &workl[
2348 F77_FUNC(dcopy,DCOPY)(ncv, &workl[iq + *ncv * (rghtptr - 1)], &c__1, &workl[
2349 iq + *ncv * (leftptr - 1)], &c__1);
2350 F77_FUNC(dcopy,DCOPY)(ncv, &workl[iw], &c__1, &workl[iq + *ncv * (rghtptr -
2357 if (leftptr < rghtptr) {
2365 F77_FUNC(dcopy,DCOPY)(&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
2369 F77_FUNC(dcopy,DCOPY)(&nconv, &workl[ritz], &c__1, &d__[1], &c__1);
2370 F77_FUNC(dcopy,DCOPY)(ncv, &workl[ritz], &c__1, &workl[ihd], &c__1);
2373 if (!strncmp(type__, "REGULR",6)) {
2376 F77_FUNC(dsesrt,DSESRT)("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
2378 F77_FUNC(dcopy,DCOPY)(ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
2383 F77_FUNC(dcopy,DCOPY)(ncv, &workl[ihd], &c__1, &workl[iw], &c__1);
2384 if (!strncmp(type__, "SHIFTI", 6)) {
2386 for (k = 1; k <= i__1; ++k) {
2387 workl[ihd + k - 1] = 1. / workl[ihd + k - 1] + *sigma;
2389 } else if (!strncmp(type__, "BUCKLE",6)) {
2391 for (k = 1; k <= i__1; ++k) {
2392 workl[ihd + k - 1] = *sigma * workl[ihd + k - 1] / (workl[ihd
2395 } else if (!strncmp(type__, "CAYLEY",6)) {
2397 for (k = 1; k <= i__1; ++k) {
2398 workl[ihd + k - 1] = *sigma * (workl[ihd + k - 1] + 1.) / (
2399 workl[ihd + k - 1] - 1.);
2403 F77_FUNC(dcopy,DCOPY)(&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
2404 F77_FUNC(dsortr,DSORTR)("LA", &c__1, &nconv, &workl[ihd], &workl[iw]);
2406 F77_FUNC(dsesrt,DSESRT)("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
2408 F77_FUNC(dcopy,DCOPY)(ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
2409 d__1 = bnorm2 / rnorm;
2410 F77_FUNC(dscal,DSCAL)(ncv, &d__1, &workl[ihb], &c__1);
2411 F77_FUNC(dsortr,DSORTR)("LA", &c__1, &nconv, &d__[1], &workl[ihb]);
2416 if (*rvec && *howmny == 'A') {
2418 F77_FUNC(dgeqr2,DGEQR2)(ncv, &nconv, &workl[iq], &ldq, &workl[iw + *ncv], &workl[ihb],
2421 F77_FUNC(dorm2r,DORM2R)("Right", "Notranspose", n, ncv, &nconv, &workl[iq], &ldq, &
2422 workl[iw + *ncv], &v[v_offset], ldv, &workd[*n + 1], &ierr);
2423 F77_FUNC(dlacpy,DLACPY)("All", n, &nconv, &v[v_offset], ldv, &z__[z_offset], ldz);
2426 for (j = 1; j <= i__1; ++j) {
2427 workl[ihb + j - 1] = 0.;
2429 workl[ihb + *ncv - 1] = 1.;
2430 F77_FUNC(dorm2r,DORM2R)("Left", "Transpose", ncv, &c__1, &nconv, &workl[iq], &ldq, &
2431 workl[iw + *ncv], &workl[ihb], ncv, &temp, &ierr);
2433 } else if (*rvec && *howmny == 'S') {
2437 if (!strncmp(type__, "REGULR",6) && *rvec) {
2440 for (j = 1; j <= i__1; ++j) {
2441 workl[ihb + j - 1] = rnorm * fabs(workl[ihb + j - 1]);
2444 } else if (strncmp(type__, "REGULR",6) && *rvec) {
2446 F77_FUNC(dscal,DSCAL)(ncv, &bnorm2, &workl[ihb], &c__1);
2447 if (!strncmp(type__, "SHIFTI",6)) {
2450 for (k = 1; k <= i__1; ++k) {
2451 d__2 = workl[iw + k - 1];
2452 workl[ihb + k - 1] = fabs(workl[ihb + k - 1])/(d__2 * d__2);
2455 } else if (!strncmp(type__, "BUCKLE",6)) {
2458 for (k = 1; k <= i__1; ++k) {
2459 d__2 = workl[iw + k - 1] - 1.;
2460 workl[ihb + k - 1] = *sigma * fabs(workl[ihb + k - 1])/(d__2 * d__2);
2463 } else if (!strncmp(type__, "CAYLEY",6)) {
2466 for (k = 1; k <= i__1; ++k) {
2467 workl[ihb + k - 1] = fabs(workl[ihb + k - 1] / workl[iw + k - 1] * (workl[iw + k - 1] - 1.));
2475 if (*rvec && (!strncmp(type__, "SHIFTI",6) || !strncmp(type__, "CAYLEY",6))) {
2478 for (k = 0; k <= i__1; ++k) {
2479 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / workl[iw + k];
2482 } else if (*rvec && !strncmp(type__, "BUCKLE", 6)) {
2485 for (k = 0; k <= i__1; ++k) {
2486 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / (workl[iw + k] -
2492 if (strncmp(type__, "REGULR",6)) {
2493 F77_FUNC(dger,DGER)(n, &nconv, &c_b102, &resid[1], &c__1, &workl[iw], &c__1, &z__[
2507 /* Selected single precision arpack routines */
2511 F77_FUNC(sstqrb,SSTQRB)(int * n,
2525 int i__, j, k, l, m;
2527 int l1, ii, mm, lm1, mm1, nm1;
2528 float rt1, rt2, eps;
2531 int lend, jtot, lendm1, lendp1, iscale;
2533 int lendsv, nmaxit, icompz;
2534 float ssfmax, ssfmin,safmin,minval,safmax,anorm;
2557 eps = GMX_FLOAT_EPS;
2561 minval = GMX_FLOAT_MIN;
2562 safmin = minval / GMX_FLOAT_EPS;
2563 safmax = 1. / safmin;
2564 ssfmax = sqrt(safmax) / 3.;
2565 ssfmin = sqrt(safmin) / eps2;
2569 for (j = 1; j <= i__1; ++j) {
2591 for (m = l1; m <= i__1; ++m) {
2596 if (tst <= sqrt(fabs(d__[m])) * sqrt(fabs(d__[m+1])) * eps) {
2614 i__1 = lend - l + 1;
2615 anorm =F77_FUNC(slanst,SLANST)("i", &i__1, &d__[l], &e[l]);
2620 if (anorm > ssfmax) {
2622 i__1 = lend - l + 1;
2623 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n,
2626 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n,
2628 } else if (anorm < ssfmin) {
2630 i__1 = lend - l + 1;
2631 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n,
2634 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n,
2638 if (fabs(d__[lend]) < fabs(d__[l])) {
2649 for (m = l; m <= i__1; ++m) {
2652 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m + 1]) + safmin) {
2671 F77_FUNC(slaev2,SLAEV2)(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s);
2673 work[*n - 1 + l] = s;
2676 z__[l + 1] = c__ * tst - s * z__[l];
2677 z__[l] = s * tst + c__ * z__[l];
2679 F77_FUNC(slae2,SLAE2)(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2);
2691 if (jtot == nmaxit) {
2696 g = (d__[l + 1] - p) / (e[l] * 2.);
2697 r__ =F77_FUNC(slapy2,SLAPY2)(&g, &c_b31);
2698 g = d__[m] - p + e[l] / (g + ((g>0) ? r__ : -r__ ));
2706 for (i__ = mm1; i__ >= i__1; --i__) {
2709 F77_FUNC(slartg,SLARTG)(&g, &f, &c__, &s, &r__);
2713 g = d__[i__ + 1] - p;
2714 r__ = (d__[i__] - g) * s + c__ * 2. * b;
2716 d__[i__ + 1] = g + p;
2721 work[*n - 1 + i__] = -s;
2729 F77_FUNC(slasr,SLASR)("r", "v", "b", &c__1, &mm, &work[l], &work[*n - 1 + l], &
2752 for (m = l; m >= i__1; --m) {
2753 d__2 = fabs(e[m - 1]);
2755 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m- 1]) + safmin) {
2774 F77_FUNC(slaev2,SLAEV2)(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s)
2778 z__[l] = c__ * tst - s * z__[l - 1];
2779 z__[l - 1] = s * tst + c__ * z__[l - 1];
2781 F77_FUNC(slae2,SLAE2)(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2);
2793 if (jtot == nmaxit) {
2799 g = (d__[l - 1] - p) / (e[l - 1] * 2.);
2800 r__ =F77_FUNC(slapy2,SLAPY2)(&g, &c_b31);
2801 g = d__[m] - p + e[l - 1] / (g + ((g>0) ? r__ : -r__ ));
2809 for (i__ = m; i__ <= i__1; ++i__) {
2812 F77_FUNC(slartg,SLARTG)(&g, &f, &c__, &s, &r__);
2817 r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b;
2824 work[*n - 1 + i__] = s;
2832 F77_FUNC(slasr,SLASR)("r", "v", "f", &c__1, &mm, &work[m], &work[*n - 1 + m], &
2853 i__1 = lendsv - lsv + 1;
2854 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv],
2856 i__1 = lendsv - lsv;
2857 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n,
2859 } else if (iscale == 2) {
2860 i__1 = lendsv - lsv + 1;
2861 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv],
2863 i__1 = lendsv - lsv;
2864 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n,
2868 if (jtot < nmaxit) {
2872 for (i__ = 1; i__ <= i__1; ++i__) {
2882 F77_FUNC(slasrt,SLASRT)("i", n, &d__[1], info);
2887 for (ii = 2; ii <= i__1; ++ii) {
2892 for (j = ii; j <= i__2; ++j) {
2915 F77_FUNC(sgetv0,SGETV0)(int * ido,
2934 int v_dim1, v_offset, i__1;
2942 v_offset = 1 + v_dim1;
2956 F77_FUNC(slarnv,SLARNV)(&idist, &iwork[1], n, &resid[1]);
2962 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
2968 if (iwork[5] == 1) {
2972 if (iwork[6] == 1) {
2978 F77_FUNC(scopy,SCOPY)(n, &workd[*n + 1], &c__1, &resid[1], &c__1);
2983 } else if (*bmat == 'I') {
2984 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
2992 workd[*n * 3 + 4] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
2993 workd[*n * 3 + 4] = sqrt(fabs(workd[*n * 3 + 4]));
2994 } else if (*bmat == 'I') {
2995 workd[*n * 3 + 4] =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
2997 *rnorm = workd[*n * 3 + 4];
3006 F77_FUNC(sgemv,SGEMV)("T", n, &i__1, &c_b22, &v[v_offset], ldv, &workd[1], &c__1, &c_b24,
3007 &workd[*n + 1], &c__1);
3009 F77_FUNC(sgemv,SGEMV)("N", n, &i__1, &c_b27, &v[v_offset], ldv, &workd[*n + 1], &c__1, &
3010 c_b22, &resid[1], &c__1);
3013 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[*n + 1], &c__1);
3018 } else if (*bmat == 'I') {
3019 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
3025 *rnorm =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
3026 *rnorm = sqrt(fabs(*rnorm));
3027 } else if (*bmat == 'I') {
3028 *rnorm =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
3031 if (*rnorm > workd[*n * 3 + 4] * .717f) {
3036 if (iwork[7] <= 1) {
3038 workd[*n * 3 + 4] = *rnorm;
3043 for (jj = 1; jj <= i__1; ++jj) {
3063 F77_FUNC(ssapps,SSAPPS)(int * n,
3080 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
3084 float r__, s, a1, a2, a3, a4;
3095 v_offset = 1 + v_dim1;
3098 h_offset = 1 + h_dim1;
3101 q_offset = 1 + q_dim1;
3104 epsmch = GMX_FLOAT_EPS;
3108 kplusp = *kev + *np;
3110 F77_FUNC(slaset,SLASET)("All", &kplusp, &kplusp, &c_b4, &c_b5, &q[q_offset], ldq);
3117 for (jj = 1; jj <= i__1; ++jj) {
3124 for (i__ = istart; i__ <= i__2; ++i__) {
3125 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__ + 1 + (h_dim1*2)]);
3126 if (h__[i__ + 1 + h_dim1] <= epsmch * big) {
3127 h__[i__ + 1 + h_dim1] = 0.;
3135 if (istart < iend) {
3137 f = h__[istart + (h_dim1 << 1)] - shift[jj];
3138 g = h__[istart + 1 + h_dim1];
3139 F77_FUNC(slartg,SLARTG)(&f, &g, &c__, &s, &r__);
3141 a1 = c__ * h__[istart + (h_dim1 << 1)] + s * h__[istart + 1 +
3143 a2 = c__ * h__[istart + 1 + h_dim1] + s * h__[istart + 1 + (
3145 a4 = c__ * h__[istart + 1 + (h_dim1 << 1)] - s * h__[istart + 1 +
3147 a3 = c__ * h__[istart + 1 + h_dim1] - s * h__[istart + (h_dim1 <<
3149 h__[istart + (h_dim1 << 1)] = c__ * a1 + s * a2;
3150 h__[istart + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
3151 h__[istart + 1 + h_dim1] = c__ * a3 + s * a4;
3154 i__2 = (i__3<kplusp) ? i__3 : kplusp;
3155 for (j = 1; j <= i__2; ++j) {
3156 a1 = c__ * q[j + istart * q_dim1] + s * q[j + (istart + 1) *
3158 q[j + (istart + 1) * q_dim1] = -s * q[j + istart * q_dim1] +
3159 c__ * q[j + (istart + 1) * q_dim1];
3160 q[j + istart * q_dim1] = a1;
3165 for (i__ = istart + 1; i__ <= i__2; ++i__) {
3167 f = h__[i__ + h_dim1];
3168 g = s * h__[i__ + 1 + h_dim1];
3170 h__[i__ + 1 + h_dim1] = c__ * h__[i__ + 1 + h_dim1];
3171 F77_FUNC(slartg,SLARTG)(&f, &g, &c__, &s, &r__);
3179 h__[i__ + h_dim1] = r__;
3181 a1 = c__ * h__[i__ + (h_dim1 << 1)] + s * h__[i__ + 1 +
3183 a2 = c__ * h__[i__ + 1 + h_dim1] + s * h__[i__ + 1 + (h_dim1
3185 a3 = c__ * h__[i__ + 1 + h_dim1] - s * h__[i__ + (h_dim1 << 1)
3187 a4 = c__ * h__[i__ + 1 + (h_dim1 << 1)] - s * h__[i__ + 1 +
3190 h__[i__ + (h_dim1 << 1)] = c__ * a1 + s * a2;
3191 h__[i__ + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
3192 h__[i__ + 1 + h_dim1] = c__ * a3 + s * a4;
3195 i__3 = (i__4<kplusp) ? i__4 : kplusp;
3196 for (j = 1; j <= i__3; ++j) {
3197 a1 = c__ * q[j + i__ * q_dim1] + s * q[j + (i__ + 1) *
3199 q[j + (i__ + 1) * q_dim1] = -s * q[j + i__ * q_dim1] +
3200 c__ * q[j + (i__ + 1) * q_dim1];
3201 q[j + i__ * q_dim1] = a1;
3210 if (h__[iend + h_dim1] < 0.) {
3211 h__[iend + h_dim1] = -h__[iend + h_dim1];
3212 F77_FUNC(sscal,SSCAL)(&kplusp, &c_b14, &q[iend * q_dim1 + 1], &c__1);
3215 if (iend < kplusp) {
3220 for (i__ = itop; i__ <= i__2; ++i__) {
3221 if (h__[i__ + 1 + h_dim1] > 0.) {
3232 for (i__ = itop; i__ <= i__1; ++i__) {
3233 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__+ 1 + (h_dim1*2)]);
3234 if (h__[i__ + 1 + h_dim1] <= epsmch * big) {
3235 h__[i__ + 1 + h_dim1] = 0.;
3240 if (h__[*kev + 1 + h_dim1] > 0.) {
3241 F77_FUNC(sgemv,SGEMV)("N", n, &kplusp, &c_b5, &v[v_offset], ldv, &q[(*kev + 1) *
3242 q_dim1 + 1], &c__1, &c_b4, &workd[*n + 1], &c__1);
3246 for (i__ = 1; i__ <= i__1; ++i__) {
3247 i__2 = kplusp - i__ + 1;
3248 F77_FUNC(sgemv,SGEMV)("N", n, &i__2, &c_b5, &v[v_offset], ldv, &q[(*kev - i__ + 1) *
3249 q_dim1 + 1], &c__1, &c_b4, &workd[1], &c__1);
3250 F77_FUNC(scopy,SCOPY)(n, &workd[1], &c__1, &v[(kplusp - i__ + 1) * v_dim1 + 1], &
3255 F77_FUNC(slacpy,SLACPY)("All", n, kev, &v[(*np + 1) * v_dim1 + 1], ldv, &v[v_offset], ldv);
3257 if (h__[*kev + 1 + h_dim1] > 0.) {
3258 F77_FUNC(scopy,SCOPY)(n, &workd[*n + 1], &c__1, &v[(*kev + 1) * v_dim1 + 1], &c__1);
3261 F77_FUNC(sscal,SSCAL)(n, &q[kplusp + *kev * q_dim1], &resid[1], &c__1);
3262 if (h__[*kev + 1 + h_dim1] > 0.) {
3263 F77_FUNC(saxpy,SAXPY)(n, &h__[*kev + 1 + h_dim1], &v[(*kev + 1) * v_dim1 + 1], &c__1,
3277 F77_FUNC(ssortr,SSORTR)(const char * which,
3292 if (!strncmp(which, "SA", 2)) {
3299 for (i__ = igap; i__ <= i__1; ++i__) {
3307 if (x1[j] < x1[j + igap]) {
3309 x1[j] = x1[j + igap];
3310 x1[j + igap] = temp;
3313 x2[j] = x2[j + igap];
3314 x2[j + igap] = temp;
3327 } else if (!strncmp(which, "SM", 2)) {
3334 for (i__ = igap; i__ <= i__1; ++i__) {
3342 if (fabs(x1[j]) < fabs(x1[j + igap])) {
3344 x1[j] = x1[j + igap];
3345 x1[j + igap] = temp;
3348 x2[j] = x2[j + igap];
3349 x2[j + igap] = temp;
3362 } else if (!strncmp(which, "LA", 2)) {
3369 for (i__ = igap; i__ <= i__1; ++i__) {
3377 if (x1[j] > x1[j + igap]) {
3379 x1[j] = x1[j + igap];
3380 x1[j + igap] = temp;
3383 x2[j] = x2[j + igap];
3384 x2[j + igap] = temp;
3397 } else if (!strncmp(which, "LM", 2)) {
3405 for (i__ = igap; i__ <= i__1; ++i__) {
3413 if (fabs(x1[j]) > fabs(x1[j + igap])) {
3415 x1[j] = x1[j + igap];
3416 x1[j + igap] = temp;
3419 x2[j] = x2[j + igap];
3420 x2[j + igap] = temp;
3443 F77_FUNC(ssesrt,SSESRT)(const char * which,
3451 int a_dim1, a_offset, i__1;
3458 a_offset = 1 + a_dim1 * 0;
3463 if (!strncmp(which, "SA", 2)) {
3470 for (i__ = igap; i__ <= i__1; ++i__) {
3478 if (x[j] < x[j + igap]) {
3483 F77_FUNC(sswap,SSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
3484 a_dim1 + 1], &c__1);
3497 } else if (!strncmp(which, "SM", 2)) {
3504 for (i__ = igap; i__ <= i__1; ++i__) {
3512 if (fabs(x[j]) < fabs(x[j + igap])) {
3517 F77_FUNC(sswap,SSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
3518 a_dim1 + 1], &c__1);
3531 } else if (!strncmp(which, "LA", 2)) {
3538 for (i__ = igap; i__ <= i__1; ++i__) {
3546 if (x[j] > x[j + igap]) {
3551 F77_FUNC(sswap,SSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
3552 a_dim1 + 1], &c__1);
3565 } else if (!strncmp(which, "LM", 2)) {
3572 for (i__ = igap; i__ <= i__1; ++i__) {
3580 if (fabs(x[j]) > fabs(x[j + igap])) {
3585 F77_FUNC(sswap,SSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
3586 a_dim1 + 1], &c__1);
3609 F77_FUNC(ssgets,SSGETS)(int * ishift,
3625 if (!strncmp(which, "BE", 2)) {
3627 F77_FUNC(ssortr,SSORTR)("LA", &c__1, &i__1, &ritz[1], &bounds[1]);
3630 i__1 = (kevd2<*np) ? kevd2 : *np;
3631 i__2 = (kevd2>*np) ? kevd2 : *np;
3632 F77_FUNC(sswap,SSWAP)(&i__1, &ritz[1], &c__1,
3633 &ritz[i__2 + 1], &c__1);
3634 i__1 = (kevd2<*np) ? kevd2 : *np;
3635 i__2 = (kevd2>*np) ? kevd2 : *np;
3636 F77_FUNC(sswap,SSWAP)(&i__1, &bounds[1], &c__1,
3637 &bounds[i__2 + 1], &c__1);
3642 F77_FUNC(ssortr,SSORTR)(which, &c__1, &i__1, &ritz[1], &bounds[1]);
3645 if (*ishift == 1 && *np > 0) {
3647 F77_FUNC(ssortr,SSORTR)("SM", &c__1, np, &bounds[1], &ritz[1]);
3648 F77_FUNC(scopy,SCOPY)(np, &ritz[1], &c__1, &shifts[1], &c__1);
3658 F77_FUNC(ssconv,SSCONV)(int * n,
3674 eps23 = GMX_FLOAT_EPS;
3675 eps23 = pow(eps23, c_b3);
3679 for (i__ = 1; i__ <= i__1; ++i__) {
3682 d__3 = fabs(ritz[i__]);
3683 temp = (d__2 > d__3) ? d__2 : d__3;
3684 if (bounds[i__] <= *tol * temp) {
3694 F77_FUNC(sseigt,SSEIGT)(float * rnorm,
3704 int h_dim1, h_offset, i__1;
3713 h_offset = 1 + h_dim1;
3716 F77_FUNC(scopy,SCOPY)(n, &h__[(h_dim1 << 1) + 1], &c__1, &eig[1], &c__1);
3718 F77_FUNC(scopy,SCOPY)(&i__1, &h__[h_dim1 + 2], &c__1, &workl[1], &c__1);
3719 F77_FUNC(sstqrb,SSTQRB)(n, &eig[1], &workl[1], &bounds[1], &workl[*n + 1], ierr);
3725 for (k = 1; k <= i__1; ++k) {
3726 bounds[k] = *rnorm * fabs(bounds[k]);
3739 F77_FUNC(ssaitr,SSAITR)(int * ido,
3763 int h_dim1, h_offset, v_dim1, v_offset, i__1;
3767 float safmin,minval;
3773 v_offset = 1 + v_dim1;
3776 h_offset = 1 + h_dim1;
3780 minval = GMX_FLOAT_MIN;
3781 safmin = minval / GMX_FLOAT_EPS;
3794 iwork[9] = iwork[8] + *n;
3795 iwork[10] = iwork[9] + *n;
3798 if (iwork[5] == 1) {
3801 if (iwork[6] == 1) {
3804 if (iwork[2] == 1) {
3807 if (iwork[3] == 1) {
3810 if (iwork[4] == 1) {
3827 F77_FUNC(sgetv0,sgetv0)(ido, bmat, &iwork[11], &c__0, n, &iwork[12], &v[v_offset], ldv,
3828 &resid[1], rnorm, &ipntr[1], &workd[1], &iwork[21], &iwork[7]);
3834 if (iwork[11] <= 3) {
3838 *info = iwork[12] - 1;
3845 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &v[iwork[12] * v_dim1 + 1], &c__1);
3846 if (*rnorm >= safmin) {
3847 temp1 = 1. / *rnorm;
3848 F77_FUNC(sscal,SSCAL)(n, &temp1, &v[iwork[12] * v_dim1 + 1], &c__1);
3849 F77_FUNC(sscal,SSCAL)(n, &temp1, &workd[iwork[8]], &c__1);
3852 F77_FUNC(slascl,SLASCL)("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &v[iwork[12] *
3853 v_dim1 + 1], n, &infol);
3854 F77_FUNC(slascl,SLASCL)("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &workd[iwork[
3859 F77_FUNC(scopy,SCOPY)(n, &v[iwork[12] * v_dim1 + 1], &c__1, &workd[iwork[10]], &c__1);
3860 ipntr[1] = iwork[10];
3861 ipntr[2] = iwork[9];
3862 ipntr[3] = iwork[8];
3871 F77_FUNC(scopy,SCOPY)(n, &workd[iwork[9]], &c__1, &resid[1], &c__1);
3878 ipntr[1] = iwork[9];
3879 ipntr[2] = iwork[8];
3883 } else if (*bmat == 'I') {
3884 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
3893 workd[*n * 3 + 3] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[iwork[10]], &
3895 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
3896 } else if (*bmat == 'G') {
3897 workd[*n * 3 + 3] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &
3899 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
3900 } else if (*bmat == 'I') {
3901 workd[*n * 3 + 3] =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
3905 F77_FUNC(sgemv,SGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]]
3906 , &c__1, &c_b42, &workd[iwork[9]], &c__1);
3907 } else if (*mode == 2) {
3908 F77_FUNC(sgemv,SGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[10]
3909 ], &c__1, &c_b42, &workd[iwork[9]], &c__1);
3912 F77_FUNC(sgemv,SGEMV)("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
3913 c__1, &c_b18, &resid[1], &c__1);
3915 h__[iwork[12] + (h_dim1 << 1)] = workd[iwork[9] + iwork[12] - 1];
3916 if (iwork[12] == 1 || iwork[4] == 1) {
3917 h__[iwork[12] + h_dim1] = 0.;
3919 h__[iwork[12] + h_dim1] = *rnorm;
3926 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
3927 ipntr[1] = iwork[9];
3928 ipntr[2] = iwork[8];
3932 } else if (*bmat == 'I') {
3933 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
3940 *rnorm =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
3941 *rnorm = sqrt(fabs(*rnorm));
3942 } else if (*bmat == 'I') {
3943 *rnorm =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
3946 if (*rnorm > workd[*n * 3 + 3] * .717f) {
3952 F77_FUNC(sgemv,SGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]], &
3953 c__1, &c_b42, &workd[iwork[9]], &c__1);
3955 F77_FUNC(sgemv,SGEMV)("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
3956 c__1, &c_b18, &resid[1], &c__1);
3958 if (iwork[12] == 1 || iwork[4] == 1) {
3959 h__[iwork[12] + h_dim1] = 0.;
3961 h__[iwork[12] + (h_dim1 << 1)] += workd[iwork[9] + iwork[12] - 1];
3965 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
3966 ipntr[1] = iwork[9];
3967 ipntr[2] = iwork[8];
3971 } else if (*bmat == 'I') {
3972 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
3978 workd[*n * 3 + 2] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &
3980 workd[*n * 3 + 2] = sqrt(fabs(workd[*n * 3 + 2]));
3981 } else if (*bmat == 'I') {
3982 workd[*n * 3 + 2] =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
3986 if (workd[*n * 3 + 2] > *rnorm * .717f) {
3988 *rnorm = workd[*n * 3 + 2];
3992 *rnorm = workd[*n * 3 + 2];
3994 if (iwork[1] <= 1) {
3999 for (jj = 1; jj <= i__1; ++jj) {
4010 if (h__[iwork[12] + h_dim1] < 0.) {
4011 h__[iwork[12] + h_dim1] = -h__[iwork[12] + h_dim1];
4012 if (iwork[12] < *k + *np) {
4013 F77_FUNC(sscal,SSCAL)(n, &c_b50, &v[(iwork[12] + 1) * v_dim1 + 1], &c__1);
4015 F77_FUNC(sscal,SSCAL)(n, &c_b50, &resid[1], &c__1);
4020 if (iwork[12] > *k + *np) {
4039 F77_FUNC(ssaup2,SSAUP2)(int * ido,
4069 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
4088 v_offset = 1 + v_dim1;
4091 h_offset = 1 + h_dim1;
4094 q_offset = 1 + q_dim1;
4098 eps23 = GMX_FLOAT_EPS;
4099 eps23 = pow(eps23, c_b3);
4111 iwork[7] = iwork[9] + iwork[10];
4129 if (iwork[2] == 1) {
4130 F77_FUNC(sgetv0,SGETV0)(ido, bmat, &c__1, &iwork[3], n, &c__1, &v[v_offset], ldv, &
4131 resid[1], &workd[*n * 3 + 1], &ipntr[1], &workd[1], &iwork[41]
4138 if (workd[*n * 3 + 1] == 0.) {
4147 if (iwork[4] == 1) {
4151 if (iwork[5] == 1) {
4155 if (iwork[1] == 1) {
4159 F77_FUNC(ssaitr,SSAITR)(ido, bmat, n, &c__0, &iwork[9], mode, &resid[1], &workd[*n * 3 +
4160 1], &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
4184 F77_FUNC(ssaitr,SSAITR)(ido, bmat, n, nev, np, mode, &resid[1], &workd[*n * 3 + 1], &v[
4185 v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1], &iwork[
4201 F77_FUNC(sseigt,SSEIGT)(&workd[*n * 3 + 1], &iwork[7], &h__[h_offset], ldh, &ritz[1], &
4202 bounds[1], &workl[1], &ierr);
4209 F77_FUNC(scopy,SCOPY)(&iwork[7], &ritz[1], &c__1, &workl[iwork[7] + 1], &c__1);
4210 F77_FUNC(scopy,SCOPY)(&iwork[7], &bounds[1], &c__1, &workl[(iwork[7] << 1) + 1], &c__1);
4214 F77_FUNC(ssgets,SSGETS)(ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
4216 F77_FUNC(scopy,SCOPY)(nev, &bounds[*np + 1], &c__1, &workl[*np + 1], &c__1);
4217 F77_FUNC(ssconv,SSCONV)(nev, &ritz[*np + 1], &workl[*np + 1], tol, &iwork[8]);
4222 for (j = 1; j <= i__1; ++j) {
4223 if (bounds[j] == 0.) {
4229 if (iwork[8] >= iwork[9] || iwork[6] > *mxiter || *np == 0) {
4231 if (!strncmp(which, "BE", 2)) {
4233 strncpy(wprime, "SA",2);
4234 F77_FUNC(ssortr,SSORTR)(wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
4236 nevm2 = *nev - nevd2;
4238 i__1 = (nevd2 < *np) ? nevd2 : *np;
4239 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np + 1;
4240 F77_FUNC(sswap,SSWAP)(&i__1, &ritz[nevm2 + 1], &c__1,
4241 &ritz[((i__2>i__3) ? i__2 : i__3)],
4243 i__1 = (nevd2 < *np) ? nevd2 : *np;
4244 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np;
4245 F77_FUNC(sswap,SSWAP)(&i__1, &bounds[nevm2 + 1], &c__1,
4246 &bounds[((i__2>i__3) ? i__2 : i__3) + 1],
4252 if (!strncmp(which, "LM", 2)) {
4253 strncpy(wprime, "SM", 2);
4255 if (!strncmp(which, "SM", 2)) {
4256 strncpy(wprime, "LM", 2);
4258 if (!strncmp(which, "LA", 2)) {
4259 strncpy(wprime, "SA", 2);
4261 if (!strncmp(which, "SA", 2)) {
4262 strncpy(wprime, "LA", 2);
4265 F77_FUNC(ssortr,SSORTR)(wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
4270 for (j = 1; j <= i__1; ++j) {
4272 d__3 = fabs(ritz[j]);
4273 temp = (d__2>d__3) ? d__2 : d__3;
4277 strncpy(wprime, "LA",2);
4278 F77_FUNC(ssortr,SSORTR)(wprime, &c__1, &iwork[9], &bounds[1], &ritz[1]);
4281 for (j = 1; j <= i__1; ++j) {
4283 d__3 = fabs(ritz[j]);
4284 temp = (d__2>d__3) ? d__2 : d__3;
4288 if (!strncmp(which, "BE", 2)) {
4290 strncpy(wprime, "LA", 2);
4291 F77_FUNC(ssortr,SSORTR)(wprime, &c__1, &iwork[8], &ritz[1], &bounds[1]);
4294 F77_FUNC(ssortr,SSORTR)(which, &c__1, &iwork[8], &ritz[1], &bounds[1]);
4298 h__[h_dim1 + 1] = workd[*n * 3 + 1];
4301 if (iwork[6] > *mxiter && iwork[8] < *nev) {
4304 if (*np == 0 && iwork[8] < iwork[9]) {
4311 } else if (iwork[8] < *nev && *ishift == 1) {
4313 i__1 = iwork[8], i__2 = *np / 2;
4314 *nev += (i__1 < i__2) ? i__1 : i__2;
4315 if (*nev == 1 && iwork[7] >= 6) {
4316 *nev = iwork[7] / 2;
4317 } else if (*nev == 1 && iwork[7] > 2) {
4320 *np = iwork[7] - *nev;
4323 if (nevbef < *nev) {
4324 F77_FUNC(ssgets,SSGETS)(ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
4342 F77_FUNC(scopy,SCOPY)(np, &workl[1], &c__1, &ritz[1], &c__1);
4345 F77_FUNC(ssapps,SSAPPS)(n, nev, np, &ritz[1], &v[v_offset], ldv, &h__[h_offset], ldh, &
4346 resid[1], &q[q_offset], ldq, &workd[1]);
4350 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[*n + 1], &c__1);
4356 } else if (*bmat == 'I') {
4357 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
4363 workd[*n * 3 + 1] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
4364 workd[*n * 3 + 1] = sqrt(fabs(workd[*n * 3 + 1]));
4365 } else if (*bmat == 'I') {
4366 workd[*n * 3 + 1] =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
4388 F77_FUNC(ssaupd,SSAUPD)(int * ido,
4406 int v_dim1, v_offset, i__1, i__2;
4412 v_offset = 1 + v_dim1;
4423 iwork[5] = iparam[1];
4424 iwork[10] = iparam[3];
4425 iwork[12] = iparam[4];
4428 iwork[11] = iparam[7];
4433 } else if (*nev <= 0) {
4435 } else if (*ncv <= *nev || *ncv > *n) {
4440 iwork[15] = *ncv - *nev;
4442 if (iwork[10] <= 0) {
4445 if (strncmp(which,"LM",2) && strncmp(which,"SM",2) &&
4446 strncmp(which,"LA",2) && strncmp(which,"SA",2) &&
4447 strncmp(which,"BE",2)) {
4450 if (*bmat != 'I' && *bmat != 'G') {
4455 if (*lworkl < i__1 * i__1 + (*ncv << 3)) {
4458 if (iwork[11] < 1 || iwork[11] > 5) {
4460 } else if (iwork[11] == 1 && *bmat == 'G') {
4462 } else if (iwork[5] < 0 || iwork[5] > 1) {
4464 } else if (*nev == 1 && !strncmp(which, "BE", 2)) {
4468 if (iwork[2] != 0) {
4474 if (iwork[12] <= 0) {
4478 *tol = GMX_FLOAT_EPS;
4481 iwork[15] = *ncv - *nev;
4484 i__1 = i__2 * i__2 + (*ncv << 3);
4485 for (j = 1; j <= i__1; ++j) {
4492 iwork[16] = iwork[3] + (iwork[8] << 1);
4493 iwork[1] = iwork[16] + *ncv;
4494 iwork[4] = iwork[1] + *ncv;
4496 iwork[7] = iwork[4] + i__1 * i__1;
4497 iwork[14] = iwork[7] + *ncv * 3;
4499 ipntr[4] = iwork[14];
4500 ipntr[5] = iwork[3];
4501 ipntr[6] = iwork[16];
4502 ipntr[7] = iwork[1];
4503 ipntr[11] = iwork[7];
4506 F77_FUNC(ssaup2,SSAUP2)(ido, bmat, n, which, &iwork[13], &iwork[15], tol, &resid[1], &
4507 iwork[11], &iwork[6], &iwork[5], &iwork[10], &v[v_offset], ldv, &
4508 workl[iwork[3]], &iwork[8], &workl[iwork[16]], &workl[iwork[1]], &
4509 workl[iwork[4]], &iwork[9], &workl[iwork[7]], &ipntr[1], &workd[1]
4510 , &iwork[21], info);
4513 iparam[8] = iwork[15];
4519 iparam[3] = iwork[10];
4520 iparam[5] = iwork[15];
4538 F77_FUNC(sseupd,SSEUPD)(int * rvec,
4539 const char * howmny,
4564 int v_dim1, v_offset, z_dim1, z_offset, i__1;
4565 float d__1, d__2, d__3;
4567 int j, k, ih, iq, iw, ibd, ihb, ihd, ldh, ilg, ldq, ism, irz;
4579 float thres1=0, thres2=0;
4583 int leftptr, rghtptr;
4589 z_offset = 1 + z_dim1;
4594 v_offset = 1 + v_dim1;
4618 if (*ncv <= *nev || *ncv > *n) {
4621 if (strncmp(which,"LM",2) && strncmp(which,"SM",2) &&
4622 strncmp(which,"LA",2) && strncmp(which,"SA",2) &&
4623 strncmp(which,"BE",2)) {
4626 if (*bmat != 'I' && *bmat != 'G') {
4629 if (*howmny != 'A' && *howmny != 'P' &&
4630 *howmny != 'S' && *rvec) {
4633 if (*rvec && *howmny == 'S') {
4637 if (*rvec && *lworkl < i__1 * i__1 + (*ncv << 3)) {
4641 if (mode == 1 || mode == 2) {
4642 strncpy(type__, "REGULR",6);
4643 } else if (mode == 3) {
4644 strncpy(type__, "SHIFTI",6);
4645 } else if (mode == 4) {
4646 strncpy(type__, "BUCKLE",6);
4647 } else if (mode == 5) {
4648 strncpy(type__, "CAYLEY",6);
4652 if (mode == 1 && *bmat == 'G') {
4655 if (*nev == 1 && !strncmp(which, "BE",2)) {
4672 iw = iq + ldh * *ncv;
4673 next = iw + (*ncv << 1);
4679 irz = ipntr[11] + *ncv;
4683 eps23 = GMX_FLOAT_EPS;
4684 eps23 = pow(eps23, c_b21);
4689 } else if (*bmat == 'G') {
4690 bnorm2 =F77_FUNC(snrm2,SNRM2)(n, &workd[1], &c__1);
4695 if (!strncmp(which,"LM",2) || !strncmp(which,"SM",2) ||
4696 !strncmp(which,"LA",2) || !strncmp(which,"SA",2)) {
4698 } else if (!strncmp(which,"BE",2)) {
4701 ism = (*nev>nconv) ? *nev : nconv;
4704 thres1 = workl[ism];
4705 thres2 = workl[ilg];
4713 for (j = 0; j <= i__1; ++j) {
4715 if (!strncmp(which,"LM",2)) {
4716 if (fabs(workl[irz + j]) >= fabs(thres1)) {
4718 d__3 = fabs(workl[irz + j]);
4719 tempbnd = (d__2>d__3) ? d__2 : d__3;
4720 if (workl[ibd + j] <= *tol * tempbnd) {
4724 } else if (!strncmp(which,"SM",2)) {
4725 if (fabs(workl[irz + j]) <= fabs(thres1)) {
4727 d__3 = fabs(workl[irz + j]);
4728 tempbnd = (d__2>d__3) ? d__2 : d__3;
4729 if (workl[ibd + j] <= *tol * tempbnd) {
4733 } else if (!strncmp(which,"LA",2)) {
4734 if (workl[irz + j] >= thres1) {
4736 d__3 = fabs(workl[irz + j]);
4737 tempbnd = (d__2>d__3) ? d__2 : d__3;
4738 if (workl[ibd + j] <= *tol * tempbnd) {
4742 } else if (!strncmp(which,"SA",2)) {
4743 if (workl[irz + j] <= thres1) {
4745 d__3 = fabs(workl[irz + j]);
4746 tempbnd = (d__2>d__3) ? d__2 : d__3;
4747 if (workl[ibd + j] <= *tol * tempbnd) {
4751 } else if (!strncmp(which,"BE",2)) {
4752 if (workl[irz + j] <= thres1 || workl[irz + j] >= thres2) {
4754 d__3 = fabs(workl[irz + j]);
4755 tempbnd = (d__2>d__3) ? d__2 : d__3;
4756 if (workl[ibd + j] <= *tol * tempbnd) {
4761 if (j + 1 > nconv) {
4762 reord = select[j + 1] || reord;
4764 if (select[j + 1]) {
4770 F77_FUNC(scopy,SCOPY)(&i__1, &workl[ih + 1], &c__1, &workl[ihb], &c__1);
4771 F77_FUNC(scopy,SCOPY)(ncv, &workl[ih + ldh], &c__1, &workl[ihd], &c__1);
4773 F77_FUNC(ssteqr,SSTEQR)("Identity", ncv, &workl[ihd], &workl[ihb], &workl[iq], &ldq, &
4792 if (select[leftptr]) {
4796 } else if (! select[rghtptr]) {
4802 temp = workl[ihd + leftptr - 1];
4803 workl[ihd + leftptr - 1] = workl[ihd + rghtptr - 1];
4804 workl[ihd + rghtptr - 1] = temp;
4805 F77_FUNC(scopy,SCOPY)(ncv, &workl[iq + *ncv * (leftptr - 1)], &c__1, &workl[
4807 F77_FUNC(scopy,SCOPY)(ncv, &workl[iq + *ncv * (rghtptr - 1)], &c__1, &workl[
4808 iq + *ncv * (leftptr - 1)], &c__1);
4809 F77_FUNC(scopy,SCOPY)(ncv, &workl[iw], &c__1, &workl[iq + *ncv * (rghtptr -
4816 if (leftptr < rghtptr) {
4824 F77_FUNC(scopy,SCOPY)(&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
4828 F77_FUNC(scopy,SCOPY)(&nconv, &workl[ritz], &c__1, &d__[1], &c__1);
4829 F77_FUNC(scopy,SCOPY)(ncv, &workl[ritz], &c__1, &workl[ihd], &c__1);
4832 if (!strncmp(type__, "REGULR",6)) {
4835 F77_FUNC(ssesrt,SSESRT)("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
4837 F77_FUNC(scopy,SCOPY)(ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
4842 F77_FUNC(scopy,SCOPY)(ncv, &workl[ihd], &c__1, &workl[iw], &c__1);
4843 if (!strncmp(type__, "SHIFTI", 6)) {
4845 for (k = 1; k <= i__1; ++k) {
4846 workl[ihd + k - 1] = 1. / workl[ihd + k - 1] + *sigma;
4848 } else if (!strncmp(type__, "BUCKLE",6)) {
4850 for (k = 1; k <= i__1; ++k) {
4851 workl[ihd + k - 1] = *sigma * workl[ihd + k - 1] / (workl[ihd
4854 } else if (!strncmp(type__, "CAYLEY",6)) {
4856 for (k = 1; k <= i__1; ++k) {
4857 workl[ihd + k - 1] = *sigma * (workl[ihd + k - 1] + 1.) / (
4858 workl[ihd + k - 1] - 1.);
4862 F77_FUNC(scopy,SCOPY)(&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
4863 F77_FUNC(ssortr,SSORTR)("LA", &c__1, &nconv, &workl[ihd], &workl[iw]);
4865 F77_FUNC(ssesrt,SSESRT)("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
4867 F77_FUNC(scopy,SCOPY)(ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
4868 d__1 = bnorm2 / rnorm;
4869 F77_FUNC(sscal,SSCAL)(ncv, &d__1, &workl[ihb], &c__1);
4870 F77_FUNC(ssortr,SSORTR)("LA", &c__1, &nconv, &d__[1], &workl[ihb]);
4875 if (*rvec && *howmny == 'A') {
4877 F77_FUNC(sgeqr2,SGEQR2)(ncv, &nconv, &workl[iq], &ldq, &workl[iw + *ncv], &workl[ihb],
4880 F77_FUNC(sorm2r,SORM2R)("Right", "Notranspose", n, ncv, &nconv, &workl[iq], &ldq, &
4881 workl[iw + *ncv], &v[v_offset], ldv, &workd[*n + 1], &ierr);
4882 F77_FUNC(slacpy,SLACPY)("All", n, &nconv, &v[v_offset], ldv, &z__[z_offset], ldz);
4885 for (j = 1; j <= i__1; ++j) {
4886 workl[ihb + j - 1] = 0.;
4888 workl[ihb + *ncv - 1] = 1.;
4889 F77_FUNC(sorm2r,SORM2R)("Left", "Transpose", ncv, &c__1, &nconv, &workl[iq], &ldq, &
4890 workl[iw + *ncv], &workl[ihb], ncv, &temp, &ierr);
4892 } else if (*rvec && *howmny == 'S') {
4896 if (!strncmp(type__, "REGULR",6) && *rvec) {
4899 for (j = 1; j <= i__1; ++j) {
4900 workl[ihb + j - 1] = rnorm * fabs(workl[ihb + j - 1]);
4903 } else if (strncmp(type__, "REGULR",6) && *rvec) {
4905 F77_FUNC(sscal,SSCAL)(ncv, &bnorm2, &workl[ihb], &c__1);
4906 if (!strncmp(type__, "SHIFTI",6)) {
4909 for (k = 1; k <= i__1; ++k) {
4910 d__2 = workl[iw + k - 1];
4911 workl[ihb + k - 1] = fabs(workl[ihb + k - 1])/(d__2 * d__2);
4914 } else if (!strncmp(type__, "BUCKLE",6)) {
4917 for (k = 1; k <= i__1; ++k) {
4918 d__2 = workl[iw + k - 1] - 1.;
4919 workl[ihb + k - 1] = *sigma * fabs(workl[ihb + k - 1])/(d__2 * d__2);
4922 } else if (!strncmp(type__, "CAYLEY",6)) {
4925 for (k = 1; k <= i__1; ++k) {
4926 workl[ihb + k - 1] = fabs(workl[ihb + k - 1] / workl[iw + k - 1] * (workl[iw + k - 1] - 1.));
4934 if (*rvec && (!strncmp(type__, "SHIFTI",6) || !strncmp(type__, "CAYLEY",6))) {
4937 for (k = 0; k <= i__1; ++k) {
4938 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / workl[iw + k];
4941 } else if (*rvec && !strncmp(type__, "BUCKLE", 6)) {
4944 for (k = 0; k <= i__1; ++k) {
4945 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / (workl[iw + k] -
4951 if (strncmp(type__, "REGULR",6)) {
4952 F77_FUNC(sger,SGER)(n, &nconv, &c_b102, &resid[1], &c__1, &workl[iw], &c__1, &z__[