dlaein.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678
  1. /* dlaein.f -- translated by f2c (version 20061008).
  2. You must link the resulting object file with libf2c:
  3. on Microsoft Windows system, link with libf2c.lib;
  4. on Linux or Unix systems, link with .../path/to/libf2c.a -lm
  5. or, if you install libf2c.a in a standard place, with -lf2c -lm
  6. -- in that order, at the end of the command line, as in
  7. cc *.o -lf2c -lm
  8. Source for libf2c is in /netlib/f2c/libf2c.zip, e.g.,
  9. http://www.netlib.org/f2c/libf2c.zip
  10. */
  11. #include "f2c.h"
  12. #include "blaswrap.h"
  13. /* Table of constant values */
  14. static integer c__1 = 1;
  15. /* Subroutine */ int _starpu_dlaein_(logical *rightv, logical *noinit, integer *n,
  16. doublereal *h__, integer *ldh, doublereal *wr, doublereal *wi,
  17. doublereal *vr, doublereal *vi, doublereal *b, integer *ldb,
  18. doublereal *work, doublereal *eps3, doublereal *smlnum, doublereal *
  19. bignum, integer *info)
  20. {
  21. /* System generated locals */
  22. integer b_dim1, b_offset, h_dim1, h_offset, i__1, i__2, i__3, i__4;
  23. doublereal d__1, d__2, d__3, d__4;
  24. /* Builtin functions */
  25. double sqrt(doublereal);
  26. /* Local variables */
  27. integer i__, j;
  28. doublereal w, x, y;
  29. integer i1, i2, i3;
  30. doublereal w1, ei, ej, xi, xr, rec;
  31. integer its, ierr;
  32. doublereal temp, norm, vmax;
  33. extern doublereal _starpu_dnrm2_(integer *, doublereal *, integer *);
  34. extern /* Subroutine */ int _starpu_dscal_(integer *, doublereal *, doublereal *,
  35. integer *);
  36. doublereal scale;
  37. extern doublereal _starpu_dasum_(integer *, doublereal *, integer *);
  38. char trans[1];
  39. doublereal vcrit, rootn, vnorm;
  40. extern doublereal _starpu_dlapy2_(doublereal *, doublereal *);
  41. doublereal absbii, absbjj;
  42. extern integer _starpu_idamax_(integer *, doublereal *, integer *);
  43. extern /* Subroutine */ int _starpu_dladiv_(doublereal *, doublereal *,
  44. doublereal *, doublereal *, doublereal *, doublereal *), _starpu_dlatrs_(
  45. char *, char *, char *, char *, integer *, doublereal *, integer *
  46. , doublereal *, doublereal *, doublereal *, integer *);
  47. char normin[1];
  48. doublereal nrmsml, growto;
  49. /* -- LAPACK auxiliary routine (version 3.2) -- */
  50. /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
  51. /* November 2006 */
  52. /* .. Scalar Arguments .. */
  53. /* .. */
  54. /* .. Array Arguments .. */
  55. /* .. */
  56. /* Purpose */
  57. /* ======= */
  58. /* DLAEIN uses inverse iteration to find a right or left eigenvector */
  59. /* corresponding to the eigenvalue (WR,WI) of a real upper Hessenberg */
  60. /* matrix H. */
  61. /* Arguments */
  62. /* ========= */
  63. /* RIGHTV (input) LOGICAL */
  64. /* = .TRUE. : compute right eigenvector; */
  65. /* = .FALSE.: compute left eigenvector. */
  66. /* NOINIT (input) LOGICAL */
  67. /* = .TRUE. : no initial vector supplied in (VR,VI). */
  68. /* = .FALSE.: initial vector supplied in (VR,VI). */
  69. /* N (input) INTEGER */
  70. /* The order of the matrix H. N >= 0. */
  71. /* H (input) DOUBLE PRECISION array, dimension (LDH,N) */
  72. /* The upper Hessenberg matrix H. */
  73. /* LDH (input) INTEGER */
  74. /* The leading dimension of the array H. LDH >= max(1,N). */
  75. /* WR (input) DOUBLE PRECISION */
  76. /* WI (input) DOUBLE PRECISION */
  77. /* The real and imaginary parts of the eigenvalue of H whose */
  78. /* corresponding right or left eigenvector is to be computed. */
  79. /* VR (input/output) DOUBLE PRECISION array, dimension (N) */
  80. /* VI (input/output) DOUBLE PRECISION array, dimension (N) */
  81. /* On entry, if NOINIT = .FALSE. and WI = 0.0, VR must contain */
  82. /* a real starting vector for inverse iteration using the real */
  83. /* eigenvalue WR; if NOINIT = .FALSE. and WI.ne.0.0, VR and VI */
  84. /* must contain the real and imaginary parts of a complex */
  85. /* starting vector for inverse iteration using the complex */
  86. /* eigenvalue (WR,WI); otherwise VR and VI need not be set. */
  87. /* On exit, if WI = 0.0 (real eigenvalue), VR contains the */
  88. /* computed real eigenvector; if WI.ne.0.0 (complex eigenvalue), */
  89. /* VR and VI contain the real and imaginary parts of the */
  90. /* computed complex eigenvector. The eigenvector is normalized */
  91. /* so that the component of largest magnitude has magnitude 1; */
  92. /* here the magnitude of a complex number (x,y) is taken to be */
  93. /* |x| + |y|. */
  94. /* VI is not referenced if WI = 0.0. */
  95. /* B (workspace) DOUBLE PRECISION array, dimension (LDB,N) */
  96. /* LDB (input) INTEGER */
  97. /* The leading dimension of the array B. LDB >= N+1. */
  98. /* WORK (workspace) DOUBLE PRECISION array, dimension (N) */
  99. /* EPS3 (input) DOUBLE PRECISION */
  100. /* A small machine-dependent value which is used to perturb */
  101. /* close eigenvalues, and to replace zero pivots. */
  102. /* SMLNUM (input) DOUBLE PRECISION */
  103. /* A machine-dependent value close to the underflow threshold. */
  104. /* BIGNUM (input) DOUBLE PRECISION */
  105. /* A machine-dependent value close to the overflow threshold. */
  106. /* INFO (output) INTEGER */
  107. /* = 0: successful exit */
  108. /* = 1: inverse iteration did not converge; VR is set to the */
  109. /* last iterate, and so is VI if WI.ne.0.0. */
  110. /* ===================================================================== */
  111. /* .. Parameters .. */
  112. /* .. */
  113. /* .. Local Scalars .. */
  114. /* .. */
  115. /* .. External Functions .. */
  116. /* .. */
  117. /* .. External Subroutines .. */
  118. /* .. */
  119. /* .. Intrinsic Functions .. */
  120. /* .. */
  121. /* .. Executable Statements .. */
  122. /* Parameter adjustments */
  123. h_dim1 = *ldh;
  124. h_offset = 1 + h_dim1;
  125. h__ -= h_offset;
  126. --vr;
  127. --vi;
  128. b_dim1 = *ldb;
  129. b_offset = 1 + b_dim1;
  130. b -= b_offset;
  131. --work;
  132. /* Function Body */
  133. *info = 0;
  134. /* GROWTO is the threshold used in the acceptance test for an */
  135. /* eigenvector. */
  136. rootn = sqrt((doublereal) (*n));
  137. growto = .1 / rootn;
  138. /* Computing MAX */
  139. d__1 = 1., d__2 = *eps3 * rootn;
  140. nrmsml = max(d__1,d__2) * *smlnum;
  141. /* Form B = H - (WR,WI)*I (except that the subdiagonal elements and */
  142. /* the imaginary parts of the diagonal elements are not stored). */
  143. i__1 = *n;
  144. for (j = 1; j <= i__1; ++j) {
  145. i__2 = j - 1;
  146. for (i__ = 1; i__ <= i__2; ++i__) {
  147. b[i__ + j * b_dim1] = h__[i__ + j * h_dim1];
  148. /* L10: */
  149. }
  150. b[j + j * b_dim1] = h__[j + j * h_dim1] - *wr;
  151. /* L20: */
  152. }
  153. if (*wi == 0.) {
  154. /* Real eigenvalue. */
  155. if (*noinit) {
  156. /* Set initial vector. */
  157. i__1 = *n;
  158. for (i__ = 1; i__ <= i__1; ++i__) {
  159. vr[i__] = *eps3;
  160. /* L30: */
  161. }
  162. } else {
  163. /* Scale supplied initial vector. */
  164. vnorm = _starpu_dnrm2_(n, &vr[1], &c__1);
  165. d__1 = *eps3 * rootn / max(vnorm,nrmsml);
  166. _starpu_dscal_(n, &d__1, &vr[1], &c__1);
  167. }
  168. if (*rightv) {
  169. /* LU decomposition with partial pivoting of B, replacing zero */
  170. /* pivots by EPS3. */
  171. i__1 = *n - 1;
  172. for (i__ = 1; i__ <= i__1; ++i__) {
  173. ei = h__[i__ + 1 + i__ * h_dim1];
  174. if ((d__1 = b[i__ + i__ * b_dim1], abs(d__1)) < abs(ei)) {
  175. /* Interchange rows and eliminate. */
  176. x = b[i__ + i__ * b_dim1] / ei;
  177. b[i__ + i__ * b_dim1] = ei;
  178. i__2 = *n;
  179. for (j = i__ + 1; j <= i__2; ++j) {
  180. temp = b[i__ + 1 + j * b_dim1];
  181. b[i__ + 1 + j * b_dim1] = b[i__ + j * b_dim1] - x *
  182. temp;
  183. b[i__ + j * b_dim1] = temp;
  184. /* L40: */
  185. }
  186. } else {
  187. /* Eliminate without interchange. */
  188. if (b[i__ + i__ * b_dim1] == 0.) {
  189. b[i__ + i__ * b_dim1] = *eps3;
  190. }
  191. x = ei / b[i__ + i__ * b_dim1];
  192. if (x != 0.) {
  193. i__2 = *n;
  194. for (j = i__ + 1; j <= i__2; ++j) {
  195. b[i__ + 1 + j * b_dim1] -= x * b[i__ + j * b_dim1]
  196. ;
  197. /* L50: */
  198. }
  199. }
  200. }
  201. /* L60: */
  202. }
  203. if (b[*n + *n * b_dim1] == 0.) {
  204. b[*n + *n * b_dim1] = *eps3;
  205. }
  206. *(unsigned char *)trans = 'N';
  207. } else {
  208. /* UL decomposition with partial pivoting of B, replacing zero */
  209. /* pivots by EPS3. */
  210. for (j = *n; j >= 2; --j) {
  211. ej = h__[j + (j - 1) * h_dim1];
  212. if ((d__1 = b[j + j * b_dim1], abs(d__1)) < abs(ej)) {
  213. /* Interchange columns and eliminate. */
  214. x = b[j + j * b_dim1] / ej;
  215. b[j + j * b_dim1] = ej;
  216. i__1 = j - 1;
  217. for (i__ = 1; i__ <= i__1; ++i__) {
  218. temp = b[i__ + (j - 1) * b_dim1];
  219. b[i__ + (j - 1) * b_dim1] = b[i__ + j * b_dim1] - x *
  220. temp;
  221. b[i__ + j * b_dim1] = temp;
  222. /* L70: */
  223. }
  224. } else {
  225. /* Eliminate without interchange. */
  226. if (b[j + j * b_dim1] == 0.) {
  227. b[j + j * b_dim1] = *eps3;
  228. }
  229. x = ej / b[j + j * b_dim1];
  230. if (x != 0.) {
  231. i__1 = j - 1;
  232. for (i__ = 1; i__ <= i__1; ++i__) {
  233. b[i__ + (j - 1) * b_dim1] -= x * b[i__ + j *
  234. b_dim1];
  235. /* L80: */
  236. }
  237. }
  238. }
  239. /* L90: */
  240. }
  241. if (b[b_dim1 + 1] == 0.) {
  242. b[b_dim1 + 1] = *eps3;
  243. }
  244. *(unsigned char *)trans = 'T';
  245. }
  246. *(unsigned char *)normin = 'N';
  247. i__1 = *n;
  248. for (its = 1; its <= i__1; ++its) {
  249. /* Solve U*x = scale*v for a right eigenvector */
  250. /* or U'*x = scale*v for a left eigenvector, */
  251. /* overwriting x on v. */
  252. _starpu_dlatrs_("Upper", trans, "Nonunit", normin, n, &b[b_offset], ldb, &
  253. vr[1], &scale, &work[1], &ierr);
  254. *(unsigned char *)normin = 'Y';
  255. /* Test for sufficient growth in the norm of v. */
  256. vnorm = _starpu_dasum_(n, &vr[1], &c__1);
  257. if (vnorm >= growto * scale) {
  258. goto L120;
  259. }
  260. /* Choose new orthogonal starting vector and try again. */
  261. temp = *eps3 / (rootn + 1.);
  262. vr[1] = *eps3;
  263. i__2 = *n;
  264. for (i__ = 2; i__ <= i__2; ++i__) {
  265. vr[i__] = temp;
  266. /* L100: */
  267. }
  268. vr[*n - its + 1] -= *eps3 * rootn;
  269. /* L110: */
  270. }
  271. /* Failure to find eigenvector in N iterations. */
  272. *info = 1;
  273. L120:
  274. /* Normalize eigenvector. */
  275. i__ = _starpu_idamax_(n, &vr[1], &c__1);
  276. d__2 = 1. / (d__1 = vr[i__], abs(d__1));
  277. _starpu_dscal_(n, &d__2, &vr[1], &c__1);
  278. } else {
  279. /* Complex eigenvalue. */
  280. if (*noinit) {
  281. /* Set initial vector. */
  282. i__1 = *n;
  283. for (i__ = 1; i__ <= i__1; ++i__) {
  284. vr[i__] = *eps3;
  285. vi[i__] = 0.;
  286. /* L130: */
  287. }
  288. } else {
  289. /* Scale supplied initial vector. */
  290. d__1 = _starpu_dnrm2_(n, &vr[1], &c__1);
  291. d__2 = _starpu_dnrm2_(n, &vi[1], &c__1);
  292. norm = _starpu_dlapy2_(&d__1, &d__2);
  293. rec = *eps3 * rootn / max(norm,nrmsml);
  294. _starpu_dscal_(n, &rec, &vr[1], &c__1);
  295. _starpu_dscal_(n, &rec, &vi[1], &c__1);
  296. }
  297. if (*rightv) {
  298. /* LU decomposition with partial pivoting of B, replacing zero */
  299. /* pivots by EPS3. */
  300. /* The imaginary part of the (i,j)-th element of U is stored in */
  301. /* B(j+1,i). */
  302. b[b_dim1 + 2] = -(*wi);
  303. i__1 = *n;
  304. for (i__ = 2; i__ <= i__1; ++i__) {
  305. b[i__ + 1 + b_dim1] = 0.;
  306. /* L140: */
  307. }
  308. i__1 = *n - 1;
  309. for (i__ = 1; i__ <= i__1; ++i__) {
  310. absbii = _starpu_dlapy2_(&b[i__ + i__ * b_dim1], &b[i__ + 1 + i__ *
  311. b_dim1]);
  312. ei = h__[i__ + 1 + i__ * h_dim1];
  313. if (absbii < abs(ei)) {
  314. /* Interchange rows and eliminate. */
  315. xr = b[i__ + i__ * b_dim1] / ei;
  316. xi = b[i__ + 1 + i__ * b_dim1] / ei;
  317. b[i__ + i__ * b_dim1] = ei;
  318. b[i__ + 1 + i__ * b_dim1] = 0.;
  319. i__2 = *n;
  320. for (j = i__ + 1; j <= i__2; ++j) {
  321. temp = b[i__ + 1 + j * b_dim1];
  322. b[i__ + 1 + j * b_dim1] = b[i__ + j * b_dim1] - xr *
  323. temp;
  324. b[j + 1 + (i__ + 1) * b_dim1] = b[j + 1 + i__ *
  325. b_dim1] - xi * temp;
  326. b[i__ + j * b_dim1] = temp;
  327. b[j + 1 + i__ * b_dim1] = 0.;
  328. /* L150: */
  329. }
  330. b[i__ + 2 + i__ * b_dim1] = -(*wi);
  331. b[i__ + 1 + (i__ + 1) * b_dim1] -= xi * *wi;
  332. b[i__ + 2 + (i__ + 1) * b_dim1] += xr * *wi;
  333. } else {
  334. /* Eliminate without interchanging rows. */
  335. if (absbii == 0.) {
  336. b[i__ + i__ * b_dim1] = *eps3;
  337. b[i__ + 1 + i__ * b_dim1] = 0.;
  338. absbii = *eps3;
  339. }
  340. ei = ei / absbii / absbii;
  341. xr = b[i__ + i__ * b_dim1] * ei;
  342. xi = -b[i__ + 1 + i__ * b_dim1] * ei;
  343. i__2 = *n;
  344. for (j = i__ + 1; j <= i__2; ++j) {
  345. b[i__ + 1 + j * b_dim1] = b[i__ + 1 + j * b_dim1] -
  346. xr * b[i__ + j * b_dim1] + xi * b[j + 1 + i__
  347. * b_dim1];
  348. b[j + 1 + (i__ + 1) * b_dim1] = -xr * b[j + 1 + i__ *
  349. b_dim1] - xi * b[i__ + j * b_dim1];
  350. /* L160: */
  351. }
  352. b[i__ + 2 + (i__ + 1) * b_dim1] -= *wi;
  353. }
  354. /* Compute 1-norm of offdiagonal elements of i-th row. */
  355. i__2 = *n - i__;
  356. i__3 = *n - i__;
  357. work[i__] = _starpu_dasum_(&i__2, &b[i__ + (i__ + 1) * b_dim1], ldb)
  358. + _starpu_dasum_(&i__3, &b[i__ + 2 + i__ * b_dim1], &c__1);
  359. /* L170: */
  360. }
  361. if (b[*n + *n * b_dim1] == 0. && b[*n + 1 + *n * b_dim1] == 0.) {
  362. b[*n + *n * b_dim1] = *eps3;
  363. }
  364. work[*n] = 0.;
  365. i1 = *n;
  366. i2 = 1;
  367. i3 = -1;
  368. } else {
  369. /* UL decomposition with partial pivoting of conjg(B), */
  370. /* replacing zero pivots by EPS3. */
  371. /* The imaginary part of the (i,j)-th element of U is stored in */
  372. /* B(j+1,i). */
  373. b[*n + 1 + *n * b_dim1] = *wi;
  374. i__1 = *n - 1;
  375. for (j = 1; j <= i__1; ++j) {
  376. b[*n + 1 + j * b_dim1] = 0.;
  377. /* L180: */
  378. }
  379. for (j = *n; j >= 2; --j) {
  380. ej = h__[j + (j - 1) * h_dim1];
  381. absbjj = _starpu_dlapy2_(&b[j + j * b_dim1], &b[j + 1 + j * b_dim1]);
  382. if (absbjj < abs(ej)) {
  383. /* Interchange columns and eliminate */
  384. xr = b[j + j * b_dim1] / ej;
  385. xi = b[j + 1 + j * b_dim1] / ej;
  386. b[j + j * b_dim1] = ej;
  387. b[j + 1 + j * b_dim1] = 0.;
  388. i__1 = j - 1;
  389. for (i__ = 1; i__ <= i__1; ++i__) {
  390. temp = b[i__ + (j - 1) * b_dim1];
  391. b[i__ + (j - 1) * b_dim1] = b[i__ + j * b_dim1] - xr *
  392. temp;
  393. b[j + i__ * b_dim1] = b[j + 1 + i__ * b_dim1] - xi *
  394. temp;
  395. b[i__ + j * b_dim1] = temp;
  396. b[j + 1 + i__ * b_dim1] = 0.;
  397. /* L190: */
  398. }
  399. b[j + 1 + (j - 1) * b_dim1] = *wi;
  400. b[j - 1 + (j - 1) * b_dim1] += xi * *wi;
  401. b[j + (j - 1) * b_dim1] -= xr * *wi;
  402. } else {
  403. /* Eliminate without interchange. */
  404. if (absbjj == 0.) {
  405. b[j + j * b_dim1] = *eps3;
  406. b[j + 1 + j * b_dim1] = 0.;
  407. absbjj = *eps3;
  408. }
  409. ej = ej / absbjj / absbjj;
  410. xr = b[j + j * b_dim1] * ej;
  411. xi = -b[j + 1 + j * b_dim1] * ej;
  412. i__1 = j - 1;
  413. for (i__ = 1; i__ <= i__1; ++i__) {
  414. b[i__ + (j - 1) * b_dim1] = b[i__ + (j - 1) * b_dim1]
  415. - xr * b[i__ + j * b_dim1] + xi * b[j + 1 +
  416. i__ * b_dim1];
  417. b[j + i__ * b_dim1] = -xr * b[j + 1 + i__ * b_dim1] -
  418. xi * b[i__ + j * b_dim1];
  419. /* L200: */
  420. }
  421. b[j + (j - 1) * b_dim1] += *wi;
  422. }
  423. /* Compute 1-norm of offdiagonal elements of j-th column. */
  424. i__1 = j - 1;
  425. i__2 = j - 1;
  426. work[j] = _starpu_dasum_(&i__1, &b[j * b_dim1 + 1], &c__1) + _starpu_dasum_(&
  427. i__2, &b[j + 1 + b_dim1], ldb);
  428. /* L210: */
  429. }
  430. if (b[b_dim1 + 1] == 0. && b[b_dim1 + 2] == 0.) {
  431. b[b_dim1 + 1] = *eps3;
  432. }
  433. work[1] = 0.;
  434. i1 = 1;
  435. i2 = *n;
  436. i3 = 1;
  437. }
  438. i__1 = *n;
  439. for (its = 1; its <= i__1; ++its) {
  440. scale = 1.;
  441. vmax = 1.;
  442. vcrit = *bignum;
  443. /* Solve U*(xr,xi) = scale*(vr,vi) for a right eigenvector, */
  444. /* or U'*(xr,xi) = scale*(vr,vi) for a left eigenvector, */
  445. /* overwriting (xr,xi) on (vr,vi). */
  446. i__2 = i2;
  447. i__3 = i3;
  448. for (i__ = i1; i__3 < 0 ? i__ >= i__2 : i__ <= i__2; i__ += i__3)
  449. {
  450. if (work[i__] > vcrit) {
  451. rec = 1. / vmax;
  452. _starpu_dscal_(n, &rec, &vr[1], &c__1);
  453. _starpu_dscal_(n, &rec, &vi[1], &c__1);
  454. scale *= rec;
  455. vmax = 1.;
  456. vcrit = *bignum;
  457. }
  458. xr = vr[i__];
  459. xi = vi[i__];
  460. if (*rightv) {
  461. i__4 = *n;
  462. for (j = i__ + 1; j <= i__4; ++j) {
  463. xr = xr - b[i__ + j * b_dim1] * vr[j] + b[j + 1 + i__
  464. * b_dim1] * vi[j];
  465. xi = xi - b[i__ + j * b_dim1] * vi[j] - b[j + 1 + i__
  466. * b_dim1] * vr[j];
  467. /* L220: */
  468. }
  469. } else {
  470. i__4 = i__ - 1;
  471. for (j = 1; j <= i__4; ++j) {
  472. xr = xr - b[j + i__ * b_dim1] * vr[j] + b[i__ + 1 + j
  473. * b_dim1] * vi[j];
  474. xi = xi - b[j + i__ * b_dim1] * vi[j] - b[i__ + 1 + j
  475. * b_dim1] * vr[j];
  476. /* L230: */
  477. }
  478. }
  479. w = (d__1 = b[i__ + i__ * b_dim1], abs(d__1)) + (d__2 = b[i__
  480. + 1 + i__ * b_dim1], abs(d__2));
  481. if (w > *smlnum) {
  482. if (w < 1.) {
  483. w1 = abs(xr) + abs(xi);
  484. if (w1 > w * *bignum) {
  485. rec = 1. / w1;
  486. _starpu_dscal_(n, &rec, &vr[1], &c__1);
  487. _starpu_dscal_(n, &rec, &vi[1], &c__1);
  488. xr = vr[i__];
  489. xi = vi[i__];
  490. scale *= rec;
  491. vmax *= rec;
  492. }
  493. }
  494. /* Divide by diagonal element of B. */
  495. _starpu_dladiv_(&xr, &xi, &b[i__ + i__ * b_dim1], &b[i__ + 1 +
  496. i__ * b_dim1], &vr[i__], &vi[i__]);
  497. /* Computing MAX */
  498. d__3 = (d__1 = vr[i__], abs(d__1)) + (d__2 = vi[i__], abs(
  499. d__2));
  500. vmax = max(d__3,vmax);
  501. vcrit = *bignum / vmax;
  502. } else {
  503. i__4 = *n;
  504. for (j = 1; j <= i__4; ++j) {
  505. vr[j] = 0.;
  506. vi[j] = 0.;
  507. /* L240: */
  508. }
  509. vr[i__] = 1.;
  510. vi[i__] = 1.;
  511. scale = 0.;
  512. vmax = 1.;
  513. vcrit = *bignum;
  514. }
  515. /* L250: */
  516. }
  517. /* Test for sufficient growth in the norm of (VR,VI). */
  518. vnorm = _starpu_dasum_(n, &vr[1], &c__1) + _starpu_dasum_(n, &vi[1], &c__1);
  519. if (vnorm >= growto * scale) {
  520. goto L280;
  521. }
  522. /* Choose a new orthogonal starting vector and try again. */
  523. y = *eps3 / (rootn + 1.);
  524. vr[1] = *eps3;
  525. vi[1] = 0.;
  526. i__3 = *n;
  527. for (i__ = 2; i__ <= i__3; ++i__) {
  528. vr[i__] = y;
  529. vi[i__] = 0.;
  530. /* L260: */
  531. }
  532. vr[*n - its + 1] -= *eps3 * rootn;
  533. /* L270: */
  534. }
  535. /* Failure to find eigenvector in N iterations */
  536. *info = 1;
  537. L280:
  538. /* Normalize eigenvector. */
  539. vnorm = 0.;
  540. i__1 = *n;
  541. for (i__ = 1; i__ <= i__1; ++i__) {
  542. /* Computing MAX */
  543. d__3 = vnorm, d__4 = (d__1 = vr[i__], abs(d__1)) + (d__2 = vi[i__]
  544. , abs(d__2));
  545. vnorm = max(d__3,d__4);
  546. /* L290: */
  547. }
  548. d__1 = 1. / vnorm;
  549. _starpu_dscal_(n, &d__1, &vr[1], &c__1);
  550. d__1 = 1. / vnorm;
  551. _starpu_dscal_(n, &d__1, &vi[1], &c__1);
  552. }
  553. return 0;
  554. /* End of DLAEIN */
  555. } /* _starpu_dlaein_ */