dgegs.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549
  1. /* dgegs.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. static integer c_n1 = -1;
  16. static doublereal c_b36 = 0.;
  17. static doublereal c_b37 = 1.;
  18. /* Subroutine */ int _starpu_dgegs_(char *jobvsl, char *jobvsr, integer *n,
  19. doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal *
  20. alphar, doublereal *alphai, doublereal *beta, doublereal *vsl,
  21. integer *ldvsl, doublereal *vsr, integer *ldvsr, doublereal *work,
  22. integer *lwork, integer *info)
  23. {
  24. /* System generated locals */
  25. integer a_dim1, a_offset, b_dim1, b_offset, vsl_dim1, vsl_offset,
  26. vsr_dim1, vsr_offset, i__1, i__2;
  27. /* Local variables */
  28. integer nb, nb1, nb2, nb3, ihi, ilo;
  29. doublereal eps, anrm, bnrm;
  30. integer itau, lopt;
  31. extern logical _starpu_lsame_(char *, char *);
  32. integer ileft, iinfo, icols;
  33. logical ilvsl;
  34. integer iwork;
  35. logical ilvsr;
  36. integer irows;
  37. extern /* Subroutine */ int _starpu_dggbak_(char *, char *, integer *, integer *,
  38. integer *, doublereal *, doublereal *, integer *, doublereal *,
  39. integer *, integer *), _starpu_dggbal_(char *, integer *,
  40. doublereal *, integer *, doublereal *, integer *, integer *,
  41. integer *, doublereal *, doublereal *, doublereal *, integer *);
  42. extern doublereal _starpu_dlamch_(char *), _starpu_dlange_(char *, integer *,
  43. integer *, doublereal *, integer *, doublereal *);
  44. extern /* Subroutine */ int _starpu_dgghrd_(char *, char *, integer *, integer *,
  45. integer *, doublereal *, integer *, doublereal *, integer *,
  46. doublereal *, integer *, doublereal *, integer *, integer *), _starpu_dlascl_(char *, integer *, integer *, doublereal
  47. *, doublereal *, integer *, integer *, doublereal *, integer *,
  48. integer *);
  49. logical ilascl, ilbscl;
  50. extern /* Subroutine */ int _starpu_dgeqrf_(integer *, integer *, doublereal *,
  51. integer *, doublereal *, doublereal *, integer *, integer *),
  52. _starpu_dlacpy_(char *, integer *, integer *, doublereal *, integer *,
  53. doublereal *, integer *);
  54. doublereal safmin;
  55. extern /* Subroutine */ int _starpu_dlaset_(char *, integer *, integer *,
  56. doublereal *, doublereal *, doublereal *, integer *),
  57. _starpu_xerbla_(char *, integer *);
  58. extern integer _starpu_ilaenv_(integer *, char *, char *, integer *, integer *,
  59. integer *, integer *);
  60. doublereal bignum;
  61. extern /* Subroutine */ int _starpu_dhgeqz_(char *, char *, char *, integer *,
  62. integer *, integer *, doublereal *, integer *, doublereal *,
  63. integer *, doublereal *, doublereal *, doublereal *, doublereal *,
  64. integer *, doublereal *, integer *, doublereal *, integer *,
  65. integer *);
  66. integer ijobvl, iright, ijobvr;
  67. extern /* Subroutine */ int _starpu_dorgqr_(integer *, integer *, integer *,
  68. doublereal *, integer *, doublereal *, doublereal *, integer *,
  69. integer *);
  70. doublereal anrmto;
  71. integer lwkmin;
  72. doublereal bnrmto;
  73. extern /* Subroutine */ int _starpu_dormqr_(char *, char *, integer *, integer *,
  74. integer *, doublereal *, integer *, doublereal *, doublereal *,
  75. integer *, doublereal *, integer *, integer *);
  76. doublereal smlnum;
  77. integer lwkopt;
  78. logical lquery;
  79. /* -- LAPACK driver routine (version 3.2) -- */
  80. /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */
  81. /* November 2006 */
  82. /* .. Scalar Arguments .. */
  83. /* .. */
  84. /* .. Array Arguments .. */
  85. /* .. */
  86. /* Purpose */
  87. /* ======= */
  88. /* This routine is deprecated and has been replaced by routine DGGES. */
  89. /* DGEGS computes the eigenvalues, real Schur form, and, optionally, */
  90. /* left and or/right Schur vectors of a real matrix pair (A,B). */
  91. /* Given two square matrices A and B, the generalized real Schur */
  92. /* factorization has the form */
  93. /* A = Q*S*Z**T, B = Q*T*Z**T */
  94. /* where Q and Z are orthogonal matrices, T is upper triangular, and S */
  95. /* is an upper quasi-triangular matrix with 1-by-1 and 2-by-2 diagonal */
  96. /* blocks, the 2-by-2 blocks corresponding to complex conjugate pairs */
  97. /* of eigenvalues of (A,B). The columns of Q are the left Schur vectors */
  98. /* and the columns of Z are the right Schur vectors. */
  99. /* If only the eigenvalues of (A,B) are needed, the driver routine */
  100. /* DGEGV should be used instead. See DGEGV for a description of the */
  101. /* eigenvalues of the generalized nonsymmetric eigenvalue problem */
  102. /* (GNEP). */
  103. /* Arguments */
  104. /* ========= */
  105. /* JOBVSL (input) CHARACTER*1 */
  106. /* = 'N': do not compute the left Schur vectors; */
  107. /* = 'V': compute the left Schur vectors (returned in VSL). */
  108. /* JOBVSR (input) CHARACTER*1 */
  109. /* = 'N': do not compute the right Schur vectors; */
  110. /* = 'V': compute the right Schur vectors (returned in VSR). */
  111. /* N (input) INTEGER */
  112. /* The order of the matrices A, B, VSL, and VSR. N >= 0. */
  113. /* A (input/output) DOUBLE PRECISION array, dimension (LDA, N) */
  114. /* On entry, the matrix A. */
  115. /* On exit, the upper quasi-triangular matrix S from the */
  116. /* generalized real Schur factorization. */
  117. /* LDA (input) INTEGER */
  118. /* The leading dimension of A. LDA >= max(1,N). */
  119. /* B (input/output) DOUBLE PRECISION array, dimension (LDB, N) */
  120. /* On entry, the matrix B. */
  121. /* On exit, the upper triangular matrix T from the generalized */
  122. /* real Schur factorization. */
  123. /* LDB (input) INTEGER */
  124. /* The leading dimension of B. LDB >= max(1,N). */
  125. /* ALPHAR (output) DOUBLE PRECISION array, dimension (N) */
  126. /* The real parts of each scalar alpha defining an eigenvalue */
  127. /* of GNEP. */
  128. /* ALPHAI (output) DOUBLE PRECISION array, dimension (N) */
  129. /* The imaginary parts of each scalar alpha defining an */
  130. /* eigenvalue of GNEP. If ALPHAI(j) is zero, then the j-th */
  131. /* eigenvalue is real; if positive, then the j-th and (j+1)-st */
  132. /* eigenvalues are a complex conjugate pair, with */
  133. /* ALPHAI(j+1) = -ALPHAI(j). */
  134. /* BETA (output) DOUBLE PRECISION array, dimension (N) */
  135. /* The scalars beta that define the eigenvalues of GNEP. */
  136. /* Together, the quantities alpha = (ALPHAR(j),ALPHAI(j)) and */
  137. /* beta = BETA(j) represent the j-th eigenvalue of the matrix */
  138. /* pair (A,B), in one of the forms lambda = alpha/beta or */
  139. /* mu = beta/alpha. Since either lambda or mu may overflow, */
  140. /* they should not, in general, be computed. */
  141. /* VSL (output) DOUBLE PRECISION array, dimension (LDVSL,N) */
  142. /* If JOBVSL = 'V', the matrix of left Schur vectors Q. */
  143. /* Not referenced if JOBVSL = 'N'. */
  144. /* LDVSL (input) INTEGER */
  145. /* The leading dimension of the matrix VSL. LDVSL >=1, and */
  146. /* if JOBVSL = 'V', LDVSL >= N. */
  147. /* VSR (output) DOUBLE PRECISION array, dimension (LDVSR,N) */
  148. /* If JOBVSR = 'V', the matrix of right Schur vectors Z. */
  149. /* Not referenced if JOBVSR = 'N'. */
  150. /* LDVSR (input) INTEGER */
  151. /* The leading dimension of the matrix VSR. LDVSR >= 1, and */
  152. /* if JOBVSR = 'V', LDVSR >= N. */
  153. /* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) */
  154. /* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. */
  155. /* LWORK (input) INTEGER */
  156. /* The dimension of the array WORK. LWORK >= max(1,4*N). */
  157. /* For good performance, LWORK must generally be larger. */
  158. /* To compute the optimal value of LWORK, call ILAENV to get */
  159. /* blocksizes (for DGEQRF, DORMQR, and DORGQR.) Then compute: */
  160. /* NB -- MAX of the blocksizes for DGEQRF, DORMQR, and DORGQR */
  161. /* The optimal LWORK is 2*N + N*(NB+1). */
  162. /* If LWORK = -1, then a workspace query is assumed; the routine */
  163. /* only calculates the optimal size of the WORK array, returns */
  164. /* this value as the first entry of the WORK array, and no error */
  165. /* message related to LWORK is issued by XERBLA. */
  166. /* INFO (output) INTEGER */
  167. /* = 0: successful exit */
  168. /* < 0: if INFO = -i, the i-th argument had an illegal value. */
  169. /* = 1,...,N: */
  170. /* The QZ iteration failed. (A,B) are not in Schur */
  171. /* form, but ALPHAR(j), ALPHAI(j), and BETA(j) should */
  172. /* be correct for j=INFO+1,...,N. */
  173. /* > N: errors that usually indicate LAPACK problems: */
  174. /* =N+1: error return from DGGBAL */
  175. /* =N+2: error return from DGEQRF */
  176. /* =N+3: error return from DORMQR */
  177. /* =N+4: error return from DORGQR */
  178. /* =N+5: error return from DGGHRD */
  179. /* =N+6: error return from DHGEQZ (other than failed */
  180. /* iteration) */
  181. /* =N+7: error return from DGGBAK (computing VSL) */
  182. /* =N+8: error return from DGGBAK (computing VSR) */
  183. /* =N+9: error return from DLASCL (various places) */
  184. /* ===================================================================== */
  185. /* .. Parameters .. */
  186. /* .. */
  187. /* .. Local Scalars .. */
  188. /* .. */
  189. /* .. External Subroutines .. */
  190. /* .. */
  191. /* .. External Functions .. */
  192. /* .. */
  193. /* .. Intrinsic Functions .. */
  194. /* .. */
  195. /* .. Executable Statements .. */
  196. /* Decode the input arguments */
  197. /* Parameter adjustments */
  198. a_dim1 = *lda;
  199. a_offset = 1 + a_dim1;
  200. a -= a_offset;
  201. b_dim1 = *ldb;
  202. b_offset = 1 + b_dim1;
  203. b -= b_offset;
  204. --alphar;
  205. --alphai;
  206. --beta;
  207. vsl_dim1 = *ldvsl;
  208. vsl_offset = 1 + vsl_dim1;
  209. vsl -= vsl_offset;
  210. vsr_dim1 = *ldvsr;
  211. vsr_offset = 1 + vsr_dim1;
  212. vsr -= vsr_offset;
  213. --work;
  214. /* Function Body */
  215. if (_starpu_lsame_(jobvsl, "N")) {
  216. ijobvl = 1;
  217. ilvsl = FALSE_;
  218. } else if (_starpu_lsame_(jobvsl, "V")) {
  219. ijobvl = 2;
  220. ilvsl = TRUE_;
  221. } else {
  222. ijobvl = -1;
  223. ilvsl = FALSE_;
  224. }
  225. if (_starpu_lsame_(jobvsr, "N")) {
  226. ijobvr = 1;
  227. ilvsr = FALSE_;
  228. } else if (_starpu_lsame_(jobvsr, "V")) {
  229. ijobvr = 2;
  230. ilvsr = TRUE_;
  231. } else {
  232. ijobvr = -1;
  233. ilvsr = FALSE_;
  234. }
  235. /* Test the input arguments */
  236. /* Computing MAX */
  237. i__1 = *n << 2;
  238. lwkmin = max(i__1,1);
  239. lwkopt = lwkmin;
  240. work[1] = (doublereal) lwkopt;
  241. lquery = *lwork == -1;
  242. *info = 0;
  243. if (ijobvl <= 0) {
  244. *info = -1;
  245. } else if (ijobvr <= 0) {
  246. *info = -2;
  247. } else if (*n < 0) {
  248. *info = -3;
  249. } else if (*lda < max(1,*n)) {
  250. *info = -5;
  251. } else if (*ldb < max(1,*n)) {
  252. *info = -7;
  253. } else if (*ldvsl < 1 || ilvsl && *ldvsl < *n) {
  254. *info = -12;
  255. } else if (*ldvsr < 1 || ilvsr && *ldvsr < *n) {
  256. *info = -14;
  257. } else if (*lwork < lwkmin && ! lquery) {
  258. *info = -16;
  259. }
  260. if (*info == 0) {
  261. nb1 = _starpu_ilaenv_(&c__1, "DGEQRF", " ", n, n, &c_n1, &c_n1);
  262. nb2 = _starpu_ilaenv_(&c__1, "DORMQR", " ", n, n, n, &c_n1);
  263. nb3 = _starpu_ilaenv_(&c__1, "DORGQR", " ", n, n, n, &c_n1);
  264. /* Computing MAX */
  265. i__1 = max(nb1,nb2);
  266. nb = max(i__1,nb3);
  267. lopt = (*n << 1) + *n * (nb + 1);
  268. work[1] = (doublereal) lopt;
  269. }
  270. if (*info != 0) {
  271. i__1 = -(*info);
  272. _starpu_xerbla_("DGEGS ", &i__1);
  273. return 0;
  274. } else if (lquery) {
  275. return 0;
  276. }
  277. /* Quick return if possible */
  278. if (*n == 0) {
  279. return 0;
  280. }
  281. /* Get machine constants */
  282. eps = _starpu_dlamch_("E") * _starpu_dlamch_("B");
  283. safmin = _starpu_dlamch_("S");
  284. smlnum = *n * safmin / eps;
  285. bignum = 1. / smlnum;
  286. /* Scale A if max element outside range [SMLNUM,BIGNUM] */
  287. anrm = _starpu_dlange_("M", n, n, &a[a_offset], lda, &work[1]);
  288. ilascl = FALSE_;
  289. if (anrm > 0. && anrm < smlnum) {
  290. anrmto = smlnum;
  291. ilascl = TRUE_;
  292. } else if (anrm > bignum) {
  293. anrmto = bignum;
  294. ilascl = TRUE_;
  295. }
  296. if (ilascl) {
  297. _starpu_dlascl_("G", &c_n1, &c_n1, &anrm, &anrmto, n, n, &a[a_offset], lda, &
  298. iinfo);
  299. if (iinfo != 0) {
  300. *info = *n + 9;
  301. return 0;
  302. }
  303. }
  304. /* Scale B if max element outside range [SMLNUM,BIGNUM] */
  305. bnrm = _starpu_dlange_("M", n, n, &b[b_offset], ldb, &work[1]);
  306. ilbscl = FALSE_;
  307. if (bnrm > 0. && bnrm < smlnum) {
  308. bnrmto = smlnum;
  309. ilbscl = TRUE_;
  310. } else if (bnrm > bignum) {
  311. bnrmto = bignum;
  312. ilbscl = TRUE_;
  313. }
  314. if (ilbscl) {
  315. _starpu_dlascl_("G", &c_n1, &c_n1, &bnrm, &bnrmto, n, n, &b[b_offset], ldb, &
  316. iinfo);
  317. if (iinfo != 0) {
  318. *info = *n + 9;
  319. return 0;
  320. }
  321. }
  322. /* Permute the matrix to make it more nearly triangular */
  323. /* Workspace layout: (2*N words -- "work..." not actually used) */
  324. /* left_permutation, right_permutation, work... */
  325. ileft = 1;
  326. iright = *n + 1;
  327. iwork = iright + *n;
  328. _starpu_dggbal_("P", n, &a[a_offset], lda, &b[b_offset], ldb, &ilo, &ihi, &work[
  329. ileft], &work[iright], &work[iwork], &iinfo);
  330. if (iinfo != 0) {
  331. *info = *n + 1;
  332. goto L10;
  333. }
  334. /* Reduce B to triangular form, and initialize VSL and/or VSR */
  335. /* Workspace layout: ("work..." must have at least N words) */
  336. /* left_permutation, right_permutation, tau, work... */
  337. irows = ihi + 1 - ilo;
  338. icols = *n + 1 - ilo;
  339. itau = iwork;
  340. iwork = itau + irows;
  341. i__1 = *lwork + 1 - iwork;
  342. _starpu_dgeqrf_(&irows, &icols, &b[ilo + ilo * b_dim1], ldb, &work[itau], &work[
  343. iwork], &i__1, &iinfo);
  344. if (iinfo >= 0) {
  345. /* Computing MAX */
  346. i__1 = lwkopt, i__2 = (integer) work[iwork] + iwork - 1;
  347. lwkopt = max(i__1,i__2);
  348. }
  349. if (iinfo != 0) {
  350. *info = *n + 2;
  351. goto L10;
  352. }
  353. i__1 = *lwork + 1 - iwork;
  354. _starpu_dormqr_("L", "T", &irows, &icols, &irows, &b[ilo + ilo * b_dim1], ldb, &
  355. work[itau], &a[ilo + ilo * a_dim1], lda, &work[iwork], &i__1, &
  356. iinfo);
  357. if (iinfo >= 0) {
  358. /* Computing MAX */
  359. i__1 = lwkopt, i__2 = (integer) work[iwork] + iwork - 1;
  360. lwkopt = max(i__1,i__2);
  361. }
  362. if (iinfo != 0) {
  363. *info = *n + 3;
  364. goto L10;
  365. }
  366. if (ilvsl) {
  367. _starpu_dlaset_("Full", n, n, &c_b36, &c_b37, &vsl[vsl_offset], ldvsl);
  368. i__1 = irows - 1;
  369. i__2 = irows - 1;
  370. _starpu_dlacpy_("L", &i__1, &i__2, &b[ilo + 1 + ilo * b_dim1], ldb, &vsl[ilo
  371. + 1 + ilo * vsl_dim1], ldvsl);
  372. i__1 = *lwork + 1 - iwork;
  373. _starpu_dorgqr_(&irows, &irows, &irows, &vsl[ilo + ilo * vsl_dim1], ldvsl, &
  374. work[itau], &work[iwork], &i__1, &iinfo);
  375. if (iinfo >= 0) {
  376. /* Computing MAX */
  377. i__1 = lwkopt, i__2 = (integer) work[iwork] + iwork - 1;
  378. lwkopt = max(i__1,i__2);
  379. }
  380. if (iinfo != 0) {
  381. *info = *n + 4;
  382. goto L10;
  383. }
  384. }
  385. if (ilvsr) {
  386. _starpu_dlaset_("Full", n, n, &c_b36, &c_b37, &vsr[vsr_offset], ldvsr);
  387. }
  388. /* Reduce to generalized Hessenberg form */
  389. _starpu_dgghrd_(jobvsl, jobvsr, n, &ilo, &ihi, &a[a_offset], lda, &b[b_offset],
  390. ldb, &vsl[vsl_offset], ldvsl, &vsr[vsr_offset], ldvsr, &iinfo);
  391. if (iinfo != 0) {
  392. *info = *n + 5;
  393. goto L10;
  394. }
  395. /* Perform QZ algorithm, computing Schur vectors if desired */
  396. /* Workspace layout: ("work..." must have at least 1 word) */
  397. /* left_permutation, right_permutation, work... */
  398. iwork = itau;
  399. i__1 = *lwork + 1 - iwork;
  400. _starpu_dhgeqz_("S", jobvsl, jobvsr, n, &ilo, &ihi, &a[a_offset], lda, &b[
  401. b_offset], ldb, &alphar[1], &alphai[1], &beta[1], &vsl[vsl_offset]
  402. , ldvsl, &vsr[vsr_offset], ldvsr, &work[iwork], &i__1, &iinfo);
  403. if (iinfo >= 0) {
  404. /* Computing MAX */
  405. i__1 = lwkopt, i__2 = (integer) work[iwork] + iwork - 1;
  406. lwkopt = max(i__1,i__2);
  407. }
  408. if (iinfo != 0) {
  409. if (iinfo > 0 && iinfo <= *n) {
  410. *info = iinfo;
  411. } else if (iinfo > *n && iinfo <= *n << 1) {
  412. *info = iinfo - *n;
  413. } else {
  414. *info = *n + 6;
  415. }
  416. goto L10;
  417. }
  418. /* Apply permutation to VSL and VSR */
  419. if (ilvsl) {
  420. _starpu_dggbak_("P", "L", n, &ilo, &ihi, &work[ileft], &work[iright], n, &vsl[
  421. vsl_offset], ldvsl, &iinfo);
  422. if (iinfo != 0) {
  423. *info = *n + 7;
  424. goto L10;
  425. }
  426. }
  427. if (ilvsr) {
  428. _starpu_dggbak_("P", "R", n, &ilo, &ihi, &work[ileft], &work[iright], n, &vsr[
  429. vsr_offset], ldvsr, &iinfo);
  430. if (iinfo != 0) {
  431. *info = *n + 8;
  432. goto L10;
  433. }
  434. }
  435. /* Undo scaling */
  436. if (ilascl) {
  437. _starpu_dlascl_("H", &c_n1, &c_n1, &anrmto, &anrm, n, n, &a[a_offset], lda, &
  438. iinfo);
  439. if (iinfo != 0) {
  440. *info = *n + 9;
  441. return 0;
  442. }
  443. _starpu_dlascl_("G", &c_n1, &c_n1, &anrmto, &anrm, n, &c__1, &alphar[1], n, &
  444. iinfo);
  445. if (iinfo != 0) {
  446. *info = *n + 9;
  447. return 0;
  448. }
  449. _starpu_dlascl_("G", &c_n1, &c_n1, &anrmto, &anrm, n, &c__1, &alphai[1], n, &
  450. iinfo);
  451. if (iinfo != 0) {
  452. *info = *n + 9;
  453. return 0;
  454. }
  455. }
  456. if (ilbscl) {
  457. _starpu_dlascl_("U", &c_n1, &c_n1, &bnrmto, &bnrm, n, n, &b[b_offset], ldb, &
  458. iinfo);
  459. if (iinfo != 0) {
  460. *info = *n + 9;
  461. return 0;
  462. }
  463. _starpu_dlascl_("G", &c_n1, &c_n1, &bnrmto, &bnrm, n, &c__1, &beta[1], n, &
  464. iinfo);
  465. if (iinfo != 0) {
  466. *info = *n + 9;
  467. return 0;
  468. }
  469. }
  470. L10:
  471. work[1] = (doublereal) lwkopt;
  472. return 0;
  473. /* End of DGEGS */
  474. } /* _starpu_dgegs_ */