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.
41 #include "gromacs/utility/basedefinitions.h"
42 #include "gromacs/utility/real.h"
44 #include "gmx_arpack.h"
46 #include "gmx_lapack.h"
49 F77_FUNC(dstqrb, DSTQRB) (int * n,
65 int l1, ii, mm, lm1, mm1, nm1;
69 int lend, jtot, lendm1, lendp1, iscale;
71 int lendsv, nmaxit, icompz;
72 double ssfmax, ssfmin, safmin, minval, safmax, anorm;
102 minval = GMX_DOUBLE_MIN;
103 safmin = minval / GMX_DOUBLE_EPS;
104 safmax = 1. / safmin;
105 ssfmax = sqrt(safmax) / 3.;
106 ssfmin = sqrt(safmin) / eps2;
111 for (j = 1; j <= i__1; ++j)
137 for (m = l1; m <= i__1; ++m)
144 if (tst <= sqrt(fabs(d__[m])) * sqrt(fabs(d__[m+1])) * eps)
165 anorm = F77_FUNC(dlanst, DLANST) ("i", &i__1, &d__[l], &e[l]);
175 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n,
178 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n,
181 else if (anorm < ssfmin)
185 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n,
188 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n,
192 if (fabs(d__[lend]) < fabs(d__[l]))
206 for (m = l; m <= i__1; ++m)
210 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m + 1]) + safmin)
234 F77_FUNC(dlaev2, DLAEV2) (&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s);
236 work[*n - 1 + l] = s;
239 z__[l + 1] = c__ * tst - s * z__[l];
240 z__[l] = s * tst + c__ * z__[l];
244 F77_FUNC(dlae2, DLAE2) (&d__[l], &e[l], &d__[l + 1], &rt1, &rt2);
263 g = (d__[l + 1] - p) / (e[l] * 2.);
264 r__ = F77_FUNC(dlapy2, DLAPY2) (&g, &c_b31);
265 g = d__[m] - p + e[l] / (g + ((g > 0) ? r__ : -r__ ));
273 for (i__ = mm1; i__ >= i__1; --i__)
277 F77_FUNC(dlartg, DLARTG) (&g, &f, &c__, &s, &r__);
282 g = d__[i__ + 1] - p;
283 r__ = (d__[i__] - g) * s + c__ * 2. * b;
285 d__[i__ + 1] = g + p;
291 work[*n - 1 + i__] = -s;
300 F77_FUNC(dlasr, DLASR) ("r", "v", "b", &c__1, &mm, &work[l], &work[*n - 1 + l], &
327 for (m = l; m >= i__1; --m)
329 d__2 = fabs(e[m - 1]);
331 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m- 1]) + safmin)
355 F77_FUNC(dlaev2, DLAEV2) (&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s)
359 z__[l] = c__ * tst - s * z__[l - 1];
360 z__[l - 1] = s * tst + c__ * z__[l - 1];
364 F77_FUNC(dlae2, DLAE2) (&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2);
384 g = (d__[l - 1] - p) / (e[l - 1] * 2.);
385 r__ = F77_FUNC(dlapy2, DLAPY2) (&g, &c_b31);
386 g = d__[m] - p + e[l - 1] / (g + ((g > 0) ? r__ : -r__ ));
394 for (i__ = m; i__ <= i__1; ++i__)
398 F77_FUNC(dlartg, DLARTG) (&g, &f, &c__, &s, &r__);
404 r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b;
412 work[*n - 1 + i__] = s;
421 F77_FUNC(dlasr, DLASR) ("r", "v", "f", &c__1, &mm, &work[m], &work[*n - 1 + m], &
444 i__1 = lendsv - lsv + 1;
445 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv],
448 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n,
451 else if (iscale == 2)
453 i__1 = lendsv - lsv + 1;
454 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv],
457 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n,
466 for (i__ = 1; i__ <= i__1; ++i__)
479 F77_FUNC(dlasrt, DLASRT) ("i", n, &d__[1], info);
486 for (ii = 2; ii <= i__1; ++ii)
492 for (j = ii; j <= i__2; ++j)
518 F77_FUNC(dgetv0, DGETV0) (int * ido,
520 int gmx_unused * itry,
537 int v_dim1, v_offset, i__1;
545 v_offset = 1 + v_dim1;
561 F77_FUNC(dlarnv, DLARNV) (&idist, &iwork[1], n, &resid[1]);
568 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
587 F77_FUNC(dcopy, DCOPY) (n, &workd[*n + 1], &c__1, &resid[1], &c__1);
593 else if (*bmat == 'I')
595 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
604 workd[*n * 3 + 4] = F77_FUNC(ddot, DDOT) (n, &resid[1], &c__1, &workd[1], &c__1);
605 workd[*n * 3 + 4] = sqrt(fabs(workd[*n * 3 + 4]));
607 else if (*bmat == 'I')
609 workd[*n * 3 + 4] = F77_FUNC(dnrm2, DNRM2) (n, &resid[1], &c__1);
611 *rnorm = workd[*n * 3 + 4];
621 F77_FUNC(dgemv, DGEMV) ("T", n, &i__1, &c_b22, &v[v_offset], ldv, &workd[1], &c__1, &c_b24,
622 &workd[*n + 1], &c__1);
624 F77_FUNC(dgemv, DGEMV) ("N", n, &i__1, &c_b27, &v[v_offset], ldv, &workd[*n + 1], &c__1, &
625 c_b22, &resid[1], &c__1);
629 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[*n + 1], &c__1);
635 else if (*bmat == 'I')
637 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
644 *rnorm = F77_FUNC(ddot, DDOT) (n, &resid[1], &c__1, &workd[1], &c__1);
645 *rnorm = sqrt(fabs(*rnorm));
647 else if (*bmat == 'I')
649 *rnorm = F77_FUNC(dnrm2, DNRM2) (n, &resid[1], &c__1);
652 if (*rnorm > workd[*n * 3 + 4] * .717f)
661 workd[*n * 3 + 4] = *rnorm;
668 for (jj = 1; jj <= i__1; ++jj)
689 F77_FUNC(dsapps, DSAPPS) (int * n,
706 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
710 double r__, s, a1, a2, a3, a4;
721 v_offset = 1 + v_dim1;
724 h_offset = 1 + h_dim1;
727 q_offset = 1 + q_dim1;
730 epsmch = GMX_DOUBLE_EPS;
736 F77_FUNC(dlaset, DLASET) ("All", &kplusp, &kplusp, &c_b4, &c_b5, &q[q_offset], ldq);
744 for (jj = 1; jj <= i__1; ++jj)
752 for (i__ = istart; i__ <= i__2; ++i__)
754 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__ + 1 + (h_dim1*2)]);
755 if (h__[i__ + 1 + h_dim1] <= epsmch * big)
757 h__[i__ + 1 + h_dim1] = 0.;
768 f = h__[istart + (h_dim1 << 1)] - shift[jj];
769 g = h__[istart + 1 + h_dim1];
770 F77_FUNC(dlartg, DLARTG) (&f, &g, &c__, &s, &r__);
772 a1 = c__ * h__[istart + (h_dim1 << 1)] + s * h__[istart + 1 +
774 a2 = c__ * h__[istart + 1 + h_dim1] + s * h__[istart + 1 + (
776 a4 = c__ * h__[istart + 1 + (h_dim1 << 1)] - s * h__[istart + 1 +
778 a3 = c__ * h__[istart + 1 + h_dim1] - s * h__[istart + (h_dim1 <<
780 h__[istart + (h_dim1 << 1)] = c__ * a1 + s * a2;
781 h__[istart + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
782 h__[istart + 1 + h_dim1] = c__ * a3 + s * a4;
785 i__2 = (i__3 < kplusp) ? i__3 : kplusp;
786 for (j = 1; j <= i__2; ++j)
788 a1 = c__ * q[j + istart * q_dim1] + s * q[j + (istart + 1) *
790 q[j + (istart + 1) * q_dim1] = -s * q[j + istart * q_dim1] +
791 c__ * q[j + (istart + 1) * q_dim1];
792 q[j + istart * q_dim1] = a1;
797 for (i__ = istart + 1; i__ <= i__2; ++i__)
800 f = h__[i__ + h_dim1];
801 g = s * h__[i__ + 1 + h_dim1];
803 h__[i__ + 1 + h_dim1] = c__ * h__[i__ + 1 + h_dim1];
804 F77_FUNC(dlartg, DLARTG) (&f, &g, &c__, &s, &r__);
813 h__[i__ + h_dim1] = r__;
815 a1 = c__ * h__[i__ + (h_dim1 << 1)] + s * h__[i__ + 1 +
817 a2 = c__ * h__[i__ + 1 + h_dim1] + s * h__[i__ + 1 + (h_dim1
819 a3 = c__ * h__[i__ + 1 + h_dim1] - s * h__[i__ + (h_dim1 << 1)
821 a4 = c__ * h__[i__ + 1 + (h_dim1 << 1)] - s * h__[i__ + 1 +
824 h__[i__ + (h_dim1 << 1)] = c__ * a1 + s * a2;
825 h__[i__ + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
826 h__[i__ + 1 + h_dim1] = c__ * a3 + s * a4;
829 i__3 = (i__4 < kplusp) ? i__4 : kplusp;
830 for (j = 1; j <= i__3; ++j)
832 a1 = c__ * q[j + i__ * q_dim1] + s * q[j + (i__ + 1) *
834 q[j + (i__ + 1) * q_dim1] = -s * q[j + i__ * q_dim1] +
835 c__ * q[j + (i__ + 1) * q_dim1];
836 q[j + i__ * q_dim1] = a1;
845 if (h__[iend + h_dim1] < 0.)
847 h__[iend + h_dim1] = -h__[iend + h_dim1];
848 F77_FUNC(dscal, DSCAL) (&kplusp, &c_b14, &q[iend * q_dim1 + 1], &c__1);
857 for (i__ = itop; i__ <= i__2; ++i__)
859 if (h__[i__ + 1 + h_dim1] > 0.)
871 for (i__ = itop; i__ <= i__1; ++i__)
873 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__+ 1 + (h_dim1*2)]);
874 if (h__[i__ + 1 + h_dim1] <= epsmch * big)
876 h__[i__ + 1 + h_dim1] = 0.;
881 if (h__[*kev + 1 + h_dim1] > 0.)
883 F77_FUNC(dgemv, DGEMV) ("N", n, &kplusp, &c_b5, &v[v_offset], ldv, &q[(*kev + 1) *
884 q_dim1 + 1], &c__1, &c_b4, &workd[*n + 1], &c__1);
888 for (i__ = 1; i__ <= i__1; ++i__)
890 i__2 = kplusp - i__ + 1;
891 F77_FUNC(dgemv, DGEMV) ("N", n, &i__2, &c_b5, &v[v_offset], ldv, &q[(*kev - i__ + 1) *
892 q_dim1 + 1], &c__1, &c_b4, &workd[1], &c__1);
893 F77_FUNC(dcopy, DCOPY) (n, &workd[1], &c__1, &v[(kplusp - i__ + 1) * v_dim1 + 1], &
898 F77_FUNC(dlacpy, DLACPY) ("All", n, kev, &v[(*np + 1) * v_dim1 + 1], ldv, &v[v_offset], ldv);
900 if (h__[*kev + 1 + h_dim1] > 0.)
902 F77_FUNC(dcopy, DCOPY) (n, &workd[*n + 1], &c__1, &v[(*kev + 1) * v_dim1 + 1], &c__1);
905 F77_FUNC(dscal, DSCAL) (n, &q[kplusp + *kev * q_dim1], &resid[1], &c__1);
906 if (h__[*kev + 1 + h_dim1] > 0.)
908 F77_FUNC(daxpy, DAXPY) (n, &h__[*kev + 1 + h_dim1], &v[(*kev + 1) * v_dim1 + 1], &c__1,
922 F77_FUNC(dsortr, DSORTR) (const char * which,
937 if (!strncmp(which, "SA", 2))
946 for (i__ = igap; i__ <= i__1; ++i__)
956 if (x1[j] < x1[j + igap])
959 x1[j] = x1[j + igap];
964 x2[j] = x2[j + igap];
981 else if (!strncmp(which, "SM", 2))
990 for (i__ = igap; i__ <= i__1; ++i__)
1000 if (fabs(x1[j]) < fabs(x1[j + igap]))
1003 x1[j] = x1[j + igap];
1004 x1[j + igap] = temp;
1008 x2[j] = x2[j + igap];
1009 x2[j + igap] = temp;
1025 else if (!strncmp(which, "LA", 2))
1034 for (i__ = igap; i__ <= i__1; ++i__)
1044 if (x1[j] > x1[j + igap])
1047 x1[j] = x1[j + igap];
1048 x1[j + igap] = temp;
1052 x2[j] = x2[j + igap];
1053 x2[j + igap] = temp;
1069 else if (!strncmp(which, "LM", 2))
1079 for (i__ = igap; i__ <= i__1; ++i__)
1089 if (fabs(x1[j]) > fabs(x1[j + igap]))
1092 x1[j] = x1[j + igap];
1093 x1[j + igap] = temp;
1097 x2[j] = x2[j + igap];
1098 x2[j + igap] = temp;
1123 F77_FUNC(dsesrt, DSESRT) (const char * which,
1131 int a_dim1, a_offset, i__1;
1138 a_offset = 1 + a_dim1 * 0;
1143 if (!strncmp(which, "SA", 2))
1152 for (i__ = igap; i__ <= i__1; ++i__)
1162 if (x[j] < x[j + igap])
1169 F77_FUNC(dswap, DSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1170 a_dim1 + 1], &c__1);
1186 else if (!strncmp(which, "SM", 2))
1195 for (i__ = igap; i__ <= i__1; ++i__)
1205 if (fabs(x[j]) < fabs(x[j + igap]))
1212 F77_FUNC(dswap, DSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1213 a_dim1 + 1], &c__1);
1229 else if (!strncmp(which, "LA", 2))
1238 for (i__ = igap; i__ <= i__1; ++i__)
1248 if (x[j] > x[j + igap])
1255 F77_FUNC(dswap, DSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1256 a_dim1 + 1], &c__1);
1272 else if (!strncmp(which, "LM", 2))
1281 for (i__ = igap; i__ <= i__1; ++i__)
1291 if (fabs(x[j]) > fabs(x[j + igap]))
1298 F77_FUNC(dswap, DSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1299 a_dim1 + 1], &c__1);
1324 F77_FUNC(dsgets, DSGETS) (int * ishift,
1340 if (!strncmp(which, "BE", 2))
1343 F77_FUNC(dsortr, DSORTR) ("LA", &c__1, &i__1, &ritz[1], &bounds[1]);
1347 i__1 = (kevd2 < *np) ? kevd2 : *np;
1348 i__2 = (kevd2 > *np) ? kevd2 : *np;
1349 F77_FUNC(dswap, DSWAP) (&i__1, &ritz[1], &c__1,
1350 &ritz[i__2 + 1], &c__1);
1351 i__1 = (kevd2 < *np) ? kevd2 : *np;
1352 i__2 = (kevd2 > *np) ? kevd2 : *np;
1353 F77_FUNC(dswap, DSWAP) (&i__1, &bounds[1], &c__1,
1354 &bounds[i__2 + 1], &c__1);
1361 F77_FUNC(dsortr, DSORTR) (which, &c__1, &i__1, &ritz[1], &bounds[1]);
1364 if (*ishift == 1 && *np > 0)
1367 F77_FUNC(dsortr, DSORTR) ("SM", &c__1, np, &bounds[1], &ritz[1]);
1368 F77_FUNC(dcopy, DCOPY) (np, &ritz[1], &c__1, &shifts[1], &c__1);
1378 F77_FUNC(dsconv, DSCONV) (int * n,
1394 eps23 = GMX_DOUBLE_EPS;
1395 eps23 = pow(eps23, c_b3);
1399 for (i__ = 1; i__ <= i__1; ++i__)
1403 d__3 = fabs(ritz[i__]);
1404 temp = (d__2 > d__3) ? d__2 : d__3;
1405 if (bounds[i__] <= *tol * temp)
1416 F77_FUNC(dseigt, DSEIGT) (double * rnorm,
1426 int h_dim1, h_offset, i__1;
1435 h_offset = 1 + h_dim1;
1438 F77_FUNC(dcopy, DCOPY) (n, &h__[(h_dim1 << 1) + 1], &c__1, &eig[1], &c__1);
1440 F77_FUNC(dcopy, DCOPY) (&i__1, &h__[h_dim1 + 2], &c__1, &workl[1], &c__1);
1441 F77_FUNC(dstqrb, DSTQRB) (n, &eig[1], &workl[1], &bounds[1], &workl[*n + 1], ierr);
1448 for (k = 1; k <= i__1; ++k)
1450 bounds[k] = *rnorm * fabs(bounds[k]);
1463 F77_FUNC(dsaitr, DSAITR) (int * ido,
1487 int h_dim1, h_offset, v_dim1, v_offset, i__1;
1491 double safmin, minval;
1497 v_offset = 1 + v_dim1;
1500 h_offset = 1 + h_dim1;
1504 minval = GMX_DOUBLE_MIN;
1505 safmin = minval / GMX_DOUBLE_EPS;
1519 iwork[9] = iwork[8] + *n;
1520 iwork[10] = iwork[9] + *n;
1558 F77_FUNC(dgetv0, DGETV0) (ido, bmat, &iwork[11], &c__0, n, &iwork[12], &v[v_offset], ldv,
1559 &resid[1], rnorm, &ipntr[1], &workd[1], &iwork[21], &iwork[7]);
1572 *info = iwork[12] - 1;
1579 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &v[iwork[12] * v_dim1 + 1], &c__1);
1580 if (*rnorm >= safmin)
1582 temp1 = 1. / *rnorm;
1583 F77_FUNC(dscal, DSCAL) (n, &temp1, &v[iwork[12] * v_dim1 + 1], &c__1);
1584 F77_FUNC(dscal, DSCAL) (n, &temp1, &workd[iwork[8]], &c__1);
1589 F77_FUNC(dlascl, DLASCL) ("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &v[iwork[12] *
1590 v_dim1 + 1], n, &infol);
1591 F77_FUNC(dlascl, DLASCL) ("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &workd[iwork[
1596 F77_FUNC(dcopy, DCOPY) (n, &v[iwork[12] * v_dim1 + 1], &c__1, &workd[iwork[10]], &c__1);
1597 ipntr[1] = iwork[10];
1598 ipntr[2] = iwork[9];
1599 ipntr[3] = iwork[8];
1608 F77_FUNC(dcopy, DCOPY) (n, &workd[iwork[9]], &c__1, &resid[1], &c__1);
1617 ipntr[1] = iwork[9];
1618 ipntr[2] = iwork[8];
1623 else if (*bmat == 'I')
1625 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1635 workd[*n * 3 + 3] = F77_FUNC(ddot, DDOT) (n, &resid[1], &c__1, &workd[iwork[10]], &
1637 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
1639 else if (*bmat == 'G')
1641 workd[*n * 3 + 3] = F77_FUNC(ddot, DDOT) (n, &resid[1], &c__1, &workd[iwork[8]], &
1643 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
1645 else if (*bmat == 'I')
1647 workd[*n * 3 + 3] = F77_FUNC(dnrm2, DNRM2) (n, &resid[1], &c__1);
1652 F77_FUNC(dgemv, DGEMV) ("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]],
1653 &c__1, &c_b42, &workd[iwork[9]], &c__1);
1655 else if (*mode == 2)
1657 F77_FUNC(dgemv, DGEMV) ("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[10]
1658 ], &c__1, &c_b42, &workd[iwork[9]], &c__1);
1661 F77_FUNC(dgemv, DGEMV) ("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
1662 c__1, &c_b18, &resid[1], &c__1);
1664 h__[iwork[12] + (h_dim1 << 1)] = workd[iwork[9] + iwork[12] - 1];
1665 if (iwork[12] == 1 || iwork[4] == 1)
1667 h__[iwork[12] + h_dim1] = 0.;
1671 h__[iwork[12] + h_dim1] = *rnorm;
1679 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
1680 ipntr[1] = iwork[9];
1681 ipntr[2] = iwork[8];
1686 else if (*bmat == 'I')
1688 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1696 *rnorm = F77_FUNC(ddot, DDOT) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1697 *rnorm = sqrt(fabs(*rnorm));
1699 else if (*bmat == 'I')
1701 *rnorm = F77_FUNC(dnrm2, DNRM2) (n, &resid[1], &c__1);
1704 if (*rnorm > workd[*n * 3 + 3] * .717f)
1711 F77_FUNC(dgemv, DGEMV) ("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]], &
1712 c__1, &c_b42, &workd[iwork[9]], &c__1);
1714 F77_FUNC(dgemv, DGEMV) ("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
1715 c__1, &c_b18, &resid[1], &c__1);
1717 if (iwork[12] == 1 || iwork[4] == 1)
1719 h__[iwork[12] + h_dim1] = 0.;
1721 h__[iwork[12] + (h_dim1 << 1)] += workd[iwork[9] + iwork[12] - 1];
1726 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
1727 ipntr[1] = iwork[9];
1728 ipntr[2] = iwork[8];
1733 else if (*bmat == 'I')
1735 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1742 workd[*n * 3 + 2] = F77_FUNC(ddot, DDOT) (n, &resid[1], &c__1, &workd[iwork[8]], &
1744 workd[*n * 3 + 2] = sqrt(fabs(workd[*n * 3 + 2]));
1746 else if (*bmat == 'I')
1748 workd[*n * 3 + 2] = F77_FUNC(dnrm2, DNRM2) (n, &resid[1], &c__1);
1752 if (workd[*n * 3 + 2] > *rnorm * .717f)
1755 *rnorm = workd[*n * 3 + 2];
1761 *rnorm = workd[*n * 3 + 2];
1769 for (jj = 1; jj <= i__1; ++jj)
1781 if (h__[iwork[12] + h_dim1] < 0.)
1783 h__[iwork[12] + h_dim1] = -h__[iwork[12] + h_dim1];
1784 if (iwork[12] < *k + *np)
1786 F77_FUNC(dscal, DSCAL) (n, &c_b50, &v[(iwork[12] + 1) * v_dim1 + 1], &c__1);
1790 F77_FUNC(dscal, DSCAL) (n, &c_b50, &resid[1], &c__1);
1795 if (iwork[12] > *k + *np)
1815 F77_FUNC(dsaup2, DSAUP2) (int * ido,
1824 int gmx_unused * iupd,
1845 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
1864 v_offset = 1 + v_dim1;
1867 h_offset = 1 + h_dim1;
1870 q_offset = 1 + q_dim1;
1874 eps23 = GMX_DOUBLE_EPS;
1875 eps23 = pow(eps23, c_b3);
1888 iwork[7] = iwork[9] + iwork[10];
1911 F77_FUNC(dgetv0, DGETV0) (ido, bmat, &c__1, &iwork[3], n, &c__1, &v[v_offset], ldv, &
1912 resid[1], &workd[*n * 3 + 1], &ipntr[1], &workd[1], &iwork[41],
1920 if (workd[*n * 3 + 1] == 0.)
1945 F77_FUNC(dsaitr, DSAITR) (ido, bmat, n, &c__0, &iwork[9], mode, &resid[1], &workd[*n * 3 +
1946 1], &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
1972 F77_FUNC(dsaitr, DSAITR) (ido, bmat, n, nev, np, mode, &resid[1], &workd[*n * 3 + 1],
1973 &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
1991 F77_FUNC(dseigt, DSEIGT) (&workd[*n * 3 + 1], &iwork[7], &h__[h_offset], ldh, &ritz[1], &
1992 bounds[1], &workl[1], &ierr);
2000 F77_FUNC(dcopy, DCOPY) (&iwork[7], &ritz[1], &c__1, &workl[iwork[7] + 1], &c__1);
2001 F77_FUNC(dcopy, DCOPY) (&iwork[7], &bounds[1], &c__1, &workl[(iwork[7] << 1) + 1], &c__1);
2005 F77_FUNC(dsgets, DSGETS) (ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
2007 F77_FUNC(dcopy, DCOPY) (nev, &bounds[*np + 1], &c__1, &workl[*np + 1], &c__1);
2008 F77_FUNC(dsconv, DSCONV) (nev, &ritz[*np + 1], &workl[*np + 1], tol, &iwork[8]);
2012 for (j = 1; j <= i__1; ++j)
2014 if (bounds[j] == 0.)
2021 if (iwork[8] >= iwork[9] || iwork[6] > *mxiter || *np == 0)
2024 if (!strncmp(which, "BE", 2))
2027 strncpy(wprime, "SA", 2);
2028 F77_FUNC(dsortr, DSORTR) (wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
2030 nevm2 = *nev - nevd2;
2033 i__1 = (nevd2 < *np) ? nevd2 : *np;
2034 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np + 1;
2035 F77_FUNC(dswap, DSWAP) (&i__1, &ritz[nevm2 + 1], &c__1,
2036 &ritz[((i__2 > i__3) ? i__2 : i__3)],
2038 i__1 = (nevd2 < *np) ? nevd2 : *np;
2039 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np;
2040 F77_FUNC(dswap, DSWAP) (&i__1, &bounds[nevm2 + 1], &c__1,
2041 &bounds[((i__2 > i__3) ? i__2 : i__3) + 1],
2049 if (!strncmp(which, "LM", 2))
2051 strncpy(wprime, "SM", 2);
2053 if (!strncmp(which, "SM", 2))
2055 strncpy(wprime, "LM", 2);
2057 if (!strncmp(which, "LA", 2))
2059 strncpy(wprime, "SA", 2);
2061 if (!strncmp(which, "SA", 2))
2063 strncpy(wprime, "LA", 2);
2066 F77_FUNC(dsortr, DSORTR) (wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
2071 for (j = 1; j <= i__1; ++j)
2074 d__3 = fabs(ritz[j]);
2075 temp = (d__2 > d__3) ? d__2 : d__3;
2079 strncpy(wprime, "LA", 2);
2080 F77_FUNC(dsortr, DSORTR) (wprime, &c__1, &iwork[9], &bounds[1], &ritz[1]);
2083 for (j = 1; j <= i__1; ++j)
2086 d__3 = fabs(ritz[j]);
2087 temp = (d__2 > d__3) ? d__2 : d__3;
2091 if (!strncmp(which, "BE", 2))
2094 strncpy(wprime, "LA", 2);
2095 F77_FUNC(dsortr, DSORTR) (wprime, &c__1, &iwork[8], &ritz[1], &bounds[1]);
2100 F77_FUNC(dsortr, DSORTR) (which, &c__1, &iwork[8], &ritz[1], &bounds[1]);
2104 h__[h_dim1 + 1] = workd[*n * 3 + 1];
2107 if (iwork[6] > *mxiter && iwork[8] < *nev)
2111 if (*np == 0 && iwork[8] < iwork[9])
2120 else if (iwork[8] < *nev && *ishift == 1)
2123 i__1 = iwork[8], i__2 = *np / 2;
2124 *nev += (i__1 < i__2) ? i__1 : i__2;
2125 if (*nev == 1 && iwork[7] >= 6)
2127 *nev = iwork[7] / 2;
2129 else if (*nev == 1 && iwork[7] > 2)
2133 *np = iwork[7] - *nev;
2138 F77_FUNC(dsgets, DSGETS) (ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
2158 F77_FUNC(dcopy, DCOPY) (np, &workl[1], &c__1, &ritz[1], &c__1);
2161 F77_FUNC(dsapps, DSAPPS) (n, nev, np, &ritz[1], &v[v_offset], ldv, &h__[h_offset], ldh, &
2162 resid[1], &q[q_offset], ldq, &workd[1]);
2167 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[*n + 1], &c__1);
2174 else if (*bmat == 'I')
2176 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
2183 workd[*n * 3 + 1] = F77_FUNC(ddot, DDOT) (n, &resid[1], &c__1, &workd[1], &c__1);
2184 workd[*n * 3 + 1] = sqrt(fabs(workd[*n * 3 + 1]));
2186 else if (*bmat == 'I')
2188 workd[*n * 3 + 1] = F77_FUNC(dnrm2, DNRM2) (n, &resid[1], &c__1);
2210 F77_FUNC(dsaupd, DSAUPD) (int * ido,
2228 int v_dim1, v_offset, i__1, i__2;
2234 v_offset = 1 + v_dim1;
2246 iwork[5] = iparam[1];
2247 iwork[10] = iparam[3];
2248 iwork[12] = iparam[4];
2251 iwork[11] = iparam[7];
2262 else if (*ncv <= *nev || *ncv > *n)
2268 iwork[15] = *ncv - *nev;
2274 if (strncmp(which, "LM", 2) && strncmp(which, "SM", 2) &&
2275 strncmp(which, "LA", 2) && strncmp(which, "SA", 2) &&
2276 strncmp(which, "BE", 2))
2280 if (*bmat != 'I' && *bmat != 'G')
2286 if (*lworkl < i__1 * i__1 + (*ncv << 3))
2290 if (iwork[11] < 1 || iwork[11] > 5)
2294 else if (iwork[11] == 1 && *bmat == 'G')
2298 else if (iwork[5] < 0 || iwork[5] > 1)
2302 else if (*nev == 1 && !strncmp(which, "BE", 2))
2320 *tol = GMX_DOUBLE_EPS;
2323 iwork[15] = *ncv - *nev;
2326 i__1 = i__2 * i__2 + (*ncv << 3);
2327 for (j = 1; j <= i__1; ++j)
2335 iwork[16] = iwork[3] + (iwork[8] << 1);
2336 iwork[1] = iwork[16] + *ncv;
2337 iwork[4] = iwork[1] + *ncv;
2339 iwork[7] = iwork[4] + i__1 * i__1;
2340 iwork[14] = iwork[7] + *ncv * 3;
2342 ipntr[4] = iwork[14];
2343 ipntr[5] = iwork[3];
2344 ipntr[6] = iwork[16];
2345 ipntr[7] = iwork[1];
2346 ipntr[11] = iwork[7];
2349 F77_FUNC(dsaup2, DSAUP2) (ido, bmat, n, which, &iwork[13], &iwork[15], tol, &resid[1], &
2350 iwork[11], &iwork[6], &iwork[5], &iwork[10], &v[v_offset], ldv, &
2351 workl[iwork[3]], &iwork[8], &workl[iwork[16]], &workl[iwork[1]], &
2352 workl[iwork[4]], &iwork[9], &workl[iwork[7]], &ipntr[1], &workd[1],
2357 iparam[8] = iwork[15];
2364 iparam[3] = iwork[10];
2365 iparam[5] = iwork[15];
2385 F77_FUNC(dseupd, DSEUPD) (int * rvec,
2386 const char * howmny,
2411 int v_dim1, v_offset, z_dim1, z_offset, i__1;
2412 double d__1, d__2, d__3;
2414 int j, k, ih, iq, iw, ibd, ihb, ihd, ldh, ilg, ldq, ism, irz;
2426 double thres1 = 0, thres2 = 0;
2430 int leftptr, rghtptr;
2436 z_offset = 1 + z_dim1;
2441 v_offset = 1 + v_dim1;
2469 if (*ncv <= *nev || *ncv > *n)
2473 if (strncmp(which, "LM", 2) && strncmp(which, "SM", 2) &&
2474 strncmp(which, "LA", 2) && strncmp(which, "SA", 2) &&
2475 strncmp(which, "BE", 2))
2479 if (*bmat != 'I' && *bmat != 'G')
2483 if (*howmny != 'A' && *howmny != 'P' &&
2484 *howmny != 'S' && *rvec)
2488 if (*rvec && *howmny == 'S')
2493 if (*rvec && *lworkl < i__1 * i__1 + (*ncv << 3))
2498 if (mode == 1 || mode == 2)
2500 strncpy(type__, "REGULR", 6);
2504 strncpy(type__, "SHIFTI", 6);
2508 strncpy(type__, "BUCKLE", 6);
2512 strncpy(type__, "CAYLEY", 6);
2518 if (mode == 1 && *bmat == 'G')
2522 if (*nev == 1 && !strncmp(which, "BE", 2))
2541 iw = iq + ldh * *ncv;
2542 next = iw + (*ncv << 1);
2548 irz = ipntr[11] + *ncv;
2552 eps23 = GMX_DOUBLE_EPS;
2553 eps23 = pow(eps23, c_b21);
2560 else if (*bmat == 'G')
2562 bnorm2 = F77_FUNC(dnrm2, DNRM2) (n, &workd[1], &c__1);
2568 if (!strncmp(which, "LM", 2) || !strncmp(which, "SM", 2) ||
2569 !strncmp(which, "LA", 2) || !strncmp(which, "SA", 2))
2573 else if (!strncmp(which, "BE", 2))
2577 ism = (*nev > nconv) ? *nev : nconv;
2580 thres1 = workl[ism];
2581 thres2 = workl[ilg];
2589 for (j = 0; j <= i__1; ++j)
2592 if (!strncmp(which, "LM", 2))
2594 if (fabs(workl[irz + j]) >= fabs(thres1))
2597 d__3 = fabs(workl[irz + j]);
2598 tempbnd = (d__2 > d__3) ? d__2 : d__3;
2599 if (workl[ibd + j] <= *tol * tempbnd)
2605 else if (!strncmp(which, "SM", 2))
2607 if (fabs(workl[irz + j]) <= fabs(thres1))
2610 d__3 = fabs(workl[irz + j]);
2611 tempbnd = (d__2 > d__3) ? d__2 : d__3;
2612 if (workl[ibd + j] <= *tol * tempbnd)
2618 else if (!strncmp(which, "LA", 2))
2620 if (workl[irz + j] >= thres1)
2623 d__3 = fabs(workl[irz + j]);
2624 tempbnd = (d__2 > d__3) ? d__2 : d__3;
2625 if (workl[ibd + j] <= *tol * tempbnd)
2631 else if (!strncmp(which, "SA", 2))
2633 if (workl[irz + j] <= thres1)
2636 d__3 = fabs(workl[irz + j]);
2637 tempbnd = (d__2 > d__3) ? d__2 : d__3;
2638 if (workl[ibd + j] <= *tol * tempbnd)
2644 else if (!strncmp(which, "BE", 2))
2646 if (workl[irz + j] <= thres1 || workl[irz + j] >= thres2)
2649 d__3 = fabs(workl[irz + j]);
2650 tempbnd = (d__2 > d__3) ? d__2 : d__3;
2651 if (workl[ibd + j] <= *tol * tempbnd)
2659 reord = select[j + 1] || reord;
2668 F77_FUNC(dcopy, DCOPY) (&i__1, &workl[ih + 1], &c__1, &workl[ihb], &c__1);
2669 F77_FUNC(dcopy, DCOPY) (ncv, &workl[ih + ldh], &c__1, &workl[ihd], &c__1);
2671 F77_FUNC(dsteqr, DSTEQR) ("Identity", ncv, &workl[ihd], &workl[ihb], &workl[iq], &ldq, &
2693 if (select[leftptr])
2699 else if (!select[rghtptr])
2708 temp = workl[ihd + leftptr - 1];
2709 workl[ihd + leftptr - 1] = workl[ihd + rghtptr - 1];
2710 workl[ihd + rghtptr - 1] = temp;
2711 F77_FUNC(dcopy, DCOPY) (ncv, &workl[iq + *ncv * (leftptr - 1)], &c__1, &workl[
2713 F77_FUNC(dcopy, DCOPY) (ncv, &workl[iq + *ncv * (rghtptr - 1)], &c__1, &workl[
2714 iq + *ncv * (leftptr - 1)], &c__1);
2715 F77_FUNC(dcopy, DCOPY) (ncv, &workl[iw], &c__1, &workl[iq + *ncv * (rghtptr -
2722 if (leftptr < rghtptr)
2731 F77_FUNC(dcopy, DCOPY) (&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
2737 F77_FUNC(dcopy, DCOPY) (&nconv, &workl[ritz], &c__1, &d__[1], &c__1);
2738 F77_FUNC(dcopy, DCOPY) (ncv, &workl[ritz], &c__1, &workl[ihd], &c__1);
2741 if (!strncmp(type__, "REGULR", 6))
2746 F77_FUNC(dsesrt, DSESRT) ("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
2750 F77_FUNC(dcopy, DCOPY) (ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
2757 F77_FUNC(dcopy, DCOPY) (ncv, &workl[ihd], &c__1, &workl[iw], &c__1);
2758 if (!strncmp(type__, "SHIFTI", 6))
2761 for (k = 1; k <= i__1; ++k)
2763 workl[ihd + k - 1] = 1. / workl[ihd + k - 1] + *sigma;
2766 else if (!strncmp(type__, "BUCKLE", 6))
2769 for (k = 1; k <= i__1; ++k)
2771 workl[ihd + k - 1] = *sigma * workl[ihd + k - 1] / (workl[ihd
2775 else if (!strncmp(type__, "CAYLEY", 6))
2778 for (k = 1; k <= i__1; ++k)
2780 workl[ihd + k - 1] = *sigma * (workl[ihd + k - 1] + 1.) / (
2781 workl[ihd + k - 1] - 1.);
2785 F77_FUNC(dcopy, DCOPY) (&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
2786 F77_FUNC(dsortr, DSORTR) ("LA", &c__1, &nconv, &workl[ihd], &workl[iw]);
2789 F77_FUNC(dsesrt, DSESRT) ("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
2793 F77_FUNC(dcopy, DCOPY) (ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
2794 d__1 = bnorm2 / rnorm;
2795 F77_FUNC(dscal, DSCAL) (ncv, &d__1, &workl[ihb], &c__1);
2796 F77_FUNC(dsortr, DSORTR) ("LA", &c__1, &nconv, &d__[1], &workl[ihb]);
2801 if (*rvec && *howmny == 'A')
2804 F77_FUNC(dgeqr2, DGEQR2) (ncv, &nconv, &workl[iq], &ldq, &workl[iw + *ncv], &workl[ihb],
2807 F77_FUNC(dorm2r, DORM2R) ("Right", "Notranspose", n, ncv, &nconv, &workl[iq], &ldq, &
2808 workl[iw + *ncv], &v[v_offset], ldv, &workd[*n + 1], &ierr);
2809 F77_FUNC(dlacpy, DLACPY) ("All", n, &nconv, &v[v_offset], ldv, &z__[z_offset], ldz);
2812 for (j = 1; j <= i__1; ++j)
2814 workl[ihb + j - 1] = 0.;
2816 workl[ihb + *ncv - 1] = 1.;
2817 F77_FUNC(dorm2r, DORM2R) ("Left", "Transpose", ncv, &c__1, &nconv, &workl[iq], &ldq, &
2818 workl[iw + *ncv], &workl[ihb], ncv, &temp, &ierr);
2821 else if (*rvec && *howmny == 'S')
2826 if (!strncmp(type__, "REGULR", 6) && *rvec)
2830 for (j = 1; j <= i__1; ++j)
2832 workl[ihb + j - 1] = rnorm * fabs(workl[ihb + j - 1]);
2836 else if (strncmp(type__, "REGULR", 6) && *rvec)
2839 F77_FUNC(dscal, DSCAL) (ncv, &bnorm2, &workl[ihb], &c__1);
2840 if (!strncmp(type__, "SHIFTI", 6))
2844 for (k = 1; k <= i__1; ++k)
2846 d__2 = workl[iw + k - 1];
2847 workl[ihb + k - 1] = fabs(workl[ihb + k - 1])/(d__2 * d__2);
2851 else if (!strncmp(type__, "BUCKLE", 6))
2855 for (k = 1; k <= i__1; ++k)
2857 d__2 = workl[iw + k - 1] - 1.;
2858 workl[ihb + k - 1] = *sigma * fabs(workl[ihb + k - 1])/(d__2 * d__2);
2862 else if (!strncmp(type__, "CAYLEY", 6))
2866 for (k = 1; k <= i__1; ++k)
2868 workl[ihb + k - 1] = fabs(workl[ihb + k - 1] / workl[iw + k - 1] * (workl[iw + k - 1] - 1.));
2876 if (*rvec && (!strncmp(type__, "SHIFTI", 6) || !strncmp(type__, "CAYLEY", 6)))
2880 for (k = 0; k <= i__1; ++k)
2882 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / workl[iw + k];
2886 else if (*rvec && !strncmp(type__, "BUCKLE", 6))
2890 for (k = 0; k <= i__1; ++k)
2892 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / (workl[iw + k] -
2898 if (strncmp(type__, "REGULR", 6))
2900 F77_FUNC(dger, DGER) (n, &nconv, &c_b102, &resid[1], &c__1, &workl[iw], &c__1, &z__[
2914 /* Selected single precision arpack routines */
2918 F77_FUNC(sstqrb, SSTQRB) (int * n,
2932 int i__, j, k, l, m;
2934 int l1, ii, mm, lm1, mm1, nm1;
2935 float rt1, rt2, eps;
2938 int lend, jtot, lendm1, lendp1, iscale;
2940 int lendsv, nmaxit, icompz;
2941 float ssfmax, ssfmin, safmin, minval, safmax, anorm;
2967 eps = GMX_FLOAT_EPS;
2971 minval = GMX_FLOAT_MIN;
2972 safmin = minval / GMX_FLOAT_EPS;
2973 safmax = 1. / safmin;
2974 ssfmax = sqrt(safmax) / 3.;
2975 ssfmin = sqrt(safmin) / eps2;
2980 for (j = 1; j <= i__1; ++j)
3006 for (m = l1; m <= i__1; ++m)
3013 if (tst <= sqrt(fabs(d__[m])) * sqrt(fabs(d__[m+1])) * eps)
3033 i__1 = lend - l + 1;
3034 anorm = F77_FUNC(slanst, SLANST) ("i", &i__1, &d__[l], &e[l]);
3043 i__1 = lend - l + 1;
3044 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n,
3047 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n,
3050 else if (anorm < ssfmin)
3053 i__1 = lend - l + 1;
3054 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n,
3057 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n,
3061 if (fabs(d__[lend]) < fabs(d__[l]))
3075 for (m = l; m <= i__1; ++m)
3079 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m + 1]) + safmin)
3103 F77_FUNC(slaev2, SLAEV2) (&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s);
3105 work[*n - 1 + l] = s;
3108 z__[l + 1] = c__ * tst - s * z__[l];
3109 z__[l] = s * tst + c__ * z__[l];
3113 F77_FUNC(slae2, SLAE2) (&d__[l], &e[l], &d__[l + 1], &rt1, &rt2);
3132 g = (d__[l + 1] - p) / (e[l] * 2.);
3133 r__ = F77_FUNC(slapy2, SLAPY2) (&g, &c_b31);
3134 g = d__[m] - p + e[l] / (g + ((g > 0) ? r__ : -r__ ));
3142 for (i__ = mm1; i__ >= i__1; --i__)
3146 F77_FUNC(slartg, SLARTG) (&g, &f, &c__, &s, &r__);
3151 g = d__[i__ + 1] - p;
3152 r__ = (d__[i__] - g) * s + c__ * 2. * b;
3154 d__[i__ + 1] = g + p;
3160 work[*n - 1 + i__] = -s;
3169 F77_FUNC(slasr, SLASR) ("r", "v", "b", &c__1, &mm, &work[l], &work[*n - 1 + l], &
3196 for (m = l; m >= i__1; --m)
3198 d__2 = fabs(e[m - 1]);
3200 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m- 1]) + safmin)
3224 F77_FUNC(slaev2, SLAEV2) (&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s)
3228 z__[l] = c__ * tst - s * z__[l - 1];
3229 z__[l - 1] = s * tst + c__ * z__[l - 1];
3233 F77_FUNC(slae2, SLAE2) (&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2);
3253 g = (d__[l - 1] - p) / (e[l - 1] * 2.);
3254 r__ = F77_FUNC(slapy2, SLAPY2) (&g, &c_b31);
3255 g = d__[m] - p + e[l - 1] / (g + ((g > 0) ? r__ : -r__ ));
3263 for (i__ = m; i__ <= i__1; ++i__)
3267 F77_FUNC(slartg, SLARTG) (&g, &f, &c__, &s, &r__);
3273 r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b;
3281 work[*n - 1 + i__] = s;
3290 F77_FUNC(slasr, SLASR) ("r", "v", "f", &c__1, &mm, &work[m], &work[*n - 1 + m], &
3313 i__1 = lendsv - lsv + 1;
3314 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv],
3316 i__1 = lendsv - lsv;
3317 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n,
3320 else if (iscale == 2)
3322 i__1 = lendsv - lsv + 1;
3323 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv],
3325 i__1 = lendsv - lsv;
3326 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n,
3335 for (i__ = 1; i__ <= i__1; ++i__)
3348 F77_FUNC(slasrt, SLASRT) ("i", n, &d__[1], info);
3355 for (ii = 2; ii <= i__1; ++ii)
3361 for (j = ii; j <= i__2; ++j)
3387 F77_FUNC(sgetv0, SGETV0) (int * ido,
3389 int gmx_unused * itry,
3406 int v_dim1, v_offset, i__1;
3414 v_offset = 1 + v_dim1;
3430 F77_FUNC(slarnv, SLARNV) (&idist, &iwork[1], n, &resid[1]);
3437 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
3456 F77_FUNC(scopy, SCOPY) (n, &workd[*n + 1], &c__1, &resid[1], &c__1);
3462 else if (*bmat == 'I')
3464 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
3473 workd[*n * 3 + 4] = F77_FUNC(sdot, SDOT) (n, &resid[1], &c__1, &workd[1], &c__1);
3474 workd[*n * 3 + 4] = sqrt(fabs(workd[*n * 3 + 4]));
3476 else if (*bmat == 'I')
3478 workd[*n * 3 + 4] = F77_FUNC(snrm2, SNRM2) (n, &resid[1], &c__1);
3480 *rnorm = workd[*n * 3 + 4];
3490 F77_FUNC(sgemv, SGEMV) ("T", n, &i__1, &c_b22, &v[v_offset], ldv, &workd[1], &c__1, &c_b24,
3491 &workd[*n + 1], &c__1);
3493 F77_FUNC(sgemv, SGEMV) ("N", n, &i__1, &c_b27, &v[v_offset], ldv, &workd[*n + 1], &c__1, &
3494 c_b22, &resid[1], &c__1);
3498 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[*n + 1], &c__1);
3504 else if (*bmat == 'I')
3506 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
3513 *rnorm = F77_FUNC(sdot, SDOT) (n, &resid[1], &c__1, &workd[1], &c__1);
3514 *rnorm = sqrt(fabs(*rnorm));
3516 else if (*bmat == 'I')
3518 *rnorm = F77_FUNC(snrm2, SNRM2) (n, &resid[1], &c__1);
3521 if (*rnorm > workd[*n * 3 + 4] * .717f)
3530 workd[*n * 3 + 4] = *rnorm;
3537 for (jj = 1; jj <= i__1; ++jj)
3558 F77_FUNC(ssapps, SSAPPS) (int * n,
3575 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
3579 float r__, s, a1, a2, a3, a4;
3590 v_offset = 1 + v_dim1;
3593 h_offset = 1 + h_dim1;
3596 q_offset = 1 + q_dim1;
3599 epsmch = GMX_FLOAT_EPS;
3603 kplusp = *kev + *np;
3605 F77_FUNC(slaset, SLASET) ("All", &kplusp, &kplusp, &c_b4, &c_b5, &q[q_offset], ldq);
3613 for (jj = 1; jj <= i__1; ++jj)
3621 for (i__ = istart; i__ <= i__2; ++i__)
3623 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__ + 1 + (h_dim1*2)]);
3624 if (h__[i__ + 1 + h_dim1] <= epsmch * big)
3626 h__[i__ + 1 + h_dim1] = 0.;
3637 f = h__[istart + (h_dim1 << 1)] - shift[jj];
3638 g = h__[istart + 1 + h_dim1];
3639 F77_FUNC(slartg, SLARTG) (&f, &g, &c__, &s, &r__);
3641 a1 = c__ * h__[istart + (h_dim1 << 1)] + s * h__[istart + 1 +
3643 a2 = c__ * h__[istart + 1 + h_dim1] + s * h__[istart + 1 + (
3645 a4 = c__ * h__[istart + 1 + (h_dim1 << 1)] - s * h__[istart + 1 +
3647 a3 = c__ * h__[istart + 1 + h_dim1] - s * h__[istart + (h_dim1 <<
3649 h__[istart + (h_dim1 << 1)] = c__ * a1 + s * a2;
3650 h__[istart + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
3651 h__[istart + 1 + h_dim1] = c__ * a3 + s * a4;
3654 i__2 = (i__3 < kplusp) ? i__3 : kplusp;
3655 for (j = 1; j <= i__2; ++j)
3657 a1 = c__ * q[j + istart * q_dim1] + s * q[j + (istart + 1) *
3659 q[j + (istart + 1) * q_dim1] = -s * q[j + istart * q_dim1] +
3660 c__ * q[j + (istart + 1) * q_dim1];
3661 q[j + istart * q_dim1] = a1;
3666 for (i__ = istart + 1; i__ <= i__2; ++i__)
3669 f = h__[i__ + h_dim1];
3670 g = s * h__[i__ + 1 + h_dim1];
3672 h__[i__ + 1 + h_dim1] = c__ * h__[i__ + 1 + h_dim1];
3673 F77_FUNC(slartg, SLARTG) (&f, &g, &c__, &s, &r__);
3682 h__[i__ + h_dim1] = r__;
3684 a1 = c__ * h__[i__ + (h_dim1 << 1)] + s * h__[i__ + 1 +
3686 a2 = c__ * h__[i__ + 1 + h_dim1] + s * h__[i__ + 1 + (h_dim1
3688 a3 = c__ * h__[i__ + 1 + h_dim1] - s * h__[i__ + (h_dim1 << 1)
3690 a4 = c__ * h__[i__ + 1 + (h_dim1 << 1)] - s * h__[i__ + 1 +
3693 h__[i__ + (h_dim1 << 1)] = c__ * a1 + s * a2;
3694 h__[i__ + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
3695 h__[i__ + 1 + h_dim1] = c__ * a3 + s * a4;
3698 i__3 = (i__4 < kplusp) ? i__4 : kplusp;
3699 for (j = 1; j <= i__3; ++j)
3701 a1 = c__ * q[j + i__ * q_dim1] + s * q[j + (i__ + 1) *
3703 q[j + (i__ + 1) * q_dim1] = -s * q[j + i__ * q_dim1] +
3704 c__ * q[j + (i__ + 1) * q_dim1];
3705 q[j + i__ * q_dim1] = a1;
3714 if (h__[iend + h_dim1] < 0.)
3716 h__[iend + h_dim1] = -h__[iend + h_dim1];
3717 F77_FUNC(sscal, SSCAL) (&kplusp, &c_b14, &q[iend * q_dim1 + 1], &c__1);
3726 for (i__ = itop; i__ <= i__2; ++i__)
3728 if (h__[i__ + 1 + h_dim1] > 0.)
3740 for (i__ = itop; i__ <= i__1; ++i__)
3742 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__+ 1 + (h_dim1*2)]);
3743 if (h__[i__ + 1 + h_dim1] <= epsmch * big)
3745 h__[i__ + 1 + h_dim1] = 0.;
3750 if (h__[*kev + 1 + h_dim1] > 0.)
3752 F77_FUNC(sgemv, SGEMV) ("N", n, &kplusp, &c_b5, &v[v_offset], ldv, &q[(*kev + 1) *
3753 q_dim1 + 1], &c__1, &c_b4, &workd[*n + 1], &c__1);
3757 for (i__ = 1; i__ <= i__1; ++i__)
3759 i__2 = kplusp - i__ + 1;
3760 F77_FUNC(sgemv, SGEMV) ("N", n, &i__2, &c_b5, &v[v_offset], ldv, &q[(*kev - i__ + 1) *
3761 q_dim1 + 1], &c__1, &c_b4, &workd[1], &c__1);
3762 F77_FUNC(scopy, SCOPY) (n, &workd[1], &c__1, &v[(kplusp - i__ + 1) * v_dim1 + 1], &
3767 F77_FUNC(slacpy, SLACPY) ("All", n, kev, &v[(*np + 1) * v_dim1 + 1], ldv, &v[v_offset], ldv);
3769 if (h__[*kev + 1 + h_dim1] > 0.)
3771 F77_FUNC(scopy, SCOPY) (n, &workd[*n + 1], &c__1, &v[(*kev + 1) * v_dim1 + 1], &c__1);
3774 F77_FUNC(sscal, SSCAL) (n, &q[kplusp + *kev * q_dim1], &resid[1], &c__1);
3775 if (h__[*kev + 1 + h_dim1] > 0.)
3777 F77_FUNC(saxpy, SAXPY) (n, &h__[*kev + 1 + h_dim1], &v[(*kev + 1) * v_dim1 + 1], &c__1,
3791 F77_FUNC(ssortr, SSORTR) (const char * which,
3806 if (!strncmp(which, "SA", 2))
3815 for (i__ = igap; i__ <= i__1; ++i__)
3825 if (x1[j] < x1[j + igap])
3828 x1[j] = x1[j + igap];
3829 x1[j + igap] = temp;
3833 x2[j] = x2[j + igap];
3834 x2[j + igap] = temp;
3850 else if (!strncmp(which, "SM", 2))
3859 for (i__ = igap; i__ <= i__1; ++i__)
3869 if (fabs(x1[j]) < fabs(x1[j + igap]))
3872 x1[j] = x1[j + igap];
3873 x1[j + igap] = temp;
3877 x2[j] = x2[j + igap];
3878 x2[j + igap] = temp;
3894 else if (!strncmp(which, "LA", 2))
3903 for (i__ = igap; i__ <= i__1; ++i__)
3913 if (x1[j] > x1[j + igap])
3916 x1[j] = x1[j + igap];
3917 x1[j + igap] = temp;
3921 x2[j] = x2[j + igap];
3922 x2[j + igap] = temp;
3938 else if (!strncmp(which, "LM", 2))
3948 for (i__ = igap; i__ <= i__1; ++i__)
3958 if (fabs(x1[j]) > fabs(x1[j + igap]))
3961 x1[j] = x1[j + igap];
3962 x1[j + igap] = temp;
3966 x2[j] = x2[j + igap];
3967 x2[j + igap] = temp;
3992 F77_FUNC(ssesrt, SSESRT) (const char * which,
4000 int a_dim1, a_offset, i__1;
4007 a_offset = 1 + a_dim1 * 0;
4012 if (!strncmp(which, "SA", 2))
4021 for (i__ = igap; i__ <= i__1; ++i__)
4031 if (x[j] < x[j + igap])
4038 F77_FUNC(sswap, SSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
4039 a_dim1 + 1], &c__1);
4055 else if (!strncmp(which, "SM", 2))
4064 for (i__ = igap; i__ <= i__1; ++i__)
4074 if (fabs(x[j]) < fabs(x[j + igap]))
4081 F77_FUNC(sswap, SSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
4082 a_dim1 + 1], &c__1);
4098 else if (!strncmp(which, "LA", 2))
4107 for (i__ = igap; i__ <= i__1; ++i__)
4117 if (x[j] > x[j + igap])
4124 F77_FUNC(sswap, SSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
4125 a_dim1 + 1], &c__1);
4141 else if (!strncmp(which, "LM", 2))
4150 for (i__ = igap; i__ <= i__1; ++i__)
4160 if (fabs(x[j]) > fabs(x[j + igap]))
4167 F77_FUNC(sswap, SSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
4168 a_dim1 + 1], &c__1);
4193 F77_FUNC(ssgets, SSGETS) (int * ishift,
4209 if (!strncmp(which, "BE", 2))
4212 F77_FUNC(ssortr, SSORTR) ("LA", &c__1, &i__1, &ritz[1], &bounds[1]);
4216 i__1 = (kevd2 < *np) ? kevd2 : *np;
4217 i__2 = (kevd2 > *np) ? kevd2 : *np;
4218 F77_FUNC(sswap, SSWAP) (&i__1, &ritz[1], &c__1,
4219 &ritz[i__2 + 1], &c__1);
4220 i__1 = (kevd2 < *np) ? kevd2 : *np;
4221 i__2 = (kevd2 > *np) ? kevd2 : *np;
4222 F77_FUNC(sswap, SSWAP) (&i__1, &bounds[1], &c__1,
4223 &bounds[i__2 + 1], &c__1);
4230 F77_FUNC(ssortr, SSORTR) (which, &c__1, &i__1, &ritz[1], &bounds[1]);
4233 if (*ishift == 1 && *np > 0)
4236 F77_FUNC(ssortr, SSORTR) ("SM", &c__1, np, &bounds[1], &ritz[1]);
4237 F77_FUNC(scopy, SCOPY) (np, &ritz[1], &c__1, &shifts[1], &c__1);
4247 F77_FUNC(ssconv, SSCONV) (int * n,
4263 eps23 = GMX_FLOAT_EPS;
4264 eps23 = pow(eps23, c_b3);
4268 for (i__ = 1; i__ <= i__1; ++i__)
4272 d__3 = fabs(ritz[i__]);
4273 temp = (d__2 > d__3) ? d__2 : d__3;
4274 if (bounds[i__] <= *tol * temp)
4285 F77_FUNC(sseigt, SSEIGT) (float * rnorm,
4295 int h_dim1, h_offset, i__1;
4304 h_offset = 1 + h_dim1;
4307 F77_FUNC(scopy, SCOPY) (n, &h__[(h_dim1 << 1) + 1], &c__1, &eig[1], &c__1);
4309 F77_FUNC(scopy, SCOPY) (&i__1, &h__[h_dim1 + 2], &c__1, &workl[1], &c__1);
4310 F77_FUNC(sstqrb, SSTQRB) (n, &eig[1], &workl[1], &bounds[1], &workl[*n + 1], ierr);
4317 for (k = 1; k <= i__1; ++k)
4319 bounds[k] = *rnorm * fabs(bounds[k]);
4332 F77_FUNC(ssaitr, SSAITR) (int * ido,
4356 int h_dim1, h_offset, v_dim1, v_offset, i__1;
4360 float safmin, minval;
4366 v_offset = 1 + v_dim1;
4369 h_offset = 1 + h_dim1;
4373 minval = GMX_FLOAT_MIN;
4374 safmin = minval / GMX_FLOAT_EPS;
4388 iwork[9] = iwork[8] + *n;
4389 iwork[10] = iwork[9] + *n;
4427 F77_FUNC(sgetv0, sgetv0) (ido, bmat, &iwork[11], &c__0, n, &iwork[12], &v[v_offset], ldv,
4428 &resid[1], rnorm, &ipntr[1], &workd[1], &iwork[21], &iwork[7]);
4441 *info = iwork[12] - 1;
4448 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &v[iwork[12] * v_dim1 + 1], &c__1);
4449 if (*rnorm >= safmin)
4451 temp1 = 1. / *rnorm;
4452 F77_FUNC(sscal, SSCAL) (n, &temp1, &v[iwork[12] * v_dim1 + 1], &c__1);
4453 F77_FUNC(sscal, SSCAL) (n, &temp1, &workd[iwork[8]], &c__1);
4458 F77_FUNC(slascl, SLASCL) ("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &v[iwork[12] *
4459 v_dim1 + 1], n, &infol);
4460 F77_FUNC(slascl, SLASCL) ("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &workd[iwork[
4465 F77_FUNC(scopy, SCOPY) (n, &v[iwork[12] * v_dim1 + 1], &c__1, &workd[iwork[10]], &c__1);
4466 ipntr[1] = iwork[10];
4467 ipntr[2] = iwork[9];
4468 ipntr[3] = iwork[8];
4477 F77_FUNC(scopy, SCOPY) (n, &workd[iwork[9]], &c__1, &resid[1], &c__1);
4486 ipntr[1] = iwork[9];
4487 ipntr[2] = iwork[8];
4492 else if (*bmat == 'I')
4494 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
4504 workd[*n * 3 + 3] = F77_FUNC(sdot, SDOT) (n, &resid[1], &c__1, &workd[iwork[10]], &
4506 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
4508 else if (*bmat == 'G')
4510 workd[*n * 3 + 3] = F77_FUNC(sdot, SDOT) (n, &resid[1], &c__1, &workd[iwork[8]], &
4512 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
4514 else if (*bmat == 'I')
4516 workd[*n * 3 + 3] = F77_FUNC(snrm2, SNRM2) (n, &resid[1], &c__1);
4521 F77_FUNC(sgemv, SGEMV) ("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]],
4522 &c__1, &c_b42, &workd[iwork[9]], &c__1);
4524 else if (*mode == 2)
4526 F77_FUNC(sgemv, SGEMV) ("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[10]
4527 ], &c__1, &c_b42, &workd[iwork[9]], &c__1);
4530 F77_FUNC(sgemv, SGEMV) ("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
4531 c__1, &c_b18, &resid[1], &c__1);
4533 h__[iwork[12] + (h_dim1 << 1)] = workd[iwork[9] + iwork[12] - 1];
4534 if (iwork[12] == 1 || iwork[4] == 1)
4536 h__[iwork[12] + h_dim1] = 0.;
4540 h__[iwork[12] + h_dim1] = *rnorm;
4548 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
4549 ipntr[1] = iwork[9];
4550 ipntr[2] = iwork[8];
4555 else if (*bmat == 'I')
4557 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
4565 *rnorm = F77_FUNC(sdot, SDOT) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
4566 *rnorm = sqrt(fabs(*rnorm));
4568 else if (*bmat == 'I')
4570 *rnorm = F77_FUNC(snrm2, SNRM2) (n, &resid[1], &c__1);
4573 if (*rnorm > workd[*n * 3 + 3] * .717f)
4580 F77_FUNC(sgemv, SGEMV) ("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]], &
4581 c__1, &c_b42, &workd[iwork[9]], &c__1);
4583 F77_FUNC(sgemv, SGEMV) ("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
4584 c__1, &c_b18, &resid[1], &c__1);
4586 if (iwork[12] == 1 || iwork[4] == 1)
4588 h__[iwork[12] + h_dim1] = 0.;
4590 h__[iwork[12] + (h_dim1 << 1)] += workd[iwork[9] + iwork[12] - 1];
4595 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
4596 ipntr[1] = iwork[9];
4597 ipntr[2] = iwork[8];
4602 else if (*bmat == 'I')
4604 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
4611 workd[*n * 3 + 2] = F77_FUNC(sdot, SDOT) (n, &resid[1], &c__1, &workd[iwork[8]], &
4613 workd[*n * 3 + 2] = sqrt(fabs(workd[*n * 3 + 2]));
4615 else if (*bmat == 'I')
4617 workd[*n * 3 + 2] = F77_FUNC(snrm2, SNRM2) (n, &resid[1], &c__1);
4621 if (workd[*n * 3 + 2] > *rnorm * .717f)
4624 *rnorm = workd[*n * 3 + 2];
4630 *rnorm = workd[*n * 3 + 2];
4638 for (jj = 1; jj <= i__1; ++jj)
4650 if (h__[iwork[12] + h_dim1] < 0.)
4652 h__[iwork[12] + h_dim1] = -h__[iwork[12] + h_dim1];
4653 if (iwork[12] < *k + *np)
4655 F77_FUNC(sscal, SSCAL) (n, &c_b50, &v[(iwork[12] + 1) * v_dim1 + 1], &c__1);
4659 F77_FUNC(sscal, SSCAL) (n, &c_b50, &resid[1], &c__1);
4664 if (iwork[12] > *k + *np)
4684 F77_FUNC(ssaup2, SSAUP2) (int * ido,
4693 int gmx_unused * iupd,
4714 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
4733 v_offset = 1 + v_dim1;
4736 h_offset = 1 + h_dim1;
4739 q_offset = 1 + q_dim1;
4743 eps23 = GMX_FLOAT_EPS;
4744 eps23 = pow(eps23, c_b3);
4757 iwork[7] = iwork[9] + iwork[10];
4780 F77_FUNC(sgetv0, SGETV0) (ido, bmat, &c__1, &iwork[3], n, &c__1, &v[v_offset], ldv, &
4781 resid[1], &workd[*n * 3 + 1], &ipntr[1], &workd[1], &iwork[41],
4789 if (workd[*n * 3 + 1] == 0.)
4814 F77_FUNC(ssaitr, SSAITR) (ido, bmat, n, &c__0, &iwork[9], mode, &resid[1], &workd[*n * 3 +
4815 1], &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
4841 F77_FUNC(ssaitr, SSAITR) (ido, bmat, n, nev, np, mode, &resid[1], &workd[*n * 3 + 1], &v[
4842 v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1], &iwork[
4860 F77_FUNC(sseigt, SSEIGT) (&workd[*n * 3 + 1], &iwork[7], &h__[h_offset], ldh, &ritz[1], &
4861 bounds[1], &workl[1], &ierr);
4869 F77_FUNC(scopy, SCOPY) (&iwork[7], &ritz[1], &c__1, &workl[iwork[7] + 1], &c__1);
4870 F77_FUNC(scopy, SCOPY) (&iwork[7], &bounds[1], &c__1, &workl[(iwork[7] << 1) + 1], &c__1);
4874 F77_FUNC(ssgets, SSGETS) (ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
4876 F77_FUNC(scopy, SCOPY) (nev, &bounds[*np + 1], &c__1, &workl[*np + 1], &c__1);
4877 F77_FUNC(ssconv, SSCONV) (nev, &ritz[*np + 1], &workl[*np + 1], tol, &iwork[8]);
4882 for (j = 1; j <= i__1; ++j)
4884 if (bounds[j] == 0.)
4891 if (iwork[8] >= iwork[9] || iwork[6] > *mxiter || *np == 0)
4894 if (!strncmp(which, "BE", 2))
4897 strncpy(wprime, "SA", 2);
4898 F77_FUNC(ssortr, SSORTR) (wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
4900 nevm2 = *nev - nevd2;
4903 i__1 = (nevd2 < *np) ? nevd2 : *np;
4904 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np + 1;
4905 F77_FUNC(sswap, SSWAP) (&i__1, &ritz[nevm2 + 1], &c__1,
4906 &ritz[((i__2 > i__3) ? i__2 : i__3)],
4908 i__1 = (nevd2 < *np) ? nevd2 : *np;
4909 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np;
4910 F77_FUNC(sswap, SSWAP) (&i__1, &bounds[nevm2 + 1], &c__1,
4911 &bounds[((i__2 > i__3) ? i__2 : i__3) + 1],
4919 if (!strncmp(which, "LM", 2))
4921 strncpy(wprime, "SM", 2);
4923 if (!strncmp(which, "SM", 2))
4925 strncpy(wprime, "LM", 2);
4927 if (!strncmp(which, "LA", 2))
4929 strncpy(wprime, "SA", 2);
4931 if (!strncmp(which, "SA", 2))
4933 strncpy(wprime, "LA", 2);
4936 F77_FUNC(ssortr, SSORTR) (wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
4941 for (j = 1; j <= i__1; ++j)
4944 d__3 = fabs(ritz[j]);
4945 temp = (d__2 > d__3) ? d__2 : d__3;
4949 strncpy(wprime, "LA", 2);
4950 F77_FUNC(ssortr, SSORTR) (wprime, &c__1, &iwork[9], &bounds[1], &ritz[1]);
4953 for (j = 1; j <= i__1; ++j)
4956 d__3 = fabs(ritz[j]);
4957 temp = (d__2 > d__3) ? d__2 : d__3;
4961 if (!strncmp(which, "BE", 2))
4964 strncpy(wprime, "LA", 2);
4965 F77_FUNC(ssortr, SSORTR) (wprime, &c__1, &iwork[8], &ritz[1], &bounds[1]);
4970 F77_FUNC(ssortr, SSORTR) (which, &c__1, &iwork[8], &ritz[1], &bounds[1]);
4974 h__[h_dim1 + 1] = workd[*n * 3 + 1];
4977 if (iwork[6] > *mxiter && iwork[8] < *nev)
4981 if (*np == 0 && iwork[8] < iwork[9])
4990 else if (iwork[8] < *nev && *ishift == 1)
4993 i__1 = iwork[8], i__2 = *np / 2;
4994 *nev += (i__1 < i__2) ? i__1 : i__2;
4995 if (*nev == 1 && iwork[7] >= 6)
4997 *nev = iwork[7] / 2;
4999 else if (*nev == 1 && iwork[7] > 2)
5003 *np = iwork[7] - *nev;
5008 F77_FUNC(ssgets, SSGETS) (ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
5028 F77_FUNC(scopy, SCOPY) (np, &workl[1], &c__1, &ritz[1], &c__1);
5031 F77_FUNC(ssapps, SSAPPS) (n, nev, np, &ritz[1], &v[v_offset], ldv, &h__[h_offset], ldh, &
5032 resid[1], &q[q_offset], ldq, &workd[1]);
5037 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[*n + 1], &c__1);
5044 else if (*bmat == 'I')
5046 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
5053 workd[*n * 3 + 1] = F77_FUNC(sdot, SDOT) (n, &resid[1], &c__1, &workd[1], &c__1);
5054 workd[*n * 3 + 1] = sqrt(fabs(workd[*n * 3 + 1]));
5056 else if (*bmat == 'I')
5058 workd[*n * 3 + 1] = F77_FUNC(snrm2, SNRM2) (n, &resid[1], &c__1);
5080 F77_FUNC(ssaupd, SSAUPD) (int * ido,
5098 int v_dim1, v_offset, i__1, i__2;
5104 v_offset = 1 + v_dim1;
5116 iwork[5] = iparam[1];
5117 iwork[10] = iparam[3];
5118 iwork[12] = iparam[4];
5121 iwork[11] = iparam[7];
5132 else if (*ncv <= *nev || *ncv > *n)
5138 iwork[15] = *ncv - *nev;
5144 if (strncmp(which, "LM", 2) && strncmp(which, "SM", 2) &&
5145 strncmp(which, "LA", 2) && strncmp(which, "SA", 2) &&
5146 strncmp(which, "BE", 2))
5150 if (*bmat != 'I' && *bmat != 'G')
5156 if (*lworkl < i__1 * i__1 + (*ncv << 3))
5160 if (iwork[11] < 1 || iwork[11] > 5)
5164 else if (iwork[11] == 1 && *bmat == 'G')
5168 else if (iwork[5] < 0 || iwork[5] > 1)
5172 else if (*nev == 1 && !strncmp(which, "BE", 2))
5190 *tol = GMX_FLOAT_EPS;
5193 iwork[15] = *ncv - *nev;
5196 i__1 = i__2 * i__2 + (*ncv << 3);
5197 for (j = 1; j <= i__1; ++j)
5205 iwork[16] = iwork[3] + (iwork[8] << 1);
5206 iwork[1] = iwork[16] + *ncv;
5207 iwork[4] = iwork[1] + *ncv;
5209 iwork[7] = iwork[4] + i__1 * i__1;
5210 iwork[14] = iwork[7] + *ncv * 3;
5212 ipntr[4] = iwork[14];
5213 ipntr[5] = iwork[3];
5214 ipntr[6] = iwork[16];
5215 ipntr[7] = iwork[1];
5216 ipntr[11] = iwork[7];
5219 F77_FUNC(ssaup2, SSAUP2) (ido, bmat, n, which, &iwork[13], &iwork[15], tol, &resid[1], &
5220 iwork[11], &iwork[6], &iwork[5], &iwork[10], &v[v_offset], ldv, &
5221 workl[iwork[3]], &iwork[8], &workl[iwork[16]], &workl[iwork[1]], &
5222 workl[iwork[4]], &iwork[9], &workl[iwork[7]], &ipntr[1], &workd[1],
5227 iparam[8] = iwork[15];
5234 iparam[3] = iwork[10];
5235 iparam[5] = iwork[15];
5255 F77_FUNC(sseupd, SSEUPD) (int * rvec,
5256 const char * howmny,
5281 int v_dim1, v_offset, z_dim1, z_offset, i__1;
5282 float d__1, d__2, d__3;
5284 int j, k, ih, iq, iw, ibd, ihb, ihd, ldh, ilg, ldq, ism, irz;
5296 float thres1 = 0, thres2 = 0;
5300 int leftptr, rghtptr;
5306 z_offset = 1 + z_dim1;
5311 v_offset = 1 + v_dim1;
5339 if (*ncv <= *nev || *ncv > *n)
5343 if (strncmp(which, "LM", 2) && strncmp(which, "SM", 2) &&
5344 strncmp(which, "LA", 2) && strncmp(which, "SA", 2) &&
5345 strncmp(which, "BE", 2))
5349 if (*bmat != 'I' && *bmat != 'G')
5353 if (*howmny != 'A' && *howmny != 'P' &&
5354 *howmny != 'S' && *rvec)
5358 if (*rvec && *howmny == 'S')
5363 if (*rvec && *lworkl < i__1 * i__1 + (*ncv << 3))
5368 if (mode == 1 || mode == 2)
5370 strncpy(type__, "REGULR", 6);
5374 strncpy(type__, "SHIFTI", 6);
5378 strncpy(type__, "BUCKLE", 6);
5382 strncpy(type__, "CAYLEY", 6);
5388 if (mode == 1 && *bmat == 'G')
5392 if (*nev == 1 && !strncmp(which, "BE", 2))
5411 iw = iq + ldh * *ncv;
5412 next = iw + (*ncv << 1);
5418 irz = ipntr[11] + *ncv;
5422 eps23 = GMX_FLOAT_EPS;
5423 eps23 = pow(eps23, c_b21);
5430 else if (*bmat == 'G')
5432 bnorm2 = F77_FUNC(snrm2, SNRM2) (n, &workd[1], &c__1);
5438 if (!strncmp(which, "LM", 2) || !strncmp(which, "SM", 2) ||
5439 !strncmp(which, "LA", 2) || !strncmp(which, "SA", 2))
5443 else if (!strncmp(which, "BE", 2))
5447 ism = (*nev > nconv) ? *nev : nconv;
5450 thres1 = workl[ism];
5451 thres2 = workl[ilg];
5459 for (j = 0; j <= i__1; ++j)
5462 if (!strncmp(which, "LM", 2))
5464 if (fabs(workl[irz + j]) >= fabs(thres1))
5467 d__3 = fabs(workl[irz + j]);
5468 tempbnd = (d__2 > d__3) ? d__2 : d__3;
5469 if (workl[ibd + j] <= *tol * tempbnd)
5475 else if (!strncmp(which, "SM", 2))
5477 if (fabs(workl[irz + j]) <= fabs(thres1))
5480 d__3 = fabs(workl[irz + j]);
5481 tempbnd = (d__2 > d__3) ? d__2 : d__3;
5482 if (workl[ibd + j] <= *tol * tempbnd)
5488 else if (!strncmp(which, "LA", 2))
5490 if (workl[irz + j] >= thres1)
5493 d__3 = fabs(workl[irz + j]);
5494 tempbnd = (d__2 > d__3) ? d__2 : d__3;
5495 if (workl[ibd + j] <= *tol * tempbnd)
5501 else if (!strncmp(which, "SA", 2))
5503 if (workl[irz + j] <= thres1)
5506 d__3 = fabs(workl[irz + j]);
5507 tempbnd = (d__2 > d__3) ? d__2 : d__3;
5508 if (workl[ibd + j] <= *tol * tempbnd)
5514 else if (!strncmp(which, "BE", 2))
5516 if (workl[irz + j] <= thres1 || workl[irz + j] >= thres2)
5519 d__3 = fabs(workl[irz + j]);
5520 tempbnd = (d__2 > d__3) ? d__2 : d__3;
5521 if (workl[ibd + j] <= *tol * tempbnd)
5529 reord = select[j + 1] || reord;
5538 F77_FUNC(scopy, SCOPY) (&i__1, &workl[ih + 1], &c__1, &workl[ihb], &c__1);
5539 F77_FUNC(scopy, SCOPY) (ncv, &workl[ih + ldh], &c__1, &workl[ihd], &c__1);
5541 F77_FUNC(ssteqr, SSTEQR) ("Identity", ncv, &workl[ihd], &workl[ihb], &workl[iq], &ldq, &
5563 if (select[leftptr])
5569 else if (!select[rghtptr])
5578 temp = workl[ihd + leftptr - 1];
5579 workl[ihd + leftptr - 1] = workl[ihd + rghtptr - 1];
5580 workl[ihd + rghtptr - 1] = temp;
5581 F77_FUNC(scopy, SCOPY) (ncv, &workl[iq + *ncv * (leftptr - 1)], &c__1, &workl[
5583 F77_FUNC(scopy, SCOPY) (ncv, &workl[iq + *ncv * (rghtptr - 1)], &c__1, &workl[
5584 iq + *ncv * (leftptr - 1)], &c__1);
5585 F77_FUNC(scopy, SCOPY) (ncv, &workl[iw], &c__1, &workl[iq + *ncv * (rghtptr -
5592 if (leftptr < rghtptr)
5601 F77_FUNC(scopy, SCOPY) (&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
5607 F77_FUNC(scopy, SCOPY) (&nconv, &workl[ritz], &c__1, &d__[1], &c__1);
5608 F77_FUNC(scopy, SCOPY) (ncv, &workl[ritz], &c__1, &workl[ihd], &c__1);
5611 if (!strncmp(type__, "REGULR", 6))
5616 F77_FUNC(ssesrt, SSESRT) ("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
5620 F77_FUNC(scopy, SCOPY) (ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
5627 F77_FUNC(scopy, SCOPY) (ncv, &workl[ihd], &c__1, &workl[iw], &c__1);
5628 if (!strncmp(type__, "SHIFTI", 6))
5631 for (k = 1; k <= i__1; ++k)
5633 workl[ihd + k - 1] = 1. / workl[ihd + k - 1] + *sigma;
5636 else if (!strncmp(type__, "BUCKLE", 6))
5639 for (k = 1; k <= i__1; ++k)
5641 workl[ihd + k - 1] = *sigma * workl[ihd + k - 1] / (workl[ihd
5645 else if (!strncmp(type__, "CAYLEY", 6))
5648 for (k = 1; k <= i__1; ++k)
5650 workl[ihd + k - 1] = *sigma * (workl[ihd + k - 1] + 1.) / (
5651 workl[ihd + k - 1] - 1.);
5655 F77_FUNC(scopy, SCOPY) (&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
5656 F77_FUNC(ssortr, SSORTR) ("LA", &c__1, &nconv, &workl[ihd], &workl[iw]);
5659 F77_FUNC(ssesrt, SSESRT) ("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
5663 F77_FUNC(scopy, SCOPY) (ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
5664 d__1 = bnorm2 / rnorm;
5665 F77_FUNC(sscal, SSCAL) (ncv, &d__1, &workl[ihb], &c__1);
5666 F77_FUNC(ssortr, SSORTR) ("LA", &c__1, &nconv, &d__[1], &workl[ihb]);
5671 if (*rvec && *howmny == 'A')
5674 F77_FUNC(sgeqr2, SGEQR2) (ncv, &nconv, &workl[iq], &ldq, &workl[iw + *ncv], &workl[ihb],
5677 F77_FUNC(sorm2r, SORM2R) ("Right", "Notranspose", n, ncv, &nconv, &workl[iq], &ldq, &
5678 workl[iw + *ncv], &v[v_offset], ldv, &workd[*n + 1], &ierr);
5679 F77_FUNC(slacpy, SLACPY) ("All", n, &nconv, &v[v_offset], ldv, &z__[z_offset], ldz);
5682 for (j = 1; j <= i__1; ++j)
5684 workl[ihb + j - 1] = 0.;
5686 workl[ihb + *ncv - 1] = 1.;
5687 F77_FUNC(sorm2r, SORM2R) ("Left", "Transpose", ncv, &c__1, &nconv, &workl[iq], &ldq, &
5688 workl[iw + *ncv], &workl[ihb], ncv, &temp, &ierr);
5691 else if (*rvec && *howmny == 'S')
5696 if (!strncmp(type__, "REGULR", 6) && *rvec)
5700 for (j = 1; j <= i__1; ++j)
5702 workl[ihb + j - 1] = rnorm * fabs(workl[ihb + j - 1]);
5706 else if (strncmp(type__, "REGULR", 6) && *rvec)
5709 F77_FUNC(sscal, SSCAL) (ncv, &bnorm2, &workl[ihb], &c__1);
5710 if (!strncmp(type__, "SHIFTI", 6))
5714 for (k = 1; k <= i__1; ++k)
5716 d__2 = workl[iw + k - 1];
5717 workl[ihb + k - 1] = fabs(workl[ihb + k - 1])/(d__2 * d__2);
5721 else if (!strncmp(type__, "BUCKLE", 6))
5725 for (k = 1; k <= i__1; ++k)
5727 d__2 = workl[iw + k - 1] - 1.;
5728 workl[ihb + k - 1] = *sigma * fabs(workl[ihb + k - 1])/(d__2 * d__2);
5732 else if (!strncmp(type__, "CAYLEY", 6))
5736 for (k = 1; k <= i__1; ++k)
5738 workl[ihb + k - 1] = fabs(workl[ihb + k - 1] / workl[iw + k - 1] * (workl[iw + k - 1] - 1.));
5746 if (*rvec && (!strncmp(type__, "SHIFTI", 6) || !strncmp(type__, "CAYLEY", 6)))
5750 for (k = 0; k <= i__1; ++k)
5752 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / workl[iw + k];
5756 else if (*rvec && !strncmp(type__, "BUCKLE", 6))
5760 for (k = 0; k <= i__1; ++k)
5762 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / (workl[iw + k] -
5768 if (strncmp(type__, "REGULR", 6))
5770 F77_FUNC(sger, SGER) (n, &nconv, &c_b102, &resid[1], &c__1, &workl[iw], &c__1, &z__[