aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/clapack/claein.c
diff options
context:
space:
mode:
authorshmel1k <shmel1k@ydb.tech>2022-09-02 12:44:59 +0300
committershmel1k <shmel1k@ydb.tech>2022-09-02 12:44:59 +0300
commit90d450f74722da7859d6f510a869f6c6908fd12f (patch)
tree538c718dedc76cdfe37ad6d01ff250dd930d9278 /contrib/libs/clapack/claein.c
parent01f64c1ecd0d4ffa9e3a74478335f1745f26cc75 (diff)
downloadydb-90d450f74722da7859d6f510a869f6c6908fd12f.tar.gz
[] add metering mode to CLI
Diffstat (limited to 'contrib/libs/clapack/claein.c')
-rw-r--r--contrib/libs/clapack/claein.c392
1 files changed, 392 insertions, 0 deletions
diff --git a/contrib/libs/clapack/claein.c b/contrib/libs/clapack/claein.c
new file mode 100644
index 0000000000..48c0b2099f
--- /dev/null
+++ b/contrib/libs/clapack/claein.c
@@ -0,0 +1,392 @@
+/* claein.f -- translated by f2c (version 20061008).
+ You must link the resulting object file with libf2c:
+ on Microsoft Windows system, link with libf2c.lib;
+ on Linux or Unix systems, link with .../path/to/libf2c.a -lm
+ or, if you install libf2c.a in a standard place, with -lf2c -lm
+ -- in that order, at the end of the command line, as in
+ cc *.o -lf2c -lm
+ Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
+
+ http://www.netlib.org/f2c/libf2c.zip
+*/
+
+#include "f2c.h"
+#include "blaswrap.h"
+
+/* Table of constant values */
+
+static integer c__1 = 1;
+
+/* Subroutine */ int claein_(logical *rightv, logical *noinit, integer *n,
+ complex *h__, integer *ldh, complex *w, complex *v, complex *b,
+ integer *ldb, real *rwork, real *eps3, real *smlnum, integer *info)
+{
+ /* System generated locals */
+ integer b_dim1, b_offset, h_dim1, h_offset, i__1, i__2, i__3, i__4, i__5;
+ real r__1, r__2, r__3, r__4;
+ complex q__1, q__2;
+
+ /* Builtin functions */
+ double sqrt(doublereal), r_imag(complex *);
+
+ /* Local variables */
+ integer i__, j;
+ complex x, ei, ej;
+ integer its, ierr;
+ complex temp;
+ real scale;
+ char trans[1];
+ real rtemp, rootn, vnorm;
+ extern doublereal scnrm2_(integer *, complex *, integer *);
+ extern integer icamax_(integer *, complex *, integer *);
+ extern /* Complex */ VOID cladiv_(complex *, complex *, complex *);
+ extern /* Subroutine */ int csscal_(integer *, real *, complex *, integer
+ *), clatrs_(char *, char *, char *, char *, integer *, complex *,
+ integer *, complex *, real *, real *, integer *);
+ extern doublereal scasum_(integer *, complex *, integer *);
+ char normin[1];
+ real nrmsml, growto;
+
+
+/* -- LAPACK auxiliary routine (version 3.2) -- */
+/* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
+/* November 2006 */
+
+/* .. Scalar Arguments .. */
+/* .. */
+/* .. Array Arguments .. */
+/* .. */
+
+/* Purpose */
+/* ======= */
+
+/* CLAEIN uses inverse iteration to find a right or left eigenvector */
+/* corresponding to the eigenvalue W of a complex upper Hessenberg */
+/* matrix H. */
+
+/* Arguments */
+/* ========= */
+
+/* RIGHTV (input) LOGICAL */
+/* = .TRUE. : compute right eigenvector; */
+/* = .FALSE.: compute left eigenvector. */
+
+/* NOINIT (input) LOGICAL */
+/* = .TRUE. : no initial vector supplied in V */
+/* = .FALSE.: initial vector supplied in V. */
+
+/* N (input) INTEGER */
+/* The order of the matrix H. N >= 0. */
+
+/* H (input) COMPLEX array, dimension (LDH,N) */
+/* The upper Hessenberg matrix H. */
+
+/* LDH (input) INTEGER */
+/* The leading dimension of the array H. LDH >= max(1,N). */
+
+/* W (input) COMPLEX */
+/* The eigenvalue of H whose corresponding right or left */
+/* eigenvector is to be computed. */
+
+/* V (input/output) COMPLEX array, dimension (N) */
+/* On entry, if NOINIT = .FALSE., V must contain a starting */
+/* vector for inverse iteration; otherwise V need not be set. */
+/* On exit, V contains the computed eigenvector, normalized so */
+/* that the component of largest magnitude has magnitude 1; here */
+/* the magnitude of a complex number (x,y) is taken to be */
+/* |x| + |y|. */
+
+/* B (workspace) COMPLEX array, dimension (LDB,N) */
+
+/* LDB (input) INTEGER */
+/* The leading dimension of the array B. LDB >= max(1,N). */
+
+/* RWORK (workspace) REAL array, dimension (N) */
+
+/* EPS3 (input) REAL */
+/* A small machine-dependent value which is used to perturb */
+/* close eigenvalues, and to replace zero pivots. */
+
+/* SMLNUM (input) REAL */
+/* A machine-dependent value close to the underflow threshold. */
+
+/* INFO (output) INTEGER */
+/* = 0: successful exit */
+/* = 1: inverse iteration did not converge; V is set to the */
+/* last iterate. */
+
+/* ===================================================================== */
+
+/* .. Parameters .. */
+/* .. */
+/* .. Local Scalars .. */
+/* .. */
+/* .. External Functions .. */
+/* .. */
+/* .. External Subroutines .. */
+/* .. */
+/* .. Intrinsic Functions .. */
+/* .. */
+/* .. Statement Functions .. */
+/* .. */
+/* .. Statement Function definitions .. */
+/* .. */
+/* .. Executable Statements .. */
+
+ /* Parameter adjustments */
+ h_dim1 = *ldh;
+ h_offset = 1 + h_dim1;
+ h__ -= h_offset;
+ --v;
+ b_dim1 = *ldb;
+ b_offset = 1 + b_dim1;
+ b -= b_offset;
+ --rwork;
+
+ /* Function Body */
+ *info = 0;
+
+/* GROWTO is the threshold used in the acceptance test for an */
+/* eigenvector. */
+
+ rootn = sqrt((real) (*n));
+ growto = .1f / rootn;
+/* Computing MAX */
+ r__1 = 1.f, r__2 = *eps3 * rootn;
+ nrmsml = dmax(r__1,r__2) * *smlnum;
+
+/* Form B = H - W*I (except that the subdiagonal elements are not */
+/* stored). */
+
+ i__1 = *n;
+ for (j = 1; j <= i__1; ++j) {
+ i__2 = j - 1;
+ for (i__ = 1; i__ <= i__2; ++i__) {
+ i__3 = i__ + j * b_dim1;
+ i__4 = i__ + j * h_dim1;
+ b[i__3].r = h__[i__4].r, b[i__3].i = h__[i__4].i;
+/* L10: */
+ }
+ i__2 = j + j * b_dim1;
+ i__3 = j + j * h_dim1;
+ q__1.r = h__[i__3].r - w->r, q__1.i = h__[i__3].i - w->i;
+ b[i__2].r = q__1.r, b[i__2].i = q__1.i;
+/* L20: */
+ }
+
+ if (*noinit) {
+
+/* Initialize V. */
+
+ i__1 = *n;
+ for (i__ = 1; i__ <= i__1; ++i__) {
+ i__2 = i__;
+ v[i__2].r = *eps3, v[i__2].i = 0.f;
+/* L30: */
+ }
+ } else {
+
+/* Scale supplied initial vector. */
+
+ vnorm = scnrm2_(n, &v[1], &c__1);
+ r__1 = *eps3 * rootn / dmax(vnorm,nrmsml);
+ csscal_(n, &r__1, &v[1], &c__1);
+ }
+
+ if (*rightv) {
+
+/* LU decomposition with partial pivoting of B, replacing zero */
+/* pivots by EPS3. */
+
+ i__1 = *n - 1;
+ for (i__ = 1; i__ <= i__1; ++i__) {
+ i__2 = i__ + 1 + i__ * h_dim1;
+ ei.r = h__[i__2].r, ei.i = h__[i__2].i;
+ i__2 = i__ + i__ * b_dim1;
+ if ((r__1 = b[i__2].r, dabs(r__1)) + (r__2 = r_imag(&b[i__ + i__ *
+ b_dim1]), dabs(r__2)) < (r__3 = ei.r, dabs(r__3)) + (
+ r__4 = r_imag(&ei), dabs(r__4))) {
+
+/* Interchange rows and eliminate. */
+
+ cladiv_(&q__1, &b[i__ + i__ * b_dim1], &ei);
+ x.r = q__1.r, x.i = q__1.i;
+ i__2 = i__ + i__ * b_dim1;
+ b[i__2].r = ei.r, b[i__2].i = ei.i;
+ i__2 = *n;
+ for (j = i__ + 1; j <= i__2; ++j) {
+ i__3 = i__ + 1 + j * b_dim1;
+ temp.r = b[i__3].r, temp.i = b[i__3].i;
+ i__3 = i__ + 1 + j * b_dim1;
+ i__4 = i__ + j * b_dim1;
+ q__2.r = x.r * temp.r - x.i * temp.i, q__2.i = x.r *
+ temp.i + x.i * temp.r;
+ q__1.r = b[i__4].r - q__2.r, q__1.i = b[i__4].i - q__2.i;
+ b[i__3].r = q__1.r, b[i__3].i = q__1.i;
+ i__3 = i__ + j * b_dim1;
+ b[i__3].r = temp.r, b[i__3].i = temp.i;
+/* L40: */
+ }
+ } else {
+
+/* Eliminate without interchange. */
+
+ i__2 = i__ + i__ * b_dim1;
+ if (b[i__2].r == 0.f && b[i__2].i == 0.f) {
+ i__3 = i__ + i__ * b_dim1;
+ b[i__3].r = *eps3, b[i__3].i = 0.f;
+ }
+ cladiv_(&q__1, &ei, &b[i__ + i__ * b_dim1]);
+ x.r = q__1.r, x.i = q__1.i;
+ if (x.r != 0.f || x.i != 0.f) {
+ i__2 = *n;
+ for (j = i__ + 1; j <= i__2; ++j) {
+ i__3 = i__ + 1 + j * b_dim1;
+ i__4 = i__ + 1 + j * b_dim1;
+ i__5 = i__ + j * b_dim1;
+ q__2.r = x.r * b[i__5].r - x.i * b[i__5].i, q__2.i =
+ x.r * b[i__5].i + x.i * b[i__5].r;
+ q__1.r = b[i__4].r - q__2.r, q__1.i = b[i__4].i -
+ q__2.i;
+ b[i__3].r = q__1.r, b[i__3].i = q__1.i;
+/* L50: */
+ }
+ }
+ }
+/* L60: */
+ }
+ i__1 = *n + *n * b_dim1;
+ if (b[i__1].r == 0.f && b[i__1].i == 0.f) {
+ i__2 = *n + *n * b_dim1;
+ b[i__2].r = *eps3, b[i__2].i = 0.f;
+ }
+
+ *(unsigned char *)trans = 'N';
+
+ } else {
+
+/* UL decomposition with partial pivoting of B, replacing zero */
+/* pivots by EPS3. */
+
+ for (j = *n; j >= 2; --j) {
+ i__1 = j + (j - 1) * h_dim1;
+ ej.r = h__[i__1].r, ej.i = h__[i__1].i;
+ i__1 = j + j * b_dim1;
+ if ((r__1 = b[i__1].r, dabs(r__1)) + (r__2 = r_imag(&b[j + j *
+ b_dim1]), dabs(r__2)) < (r__3 = ej.r, dabs(r__3)) + (r__4
+ = r_imag(&ej), dabs(r__4))) {
+
+/* Interchange columns and eliminate. */
+
+ cladiv_(&q__1, &b[j + j * b_dim1], &ej);
+ x.r = q__1.r, x.i = q__1.i;
+ i__1 = j + j * b_dim1;
+ b[i__1].r = ej.r, b[i__1].i = ej.i;
+ i__1 = j - 1;
+ for (i__ = 1; i__ <= i__1; ++i__) {
+ i__2 = i__ + (j - 1) * b_dim1;
+ temp.r = b[i__2].r, temp.i = b[i__2].i;
+ i__2 = i__ + (j - 1) * b_dim1;
+ i__3 = i__ + j * b_dim1;
+ q__2.r = x.r * temp.r - x.i * temp.i, q__2.i = x.r *
+ temp.i + x.i * temp.r;
+ q__1.r = b[i__3].r - q__2.r, q__1.i = b[i__3].i - q__2.i;
+ b[i__2].r = q__1.r, b[i__2].i = q__1.i;
+ i__2 = i__ + j * b_dim1;
+ b[i__2].r = temp.r, b[i__2].i = temp.i;
+/* L70: */
+ }
+ } else {
+
+/* Eliminate without interchange. */
+
+ i__1 = j + j * b_dim1;
+ if (b[i__1].r == 0.f && b[i__1].i == 0.f) {
+ i__2 = j + j * b_dim1;
+ b[i__2].r = *eps3, b[i__2].i = 0.f;
+ }
+ cladiv_(&q__1, &ej, &b[j + j * b_dim1]);
+ x.r = q__1.r, x.i = q__1.i;
+ if (x.r != 0.f || x.i != 0.f) {
+ i__1 = j - 1;
+ for (i__ = 1; i__ <= i__1; ++i__) {
+ i__2 = i__ + (j - 1) * b_dim1;
+ i__3 = i__ + (j - 1) * b_dim1;
+ i__4 = i__ + j * b_dim1;
+ q__2.r = x.r * b[i__4].r - x.i * b[i__4].i, q__2.i =
+ x.r * b[i__4].i + x.i * b[i__4].r;
+ q__1.r = b[i__3].r - q__2.r, q__1.i = b[i__3].i -
+ q__2.i;
+ b[i__2].r = q__1.r, b[i__2].i = q__1.i;
+/* L80: */
+ }
+ }
+ }
+/* L90: */
+ }
+ i__1 = b_dim1 + 1;
+ if (b[i__1].r == 0.f && b[i__1].i == 0.f) {
+ i__2 = b_dim1 + 1;
+ b[i__2].r = *eps3, b[i__2].i = 0.f;
+ }
+
+ *(unsigned char *)trans = 'C';
+
+ }
+
+ *(unsigned char *)normin = 'N';
+ i__1 = *n;
+ for (its = 1; its <= i__1; ++its) {
+
+/* Solve U*x = scale*v for a right eigenvector */
+/* or U'*x = scale*v for a left eigenvector, */
+/* overwriting x on v. */
+
+ clatrs_("Upper", trans, "Nonunit", normin, n, &b[b_offset], ldb, &v[1]
+, &scale, &rwork[1], &ierr);
+ *(unsigned char *)normin = 'Y';
+
+/* Test for sufficient growth in the norm of v. */
+
+ vnorm = scasum_(n, &v[1], &c__1);
+ if (vnorm >= growto * scale) {
+ goto L120;
+ }
+
+/* Choose new orthogonal starting vector and try again. */
+
+ rtemp = *eps3 / (rootn + 1.f);
+ v[1].r = *eps3, v[1].i = 0.f;
+ i__2 = *n;
+ for (i__ = 2; i__ <= i__2; ++i__) {
+ i__3 = i__;
+ v[i__3].r = rtemp, v[i__3].i = 0.f;
+/* L100: */
+ }
+ i__2 = *n - its + 1;
+ i__3 = *n - its + 1;
+ r__1 = *eps3 * rootn;
+ q__1.r = v[i__3].r - r__1, q__1.i = v[i__3].i;
+ v[i__2].r = q__1.r, v[i__2].i = q__1.i;
+/* L110: */
+ }
+
+/* Failure to find eigenvector in N iterations. */
+
+ *info = 1;
+
+L120:
+
+/* Normalize eigenvector. */
+
+ i__ = icamax_(n, &v[1], &c__1);
+ i__1 = i__;
+ r__3 = 1.f / ((r__1 = v[i__1].r, dabs(r__1)) + (r__2 = r_imag(&v[i__]),
+ dabs(r__2)));
+ csscal_(n, &r__3, &v[1], &c__1);
+
+ return 0;
+
+/* End of CLAEIN */
+
+} /* claein_ */