1 /* -*- mode: c; tab-width: 4; indent-tabs-mode: m; c-basic-offset: 4 -*-
4 * This file is part of Gromacs Copyright (c) 1991-2004
5 * David van der Spoel, Erik Lindahl, University of Groningen.
7 * This file contains a subset of ARPACK functions to perform
8 * diagonalization and SVD for sparse matrices in Gromacs.
10 * The code has been translated to C to avoid being dependent on
11 * a Fotran compiler, and it has been made threadsafe by using
12 * additional workspace arrays to store data during reverse communication.
14 * You might prefer the original ARPACK library for general use, but
15 * in case you want to this version can be redistributed freely, just
16 * as the original library. However, please make clear that it is the
17 * hacked version from Gromacs so any bugs are blamed on us and not
18 * the original authors. You should also be aware that the double
19 * precision work array workd needs to be of size (3*N+4) here
20 * (4 more than the general library), and there is an extra argument
21 * iwork, which should be an integer work array of length 80.
23 * ARPACK was written by
25 * Danny Sorensen Phuong Vu
26 * Rihard Lehoucq CRPC / Rice University
27 * Dept. of Computational & Houston, Texas
39 #include "types/simple.h"
40 #include "gmx_lapack.h"
42 #include "gmx_arpack.h"
45 /* Default Fortran name mangling */
47 #define F77_FUNC(name,NAME) name ## _
53 F77_FUNC(dstqrb
,DSTQRB
)(int * n
,
69 int l1
, ii
, mm
, lm1
, mm1
, nm1
;
73 int lend
, jtot
, lendm1
, lendp1
, iscale
;
75 int lendsv
, nmaxit
, icompz
;
76 double ssfmax
, ssfmin
,safmin
,minval
,safmax
,anorm
;
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
;
111 for (j
= 1; j
<= i__1
; ++j
) {
133 for (m
= l1
; m
<= i__1
; ++m
) {
138 if (tst
<= sqrt(fabs(d__
[m
])) * sqrt(fabs(d__
[m
+1])) * eps
) {
157 anorm
=F77_FUNC(dlanst
,DLANST
)("i", &i__1
, &d__
[l
], &e
[l
]);
162 if (anorm
> ssfmax
) {
165 F77_FUNC(dlascl
,DLASCL
)("g", &c__0
, &c__0
, &anorm
, &ssfmax
, &i__1
, &c__1
, &d__
[l
], n
,
168 F77_FUNC(dlascl
,DLASCL
)("g", &c__0
, &c__0
, &anorm
, &ssfmax
, &i__1
, &c__1
, &e
[l
], n
,
170 } else if (anorm
< ssfmin
) {
173 F77_FUNC(dlascl
,DLASCL
)("g", &c__0
, &c__0
, &anorm
, &ssfmin
, &i__1
, &c__1
, &d__
[l
], n
,
176 F77_FUNC(dlascl
,DLASCL
)("g", &c__0
, &c__0
, &anorm
, &ssfmin
, &i__1
, &c__1
, &e
[l
], n
,
180 if (fabs(d__
[lend
]) < fabs(d__
[l
])) {
191 for (m
= l
; m
<= i__1
; ++m
) {
194 if (tst
<= eps2
* fabs(d__
[m
]) * fabs(d__
[m
+ 1]) + safmin
) {
213 F77_FUNC(dlaev2
,DLAEV2
)(&d__
[l
], &e
[l
], &d__
[l
+ 1], &rt1
, &rt2
, &c__
, &s
);
215 work
[*n
- 1 + l
] = s
;
218 z__
[l
+ 1] = c__
* tst
- s
* z__
[l
];
219 z__
[l
] = s
* tst
+ c__
* z__
[l
];
221 F77_FUNC(dlae2
,DLAE2
)(&d__
[l
], &e
[l
], &d__
[l
+ 1], &rt1
, &rt2
);
233 if (jtot
== nmaxit
) {
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__
));
248 for (i__
= mm1
; i__
>= i__1
; --i__
) {
251 F77_FUNC(dlartg
,DLARTG
)(&g
, &f
, &c__
, &s
, &r__
);
255 g
= d__
[i__
+ 1] - p
;
256 r__
= (d__
[i__
] - g
) * s
+ c__
* 2. * b
;
258 d__
[i__
+ 1] = g
+ p
;
263 work
[*n
- 1 + i__
] = -s
;
271 F77_FUNC(dlasr
,DLASR
)("r", "v", "b", &c__1
, &mm
, &work
[l
], &work
[*n
- 1 + l
], &
294 for (m
= l
; m
>= i__1
; --m
) {
295 d__2
= fabs(e
[m
- 1]);
297 if (tst
<= eps2
* fabs(d__
[m
]) * fabs(d__
[m
- 1]) + safmin
) {
316 F77_FUNC(dlaev2
,DLAEV2
)(&d__
[l
- 1], &e
[l
- 1], &d__
[l
], &rt1
, &rt2
, &c__
, &s
)
320 z__
[l
] = c__
* tst
- s
* z__
[l
- 1];
321 z__
[l
- 1] = s
* tst
+ c__
* z__
[l
- 1];
323 F77_FUNC(dlae2
,DLAE2
)(&d__
[l
- 1], &e
[l
- 1], &d__
[l
], &rt1
, &rt2
);
335 if (jtot
== nmaxit
) {
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__
));
351 for (i__
= m
; i__
<= i__1
; ++i__
) {
354 F77_FUNC(dlartg
,DLARTG
)(&g
, &f
, &c__
, &s
, &r__
);
359 r__
= (d__
[i__
+ 1] - g
) * s
+ c__
* 2. * b
;
366 work
[*n
- 1 + i__
] = s
;
374 F77_FUNC(dlasr
,DLASR
)("r", "v", "f", &c__1
, &mm
, &work
[m
], &work
[*n
- 1 + m
], &
395 i__1
= lendsv
- lsv
+ 1;
396 F77_FUNC(dlascl
,DLASCL
)("g", &c__0
, &c__0
, &ssfmax
, &anorm
, &i__1
, &c__1
, &d__
[lsv
],
399 F77_FUNC(dlascl
,DLASCL
)("g", &c__0
, &c__0
, &ssfmax
, &anorm
, &i__1
, &c__1
, &e
[lsv
], n
,
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
],
406 F77_FUNC(dlascl
,DLASCL
)("g", &c__0
, &c__0
, &ssfmin
, &anorm
, &i__1
, &c__1
, &e
[lsv
], n
,
414 for (i__
= 1; i__
<= i__1
; ++i__
) {
424 F77_FUNC(dlasrt
,DLASRT
)("i", n
, &d__
[1], info
);
429 for (ii
= 2; ii
<= i__1
; ++ii
) {
434 for (j
= ii
; j
<= i__2
; ++j
) {
457 F77_FUNC(dgetv0
,DGETV0
)(int * ido
,
476 int v_dim1
, v_offset
, i__1
;
484 v_offset
= 1 + v_dim1
;
498 F77_FUNC(dlarnv
,DLARNV
)(&idist
, &iwork
[1], n
, &resid
[1]);
504 F77_FUNC(dcopy
,DCOPY
)(n
, &resid
[1], &c__1
, &workd
[1], &c__1
);
520 F77_FUNC(dcopy
,DCOPY
)(n
, &workd
[*n
+ 1], &c__1
, &resid
[1], &c__1
);
525 } else if (*bmat
== 'I') {
526 F77_FUNC(dcopy
,DCOPY
)(n
, &resid
[1], &c__1
, &workd
[1], &c__1
);
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];
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
);
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
);
555 F77_FUNC(dcopy
,DCOPY
)(n
, &resid
[1], &c__1
, &workd
[*n
+ 1], &c__1
);
560 } else if (*bmat
== 'I') {
561 F77_FUNC(dcopy
,DCOPY
)(n
, &resid
[1], &c__1
, &workd
[1], &c__1
);
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
) {
580 workd
[*n
* 3 + 4] = *rnorm
;
585 for (jj
= 1; jj
<= i__1
; ++jj
) {
605 F77_FUNC(dsapps
,DSAPPS
)(int * n
,
622 int h_dim1
, h_offset
, q_dim1
, q_offset
, v_dim1
, v_offset
, i__1
, i__2
,
626 double r__
, s
, a1
, a2
, a3
, a4
;
637 v_offset
= 1 + v_dim1
;
640 h_offset
= 1 + h_dim1
;
643 q_offset
= 1 + q_dim1
;
646 epsmch
= GMX_DOUBLE_EPS
;
652 F77_FUNC(dlaset
,DLASET
)("All", &kplusp
, &kplusp
, &c_b4
, &c_b5
, &q
[q_offset
], ldq
);
659 for (jj
= 1; jj
<= i__1
; ++jj
) {
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.;
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 +
685 a2
= c__
* h__
[istart
+ 1 + h_dim1
] + s
* h__
[istart
+ 1 + (
687 a4
= c__
* h__
[istart
+ 1 + (h_dim1
<< 1)] - s
* h__
[istart
+ 1 +
689 a3
= c__
* h__
[istart
+ 1 + h_dim1
] - s
* h__
[istart
+ (h_dim1
<<
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
;
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) *
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
;
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__
);
721 h__
[i__
+ h_dim1
] = r__
;
723 a1
= c__
* h__
[i__
+ (h_dim1
<< 1)] + s
* h__
[i__
+ 1 +
725 a2
= c__
* h__
[i__
+ 1 + h_dim1
] + s
* h__
[i__
+ 1 + (h_dim1
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 +
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
;
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) *
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
;
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
);
762 for (i__
= itop
; i__
<= i__2
; ++i__
) {
763 if (h__
[i__
+ 1 + h_dim1
] > 0.) {
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
);
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], &
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
,
819 F77_FUNC(dsortr
,DSORTR
)(const char * which
,
834 if (!strncmp(which
, "SA", 2)) {
841 for (i__
= igap
; i__
<= i__1
; ++i__
) {
849 if (x1
[j
] < x1
[j
+ igap
]) {
851 x1
[j
] = x1
[j
+ igap
];
855 x2
[j
] = x2
[j
+ igap
];
869 } else if (!strncmp(which
, "SM", 2)) {
876 for (i__
= igap
; i__
<= i__1
; ++i__
) {
884 if (fabs(x1
[j
]) < fabs(x1
[j
+ igap
])) {
886 x1
[j
] = x1
[j
+ igap
];
890 x2
[j
] = x2
[j
+ igap
];
904 } else if (!strncmp(which
, "LA", 2)) {
911 for (i__
= igap
; i__
<= i__1
; ++i__
) {
919 if (x1
[j
] > x1
[j
+ igap
]) {
921 x1
[j
] = x1
[j
+ igap
];
925 x2
[j
] = x2
[j
+ igap
];
939 } else if (!strncmp(which
, "LM", 2)) {
947 for (i__
= igap
; i__
<= i__1
; ++i__
) {
955 if (fabs(x1
[j
]) > fabs(x1
[j
+ igap
])) {
957 x1
[j
] = x1
[j
+ igap
];
961 x2
[j
] = x2
[j
+ igap
];
985 F77_FUNC(dsesrt
,DSESRT
)(const char * which
,
993 int a_dim1
, a_offset
, i__1
;
1000 a_offset
= 1 + a_dim1
* 0;
1005 if (!strncmp(which
, "SA", 2)) {
1012 for (i__
= igap
; i__
<= i__1
; ++i__
) {
1020 if (x
[j
] < x
[j
+ igap
]) {
1025 F77_FUNC(dswap
,DSWAP
)(na
, &a
[j
* a_dim1
+ 1], &c__1
, &a
[(j
+ igap
) *
1026 a_dim1
+ 1], &c__1
);
1039 } else if (!strncmp(which
, "SM", 2)) {
1046 for (i__
= igap
; i__
<= i__1
; ++i__
) {
1054 if (fabs(x
[j
]) < fabs(x
[j
+ igap
])) {
1059 F77_FUNC(dswap
,DSWAP
)(na
, &a
[j
* a_dim1
+ 1], &c__1
, &a
[(j
+ igap
) *
1060 a_dim1
+ 1], &c__1
);
1073 } else if (!strncmp(which
, "LA", 2)) {
1080 for (i__
= igap
; i__
<= i__1
; ++i__
) {
1088 if (x
[j
] > x
[j
+ igap
]) {
1093 F77_FUNC(dswap
,DSWAP
)(na
, &a
[j
* a_dim1
+ 1], &c__1
, &a
[(j
+ igap
) *
1094 a_dim1
+ 1], &c__1
);
1107 } else if (!strncmp(which
, "LM", 2)) {
1114 for (i__
= igap
; i__
<= i__1
; ++i__
) {
1122 if (fabs(x
[j
]) > fabs(x
[j
+ igap
])) {
1127 F77_FUNC(dswap
,DSWAP
)(na
, &a
[j
* a_dim1
+ 1], &c__1
, &a
[(j
+ igap
) *
1128 a_dim1
+ 1], &c__1
);
1151 F77_FUNC(dsgets
,DSGETS
)(int * ishift
,
1167 if (!strncmp(which
, "BE", 2)) {
1169 F77_FUNC(dsortr
,DSORTR
)("LA", &c__1
, &i__1
, &ritz
[1], &bounds
[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
);
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
);
1200 F77_FUNC(dsconv
,DSCONV
)(int * n
,
1216 eps23
= GMX_DOUBLE_EPS
;
1217 eps23
= pow(eps23
, c_b3
);
1221 for (i__
= 1; i__
<= i__1
; ++i__
) {
1224 d__3
= fabs(ritz
[i__
]);
1225 temp
= (d__2
> d__3
) ? d__2
: d__3
;
1226 if (bounds
[i__
] <= *tol
* temp
) {
1236 F77_FUNC(dseigt
,DSEIGT
)(double * rnorm
,
1246 int h_dim1
, h_offset
, i__1
;
1255 h_offset
= 1 + h_dim1
;
1258 F77_FUNC(dcopy
,DCOPY
)(n
, &h__
[(h_dim1
<< 1) + 1], &c__1
, &eig
[1], &c__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
);
1267 for (k
= 1; k
<= i__1
; ++k
) {
1268 bounds
[k
] = *rnorm
* fabs(bounds
[k
]);
1281 F77_FUNC(dsaitr
,DSAITR
)(int * ido
,
1305 int h_dim1
, h_offset
, v_dim1
, v_offset
, i__1
;
1309 double safmin
,minval
;
1315 v_offset
= 1 + v_dim1
;
1318 h_offset
= 1 + h_dim1
;
1322 minval
= GMX_DOUBLE_MIN
;
1323 safmin
= minval
/ GMX_DOUBLE_EPS
;
1336 iwork
[9] = iwork
[8] + *n
;
1337 iwork
[10] = iwork
[9] + *n
;
1340 if (iwork
[5] == 1) {
1343 if (iwork
[6] == 1) {
1346 if (iwork
[2] == 1) {
1349 if (iwork
[3] == 1) {
1352 if (iwork
[4] == 1) {
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]);
1376 if (iwork
[11] <= 3) {
1380 *info
= iwork
[12] - 1;
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
);
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
[
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];
1413 F77_FUNC(dcopy
,DCOPY
)(n
, &workd
[iwork
[9]], &c__1
, &resid
[1], &c__1
);
1420 ipntr
[1] = iwork
[9];
1421 ipntr
[2] = iwork
[8];
1425 } else if (*bmat
== 'I') {
1426 F77_FUNC(dcopy
,DCOPY
)(n
, &resid
[1], &c__1
, &workd
[iwork
[8]], &c__1
);
1435 workd
[*n
* 3 + 3] =F77_FUNC(ddot
,DDOT
)(n
, &resid
[1], &c__1
, &workd
[iwork
[10]], &
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]], &
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
);
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.;
1461 h__
[iwork
[12] + h_dim1
] = *rnorm
;
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];
1474 } else if (*bmat
== 'I') {
1475 F77_FUNC(dcopy
,DCOPY
)(n
, &resid
[1], &c__1
, &workd
[iwork
[8]], &c__1
);
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
) {
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];
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];
1513 } else if (*bmat
== 'I') {
1514 F77_FUNC(dcopy
,DCOPY
)(n
, &resid
[1], &c__1
, &workd
[iwork
[8]], &c__1
);
1520 workd
[*n
* 3 + 2] =F77_FUNC(ddot
,DDOT
)(n
, &resid
[1], &c__1
, &workd
[iwork
[8]], &
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];
1534 *rnorm
= workd
[*n
* 3 + 2];
1536 if (iwork
[1] <= 1) {
1541 for (jj
= 1; jj
<= i__1
; ++jj
) {
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
);
1557 F77_FUNC(dscal
,DSCAL
)(n
, &c_b50
, &resid
[1], &c__1
);
1562 if (iwork
[12] > *k
+ *np
) {
1581 F77_FUNC(dsaup2
,DSAUP2
)(int * ido
,
1611 int h_dim1
, h_offset
, q_dim1
, q_offset
, v_dim1
, v_offset
, i__1
, i__2
,
1630 v_offset
= 1 + v_dim1
;
1633 h_offset
= 1 + h_dim1
;
1636 q_offset
= 1 + q_dim1
;
1640 eps23
= GMX_DOUBLE_EPS
;
1641 eps23
= pow(eps23
, c_b3
);
1653 iwork
[7] = iwork
[9] + iwork
[10];
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]
1680 if (workd
[*n
* 3 + 1] == 0.) {
1689 if (iwork
[4] == 1) {
1693 if (iwork
[5] == 1) {
1697 if (iwork
[1] == 1) {
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],
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],
1743 F77_FUNC(dseigt
,DSEIGT
)(&workd
[*n
* 3 + 1], &iwork
[7], &h__
[h_offset
], ldh
, &ritz
[1], &
1744 bounds
[1], &workl
[1], &ierr
);
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
);
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]);
1763 for (j
= 1; j
<= i__1
; ++j
) {
1764 if (bounds
[j
] == 0.) {
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]);
1777 nevm2
= *nev
- nevd2
;
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
)],
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],
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]);
1811 for (j
= 1; j
<= i__1
; ++j
) {
1813 d__3
= fabs(ritz
[j
]);
1814 temp
= (d__2
>d__3
) ? d__2
: d__3
;
1818 strncpy(wprime
, "LA",2);
1819 F77_FUNC(dsortr
,DSORTR
)(wprime
, &c__1
, &iwork
[9], &bounds
[1], &ritz
[1]);
1822 for (j
= 1; j
<= i__1
; ++j
) {
1824 d__3
= fabs(ritz
[j
]);
1825 temp
= (d__2
>d__3
) ? d__2
: d__3
;
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]);
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
) {
1845 if (*np
== 0 && iwork
[8] < iwork
[9]) {
1852 } else if (iwork
[8] < *nev
&& *ishift
== 1) {
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) {
1861 *np
= iwork
[7] - *nev
;
1864 if (nevbef
< *nev
) {
1865 F77_FUNC(dsgets
,DSGETS
)(ishift
, which
, nev
, np
, &ritz
[1], &bounds
[1], &workl
[1]);
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]);
1891 F77_FUNC(dcopy
,DCOPY
)(n
, &resid
[1], &c__1
, &workd
[*n
+ 1], &c__1
);
1897 } else if (*bmat
== 'I') {
1898 F77_FUNC(dcopy
,DCOPY
)(n
, &resid
[1], &c__1
, &workd
[1], &c__1
);
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
);
1929 F77_FUNC(dsaupd
,DSAUPD
)(int * ido
,
1947 int v_dim1
, v_offset
, i__1
, i__2
;
1953 v_offset
= 1 + v_dim1
;
1964 iwork
[5] = iparam
[1];
1965 iwork
[10] = iparam
[3];
1966 iwork
[12] = iparam
[4];
1969 iwork
[11] = iparam
[7];
1974 } else if (*nev
<= 0) {
1976 } else if (*ncv
<= *nev
|| *ncv
> *n
) {
1981 iwork
[15] = *ncv
- *nev
;
1983 if (iwork
[10] <= 0) {
1986 if (strncmp(which
,"LM",2) && strncmp(which
,"SM",2) &&
1987 strncmp(which
,"LA",2) && strncmp(which
,"SA",2) &&
1988 strncmp(which
,"BE",2)) {
1991 if (*bmat
!= 'I' && *bmat
!= 'G') {
1996 if (*lworkl
< i__1
* i__1
+ (*ncv
<< 3)) {
1999 if (iwork
[11] < 1 || iwork
[11] > 5) {
2001 } else if (iwork
[11] == 1 && *bmat
== 'G') {
2003 } else if (iwork
[5] < 0 || iwork
[5] > 1) {
2005 } else if (*nev
== 1 && !strncmp(which
, "BE", 2)) {
2009 if (iwork
[2] != 0) {
2015 if (iwork
[12] <= 0) {
2019 *tol
= GMX_DOUBLE_EPS
;
2022 iwork
[15] = *ncv
- *nev
;
2025 i__1
= i__2
* i__2
+ (*ncv
<< 3);
2026 for (j
= 1; j
<= i__1
; ++j
) {
2033 iwork
[16] = iwork
[3] + (iwork
[8] << 1);
2034 iwork
[1] = iwork
[16] + *ncv
;
2035 iwork
[4] = iwork
[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
);
2054 iparam
[8] = iwork
[15];
2060 iparam
[3] = iwork
[10];
2061 iparam
[5] = iwork
[15];
2079 F77_FUNC(dseupd
,DSEUPD
)(int * rvec
,
2080 const char * howmny
,
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
;
2120 double thres1
=0, thres2
=0;
2124 int leftptr
, rghtptr
;
2130 z_offset
= 1 + z_dim1
;
2135 v_offset
= 1 + v_dim1
;
2159 if (*ncv
<= *nev
|| *ncv
> *n
) {
2162 if (strncmp(which
,"LM",2) && strncmp(which
,"SM",2) &&
2163 strncmp(which
,"LA",2) && strncmp(which
,"SA",2) &&
2164 strncmp(which
,"BE",2)) {
2167 if (*bmat
!= 'I' && *bmat
!= 'G') {
2170 if (*howmny
!= 'A' && *howmny
!= 'P' &&
2171 *howmny
!= 'S' && *rvec
) {
2174 if (*rvec
&& *howmny
== 'S') {
2178 if (*rvec
&& *lworkl
< i__1
* i__1
+ (*ncv
<< 3)) {
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);
2193 if (mode
== 1 && *bmat
== 'G') {
2196 if (*nev
== 1 && !strncmp(which
, "BE",2)) {
2213 iw
= iq
+ ldh
* *ncv
;
2214 next
= iw
+ (*ncv
<< 1);
2220 irz
= ipntr
[11] + *ncv
;
2224 eps23
= GMX_DOUBLE_EPS
;
2225 eps23
= pow(eps23
, c_b21
);
2230 } else if (*bmat
== 'G') {
2231 bnorm2
=F77_FUNC(dnrm2
,DNRM2
)(n
, &workd
[1], &c__1
);
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
;
2245 thres1
= workl
[ism
];
2246 thres2
= workl
[ilg
];
2254 for (j
= 0; j
<= i__1
; ++j
) {
2256 if (!strncmp(which
,"LM",2)) {
2257 if (fabs(workl
[irz
+ j
]) >= fabs(thres1
)) {
2259 d__3
= fabs(workl
[irz
+ j
]);
2260 tempbnd
= (d__2
>d__3
) ? d__2
: d__3
;
2261 if (workl
[ibd
+ j
] <= *tol
* tempbnd
) {
2265 } else if (!strncmp(which
,"SM",2)) {
2266 if (fabs(workl
[irz
+ j
]) <= fabs(thres1
)) {
2268 d__3
= fabs(workl
[irz
+ j
]);
2269 tempbnd
= (d__2
>d__3
) ? d__2
: d__3
;
2270 if (workl
[ibd
+ j
] <= *tol
* tempbnd
) {
2274 } else if (!strncmp(which
,"LA",2)) {
2275 if (workl
[irz
+ j
] >= thres1
) {
2277 d__3
= fabs(workl
[irz
+ j
]);
2278 tempbnd
= (d__2
>d__3
) ? d__2
: d__3
;
2279 if (workl
[ibd
+ j
] <= *tol
* tempbnd
) {
2283 } else if (!strncmp(which
,"SA",2)) {
2284 if (workl
[irz
+ j
] <= thres1
) {
2286 d__3
= fabs(workl
[irz
+ j
]);
2287 tempbnd
= (d__2
>d__3
) ? d__2
: d__3
;
2288 if (workl
[ibd
+ j
] <= *tol
* tempbnd
) {
2292 } else if (!strncmp(which
,"BE",2)) {
2293 if (workl
[irz
+ j
] <= thres1
|| workl
[irz
+ j
] >= thres2
) {
2295 d__3
= fabs(workl
[irz
+ j
]);
2296 tempbnd
= (d__2
>d__3
) ? d__2
: d__3
;
2297 if (workl
[ibd
+ j
] <= *tol
* tempbnd
) {
2302 if (j
+ 1 > nconv
) {
2303 reord
= select
[j
+ 1] || reord
;
2305 if (select
[j
+ 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
, &
2333 if (select
[leftptr
]) {
2337 } else if (! select
[rghtptr
]) {
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
[
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
-
2357 if (leftptr
< rghtptr
) {
2365 F77_FUNC(dcopy
,DCOPY
)(&nconv
, &workl
[ihd
], &c__1
, &d__
[1], &c__1
);
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)) {
2376 F77_FUNC(dsesrt
,DSESRT
)("LA", rvec
, &nconv
, &d__
[1], ncv
, &workl
[iq
], &ldq
);
2378 F77_FUNC(dcopy
,DCOPY
)(ncv
, &workl
[bounds
], &c__1
, &workl
[ihb
], &c__1
);
2383 F77_FUNC(dcopy
,DCOPY
)(ncv
, &workl
[ihd
], &c__1
, &workl
[iw
], &c__1
);
2384 if (!strncmp(type__
, "SHIFTI", 6)) {
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)) {
2391 for (k
= 1; k
<= i__1
; ++k
) {
2392 workl
[ihd
+ k
- 1] = *sigma
* workl
[ihd
+ k
- 1] / (workl
[ihd
2395 } else if (!strncmp(type__
, "CAYLEY",6)) {
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
]);
2406 F77_FUNC(dsesrt
,DSESRT
)("LA", rvec
, &nconv
, &d__
[1], ncv
, &workl
[iq
], &ldq
);
2408 F77_FUNC(dcopy
,DCOPY
)(ncv
, &workl
[bounds
], &c__1
, &workl
[ihb
], &c__1
);
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
],
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
);
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
) {
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)) {
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)) {
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)) {
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))) {
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)) {
2485 for (k
= 0; k
<= i__1
; ++k
) {
2486 workl
[iw
+ k
] = workl
[iq
+ k
* ldq
+ *ncv
- 1] / (workl
[iw
+ k
] -
2492 if (strncmp(type__
, "REGULR",6)) {
2493 F77_FUNC(dger
,DGER
)(n
, &nconv
, &c_b102
, &resid
[1], &c__1
, &workl
[iw
], &c__1
, &z__
[
2507 /* Selected single precision arpack routines */
2511 F77_FUNC(sstqrb
,SSTQRB
)(int * n
,
2525 int i__
, j
, k
, l
, m
;
2527 int l1
, ii
, mm
, lm1
, mm1
, nm1
;
2528 float rt1
, rt2
, eps
;
2531 int lend
, jtot
, lendm1
, lendp1
, iscale
;
2533 int lendsv
, nmaxit
, icompz
;
2534 float ssfmax
, ssfmin
,safmin
,minval
,safmax
,anorm
;
2557 eps
= GMX_FLOAT_EPS
;
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
;
2569 for (j
= 1; j
<= i__1
; ++j
) {
2591 for (m
= l1
; m
<= i__1
; ++m
) {
2596 if (tst
<= sqrt(fabs(d__
[m
])) * sqrt(fabs(d__
[m
+1])) * eps
) {
2614 i__1
= lend
- l
+ 1;
2615 anorm
=F77_FUNC(slanst
,SLANST
)("i", &i__1
, &d__
[l
], &e
[l
]);
2620 if (anorm
> ssfmax
) {
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
,
2626 F77_FUNC(slascl
,SLASCL
)("g", &c__0
, &c__0
, &anorm
, &ssfmax
, &i__1
, &c__1
, &e
[l
], n
,
2628 } else if (anorm
< ssfmin
) {
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
,
2634 F77_FUNC(slascl
,SLASCL
)("g", &c__0
, &c__0
, &anorm
, &ssfmin
, &i__1
, &c__1
, &e
[l
], n
,
2638 if (fabs(d__
[lend
]) < fabs(d__
[l
])) {
2649 for (m
= l
; m
<= i__1
; ++m
) {
2652 if (tst
<= eps2
* fabs(d__
[m
]) * fabs(d__
[m
+ 1]) + safmin
) {
2671 F77_FUNC(slaev2
,SLAEV2
)(&d__
[l
], &e
[l
], &d__
[l
+ 1], &rt1
, &rt2
, &c__
, &s
);
2673 work
[*n
- 1 + l
] = s
;
2676 z__
[l
+ 1] = c__
* tst
- s
* z__
[l
];
2677 z__
[l
] = s
* tst
+ c__
* z__
[l
];
2679 F77_FUNC(slae2
,SLAE2
)(&d__
[l
], &e
[l
], &d__
[l
+ 1], &rt1
, &rt2
);
2691 if (jtot
== nmaxit
) {
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__
));
2706 for (i__
= mm1
; i__
>= i__1
; --i__
) {
2709 F77_FUNC(slartg
,SLARTG
)(&g
, &f
, &c__
, &s
, &r__
);
2713 g
= d__
[i__
+ 1] - p
;
2714 r__
= (d__
[i__
] - g
) * s
+ c__
* 2. * b
;
2716 d__
[i__
+ 1] = g
+ p
;
2721 work
[*n
- 1 + i__
] = -s
;
2729 F77_FUNC(slasr
,SLASR
)("r", "v", "b", &c__1
, &mm
, &work
[l
], &work
[*n
- 1 + l
], &
2752 for (m
= l
; m
>= i__1
; --m
) {
2753 d__2
= fabs(e
[m
- 1]);
2755 if (tst
<= eps2
* fabs(d__
[m
]) * fabs(d__
[m
- 1]) + safmin
) {
2774 F77_FUNC(slaev2
,SLAEV2
)(&d__
[l
- 1], &e
[l
- 1], &d__
[l
], &rt1
, &rt2
, &c__
, &s
)
2778 z__
[l
] = c__
* tst
- s
* z__
[l
- 1];
2779 z__
[l
- 1] = s
* tst
+ c__
* z__
[l
- 1];
2781 F77_FUNC(slae2
,SLAE2
)(&d__
[l
- 1], &e
[l
- 1], &d__
[l
], &rt1
, &rt2
);
2793 if (jtot
== nmaxit
) {
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__
));
2809 for (i__
= m
; i__
<= i__1
; ++i__
) {
2812 F77_FUNC(slartg
,SLARTG
)(&g
, &f
, &c__
, &s
, &r__
);
2817 r__
= (d__
[i__
+ 1] - g
) * s
+ c__
* 2. * b
;
2824 work
[*n
- 1 + i__
] = s
;
2832 F77_FUNC(slasr
,SLASR
)("r", "v", "f", &c__1
, &mm
, &work
[m
], &work
[*n
- 1 + m
], &
2853 i__1
= lendsv
- lsv
+ 1;
2854 F77_FUNC(slascl
,SLASCL
)("g", &c__0
, &c__0
, &ssfmax
, &anorm
, &i__1
, &c__1
, &d__
[lsv
],
2856 i__1
= lendsv
- lsv
;
2857 F77_FUNC(slascl
,SLASCL
)("g", &c__0
, &c__0
, &ssfmax
, &anorm
, &i__1
, &c__1
, &e
[lsv
], n
,
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
],
2863 i__1
= lendsv
- lsv
;
2864 F77_FUNC(slascl
,SLASCL
)("g", &c__0
, &c__0
, &ssfmin
, &anorm
, &i__1
, &c__1
, &e
[lsv
], n
,
2868 if (jtot
< nmaxit
) {
2872 for (i__
= 1; i__
<= i__1
; ++i__
) {
2882 F77_FUNC(slasrt
,SLASRT
)("i", n
, &d__
[1], info
);
2887 for (ii
= 2; ii
<= i__1
; ++ii
) {
2892 for (j
= ii
; j
<= i__2
; ++j
) {
2915 F77_FUNC(sgetv0
,SGETV0
)(int * ido
,
2934 int v_dim1
, v_offset
, i__1
;
2942 v_offset
= 1 + v_dim1
;
2956 F77_FUNC(slarnv
,SLARNV
)(&idist
, &iwork
[1], n
, &resid
[1]);
2962 F77_FUNC(scopy
,SCOPY
)(n
, &resid
[1], &c__1
, &workd
[1], &c__1
);
2968 if (iwork
[5] == 1) {
2972 if (iwork
[6] == 1) {
2978 F77_FUNC(scopy
,SCOPY
)(n
, &workd
[*n
+ 1], &c__1
, &resid
[1], &c__1
);
2983 } else if (*bmat
== 'I') {
2984 F77_FUNC(scopy
,SCOPY
)(n
, &resid
[1], &c__1
, &workd
[1], &c__1
);
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];
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
);
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
);
3013 F77_FUNC(scopy
,SCOPY
)(n
, &resid
[1], &c__1
, &workd
[*n
+ 1], &c__1
);
3018 } else if (*bmat
== 'I') {
3019 F77_FUNC(scopy
,SCOPY
)(n
, &resid
[1], &c__1
, &workd
[1], &c__1
);
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
) {
3036 if (iwork
[7] <= 1) {
3038 workd
[*n
* 3 + 4] = *rnorm
;
3043 for (jj
= 1; jj
<= i__1
; ++jj
) {
3063 F77_FUNC(ssapps
,SSAPPS
)(int * n
,
3080 int h_dim1
, h_offset
, q_dim1
, q_offset
, v_dim1
, v_offset
, i__1
, i__2
,
3084 float r__
, s
, a1
, a2
, a3
, a4
;
3095 v_offset
= 1 + v_dim1
;
3098 h_offset
= 1 + h_dim1
;
3101 q_offset
= 1 + q_dim1
;
3104 epsmch
= GMX_FLOAT_EPS
;
3108 kplusp
= *kev
+ *np
;
3110 F77_FUNC(slaset
,SLASET
)("All", &kplusp
, &kplusp
, &c_b4
, &c_b5
, &q
[q_offset
], ldq
);
3117 for (jj
= 1; jj
<= i__1
; ++jj
) {
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.;
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 +
3143 a2
= c__
* h__
[istart
+ 1 + h_dim1
] + s
* h__
[istart
+ 1 + (
3145 a4
= c__
* h__
[istart
+ 1 + (h_dim1
<< 1)] - s
* h__
[istart
+ 1 +
3147 a3
= c__
* h__
[istart
+ 1 + h_dim1
] - s
* h__
[istart
+ (h_dim1
<<
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
;
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) *
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
;
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__
);
3179 h__
[i__
+ h_dim1
] = r__
;
3181 a1
= c__
* h__
[i__
+ (h_dim1
<< 1)] + s
* h__
[i__
+ 1 +
3183 a2
= c__
* h__
[i__
+ 1 + h_dim1
] + s
* h__
[i__
+ 1 + (h_dim1
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 +
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
;
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) *
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
;
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
) {
3220 for (i__
= itop
; i__
<= i__2
; ++i__
) {
3221 if (h__
[i__
+ 1 + h_dim1
] > 0.) {
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
);
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], &
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
,
3277 F77_FUNC(ssortr
,SSORTR
)(const char * which
,
3292 if (!strncmp(which
, "SA", 2)) {
3299 for (i__
= igap
; i__
<= i__1
; ++i__
) {
3307 if (x1
[j
] < x1
[j
+ igap
]) {
3309 x1
[j
] = x1
[j
+ igap
];
3310 x1
[j
+ igap
] = temp
;
3313 x2
[j
] = x2
[j
+ igap
];
3314 x2
[j
+ igap
] = temp
;
3327 } else if (!strncmp(which
, "SM", 2)) {
3334 for (i__
= igap
; i__
<= i__1
; ++i__
) {
3342 if (fabs(x1
[j
]) < fabs(x1
[j
+ igap
])) {
3344 x1
[j
] = x1
[j
+ igap
];
3345 x1
[j
+ igap
] = temp
;
3348 x2
[j
] = x2
[j
+ igap
];
3349 x2
[j
+ igap
] = temp
;
3362 } else if (!strncmp(which
, "LA", 2)) {
3369 for (i__
= igap
; i__
<= i__1
; ++i__
) {
3377 if (x1
[j
] > x1
[j
+ igap
]) {
3379 x1
[j
] = x1
[j
+ igap
];
3380 x1
[j
+ igap
] = temp
;
3383 x2
[j
] = x2
[j
+ igap
];
3384 x2
[j
+ igap
] = temp
;
3397 } else if (!strncmp(which
, "LM", 2)) {
3405 for (i__
= igap
; i__
<= i__1
; ++i__
) {
3413 if (fabs(x1
[j
]) > fabs(x1
[j
+ igap
])) {
3415 x1
[j
] = x1
[j
+ igap
];
3416 x1
[j
+ igap
] = temp
;
3419 x2
[j
] = x2
[j
+ igap
];
3420 x2
[j
+ igap
] = temp
;
3443 F77_FUNC(ssesrt
,SSESRT
)(const char * which
,
3451 int a_dim1
, a_offset
, i__1
;
3458 a_offset
= 1 + a_dim1
* 0;
3463 if (!strncmp(which
, "SA", 2)) {
3470 for (i__
= igap
; i__
<= i__1
; ++i__
) {
3478 if (x
[j
] < x
[j
+ igap
]) {
3483 F77_FUNC(sswap
,SSWAP
)(na
, &a
[j
* a_dim1
+ 1], &c__1
, &a
[(j
+ igap
) *
3484 a_dim1
+ 1], &c__1
);
3497 } else if (!strncmp(which
, "SM", 2)) {
3504 for (i__
= igap
; i__
<= i__1
; ++i__
) {
3512 if (fabs(x
[j
]) < fabs(x
[j
+ igap
])) {
3517 F77_FUNC(sswap
,SSWAP
)(na
, &a
[j
* a_dim1
+ 1], &c__1
, &a
[(j
+ igap
) *
3518 a_dim1
+ 1], &c__1
);
3531 } else if (!strncmp(which
, "LA", 2)) {
3538 for (i__
= igap
; i__
<= i__1
; ++i__
) {
3546 if (x
[j
] > x
[j
+ igap
]) {
3551 F77_FUNC(sswap
,SSWAP
)(na
, &a
[j
* a_dim1
+ 1], &c__1
, &a
[(j
+ igap
) *
3552 a_dim1
+ 1], &c__1
);
3565 } else if (!strncmp(which
, "LM", 2)) {
3572 for (i__
= igap
; i__
<= i__1
; ++i__
) {
3580 if (fabs(x
[j
]) > fabs(x
[j
+ igap
])) {
3585 F77_FUNC(sswap
,SSWAP
)(na
, &a
[j
* a_dim1
+ 1], &c__1
, &a
[(j
+ igap
) *
3586 a_dim1
+ 1], &c__1
);
3609 F77_FUNC(ssgets
,SSGETS
)(int * ishift
,
3625 if (!strncmp(which
, "BE", 2)) {
3627 F77_FUNC(ssortr
,SSORTR
)("LA", &c__1
, &i__1
, &ritz
[1], &bounds
[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
);
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
);
3658 F77_FUNC(ssconv
,SSCONV
)(int * n
,
3674 eps23
= GMX_FLOAT_EPS
;
3675 eps23
= pow(eps23
, c_b3
);
3679 for (i__
= 1; i__
<= i__1
; ++i__
) {
3682 d__3
= fabs(ritz
[i__
]);
3683 temp
= (d__2
> d__3
) ? d__2
: d__3
;
3684 if (bounds
[i__
] <= *tol
* temp
) {
3694 F77_FUNC(sseigt
,SSEIGT
)(float * rnorm
,
3704 int h_dim1
, h_offset
, i__1
;
3713 h_offset
= 1 + h_dim1
;
3716 F77_FUNC(scopy
,SCOPY
)(n
, &h__
[(h_dim1
<< 1) + 1], &c__1
, &eig
[1], &c__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
);
3725 for (k
= 1; k
<= i__1
; ++k
) {
3726 bounds
[k
] = *rnorm
* fabs(bounds
[k
]);
3739 F77_FUNC(ssaitr
,SSAITR
)(int * ido
,
3763 int h_dim1
, h_offset
, v_dim1
, v_offset
, i__1
;
3767 float safmin
,minval
;
3773 v_offset
= 1 + v_dim1
;
3776 h_offset
= 1 + h_dim1
;
3780 minval
= GMX_FLOAT_MIN
;
3781 safmin
= minval
/ GMX_FLOAT_EPS
;
3794 iwork
[9] = iwork
[8] + *n
;
3795 iwork
[10] = iwork
[9] + *n
;
3798 if (iwork
[5] == 1) {
3801 if (iwork
[6] == 1) {
3804 if (iwork
[2] == 1) {
3807 if (iwork
[3] == 1) {
3810 if (iwork
[4] == 1) {
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]);
3834 if (iwork
[11] <= 3) {
3838 *info
= iwork
[12] - 1;
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
);
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
[
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];
3871 F77_FUNC(scopy
,SCOPY
)(n
, &workd
[iwork
[9]], &c__1
, &resid
[1], &c__1
);
3878 ipntr
[1] = iwork
[9];
3879 ipntr
[2] = iwork
[8];
3883 } else if (*bmat
== 'I') {
3884 F77_FUNC(scopy
,SCOPY
)(n
, &resid
[1], &c__1
, &workd
[iwork
[8]], &c__1
);
3893 workd
[*n
* 3 + 3] =F77_FUNC(sdot
,SDOT
)(n
, &resid
[1], &c__1
, &workd
[iwork
[10]], &
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]], &
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
);
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.;
3919 h__
[iwork
[12] + h_dim1
] = *rnorm
;
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];
3932 } else if (*bmat
== 'I') {
3933 F77_FUNC(scopy
,SCOPY
)(n
, &resid
[1], &c__1
, &workd
[iwork
[8]], &c__1
);
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
) {
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];
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];
3971 } else if (*bmat
== 'I') {
3972 F77_FUNC(scopy
,SCOPY
)(n
, &resid
[1], &c__1
, &workd
[iwork
[8]], &c__1
);
3978 workd
[*n
* 3 + 2] =F77_FUNC(sdot
,SDOT
)(n
, &resid
[1], &c__1
, &workd
[iwork
[8]], &
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];
3992 *rnorm
= workd
[*n
* 3 + 2];
3994 if (iwork
[1] <= 1) {
3999 for (jj
= 1; jj
<= i__1
; ++jj
) {
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
);
4015 F77_FUNC(sscal
,SSCAL
)(n
, &c_b50
, &resid
[1], &c__1
);
4020 if (iwork
[12] > *k
+ *np
) {
4039 F77_FUNC(ssaup2
,SSAUP2
)(int * ido
,
4069 int h_dim1
, h_offset
, q_dim1
, q_offset
, v_dim1
, v_offset
, i__1
, i__2
,
4088 v_offset
= 1 + v_dim1
;
4091 h_offset
= 1 + h_dim1
;
4094 q_offset
= 1 + q_dim1
;
4098 eps23
= GMX_FLOAT_EPS
;
4099 eps23
= pow(eps23
, c_b3
);
4111 iwork
[7] = iwork
[9] + iwork
[10];
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]
4138 if (workd
[*n
* 3 + 1] == 0.) {
4147 if (iwork
[4] == 1) {
4151 if (iwork
[5] == 1) {
4155 if (iwork
[1] == 1) {
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],
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
[
4201 F77_FUNC(sseigt
,SSEIGT
)(&workd
[*n
* 3 + 1], &iwork
[7], &h__
[h_offset
], ldh
, &ritz
[1], &
4202 bounds
[1], &workl
[1], &ierr
);
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
);
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]);
4222 for (j
= 1; j
<= i__1
; ++j
) {
4223 if (bounds
[j
] == 0.) {
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]);
4236 nevm2
= *nev
- nevd2
;
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
)],
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],
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]);
4270 for (j
= 1; j
<= i__1
; ++j
) {
4272 d__3
= fabs(ritz
[j
]);
4273 temp
= (d__2
>d__3
) ? d__2
: d__3
;
4277 strncpy(wprime
, "LA",2);
4278 F77_FUNC(ssortr
,SSORTR
)(wprime
, &c__1
, &iwork
[9], &bounds
[1], &ritz
[1]);
4281 for (j
= 1; j
<= i__1
; ++j
) {
4283 d__3
= fabs(ritz
[j
]);
4284 temp
= (d__2
>d__3
) ? d__2
: d__3
;
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]);
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
) {
4304 if (*np
== 0 && iwork
[8] < iwork
[9]) {
4311 } else if (iwork
[8] < *nev
&& *ishift
== 1) {
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) {
4320 *np
= iwork
[7] - *nev
;
4323 if (nevbef
< *nev
) {
4324 F77_FUNC(ssgets
,SSGETS
)(ishift
, which
, nev
, np
, &ritz
[1], &bounds
[1], &workl
[1]);
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]);
4350 F77_FUNC(scopy
,SCOPY
)(n
, &resid
[1], &c__1
, &workd
[*n
+ 1], &c__1
);
4356 } else if (*bmat
== 'I') {
4357 F77_FUNC(scopy
,SCOPY
)(n
, &resid
[1], &c__1
, &workd
[1], &c__1
);
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
);
4388 F77_FUNC(ssaupd
,SSAUPD
)(int * ido
,
4406 int v_dim1
, v_offset
, i__1
, i__2
;
4412 v_offset
= 1 + v_dim1
;
4423 iwork
[5] = iparam
[1];
4424 iwork
[10] = iparam
[3];
4425 iwork
[12] = iparam
[4];
4428 iwork
[11] = iparam
[7];
4433 } else if (*nev
<= 0) {
4435 } else if (*ncv
<= *nev
|| *ncv
> *n
) {
4440 iwork
[15] = *ncv
- *nev
;
4442 if (iwork
[10] <= 0) {
4445 if (strncmp(which
,"LM",2) && strncmp(which
,"SM",2) &&
4446 strncmp(which
,"LA",2) && strncmp(which
,"SA",2) &&
4447 strncmp(which
,"BE",2)) {
4450 if (*bmat
!= 'I' && *bmat
!= 'G') {
4455 if (*lworkl
< i__1
* i__1
+ (*ncv
<< 3)) {
4458 if (iwork
[11] < 1 || iwork
[11] > 5) {
4460 } else if (iwork
[11] == 1 && *bmat
== 'G') {
4462 } else if (iwork
[5] < 0 || iwork
[5] > 1) {
4464 } else if (*nev
== 1 && !strncmp(which
, "BE", 2)) {
4468 if (iwork
[2] != 0) {
4474 if (iwork
[12] <= 0) {
4478 *tol
= GMX_FLOAT_EPS
;
4481 iwork
[15] = *ncv
- *nev
;
4484 i__1
= i__2
* i__2
+ (*ncv
<< 3);
4485 for (j
= 1; j
<= i__1
; ++j
) {
4492 iwork
[16] = iwork
[3] + (iwork
[8] << 1);
4493 iwork
[1] = iwork
[16] + *ncv
;
4494 iwork
[4] = iwork
[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
);
4513 iparam
[8] = iwork
[15];
4519 iparam
[3] = iwork
[10];
4520 iparam
[5] = iwork
[15];
4538 F77_FUNC(sseupd
,SSEUPD
)(int * rvec
,
4539 const char * howmny
,
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
;
4579 float thres1
=0, thres2
=0;
4583 int leftptr
, rghtptr
;
4589 z_offset
= 1 + z_dim1
;
4594 v_offset
= 1 + v_dim1
;
4618 if (*ncv
<= *nev
|| *ncv
> *n
) {
4621 if (strncmp(which
,"LM",2) && strncmp(which
,"SM",2) &&
4622 strncmp(which
,"LA",2) && strncmp(which
,"SA",2) &&
4623 strncmp(which
,"BE",2)) {
4626 if (*bmat
!= 'I' && *bmat
!= 'G') {
4629 if (*howmny
!= 'A' && *howmny
!= 'P' &&
4630 *howmny
!= 'S' && *rvec
) {
4633 if (*rvec
&& *howmny
== 'S') {
4637 if (*rvec
&& *lworkl
< i__1
* i__1
+ (*ncv
<< 3)) {
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);
4652 if (mode
== 1 && *bmat
== 'G') {
4655 if (*nev
== 1 && !strncmp(which
, "BE",2)) {
4672 iw
= iq
+ ldh
* *ncv
;
4673 next
= iw
+ (*ncv
<< 1);
4679 irz
= ipntr
[11] + *ncv
;
4683 eps23
= GMX_FLOAT_EPS
;
4684 eps23
= pow(eps23
, c_b21
);
4689 } else if (*bmat
== 'G') {
4690 bnorm2
=F77_FUNC(snrm2
,SNRM2
)(n
, &workd
[1], &c__1
);
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
;
4704 thres1
= workl
[ism
];
4705 thres2
= workl
[ilg
];
4713 for (j
= 0; j
<= i__1
; ++j
) {
4715 if (!strncmp(which
,"LM",2)) {
4716 if (fabs(workl
[irz
+ j
]) >= fabs(thres1
)) {
4718 d__3
= fabs(workl
[irz
+ j
]);
4719 tempbnd
= (d__2
>d__3
) ? d__2
: d__3
;
4720 if (workl
[ibd
+ j
] <= *tol
* tempbnd
) {
4724 } else if (!strncmp(which
,"SM",2)) {
4725 if (fabs(workl
[irz
+ j
]) <= fabs(thres1
)) {
4727 d__3
= fabs(workl
[irz
+ j
]);
4728 tempbnd
= (d__2
>d__3
) ? d__2
: d__3
;
4729 if (workl
[ibd
+ j
] <= *tol
* tempbnd
) {
4733 } else if (!strncmp(which
,"LA",2)) {
4734 if (workl
[irz
+ j
] >= thres1
) {
4736 d__3
= fabs(workl
[irz
+ j
]);
4737 tempbnd
= (d__2
>d__3
) ? d__2
: d__3
;
4738 if (workl
[ibd
+ j
] <= *tol
* tempbnd
) {
4742 } else if (!strncmp(which
,"SA",2)) {
4743 if (workl
[irz
+ j
] <= thres1
) {
4745 d__3
= fabs(workl
[irz
+ j
]);
4746 tempbnd
= (d__2
>d__3
) ? d__2
: d__3
;
4747 if (workl
[ibd
+ j
] <= *tol
* tempbnd
) {
4751 } else if (!strncmp(which
,"BE",2)) {
4752 if (workl
[irz
+ j
] <= thres1
|| workl
[irz
+ j
] >= thres2
) {
4754 d__3
= fabs(workl
[irz
+ j
]);
4755 tempbnd
= (d__2
>d__3
) ? d__2
: d__3
;
4756 if (workl
[ibd
+ j
] <= *tol
* tempbnd
) {
4761 if (j
+ 1 > nconv
) {
4762 reord
= select
[j
+ 1] || reord
;
4764 if (select
[j
+ 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
, &
4792 if (select
[leftptr
]) {
4796 } else if (! select
[rghtptr
]) {
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
[
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
-
4816 if (leftptr
< rghtptr
) {
4824 F77_FUNC(scopy
,SCOPY
)(&nconv
, &workl
[ihd
], &c__1
, &d__
[1], &c__1
);
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)) {
4835 F77_FUNC(ssesrt
,SSESRT
)("LA", rvec
, &nconv
, &d__
[1], ncv
, &workl
[iq
], &ldq
);
4837 F77_FUNC(scopy
,SCOPY
)(ncv
, &workl
[bounds
], &c__1
, &workl
[ihb
], &c__1
);
4842 F77_FUNC(scopy
,SCOPY
)(ncv
, &workl
[ihd
], &c__1
, &workl
[iw
], &c__1
);
4843 if (!strncmp(type__
, "SHIFTI", 6)) {
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)) {
4850 for (k
= 1; k
<= i__1
; ++k
) {
4851 workl
[ihd
+ k
- 1] = *sigma
* workl
[ihd
+ k
- 1] / (workl
[ihd
4854 } else if (!strncmp(type__
, "CAYLEY",6)) {
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
]);
4865 F77_FUNC(ssesrt
,SSESRT
)("LA", rvec
, &nconv
, &d__
[1], ncv
, &workl
[iq
], &ldq
);
4867 F77_FUNC(scopy
,SCOPY
)(ncv
, &workl
[bounds
], &c__1
, &workl
[ihb
], &c__1
);
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
],
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
);
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
) {
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)) {
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)) {
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)) {
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))) {
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)) {
4944 for (k
= 0; k
<= i__1
; ++k
) {
4945 workl
[iw
+ k
] = workl
[iq
+ k
* ldq
+ *ncv
- 1] / (workl
[iw
+ k
] -
4951 if (strncmp(type__
, "REGULR",6)) {
4952 F77_FUNC(sger
,SGER
)(n
, &nconv
, &c_b102
, &resid
[1], &c__1
, &workl
[iw
], &c__1
, &z__
[