2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2004 David van der Spoel, Erik Lindahl, University of Groningen.
5 * Copyright (c) 2012,2013,2014, by the GROMACS development team, led by
6 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
7 * and including many others, as listed in the AUTHORS file in the
8 * top-level source directory and at http://www.gromacs.org.
10 * GROMACS is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public License
12 * as published by the Free Software Foundation; either version 2.1
13 * of the License, or (at your option) any later version.
15 * GROMACS is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with GROMACS; if not, see
22 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
23 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
25 * If you want to redistribute modifications to GROMACS, please
26 * consider that scientific software is very special. Version
27 * control is crucial - bugs must be traceable. We will be happy to
28 * consider code for inclusion in the official distribution, but
29 * derived work must not be called official GROMACS. Details are found
30 * in the README & COPYING files - if they are missing, get the
31 * official version at http://www.gromacs.org.
33 * To help us fund GROMACS development, we humbly ask that you cite
34 * the research papers on the package. Check out http://www.gromacs.org.
38 #include "gmx_arpack.h"
43 #include "gromacs/utility/basedefinitions.h"
44 #include "gromacs/utility/real.h"
47 #include "gmx_lapack.h"
50 F77_FUNC(dstqrb, DSTQRB) (int * n,
66 int l1, ii, mm, lm1, mm1, nm1;
70 int lend, jtot, lendm1, lendp1, iscale;
72 int lendsv, nmaxit, icompz;
73 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;
112 for (j = 1; j <= i__1; ++j)
138 for (m = l1; m <= i__1; ++m)
145 if (tst <= sqrt(fabs(d__[m])) * sqrt(fabs(d__[m+1])) * eps)
166 anorm = F77_FUNC(dlanst, DLANST) ("i", &i__1, &d__[l], &e[l]);
176 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n,
179 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n,
182 else if (anorm < ssfmin)
186 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n,
189 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n,
193 if (fabs(d__[lend]) < fabs(d__[l]))
207 for (m = l; m <= i__1; ++m)
211 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m + 1]) + safmin)
235 F77_FUNC(dlaev2, DLAEV2) (&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s);
237 work[*n - 1 + l] = s;
240 z__[l + 1] = c__ * tst - s * z__[l];
241 z__[l] = s * tst + c__ * z__[l];
245 F77_FUNC(dlae2, DLAE2) (&d__[l], &e[l], &d__[l + 1], &rt1, &rt2);
264 g = (d__[l + 1] - p) / (e[l] * 2.);
265 r__ = F77_FUNC(dlapy2, DLAPY2) (&g, &c_b31);
266 g = d__[m] - p + e[l] / (g + ((g > 0) ? r__ : -r__ ));
274 for (i__ = mm1; i__ >= i__1; --i__)
278 F77_FUNC(dlartg, DLARTG) (&g, &f, &c__, &s, &r__);
283 g = d__[i__ + 1] - p;
284 r__ = (d__[i__] - g) * s + c__ * 2. * b;
286 d__[i__ + 1] = g + p;
292 work[*n - 1 + i__] = -s;
301 F77_FUNC(dlasr, DLASR) ("r", "v", "b", &c__1, &mm, &work[l], &work[*n - 1 + l], &
328 for (m = l; m >= i__1; --m)
330 d__2 = fabs(e[m - 1]);
332 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m- 1]) + safmin)
356 F77_FUNC(dlaev2, DLAEV2) (&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s)
360 z__[l] = c__ * tst - s * z__[l - 1];
361 z__[l - 1] = s * tst + c__ * z__[l - 1];
365 F77_FUNC(dlae2, DLAE2) (&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2);
385 g = (d__[l - 1] - p) / (e[l - 1] * 2.);
386 r__ = F77_FUNC(dlapy2, DLAPY2) (&g, &c_b31);
387 g = d__[m] - p + e[l - 1] / (g + ((g > 0) ? r__ : -r__ ));
395 for (i__ = m; i__ <= i__1; ++i__)
399 F77_FUNC(dlartg, DLARTG) (&g, &f, &c__, &s, &r__);
405 r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b;
413 work[*n - 1 + i__] = s;
422 F77_FUNC(dlasr, DLASR) ("r", "v", "f", &c__1, &mm, &work[m], &work[*n - 1 + m], &
445 i__1 = lendsv - lsv + 1;
446 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv],
449 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n,
452 else if (iscale == 2)
454 i__1 = lendsv - lsv + 1;
455 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv],
458 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n,
467 for (i__ = 1; i__ <= i__1; ++i__)
480 F77_FUNC(dlasrt, DLASRT) ("i", n, &d__[1], info);
487 for (ii = 2; ii <= i__1; ++ii)
493 for (j = ii; j <= i__2; ++j)
519 F77_FUNC(dgetv0, DGETV0) (int * ido,
521 int gmx_unused * itry,
538 int v_dim1, v_offset, i__1;
546 v_offset = 1 + v_dim1;
562 F77_FUNC(dlarnv, DLARNV) (&idist, &iwork[1], n, &resid[1]);
569 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
588 F77_FUNC(dcopy, DCOPY) (n, &workd[*n + 1], &c__1, &resid[1], &c__1);
594 else if (*bmat == 'I')
596 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
605 workd[*n * 3 + 4] = F77_FUNC(ddot, DDOT) (n, &resid[1], &c__1, &workd[1], &c__1);
606 workd[*n * 3 + 4] = sqrt(fabs(workd[*n * 3 + 4]));
608 else if (*bmat == 'I')
610 workd[*n * 3 + 4] = F77_FUNC(dnrm2, DNRM2) (n, &resid[1], &c__1);
612 *rnorm = workd[*n * 3 + 4];
622 F77_FUNC(dgemv, DGEMV) ("T", n, &i__1, &c_b22, &v[v_offset], ldv, &workd[1], &c__1, &c_b24,
623 &workd[*n + 1], &c__1);
625 F77_FUNC(dgemv, DGEMV) ("N", n, &i__1, &c_b27, &v[v_offset], ldv, &workd[*n + 1], &c__1, &
626 c_b22, &resid[1], &c__1);
630 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[*n + 1], &c__1);
636 else if (*bmat == 'I')
638 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
645 *rnorm = F77_FUNC(ddot, DDOT) (n, &resid[1], &c__1, &workd[1], &c__1);
646 *rnorm = sqrt(fabs(*rnorm));
648 else if (*bmat == 'I')
650 *rnorm = F77_FUNC(dnrm2, DNRM2) (n, &resid[1], &c__1);
653 if (*rnorm > workd[*n * 3 + 4] * .717f)
662 workd[*n * 3 + 4] = *rnorm;
669 for (jj = 1; jj <= i__1; ++jj)
690 F77_FUNC(dsapps, DSAPPS) (int * n,
707 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
711 double r__, s, a1, a2, a3, a4;
722 v_offset = 1 + v_dim1;
725 h_offset = 1 + h_dim1;
728 q_offset = 1 + q_dim1;
731 epsmch = GMX_DOUBLE_EPS;
737 F77_FUNC(dlaset, DLASET) ("All", &kplusp, &kplusp, &c_b4, &c_b5, &q[q_offset], ldq);
745 for (jj = 1; jj <= i__1; ++jj)
753 for (i__ = istart; i__ <= i__2; ++i__)
755 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__ + 1 + (h_dim1*2)]);
756 if (h__[i__ + 1 + h_dim1] <= epsmch * big)
758 h__[i__ + 1 + h_dim1] = 0.;
769 f = h__[istart + (h_dim1 << 1)] - shift[jj];
770 g = h__[istart + 1 + h_dim1];
771 F77_FUNC(dlartg, DLARTG) (&f, &g, &c__, &s, &r__);
773 a1 = c__ * h__[istart + (h_dim1 << 1)] + s * h__[istart + 1 +
775 a2 = c__ * h__[istart + 1 + h_dim1] + s * h__[istart + 1 + (
777 a4 = c__ * h__[istart + 1 + (h_dim1 << 1)] - s * h__[istart + 1 +
779 a3 = c__ * h__[istart + 1 + h_dim1] - s * h__[istart + (h_dim1 <<
781 h__[istart + (h_dim1 << 1)] = c__ * a1 + s * a2;
782 h__[istart + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
783 h__[istart + 1 + h_dim1] = c__ * a3 + s * a4;
786 i__2 = (i__3 < kplusp) ? i__3 : kplusp;
787 for (j = 1; j <= i__2; ++j)
789 a1 = c__ * q[j + istart * q_dim1] + s * q[j + (istart + 1) *
791 q[j + (istart + 1) * q_dim1] = -s * q[j + istart * q_dim1] +
792 c__ * q[j + (istart + 1) * q_dim1];
793 q[j + istart * q_dim1] = a1;
798 for (i__ = istart + 1; i__ <= i__2; ++i__)
801 f = h__[i__ + h_dim1];
802 g = s * h__[i__ + 1 + h_dim1];
804 h__[i__ + 1 + h_dim1] = c__ * h__[i__ + 1 + h_dim1];
805 F77_FUNC(dlartg, DLARTG) (&f, &g, &c__, &s, &r__);
814 h__[i__ + h_dim1] = r__;
816 a1 = c__ * h__[i__ + (h_dim1 << 1)] + s * h__[i__ + 1 +
818 a2 = c__ * h__[i__ + 1 + h_dim1] + s * h__[i__ + 1 + (h_dim1
820 a3 = c__ * h__[i__ + 1 + h_dim1] - s * h__[i__ + (h_dim1 << 1)
822 a4 = c__ * h__[i__ + 1 + (h_dim1 << 1)] - s * h__[i__ + 1 +
825 h__[i__ + (h_dim1 << 1)] = c__ * a1 + s * a2;
826 h__[i__ + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
827 h__[i__ + 1 + h_dim1] = c__ * a3 + s * a4;
830 i__3 = (i__4 < kplusp) ? i__4 : kplusp;
831 for (j = 1; j <= i__3; ++j)
833 a1 = c__ * q[j + i__ * q_dim1] + s * q[j + (i__ + 1) *
835 q[j + (i__ + 1) * q_dim1] = -s * q[j + i__ * q_dim1] +
836 c__ * q[j + (i__ + 1) * q_dim1];
837 q[j + i__ * q_dim1] = a1;
846 if (h__[iend + h_dim1] < 0.)
848 h__[iend + h_dim1] = -h__[iend + h_dim1];
849 F77_FUNC(dscal, DSCAL) (&kplusp, &c_b14, &q[iend * q_dim1 + 1], &c__1);
858 for (i__ = itop; i__ <= i__2; ++i__)
860 if (h__[i__ + 1 + h_dim1] > 0.)
872 for (i__ = itop; i__ <= i__1; ++i__)
874 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__+ 1 + (h_dim1*2)]);
875 if (h__[i__ + 1 + h_dim1] <= epsmch * big)
877 h__[i__ + 1 + h_dim1] = 0.;
882 if (h__[*kev + 1 + h_dim1] > 0.)
884 F77_FUNC(dgemv, DGEMV) ("N", n, &kplusp, &c_b5, &v[v_offset], ldv, &q[(*kev + 1) *
885 q_dim1 + 1], &c__1, &c_b4, &workd[*n + 1], &c__1);
889 for (i__ = 1; i__ <= i__1; ++i__)
891 i__2 = kplusp - i__ + 1;
892 F77_FUNC(dgemv, DGEMV) ("N", n, &i__2, &c_b5, &v[v_offset], ldv, &q[(*kev - i__ + 1) *
893 q_dim1 + 1], &c__1, &c_b4, &workd[1], &c__1);
894 F77_FUNC(dcopy, DCOPY) (n, &workd[1], &c__1, &v[(kplusp - i__ + 1) * v_dim1 + 1], &
899 F77_FUNC(dlacpy, DLACPY) ("All", n, kev, &v[(*np + 1) * v_dim1 + 1], ldv, &v[v_offset], ldv);
901 if (h__[*kev + 1 + h_dim1] > 0.)
903 F77_FUNC(dcopy, DCOPY) (n, &workd[*n + 1], &c__1, &v[(*kev + 1) * v_dim1 + 1], &c__1);
906 F77_FUNC(dscal, DSCAL) (n, &q[kplusp + *kev * q_dim1], &resid[1], &c__1);
907 if (h__[*kev + 1 + h_dim1] > 0.)
909 F77_FUNC(daxpy, DAXPY) (n, &h__[*kev + 1 + h_dim1], &v[(*kev + 1) * v_dim1 + 1], &c__1,
923 F77_FUNC(dsortr, DSORTR) (const char * which,
938 if (!strncmp(which, "SA", 2))
947 for (i__ = igap; i__ <= i__1; ++i__)
957 if (x1[j] < x1[j + igap])
960 x1[j] = x1[j + igap];
965 x2[j] = x2[j + igap];
982 else if (!strncmp(which, "SM", 2))
991 for (i__ = igap; i__ <= i__1; ++i__)
1001 if (fabs(x1[j]) < fabs(x1[j + igap]))
1004 x1[j] = x1[j + igap];
1005 x1[j + igap] = temp;
1009 x2[j] = x2[j + igap];
1010 x2[j + igap] = temp;
1026 else if (!strncmp(which, "LA", 2))
1035 for (i__ = igap; i__ <= i__1; ++i__)
1045 if (x1[j] > x1[j + igap])
1048 x1[j] = x1[j + igap];
1049 x1[j + igap] = temp;
1053 x2[j] = x2[j + igap];
1054 x2[j + igap] = temp;
1070 else if (!strncmp(which, "LM", 2))
1080 for (i__ = igap; i__ <= i__1; ++i__)
1090 if (fabs(x1[j]) > fabs(x1[j + igap]))
1093 x1[j] = x1[j + igap];
1094 x1[j + igap] = temp;
1098 x2[j] = x2[j + igap];
1099 x2[j + igap] = temp;
1124 F77_FUNC(dsesrt, DSESRT) (const char * which,
1132 int a_dim1, a_offset, i__1;
1139 a_offset = 1 + a_dim1 * 0;
1144 if (!strncmp(which, "SA", 2))
1153 for (i__ = igap; i__ <= i__1; ++i__)
1163 if (x[j] < x[j + igap])
1170 F77_FUNC(dswap, DSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1171 a_dim1 + 1], &c__1);
1187 else if (!strncmp(which, "SM", 2))
1196 for (i__ = igap; i__ <= i__1; ++i__)
1206 if (fabs(x[j]) < fabs(x[j + igap]))
1213 F77_FUNC(dswap, DSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1214 a_dim1 + 1], &c__1);
1230 else if (!strncmp(which, "LA", 2))
1239 for (i__ = igap; i__ <= i__1; ++i__)
1249 if (x[j] > x[j + igap])
1256 F77_FUNC(dswap, DSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1257 a_dim1 + 1], &c__1);
1273 else if (!strncmp(which, "LM", 2))
1282 for (i__ = igap; i__ <= i__1; ++i__)
1292 if (fabs(x[j]) > fabs(x[j + igap]))
1299 F77_FUNC(dswap, DSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1300 a_dim1 + 1], &c__1);
1325 F77_FUNC(dsgets, DSGETS) (int * ishift,
1341 if (!strncmp(which, "BE", 2))
1344 F77_FUNC(dsortr, DSORTR) ("LA", &c__1, &i__1, &ritz[1], &bounds[1]);
1348 i__1 = (kevd2 < *np) ? kevd2 : *np;
1349 i__2 = (kevd2 > *np) ? kevd2 : *np;
1350 F77_FUNC(dswap, DSWAP) (&i__1, &ritz[1], &c__1,
1351 &ritz[i__2 + 1], &c__1);
1352 i__1 = (kevd2 < *np) ? kevd2 : *np;
1353 i__2 = (kevd2 > *np) ? kevd2 : *np;
1354 F77_FUNC(dswap, DSWAP) (&i__1, &bounds[1], &c__1,
1355 &bounds[i__2 + 1], &c__1);
1362 F77_FUNC(dsortr, DSORTR) (which, &c__1, &i__1, &ritz[1], &bounds[1]);
1365 if (*ishift == 1 && *np > 0)
1368 F77_FUNC(dsortr, DSORTR) ("SM", &c__1, np, &bounds[1], &ritz[1]);
1369 F77_FUNC(dcopy, DCOPY) (np, &ritz[1], &c__1, &shifts[1], &c__1);
1379 F77_FUNC(dsconv, DSCONV) (int * n,
1395 eps23 = GMX_DOUBLE_EPS;
1396 eps23 = pow(eps23, c_b3);
1400 for (i__ = 1; i__ <= i__1; ++i__)
1404 d__3 = fabs(ritz[i__]);
1405 temp = (d__2 > d__3) ? d__2 : d__3;
1406 if (bounds[i__] <= *tol * temp)
1417 F77_FUNC(dseigt, DSEIGT) (double * rnorm,
1427 int h_dim1, h_offset, i__1;
1436 h_offset = 1 + h_dim1;
1439 F77_FUNC(dcopy, DCOPY) (n, &h__[(h_dim1 << 1) + 1], &c__1, &eig[1], &c__1);
1441 F77_FUNC(dcopy, DCOPY) (&i__1, &h__[h_dim1 + 2], &c__1, &workl[1], &c__1);
1442 F77_FUNC(dstqrb, DSTQRB) (n, &eig[1], &workl[1], &bounds[1], &workl[*n + 1], ierr);
1449 for (k = 1; k <= i__1; ++k)
1451 bounds[k] = *rnorm * fabs(bounds[k]);
1464 F77_FUNC(dsaitr, DSAITR) (int * ido,
1488 int h_dim1, h_offset, v_dim1, v_offset, i__1;
1492 double safmin, minval;
1498 v_offset = 1 + v_dim1;
1501 h_offset = 1 + h_dim1;
1505 minval = GMX_DOUBLE_MIN;
1506 safmin = minval / GMX_DOUBLE_EPS;
1520 iwork[9] = iwork[8] + *n;
1521 iwork[10] = iwork[9] + *n;
1559 F77_FUNC(dgetv0, DGETV0) (ido, bmat, &iwork[11], &c__0, n, &iwork[12], &v[v_offset], ldv,
1560 &resid[1], rnorm, &ipntr[1], &workd[1], &iwork[21], &iwork[7]);
1573 *info = iwork[12] - 1;
1580 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &v[iwork[12] * v_dim1 + 1], &c__1);
1581 if (*rnorm >= safmin)
1583 temp1 = 1. / *rnorm;
1584 F77_FUNC(dscal, DSCAL) (n, &temp1, &v[iwork[12] * v_dim1 + 1], &c__1);
1585 F77_FUNC(dscal, DSCAL) (n, &temp1, &workd[iwork[8]], &c__1);
1590 F77_FUNC(dlascl, DLASCL) ("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &v[iwork[12] *
1591 v_dim1 + 1], n, &infol);
1592 F77_FUNC(dlascl, DLASCL) ("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &workd[iwork[
1597 F77_FUNC(dcopy, DCOPY) (n, &v[iwork[12] * v_dim1 + 1], &c__1, &workd[iwork[10]], &c__1);
1598 ipntr[1] = iwork[10];
1599 ipntr[2] = iwork[9];
1600 ipntr[3] = iwork[8];
1609 F77_FUNC(dcopy, DCOPY) (n, &workd[iwork[9]], &c__1, &resid[1], &c__1);
1618 ipntr[1] = iwork[9];
1619 ipntr[2] = iwork[8];
1624 else if (*bmat == 'I')
1626 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1636 workd[*n * 3 + 3] = F77_FUNC(ddot, DDOT) (n, &resid[1], &c__1, &workd[iwork[10]], &
1638 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
1640 else if (*bmat == 'G')
1642 workd[*n * 3 + 3] = F77_FUNC(ddot, DDOT) (n, &resid[1], &c__1, &workd[iwork[8]], &
1644 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
1646 else if (*bmat == 'I')
1648 workd[*n * 3 + 3] = F77_FUNC(dnrm2, DNRM2) (n, &resid[1], &c__1);
1653 F77_FUNC(dgemv, DGEMV) ("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]],
1654 &c__1, &c_b42, &workd[iwork[9]], &c__1);
1656 else if (*mode == 2)
1658 F77_FUNC(dgemv, DGEMV) ("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[10]
1659 ], &c__1, &c_b42, &workd[iwork[9]], &c__1);
1662 F77_FUNC(dgemv, DGEMV) ("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
1663 c__1, &c_b18, &resid[1], &c__1);
1665 h__[iwork[12] + (h_dim1 << 1)] = workd[iwork[9] + iwork[12] - 1];
1666 if (iwork[12] == 1 || iwork[4] == 1)
1668 h__[iwork[12] + h_dim1] = 0.;
1672 h__[iwork[12] + h_dim1] = *rnorm;
1680 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
1681 ipntr[1] = iwork[9];
1682 ipntr[2] = iwork[8];
1687 else if (*bmat == 'I')
1689 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1697 *rnorm = F77_FUNC(ddot, DDOT) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1698 *rnorm = sqrt(fabs(*rnorm));
1700 else if (*bmat == 'I')
1702 *rnorm = F77_FUNC(dnrm2, DNRM2) (n, &resid[1], &c__1);
1705 if (*rnorm > workd[*n * 3 + 3] * .717f)
1712 F77_FUNC(dgemv, DGEMV) ("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]], &
1713 c__1, &c_b42, &workd[iwork[9]], &c__1);
1715 F77_FUNC(dgemv, DGEMV) ("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
1716 c__1, &c_b18, &resid[1], &c__1);
1718 if (iwork[12] == 1 || iwork[4] == 1)
1720 h__[iwork[12] + h_dim1] = 0.;
1722 h__[iwork[12] + (h_dim1 << 1)] += workd[iwork[9] + iwork[12] - 1];
1727 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
1728 ipntr[1] = iwork[9];
1729 ipntr[2] = iwork[8];
1734 else if (*bmat == 'I')
1736 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1743 workd[*n * 3 + 2] = F77_FUNC(ddot, DDOT) (n, &resid[1], &c__1, &workd[iwork[8]], &
1745 workd[*n * 3 + 2] = sqrt(fabs(workd[*n * 3 + 2]));
1747 else if (*bmat == 'I')
1749 workd[*n * 3 + 2] = F77_FUNC(dnrm2, DNRM2) (n, &resid[1], &c__1);
1753 if (workd[*n * 3 + 2] > *rnorm * .717f)
1756 *rnorm = workd[*n * 3 + 2];
1762 *rnorm = workd[*n * 3 + 2];
1770 for (jj = 1; jj <= i__1; ++jj)
1782 if (h__[iwork[12] + h_dim1] < 0.)
1784 h__[iwork[12] + h_dim1] = -h__[iwork[12] + h_dim1];
1785 if (iwork[12] < *k + *np)
1787 F77_FUNC(dscal, DSCAL) (n, &c_b50, &v[(iwork[12] + 1) * v_dim1 + 1], &c__1);
1791 F77_FUNC(dscal, DSCAL) (n, &c_b50, &resid[1], &c__1);
1796 if (iwork[12] > *k + *np)
1816 F77_FUNC(dsaup2, DSAUP2) (int * ido,
1825 int gmx_unused * iupd,
1846 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
1865 v_offset = 1 + v_dim1;
1868 h_offset = 1 + h_dim1;
1871 q_offset = 1 + q_dim1;
1875 eps23 = GMX_DOUBLE_EPS;
1876 eps23 = pow(eps23, c_b3);
1889 iwork[7] = iwork[9] + iwork[10];
1912 F77_FUNC(dgetv0, DGETV0) (ido, bmat, &c__1, &iwork[3], n, &c__1, &v[v_offset], ldv, &
1913 resid[1], &workd[*n * 3 + 1], &ipntr[1], &workd[1], &iwork[41],
1921 if (workd[*n * 3 + 1] == 0.)
1946 F77_FUNC(dsaitr, DSAITR) (ido, bmat, n, &c__0, &iwork[9], mode, &resid[1], &workd[*n * 3 +
1947 1], &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
1973 F77_FUNC(dsaitr, DSAITR) (ido, bmat, n, nev, np, mode, &resid[1], &workd[*n * 3 + 1],
1974 &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
1992 F77_FUNC(dseigt, DSEIGT) (&workd[*n * 3 + 1], &iwork[7], &h__[h_offset], ldh, &ritz[1], &
1993 bounds[1], &workl[1], &ierr);
2001 F77_FUNC(dcopy, DCOPY) (&iwork[7], &ritz[1], &c__1, &workl[iwork[7] + 1], &c__1);
2002 F77_FUNC(dcopy, DCOPY) (&iwork[7], &bounds[1], &c__1, &workl[(iwork[7] << 1) + 1], &c__1);
2006 F77_FUNC(dsgets, DSGETS) (ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
2008 F77_FUNC(dcopy, DCOPY) (nev, &bounds[*np + 1], &c__1, &workl[*np + 1], &c__1);
2009 F77_FUNC(dsconv, DSCONV) (nev, &ritz[*np + 1], &workl[*np + 1], tol, &iwork[8]);
2013 for (j = 1; j <= i__1; ++j)
2015 if (bounds[j] == 0.)
2022 if (iwork[8] >= iwork[9] || iwork[6] > *mxiter || *np == 0)
2025 if (!strncmp(which, "BE", 2))
2028 strncpy(wprime, "SA", 2);
2029 F77_FUNC(dsortr, DSORTR) (wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
2031 nevm2 = *nev - nevd2;
2034 i__1 = (nevd2 < *np) ? nevd2 : *np;
2035 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np + 1;
2036 F77_FUNC(dswap, DSWAP) (&i__1, &ritz[nevm2 + 1], &c__1,
2037 &ritz[((i__2 > i__3) ? i__2 : i__3)],
2039 i__1 = (nevd2 < *np) ? nevd2 : *np;
2040 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np;
2041 F77_FUNC(dswap, DSWAP) (&i__1, &bounds[nevm2 + 1], &c__1,
2042 &bounds[((i__2 > i__3) ? i__2 : i__3) + 1],
2050 if (!strncmp(which, "LM", 2))
2052 strncpy(wprime, "SM", 2);
2054 if (!strncmp(which, "SM", 2))
2056 strncpy(wprime, "LM", 2);
2058 if (!strncmp(which, "LA", 2))
2060 strncpy(wprime, "SA", 2);
2062 if (!strncmp(which, "SA", 2))
2064 strncpy(wprime, "LA", 2);
2067 F77_FUNC(dsortr, DSORTR) (wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
2072 for (j = 1; j <= i__1; ++j)
2075 d__3 = fabs(ritz[j]);
2076 temp = (d__2 > d__3) ? d__2 : d__3;
2080 strncpy(wprime, "LA", 2);
2081 F77_FUNC(dsortr, DSORTR) (wprime, &c__1, &iwork[9], &bounds[1], &ritz[1]);
2084 for (j = 1; j <= i__1; ++j)
2087 d__3 = fabs(ritz[j]);
2088 temp = (d__2 > d__3) ? d__2 : d__3;
2092 if (!strncmp(which, "BE", 2))
2095 strncpy(wprime, "LA", 2);
2096 F77_FUNC(dsortr, DSORTR) (wprime, &c__1, &iwork[8], &ritz[1], &bounds[1]);
2101 F77_FUNC(dsortr, DSORTR) (which, &c__1, &iwork[8], &ritz[1], &bounds[1]);
2105 h__[h_dim1 + 1] = workd[*n * 3 + 1];
2108 if (iwork[6] > *mxiter && iwork[8] < *nev)
2112 if (*np == 0 && iwork[8] < iwork[9])
2121 else if (iwork[8] < *nev && *ishift == 1)
2124 i__1 = iwork[8], i__2 = *np / 2;
2125 *nev += (i__1 < i__2) ? i__1 : i__2;
2126 if (*nev == 1 && iwork[7] >= 6)
2128 *nev = iwork[7] / 2;
2130 else if (*nev == 1 && iwork[7] > 2)
2134 *np = iwork[7] - *nev;
2139 F77_FUNC(dsgets, DSGETS) (ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
2159 F77_FUNC(dcopy, DCOPY) (np, &workl[1], &c__1, &ritz[1], &c__1);
2162 F77_FUNC(dsapps, DSAPPS) (n, nev, np, &ritz[1], &v[v_offset], ldv, &h__[h_offset], ldh, &
2163 resid[1], &q[q_offset], ldq, &workd[1]);
2168 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[*n + 1], &c__1);
2175 else if (*bmat == 'I')
2177 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
2184 workd[*n * 3 + 1] = F77_FUNC(ddot, DDOT) (n, &resid[1], &c__1, &workd[1], &c__1);
2185 workd[*n * 3 + 1] = sqrt(fabs(workd[*n * 3 + 1]));
2187 else if (*bmat == 'I')
2189 workd[*n * 3 + 1] = F77_FUNC(dnrm2, DNRM2) (n, &resid[1], &c__1);
2211 F77_FUNC(dsaupd, DSAUPD) (int * ido,
2229 int v_dim1, v_offset, i__1, i__2;
2235 v_offset = 1 + v_dim1;
2247 iwork[5] = iparam[1];
2248 iwork[10] = iparam[3];
2249 iwork[12] = iparam[4];
2252 iwork[11] = iparam[7];
2263 else if (*ncv <= *nev || *ncv > *n)
2269 iwork[15] = *ncv - *nev;
2275 if (strncmp(which, "LM", 2) && strncmp(which, "SM", 2) &&
2276 strncmp(which, "LA", 2) && strncmp(which, "SA", 2) &&
2277 strncmp(which, "BE", 2))
2281 if (*bmat != 'I' && *bmat != 'G')
2287 if (*lworkl < i__1 * i__1 + (*ncv << 3))
2291 if (iwork[11] < 1 || iwork[11] > 5)
2295 else if (iwork[11] == 1 && *bmat == 'G')
2299 else if (iwork[5] < 0 || iwork[5] > 1)
2303 else if (*nev == 1 && !strncmp(which, "BE", 2))
2321 *tol = GMX_DOUBLE_EPS;
2324 iwork[15] = *ncv - *nev;
2327 i__1 = i__2 * i__2 + (*ncv << 3);
2328 for (j = 1; j <= i__1; ++j)
2336 iwork[16] = iwork[3] + (iwork[8] << 1);
2337 iwork[1] = iwork[16] + *ncv;
2338 iwork[4] = iwork[1] + *ncv;
2340 iwork[7] = iwork[4] + i__1 * i__1;
2341 iwork[14] = iwork[7] + *ncv * 3;
2343 ipntr[4] = iwork[14];
2344 ipntr[5] = iwork[3];
2345 ipntr[6] = iwork[16];
2346 ipntr[7] = iwork[1];
2347 ipntr[11] = iwork[7];
2350 F77_FUNC(dsaup2, DSAUP2) (ido, bmat, n, which, &iwork[13], &iwork[15], tol, &resid[1], &
2351 iwork[11], &iwork[6], &iwork[5], &iwork[10], &v[v_offset], ldv, &
2352 workl[iwork[3]], &iwork[8], &workl[iwork[16]], &workl[iwork[1]], &
2353 workl[iwork[4]], &iwork[9], &workl[iwork[7]], &ipntr[1], &workd[1],
2358 iparam[8] = iwork[15];
2365 iparam[3] = iwork[10];
2366 iparam[5] = iwork[15];
2386 F77_FUNC(dseupd, DSEUPD) (int * rvec,
2387 const char * howmny,
2412 int v_dim1, v_offset, z_dim1, z_offset, i__1;
2413 double d__1, d__2, d__3;
2415 int j, k, ih, iq, iw, ibd, ihb, ihd, ldh, ilg, ldq, ism, irz;
2427 double thres1 = 0, thres2 = 0;
2431 int leftptr, rghtptr;
2437 z_offset = 1 + z_dim1;
2442 v_offset = 1 + v_dim1;
2470 if (*ncv <= *nev || *ncv > *n)
2474 if (strncmp(which, "LM", 2) && strncmp(which, "SM", 2) &&
2475 strncmp(which, "LA", 2) && strncmp(which, "SA", 2) &&
2476 strncmp(which, "BE", 2))
2480 if (*bmat != 'I' && *bmat != 'G')
2484 if (*howmny != 'A' && *howmny != 'P' &&
2485 *howmny != 'S' && *rvec)
2489 if (*rvec && *howmny == 'S')
2494 if (*rvec && *lworkl < i__1 * i__1 + (*ncv << 3))
2499 if (mode == 1 || mode == 2)
2501 strncpy(type__, "REGULR", 6);
2505 strncpy(type__, "SHIFTI", 6);
2509 strncpy(type__, "BUCKLE", 6);
2513 strncpy(type__, "CAYLEY", 6);
2519 if (mode == 1 && *bmat == 'G')
2523 if (*nev == 1 && !strncmp(which, "BE", 2))
2542 iw = iq + ldh * *ncv;
2543 next = iw + (*ncv << 1);
2549 irz = ipntr[11] + *ncv;
2553 eps23 = GMX_DOUBLE_EPS;
2554 eps23 = pow(eps23, c_b21);
2561 else if (*bmat == 'G')
2563 bnorm2 = F77_FUNC(dnrm2, DNRM2) (n, &workd[1], &c__1);
2569 if (!strncmp(which, "LM", 2) || !strncmp(which, "SM", 2) ||
2570 !strncmp(which, "LA", 2) || !strncmp(which, "SA", 2))
2574 else if (!strncmp(which, "BE", 2))
2578 ism = (*nev > nconv) ? *nev : nconv;
2581 thres1 = workl[ism];
2582 thres2 = workl[ilg];
2590 for (j = 0; j <= i__1; ++j)
2593 if (!strncmp(which, "LM", 2))
2595 if (fabs(workl[irz + j]) >= fabs(thres1))
2598 d__3 = fabs(workl[irz + j]);
2599 tempbnd = (d__2 > d__3) ? d__2 : d__3;
2600 if (workl[ibd + j] <= *tol * tempbnd)
2606 else if (!strncmp(which, "SM", 2))
2608 if (fabs(workl[irz + j]) <= fabs(thres1))
2611 d__3 = fabs(workl[irz + j]);
2612 tempbnd = (d__2 > d__3) ? d__2 : d__3;
2613 if (workl[ibd + j] <= *tol * tempbnd)
2619 else if (!strncmp(which, "LA", 2))
2621 if (workl[irz + j] >= thres1)
2624 d__3 = fabs(workl[irz + j]);
2625 tempbnd = (d__2 > d__3) ? d__2 : d__3;
2626 if (workl[ibd + j] <= *tol * tempbnd)
2632 else if (!strncmp(which, "SA", 2))
2634 if (workl[irz + j] <= thres1)
2637 d__3 = fabs(workl[irz + j]);
2638 tempbnd = (d__2 > d__3) ? d__2 : d__3;
2639 if (workl[ibd + j] <= *tol * tempbnd)
2645 else if (!strncmp(which, "BE", 2))
2647 if (workl[irz + j] <= thres1 || workl[irz + j] >= thres2)
2650 d__3 = fabs(workl[irz + j]);
2651 tempbnd = (d__2 > d__3) ? d__2 : d__3;
2652 if (workl[ibd + j] <= *tol * tempbnd)
2660 reord = select[j + 1] || reord;
2669 F77_FUNC(dcopy, DCOPY) (&i__1, &workl[ih + 1], &c__1, &workl[ihb], &c__1);
2670 F77_FUNC(dcopy, DCOPY) (ncv, &workl[ih + ldh], &c__1, &workl[ihd], &c__1);
2672 F77_FUNC(dsteqr, DSTEQR) ("Identity", ncv, &workl[ihd], &workl[ihb], &workl[iq], &ldq, &
2694 if (select[leftptr])
2700 else if (!select[rghtptr])
2709 temp = workl[ihd + leftptr - 1];
2710 workl[ihd + leftptr - 1] = workl[ihd + rghtptr - 1];
2711 workl[ihd + rghtptr - 1] = temp;
2712 F77_FUNC(dcopy, DCOPY) (ncv, &workl[iq + *ncv * (leftptr - 1)], &c__1, &workl[
2714 F77_FUNC(dcopy, DCOPY) (ncv, &workl[iq + *ncv * (rghtptr - 1)], &c__1, &workl[
2715 iq + *ncv * (leftptr - 1)], &c__1);
2716 F77_FUNC(dcopy, DCOPY) (ncv, &workl[iw], &c__1, &workl[iq + *ncv * (rghtptr -
2723 if (leftptr < rghtptr)
2732 F77_FUNC(dcopy, DCOPY) (&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
2738 F77_FUNC(dcopy, DCOPY) (&nconv, &workl[ritz], &c__1, &d__[1], &c__1);
2739 F77_FUNC(dcopy, DCOPY) (ncv, &workl[ritz], &c__1, &workl[ihd], &c__1);
2742 if (!strncmp(type__, "REGULR", 6))
2747 F77_FUNC(dsesrt, DSESRT) ("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
2751 F77_FUNC(dcopy, DCOPY) (ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
2758 F77_FUNC(dcopy, DCOPY) (ncv, &workl[ihd], &c__1, &workl[iw], &c__1);
2759 if (!strncmp(type__, "SHIFTI", 6))
2762 for (k = 1; k <= i__1; ++k)
2764 workl[ihd + k - 1] = 1. / workl[ihd + k - 1] + *sigma;
2767 else if (!strncmp(type__, "BUCKLE", 6))
2770 for (k = 1; k <= i__1; ++k)
2772 workl[ihd + k - 1] = *sigma * workl[ihd + k - 1] / (workl[ihd
2776 else if (!strncmp(type__, "CAYLEY", 6))
2779 for (k = 1; k <= i__1; ++k)
2781 workl[ihd + k - 1] = *sigma * (workl[ihd + k - 1] + 1.) / (
2782 workl[ihd + k - 1] - 1.);
2786 F77_FUNC(dcopy, DCOPY) (&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
2787 F77_FUNC(dsortr, DSORTR) ("LA", &c__1, &nconv, &workl[ihd], &workl[iw]);
2790 F77_FUNC(dsesrt, DSESRT) ("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
2794 F77_FUNC(dcopy, DCOPY) (ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
2795 d__1 = bnorm2 / rnorm;
2796 F77_FUNC(dscal, DSCAL) (ncv, &d__1, &workl[ihb], &c__1);
2797 F77_FUNC(dsortr, DSORTR) ("LA", &c__1, &nconv, &d__[1], &workl[ihb]);
2802 if (*rvec && *howmny == 'A')
2805 F77_FUNC(dgeqr2, DGEQR2) (ncv, &nconv, &workl[iq], &ldq, &workl[iw + *ncv], &workl[ihb],
2808 F77_FUNC(dorm2r, DORM2R) ("Right", "Notranspose", n, ncv, &nconv, &workl[iq], &ldq, &
2809 workl[iw + *ncv], &v[v_offset], ldv, &workd[*n + 1], &ierr);
2810 F77_FUNC(dlacpy, DLACPY) ("All", n, &nconv, &v[v_offset], ldv, &z__[z_offset], ldz);
2813 for (j = 1; j <= i__1; ++j)
2815 workl[ihb + j - 1] = 0.;
2817 workl[ihb + *ncv - 1] = 1.;
2818 F77_FUNC(dorm2r, DORM2R) ("Left", "Transpose", ncv, &c__1, &nconv, &workl[iq], &ldq, &
2819 workl[iw + *ncv], &workl[ihb], ncv, &temp, &ierr);
2822 else if (*rvec && *howmny == 'S')
2827 if (!strncmp(type__, "REGULR", 6) && *rvec)
2831 for (j = 1; j <= i__1; ++j)
2833 workl[ihb + j - 1] = rnorm * fabs(workl[ihb + j - 1]);
2837 else if (strncmp(type__, "REGULR", 6) && *rvec)
2840 F77_FUNC(dscal, DSCAL) (ncv, &bnorm2, &workl[ihb], &c__1);
2841 if (!strncmp(type__, "SHIFTI", 6))
2845 for (k = 1; k <= i__1; ++k)
2847 d__2 = workl[iw + k - 1];
2848 workl[ihb + k - 1] = fabs(workl[ihb + k - 1])/(d__2 * d__2);
2852 else if (!strncmp(type__, "BUCKLE", 6))
2856 for (k = 1; k <= i__1; ++k)
2858 d__2 = workl[iw + k - 1] - 1.;
2859 workl[ihb + k - 1] = *sigma * fabs(workl[ihb + k - 1])/(d__2 * d__2);
2863 else if (!strncmp(type__, "CAYLEY", 6))
2867 for (k = 1; k <= i__1; ++k)
2869 workl[ihb + k - 1] = fabs(workl[ihb + k - 1] / workl[iw + k - 1] * (workl[iw + k - 1] - 1.));
2877 if (*rvec && (!strncmp(type__, "SHIFTI", 6) || !strncmp(type__, "CAYLEY", 6)))
2881 for (k = 0; k <= i__1; ++k)
2883 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / workl[iw + k];
2887 else if (*rvec && !strncmp(type__, "BUCKLE", 6))
2891 for (k = 0; k <= i__1; ++k)
2893 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / (workl[iw + k] -
2899 if (strncmp(type__, "REGULR", 6))
2901 F77_FUNC(dger, DGER) (n, &nconv, &c_b102, &resid[1], &c__1, &workl[iw], &c__1, &z__[
2915 /* Selected single precision arpack routines */
2919 F77_FUNC(sstqrb, SSTQRB) (int * n,
2933 int i__, j, k, l, m;
2935 int l1, ii, mm, lm1, mm1, nm1;
2936 float rt1, rt2, eps;
2939 int lend, jtot, lendm1, lendp1, iscale;
2941 int lendsv, nmaxit, icompz;
2942 float ssfmax, ssfmin, safmin, minval, safmax, anorm;
2968 eps = GMX_FLOAT_EPS;
2972 minval = GMX_FLOAT_MIN;
2973 safmin = minval / GMX_FLOAT_EPS;
2974 safmax = 1. / safmin;
2975 ssfmax = sqrt(safmax) / 3.;
2976 ssfmin = sqrt(safmin) / eps2;
2981 for (j = 1; j <= i__1; ++j)
3007 for (m = l1; m <= i__1; ++m)
3014 if (tst <= sqrt(fabs(d__[m])) * sqrt(fabs(d__[m+1])) * eps)
3034 i__1 = lend - l + 1;
3035 anorm = F77_FUNC(slanst, SLANST) ("i", &i__1, &d__[l], &e[l]);
3044 i__1 = lend - l + 1;
3045 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n,
3048 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n,
3051 else if (anorm < ssfmin)
3054 i__1 = lend - l + 1;
3055 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n,
3058 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n,
3062 if (fabs(d__[lend]) < fabs(d__[l]))
3076 for (m = l; m <= i__1; ++m)
3080 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m + 1]) + safmin)
3104 F77_FUNC(slaev2, SLAEV2) (&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s);
3106 work[*n - 1 + l] = s;
3109 z__[l + 1] = c__ * tst - s * z__[l];
3110 z__[l] = s * tst + c__ * z__[l];
3114 F77_FUNC(slae2, SLAE2) (&d__[l], &e[l], &d__[l + 1], &rt1, &rt2);
3133 g = (d__[l + 1] - p) / (e[l] * 2.);
3134 r__ = F77_FUNC(slapy2, SLAPY2) (&g, &c_b31);
3135 g = d__[m] - p + e[l] / (g + ((g > 0) ? r__ : -r__ ));
3143 for (i__ = mm1; i__ >= i__1; --i__)
3147 F77_FUNC(slartg, SLARTG) (&g, &f, &c__, &s, &r__);
3152 g = d__[i__ + 1] - p;
3153 r__ = (d__[i__] - g) * s + c__ * 2. * b;
3155 d__[i__ + 1] = g + p;
3161 work[*n - 1 + i__] = -s;
3170 F77_FUNC(slasr, SLASR) ("r", "v", "b", &c__1, &mm, &work[l], &work[*n - 1 + l], &
3197 for (m = l; m >= i__1; --m)
3199 d__2 = fabs(e[m - 1]);
3201 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m- 1]) + safmin)
3225 F77_FUNC(slaev2, SLAEV2) (&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s)
3229 z__[l] = c__ * tst - s * z__[l - 1];
3230 z__[l - 1] = s * tst + c__ * z__[l - 1];
3234 F77_FUNC(slae2, SLAE2) (&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2);
3254 g = (d__[l - 1] - p) / (e[l - 1] * 2.);
3255 r__ = F77_FUNC(slapy2, SLAPY2) (&g, &c_b31);
3256 g = d__[m] - p + e[l - 1] / (g + ((g > 0) ? r__ : -r__ ));
3264 for (i__ = m; i__ <= i__1; ++i__)
3268 F77_FUNC(slartg, SLARTG) (&g, &f, &c__, &s, &r__);
3274 r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b;
3282 work[*n - 1 + i__] = s;
3291 F77_FUNC(slasr, SLASR) ("r", "v", "f", &c__1, &mm, &work[m], &work[*n - 1 + m], &
3314 i__1 = lendsv - lsv + 1;
3315 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv],
3317 i__1 = lendsv - lsv;
3318 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n,
3321 else if (iscale == 2)
3323 i__1 = lendsv - lsv + 1;
3324 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv],
3326 i__1 = lendsv - lsv;
3327 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n,
3336 for (i__ = 1; i__ <= i__1; ++i__)
3349 F77_FUNC(slasrt, SLASRT) ("i", n, &d__[1], info);
3356 for (ii = 2; ii <= i__1; ++ii)
3362 for (j = ii; j <= i__2; ++j)
3388 F77_FUNC(sgetv0, SGETV0) (int * ido,
3390 int gmx_unused * itry,
3407 int v_dim1, v_offset, i__1;
3415 v_offset = 1 + v_dim1;
3431 F77_FUNC(slarnv, SLARNV) (&idist, &iwork[1], n, &resid[1]);
3438 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
3457 F77_FUNC(scopy, SCOPY) (n, &workd[*n + 1], &c__1, &resid[1], &c__1);
3463 else if (*bmat == 'I')
3465 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
3474 workd[*n * 3 + 4] = F77_FUNC(sdot, SDOT) (n, &resid[1], &c__1, &workd[1], &c__1);
3475 workd[*n * 3 + 4] = sqrt(fabs(workd[*n * 3 + 4]));
3477 else if (*bmat == 'I')
3479 workd[*n * 3 + 4] = F77_FUNC(snrm2, SNRM2) (n, &resid[1], &c__1);
3481 *rnorm = workd[*n * 3 + 4];
3491 F77_FUNC(sgemv, SGEMV) ("T", n, &i__1, &c_b22, &v[v_offset], ldv, &workd[1], &c__1, &c_b24,
3492 &workd[*n + 1], &c__1);
3494 F77_FUNC(sgemv, SGEMV) ("N", n, &i__1, &c_b27, &v[v_offset], ldv, &workd[*n + 1], &c__1, &
3495 c_b22, &resid[1], &c__1);
3499 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[*n + 1], &c__1);
3505 else if (*bmat == 'I')
3507 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
3514 *rnorm = F77_FUNC(sdot, SDOT) (n, &resid[1], &c__1, &workd[1], &c__1);
3515 *rnorm = sqrt(fabs(*rnorm));
3517 else if (*bmat == 'I')
3519 *rnorm = F77_FUNC(snrm2, SNRM2) (n, &resid[1], &c__1);
3522 if (*rnorm > workd[*n * 3 + 4] * .717f)
3531 workd[*n * 3 + 4] = *rnorm;
3538 for (jj = 1; jj <= i__1; ++jj)
3559 F77_FUNC(ssapps, SSAPPS) (int * n,
3576 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
3580 float r__, s, a1, a2, a3, a4;
3591 v_offset = 1 + v_dim1;
3594 h_offset = 1 + h_dim1;
3597 q_offset = 1 + q_dim1;
3600 epsmch = GMX_FLOAT_EPS;
3604 kplusp = *kev + *np;
3606 F77_FUNC(slaset, SLASET) ("All", &kplusp, &kplusp, &c_b4, &c_b5, &q[q_offset], ldq);
3614 for (jj = 1; jj <= i__1; ++jj)
3622 for (i__ = istart; i__ <= i__2; ++i__)
3624 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__ + 1 + (h_dim1*2)]);
3625 if (h__[i__ + 1 + h_dim1] <= epsmch * big)
3627 h__[i__ + 1 + h_dim1] = 0.;
3638 f = h__[istart + (h_dim1 << 1)] - shift[jj];
3639 g = h__[istart + 1 + h_dim1];
3640 F77_FUNC(slartg, SLARTG) (&f, &g, &c__, &s, &r__);
3642 a1 = c__ * h__[istart + (h_dim1 << 1)] + s * h__[istart + 1 +
3644 a2 = c__ * h__[istart + 1 + h_dim1] + s * h__[istart + 1 + (
3646 a4 = c__ * h__[istart + 1 + (h_dim1 << 1)] - s * h__[istart + 1 +
3648 a3 = c__ * h__[istart + 1 + h_dim1] - s * h__[istart + (h_dim1 <<
3650 h__[istart + (h_dim1 << 1)] = c__ * a1 + s * a2;
3651 h__[istart + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
3652 h__[istart + 1 + h_dim1] = c__ * a3 + s * a4;
3655 i__2 = (i__3 < kplusp) ? i__3 : kplusp;
3656 for (j = 1; j <= i__2; ++j)
3658 a1 = c__ * q[j + istart * q_dim1] + s * q[j + (istart + 1) *
3660 q[j + (istart + 1) * q_dim1] = -s * q[j + istart * q_dim1] +
3661 c__ * q[j + (istart + 1) * q_dim1];
3662 q[j + istart * q_dim1] = a1;
3667 for (i__ = istart + 1; i__ <= i__2; ++i__)
3670 f = h__[i__ + h_dim1];
3671 g = s * h__[i__ + 1 + h_dim1];
3673 h__[i__ + 1 + h_dim1] = c__ * h__[i__ + 1 + h_dim1];
3674 F77_FUNC(slartg, SLARTG) (&f, &g, &c__, &s, &r__);
3683 h__[i__ + h_dim1] = r__;
3685 a1 = c__ * h__[i__ + (h_dim1 << 1)] + s * h__[i__ + 1 +
3687 a2 = c__ * h__[i__ + 1 + h_dim1] + s * h__[i__ + 1 + (h_dim1
3689 a3 = c__ * h__[i__ + 1 + h_dim1] - s * h__[i__ + (h_dim1 << 1)
3691 a4 = c__ * h__[i__ + 1 + (h_dim1 << 1)] - s * h__[i__ + 1 +
3694 h__[i__ + (h_dim1 << 1)] = c__ * a1 + s * a2;
3695 h__[i__ + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
3696 h__[i__ + 1 + h_dim1] = c__ * a3 + s * a4;
3699 i__3 = (i__4 < kplusp) ? i__4 : kplusp;
3700 for (j = 1; j <= i__3; ++j)
3702 a1 = c__ * q[j + i__ * q_dim1] + s * q[j + (i__ + 1) *
3704 q[j + (i__ + 1) * q_dim1] = -s * q[j + i__ * q_dim1] +
3705 c__ * q[j + (i__ + 1) * q_dim1];
3706 q[j + i__ * q_dim1] = a1;
3715 if (h__[iend + h_dim1] < 0.)
3717 h__[iend + h_dim1] = -h__[iend + h_dim1];
3718 F77_FUNC(sscal, SSCAL) (&kplusp, &c_b14, &q[iend * q_dim1 + 1], &c__1);
3727 for (i__ = itop; i__ <= i__2; ++i__)
3729 if (h__[i__ + 1 + h_dim1] > 0.)
3741 for (i__ = itop; i__ <= i__1; ++i__)
3743 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__+ 1 + (h_dim1*2)]);
3744 if (h__[i__ + 1 + h_dim1] <= epsmch * big)
3746 h__[i__ + 1 + h_dim1] = 0.;
3751 if (h__[*kev + 1 + h_dim1] > 0.)
3753 F77_FUNC(sgemv, SGEMV) ("N", n, &kplusp, &c_b5, &v[v_offset], ldv, &q[(*kev + 1) *
3754 q_dim1 + 1], &c__1, &c_b4, &workd[*n + 1], &c__1);
3758 for (i__ = 1; i__ <= i__1; ++i__)
3760 i__2 = kplusp - i__ + 1;
3761 F77_FUNC(sgemv, SGEMV) ("N", n, &i__2, &c_b5, &v[v_offset], ldv, &q[(*kev - i__ + 1) *
3762 q_dim1 + 1], &c__1, &c_b4, &workd[1], &c__1);
3763 F77_FUNC(scopy, SCOPY) (n, &workd[1], &c__1, &v[(kplusp - i__ + 1) * v_dim1 + 1], &
3768 F77_FUNC(slacpy, SLACPY) ("All", n, kev, &v[(*np + 1) * v_dim1 + 1], ldv, &v[v_offset], ldv);
3770 if (h__[*kev + 1 + h_dim1] > 0.)
3772 F77_FUNC(scopy, SCOPY) (n, &workd[*n + 1], &c__1, &v[(*kev + 1) * v_dim1 + 1], &c__1);
3775 F77_FUNC(sscal, SSCAL) (n, &q[kplusp + *kev * q_dim1], &resid[1], &c__1);
3776 if (h__[*kev + 1 + h_dim1] > 0.)
3778 F77_FUNC(saxpy, SAXPY) (n, &h__[*kev + 1 + h_dim1], &v[(*kev + 1) * v_dim1 + 1], &c__1,
3792 F77_FUNC(ssortr, SSORTR) (const char * which,
3807 if (!strncmp(which, "SA", 2))
3816 for (i__ = igap; i__ <= i__1; ++i__)
3826 if (x1[j] < x1[j + igap])
3829 x1[j] = x1[j + igap];
3830 x1[j + igap] = temp;
3834 x2[j] = x2[j + igap];
3835 x2[j + igap] = temp;
3851 else if (!strncmp(which, "SM", 2))
3860 for (i__ = igap; i__ <= i__1; ++i__)
3870 if (fabs(x1[j]) < fabs(x1[j + igap]))
3873 x1[j] = x1[j + igap];
3874 x1[j + igap] = temp;
3878 x2[j] = x2[j + igap];
3879 x2[j + igap] = temp;
3895 else if (!strncmp(which, "LA", 2))
3904 for (i__ = igap; i__ <= i__1; ++i__)
3914 if (x1[j] > x1[j + igap])
3917 x1[j] = x1[j + igap];
3918 x1[j + igap] = temp;
3922 x2[j] = x2[j + igap];
3923 x2[j + igap] = temp;
3939 else if (!strncmp(which, "LM", 2))
3949 for (i__ = igap; i__ <= i__1; ++i__)
3959 if (fabs(x1[j]) > fabs(x1[j + igap]))
3962 x1[j] = x1[j + igap];
3963 x1[j + igap] = temp;
3967 x2[j] = x2[j + igap];
3968 x2[j + igap] = temp;
3993 F77_FUNC(ssesrt, SSESRT) (const char * which,
4001 int a_dim1, a_offset, i__1;
4008 a_offset = 1 + a_dim1 * 0;
4013 if (!strncmp(which, "SA", 2))
4022 for (i__ = igap; i__ <= i__1; ++i__)
4032 if (x[j] < x[j + igap])
4039 F77_FUNC(sswap, SSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
4040 a_dim1 + 1], &c__1);
4056 else if (!strncmp(which, "SM", 2))
4065 for (i__ = igap; i__ <= i__1; ++i__)
4075 if (fabs(x[j]) < fabs(x[j + igap]))
4082 F77_FUNC(sswap, SSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
4083 a_dim1 + 1], &c__1);
4099 else if (!strncmp(which, "LA", 2))
4108 for (i__ = igap; i__ <= i__1; ++i__)
4118 if (x[j] > x[j + igap])
4125 F77_FUNC(sswap, SSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
4126 a_dim1 + 1], &c__1);
4142 else if (!strncmp(which, "LM", 2))
4151 for (i__ = igap; i__ <= i__1; ++i__)
4161 if (fabs(x[j]) > fabs(x[j + igap]))
4168 F77_FUNC(sswap, SSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
4169 a_dim1 + 1], &c__1);
4194 F77_FUNC(ssgets, SSGETS) (int * ishift,
4210 if (!strncmp(which, "BE", 2))
4213 F77_FUNC(ssortr, SSORTR) ("LA", &c__1, &i__1, &ritz[1], &bounds[1]);
4217 i__1 = (kevd2 < *np) ? kevd2 : *np;
4218 i__2 = (kevd2 > *np) ? kevd2 : *np;
4219 F77_FUNC(sswap, SSWAP) (&i__1, &ritz[1], &c__1,
4220 &ritz[i__2 + 1], &c__1);
4221 i__1 = (kevd2 < *np) ? kevd2 : *np;
4222 i__2 = (kevd2 > *np) ? kevd2 : *np;
4223 F77_FUNC(sswap, SSWAP) (&i__1, &bounds[1], &c__1,
4224 &bounds[i__2 + 1], &c__1);
4231 F77_FUNC(ssortr, SSORTR) (which, &c__1, &i__1, &ritz[1], &bounds[1]);
4234 if (*ishift == 1 && *np > 0)
4237 F77_FUNC(ssortr, SSORTR) ("SM", &c__1, np, &bounds[1], &ritz[1]);
4238 F77_FUNC(scopy, SCOPY) (np, &ritz[1], &c__1, &shifts[1], &c__1);
4248 F77_FUNC(ssconv, SSCONV) (int * n,
4264 eps23 = GMX_FLOAT_EPS;
4265 eps23 = pow(eps23, c_b3);
4269 for (i__ = 1; i__ <= i__1; ++i__)
4273 d__3 = fabs(ritz[i__]);
4274 temp = (d__2 > d__3) ? d__2 : d__3;
4275 if (bounds[i__] <= *tol * temp)
4286 F77_FUNC(sseigt, SSEIGT) (float * rnorm,
4296 int h_dim1, h_offset, i__1;
4305 h_offset = 1 + h_dim1;
4308 F77_FUNC(scopy, SCOPY) (n, &h__[(h_dim1 << 1) + 1], &c__1, &eig[1], &c__1);
4310 F77_FUNC(scopy, SCOPY) (&i__1, &h__[h_dim1 + 2], &c__1, &workl[1], &c__1);
4311 F77_FUNC(sstqrb, SSTQRB) (n, &eig[1], &workl[1], &bounds[1], &workl[*n + 1], ierr);
4318 for (k = 1; k <= i__1; ++k)
4320 bounds[k] = *rnorm * fabs(bounds[k]);
4333 F77_FUNC(ssaitr, SSAITR) (int * ido,
4357 int h_dim1, h_offset, v_dim1, v_offset, i__1;
4361 float safmin, minval;
4367 v_offset = 1 + v_dim1;
4370 h_offset = 1 + h_dim1;
4374 minval = GMX_FLOAT_MIN;
4375 safmin = minval / GMX_FLOAT_EPS;
4389 iwork[9] = iwork[8] + *n;
4390 iwork[10] = iwork[9] + *n;
4428 F77_FUNC(sgetv0, sgetv0) (ido, bmat, &iwork[11], &c__0, n, &iwork[12], &v[v_offset], ldv,
4429 &resid[1], rnorm, &ipntr[1], &workd[1], &iwork[21], &iwork[7]);
4442 *info = iwork[12] - 1;
4449 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &v[iwork[12] * v_dim1 + 1], &c__1);
4450 if (*rnorm >= safmin)
4452 temp1 = 1. / *rnorm;
4453 F77_FUNC(sscal, SSCAL) (n, &temp1, &v[iwork[12] * v_dim1 + 1], &c__1);
4454 F77_FUNC(sscal, SSCAL) (n, &temp1, &workd[iwork[8]], &c__1);
4459 F77_FUNC(slascl, SLASCL) ("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &v[iwork[12] *
4460 v_dim1 + 1], n, &infol);
4461 F77_FUNC(slascl, SLASCL) ("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &workd[iwork[
4466 F77_FUNC(scopy, SCOPY) (n, &v[iwork[12] * v_dim1 + 1], &c__1, &workd[iwork[10]], &c__1);
4467 ipntr[1] = iwork[10];
4468 ipntr[2] = iwork[9];
4469 ipntr[3] = iwork[8];
4478 F77_FUNC(scopy, SCOPY) (n, &workd[iwork[9]], &c__1, &resid[1], &c__1);
4487 ipntr[1] = iwork[9];
4488 ipntr[2] = iwork[8];
4493 else if (*bmat == 'I')
4495 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
4505 workd[*n * 3 + 3] = F77_FUNC(sdot, SDOT) (n, &resid[1], &c__1, &workd[iwork[10]], &
4507 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
4509 else if (*bmat == 'G')
4511 workd[*n * 3 + 3] = F77_FUNC(sdot, SDOT) (n, &resid[1], &c__1, &workd[iwork[8]], &
4513 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
4515 else if (*bmat == 'I')
4517 workd[*n * 3 + 3] = F77_FUNC(snrm2, SNRM2) (n, &resid[1], &c__1);
4522 F77_FUNC(sgemv, SGEMV) ("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]],
4523 &c__1, &c_b42, &workd[iwork[9]], &c__1);
4525 else if (*mode == 2)
4527 F77_FUNC(sgemv, SGEMV) ("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[10]
4528 ], &c__1, &c_b42, &workd[iwork[9]], &c__1);
4531 F77_FUNC(sgemv, SGEMV) ("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
4532 c__1, &c_b18, &resid[1], &c__1);
4534 h__[iwork[12] + (h_dim1 << 1)] = workd[iwork[9] + iwork[12] - 1];
4535 if (iwork[12] == 1 || iwork[4] == 1)
4537 h__[iwork[12] + h_dim1] = 0.;
4541 h__[iwork[12] + h_dim1] = *rnorm;
4549 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
4550 ipntr[1] = iwork[9];
4551 ipntr[2] = iwork[8];
4556 else if (*bmat == 'I')
4558 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
4566 *rnorm = F77_FUNC(sdot, SDOT) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
4567 *rnorm = sqrt(fabs(*rnorm));
4569 else if (*bmat == 'I')
4571 *rnorm = F77_FUNC(snrm2, SNRM2) (n, &resid[1], &c__1);
4574 if (*rnorm > workd[*n * 3 + 3] * .717f)
4581 F77_FUNC(sgemv, SGEMV) ("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]], &
4582 c__1, &c_b42, &workd[iwork[9]], &c__1);
4584 F77_FUNC(sgemv, SGEMV) ("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
4585 c__1, &c_b18, &resid[1], &c__1);
4587 if (iwork[12] == 1 || iwork[4] == 1)
4589 h__[iwork[12] + h_dim1] = 0.;
4591 h__[iwork[12] + (h_dim1 << 1)] += workd[iwork[9] + iwork[12] - 1];
4596 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
4597 ipntr[1] = iwork[9];
4598 ipntr[2] = iwork[8];
4603 else if (*bmat == 'I')
4605 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
4612 workd[*n * 3 + 2] = F77_FUNC(sdot, SDOT) (n, &resid[1], &c__1, &workd[iwork[8]], &
4614 workd[*n * 3 + 2] = sqrt(fabs(workd[*n * 3 + 2]));
4616 else if (*bmat == 'I')
4618 workd[*n * 3 + 2] = F77_FUNC(snrm2, SNRM2) (n, &resid[1], &c__1);
4622 if (workd[*n * 3 + 2] > *rnorm * .717f)
4625 *rnorm = workd[*n * 3 + 2];
4631 *rnorm = workd[*n * 3 + 2];
4639 for (jj = 1; jj <= i__1; ++jj)
4651 if (h__[iwork[12] + h_dim1] < 0.)
4653 h__[iwork[12] + h_dim1] = -h__[iwork[12] + h_dim1];
4654 if (iwork[12] < *k + *np)
4656 F77_FUNC(sscal, SSCAL) (n, &c_b50, &v[(iwork[12] + 1) * v_dim1 + 1], &c__1);
4660 F77_FUNC(sscal, SSCAL) (n, &c_b50, &resid[1], &c__1);
4665 if (iwork[12] > *k + *np)
4685 F77_FUNC(ssaup2, SSAUP2) (int * ido,
4694 int gmx_unused * iupd,
4715 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
4734 v_offset = 1 + v_dim1;
4737 h_offset = 1 + h_dim1;
4740 q_offset = 1 + q_dim1;
4744 eps23 = GMX_FLOAT_EPS;
4745 eps23 = pow(eps23, c_b3);
4758 iwork[7] = iwork[9] + iwork[10];
4781 F77_FUNC(sgetv0, SGETV0) (ido, bmat, &c__1, &iwork[3], n, &c__1, &v[v_offset], ldv, &
4782 resid[1], &workd[*n * 3 + 1], &ipntr[1], &workd[1], &iwork[41],
4790 if (workd[*n * 3 + 1] == 0.)
4815 F77_FUNC(ssaitr, SSAITR) (ido, bmat, n, &c__0, &iwork[9], mode, &resid[1], &workd[*n * 3 +
4816 1], &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
4842 F77_FUNC(ssaitr, SSAITR) (ido, bmat, n, nev, np, mode, &resid[1], &workd[*n * 3 + 1], &v[
4843 v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1], &iwork[
4861 F77_FUNC(sseigt, SSEIGT) (&workd[*n * 3 + 1], &iwork[7], &h__[h_offset], ldh, &ritz[1], &
4862 bounds[1], &workl[1], &ierr);
4870 F77_FUNC(scopy, SCOPY) (&iwork[7], &ritz[1], &c__1, &workl[iwork[7] + 1], &c__1);
4871 F77_FUNC(scopy, SCOPY) (&iwork[7], &bounds[1], &c__1, &workl[(iwork[7] << 1) + 1], &c__1);
4875 F77_FUNC(ssgets, SSGETS) (ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
4877 F77_FUNC(scopy, SCOPY) (nev, &bounds[*np + 1], &c__1, &workl[*np + 1], &c__1);
4878 F77_FUNC(ssconv, SSCONV) (nev, &ritz[*np + 1], &workl[*np + 1], tol, &iwork[8]);
4883 for (j = 1; j <= i__1; ++j)
4885 if (bounds[j] == 0.)
4892 if (iwork[8] >= iwork[9] || iwork[6] > *mxiter || *np == 0)
4895 if (!strncmp(which, "BE", 2))
4898 strncpy(wprime, "SA", 2);
4899 F77_FUNC(ssortr, SSORTR) (wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
4901 nevm2 = *nev - nevd2;
4904 i__1 = (nevd2 < *np) ? nevd2 : *np;
4905 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np + 1;
4906 F77_FUNC(sswap, SSWAP) (&i__1, &ritz[nevm2 + 1], &c__1,
4907 &ritz[((i__2 > i__3) ? i__2 : i__3)],
4909 i__1 = (nevd2 < *np) ? nevd2 : *np;
4910 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np;
4911 F77_FUNC(sswap, SSWAP) (&i__1, &bounds[nevm2 + 1], &c__1,
4912 &bounds[((i__2 > i__3) ? i__2 : i__3) + 1],
4920 if (!strncmp(which, "LM", 2))
4922 strncpy(wprime, "SM", 2);
4924 if (!strncmp(which, "SM", 2))
4926 strncpy(wprime, "LM", 2);
4928 if (!strncmp(which, "LA", 2))
4930 strncpy(wprime, "SA", 2);
4932 if (!strncmp(which, "SA", 2))
4934 strncpy(wprime, "LA", 2);
4937 F77_FUNC(ssortr, SSORTR) (wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
4942 for (j = 1; j <= i__1; ++j)
4945 d__3 = fabs(ritz[j]);
4946 temp = (d__2 > d__3) ? d__2 : d__3;
4950 strncpy(wprime, "LA", 2);
4951 F77_FUNC(ssortr, SSORTR) (wprime, &c__1, &iwork[9], &bounds[1], &ritz[1]);
4954 for (j = 1; j <= i__1; ++j)
4957 d__3 = fabs(ritz[j]);
4958 temp = (d__2 > d__3) ? d__2 : d__3;
4962 if (!strncmp(which, "BE", 2))
4965 strncpy(wprime, "LA", 2);
4966 F77_FUNC(ssortr, SSORTR) (wprime, &c__1, &iwork[8], &ritz[1], &bounds[1]);
4971 F77_FUNC(ssortr, SSORTR) (which, &c__1, &iwork[8], &ritz[1], &bounds[1]);
4975 h__[h_dim1 + 1] = workd[*n * 3 + 1];
4978 if (iwork[6] > *mxiter && iwork[8] < *nev)
4982 if (*np == 0 && iwork[8] < iwork[9])
4991 else if (iwork[8] < *nev && *ishift == 1)
4994 i__1 = iwork[8], i__2 = *np / 2;
4995 *nev += (i__1 < i__2) ? i__1 : i__2;
4996 if (*nev == 1 && iwork[7] >= 6)
4998 *nev = iwork[7] / 2;
5000 else if (*nev == 1 && iwork[7] > 2)
5004 *np = iwork[7] - *nev;
5009 F77_FUNC(ssgets, SSGETS) (ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
5029 F77_FUNC(scopy, SCOPY) (np, &workl[1], &c__1, &ritz[1], &c__1);
5032 F77_FUNC(ssapps, SSAPPS) (n, nev, np, &ritz[1], &v[v_offset], ldv, &h__[h_offset], ldh, &
5033 resid[1], &q[q_offset], ldq, &workd[1]);
5038 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[*n + 1], &c__1);
5045 else if (*bmat == 'I')
5047 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
5054 workd[*n * 3 + 1] = F77_FUNC(sdot, SDOT) (n, &resid[1], &c__1, &workd[1], &c__1);
5055 workd[*n * 3 + 1] = sqrt(fabs(workd[*n * 3 + 1]));
5057 else if (*bmat == 'I')
5059 workd[*n * 3 + 1] = F77_FUNC(snrm2, SNRM2) (n, &resid[1], &c__1);
5081 F77_FUNC(ssaupd, SSAUPD) (int * ido,
5099 int v_dim1, v_offset, i__1, i__2;
5105 v_offset = 1 + v_dim1;
5117 iwork[5] = iparam[1];
5118 iwork[10] = iparam[3];
5119 iwork[12] = iparam[4];
5122 iwork[11] = iparam[7];
5133 else if (*ncv <= *nev || *ncv > *n)
5139 iwork[15] = *ncv - *nev;
5145 if (strncmp(which, "LM", 2) && strncmp(which, "SM", 2) &&
5146 strncmp(which, "LA", 2) && strncmp(which, "SA", 2) &&
5147 strncmp(which, "BE", 2))
5151 if (*bmat != 'I' && *bmat != 'G')
5157 if (*lworkl < i__1 * i__1 + (*ncv << 3))
5161 if (iwork[11] < 1 || iwork[11] > 5)
5165 else if (iwork[11] == 1 && *bmat == 'G')
5169 else if (iwork[5] < 0 || iwork[5] > 1)
5173 else if (*nev == 1 && !strncmp(which, "BE", 2))
5191 *tol = GMX_FLOAT_EPS;
5194 iwork[15] = *ncv - *nev;
5197 i__1 = i__2 * i__2 + (*ncv << 3);
5198 for (j = 1; j <= i__1; ++j)
5206 iwork[16] = iwork[3] + (iwork[8] << 1);
5207 iwork[1] = iwork[16] + *ncv;
5208 iwork[4] = iwork[1] + *ncv;
5210 iwork[7] = iwork[4] + i__1 * i__1;
5211 iwork[14] = iwork[7] + *ncv * 3;
5213 ipntr[4] = iwork[14];
5214 ipntr[5] = iwork[3];
5215 ipntr[6] = iwork[16];
5216 ipntr[7] = iwork[1];
5217 ipntr[11] = iwork[7];
5220 F77_FUNC(ssaup2, SSAUP2) (ido, bmat, n, which, &iwork[13], &iwork[15], tol, &resid[1], &
5221 iwork[11], &iwork[6], &iwork[5], &iwork[10], &v[v_offset], ldv, &
5222 workl[iwork[3]], &iwork[8], &workl[iwork[16]], &workl[iwork[1]], &
5223 workl[iwork[4]], &iwork[9], &workl[iwork[7]], &ipntr[1], &workd[1],
5228 iparam[8] = iwork[15];
5235 iparam[3] = iwork[10];
5236 iparam[5] = iwork[15];
5256 F77_FUNC(sseupd, SSEUPD) (int * rvec,
5257 const char * howmny,
5282 int v_dim1, v_offset, z_dim1, z_offset, i__1;
5283 float d__1, d__2, d__3;
5285 int j, k, ih, iq, iw, ibd, ihb, ihd, ldh, ilg, ldq, ism, irz;
5297 float thres1 = 0, thres2 = 0;
5301 int leftptr, rghtptr;
5307 z_offset = 1 + z_dim1;
5312 v_offset = 1 + v_dim1;
5340 if (*ncv <= *nev || *ncv > *n)
5344 if (strncmp(which, "LM", 2) && strncmp(which, "SM", 2) &&
5345 strncmp(which, "LA", 2) && strncmp(which, "SA", 2) &&
5346 strncmp(which, "BE", 2))
5350 if (*bmat != 'I' && *bmat != 'G')
5354 if (*howmny != 'A' && *howmny != 'P' &&
5355 *howmny != 'S' && *rvec)
5359 if (*rvec && *howmny == 'S')
5364 if (*rvec && *lworkl < i__1 * i__1 + (*ncv << 3))
5369 if (mode == 1 || mode == 2)
5371 strncpy(type__, "REGULR", 6);
5375 strncpy(type__, "SHIFTI", 6);
5379 strncpy(type__, "BUCKLE", 6);
5383 strncpy(type__, "CAYLEY", 6);
5389 if (mode == 1 && *bmat == 'G')
5393 if (*nev == 1 && !strncmp(which, "BE", 2))
5412 iw = iq + ldh * *ncv;
5413 next = iw + (*ncv << 1);
5419 irz = ipntr[11] + *ncv;
5423 eps23 = GMX_FLOAT_EPS;
5424 eps23 = pow(eps23, c_b21);
5431 else if (*bmat == 'G')
5433 bnorm2 = F77_FUNC(snrm2, SNRM2) (n, &workd[1], &c__1);
5439 if (!strncmp(which, "LM", 2) || !strncmp(which, "SM", 2) ||
5440 !strncmp(which, "LA", 2) || !strncmp(which, "SA", 2))
5444 else if (!strncmp(which, "BE", 2))
5448 ism = (*nev > nconv) ? *nev : nconv;
5451 thres1 = workl[ism];
5452 thres2 = workl[ilg];
5460 for (j = 0; j <= i__1; ++j)
5463 if (!strncmp(which, "LM", 2))
5465 if (fabs(workl[irz + j]) >= fabs(thres1))
5468 d__3 = fabs(workl[irz + j]);
5469 tempbnd = (d__2 > d__3) ? d__2 : d__3;
5470 if (workl[ibd + j] <= *tol * tempbnd)
5476 else if (!strncmp(which, "SM", 2))
5478 if (fabs(workl[irz + j]) <= fabs(thres1))
5481 d__3 = fabs(workl[irz + j]);
5482 tempbnd = (d__2 > d__3) ? d__2 : d__3;
5483 if (workl[ibd + j] <= *tol * tempbnd)
5489 else if (!strncmp(which, "LA", 2))
5491 if (workl[irz + j] >= thres1)
5494 d__3 = fabs(workl[irz + j]);
5495 tempbnd = (d__2 > d__3) ? d__2 : d__3;
5496 if (workl[ibd + j] <= *tol * tempbnd)
5502 else if (!strncmp(which, "SA", 2))
5504 if (workl[irz + j] <= thres1)
5507 d__3 = fabs(workl[irz + j]);
5508 tempbnd = (d__2 > d__3) ? d__2 : d__3;
5509 if (workl[ibd + j] <= *tol * tempbnd)
5515 else if (!strncmp(which, "BE", 2))
5517 if (workl[irz + j] <= thres1 || workl[irz + j] >= thres2)
5520 d__3 = fabs(workl[irz + j]);
5521 tempbnd = (d__2 > d__3) ? d__2 : d__3;
5522 if (workl[ibd + j] <= *tol * tempbnd)
5530 reord = select[j + 1] || reord;
5539 F77_FUNC(scopy, SCOPY) (&i__1, &workl[ih + 1], &c__1, &workl[ihb], &c__1);
5540 F77_FUNC(scopy, SCOPY) (ncv, &workl[ih + ldh], &c__1, &workl[ihd], &c__1);
5542 F77_FUNC(ssteqr, SSTEQR) ("Identity", ncv, &workl[ihd], &workl[ihb], &workl[iq], &ldq, &
5564 if (select[leftptr])
5570 else if (!select[rghtptr])
5579 temp = workl[ihd + leftptr - 1];
5580 workl[ihd + leftptr - 1] = workl[ihd + rghtptr - 1];
5581 workl[ihd + rghtptr - 1] = temp;
5582 F77_FUNC(scopy, SCOPY) (ncv, &workl[iq + *ncv * (leftptr - 1)], &c__1, &workl[
5584 F77_FUNC(scopy, SCOPY) (ncv, &workl[iq + *ncv * (rghtptr - 1)], &c__1, &workl[
5585 iq + *ncv * (leftptr - 1)], &c__1);
5586 F77_FUNC(scopy, SCOPY) (ncv, &workl[iw], &c__1, &workl[iq + *ncv * (rghtptr -
5593 if (leftptr < rghtptr)
5602 F77_FUNC(scopy, SCOPY) (&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
5608 F77_FUNC(scopy, SCOPY) (&nconv, &workl[ritz], &c__1, &d__[1], &c__1);
5609 F77_FUNC(scopy, SCOPY) (ncv, &workl[ritz], &c__1, &workl[ihd], &c__1);
5612 if (!strncmp(type__, "REGULR", 6))
5617 F77_FUNC(ssesrt, SSESRT) ("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
5621 F77_FUNC(scopy, SCOPY) (ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
5628 F77_FUNC(scopy, SCOPY) (ncv, &workl[ihd], &c__1, &workl[iw], &c__1);
5629 if (!strncmp(type__, "SHIFTI", 6))
5632 for (k = 1; k <= i__1; ++k)
5634 workl[ihd + k - 1] = 1. / workl[ihd + k - 1] + *sigma;
5637 else if (!strncmp(type__, "BUCKLE", 6))
5640 for (k = 1; k <= i__1; ++k)
5642 workl[ihd + k - 1] = *sigma * workl[ihd + k - 1] / (workl[ihd
5646 else if (!strncmp(type__, "CAYLEY", 6))
5649 for (k = 1; k <= i__1; ++k)
5651 workl[ihd + k - 1] = *sigma * (workl[ihd + k - 1] + 1.) / (
5652 workl[ihd + k - 1] - 1.);
5656 F77_FUNC(scopy, SCOPY) (&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
5657 F77_FUNC(ssortr, SSORTR) ("LA", &c__1, &nconv, &workl[ihd], &workl[iw]);
5660 F77_FUNC(ssesrt, SSESRT) ("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
5664 F77_FUNC(scopy, SCOPY) (ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
5665 d__1 = bnorm2 / rnorm;
5666 F77_FUNC(sscal, SSCAL) (ncv, &d__1, &workl[ihb], &c__1);
5667 F77_FUNC(ssortr, SSORTR) ("LA", &c__1, &nconv, &d__[1], &workl[ihb]);
5672 if (*rvec && *howmny == 'A')
5675 F77_FUNC(sgeqr2, SGEQR2) (ncv, &nconv, &workl[iq], &ldq, &workl[iw + *ncv], &workl[ihb],
5678 F77_FUNC(sorm2r, SORM2R) ("Right", "Notranspose", n, ncv, &nconv, &workl[iq], &ldq, &
5679 workl[iw + *ncv], &v[v_offset], ldv, &workd[*n + 1], &ierr);
5680 F77_FUNC(slacpy, SLACPY) ("All", n, &nconv, &v[v_offset], ldv, &z__[z_offset], ldz);
5683 for (j = 1; j <= i__1; ++j)
5685 workl[ihb + j - 1] = 0.;
5687 workl[ihb + *ncv - 1] = 1.;
5688 F77_FUNC(sorm2r, SORM2R) ("Left", "Transpose", ncv, &c__1, &nconv, &workl[iq], &ldq, &
5689 workl[iw + *ncv], &workl[ihb], ncv, &temp, &ierr);
5692 else if (*rvec && *howmny == 'S')
5697 if (!strncmp(type__, "REGULR", 6) && *rvec)
5701 for (j = 1; j <= i__1; ++j)
5703 workl[ihb + j - 1] = rnorm * fabs(workl[ihb + j - 1]);
5707 else if (strncmp(type__, "REGULR", 6) && *rvec)
5710 F77_FUNC(sscal, SSCAL) (ncv, &bnorm2, &workl[ihb], &c__1);
5711 if (!strncmp(type__, "SHIFTI", 6))
5715 for (k = 1; k <= i__1; ++k)
5717 d__2 = workl[iw + k - 1];
5718 workl[ihb + k - 1] = fabs(workl[ihb + k - 1])/(d__2 * d__2);
5722 else if (!strncmp(type__, "BUCKLE", 6))
5726 for (k = 1; k <= i__1; ++k)
5728 d__2 = workl[iw + k - 1] - 1.;
5729 workl[ihb + k - 1] = *sigma * fabs(workl[ihb + k - 1])/(d__2 * d__2);
5733 else if (!strncmp(type__, "CAYLEY", 6))
5737 for (k = 1; k <= i__1; ++k)
5739 workl[ihb + k - 1] = fabs(workl[ihb + k - 1] / workl[iw + k - 1] * (workl[iw + k - 1] - 1.));
5747 if (*rvec && (!strncmp(type__, "SHIFTI", 6) || !strncmp(type__, "CAYLEY", 6)))
5751 for (k = 0; k <= i__1; ++k)
5753 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / workl[iw + k];
5757 else if (*rvec && !strncmp(type__, "BUCKLE", 6))
5761 for (k = 0; k <= i__1; ++k)
5763 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / (workl[iw + k] -
5769 if (strncmp(type__, "REGULR", 6))
5771 F77_FUNC(sger, SGER) (n, &nconv, &c_b102, &resid[1], &c__1, &workl[iw], &c__1, &z__[