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.
39 #include "gromacs/utility/basedefinitions.h"
40 #include "gromacs/utility/real.h"
42 #include "gmx_arpack.h"
44 #include "gmx_lapack.h"
47 F77_FUNC(dstqrb, DSTQRB) (int * n,
63 int l1, ii, mm, lm1, mm1, nm1;
67 int lend, jtot, lendm1, lendp1, iscale;
69 int lendsv, nmaxit, icompz;
70 double ssfmax, ssfmin, safmin, minval, safmax, anorm;
100 minval = GMX_DOUBLE_MIN;
101 safmin = minval / GMX_DOUBLE_EPS;
102 safmax = 1. / safmin;
103 ssfmax = sqrt(safmax) / 3.;
104 ssfmin = sqrt(safmin) / eps2;
109 for (j = 1; j <= i__1; ++j)
135 for (m = l1; m <= i__1; ++m)
142 if (tst <= sqrt(fabs(d__[m])) * sqrt(fabs(d__[m+1])) * eps)
163 anorm = F77_FUNC(dlanst, DLANST) ("i", &i__1, &d__[l], &e[l]);
173 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n,
176 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n,
179 else if (anorm < ssfmin)
183 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n,
186 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n,
190 if (fabs(d__[lend]) < fabs(d__[l]))
204 for (m = l; m <= i__1; ++m)
208 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m + 1]) + safmin)
232 F77_FUNC(dlaev2, DLAEV2) (&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s);
234 work[*n - 1 + l] = s;
237 z__[l + 1] = c__ * tst - s * z__[l];
238 z__[l] = s * tst + c__ * z__[l];
242 F77_FUNC(dlae2, DLAE2) (&d__[l], &e[l], &d__[l + 1], &rt1, &rt2);
261 g = (d__[l + 1] - p) / (e[l] * 2.);
262 r__ = F77_FUNC(dlapy2, DLAPY2) (&g, &c_b31);
263 g = d__[m] - p + e[l] / (g + ((g > 0) ? r__ : -r__ ));
271 for (i__ = mm1; i__ >= i__1; --i__)
275 F77_FUNC(dlartg, DLARTG) (&g, &f, &c__, &s, &r__);
280 g = d__[i__ + 1] - p;
281 r__ = (d__[i__] - g) * s + c__ * 2. * b;
283 d__[i__ + 1] = g + p;
289 work[*n - 1 + i__] = -s;
298 F77_FUNC(dlasr, DLASR) ("r", "v", "b", &c__1, &mm, &work[l], &work[*n - 1 + l], &
325 for (m = l; m >= i__1; --m)
327 d__2 = fabs(e[m - 1]);
329 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m- 1]) + safmin)
353 F77_FUNC(dlaev2, DLAEV2) (&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s)
357 z__[l] = c__ * tst - s * z__[l - 1];
358 z__[l - 1] = s * tst + c__ * z__[l - 1];
362 F77_FUNC(dlae2, DLAE2) (&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2);
382 g = (d__[l - 1] - p) / (e[l - 1] * 2.);
383 r__ = F77_FUNC(dlapy2, DLAPY2) (&g, &c_b31);
384 g = d__[m] - p + e[l - 1] / (g + ((g > 0) ? r__ : -r__ ));
392 for (i__ = m; i__ <= i__1; ++i__)
396 F77_FUNC(dlartg, DLARTG) (&g, &f, &c__, &s, &r__);
402 r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b;
410 work[*n - 1 + i__] = s;
419 F77_FUNC(dlasr, DLASR) ("r", "v", "f", &c__1, &mm, &work[m], &work[*n - 1 + m], &
442 i__1 = lendsv - lsv + 1;
443 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv],
446 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n,
449 else if (iscale == 2)
451 i__1 = lendsv - lsv + 1;
452 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv],
455 F77_FUNC(dlascl, DLASCL) ("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n,
464 for (i__ = 1; i__ <= i__1; ++i__)
477 F77_FUNC(dlasrt, DLASRT) ("i", n, &d__[1], info);
484 for (ii = 2; ii <= i__1; ++ii)
490 for (j = ii; j <= i__2; ++j)
516 F77_FUNC(dgetv0, DGETV0) (int * ido,
518 int gmx_unused * itry,
535 int v_dim1, v_offset, i__1;
543 v_offset = 1 + v_dim1;
559 F77_FUNC(dlarnv, DLARNV) (&idist, &iwork[1], n, &resid[1]);
566 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
585 F77_FUNC(dcopy, DCOPY) (n, &workd[*n + 1], &c__1, &resid[1], &c__1);
591 else if (*bmat == 'I')
593 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
602 workd[*n * 3 + 4] = F77_FUNC(ddot, DDOT) (n, &resid[1], &c__1, &workd[1], &c__1);
603 workd[*n * 3 + 4] = sqrt(fabs(workd[*n * 3 + 4]));
605 else if (*bmat == 'I')
607 workd[*n * 3 + 4] = F77_FUNC(dnrm2, DNRM2) (n, &resid[1], &c__1);
609 *rnorm = workd[*n * 3 + 4];
619 F77_FUNC(dgemv, DGEMV) ("T", n, &i__1, &c_b22, &v[v_offset], ldv, &workd[1], &c__1, &c_b24,
620 &workd[*n + 1], &c__1);
622 F77_FUNC(dgemv, DGEMV) ("N", n, &i__1, &c_b27, &v[v_offset], ldv, &workd[*n + 1], &c__1, &
623 c_b22, &resid[1], &c__1);
627 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[*n + 1], &c__1);
633 else if (*bmat == 'I')
635 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
642 *rnorm = F77_FUNC(ddot, DDOT) (n, &resid[1], &c__1, &workd[1], &c__1);
643 *rnorm = sqrt(fabs(*rnorm));
645 else if (*bmat == 'I')
647 *rnorm = F77_FUNC(dnrm2, DNRM2) (n, &resid[1], &c__1);
650 if (*rnorm > workd[*n * 3 + 4] * .717f)
659 workd[*n * 3 + 4] = *rnorm;
666 for (jj = 1; jj <= i__1; ++jj)
687 F77_FUNC(dsapps, DSAPPS) (int * n,
704 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
708 double r__, s, a1, a2, a3, a4;
719 v_offset = 1 + v_dim1;
722 h_offset = 1 + h_dim1;
725 q_offset = 1 + q_dim1;
728 epsmch = GMX_DOUBLE_EPS;
734 F77_FUNC(dlaset, DLASET) ("All", &kplusp, &kplusp, &c_b4, &c_b5, &q[q_offset], ldq);
742 for (jj = 1; jj <= i__1; ++jj)
750 for (i__ = istart; i__ <= i__2; ++i__)
752 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__ + 1 + (h_dim1*2)]);
753 if (h__[i__ + 1 + h_dim1] <= epsmch * big)
755 h__[i__ + 1 + h_dim1] = 0.;
766 f = h__[istart + (h_dim1 << 1)] - shift[jj];
767 g = h__[istart + 1 + h_dim1];
768 F77_FUNC(dlartg, DLARTG) (&f, &g, &c__, &s, &r__);
770 a1 = c__ * h__[istart + (h_dim1 << 1)] + s * h__[istart + 1 +
772 a2 = c__ * h__[istart + 1 + h_dim1] + s * h__[istart + 1 + (
774 a4 = c__ * h__[istart + 1 + (h_dim1 << 1)] - s * h__[istart + 1 +
776 a3 = c__ * h__[istart + 1 + h_dim1] - s * h__[istart + (h_dim1 <<
778 h__[istart + (h_dim1 << 1)] = c__ * a1 + s * a2;
779 h__[istart + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
780 h__[istart + 1 + h_dim1] = c__ * a3 + s * a4;
783 i__2 = (i__3 < kplusp) ? i__3 : kplusp;
784 for (j = 1; j <= i__2; ++j)
786 a1 = c__ * q[j + istart * q_dim1] + s * q[j + (istart + 1) *
788 q[j + (istart + 1) * q_dim1] = -s * q[j + istart * q_dim1] +
789 c__ * q[j + (istart + 1) * q_dim1];
790 q[j + istart * q_dim1] = a1;
795 for (i__ = istart + 1; i__ <= i__2; ++i__)
798 f = h__[i__ + h_dim1];
799 g = s * h__[i__ + 1 + h_dim1];
801 h__[i__ + 1 + h_dim1] = c__ * h__[i__ + 1 + h_dim1];
802 F77_FUNC(dlartg, DLARTG) (&f, &g, &c__, &s, &r__);
811 h__[i__ + h_dim1] = r__;
813 a1 = c__ * h__[i__ + (h_dim1 << 1)] + s * h__[i__ + 1 +
815 a2 = c__ * h__[i__ + 1 + h_dim1] + s * h__[i__ + 1 + (h_dim1
817 a3 = c__ * h__[i__ + 1 + h_dim1] - s * h__[i__ + (h_dim1 << 1)
819 a4 = c__ * h__[i__ + 1 + (h_dim1 << 1)] - s * h__[i__ + 1 +
822 h__[i__ + (h_dim1 << 1)] = c__ * a1 + s * a2;
823 h__[i__ + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
824 h__[i__ + 1 + h_dim1] = c__ * a3 + s * a4;
827 i__3 = (i__4 < kplusp) ? i__4 : kplusp;
828 for (j = 1; j <= i__3; ++j)
830 a1 = c__ * q[j + i__ * q_dim1] + s * q[j + (i__ + 1) *
832 q[j + (i__ + 1) * q_dim1] = -s * q[j + i__ * q_dim1] +
833 c__ * q[j + (i__ + 1) * q_dim1];
834 q[j + i__ * q_dim1] = a1;
843 if (h__[iend + h_dim1] < 0.)
845 h__[iend + h_dim1] = -h__[iend + h_dim1];
846 F77_FUNC(dscal, DSCAL) (&kplusp, &c_b14, &q[iend * q_dim1 + 1], &c__1);
855 for (i__ = itop; i__ <= i__2; ++i__)
857 if (h__[i__ + 1 + h_dim1] > 0.)
869 for (i__ = itop; i__ <= i__1; ++i__)
871 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__+ 1 + (h_dim1*2)]);
872 if (h__[i__ + 1 + h_dim1] <= epsmch * big)
874 h__[i__ + 1 + h_dim1] = 0.;
879 if (h__[*kev + 1 + h_dim1] > 0.)
881 F77_FUNC(dgemv, DGEMV) ("N", n, &kplusp, &c_b5, &v[v_offset], ldv, &q[(*kev + 1) *
882 q_dim1 + 1], &c__1, &c_b4, &workd[*n + 1], &c__1);
886 for (i__ = 1; i__ <= i__1; ++i__)
888 i__2 = kplusp - i__ + 1;
889 F77_FUNC(dgemv, DGEMV) ("N", n, &i__2, &c_b5, &v[v_offset], ldv, &q[(*kev - i__ + 1) *
890 q_dim1 + 1], &c__1, &c_b4, &workd[1], &c__1);
891 F77_FUNC(dcopy, DCOPY) (n, &workd[1], &c__1, &v[(kplusp - i__ + 1) * v_dim1 + 1], &
896 F77_FUNC(dlacpy, DLACPY) ("All", n, kev, &v[(*np + 1) * v_dim1 + 1], ldv, &v[v_offset], ldv);
898 if (h__[*kev + 1 + h_dim1] > 0.)
900 F77_FUNC(dcopy, DCOPY) (n, &workd[*n + 1], &c__1, &v[(*kev + 1) * v_dim1 + 1], &c__1);
903 F77_FUNC(dscal, DSCAL) (n, &q[kplusp + *kev * q_dim1], &resid[1], &c__1);
904 if (h__[*kev + 1 + h_dim1] > 0.)
906 F77_FUNC(daxpy, DAXPY) (n, &h__[*kev + 1 + h_dim1], &v[(*kev + 1) * v_dim1 + 1], &c__1,
920 F77_FUNC(dsortr, DSORTR) (const char * which,
935 if (!strncmp(which, "SA", 2))
944 for (i__ = igap; i__ <= i__1; ++i__)
954 if (x1[j] < x1[j + igap])
957 x1[j] = x1[j + igap];
962 x2[j] = x2[j + igap];
979 else if (!strncmp(which, "SM", 2))
988 for (i__ = igap; i__ <= i__1; ++i__)
998 if (fabs(x1[j]) < fabs(x1[j + igap]))
1001 x1[j] = x1[j + igap];
1002 x1[j + igap] = temp;
1006 x2[j] = x2[j + igap];
1007 x2[j + igap] = temp;
1023 else if (!strncmp(which, "LA", 2))
1032 for (i__ = igap; i__ <= i__1; ++i__)
1042 if (x1[j] > x1[j + igap])
1045 x1[j] = x1[j + igap];
1046 x1[j + igap] = temp;
1050 x2[j] = x2[j + igap];
1051 x2[j + igap] = temp;
1067 else if (!strncmp(which, "LM", 2))
1077 for (i__ = igap; i__ <= i__1; ++i__)
1087 if (fabs(x1[j]) > fabs(x1[j + igap]))
1090 x1[j] = x1[j + igap];
1091 x1[j + igap] = temp;
1095 x2[j] = x2[j + igap];
1096 x2[j + igap] = temp;
1121 F77_FUNC(dsesrt, DSESRT) (const char * which,
1129 int a_dim1, a_offset, i__1;
1136 a_offset = 1 + a_dim1 * 0;
1141 if (!strncmp(which, "SA", 2))
1150 for (i__ = igap; i__ <= i__1; ++i__)
1160 if (x[j] < x[j + igap])
1167 F77_FUNC(dswap, DSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1168 a_dim1 + 1], &c__1);
1184 else if (!strncmp(which, "SM", 2))
1193 for (i__ = igap; i__ <= i__1; ++i__)
1203 if (fabs(x[j]) < fabs(x[j + igap]))
1210 F77_FUNC(dswap, DSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1211 a_dim1 + 1], &c__1);
1227 else if (!strncmp(which, "LA", 2))
1236 for (i__ = igap; i__ <= i__1; ++i__)
1246 if (x[j] > x[j + igap])
1253 F77_FUNC(dswap, DSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1254 a_dim1 + 1], &c__1);
1270 else if (!strncmp(which, "LM", 2))
1279 for (i__ = igap; i__ <= i__1; ++i__)
1289 if (fabs(x[j]) > fabs(x[j + igap]))
1296 F77_FUNC(dswap, DSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1297 a_dim1 + 1], &c__1);
1322 F77_FUNC(dsgets, DSGETS) (int * ishift,
1338 if (!strncmp(which, "BE", 2))
1341 F77_FUNC(dsortr, DSORTR) ("LA", &c__1, &i__1, &ritz[1], &bounds[1]);
1345 i__1 = (kevd2 < *np) ? kevd2 : *np;
1346 i__2 = (kevd2 > *np) ? kevd2 : *np;
1347 F77_FUNC(dswap, DSWAP) (&i__1, &ritz[1], &c__1,
1348 &ritz[i__2 + 1], &c__1);
1349 i__1 = (kevd2 < *np) ? kevd2 : *np;
1350 i__2 = (kevd2 > *np) ? kevd2 : *np;
1351 F77_FUNC(dswap, DSWAP) (&i__1, &bounds[1], &c__1,
1352 &bounds[i__2 + 1], &c__1);
1359 F77_FUNC(dsortr, DSORTR) (which, &c__1, &i__1, &ritz[1], &bounds[1]);
1362 if (*ishift == 1 && *np > 0)
1365 F77_FUNC(dsortr, DSORTR) ("SM", &c__1, np, &bounds[1], &ritz[1]);
1366 F77_FUNC(dcopy, DCOPY) (np, &ritz[1], &c__1, &shifts[1], &c__1);
1376 F77_FUNC(dsconv, DSCONV) (int * n,
1392 eps23 = GMX_DOUBLE_EPS;
1393 eps23 = pow(eps23, c_b3);
1397 for (i__ = 1; i__ <= i__1; ++i__)
1401 d__3 = fabs(ritz[i__]);
1402 temp = (d__2 > d__3) ? d__2 : d__3;
1403 if (bounds[i__] <= *tol * temp)
1414 F77_FUNC(dseigt, DSEIGT) (double * rnorm,
1424 int h_dim1, h_offset, i__1;
1433 h_offset = 1 + h_dim1;
1436 F77_FUNC(dcopy, DCOPY) (n, &h__[(h_dim1 << 1) + 1], &c__1, &eig[1], &c__1);
1438 F77_FUNC(dcopy, DCOPY) (&i__1, &h__[h_dim1 + 2], &c__1, &workl[1], &c__1);
1439 F77_FUNC(dstqrb, DSTQRB) (n, &eig[1], &workl[1], &bounds[1], &workl[*n + 1], ierr);
1446 for (k = 1; k <= i__1; ++k)
1448 bounds[k] = *rnorm * fabs(bounds[k]);
1461 F77_FUNC(dsaitr, DSAITR) (int * ido,
1485 int h_dim1, h_offset, v_dim1, v_offset, i__1;
1489 double safmin, minval;
1495 v_offset = 1 + v_dim1;
1498 h_offset = 1 + h_dim1;
1502 minval = GMX_DOUBLE_MIN;
1503 safmin = minval / GMX_DOUBLE_EPS;
1517 iwork[9] = iwork[8] + *n;
1518 iwork[10] = iwork[9] + *n;
1556 F77_FUNC(dgetv0, DGETV0) (ido, bmat, &iwork[11], &c__0, n, &iwork[12], &v[v_offset], ldv,
1557 &resid[1], rnorm, &ipntr[1], &workd[1], &iwork[21], &iwork[7]);
1570 *info = iwork[12] - 1;
1577 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &v[iwork[12] * v_dim1 + 1], &c__1);
1578 if (*rnorm >= safmin)
1580 temp1 = 1. / *rnorm;
1581 F77_FUNC(dscal, DSCAL) (n, &temp1, &v[iwork[12] * v_dim1 + 1], &c__1);
1582 F77_FUNC(dscal, DSCAL) (n, &temp1, &workd[iwork[8]], &c__1);
1587 F77_FUNC(dlascl, DLASCL) ("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &v[iwork[12] *
1588 v_dim1 + 1], n, &infol);
1589 F77_FUNC(dlascl, DLASCL) ("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &workd[iwork[
1594 F77_FUNC(dcopy, DCOPY) (n, &v[iwork[12] * v_dim1 + 1], &c__1, &workd[iwork[10]], &c__1);
1595 ipntr[1] = iwork[10];
1596 ipntr[2] = iwork[9];
1597 ipntr[3] = iwork[8];
1606 F77_FUNC(dcopy, DCOPY) (n, &workd[iwork[9]], &c__1, &resid[1], &c__1);
1615 ipntr[1] = iwork[9];
1616 ipntr[2] = iwork[8];
1621 else if (*bmat == 'I')
1623 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1633 workd[*n * 3 + 3] = F77_FUNC(ddot, DDOT) (n, &resid[1], &c__1, &workd[iwork[10]], &
1635 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
1637 else if (*bmat == 'G')
1639 workd[*n * 3 + 3] = F77_FUNC(ddot, DDOT) (n, &resid[1], &c__1, &workd[iwork[8]], &
1641 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
1643 else if (*bmat == 'I')
1645 workd[*n * 3 + 3] = F77_FUNC(dnrm2, DNRM2) (n, &resid[1], &c__1);
1650 F77_FUNC(dgemv, DGEMV) ("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]],
1651 &c__1, &c_b42, &workd[iwork[9]], &c__1);
1653 else if (*mode == 2)
1655 F77_FUNC(dgemv, DGEMV) ("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[10]
1656 ], &c__1, &c_b42, &workd[iwork[9]], &c__1);
1659 F77_FUNC(dgemv, DGEMV) ("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
1660 c__1, &c_b18, &resid[1], &c__1);
1662 h__[iwork[12] + (h_dim1 << 1)] = workd[iwork[9] + iwork[12] - 1];
1663 if (iwork[12] == 1 || iwork[4] == 1)
1665 h__[iwork[12] + h_dim1] = 0.;
1669 h__[iwork[12] + h_dim1] = *rnorm;
1677 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
1678 ipntr[1] = iwork[9];
1679 ipntr[2] = iwork[8];
1684 else if (*bmat == 'I')
1686 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1694 *rnorm = F77_FUNC(ddot, DDOT) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1695 *rnorm = sqrt(fabs(*rnorm));
1697 else if (*bmat == 'I')
1699 *rnorm = F77_FUNC(dnrm2, DNRM2) (n, &resid[1], &c__1);
1702 if (*rnorm > workd[*n * 3 + 3] * .717f)
1709 F77_FUNC(dgemv, DGEMV) ("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]], &
1710 c__1, &c_b42, &workd[iwork[9]], &c__1);
1712 F77_FUNC(dgemv, DGEMV) ("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
1713 c__1, &c_b18, &resid[1], &c__1);
1715 if (iwork[12] == 1 || iwork[4] == 1)
1717 h__[iwork[12] + h_dim1] = 0.;
1719 h__[iwork[12] + (h_dim1 << 1)] += workd[iwork[9] + iwork[12] - 1];
1724 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
1725 ipntr[1] = iwork[9];
1726 ipntr[2] = iwork[8];
1731 else if (*bmat == 'I')
1733 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1740 workd[*n * 3 + 2] = F77_FUNC(ddot, DDOT) (n, &resid[1], &c__1, &workd[iwork[8]], &
1742 workd[*n * 3 + 2] = sqrt(fabs(workd[*n * 3 + 2]));
1744 else if (*bmat == 'I')
1746 workd[*n * 3 + 2] = F77_FUNC(dnrm2, DNRM2) (n, &resid[1], &c__1);
1750 if (workd[*n * 3 + 2] > *rnorm * .717f)
1753 *rnorm = workd[*n * 3 + 2];
1759 *rnorm = workd[*n * 3 + 2];
1767 for (jj = 1; jj <= i__1; ++jj)
1779 if (h__[iwork[12] + h_dim1] < 0.)
1781 h__[iwork[12] + h_dim1] = -h__[iwork[12] + h_dim1];
1782 if (iwork[12] < *k + *np)
1784 F77_FUNC(dscal, DSCAL) (n, &c_b50, &v[(iwork[12] + 1) * v_dim1 + 1], &c__1);
1788 F77_FUNC(dscal, DSCAL) (n, &c_b50, &resid[1], &c__1);
1793 if (iwork[12] > *k + *np)
1813 F77_FUNC(dsaup2, DSAUP2) (int * ido,
1822 int gmx_unused * iupd,
1843 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
1862 v_offset = 1 + v_dim1;
1865 h_offset = 1 + h_dim1;
1868 q_offset = 1 + q_dim1;
1872 eps23 = GMX_DOUBLE_EPS;
1873 eps23 = pow(eps23, c_b3);
1886 iwork[7] = iwork[9] + iwork[10];
1909 F77_FUNC(dgetv0, DGETV0) (ido, bmat, &c__1, &iwork[3], n, &c__1, &v[v_offset], ldv, &
1910 resid[1], &workd[*n * 3 + 1], &ipntr[1], &workd[1], &iwork[41],
1918 if (workd[*n * 3 + 1] == 0.)
1943 F77_FUNC(dsaitr, DSAITR) (ido, bmat, n, &c__0, &iwork[9], mode, &resid[1], &workd[*n * 3 +
1944 1], &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
1970 F77_FUNC(dsaitr, DSAITR) (ido, bmat, n, nev, np, mode, &resid[1], &workd[*n * 3 + 1],
1971 &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
1989 F77_FUNC(dseigt, DSEIGT) (&workd[*n * 3 + 1], &iwork[7], &h__[h_offset], ldh, &ritz[1], &
1990 bounds[1], &workl[1], &ierr);
1998 F77_FUNC(dcopy, DCOPY) (&iwork[7], &ritz[1], &c__1, &workl[iwork[7] + 1], &c__1);
1999 F77_FUNC(dcopy, DCOPY) (&iwork[7], &bounds[1], &c__1, &workl[(iwork[7] << 1) + 1], &c__1);
2003 F77_FUNC(dsgets, DSGETS) (ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
2005 F77_FUNC(dcopy, DCOPY) (nev, &bounds[*np + 1], &c__1, &workl[*np + 1], &c__1);
2006 F77_FUNC(dsconv, DSCONV) (nev, &ritz[*np + 1], &workl[*np + 1], tol, &iwork[8]);
2010 for (j = 1; j <= i__1; ++j)
2012 if (bounds[j] == 0.)
2019 if (iwork[8] >= iwork[9] || iwork[6] > *mxiter || *np == 0)
2022 if (!strncmp(which, "BE", 2))
2025 strncpy(wprime, "SA", 2);
2026 F77_FUNC(dsortr, DSORTR) (wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
2028 nevm2 = *nev - nevd2;
2031 i__1 = (nevd2 < *np) ? nevd2 : *np;
2032 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np + 1;
2033 F77_FUNC(dswap, DSWAP) (&i__1, &ritz[nevm2 + 1], &c__1,
2034 &ritz[((i__2 > i__3) ? i__2 : i__3)],
2036 i__1 = (nevd2 < *np) ? nevd2 : *np;
2037 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np;
2038 F77_FUNC(dswap, DSWAP) (&i__1, &bounds[nevm2 + 1], &c__1,
2039 &bounds[((i__2 > i__3) ? i__2 : i__3) + 1],
2047 if (!strncmp(which, "LM", 2))
2049 strncpy(wprime, "SM", 2);
2051 if (!strncmp(which, "SM", 2))
2053 strncpy(wprime, "LM", 2);
2055 if (!strncmp(which, "LA", 2))
2057 strncpy(wprime, "SA", 2);
2059 if (!strncmp(which, "SA", 2))
2061 strncpy(wprime, "LA", 2);
2064 F77_FUNC(dsortr, DSORTR) (wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
2069 for (j = 1; j <= i__1; ++j)
2072 d__3 = fabs(ritz[j]);
2073 temp = (d__2 > d__3) ? d__2 : d__3;
2077 strncpy(wprime, "LA", 2);
2078 F77_FUNC(dsortr, DSORTR) (wprime, &c__1, &iwork[9], &bounds[1], &ritz[1]);
2081 for (j = 1; j <= i__1; ++j)
2084 d__3 = fabs(ritz[j]);
2085 temp = (d__2 > d__3) ? d__2 : d__3;
2089 if (!strncmp(which, "BE", 2))
2092 strncpy(wprime, "LA", 2);
2093 F77_FUNC(dsortr, DSORTR) (wprime, &c__1, &iwork[8], &ritz[1], &bounds[1]);
2098 F77_FUNC(dsortr, DSORTR) (which, &c__1, &iwork[8], &ritz[1], &bounds[1]);
2102 h__[h_dim1 + 1] = workd[*n * 3 + 1];
2105 if (iwork[6] > *mxiter && iwork[8] < *nev)
2109 if (*np == 0 && iwork[8] < iwork[9])
2118 else if (iwork[8] < *nev && *ishift == 1)
2121 i__1 = iwork[8], i__2 = *np / 2;
2122 *nev += (i__1 < i__2) ? i__1 : i__2;
2123 if (*nev == 1 && iwork[7] >= 6)
2125 *nev = iwork[7] / 2;
2127 else if (*nev == 1 && iwork[7] > 2)
2131 *np = iwork[7] - *nev;
2136 F77_FUNC(dsgets, DSGETS) (ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
2156 F77_FUNC(dcopy, DCOPY) (np, &workl[1], &c__1, &ritz[1], &c__1);
2159 F77_FUNC(dsapps, DSAPPS) (n, nev, np, &ritz[1], &v[v_offset], ldv, &h__[h_offset], ldh, &
2160 resid[1], &q[q_offset], ldq, &workd[1]);
2165 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[*n + 1], &c__1);
2172 else if (*bmat == 'I')
2174 F77_FUNC(dcopy, DCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
2181 workd[*n * 3 + 1] = F77_FUNC(ddot, DDOT) (n, &resid[1], &c__1, &workd[1], &c__1);
2182 workd[*n * 3 + 1] = sqrt(fabs(workd[*n * 3 + 1]));
2184 else if (*bmat == 'I')
2186 workd[*n * 3 + 1] = F77_FUNC(dnrm2, DNRM2) (n, &resid[1], &c__1);
2208 F77_FUNC(dsaupd, DSAUPD) (int * ido,
2226 int v_dim1, v_offset, i__1, i__2;
2232 v_offset = 1 + v_dim1;
2244 iwork[5] = iparam[1];
2245 iwork[10] = iparam[3];
2246 iwork[12] = iparam[4];
2249 iwork[11] = iparam[7];
2260 else if (*ncv <= *nev || *ncv > *n)
2266 iwork[15] = *ncv - *nev;
2272 if (strncmp(which, "LM", 2) && strncmp(which, "SM", 2) &&
2273 strncmp(which, "LA", 2) && strncmp(which, "SA", 2) &&
2274 strncmp(which, "BE", 2))
2278 if (*bmat != 'I' && *bmat != 'G')
2284 if (*lworkl < i__1 * i__1 + (*ncv << 3))
2288 if (iwork[11] < 1 || iwork[11] > 5)
2292 else if (iwork[11] == 1 && *bmat == 'G')
2296 else if (iwork[5] < 0 || iwork[5] > 1)
2300 else if (*nev == 1 && !strncmp(which, "BE", 2))
2318 *tol = GMX_DOUBLE_EPS;
2321 iwork[15] = *ncv - *nev;
2324 i__1 = i__2 * i__2 + (*ncv << 3);
2325 for (j = 1; j <= i__1; ++j)
2333 iwork[16] = iwork[3] + (iwork[8] << 1);
2334 iwork[1] = iwork[16] + *ncv;
2335 iwork[4] = iwork[1] + *ncv;
2337 iwork[7] = iwork[4] + i__1 * i__1;
2338 iwork[14] = iwork[7] + *ncv * 3;
2340 ipntr[4] = iwork[14];
2341 ipntr[5] = iwork[3];
2342 ipntr[6] = iwork[16];
2343 ipntr[7] = iwork[1];
2344 ipntr[11] = iwork[7];
2347 F77_FUNC(dsaup2, DSAUP2) (ido, bmat, n, which, &iwork[13], &iwork[15], tol, &resid[1], &
2348 iwork[11], &iwork[6], &iwork[5], &iwork[10], &v[v_offset], ldv, &
2349 workl[iwork[3]], &iwork[8], &workl[iwork[16]], &workl[iwork[1]], &
2350 workl[iwork[4]], &iwork[9], &workl[iwork[7]], &ipntr[1], &workd[1],
2355 iparam[8] = iwork[15];
2362 iparam[3] = iwork[10];
2363 iparam[5] = iwork[15];
2383 F77_FUNC(dseupd, DSEUPD) (int * rvec,
2384 const char * howmny,
2409 int v_dim1, v_offset, z_dim1, z_offset, i__1;
2410 double d__1, d__2, d__3;
2412 int j, k, ih, iq, iw, ibd, ihb, ihd, ldh, ilg, ldq, ism, irz;
2424 double thres1 = 0, thres2 = 0;
2428 int leftptr, rghtptr;
2434 z_offset = 1 + z_dim1;
2439 v_offset = 1 + v_dim1;
2467 if (*ncv <= *nev || *ncv > *n)
2471 if (strncmp(which, "LM", 2) && strncmp(which, "SM", 2) &&
2472 strncmp(which, "LA", 2) && strncmp(which, "SA", 2) &&
2473 strncmp(which, "BE", 2))
2477 if (*bmat != 'I' && *bmat != 'G')
2481 if (*howmny != 'A' && *howmny != 'P' &&
2482 *howmny != 'S' && *rvec)
2486 if (*rvec && *howmny == 'S')
2491 if (*rvec && *lworkl < i__1 * i__1 + (*ncv << 3))
2496 if (mode == 1 || mode == 2)
2498 strncpy(type__, "REGULR", 6);
2502 strncpy(type__, "SHIFTI", 6);
2506 strncpy(type__, "BUCKLE", 6);
2510 strncpy(type__, "CAYLEY", 6);
2516 if (mode == 1 && *bmat == 'G')
2520 if (*nev == 1 && !strncmp(which, "BE", 2))
2539 iw = iq + ldh * *ncv;
2540 next = iw + (*ncv << 1);
2546 irz = ipntr[11] + *ncv;
2550 eps23 = GMX_DOUBLE_EPS;
2551 eps23 = pow(eps23, c_b21);
2558 else if (*bmat == 'G')
2560 bnorm2 = F77_FUNC(dnrm2, DNRM2) (n, &workd[1], &c__1);
2566 if (!strncmp(which, "LM", 2) || !strncmp(which, "SM", 2) ||
2567 !strncmp(which, "LA", 2) || !strncmp(which, "SA", 2))
2571 else if (!strncmp(which, "BE", 2))
2575 ism = (*nev > nconv) ? *nev : nconv;
2578 thres1 = workl[ism];
2579 thres2 = workl[ilg];
2587 for (j = 0; j <= i__1; ++j)
2590 if (!strncmp(which, "LM", 2))
2592 if (fabs(workl[irz + j]) >= fabs(thres1))
2595 d__3 = fabs(workl[irz + j]);
2596 tempbnd = (d__2 > d__3) ? d__2 : d__3;
2597 if (workl[ibd + j] <= *tol * tempbnd)
2603 else if (!strncmp(which, "SM", 2))
2605 if (fabs(workl[irz + j]) <= fabs(thres1))
2608 d__3 = fabs(workl[irz + j]);
2609 tempbnd = (d__2 > d__3) ? d__2 : d__3;
2610 if (workl[ibd + j] <= *tol * tempbnd)
2616 else if (!strncmp(which, "LA", 2))
2618 if (workl[irz + j] >= thres1)
2621 d__3 = fabs(workl[irz + j]);
2622 tempbnd = (d__2 > d__3) ? d__2 : d__3;
2623 if (workl[ibd + j] <= *tol * tempbnd)
2629 else if (!strncmp(which, "SA", 2))
2631 if (workl[irz + j] <= thres1)
2634 d__3 = fabs(workl[irz + j]);
2635 tempbnd = (d__2 > d__3) ? d__2 : d__3;
2636 if (workl[ibd + j] <= *tol * tempbnd)
2642 else if (!strncmp(which, "BE", 2))
2644 if (workl[irz + j] <= thres1 || workl[irz + j] >= thres2)
2647 d__3 = fabs(workl[irz + j]);
2648 tempbnd = (d__2 > d__3) ? d__2 : d__3;
2649 if (workl[ibd + j] <= *tol * tempbnd)
2657 reord = select[j + 1] || reord;
2666 F77_FUNC(dcopy, DCOPY) (&i__1, &workl[ih + 1], &c__1, &workl[ihb], &c__1);
2667 F77_FUNC(dcopy, DCOPY) (ncv, &workl[ih + ldh], &c__1, &workl[ihd], &c__1);
2669 F77_FUNC(dsteqr, DSTEQR) ("Identity", ncv, &workl[ihd], &workl[ihb], &workl[iq], &ldq, &
2691 if (select[leftptr])
2697 else if (!select[rghtptr])
2706 temp = workl[ihd + leftptr - 1];
2707 workl[ihd + leftptr - 1] = workl[ihd + rghtptr - 1];
2708 workl[ihd + rghtptr - 1] = temp;
2709 F77_FUNC(dcopy, DCOPY) (ncv, &workl[iq + *ncv * (leftptr - 1)], &c__1, &workl[
2711 F77_FUNC(dcopy, DCOPY) (ncv, &workl[iq + *ncv * (rghtptr - 1)], &c__1, &workl[
2712 iq + *ncv * (leftptr - 1)], &c__1);
2713 F77_FUNC(dcopy, DCOPY) (ncv, &workl[iw], &c__1, &workl[iq + *ncv * (rghtptr -
2720 if (leftptr < rghtptr)
2729 F77_FUNC(dcopy, DCOPY) (&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
2735 F77_FUNC(dcopy, DCOPY) (&nconv, &workl[ritz], &c__1, &d__[1], &c__1);
2736 F77_FUNC(dcopy, DCOPY) (ncv, &workl[ritz], &c__1, &workl[ihd], &c__1);
2739 if (!strncmp(type__, "REGULR", 6))
2744 F77_FUNC(dsesrt, DSESRT) ("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
2748 F77_FUNC(dcopy, DCOPY) (ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
2755 F77_FUNC(dcopy, DCOPY) (ncv, &workl[ihd], &c__1, &workl[iw], &c__1);
2756 if (!strncmp(type__, "SHIFTI", 6))
2759 for (k = 1; k <= i__1; ++k)
2761 workl[ihd + k - 1] = 1. / workl[ihd + k - 1] + *sigma;
2764 else if (!strncmp(type__, "BUCKLE", 6))
2767 for (k = 1; k <= i__1; ++k)
2769 workl[ihd + k - 1] = *sigma * workl[ihd + k - 1] / (workl[ihd
2773 else if (!strncmp(type__, "CAYLEY", 6))
2776 for (k = 1; k <= i__1; ++k)
2778 workl[ihd + k - 1] = *sigma * (workl[ihd + k - 1] + 1.) / (
2779 workl[ihd + k - 1] - 1.);
2783 F77_FUNC(dcopy, DCOPY) (&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
2784 F77_FUNC(dsortr, DSORTR) ("LA", &c__1, &nconv, &workl[ihd], &workl[iw]);
2787 F77_FUNC(dsesrt, DSESRT) ("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
2791 F77_FUNC(dcopy, DCOPY) (ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
2792 d__1 = bnorm2 / rnorm;
2793 F77_FUNC(dscal, DSCAL) (ncv, &d__1, &workl[ihb], &c__1);
2794 F77_FUNC(dsortr, DSORTR) ("LA", &c__1, &nconv, &d__[1], &workl[ihb]);
2799 if (*rvec && *howmny == 'A')
2802 F77_FUNC(dgeqr2, DGEQR2) (ncv, &nconv, &workl[iq], &ldq, &workl[iw + *ncv], &workl[ihb],
2805 F77_FUNC(dorm2r, DORM2R) ("Right", "Notranspose", n, ncv, &nconv, &workl[iq], &ldq, &
2806 workl[iw + *ncv], &v[v_offset], ldv, &workd[*n + 1], &ierr);
2807 F77_FUNC(dlacpy, DLACPY) ("All", n, &nconv, &v[v_offset], ldv, &z__[z_offset], ldz);
2810 for (j = 1; j <= i__1; ++j)
2812 workl[ihb + j - 1] = 0.;
2814 workl[ihb + *ncv - 1] = 1.;
2815 F77_FUNC(dorm2r, DORM2R) ("Left", "Transpose", ncv, &c__1, &nconv, &workl[iq], &ldq, &
2816 workl[iw + *ncv], &workl[ihb], ncv, &temp, &ierr);
2819 else if (*rvec && *howmny == 'S')
2824 if (!strncmp(type__, "REGULR", 6) && *rvec)
2828 for (j = 1; j <= i__1; ++j)
2830 workl[ihb + j - 1] = rnorm * fabs(workl[ihb + j - 1]);
2834 else if (strncmp(type__, "REGULR", 6) && *rvec)
2837 F77_FUNC(dscal, DSCAL) (ncv, &bnorm2, &workl[ihb], &c__1);
2838 if (!strncmp(type__, "SHIFTI", 6))
2842 for (k = 1; k <= i__1; ++k)
2844 d__2 = workl[iw + k - 1];
2845 workl[ihb + k - 1] = fabs(workl[ihb + k - 1])/(d__2 * d__2);
2849 else if (!strncmp(type__, "BUCKLE", 6))
2853 for (k = 1; k <= i__1; ++k)
2855 d__2 = workl[iw + k - 1] - 1.;
2856 workl[ihb + k - 1] = *sigma * fabs(workl[ihb + k - 1])/(d__2 * d__2);
2860 else if (!strncmp(type__, "CAYLEY", 6))
2864 for (k = 1; k <= i__1; ++k)
2866 workl[ihb + k - 1] = fabs(workl[ihb + k - 1] / workl[iw + k - 1] * (workl[iw + k - 1] - 1.));
2874 if (*rvec && (!strncmp(type__, "SHIFTI", 6) || !strncmp(type__, "CAYLEY", 6)))
2878 for (k = 0; k <= i__1; ++k)
2880 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / workl[iw + k];
2884 else if (*rvec && !strncmp(type__, "BUCKLE", 6))
2888 for (k = 0; k <= i__1; ++k)
2890 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / (workl[iw + k] -
2896 if (strncmp(type__, "REGULR", 6))
2898 F77_FUNC(dger, DGER) (n, &nconv, &c_b102, &resid[1], &c__1, &workl[iw], &c__1, &z__[
2912 /* Selected single precision arpack routines */
2916 F77_FUNC(sstqrb, SSTQRB) (int * n,
2930 int i__, j, k, l, m;
2932 int l1, ii, mm, lm1, mm1, nm1;
2933 float rt1, rt2, eps;
2936 int lend, jtot, lendm1, lendp1, iscale;
2938 int lendsv, nmaxit, icompz;
2939 float ssfmax, ssfmin, safmin, minval, safmax, anorm;
2965 eps = GMX_FLOAT_EPS;
2969 minval = GMX_FLOAT_MIN;
2970 safmin = minval / GMX_FLOAT_EPS;
2971 safmax = 1. / safmin;
2972 ssfmax = sqrt(safmax) / 3.;
2973 ssfmin = sqrt(safmin) / eps2;
2978 for (j = 1; j <= i__1; ++j)
3004 for (m = l1; m <= i__1; ++m)
3011 if (tst <= sqrt(fabs(d__[m])) * sqrt(fabs(d__[m+1])) * eps)
3031 i__1 = lend - l + 1;
3032 anorm = F77_FUNC(slanst, SLANST) ("i", &i__1, &d__[l], &e[l]);
3041 i__1 = lend - l + 1;
3042 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n,
3045 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n,
3048 else if (anorm < ssfmin)
3051 i__1 = lend - l + 1;
3052 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n,
3055 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n,
3059 if (fabs(d__[lend]) < fabs(d__[l]))
3073 for (m = l; m <= i__1; ++m)
3077 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m + 1]) + safmin)
3101 F77_FUNC(slaev2, SLAEV2) (&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s);
3103 work[*n - 1 + l] = s;
3106 z__[l + 1] = c__ * tst - s * z__[l];
3107 z__[l] = s * tst + c__ * z__[l];
3111 F77_FUNC(slae2, SLAE2) (&d__[l], &e[l], &d__[l + 1], &rt1, &rt2);
3130 g = (d__[l + 1] - p) / (e[l] * 2.);
3131 r__ = F77_FUNC(slapy2, SLAPY2) (&g, &c_b31);
3132 g = d__[m] - p + e[l] / (g + ((g > 0) ? r__ : -r__ ));
3140 for (i__ = mm1; i__ >= i__1; --i__)
3144 F77_FUNC(slartg, SLARTG) (&g, &f, &c__, &s, &r__);
3149 g = d__[i__ + 1] - p;
3150 r__ = (d__[i__] - g) * s + c__ * 2. * b;
3152 d__[i__ + 1] = g + p;
3158 work[*n - 1 + i__] = -s;
3167 F77_FUNC(slasr, SLASR) ("r", "v", "b", &c__1, &mm, &work[l], &work[*n - 1 + l], &
3194 for (m = l; m >= i__1; --m)
3196 d__2 = fabs(e[m - 1]);
3198 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m- 1]) + safmin)
3222 F77_FUNC(slaev2, SLAEV2) (&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s)
3226 z__[l] = c__ * tst - s * z__[l - 1];
3227 z__[l - 1] = s * tst + c__ * z__[l - 1];
3231 F77_FUNC(slae2, SLAE2) (&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2);
3251 g = (d__[l - 1] - p) / (e[l - 1] * 2.);
3252 r__ = F77_FUNC(slapy2, SLAPY2) (&g, &c_b31);
3253 g = d__[m] - p + e[l - 1] / (g + ((g > 0) ? r__ : -r__ ));
3261 for (i__ = m; i__ <= i__1; ++i__)
3265 F77_FUNC(slartg, SLARTG) (&g, &f, &c__, &s, &r__);
3271 r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b;
3279 work[*n - 1 + i__] = s;
3288 F77_FUNC(slasr, SLASR) ("r", "v", "f", &c__1, &mm, &work[m], &work[*n - 1 + m], &
3311 i__1 = lendsv - lsv + 1;
3312 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv],
3314 i__1 = lendsv - lsv;
3315 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n,
3318 else if (iscale == 2)
3320 i__1 = lendsv - lsv + 1;
3321 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv],
3323 i__1 = lendsv - lsv;
3324 F77_FUNC(slascl, SLASCL) ("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n,
3333 for (i__ = 1; i__ <= i__1; ++i__)
3346 F77_FUNC(slasrt, SLASRT) ("i", n, &d__[1], info);
3353 for (ii = 2; ii <= i__1; ++ii)
3359 for (j = ii; j <= i__2; ++j)
3385 F77_FUNC(sgetv0, SGETV0) (int * ido,
3387 int gmx_unused * itry,
3404 int v_dim1, v_offset, i__1;
3412 v_offset = 1 + v_dim1;
3428 F77_FUNC(slarnv, SLARNV) (&idist, &iwork[1], n, &resid[1]);
3435 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
3454 F77_FUNC(scopy, SCOPY) (n, &workd[*n + 1], &c__1, &resid[1], &c__1);
3460 else if (*bmat == 'I')
3462 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
3471 workd[*n * 3 + 4] = F77_FUNC(sdot, SDOT) (n, &resid[1], &c__1, &workd[1], &c__1);
3472 workd[*n * 3 + 4] = sqrt(fabs(workd[*n * 3 + 4]));
3474 else if (*bmat == 'I')
3476 workd[*n * 3 + 4] = F77_FUNC(snrm2, SNRM2) (n, &resid[1], &c__1);
3478 *rnorm = workd[*n * 3 + 4];
3488 F77_FUNC(sgemv, SGEMV) ("T", n, &i__1, &c_b22, &v[v_offset], ldv, &workd[1], &c__1, &c_b24,
3489 &workd[*n + 1], &c__1);
3491 F77_FUNC(sgemv, SGEMV) ("N", n, &i__1, &c_b27, &v[v_offset], ldv, &workd[*n + 1], &c__1, &
3492 c_b22, &resid[1], &c__1);
3496 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[*n + 1], &c__1);
3502 else if (*bmat == 'I')
3504 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
3511 *rnorm = F77_FUNC(sdot, SDOT) (n, &resid[1], &c__1, &workd[1], &c__1);
3512 *rnorm = sqrt(fabs(*rnorm));
3514 else if (*bmat == 'I')
3516 *rnorm = F77_FUNC(snrm2, SNRM2) (n, &resid[1], &c__1);
3519 if (*rnorm > workd[*n * 3 + 4] * .717f)
3528 workd[*n * 3 + 4] = *rnorm;
3535 for (jj = 1; jj <= i__1; ++jj)
3556 F77_FUNC(ssapps, SSAPPS) (int * n,
3573 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
3577 float r__, s, a1, a2, a3, a4;
3588 v_offset = 1 + v_dim1;
3591 h_offset = 1 + h_dim1;
3594 q_offset = 1 + q_dim1;
3597 epsmch = GMX_FLOAT_EPS;
3601 kplusp = *kev + *np;
3603 F77_FUNC(slaset, SLASET) ("All", &kplusp, &kplusp, &c_b4, &c_b5, &q[q_offset], ldq);
3611 for (jj = 1; jj <= i__1; ++jj)
3619 for (i__ = istart; i__ <= i__2; ++i__)
3621 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__ + 1 + (h_dim1*2)]);
3622 if (h__[i__ + 1 + h_dim1] <= epsmch * big)
3624 h__[i__ + 1 + h_dim1] = 0.;
3635 f = h__[istart + (h_dim1 << 1)] - shift[jj];
3636 g = h__[istart + 1 + h_dim1];
3637 F77_FUNC(slartg, SLARTG) (&f, &g, &c__, &s, &r__);
3639 a1 = c__ * h__[istart + (h_dim1 << 1)] + s * h__[istart + 1 +
3641 a2 = c__ * h__[istart + 1 + h_dim1] + s * h__[istart + 1 + (
3643 a4 = c__ * h__[istart + 1 + (h_dim1 << 1)] - s * h__[istart + 1 +
3645 a3 = c__ * h__[istart + 1 + h_dim1] - s * h__[istart + (h_dim1 <<
3647 h__[istart + (h_dim1 << 1)] = c__ * a1 + s * a2;
3648 h__[istart + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
3649 h__[istart + 1 + h_dim1] = c__ * a3 + s * a4;
3652 i__2 = (i__3 < kplusp) ? i__3 : kplusp;
3653 for (j = 1; j <= i__2; ++j)
3655 a1 = c__ * q[j + istart * q_dim1] + s * q[j + (istart + 1) *
3657 q[j + (istart + 1) * q_dim1] = -s * q[j + istart * q_dim1] +
3658 c__ * q[j + (istart + 1) * q_dim1];
3659 q[j + istart * q_dim1] = a1;
3664 for (i__ = istart + 1; i__ <= i__2; ++i__)
3667 f = h__[i__ + h_dim1];
3668 g = s * h__[i__ + 1 + h_dim1];
3670 h__[i__ + 1 + h_dim1] = c__ * h__[i__ + 1 + h_dim1];
3671 F77_FUNC(slartg, SLARTG) (&f, &g, &c__, &s, &r__);
3680 h__[i__ + h_dim1] = r__;
3682 a1 = c__ * h__[i__ + (h_dim1 << 1)] + s * h__[i__ + 1 +
3684 a2 = c__ * h__[i__ + 1 + h_dim1] + s * h__[i__ + 1 + (h_dim1
3686 a3 = c__ * h__[i__ + 1 + h_dim1] - s * h__[i__ + (h_dim1 << 1)
3688 a4 = c__ * h__[i__ + 1 + (h_dim1 << 1)] - s * h__[i__ + 1 +
3691 h__[i__ + (h_dim1 << 1)] = c__ * a1 + s * a2;
3692 h__[i__ + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
3693 h__[i__ + 1 + h_dim1] = c__ * a3 + s * a4;
3696 i__3 = (i__4 < kplusp) ? i__4 : kplusp;
3697 for (j = 1; j <= i__3; ++j)
3699 a1 = c__ * q[j + i__ * q_dim1] + s * q[j + (i__ + 1) *
3701 q[j + (i__ + 1) * q_dim1] = -s * q[j + i__ * q_dim1] +
3702 c__ * q[j + (i__ + 1) * q_dim1];
3703 q[j + i__ * q_dim1] = a1;
3712 if (h__[iend + h_dim1] < 0.)
3714 h__[iend + h_dim1] = -h__[iend + h_dim1];
3715 F77_FUNC(sscal, SSCAL) (&kplusp, &c_b14, &q[iend * q_dim1 + 1], &c__1);
3724 for (i__ = itop; i__ <= i__2; ++i__)
3726 if (h__[i__ + 1 + h_dim1] > 0.)
3738 for (i__ = itop; i__ <= i__1; ++i__)
3740 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__+ 1 + (h_dim1*2)]);
3741 if (h__[i__ + 1 + h_dim1] <= epsmch * big)
3743 h__[i__ + 1 + h_dim1] = 0.;
3748 if (h__[*kev + 1 + h_dim1] > 0.)
3750 F77_FUNC(sgemv, SGEMV) ("N", n, &kplusp, &c_b5, &v[v_offset], ldv, &q[(*kev + 1) *
3751 q_dim1 + 1], &c__1, &c_b4, &workd[*n + 1], &c__1);
3755 for (i__ = 1; i__ <= i__1; ++i__)
3757 i__2 = kplusp - i__ + 1;
3758 F77_FUNC(sgemv, SGEMV) ("N", n, &i__2, &c_b5, &v[v_offset], ldv, &q[(*kev - i__ + 1) *
3759 q_dim1 + 1], &c__1, &c_b4, &workd[1], &c__1);
3760 F77_FUNC(scopy, SCOPY) (n, &workd[1], &c__1, &v[(kplusp - i__ + 1) * v_dim1 + 1], &
3765 F77_FUNC(slacpy, SLACPY) ("All", n, kev, &v[(*np + 1) * v_dim1 + 1], ldv, &v[v_offset], ldv);
3767 if (h__[*kev + 1 + h_dim1] > 0.)
3769 F77_FUNC(scopy, SCOPY) (n, &workd[*n + 1], &c__1, &v[(*kev + 1) * v_dim1 + 1], &c__1);
3772 F77_FUNC(sscal, SSCAL) (n, &q[kplusp + *kev * q_dim1], &resid[1], &c__1);
3773 if (h__[*kev + 1 + h_dim1] > 0.)
3775 F77_FUNC(saxpy, SAXPY) (n, &h__[*kev + 1 + h_dim1], &v[(*kev + 1) * v_dim1 + 1], &c__1,
3789 F77_FUNC(ssortr, SSORTR) (const char * which,
3804 if (!strncmp(which, "SA", 2))
3813 for (i__ = igap; i__ <= i__1; ++i__)
3823 if (x1[j] < x1[j + igap])
3826 x1[j] = x1[j + igap];
3827 x1[j + igap] = temp;
3831 x2[j] = x2[j + igap];
3832 x2[j + igap] = temp;
3848 else if (!strncmp(which, "SM", 2))
3857 for (i__ = igap; i__ <= i__1; ++i__)
3867 if (fabs(x1[j]) < fabs(x1[j + igap]))
3870 x1[j] = x1[j + igap];
3871 x1[j + igap] = temp;
3875 x2[j] = x2[j + igap];
3876 x2[j + igap] = temp;
3892 else if (!strncmp(which, "LA", 2))
3901 for (i__ = igap; i__ <= i__1; ++i__)
3911 if (x1[j] > x1[j + igap])
3914 x1[j] = x1[j + igap];
3915 x1[j + igap] = temp;
3919 x2[j] = x2[j + igap];
3920 x2[j + igap] = temp;
3936 else if (!strncmp(which, "LM", 2))
3946 for (i__ = igap; i__ <= i__1; ++i__)
3956 if (fabs(x1[j]) > fabs(x1[j + igap]))
3959 x1[j] = x1[j + igap];
3960 x1[j + igap] = temp;
3964 x2[j] = x2[j + igap];
3965 x2[j + igap] = temp;
3990 F77_FUNC(ssesrt, SSESRT) (const char * which,
3998 int a_dim1, a_offset, i__1;
4005 a_offset = 1 + a_dim1 * 0;
4010 if (!strncmp(which, "SA", 2))
4019 for (i__ = igap; i__ <= i__1; ++i__)
4029 if (x[j] < x[j + igap])
4036 F77_FUNC(sswap, SSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
4037 a_dim1 + 1], &c__1);
4053 else if (!strncmp(which, "SM", 2))
4062 for (i__ = igap; i__ <= i__1; ++i__)
4072 if (fabs(x[j]) < fabs(x[j + igap]))
4079 F77_FUNC(sswap, SSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
4080 a_dim1 + 1], &c__1);
4096 else if (!strncmp(which, "LA", 2))
4105 for (i__ = igap; i__ <= i__1; ++i__)
4115 if (x[j] > x[j + igap])
4122 F77_FUNC(sswap, SSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
4123 a_dim1 + 1], &c__1);
4139 else if (!strncmp(which, "LM", 2))
4148 for (i__ = igap; i__ <= i__1; ++i__)
4158 if (fabs(x[j]) > fabs(x[j + igap]))
4165 F77_FUNC(sswap, SSWAP) (na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
4166 a_dim1 + 1], &c__1);
4191 F77_FUNC(ssgets, SSGETS) (int * ishift,
4207 if (!strncmp(which, "BE", 2))
4210 F77_FUNC(ssortr, SSORTR) ("LA", &c__1, &i__1, &ritz[1], &bounds[1]);
4214 i__1 = (kevd2 < *np) ? kevd2 : *np;
4215 i__2 = (kevd2 > *np) ? kevd2 : *np;
4216 F77_FUNC(sswap, SSWAP) (&i__1, &ritz[1], &c__1,
4217 &ritz[i__2 + 1], &c__1);
4218 i__1 = (kevd2 < *np) ? kevd2 : *np;
4219 i__2 = (kevd2 > *np) ? kevd2 : *np;
4220 F77_FUNC(sswap, SSWAP) (&i__1, &bounds[1], &c__1,
4221 &bounds[i__2 + 1], &c__1);
4228 F77_FUNC(ssortr, SSORTR) (which, &c__1, &i__1, &ritz[1], &bounds[1]);
4231 if (*ishift == 1 && *np > 0)
4234 F77_FUNC(ssortr, SSORTR) ("SM", &c__1, np, &bounds[1], &ritz[1]);
4235 F77_FUNC(scopy, SCOPY) (np, &ritz[1], &c__1, &shifts[1], &c__1);
4245 F77_FUNC(ssconv, SSCONV) (int * n,
4261 eps23 = GMX_FLOAT_EPS;
4262 eps23 = pow(eps23, c_b3);
4266 for (i__ = 1; i__ <= i__1; ++i__)
4270 d__3 = fabs(ritz[i__]);
4271 temp = (d__2 > d__3) ? d__2 : d__3;
4272 if (bounds[i__] <= *tol * temp)
4283 F77_FUNC(sseigt, SSEIGT) (float * rnorm,
4293 int h_dim1, h_offset, i__1;
4302 h_offset = 1 + h_dim1;
4305 F77_FUNC(scopy, SCOPY) (n, &h__[(h_dim1 << 1) + 1], &c__1, &eig[1], &c__1);
4307 F77_FUNC(scopy, SCOPY) (&i__1, &h__[h_dim1 + 2], &c__1, &workl[1], &c__1);
4308 F77_FUNC(sstqrb, SSTQRB) (n, &eig[1], &workl[1], &bounds[1], &workl[*n + 1], ierr);
4315 for (k = 1; k <= i__1; ++k)
4317 bounds[k] = *rnorm * fabs(bounds[k]);
4330 F77_FUNC(ssaitr, SSAITR) (int * ido,
4354 int h_dim1, h_offset, v_dim1, v_offset, i__1;
4358 float safmin, minval;
4364 v_offset = 1 + v_dim1;
4367 h_offset = 1 + h_dim1;
4371 minval = GMX_FLOAT_MIN;
4372 safmin = minval / GMX_FLOAT_EPS;
4386 iwork[9] = iwork[8] + *n;
4387 iwork[10] = iwork[9] + *n;
4425 F77_FUNC(sgetv0, sgetv0) (ido, bmat, &iwork[11], &c__0, n, &iwork[12], &v[v_offset], ldv,
4426 &resid[1], rnorm, &ipntr[1], &workd[1], &iwork[21], &iwork[7]);
4439 *info = iwork[12] - 1;
4446 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &v[iwork[12] * v_dim1 + 1], &c__1);
4447 if (*rnorm >= safmin)
4449 temp1 = 1. / *rnorm;
4450 F77_FUNC(sscal, SSCAL) (n, &temp1, &v[iwork[12] * v_dim1 + 1], &c__1);
4451 F77_FUNC(sscal, SSCAL) (n, &temp1, &workd[iwork[8]], &c__1);
4456 F77_FUNC(slascl, SLASCL) ("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &v[iwork[12] *
4457 v_dim1 + 1], n, &infol);
4458 F77_FUNC(slascl, SLASCL) ("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &workd[iwork[
4463 F77_FUNC(scopy, SCOPY) (n, &v[iwork[12] * v_dim1 + 1], &c__1, &workd[iwork[10]], &c__1);
4464 ipntr[1] = iwork[10];
4465 ipntr[2] = iwork[9];
4466 ipntr[3] = iwork[8];
4475 F77_FUNC(scopy, SCOPY) (n, &workd[iwork[9]], &c__1, &resid[1], &c__1);
4484 ipntr[1] = iwork[9];
4485 ipntr[2] = iwork[8];
4490 else if (*bmat == 'I')
4492 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
4502 workd[*n * 3 + 3] = F77_FUNC(sdot, SDOT) (n, &resid[1], &c__1, &workd[iwork[10]], &
4504 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
4506 else if (*bmat == 'G')
4508 workd[*n * 3 + 3] = F77_FUNC(sdot, SDOT) (n, &resid[1], &c__1, &workd[iwork[8]], &
4510 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
4512 else if (*bmat == 'I')
4514 workd[*n * 3 + 3] = F77_FUNC(snrm2, SNRM2) (n, &resid[1], &c__1);
4519 F77_FUNC(sgemv, SGEMV) ("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]],
4520 &c__1, &c_b42, &workd[iwork[9]], &c__1);
4522 else if (*mode == 2)
4524 F77_FUNC(sgemv, SGEMV) ("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[10]
4525 ], &c__1, &c_b42, &workd[iwork[9]], &c__1);
4528 F77_FUNC(sgemv, SGEMV) ("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
4529 c__1, &c_b18, &resid[1], &c__1);
4531 h__[iwork[12] + (h_dim1 << 1)] = workd[iwork[9] + iwork[12] - 1];
4532 if (iwork[12] == 1 || iwork[4] == 1)
4534 h__[iwork[12] + h_dim1] = 0.;
4538 h__[iwork[12] + h_dim1] = *rnorm;
4546 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
4547 ipntr[1] = iwork[9];
4548 ipntr[2] = iwork[8];
4553 else if (*bmat == 'I')
4555 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
4563 *rnorm = F77_FUNC(sdot, SDOT) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
4564 *rnorm = sqrt(fabs(*rnorm));
4566 else if (*bmat == 'I')
4568 *rnorm = F77_FUNC(snrm2, SNRM2) (n, &resid[1], &c__1);
4571 if (*rnorm > workd[*n * 3 + 3] * .717f)
4578 F77_FUNC(sgemv, SGEMV) ("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]], &
4579 c__1, &c_b42, &workd[iwork[9]], &c__1);
4581 F77_FUNC(sgemv, SGEMV) ("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
4582 c__1, &c_b18, &resid[1], &c__1);
4584 if (iwork[12] == 1 || iwork[4] == 1)
4586 h__[iwork[12] + h_dim1] = 0.;
4588 h__[iwork[12] + (h_dim1 << 1)] += workd[iwork[9] + iwork[12] - 1];
4593 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
4594 ipntr[1] = iwork[9];
4595 ipntr[2] = iwork[8];
4600 else if (*bmat == 'I')
4602 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
4609 workd[*n * 3 + 2] = F77_FUNC(sdot, SDOT) (n, &resid[1], &c__1, &workd[iwork[8]], &
4611 workd[*n * 3 + 2] = sqrt(fabs(workd[*n * 3 + 2]));
4613 else if (*bmat == 'I')
4615 workd[*n * 3 + 2] = F77_FUNC(snrm2, SNRM2) (n, &resid[1], &c__1);
4619 if (workd[*n * 3 + 2] > *rnorm * .717f)
4622 *rnorm = workd[*n * 3 + 2];
4628 *rnorm = workd[*n * 3 + 2];
4636 for (jj = 1; jj <= i__1; ++jj)
4648 if (h__[iwork[12] + h_dim1] < 0.)
4650 h__[iwork[12] + h_dim1] = -h__[iwork[12] + h_dim1];
4651 if (iwork[12] < *k + *np)
4653 F77_FUNC(sscal, SSCAL) (n, &c_b50, &v[(iwork[12] + 1) * v_dim1 + 1], &c__1);
4657 F77_FUNC(sscal, SSCAL) (n, &c_b50, &resid[1], &c__1);
4662 if (iwork[12] > *k + *np)
4682 F77_FUNC(ssaup2, SSAUP2) (int * ido,
4691 int gmx_unused * iupd,
4712 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
4731 v_offset = 1 + v_dim1;
4734 h_offset = 1 + h_dim1;
4737 q_offset = 1 + q_dim1;
4741 eps23 = GMX_FLOAT_EPS;
4742 eps23 = pow(eps23, c_b3);
4755 iwork[7] = iwork[9] + iwork[10];
4778 F77_FUNC(sgetv0, SGETV0) (ido, bmat, &c__1, &iwork[3], n, &c__1, &v[v_offset], ldv, &
4779 resid[1], &workd[*n * 3 + 1], &ipntr[1], &workd[1], &iwork[41],
4787 if (workd[*n * 3 + 1] == 0.)
4812 F77_FUNC(ssaitr, SSAITR) (ido, bmat, n, &c__0, &iwork[9], mode, &resid[1], &workd[*n * 3 +
4813 1], &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
4839 F77_FUNC(ssaitr, SSAITR) (ido, bmat, n, nev, np, mode, &resid[1], &workd[*n * 3 + 1], &v[
4840 v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1], &iwork[
4858 F77_FUNC(sseigt, SSEIGT) (&workd[*n * 3 + 1], &iwork[7], &h__[h_offset], ldh, &ritz[1], &
4859 bounds[1], &workl[1], &ierr);
4867 F77_FUNC(scopy, SCOPY) (&iwork[7], &ritz[1], &c__1, &workl[iwork[7] + 1], &c__1);
4868 F77_FUNC(scopy, SCOPY) (&iwork[7], &bounds[1], &c__1, &workl[(iwork[7] << 1) + 1], &c__1);
4872 F77_FUNC(ssgets, SSGETS) (ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
4874 F77_FUNC(scopy, SCOPY) (nev, &bounds[*np + 1], &c__1, &workl[*np + 1], &c__1);
4875 F77_FUNC(ssconv, SSCONV) (nev, &ritz[*np + 1], &workl[*np + 1], tol, &iwork[8]);
4880 for (j = 1; j <= i__1; ++j)
4882 if (bounds[j] == 0.)
4889 if (iwork[8] >= iwork[9] || iwork[6] > *mxiter || *np == 0)
4892 if (!strncmp(which, "BE", 2))
4895 strncpy(wprime, "SA", 2);
4896 F77_FUNC(ssortr, SSORTR) (wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
4898 nevm2 = *nev - nevd2;
4901 i__1 = (nevd2 < *np) ? nevd2 : *np;
4902 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np + 1;
4903 F77_FUNC(sswap, SSWAP) (&i__1, &ritz[nevm2 + 1], &c__1,
4904 &ritz[((i__2 > i__3) ? i__2 : i__3)],
4906 i__1 = (nevd2 < *np) ? nevd2 : *np;
4907 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np;
4908 F77_FUNC(sswap, SSWAP) (&i__1, &bounds[nevm2 + 1], &c__1,
4909 &bounds[((i__2 > i__3) ? i__2 : i__3) + 1],
4917 if (!strncmp(which, "LM", 2))
4919 strncpy(wprime, "SM", 2);
4921 if (!strncmp(which, "SM", 2))
4923 strncpy(wprime, "LM", 2);
4925 if (!strncmp(which, "LA", 2))
4927 strncpy(wprime, "SA", 2);
4929 if (!strncmp(which, "SA", 2))
4931 strncpy(wprime, "LA", 2);
4934 F77_FUNC(ssortr, SSORTR) (wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
4939 for (j = 1; j <= i__1; ++j)
4942 d__3 = fabs(ritz[j]);
4943 temp = (d__2 > d__3) ? d__2 : d__3;
4947 strncpy(wprime, "LA", 2);
4948 F77_FUNC(ssortr, SSORTR) (wprime, &c__1, &iwork[9], &bounds[1], &ritz[1]);
4951 for (j = 1; j <= i__1; ++j)
4954 d__3 = fabs(ritz[j]);
4955 temp = (d__2 > d__3) ? d__2 : d__3;
4959 if (!strncmp(which, "BE", 2))
4962 strncpy(wprime, "LA", 2);
4963 F77_FUNC(ssortr, SSORTR) (wprime, &c__1, &iwork[8], &ritz[1], &bounds[1]);
4968 F77_FUNC(ssortr, SSORTR) (which, &c__1, &iwork[8], &ritz[1], &bounds[1]);
4972 h__[h_dim1 + 1] = workd[*n * 3 + 1];
4975 if (iwork[6] > *mxiter && iwork[8] < *nev)
4979 if (*np == 0 && iwork[8] < iwork[9])
4988 else if (iwork[8] < *nev && *ishift == 1)
4991 i__1 = iwork[8], i__2 = *np / 2;
4992 *nev += (i__1 < i__2) ? i__1 : i__2;
4993 if (*nev == 1 && iwork[7] >= 6)
4995 *nev = iwork[7] / 2;
4997 else if (*nev == 1 && iwork[7] > 2)
5001 *np = iwork[7] - *nev;
5006 F77_FUNC(ssgets, SSGETS) (ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
5026 F77_FUNC(scopy, SCOPY) (np, &workl[1], &c__1, &ritz[1], &c__1);
5029 F77_FUNC(ssapps, SSAPPS) (n, nev, np, &ritz[1], &v[v_offset], ldv, &h__[h_offset], ldh, &
5030 resid[1], &q[q_offset], ldq, &workd[1]);
5035 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[*n + 1], &c__1);
5042 else if (*bmat == 'I')
5044 F77_FUNC(scopy, SCOPY) (n, &resid[1], &c__1, &workd[1], &c__1);
5051 workd[*n * 3 + 1] = F77_FUNC(sdot, SDOT) (n, &resid[1], &c__1, &workd[1], &c__1);
5052 workd[*n * 3 + 1] = sqrt(fabs(workd[*n * 3 + 1]));
5054 else if (*bmat == 'I')
5056 workd[*n * 3 + 1] = F77_FUNC(snrm2, SNRM2) (n, &resid[1], &c__1);
5078 F77_FUNC(ssaupd, SSAUPD) (int * ido,
5096 int v_dim1, v_offset, i__1, i__2;
5102 v_offset = 1 + v_dim1;
5114 iwork[5] = iparam[1];
5115 iwork[10] = iparam[3];
5116 iwork[12] = iparam[4];
5119 iwork[11] = iparam[7];
5130 else if (*ncv <= *nev || *ncv > *n)
5136 iwork[15] = *ncv - *nev;
5142 if (strncmp(which, "LM", 2) && strncmp(which, "SM", 2) &&
5143 strncmp(which, "LA", 2) && strncmp(which, "SA", 2) &&
5144 strncmp(which, "BE", 2))
5148 if (*bmat != 'I' && *bmat != 'G')
5154 if (*lworkl < i__1 * i__1 + (*ncv << 3))
5158 if (iwork[11] < 1 || iwork[11] > 5)
5162 else if (iwork[11] == 1 && *bmat == 'G')
5166 else if (iwork[5] < 0 || iwork[5] > 1)
5170 else if (*nev == 1 && !strncmp(which, "BE", 2))
5188 *tol = GMX_FLOAT_EPS;
5191 iwork[15] = *ncv - *nev;
5194 i__1 = i__2 * i__2 + (*ncv << 3);
5195 for (j = 1; j <= i__1; ++j)
5203 iwork[16] = iwork[3] + (iwork[8] << 1);
5204 iwork[1] = iwork[16] + *ncv;
5205 iwork[4] = iwork[1] + *ncv;
5207 iwork[7] = iwork[4] + i__1 * i__1;
5208 iwork[14] = iwork[7] + *ncv * 3;
5210 ipntr[4] = iwork[14];
5211 ipntr[5] = iwork[3];
5212 ipntr[6] = iwork[16];
5213 ipntr[7] = iwork[1];
5214 ipntr[11] = iwork[7];
5217 F77_FUNC(ssaup2, SSAUP2) (ido, bmat, n, which, &iwork[13], &iwork[15], tol, &resid[1], &
5218 iwork[11], &iwork[6], &iwork[5], &iwork[10], &v[v_offset], ldv, &
5219 workl[iwork[3]], &iwork[8], &workl[iwork[16]], &workl[iwork[1]], &
5220 workl[iwork[4]], &iwork[9], &workl[iwork[7]], &ipntr[1], &workd[1],
5225 iparam[8] = iwork[15];
5232 iparam[3] = iwork[10];
5233 iparam[5] = iwork[15];
5253 F77_FUNC(sseupd, SSEUPD) (int * rvec,
5254 const char * howmny,
5279 int v_dim1, v_offset, z_dim1, z_offset, i__1;
5280 float d__1, d__2, d__3;
5282 int j, k, ih, iq, iw, ibd, ihb, ihd, ldh, ilg, ldq, ism, irz;
5294 float thres1 = 0, thres2 = 0;
5298 int leftptr, rghtptr;
5304 z_offset = 1 + z_dim1;
5309 v_offset = 1 + v_dim1;
5337 if (*ncv <= *nev || *ncv > *n)
5341 if (strncmp(which, "LM", 2) && strncmp(which, "SM", 2) &&
5342 strncmp(which, "LA", 2) && strncmp(which, "SA", 2) &&
5343 strncmp(which, "BE", 2))
5347 if (*bmat != 'I' && *bmat != 'G')
5351 if (*howmny != 'A' && *howmny != 'P' &&
5352 *howmny != 'S' && *rvec)
5356 if (*rvec && *howmny == 'S')
5361 if (*rvec && *lworkl < i__1 * i__1 + (*ncv << 3))
5366 if (mode == 1 || mode == 2)
5368 strncpy(type__, "REGULR", 6);
5372 strncpy(type__, "SHIFTI", 6);
5376 strncpy(type__, "BUCKLE", 6);
5380 strncpy(type__, "CAYLEY", 6);
5386 if (mode == 1 && *bmat == 'G')
5390 if (*nev == 1 && !strncmp(which, "BE", 2))
5409 iw = iq + ldh * *ncv;
5410 next = iw + (*ncv << 1);
5416 irz = ipntr[11] + *ncv;
5420 eps23 = GMX_FLOAT_EPS;
5421 eps23 = pow(eps23, c_b21);
5428 else if (*bmat == 'G')
5430 bnorm2 = F77_FUNC(snrm2, SNRM2) (n, &workd[1], &c__1);
5436 if (!strncmp(which, "LM", 2) || !strncmp(which, "SM", 2) ||
5437 !strncmp(which, "LA", 2) || !strncmp(which, "SA", 2))
5441 else if (!strncmp(which, "BE", 2))
5445 ism = (*nev > nconv) ? *nev : nconv;
5448 thres1 = workl[ism];
5449 thres2 = workl[ilg];
5457 for (j = 0; j <= i__1; ++j)
5460 if (!strncmp(which, "LM", 2))
5462 if (fabs(workl[irz + j]) >= fabs(thres1))
5465 d__3 = fabs(workl[irz + j]);
5466 tempbnd = (d__2 > d__3) ? d__2 : d__3;
5467 if (workl[ibd + j] <= *tol * tempbnd)
5473 else if (!strncmp(which, "SM", 2))
5475 if (fabs(workl[irz + j]) <= fabs(thres1))
5478 d__3 = fabs(workl[irz + j]);
5479 tempbnd = (d__2 > d__3) ? d__2 : d__3;
5480 if (workl[ibd + j] <= *tol * tempbnd)
5486 else if (!strncmp(which, "LA", 2))
5488 if (workl[irz + j] >= thres1)
5491 d__3 = fabs(workl[irz + j]);
5492 tempbnd = (d__2 > d__3) ? d__2 : d__3;
5493 if (workl[ibd + j] <= *tol * tempbnd)
5499 else if (!strncmp(which, "SA", 2))
5501 if (workl[irz + j] <= thres1)
5504 d__3 = fabs(workl[irz + j]);
5505 tempbnd = (d__2 > d__3) ? d__2 : d__3;
5506 if (workl[ibd + j] <= *tol * tempbnd)
5512 else if (!strncmp(which, "BE", 2))
5514 if (workl[irz + j] <= thres1 || workl[irz + j] >= thres2)
5517 d__3 = fabs(workl[irz + j]);
5518 tempbnd = (d__2 > d__3) ? d__2 : d__3;
5519 if (workl[ibd + j] <= *tol * tempbnd)
5527 reord = select[j + 1] || reord;
5536 F77_FUNC(scopy, SCOPY) (&i__1, &workl[ih + 1], &c__1, &workl[ihb], &c__1);
5537 F77_FUNC(scopy, SCOPY) (ncv, &workl[ih + ldh], &c__1, &workl[ihd], &c__1);
5539 F77_FUNC(ssteqr, SSTEQR) ("Identity", ncv, &workl[ihd], &workl[ihb], &workl[iq], &ldq, &
5561 if (select[leftptr])
5567 else if (!select[rghtptr])
5576 temp = workl[ihd + leftptr - 1];
5577 workl[ihd + leftptr - 1] = workl[ihd + rghtptr - 1];
5578 workl[ihd + rghtptr - 1] = temp;
5579 F77_FUNC(scopy, SCOPY) (ncv, &workl[iq + *ncv * (leftptr - 1)], &c__1, &workl[
5581 F77_FUNC(scopy, SCOPY) (ncv, &workl[iq + *ncv * (rghtptr - 1)], &c__1, &workl[
5582 iq + *ncv * (leftptr - 1)], &c__1);
5583 F77_FUNC(scopy, SCOPY) (ncv, &workl[iw], &c__1, &workl[iq + *ncv * (rghtptr -
5590 if (leftptr < rghtptr)
5599 F77_FUNC(scopy, SCOPY) (&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
5605 F77_FUNC(scopy, SCOPY) (&nconv, &workl[ritz], &c__1, &d__[1], &c__1);
5606 F77_FUNC(scopy, SCOPY) (ncv, &workl[ritz], &c__1, &workl[ihd], &c__1);
5609 if (!strncmp(type__, "REGULR", 6))
5614 F77_FUNC(ssesrt, SSESRT) ("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
5618 F77_FUNC(scopy, SCOPY) (ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
5625 F77_FUNC(scopy, SCOPY) (ncv, &workl[ihd], &c__1, &workl[iw], &c__1);
5626 if (!strncmp(type__, "SHIFTI", 6))
5629 for (k = 1; k <= i__1; ++k)
5631 workl[ihd + k - 1] = 1. / workl[ihd + k - 1] + *sigma;
5634 else if (!strncmp(type__, "BUCKLE", 6))
5637 for (k = 1; k <= i__1; ++k)
5639 workl[ihd + k - 1] = *sigma * workl[ihd + k - 1] / (workl[ihd
5643 else if (!strncmp(type__, "CAYLEY", 6))
5646 for (k = 1; k <= i__1; ++k)
5648 workl[ihd + k - 1] = *sigma * (workl[ihd + k - 1] + 1.) / (
5649 workl[ihd + k - 1] - 1.);
5653 F77_FUNC(scopy, SCOPY) (&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
5654 F77_FUNC(ssortr, SSORTR) ("LA", &c__1, &nconv, &workl[ihd], &workl[iw]);
5657 F77_FUNC(ssesrt, SSESRT) ("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
5661 F77_FUNC(scopy, SCOPY) (ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
5662 d__1 = bnorm2 / rnorm;
5663 F77_FUNC(sscal, SSCAL) (ncv, &d__1, &workl[ihb], &c__1);
5664 F77_FUNC(ssortr, SSORTR) ("LA", &c__1, &nconv, &d__[1], &workl[ihb]);
5669 if (*rvec && *howmny == 'A')
5672 F77_FUNC(sgeqr2, SGEQR2) (ncv, &nconv, &workl[iq], &ldq, &workl[iw + *ncv], &workl[ihb],
5675 F77_FUNC(sorm2r, SORM2R) ("Right", "Notranspose", n, ncv, &nconv, &workl[iq], &ldq, &
5676 workl[iw + *ncv], &v[v_offset], ldv, &workd[*n + 1], &ierr);
5677 F77_FUNC(slacpy, SLACPY) ("All", n, &nconv, &v[v_offset], ldv, &z__[z_offset], ldz);
5680 for (j = 1; j <= i__1; ++j)
5682 workl[ihb + j - 1] = 0.;
5684 workl[ihb + *ncv - 1] = 1.;
5685 F77_FUNC(sorm2r, SORM2R) ("Left", "Transpose", ncv, &c__1, &nconv, &workl[iq], &ldq, &
5686 workl[iw + *ncv], &workl[ihb], ncv, &temp, &ierr);
5689 else if (*rvec && *howmny == 'S')
5694 if (!strncmp(type__, "REGULR", 6) && *rvec)
5698 for (j = 1; j <= i__1; ++j)
5700 workl[ihb + j - 1] = rnorm * fabs(workl[ihb + j - 1]);
5704 else if (strncmp(type__, "REGULR", 6) && *rvec)
5707 F77_FUNC(sscal, SSCAL) (ncv, &bnorm2, &workl[ihb], &c__1);
5708 if (!strncmp(type__, "SHIFTI", 6))
5712 for (k = 1; k <= i__1; ++k)
5714 d__2 = workl[iw + k - 1];
5715 workl[ihb + k - 1] = fabs(workl[ihb + k - 1])/(d__2 * d__2);
5719 else if (!strncmp(type__, "BUCKLE", 6))
5723 for (k = 1; k <= i__1; ++k)
5725 d__2 = workl[iw + k - 1] - 1.;
5726 workl[ihb + k - 1] = *sigma * fabs(workl[ihb + k - 1])/(d__2 * d__2);
5730 else if (!strncmp(type__, "CAYLEY", 6))
5734 for (k = 1; k <= i__1; ++k)
5736 workl[ihb + k - 1] = fabs(workl[ihb + k - 1] / workl[iw + k - 1] * (workl[iw + k - 1] - 1.));
5744 if (*rvec && (!strncmp(type__, "SHIFTI", 6) || !strncmp(type__, "CAYLEY", 6)))
5748 for (k = 0; k <= i__1; ++k)
5750 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / workl[iw + k];
5754 else if (*rvec && !strncmp(type__, "BUCKLE", 6))
5758 for (k = 0; k <= i__1; ++k)
5760 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / (workl[iw + k] -
5766 if (strncmp(type__, "REGULR", 6))
5768 F77_FUNC(sger, SGER) (n, &nconv, &c_b102, &resid[1], &c__1, &workl[iw], &c__1, &z__[