1 /* -*- mode: c; tab-width: 4; indent-tabs-mode: m; c-basic-offset: 4 -*-
4 * This file is part of Gromacs Copyright (c) 1991-2004
5 * David van der Spoel, Erik Lindahl, University of Groningen.
7 * This file contains a subset of ARPACK functions to perform
8 * diagonalization and SVD for sparse matrices in Gromacs.
10 * The code has been translated to C to avoid being dependent on
11 * a Fotran compiler, and it has been made threadsafe by using
12 * additional workspace arrays to store data during reverse communication.
14 * You might prefer the original ARPACK library for general use, but
15 * in case you want to this version can be redistributed freely, just
16 * as the original library. However, please make clear that it is the
17 * hacked version from Gromacs so any bugs are blamed on us and not
18 * the original authors. You should also be aware that the double
19 * precision work array workd needs to be of size (3*N+4) here
20 * (4 more than the general library), and there is an extra argument
21 * iwork, which should be an integer work array of length 80.
23 * ARPACK was written by
25 * Danny Sorensen Phuong Vu
26 * Rihard Lehoucq CRPC / Rice University
27 * Dept. of Computational & Houston, Texas
35 #include "gromacs/legacyheaders/types/simple.h"
36 #include "gmx_arpack.h"
38 #include "gmx_lapack.h"
40 F77_FUNC(dstqrb,DSTQRB)(int * n,
56 int l1, ii, mm, lm1, mm1, nm1;
60 int lend, jtot, lendm1, lendp1, iscale;
62 int lendsv, nmaxit, icompz;
63 double ssfmax, ssfmin,safmin,minval,safmax,anorm;
90 minval = GMX_DOUBLE_MIN;
91 safmin = minval / GMX_DOUBLE_EPS;
93 ssfmax = sqrt(safmax) / 3.;
94 ssfmin = sqrt(safmin) / eps2;
98 for (j = 1; j <= i__1; ++j) {
120 for (m = l1; m <= i__1; ++m) {
125 if (tst <= sqrt(fabs(d__[m])) * sqrt(fabs(d__[m+1])) * eps) {
144 anorm =F77_FUNC(dlanst,DLANST)("i", &i__1, &d__[l], &e[l]);
149 if (anorm > ssfmax) {
152 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n,
155 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n,
157 } else if (anorm < ssfmin) {
160 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n,
163 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n,
167 if (fabs(d__[lend]) < fabs(d__[l])) {
178 for (m = l; m <= i__1; ++m) {
181 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m + 1]) + safmin) {
200 F77_FUNC(dlaev2,DLAEV2)(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s);
202 work[*n - 1 + l] = s;
205 z__[l + 1] = c__ * tst - s * z__[l];
206 z__[l] = s * tst + c__ * z__[l];
208 F77_FUNC(dlae2,DLAE2)(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2);
220 if (jtot == nmaxit) {
225 g = (d__[l + 1] - p) / (e[l] * 2.);
226 r__ =F77_FUNC(dlapy2,DLAPY2)(&g, &c_b31);
227 g = d__[m] - p + e[l] / (g + ((g>0) ? r__ : -r__ ));
235 for (i__ = mm1; i__ >= i__1; --i__) {
238 F77_FUNC(dlartg,DLARTG)(&g, &f, &c__, &s, &r__);
242 g = d__[i__ + 1] - p;
243 r__ = (d__[i__] - g) * s + c__ * 2. * b;
245 d__[i__ + 1] = g + p;
250 work[*n - 1 + i__] = -s;
258 F77_FUNC(dlasr,DLASR)("r", "v", "b", &c__1, &mm, &work[l], &work[*n - 1 + l], &
281 for (m = l; m >= i__1; --m) {
282 d__2 = fabs(e[m - 1]);
284 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m- 1]) + safmin) {
303 F77_FUNC(dlaev2,DLAEV2)(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s)
307 z__[l] = c__ * tst - s * z__[l - 1];
308 z__[l - 1] = s * tst + c__ * z__[l - 1];
310 F77_FUNC(dlae2,DLAE2)(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2);
322 if (jtot == nmaxit) {
328 g = (d__[l - 1] - p) / (e[l - 1] * 2.);
329 r__ =F77_FUNC(dlapy2,DLAPY2)(&g, &c_b31);
330 g = d__[m] - p + e[l - 1] / (g + ((g>0) ? r__ : -r__ ));
338 for (i__ = m; i__ <= i__1; ++i__) {
341 F77_FUNC(dlartg,DLARTG)(&g, &f, &c__, &s, &r__);
346 r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b;
353 work[*n - 1 + i__] = s;
361 F77_FUNC(dlasr,DLASR)("r", "v", "f", &c__1, &mm, &work[m], &work[*n - 1 + m], &
382 i__1 = lendsv - lsv + 1;
383 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv],
386 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n,
388 } else if (iscale == 2) {
389 i__1 = lendsv - lsv + 1;
390 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv],
393 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n,
401 for (i__ = 1; i__ <= i__1; ++i__) {
411 F77_FUNC(dlasrt,DLASRT)("i", n, &d__[1], info);
416 for (ii = 2; ii <= i__1; ++ii) {
421 for (j = ii; j <= i__2; ++j) {
444 F77_FUNC(dgetv0,DGETV0)(int * ido,
463 int v_dim1, v_offset, i__1;
471 v_offset = 1 + v_dim1;
485 F77_FUNC(dlarnv,DLARNV)(&idist, &iwork[1], n, &resid[1]);
491 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
507 F77_FUNC(dcopy,DCOPY)(n, &workd[*n + 1], &c__1, &resid[1], &c__1);
512 } else if (*bmat == 'I') {
513 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
521 workd[*n * 3 + 4] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
522 workd[*n * 3 + 4] = sqrt(fabs(workd[*n * 3 + 4]));
523 } else if (*bmat == 'I') {
524 workd[*n * 3 + 4] =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
526 *rnorm = workd[*n * 3 + 4];
535 F77_FUNC(dgemv,DGEMV)("T", n, &i__1, &c_b22, &v[v_offset], ldv, &workd[1], &c__1, &c_b24,
536 &workd[*n + 1], &c__1);
538 F77_FUNC(dgemv,DGEMV)("N", n, &i__1, &c_b27, &v[v_offset], ldv, &workd[*n + 1], &c__1, &
539 c_b22, &resid[1], &c__1);
542 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[*n + 1], &c__1);
547 } else if (*bmat == 'I') {
548 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
554 *rnorm =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
555 *rnorm = sqrt(fabs(*rnorm));
556 } else if (*bmat == 'I') {
557 *rnorm =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
560 if (*rnorm > workd[*n * 3 + 4] * .717f) {
567 workd[*n * 3 + 4] = *rnorm;
572 for (jj = 1; jj <= i__1; ++jj) {
592 F77_FUNC(dsapps,DSAPPS)(int * n,
609 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
613 double r__, s, a1, a2, a3, a4;
624 v_offset = 1 + v_dim1;
627 h_offset = 1 + h_dim1;
630 q_offset = 1 + q_dim1;
633 epsmch = GMX_DOUBLE_EPS;
639 F77_FUNC(dlaset,DLASET)("All", &kplusp, &kplusp, &c_b4, &c_b5, &q[q_offset], ldq);
646 for (jj = 1; jj <= i__1; ++jj) {
653 for (i__ = istart; i__ <= i__2; ++i__) {
654 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__ + 1 + (h_dim1*2)]);
655 if (h__[i__ + 1 + h_dim1] <= epsmch * big) {
656 h__[i__ + 1 + h_dim1] = 0.;
666 f = h__[istart + (h_dim1 << 1)] - shift[jj];
667 g = h__[istart + 1 + h_dim1];
668 F77_FUNC(dlartg,DLARTG)(&f, &g, &c__, &s, &r__);
670 a1 = c__ * h__[istart + (h_dim1 << 1)] + s * h__[istart + 1 +
672 a2 = c__ * h__[istart + 1 + h_dim1] + s * h__[istart + 1 + (
674 a4 = c__ * h__[istart + 1 + (h_dim1 << 1)] - s * h__[istart + 1 +
676 a3 = c__ * h__[istart + 1 + h_dim1] - s * h__[istart + (h_dim1 <<
678 h__[istart + (h_dim1 << 1)] = c__ * a1 + s * a2;
679 h__[istart + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
680 h__[istart + 1 + h_dim1] = c__ * a3 + s * a4;
683 i__2 = (i__3<kplusp) ? i__3 : kplusp;
684 for (j = 1; j <= i__2; ++j) {
685 a1 = c__ * q[j + istart * q_dim1] + s * q[j + (istart + 1) *
687 q[j + (istart + 1) * q_dim1] = -s * q[j + istart * q_dim1] +
688 c__ * q[j + (istart + 1) * q_dim1];
689 q[j + istart * q_dim1] = a1;
694 for (i__ = istart + 1; i__ <= i__2; ++i__) {
696 f = h__[i__ + h_dim1];
697 g = s * h__[i__ + 1 + h_dim1];
699 h__[i__ + 1 + h_dim1] = c__ * h__[i__ + 1 + h_dim1];
700 F77_FUNC(dlartg,DLARTG)(&f, &g, &c__, &s, &r__);
708 h__[i__ + h_dim1] = r__;
710 a1 = c__ * h__[i__ + (h_dim1 << 1)] + s * h__[i__ + 1 +
712 a2 = c__ * h__[i__ + 1 + h_dim1] + s * h__[i__ + 1 + (h_dim1
714 a3 = c__ * h__[i__ + 1 + h_dim1] - s * h__[i__ + (h_dim1 << 1)
716 a4 = c__ * h__[i__ + 1 + (h_dim1 << 1)] - s * h__[i__ + 1 +
719 h__[i__ + (h_dim1 << 1)] = c__ * a1 + s * a2;
720 h__[i__ + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
721 h__[i__ + 1 + h_dim1] = c__ * a3 + s * a4;
724 i__3 = (i__4<kplusp) ? i__4 : kplusp;
725 for (j = 1; j <= i__3; ++j) {
726 a1 = c__ * q[j + i__ * q_dim1] + s * q[j + (i__ + 1) *
728 q[j + (i__ + 1) * q_dim1] = -s * q[j + i__ * q_dim1] +
729 c__ * q[j + (i__ + 1) * q_dim1];
730 q[j + i__ * q_dim1] = a1;
739 if (h__[iend + h_dim1] < 0.) {
740 h__[iend + h_dim1] = -h__[iend + h_dim1];
741 F77_FUNC(dscal,DSCAL)(&kplusp, &c_b14, &q[iend * q_dim1 + 1], &c__1);
749 for (i__ = itop; i__ <= i__2; ++i__) {
750 if (h__[i__ + 1 + h_dim1] > 0.) {
761 for (i__ = itop; i__ <= i__1; ++i__) {
762 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__+ 1 + (h_dim1*2)]);
763 if (h__[i__ + 1 + h_dim1] <= epsmch * big) {
764 h__[i__ + 1 + h_dim1] = 0.;
769 if (h__[*kev + 1 + h_dim1] > 0.) {
770 F77_FUNC(dgemv,DGEMV)("N", n, &kplusp, &c_b5, &v[v_offset], ldv, &q[(*kev + 1) *
771 q_dim1 + 1], &c__1, &c_b4, &workd[*n + 1], &c__1);
775 for (i__ = 1; i__ <= i__1; ++i__) {
776 i__2 = kplusp - i__ + 1;
777 F77_FUNC(dgemv,DGEMV)("N", n, &i__2, &c_b5, &v[v_offset], ldv, &q[(*kev - i__ + 1) *
778 q_dim1 + 1], &c__1, &c_b4, &workd[1], &c__1);
779 F77_FUNC(dcopy,DCOPY)(n, &workd[1], &c__1, &v[(kplusp - i__ + 1) * v_dim1 + 1], &
784 F77_FUNC(dlacpy,DLACPY)("All", n, kev, &v[(*np + 1) * v_dim1 + 1], ldv, &v[v_offset], ldv);
786 if (h__[*kev + 1 + h_dim1] > 0.) {
787 F77_FUNC(dcopy,DCOPY)(n, &workd[*n + 1], &c__1, &v[(*kev + 1) * v_dim1 + 1], &c__1);
790 F77_FUNC(dscal,DSCAL)(n, &q[kplusp + *kev * q_dim1], &resid[1], &c__1);
791 if (h__[*kev + 1 + h_dim1] > 0.) {
792 F77_FUNC(daxpy,DAXPY)(n, &h__[*kev + 1 + h_dim1], &v[(*kev + 1) * v_dim1 + 1], &c__1,
806 F77_FUNC(dsortr,DSORTR)(const char * which,
821 if (!strncmp(which, "SA", 2)) {
828 for (i__ = igap; i__ <= i__1; ++i__) {
836 if (x1[j] < x1[j + igap]) {
838 x1[j] = x1[j + igap];
842 x2[j] = x2[j + igap];
856 } else if (!strncmp(which, "SM", 2)) {
863 for (i__ = igap; i__ <= i__1; ++i__) {
871 if (fabs(x1[j]) < fabs(x1[j + igap])) {
873 x1[j] = x1[j + igap];
877 x2[j] = x2[j + igap];
891 } else if (!strncmp(which, "LA", 2)) {
898 for (i__ = igap; i__ <= i__1; ++i__) {
906 if (x1[j] > x1[j + igap]) {
908 x1[j] = x1[j + igap];
912 x2[j] = x2[j + igap];
926 } else if (!strncmp(which, "LM", 2)) {
934 for (i__ = igap; i__ <= i__1; ++i__) {
942 if (fabs(x1[j]) > fabs(x1[j + igap])) {
944 x1[j] = x1[j + igap];
948 x2[j] = x2[j + igap];
972 F77_FUNC(dsesrt,DSESRT)(const char * which,
980 int a_dim1, a_offset, i__1;
987 a_offset = 1 + a_dim1 * 0;
992 if (!strncmp(which, "SA", 2)) {
999 for (i__ = igap; i__ <= i__1; ++i__) {
1007 if (x[j] < x[j + igap]) {
1012 F77_FUNC(dswap,DSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1013 a_dim1 + 1], &c__1);
1026 } else if (!strncmp(which, "SM", 2)) {
1033 for (i__ = igap; i__ <= i__1; ++i__) {
1041 if (fabs(x[j]) < fabs(x[j + igap])) {
1046 F77_FUNC(dswap,DSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1047 a_dim1 + 1], &c__1);
1060 } else if (!strncmp(which, "LA", 2)) {
1067 for (i__ = igap; i__ <= i__1; ++i__) {
1075 if (x[j] > x[j + igap]) {
1080 F77_FUNC(dswap,DSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1081 a_dim1 + 1], &c__1);
1094 } else if (!strncmp(which, "LM", 2)) {
1101 for (i__ = igap; i__ <= i__1; ++i__) {
1109 if (fabs(x[j]) > fabs(x[j + igap])) {
1114 F77_FUNC(dswap,DSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1115 a_dim1 + 1], &c__1);
1138 F77_FUNC(dsgets,DSGETS)(int * ishift,
1154 if (!strncmp(which, "BE", 2)) {
1156 F77_FUNC(dsortr,DSORTR)("LA", &c__1, &i__1, &ritz[1], &bounds[1]);
1159 i__1 = (kevd2<*np) ? kevd2 : *np;
1160 i__2 = (kevd2>*np) ? kevd2 : *np;
1161 F77_FUNC(dswap,DSWAP)(&i__1, &ritz[1], &c__1,
1162 &ritz[i__2 + 1], &c__1);
1163 i__1 = (kevd2<*np) ? kevd2 : *np;
1164 i__2 = (kevd2>*np) ? kevd2 : *np;
1165 F77_FUNC(dswap,DSWAP)(&i__1, &bounds[1], &c__1,
1166 &bounds[i__2 + 1], &c__1);
1171 F77_FUNC(dsortr,DSORTR)(which, &c__1, &i__1, &ritz[1], &bounds[1]);
1174 if (*ishift == 1 && *np > 0) {
1176 F77_FUNC(dsortr,DSORTR)("SM", &c__1, np, &bounds[1], &ritz[1]);
1177 F77_FUNC(dcopy,DCOPY)(np, &ritz[1], &c__1, &shifts[1], &c__1);
1187 F77_FUNC(dsconv,DSCONV)(int * n,
1203 eps23 = GMX_DOUBLE_EPS;
1204 eps23 = pow(eps23, c_b3);
1208 for (i__ = 1; i__ <= i__1; ++i__) {
1211 d__3 = fabs(ritz[i__]);
1212 temp = (d__2 > d__3) ? d__2 : d__3;
1213 if (bounds[i__] <= *tol * temp) {
1223 F77_FUNC(dseigt,DSEIGT)(double * rnorm,
1233 int h_dim1, h_offset, i__1;
1242 h_offset = 1 + h_dim1;
1245 F77_FUNC(dcopy,DCOPY)(n, &h__[(h_dim1 << 1) + 1], &c__1, &eig[1], &c__1);
1247 F77_FUNC(dcopy,DCOPY)(&i__1, &h__[h_dim1 + 2], &c__1, &workl[1], &c__1);
1248 F77_FUNC(dstqrb,DSTQRB)(n, &eig[1], &workl[1], &bounds[1], &workl[*n + 1], ierr);
1254 for (k = 1; k <= i__1; ++k) {
1255 bounds[k] = *rnorm * fabs(bounds[k]);
1268 F77_FUNC(dsaitr,DSAITR)(int * ido,
1292 int h_dim1, h_offset, v_dim1, v_offset, i__1;
1296 double safmin,minval;
1302 v_offset = 1 + v_dim1;
1305 h_offset = 1 + h_dim1;
1309 minval = GMX_DOUBLE_MIN;
1310 safmin = minval / GMX_DOUBLE_EPS;
1323 iwork[9] = iwork[8] + *n;
1324 iwork[10] = iwork[9] + *n;
1327 if (iwork[5] == 1) {
1330 if (iwork[6] == 1) {
1333 if (iwork[2] == 1) {
1336 if (iwork[3] == 1) {
1339 if (iwork[4] == 1) {
1356 F77_FUNC(dgetv0,DGETV0)(ido, bmat, &iwork[11], &c__0, n, &iwork[12], &v[v_offset], ldv,
1357 &resid[1], rnorm, &ipntr[1], &workd[1], &iwork[21], &iwork[7]);
1363 if (iwork[11] <= 3) {
1367 *info = iwork[12] - 1;
1374 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &v[iwork[12] * v_dim1 + 1], &c__1);
1375 if (*rnorm >= safmin) {
1376 temp1 = 1. / *rnorm;
1377 F77_FUNC(dscal,DSCAL)(n, &temp1, &v[iwork[12] * v_dim1 + 1], &c__1);
1378 F77_FUNC(dscal,DSCAL)(n, &temp1, &workd[iwork[8]], &c__1);
1381 F77_FUNC(dlascl,DLASCL)("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &v[iwork[12] *
1382 v_dim1 + 1], n, &infol);
1383 F77_FUNC(dlascl,DLASCL)("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &workd[iwork[
1388 F77_FUNC(dcopy,DCOPY)(n, &v[iwork[12] * v_dim1 + 1], &c__1, &workd[iwork[10]], &c__1);
1389 ipntr[1] = iwork[10];
1390 ipntr[2] = iwork[9];
1391 ipntr[3] = iwork[8];
1400 F77_FUNC(dcopy,DCOPY)(n, &workd[iwork[9]], &c__1, &resid[1], &c__1);
1407 ipntr[1] = iwork[9];
1408 ipntr[2] = iwork[8];
1412 } else if (*bmat == 'I') {
1413 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1422 workd[*n * 3 + 3] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[iwork[10]], &
1424 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
1425 } else if (*bmat == 'G') {
1426 workd[*n * 3 + 3] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &
1428 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
1429 } else if (*bmat == 'I') {
1430 workd[*n * 3 + 3] =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
1434 F77_FUNC(dgemv,DGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]]
1435 , &c__1, &c_b42, &workd[iwork[9]], &c__1);
1436 } else if (*mode == 2) {
1437 F77_FUNC(dgemv,DGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[10]
1438 ], &c__1, &c_b42, &workd[iwork[9]], &c__1);
1441 F77_FUNC(dgemv,DGEMV)("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
1442 c__1, &c_b18, &resid[1], &c__1);
1444 h__[iwork[12] + (h_dim1 << 1)] = workd[iwork[9] + iwork[12] - 1];
1445 if (iwork[12] == 1 || iwork[4] == 1) {
1446 h__[iwork[12] + h_dim1] = 0.;
1448 h__[iwork[12] + h_dim1] = *rnorm;
1455 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
1456 ipntr[1] = iwork[9];
1457 ipntr[2] = iwork[8];
1461 } else if (*bmat == 'I') {
1462 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1469 *rnorm =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1470 *rnorm = sqrt(fabs(*rnorm));
1471 } else if (*bmat == 'I') {
1472 *rnorm =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
1475 if (*rnorm > workd[*n * 3 + 3] * .717f) {
1481 F77_FUNC(dgemv,DGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]], &
1482 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 if (iwork[12] == 1 || iwork[4] == 1) {
1488 h__[iwork[12] + h_dim1] = 0.;
1490 h__[iwork[12] + (h_dim1 << 1)] += workd[iwork[9] + iwork[12] - 1];
1494 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
1495 ipntr[1] = iwork[9];
1496 ipntr[2] = iwork[8];
1500 } else if (*bmat == 'I') {
1501 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1507 workd[*n * 3 + 2] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &
1509 workd[*n * 3 + 2] = sqrt(fabs(workd[*n * 3 + 2]));
1510 } else if (*bmat == 'I') {
1511 workd[*n * 3 + 2] =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
1515 if (workd[*n * 3 + 2] > *rnorm * .717f) {
1517 *rnorm = workd[*n * 3 + 2];
1521 *rnorm = workd[*n * 3 + 2];
1523 if (iwork[1] <= 1) {
1528 for (jj = 1; jj <= i__1; ++jj) {
1539 if (h__[iwork[12] + h_dim1] < 0.) {
1540 h__[iwork[12] + h_dim1] = -h__[iwork[12] + h_dim1];
1541 if (iwork[12] < *k + *np) {
1542 F77_FUNC(dscal,DSCAL)(n, &c_b50, &v[(iwork[12] + 1) * v_dim1 + 1], &c__1);
1544 F77_FUNC(dscal,DSCAL)(n, &c_b50, &resid[1], &c__1);
1549 if (iwork[12] > *k + *np) {
1568 F77_FUNC(dsaup2,DSAUP2)(int * ido,
1598 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
1617 v_offset = 1 + v_dim1;
1620 h_offset = 1 + h_dim1;
1623 q_offset = 1 + q_dim1;
1627 eps23 = GMX_DOUBLE_EPS;
1628 eps23 = pow(eps23, c_b3);
1640 iwork[7] = iwork[9] + iwork[10];
1658 if (iwork[2] == 1) {
1659 F77_FUNC(dgetv0,DGETV0)(ido, bmat, &c__1, &iwork[3], n, &c__1, &v[v_offset], ldv, &
1660 resid[1], &workd[*n * 3 + 1], &ipntr[1], &workd[1], &iwork[41]
1667 if (workd[*n * 3 + 1] == 0.) {
1676 if (iwork[4] == 1) {
1680 if (iwork[5] == 1) {
1684 if (iwork[1] == 1) {
1688 F77_FUNC(dsaitr,DSAITR)(ido, bmat, n, &c__0, &iwork[9], mode, &resid[1], &workd[*n * 3 +
1689 1], &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
1713 F77_FUNC(dsaitr,DSAITR)(ido, bmat, n, nev, np, mode, &resid[1], &workd[*n * 3 + 1],
1714 &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
1730 F77_FUNC(dseigt,DSEIGT)(&workd[*n * 3 + 1], &iwork[7], &h__[h_offset], ldh, &ritz[1], &
1731 bounds[1], &workl[1], &ierr);
1738 F77_FUNC(dcopy,DCOPY)(&iwork[7], &ritz[1], &c__1, &workl[iwork[7] + 1], &c__1);
1739 F77_FUNC(dcopy,DCOPY)(&iwork[7], &bounds[1], &c__1, &workl[(iwork[7] << 1) + 1], &c__1);
1743 F77_FUNC(dsgets,DSGETS)(ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
1745 F77_FUNC(dcopy,DCOPY)(nev, &bounds[*np + 1], &c__1, &workl[*np + 1], &c__1);
1746 F77_FUNC(dsconv,DSCONV)(nev, &ritz[*np + 1], &workl[*np + 1], tol, &iwork[8]);
1750 for (j = 1; j <= i__1; ++j) {
1751 if (bounds[j] == 0.) {
1757 if (iwork[8] >= iwork[9] || iwork[6] > *mxiter || *np == 0) {
1759 if (!strncmp(which, "BE", 2)) {
1761 strncpy(wprime, "SA",2);
1762 F77_FUNC(dsortr,DSORTR)(wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
1764 nevm2 = *nev - nevd2;
1766 i__1 = (nevd2 < *np) ? nevd2 : *np;
1767 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np + 1;
1768 F77_FUNC(dswap,DSWAP)(&i__1, &ritz[nevm2 + 1], &c__1,
1769 &ritz[((i__2>i__3) ? i__2 : i__3)],
1771 i__1 = (nevd2 < *np) ? nevd2 : *np;
1772 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np;
1773 F77_FUNC(dswap,DSWAP)(&i__1, &bounds[nevm2 + 1], &c__1,
1774 &bounds[((i__2>i__3) ? i__2 : i__3) + 1],
1780 if (!strncmp(which, "LM", 2)) {
1781 strncpy(wprime, "SM", 2);
1783 if (!strncmp(which, "SM", 2)) {
1784 strncpy(wprime, "LM", 2);
1786 if (!strncmp(which, "LA", 2)) {
1787 strncpy(wprime, "SA", 2);
1789 if (!strncmp(which, "SA", 2)) {
1790 strncpy(wprime, "LA", 2);
1793 F77_FUNC(dsortr,DSORTR)(wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
1798 for (j = 1; j <= i__1; ++j) {
1800 d__3 = fabs(ritz[j]);
1801 temp = (d__2>d__3) ? d__2 : d__3;
1805 strncpy(wprime, "LA",2);
1806 F77_FUNC(dsortr,DSORTR)(wprime, &c__1, &iwork[9], &bounds[1], &ritz[1]);
1809 for (j = 1; j <= i__1; ++j) {
1811 d__3 = fabs(ritz[j]);
1812 temp = (d__2>d__3) ? d__2 : d__3;
1816 if (!strncmp(which, "BE", 2)) {
1818 strncpy(wprime, "LA", 2);
1819 F77_FUNC(dsortr,DSORTR)(wprime, &c__1, &iwork[8], &ritz[1], &bounds[1]);
1822 F77_FUNC(dsortr,DSORTR)(which, &c__1, &iwork[8], &ritz[1], &bounds[1]);
1826 h__[h_dim1 + 1] = workd[*n * 3 + 1];
1829 if (iwork[6] > *mxiter && iwork[8] < *nev) {
1832 if (*np == 0 && iwork[8] < iwork[9]) {
1839 } else if (iwork[8] < *nev && *ishift == 1) {
1841 i__1 = iwork[8], i__2 = *np / 2;
1842 *nev += (i__1 < i__2) ? i__1 : i__2;
1843 if (*nev == 1 && iwork[7] >= 6) {
1844 *nev = iwork[7] / 2;
1845 } else if (*nev == 1 && iwork[7] > 2) {
1848 *np = iwork[7] - *nev;
1851 if (nevbef < *nev) {
1852 F77_FUNC(dsgets,DSGETS)(ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
1870 F77_FUNC(dcopy,DCOPY)(np, &workl[1], &c__1, &ritz[1], &c__1);
1873 F77_FUNC(dsapps,DSAPPS)(n, nev, np, &ritz[1], &v[v_offset], ldv, &h__[h_offset], ldh, &
1874 resid[1], &q[q_offset], ldq, &workd[1]);
1878 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[*n + 1], &c__1);
1884 } else if (*bmat == 'I') {
1885 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
1891 workd[*n * 3 + 1] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
1892 workd[*n * 3 + 1] = sqrt(fabs(workd[*n * 3 + 1]));
1893 } else if (*bmat == 'I') {
1894 workd[*n * 3 + 1] =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
1916 F77_FUNC(dsaupd,DSAUPD)(int * ido,
1934 int v_dim1, v_offset, i__1, i__2;
1940 v_offset = 1 + v_dim1;
1951 iwork[5] = iparam[1];
1952 iwork[10] = iparam[3];
1953 iwork[12] = iparam[4];
1956 iwork[11] = iparam[7];
1961 } else if (*nev <= 0) {
1963 } else if (*ncv <= *nev || *ncv > *n) {
1968 iwork[15] = *ncv - *nev;
1970 if (iwork[10] <= 0) {
1973 if (strncmp(which,"LM",2) && strncmp(which,"SM",2) &&
1974 strncmp(which,"LA",2) && strncmp(which,"SA",2) &&
1975 strncmp(which,"BE",2)) {
1978 if (*bmat != 'I' && *bmat != 'G') {
1983 if (*lworkl < i__1 * i__1 + (*ncv << 3)) {
1986 if (iwork[11] < 1 || iwork[11] > 5) {
1988 } else if (iwork[11] == 1 && *bmat == 'G') {
1990 } else if (iwork[5] < 0 || iwork[5] > 1) {
1992 } else if (*nev == 1 && !strncmp(which, "BE", 2)) {
1996 if (iwork[2] != 0) {
2002 if (iwork[12] <= 0) {
2006 *tol = GMX_DOUBLE_EPS;
2009 iwork[15] = *ncv - *nev;
2012 i__1 = i__2 * i__2 + (*ncv << 3);
2013 for (j = 1; j <= i__1; ++j) {
2020 iwork[16] = iwork[3] + (iwork[8] << 1);
2021 iwork[1] = iwork[16] + *ncv;
2022 iwork[4] = iwork[1] + *ncv;
2024 iwork[7] = iwork[4] + i__1 * i__1;
2025 iwork[14] = iwork[7] + *ncv * 3;
2027 ipntr[4] = iwork[14];
2028 ipntr[5] = iwork[3];
2029 ipntr[6] = iwork[16];
2030 ipntr[7] = iwork[1];
2031 ipntr[11] = iwork[7];
2034 F77_FUNC(dsaup2,DSAUP2)(ido, bmat, n, which, &iwork[13], &iwork[15], tol, &resid[1], &
2035 iwork[11], &iwork[6], &iwork[5], &iwork[10], &v[v_offset], ldv, &
2036 workl[iwork[3]], &iwork[8], &workl[iwork[16]], &workl[iwork[1]], &
2037 workl[iwork[4]], &iwork[9], &workl[iwork[7]], &ipntr[1], &workd[1]
2038 , &iwork[21], info);
2041 iparam[8] = iwork[15];
2047 iparam[3] = iwork[10];
2048 iparam[5] = iwork[15];
2066 F77_FUNC(dseupd,DSEUPD)(int * rvec,
2067 const char * howmny,
2092 int v_dim1, v_offset, z_dim1, z_offset, i__1;
2093 double d__1, d__2, d__3;
2095 int j, k, ih, iq, iw, ibd, ihb, ihd, ldh, ilg, ldq, ism, irz;
2107 double thres1=0, thres2=0;
2111 int leftptr, rghtptr;
2117 z_offset = 1 + z_dim1;
2122 v_offset = 1 + v_dim1;
2146 if (*ncv <= *nev || *ncv > *n) {
2149 if (strncmp(which,"LM",2) && strncmp(which,"SM",2) &&
2150 strncmp(which,"LA",2) && strncmp(which,"SA",2) &&
2151 strncmp(which,"BE",2)) {
2154 if (*bmat != 'I' && *bmat != 'G') {
2157 if (*howmny != 'A' && *howmny != 'P' &&
2158 *howmny != 'S' && *rvec) {
2161 if (*rvec && *howmny == 'S') {
2165 if (*rvec && *lworkl < i__1 * i__1 + (*ncv << 3)) {
2169 if (mode == 1 || mode == 2) {
2170 strncpy(type__, "REGULR",6);
2171 } else if (mode == 3) {
2172 strncpy(type__, "SHIFTI",6);
2173 } else if (mode == 4) {
2174 strncpy(type__, "BUCKLE",6);
2175 } else if (mode == 5) {
2176 strncpy(type__, "CAYLEY",6);
2180 if (mode == 1 && *bmat == 'G') {
2183 if (*nev == 1 && !strncmp(which, "BE",2)) {
2200 iw = iq + ldh * *ncv;
2201 next = iw + (*ncv << 1);
2207 irz = ipntr[11] + *ncv;
2211 eps23 = GMX_DOUBLE_EPS;
2212 eps23 = pow(eps23, c_b21);
2217 } else if (*bmat == 'G') {
2218 bnorm2 =F77_FUNC(dnrm2,DNRM2)(n, &workd[1], &c__1);
2223 if (!strncmp(which,"LM",2) || !strncmp(which,"SM",2) ||
2224 !strncmp(which,"LA",2) || !strncmp(which,"SA",2)) {
2226 } else if (!strncmp(which,"BE",2)) {
2229 ism = (*nev>nconv) ? *nev : nconv;
2232 thres1 = workl[ism];
2233 thres2 = workl[ilg];
2241 for (j = 0; j <= i__1; ++j) {
2243 if (!strncmp(which,"LM",2)) {
2244 if (fabs(workl[irz + j]) >= fabs(thres1)) {
2246 d__3 = fabs(workl[irz + j]);
2247 tempbnd = (d__2>d__3) ? d__2 : d__3;
2248 if (workl[ibd + j] <= *tol * tempbnd) {
2252 } else if (!strncmp(which,"SM",2)) {
2253 if (fabs(workl[irz + j]) <= fabs(thres1)) {
2255 d__3 = fabs(workl[irz + j]);
2256 tempbnd = (d__2>d__3) ? d__2 : d__3;
2257 if (workl[ibd + j] <= *tol * tempbnd) {
2261 } else if (!strncmp(which,"LA",2)) {
2262 if (workl[irz + j] >= thres1) {
2264 d__3 = fabs(workl[irz + j]);
2265 tempbnd = (d__2>d__3) ? d__2 : d__3;
2266 if (workl[ibd + j] <= *tol * tempbnd) {
2270 } else if (!strncmp(which,"SA",2)) {
2271 if (workl[irz + j] <= thres1) {
2273 d__3 = fabs(workl[irz + j]);
2274 tempbnd = (d__2>d__3) ? d__2 : d__3;
2275 if (workl[ibd + j] <= *tol * tempbnd) {
2279 } else if (!strncmp(which,"BE",2)) {
2280 if (workl[irz + j] <= thres1 || workl[irz + j] >= thres2) {
2282 d__3 = fabs(workl[irz + j]);
2283 tempbnd = (d__2>d__3) ? d__2 : d__3;
2284 if (workl[ibd + j] <= *tol * tempbnd) {
2289 if (j + 1 > nconv) {
2290 reord = select[j + 1] || reord;
2292 if (select[j + 1]) {
2298 F77_FUNC(dcopy,DCOPY)(&i__1, &workl[ih + 1], &c__1, &workl[ihb], &c__1);
2299 F77_FUNC(dcopy,DCOPY)(ncv, &workl[ih + ldh], &c__1, &workl[ihd], &c__1);
2301 F77_FUNC(dsteqr,DSTEQR)("Identity", ncv, &workl[ihd], &workl[ihb], &workl[iq], &ldq, &
2320 if (select[leftptr]) {
2324 } else if (! select[rghtptr]) {
2330 temp = workl[ihd + leftptr - 1];
2331 workl[ihd + leftptr - 1] = workl[ihd + rghtptr - 1];
2332 workl[ihd + rghtptr - 1] = temp;
2333 F77_FUNC(dcopy,DCOPY)(ncv, &workl[iq + *ncv * (leftptr - 1)], &c__1, &workl[
2335 F77_FUNC(dcopy,DCOPY)(ncv, &workl[iq + *ncv * (rghtptr - 1)], &c__1, &workl[
2336 iq + *ncv * (leftptr - 1)], &c__1);
2337 F77_FUNC(dcopy,DCOPY)(ncv, &workl[iw], &c__1, &workl[iq + *ncv * (rghtptr -
2344 if (leftptr < rghtptr) {
2352 F77_FUNC(dcopy,DCOPY)(&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
2356 F77_FUNC(dcopy,DCOPY)(&nconv, &workl[ritz], &c__1, &d__[1], &c__1);
2357 F77_FUNC(dcopy,DCOPY)(ncv, &workl[ritz], &c__1, &workl[ihd], &c__1);
2360 if (!strncmp(type__, "REGULR",6)) {
2363 F77_FUNC(dsesrt,DSESRT)("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
2365 F77_FUNC(dcopy,DCOPY)(ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
2370 F77_FUNC(dcopy,DCOPY)(ncv, &workl[ihd], &c__1, &workl[iw], &c__1);
2371 if (!strncmp(type__, "SHIFTI", 6)) {
2373 for (k = 1; k <= i__1; ++k) {
2374 workl[ihd + k - 1] = 1. / workl[ihd + k - 1] + *sigma;
2376 } else if (!strncmp(type__, "BUCKLE",6)) {
2378 for (k = 1; k <= i__1; ++k) {
2379 workl[ihd + k - 1] = *sigma * workl[ihd + k - 1] / (workl[ihd
2382 } else if (!strncmp(type__, "CAYLEY",6)) {
2384 for (k = 1; k <= i__1; ++k) {
2385 workl[ihd + k - 1] = *sigma * (workl[ihd + k - 1] + 1.) / (
2386 workl[ihd + k - 1] - 1.);
2390 F77_FUNC(dcopy,DCOPY)(&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
2391 F77_FUNC(dsortr,DSORTR)("LA", &c__1, &nconv, &workl[ihd], &workl[iw]);
2393 F77_FUNC(dsesrt,DSESRT)("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
2395 F77_FUNC(dcopy,DCOPY)(ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
2396 d__1 = bnorm2 / rnorm;
2397 F77_FUNC(dscal,DSCAL)(ncv, &d__1, &workl[ihb], &c__1);
2398 F77_FUNC(dsortr,DSORTR)("LA", &c__1, &nconv, &d__[1], &workl[ihb]);
2403 if (*rvec && *howmny == 'A') {
2405 F77_FUNC(dgeqr2,DGEQR2)(ncv, &nconv, &workl[iq], &ldq, &workl[iw + *ncv], &workl[ihb],
2408 F77_FUNC(dorm2r,DORM2R)("Right", "Notranspose", n, ncv, &nconv, &workl[iq], &ldq, &
2409 workl[iw + *ncv], &v[v_offset], ldv, &workd[*n + 1], &ierr);
2410 F77_FUNC(dlacpy,DLACPY)("All", n, &nconv, &v[v_offset], ldv, &z__[z_offset], ldz);
2413 for (j = 1; j <= i__1; ++j) {
2414 workl[ihb + j - 1] = 0.;
2416 workl[ihb + *ncv - 1] = 1.;
2417 F77_FUNC(dorm2r,DORM2R)("Left", "Transpose", ncv, &c__1, &nconv, &workl[iq], &ldq, &
2418 workl[iw + *ncv], &workl[ihb], ncv, &temp, &ierr);
2420 } else if (*rvec && *howmny == 'S') {
2424 if (!strncmp(type__, "REGULR",6) && *rvec) {
2427 for (j = 1; j <= i__1; ++j) {
2428 workl[ihb + j - 1] = rnorm * fabs(workl[ihb + j - 1]);
2431 } else if (strncmp(type__, "REGULR",6) && *rvec) {
2433 F77_FUNC(dscal,DSCAL)(ncv, &bnorm2, &workl[ihb], &c__1);
2434 if (!strncmp(type__, "SHIFTI",6)) {
2437 for (k = 1; k <= i__1; ++k) {
2438 d__2 = workl[iw + k - 1];
2439 workl[ihb + k - 1] = fabs(workl[ihb + k - 1])/(d__2 * d__2);
2442 } else if (!strncmp(type__, "BUCKLE",6)) {
2445 for (k = 1; k <= i__1; ++k) {
2446 d__2 = workl[iw + k - 1] - 1.;
2447 workl[ihb + k - 1] = *sigma * fabs(workl[ihb + k - 1])/(d__2 * d__2);
2450 } else if (!strncmp(type__, "CAYLEY",6)) {
2453 for (k = 1; k <= i__1; ++k) {
2454 workl[ihb + k - 1] = fabs(workl[ihb + k - 1] / workl[iw + k - 1] * (workl[iw + k - 1] - 1.));
2462 if (*rvec && (!strncmp(type__, "SHIFTI",6) || !strncmp(type__, "CAYLEY",6))) {
2465 for (k = 0; k <= i__1; ++k) {
2466 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / workl[iw + k];
2469 } else if (*rvec && !strncmp(type__, "BUCKLE", 6)) {
2472 for (k = 0; k <= i__1; ++k) {
2473 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / (workl[iw + k] -
2479 if (strncmp(type__, "REGULR",6)) {
2480 F77_FUNC(dger,DGER)(n, &nconv, &c_b102, &resid[1], &c__1, &workl[iw], &c__1, &z__[
2494 /* Selected single precision arpack routines */
2498 F77_FUNC(sstqrb,SSTQRB)(int * n,
2512 int i__, j, k, l, m;
2514 int l1, ii, mm, lm1, mm1, nm1;
2515 float rt1, rt2, eps;
2518 int lend, jtot, lendm1, lendp1, iscale;
2520 int lendsv, nmaxit, icompz;
2521 float ssfmax, ssfmin,safmin,minval,safmax,anorm;
2544 eps = GMX_FLOAT_EPS;
2548 minval = GMX_FLOAT_MIN;
2549 safmin = minval / GMX_FLOAT_EPS;
2550 safmax = 1. / safmin;
2551 ssfmax = sqrt(safmax) / 3.;
2552 ssfmin = sqrt(safmin) / eps2;
2556 for (j = 1; j <= i__1; ++j) {
2578 for (m = l1; m <= i__1; ++m) {
2583 if (tst <= sqrt(fabs(d__[m])) * sqrt(fabs(d__[m+1])) * eps) {
2601 i__1 = lend - l + 1;
2602 anorm =F77_FUNC(slanst,SLANST)("i", &i__1, &d__[l], &e[l]);
2607 if (anorm > ssfmax) {
2609 i__1 = lend - l + 1;
2610 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n,
2613 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n,
2615 } else if (anorm < ssfmin) {
2617 i__1 = lend - l + 1;
2618 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n,
2621 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n,
2625 if (fabs(d__[lend]) < fabs(d__[l])) {
2636 for (m = l; m <= i__1; ++m) {
2639 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m + 1]) + safmin) {
2658 F77_FUNC(slaev2,SLAEV2)(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s);
2660 work[*n - 1 + l] = s;
2663 z__[l + 1] = c__ * tst - s * z__[l];
2664 z__[l] = s * tst + c__ * z__[l];
2666 F77_FUNC(slae2,SLAE2)(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2);
2678 if (jtot == nmaxit) {
2683 g = (d__[l + 1] - p) / (e[l] * 2.);
2684 r__ =F77_FUNC(slapy2,SLAPY2)(&g, &c_b31);
2685 g = d__[m] - p + e[l] / (g + ((g>0) ? r__ : -r__ ));
2693 for (i__ = mm1; i__ >= i__1; --i__) {
2696 F77_FUNC(slartg,SLARTG)(&g, &f, &c__, &s, &r__);
2700 g = d__[i__ + 1] - p;
2701 r__ = (d__[i__] - g) * s + c__ * 2. * b;
2703 d__[i__ + 1] = g + p;
2708 work[*n - 1 + i__] = -s;
2716 F77_FUNC(slasr,SLASR)("r", "v", "b", &c__1, &mm, &work[l], &work[*n - 1 + l], &
2739 for (m = l; m >= i__1; --m) {
2740 d__2 = fabs(e[m - 1]);
2742 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m- 1]) + safmin) {
2761 F77_FUNC(slaev2,SLAEV2)(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s)
2765 z__[l] = c__ * tst - s * z__[l - 1];
2766 z__[l - 1] = s * tst + c__ * z__[l - 1];
2768 F77_FUNC(slae2,SLAE2)(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2);
2780 if (jtot == nmaxit) {
2786 g = (d__[l - 1] - p) / (e[l - 1] * 2.);
2787 r__ =F77_FUNC(slapy2,SLAPY2)(&g, &c_b31);
2788 g = d__[m] - p + e[l - 1] / (g + ((g>0) ? r__ : -r__ ));
2796 for (i__ = m; i__ <= i__1; ++i__) {
2799 F77_FUNC(slartg,SLARTG)(&g, &f, &c__, &s, &r__);
2804 r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b;
2811 work[*n - 1 + i__] = s;
2819 F77_FUNC(slasr,SLASR)("r", "v", "f", &c__1, &mm, &work[m], &work[*n - 1 + m], &
2840 i__1 = lendsv - lsv + 1;
2841 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv],
2843 i__1 = lendsv - lsv;
2844 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n,
2846 } else if (iscale == 2) {
2847 i__1 = lendsv - lsv + 1;
2848 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv],
2850 i__1 = lendsv - lsv;
2851 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n,
2855 if (jtot < nmaxit) {
2859 for (i__ = 1; i__ <= i__1; ++i__) {
2869 F77_FUNC(slasrt,SLASRT)("i", n, &d__[1], info);
2874 for (ii = 2; ii <= i__1; ++ii) {
2879 for (j = ii; j <= i__2; ++j) {
2902 F77_FUNC(sgetv0,SGETV0)(int * ido,
2921 int v_dim1, v_offset, i__1;
2929 v_offset = 1 + v_dim1;
2943 F77_FUNC(slarnv,SLARNV)(&idist, &iwork[1], n, &resid[1]);
2949 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
2955 if (iwork[5] == 1) {
2959 if (iwork[6] == 1) {
2965 F77_FUNC(scopy,SCOPY)(n, &workd[*n + 1], &c__1, &resid[1], &c__1);
2970 } else if (*bmat == 'I') {
2971 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
2979 workd[*n * 3 + 4] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
2980 workd[*n * 3 + 4] = sqrt(fabs(workd[*n * 3 + 4]));
2981 } else if (*bmat == 'I') {
2982 workd[*n * 3 + 4] =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
2984 *rnorm = workd[*n * 3 + 4];
2993 F77_FUNC(sgemv,SGEMV)("T", n, &i__1, &c_b22, &v[v_offset], ldv, &workd[1], &c__1, &c_b24,
2994 &workd[*n + 1], &c__1);
2996 F77_FUNC(sgemv,SGEMV)("N", n, &i__1, &c_b27, &v[v_offset], ldv, &workd[*n + 1], &c__1, &
2997 c_b22, &resid[1], &c__1);
3000 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[*n + 1], &c__1);
3005 } else if (*bmat == 'I') {
3006 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
3012 *rnorm =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
3013 *rnorm = sqrt(fabs(*rnorm));
3014 } else if (*bmat == 'I') {
3015 *rnorm =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
3018 if (*rnorm > workd[*n * 3 + 4] * .717f) {
3023 if (iwork[7] <= 1) {
3025 workd[*n * 3 + 4] = *rnorm;
3030 for (jj = 1; jj <= i__1; ++jj) {
3050 F77_FUNC(ssapps,SSAPPS)(int * n,
3067 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
3071 float r__, s, a1, a2, a3, a4;
3082 v_offset = 1 + v_dim1;
3085 h_offset = 1 + h_dim1;
3088 q_offset = 1 + q_dim1;
3091 epsmch = GMX_FLOAT_EPS;
3095 kplusp = *kev + *np;
3097 F77_FUNC(slaset,SLASET)("All", &kplusp, &kplusp, &c_b4, &c_b5, &q[q_offset], ldq);
3104 for (jj = 1; jj <= i__1; ++jj) {
3111 for (i__ = istart; i__ <= i__2; ++i__) {
3112 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__ + 1 + (h_dim1*2)]);
3113 if (h__[i__ + 1 + h_dim1] <= epsmch * big) {
3114 h__[i__ + 1 + h_dim1] = 0.;
3122 if (istart < iend) {
3124 f = h__[istart + (h_dim1 << 1)] - shift[jj];
3125 g = h__[istart + 1 + h_dim1];
3126 F77_FUNC(slartg,SLARTG)(&f, &g, &c__, &s, &r__);
3128 a1 = c__ * h__[istart + (h_dim1 << 1)] + s * h__[istart + 1 +
3130 a2 = c__ * h__[istart + 1 + h_dim1] + s * h__[istart + 1 + (
3132 a4 = c__ * h__[istart + 1 + (h_dim1 << 1)] - s * h__[istart + 1 +
3134 a3 = c__ * h__[istart + 1 + h_dim1] - s * h__[istart + (h_dim1 <<
3136 h__[istart + (h_dim1 << 1)] = c__ * a1 + s * a2;
3137 h__[istart + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
3138 h__[istart + 1 + h_dim1] = c__ * a3 + s * a4;
3141 i__2 = (i__3<kplusp) ? i__3 : kplusp;
3142 for (j = 1; j <= i__2; ++j) {
3143 a1 = c__ * q[j + istart * q_dim1] + s * q[j + (istart + 1) *
3145 q[j + (istart + 1) * q_dim1] = -s * q[j + istart * q_dim1] +
3146 c__ * q[j + (istart + 1) * q_dim1];
3147 q[j + istart * q_dim1] = a1;
3152 for (i__ = istart + 1; i__ <= i__2; ++i__) {
3154 f = h__[i__ + h_dim1];
3155 g = s * h__[i__ + 1 + h_dim1];
3157 h__[i__ + 1 + h_dim1] = c__ * h__[i__ + 1 + h_dim1];
3158 F77_FUNC(slartg,SLARTG)(&f, &g, &c__, &s, &r__);
3166 h__[i__ + h_dim1] = r__;
3168 a1 = c__ * h__[i__ + (h_dim1 << 1)] + s * h__[i__ + 1 +
3170 a2 = c__ * h__[i__ + 1 + h_dim1] + s * h__[i__ + 1 + (h_dim1
3172 a3 = c__ * h__[i__ + 1 + h_dim1] - s * h__[i__ + (h_dim1 << 1)
3174 a4 = c__ * h__[i__ + 1 + (h_dim1 << 1)] - s * h__[i__ + 1 +
3177 h__[i__ + (h_dim1 << 1)] = c__ * a1 + s * a2;
3178 h__[i__ + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
3179 h__[i__ + 1 + h_dim1] = c__ * a3 + s * a4;
3182 i__3 = (i__4<kplusp) ? i__4 : kplusp;
3183 for (j = 1; j <= i__3; ++j) {
3184 a1 = c__ * q[j + i__ * q_dim1] + s * q[j + (i__ + 1) *
3186 q[j + (i__ + 1) * q_dim1] = -s * q[j + i__ * q_dim1] +
3187 c__ * q[j + (i__ + 1) * q_dim1];
3188 q[j + i__ * q_dim1] = a1;
3197 if (h__[iend + h_dim1] < 0.) {
3198 h__[iend + h_dim1] = -h__[iend + h_dim1];
3199 F77_FUNC(sscal,SSCAL)(&kplusp, &c_b14, &q[iend * q_dim1 + 1], &c__1);
3202 if (iend < kplusp) {
3207 for (i__ = itop; i__ <= i__2; ++i__) {
3208 if (h__[i__ + 1 + h_dim1] > 0.) {
3219 for (i__ = itop; i__ <= i__1; ++i__) {
3220 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__+ 1 + (h_dim1*2)]);
3221 if (h__[i__ + 1 + h_dim1] <= epsmch * big) {
3222 h__[i__ + 1 + h_dim1] = 0.;
3227 if (h__[*kev + 1 + h_dim1] > 0.) {
3228 F77_FUNC(sgemv,SGEMV)("N", n, &kplusp, &c_b5, &v[v_offset], ldv, &q[(*kev + 1) *
3229 q_dim1 + 1], &c__1, &c_b4, &workd[*n + 1], &c__1);
3233 for (i__ = 1; i__ <= i__1; ++i__) {
3234 i__2 = kplusp - i__ + 1;
3235 F77_FUNC(sgemv,SGEMV)("N", n, &i__2, &c_b5, &v[v_offset], ldv, &q[(*kev - i__ + 1) *
3236 q_dim1 + 1], &c__1, &c_b4, &workd[1], &c__1);
3237 F77_FUNC(scopy,SCOPY)(n, &workd[1], &c__1, &v[(kplusp - i__ + 1) * v_dim1 + 1], &
3242 F77_FUNC(slacpy,SLACPY)("All", n, kev, &v[(*np + 1) * v_dim1 + 1], ldv, &v[v_offset], ldv);
3244 if (h__[*kev + 1 + h_dim1] > 0.) {
3245 F77_FUNC(scopy,SCOPY)(n, &workd[*n + 1], &c__1, &v[(*kev + 1) * v_dim1 + 1], &c__1);
3248 F77_FUNC(sscal,SSCAL)(n, &q[kplusp + *kev * q_dim1], &resid[1], &c__1);
3249 if (h__[*kev + 1 + h_dim1] > 0.) {
3250 F77_FUNC(saxpy,SAXPY)(n, &h__[*kev + 1 + h_dim1], &v[(*kev + 1) * v_dim1 + 1], &c__1,
3264 F77_FUNC(ssortr,SSORTR)(const char * which,
3279 if (!strncmp(which, "SA", 2)) {
3286 for (i__ = igap; i__ <= i__1; ++i__) {
3294 if (x1[j] < x1[j + igap]) {
3296 x1[j] = x1[j + igap];
3297 x1[j + igap] = temp;
3300 x2[j] = x2[j + igap];
3301 x2[j + igap] = temp;
3314 } else if (!strncmp(which, "SM", 2)) {
3321 for (i__ = igap; i__ <= i__1; ++i__) {
3329 if (fabs(x1[j]) < fabs(x1[j + igap])) {
3331 x1[j] = x1[j + igap];
3332 x1[j + igap] = temp;
3335 x2[j] = x2[j + igap];
3336 x2[j + igap] = temp;
3349 } else if (!strncmp(which, "LA", 2)) {
3356 for (i__ = igap; i__ <= i__1; ++i__) {
3364 if (x1[j] > x1[j + igap]) {
3366 x1[j] = x1[j + igap];
3367 x1[j + igap] = temp;
3370 x2[j] = x2[j + igap];
3371 x2[j + igap] = temp;
3384 } else if (!strncmp(which, "LM", 2)) {
3392 for (i__ = igap; i__ <= i__1; ++i__) {
3400 if (fabs(x1[j]) > fabs(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;
3430 F77_FUNC(ssesrt,SSESRT)(const char * which,
3438 int a_dim1, a_offset, i__1;
3445 a_offset = 1 + a_dim1 * 0;
3450 if (!strncmp(which, "SA", 2)) {
3457 for (i__ = igap; i__ <= i__1; ++i__) {
3465 if (x[j] < x[j + igap]) {
3470 F77_FUNC(sswap,SSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
3471 a_dim1 + 1], &c__1);
3484 } else if (!strncmp(which, "SM", 2)) {
3491 for (i__ = igap; i__ <= i__1; ++i__) {
3499 if (fabs(x[j]) < fabs(x[j + igap])) {
3504 F77_FUNC(sswap,SSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
3505 a_dim1 + 1], &c__1);
3518 } else if (!strncmp(which, "LA", 2)) {
3525 for (i__ = igap; i__ <= i__1; ++i__) {
3533 if (x[j] > x[j + igap]) {
3538 F77_FUNC(sswap,SSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
3539 a_dim1 + 1], &c__1);
3552 } else if (!strncmp(which, "LM", 2)) {
3559 for (i__ = igap; i__ <= i__1; ++i__) {
3567 if (fabs(x[j]) > fabs(x[j + igap])) {
3572 F77_FUNC(sswap,SSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
3573 a_dim1 + 1], &c__1);
3596 F77_FUNC(ssgets,SSGETS)(int * ishift,
3612 if (!strncmp(which, "BE", 2)) {
3614 F77_FUNC(ssortr,SSORTR)("LA", &c__1, &i__1, &ritz[1], &bounds[1]);
3617 i__1 = (kevd2<*np) ? kevd2 : *np;
3618 i__2 = (kevd2>*np) ? kevd2 : *np;
3619 F77_FUNC(sswap,SSWAP)(&i__1, &ritz[1], &c__1,
3620 &ritz[i__2 + 1], &c__1);
3621 i__1 = (kevd2<*np) ? kevd2 : *np;
3622 i__2 = (kevd2>*np) ? kevd2 : *np;
3623 F77_FUNC(sswap,SSWAP)(&i__1, &bounds[1], &c__1,
3624 &bounds[i__2 + 1], &c__1);
3629 F77_FUNC(ssortr,SSORTR)(which, &c__1, &i__1, &ritz[1], &bounds[1]);
3632 if (*ishift == 1 && *np > 0) {
3634 F77_FUNC(ssortr,SSORTR)("SM", &c__1, np, &bounds[1], &ritz[1]);
3635 F77_FUNC(scopy,SCOPY)(np, &ritz[1], &c__1, &shifts[1], &c__1);
3645 F77_FUNC(ssconv,SSCONV)(int * n,
3661 eps23 = GMX_FLOAT_EPS;
3662 eps23 = pow(eps23, c_b3);
3666 for (i__ = 1; i__ <= i__1; ++i__) {
3669 d__3 = fabs(ritz[i__]);
3670 temp = (d__2 > d__3) ? d__2 : d__3;
3671 if (bounds[i__] <= *tol * temp) {
3681 F77_FUNC(sseigt,SSEIGT)(float * rnorm,
3691 int h_dim1, h_offset, i__1;
3700 h_offset = 1 + h_dim1;
3703 F77_FUNC(scopy,SCOPY)(n, &h__[(h_dim1 << 1) + 1], &c__1, &eig[1], &c__1);
3705 F77_FUNC(scopy,SCOPY)(&i__1, &h__[h_dim1 + 2], &c__1, &workl[1], &c__1);
3706 F77_FUNC(sstqrb,SSTQRB)(n, &eig[1], &workl[1], &bounds[1], &workl[*n + 1], ierr);
3712 for (k = 1; k <= i__1; ++k) {
3713 bounds[k] = *rnorm * fabs(bounds[k]);
3726 F77_FUNC(ssaitr,SSAITR)(int * ido,
3750 int h_dim1, h_offset, v_dim1, v_offset, i__1;
3754 float safmin,minval;
3760 v_offset = 1 + v_dim1;
3763 h_offset = 1 + h_dim1;
3767 minval = GMX_FLOAT_MIN;
3768 safmin = minval / GMX_FLOAT_EPS;
3781 iwork[9] = iwork[8] + *n;
3782 iwork[10] = iwork[9] + *n;
3785 if (iwork[5] == 1) {
3788 if (iwork[6] == 1) {
3791 if (iwork[2] == 1) {
3794 if (iwork[3] == 1) {
3797 if (iwork[4] == 1) {
3814 F77_FUNC(sgetv0,sgetv0)(ido, bmat, &iwork[11], &c__0, n, &iwork[12], &v[v_offset], ldv,
3815 &resid[1], rnorm, &ipntr[1], &workd[1], &iwork[21], &iwork[7]);
3821 if (iwork[11] <= 3) {
3825 *info = iwork[12] - 1;
3832 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &v[iwork[12] * v_dim1 + 1], &c__1);
3833 if (*rnorm >= safmin) {
3834 temp1 = 1. / *rnorm;
3835 F77_FUNC(sscal,SSCAL)(n, &temp1, &v[iwork[12] * v_dim1 + 1], &c__1);
3836 F77_FUNC(sscal,SSCAL)(n, &temp1, &workd[iwork[8]], &c__1);
3839 F77_FUNC(slascl,SLASCL)("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &v[iwork[12] *
3840 v_dim1 + 1], n, &infol);
3841 F77_FUNC(slascl,SLASCL)("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &workd[iwork[
3846 F77_FUNC(scopy,SCOPY)(n, &v[iwork[12] * v_dim1 + 1], &c__1, &workd[iwork[10]], &c__1);
3847 ipntr[1] = iwork[10];
3848 ipntr[2] = iwork[9];
3849 ipntr[3] = iwork[8];
3858 F77_FUNC(scopy,SCOPY)(n, &workd[iwork[9]], &c__1, &resid[1], &c__1);
3865 ipntr[1] = iwork[9];
3866 ipntr[2] = iwork[8];
3870 } else if (*bmat == 'I') {
3871 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
3880 workd[*n * 3 + 3] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[iwork[10]], &
3882 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
3883 } else if (*bmat == 'G') {
3884 workd[*n * 3 + 3] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &
3886 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
3887 } else if (*bmat == 'I') {
3888 workd[*n * 3 + 3] =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
3892 F77_FUNC(sgemv,SGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]]
3893 , &c__1, &c_b42, &workd[iwork[9]], &c__1);
3894 } else if (*mode == 2) {
3895 F77_FUNC(sgemv,SGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[10]
3896 ], &c__1, &c_b42, &workd[iwork[9]], &c__1);
3899 F77_FUNC(sgemv,SGEMV)("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
3900 c__1, &c_b18, &resid[1], &c__1);
3902 h__[iwork[12] + (h_dim1 << 1)] = workd[iwork[9] + iwork[12] - 1];
3903 if (iwork[12] == 1 || iwork[4] == 1) {
3904 h__[iwork[12] + h_dim1] = 0.;
3906 h__[iwork[12] + h_dim1] = *rnorm;
3913 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
3914 ipntr[1] = iwork[9];
3915 ipntr[2] = iwork[8];
3919 } else if (*bmat == 'I') {
3920 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
3927 *rnorm =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
3928 *rnorm = sqrt(fabs(*rnorm));
3929 } else if (*bmat == 'I') {
3930 *rnorm =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
3933 if (*rnorm > workd[*n * 3 + 3] * .717f) {
3939 F77_FUNC(sgemv,SGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]], &
3940 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 if (iwork[12] == 1 || iwork[4] == 1) {
3946 h__[iwork[12] + h_dim1] = 0.;
3948 h__[iwork[12] + (h_dim1 << 1)] += workd[iwork[9] + iwork[12] - 1];
3952 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
3953 ipntr[1] = iwork[9];
3954 ipntr[2] = iwork[8];
3958 } else if (*bmat == 'I') {
3959 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
3965 workd[*n * 3 + 2] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &
3967 workd[*n * 3 + 2] = sqrt(fabs(workd[*n * 3 + 2]));
3968 } else if (*bmat == 'I') {
3969 workd[*n * 3 + 2] =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
3973 if (workd[*n * 3 + 2] > *rnorm * .717f) {
3975 *rnorm = workd[*n * 3 + 2];
3979 *rnorm = workd[*n * 3 + 2];
3981 if (iwork[1] <= 1) {
3986 for (jj = 1; jj <= i__1; ++jj) {
3997 if (h__[iwork[12] + h_dim1] < 0.) {
3998 h__[iwork[12] + h_dim1] = -h__[iwork[12] + h_dim1];
3999 if (iwork[12] < *k + *np) {
4000 F77_FUNC(sscal,SSCAL)(n, &c_b50, &v[(iwork[12] + 1) * v_dim1 + 1], &c__1);
4002 F77_FUNC(sscal,SSCAL)(n, &c_b50, &resid[1], &c__1);
4007 if (iwork[12] > *k + *np) {
4026 F77_FUNC(ssaup2,SSAUP2)(int * ido,
4056 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
4075 v_offset = 1 + v_dim1;
4078 h_offset = 1 + h_dim1;
4081 q_offset = 1 + q_dim1;
4085 eps23 = GMX_FLOAT_EPS;
4086 eps23 = pow(eps23, c_b3);
4098 iwork[7] = iwork[9] + iwork[10];
4116 if (iwork[2] == 1) {
4117 F77_FUNC(sgetv0,SGETV0)(ido, bmat, &c__1, &iwork[3], n, &c__1, &v[v_offset], ldv, &
4118 resid[1], &workd[*n * 3 + 1], &ipntr[1], &workd[1], &iwork[41]
4125 if (workd[*n * 3 + 1] == 0.) {
4134 if (iwork[4] == 1) {
4138 if (iwork[5] == 1) {
4142 if (iwork[1] == 1) {
4146 F77_FUNC(ssaitr,SSAITR)(ido, bmat, n, &c__0, &iwork[9], mode, &resid[1], &workd[*n * 3 +
4147 1], &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
4171 F77_FUNC(ssaitr,SSAITR)(ido, bmat, n, nev, np, mode, &resid[1], &workd[*n * 3 + 1], &v[
4172 v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1], &iwork[
4188 F77_FUNC(sseigt,SSEIGT)(&workd[*n * 3 + 1], &iwork[7], &h__[h_offset], ldh, &ritz[1], &
4189 bounds[1], &workl[1], &ierr);
4196 F77_FUNC(scopy,SCOPY)(&iwork[7], &ritz[1], &c__1, &workl[iwork[7] + 1], &c__1);
4197 F77_FUNC(scopy,SCOPY)(&iwork[7], &bounds[1], &c__1, &workl[(iwork[7] << 1) + 1], &c__1);
4201 F77_FUNC(ssgets,SSGETS)(ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
4203 F77_FUNC(scopy,SCOPY)(nev, &bounds[*np + 1], &c__1, &workl[*np + 1], &c__1);
4204 F77_FUNC(ssconv,SSCONV)(nev, &ritz[*np + 1], &workl[*np + 1], tol, &iwork[8]);
4209 for (j = 1; j <= i__1; ++j) {
4210 if (bounds[j] == 0.) {
4216 if (iwork[8] >= iwork[9] || iwork[6] > *mxiter || *np == 0) {
4218 if (!strncmp(which, "BE", 2)) {
4220 strncpy(wprime, "SA",2);
4221 F77_FUNC(ssortr,SSORTR)(wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
4223 nevm2 = *nev - nevd2;
4225 i__1 = (nevd2 < *np) ? nevd2 : *np;
4226 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np + 1;
4227 F77_FUNC(sswap,SSWAP)(&i__1, &ritz[nevm2 + 1], &c__1,
4228 &ritz[((i__2>i__3) ? i__2 : i__3)],
4230 i__1 = (nevd2 < *np) ? nevd2 : *np;
4231 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np;
4232 F77_FUNC(sswap,SSWAP)(&i__1, &bounds[nevm2 + 1], &c__1,
4233 &bounds[((i__2>i__3) ? i__2 : i__3) + 1],
4239 if (!strncmp(which, "LM", 2)) {
4240 strncpy(wprime, "SM", 2);
4242 if (!strncmp(which, "SM", 2)) {
4243 strncpy(wprime, "LM", 2);
4245 if (!strncmp(which, "LA", 2)) {
4246 strncpy(wprime, "SA", 2);
4248 if (!strncmp(which, "SA", 2)) {
4249 strncpy(wprime, "LA", 2);
4252 F77_FUNC(ssortr,SSORTR)(wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
4257 for (j = 1; j <= i__1; ++j) {
4259 d__3 = fabs(ritz[j]);
4260 temp = (d__2>d__3) ? d__2 : d__3;
4264 strncpy(wprime, "LA",2);
4265 F77_FUNC(ssortr,SSORTR)(wprime, &c__1, &iwork[9], &bounds[1], &ritz[1]);
4268 for (j = 1; j <= i__1; ++j) {
4270 d__3 = fabs(ritz[j]);
4271 temp = (d__2>d__3) ? d__2 : d__3;
4275 if (!strncmp(which, "BE", 2)) {
4277 strncpy(wprime, "LA", 2);
4278 F77_FUNC(ssortr,SSORTR)(wprime, &c__1, &iwork[8], &ritz[1], &bounds[1]);
4281 F77_FUNC(ssortr,SSORTR)(which, &c__1, &iwork[8], &ritz[1], &bounds[1]);
4285 h__[h_dim1 + 1] = workd[*n * 3 + 1];
4288 if (iwork[6] > *mxiter && iwork[8] < *nev) {
4291 if (*np == 0 && iwork[8] < iwork[9]) {
4298 } else if (iwork[8] < *nev && *ishift == 1) {
4300 i__1 = iwork[8], i__2 = *np / 2;
4301 *nev += (i__1 < i__2) ? i__1 : i__2;
4302 if (*nev == 1 && iwork[7] >= 6) {
4303 *nev = iwork[7] / 2;
4304 } else if (*nev == 1 && iwork[7] > 2) {
4307 *np = iwork[7] - *nev;
4310 if (nevbef < *nev) {
4311 F77_FUNC(ssgets,SSGETS)(ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
4329 F77_FUNC(scopy,SCOPY)(np, &workl[1], &c__1, &ritz[1], &c__1);
4332 F77_FUNC(ssapps,SSAPPS)(n, nev, np, &ritz[1], &v[v_offset], ldv, &h__[h_offset], ldh, &
4333 resid[1], &q[q_offset], ldq, &workd[1]);
4337 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[*n + 1], &c__1);
4343 } else if (*bmat == 'I') {
4344 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
4350 workd[*n * 3 + 1] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
4351 workd[*n * 3 + 1] = sqrt(fabs(workd[*n * 3 + 1]));
4352 } else if (*bmat == 'I') {
4353 workd[*n * 3 + 1] =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
4375 F77_FUNC(ssaupd,SSAUPD)(int * ido,
4393 int v_dim1, v_offset, i__1, i__2;
4399 v_offset = 1 + v_dim1;
4410 iwork[5] = iparam[1];
4411 iwork[10] = iparam[3];
4412 iwork[12] = iparam[4];
4415 iwork[11] = iparam[7];
4420 } else if (*nev <= 0) {
4422 } else if (*ncv <= *nev || *ncv > *n) {
4427 iwork[15] = *ncv - *nev;
4429 if (iwork[10] <= 0) {
4432 if (strncmp(which,"LM",2) && strncmp(which,"SM",2) &&
4433 strncmp(which,"LA",2) && strncmp(which,"SA",2) &&
4434 strncmp(which,"BE",2)) {
4437 if (*bmat != 'I' && *bmat != 'G') {
4442 if (*lworkl < i__1 * i__1 + (*ncv << 3)) {
4445 if (iwork[11] < 1 || iwork[11] > 5) {
4447 } else if (iwork[11] == 1 && *bmat == 'G') {
4449 } else if (iwork[5] < 0 || iwork[5] > 1) {
4451 } else if (*nev == 1 && !strncmp(which, "BE", 2)) {
4455 if (iwork[2] != 0) {
4461 if (iwork[12] <= 0) {
4465 *tol = GMX_FLOAT_EPS;
4468 iwork[15] = *ncv - *nev;
4471 i__1 = i__2 * i__2 + (*ncv << 3);
4472 for (j = 1; j <= i__1; ++j) {
4479 iwork[16] = iwork[3] + (iwork[8] << 1);
4480 iwork[1] = iwork[16] + *ncv;
4481 iwork[4] = iwork[1] + *ncv;
4483 iwork[7] = iwork[4] + i__1 * i__1;
4484 iwork[14] = iwork[7] + *ncv * 3;
4486 ipntr[4] = iwork[14];
4487 ipntr[5] = iwork[3];
4488 ipntr[6] = iwork[16];
4489 ipntr[7] = iwork[1];
4490 ipntr[11] = iwork[7];
4493 F77_FUNC(ssaup2,SSAUP2)(ido, bmat, n, which, &iwork[13], &iwork[15], tol, &resid[1], &
4494 iwork[11], &iwork[6], &iwork[5], &iwork[10], &v[v_offset], ldv, &
4495 workl[iwork[3]], &iwork[8], &workl[iwork[16]], &workl[iwork[1]], &
4496 workl[iwork[4]], &iwork[9], &workl[iwork[7]], &ipntr[1], &workd[1]
4497 , &iwork[21], info);
4500 iparam[8] = iwork[15];
4506 iparam[3] = iwork[10];
4507 iparam[5] = iwork[15];
4525 F77_FUNC(sseupd,SSEUPD)(int * rvec,
4526 const char * howmny,
4551 int v_dim1, v_offset, z_dim1, z_offset, i__1;
4552 float d__1, d__2, d__3;
4554 int j, k, ih, iq, iw, ibd, ihb, ihd, ldh, ilg, ldq, ism, irz;
4566 float thres1=0, thres2=0;
4570 int leftptr, rghtptr;
4576 z_offset = 1 + z_dim1;
4581 v_offset = 1 + v_dim1;
4605 if (*ncv <= *nev || *ncv > *n) {
4608 if (strncmp(which,"LM",2) && strncmp(which,"SM",2) &&
4609 strncmp(which,"LA",2) && strncmp(which,"SA",2) &&
4610 strncmp(which,"BE",2)) {
4613 if (*bmat != 'I' && *bmat != 'G') {
4616 if (*howmny != 'A' && *howmny != 'P' &&
4617 *howmny != 'S' && *rvec) {
4620 if (*rvec && *howmny == 'S') {
4624 if (*rvec && *lworkl < i__1 * i__1 + (*ncv << 3)) {
4628 if (mode == 1 || mode == 2) {
4629 strncpy(type__, "REGULR",6);
4630 } else if (mode == 3) {
4631 strncpy(type__, "SHIFTI",6);
4632 } else if (mode == 4) {
4633 strncpy(type__, "BUCKLE",6);
4634 } else if (mode == 5) {
4635 strncpy(type__, "CAYLEY",6);
4639 if (mode == 1 && *bmat == 'G') {
4642 if (*nev == 1 && !strncmp(which, "BE",2)) {
4659 iw = iq + ldh * *ncv;
4660 next = iw + (*ncv << 1);
4666 irz = ipntr[11] + *ncv;
4670 eps23 = GMX_FLOAT_EPS;
4671 eps23 = pow(eps23, c_b21);
4676 } else if (*bmat == 'G') {
4677 bnorm2 =F77_FUNC(snrm2,SNRM2)(n, &workd[1], &c__1);
4682 if (!strncmp(which,"LM",2) || !strncmp(which,"SM",2) ||
4683 !strncmp(which,"LA",2) || !strncmp(which,"SA",2)) {
4685 } else if (!strncmp(which,"BE",2)) {
4688 ism = (*nev>nconv) ? *nev : nconv;
4691 thres1 = workl[ism];
4692 thres2 = workl[ilg];
4700 for (j = 0; j <= i__1; ++j) {
4702 if (!strncmp(which,"LM",2)) {
4703 if (fabs(workl[irz + j]) >= fabs(thres1)) {
4705 d__3 = fabs(workl[irz + j]);
4706 tempbnd = (d__2>d__3) ? d__2 : d__3;
4707 if (workl[ibd + j] <= *tol * tempbnd) {
4711 } else if (!strncmp(which,"SM",2)) {
4712 if (fabs(workl[irz + j]) <= fabs(thres1)) {
4714 d__3 = fabs(workl[irz + j]);
4715 tempbnd = (d__2>d__3) ? d__2 : d__3;
4716 if (workl[ibd + j] <= *tol * tempbnd) {
4720 } else if (!strncmp(which,"LA",2)) {
4721 if (workl[irz + j] >= thres1) {
4723 d__3 = fabs(workl[irz + j]);
4724 tempbnd = (d__2>d__3) ? d__2 : d__3;
4725 if (workl[ibd + j] <= *tol * tempbnd) {
4729 } else if (!strncmp(which,"SA",2)) {
4730 if (workl[irz + j] <= thres1) {
4732 d__3 = fabs(workl[irz + j]);
4733 tempbnd = (d__2>d__3) ? d__2 : d__3;
4734 if (workl[ibd + j] <= *tol * tempbnd) {
4738 } else if (!strncmp(which,"BE",2)) {
4739 if (workl[irz + j] <= thres1 || workl[irz + j] >= thres2) {
4741 d__3 = fabs(workl[irz + j]);
4742 tempbnd = (d__2>d__3) ? d__2 : d__3;
4743 if (workl[ibd + j] <= *tol * tempbnd) {
4748 if (j + 1 > nconv) {
4749 reord = select[j + 1] || reord;
4751 if (select[j + 1]) {
4757 F77_FUNC(scopy,SCOPY)(&i__1, &workl[ih + 1], &c__1, &workl[ihb], &c__1);
4758 F77_FUNC(scopy,SCOPY)(ncv, &workl[ih + ldh], &c__1, &workl[ihd], &c__1);
4760 F77_FUNC(ssteqr,SSTEQR)("Identity", ncv, &workl[ihd], &workl[ihb], &workl[iq], &ldq, &
4779 if (select[leftptr]) {
4783 } else if (! select[rghtptr]) {
4789 temp = workl[ihd + leftptr - 1];
4790 workl[ihd + leftptr - 1] = workl[ihd + rghtptr - 1];
4791 workl[ihd + rghtptr - 1] = temp;
4792 F77_FUNC(scopy,SCOPY)(ncv, &workl[iq + *ncv * (leftptr - 1)], &c__1, &workl[
4794 F77_FUNC(scopy,SCOPY)(ncv, &workl[iq + *ncv * (rghtptr - 1)], &c__1, &workl[
4795 iq + *ncv * (leftptr - 1)], &c__1);
4796 F77_FUNC(scopy,SCOPY)(ncv, &workl[iw], &c__1, &workl[iq + *ncv * (rghtptr -
4803 if (leftptr < rghtptr) {
4811 F77_FUNC(scopy,SCOPY)(&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
4815 F77_FUNC(scopy,SCOPY)(&nconv, &workl[ritz], &c__1, &d__[1], &c__1);
4816 F77_FUNC(scopy,SCOPY)(ncv, &workl[ritz], &c__1, &workl[ihd], &c__1);
4819 if (!strncmp(type__, "REGULR",6)) {
4822 F77_FUNC(ssesrt,SSESRT)("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
4824 F77_FUNC(scopy,SCOPY)(ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
4829 F77_FUNC(scopy,SCOPY)(ncv, &workl[ihd], &c__1, &workl[iw], &c__1);
4830 if (!strncmp(type__, "SHIFTI", 6)) {
4832 for (k = 1; k <= i__1; ++k) {
4833 workl[ihd + k - 1] = 1. / workl[ihd + k - 1] + *sigma;
4835 } else if (!strncmp(type__, "BUCKLE",6)) {
4837 for (k = 1; k <= i__1; ++k) {
4838 workl[ihd + k - 1] = *sigma * workl[ihd + k - 1] / (workl[ihd
4841 } else if (!strncmp(type__, "CAYLEY",6)) {
4843 for (k = 1; k <= i__1; ++k) {
4844 workl[ihd + k - 1] = *sigma * (workl[ihd + k - 1] + 1.) / (
4845 workl[ihd + k - 1] - 1.);
4849 F77_FUNC(scopy,SCOPY)(&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
4850 F77_FUNC(ssortr,SSORTR)("LA", &c__1, &nconv, &workl[ihd], &workl[iw]);
4852 F77_FUNC(ssesrt,SSESRT)("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
4854 F77_FUNC(scopy,SCOPY)(ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
4855 d__1 = bnorm2 / rnorm;
4856 F77_FUNC(sscal,SSCAL)(ncv, &d__1, &workl[ihb], &c__1);
4857 F77_FUNC(ssortr,SSORTR)("LA", &c__1, &nconv, &d__[1], &workl[ihb]);
4862 if (*rvec && *howmny == 'A') {
4864 F77_FUNC(sgeqr2,SGEQR2)(ncv, &nconv, &workl[iq], &ldq, &workl[iw + *ncv], &workl[ihb],
4867 F77_FUNC(sorm2r,SORM2R)("Right", "Notranspose", n, ncv, &nconv, &workl[iq], &ldq, &
4868 workl[iw + *ncv], &v[v_offset], ldv, &workd[*n + 1], &ierr);
4869 F77_FUNC(slacpy,SLACPY)("All", n, &nconv, &v[v_offset], ldv, &z__[z_offset], ldz);
4872 for (j = 1; j <= i__1; ++j) {
4873 workl[ihb + j - 1] = 0.;
4875 workl[ihb + *ncv - 1] = 1.;
4876 F77_FUNC(sorm2r,SORM2R)("Left", "Transpose", ncv, &c__1, &nconv, &workl[iq], &ldq, &
4877 workl[iw + *ncv], &workl[ihb], ncv, &temp, &ierr);
4879 } else if (*rvec && *howmny == 'S') {
4883 if (!strncmp(type__, "REGULR",6) && *rvec) {
4886 for (j = 1; j <= i__1; ++j) {
4887 workl[ihb + j - 1] = rnorm * fabs(workl[ihb + j - 1]);
4890 } else if (strncmp(type__, "REGULR",6) && *rvec) {
4892 F77_FUNC(sscal,SSCAL)(ncv, &bnorm2, &workl[ihb], &c__1);
4893 if (!strncmp(type__, "SHIFTI",6)) {
4896 for (k = 1; k <= i__1; ++k) {
4897 d__2 = workl[iw + k - 1];
4898 workl[ihb + k - 1] = fabs(workl[ihb + k - 1])/(d__2 * d__2);
4901 } else if (!strncmp(type__, "BUCKLE",6)) {
4904 for (k = 1; k <= i__1; ++k) {
4905 d__2 = workl[iw + k - 1] - 1.;
4906 workl[ihb + k - 1] = *sigma * fabs(workl[ihb + k - 1])/(d__2 * d__2);
4909 } else if (!strncmp(type__, "CAYLEY",6)) {
4912 for (k = 1; k <= i__1; ++k) {
4913 workl[ihb + k - 1] = fabs(workl[ihb + k - 1] / workl[iw + k - 1] * (workl[iw + k - 1] - 1.));
4921 if (*rvec && (!strncmp(type__, "SHIFTI",6) || !strncmp(type__, "CAYLEY",6))) {
4924 for (k = 0; k <= i__1; ++k) {
4925 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / workl[iw + k];
4928 } else if (*rvec && !strncmp(type__, "BUCKLE", 6)) {
4931 for (k = 0; k <= i__1; ++k) {
4932 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / (workl[iw + k] -
4938 if (strncmp(type__, "REGULR",6)) {
4939 F77_FUNC(sger,SGER)(n, &nconv, &c_b102, &resid[1], &c__1, &workl[iw], &c__1, &z__[