Revised wording in pdb2gmx.c, hopefully clearer now.
[gromacs/rigid-bodies.git] / src / gmxlib / gmx_arpack.c
blob3a4e4491195c0c61c3171fca8160e295f880acbd
1 /* -*- mode: c; tab-width: 4; indent-tabs-mode: m; c-basic-offset: 4 -*-
3 *
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
28 * Applied Mathematics
29 * Rice University
30 * Houston, Texas
32 #ifdef HAVE_CONFIG_H
33 #include <config.h>
34 #endif
36 #include <math.h>
37 #include <string.h>
39 #include "types/simple.h"
40 #include "gmx_lapack.h"
41 #include "gmx_blas.h"
42 #include "gmx_arpack.h"
45 /* Default Fortran name mangling */
46 #ifndef F77_FUNC
47 #define F77_FUNC(name,NAME) name ## _
48 #endif
52 static void
53 F77_FUNC(dstqrb,DSTQRB)(int * n,
54 double * d__,
55 double * e,
56 double * z__,
57 double * work,
58 int * info)
60 int i__1, i__2;
61 double d__1, d__2;
62 int c__0 = 0;
63 int c__1 = 1;
64 double c_b31 = 1.;
66 double b, c__, f, g;
67 int i__, j, k, l, m;
68 double p, r__, s;
69 int l1, ii, mm, lm1, mm1, nm1;
70 double rt1, rt2, eps;
71 int lsv;
72 double tst, eps2;
73 int lend, jtot, lendm1, lendp1, iscale;
75 int lendsv, nmaxit, icompz;
76 double ssfmax, ssfmin,safmin,minval,safmax,anorm;
79 --work;
80 --z__;
81 --e;
82 --d__;
84 *info = 0;
86 icompz = 2;
88 if (*n == 0) {
89 return;
92 if (*n == 1) {
93 if (icompz == 2) {
94 z__[1] = 1.;
96 return;
99 eps = GMX_DOUBLE_EPS;
101 d__1 = eps;
102 eps2 = d__1 * d__1;
103 minval = GMX_DOUBLE_MIN;
104 safmin = minval / GMX_DOUBLE_EPS;
105 safmax = 1. / safmin;
106 ssfmax = sqrt(safmax) / 3.;
107 ssfmin = sqrt(safmin) / eps2;
109 if (icompz == 2) {
110 i__1 = *n - 1;
111 for (j = 1; j <= i__1; ++j) {
112 z__[j] = 0.;
115 z__[*n] = 1.;
118 nmaxit = *n * 30;
119 jtot = 0;
121 l1 = 1;
122 nm1 = *n - 1;
124 L10:
125 if (l1 > *n) {
126 goto L160;
128 if (l1 > 1) {
129 e[l1 - 1] = 0.;
131 if (l1 <= nm1) {
132 i__1 = nm1;
133 for (m = l1; m <= i__1; ++m) {
134 tst = fabs(e[m]);
135 if (tst == 0.) {
136 goto L30;
138 if (tst <= sqrt(fabs(d__[m])) * sqrt(fabs(d__[m+1])) * eps) {
139 e[m] = 0.;
140 goto L30;
144 m = *n;
146 L30:
147 l = l1;
148 lsv = l;
149 lend = m;
150 lendsv = lend;
151 l1 = m + 1;
152 if (lend == l) {
153 goto L10;
156 i__1 = lend - l + 1;
157 anorm =F77_FUNC(dlanst,DLANST)("i", &i__1, &d__[l], &e[l]);
158 iscale = 0;
159 if (anorm == 0.) {
160 goto L10;
162 if (anorm > ssfmax) {
163 iscale = 1;
164 i__1 = lend - l + 1;
165 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n,
166 info);
167 i__1 = lend - l;
168 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n,
169 info);
170 } else if (anorm < ssfmin) {
171 iscale = 2;
172 i__1 = lend - l + 1;
173 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n,
174 info);
175 i__1 = lend - l;
176 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n,
177 info);
180 if (fabs(d__[lend]) < fabs(d__[l])) {
181 lend = lsv;
182 l = lendsv;
185 if (lend > l) {
187 L40:
188 if (l != lend) {
189 lendm1 = lend - 1;
190 i__1 = lendm1;
191 for (m = l; m <= i__1; ++m) {
192 d__2 = fabs(e[m]);
193 tst = d__2 * d__2;
194 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m + 1]) + safmin) {
195 goto L60;
200 m = lend;
202 L60:
203 if (m < lend) {
204 e[m] = 0.;
206 p = d__[l];
207 if (m == l) {
208 goto L80;
211 if (m == l + 1) {
212 if (icompz > 0) {
213 F77_FUNC(dlaev2,DLAEV2)(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s);
214 work[l] = c__;
215 work[*n - 1 + l] = s;
217 tst = z__[l + 1];
218 z__[l + 1] = c__ * tst - s * z__[l];
219 z__[l] = s * tst + c__ * z__[l];
220 } else {
221 F77_FUNC(dlae2,DLAE2)(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2);
223 d__[l] = rt1;
224 d__[l + 1] = rt2;
225 e[l] = 0.;
226 l += 2;
227 if (l <= lend) {
228 goto L40;
230 goto L140;
233 if (jtot == nmaxit) {
234 goto L140;
236 ++jtot;
238 g = (d__[l + 1] - p) / (e[l] * 2.);
239 r__ =F77_FUNC(dlapy2,DLAPY2)(&g, &c_b31);
240 g = d__[m] - p + e[l] / (g + ((g>0) ? r__ : -r__ ));
242 s = 1.;
243 c__ = 1.;
244 p = 0.;
246 mm1 = m - 1;
247 i__1 = l;
248 for (i__ = mm1; i__ >= i__1; --i__) {
249 f = s * e[i__];
250 b = c__ * e[i__];
251 F77_FUNC(dlartg,DLARTG)(&g, &f, &c__, &s, &r__);
252 if (i__ != m - 1) {
253 e[i__ + 1] = r__;
255 g = d__[i__ + 1] - p;
256 r__ = (d__[i__] - g) * s + c__ * 2. * b;
257 p = s * r__;
258 d__[i__ + 1] = g + p;
259 g = c__ * r__ - b;
261 if (icompz > 0) {
262 work[i__] = c__;
263 work[*n - 1 + i__] = -s;
268 if (icompz > 0) {
269 mm = m - l + 1;
271 F77_FUNC(dlasr,DLASR)("r", "v", "b", &c__1, &mm, &work[l], &work[*n - 1 + l], &
272 z__[l], &c__1);
275 d__[l] -= p;
276 e[l] = g;
277 goto L40;
279 L80:
280 d__[l] = p;
282 ++l;
283 if (l <= lend) {
284 goto L40;
286 goto L140;
288 } else {
290 L90:
291 if (l != lend) {
292 lendp1 = lend + 1;
293 i__1 = lendp1;
294 for (m = l; m >= i__1; --m) {
295 d__2 = fabs(e[m - 1]);
296 tst = d__2 * d__2;
297 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m- 1]) + safmin) {
298 goto L110;
303 m = lend;
305 L110:
306 if (m > lend) {
307 e[m - 1] = 0.;
309 p = d__[l];
310 if (m == l) {
311 goto L130;
314 if (m == l - 1) {
315 if (icompz > 0) {
316 F77_FUNC(dlaev2,DLAEV2)(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s)
319 tst = z__[l];
320 z__[l] = c__ * tst - s * z__[l - 1];
321 z__[l - 1] = s * tst + c__ * z__[l - 1];
322 } else {
323 F77_FUNC(dlae2,DLAE2)(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2);
325 d__[l - 1] = rt1;
326 d__[l] = rt2;
327 e[l - 1] = 0.;
328 l += -2;
329 if (l >= lend) {
330 goto L90;
332 goto L140;
335 if (jtot == nmaxit) {
336 goto L140;
338 ++jtot;
341 g = (d__[l - 1] - p) / (e[l - 1] * 2.);
342 r__ =F77_FUNC(dlapy2,DLAPY2)(&g, &c_b31);
343 g = d__[m] - p + e[l - 1] / (g + ((g>0) ? r__ : -r__ ));
345 s = 1.;
346 c__ = 1.;
347 p = 0.;
349 lm1 = l - 1;
350 i__1 = lm1;
351 for (i__ = m; i__ <= i__1; ++i__) {
352 f = s * e[i__];
353 b = c__ * e[i__];
354 F77_FUNC(dlartg,DLARTG)(&g, &f, &c__, &s, &r__);
355 if (i__ != m) {
356 e[i__ - 1] = r__;
358 g = d__[i__] - p;
359 r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b;
360 p = s * r__;
361 d__[i__] = g + p;
362 g = c__ * r__ - b;
364 if (icompz > 0) {
365 work[i__] = c__;
366 work[*n - 1 + i__] = s;
371 if (icompz > 0) {
372 mm = l - m + 1;
374 F77_FUNC(dlasr,DLASR)("r", "v", "f", &c__1, &mm, &work[m], &work[*n - 1 + m], &
375 z__[m], &c__1);
378 d__[l] -= p;
379 e[lm1] = g;
380 goto L90;
382 L130:
383 d__[l] = p;
385 --l;
386 if (l >= lend) {
387 goto L90;
389 goto L140;
393 L140:
394 if (iscale == 1) {
395 i__1 = lendsv - lsv + 1;
396 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv],
397 n, info);
398 i__1 = lendsv - lsv;
399 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n,
400 info);
401 } else if (iscale == 2) {
402 i__1 = lendsv - lsv + 1;
403 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv],
404 n, info);
405 i__1 = lendsv - lsv;
406 F77_FUNC(dlascl,DLASCL)("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n,
407 info);
410 if (jtot < nmaxit) {
411 goto L10;
413 i__1 = *n - 1;
414 for (i__ = 1; i__ <= i__1; ++i__) {
415 if (e[i__] != 0.) {
416 ++(*info);
419 goto L190;
421 L160:
422 if (icompz == 0) {
424 F77_FUNC(dlasrt,DLASRT)("i", n, &d__[1], info);
426 } else {
428 i__1 = *n;
429 for (ii = 2; ii <= i__1; ++ii) {
430 i__ = ii - 1;
431 k = i__;
432 p = d__[i__];
433 i__2 = *n;
434 for (j = ii; j <= i__2; ++j) {
435 if (d__[j] < p) {
436 k = j;
437 p = d__[j];
440 if (k != i__) {
441 d__[k] = d__[i__];
442 d__[i__] = p;
444 p = z__[k];
445 z__[k] = z__[i__];
446 z__[i__] = p;
451 L190:
452 return;
456 static void
457 F77_FUNC(dgetv0,DGETV0)(int * ido,
458 const char * bmat,
459 int * itry,
460 int * initv,
461 int * n,
462 int * j,
463 double * v,
464 int * ldv,
465 double * resid,
466 double * rnorm,
467 int * ipntr,
468 double * workd,
469 int * iwork,
470 int * ierr)
472 int c__1 = 1;
473 double c_b22 = 1.;
474 double c_b24 = 0.;
475 double c_b27 = -1.;
476 int v_dim1, v_offset, i__1;
478 int jj;
479 int idist;
481 --workd;
482 --resid;
483 v_dim1 = *ldv;
484 v_offset = 1 + v_dim1;
485 v -= v_offset;
486 --ipntr;
487 --iwork;
489 if (*ido == 0) {
491 *ierr = 0;
492 iwork[7] = 0;
493 iwork[5] = 0;
494 iwork[6] = 0;
496 if (! (*initv)) {
497 idist = 2;
498 F77_FUNC(dlarnv,DLARNV)(&idist, &iwork[1], n, &resid[1]);
501 if (*bmat == 'G') {
502 ipntr[1] = 1;
503 ipntr[2] = *n + 1;
504 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
505 *ido = -1;
506 goto L9000;
510 if (iwork[5] == 1) {
511 goto L20;
514 if (iwork[6] == 1) {
515 goto L40;
518 iwork[5] = 1;
519 if (*bmat == 'G') {
520 F77_FUNC(dcopy,DCOPY)(n, &workd[*n + 1], &c__1, &resid[1], &c__1);
521 ipntr[1] = *n + 1;
522 ipntr[2] = 1;
523 *ido = 2;
524 goto L9000;
525 } else if (*bmat == 'I') {
526 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
529 L20:
532 iwork[5] = 0;
533 if (*bmat == 'G') {
534 workd[*n * 3 + 4] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
535 workd[*n * 3 + 4] = sqrt(fabs(workd[*n * 3 + 4]));
536 } else if (*bmat == 'I') {
537 workd[*n * 3 + 4] =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
539 *rnorm = workd[*n * 3 + 4];
541 if (*j == 1) {
542 goto L50;
544 iwork[6] = 1;
545 L30:
547 i__1 = *j - 1;
548 F77_FUNC(dgemv,DGEMV)("T", n, &i__1, &c_b22, &v[v_offset], ldv, &workd[1], &c__1, &c_b24,
549 &workd[*n + 1], &c__1);
550 i__1 = *j - 1;
551 F77_FUNC(dgemv,DGEMV)("N", n, &i__1, &c_b27, &v[v_offset], ldv, &workd[*n + 1], &c__1, &
552 c_b22, &resid[1], &c__1);
554 if (*bmat == 'G') {
555 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[*n + 1], &c__1);
556 ipntr[1] = *n + 1;
557 ipntr[2] = 1;
558 *ido = 2;
559 goto L9000;
560 } else if (*bmat == 'I') {
561 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
564 L40:
566 if (*bmat == 'G') {
567 *rnorm =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
568 *rnorm = sqrt(fabs(*rnorm));
569 } else if (*bmat == 'I') {
570 *rnorm =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
573 if (*rnorm > workd[*n * 3 + 4] * .717f) {
574 goto L50;
577 ++iwork[7];
578 if (iwork[7] <= 1) {
580 workd[*n * 3 + 4] = *rnorm;
581 goto L30;
582 } else {
584 i__1 = *n;
585 for (jj = 1; jj <= i__1; ++jj) {
586 resid[jj] = 0.;
588 *rnorm = 0.;
589 *ierr = -1;
592 L50:
594 *ido = 99;
596 L9000:
597 return;
604 static void
605 F77_FUNC(dsapps,DSAPPS)(int * n,
606 int * kev,
607 int * np,
608 double * shift,
609 double * v,
610 int * ldv,
611 double * h__,
612 int * ldh,
613 double * resid,
614 double * q,
615 int * ldq,
616 double * workd)
618 double c_b4 = 0.;
619 double c_b5 = 1.;
620 double c_b14 = -1.;
621 int c__1 = 1;
622 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
623 i__3, i__4;
624 double c__, f, g;
625 int i__, j;
626 double r__, s, a1, a2, a3, a4;
627 int jj;
628 double big;
629 int iend, itop;
630 double epsmch;
631 int istart, kplusp;
633 --workd;
634 --resid;
635 --shift;
636 v_dim1 = *ldv;
637 v_offset = 1 + v_dim1;
638 v -= v_offset;
639 h_dim1 = *ldh;
640 h_offset = 1 + h_dim1;
641 h__ -= h_offset;
642 q_dim1 = *ldq;
643 q_offset = 1 + q_dim1;
644 q -= q_offset;
646 epsmch = GMX_DOUBLE_EPS;
647 itop = 1;
650 kplusp = *kev + *np;
652 F77_FUNC(dlaset,DLASET)("All", &kplusp, &kplusp, &c_b4, &c_b5, &q[q_offset], ldq);
654 if (*np == 0) {
655 goto L9000;
658 i__1 = *np;
659 for (jj = 1; jj <= i__1; ++jj) {
661 istart = itop;
663 L20:
665 i__2 = kplusp - 1;
666 for (i__ = istart; i__ <= i__2; ++i__) {
667 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__ + 1 + (h_dim1*2)]);
668 if (h__[i__ + 1 + h_dim1] <= epsmch * big) {
669 h__[i__ + 1 + h_dim1] = 0.;
670 iend = i__;
671 goto L40;
674 iend = kplusp;
675 L40:
677 if (istart < iend) {
679 f = h__[istart + (h_dim1 << 1)] - shift[jj];
680 g = h__[istart + 1 + h_dim1];
681 F77_FUNC(dlartg,DLARTG)(&f, &g, &c__, &s, &r__);
683 a1 = c__ * h__[istart + (h_dim1 << 1)] + s * h__[istart + 1 +
684 h_dim1];
685 a2 = c__ * h__[istart + 1 + h_dim1] + s * h__[istart + 1 + (
686 h_dim1 << 1)];
687 a4 = c__ * h__[istart + 1 + (h_dim1 << 1)] - s * h__[istart + 1 +
688 h_dim1];
689 a3 = c__ * h__[istart + 1 + h_dim1] - s * h__[istart + (h_dim1 <<
690 1)];
691 h__[istart + (h_dim1 << 1)] = c__ * a1 + s * a2;
692 h__[istart + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
693 h__[istart + 1 + h_dim1] = c__ * a3 + s * a4;
695 i__3 = istart + jj;
696 i__2 = (i__3<kplusp) ? i__3 : kplusp;
697 for (j = 1; j <= i__2; ++j) {
698 a1 = c__ * q[j + istart * q_dim1] + s * q[j + (istart + 1) *
699 q_dim1];
700 q[j + (istart + 1) * q_dim1] = -s * q[j + istart * q_dim1] +
701 c__ * q[j + (istart + 1) * q_dim1];
702 q[j + istart * q_dim1] = a1;
706 i__2 = iend - 1;
707 for (i__ = istart + 1; i__ <= i__2; ++i__) {
709 f = h__[i__ + h_dim1];
710 g = s * h__[i__ + 1 + h_dim1];
712 h__[i__ + 1 + h_dim1] = c__ * h__[i__ + 1 + h_dim1];
713 F77_FUNC(dlartg,DLARTG)(&f, &g, &c__, &s, &r__);
715 if (r__ < 0.) {
716 r__ = -r__;
717 c__ = -c__;
718 s = -s;
721 h__[i__ + h_dim1] = r__;
723 a1 = c__ * h__[i__ + (h_dim1 << 1)] + s * h__[i__ + 1 +
724 h_dim1];
725 a2 = c__ * h__[i__ + 1 + h_dim1] + s * h__[i__ + 1 + (h_dim1
726 << 1)];
727 a3 = c__ * h__[i__ + 1 + h_dim1] - s * h__[i__ + (h_dim1 << 1)
729 a4 = c__ * h__[i__ + 1 + (h_dim1 << 1)] - s * h__[i__ + 1 +
730 h_dim1];
732 h__[i__ + (h_dim1 << 1)] = c__ * a1 + s * a2;
733 h__[i__ + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
734 h__[i__ + 1 + h_dim1] = c__ * a3 + s * a4;
736 i__4 = j + jj;
737 i__3 = (i__4<kplusp) ? i__4 : kplusp;
738 for (j = 1; j <= i__3; ++j) {
739 a1 = c__ * q[j + i__ * q_dim1] + s * q[j + (i__ + 1) *
740 q_dim1];
741 q[j + (i__ + 1) * q_dim1] = -s * q[j + i__ * q_dim1] +
742 c__ * q[j + (i__ + 1) * q_dim1];
743 q[j + i__ * q_dim1] = a1;
750 istart = iend + 1;
752 if (h__[iend + h_dim1] < 0.) {
753 h__[iend + h_dim1] = -h__[iend + h_dim1];
754 F77_FUNC(dscal,DSCAL)(&kplusp, &c_b14, &q[iend * q_dim1 + 1], &c__1);
757 if (iend < kplusp) {
758 goto L20;
761 i__2 = kplusp - 1;
762 for (i__ = itop; i__ <= i__2; ++i__) {
763 if (h__[i__ + 1 + h_dim1] > 0.) {
764 goto L90;
766 ++itop;
769 L90:
773 i__1 = kplusp - 1;
774 for (i__ = itop; i__ <= i__1; ++i__) {
775 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__+ 1 + (h_dim1*2)]);
776 if (h__[i__ + 1 + h_dim1] <= epsmch * big) {
777 h__[i__ + 1 + h_dim1] = 0.;
782 if (h__[*kev + 1 + h_dim1] > 0.) {
783 F77_FUNC(dgemv,DGEMV)("N", n, &kplusp, &c_b5, &v[v_offset], ldv, &q[(*kev + 1) *
784 q_dim1 + 1], &c__1, &c_b4, &workd[*n + 1], &c__1);
787 i__1 = *kev;
788 for (i__ = 1; i__ <= i__1; ++i__) {
789 i__2 = kplusp - i__ + 1;
790 F77_FUNC(dgemv,DGEMV)("N", n, &i__2, &c_b5, &v[v_offset], ldv, &q[(*kev - i__ + 1) *
791 q_dim1 + 1], &c__1, &c_b4, &workd[1], &c__1);
792 F77_FUNC(dcopy,DCOPY)(n, &workd[1], &c__1, &v[(kplusp - i__ + 1) * v_dim1 + 1], &
793 c__1);
797 F77_FUNC(dlacpy,DLACPY)("All", n, kev, &v[(*np + 1) * v_dim1 + 1], ldv, &v[v_offset], ldv);
799 if (h__[*kev + 1 + h_dim1] > 0.) {
800 F77_FUNC(dcopy,DCOPY)(n, &workd[*n + 1], &c__1, &v[(*kev + 1) * v_dim1 + 1], &c__1);
803 F77_FUNC(dscal,DSCAL)(n, &q[kplusp + *kev * q_dim1], &resid[1], &c__1);
804 if (h__[*kev + 1 + h_dim1] > 0.) {
805 F77_FUNC(daxpy,DAXPY)(n, &h__[*kev + 1 + h_dim1], &v[(*kev + 1) * v_dim1 + 1], &c__1,
806 &resid[1], &c__1);
811 L9000:
812 return;
818 static void
819 F77_FUNC(dsortr,DSORTR)(const char * which,
820 int * apply,
821 int * n,
822 double * x1,
823 double * x2)
825 int i__1;
827 int i__, j, igap;
828 double temp;
832 igap = *n / 2;
834 if (!strncmp(which, "SA", 2)) {
836 L10:
837 if (igap == 0) {
838 goto L9000;
840 i__1 = *n - 1;
841 for (i__ = igap; i__ <= i__1; ++i__) {
842 j = i__ - igap;
843 L20:
845 if (j < 0) {
846 goto L30;
849 if (x1[j] < x1[j + igap]) {
850 temp = x1[j];
851 x1[j] = x1[j + igap];
852 x1[j + igap] = temp;
853 if (*apply) {
854 temp = x2[j];
855 x2[j] = x2[j + igap];
856 x2[j + igap] = temp;
858 } else {
859 goto L30;
861 j -= igap;
862 goto L20;
863 L30:
866 igap /= 2;
867 goto L10;
869 } else if (!strncmp(which, "SM", 2)) {
871 L40:
872 if (igap == 0) {
873 goto L9000;
875 i__1 = *n - 1;
876 for (i__ = igap; i__ <= i__1; ++i__) {
877 j = i__ - igap;
878 L50:
880 if (j < 0) {
881 goto L60;
884 if (fabs(x1[j]) < fabs(x1[j + igap])) {
885 temp = x1[j];
886 x1[j] = x1[j + igap];
887 x1[j + igap] = temp;
888 if (*apply) {
889 temp = x2[j];
890 x2[j] = x2[j + igap];
891 x2[j + igap] = temp;
893 } else {
894 goto L60;
896 j -= igap;
897 goto L50;
898 L60:
901 igap /= 2;
902 goto L40;
904 } else if (!strncmp(which, "LA", 2)) {
906 L70:
907 if (igap == 0) {
908 goto L9000;
910 i__1 = *n - 1;
911 for (i__ = igap; i__ <= i__1; ++i__) {
912 j = i__ - igap;
913 L80:
915 if (j < 0) {
916 goto L90;
919 if (x1[j] > x1[j + igap]) {
920 temp = x1[j];
921 x1[j] = x1[j + igap];
922 x1[j + igap] = temp;
923 if (*apply) {
924 temp = x2[j];
925 x2[j] = x2[j + igap];
926 x2[j + igap] = temp;
928 } else {
929 goto L90;
931 j -= igap;
932 goto L80;
933 L90:
936 igap /= 2;
937 goto L70;
939 } else if (!strncmp(which, "LM", 2)) {
942 L100:
943 if (igap == 0) {
944 goto L9000;
946 i__1 = *n - 1;
947 for (i__ = igap; i__ <= i__1; ++i__) {
948 j = i__ - igap;
949 L110:
951 if (j < 0) {
952 goto L120;
955 if (fabs(x1[j]) > fabs(x1[j + igap])) {
956 temp = x1[j];
957 x1[j] = x1[j + igap];
958 x1[j + igap] = temp;
959 if (*apply) {
960 temp = x2[j];
961 x2[j] = x2[j + igap];
962 x2[j + igap] = temp;
964 } else {
965 goto L120;
967 j -= igap;
968 goto L110;
969 L120:
972 igap /= 2;
973 goto L100;
976 L9000:
977 return;
984 static void
985 F77_FUNC(dsesrt,DSESRT)(const char * which,
986 int * apply,
987 int * n,
988 double * x,
989 int * na,
990 double * a,
991 int * lda)
993 int a_dim1, a_offset, i__1;
994 int c__1 = 1;
996 int i__, j, igap;
997 double temp;
999 a_dim1 = *lda;
1000 a_offset = 1 + a_dim1 * 0;
1001 a -= a_offset;
1003 igap = *n / 2;
1005 if (!strncmp(which, "SA", 2)) {
1007 L10:
1008 if (igap == 0) {
1009 goto L9000;
1011 i__1 = *n - 1;
1012 for (i__ = igap; i__ <= i__1; ++i__) {
1013 j = i__ - igap;
1014 L20:
1016 if (j < 0) {
1017 goto L30;
1020 if (x[j] < x[j + igap]) {
1021 temp = x[j];
1022 x[j] = x[j + igap];
1023 x[j + igap] = temp;
1024 if (*apply) {
1025 F77_FUNC(dswap,DSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1026 a_dim1 + 1], &c__1);
1028 } else {
1029 goto L30;
1031 j -= igap;
1032 goto L20;
1033 L30:
1036 igap /= 2;
1037 goto L10;
1039 } else if (!strncmp(which, "SM", 2)) {
1041 L40:
1042 if (igap == 0) {
1043 goto L9000;
1045 i__1 = *n - 1;
1046 for (i__ = igap; i__ <= i__1; ++i__) {
1047 j = i__ - igap;
1048 L50:
1050 if (j < 0) {
1051 goto L60;
1054 if (fabs(x[j]) < fabs(x[j + igap])) {
1055 temp = x[j];
1056 x[j] = x[j + igap];
1057 x[j + igap] = temp;
1058 if (*apply) {
1059 F77_FUNC(dswap,DSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1060 a_dim1 + 1], &c__1);
1062 } else {
1063 goto L60;
1065 j -= igap;
1066 goto L50;
1067 L60:
1070 igap /= 2;
1071 goto L40;
1073 } else if (!strncmp(which, "LA", 2)) {
1075 L70:
1076 if (igap == 0) {
1077 goto L9000;
1079 i__1 = *n - 1;
1080 for (i__ = igap; i__ <= i__1; ++i__) {
1081 j = i__ - igap;
1082 L80:
1084 if (j < 0) {
1085 goto L90;
1088 if (x[j] > x[j + igap]) {
1089 temp = x[j];
1090 x[j] = x[j + igap];
1091 x[j + igap] = temp;
1092 if (*apply) {
1093 F77_FUNC(dswap,DSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1094 a_dim1 + 1], &c__1);
1096 } else {
1097 goto L90;
1099 j -= igap;
1100 goto L80;
1101 L90:
1104 igap /= 2;
1105 goto L70;
1107 } else if (!strncmp(which, "LM", 2)) {
1109 L100:
1110 if (igap == 0) {
1111 goto L9000;
1113 i__1 = *n - 1;
1114 for (i__ = igap; i__ <= i__1; ++i__) {
1115 j = i__ - igap;
1116 L110:
1118 if (j < 0) {
1119 goto L120;
1122 if (fabs(x[j]) > fabs(x[j + igap])) {
1123 temp = x[j];
1124 x[j] = x[j + igap];
1125 x[j + igap] = temp;
1126 if (*apply) {
1127 F77_FUNC(dswap,DSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
1128 a_dim1 + 1], &c__1);
1130 } else {
1131 goto L120;
1133 j -= igap;
1134 goto L110;
1135 L120:
1138 igap /= 2;
1139 goto L100;
1142 L9000:
1143 return;
1150 static void
1151 F77_FUNC(dsgets,DSGETS)(int * ishift,
1152 const char * which,
1153 int * kev,
1154 int * np,
1155 double * ritz,
1156 double * bounds,
1157 double * shifts)
1159 int c__1 = 1;
1160 int i__1, i__2;
1161 int kevd2;
1163 --shifts;
1164 --bounds;
1165 --ritz;
1167 if (!strncmp(which, "BE", 2)) {
1168 i__1 = *kev + *np;
1169 F77_FUNC(dsortr,DSORTR)("LA", &c__1, &i__1, &ritz[1], &bounds[1]);
1170 kevd2 = *kev / 2;
1171 if (*kev > 1) {
1172 i__1 = (kevd2<*np) ? kevd2 : *np;
1173 i__2 = (kevd2>*np) ? kevd2 : *np;
1174 F77_FUNC(dswap,DSWAP)(&i__1, &ritz[1], &c__1,
1175 &ritz[i__2 + 1], &c__1);
1176 i__1 = (kevd2<*np) ? kevd2 : *np;
1177 i__2 = (kevd2>*np) ? kevd2 : *np;
1178 F77_FUNC(dswap,DSWAP)(&i__1, &bounds[1], &c__1,
1179 &bounds[i__2 + 1], &c__1);
1182 } else {
1183 i__1 = *kev + *np;
1184 F77_FUNC(dsortr,DSORTR)(which, &c__1, &i__1, &ritz[1], &bounds[1]);
1187 if (*ishift == 1 && *np > 0) {
1189 F77_FUNC(dsortr,DSORTR)("SM", &c__1, np, &bounds[1], &ritz[1]);
1190 F77_FUNC(dcopy,DCOPY)(np, &ritz[1], &c__1, &shifts[1], &c__1);
1194 return;
1199 static void
1200 F77_FUNC(dsconv,DSCONV)(int * n,
1201 double * ritz,
1202 double * bounds,
1203 double * tol,
1204 int * nconv)
1206 double c_b3 = 2/3;
1207 int i__1;
1208 double d__2, d__3;
1210 int i__;
1211 double eps23, temp;
1213 --bounds;
1214 --ritz;
1216 eps23 = GMX_DOUBLE_EPS;
1217 eps23 = pow(eps23, c_b3);
1219 *nconv = 0;
1220 i__1 = *n;
1221 for (i__ = 1; i__ <= i__1; ++i__) {
1223 d__2 = eps23;
1224 d__3 = fabs(ritz[i__]);
1225 temp = (d__2 > d__3) ? d__2 : d__3;
1226 if (bounds[i__] <= *tol * temp) {
1227 ++(*nconv);
1231 return;
1235 static void
1236 F77_FUNC(dseigt,DSEIGT)(double * rnorm,
1237 int * n,
1238 double * h__,
1239 int * ldh,
1240 double * eig,
1241 double * bounds,
1242 double * workl,
1243 int * ierr)
1245 int c__1 = 1;
1246 int h_dim1, h_offset, i__1;
1248 int k;
1251 --workl;
1252 --bounds;
1253 --eig;
1254 h_dim1 = *ldh;
1255 h_offset = 1 + h_dim1;
1256 h__ -= h_offset;
1258 F77_FUNC(dcopy,DCOPY)(n, &h__[(h_dim1 << 1) + 1], &c__1, &eig[1], &c__1);
1259 i__1 = *n - 1;
1260 F77_FUNC(dcopy,DCOPY)(&i__1, &h__[h_dim1 + 2], &c__1, &workl[1], &c__1);
1261 F77_FUNC(dstqrb,DSTQRB)(n, &eig[1], &workl[1], &bounds[1], &workl[*n + 1], ierr);
1262 if (*ierr != 0) {
1263 goto L9000;
1266 i__1 = *n;
1267 for (k = 1; k <= i__1; ++k) {
1268 bounds[k] = *rnorm * fabs(bounds[k]);
1273 L9000:
1274 return;
1280 static void
1281 F77_FUNC(dsaitr,DSAITR)(int * ido,
1282 const char * bmat,
1283 int * n,
1284 int * k,
1285 int * np,
1286 int * mode,
1287 double * resid,
1288 double * rnorm,
1289 double * v,
1290 int * ldv,
1291 double * h__,
1292 int * ldh,
1293 int * ipntr,
1294 double * workd,
1295 int * iwork,
1296 int * info)
1299 int c__0 = 0;
1300 int c__1 = 1;
1301 double c_b18 = 1.;
1302 double c_b42 = 0.;
1303 double c_b50 = -1.;
1305 int h_dim1, h_offset, v_dim1, v_offset, i__1;
1306 int i__, jj;
1307 double temp1;
1308 int infol;
1309 double safmin,minval;
1312 --workd;
1313 --resid;
1314 v_dim1 = *ldv;
1315 v_offset = 1 + v_dim1;
1316 v -= v_offset;
1317 h_dim1 = *ldh;
1318 h_offset = 1 + h_dim1;
1319 h__ -= h_offset;
1320 --ipntr;
1321 --iwork;
1322 minval = GMX_DOUBLE_MIN;
1323 safmin = minval / GMX_DOUBLE_EPS;
1325 if (*ido == 0) {
1326 *info = 0;
1327 iwork[5] = 0;
1328 iwork[6] = 0;
1329 iwork[4] = 0;
1330 iwork[2] = 0;
1331 iwork[3] = 0;
1333 iwork[12] = *k + 1;
1335 iwork[8] = 1;
1336 iwork[9] = iwork[8] + *n;
1337 iwork[10] = iwork[9] + *n;
1340 if (iwork[5] == 1) {
1341 goto L50;
1343 if (iwork[6] == 1) {
1344 goto L60;
1346 if (iwork[2] == 1) {
1347 goto L70;
1349 if (iwork[3] == 1) {
1350 goto L90;
1352 if (iwork[4] == 1) {
1353 goto L30;
1356 L1000:
1359 if (*rnorm > 0.) {
1360 goto L40;
1363 iwork[11] = 1;
1364 L20:
1365 iwork[4] = 1;
1366 *ido = 0;
1367 L30:
1369 F77_FUNC(dgetv0,DGETV0)(ido, bmat, &iwork[11], &c__0, n, &iwork[12], &v[v_offset], ldv,
1370 &resid[1], rnorm, &ipntr[1], &workd[1], &iwork[21], &iwork[7]);
1371 if (*ido != 99) {
1372 goto L9000;
1374 if (iwork[7] < 0) {
1375 ++iwork[11];
1376 if (iwork[11] <= 3) {
1377 goto L20;
1380 *info = iwork[12] - 1;
1381 *ido = 99;
1382 goto L9000;
1385 L40:
1387 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &v[iwork[12] * v_dim1 + 1], &c__1);
1388 if (*rnorm >= safmin) {
1389 temp1 = 1. / *rnorm;
1390 F77_FUNC(dscal,DSCAL)(n, &temp1, &v[iwork[12] * v_dim1 + 1], &c__1);
1391 F77_FUNC(dscal,DSCAL)(n, &temp1, &workd[iwork[8]], &c__1);
1392 } else {
1394 F77_FUNC(dlascl,DLASCL)("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &v[iwork[12] *
1395 v_dim1 + 1], n, &infol);
1396 F77_FUNC(dlascl,DLASCL)("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &workd[iwork[
1397 8]], n, &infol);
1400 iwork[5] = 1;
1401 F77_FUNC(dcopy,DCOPY)(n, &v[iwork[12] * v_dim1 + 1], &c__1, &workd[iwork[10]], &c__1);
1402 ipntr[1] = iwork[10];
1403 ipntr[2] = iwork[9];
1404 ipntr[3] = iwork[8];
1405 *ido = 1;
1407 goto L9000;
1408 L50:
1411 iwork[5] = 0;
1413 F77_FUNC(dcopy,DCOPY)(n, &workd[iwork[9]], &c__1, &resid[1], &c__1);
1415 if (*mode == 2) {
1416 goto L65;
1418 if (*bmat == 'G') {
1419 iwork[6] = 1;
1420 ipntr[1] = iwork[9];
1421 ipntr[2] = iwork[8];
1422 *ido = 2;
1424 goto L9000;
1425 } else if (*bmat == 'I') {
1426 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1428 L60:
1430 iwork[6] = 0;
1432 L65:
1433 if (*mode == 2) {
1435 workd[*n * 3 + 3] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[iwork[10]], &
1436 c__1);
1437 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
1438 } else if (*bmat == 'G') {
1439 workd[*n * 3 + 3] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &
1440 c__1);
1441 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
1442 } else if (*bmat == 'I') {
1443 workd[*n * 3 + 3] =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
1446 if (*mode != 2) {
1447 F77_FUNC(dgemv,DGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]]
1448 , &c__1, &c_b42, &workd[iwork[9]], &c__1);
1449 } else if (*mode == 2) {
1450 F77_FUNC(dgemv,DGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[10]
1451 ], &c__1, &c_b42, &workd[iwork[9]], &c__1);
1454 F77_FUNC(dgemv,DGEMV)("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
1455 c__1, &c_b18, &resid[1], &c__1);
1457 h__[iwork[12] + (h_dim1 << 1)] = workd[iwork[9] + iwork[12] - 1];
1458 if (iwork[12] == 1 || iwork[4] == 1) {
1459 h__[iwork[12] + h_dim1] = 0.;
1460 } else {
1461 h__[iwork[12] + h_dim1] = *rnorm;
1464 iwork[2] = 1;
1465 iwork[1] = 0;
1467 if (*bmat == 'G') {
1468 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
1469 ipntr[1] = iwork[9];
1470 ipntr[2] = iwork[8];
1471 *ido = 2;
1473 goto L9000;
1474 } else if (*bmat == 'I') {
1475 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1477 L70:
1479 iwork[2] = 0;
1481 if (*bmat == 'G') {
1482 *rnorm =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1483 *rnorm = sqrt(fabs(*rnorm));
1484 } else if (*bmat == 'I') {
1485 *rnorm =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
1488 if (*rnorm > workd[*n * 3 + 3] * .717f) {
1489 goto L100;
1492 L80:
1494 F77_FUNC(dgemv,DGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]], &
1495 c__1, &c_b42, &workd[iwork[9]], &c__1);
1497 F77_FUNC(dgemv,DGEMV)("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
1498 c__1, &c_b18, &resid[1], &c__1);
1500 if (iwork[12] == 1 || iwork[4] == 1) {
1501 h__[iwork[12] + h_dim1] = 0.;
1503 h__[iwork[12] + (h_dim1 << 1)] += workd[iwork[9] + iwork[12] - 1];
1505 iwork[3] = 1;
1506 if (*bmat == 'G') {
1507 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
1508 ipntr[1] = iwork[9];
1509 ipntr[2] = iwork[8];
1510 *ido = 2;
1512 goto L9000;
1513 } else if (*bmat == 'I') {
1514 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
1516 L90:
1519 if (*bmat == 'G') {
1520 workd[*n * 3 + 2] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &
1521 c__1);
1522 workd[*n * 3 + 2] = sqrt(fabs(workd[*n * 3 + 2]));
1523 } else if (*bmat == 'I') {
1524 workd[*n * 3 + 2] =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
1528 if (workd[*n * 3 + 2] > *rnorm * .717f) {
1530 *rnorm = workd[*n * 3 + 2];
1532 } else {
1534 *rnorm = workd[*n * 3 + 2];
1535 ++iwork[1];
1536 if (iwork[1] <= 1) {
1537 goto L80;
1540 i__1 = *n;
1541 for (jj = 1; jj <= i__1; ++jj) {
1542 resid[jj] = 0.;
1544 *rnorm = 0.;
1547 L100:
1549 iwork[4] = 0;
1550 iwork[3] = 0;
1552 if (h__[iwork[12] + h_dim1] < 0.) {
1553 h__[iwork[12] + h_dim1] = -h__[iwork[12] + h_dim1];
1554 if (iwork[12] < *k + *np) {
1555 F77_FUNC(dscal,DSCAL)(n, &c_b50, &v[(iwork[12] + 1) * v_dim1 + 1], &c__1);
1556 } else {
1557 F77_FUNC(dscal,DSCAL)(n, &c_b50, &resid[1], &c__1);
1561 ++iwork[12];
1562 if (iwork[12] > *k + *np) {
1563 *ido = 99;
1566 goto L9000;
1569 goto L1000;
1571 L9000:
1572 return;
1580 static void
1581 F77_FUNC(dsaup2,DSAUP2)(int * ido,
1582 const char * bmat,
1583 int * n,
1584 const char * which,
1585 int * nev,
1586 int * np,
1587 double * tol,
1588 double * resid,
1589 int * mode,
1590 int * iupd,
1591 int * ishift,
1592 int * mxiter,
1593 double * v,
1594 int * ldv,
1595 double * h__,
1596 int * ldh,
1597 double * ritz,
1598 double * bounds,
1599 double * q,
1600 int * ldq,
1601 double * workl,
1602 int * ipntr,
1603 double * workd,
1604 int * iwork,
1605 int * info)
1607 double c_b3 = 2/3;
1608 int c__1 = 1;
1609 int c__0 = 0;
1611 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
1612 i__3;
1613 double d__2, d__3;
1614 int j;
1615 double eps23;
1616 int ierr;
1617 double temp;
1618 int nevd2;
1619 int nevm2;
1620 int nevbef;
1621 char wprime[2];
1622 int nptemp;
1624 --workd;
1625 --resid;
1626 --workl;
1627 --bounds;
1628 --ritz;
1629 v_dim1 = *ldv;
1630 v_offset = 1 + v_dim1;
1631 v -= v_offset;
1632 h_dim1 = *ldh;
1633 h_offset = 1 + h_dim1;
1634 h__ -= h_offset;
1635 q_dim1 = *ldq;
1636 q_offset = 1 + q_dim1;
1637 q -= q_offset;
1638 --ipntr;
1639 --iwork;
1640 eps23 = GMX_DOUBLE_EPS;
1641 eps23 = pow(eps23, c_b3);
1643 if (*ido == 0) {
1645 iwork[41] = 1;
1646 iwork[42] = 3;
1647 iwork[43] = 5;
1648 iwork[44] = 7;
1650 iwork[9] = *nev;
1651 iwork[10] = *np;
1653 iwork[7] = iwork[9] + iwork[10];
1654 iwork[8] = 0;
1655 iwork[6] = 0;
1657 iwork[2] = 1;
1658 iwork[4] = 0;
1659 iwork[5] = 0;
1660 iwork[1] = 0;
1662 if (*info != 0) {
1664 iwork[3] = 1;
1665 *info = 0;
1666 } else {
1667 iwork[3] = 0;
1671 if (iwork[2] == 1) {
1672 F77_FUNC(dgetv0,DGETV0)(ido, bmat, &c__1, &iwork[3], n, &c__1, &v[v_offset], ldv, &
1673 resid[1], &workd[*n * 3 + 1], &ipntr[1], &workd[1], &iwork[41]
1674 , info);
1676 if (*ido != 99) {
1677 goto L9000;
1680 if (workd[*n * 3 + 1] == 0.) {
1682 *info = -9;
1683 goto L1200;
1685 iwork[2] = 0;
1686 *ido = 0;
1689 if (iwork[4] == 1) {
1690 goto L20;
1693 if (iwork[5] == 1) {
1694 goto L50;
1697 if (iwork[1] == 1) {
1698 goto L100;
1701 F77_FUNC(dsaitr,DSAITR)(ido, bmat, n, &c__0, &iwork[9], mode, &resid[1], &workd[*n * 3 +
1702 1], &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
1703 &iwork[21], info);
1705 if (*ido != 99) {
1706 goto L9000;
1709 if (*info > 0) {
1711 *np = *info;
1712 *mxiter = iwork[6];
1713 *info = -9999;
1714 goto L1200;
1717 L1000:
1719 ++iwork[6];
1722 *ido = 0;
1723 L20:
1724 iwork[4] = 1;
1726 F77_FUNC(dsaitr,DSAITR)(ido, bmat, n, nev, np, mode, &resid[1], &workd[*n * 3 + 1],
1727 &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
1728 &iwork[21], info);
1730 if (*ido != 99) {
1731 goto L9000;
1734 if (*info > 0) {
1736 *np = *info;
1737 *mxiter = iwork[6];
1738 *info = -9999;
1739 goto L1200;
1741 iwork[4] = 0;
1743 F77_FUNC(dseigt,DSEIGT)(&workd[*n * 3 + 1], &iwork[7], &h__[h_offset], ldh, &ritz[1], &
1744 bounds[1], &workl[1], &ierr);
1746 if (ierr != 0) {
1747 *info = -8;
1748 goto L1200;
1751 F77_FUNC(dcopy,DCOPY)(&iwork[7], &ritz[1], &c__1, &workl[iwork[7] + 1], &c__1);
1752 F77_FUNC(dcopy,DCOPY)(&iwork[7], &bounds[1], &c__1, &workl[(iwork[7] << 1) + 1], &c__1);
1754 *nev = iwork[9];
1755 *np = iwork[10];
1756 F77_FUNC(dsgets,DSGETS)(ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
1758 F77_FUNC(dcopy,DCOPY)(nev, &bounds[*np + 1], &c__1, &workl[*np + 1], &c__1);
1759 F77_FUNC(dsconv,DSCONV)(nev, &ritz[*np + 1], &workl[*np + 1], tol, &iwork[8]);
1761 nptemp = *np;
1762 i__1 = nptemp;
1763 for (j = 1; j <= i__1; ++j) {
1764 if (bounds[j] == 0.) {
1765 --(*np);
1766 ++(*nev);
1770 if (iwork[8] >= iwork[9] || iwork[6] > *mxiter || *np == 0) {
1772 if (!strncmp(which, "BE", 2)) {
1774 strncpy(wprime, "SA",2);
1775 F77_FUNC(dsortr,DSORTR)(wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
1776 nevd2 = *nev / 2;
1777 nevm2 = *nev - nevd2;
1778 if (*nev > 1) {
1779 i__1 = (nevd2 < *np) ? nevd2 : *np;
1780 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np + 1;
1781 F77_FUNC(dswap,DSWAP)(&i__1, &ritz[nevm2 + 1], &c__1,
1782 &ritz[((i__2>i__3) ? i__2 : i__3)],
1783 &c__1);
1784 i__1 = (nevd2 < *np) ? nevd2 : *np;
1785 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np;
1786 F77_FUNC(dswap,DSWAP)(&i__1, &bounds[nevm2 + 1], &c__1,
1787 &bounds[((i__2>i__3) ? i__2 : i__3) + 1],
1788 &c__1);
1791 } else {
1793 if (!strncmp(which, "LM", 2)) {
1794 strncpy(wprime, "SM", 2);
1796 if (!strncmp(which, "SM", 2)) {
1797 strncpy(wprime, "LM", 2);
1799 if (!strncmp(which, "LA", 2)) {
1800 strncpy(wprime, "SA", 2);
1802 if (!strncmp(which, "SA", 2)) {
1803 strncpy(wprime, "LA", 2);
1806 F77_FUNC(dsortr,DSORTR)(wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
1810 i__1 = iwork[9];
1811 for (j = 1; j <= i__1; ++j) {
1812 d__2 = eps23;
1813 d__3 = fabs(ritz[j]);
1814 temp = (d__2>d__3) ? d__2 : d__3;
1815 bounds[j] /= temp;
1818 strncpy(wprime, "LA",2);
1819 F77_FUNC(dsortr,DSORTR)(wprime, &c__1, &iwork[9], &bounds[1], &ritz[1]);
1821 i__1 = iwork[9];
1822 for (j = 1; j <= i__1; ++j) {
1823 d__2 = eps23;
1824 d__3 = fabs(ritz[j]);
1825 temp = (d__2>d__3) ? d__2 : d__3;
1826 bounds[j] *= temp;
1829 if (!strncmp(which, "BE", 2)) {
1831 strncpy(wprime, "LA", 2);
1832 F77_FUNC(dsortr,DSORTR)(wprime, &c__1, &iwork[8], &ritz[1], &bounds[1]);
1834 } else {
1835 F77_FUNC(dsortr,DSORTR)(which, &c__1, &iwork[8], &ritz[1], &bounds[1]);
1839 h__[h_dim1 + 1] = workd[*n * 3 + 1];
1842 if (iwork[6] > *mxiter && iwork[8] < *nev) {
1843 *info = 1;
1845 if (*np == 0 && iwork[8] < iwork[9]) {
1846 *info = 2;
1849 *np = iwork[8];
1850 goto L1100;
1852 } else if (iwork[8] < *nev && *ishift == 1) {
1853 nevbef = *nev;
1854 i__1 = iwork[8], i__2 = *np / 2;
1855 *nev += (i__1 < i__2) ? i__1 : i__2;
1856 if (*nev == 1 && iwork[7] >= 6) {
1857 *nev = iwork[7] / 2;
1858 } else if (*nev == 1 && iwork[7] > 2) {
1859 *nev = 2;
1861 *np = iwork[7] - *nev;
1864 if (nevbef < *nev) {
1865 F77_FUNC(dsgets,DSGETS)(ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
1871 if (*ishift == 0) {
1873 iwork[5] = 1;
1874 *ido = 3;
1875 goto L9000;
1878 L50:
1880 iwork[5] = 0;
1882 if (*ishift == 0) {
1883 F77_FUNC(dcopy,DCOPY)(np, &workl[1], &c__1, &ritz[1], &c__1);
1886 F77_FUNC(dsapps,DSAPPS)(n, nev, np, &ritz[1], &v[v_offset], ldv, &h__[h_offset], ldh, &
1887 resid[1], &q[q_offset], ldq, &workd[1]);
1889 iwork[1] = 1;
1890 if (*bmat == 'G') {
1891 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[*n + 1], &c__1);
1892 ipntr[1] = *n + 1;
1893 ipntr[2] = 1;
1894 *ido = 2;
1896 goto L9000;
1897 } else if (*bmat == 'I') {
1898 F77_FUNC(dcopy,DCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
1901 L100:
1903 if (*bmat == 'G') {
1904 workd[*n * 3 + 1] =F77_FUNC(ddot,DDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
1905 workd[*n * 3 + 1] = sqrt(fabs(workd[*n * 3 + 1]));
1906 } else if (*bmat == 'I') {
1907 workd[*n * 3 + 1] =F77_FUNC(dnrm2,DNRM2)(n, &resid[1], &c__1);
1909 iwork[1] = 0;
1911 goto L1000;
1913 L1100:
1915 *mxiter = iwork[6];
1916 *nev = iwork[8];
1918 L1200:
1919 *ido = 99;
1921 L9000:
1922 return;
1928 void
1929 F77_FUNC(dsaupd,DSAUPD)(int * ido,
1930 const char * bmat,
1931 int * n,
1932 const char * which,
1933 int * nev,
1934 double * tol,
1935 double * resid,
1936 int * ncv,
1937 double * v,
1938 int * ldv,
1939 int * iparam,
1940 int * ipntr,
1941 double * workd,
1942 int * iwork,
1943 double * workl,
1944 int * lworkl,
1945 int * info)
1947 int v_dim1, v_offset, i__1, i__2;
1948 int j;
1950 --workd;
1951 --resid;
1952 v_dim1 = *ldv;
1953 v_offset = 1 + v_dim1;
1954 v -= v_offset;
1955 --iparam;
1956 --ipntr;
1957 --iwork;
1958 --workl;
1960 if (*ido == 0) {
1963 iwork[2] = 0;
1964 iwork[5] = iparam[1];
1965 iwork[10] = iparam[3];
1966 iwork[12] = iparam[4];
1968 iwork[6] = 1;
1969 iwork[11] = iparam[7];
1972 if (*n <= 0) {
1973 iwork[2] = -1;
1974 } else if (*nev <= 0) {
1975 iwork[2] = -2;
1976 } else if (*ncv <= *nev || *ncv > *n) {
1977 iwork[2] = -3;
1981 iwork[15] = *ncv - *nev;
1983 if (iwork[10] <= 0) {
1984 iwork[2] = -4;
1986 if (strncmp(which,"LM",2) && strncmp(which,"SM",2) &&
1987 strncmp(which,"LA",2) && strncmp(which,"SA",2) &&
1988 strncmp(which,"BE",2)) {
1989 iwork[2] = -5;
1991 if (*bmat != 'I' && *bmat != 'G') {
1992 iwork[2] = -6;
1995 i__1 = *ncv;
1996 if (*lworkl < i__1 * i__1 + (*ncv << 3)) {
1997 iwork[2] = -7;
1999 if (iwork[11] < 1 || iwork[11] > 5) {
2000 iwork[2] = -10;
2001 } else if (iwork[11] == 1 && *bmat == 'G') {
2002 iwork[2] = -11;
2003 } else if (iwork[5] < 0 || iwork[5] > 1) {
2004 iwork[2] = -12;
2005 } else if (*nev == 1 && !strncmp(which, "BE", 2)) {
2006 iwork[2] = -13;
2009 if (iwork[2] != 0) {
2010 *info = iwork[2];
2011 *ido = 99;
2012 goto L9000;
2015 if (iwork[12] <= 0) {
2016 iwork[12] = 1;
2018 if (*tol <= 0.) {
2019 *tol = GMX_DOUBLE_EPS;
2022 iwork[15] = *ncv - *nev;
2023 iwork[13] = *nev;
2024 i__2 = *ncv;
2025 i__1 = i__2 * i__2 + (*ncv << 3);
2026 for (j = 1; j <= i__1; ++j) {
2027 workl[j] = 0.;
2030 iwork[8] = *ncv;
2031 iwork[9] = *ncv;
2032 iwork[3] = 1;
2033 iwork[16] = iwork[3] + (iwork[8] << 1);
2034 iwork[1] = iwork[16] + *ncv;
2035 iwork[4] = iwork[1] + *ncv;
2036 i__1 = *ncv;
2037 iwork[7] = iwork[4] + i__1 * i__1;
2038 iwork[14] = iwork[7] + *ncv * 3;
2040 ipntr[4] = iwork[14];
2041 ipntr[5] = iwork[3];
2042 ipntr[6] = iwork[16];
2043 ipntr[7] = iwork[1];
2044 ipntr[11] = iwork[7];
2047 F77_FUNC(dsaup2,DSAUP2)(ido, bmat, n, which, &iwork[13], &iwork[15], tol, &resid[1], &
2048 iwork[11], &iwork[6], &iwork[5], &iwork[10], &v[v_offset], ldv, &
2049 workl[iwork[3]], &iwork[8], &workl[iwork[16]], &workl[iwork[1]], &
2050 workl[iwork[4]], &iwork[9], &workl[iwork[7]], &ipntr[1], &workd[1]
2051 , &iwork[21], info);
2053 if (*ido == 3) {
2054 iparam[8] = iwork[15];
2056 if (*ido != 99) {
2057 goto L9000;
2060 iparam[3] = iwork[10];
2061 iparam[5] = iwork[15];
2063 if (*info < 0) {
2064 goto L9000;
2066 if (*info == 2) {
2067 *info = 3;
2070 L9000:
2072 return;
2078 void
2079 F77_FUNC(dseupd,DSEUPD)(int * rvec,
2080 const char * howmny,
2081 int * select,
2082 double * d__,
2083 double * z__,
2084 int * ldz,
2085 double * sigma,
2086 const char * bmat,
2087 int * n,
2088 const char * which,
2089 int * nev,
2090 double * tol,
2091 double * resid,
2092 int * ncv,
2093 double * v,
2094 int * ldv,
2095 int * iparam,
2096 int * ipntr,
2097 double * workd,
2098 double * workl,
2099 int * lworkl,
2100 int * info)
2102 double c_b21 = 2/3;
2103 int c__1 = 1;
2104 double c_b102 = 1.;
2105 int v_dim1, v_offset, z_dim1, z_offset, i__1;
2106 double d__1, d__2, d__3;
2108 int j, k, ih, iq, iw, ibd, ihb, ihd, ldh, ilg, ldq, ism, irz;
2109 int mode;
2110 double eps23;
2111 int ierr;
2112 double temp;
2113 int next;
2114 char type__[6];
2115 int ritz;
2116 int reord;
2117 int nconv;
2118 double rnorm;
2119 double bnorm2;
2120 double thres1=0, thres2=0;
2121 int bounds;
2122 int ktrord;
2123 double tempbnd;
2124 int leftptr, rghtptr;
2127 --workd;
2128 --resid;
2129 z_dim1 = *ldz;
2130 z_offset = 1 + z_dim1;
2131 z__ -= z_offset;
2132 --d__;
2133 --select;
2134 v_dim1 = *ldv;
2135 v_offset = 1 + v_dim1;
2136 v -= v_offset;
2137 --iparam;
2138 --ipntr;
2139 --workl;
2141 mode = iparam[7];
2142 nconv = iparam[5];
2143 *info = 0;
2145 if (nconv == 0) {
2146 goto L9000;
2148 ierr = 0;
2150 if (nconv <= 0) {
2151 ierr = -14;
2153 if (*n <= 0) {
2154 ierr = -1;
2156 if (*nev <= 0) {
2157 ierr = -2;
2159 if (*ncv <= *nev || *ncv > *n) {
2160 ierr = -3;
2162 if (strncmp(which,"LM",2) && strncmp(which,"SM",2) &&
2163 strncmp(which,"LA",2) && strncmp(which,"SA",2) &&
2164 strncmp(which,"BE",2)) {
2165 ierr = -5;
2167 if (*bmat != 'I' && *bmat != 'G') {
2168 ierr = -6;
2170 if (*howmny != 'A' && *howmny != 'P' &&
2171 *howmny != 'S' && *rvec) {
2172 ierr = -15;
2174 if (*rvec && *howmny == 'S') {
2175 ierr = -16;
2177 i__1 = *ncv;
2178 if (*rvec && *lworkl < i__1 * i__1 + (*ncv << 3)) {
2179 ierr = -7;
2182 if (mode == 1 || mode == 2) {
2183 strncpy(type__, "REGULR",6);
2184 } else if (mode == 3) {
2185 strncpy(type__, "SHIFTI",6);
2186 } else if (mode == 4) {
2187 strncpy(type__, "BUCKLE",6);
2188 } else if (mode == 5) {
2189 strncpy(type__, "CAYLEY",6);
2190 } else {
2191 ierr = -10;
2193 if (mode == 1 && *bmat == 'G') {
2194 ierr = -11;
2196 if (*nev == 1 && !strncmp(which, "BE",2)) {
2197 ierr = -12;
2200 if (ierr != 0) {
2201 *info = ierr;
2202 goto L9000;
2205 ih = ipntr[5];
2206 ritz = ipntr[6];
2207 bounds = ipntr[7];
2208 ldh = *ncv;
2209 ldq = *ncv;
2210 ihd = bounds + ldh;
2211 ihb = ihd + ldh;
2212 iq = ihb + ldh;
2213 iw = iq + ldh * *ncv;
2214 next = iw + (*ncv << 1);
2215 ipntr[4] = next;
2216 ipntr[8] = ihd;
2217 ipntr[9] = ihb;
2218 ipntr[10] = iq;
2220 irz = ipntr[11] + *ncv;
2221 ibd = irz + *ncv;
2224 eps23 = GMX_DOUBLE_EPS;
2225 eps23 = pow(eps23, c_b21);
2227 rnorm = workl[ih];
2228 if (*bmat == 'I') {
2229 bnorm2 = rnorm;
2230 } else if (*bmat == 'G') {
2231 bnorm2 =F77_FUNC(dnrm2,DNRM2)(n, &workd[1], &c__1);
2234 if (*rvec) {
2236 if (!strncmp(which,"LM",2) || !strncmp(which,"SM",2) ||
2237 !strncmp(which,"LA",2) || !strncmp(which,"SA",2)) {
2239 } else if (!strncmp(which,"BE",2)) {
2242 ism = (*nev>nconv) ? *nev : nconv;
2243 ism /= 2;
2244 ilg = ism + 1;
2245 thres1 = workl[ism];
2246 thres2 = workl[ilg];
2251 reord = 0;
2252 ktrord = 0;
2253 i__1 = *ncv - 1;
2254 for (j = 0; j <= i__1; ++j) {
2255 select[j + 1] = 0;
2256 if (!strncmp(which,"LM",2)) {
2257 if (fabs(workl[irz + j]) >= fabs(thres1)) {
2258 d__2 = eps23;
2259 d__3 = fabs(workl[irz + j]);
2260 tempbnd = (d__2>d__3) ? d__2 : d__3;
2261 if (workl[ibd + j] <= *tol * tempbnd) {
2262 select[j + 1] = 1;
2265 } else if (!strncmp(which,"SM",2)) {
2266 if (fabs(workl[irz + j]) <= fabs(thres1)) {
2267 d__2 = eps23;
2268 d__3 = fabs(workl[irz + j]);
2269 tempbnd = (d__2>d__3) ? d__2 : d__3;
2270 if (workl[ibd + j] <= *tol * tempbnd) {
2271 select[j + 1] = 1;
2274 } else if (!strncmp(which,"LA",2)) {
2275 if (workl[irz + j] >= thres1) {
2276 d__2 = eps23;
2277 d__3 = fabs(workl[irz + j]);
2278 tempbnd = (d__2>d__3) ? d__2 : d__3;
2279 if (workl[ibd + j] <= *tol * tempbnd) {
2280 select[j + 1] = 1;
2283 } else if (!strncmp(which,"SA",2)) {
2284 if (workl[irz + j] <= thres1) {
2285 d__2 = eps23;
2286 d__3 = fabs(workl[irz + j]);
2287 tempbnd = (d__2>d__3) ? d__2 : d__3;
2288 if (workl[ibd + j] <= *tol * tempbnd) {
2289 select[j + 1] = 1;
2292 } else if (!strncmp(which,"BE",2)) {
2293 if (workl[irz + j] <= thres1 || workl[irz + j] >= thres2) {
2294 d__2 = eps23;
2295 d__3 = fabs(workl[irz + j]);
2296 tempbnd = (d__2>d__3) ? d__2 : d__3;
2297 if (workl[ibd + j] <= *tol * tempbnd) {
2298 select[j + 1] = 1;
2302 if (j + 1 > nconv) {
2303 reord = select[j + 1] || reord;
2305 if (select[j + 1]) {
2306 ++ktrord;
2310 i__1 = *ncv - 1;
2311 F77_FUNC(dcopy,DCOPY)(&i__1, &workl[ih + 1], &c__1, &workl[ihb], &c__1);
2312 F77_FUNC(dcopy,DCOPY)(ncv, &workl[ih + ldh], &c__1, &workl[ihd], &c__1);
2314 F77_FUNC(dsteqr,DSTEQR)("Identity", ncv, &workl[ihd], &workl[ihb], &workl[iq], &ldq, &
2315 workl[iw], &ierr);
2317 if (ierr != 0) {
2318 *info = -8;
2319 goto L9000;
2323 if (reord) {
2325 leftptr = 1;
2326 rghtptr = *ncv;
2328 if (*ncv == 1) {
2329 goto L30;
2332 L20:
2333 if (select[leftptr]) {
2335 ++leftptr;
2337 } else if (! select[rghtptr]) {
2339 --rghtptr;
2341 } else {
2343 temp = workl[ihd + leftptr - 1];
2344 workl[ihd + leftptr - 1] = workl[ihd + rghtptr - 1];
2345 workl[ihd + rghtptr - 1] = temp;
2346 F77_FUNC(dcopy,DCOPY)(ncv, &workl[iq + *ncv * (leftptr - 1)], &c__1, &workl[
2347 iw], &c__1);
2348 F77_FUNC(dcopy,DCOPY)(ncv, &workl[iq + *ncv * (rghtptr - 1)], &c__1, &workl[
2349 iq + *ncv * (leftptr - 1)], &c__1);
2350 F77_FUNC(dcopy,DCOPY)(ncv, &workl[iw], &c__1, &workl[iq + *ncv * (rghtptr -
2351 1)], &c__1);
2352 ++leftptr;
2353 --rghtptr;
2357 if (leftptr < rghtptr) {
2358 goto L20;
2361 L30:
2365 F77_FUNC(dcopy,DCOPY)(&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
2367 } else {
2369 F77_FUNC(dcopy,DCOPY)(&nconv, &workl[ritz], &c__1, &d__[1], &c__1);
2370 F77_FUNC(dcopy,DCOPY)(ncv, &workl[ritz], &c__1, &workl[ihd], &c__1);
2373 if (!strncmp(type__, "REGULR",6)) {
2375 if (*rvec) {
2376 F77_FUNC(dsesrt,DSESRT)("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
2377 } else {
2378 F77_FUNC(dcopy,DCOPY)(ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
2381 } else {
2383 F77_FUNC(dcopy,DCOPY)(ncv, &workl[ihd], &c__1, &workl[iw], &c__1);
2384 if (!strncmp(type__, "SHIFTI", 6)) {
2385 i__1 = *ncv;
2386 for (k = 1; k <= i__1; ++k) {
2387 workl[ihd + k - 1] = 1. / workl[ihd + k - 1] + *sigma;
2389 } else if (!strncmp(type__, "BUCKLE",6)) {
2390 i__1 = *ncv;
2391 for (k = 1; k <= i__1; ++k) {
2392 workl[ihd + k - 1] = *sigma * workl[ihd + k - 1] / (workl[ihd
2393 + k - 1] - 1.);
2395 } else if (!strncmp(type__, "CAYLEY",6)) {
2396 i__1 = *ncv;
2397 for (k = 1; k <= i__1; ++k) {
2398 workl[ihd + k - 1] = *sigma * (workl[ihd + k - 1] + 1.) / (
2399 workl[ihd + k - 1] - 1.);
2403 F77_FUNC(dcopy,DCOPY)(&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
2404 F77_FUNC(dsortr,DSORTR)("LA", &c__1, &nconv, &workl[ihd], &workl[iw]);
2405 if (*rvec) {
2406 F77_FUNC(dsesrt,DSESRT)("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
2407 } else {
2408 F77_FUNC(dcopy,DCOPY)(ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
2409 d__1 = bnorm2 / rnorm;
2410 F77_FUNC(dscal,DSCAL)(ncv, &d__1, &workl[ihb], &c__1);
2411 F77_FUNC(dsortr,DSORTR)("LA", &c__1, &nconv, &d__[1], &workl[ihb]);
2416 if (*rvec && *howmny == 'A') {
2418 F77_FUNC(dgeqr2,DGEQR2)(ncv, &nconv, &workl[iq], &ldq, &workl[iw + *ncv], &workl[ihb],
2419 &ierr);
2421 F77_FUNC(dorm2r,DORM2R)("Right", "Notranspose", n, ncv, &nconv, &workl[iq], &ldq, &
2422 workl[iw + *ncv], &v[v_offset], ldv, &workd[*n + 1], &ierr);
2423 F77_FUNC(dlacpy,DLACPY)("All", n, &nconv, &v[v_offset], ldv, &z__[z_offset], ldz);
2425 i__1 = *ncv - 1;
2426 for (j = 1; j <= i__1; ++j) {
2427 workl[ihb + j - 1] = 0.;
2429 workl[ihb + *ncv - 1] = 1.;
2430 F77_FUNC(dorm2r,DORM2R)("Left", "Transpose", ncv, &c__1, &nconv, &workl[iq], &ldq, &
2431 workl[iw + *ncv], &workl[ihb], ncv, &temp, &ierr);
2433 } else if (*rvec && *howmny == 'S') {
2437 if (!strncmp(type__, "REGULR",6) && *rvec) {
2439 i__1 = *ncv;
2440 for (j = 1; j <= i__1; ++j) {
2441 workl[ihb + j - 1] = rnorm * fabs(workl[ihb + j - 1]);
2444 } else if (strncmp(type__, "REGULR",6) && *rvec) {
2446 F77_FUNC(dscal,DSCAL)(ncv, &bnorm2, &workl[ihb], &c__1);
2447 if (!strncmp(type__, "SHIFTI",6)) {
2449 i__1 = *ncv;
2450 for (k = 1; k <= i__1; ++k) {
2451 d__2 = workl[iw + k - 1];
2452 workl[ihb + k - 1] = fabs(workl[ihb + k - 1])/(d__2 * d__2);
2455 } else if (!strncmp(type__, "BUCKLE",6)) {
2457 i__1 = *ncv;
2458 for (k = 1; k <= i__1; ++k) {
2459 d__2 = workl[iw + k - 1] - 1.;
2460 workl[ihb + k - 1] = *sigma * fabs(workl[ihb + k - 1])/(d__2 * d__2);
2463 } else if (!strncmp(type__, "CAYLEY",6)) {
2465 i__1 = *ncv;
2466 for (k = 1; k <= i__1; ++k) {
2467 workl[ihb + k - 1] = fabs(workl[ihb + k - 1] / workl[iw + k - 1] * (workl[iw + k - 1] - 1.));
2475 if (*rvec && (!strncmp(type__, "SHIFTI",6) || !strncmp(type__, "CAYLEY",6))) {
2477 i__1 = nconv - 1;
2478 for (k = 0; k <= i__1; ++k) {
2479 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / workl[iw + k];
2482 } else if (*rvec && !strncmp(type__, "BUCKLE", 6)) {
2484 i__1 = nconv - 1;
2485 for (k = 0; k <= i__1; ++k) {
2486 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / (workl[iw + k] -
2487 1.);
2492 if (strncmp(type__, "REGULR",6)) {
2493 F77_FUNC(dger,DGER)(n, &nconv, &c_b102, &resid[1], &c__1, &workl[iw], &c__1, &z__[
2494 z_offset], ldz);
2497 L9000:
2499 return;
2507 /* Selected single precision arpack routines */
2510 static void
2511 F77_FUNC(sstqrb,SSTQRB)(int * n,
2512 float * d__,
2513 float * e,
2514 float * z__,
2515 float * work,
2516 int * info)
2518 int i__1, i__2;
2519 float d__1, d__2;
2520 int c__0 = 0;
2521 int c__1 = 1;
2522 float c_b31 = 1.;
2524 float b, c__, f, g;
2525 int i__, j, k, l, m;
2526 float p, r__, s;
2527 int l1, ii, mm, lm1, mm1, nm1;
2528 float rt1, rt2, eps;
2529 int lsv;
2530 float tst, eps2;
2531 int lend, jtot, lendm1, lendp1, iscale;
2533 int lendsv, nmaxit, icompz;
2534 float ssfmax, ssfmin,safmin,minval,safmax,anorm;
2537 --work;
2538 --z__;
2539 --e;
2540 --d__;
2542 *info = 0;
2544 icompz = 2;
2546 if (*n == 0) {
2547 return;
2550 if (*n == 1) {
2551 if (icompz == 2) {
2552 z__[1] = 1.;
2554 return;
2557 eps = GMX_FLOAT_EPS;
2559 d__1 = eps;
2560 eps2 = d__1 * d__1;
2561 minval = GMX_FLOAT_MIN;
2562 safmin = minval / GMX_FLOAT_EPS;
2563 safmax = 1. / safmin;
2564 ssfmax = sqrt(safmax) / 3.;
2565 ssfmin = sqrt(safmin) / eps2;
2567 if (icompz == 2) {
2568 i__1 = *n - 1;
2569 for (j = 1; j <= i__1; ++j) {
2570 z__[j] = 0.;
2573 z__[*n] = 1.;
2576 nmaxit = *n * 30;
2577 jtot = 0;
2579 l1 = 1;
2580 nm1 = *n - 1;
2582 L10:
2583 if (l1 > *n) {
2584 goto L160;
2586 if (l1 > 1) {
2587 e[l1 - 1] = 0.;
2589 if (l1 <= nm1) {
2590 i__1 = nm1;
2591 for (m = l1; m <= i__1; ++m) {
2592 tst = fabs(e[m]);
2593 if (tst == 0.) {
2594 goto L30;
2596 if (tst <= sqrt(fabs(d__[m])) * sqrt(fabs(d__[m+1])) * eps) {
2597 e[m] = 0.;
2598 goto L30;
2602 m = *n;
2604 L30:
2605 l = l1;
2606 lsv = l;
2607 lend = m;
2608 lendsv = lend;
2609 l1 = m + 1;
2610 if (lend == l) {
2611 goto L10;
2614 i__1 = lend - l + 1;
2615 anorm =F77_FUNC(slanst,SLANST)("i", &i__1, &d__[l], &e[l]);
2616 iscale = 0;
2617 if (anorm == 0.) {
2618 goto L10;
2620 if (anorm > ssfmax) {
2621 iscale = 1;
2622 i__1 = lend - l + 1;
2623 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &d__[l], n,
2624 info);
2625 i__1 = lend - l;
2626 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &anorm, &ssfmax, &i__1, &c__1, &e[l], n,
2627 info);
2628 } else if (anorm < ssfmin) {
2629 iscale = 2;
2630 i__1 = lend - l + 1;
2631 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &d__[l], n,
2632 info);
2633 i__1 = lend - l;
2634 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &anorm, &ssfmin, &i__1, &c__1, &e[l], n,
2635 info);
2638 if (fabs(d__[lend]) < fabs(d__[l])) {
2639 lend = lsv;
2640 l = lendsv;
2643 if (lend > l) {
2645 L40:
2646 if (l != lend) {
2647 lendm1 = lend - 1;
2648 i__1 = lendm1;
2649 for (m = l; m <= i__1; ++m) {
2650 d__2 = fabs(e[m]);
2651 tst = d__2 * d__2;
2652 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m + 1]) + safmin) {
2653 goto L60;
2658 m = lend;
2660 L60:
2661 if (m < lend) {
2662 e[m] = 0.;
2664 p = d__[l];
2665 if (m == l) {
2666 goto L80;
2669 if (m == l + 1) {
2670 if (icompz > 0) {
2671 F77_FUNC(slaev2,SLAEV2)(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2, &c__, &s);
2672 work[l] = c__;
2673 work[*n - 1 + l] = s;
2675 tst = z__[l + 1];
2676 z__[l + 1] = c__ * tst - s * z__[l];
2677 z__[l] = s * tst + c__ * z__[l];
2678 } else {
2679 F77_FUNC(slae2,SLAE2)(&d__[l], &e[l], &d__[l + 1], &rt1, &rt2);
2681 d__[l] = rt1;
2682 d__[l + 1] = rt2;
2683 e[l] = 0.;
2684 l += 2;
2685 if (l <= lend) {
2686 goto L40;
2688 goto L140;
2691 if (jtot == nmaxit) {
2692 goto L140;
2694 ++jtot;
2696 g = (d__[l + 1] - p) / (e[l] * 2.);
2697 r__ =F77_FUNC(slapy2,SLAPY2)(&g, &c_b31);
2698 g = d__[m] - p + e[l] / (g + ((g>0) ? r__ : -r__ ));
2700 s = 1.;
2701 c__ = 1.;
2702 p = 0.;
2704 mm1 = m - 1;
2705 i__1 = l;
2706 for (i__ = mm1; i__ >= i__1; --i__) {
2707 f = s * e[i__];
2708 b = c__ * e[i__];
2709 F77_FUNC(slartg,SLARTG)(&g, &f, &c__, &s, &r__);
2710 if (i__ != m - 1) {
2711 e[i__ + 1] = r__;
2713 g = d__[i__ + 1] - p;
2714 r__ = (d__[i__] - g) * s + c__ * 2. * b;
2715 p = s * r__;
2716 d__[i__ + 1] = g + p;
2717 g = c__ * r__ - b;
2719 if (icompz > 0) {
2720 work[i__] = c__;
2721 work[*n - 1 + i__] = -s;
2726 if (icompz > 0) {
2727 mm = m - l + 1;
2729 F77_FUNC(slasr,SLASR)("r", "v", "b", &c__1, &mm, &work[l], &work[*n - 1 + l], &
2730 z__[l], &c__1);
2733 d__[l] -= p;
2734 e[l] = g;
2735 goto L40;
2737 L80:
2738 d__[l] = p;
2740 ++l;
2741 if (l <= lend) {
2742 goto L40;
2744 goto L140;
2746 } else {
2748 L90:
2749 if (l != lend) {
2750 lendp1 = lend + 1;
2751 i__1 = lendp1;
2752 for (m = l; m >= i__1; --m) {
2753 d__2 = fabs(e[m - 1]);
2754 tst = d__2 * d__2;
2755 if (tst <= eps2 * fabs(d__[m]) * fabs(d__[m- 1]) + safmin) {
2756 goto L110;
2761 m = lend;
2763 L110:
2764 if (m > lend) {
2765 e[m - 1] = 0.;
2767 p = d__[l];
2768 if (m == l) {
2769 goto L130;
2772 if (m == l - 1) {
2773 if (icompz > 0) {
2774 F77_FUNC(slaev2,SLAEV2)(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2, &c__, &s)
2777 tst = z__[l];
2778 z__[l] = c__ * tst - s * z__[l - 1];
2779 z__[l - 1] = s * tst + c__ * z__[l - 1];
2780 } else {
2781 F77_FUNC(slae2,SLAE2)(&d__[l - 1], &e[l - 1], &d__[l], &rt1, &rt2);
2783 d__[l - 1] = rt1;
2784 d__[l] = rt2;
2785 e[l - 1] = 0.;
2786 l += -2;
2787 if (l >= lend) {
2788 goto L90;
2790 goto L140;
2793 if (jtot == nmaxit) {
2794 goto L140;
2796 ++jtot;
2799 g = (d__[l - 1] - p) / (e[l - 1] * 2.);
2800 r__ =F77_FUNC(slapy2,SLAPY2)(&g, &c_b31);
2801 g = d__[m] - p + e[l - 1] / (g + ((g>0) ? r__ : -r__ ));
2803 s = 1.;
2804 c__ = 1.;
2805 p = 0.;
2807 lm1 = l - 1;
2808 i__1 = lm1;
2809 for (i__ = m; i__ <= i__1; ++i__) {
2810 f = s * e[i__];
2811 b = c__ * e[i__];
2812 F77_FUNC(slartg,SLARTG)(&g, &f, &c__, &s, &r__);
2813 if (i__ != m) {
2814 e[i__ - 1] = r__;
2816 g = d__[i__] - p;
2817 r__ = (d__[i__ + 1] - g) * s + c__ * 2. * b;
2818 p = s * r__;
2819 d__[i__] = g + p;
2820 g = c__ * r__ - b;
2822 if (icompz > 0) {
2823 work[i__] = c__;
2824 work[*n - 1 + i__] = s;
2829 if (icompz > 0) {
2830 mm = l - m + 1;
2832 F77_FUNC(slasr,SLASR)("r", "v", "f", &c__1, &mm, &work[m], &work[*n - 1 + m], &
2833 z__[m], &c__1);
2836 d__[l] -= p;
2837 e[lm1] = g;
2838 goto L90;
2840 L130:
2841 d__[l] = p;
2843 --l;
2844 if (l >= lend) {
2845 goto L90;
2847 goto L140;
2851 L140:
2852 if (iscale == 1) {
2853 i__1 = lendsv - lsv + 1;
2854 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &d__[lsv],
2855 n, info);
2856 i__1 = lendsv - lsv;
2857 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &ssfmax, &anorm, &i__1, &c__1, &e[lsv], n,
2858 info);
2859 } else if (iscale == 2) {
2860 i__1 = lendsv - lsv + 1;
2861 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &d__[lsv],
2862 n, info);
2863 i__1 = lendsv - lsv;
2864 F77_FUNC(slascl,SLASCL)("g", &c__0, &c__0, &ssfmin, &anorm, &i__1, &c__1, &e[lsv], n,
2865 info);
2868 if (jtot < nmaxit) {
2869 goto L10;
2871 i__1 = *n - 1;
2872 for (i__ = 1; i__ <= i__1; ++i__) {
2873 if (e[i__] != 0.) {
2874 ++(*info);
2877 goto L190;
2879 L160:
2880 if (icompz == 0) {
2882 F77_FUNC(slasrt,SLASRT)("i", n, &d__[1], info);
2884 } else {
2886 i__1 = *n;
2887 for (ii = 2; ii <= i__1; ++ii) {
2888 i__ = ii - 1;
2889 k = i__;
2890 p = d__[i__];
2891 i__2 = *n;
2892 for (j = ii; j <= i__2; ++j) {
2893 if (d__[j] < p) {
2894 k = j;
2895 p = d__[j];
2898 if (k != i__) {
2899 d__[k] = d__[i__];
2900 d__[i__] = p;
2902 p = z__[k];
2903 z__[k] = z__[i__];
2904 z__[i__] = p;
2909 L190:
2910 return;
2914 static void
2915 F77_FUNC(sgetv0,SGETV0)(int * ido,
2916 const char * bmat,
2917 int * itry,
2918 int * initv,
2919 int * n,
2920 int * j,
2921 float * v,
2922 int * ldv,
2923 float * resid,
2924 float * rnorm,
2925 int * ipntr,
2926 float * workd,
2927 int * iwork,
2928 int * ierr)
2930 int c__1 = 1;
2931 float c_b22 = 1.;
2932 float c_b24 = 0.;
2933 float c_b27 = -1.;
2934 int v_dim1, v_offset, i__1;
2936 int jj;
2937 int idist;
2939 --workd;
2940 --resid;
2941 v_dim1 = *ldv;
2942 v_offset = 1 + v_dim1;
2943 v -= v_offset;
2944 --ipntr;
2945 --iwork;
2947 if (*ido == 0) {
2949 *ierr = 0;
2950 iwork[7] = 0;
2951 iwork[5] = 0;
2952 iwork[6] = 0;
2954 if (! (*initv)) {
2955 idist = 2;
2956 F77_FUNC(slarnv,SLARNV)(&idist, &iwork[1], n, &resid[1]);
2959 if (*bmat == 'G') {
2960 ipntr[1] = 1;
2961 ipntr[2] = *n + 1;
2962 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
2963 *ido = -1;
2964 goto L9000;
2968 if (iwork[5] == 1) {
2969 goto L20;
2972 if (iwork[6] == 1) {
2973 goto L40;
2976 iwork[5] = 1;
2977 if (*bmat == 'G') {
2978 F77_FUNC(scopy,SCOPY)(n, &workd[*n + 1], &c__1, &resid[1], &c__1);
2979 ipntr[1] = *n + 1;
2980 ipntr[2] = 1;
2981 *ido = 2;
2982 goto L9000;
2983 } else if (*bmat == 'I') {
2984 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
2987 L20:
2990 iwork[5] = 0;
2991 if (*bmat == 'G') {
2992 workd[*n * 3 + 4] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
2993 workd[*n * 3 + 4] = sqrt(fabs(workd[*n * 3 + 4]));
2994 } else if (*bmat == 'I') {
2995 workd[*n * 3 + 4] =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
2997 *rnorm = workd[*n * 3 + 4];
2999 if (*j == 1) {
3000 goto L50;
3002 iwork[6] = 1;
3003 L30:
3005 i__1 = *j - 1;
3006 F77_FUNC(sgemv,SGEMV)("T", n, &i__1, &c_b22, &v[v_offset], ldv, &workd[1], &c__1, &c_b24,
3007 &workd[*n + 1], &c__1);
3008 i__1 = *j - 1;
3009 F77_FUNC(sgemv,SGEMV)("N", n, &i__1, &c_b27, &v[v_offset], ldv, &workd[*n + 1], &c__1, &
3010 c_b22, &resid[1], &c__1);
3012 if (*bmat == 'G') {
3013 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[*n + 1], &c__1);
3014 ipntr[1] = *n + 1;
3015 ipntr[2] = 1;
3016 *ido = 2;
3017 goto L9000;
3018 } else if (*bmat == 'I') {
3019 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
3022 L40:
3024 if (*bmat == 'G') {
3025 *rnorm =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
3026 *rnorm = sqrt(fabs(*rnorm));
3027 } else if (*bmat == 'I') {
3028 *rnorm =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
3031 if (*rnorm > workd[*n * 3 + 4] * .717f) {
3032 goto L50;
3035 ++iwork[7];
3036 if (iwork[7] <= 1) {
3038 workd[*n * 3 + 4] = *rnorm;
3039 goto L30;
3040 } else {
3042 i__1 = *n;
3043 for (jj = 1; jj <= i__1; ++jj) {
3044 resid[jj] = 0.;
3046 *rnorm = 0.;
3047 *ierr = -1;
3050 L50:
3052 *ido = 99;
3054 L9000:
3055 return;
3062 static void
3063 F77_FUNC(ssapps,SSAPPS)(int * n,
3064 int * kev,
3065 int * np,
3066 float * shift,
3067 float * v,
3068 int * ldv,
3069 float * h__,
3070 int * ldh,
3071 float * resid,
3072 float * q,
3073 int * ldq,
3074 float * workd)
3076 float c_b4 = 0.;
3077 float c_b5 = 1.;
3078 float c_b14 = -1.;
3079 int c__1 = 1;
3080 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
3081 i__3, i__4;
3082 float c__, f, g;
3083 int i__, j;
3084 float r__, s, a1, a2, a3, a4;
3085 int jj;
3086 float big;
3087 int iend, itop;
3088 float epsmch;
3089 int istart, kplusp;
3091 --workd;
3092 --resid;
3093 --shift;
3094 v_dim1 = *ldv;
3095 v_offset = 1 + v_dim1;
3096 v -= v_offset;
3097 h_dim1 = *ldh;
3098 h_offset = 1 + h_dim1;
3099 h__ -= h_offset;
3100 q_dim1 = *ldq;
3101 q_offset = 1 + q_dim1;
3102 q -= q_offset;
3104 epsmch = GMX_FLOAT_EPS;
3105 itop = 1;
3108 kplusp = *kev + *np;
3110 F77_FUNC(slaset,SLASET)("All", &kplusp, &kplusp, &c_b4, &c_b5, &q[q_offset], ldq);
3112 if (*np == 0) {
3113 goto L9000;
3116 i__1 = *np;
3117 for (jj = 1; jj <= i__1; ++jj) {
3119 istart = itop;
3121 L20:
3123 i__2 = kplusp - 1;
3124 for (i__ = istart; i__ <= i__2; ++i__) {
3125 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__ + 1 + (h_dim1*2)]);
3126 if (h__[i__ + 1 + h_dim1] <= epsmch * big) {
3127 h__[i__ + 1 + h_dim1] = 0.;
3128 iend = i__;
3129 goto L40;
3132 iend = kplusp;
3133 L40:
3135 if (istart < iend) {
3137 f = h__[istart + (h_dim1 << 1)] - shift[jj];
3138 g = h__[istart + 1 + h_dim1];
3139 F77_FUNC(slartg,SLARTG)(&f, &g, &c__, &s, &r__);
3141 a1 = c__ * h__[istart + (h_dim1 << 1)] + s * h__[istart + 1 +
3142 h_dim1];
3143 a2 = c__ * h__[istart + 1 + h_dim1] + s * h__[istart + 1 + (
3144 h_dim1 << 1)];
3145 a4 = c__ * h__[istart + 1 + (h_dim1 << 1)] - s * h__[istart + 1 +
3146 h_dim1];
3147 a3 = c__ * h__[istart + 1 + h_dim1] - s * h__[istart + (h_dim1 <<
3148 1)];
3149 h__[istart + (h_dim1 << 1)] = c__ * a1 + s * a2;
3150 h__[istart + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
3151 h__[istart + 1 + h_dim1] = c__ * a3 + s * a4;
3153 i__3 = istart + jj;
3154 i__2 = (i__3<kplusp) ? i__3 : kplusp;
3155 for (j = 1; j <= i__2; ++j) {
3156 a1 = c__ * q[j + istart * q_dim1] + s * q[j + (istart + 1) *
3157 q_dim1];
3158 q[j + (istart + 1) * q_dim1] = -s * q[j + istart * q_dim1] +
3159 c__ * q[j + (istart + 1) * q_dim1];
3160 q[j + istart * q_dim1] = a1;
3164 i__2 = iend - 1;
3165 for (i__ = istart + 1; i__ <= i__2; ++i__) {
3167 f = h__[i__ + h_dim1];
3168 g = s * h__[i__ + 1 + h_dim1];
3170 h__[i__ + 1 + h_dim1] = c__ * h__[i__ + 1 + h_dim1];
3171 F77_FUNC(slartg,SLARTG)(&f, &g, &c__, &s, &r__);
3173 if (r__ < 0.) {
3174 r__ = -r__;
3175 c__ = -c__;
3176 s = -s;
3179 h__[i__ + h_dim1] = r__;
3181 a1 = c__ * h__[i__ + (h_dim1 << 1)] + s * h__[i__ + 1 +
3182 h_dim1];
3183 a2 = c__ * h__[i__ + 1 + h_dim1] + s * h__[i__ + 1 + (h_dim1
3184 << 1)];
3185 a3 = c__ * h__[i__ + 1 + h_dim1] - s * h__[i__ + (h_dim1 << 1)
3187 a4 = c__ * h__[i__ + 1 + (h_dim1 << 1)] - s * h__[i__ + 1 +
3188 h_dim1];
3190 h__[i__ + (h_dim1 << 1)] = c__ * a1 + s * a2;
3191 h__[i__ + 1 + (h_dim1 << 1)] = c__ * a4 - s * a3;
3192 h__[i__ + 1 + h_dim1] = c__ * a3 + s * a4;
3194 i__4 = j + jj;
3195 i__3 = (i__4<kplusp) ? i__4 : kplusp;
3196 for (j = 1; j <= i__3; ++j) {
3197 a1 = c__ * q[j + i__ * q_dim1] + s * q[j + (i__ + 1) *
3198 q_dim1];
3199 q[j + (i__ + 1) * q_dim1] = -s * q[j + i__ * q_dim1] +
3200 c__ * q[j + (i__ + 1) * q_dim1];
3201 q[j + i__ * q_dim1] = a1;
3208 istart = iend + 1;
3210 if (h__[iend + h_dim1] < 0.) {
3211 h__[iend + h_dim1] = -h__[iend + h_dim1];
3212 F77_FUNC(sscal,SSCAL)(&kplusp, &c_b14, &q[iend * q_dim1 + 1], &c__1);
3215 if (iend < kplusp) {
3216 goto L20;
3219 i__2 = kplusp - 1;
3220 for (i__ = itop; i__ <= i__2; ++i__) {
3221 if (h__[i__ + 1 + h_dim1] > 0.) {
3222 goto L90;
3224 ++itop;
3227 L90:
3231 i__1 = kplusp - 1;
3232 for (i__ = itop; i__ <= i__1; ++i__) {
3233 big = fabs(h__[i__ + (h_dim1*2)]) + fabs(h__[i__+ 1 + (h_dim1*2)]);
3234 if (h__[i__ + 1 + h_dim1] <= epsmch * big) {
3235 h__[i__ + 1 + h_dim1] = 0.;
3240 if (h__[*kev + 1 + h_dim1] > 0.) {
3241 F77_FUNC(sgemv,SGEMV)("N", n, &kplusp, &c_b5, &v[v_offset], ldv, &q[(*kev + 1) *
3242 q_dim1 + 1], &c__1, &c_b4, &workd[*n + 1], &c__1);
3245 i__1 = *kev;
3246 for (i__ = 1; i__ <= i__1; ++i__) {
3247 i__2 = kplusp - i__ + 1;
3248 F77_FUNC(sgemv,SGEMV)("N", n, &i__2, &c_b5, &v[v_offset], ldv, &q[(*kev - i__ + 1) *
3249 q_dim1 + 1], &c__1, &c_b4, &workd[1], &c__1);
3250 F77_FUNC(scopy,SCOPY)(n, &workd[1], &c__1, &v[(kplusp - i__ + 1) * v_dim1 + 1], &
3251 c__1);
3255 F77_FUNC(slacpy,SLACPY)("All", n, kev, &v[(*np + 1) * v_dim1 + 1], ldv, &v[v_offset], ldv);
3257 if (h__[*kev + 1 + h_dim1] > 0.) {
3258 F77_FUNC(scopy,SCOPY)(n, &workd[*n + 1], &c__1, &v[(*kev + 1) * v_dim1 + 1], &c__1);
3261 F77_FUNC(sscal,SSCAL)(n, &q[kplusp + *kev * q_dim1], &resid[1], &c__1);
3262 if (h__[*kev + 1 + h_dim1] > 0.) {
3263 F77_FUNC(saxpy,SAXPY)(n, &h__[*kev + 1 + h_dim1], &v[(*kev + 1) * v_dim1 + 1], &c__1,
3264 &resid[1], &c__1);
3269 L9000:
3270 return;
3276 static void
3277 F77_FUNC(ssortr,SSORTR)(const char * which,
3278 int * apply,
3279 int * n,
3280 float * x1,
3281 float * x2)
3283 int i__1;
3285 int i__, j, igap;
3286 float temp;
3290 igap = *n / 2;
3292 if (!strncmp(which, "SA", 2)) {
3294 L10:
3295 if (igap == 0) {
3296 goto L9000;
3298 i__1 = *n - 1;
3299 for (i__ = igap; i__ <= i__1; ++i__) {
3300 j = i__ - igap;
3301 L20:
3303 if (j < 0) {
3304 goto L30;
3307 if (x1[j] < x1[j + igap]) {
3308 temp = x1[j];
3309 x1[j] = x1[j + igap];
3310 x1[j + igap] = temp;
3311 if (*apply) {
3312 temp = x2[j];
3313 x2[j] = x2[j + igap];
3314 x2[j + igap] = temp;
3316 } else {
3317 goto L30;
3319 j -= igap;
3320 goto L20;
3321 L30:
3324 igap /= 2;
3325 goto L10;
3327 } else if (!strncmp(which, "SM", 2)) {
3329 L40:
3330 if (igap == 0) {
3331 goto L9000;
3333 i__1 = *n - 1;
3334 for (i__ = igap; i__ <= i__1; ++i__) {
3335 j = i__ - igap;
3336 L50:
3338 if (j < 0) {
3339 goto L60;
3342 if (fabs(x1[j]) < fabs(x1[j + igap])) {
3343 temp = x1[j];
3344 x1[j] = x1[j + igap];
3345 x1[j + igap] = temp;
3346 if (*apply) {
3347 temp = x2[j];
3348 x2[j] = x2[j + igap];
3349 x2[j + igap] = temp;
3351 } else {
3352 goto L60;
3354 j -= igap;
3355 goto L50;
3356 L60:
3359 igap /= 2;
3360 goto L40;
3362 } else if (!strncmp(which, "LA", 2)) {
3364 L70:
3365 if (igap == 0) {
3366 goto L9000;
3368 i__1 = *n - 1;
3369 for (i__ = igap; i__ <= i__1; ++i__) {
3370 j = i__ - igap;
3371 L80:
3373 if (j < 0) {
3374 goto L90;
3377 if (x1[j] > x1[j + igap]) {
3378 temp = x1[j];
3379 x1[j] = x1[j + igap];
3380 x1[j + igap] = temp;
3381 if (*apply) {
3382 temp = x2[j];
3383 x2[j] = x2[j + igap];
3384 x2[j + igap] = temp;
3386 } else {
3387 goto L90;
3389 j -= igap;
3390 goto L80;
3391 L90:
3394 igap /= 2;
3395 goto L70;
3397 } else if (!strncmp(which, "LM", 2)) {
3400 L100:
3401 if (igap == 0) {
3402 goto L9000;
3404 i__1 = *n - 1;
3405 for (i__ = igap; i__ <= i__1; ++i__) {
3406 j = i__ - igap;
3407 L110:
3409 if (j < 0) {
3410 goto L120;
3413 if (fabs(x1[j]) > fabs(x1[j + igap])) {
3414 temp = x1[j];
3415 x1[j] = x1[j + igap];
3416 x1[j + igap] = temp;
3417 if (*apply) {
3418 temp = x2[j];
3419 x2[j] = x2[j + igap];
3420 x2[j + igap] = temp;
3422 } else {
3423 goto L120;
3425 j -= igap;
3426 goto L110;
3427 L120:
3430 igap /= 2;
3431 goto L100;
3434 L9000:
3435 return;
3442 static void
3443 F77_FUNC(ssesrt,SSESRT)(const char * which,
3444 int * apply,
3445 int * n,
3446 float * x,
3447 int * na,
3448 float * a,
3449 int * lda)
3451 int a_dim1, a_offset, i__1;
3452 int c__1 = 1;
3454 int i__, j, igap;
3455 float temp;
3457 a_dim1 = *lda;
3458 a_offset = 1 + a_dim1 * 0;
3459 a -= a_offset;
3461 igap = *n / 2;
3463 if (!strncmp(which, "SA", 2)) {
3465 L10:
3466 if (igap == 0) {
3467 goto L9000;
3469 i__1 = *n - 1;
3470 for (i__ = igap; i__ <= i__1; ++i__) {
3471 j = i__ - igap;
3472 L20:
3474 if (j < 0) {
3475 goto L30;
3478 if (x[j] < x[j + igap]) {
3479 temp = x[j];
3480 x[j] = x[j + igap];
3481 x[j + igap] = temp;
3482 if (*apply) {
3483 F77_FUNC(sswap,SSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
3484 a_dim1 + 1], &c__1);
3486 } else {
3487 goto L30;
3489 j -= igap;
3490 goto L20;
3491 L30:
3494 igap /= 2;
3495 goto L10;
3497 } else if (!strncmp(which, "SM", 2)) {
3499 L40:
3500 if (igap == 0) {
3501 goto L9000;
3503 i__1 = *n - 1;
3504 for (i__ = igap; i__ <= i__1; ++i__) {
3505 j = i__ - igap;
3506 L50:
3508 if (j < 0) {
3509 goto L60;
3512 if (fabs(x[j]) < fabs(x[j + igap])) {
3513 temp = x[j];
3514 x[j] = x[j + igap];
3515 x[j + igap] = temp;
3516 if (*apply) {
3517 F77_FUNC(sswap,SSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
3518 a_dim1 + 1], &c__1);
3520 } else {
3521 goto L60;
3523 j -= igap;
3524 goto L50;
3525 L60:
3528 igap /= 2;
3529 goto L40;
3531 } else if (!strncmp(which, "LA", 2)) {
3533 L70:
3534 if (igap == 0) {
3535 goto L9000;
3537 i__1 = *n - 1;
3538 for (i__ = igap; i__ <= i__1; ++i__) {
3539 j = i__ - igap;
3540 L80:
3542 if (j < 0) {
3543 goto L90;
3546 if (x[j] > x[j + igap]) {
3547 temp = x[j];
3548 x[j] = x[j + igap];
3549 x[j + igap] = temp;
3550 if (*apply) {
3551 F77_FUNC(sswap,SSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
3552 a_dim1 + 1], &c__1);
3554 } else {
3555 goto L90;
3557 j -= igap;
3558 goto L80;
3559 L90:
3562 igap /= 2;
3563 goto L70;
3565 } else if (!strncmp(which, "LM", 2)) {
3567 L100:
3568 if (igap == 0) {
3569 goto L9000;
3571 i__1 = *n - 1;
3572 for (i__ = igap; i__ <= i__1; ++i__) {
3573 j = i__ - igap;
3574 L110:
3576 if (j < 0) {
3577 goto L120;
3580 if (fabs(x[j]) > fabs(x[j + igap])) {
3581 temp = x[j];
3582 x[j] = x[j + igap];
3583 x[j + igap] = temp;
3584 if (*apply) {
3585 F77_FUNC(sswap,SSWAP)(na, &a[j * a_dim1 + 1], &c__1, &a[(j + igap) *
3586 a_dim1 + 1], &c__1);
3588 } else {
3589 goto L120;
3591 j -= igap;
3592 goto L110;
3593 L120:
3596 igap /= 2;
3597 goto L100;
3600 L9000:
3601 return;
3608 static void
3609 F77_FUNC(ssgets,SSGETS)(int * ishift,
3610 const char * which,
3611 int * kev,
3612 int * np,
3613 float * ritz,
3614 float * bounds,
3615 float * shifts)
3617 int c__1 = 1;
3618 int i__1, i__2;
3619 int kevd2;
3621 --shifts;
3622 --bounds;
3623 --ritz;
3625 if (!strncmp(which, "BE", 2)) {
3626 i__1 = *kev + *np;
3627 F77_FUNC(ssortr,SSORTR)("LA", &c__1, &i__1, &ritz[1], &bounds[1]);
3628 kevd2 = *kev / 2;
3629 if (*kev > 1) {
3630 i__1 = (kevd2<*np) ? kevd2 : *np;
3631 i__2 = (kevd2>*np) ? kevd2 : *np;
3632 F77_FUNC(sswap,SSWAP)(&i__1, &ritz[1], &c__1,
3633 &ritz[i__2 + 1], &c__1);
3634 i__1 = (kevd2<*np) ? kevd2 : *np;
3635 i__2 = (kevd2>*np) ? kevd2 : *np;
3636 F77_FUNC(sswap,SSWAP)(&i__1, &bounds[1], &c__1,
3637 &bounds[i__2 + 1], &c__1);
3640 } else {
3641 i__1 = *kev + *np;
3642 F77_FUNC(ssortr,SSORTR)(which, &c__1, &i__1, &ritz[1], &bounds[1]);
3645 if (*ishift == 1 && *np > 0) {
3647 F77_FUNC(ssortr,SSORTR)("SM", &c__1, np, &bounds[1], &ritz[1]);
3648 F77_FUNC(scopy,SCOPY)(np, &ritz[1], &c__1, &shifts[1], &c__1);
3652 return;
3657 static void
3658 F77_FUNC(ssconv,SSCONV)(int * n,
3659 float * ritz,
3660 float * bounds,
3661 float * tol,
3662 int * nconv)
3664 float c_b3 = 2/3;
3665 int i__1;
3666 float d__2, d__3;
3668 int i__;
3669 float eps23, temp;
3671 --bounds;
3672 --ritz;
3674 eps23 = GMX_FLOAT_EPS;
3675 eps23 = pow(eps23, c_b3);
3677 *nconv = 0;
3678 i__1 = *n;
3679 for (i__ = 1; i__ <= i__1; ++i__) {
3681 d__2 = eps23;
3682 d__3 = fabs(ritz[i__]);
3683 temp = (d__2 > d__3) ? d__2 : d__3;
3684 if (bounds[i__] <= *tol * temp) {
3685 ++(*nconv);
3689 return;
3693 static void
3694 F77_FUNC(sseigt,SSEIGT)(float * rnorm,
3695 int * n,
3696 float * h__,
3697 int * ldh,
3698 float * eig,
3699 float * bounds,
3700 float * workl,
3701 int * ierr)
3703 int c__1 = 1;
3704 int h_dim1, h_offset, i__1;
3706 int k;
3709 --workl;
3710 --bounds;
3711 --eig;
3712 h_dim1 = *ldh;
3713 h_offset = 1 + h_dim1;
3714 h__ -= h_offset;
3716 F77_FUNC(scopy,SCOPY)(n, &h__[(h_dim1 << 1) + 1], &c__1, &eig[1], &c__1);
3717 i__1 = *n - 1;
3718 F77_FUNC(scopy,SCOPY)(&i__1, &h__[h_dim1 + 2], &c__1, &workl[1], &c__1);
3719 F77_FUNC(sstqrb,SSTQRB)(n, &eig[1], &workl[1], &bounds[1], &workl[*n + 1], ierr);
3720 if (*ierr != 0) {
3721 goto L9000;
3724 i__1 = *n;
3725 for (k = 1; k <= i__1; ++k) {
3726 bounds[k] = *rnorm * fabs(bounds[k]);
3731 L9000:
3732 return;
3738 static void
3739 F77_FUNC(ssaitr,SSAITR)(int * ido,
3740 const char * bmat,
3741 int * n,
3742 int * k,
3743 int * np,
3744 int * mode,
3745 float * resid,
3746 float * rnorm,
3747 float * v,
3748 int * ldv,
3749 float * h__,
3750 int * ldh,
3751 int * ipntr,
3752 float * workd,
3753 int * iwork,
3754 int * info)
3757 int c__0 = 0;
3758 int c__1 = 1;
3759 float c_b18 = 1.;
3760 float c_b42 = 0.;
3761 float c_b50 = -1.;
3763 int h_dim1, h_offset, v_dim1, v_offset, i__1;
3764 int i__, jj;
3765 float temp1;
3766 int infol;
3767 float safmin,minval;
3770 --workd;
3771 --resid;
3772 v_dim1 = *ldv;
3773 v_offset = 1 + v_dim1;
3774 v -= v_offset;
3775 h_dim1 = *ldh;
3776 h_offset = 1 + h_dim1;
3777 h__ -= h_offset;
3778 --ipntr;
3779 --iwork;
3780 minval = GMX_FLOAT_MIN;
3781 safmin = minval / GMX_FLOAT_EPS;
3783 if (*ido == 0) {
3784 *info = 0;
3785 iwork[5] = 0;
3786 iwork[6] = 0;
3787 iwork[4] = 0;
3788 iwork[2] = 0;
3789 iwork[3] = 0;
3791 iwork[12] = *k + 1;
3793 iwork[8] = 1;
3794 iwork[9] = iwork[8] + *n;
3795 iwork[10] = iwork[9] + *n;
3798 if (iwork[5] == 1) {
3799 goto L50;
3801 if (iwork[6] == 1) {
3802 goto L60;
3804 if (iwork[2] == 1) {
3805 goto L70;
3807 if (iwork[3] == 1) {
3808 goto L90;
3810 if (iwork[4] == 1) {
3811 goto L30;
3814 L1000:
3817 if (*rnorm > 0.) {
3818 goto L40;
3821 iwork[11] = 1;
3822 L20:
3823 iwork[4] = 1;
3824 *ido = 0;
3825 L30:
3827 F77_FUNC(sgetv0,sgetv0)(ido, bmat, &iwork[11], &c__0, n, &iwork[12], &v[v_offset], ldv,
3828 &resid[1], rnorm, &ipntr[1], &workd[1], &iwork[21], &iwork[7]);
3829 if (*ido != 99) {
3830 goto L9000;
3832 if (iwork[7] < 0) {
3833 ++iwork[11];
3834 if (iwork[11] <= 3) {
3835 goto L20;
3838 *info = iwork[12] - 1;
3839 *ido = 99;
3840 goto L9000;
3843 L40:
3845 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &v[iwork[12] * v_dim1 + 1], &c__1);
3846 if (*rnorm >= safmin) {
3847 temp1 = 1. / *rnorm;
3848 F77_FUNC(sscal,SSCAL)(n, &temp1, &v[iwork[12] * v_dim1 + 1], &c__1);
3849 F77_FUNC(sscal,SSCAL)(n, &temp1, &workd[iwork[8]], &c__1);
3850 } else {
3852 F77_FUNC(slascl,SLASCL)("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &v[iwork[12] *
3853 v_dim1 + 1], n, &infol);
3854 F77_FUNC(slascl,SLASCL)("General", &i__, &i__, rnorm, &c_b18, n, &c__1, &workd[iwork[
3855 8]], n, &infol);
3858 iwork[5] = 1;
3859 F77_FUNC(scopy,SCOPY)(n, &v[iwork[12] * v_dim1 + 1], &c__1, &workd[iwork[10]], &c__1);
3860 ipntr[1] = iwork[10];
3861 ipntr[2] = iwork[9];
3862 ipntr[3] = iwork[8];
3863 *ido = 1;
3865 goto L9000;
3866 L50:
3869 iwork[5] = 0;
3871 F77_FUNC(scopy,SCOPY)(n, &workd[iwork[9]], &c__1, &resid[1], &c__1);
3873 if (*mode == 2) {
3874 goto L65;
3876 if (*bmat == 'G') {
3877 iwork[6] = 1;
3878 ipntr[1] = iwork[9];
3879 ipntr[2] = iwork[8];
3880 *ido = 2;
3882 goto L9000;
3883 } else if (*bmat == 'I') {
3884 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
3886 L60:
3888 iwork[6] = 0;
3890 L65:
3891 if (*mode == 2) {
3893 workd[*n * 3 + 3] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[iwork[10]], &
3894 c__1);
3895 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
3896 } else if (*bmat == 'G') {
3897 workd[*n * 3 + 3] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &
3898 c__1);
3899 workd[*n * 3 + 3] = sqrt(fabs(workd[*n * 3 + 3]));
3900 } else if (*bmat == 'I') {
3901 workd[*n * 3 + 3] =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
3904 if (*mode != 2) {
3905 F77_FUNC(sgemv,SGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]]
3906 , &c__1, &c_b42, &workd[iwork[9]], &c__1);
3907 } else if (*mode == 2) {
3908 F77_FUNC(sgemv,SGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[10]
3909 ], &c__1, &c_b42, &workd[iwork[9]], &c__1);
3912 F77_FUNC(sgemv,SGEMV)("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
3913 c__1, &c_b18, &resid[1], &c__1);
3915 h__[iwork[12] + (h_dim1 << 1)] = workd[iwork[9] + iwork[12] - 1];
3916 if (iwork[12] == 1 || iwork[4] == 1) {
3917 h__[iwork[12] + h_dim1] = 0.;
3918 } else {
3919 h__[iwork[12] + h_dim1] = *rnorm;
3922 iwork[2] = 1;
3923 iwork[1] = 0;
3925 if (*bmat == 'G') {
3926 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
3927 ipntr[1] = iwork[9];
3928 ipntr[2] = iwork[8];
3929 *ido = 2;
3931 goto L9000;
3932 } else if (*bmat == 'I') {
3933 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
3935 L70:
3937 iwork[2] = 0;
3939 if (*bmat == 'G') {
3940 *rnorm =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
3941 *rnorm = sqrt(fabs(*rnorm));
3942 } else if (*bmat == 'I') {
3943 *rnorm =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
3946 if (*rnorm > workd[*n * 3 + 3] * .717f) {
3947 goto L100;
3950 L80:
3952 F77_FUNC(sgemv,SGEMV)("T", n, &iwork[12], &c_b18, &v[v_offset], ldv, &workd[iwork[8]], &
3953 c__1, &c_b42, &workd[iwork[9]], &c__1);
3955 F77_FUNC(sgemv,SGEMV)("N", n, &iwork[12], &c_b50, &v[v_offset], ldv, &workd[iwork[9]], &
3956 c__1, &c_b18, &resid[1], &c__1);
3958 if (iwork[12] == 1 || iwork[4] == 1) {
3959 h__[iwork[12] + h_dim1] = 0.;
3961 h__[iwork[12] + (h_dim1 << 1)] += workd[iwork[9] + iwork[12] - 1];
3963 iwork[3] = 1;
3964 if (*bmat == 'G') {
3965 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[9]], &c__1);
3966 ipntr[1] = iwork[9];
3967 ipntr[2] = iwork[8];
3968 *ido = 2;
3970 goto L9000;
3971 } else if (*bmat == 'I') {
3972 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[iwork[8]], &c__1);
3974 L90:
3977 if (*bmat == 'G') {
3978 workd[*n * 3 + 2] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[iwork[8]], &
3979 c__1);
3980 workd[*n * 3 + 2] = sqrt(fabs(workd[*n * 3 + 2]));
3981 } else if (*bmat == 'I') {
3982 workd[*n * 3 + 2] =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
3986 if (workd[*n * 3 + 2] > *rnorm * .717f) {
3988 *rnorm = workd[*n * 3 + 2];
3990 } else {
3992 *rnorm = workd[*n * 3 + 2];
3993 ++iwork[1];
3994 if (iwork[1] <= 1) {
3995 goto L80;
3998 i__1 = *n;
3999 for (jj = 1; jj <= i__1; ++jj) {
4000 resid[jj] = 0.;
4002 *rnorm = 0.;
4005 L100:
4007 iwork[4] = 0;
4008 iwork[3] = 0;
4010 if (h__[iwork[12] + h_dim1] < 0.) {
4011 h__[iwork[12] + h_dim1] = -h__[iwork[12] + h_dim1];
4012 if (iwork[12] < *k + *np) {
4013 F77_FUNC(sscal,SSCAL)(n, &c_b50, &v[(iwork[12] + 1) * v_dim1 + 1], &c__1);
4014 } else {
4015 F77_FUNC(sscal,SSCAL)(n, &c_b50, &resid[1], &c__1);
4019 ++iwork[12];
4020 if (iwork[12] > *k + *np) {
4021 *ido = 99;
4024 goto L9000;
4027 goto L1000;
4029 L9000:
4030 return;
4038 static void
4039 F77_FUNC(ssaup2,SSAUP2)(int * ido,
4040 const char * bmat,
4041 int * n,
4042 const char * which,
4043 int * nev,
4044 int * np,
4045 float * tol,
4046 float * resid,
4047 int * mode,
4048 int * iupd,
4049 int * ishift,
4050 int * mxiter,
4051 float * v,
4052 int * ldv,
4053 float * h__,
4054 int * ldh,
4055 float * ritz,
4056 float * bounds,
4057 float * q,
4058 int * ldq,
4059 float * workl,
4060 int * ipntr,
4061 float * workd,
4062 int * iwork,
4063 int * info)
4065 float c_b3 = 2/3;
4066 int c__1 = 1;
4067 int c__0 = 0;
4069 int h_dim1, h_offset, q_dim1, q_offset, v_dim1, v_offset, i__1, i__2,
4070 i__3;
4071 float d__2, d__3;
4072 int j;
4073 float eps23;
4074 int ierr;
4075 float temp;
4076 int nevd2;
4077 int nevm2;
4078 int nevbef;
4079 char wprime[2];
4080 int nptemp;
4082 --workd;
4083 --resid;
4084 --workl;
4085 --bounds;
4086 --ritz;
4087 v_dim1 = *ldv;
4088 v_offset = 1 + v_dim1;
4089 v -= v_offset;
4090 h_dim1 = *ldh;
4091 h_offset = 1 + h_dim1;
4092 h__ -= h_offset;
4093 q_dim1 = *ldq;
4094 q_offset = 1 + q_dim1;
4095 q -= q_offset;
4096 --ipntr;
4097 --iwork;
4098 eps23 = GMX_FLOAT_EPS;
4099 eps23 = pow(eps23, c_b3);
4101 if (*ido == 0) {
4103 iwork[41] = 1;
4104 iwork[42] = 3;
4105 iwork[43] = 5;
4106 iwork[44] = 7;
4108 iwork[9] = *nev;
4109 iwork[10] = *np;
4111 iwork[7] = iwork[9] + iwork[10];
4112 iwork[8] = 0;
4113 iwork[6] = 0;
4115 iwork[2] = 1;
4116 iwork[4] = 0;
4117 iwork[5] = 0;
4118 iwork[1] = 0;
4120 if (*info != 0) {
4122 iwork[3] = 1;
4123 *info = 0;
4124 } else {
4125 iwork[3] = 0;
4129 if (iwork[2] == 1) {
4130 F77_FUNC(sgetv0,SGETV0)(ido, bmat, &c__1, &iwork[3], n, &c__1, &v[v_offset], ldv, &
4131 resid[1], &workd[*n * 3 + 1], &ipntr[1], &workd[1], &iwork[41]
4132 , info);
4134 if (*ido != 99) {
4135 goto L9000;
4138 if (workd[*n * 3 + 1] == 0.) {
4140 *info = -9;
4141 goto L1200;
4143 iwork[2] = 0;
4144 *ido = 0;
4147 if (iwork[4] == 1) {
4148 goto L20;
4151 if (iwork[5] == 1) {
4152 goto L50;
4155 if (iwork[1] == 1) {
4156 goto L100;
4159 F77_FUNC(ssaitr,SSAITR)(ido, bmat, n, &c__0, &iwork[9], mode, &resid[1], &workd[*n * 3 +
4160 1], &v[v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1],
4161 &iwork[21], info);
4163 if (*ido != 99) {
4164 goto L9000;
4167 if (*info > 0) {
4169 *np = *info;
4170 *mxiter = iwork[6];
4171 *info = -9999;
4172 goto L1200;
4175 L1000:
4177 ++iwork[6];
4180 *ido = 0;
4181 L20:
4182 iwork[4] = 1;
4184 F77_FUNC(ssaitr,SSAITR)(ido, bmat, n, nev, np, mode, &resid[1], &workd[*n * 3 + 1], &v[
4185 v_offset], ldv, &h__[h_offset], ldh, &ipntr[1], &workd[1], &iwork[
4186 21], info);
4188 if (*ido != 99) {
4189 goto L9000;
4192 if (*info > 0) {
4194 *np = *info;
4195 *mxiter = iwork[6];
4196 *info = -9999;
4197 goto L1200;
4199 iwork[4] = 0;
4201 F77_FUNC(sseigt,SSEIGT)(&workd[*n * 3 + 1], &iwork[7], &h__[h_offset], ldh, &ritz[1], &
4202 bounds[1], &workl[1], &ierr);
4204 if (ierr != 0) {
4205 *info = -8;
4206 goto L1200;
4209 F77_FUNC(scopy,SCOPY)(&iwork[7], &ritz[1], &c__1, &workl[iwork[7] + 1], &c__1);
4210 F77_FUNC(scopy,SCOPY)(&iwork[7], &bounds[1], &c__1, &workl[(iwork[7] << 1) + 1], &c__1);
4212 *nev = iwork[9];
4213 *np = iwork[10];
4214 F77_FUNC(ssgets,SSGETS)(ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
4216 F77_FUNC(scopy,SCOPY)(nev, &bounds[*np + 1], &c__1, &workl[*np + 1], &c__1);
4217 F77_FUNC(ssconv,SSCONV)(nev, &ritz[*np + 1], &workl[*np + 1], tol, &iwork[8]);
4220 nptemp = *np;
4221 i__1 = nptemp;
4222 for (j = 1; j <= i__1; ++j) {
4223 if (bounds[j] == 0.) {
4224 --(*np);
4225 ++(*nev);
4229 if (iwork[8] >= iwork[9] || iwork[6] > *mxiter || *np == 0) {
4231 if (!strncmp(which, "BE", 2)) {
4233 strncpy(wprime, "SA",2);
4234 F77_FUNC(ssortr,SSORTR)(wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
4235 nevd2 = *nev / 2;
4236 nevm2 = *nev - nevd2;
4237 if (*nev > 1) {
4238 i__1 = (nevd2 < *np) ? nevd2 : *np;
4239 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np + 1;
4240 F77_FUNC(sswap,SSWAP)(&i__1, &ritz[nevm2 + 1], &c__1,
4241 &ritz[((i__2>i__3) ? i__2 : i__3)],
4242 &c__1);
4243 i__1 = (nevd2 < *np) ? nevd2 : *np;
4244 i__2 = iwork[7] - nevd2 + 1, i__3 = iwork[7] - *np;
4245 F77_FUNC(sswap,SSWAP)(&i__1, &bounds[nevm2 + 1], &c__1,
4246 &bounds[((i__2>i__3) ? i__2 : i__3) + 1],
4247 &c__1);
4250 } else {
4252 if (!strncmp(which, "LM", 2)) {
4253 strncpy(wprime, "SM", 2);
4255 if (!strncmp(which, "SM", 2)) {
4256 strncpy(wprime, "LM", 2);
4258 if (!strncmp(which, "LA", 2)) {
4259 strncpy(wprime, "SA", 2);
4261 if (!strncmp(which, "SA", 2)) {
4262 strncpy(wprime, "LA", 2);
4265 F77_FUNC(ssortr,SSORTR)(wprime, &c__1, &iwork[7], &ritz[1], &bounds[1]);
4269 i__1 = iwork[9];
4270 for (j = 1; j <= i__1; ++j) {
4271 d__2 = eps23;
4272 d__3 = fabs(ritz[j]);
4273 temp = (d__2>d__3) ? d__2 : d__3;
4274 bounds[j] /= temp;
4277 strncpy(wprime, "LA",2);
4278 F77_FUNC(ssortr,SSORTR)(wprime, &c__1, &iwork[9], &bounds[1], &ritz[1]);
4280 i__1 = iwork[9];
4281 for (j = 1; j <= i__1; ++j) {
4282 d__2 = eps23;
4283 d__3 = fabs(ritz[j]);
4284 temp = (d__2>d__3) ? d__2 : d__3;
4285 bounds[j] *= temp;
4288 if (!strncmp(which, "BE", 2)) {
4290 strncpy(wprime, "LA", 2);
4291 F77_FUNC(ssortr,SSORTR)(wprime, &c__1, &iwork[8], &ritz[1], &bounds[1]);
4293 } else {
4294 F77_FUNC(ssortr,SSORTR)(which, &c__1, &iwork[8], &ritz[1], &bounds[1]);
4298 h__[h_dim1 + 1] = workd[*n * 3 + 1];
4301 if (iwork[6] > *mxiter && iwork[8] < *nev) {
4302 *info = 1;
4304 if (*np == 0 && iwork[8] < iwork[9]) {
4305 *info = 2;
4308 *np = iwork[8];
4309 goto L1100;
4311 } else if (iwork[8] < *nev && *ishift == 1) {
4312 nevbef = *nev;
4313 i__1 = iwork[8], i__2 = *np / 2;
4314 *nev += (i__1 < i__2) ? i__1 : i__2;
4315 if (*nev == 1 && iwork[7] >= 6) {
4316 *nev = iwork[7] / 2;
4317 } else if (*nev == 1 && iwork[7] > 2) {
4318 *nev = 2;
4320 *np = iwork[7] - *nev;
4323 if (nevbef < *nev) {
4324 F77_FUNC(ssgets,SSGETS)(ishift, which, nev, np, &ritz[1], &bounds[1], &workl[1]);
4330 if (*ishift == 0) {
4332 iwork[5] = 1;
4333 *ido = 3;
4334 goto L9000;
4337 L50:
4339 iwork[5] = 0;
4341 if (*ishift == 0) {
4342 F77_FUNC(scopy,SCOPY)(np, &workl[1], &c__1, &ritz[1], &c__1);
4345 F77_FUNC(ssapps,SSAPPS)(n, nev, np, &ritz[1], &v[v_offset], ldv, &h__[h_offset], ldh, &
4346 resid[1], &q[q_offset], ldq, &workd[1]);
4348 iwork[1] = 1;
4349 if (*bmat == 'G') {
4350 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[*n + 1], &c__1);
4351 ipntr[1] = *n + 1;
4352 ipntr[2] = 1;
4353 *ido = 2;
4355 goto L9000;
4356 } else if (*bmat == 'I') {
4357 F77_FUNC(scopy,SCOPY)(n, &resid[1], &c__1, &workd[1], &c__1);
4360 L100:
4362 if (*bmat == 'G') {
4363 workd[*n * 3 + 1] =F77_FUNC(sdot,SDOT)(n, &resid[1], &c__1, &workd[1], &c__1);
4364 workd[*n * 3 + 1] = sqrt(fabs(workd[*n * 3 + 1]));
4365 } else if (*bmat == 'I') {
4366 workd[*n * 3 + 1] =F77_FUNC(snrm2,SNRM2)(n, &resid[1], &c__1);
4368 iwork[1] = 0;
4370 goto L1000;
4372 L1100:
4374 *mxiter = iwork[6];
4375 *nev = iwork[8];
4377 L1200:
4378 *ido = 99;
4380 L9000:
4381 return;
4387 void
4388 F77_FUNC(ssaupd,SSAUPD)(int * ido,
4389 const char * bmat,
4390 int * n,
4391 const char * which,
4392 int * nev,
4393 float * tol,
4394 float * resid,
4395 int * ncv,
4396 float * v,
4397 int * ldv,
4398 int * iparam,
4399 int * ipntr,
4400 float * workd,
4401 int * iwork,
4402 float * workl,
4403 int * lworkl,
4404 int * info)
4406 int v_dim1, v_offset, i__1, i__2;
4407 int j;
4409 --workd;
4410 --resid;
4411 v_dim1 = *ldv;
4412 v_offset = 1 + v_dim1;
4413 v -= v_offset;
4414 --iparam;
4415 --ipntr;
4416 --iwork;
4417 --workl;
4419 if (*ido == 0) {
4422 iwork[2] = 0;
4423 iwork[5] = iparam[1];
4424 iwork[10] = iparam[3];
4425 iwork[12] = iparam[4];
4427 iwork[6] = 1;
4428 iwork[11] = iparam[7];
4431 if (*n <= 0) {
4432 iwork[2] = -1;
4433 } else if (*nev <= 0) {
4434 iwork[2] = -2;
4435 } else if (*ncv <= *nev || *ncv > *n) {
4436 iwork[2] = -3;
4440 iwork[15] = *ncv - *nev;
4442 if (iwork[10] <= 0) {
4443 iwork[2] = -4;
4445 if (strncmp(which,"LM",2) && strncmp(which,"SM",2) &&
4446 strncmp(which,"LA",2) && strncmp(which,"SA",2) &&
4447 strncmp(which,"BE",2)) {
4448 iwork[2] = -5;
4450 if (*bmat != 'I' && *bmat != 'G') {
4451 iwork[2] = -6;
4454 i__1 = *ncv;
4455 if (*lworkl < i__1 * i__1 + (*ncv << 3)) {
4456 iwork[2] = -7;
4458 if (iwork[11] < 1 || iwork[11] > 5) {
4459 iwork[2] = -10;
4460 } else if (iwork[11] == 1 && *bmat == 'G') {
4461 iwork[2] = -11;
4462 } else if (iwork[5] < 0 || iwork[5] > 1) {
4463 iwork[2] = -12;
4464 } else if (*nev == 1 && !strncmp(which, "BE", 2)) {
4465 iwork[2] = -13;
4468 if (iwork[2] != 0) {
4469 *info = iwork[2];
4470 *ido = 99;
4471 goto L9000;
4474 if (iwork[12] <= 0) {
4475 iwork[12] = 1;
4477 if (*tol <= 0.) {
4478 *tol = GMX_FLOAT_EPS;
4481 iwork[15] = *ncv - *nev;
4482 iwork[13] = *nev;
4483 i__2 = *ncv;
4484 i__1 = i__2 * i__2 + (*ncv << 3);
4485 for (j = 1; j <= i__1; ++j) {
4486 workl[j] = 0.;
4489 iwork[8] = *ncv;
4490 iwork[9] = *ncv;
4491 iwork[3] = 1;
4492 iwork[16] = iwork[3] + (iwork[8] << 1);
4493 iwork[1] = iwork[16] + *ncv;
4494 iwork[4] = iwork[1] + *ncv;
4495 i__1 = *ncv;
4496 iwork[7] = iwork[4] + i__1 * i__1;
4497 iwork[14] = iwork[7] + *ncv * 3;
4499 ipntr[4] = iwork[14];
4500 ipntr[5] = iwork[3];
4501 ipntr[6] = iwork[16];
4502 ipntr[7] = iwork[1];
4503 ipntr[11] = iwork[7];
4506 F77_FUNC(ssaup2,SSAUP2)(ido, bmat, n, which, &iwork[13], &iwork[15], tol, &resid[1], &
4507 iwork[11], &iwork[6], &iwork[5], &iwork[10], &v[v_offset], ldv, &
4508 workl[iwork[3]], &iwork[8], &workl[iwork[16]], &workl[iwork[1]], &
4509 workl[iwork[4]], &iwork[9], &workl[iwork[7]], &ipntr[1], &workd[1]
4510 , &iwork[21], info);
4512 if (*ido == 3) {
4513 iparam[8] = iwork[15];
4515 if (*ido != 99) {
4516 goto L9000;
4519 iparam[3] = iwork[10];
4520 iparam[5] = iwork[15];
4522 if (*info < 0) {
4523 goto L9000;
4525 if (*info == 2) {
4526 *info = 3;
4529 L9000:
4531 return;
4537 void
4538 F77_FUNC(sseupd,SSEUPD)(int * rvec,
4539 const char * howmny,
4540 int * select,
4541 float * d__,
4542 float * z__,
4543 int * ldz,
4544 float * sigma,
4545 const char * bmat,
4546 int * n,
4547 const char * which,
4548 int * nev,
4549 float * tol,
4550 float * resid,
4551 int * ncv,
4552 float * v,
4553 int * ldv,
4554 int * iparam,
4555 int * ipntr,
4556 float * workd,
4557 float * workl,
4558 int * lworkl,
4559 int * info)
4561 float c_b21 = 2/3;
4562 int c__1 = 1;
4563 float c_b102 = 1.;
4564 int v_dim1, v_offset, z_dim1, z_offset, i__1;
4565 float d__1, d__2, d__3;
4567 int j, k, ih, iq, iw, ibd, ihb, ihd, ldh, ilg, ldq, ism, irz;
4568 int mode;
4569 float eps23;
4570 int ierr;
4571 float temp;
4572 int next;
4573 char type__[6];
4574 int ritz;
4575 int reord;
4576 int nconv;
4577 float rnorm;
4578 float bnorm2;
4579 float thres1=0, thres2=0;
4580 int bounds;
4581 int ktrord;
4582 float tempbnd;
4583 int leftptr, rghtptr;
4586 --workd;
4587 --resid;
4588 z_dim1 = *ldz;
4589 z_offset = 1 + z_dim1;
4590 z__ -= z_offset;
4591 --d__;
4592 --select;
4593 v_dim1 = *ldv;
4594 v_offset = 1 + v_dim1;
4595 v -= v_offset;
4596 --iparam;
4597 --ipntr;
4598 --workl;
4600 mode = iparam[7];
4601 nconv = iparam[5];
4602 *info = 0;
4604 if (nconv == 0) {
4605 goto L9000;
4607 ierr = 0;
4609 if (nconv <= 0) {
4610 ierr = -14;
4612 if (*n <= 0) {
4613 ierr = -1;
4615 if (*nev <= 0) {
4616 ierr = -2;
4618 if (*ncv <= *nev || *ncv > *n) {
4619 ierr = -3;
4621 if (strncmp(which,"LM",2) && strncmp(which,"SM",2) &&
4622 strncmp(which,"LA",2) && strncmp(which,"SA",2) &&
4623 strncmp(which,"BE",2)) {
4624 ierr = -5;
4626 if (*bmat != 'I' && *bmat != 'G') {
4627 ierr = -6;
4629 if (*howmny != 'A' && *howmny != 'P' &&
4630 *howmny != 'S' && *rvec) {
4631 ierr = -15;
4633 if (*rvec && *howmny == 'S') {
4634 ierr = -16;
4636 i__1 = *ncv;
4637 if (*rvec && *lworkl < i__1 * i__1 + (*ncv << 3)) {
4638 ierr = -7;
4641 if (mode == 1 || mode == 2) {
4642 strncpy(type__, "REGULR",6);
4643 } else if (mode == 3) {
4644 strncpy(type__, "SHIFTI",6);
4645 } else if (mode == 4) {
4646 strncpy(type__, "BUCKLE",6);
4647 } else if (mode == 5) {
4648 strncpy(type__, "CAYLEY",6);
4649 } else {
4650 ierr = -10;
4652 if (mode == 1 && *bmat == 'G') {
4653 ierr = -11;
4655 if (*nev == 1 && !strncmp(which, "BE",2)) {
4656 ierr = -12;
4659 if (ierr != 0) {
4660 *info = ierr;
4661 goto L9000;
4664 ih = ipntr[5];
4665 ritz = ipntr[6];
4666 bounds = ipntr[7];
4667 ldh = *ncv;
4668 ldq = *ncv;
4669 ihd = bounds + ldh;
4670 ihb = ihd + ldh;
4671 iq = ihb + ldh;
4672 iw = iq + ldh * *ncv;
4673 next = iw + (*ncv << 1);
4674 ipntr[4] = next;
4675 ipntr[8] = ihd;
4676 ipntr[9] = ihb;
4677 ipntr[10] = iq;
4679 irz = ipntr[11] + *ncv;
4680 ibd = irz + *ncv;
4683 eps23 = GMX_FLOAT_EPS;
4684 eps23 = pow(eps23, c_b21);
4686 rnorm = workl[ih];
4687 if (*bmat == 'I') {
4688 bnorm2 = rnorm;
4689 } else if (*bmat == 'G') {
4690 bnorm2 =F77_FUNC(snrm2,SNRM2)(n, &workd[1], &c__1);
4693 if (*rvec) {
4695 if (!strncmp(which,"LM",2) || !strncmp(which,"SM",2) ||
4696 !strncmp(which,"LA",2) || !strncmp(which,"SA",2)) {
4698 } else if (!strncmp(which,"BE",2)) {
4701 ism = (*nev>nconv) ? *nev : nconv;
4702 ism /= 2;
4703 ilg = ism + 1;
4704 thres1 = workl[ism];
4705 thres2 = workl[ilg];
4710 reord = 0;
4711 ktrord = 0;
4712 i__1 = *ncv - 1;
4713 for (j = 0; j <= i__1; ++j) {
4714 select[j + 1] = 0;
4715 if (!strncmp(which,"LM",2)) {
4716 if (fabs(workl[irz + j]) >= fabs(thres1)) {
4717 d__2 = eps23;
4718 d__3 = fabs(workl[irz + j]);
4719 tempbnd = (d__2>d__3) ? d__2 : d__3;
4720 if (workl[ibd + j] <= *tol * tempbnd) {
4721 select[j + 1] = 1;
4724 } else if (!strncmp(which,"SM",2)) {
4725 if (fabs(workl[irz + j]) <= fabs(thres1)) {
4726 d__2 = eps23;
4727 d__3 = fabs(workl[irz + j]);
4728 tempbnd = (d__2>d__3) ? d__2 : d__3;
4729 if (workl[ibd + j] <= *tol * tempbnd) {
4730 select[j + 1] = 1;
4733 } else if (!strncmp(which,"LA",2)) {
4734 if (workl[irz + j] >= thres1) {
4735 d__2 = eps23;
4736 d__3 = fabs(workl[irz + j]);
4737 tempbnd = (d__2>d__3) ? d__2 : d__3;
4738 if (workl[ibd + j] <= *tol * tempbnd) {
4739 select[j + 1] = 1;
4742 } else if (!strncmp(which,"SA",2)) {
4743 if (workl[irz + j] <= thres1) {
4744 d__2 = eps23;
4745 d__3 = fabs(workl[irz + j]);
4746 tempbnd = (d__2>d__3) ? d__2 : d__3;
4747 if (workl[ibd + j] <= *tol * tempbnd) {
4748 select[j + 1] = 1;
4751 } else if (!strncmp(which,"BE",2)) {
4752 if (workl[irz + j] <= thres1 || workl[irz + j] >= thres2) {
4753 d__2 = eps23;
4754 d__3 = fabs(workl[irz + j]);
4755 tempbnd = (d__2>d__3) ? d__2 : d__3;
4756 if (workl[ibd + j] <= *tol * tempbnd) {
4757 select[j + 1] = 1;
4761 if (j + 1 > nconv) {
4762 reord = select[j + 1] || reord;
4764 if (select[j + 1]) {
4765 ++ktrord;
4769 i__1 = *ncv - 1;
4770 F77_FUNC(scopy,SCOPY)(&i__1, &workl[ih + 1], &c__1, &workl[ihb], &c__1);
4771 F77_FUNC(scopy,SCOPY)(ncv, &workl[ih + ldh], &c__1, &workl[ihd], &c__1);
4773 F77_FUNC(ssteqr,SSTEQR)("Identity", ncv, &workl[ihd], &workl[ihb], &workl[iq], &ldq, &
4774 workl[iw], &ierr);
4776 if (ierr != 0) {
4777 *info = -8;
4778 goto L9000;
4782 if (reord) {
4784 leftptr = 1;
4785 rghtptr = *ncv;
4787 if (*ncv == 1) {
4788 goto L30;
4791 L20:
4792 if (select[leftptr]) {
4794 ++leftptr;
4796 } else if (! select[rghtptr]) {
4798 --rghtptr;
4800 } else {
4802 temp = workl[ihd + leftptr - 1];
4803 workl[ihd + leftptr - 1] = workl[ihd + rghtptr - 1];
4804 workl[ihd + rghtptr - 1] = temp;
4805 F77_FUNC(scopy,SCOPY)(ncv, &workl[iq + *ncv * (leftptr - 1)], &c__1, &workl[
4806 iw], &c__1);
4807 F77_FUNC(scopy,SCOPY)(ncv, &workl[iq + *ncv * (rghtptr - 1)], &c__1, &workl[
4808 iq + *ncv * (leftptr - 1)], &c__1);
4809 F77_FUNC(scopy,SCOPY)(ncv, &workl[iw], &c__1, &workl[iq + *ncv * (rghtptr -
4810 1)], &c__1);
4811 ++leftptr;
4812 --rghtptr;
4816 if (leftptr < rghtptr) {
4817 goto L20;
4820 L30:
4824 F77_FUNC(scopy,SCOPY)(&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
4826 } else {
4828 F77_FUNC(scopy,SCOPY)(&nconv, &workl[ritz], &c__1, &d__[1], &c__1);
4829 F77_FUNC(scopy,SCOPY)(ncv, &workl[ritz], &c__1, &workl[ihd], &c__1);
4832 if (!strncmp(type__, "REGULR",6)) {
4834 if (*rvec) {
4835 F77_FUNC(ssesrt,SSESRT)("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
4836 } else {
4837 F77_FUNC(scopy,SCOPY)(ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
4840 } else {
4842 F77_FUNC(scopy,SCOPY)(ncv, &workl[ihd], &c__1, &workl[iw], &c__1);
4843 if (!strncmp(type__, "SHIFTI", 6)) {
4844 i__1 = *ncv;
4845 for (k = 1; k <= i__1; ++k) {
4846 workl[ihd + k - 1] = 1. / workl[ihd + k - 1] + *sigma;
4848 } else if (!strncmp(type__, "BUCKLE",6)) {
4849 i__1 = *ncv;
4850 for (k = 1; k <= i__1; ++k) {
4851 workl[ihd + k - 1] = *sigma * workl[ihd + k - 1] / (workl[ihd
4852 + k - 1] - 1.);
4854 } else if (!strncmp(type__, "CAYLEY",6)) {
4855 i__1 = *ncv;
4856 for (k = 1; k <= i__1; ++k) {
4857 workl[ihd + k - 1] = *sigma * (workl[ihd + k - 1] + 1.) / (
4858 workl[ihd + k - 1] - 1.);
4862 F77_FUNC(scopy,SCOPY)(&nconv, &workl[ihd], &c__1, &d__[1], &c__1);
4863 F77_FUNC(ssortr,SSORTR)("LA", &c__1, &nconv, &workl[ihd], &workl[iw]);
4864 if (*rvec) {
4865 F77_FUNC(ssesrt,SSESRT)("LA", rvec, &nconv, &d__[1], ncv, &workl[iq], &ldq);
4866 } else {
4867 F77_FUNC(scopy,SCOPY)(ncv, &workl[bounds], &c__1, &workl[ihb], &c__1);
4868 d__1 = bnorm2 / rnorm;
4869 F77_FUNC(sscal,SSCAL)(ncv, &d__1, &workl[ihb], &c__1);
4870 F77_FUNC(ssortr,SSORTR)("LA", &c__1, &nconv, &d__[1], &workl[ihb]);
4875 if (*rvec && *howmny == 'A') {
4877 F77_FUNC(sgeqr2,SGEQR2)(ncv, &nconv, &workl[iq], &ldq, &workl[iw + *ncv], &workl[ihb],
4878 &ierr);
4880 F77_FUNC(sorm2r,SORM2R)("Right", "Notranspose", n, ncv, &nconv, &workl[iq], &ldq, &
4881 workl[iw + *ncv], &v[v_offset], ldv, &workd[*n + 1], &ierr);
4882 F77_FUNC(slacpy,SLACPY)("All", n, &nconv, &v[v_offset], ldv, &z__[z_offset], ldz);
4884 i__1 = *ncv - 1;
4885 for (j = 1; j <= i__1; ++j) {
4886 workl[ihb + j - 1] = 0.;
4888 workl[ihb + *ncv - 1] = 1.;
4889 F77_FUNC(sorm2r,SORM2R)("Left", "Transpose", ncv, &c__1, &nconv, &workl[iq], &ldq, &
4890 workl[iw + *ncv], &workl[ihb], ncv, &temp, &ierr);
4892 } else if (*rvec && *howmny == 'S') {
4896 if (!strncmp(type__, "REGULR",6) && *rvec) {
4898 i__1 = *ncv;
4899 for (j = 1; j <= i__1; ++j) {
4900 workl[ihb + j - 1] = rnorm * fabs(workl[ihb + j - 1]);
4903 } else if (strncmp(type__, "REGULR",6) && *rvec) {
4905 F77_FUNC(sscal,SSCAL)(ncv, &bnorm2, &workl[ihb], &c__1);
4906 if (!strncmp(type__, "SHIFTI",6)) {
4908 i__1 = *ncv;
4909 for (k = 1; k <= i__1; ++k) {
4910 d__2 = workl[iw + k - 1];
4911 workl[ihb + k - 1] = fabs(workl[ihb + k - 1])/(d__2 * d__2);
4914 } else if (!strncmp(type__, "BUCKLE",6)) {
4916 i__1 = *ncv;
4917 for (k = 1; k <= i__1; ++k) {
4918 d__2 = workl[iw + k - 1] - 1.;
4919 workl[ihb + k - 1] = *sigma * fabs(workl[ihb + k - 1])/(d__2 * d__2);
4922 } else if (!strncmp(type__, "CAYLEY",6)) {
4924 i__1 = *ncv;
4925 for (k = 1; k <= i__1; ++k) {
4926 workl[ihb + k - 1] = fabs(workl[ihb + k - 1] / workl[iw + k - 1] * (workl[iw + k - 1] - 1.));
4934 if (*rvec && (!strncmp(type__, "SHIFTI",6) || !strncmp(type__, "CAYLEY",6))) {
4936 i__1 = nconv - 1;
4937 for (k = 0; k <= i__1; ++k) {
4938 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / workl[iw + k];
4941 } else if (*rvec && !strncmp(type__, "BUCKLE", 6)) {
4943 i__1 = nconv - 1;
4944 for (k = 0; k <= i__1; ++k) {
4945 workl[iw + k] = workl[iq + k * ldq + *ncv - 1] / (workl[iw + k] -
4946 1.);
4951 if (strncmp(type__, "REGULR",6)) {
4952 F77_FUNC(sger,SGER)(n, &nconv, &c_b102, &resid[1], &c__1, &workl[iw], &c__1, &z__[
4953 z_offset], ldz);
4956 L9000:
4958 return;