2 * This file is part of the GROMACS molecular simulation package.
4 * This file is part of Gromacs Copyright (c) 1991-2004
5 * David van der Spoel, Erik Lindahl, University of Groningen.
6 * Copyright (c) 2012,2013, by the GROMACS development team, led by
7 * David van der Spoel, Berk Hess, Erik Lindahl, and including many
8 * others, as listed in the AUTHORS file in the top-level source
9 * directory and at http://www.gromacs.org.
11 * GROMACS is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public License
13 * as published by the Free Software Foundation; either version 2.1
14 * of the License, or (at your option) any later version.
16 * GROMACS is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with GROMACS; if not, see
23 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
24 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 * If you want to redistribute modifications to GROMACS, please
27 * consider that scientific software is very special. Version
28 * control is crucial - bugs must be traceable. We will be happy to
29 * consider code for inclusion in the official distribution, but
30 * derived work must not be called official GROMACS. Details are found
31 * in the README & COPYING files - if they are missing, get the
32 * official version at http://www.gromacs.org.
34 * To help us fund GROMACS development, we humbly ask that you cite
35 * the research papers on the package. Check out http://www.gromacs.org.
37 /* This file contains a subset of ARPACK functions to perform
38 * diagonalization and SVD for sparse matrices in Gromacs.
40 * The code has been translated to C to avoid being dependent on
41 * a Fotran compiler, and it has been made threadsafe by using
42 * additional workspace arrays to store data during reverse communication.
44 * You might prefer the original ARPACK library for general use, but
45 * in case you want to this version can be redistributed freely, just
46 * as the original library. However, please make clear that it is the
47 * hacked version from Gromacs so any bugs are blamed on us and not
48 * the original authors. You should also be aware that the double
49 * precision work array workd needs to be of size (3*N+4) here
50 * (4 more than the general library), and there is an extra argument
51 * iwork, which should be an integer work array of length 80.
53 * ARPACK was written by
55 * Danny Sorensen Phuong Vu
56 * Rihard Lehoucq CRPC / Rice University
57 * Dept. of Computational & Houston, Texas
69 #include "types/simple.h"
70 #include "gmx_lapack.h"
72 #include "gmx_arpack.h"
76 F77_FUNC(dstqrb,DSTQRB)(int * n,
92 int l1, ii, mm, lm1, mm1, nm1;
96 int lend, jtot, lendm1, lendp1, iscale;
98 int lendsv, nmaxit, icompz;
99 double ssfmax, ssfmin,safmin,minval,safmax,anorm;
122 eps = GMX_DOUBLE_EPS;
126 minval = GMX_DOUBLE_MIN;
127 safmin = minval / GMX_DOUBLE_EPS;
128 safmax = 1. / safmin;
129 ssfmax = sqrt(safmax) / 3.;
130 ssfmin = sqrt(safmin) / eps2;
134 for (j = 1; j <= i__1; ++j) {
156 for (m = l1; m <= i__1; ++m) {
161 if (tst <= sqrt(fabs(d__[m])) * sqrt(fabs(d__[m+1])) * eps) {
180 anorm =F77_FUNC(dlanst,DLANST)("i", &i__1, &d__[l], &e[l]);
185 if (anorm > ssfmax) {
188 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n,
191 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n,
193 } else if (anorm < ssfmin) {
196 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n,
199 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n,
203 if (fabs(d__[lend]) < fabs(d__[l])) {
214 for (m = l; m <= i__1; ++m) {
217 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m + 1]) + safmin) {
236 F77_FUNC(dlaev2,DLAEV2)(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s);
238 work[*n - 1 + l] = s;
241 z__[l + 1] = c__ * tst - s * z__[l];
242 z__[l] = s * tst + c__ * z__[l];
244 F77_FUNC(dlae2,DLAE2)(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2);
256 if (jtot == nmaxit) {
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__) {
274 F77_FUNC(dlartg,DLARTG)(&g, &f, &c__, &s, &r__);
278 g = d__[i__ + 1] - p;
279 r__ = (d__[i__] - g) * s + c__ * 2. * b;
281 d__[i__ + 1] = g + p;
286 work[*n - 1 + i__] = -s;
294 F77_FUNC(dlasr,DLASR)("r", "v", "b", &c__1, &mm, &work[l], &work[*n - 1 + l], &
317 for (m = l; m >= i__1; --m) {
318 d__2 = fabs(e[m - 1]);
320 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m- 1]) + safmin) {
339 F77_FUNC(dlaev2,DLAEV2)(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s)
343 z__[l] = c__ * tst - s * z__[l - 1];
344 z__[l - 1] = s * tst + c__ * z__[l - 1];
346 F77_FUNC(dlae2,DLAE2)(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2);
358 if (jtot == nmaxit) {
364 g = (d__[l - 1] - p) / (e[l - 1] * 2.);
365 r__ =F77_FUNC(dlapy2,DLAPY2)(&g, &c_b31);
366 g = d__[m] - p + e[l - 1] / (g + ((g>0) ? r__ : -r__ ));
374 for (i__ = m; i__ <= i__1; ++i__) {
377 F77_FUNC(dlartg,DLARTG)(&g, &f, &c__, &s, &r__);
382 r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b;
389 work[*n - 1 + i__] = s;
397 F77_FUNC(dlasr,DLASR)("r", "v", "f", &c__1, &mm, &work[m], &work[*n - 1 + m], &
418 i__1 = lendsv - lsv + 1;
419 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv],
422 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n,
424 } else if (iscale == 2) {
425 i__1 = lendsv - lsv + 1;
426 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv],
429 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n,
437 for (i__ = 1; i__ <= i__1; ++i__) {
447 F77_FUNC(dlasrt,DLASRT)("i", n, &d__[1], info);
452 for (ii = 2; ii <= i__1; ++ii) {
457 for (j = ii; j <= i__2; ++j) {
480 F77_FUNC(dgetv0,DGETV0)(int * ido,
499 int v_dim1, v_offset, i__1;
507 v_offset = 1 + v_dim1;
521 F77_FUNC(dlarnv,DLARNV)(&idist, &iwork[1], n, &resid[1]);
527 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
543 F77_FUNC(dcopy,DCOPY)(n, &workd[*n + 1], &c__1, &resid[1], &c__1);
548 } else if (*bmat == 'I') {
549 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
557 workd[*n * 3 + 4] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
558 workd[*n * 3 + 4] = sqrt(fabs(workd[*n * 3 + 4]));
559 } else if (*bmat == 'I') {
560 workd[*n * 3 + 4] =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
562 *rnorm = workd[*n * 3 + 4];
571 F77_FUNC(dgemv,DGEMV)("T", n, &i__1, &c_b22, &v[v_offset], ldv, &workd[1], &c__1, &c_b24,
572 &workd[*n + 1], &c__1);
574 F77_FUNC(dgemv,DGEMV)("N", n, &i__1, &c_b27, &v[v_offset], ldv, &workd[*n + 1], &c__1, &
575 c_b22, &resid[1], &c__1);
578 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[*n + 1], &c__1);
583 } else if (*bmat == 'I') {
584 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
590 *rnorm =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
591 *rnorm = sqrt(fabs(*rnorm));
592 } else if (*bmat == 'I') {
593 *rnorm =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
596 if (*rnorm > workd[*n * 3 + 4] * .717f) {
603 workd[*n * 3 + 4] = *rnorm;
608 for (jj = 1; jj <= i__1; ++jj) {
628 F77_FUNC(dsapps,DSAPPS)(int * n,
645 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
649 double r__, s, a1, a2, a3, a4;
660 v_offset = 1 + v_dim1;
663 h_offset = 1 + h_dim1;
666 q_offset = 1 + q_dim1;
669 epsmch = GMX_DOUBLE_EPS;
675 F77_FUNC(dlaset,DLASET)("All", &kplusp, &kplusp, &c_b4, &c_b5, &q[q_offset], ldq);
682 for (jj = 1; jj <= i__1; ++jj) {
689 for (i__ = istart; i__ <= i__2; ++i__) {
690 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__ + 1 + (h_dim1*2)]);
691 if (h__[i__ + 1 + h_dim1] <= epsmch * big) {
692 h__[i__ + 1 + h_dim1] = 0.;
702 f = h__[istart + (h_dim1 << 1)] - shift[jj];
703 g = h__[istart + 1 + h_dim1];
704 F77_FUNC(dlartg,DLARTG)(&f, &g, &c__, &s, &r__);
706 a1 = c__ * h__[istart + (h_dim1 << 1)] + s * h__[istart + 1 +
708 a2 = c__ * h__[istart + 1 + h_dim1] + s * h__[istart + 1 + (
710 a4 = c__ * h__[istart + 1 + (h_dim1 << 1)] - s * h__[istart + 1 +
712 a3 = c__ * h__[istart + 1 + h_dim1] - s * h__[istart + (h_dim1 <<
714 h__[istart + (h_dim1 << 1)] = c__ * a1 + s * a2;
715 h__[istart + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
716 h__[istart + 1 + h_dim1] = c__ * a3 + s * a4;
719 i__2 = (i__3<kplusp) ? i__3 : kplusp;
720 for (j = 1; j <= i__2; ++j) {
721 a1 = c__ * q[j + istart * q_dim1] + s * q[j + (istart + 1) *
723 q[j + (istart + 1) * q_dim1] = -s * q[j + istart * q_dim1] +
724 c__ * q[j + (istart + 1) * q_dim1];
725 q[j + istart * q_dim1] = a1;
730 for (i__ = istart + 1; i__ <= i__2; ++i__) {
732 f = h__[i__ + h_dim1];
733 g = s * h__[i__ + 1 + h_dim1];
735 h__[i__ + 1 + h_dim1] = c__ * h__[i__ + 1 + h_dim1];
736 F77_FUNC(dlartg,DLARTG)(&f, &g, &c__, &s, &r__);
744 h__[i__ + h_dim1] = r__;
746 a1 = c__ * h__[i__ + (h_dim1 << 1)] + s * h__[i__ + 1 +
748 a2 = c__ * h__[i__ + 1 + h_dim1] + s * h__[i__ + 1 + (h_dim1
750 a3 = c__ * h__[i__ + 1 + h_dim1] - s * h__[i__ + (h_dim1 << 1)
752 a4 = c__ * h__[i__ + 1 + (h_dim1 << 1)] - s * h__[i__ + 1 +
755 h__[i__ + (h_dim1 << 1)] = c__ * a1 + s * a2;
756 h__[i__ + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
757 h__[i__ + 1 + h_dim1] = c__ * a3 + s * a4;
760 i__3 = (i__4<kplusp) ? i__4 : kplusp;
761 for (j = 1; j <= i__3; ++j) {
762 a1 = c__ * q[j + i__ * q_dim1] + s * q[j + (i__ + 1) *
764 q[j + (i__ + 1) * q_dim1] = -s * q[j + i__ * q_dim1] +
765 c__ * q[j + (i__ + 1) * q_dim1];
766 q[j + i__ * q_dim1] = a1;
775 if (h__[iend + h_dim1] < 0.) {
776 h__[iend + h_dim1] = -h__[iend + h_dim1];
777 F77_FUNC(dscal,DSCAL)(&kplusp, &c_b14, &q[iend * q_dim1 + 1], &c__1);
785 for (i__ = itop; i__ <= i__2; ++i__) {
786 if (h__[i__ + 1 + h_dim1] > 0.) {
797 for (i__ = itop; i__ <= i__1; ++i__) {
798 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__+ 1 + (h_dim1*2)]);
799 if (h__[i__ + 1 + h_dim1] <= epsmch * big) {
800 h__[i__ + 1 + h_dim1] = 0.;
805 if (h__[*kev + 1 + h_dim1] > 0.) {
806 F77_FUNC(dgemv,DGEMV)("N", n, &kplusp, &c_b5, &v[v_offset], ldv, &q[(*kev + 1) *
807 q_dim1 + 1], &c__1, &c_b4, &workd[*n + 1], &c__1);
811 for (i__ = 1; i__ <= i__1; ++i__) {
812 i__2 = kplusp - i__ + 1;
813 F77_FUNC(dgemv,DGEMV)("N", n, &i__2, &c_b5, &v[v_offset], ldv, &q[(*kev - i__ + 1) *
814 q_dim1 + 1], &c__1, &c_b4, &workd[1], &c__1);
815 F77_FUNC(dcopy,DCOPY)(n, &workd[1], &c__1, &v[(kplusp - i__ + 1) * v_dim1 + 1], &
820 F77_FUNC(dlacpy,DLACPY)("All", n, kev, &v[(*np + 1) * v_dim1 + 1], ldv, &v[v_offset], ldv);
822 if (h__[*kev + 1 + h_dim1] > 0.) {
823 F77_FUNC(dcopy,DCOPY)(n, &workd[*n + 1], &c__1, &v[(*kev + 1) * v_dim1 + 1], &c__1);
826 F77_FUNC(dscal,DSCAL)(n, &q[kplusp + *kev * q_dim1], &resid[1], &c__1);
827 if (h__[*kev + 1 + h_dim1] > 0.) {
828 F77_FUNC(daxpy,DAXPY)(n, &h__[*kev + 1 + h_dim1], &v[(*kev + 1) * v_dim1 + 1], &c__1,
842 F77_FUNC(dsortr,DSORTR)(const char * which,
857 if (!strncmp(which, "SA", 2)) {
864 for (i__ = igap; i__ <= i__1; ++i__) {
872 if (x1[j] < x1[j + igap]) {
874 x1[j] = x1[j + igap];
878 x2[j] = x2[j + igap];
892 } else if (!strncmp(which, "SM", 2)) {
899 for (i__ = igap; i__ <= i__1; ++i__) {
907 if (fabs(x1[j]) < fabs(x1[j + igap])) {
909 x1[j] = x1[j + igap];
913 x2[j] = x2[j + igap];
927 } else if (!strncmp(which, "LA", 2)) {
934 for (i__ = igap; i__ <= i__1; ++i__) {
942 if (x1[j] > x1[j + igap]) {
944 x1[j] = x1[j + igap];
948 x2[j] = x2[j + igap];
962 } else if (!strncmp(which, "LM", 2)) {
970 for (i__ = igap; i__ <= i__1; ++i__) {
978 if (fabs(x1[j]) > fabs(x1[j + igap])) {
980 x1[j] = x1[j + igap];
984 x2[j] = x2[j + igap];
1008 F77_FUNC(dsesrt,DSESRT)(const char * which,
1016 int a_dim1, a_offset, i__1;
1023 a_offset = 1 + a_dim1 * 0;
1028 if (!strncmp(which, "SA", 2)) {
1035 for (i__ = igap; i__ <= i__1; ++i__) {
1043 if (x[j] < x[j + igap]) {
1048 F77_FUNC(dswap,DSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1049 a_dim1 + 1], &c__1);
1062 } else if (!strncmp(which, "SM", 2)) {
1069 for (i__ = igap; i__ <= i__1; ++i__) {
1077 if (fabs(x[j]) < fabs(x[j + igap])) {
1082 F77_FUNC(dswap,DSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1083 a_dim1 + 1], &c__1);
1096 } else if (!strncmp(which, "LA", 2)) {
1103 for (i__ = igap; i__ <= i__1; ++i__) {
1111 if (x[j] > x[j + igap]) {
1116 F77_FUNC(dswap,DSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1117 a_dim1 + 1], &c__1);
1130 } else if (!strncmp(which, "LM", 2)) {
1137 for (i__ = igap; i__ <= i__1; ++i__) {
1145 if (fabs(x[j]) > fabs(x[j + igap])) {
1150 F77_FUNC(dswap,DSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1151 a_dim1 + 1], &c__1);
1174 F77_FUNC(dsgets,DSGETS)(int * ishift,
1190 if (!strncmp(which, "BE", 2)) {
1192 F77_FUNC(dsortr,DSORTR)("LA", &c__1, &i__1, &ritz[1], &bounds[1]);
1195 i__1 = (kevd2<*np) ? kevd2 : *np;
1196 i__2 = (kevd2>*np) ? kevd2 : *np;
1197 F77_FUNC(dswap,DSWAP)(&i__1, &ritz[1], &c__1,
1198 &ritz[i__2 + 1], &c__1);
1199 i__1 = (kevd2<*np) ? kevd2 : *np;
1200 i__2 = (kevd2>*np) ? kevd2 : *np;
1201 F77_FUNC(dswap,DSWAP)(&i__1, &bounds[1], &c__1,
1202 &bounds[i__2 + 1], &c__1);
1207 F77_FUNC(dsortr,DSORTR)(which, &c__1, &i__1, &ritz[1], &bounds[1]);
1210 if (*ishift == 1 && *np > 0) {
1212 F77_FUNC(dsortr,DSORTR)("SM", &c__1, np, &bounds[1], &ritz[1]);
1213 F77_FUNC(dcopy,DCOPY)(np, &ritz[1], &c__1, &shifts[1], &c__1);
1223 F77_FUNC(dsconv,DSCONV)(int * n,
1239 eps23 = GMX_DOUBLE_EPS;
1240 eps23 = pow(eps23, c_b3);
1244 for (i__ = 1; i__ <= i__1; ++i__) {
1247 d__3 = fabs(ritz[i__]);
1248 temp = (d__2 > d__3) ? d__2 : d__3;
1249 if (bounds[i__] <= *tol * temp) {
1259 F77_FUNC(dseigt,DSEIGT)(double * rnorm,
1269 int h_dim1, h_offset, i__1;
1278 h_offset = 1 + h_dim1;
1281 F77_FUNC(dcopy,DCOPY)(n, &h__[(h_dim1 << 1) + 1], &c__1, &eig[1], &c__1);
1283 F77_FUNC(dcopy,DCOPY)(&i__1, &h__[h_dim1 + 2], &c__1, &workl[1], &c__1);
1284 F77_FUNC(dstqrb,DSTQRB)(n, &eig[1], &workl[1], &bounds[1], &workl[*n + 1], ierr);
1290 for (k = 1; k <= i__1; ++k) {
1291 bounds[k] = *rnorm * fabs(bounds[k]);
1304 F77_FUNC(dsaitr,DSAITR)(int * ido,
1328 int h_dim1, h_offset, v_dim1, v_offset, i__1;
1332 double safmin,minval;
1338 v_offset = 1 + v_dim1;
1341 h_offset = 1 + h_dim1;
1345 minval = GMX_DOUBLE_MIN;
1346 safmin = minval / GMX_DOUBLE_EPS;
1359 iwork[9] = iwork[8] + *n;
1360 iwork[10] = iwork[9] + *n;
1363 if (iwork[5] == 1) {
1366 if (iwork[6] == 1) {
1369 if (iwork[2] == 1) {
1372 if (iwork[3] == 1) {
1375 if (iwork[4] == 1) {
1392 F77_FUNC(dgetv0,DGETV0)(ido, bmat, &iwork[11], &c__0, n, &iwork[12], &v[v_offset], ldv,
1393 &resid[1], rnorm, &ipntr[1], &workd[1], &iwork[21], &iwork[7]);
1399 if (iwork[11] <= 3) {
1403 *info = iwork[12] - 1;
1410 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &v[iwork[12] * v_dim1 + 1], &c__1);
1411 if (*rnorm >= safmin) {
1412 temp1 = 1. / *rnorm;
1413 F77_FUNC(dscal,DSCAL)(n, &temp1, &v[iwork[12] * v_dim1 + 1], &c__1);
1414 F77_FUNC(dscal,DSCAL)(n, &temp1, &workd[iwork[8]], &c__1);
1417 F77_FUNC(dlascl,DLASCL)("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &v[iwork[12] *
1418 v_dim1 + 1], n, &infol);
1419 F77_FUNC(dlascl,DLASCL)("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &workd[iwork[
1424 F77_FUNC(dcopy,DCOPY)(n, &v[iwork[12] * v_dim1 + 1], &c__1, &workd[iwork[10]], &c__1);
1425 ipntr[1] = iwork[10];
1426 ipntr[2] = iwork[9];
1427 ipntr[3] = iwork[8];
1436 F77_FUNC(dcopy,DCOPY)(n, &workd[iwork[9]], &c__1, &resid[1], &c__1);
1443 ipntr[1] = iwork[9];
1444 ipntr[2] = iwork[8];
1448 } else if (*bmat == 'I') {
1449 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1458 workd[*n * 3 + 3] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[iwork[10]], &
1460 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
1461 } else if (*bmat == 'G') {
1462 workd[*n * 3 + 3] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &
1464 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
1465 } else if (*bmat == 'I') {
1466 workd[*n * 3 + 3] =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
1470 F77_FUNC(dgemv,DGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]]
1471 , &c__1, &c_b42, &workd[iwork[9]], &c__1);
1472 } else if (*mode == 2) {
1473 F77_FUNC(dgemv,DGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[10]
1474 ], &c__1, &c_b42, &workd[iwork[9]], &c__1);
1477 F77_FUNC(dgemv,DGEMV)("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
1478 c__1, &c_b18, &resid[1], &c__1);
1480 h__[iwork[12] + (h_dim1 << 1)] = workd[iwork[9] + iwork[12] - 1];
1481 if (iwork[12] == 1 || iwork[4] == 1) {
1482 h__[iwork[12] + h_dim1] = 0.;
1484 h__[iwork[12] + h_dim1] = *rnorm;
1491 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
1492 ipntr[1] = iwork[9];
1493 ipntr[2] = iwork[8];
1497 } else if (*bmat == 'I') {
1498 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1505 *rnorm =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1506 *rnorm = sqrt(fabs(*rnorm));
1507 } else if (*bmat == 'I') {
1508 *rnorm =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
1511 if (*rnorm > workd[*n * 3 + 3] * .717f) {
1517 F77_FUNC(dgemv,DGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]], &
1518 c__1, &c_b42, &workd[iwork[9]], &c__1);
1520 F77_FUNC(dgemv,DGEMV)("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
1521 c__1, &c_b18, &resid[1], &c__1);
1523 if (iwork[12] == 1 || iwork[4] == 1) {
1524 h__[iwork[12] + h_dim1] = 0.;
1526 h__[iwork[12] + (h_dim1 << 1)] += workd[iwork[9] + iwork[12] - 1];
1530 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
1531 ipntr[1] = iwork[9];
1532 ipntr[2] = iwork[8];
1536 } else if (*bmat == 'I') {
1537 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1543 workd[*n * 3 + 2] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &
1545 workd[*n * 3 + 2] = sqrt(fabs(workd[*n * 3 + 2]));
1546 } else if (*bmat == 'I') {
1547 workd[*n * 3 + 2] =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
1551 if (workd[*n * 3 + 2] > *rnorm * .717f) {
1553 *rnorm = workd[*n * 3 + 2];
1557 *rnorm = workd[*n * 3 + 2];
1559 if (iwork[1] <= 1) {
1564 for (jj = 1; jj <= i__1; ++jj) {
1575 if (h__[iwork[12] + h_dim1] < 0.) {
1576 h__[iwork[12] + h_dim1] = -h__[iwork[12] + h_dim1];
1577 if (iwork[12] < *k + *np) {
1578 F77_FUNC(dscal,DSCAL)(n, &c_b50, &v[(iwork[12] + 1) * v_dim1 + 1], &c__1);
1580 F77_FUNC(dscal,DSCAL)(n, &c_b50, &resid[1], &c__1);
1585 if (iwork[12] > *k + *np) {
1604 F77_FUNC(dsaup2,DSAUP2)(int * ido,
1634 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
1653 v_offset = 1 + v_dim1;
1656 h_offset = 1 + h_dim1;
1659 q_offset = 1 + q_dim1;
1663 eps23 = GMX_DOUBLE_EPS;
1664 eps23 = pow(eps23, c_b3);
1676 iwork[7] = iwork[9] + iwork[10];
1694 if (iwork[2] == 1) {
1695 F77_FUNC(dgetv0,DGETV0)(ido, bmat, &c__1, &iwork[3], n, &c__1, &v[v_offset], ldv, &
1696 resid[1], &workd[*n * 3 + 1], &ipntr[1], &workd[1], &iwork[41]
1703 if (workd[*n * 3 + 1] == 0.) {
1712 if (iwork[4] == 1) {
1716 if (iwork[5] == 1) {
1720 if (iwork[1] == 1) {
1724 F77_FUNC(dsaitr,DSAITR)(ido, bmat, n, &c__0, &iwork[9], mode, &resid[1], &workd[*n * 3 +
1725 1], &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
1749 F77_FUNC(dsaitr,DSAITR)(ido, bmat, n, nev, np, mode, &resid[1], &workd[*n * 3 + 1],
1750 &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
1766 F77_FUNC(dseigt,DSEIGT)(&workd[*n * 3 + 1], &iwork[7], &h__[h_offset], ldh, &ritz[1], &
1767 bounds[1], &workl[1], &ierr);
1774 F77_FUNC(dcopy,DCOPY)(&iwork[7], &ritz[1], &c__1, &workl[iwork[7] + 1], &c__1);
1775 F77_FUNC(dcopy,DCOPY)(&iwork[7], &bounds[1], &c__1, &workl[(iwork[7] << 1) + 1], &c__1);
1779 F77_FUNC(dsgets,DSGETS)(ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
1781 F77_FUNC(dcopy,DCOPY)(nev, &bounds[*np + 1], &c__1, &workl[*np + 1], &c__1);
1782 F77_FUNC(dsconv,DSCONV)(nev, &ritz[*np + 1], &workl[*np + 1], tol, &iwork[8]);
1786 for (j = 1; j <= i__1; ++j) {
1787 if (bounds[j] == 0.) {
1793 if (iwork[8] >= iwork[9] || iwork[6] > *mxiter || *np == 0) {
1795 if (!strncmp(which, "BE", 2)) {
1797 strncpy(wprime, "SA",2);
1798 F77_FUNC(dsortr,DSORTR)(wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
1800 nevm2 = *nev - nevd2;
1802 i__1 = (nevd2 < *np) ? nevd2 : *np;
1803 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np + 1;
1804 F77_FUNC(dswap,DSWAP)(&i__1, &ritz[nevm2 + 1], &c__1,
1805 &ritz[((i__2>i__3) ? i__2 : i__3)],
1807 i__1 = (nevd2 < *np) ? nevd2 : *np;
1808 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np;
1809 F77_FUNC(dswap,DSWAP)(&i__1, &bounds[nevm2 + 1], &c__1,
1810 &bounds[((i__2>i__3) ? i__2 : i__3) + 1],
1816 if (!strncmp(which, "LM", 2)) {
1817 strncpy(wprime, "SM", 2);
1819 if (!strncmp(which, "SM", 2)) {
1820 strncpy(wprime, "LM", 2);
1822 if (!strncmp(which, "LA", 2)) {
1823 strncpy(wprime, "SA", 2);
1825 if (!strncmp(which, "SA", 2)) {
1826 strncpy(wprime, "LA", 2);
1829 F77_FUNC(dsortr,DSORTR)(wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
1834 for (j = 1; j <= i__1; ++j) {
1836 d__3 = fabs(ritz[j]);
1837 temp = (d__2>d__3) ? d__2 : d__3;
1841 strncpy(wprime, "LA",2);
1842 F77_FUNC(dsortr,DSORTR)(wprime, &c__1, &iwork[9], &bounds[1], &ritz[1]);
1845 for (j = 1; j <= i__1; ++j) {
1847 d__3 = fabs(ritz[j]);
1848 temp = (d__2>d__3) ? d__2 : d__3;
1852 if (!strncmp(which, "BE", 2)) {
1854 strncpy(wprime, "LA", 2);
1855 F77_FUNC(dsortr,DSORTR)(wprime, &c__1, &iwork[8], &ritz[1], &bounds[1]);
1858 F77_FUNC(dsortr,DSORTR)(which, &c__1, &iwork[8], &ritz[1], &bounds[1]);
1862 h__[h_dim1 + 1] = workd[*n * 3 + 1];
1865 if (iwork[6] > *mxiter && iwork[8] < *nev) {
1868 if (*np == 0 && iwork[8] < iwork[9]) {
1875 } else if (iwork[8] < *nev && *ishift == 1) {
1877 i__1 = iwork[8], i__2 = *np / 2;
1878 *nev += (i__1 < i__2) ? i__1 : i__2;
1879 if (*nev == 1 && iwork[7] >= 6) {
1880 *nev = iwork[7] / 2;
1881 } else if (*nev == 1 && iwork[7] > 2) {
1884 *np = iwork[7] - *nev;
1887 if (nevbef < *nev) {
1888 F77_FUNC(dsgets,DSGETS)(ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
1906 F77_FUNC(dcopy,DCOPY)(np, &workl[1], &c__1, &ritz[1], &c__1);
1909 F77_FUNC(dsapps,DSAPPS)(n, nev, np, &ritz[1], &v[v_offset], ldv, &h__[h_offset], ldh, &
1910 resid[1], &q[q_offset], ldq, &workd[1]);
1914 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[*n + 1], &c__1);
1920 } else if (*bmat == 'I') {
1921 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
1927 workd[*n * 3 + 1] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
1928 workd[*n * 3 + 1] = sqrt(fabs(workd[*n * 3 + 1]));
1929 } else if (*bmat == 'I') {
1930 workd[*n * 3 + 1] =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
1952 F77_FUNC(dsaupd,DSAUPD)(int * ido,
1970 int v_dim1, v_offset, i__1, i__2;
1976 v_offset = 1 + v_dim1;
1987 iwork[5] = iparam[1];
1988 iwork[10] = iparam[3];
1989 iwork[12] = iparam[4];
1992 iwork[11] = iparam[7];
1997 } else if (*nev <= 0) {
1999 } else if (*ncv <= *nev || *ncv > *n) {
2004 iwork[15] = *ncv - *nev;
2006 if (iwork[10] <= 0) {
2009 if (strncmp(which,"LM",2) && strncmp(which,"SM",2) &&
2010 strncmp(which,"LA",2) && strncmp(which,"SA",2) &&
2011 strncmp(which,"BE",2)) {
2014 if (*bmat != 'I' && *bmat != 'G') {
2019 if (*lworkl < i__1 * i__1 + (*ncv << 3)) {
2022 if (iwork[11] < 1 || iwork[11] > 5) {
2024 } else if (iwork[11] == 1 && *bmat == 'G') {
2026 } else if (iwork[5] < 0 || iwork[5] > 1) {
2028 } else if (*nev == 1 && !strncmp(which, "BE", 2)) {
2032 if (iwork[2] != 0) {
2038 if (iwork[12] <= 0) {
2042 *tol = GMX_DOUBLE_EPS;
2045 iwork[15] = *ncv - *nev;
2048 i__1 = i__2 * i__2 + (*ncv << 3);
2049 for (j = 1; j <= i__1; ++j) {
2056 iwork[16] = iwork[3] + (iwork[8] << 1);
2057 iwork[1] = iwork[16] + *ncv;
2058 iwork[4] = iwork[1] + *ncv;
2060 iwork[7] = iwork[4] + i__1 * i__1;
2061 iwork[14] = iwork[7] + *ncv * 3;
2063 ipntr[4] = iwork[14];
2064 ipntr[5] = iwork[3];
2065 ipntr[6] = iwork[16];
2066 ipntr[7] = iwork[1];
2067 ipntr[11] = iwork[7];
2070 F77_FUNC(dsaup2,DSAUP2)(ido, bmat, n, which, &iwork[13], &iwork[15], tol, &resid[1], &
2071 iwork[11], &iwork[6], &iwork[5], &iwork[10], &v[v_offset], ldv, &
2072 workl[iwork[3]], &iwork[8], &workl[iwork[16]], &workl[iwork[1]], &
2073 workl[iwork[4]], &iwork[9], &workl[iwork[7]], &ipntr[1], &workd[1]
2074 , &iwork[21], info);
2077 iparam[8] = iwork[15];
2083 iparam[3] = iwork[10];
2084 iparam[5] = iwork[15];
2102 F77_FUNC(dseupd,DSEUPD)(int * rvec,
2103 const char * howmny,
2128 int v_dim1, v_offset, z_dim1, z_offset, i__1;
2129 double d__1, d__2, d__3;
2131 int j, k, ih, iq, iw, ibd, ihb, ihd, ldh, ilg, ldq, ism, irz;
2143 double thres1=0, thres2=0;
2147 int leftptr, rghtptr;
2153 z_offset = 1 + z_dim1;
2158 v_offset = 1 + v_dim1;
2182 if (*ncv <= *nev || *ncv > *n) {
2185 if (strncmp(which,"LM",2) && strncmp(which,"SM",2) &&
2186 strncmp(which,"LA",2) && strncmp(which,"SA",2) &&
2187 strncmp(which,"BE",2)) {
2190 if (*bmat != 'I' && *bmat != 'G') {
2193 if (*howmny != 'A' && *howmny != 'P' &&
2194 *howmny != 'S' && *rvec) {
2197 if (*rvec && *howmny == 'S') {
2201 if (*rvec && *lworkl < i__1 * i__1 + (*ncv << 3)) {
2205 if (mode == 1 || mode == 2) {
2206 strncpy(type__, "REGULR",6);
2207 } else if (mode == 3) {
2208 strncpy(type__, "SHIFTI",6);
2209 } else if (mode == 4) {
2210 strncpy(type__, "BUCKLE",6);
2211 } else if (mode == 5) {
2212 strncpy(type__, "CAYLEY",6);
2216 if (mode == 1 && *bmat == 'G') {
2219 if (*nev == 1 && !strncmp(which, "BE",2)) {
2236 iw = iq + ldh * *ncv;
2237 next = iw + (*ncv << 1);
2243 irz = ipntr[11] + *ncv;
2247 eps23 = GMX_DOUBLE_EPS;
2248 eps23 = pow(eps23, c_b21);
2253 } else if (*bmat == 'G') {
2254 bnorm2 =F77_FUNC(dnrm2,DNRM2)(n, &workd[1], &c__1);
2259 if (!strncmp(which,"LM",2) || !strncmp(which,"SM",2) ||
2260 !strncmp(which,"LA",2) || !strncmp(which,"SA",2)) {
2262 } else if (!strncmp(which,"BE",2)) {
2265 ism = (*nev>nconv) ? *nev : nconv;
2268 thres1 = workl[ism];
2269 thres2 = workl[ilg];
2277 for (j = 0; j <= i__1; ++j) {
2279 if (!strncmp(which,"LM",2)) {
2280 if (fabs(workl[irz + j]) >= fabs(thres1)) {
2282 d__3 = fabs(workl[irz + j]);
2283 tempbnd = (d__2>d__3) ? d__2 : d__3;
2284 if (workl[ibd + j] <= *tol * tempbnd) {
2288 } else if (!strncmp(which,"SM",2)) {
2289 if (fabs(workl[irz + j]) <= fabs(thres1)) {
2291 d__3 = fabs(workl[irz + j]);
2292 tempbnd = (d__2>d__3) ? d__2 : d__3;
2293 if (workl[ibd + j] <= *tol * tempbnd) {
2297 } else if (!strncmp(which,"LA",2)) {
2298 if (workl[irz + j] >= thres1) {
2300 d__3 = fabs(workl[irz + j]);
2301 tempbnd = (d__2>d__3) ? d__2 : d__3;
2302 if (workl[ibd + j] <= *tol * tempbnd) {
2306 } else if (!strncmp(which,"SA",2)) {
2307 if (workl[irz + j] <= thres1) {
2309 d__3 = fabs(workl[irz + j]);
2310 tempbnd = (d__2>d__3) ? d__2 : d__3;
2311 if (workl[ibd + j] <= *tol * tempbnd) {
2315 } else if (!strncmp(which,"BE",2)) {
2316 if (workl[irz + j] <= thres1 || workl[irz + j] >= thres2) {
2318 d__3 = fabs(workl[irz + j]);
2319 tempbnd = (d__2>d__3) ? d__2 : d__3;
2320 if (workl[ibd + j] <= *tol * tempbnd) {
2325 if (j + 1 > nconv) {
2326 reord = select[j + 1] || reord;
2328 if (select[j + 1]) {
2334 F77_FUNC(dcopy,DCOPY)(&i__1, &workl[ih + 1], &c__1, &workl[ihb], &c__1);
2335 F77_FUNC(dcopy,DCOPY)(ncv, &workl[ih + ldh], &c__1, &workl[ihd], &c__1);
2337 F77_FUNC(dsteqr,DSTEQR)("Identity", ncv, &workl[ihd], &workl[ihb], &workl[iq], &ldq, &
2356 if (select[leftptr]) {
2360 } else if (! select[rghtptr]) {
2366 temp = workl[ihd + leftptr - 1];
2367 workl[ihd + leftptr - 1] = workl[ihd + rghtptr - 1];
2368 workl[ihd + rghtptr - 1] = temp;
2369 F77_FUNC(dcopy,DCOPY)(ncv, &workl[iq + *ncv * (leftptr - 1)], &c__1, &workl[
2371 F77_FUNC(dcopy,DCOPY)(ncv, &workl[iq + *ncv * (rghtptr - 1)], &c__1, &workl[
2372 iq + *ncv * (leftptr - 1)], &c__1);
2373 F77_FUNC(dcopy,DCOPY)(ncv, &workl[iw], &c__1, &workl[iq + *ncv * (rghtptr -
2380 if (leftptr < rghtptr) {
2388 F77_FUNC(dcopy,DCOPY)(&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
2392 F77_FUNC(dcopy,DCOPY)(&nconv, &workl[ritz], &c__1, &d__[1], &c__1);
2393 F77_FUNC(dcopy,DCOPY)(ncv, &workl[ritz], &c__1, &workl[ihd], &c__1);
2396 if (!strncmp(type__, "REGULR",6)) {
2399 F77_FUNC(dsesrt,DSESRT)("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
2401 F77_FUNC(dcopy,DCOPY)(ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
2406 F77_FUNC(dcopy,DCOPY)(ncv, &workl[ihd], &c__1, &workl[iw], &c__1);
2407 if (!strncmp(type__, "SHIFTI", 6)) {
2409 for (k = 1; k <= i__1; ++k) {
2410 workl[ihd + k - 1] = 1. / workl[ihd + k - 1] + *sigma;
2412 } else if (!strncmp(type__, "BUCKLE",6)) {
2414 for (k = 1; k <= i__1; ++k) {
2415 workl[ihd + k - 1] = *sigma * workl[ihd + k - 1] / (workl[ihd
2418 } else if (!strncmp(type__, "CAYLEY",6)) {
2420 for (k = 1; k <= i__1; ++k) {
2421 workl[ihd + k - 1] = *sigma * (workl[ihd + k - 1] + 1.) / (
2422 workl[ihd + k - 1] - 1.);
2426 F77_FUNC(dcopy,DCOPY)(&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
2427 F77_FUNC(dsortr,DSORTR)("LA", &c__1, &nconv, &workl[ihd], &workl[iw]);
2429 F77_FUNC(dsesrt,DSESRT)("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
2431 F77_FUNC(dcopy,DCOPY)(ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
2432 d__1 = bnorm2 / rnorm;
2433 F77_FUNC(dscal,DSCAL)(ncv, &d__1, &workl[ihb], &c__1);
2434 F77_FUNC(dsortr,DSORTR)("LA", &c__1, &nconv, &d__[1], &workl[ihb]);
2439 if (*rvec && *howmny == 'A') {
2441 F77_FUNC(dgeqr2,DGEQR2)(ncv, &nconv, &workl[iq], &ldq, &workl[iw + *ncv], &workl[ihb],
2444 F77_FUNC(dorm2r,DORM2R)("Right", "Notranspose", n, ncv, &nconv, &workl[iq], &ldq, &
2445 workl[iw + *ncv], &v[v_offset], ldv, &workd[*n + 1], &ierr);
2446 F77_FUNC(dlacpy,DLACPY)("All", n, &nconv, &v[v_offset], ldv, &z__[z_offset], ldz);
2449 for (j = 1; j <= i__1; ++j) {
2450 workl[ihb + j - 1] = 0.;
2452 workl[ihb + *ncv - 1] = 1.;
2453 F77_FUNC(dorm2r,DORM2R)("Left", "Transpose", ncv, &c__1, &nconv, &workl[iq], &ldq, &
2454 workl[iw + *ncv], &workl[ihb], ncv, &temp, &ierr);
2456 } else if (*rvec && *howmny == 'S') {
2460 if (!strncmp(type__, "REGULR",6) && *rvec) {
2463 for (j = 1; j <= i__1; ++j) {
2464 workl[ihb + j - 1] = rnorm * fabs(workl[ihb + j - 1]);
2467 } else if (strncmp(type__, "REGULR",6) && *rvec) {
2469 F77_FUNC(dscal,DSCAL)(ncv, &bnorm2, &workl[ihb], &c__1);
2470 if (!strncmp(type__, "SHIFTI",6)) {
2473 for (k = 1; k <= i__1; ++k) {
2474 d__2 = workl[iw + k - 1];
2475 workl[ihb + k - 1] = fabs(workl[ihb + k - 1])/(d__2 * d__2);
2478 } else if (!strncmp(type__, "BUCKLE",6)) {
2481 for (k = 1; k <= i__1; ++k) {
2482 d__2 = workl[iw + k - 1] - 1.;
2483 workl[ihb + k - 1] = *sigma * fabs(workl[ihb + k - 1])/(d__2 * d__2);
2486 } else if (!strncmp(type__, "CAYLEY",6)) {
2489 for (k = 1; k <= i__1; ++k) {
2490 workl[ihb + k - 1] = fabs(workl[ihb + k - 1] / workl[iw + k - 1] * (workl[iw + k - 1] - 1.));
2498 if (*rvec && (!strncmp(type__, "SHIFTI",6) || !strncmp(type__, "CAYLEY",6))) {
2501 for (k = 0; k <= i__1; ++k) {
2502 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / workl[iw + k];
2505 } else if (*rvec && !strncmp(type__, "BUCKLE", 6)) {
2508 for (k = 0; k <= i__1; ++k) {
2509 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / (workl[iw + k] -
2515 if (strncmp(type__, "REGULR",6)) {
2516 F77_FUNC(dger,DGER)(n, &nconv, &c_b102, &resid[1], &c__1, &workl[iw], &c__1, &z__[
2530 /* Selected single precision arpack routines */
2534 F77_FUNC(sstqrb,SSTQRB)(int * n,
2548 int i__, j, k, l, m;
2550 int l1, ii, mm, lm1, mm1, nm1;
2551 float rt1, rt2, eps;
2554 int lend, jtot, lendm1, lendp1, iscale;
2556 int lendsv, nmaxit, icompz;
2557 float ssfmax, ssfmin,safmin,minval,safmax,anorm;
2580 eps = GMX_FLOAT_EPS;
2584 minval = GMX_FLOAT_MIN;
2585 safmin = minval / GMX_FLOAT_EPS;
2586 safmax = 1. / safmin;
2587 ssfmax = sqrt(safmax) / 3.;
2588 ssfmin = sqrt(safmin) / eps2;
2592 for (j = 1; j <= i__1; ++j) {
2614 for (m = l1; m <= i__1; ++m) {
2619 if (tst <= sqrt(fabs(d__[m])) * sqrt(fabs(d__[m+1])) * eps) {
2637 i__1 = lend - l + 1;
2638 anorm =F77_FUNC(slanst,SLANST)("i", &i__1, &d__[l], &e[l]);
2643 if (anorm > ssfmax) {
2645 i__1 = lend - l + 1;
2646 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n,
2649 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n,
2651 } else if (anorm < ssfmin) {
2653 i__1 = lend - l + 1;
2654 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n,
2657 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n,
2661 if (fabs(d__[lend]) < fabs(d__[l])) {
2672 for (m = l; m <= i__1; ++m) {
2675 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m + 1]) + safmin) {
2694 F77_FUNC(slaev2,SLAEV2)(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s);
2696 work[*n - 1 + l] = s;
2699 z__[l + 1] = c__ * tst - s * z__[l];
2700 z__[l] = s * tst + c__ * z__[l];
2702 F77_FUNC(slae2,SLAE2)(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2);
2714 if (jtot == nmaxit) {
2719 g = (d__[l + 1] - p) / (e[l] * 2.);
2720 r__ =F77_FUNC(slapy2,SLAPY2)(&g, &c_b31);
2721 g = d__[m] - p + e[l] / (g + ((g>0) ? r__ : -r__ ));
2729 for (i__ = mm1; i__ >= i__1; --i__) {
2732 F77_FUNC(slartg,SLARTG)(&g, &f, &c__, &s, &r__);
2736 g = d__[i__ + 1] - p;
2737 r__ = (d__[i__] - g) * s + c__ * 2. * b;
2739 d__[i__ + 1] = g + p;
2744 work[*n - 1 + i__] = -s;
2752 F77_FUNC(slasr,SLASR)("r", "v", "b", &c__1, &mm, &work[l], &work[*n - 1 + l], &
2775 for (m = l; m >= i__1; --m) {
2776 d__2 = fabs(e[m - 1]);
2778 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m- 1]) + safmin) {
2797 F77_FUNC(slaev2,SLAEV2)(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s)
2801 z__[l] = c__ * tst - s * z__[l - 1];
2802 z__[l - 1] = s * tst + c__ * z__[l - 1];
2804 F77_FUNC(slae2,SLAE2)(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2);
2816 if (jtot == nmaxit) {
2822 g = (d__[l - 1] - p) / (e[l - 1] * 2.);
2823 r__ =F77_FUNC(slapy2,SLAPY2)(&g, &c_b31);
2824 g = d__[m] - p + e[l - 1] / (g + ((g>0) ? r__ : -r__ ));
2832 for (i__ = m; i__ <= i__1; ++i__) {
2835 F77_FUNC(slartg,SLARTG)(&g, &f, &c__, &s, &r__);
2840 r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b;
2847 work[*n - 1 + i__] = s;
2855 F77_FUNC(slasr,SLASR)("r", "v", "f", &c__1, &mm, &work[m], &work[*n - 1 + m], &
2876 i__1 = lendsv - lsv + 1;
2877 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv],
2879 i__1 = lendsv - lsv;
2880 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n,
2882 } else if (iscale == 2) {
2883 i__1 = lendsv - lsv + 1;
2884 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv],
2886 i__1 = lendsv - lsv;
2887 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n,
2891 if (jtot < nmaxit) {
2895 for (i__ = 1; i__ <= i__1; ++i__) {
2905 F77_FUNC(slasrt,SLASRT)("i", n, &d__[1], info);
2910 for (ii = 2; ii <= i__1; ++ii) {
2915 for (j = ii; j <= i__2; ++j) {
2938 F77_FUNC(sgetv0,SGETV0)(int * ido,
2957 int v_dim1, v_offset, i__1;
2965 v_offset = 1 + v_dim1;
2979 F77_FUNC(slarnv,SLARNV)(&idist, &iwork[1], n, &resid[1]);
2985 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
2991 if (iwork[5] == 1) {
2995 if (iwork[6] == 1) {
3001 F77_FUNC(scopy,SCOPY)(n, &workd[*n + 1], &c__1, &resid[1], &c__1);
3006 } else if (*bmat == 'I') {
3007 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
3015 workd[*n * 3 + 4] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
3016 workd[*n * 3 + 4] = sqrt(fabs(workd[*n * 3 + 4]));
3017 } else if (*bmat == 'I') {
3018 workd[*n * 3 + 4] =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
3020 *rnorm = workd[*n * 3 + 4];
3029 F77_FUNC(sgemv,SGEMV)("T", n, &i__1, &c_b22, &v[v_offset], ldv, &workd[1], &c__1, &c_b24,
3030 &workd[*n + 1], &c__1);
3032 F77_FUNC(sgemv,SGEMV)("N", n, &i__1, &c_b27, &v[v_offset], ldv, &workd[*n + 1], &c__1, &
3033 c_b22, &resid[1], &c__1);
3036 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[*n + 1], &c__1);
3041 } else if (*bmat == 'I') {
3042 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
3048 *rnorm =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
3049 *rnorm = sqrt(fabs(*rnorm));
3050 } else if (*bmat == 'I') {
3051 *rnorm =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
3054 if (*rnorm > workd[*n * 3 + 4] * .717f) {
3059 if (iwork[7] <= 1) {
3061 workd[*n * 3 + 4] = *rnorm;
3066 for (jj = 1; jj <= i__1; ++jj) {
3086 F77_FUNC(ssapps,SSAPPS)(int * n,
3103 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
3107 float r__, s, a1, a2, a3, a4;
3118 v_offset = 1 + v_dim1;
3121 h_offset = 1 + h_dim1;
3124 q_offset = 1 + q_dim1;
3127 epsmch = GMX_FLOAT_EPS;
3131 kplusp = *kev + *np;
3133 F77_FUNC(slaset,SLASET)("All", &kplusp, &kplusp, &c_b4, &c_b5, &q[q_offset], ldq);
3140 for (jj = 1; jj <= i__1; ++jj) {
3147 for (i__ = istart; i__ <= i__2; ++i__) {
3148 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__ + 1 + (h_dim1*2)]);
3149 if (h__[i__ + 1 + h_dim1] <= epsmch * big) {
3150 h__[i__ + 1 + h_dim1] = 0.;
3158 if (istart < iend) {
3160 f = h__[istart + (h_dim1 << 1)] - shift[jj];
3161 g = h__[istart + 1 + h_dim1];
3162 F77_FUNC(slartg,SLARTG)(&f, &g, &c__, &s, &r__);
3164 a1 = c__ * h__[istart + (h_dim1 << 1)] + s * h__[istart + 1 +
3166 a2 = c__ * h__[istart + 1 + h_dim1] + s * h__[istart + 1 + (
3168 a4 = c__ * h__[istart + 1 + (h_dim1 << 1)] - s * h__[istart + 1 +
3170 a3 = c__ * h__[istart + 1 + h_dim1] - s * h__[istart + (h_dim1 <<
3172 h__[istart + (h_dim1 << 1)] = c__ * a1 + s * a2;
3173 h__[istart + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
3174 h__[istart + 1 + h_dim1] = c__ * a3 + s * a4;
3177 i__2 = (i__3<kplusp) ? i__3 : kplusp;
3178 for (j = 1; j <= i__2; ++j) {
3179 a1 = c__ * q[j + istart * q_dim1] + s * q[j + (istart + 1) *
3181 q[j + (istart + 1) * q_dim1] = -s * q[j + istart * q_dim1] +
3182 c__ * q[j + (istart + 1) * q_dim1];
3183 q[j + istart * q_dim1] = a1;
3188 for (i__ = istart + 1; i__ <= i__2; ++i__) {
3190 f = h__[i__ + h_dim1];
3191 g = s * h__[i__ + 1 + h_dim1];
3193 h__[i__ + 1 + h_dim1] = c__ * h__[i__ + 1 + h_dim1];
3194 F77_FUNC(slartg,SLARTG)(&f, &g, &c__, &s, &r__);
3202 h__[i__ + h_dim1] = r__;
3204 a1 = c__ * h__[i__ + (h_dim1 << 1)] + s * h__[i__ + 1 +
3206 a2 = c__ * h__[i__ + 1 + h_dim1] + s * h__[i__ + 1 + (h_dim1
3208 a3 = c__ * h__[i__ + 1 + h_dim1] - s * h__[i__ + (h_dim1 << 1)
3210 a4 = c__ * h__[i__ + 1 + (h_dim1 << 1)] - s * h__[i__ + 1 +
3213 h__[i__ + (h_dim1 << 1)] = c__ * a1 + s * a2;
3214 h__[i__ + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
3215 h__[i__ + 1 + h_dim1] = c__ * a3 + s * a4;
3218 i__3 = (i__4<kplusp) ? i__4 : kplusp;
3219 for (j = 1; j <= i__3; ++j) {
3220 a1 = c__ * q[j + i__ * q_dim1] + s * q[j + (i__ + 1) *
3222 q[j + (i__ + 1) * q_dim1] = -s * q[j + i__ * q_dim1] +
3223 c__ * q[j + (i__ + 1) * q_dim1];
3224 q[j + i__ * q_dim1] = a1;
3233 if (h__[iend + h_dim1] < 0.) {
3234 h__[iend + h_dim1] = -h__[iend + h_dim1];
3235 F77_FUNC(sscal,SSCAL)(&kplusp, &c_b14, &q[iend * q_dim1 + 1], &c__1);
3238 if (iend < kplusp) {
3243 for (i__ = itop; i__ <= i__2; ++i__) {
3244 if (h__[i__ + 1 + h_dim1] > 0.) {
3255 for (i__ = itop; i__ <= i__1; ++i__) {
3256 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__+ 1 + (h_dim1*2)]);
3257 if (h__[i__ + 1 + h_dim1] <= epsmch * big) {
3258 h__[i__ + 1 + h_dim1] = 0.;
3263 if (h__[*kev + 1 + h_dim1] > 0.) {
3264 F77_FUNC(sgemv,SGEMV)("N", n, &kplusp, &c_b5, &v[v_offset], ldv, &q[(*kev + 1) *
3265 q_dim1 + 1], &c__1, &c_b4, &workd[*n + 1], &c__1);
3269 for (i__ = 1; i__ <= i__1; ++i__) {
3270 i__2 = kplusp - i__ + 1;
3271 F77_FUNC(sgemv,SGEMV)("N", n, &i__2, &c_b5, &v[v_offset], ldv, &q[(*kev - i__ + 1) *
3272 q_dim1 + 1], &c__1, &c_b4, &workd[1], &c__1);
3273 F77_FUNC(scopy,SCOPY)(n, &workd[1], &c__1, &v[(kplusp - i__ + 1) * v_dim1 + 1], &
3278 F77_FUNC(slacpy,SLACPY)("All", n, kev, &v[(*np + 1) * v_dim1 + 1], ldv, &v[v_offset], ldv);
3280 if (h__[*kev + 1 + h_dim1] > 0.) {
3281 F77_FUNC(scopy,SCOPY)(n, &workd[*n + 1], &c__1, &v[(*kev + 1) * v_dim1 + 1], &c__1);
3284 F77_FUNC(sscal,SSCAL)(n, &q[kplusp + *kev * q_dim1], &resid[1], &c__1);
3285 if (h__[*kev + 1 + h_dim1] > 0.) {
3286 F77_FUNC(saxpy,SAXPY)(n, &h__[*kev + 1 + h_dim1], &v[(*kev + 1) * v_dim1 + 1], &c__1,
3300 F77_FUNC(ssortr,SSORTR)(const char * which,
3315 if (!strncmp(which, "SA", 2)) {
3322 for (i__ = igap; i__ <= i__1; ++i__) {
3330 if (x1[j] < x1[j + igap]) {
3332 x1[j] = x1[j + igap];
3333 x1[j + igap] = temp;
3336 x2[j] = x2[j + igap];
3337 x2[j + igap] = temp;
3350 } else if (!strncmp(which, "SM", 2)) {
3357 for (i__ = igap; i__ <= i__1; ++i__) {
3365 if (fabs(x1[j]) < fabs(x1[j + igap])) {
3367 x1[j] = x1[j + igap];
3368 x1[j + igap] = temp;
3371 x2[j] = x2[j + igap];
3372 x2[j + igap] = temp;
3385 } else if (!strncmp(which, "LA", 2)) {
3392 for (i__ = igap; i__ <= i__1; ++i__) {
3400 if (x1[j] > x1[j + igap]) {
3402 x1[j] = x1[j + igap];
3403 x1[j + igap] = temp;
3406 x2[j] = x2[j + igap];
3407 x2[j + igap] = temp;
3420 } else if (!strncmp(which, "LM", 2)) {
3428 for (i__ = igap; i__ <= i__1; ++i__) {
3436 if (fabs(x1[j]) > fabs(x1[j + igap])) {
3438 x1[j] = x1[j + igap];
3439 x1[j + igap] = temp;
3442 x2[j] = x2[j + igap];
3443 x2[j + igap] = temp;
3466 F77_FUNC(ssesrt,SSESRT)(const char * which,
3474 int a_dim1, a_offset, i__1;
3481 a_offset = 1 + a_dim1 * 0;
3486 if (!strncmp(which, "SA", 2)) {
3493 for (i__ = igap; i__ <= i__1; ++i__) {
3501 if (x[j] < x[j + igap]) {
3506 F77_FUNC(sswap,SSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
3507 a_dim1 + 1], &c__1);
3520 } else if (!strncmp(which, "SM", 2)) {
3527 for (i__ = igap; i__ <= i__1; ++i__) {
3535 if (fabs(x[j]) < fabs(x[j + igap])) {
3540 F77_FUNC(sswap,SSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
3541 a_dim1 + 1], &c__1);
3554 } else if (!strncmp(which, "LA", 2)) {
3561 for (i__ = igap; i__ <= i__1; ++i__) {
3569 if (x[j] > x[j + igap]) {
3574 F77_FUNC(sswap,SSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
3575 a_dim1 + 1], &c__1);
3588 } else if (!strncmp(which, "LM", 2)) {
3595 for (i__ = igap; i__ <= i__1; ++i__) {
3603 if (fabs(x[j]) > fabs(x[j + igap])) {
3608 F77_FUNC(sswap,SSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
3609 a_dim1 + 1], &c__1);
3632 F77_FUNC(ssgets,SSGETS)(int * ishift,
3648 if (!strncmp(which, "BE", 2)) {
3650 F77_FUNC(ssortr,SSORTR)("LA", &c__1, &i__1, &ritz[1], &bounds[1]);
3653 i__1 = (kevd2<*np) ? kevd2 : *np;
3654 i__2 = (kevd2>*np) ? kevd2 : *np;
3655 F77_FUNC(sswap,SSWAP)(&i__1, &ritz[1], &c__1,
3656 &ritz[i__2 + 1], &c__1);
3657 i__1 = (kevd2<*np) ? kevd2 : *np;
3658 i__2 = (kevd2>*np) ? kevd2 : *np;
3659 F77_FUNC(sswap,SSWAP)(&i__1, &bounds[1], &c__1,
3660 &bounds[i__2 + 1], &c__1);
3665 F77_FUNC(ssortr,SSORTR)(which, &c__1, &i__1, &ritz[1], &bounds[1]);
3668 if (*ishift == 1 && *np > 0) {
3670 F77_FUNC(ssortr,SSORTR)("SM", &c__1, np, &bounds[1], &ritz[1]);
3671 F77_FUNC(scopy,SCOPY)(np, &ritz[1], &c__1, &shifts[1], &c__1);
3681 F77_FUNC(ssconv,SSCONV)(int * n,
3697 eps23 = GMX_FLOAT_EPS;
3698 eps23 = pow(eps23, c_b3);
3702 for (i__ = 1; i__ <= i__1; ++i__) {
3705 d__3 = fabs(ritz[i__]);
3706 temp = (d__2 > d__3) ? d__2 : d__3;
3707 if (bounds[i__] <= *tol * temp) {
3717 F77_FUNC(sseigt,SSEIGT)(float * rnorm,
3727 int h_dim1, h_offset, i__1;
3736 h_offset = 1 + h_dim1;
3739 F77_FUNC(scopy,SCOPY)(n, &h__[(h_dim1 << 1) + 1], &c__1, &eig[1], &c__1);
3741 F77_FUNC(scopy,SCOPY)(&i__1, &h__[h_dim1 + 2], &c__1, &workl[1], &c__1);
3742 F77_FUNC(sstqrb,SSTQRB)(n, &eig[1], &workl[1], &bounds[1], &workl[*n + 1], ierr);
3748 for (k = 1; k <= i__1; ++k) {
3749 bounds[k] = *rnorm * fabs(bounds[k]);
3762 F77_FUNC(ssaitr,SSAITR)(int * ido,
3786 int h_dim1, h_offset, v_dim1, v_offset, i__1;
3790 float safmin,minval;
3796 v_offset = 1 + v_dim1;
3799 h_offset = 1 + h_dim1;
3803 minval = GMX_FLOAT_MIN;
3804 safmin = minval / GMX_FLOAT_EPS;
3817 iwork[9] = iwork[8] + *n;
3818 iwork[10] = iwork[9] + *n;
3821 if (iwork[5] == 1) {
3824 if (iwork[6] == 1) {
3827 if (iwork[2] == 1) {
3830 if (iwork[3] == 1) {
3833 if (iwork[4] == 1) {
3850 F77_FUNC(sgetv0,sgetv0)(ido, bmat, &iwork[11], &c__0, n, &iwork[12], &v[v_offset], ldv,
3851 &resid[1], rnorm, &ipntr[1], &workd[1], &iwork[21], &iwork[7]);
3857 if (iwork[11] <= 3) {
3861 *info = iwork[12] - 1;
3868 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &v[iwork[12] * v_dim1 + 1], &c__1);
3869 if (*rnorm >= safmin) {
3870 temp1 = 1. / *rnorm;
3871 F77_FUNC(sscal,SSCAL)(n, &temp1, &v[iwork[12] * v_dim1 + 1], &c__1);
3872 F77_FUNC(sscal,SSCAL)(n, &temp1, &workd[iwork[8]], &c__1);
3875 F77_FUNC(slascl,SLASCL)("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &v[iwork[12] *
3876 v_dim1 + 1], n, &infol);
3877 F77_FUNC(slascl,SLASCL)("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &workd[iwork[
3882 F77_FUNC(scopy,SCOPY)(n, &v[iwork[12] * v_dim1 + 1], &c__1, &workd[iwork[10]], &c__1);
3883 ipntr[1] = iwork[10];
3884 ipntr[2] = iwork[9];
3885 ipntr[3] = iwork[8];
3894 F77_FUNC(scopy,SCOPY)(n, &workd[iwork[9]], &c__1, &resid[1], &c__1);
3901 ipntr[1] = iwork[9];
3902 ipntr[2] = iwork[8];
3906 } else if (*bmat == 'I') {
3907 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
3916 workd[*n * 3 + 3] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[iwork[10]], &
3918 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
3919 } else if (*bmat == 'G') {
3920 workd[*n * 3 + 3] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &
3922 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
3923 } else if (*bmat == 'I') {
3924 workd[*n * 3 + 3] =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
3928 F77_FUNC(sgemv,SGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]]
3929 , &c__1, &c_b42, &workd[iwork[9]], &c__1);
3930 } else if (*mode == 2) {
3931 F77_FUNC(sgemv,SGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[10]
3932 ], &c__1, &c_b42, &workd[iwork[9]], &c__1);
3935 F77_FUNC(sgemv,SGEMV)("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
3936 c__1, &c_b18, &resid[1], &c__1);
3938 h__[iwork[12] + (h_dim1 << 1)] = workd[iwork[9] + iwork[12] - 1];
3939 if (iwork[12] == 1 || iwork[4] == 1) {
3940 h__[iwork[12] + h_dim1] = 0.;
3942 h__[iwork[12] + h_dim1] = *rnorm;
3949 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
3950 ipntr[1] = iwork[9];
3951 ipntr[2] = iwork[8];
3955 } else if (*bmat == 'I') {
3956 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
3963 *rnorm =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
3964 *rnorm = sqrt(fabs(*rnorm));
3965 } else if (*bmat == 'I') {
3966 *rnorm =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
3969 if (*rnorm > workd[*n * 3 + 3] * .717f) {
3975 F77_FUNC(sgemv,SGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]], &
3976 c__1, &c_b42, &workd[iwork[9]], &c__1);
3978 F77_FUNC(sgemv,SGEMV)("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
3979 c__1, &c_b18, &resid[1], &c__1);
3981 if (iwork[12] == 1 || iwork[4] == 1) {
3982 h__[iwork[12] + h_dim1] = 0.;
3984 h__[iwork[12] + (h_dim1 << 1)] += workd[iwork[9] + iwork[12] - 1];
3988 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
3989 ipntr[1] = iwork[9];
3990 ipntr[2] = iwork[8];
3994 } else if (*bmat == 'I') {
3995 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
4001 workd[*n * 3 + 2] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &
4003 workd[*n * 3 + 2] = sqrt(fabs(workd[*n * 3 + 2]));
4004 } else if (*bmat == 'I') {
4005 workd[*n * 3 + 2] =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
4009 if (workd[*n * 3 + 2] > *rnorm * .717f) {
4011 *rnorm = workd[*n * 3 + 2];
4015 *rnorm = workd[*n * 3 + 2];
4017 if (iwork[1] <= 1) {
4022 for (jj = 1; jj <= i__1; ++jj) {
4033 if (h__[iwork[12] + h_dim1] < 0.) {
4034 h__[iwork[12] + h_dim1] = -h__[iwork[12] + h_dim1];
4035 if (iwork[12] < *k + *np) {
4036 F77_FUNC(sscal,SSCAL)(n, &c_b50, &v[(iwork[12] + 1) * v_dim1 + 1], &c__1);
4038 F77_FUNC(sscal,SSCAL)(n, &c_b50, &resid[1], &c__1);
4043 if (iwork[12] > *k + *np) {
4062 F77_FUNC(ssaup2,SSAUP2)(int * ido,
4092 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
4111 v_offset = 1 + v_dim1;
4114 h_offset = 1 + h_dim1;
4117 q_offset = 1 + q_dim1;
4121 eps23 = GMX_FLOAT_EPS;
4122 eps23 = pow(eps23, c_b3);
4134 iwork[7] = iwork[9] + iwork[10];
4152 if (iwork[2] == 1) {
4153 F77_FUNC(sgetv0,SGETV0)(ido, bmat, &c__1, &iwork[3], n, &c__1, &v[v_offset], ldv, &
4154 resid[1], &workd[*n * 3 + 1], &ipntr[1], &workd[1], &iwork[41]
4161 if (workd[*n * 3 + 1] == 0.) {
4170 if (iwork[4] == 1) {
4174 if (iwork[5] == 1) {
4178 if (iwork[1] == 1) {
4182 F77_FUNC(ssaitr,SSAITR)(ido, bmat, n, &c__0, &iwork[9], mode, &resid[1], &workd[*n * 3 +
4183 1], &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
4207 F77_FUNC(ssaitr,SSAITR)(ido, bmat, n, nev, np, mode, &resid[1], &workd[*n * 3 + 1], &v[
4208 v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1], &iwork[
4224 F77_FUNC(sseigt,SSEIGT)(&workd[*n * 3 + 1], &iwork[7], &h__[h_offset], ldh, &ritz[1], &
4225 bounds[1], &workl[1], &ierr);
4232 F77_FUNC(scopy,SCOPY)(&iwork[7], &ritz[1], &c__1, &workl[iwork[7] + 1], &c__1);
4233 F77_FUNC(scopy,SCOPY)(&iwork[7], &bounds[1], &c__1, &workl[(iwork[7] << 1) + 1], &c__1);
4237 F77_FUNC(ssgets,SSGETS)(ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
4239 F77_FUNC(scopy,SCOPY)(nev, &bounds[*np + 1], &c__1, &workl[*np + 1], &c__1);
4240 F77_FUNC(ssconv,SSCONV)(nev, &ritz[*np + 1], &workl[*np + 1], tol, &iwork[8]);
4245 for (j = 1; j <= i__1; ++j) {
4246 if (bounds[j] == 0.) {
4252 if (iwork[8] >= iwork[9] || iwork[6] > *mxiter || *np == 0) {
4254 if (!strncmp(which, "BE", 2)) {
4256 strncpy(wprime, "SA",2);
4257 F77_FUNC(ssortr,SSORTR)(wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
4259 nevm2 = *nev - nevd2;
4261 i__1 = (nevd2 < *np) ? nevd2 : *np;
4262 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np + 1;
4263 F77_FUNC(sswap,SSWAP)(&i__1, &ritz[nevm2 + 1], &c__1,
4264 &ritz[((i__2>i__3) ? i__2 : i__3)],
4266 i__1 = (nevd2 < *np) ? nevd2 : *np;
4267 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np;
4268 F77_FUNC(sswap,SSWAP)(&i__1, &bounds[nevm2 + 1], &c__1,
4269 &bounds[((i__2>i__3) ? i__2 : i__3) + 1],
4275 if (!strncmp(which, "LM", 2)) {
4276 strncpy(wprime, "SM", 2);
4278 if (!strncmp(which, "SM", 2)) {
4279 strncpy(wprime, "LM", 2);
4281 if (!strncmp(which, "LA", 2)) {
4282 strncpy(wprime, "SA", 2);
4284 if (!strncmp(which, "SA", 2)) {
4285 strncpy(wprime, "LA", 2);
4288 F77_FUNC(ssortr,SSORTR)(wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
4293 for (j = 1; j <= i__1; ++j) {
4295 d__3 = fabs(ritz[j]);
4296 temp = (d__2>d__3) ? d__2 : d__3;
4300 strncpy(wprime, "LA",2);
4301 F77_FUNC(ssortr,SSORTR)(wprime, &c__1, &iwork[9], &bounds[1], &ritz[1]);
4304 for (j = 1; j <= i__1; ++j) {
4306 d__3 = fabs(ritz[j]);
4307 temp = (d__2>d__3) ? d__2 : d__3;
4311 if (!strncmp(which, "BE", 2)) {
4313 strncpy(wprime, "LA", 2);
4314 F77_FUNC(ssortr,SSORTR)(wprime, &c__1, &iwork[8], &ritz[1], &bounds[1]);
4317 F77_FUNC(ssortr,SSORTR)(which, &c__1, &iwork[8], &ritz[1], &bounds[1]);
4321 h__[h_dim1 + 1] = workd[*n * 3 + 1];
4324 if (iwork[6] > *mxiter && iwork[8] < *nev) {
4327 if (*np == 0 && iwork[8] < iwork[9]) {
4334 } else if (iwork[8] < *nev && *ishift == 1) {
4336 i__1 = iwork[8], i__2 = *np / 2;
4337 *nev += (i__1 < i__2) ? i__1 : i__2;
4338 if (*nev == 1 && iwork[7] >= 6) {
4339 *nev = iwork[7] / 2;
4340 } else if (*nev == 1 && iwork[7] > 2) {
4343 *np = iwork[7] - *nev;
4346 if (nevbef < *nev) {
4347 F77_FUNC(ssgets,SSGETS)(ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
4365 F77_FUNC(scopy,SCOPY)(np, &workl[1], &c__1, &ritz[1], &c__1);
4368 F77_FUNC(ssapps,SSAPPS)(n, nev, np, &ritz[1], &v[v_offset], ldv, &h__[h_offset], ldh, &
4369 resid[1], &q[q_offset], ldq, &workd[1]);
4373 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[*n + 1], &c__1);
4379 } else if (*bmat == 'I') {
4380 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
4386 workd[*n * 3 + 1] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
4387 workd[*n * 3 + 1] = sqrt(fabs(workd[*n * 3 + 1]));
4388 } else if (*bmat == 'I') {
4389 workd[*n * 3 + 1] =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
4411 F77_FUNC(ssaupd,SSAUPD)(int * ido,
4429 int v_dim1, v_offset, i__1, i__2;
4435 v_offset = 1 + v_dim1;
4446 iwork[5] = iparam[1];
4447 iwork[10] = iparam[3];
4448 iwork[12] = iparam[4];
4451 iwork[11] = iparam[7];
4456 } else if (*nev <= 0) {
4458 } else if (*ncv <= *nev || *ncv > *n) {
4463 iwork[15] = *ncv - *nev;
4465 if (iwork[10] <= 0) {
4468 if (strncmp(which,"LM",2) && strncmp(which,"SM",2) &&
4469 strncmp(which,"LA",2) && strncmp(which,"SA",2) &&
4470 strncmp(which,"BE",2)) {
4473 if (*bmat != 'I' && *bmat != 'G') {
4478 if (*lworkl < i__1 * i__1 + (*ncv << 3)) {
4481 if (iwork[11] < 1 || iwork[11] > 5) {
4483 } else if (iwork[11] == 1 && *bmat == 'G') {
4485 } else if (iwork[5] < 0 || iwork[5] > 1) {
4487 } else if (*nev == 1 && !strncmp(which, "BE", 2)) {
4491 if (iwork[2] != 0) {
4497 if (iwork[12] <= 0) {
4501 *tol = GMX_FLOAT_EPS;
4504 iwork[15] = *ncv - *nev;
4507 i__1 = i__2 * i__2 + (*ncv << 3);
4508 for (j = 1; j <= i__1; ++j) {
4515 iwork[16] = iwork[3] + (iwork[8] << 1);
4516 iwork[1] = iwork[16] + *ncv;
4517 iwork[4] = iwork[1] + *ncv;
4519 iwork[7] = iwork[4] + i__1 * i__1;
4520 iwork[14] = iwork[7] + *ncv * 3;
4522 ipntr[4] = iwork[14];
4523 ipntr[5] = iwork[3];
4524 ipntr[6] = iwork[16];
4525 ipntr[7] = iwork[1];
4526 ipntr[11] = iwork[7];
4529 F77_FUNC(ssaup2,SSAUP2)(ido, bmat, n, which, &iwork[13], &iwork[15], tol, &resid[1], &
4530 iwork[11], &iwork[6], &iwork[5], &iwork[10], &v[v_offset], ldv, &
4531 workl[iwork[3]], &iwork[8], &workl[iwork[16]], &workl[iwork[1]], &
4532 workl[iwork[4]], &iwork[9], &workl[iwork[7]], &ipntr[1], &workd[1]
4533 , &iwork[21], info);
4536 iparam[8] = iwork[15];
4542 iparam[3] = iwork[10];
4543 iparam[5] = iwork[15];
4561 F77_FUNC(sseupd,SSEUPD)(int * rvec,
4562 const char * howmny,
4587 int v_dim1, v_offset, z_dim1, z_offset, i__1;
4588 float d__1, d__2, d__3;
4590 int j, k, ih, iq, iw, ibd, ihb, ihd, ldh, ilg, ldq, ism, irz;
4602 float thres1=0, thres2=0;
4606 int leftptr, rghtptr;
4612 z_offset = 1 + z_dim1;
4617 v_offset = 1 + v_dim1;
4641 if (*ncv <= *nev || *ncv > *n) {
4644 if (strncmp(which,"LM",2) && strncmp(which,"SM",2) &&
4645 strncmp(which,"LA",2) && strncmp(which,"SA",2) &&
4646 strncmp(which,"BE",2)) {
4649 if (*bmat != 'I' && *bmat != 'G') {
4652 if (*howmny != 'A' && *howmny != 'P' &&
4653 *howmny != 'S' && *rvec) {
4656 if (*rvec && *howmny == 'S') {
4660 if (*rvec && *lworkl < i__1 * i__1 + (*ncv << 3)) {
4664 if (mode == 1 || mode == 2) {
4665 strncpy(type__, "REGULR",6);
4666 } else if (mode == 3) {
4667 strncpy(type__, "SHIFTI",6);
4668 } else if (mode == 4) {
4669 strncpy(type__, "BUCKLE",6);
4670 } else if (mode == 5) {
4671 strncpy(type__, "CAYLEY",6);
4675 if (mode == 1 && *bmat == 'G') {
4678 if (*nev == 1 && !strncmp(which, "BE",2)) {
4695 iw = iq + ldh * *ncv;
4696 next = iw + (*ncv << 1);
4702 irz = ipntr[11] + *ncv;
4706 eps23 = GMX_FLOAT_EPS;
4707 eps23 = pow(eps23, c_b21);
4712 } else if (*bmat == 'G') {
4713 bnorm2 =F77_FUNC(snrm2,SNRM2)(n, &workd[1], &c__1);
4718 if (!strncmp(which,"LM",2) || !strncmp(which,"SM",2) ||
4719 !strncmp(which,"LA",2) || !strncmp(which,"SA",2)) {
4721 } else if (!strncmp(which,"BE",2)) {
4724 ism = (*nev>nconv) ? *nev : nconv;
4727 thres1 = workl[ism];
4728 thres2 = workl[ilg];
4736 for (j = 0; j <= i__1; ++j) {
4738 if (!strncmp(which,"LM",2)) {
4739 if (fabs(workl[irz + j]) >= fabs(thres1)) {
4741 d__3 = fabs(workl[irz + j]);
4742 tempbnd = (d__2>d__3) ? d__2 : d__3;
4743 if (workl[ibd + j] <= *tol * tempbnd) {
4747 } else if (!strncmp(which,"SM",2)) {
4748 if (fabs(workl[irz + j]) <= fabs(thres1)) {
4750 d__3 = fabs(workl[irz + j]);
4751 tempbnd = (d__2>d__3) ? d__2 : d__3;
4752 if (workl[ibd + j] <= *tol * tempbnd) {
4756 } else if (!strncmp(which,"LA",2)) {
4757 if (workl[irz + j] >= thres1) {
4759 d__3 = fabs(workl[irz + j]);
4760 tempbnd = (d__2>d__3) ? d__2 : d__3;
4761 if (workl[ibd + j] <= *tol * tempbnd) {
4765 } else if (!strncmp(which,"SA",2)) {
4766 if (workl[irz + j] <= thres1) {
4768 d__3 = fabs(workl[irz + j]);
4769 tempbnd = (d__2>d__3) ? d__2 : d__3;
4770 if (workl[ibd + j] <= *tol * tempbnd) {
4774 } else if (!strncmp(which,"BE",2)) {
4775 if (workl[irz + j] <= thres1 || workl[irz + j] >= thres2) {
4777 d__3 = fabs(workl[irz + j]);
4778 tempbnd = (d__2>d__3) ? d__2 : d__3;
4779 if (workl[ibd + j] <= *tol * tempbnd) {
4784 if (j + 1 > nconv) {
4785 reord = select[j + 1] || reord;
4787 if (select[j + 1]) {
4793 F77_FUNC(scopy,SCOPY)(&i__1, &workl[ih + 1], &c__1, &workl[ihb], &c__1);
4794 F77_FUNC(scopy,SCOPY)(ncv, &workl[ih + ldh], &c__1, &workl[ihd], &c__1);
4796 F77_FUNC(ssteqr,SSTEQR)("Identity", ncv, &workl[ihd], &workl[ihb], &workl[iq], &ldq, &
4815 if (select[leftptr]) {
4819 } else if (! select[rghtptr]) {
4825 temp = workl[ihd + leftptr - 1];
4826 workl[ihd + leftptr - 1] = workl[ihd + rghtptr - 1];
4827 workl[ihd + rghtptr - 1] = temp;
4828 F77_FUNC(scopy,SCOPY)(ncv, &workl[iq + *ncv * (leftptr - 1)], &c__1, &workl[
4830 F77_FUNC(scopy,SCOPY)(ncv, &workl[iq + *ncv * (rghtptr - 1)], &c__1, &workl[
4831 iq + *ncv * (leftptr - 1)], &c__1);
4832 F77_FUNC(scopy,SCOPY)(ncv, &workl[iw], &c__1, &workl[iq + *ncv * (rghtptr -
4839 if (leftptr < rghtptr) {
4847 F77_FUNC(scopy,SCOPY)(&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
4851 F77_FUNC(scopy,SCOPY)(&nconv, &workl[ritz], &c__1, &d__[1], &c__1);
4852 F77_FUNC(scopy,SCOPY)(ncv, &workl[ritz], &c__1, &workl[ihd], &c__1);
4855 if (!strncmp(type__, "REGULR",6)) {
4858 F77_FUNC(ssesrt,SSESRT)("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
4860 F77_FUNC(scopy,SCOPY)(ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
4865 F77_FUNC(scopy,SCOPY)(ncv, &workl[ihd], &c__1, &workl[iw], &c__1);
4866 if (!strncmp(type__, "SHIFTI", 6)) {
4868 for (k = 1; k <= i__1; ++k) {
4869 workl[ihd + k - 1] = 1. / workl[ihd + k - 1] + *sigma;
4871 } else if (!strncmp(type__, "BUCKLE",6)) {
4873 for (k = 1; k <= i__1; ++k) {
4874 workl[ihd + k - 1] = *sigma * workl[ihd + k - 1] / (workl[ihd
4877 } else if (!strncmp(type__, "CAYLEY",6)) {
4879 for (k = 1; k <= i__1; ++k) {
4880 workl[ihd + k - 1] = *sigma * (workl[ihd + k - 1] + 1.) / (
4881 workl[ihd + k - 1] - 1.);
4885 F77_FUNC(scopy,SCOPY)(&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
4886 F77_FUNC(ssortr,SSORTR)("LA", &c__1, &nconv, &workl[ihd], &workl[iw]);
4888 F77_FUNC(ssesrt,SSESRT)("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
4890 F77_FUNC(scopy,SCOPY)(ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
4891 d__1 = bnorm2 / rnorm;
4892 F77_FUNC(sscal,SSCAL)(ncv, &d__1, &workl[ihb], &c__1);
4893 F77_FUNC(ssortr,SSORTR)("LA", &c__1, &nconv, &d__[1], &workl[ihb]);
4898 if (*rvec && *howmny == 'A') {
4900 F77_FUNC(sgeqr2,SGEQR2)(ncv, &nconv, &workl[iq], &ldq, &workl[iw + *ncv], &workl[ihb],
4903 F77_FUNC(sorm2r,SORM2R)("Right", "Notranspose", n, ncv, &nconv, &workl[iq], &ldq, &
4904 workl[iw + *ncv], &v[v_offset], ldv, &workd[*n + 1], &ierr);
4905 F77_FUNC(slacpy,SLACPY)("All", n, &nconv, &v[v_offset], ldv, &z__[z_offset], ldz);
4908 for (j = 1; j <= i__1; ++j) {
4909 workl[ihb + j - 1] = 0.;
4911 workl[ihb + *ncv - 1] = 1.;
4912 F77_FUNC(sorm2r,SORM2R)("Left", "Transpose", ncv, &c__1, &nconv, &workl[iq], &ldq, &
4913 workl[iw + *ncv], &workl[ihb], ncv, &temp, &ierr);
4915 } else if (*rvec && *howmny == 'S') {
4919 if (!strncmp(type__, "REGULR",6) && *rvec) {
4922 for (j = 1; j <= i__1; ++j) {
4923 workl[ihb + j - 1] = rnorm * fabs(workl[ihb + j - 1]);
4926 } else if (strncmp(type__, "REGULR",6) && *rvec) {
4928 F77_FUNC(sscal,SSCAL)(ncv, &bnorm2, &workl[ihb], &c__1);
4929 if (!strncmp(type__, "SHIFTI",6)) {
4932 for (k = 1; k <= i__1; ++k) {
4933 d__2 = workl[iw + k - 1];
4934 workl[ihb + k - 1] = fabs(workl[ihb + k - 1])/(d__2 * d__2);
4937 } else if (!strncmp(type__, "BUCKLE",6)) {
4940 for (k = 1; k <= i__1; ++k) {
4941 d__2 = workl[iw + k - 1] - 1.;
4942 workl[ihb + k - 1] = *sigma * fabs(workl[ihb + k - 1])/(d__2 * d__2);
4945 } else if (!strncmp(type__, "CAYLEY",6)) {
4948 for (k = 1; k <= i__1; ++k) {
4949 workl[ihb + k - 1] = fabs(workl[ihb + k - 1] / workl[iw + k - 1] * (workl[iw + k - 1] - 1.));
4957 if (*rvec && (!strncmp(type__, "SHIFTI",6) || !strncmp(type__, "CAYLEY",6))) {
4960 for (k = 0; k <= i__1; ++k) {
4961 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / workl[iw + k];
4964 } else if (*rvec && !strncmp(type__, "BUCKLE", 6)) {
4967 for (k = 0; k <= i__1; ++k) {
4968 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / (workl[iw + k] -
4974 if (strncmp(type__, "REGULR",6)) {
4975 F77_FUNC(sger,SGER)(n, &nconv, &c_b102, &resid[1], &c__1, &workl[iw], &c__1, &z__[