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, 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"
75 /* Default Fortran name mangling */
77 #define F77_FUNC(name,NAME) name ## _
83 F77_FUNC(dstqrb,DSTQRB)(int * n,
99 int l1, ii, mm, lm1, mm1, nm1;
100 double rt1, rt2, eps;
103 int lend, jtot, lendm1, lendp1, iscale;
105 int lendsv, nmaxit, icompz;
106 double ssfmax, ssfmin,safmin,minval,safmax,anorm;
129 eps = GMX_DOUBLE_EPS;
133 minval = GMX_DOUBLE_MIN;
134 safmin = minval / GMX_DOUBLE_EPS;
135 safmax = 1. / safmin;
136 ssfmax = sqrt(safmax) / 3.;
137 ssfmin = sqrt(safmin) / eps2;
141 for (j = 1; j <= i__1; ++j) {
163 for (m = l1; m <= i__1; ++m) {
168 if (tst <= sqrt(fabs(d__[m])) * sqrt(fabs(d__[m+1])) * eps) {
187 anorm =F77_FUNC(dlanst,DLANST)("i", &i__1, &d__[l], &e[l]);
192 if (anorm > ssfmax) {
195 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n,
198 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n,
200 } else if (anorm < ssfmin) {
203 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n,
206 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n,
210 if (fabs(d__[lend]) < fabs(d__[l])) {
221 for (m = l; m <= i__1; ++m) {
224 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m + 1]) + safmin) {
243 F77_FUNC(dlaev2,DLAEV2)(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s);
245 work[*n - 1 + l] = s;
248 z__[l + 1] = c__ * tst - s * z__[l];
249 z__[l] = s * tst + c__ * z__[l];
251 F77_FUNC(dlae2,DLAE2)(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2);
263 if (jtot == nmaxit) {
268 g = (d__[l + 1] - p) / (e[l] * 2.);
269 r__ =F77_FUNC(dlapy2,DLAPY2)(&g, &c_b31);
270 g = d__[m] - p + e[l] / (g + ((g>0) ? r__ : -r__ ));
278 for (i__ = mm1; i__ >= i__1; --i__) {
281 F77_FUNC(dlartg,DLARTG)(&g, &f, &c__, &s, &r__);
285 g = d__[i__ + 1] - p;
286 r__ = (d__[i__] - g) * s + c__ * 2. * b;
288 d__[i__ + 1] = g + p;
293 work[*n - 1 + i__] = -s;
301 F77_FUNC(dlasr,DLASR)("r", "v", "b", &c__1, &mm, &work[l], &work[*n - 1 + l], &
324 for (m = l; m >= i__1; --m) {
325 d__2 = fabs(e[m - 1]);
327 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m- 1]) + safmin) {
346 F77_FUNC(dlaev2,DLAEV2)(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s)
350 z__[l] = c__ * tst - s * z__[l - 1];
351 z__[l - 1] = s * tst + c__ * z__[l - 1];
353 F77_FUNC(dlae2,DLAE2)(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2);
365 if (jtot == nmaxit) {
371 g = (d__[l - 1] - p) / (e[l - 1] * 2.);
372 r__ =F77_FUNC(dlapy2,DLAPY2)(&g, &c_b31);
373 g = d__[m] - p + e[l - 1] / (g + ((g>0) ? r__ : -r__ ));
381 for (i__ = m; i__ <= i__1; ++i__) {
384 F77_FUNC(dlartg,DLARTG)(&g, &f, &c__, &s, &r__);
389 r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b;
396 work[*n - 1 + i__] = s;
404 F77_FUNC(dlasr,DLASR)("r", "v", "f", &c__1, &mm, &work[m], &work[*n - 1 + m], &
425 i__1 = lendsv - lsv + 1;
426 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv],
429 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n,
431 } else if (iscale == 2) {
432 i__1 = lendsv - lsv + 1;
433 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv],
436 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n,
444 for (i__ = 1; i__ <= i__1; ++i__) {
454 F77_FUNC(dlasrt,DLASRT)("i", n, &d__[1], info);
459 for (ii = 2; ii <= i__1; ++ii) {
464 for (j = ii; j <= i__2; ++j) {
487 F77_FUNC(dgetv0,DGETV0)(int * ido,
506 int v_dim1, v_offset, i__1;
514 v_offset = 1 + v_dim1;
528 F77_FUNC(dlarnv,DLARNV)(&idist, &iwork[1], n, &resid[1]);
534 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
550 F77_FUNC(dcopy,DCOPY)(n, &workd[*n + 1], &c__1, &resid[1], &c__1);
555 } else if (*bmat == 'I') {
556 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
564 workd[*n * 3 + 4] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
565 workd[*n * 3 + 4] = sqrt(fabs(workd[*n * 3 + 4]));
566 } else if (*bmat == 'I') {
567 workd[*n * 3 + 4] =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
569 *rnorm = workd[*n * 3 + 4];
578 F77_FUNC(dgemv,DGEMV)("T", n, &i__1, &c_b22, &v[v_offset], ldv, &workd[1], &c__1, &c_b24,
579 &workd[*n + 1], &c__1);
581 F77_FUNC(dgemv,DGEMV)("N", n, &i__1, &c_b27, &v[v_offset], ldv, &workd[*n + 1], &c__1, &
582 c_b22, &resid[1], &c__1);
585 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[*n + 1], &c__1);
590 } else if (*bmat == 'I') {
591 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
597 *rnorm =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
598 *rnorm = sqrt(fabs(*rnorm));
599 } else if (*bmat == 'I') {
600 *rnorm =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
603 if (*rnorm > workd[*n * 3 + 4] * .717f) {
610 workd[*n * 3 + 4] = *rnorm;
615 for (jj = 1; jj <= i__1; ++jj) {
635 F77_FUNC(dsapps,DSAPPS)(int * n,
652 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
656 double r__, s, a1, a2, a3, a4;
667 v_offset = 1 + v_dim1;
670 h_offset = 1 + h_dim1;
673 q_offset = 1 + q_dim1;
676 epsmch = GMX_DOUBLE_EPS;
682 F77_FUNC(dlaset,DLASET)("All", &kplusp, &kplusp, &c_b4, &c_b5, &q[q_offset], ldq);
689 for (jj = 1; jj <= i__1; ++jj) {
696 for (i__ = istart; i__ <= i__2; ++i__) {
697 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__ + 1 + (h_dim1*2)]);
698 if (h__[i__ + 1 + h_dim1] <= epsmch * big) {
699 h__[i__ + 1 + h_dim1] = 0.;
709 f = h__[istart + (h_dim1 << 1)] - shift[jj];
710 g = h__[istart + 1 + h_dim1];
711 F77_FUNC(dlartg,DLARTG)(&f, &g, &c__, &s, &r__);
713 a1 = c__ * h__[istart + (h_dim1 << 1)] + s * h__[istart + 1 +
715 a2 = c__ * h__[istart + 1 + h_dim1] + s * h__[istart + 1 + (
717 a4 = c__ * h__[istart + 1 + (h_dim1 << 1)] - s * h__[istart + 1 +
719 a3 = c__ * h__[istart + 1 + h_dim1] - s * h__[istart + (h_dim1 <<
721 h__[istart + (h_dim1 << 1)] = c__ * a1 + s * a2;
722 h__[istart + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
723 h__[istart + 1 + h_dim1] = c__ * a3 + s * a4;
726 i__2 = (i__3<kplusp) ? i__3 : kplusp;
727 for (j = 1; j <= i__2; ++j) {
728 a1 = c__ * q[j + istart * q_dim1] + s * q[j + (istart + 1) *
730 q[j + (istart + 1) * q_dim1] = -s * q[j + istart * q_dim1] +
731 c__ * q[j + (istart + 1) * q_dim1];
732 q[j + istart * q_dim1] = a1;
737 for (i__ = istart + 1; i__ <= i__2; ++i__) {
739 f = h__[i__ + h_dim1];
740 g = s * h__[i__ + 1 + h_dim1];
742 h__[i__ + 1 + h_dim1] = c__ * h__[i__ + 1 + h_dim1];
743 F77_FUNC(dlartg,DLARTG)(&f, &g, &c__, &s, &r__);
751 h__[i__ + h_dim1] = r__;
753 a1 = c__ * h__[i__ + (h_dim1 << 1)] + s * h__[i__ + 1 +
755 a2 = c__ * h__[i__ + 1 + h_dim1] + s * h__[i__ + 1 + (h_dim1
757 a3 = c__ * h__[i__ + 1 + h_dim1] - s * h__[i__ + (h_dim1 << 1)
759 a4 = c__ * h__[i__ + 1 + (h_dim1 << 1)] - s * h__[i__ + 1 +
762 h__[i__ + (h_dim1 << 1)] = c__ * a1 + s * a2;
763 h__[i__ + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
764 h__[i__ + 1 + h_dim1] = c__ * a3 + s * a4;
767 i__3 = (i__4<kplusp) ? i__4 : kplusp;
768 for (j = 1; j <= i__3; ++j) {
769 a1 = c__ * q[j + i__ * q_dim1] + s * q[j + (i__ + 1) *
771 q[j + (i__ + 1) * q_dim1] = -s * q[j + i__ * q_dim1] +
772 c__ * q[j + (i__ + 1) * q_dim1];
773 q[j + i__ * q_dim1] = a1;
782 if (h__[iend + h_dim1] < 0.) {
783 h__[iend + h_dim1] = -h__[iend + h_dim1];
784 F77_FUNC(dscal,DSCAL)(&kplusp, &c_b14, &q[iend * q_dim1 + 1], &c__1);
792 for (i__ = itop; i__ <= i__2; ++i__) {
793 if (h__[i__ + 1 + h_dim1] > 0.) {
804 for (i__ = itop; i__ <= i__1; ++i__) {
805 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__+ 1 + (h_dim1*2)]);
806 if (h__[i__ + 1 + h_dim1] <= epsmch * big) {
807 h__[i__ + 1 + h_dim1] = 0.;
812 if (h__[*kev + 1 + h_dim1] > 0.) {
813 F77_FUNC(dgemv,DGEMV)("N", n, &kplusp, &c_b5, &v[v_offset], ldv, &q[(*kev + 1) *
814 q_dim1 + 1], &c__1, &c_b4, &workd[*n + 1], &c__1);
818 for (i__ = 1; i__ <= i__1; ++i__) {
819 i__2 = kplusp - i__ + 1;
820 F77_FUNC(dgemv,DGEMV)("N", n, &i__2, &c_b5, &v[v_offset], ldv, &q[(*kev - i__ + 1) *
821 q_dim1 + 1], &c__1, &c_b4, &workd[1], &c__1);
822 F77_FUNC(dcopy,DCOPY)(n, &workd[1], &c__1, &v[(kplusp - i__ + 1) * v_dim1 + 1], &
827 F77_FUNC(dlacpy,DLACPY)("All", n, kev, &v[(*np + 1) * v_dim1 + 1], ldv, &v[v_offset], ldv);
829 if (h__[*kev + 1 + h_dim1] > 0.) {
830 F77_FUNC(dcopy,DCOPY)(n, &workd[*n + 1], &c__1, &v[(*kev + 1) * v_dim1 + 1], &c__1);
833 F77_FUNC(dscal,DSCAL)(n, &q[kplusp + *kev * q_dim1], &resid[1], &c__1);
834 if (h__[*kev + 1 + h_dim1] > 0.) {
835 F77_FUNC(daxpy,DAXPY)(n, &h__[*kev + 1 + h_dim1], &v[(*kev + 1) * v_dim1 + 1], &c__1,
849 F77_FUNC(dsortr,DSORTR)(const char * which,
864 if (!strncmp(which, "SA", 2)) {
871 for (i__ = igap; i__ <= i__1; ++i__) {
879 if (x1[j] < x1[j + igap]) {
881 x1[j] = x1[j + igap];
885 x2[j] = x2[j + igap];
899 } else if (!strncmp(which, "SM", 2)) {
906 for (i__ = igap; i__ <= i__1; ++i__) {
914 if (fabs(x1[j]) < fabs(x1[j + igap])) {
916 x1[j] = x1[j + igap];
920 x2[j] = x2[j + igap];
934 } else if (!strncmp(which, "LA", 2)) {
941 for (i__ = igap; i__ <= i__1; ++i__) {
949 if (x1[j] > x1[j + igap]) {
951 x1[j] = x1[j + igap];
955 x2[j] = x2[j + igap];
969 } else if (!strncmp(which, "LM", 2)) {
977 for (i__ = igap; i__ <= i__1; ++i__) {
985 if (fabs(x1[j]) > fabs(x1[j + igap])) {
987 x1[j] = x1[j + igap];
991 x2[j] = x2[j + igap];
1015 F77_FUNC(dsesrt,DSESRT)(const char * which,
1023 int a_dim1, a_offset, i__1;
1030 a_offset = 1 + a_dim1 * 0;
1035 if (!strncmp(which, "SA", 2)) {
1042 for (i__ = igap; i__ <= i__1; ++i__) {
1050 if (x[j] < x[j + igap]) {
1055 F77_FUNC(dswap,DSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1056 a_dim1 + 1], &c__1);
1069 } else if (!strncmp(which, "SM", 2)) {
1076 for (i__ = igap; i__ <= i__1; ++i__) {
1084 if (fabs(x[j]) < fabs(x[j + igap])) {
1089 F77_FUNC(dswap,DSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1090 a_dim1 + 1], &c__1);
1103 } else if (!strncmp(which, "LA", 2)) {
1110 for (i__ = igap; i__ <= i__1; ++i__) {
1118 if (x[j] > x[j + igap]) {
1123 F77_FUNC(dswap,DSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1124 a_dim1 + 1], &c__1);
1137 } else if (!strncmp(which, "LM", 2)) {
1144 for (i__ = igap; i__ <= i__1; ++i__) {
1152 if (fabs(x[j]) > fabs(x[j + igap])) {
1157 F77_FUNC(dswap,DSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1158 a_dim1 + 1], &c__1);
1181 F77_FUNC(dsgets,DSGETS)(int * ishift,
1197 if (!strncmp(which, "BE", 2)) {
1199 F77_FUNC(dsortr,DSORTR)("LA", &c__1, &i__1, &ritz[1], &bounds[1]);
1202 i__1 = (kevd2<*np) ? kevd2 : *np;
1203 i__2 = (kevd2>*np) ? kevd2 : *np;
1204 F77_FUNC(dswap,DSWAP)(&i__1, &ritz[1], &c__1,
1205 &ritz[i__2 + 1], &c__1);
1206 i__1 = (kevd2<*np) ? kevd2 : *np;
1207 i__2 = (kevd2>*np) ? kevd2 : *np;
1208 F77_FUNC(dswap,DSWAP)(&i__1, &bounds[1], &c__1,
1209 &bounds[i__2 + 1], &c__1);
1214 F77_FUNC(dsortr,DSORTR)(which, &c__1, &i__1, &ritz[1], &bounds[1]);
1217 if (*ishift == 1 && *np > 0) {
1219 F77_FUNC(dsortr,DSORTR)("SM", &c__1, np, &bounds[1], &ritz[1]);
1220 F77_FUNC(dcopy,DCOPY)(np, &ritz[1], &c__1, &shifts[1], &c__1);
1230 F77_FUNC(dsconv,DSCONV)(int * n,
1246 eps23 = GMX_DOUBLE_EPS;
1247 eps23 = pow(eps23, c_b3);
1251 for (i__ = 1; i__ <= i__1; ++i__) {
1254 d__3 = fabs(ritz[i__]);
1255 temp = (d__2 > d__3) ? d__2 : d__3;
1256 if (bounds[i__] <= *tol * temp) {
1266 F77_FUNC(dseigt,DSEIGT)(double * rnorm,
1276 int h_dim1, h_offset, i__1;
1285 h_offset = 1 + h_dim1;
1288 F77_FUNC(dcopy,DCOPY)(n, &h__[(h_dim1 << 1) + 1], &c__1, &eig[1], &c__1);
1290 F77_FUNC(dcopy,DCOPY)(&i__1, &h__[h_dim1 + 2], &c__1, &workl[1], &c__1);
1291 F77_FUNC(dstqrb,DSTQRB)(n, &eig[1], &workl[1], &bounds[1], &workl[*n + 1], ierr);
1297 for (k = 1; k <= i__1; ++k) {
1298 bounds[k] = *rnorm * fabs(bounds[k]);
1311 F77_FUNC(dsaitr,DSAITR)(int * ido,
1335 int h_dim1, h_offset, v_dim1, v_offset, i__1;
1339 double safmin,minval;
1345 v_offset = 1 + v_dim1;
1348 h_offset = 1 + h_dim1;
1352 minval = GMX_DOUBLE_MIN;
1353 safmin = minval / GMX_DOUBLE_EPS;
1366 iwork[9] = iwork[8] + *n;
1367 iwork[10] = iwork[9] + *n;
1370 if (iwork[5] == 1) {
1373 if (iwork[6] == 1) {
1376 if (iwork[2] == 1) {
1379 if (iwork[3] == 1) {
1382 if (iwork[4] == 1) {
1399 F77_FUNC(dgetv0,DGETV0)(ido, bmat, &iwork[11], &c__0, n, &iwork[12], &v[v_offset], ldv,
1400 &resid[1], rnorm, &ipntr[1], &workd[1], &iwork[21], &iwork[7]);
1406 if (iwork[11] <= 3) {
1410 *info = iwork[12] - 1;
1417 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &v[iwork[12] * v_dim1 + 1], &c__1);
1418 if (*rnorm >= safmin) {
1419 temp1 = 1. / *rnorm;
1420 F77_FUNC(dscal,DSCAL)(n, &temp1, &v[iwork[12] * v_dim1 + 1], &c__1);
1421 F77_FUNC(dscal,DSCAL)(n, &temp1, &workd[iwork[8]], &c__1);
1424 F77_FUNC(dlascl,DLASCL)("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &v[iwork[12] *
1425 v_dim1 + 1], n, &infol);
1426 F77_FUNC(dlascl,DLASCL)("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &workd[iwork[
1431 F77_FUNC(dcopy,DCOPY)(n, &v[iwork[12] * v_dim1 + 1], &c__1, &workd[iwork[10]], &c__1);
1432 ipntr[1] = iwork[10];
1433 ipntr[2] = iwork[9];
1434 ipntr[3] = iwork[8];
1443 F77_FUNC(dcopy,DCOPY)(n, &workd[iwork[9]], &c__1, &resid[1], &c__1);
1450 ipntr[1] = iwork[9];
1451 ipntr[2] = iwork[8];
1455 } else if (*bmat == 'I') {
1456 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1465 workd[*n * 3 + 3] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[iwork[10]], &
1467 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
1468 } else if (*bmat == 'G') {
1469 workd[*n * 3 + 3] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &
1471 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
1472 } else if (*bmat == 'I') {
1473 workd[*n * 3 + 3] =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
1477 F77_FUNC(dgemv,DGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]]
1478 , &c__1, &c_b42, &workd[iwork[9]], &c__1);
1479 } else if (*mode == 2) {
1480 F77_FUNC(dgemv,DGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[10]
1481 ], &c__1, &c_b42, &workd[iwork[9]], &c__1);
1484 F77_FUNC(dgemv,DGEMV)("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
1485 c__1, &c_b18, &resid[1], &c__1);
1487 h__[iwork[12] + (h_dim1 << 1)] = workd[iwork[9] + iwork[12] - 1];
1488 if (iwork[12] == 1 || iwork[4] == 1) {
1489 h__[iwork[12] + h_dim1] = 0.;
1491 h__[iwork[12] + h_dim1] = *rnorm;
1498 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
1499 ipntr[1] = iwork[9];
1500 ipntr[2] = iwork[8];
1504 } else if (*bmat == 'I') {
1505 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1512 *rnorm =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1513 *rnorm = sqrt(fabs(*rnorm));
1514 } else if (*bmat == 'I') {
1515 *rnorm =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
1518 if (*rnorm > workd[*n * 3 + 3] * .717f) {
1524 F77_FUNC(dgemv,DGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]], &
1525 c__1, &c_b42, &workd[iwork[9]], &c__1);
1527 F77_FUNC(dgemv,DGEMV)("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
1528 c__1, &c_b18, &resid[1], &c__1);
1530 if (iwork[12] == 1 || iwork[4] == 1) {
1531 h__[iwork[12] + h_dim1] = 0.;
1533 h__[iwork[12] + (h_dim1 << 1)] += workd[iwork[9] + iwork[12] - 1];
1537 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
1538 ipntr[1] = iwork[9];
1539 ipntr[2] = iwork[8];
1543 } else if (*bmat == 'I') {
1544 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1550 workd[*n * 3 + 2] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &
1552 workd[*n * 3 + 2] = sqrt(fabs(workd[*n * 3 + 2]));
1553 } else if (*bmat == 'I') {
1554 workd[*n * 3 + 2] =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
1558 if (workd[*n * 3 + 2] > *rnorm * .717f) {
1560 *rnorm = workd[*n * 3 + 2];
1564 *rnorm = workd[*n * 3 + 2];
1566 if (iwork[1] <= 1) {
1571 for (jj = 1; jj <= i__1; ++jj) {
1582 if (h__[iwork[12] + h_dim1] < 0.) {
1583 h__[iwork[12] + h_dim1] = -h__[iwork[12] + h_dim1];
1584 if (iwork[12] < *k + *np) {
1585 F77_FUNC(dscal,DSCAL)(n, &c_b50, &v[(iwork[12] + 1) * v_dim1 + 1], &c__1);
1587 F77_FUNC(dscal,DSCAL)(n, &c_b50, &resid[1], &c__1);
1592 if (iwork[12] > *k + *np) {
1611 F77_FUNC(dsaup2,DSAUP2)(int * ido,
1641 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
1660 v_offset = 1 + v_dim1;
1663 h_offset = 1 + h_dim1;
1666 q_offset = 1 + q_dim1;
1670 eps23 = GMX_DOUBLE_EPS;
1671 eps23 = pow(eps23, c_b3);
1683 iwork[7] = iwork[9] + iwork[10];
1701 if (iwork[2] == 1) {
1702 F77_FUNC(dgetv0,DGETV0)(ido, bmat, &c__1, &iwork[3], n, &c__1, &v[v_offset], ldv, &
1703 resid[1], &workd[*n * 3 + 1], &ipntr[1], &workd[1], &iwork[41]
1710 if (workd[*n * 3 + 1] == 0.) {
1719 if (iwork[4] == 1) {
1723 if (iwork[5] == 1) {
1727 if (iwork[1] == 1) {
1731 F77_FUNC(dsaitr,DSAITR)(ido, bmat, n, &c__0, &iwork[9], mode, &resid[1], &workd[*n * 3 +
1732 1], &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
1756 F77_FUNC(dsaitr,DSAITR)(ido, bmat, n, nev, np, mode, &resid[1], &workd[*n * 3 + 1],
1757 &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
1773 F77_FUNC(dseigt,DSEIGT)(&workd[*n * 3 + 1], &iwork[7], &h__[h_offset], ldh, &ritz[1], &
1774 bounds[1], &workl[1], &ierr);
1781 F77_FUNC(dcopy,DCOPY)(&iwork[7], &ritz[1], &c__1, &workl[iwork[7] + 1], &c__1);
1782 F77_FUNC(dcopy,DCOPY)(&iwork[7], &bounds[1], &c__1, &workl[(iwork[7] << 1) + 1], &c__1);
1786 F77_FUNC(dsgets,DSGETS)(ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
1788 F77_FUNC(dcopy,DCOPY)(nev, &bounds[*np + 1], &c__1, &workl[*np + 1], &c__1);
1789 F77_FUNC(dsconv,DSCONV)(nev, &ritz[*np + 1], &workl[*np + 1], tol, &iwork[8]);
1793 for (j = 1; j <= i__1; ++j) {
1794 if (bounds[j] == 0.) {
1800 if (iwork[8] >= iwork[9] || iwork[6] > *mxiter || *np == 0) {
1802 if (!strncmp(which, "BE", 2)) {
1804 strncpy(wprime, "SA",2);
1805 F77_FUNC(dsortr,DSORTR)(wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
1807 nevm2 = *nev - nevd2;
1809 i__1 = (nevd2 < *np) ? nevd2 : *np;
1810 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np + 1;
1811 F77_FUNC(dswap,DSWAP)(&i__1, &ritz[nevm2 + 1], &c__1,
1812 &ritz[((i__2>i__3) ? i__2 : i__3)],
1814 i__1 = (nevd2 < *np) ? nevd2 : *np;
1815 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np;
1816 F77_FUNC(dswap,DSWAP)(&i__1, &bounds[nevm2 + 1], &c__1,
1817 &bounds[((i__2>i__3) ? i__2 : i__3) + 1],
1823 if (!strncmp(which, "LM", 2)) {
1824 strncpy(wprime, "SM", 2);
1826 if (!strncmp(which, "SM", 2)) {
1827 strncpy(wprime, "LM", 2);
1829 if (!strncmp(which, "LA", 2)) {
1830 strncpy(wprime, "SA", 2);
1832 if (!strncmp(which, "SA", 2)) {
1833 strncpy(wprime, "LA", 2);
1836 F77_FUNC(dsortr,DSORTR)(wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
1841 for (j = 1; j <= i__1; ++j) {
1843 d__3 = fabs(ritz[j]);
1844 temp = (d__2>d__3) ? d__2 : d__3;
1848 strncpy(wprime, "LA",2);
1849 F77_FUNC(dsortr,DSORTR)(wprime, &c__1, &iwork[9], &bounds[1], &ritz[1]);
1852 for (j = 1; j <= i__1; ++j) {
1854 d__3 = fabs(ritz[j]);
1855 temp = (d__2>d__3) ? d__2 : d__3;
1859 if (!strncmp(which, "BE", 2)) {
1861 strncpy(wprime, "LA", 2);
1862 F77_FUNC(dsortr,DSORTR)(wprime, &c__1, &iwork[8], &ritz[1], &bounds[1]);
1865 F77_FUNC(dsortr,DSORTR)(which, &c__1, &iwork[8], &ritz[1], &bounds[1]);
1869 h__[h_dim1 + 1] = workd[*n * 3 + 1];
1872 if (iwork[6] > *mxiter && iwork[8] < *nev) {
1875 if (*np == 0 && iwork[8] < iwork[9]) {
1882 } else if (iwork[8] < *nev && *ishift == 1) {
1884 i__1 = iwork[8], i__2 = *np / 2;
1885 *nev += (i__1 < i__2) ? i__1 : i__2;
1886 if (*nev == 1 && iwork[7] >= 6) {
1887 *nev = iwork[7] / 2;
1888 } else if (*nev == 1 && iwork[7] > 2) {
1891 *np = iwork[7] - *nev;
1894 if (nevbef < *nev) {
1895 F77_FUNC(dsgets,DSGETS)(ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
1913 F77_FUNC(dcopy,DCOPY)(np, &workl[1], &c__1, &ritz[1], &c__1);
1916 F77_FUNC(dsapps,DSAPPS)(n, nev, np, &ritz[1], &v[v_offset], ldv, &h__[h_offset], ldh, &
1917 resid[1], &q[q_offset], ldq, &workd[1]);
1921 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[*n + 1], &c__1);
1927 } else if (*bmat == 'I') {
1928 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
1934 workd[*n * 3 + 1] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
1935 workd[*n * 3 + 1] = sqrt(fabs(workd[*n * 3 + 1]));
1936 } else if (*bmat == 'I') {
1937 workd[*n * 3 + 1] =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
1959 F77_FUNC(dsaupd,DSAUPD)(int * ido,
1977 int v_dim1, v_offset, i__1, i__2;
1983 v_offset = 1 + v_dim1;
1994 iwork[5] = iparam[1];
1995 iwork[10] = iparam[3];
1996 iwork[12] = iparam[4];
1999 iwork[11] = iparam[7];
2004 } else if (*nev <= 0) {
2006 } else if (*ncv <= *nev || *ncv > *n) {
2011 iwork[15] = *ncv - *nev;
2013 if (iwork[10] <= 0) {
2016 if (strncmp(which,"LM",2) && strncmp(which,"SM",2) &&
2017 strncmp(which,"LA",2) && strncmp(which,"SA",2) &&
2018 strncmp(which,"BE",2)) {
2021 if (*bmat != 'I' && *bmat != 'G') {
2026 if (*lworkl < i__1 * i__1 + (*ncv << 3)) {
2029 if (iwork[11] < 1 || iwork[11] > 5) {
2031 } else if (iwork[11] == 1 && *bmat == 'G') {
2033 } else if (iwork[5] < 0 || iwork[5] > 1) {
2035 } else if (*nev == 1 && !strncmp(which, "BE", 2)) {
2039 if (iwork[2] != 0) {
2045 if (iwork[12] <= 0) {
2049 *tol = GMX_DOUBLE_EPS;
2052 iwork[15] = *ncv - *nev;
2055 i__1 = i__2 * i__2 + (*ncv << 3);
2056 for (j = 1; j <= i__1; ++j) {
2063 iwork[16] = iwork[3] + (iwork[8] << 1);
2064 iwork[1] = iwork[16] + *ncv;
2065 iwork[4] = iwork[1] + *ncv;
2067 iwork[7] = iwork[4] + i__1 * i__1;
2068 iwork[14] = iwork[7] + *ncv * 3;
2070 ipntr[4] = iwork[14];
2071 ipntr[5] = iwork[3];
2072 ipntr[6] = iwork[16];
2073 ipntr[7] = iwork[1];
2074 ipntr[11] = iwork[7];
2077 F77_FUNC(dsaup2,DSAUP2)(ido, bmat, n, which, &iwork[13], &iwork[15], tol, &resid[1], &
2078 iwork[11], &iwork[6], &iwork[5], &iwork[10], &v[v_offset], ldv, &
2079 workl[iwork[3]], &iwork[8], &workl[iwork[16]], &workl[iwork[1]], &
2080 workl[iwork[4]], &iwork[9], &workl[iwork[7]], &ipntr[1], &workd[1]
2081 , &iwork[21], info);
2084 iparam[8] = iwork[15];
2090 iparam[3] = iwork[10];
2091 iparam[5] = iwork[15];
2109 F77_FUNC(dseupd,DSEUPD)(int * rvec,
2110 const char * howmny,
2135 int v_dim1, v_offset, z_dim1, z_offset, i__1;
2136 double d__1, d__2, d__3;
2138 int j, k, ih, iq, iw, ibd, ihb, ihd, ldh, ilg, ldq, ism, irz;
2150 double thres1=0, thres2=0;
2154 int leftptr, rghtptr;
2160 z_offset = 1 + z_dim1;
2165 v_offset = 1 + v_dim1;
2189 if (*ncv <= *nev || *ncv > *n) {
2192 if (strncmp(which,"LM",2) && strncmp(which,"SM",2) &&
2193 strncmp(which,"LA",2) && strncmp(which,"SA",2) &&
2194 strncmp(which,"BE",2)) {
2197 if (*bmat != 'I' && *bmat != 'G') {
2200 if (*howmny != 'A' && *howmny != 'P' &&
2201 *howmny != 'S' && *rvec) {
2204 if (*rvec && *howmny == 'S') {
2208 if (*rvec && *lworkl < i__1 * i__1 + (*ncv << 3)) {
2212 if (mode == 1 || mode == 2) {
2213 strncpy(type__, "REGULR",6);
2214 } else if (mode == 3) {
2215 strncpy(type__, "SHIFTI",6);
2216 } else if (mode == 4) {
2217 strncpy(type__, "BUCKLE",6);
2218 } else if (mode == 5) {
2219 strncpy(type__, "CAYLEY",6);
2223 if (mode == 1 && *bmat == 'G') {
2226 if (*nev == 1 && !strncmp(which, "BE",2)) {
2243 iw = iq + ldh * *ncv;
2244 next = iw + (*ncv << 1);
2250 irz = ipntr[11] + *ncv;
2254 eps23 = GMX_DOUBLE_EPS;
2255 eps23 = pow(eps23, c_b21);
2260 } else if (*bmat == 'G') {
2261 bnorm2 =F77_FUNC(dnrm2,DNRM2)(n, &workd[1], &c__1);
2266 if (!strncmp(which,"LM",2) || !strncmp(which,"SM",2) ||
2267 !strncmp(which,"LA",2) || !strncmp(which,"SA",2)) {
2269 } else if (!strncmp(which,"BE",2)) {
2272 ism = (*nev>nconv) ? *nev : nconv;
2275 thres1 = workl[ism];
2276 thres2 = workl[ilg];
2284 for (j = 0; j <= i__1; ++j) {
2286 if (!strncmp(which,"LM",2)) {
2287 if (fabs(workl[irz + j]) >= fabs(thres1)) {
2289 d__3 = fabs(workl[irz + j]);
2290 tempbnd = (d__2>d__3) ? d__2 : d__3;
2291 if (workl[ibd + j] <= *tol * tempbnd) {
2295 } else if (!strncmp(which,"SM",2)) {
2296 if (fabs(workl[irz + j]) <= fabs(thres1)) {
2298 d__3 = fabs(workl[irz + j]);
2299 tempbnd = (d__2>d__3) ? d__2 : d__3;
2300 if (workl[ibd + j] <= *tol * tempbnd) {
2304 } else if (!strncmp(which,"LA",2)) {
2305 if (workl[irz + j] >= thres1) {
2307 d__3 = fabs(workl[irz + j]);
2308 tempbnd = (d__2>d__3) ? d__2 : d__3;
2309 if (workl[ibd + j] <= *tol * tempbnd) {
2313 } else if (!strncmp(which,"SA",2)) {
2314 if (workl[irz + j] <= thres1) {
2316 d__3 = fabs(workl[irz + j]);
2317 tempbnd = (d__2>d__3) ? d__2 : d__3;
2318 if (workl[ibd + j] <= *tol * tempbnd) {
2322 } else if (!strncmp(which,"BE",2)) {
2323 if (workl[irz + j] <= thres1 || workl[irz + j] >= thres2) {
2325 d__3 = fabs(workl[irz + j]);
2326 tempbnd = (d__2>d__3) ? d__2 : d__3;
2327 if (workl[ibd + j] <= *tol * tempbnd) {
2332 if (j + 1 > nconv) {
2333 reord = select[j + 1] || reord;
2335 if (select[j + 1]) {
2341 F77_FUNC(dcopy,DCOPY)(&i__1, &workl[ih + 1], &c__1, &workl[ihb], &c__1);
2342 F77_FUNC(dcopy,DCOPY)(ncv, &workl[ih + ldh], &c__1, &workl[ihd], &c__1);
2344 F77_FUNC(dsteqr,DSTEQR)("Identity", ncv, &workl[ihd], &workl[ihb], &workl[iq], &ldq, &
2363 if (select[leftptr]) {
2367 } else if (! select[rghtptr]) {
2373 temp = workl[ihd + leftptr - 1];
2374 workl[ihd + leftptr - 1] = workl[ihd + rghtptr - 1];
2375 workl[ihd + rghtptr - 1] = temp;
2376 F77_FUNC(dcopy,DCOPY)(ncv, &workl[iq + *ncv * (leftptr - 1)], &c__1, &workl[
2378 F77_FUNC(dcopy,DCOPY)(ncv, &workl[iq + *ncv * (rghtptr - 1)], &c__1, &workl[
2379 iq + *ncv * (leftptr - 1)], &c__1);
2380 F77_FUNC(dcopy,DCOPY)(ncv, &workl[iw], &c__1, &workl[iq + *ncv * (rghtptr -
2387 if (leftptr < rghtptr) {
2395 F77_FUNC(dcopy,DCOPY)(&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
2399 F77_FUNC(dcopy,DCOPY)(&nconv, &workl[ritz], &c__1, &d__[1], &c__1);
2400 F77_FUNC(dcopy,DCOPY)(ncv, &workl[ritz], &c__1, &workl[ihd], &c__1);
2403 if (!strncmp(type__, "REGULR",6)) {
2406 F77_FUNC(dsesrt,DSESRT)("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
2408 F77_FUNC(dcopy,DCOPY)(ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
2413 F77_FUNC(dcopy,DCOPY)(ncv, &workl[ihd], &c__1, &workl[iw], &c__1);
2414 if (!strncmp(type__, "SHIFTI", 6)) {
2416 for (k = 1; k <= i__1; ++k) {
2417 workl[ihd + k - 1] = 1. / workl[ihd + k - 1] + *sigma;
2419 } else if (!strncmp(type__, "BUCKLE",6)) {
2421 for (k = 1; k <= i__1; ++k) {
2422 workl[ihd + k - 1] = *sigma * workl[ihd + k - 1] / (workl[ihd
2425 } else if (!strncmp(type__, "CAYLEY",6)) {
2427 for (k = 1; k <= i__1; ++k) {
2428 workl[ihd + k - 1] = *sigma * (workl[ihd + k - 1] + 1.) / (
2429 workl[ihd + k - 1] - 1.);
2433 F77_FUNC(dcopy,DCOPY)(&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
2434 F77_FUNC(dsortr,DSORTR)("LA", &c__1, &nconv, &workl[ihd], &workl[iw]);
2436 F77_FUNC(dsesrt,DSESRT)("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
2438 F77_FUNC(dcopy,DCOPY)(ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
2439 d__1 = bnorm2 / rnorm;
2440 F77_FUNC(dscal,DSCAL)(ncv, &d__1, &workl[ihb], &c__1);
2441 F77_FUNC(dsortr,DSORTR)("LA", &c__1, &nconv, &d__[1], &workl[ihb]);
2446 if (*rvec && *howmny == 'A') {
2448 F77_FUNC(dgeqr2,DGEQR2)(ncv, &nconv, &workl[iq], &ldq, &workl[iw + *ncv], &workl[ihb],
2451 F77_FUNC(dorm2r,DORM2R)("Right", "Notranspose", n, ncv, &nconv, &workl[iq], &ldq, &
2452 workl[iw + *ncv], &v[v_offset], ldv, &workd[*n + 1], &ierr);
2453 F77_FUNC(dlacpy,DLACPY)("All", n, &nconv, &v[v_offset], ldv, &z__[z_offset], ldz);
2456 for (j = 1; j <= i__1; ++j) {
2457 workl[ihb + j - 1] = 0.;
2459 workl[ihb + *ncv - 1] = 1.;
2460 F77_FUNC(dorm2r,DORM2R)("Left", "Transpose", ncv, &c__1, &nconv, &workl[iq], &ldq, &
2461 workl[iw + *ncv], &workl[ihb], ncv, &temp, &ierr);
2463 } else if (*rvec && *howmny == 'S') {
2467 if (!strncmp(type__, "REGULR",6) && *rvec) {
2470 for (j = 1; j <= i__1; ++j) {
2471 workl[ihb + j - 1] = rnorm * fabs(workl[ihb + j - 1]);
2474 } else if (strncmp(type__, "REGULR",6) && *rvec) {
2476 F77_FUNC(dscal,DSCAL)(ncv, &bnorm2, &workl[ihb], &c__1);
2477 if (!strncmp(type__, "SHIFTI",6)) {
2480 for (k = 1; k <= i__1; ++k) {
2481 d__2 = workl[iw + k - 1];
2482 workl[ihb + k - 1] = fabs(workl[ihb + k - 1])/(d__2 * d__2);
2485 } else if (!strncmp(type__, "BUCKLE",6)) {
2488 for (k = 1; k <= i__1; ++k) {
2489 d__2 = workl[iw + k - 1] - 1.;
2490 workl[ihb + k - 1] = *sigma * fabs(workl[ihb + k - 1])/(d__2 * d__2);
2493 } else if (!strncmp(type__, "CAYLEY",6)) {
2496 for (k = 1; k <= i__1; ++k) {
2497 workl[ihb + k - 1] = fabs(workl[ihb + k - 1] / workl[iw + k - 1] * (workl[iw + k - 1] - 1.));
2505 if (*rvec && (!strncmp(type__, "SHIFTI",6) || !strncmp(type__, "CAYLEY",6))) {
2508 for (k = 0; k <= i__1; ++k) {
2509 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / workl[iw + k];
2512 } else if (*rvec && !strncmp(type__, "BUCKLE", 6)) {
2515 for (k = 0; k <= i__1; ++k) {
2516 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / (workl[iw + k] -
2522 if (strncmp(type__, "REGULR",6)) {
2523 F77_FUNC(dger,DGER)(n, &nconv, &c_b102, &resid[1], &c__1, &workl[iw], &c__1, &z__[
2537 /* Selected single precision arpack routines */
2541 F77_FUNC(sstqrb,SSTQRB)(int * n,
2555 int i__, j, k, l, m;
2557 int l1, ii, mm, lm1, mm1, nm1;
2558 float rt1, rt2, eps;
2561 int lend, jtot, lendm1, lendp1, iscale;
2563 int lendsv, nmaxit, icompz;
2564 float ssfmax, ssfmin,safmin,minval,safmax,anorm;
2587 eps = GMX_FLOAT_EPS;
2591 minval = GMX_FLOAT_MIN;
2592 safmin = minval / GMX_FLOAT_EPS;
2593 safmax = 1. / safmin;
2594 ssfmax = sqrt(safmax) / 3.;
2595 ssfmin = sqrt(safmin) / eps2;
2599 for (j = 1; j <= i__1; ++j) {
2621 for (m = l1; m <= i__1; ++m) {
2626 if (tst <= sqrt(fabs(d__[m])) * sqrt(fabs(d__[m+1])) * eps) {
2644 i__1 = lend - l + 1;
2645 anorm =F77_FUNC(slanst,SLANST)("i", &i__1, &d__[l], &e[l]);
2650 if (anorm > ssfmax) {
2652 i__1 = lend - l + 1;
2653 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n,
2656 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n,
2658 } else if (anorm < ssfmin) {
2660 i__1 = lend - l + 1;
2661 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n,
2664 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n,
2668 if (fabs(d__[lend]) < fabs(d__[l])) {
2679 for (m = l; m <= i__1; ++m) {
2682 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m + 1]) + safmin) {
2701 F77_FUNC(slaev2,SLAEV2)(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s);
2703 work[*n - 1 + l] = s;
2706 z__[l + 1] = c__ * tst - s * z__[l];
2707 z__[l] = s * tst + c__ * z__[l];
2709 F77_FUNC(slae2,SLAE2)(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2);
2721 if (jtot == nmaxit) {
2726 g = (d__[l + 1] - p) / (e[l] * 2.);
2727 r__ =F77_FUNC(slapy2,SLAPY2)(&g, &c_b31);
2728 g = d__[m] - p + e[l] / (g + ((g>0) ? r__ : -r__ ));
2736 for (i__ = mm1; i__ >= i__1; --i__) {
2739 F77_FUNC(slartg,SLARTG)(&g, &f, &c__, &s, &r__);
2743 g = d__[i__ + 1] - p;
2744 r__ = (d__[i__] - g) * s + c__ * 2. * b;
2746 d__[i__ + 1] = g + p;
2751 work[*n - 1 + i__] = -s;
2759 F77_FUNC(slasr,SLASR)("r", "v", "b", &c__1, &mm, &work[l], &work[*n - 1 + l], &
2782 for (m = l; m >= i__1; --m) {
2783 d__2 = fabs(e[m - 1]);
2785 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m- 1]) + safmin) {
2804 F77_FUNC(slaev2,SLAEV2)(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s)
2808 z__[l] = c__ * tst - s * z__[l - 1];
2809 z__[l - 1] = s * tst + c__ * z__[l - 1];
2811 F77_FUNC(slae2,SLAE2)(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2);
2823 if (jtot == nmaxit) {
2829 g = (d__[l - 1] - p) / (e[l - 1] * 2.);
2830 r__ =F77_FUNC(slapy2,SLAPY2)(&g, &c_b31);
2831 g = d__[m] - p + e[l - 1] / (g + ((g>0) ? r__ : -r__ ));
2839 for (i__ = m; i__ <= i__1; ++i__) {
2842 F77_FUNC(slartg,SLARTG)(&g, &f, &c__, &s, &r__);
2847 r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b;
2854 work[*n - 1 + i__] = s;
2862 F77_FUNC(slasr,SLASR)("r", "v", "f", &c__1, &mm, &work[m], &work[*n - 1 + m], &
2883 i__1 = lendsv - lsv + 1;
2884 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv],
2886 i__1 = lendsv - lsv;
2887 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n,
2889 } else if (iscale == 2) {
2890 i__1 = lendsv - lsv + 1;
2891 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv],
2893 i__1 = lendsv - lsv;
2894 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n,
2898 if (jtot < nmaxit) {
2902 for (i__ = 1; i__ <= i__1; ++i__) {
2912 F77_FUNC(slasrt,SLASRT)("i", n, &d__[1], info);
2917 for (ii = 2; ii <= i__1; ++ii) {
2922 for (j = ii; j <= i__2; ++j) {
2945 F77_FUNC(sgetv0,SGETV0)(int * ido,
2964 int v_dim1, v_offset, i__1;
2972 v_offset = 1 + v_dim1;
2986 F77_FUNC(slarnv,SLARNV)(&idist, &iwork[1], n, &resid[1]);
2992 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
2998 if (iwork[5] == 1) {
3002 if (iwork[6] == 1) {
3008 F77_FUNC(scopy,SCOPY)(n, &workd[*n + 1], &c__1, &resid[1], &c__1);
3013 } else if (*bmat == 'I') {
3014 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
3022 workd[*n * 3 + 4] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
3023 workd[*n * 3 + 4] = sqrt(fabs(workd[*n * 3 + 4]));
3024 } else if (*bmat == 'I') {
3025 workd[*n * 3 + 4] =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
3027 *rnorm = workd[*n * 3 + 4];
3036 F77_FUNC(sgemv,SGEMV)("T", n, &i__1, &c_b22, &v[v_offset], ldv, &workd[1], &c__1, &c_b24,
3037 &workd[*n + 1], &c__1);
3039 F77_FUNC(sgemv,SGEMV)("N", n, &i__1, &c_b27, &v[v_offset], ldv, &workd[*n + 1], &c__1, &
3040 c_b22, &resid[1], &c__1);
3043 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[*n + 1], &c__1);
3048 } else if (*bmat == 'I') {
3049 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
3055 *rnorm =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
3056 *rnorm = sqrt(fabs(*rnorm));
3057 } else if (*bmat == 'I') {
3058 *rnorm =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
3061 if (*rnorm > workd[*n * 3 + 4] * .717f) {
3066 if (iwork[7] <= 1) {
3068 workd[*n * 3 + 4] = *rnorm;
3073 for (jj = 1; jj <= i__1; ++jj) {
3093 F77_FUNC(ssapps,SSAPPS)(int * n,
3110 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
3114 float r__, s, a1, a2, a3, a4;
3125 v_offset = 1 + v_dim1;
3128 h_offset = 1 + h_dim1;
3131 q_offset = 1 + q_dim1;
3134 epsmch = GMX_FLOAT_EPS;
3138 kplusp = *kev + *np;
3140 F77_FUNC(slaset,SLASET)("All", &kplusp, &kplusp, &c_b4, &c_b5, &q[q_offset], ldq);
3147 for (jj = 1; jj <= i__1; ++jj) {
3154 for (i__ = istart; i__ <= i__2; ++i__) {
3155 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__ + 1 + (h_dim1*2)]);
3156 if (h__[i__ + 1 + h_dim1] <= epsmch * big) {
3157 h__[i__ + 1 + h_dim1] = 0.;
3165 if (istart < iend) {
3167 f = h__[istart + (h_dim1 << 1)] - shift[jj];
3168 g = h__[istart + 1 + h_dim1];
3169 F77_FUNC(slartg,SLARTG)(&f, &g, &c__, &s, &r__);
3171 a1 = c__ * h__[istart + (h_dim1 << 1)] + s * h__[istart + 1 +
3173 a2 = c__ * h__[istart + 1 + h_dim1] + s * h__[istart + 1 + (
3175 a4 = c__ * h__[istart + 1 + (h_dim1 << 1)] - s * h__[istart + 1 +
3177 a3 = c__ * h__[istart + 1 + h_dim1] - s * h__[istart + (h_dim1 <<
3179 h__[istart + (h_dim1 << 1)] = c__ * a1 + s * a2;
3180 h__[istart + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
3181 h__[istart + 1 + h_dim1] = c__ * a3 + s * a4;
3184 i__2 = (i__3<kplusp) ? i__3 : kplusp;
3185 for (j = 1; j <= i__2; ++j) {
3186 a1 = c__ * q[j + istart * q_dim1] + s * q[j + (istart + 1) *
3188 q[j + (istart + 1) * q_dim1] = -s * q[j + istart * q_dim1] +
3189 c__ * q[j + (istart + 1) * q_dim1];
3190 q[j + istart * q_dim1] = a1;
3195 for (i__ = istart + 1; i__ <= i__2; ++i__) {
3197 f = h__[i__ + h_dim1];
3198 g = s * h__[i__ + 1 + h_dim1];
3200 h__[i__ + 1 + h_dim1] = c__ * h__[i__ + 1 + h_dim1];
3201 F77_FUNC(slartg,SLARTG)(&f, &g, &c__, &s, &r__);
3209 h__[i__ + h_dim1] = r__;
3211 a1 = c__ * h__[i__ + (h_dim1 << 1)] + s * h__[i__ + 1 +
3213 a2 = c__ * h__[i__ + 1 + h_dim1] + s * h__[i__ + 1 + (h_dim1
3215 a3 = c__ * h__[i__ + 1 + h_dim1] - s * h__[i__ + (h_dim1 << 1)
3217 a4 = c__ * h__[i__ + 1 + (h_dim1 << 1)] - s * h__[i__ + 1 +
3220 h__[i__ + (h_dim1 << 1)] = c__ * a1 + s * a2;
3221 h__[i__ + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
3222 h__[i__ + 1 + h_dim1] = c__ * a3 + s * a4;
3225 i__3 = (i__4<kplusp) ? i__4 : kplusp;
3226 for (j = 1; j <= i__3; ++j) {
3227 a1 = c__ * q[j + i__ * q_dim1] + s * q[j + (i__ + 1) *
3229 q[j + (i__ + 1) * q_dim1] = -s * q[j + i__ * q_dim1] +
3230 c__ * q[j + (i__ + 1) * q_dim1];
3231 q[j + i__ * q_dim1] = a1;
3240 if (h__[iend + h_dim1] < 0.) {
3241 h__[iend + h_dim1] = -h__[iend + h_dim1];
3242 F77_FUNC(sscal,SSCAL)(&kplusp, &c_b14, &q[iend * q_dim1 + 1], &c__1);
3245 if (iend < kplusp) {
3250 for (i__ = itop; i__ <= i__2; ++i__) {
3251 if (h__[i__ + 1 + h_dim1] > 0.) {
3262 for (i__ = itop; i__ <= i__1; ++i__) {
3263 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__+ 1 + (h_dim1*2)]);
3264 if (h__[i__ + 1 + h_dim1] <= epsmch * big) {
3265 h__[i__ + 1 + h_dim1] = 0.;
3270 if (h__[*kev + 1 + h_dim1] > 0.) {
3271 F77_FUNC(sgemv,SGEMV)("N", n, &kplusp, &c_b5, &v[v_offset], ldv, &q[(*kev + 1) *
3272 q_dim1 + 1], &c__1, &c_b4, &workd[*n + 1], &c__1);
3276 for (i__ = 1; i__ <= i__1; ++i__) {
3277 i__2 = kplusp - i__ + 1;
3278 F77_FUNC(sgemv,SGEMV)("N", n, &i__2, &c_b5, &v[v_offset], ldv, &q[(*kev - i__ + 1) *
3279 q_dim1 + 1], &c__1, &c_b4, &workd[1], &c__1);
3280 F77_FUNC(scopy,SCOPY)(n, &workd[1], &c__1, &v[(kplusp - i__ + 1) * v_dim1 + 1], &
3285 F77_FUNC(slacpy,SLACPY)("All", n, kev, &v[(*np + 1) * v_dim1 + 1], ldv, &v[v_offset], ldv);
3287 if (h__[*kev + 1 + h_dim1] > 0.) {
3288 F77_FUNC(scopy,SCOPY)(n, &workd[*n + 1], &c__1, &v[(*kev + 1) * v_dim1 + 1], &c__1);
3291 F77_FUNC(sscal,SSCAL)(n, &q[kplusp + *kev * q_dim1], &resid[1], &c__1);
3292 if (h__[*kev + 1 + h_dim1] > 0.) {
3293 F77_FUNC(saxpy,SAXPY)(n, &h__[*kev + 1 + h_dim1], &v[(*kev + 1) * v_dim1 + 1], &c__1,
3307 F77_FUNC(ssortr,SSORTR)(const char * which,
3322 if (!strncmp(which, "SA", 2)) {
3329 for (i__ = igap; i__ <= i__1; ++i__) {
3337 if (x1[j] < x1[j + igap]) {
3339 x1[j] = x1[j + igap];
3340 x1[j + igap] = temp;
3343 x2[j] = x2[j + igap];
3344 x2[j + igap] = temp;
3357 } else if (!strncmp(which, "SM", 2)) {
3364 for (i__ = igap; i__ <= i__1; ++i__) {
3372 if (fabs(x1[j]) < fabs(x1[j + igap])) {
3374 x1[j] = x1[j + igap];
3375 x1[j + igap] = temp;
3378 x2[j] = x2[j + igap];
3379 x2[j + igap] = temp;
3392 } else if (!strncmp(which, "LA", 2)) {
3399 for (i__ = igap; i__ <= i__1; ++i__) {
3407 if (x1[j] > x1[j + igap]) {
3409 x1[j] = x1[j + igap];
3410 x1[j + igap] = temp;
3413 x2[j] = x2[j + igap];
3414 x2[j + igap] = temp;
3427 } else if (!strncmp(which, "LM", 2)) {
3435 for (i__ = igap; i__ <= i__1; ++i__) {
3443 if (fabs(x1[j]) > fabs(x1[j + igap])) {
3445 x1[j] = x1[j + igap];
3446 x1[j + igap] = temp;
3449 x2[j] = x2[j + igap];
3450 x2[j + igap] = temp;
3473 F77_FUNC(ssesrt,SSESRT)(const char * which,
3481 int a_dim1, a_offset, i__1;
3488 a_offset = 1 + a_dim1 * 0;
3493 if (!strncmp(which, "SA", 2)) {
3500 for (i__ = igap; i__ <= i__1; ++i__) {
3508 if (x[j] < x[j + igap]) {
3513 F77_FUNC(sswap,SSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
3514 a_dim1 + 1], &c__1);
3527 } else if (!strncmp(which, "SM", 2)) {
3534 for (i__ = igap; i__ <= i__1; ++i__) {
3542 if (fabs(x[j]) < fabs(x[j + igap])) {
3547 F77_FUNC(sswap,SSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
3548 a_dim1 + 1], &c__1);
3561 } else if (!strncmp(which, "LA", 2)) {
3568 for (i__ = igap; i__ <= i__1; ++i__) {
3576 if (x[j] > x[j + igap]) {
3581 F77_FUNC(sswap,SSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
3582 a_dim1 + 1], &c__1);
3595 } else if (!strncmp(which, "LM", 2)) {
3602 for (i__ = igap; i__ <= i__1; ++i__) {
3610 if (fabs(x[j]) > fabs(x[j + igap])) {
3615 F77_FUNC(sswap,SSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
3616 a_dim1 + 1], &c__1);
3639 F77_FUNC(ssgets,SSGETS)(int * ishift,
3655 if (!strncmp(which, "BE", 2)) {
3657 F77_FUNC(ssortr,SSORTR)("LA", &c__1, &i__1, &ritz[1], &bounds[1]);
3660 i__1 = (kevd2<*np) ? kevd2 : *np;
3661 i__2 = (kevd2>*np) ? kevd2 : *np;
3662 F77_FUNC(sswap,SSWAP)(&i__1, &ritz[1], &c__1,
3663 &ritz[i__2 + 1], &c__1);
3664 i__1 = (kevd2<*np) ? kevd2 : *np;
3665 i__2 = (kevd2>*np) ? kevd2 : *np;
3666 F77_FUNC(sswap,SSWAP)(&i__1, &bounds[1], &c__1,
3667 &bounds[i__2 + 1], &c__1);
3672 F77_FUNC(ssortr,SSORTR)(which, &c__1, &i__1, &ritz[1], &bounds[1]);
3675 if (*ishift == 1 && *np > 0) {
3677 F77_FUNC(ssortr,SSORTR)("SM", &c__1, np, &bounds[1], &ritz[1]);
3678 F77_FUNC(scopy,SCOPY)(np, &ritz[1], &c__1, &shifts[1], &c__1);
3688 F77_FUNC(ssconv,SSCONV)(int * n,
3704 eps23 = GMX_FLOAT_EPS;
3705 eps23 = pow(eps23, c_b3);
3709 for (i__ = 1; i__ <= i__1; ++i__) {
3712 d__3 = fabs(ritz[i__]);
3713 temp = (d__2 > d__3) ? d__2 : d__3;
3714 if (bounds[i__] <= *tol * temp) {
3724 F77_FUNC(sseigt,SSEIGT)(float * rnorm,
3734 int h_dim1, h_offset, i__1;
3743 h_offset = 1 + h_dim1;
3746 F77_FUNC(scopy,SCOPY)(n, &h__[(h_dim1 << 1) + 1], &c__1, &eig[1], &c__1);
3748 F77_FUNC(scopy,SCOPY)(&i__1, &h__[h_dim1 + 2], &c__1, &workl[1], &c__1);
3749 F77_FUNC(sstqrb,SSTQRB)(n, &eig[1], &workl[1], &bounds[1], &workl[*n + 1], ierr);
3755 for (k = 1; k <= i__1; ++k) {
3756 bounds[k] = *rnorm * fabs(bounds[k]);
3769 F77_FUNC(ssaitr,SSAITR)(int * ido,
3793 int h_dim1, h_offset, v_dim1, v_offset, i__1;
3797 float safmin,minval;
3803 v_offset = 1 + v_dim1;
3806 h_offset = 1 + h_dim1;
3810 minval = GMX_FLOAT_MIN;
3811 safmin = minval / GMX_FLOAT_EPS;
3824 iwork[9] = iwork[8] + *n;
3825 iwork[10] = iwork[9] + *n;
3828 if (iwork[5] == 1) {
3831 if (iwork[6] == 1) {
3834 if (iwork[2] == 1) {
3837 if (iwork[3] == 1) {
3840 if (iwork[4] == 1) {
3857 F77_FUNC(sgetv0,sgetv0)(ido, bmat, &iwork[11], &c__0, n, &iwork[12], &v[v_offset], ldv,
3858 &resid[1], rnorm, &ipntr[1], &workd[1], &iwork[21], &iwork[7]);
3864 if (iwork[11] <= 3) {
3868 *info = iwork[12] - 1;
3875 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &v[iwork[12] * v_dim1 + 1], &c__1);
3876 if (*rnorm >= safmin) {
3877 temp1 = 1. / *rnorm;
3878 F77_FUNC(sscal,SSCAL)(n, &temp1, &v[iwork[12] * v_dim1 + 1], &c__1);
3879 F77_FUNC(sscal,SSCAL)(n, &temp1, &workd[iwork[8]], &c__1);
3882 F77_FUNC(slascl,SLASCL)("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &v[iwork[12] *
3883 v_dim1 + 1], n, &infol);
3884 F77_FUNC(slascl,SLASCL)("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &workd[iwork[
3889 F77_FUNC(scopy,SCOPY)(n, &v[iwork[12] * v_dim1 + 1], &c__1, &workd[iwork[10]], &c__1);
3890 ipntr[1] = iwork[10];
3891 ipntr[2] = iwork[9];
3892 ipntr[3] = iwork[8];
3901 F77_FUNC(scopy,SCOPY)(n, &workd[iwork[9]], &c__1, &resid[1], &c__1);
3908 ipntr[1] = iwork[9];
3909 ipntr[2] = iwork[8];
3913 } else if (*bmat == 'I') {
3914 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
3923 workd[*n * 3 + 3] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[iwork[10]], &
3925 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
3926 } else if (*bmat == 'G') {
3927 workd[*n * 3 + 3] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &
3929 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
3930 } else if (*bmat == 'I') {
3931 workd[*n * 3 + 3] =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
3935 F77_FUNC(sgemv,SGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]]
3936 , &c__1, &c_b42, &workd[iwork[9]], &c__1);
3937 } else if (*mode == 2) {
3938 F77_FUNC(sgemv,SGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[10]
3939 ], &c__1, &c_b42, &workd[iwork[9]], &c__1);
3942 F77_FUNC(sgemv,SGEMV)("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
3943 c__1, &c_b18, &resid[1], &c__1);
3945 h__[iwork[12] + (h_dim1 << 1)] = workd[iwork[9] + iwork[12] - 1];
3946 if (iwork[12] == 1 || iwork[4] == 1) {
3947 h__[iwork[12] + h_dim1] = 0.;
3949 h__[iwork[12] + h_dim1] = *rnorm;
3956 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
3957 ipntr[1] = iwork[9];
3958 ipntr[2] = iwork[8];
3962 } else if (*bmat == 'I') {
3963 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
3970 *rnorm =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
3971 *rnorm = sqrt(fabs(*rnorm));
3972 } else if (*bmat == 'I') {
3973 *rnorm =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
3976 if (*rnorm > workd[*n * 3 + 3] * .717f) {
3982 F77_FUNC(sgemv,SGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]], &
3983 c__1, &c_b42, &workd[iwork[9]], &c__1);
3985 F77_FUNC(sgemv,SGEMV)("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
3986 c__1, &c_b18, &resid[1], &c__1);
3988 if (iwork[12] == 1 || iwork[4] == 1) {
3989 h__[iwork[12] + h_dim1] = 0.;
3991 h__[iwork[12] + (h_dim1 << 1)] += workd[iwork[9] + iwork[12] - 1];
3995 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
3996 ipntr[1] = iwork[9];
3997 ipntr[2] = iwork[8];
4001 } else if (*bmat == 'I') {
4002 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
4008 workd[*n * 3 + 2] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &
4010 workd[*n * 3 + 2] = sqrt(fabs(workd[*n * 3 + 2]));
4011 } else if (*bmat == 'I') {
4012 workd[*n * 3 + 2] =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
4016 if (workd[*n * 3 + 2] > *rnorm * .717f) {
4018 *rnorm = workd[*n * 3 + 2];
4022 *rnorm = workd[*n * 3 + 2];
4024 if (iwork[1] <= 1) {
4029 for (jj = 1; jj <= i__1; ++jj) {
4040 if (h__[iwork[12] + h_dim1] < 0.) {
4041 h__[iwork[12] + h_dim1] = -h__[iwork[12] + h_dim1];
4042 if (iwork[12] < *k + *np) {
4043 F77_FUNC(sscal,SSCAL)(n, &c_b50, &v[(iwork[12] + 1) * v_dim1 + 1], &c__1);
4045 F77_FUNC(sscal,SSCAL)(n, &c_b50, &resid[1], &c__1);
4050 if (iwork[12] > *k + *np) {
4069 F77_FUNC(ssaup2,SSAUP2)(int * ido,
4099 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
4118 v_offset = 1 + v_dim1;
4121 h_offset = 1 + h_dim1;
4124 q_offset = 1 + q_dim1;
4128 eps23 = GMX_FLOAT_EPS;
4129 eps23 = pow(eps23, c_b3);
4141 iwork[7] = iwork[9] + iwork[10];
4159 if (iwork[2] == 1) {
4160 F77_FUNC(sgetv0,SGETV0)(ido, bmat, &c__1, &iwork[3], n, &c__1, &v[v_offset], ldv, &
4161 resid[1], &workd[*n * 3 + 1], &ipntr[1], &workd[1], &iwork[41]
4168 if (workd[*n * 3 + 1] == 0.) {
4177 if (iwork[4] == 1) {
4181 if (iwork[5] == 1) {
4185 if (iwork[1] == 1) {
4189 F77_FUNC(ssaitr,SSAITR)(ido, bmat, n, &c__0, &iwork[9], mode, &resid[1], &workd[*n * 3 +
4190 1], &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
4214 F77_FUNC(ssaitr,SSAITR)(ido, bmat, n, nev, np, mode, &resid[1], &workd[*n * 3 + 1], &v[
4215 v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1], &iwork[
4231 F77_FUNC(sseigt,SSEIGT)(&workd[*n * 3 + 1], &iwork[7], &h__[h_offset], ldh, &ritz[1], &
4232 bounds[1], &workl[1], &ierr);
4239 F77_FUNC(scopy,SCOPY)(&iwork[7], &ritz[1], &c__1, &workl[iwork[7] + 1], &c__1);
4240 F77_FUNC(scopy,SCOPY)(&iwork[7], &bounds[1], &c__1, &workl[(iwork[7] << 1) + 1], &c__1);
4244 F77_FUNC(ssgets,SSGETS)(ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
4246 F77_FUNC(scopy,SCOPY)(nev, &bounds[*np + 1], &c__1, &workl[*np + 1], &c__1);
4247 F77_FUNC(ssconv,SSCONV)(nev, &ritz[*np + 1], &workl[*np + 1], tol, &iwork[8]);
4252 for (j = 1; j <= i__1; ++j) {
4253 if (bounds[j] == 0.) {
4259 if (iwork[8] >= iwork[9] || iwork[6] > *mxiter || *np == 0) {
4261 if (!strncmp(which, "BE", 2)) {
4263 strncpy(wprime, "SA",2);
4264 F77_FUNC(ssortr,SSORTR)(wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
4266 nevm2 = *nev - nevd2;
4268 i__1 = (nevd2 < *np) ? nevd2 : *np;
4269 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np + 1;
4270 F77_FUNC(sswap,SSWAP)(&i__1, &ritz[nevm2 + 1], &c__1,
4271 &ritz[((i__2>i__3) ? i__2 : i__3)],
4273 i__1 = (nevd2 < *np) ? nevd2 : *np;
4274 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np;
4275 F77_FUNC(sswap,SSWAP)(&i__1, &bounds[nevm2 + 1], &c__1,
4276 &bounds[((i__2>i__3) ? i__2 : i__3) + 1],
4282 if (!strncmp(which, "LM", 2)) {
4283 strncpy(wprime, "SM", 2);
4285 if (!strncmp(which, "SM", 2)) {
4286 strncpy(wprime, "LM", 2);
4288 if (!strncmp(which, "LA", 2)) {
4289 strncpy(wprime, "SA", 2);
4291 if (!strncmp(which, "SA", 2)) {
4292 strncpy(wprime, "LA", 2);
4295 F77_FUNC(ssortr,SSORTR)(wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
4300 for (j = 1; j <= i__1; ++j) {
4302 d__3 = fabs(ritz[j]);
4303 temp = (d__2>d__3) ? d__2 : d__3;
4307 strncpy(wprime, "LA",2);
4308 F77_FUNC(ssortr,SSORTR)(wprime, &c__1, &iwork[9], &bounds[1], &ritz[1]);
4311 for (j = 1; j <= i__1; ++j) {
4313 d__3 = fabs(ritz[j]);
4314 temp = (d__2>d__3) ? d__2 : d__3;
4318 if (!strncmp(which, "BE", 2)) {
4320 strncpy(wprime, "LA", 2);
4321 F77_FUNC(ssortr,SSORTR)(wprime, &c__1, &iwork[8], &ritz[1], &bounds[1]);
4324 F77_FUNC(ssortr,SSORTR)(which, &c__1, &iwork[8], &ritz[1], &bounds[1]);
4328 h__[h_dim1 + 1] = workd[*n * 3 + 1];
4331 if (iwork[6] > *mxiter && iwork[8] < *nev) {
4334 if (*np == 0 && iwork[8] < iwork[9]) {
4341 } else if (iwork[8] < *nev && *ishift == 1) {
4343 i__1 = iwork[8], i__2 = *np / 2;
4344 *nev += (i__1 < i__2) ? i__1 : i__2;
4345 if (*nev == 1 && iwork[7] >= 6) {
4346 *nev = iwork[7] / 2;
4347 } else if (*nev == 1 && iwork[7] > 2) {
4350 *np = iwork[7] - *nev;
4353 if (nevbef < *nev) {
4354 F77_FUNC(ssgets,SSGETS)(ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
4372 F77_FUNC(scopy,SCOPY)(np, &workl[1], &c__1, &ritz[1], &c__1);
4375 F77_FUNC(ssapps,SSAPPS)(n, nev, np, &ritz[1], &v[v_offset], ldv, &h__[h_offset], ldh, &
4376 resid[1], &q[q_offset], ldq, &workd[1]);
4380 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[*n + 1], &c__1);
4386 } else if (*bmat == 'I') {
4387 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
4393 workd[*n * 3 + 1] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
4394 workd[*n * 3 + 1] = sqrt(fabs(workd[*n * 3 + 1]));
4395 } else if (*bmat == 'I') {
4396 workd[*n * 3 + 1] =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
4418 F77_FUNC(ssaupd,SSAUPD)(int * ido,
4436 int v_dim1, v_offset, i__1, i__2;
4442 v_offset = 1 + v_dim1;
4453 iwork[5] = iparam[1];
4454 iwork[10] = iparam[3];
4455 iwork[12] = iparam[4];
4458 iwork[11] = iparam[7];
4463 } else if (*nev <= 0) {
4465 } else if (*ncv <= *nev || *ncv > *n) {
4470 iwork[15] = *ncv - *nev;
4472 if (iwork[10] <= 0) {
4475 if (strncmp(which,"LM",2) && strncmp(which,"SM",2) &&
4476 strncmp(which,"LA",2) && strncmp(which,"SA",2) &&
4477 strncmp(which,"BE",2)) {
4480 if (*bmat != 'I' && *bmat != 'G') {
4485 if (*lworkl < i__1 * i__1 + (*ncv << 3)) {
4488 if (iwork[11] < 1 || iwork[11] > 5) {
4490 } else if (iwork[11] == 1 && *bmat == 'G') {
4492 } else if (iwork[5] < 0 || iwork[5] > 1) {
4494 } else if (*nev == 1 && !strncmp(which, "BE", 2)) {
4498 if (iwork[2] != 0) {
4504 if (iwork[12] <= 0) {
4508 *tol = GMX_FLOAT_EPS;
4511 iwork[15] = *ncv - *nev;
4514 i__1 = i__2 * i__2 + (*ncv << 3);
4515 for (j = 1; j <= i__1; ++j) {
4522 iwork[16] = iwork[3] + (iwork[8] << 1);
4523 iwork[1] = iwork[16] + *ncv;
4524 iwork[4] = iwork[1] + *ncv;
4526 iwork[7] = iwork[4] + i__1 * i__1;
4527 iwork[14] = iwork[7] + *ncv * 3;
4529 ipntr[4] = iwork[14];
4530 ipntr[5] = iwork[3];
4531 ipntr[6] = iwork[16];
4532 ipntr[7] = iwork[1];
4533 ipntr[11] = iwork[7];
4536 F77_FUNC(ssaup2,SSAUP2)(ido, bmat, n, which, &iwork[13], &iwork[15], tol, &resid[1], &
4537 iwork[11], &iwork[6], &iwork[5], &iwork[10], &v[v_offset], ldv, &
4538 workl[iwork[3]], &iwork[8], &workl[iwork[16]], &workl[iwork[1]], &
4539 workl[iwork[4]], &iwork[9], &workl[iwork[7]], &ipntr[1], &workd[1]
4540 , &iwork[21], info);
4543 iparam[8] = iwork[15];
4549 iparam[3] = iwork[10];
4550 iparam[5] = iwork[15];
4568 F77_FUNC(sseupd,SSEUPD)(int * rvec,
4569 const char * howmny,
4594 int v_dim1, v_offset, z_dim1, z_offset, i__1;
4595 float d__1, d__2, d__3;
4597 int j, k, ih, iq, iw, ibd, ihb, ihd, ldh, ilg, ldq, ism, irz;
4609 float thres1=0, thres2=0;
4613 int leftptr, rghtptr;
4619 z_offset = 1 + z_dim1;
4624 v_offset = 1 + v_dim1;
4648 if (*ncv <= *nev || *ncv > *n) {
4651 if (strncmp(which,"LM",2) && strncmp(which,"SM",2) &&
4652 strncmp(which,"LA",2) && strncmp(which,"SA",2) &&
4653 strncmp(which,"BE",2)) {
4656 if (*bmat != 'I' && *bmat != 'G') {
4659 if (*howmny != 'A' && *howmny != 'P' &&
4660 *howmny != 'S' && *rvec) {
4663 if (*rvec && *howmny == 'S') {
4667 if (*rvec && *lworkl < i__1 * i__1 + (*ncv << 3)) {
4671 if (mode == 1 || mode == 2) {
4672 strncpy(type__, "REGULR",6);
4673 } else if (mode == 3) {
4674 strncpy(type__, "SHIFTI",6);
4675 } else if (mode == 4) {
4676 strncpy(type__, "BUCKLE",6);
4677 } else if (mode == 5) {
4678 strncpy(type__, "CAYLEY",6);
4682 if (mode == 1 && *bmat == 'G') {
4685 if (*nev == 1 && !strncmp(which, "BE",2)) {
4702 iw = iq + ldh * *ncv;
4703 next = iw + (*ncv << 1);
4709 irz = ipntr[11] + *ncv;
4713 eps23 = GMX_FLOAT_EPS;
4714 eps23 = pow(eps23, c_b21);
4719 } else if (*bmat == 'G') {
4720 bnorm2 =F77_FUNC(snrm2,SNRM2)(n, &workd[1], &c__1);
4725 if (!strncmp(which,"LM",2) || !strncmp(which,"SM",2) ||
4726 !strncmp(which,"LA",2) || !strncmp(which,"SA",2)) {
4728 } else if (!strncmp(which,"BE",2)) {
4731 ism = (*nev>nconv) ? *nev : nconv;
4734 thres1 = workl[ism];
4735 thres2 = workl[ilg];
4743 for (j = 0; j <= i__1; ++j) {
4745 if (!strncmp(which,"LM",2)) {
4746 if (fabs(workl[irz + j]) >= fabs(thres1)) {
4748 d__3 = fabs(workl[irz + j]);
4749 tempbnd = (d__2>d__3) ? d__2 : d__3;
4750 if (workl[ibd + j] <= *tol * tempbnd) {
4754 } else if (!strncmp(which,"SM",2)) {
4755 if (fabs(workl[irz + j]) <= fabs(thres1)) {
4757 d__3 = fabs(workl[irz + j]);
4758 tempbnd = (d__2>d__3) ? d__2 : d__3;
4759 if (workl[ibd + j] <= *tol * tempbnd) {
4763 } else if (!strncmp(which,"LA",2)) {
4764 if (workl[irz + j] >= thres1) {
4766 d__3 = fabs(workl[irz + j]);
4767 tempbnd = (d__2>d__3) ? d__2 : d__3;
4768 if (workl[ibd + j] <= *tol * tempbnd) {
4772 } else if (!strncmp(which,"SA",2)) {
4773 if (workl[irz + j] <= thres1) {
4775 d__3 = fabs(workl[irz + j]);
4776 tempbnd = (d__2>d__3) ? d__2 : d__3;
4777 if (workl[ibd + j] <= *tol * tempbnd) {
4781 } else if (!strncmp(which,"BE",2)) {
4782 if (workl[irz + j] <= thres1 || workl[irz + j] >= thres2) {
4784 d__3 = fabs(workl[irz + j]);
4785 tempbnd = (d__2>d__3) ? d__2 : d__3;
4786 if (workl[ibd + j] <= *tol * tempbnd) {
4791 if (j + 1 > nconv) {
4792 reord = select[j + 1] || reord;
4794 if (select[j + 1]) {
4800 F77_FUNC(scopy,SCOPY)(&i__1, &workl[ih + 1], &c__1, &workl[ihb], &c__1);
4801 F77_FUNC(scopy,SCOPY)(ncv, &workl[ih + ldh], &c__1, &workl[ihd], &c__1);
4803 F77_FUNC(ssteqr,SSTEQR)("Identity", ncv, &workl[ihd], &workl[ihb], &workl[iq], &ldq, &
4822 if (select[leftptr]) {
4826 } else if (! select[rghtptr]) {
4832 temp = workl[ihd + leftptr - 1];
4833 workl[ihd + leftptr - 1] = workl[ihd + rghtptr - 1];
4834 workl[ihd + rghtptr - 1] = temp;
4835 F77_FUNC(scopy,SCOPY)(ncv, &workl[iq + *ncv * (leftptr - 1)], &c__1, &workl[
4837 F77_FUNC(scopy,SCOPY)(ncv, &workl[iq + *ncv * (rghtptr - 1)], &c__1, &workl[
4838 iq + *ncv * (leftptr - 1)], &c__1);
4839 F77_FUNC(scopy,SCOPY)(ncv, &workl[iw], &c__1, &workl[iq + *ncv * (rghtptr -
4846 if (leftptr < rghtptr) {
4854 F77_FUNC(scopy,SCOPY)(&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
4858 F77_FUNC(scopy,SCOPY)(&nconv, &workl[ritz], &c__1, &d__[1], &c__1);
4859 F77_FUNC(scopy,SCOPY)(ncv, &workl[ritz], &c__1, &workl[ihd], &c__1);
4862 if (!strncmp(type__, "REGULR",6)) {
4865 F77_FUNC(ssesrt,SSESRT)("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
4867 F77_FUNC(scopy,SCOPY)(ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
4872 F77_FUNC(scopy,SCOPY)(ncv, &workl[ihd], &c__1, &workl[iw], &c__1);
4873 if (!strncmp(type__, "SHIFTI", 6)) {
4875 for (k = 1; k <= i__1; ++k) {
4876 workl[ihd + k - 1] = 1. / workl[ihd + k - 1] + *sigma;
4878 } else if (!strncmp(type__, "BUCKLE",6)) {
4880 for (k = 1; k <= i__1; ++k) {
4881 workl[ihd + k - 1] = *sigma * workl[ihd + k - 1] / (workl[ihd
4884 } else if (!strncmp(type__, "CAYLEY",6)) {
4886 for (k = 1; k <= i__1; ++k) {
4887 workl[ihd + k - 1] = *sigma * (workl[ihd + k - 1] + 1.) / (
4888 workl[ihd + k - 1] - 1.);
4892 F77_FUNC(scopy,SCOPY)(&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
4893 F77_FUNC(ssortr,SSORTR)("LA", &c__1, &nconv, &workl[ihd], &workl[iw]);
4895 F77_FUNC(ssesrt,SSESRT)("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
4897 F77_FUNC(scopy,SCOPY)(ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
4898 d__1 = bnorm2 / rnorm;
4899 F77_FUNC(sscal,SSCAL)(ncv, &d__1, &workl[ihb], &c__1);
4900 F77_FUNC(ssortr,SSORTR)("LA", &c__1, &nconv, &d__[1], &workl[ihb]);
4905 if (*rvec && *howmny == 'A') {
4907 F77_FUNC(sgeqr2,SGEQR2)(ncv, &nconv, &workl[iq], &ldq, &workl[iw + *ncv], &workl[ihb],
4910 F77_FUNC(sorm2r,SORM2R)("Right", "Notranspose", n, ncv, &nconv, &workl[iq], &ldq, &
4911 workl[iw + *ncv], &v[v_offset], ldv, &workd[*n + 1], &ierr);
4912 F77_FUNC(slacpy,SLACPY)("All", n, &nconv, &v[v_offset], ldv, &z__[z_offset], ldz);
4915 for (j = 1; j <= i__1; ++j) {
4916 workl[ihb + j - 1] = 0.;
4918 workl[ihb + *ncv - 1] = 1.;
4919 F77_FUNC(sorm2r,SORM2R)("Left", "Transpose", ncv, &c__1, &nconv, &workl[iq], &ldq, &
4920 workl[iw + *ncv], &workl[ihb], ncv, &temp, &ierr);
4922 } else if (*rvec && *howmny == 'S') {
4926 if (!strncmp(type__, "REGULR",6) && *rvec) {
4929 for (j = 1; j <= i__1; ++j) {
4930 workl[ihb + j - 1] = rnorm * fabs(workl[ihb + j - 1]);
4933 } else if (strncmp(type__, "REGULR",6) && *rvec) {
4935 F77_FUNC(sscal,SSCAL)(ncv, &bnorm2, &workl[ihb], &c__1);
4936 if (!strncmp(type__, "SHIFTI",6)) {
4939 for (k = 1; k <= i__1; ++k) {
4940 d__2 = workl[iw + k - 1];
4941 workl[ihb + k - 1] = fabs(workl[ihb + k - 1])/(d__2 * d__2);
4944 } else if (!strncmp(type__, "BUCKLE",6)) {
4947 for (k = 1; k <= i__1; ++k) {
4948 d__2 = workl[iw + k - 1] - 1.;
4949 workl[ihb + k - 1] = *sigma * fabs(workl[ihb + k - 1])/(d__2 * d__2);
4952 } else if (!strncmp(type__, "CAYLEY",6)) {
4955 for (k = 1; k <= i__1; ++k) {
4956 workl[ihb + k - 1] = fabs(workl[ihb + k - 1] / workl[iw + k - 1] * (workl[iw + k - 1] - 1.));
4964 if (*rvec && (!strncmp(type__, "SHIFTI",6) || !strncmp(type__, "CAYLEY",6))) {
4967 for (k = 0; k <= i__1; ++k) {
4968 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / workl[iw + k];
4971 } else if (*rvec && !strncmp(type__, "BUCKLE", 6)) {
4974 for (k = 0; k <= i__1; ++k) {
4975 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / (workl[iw + k] -
4981 if (strncmp(type__, "REGULR",6)) {
4982 F77_FUNC(sger,SGER)(n, &nconv, &c_b102, &resid[1], &c__1, &workl[iw], &c__1, &z__[