14 typedef long long BLASLONG;
15 typedef unsigned long long BLASULONG;
17 typedef long BLASLONG;
18 typedef unsigned long BLASULONG;
22 typedef BLASLONG blasint;
24 #define blasabs(x) llabs(x)
26 #define blasabs(x) labs(x)
30 #define blasabs(x) abs(x)
33 typedef blasint integer;
35 typedef unsigned int uinteger;
36 typedef char *address;
37 typedef short int shortint;
39 typedef double doublereal;
40 typedef struct { real r, i; } complex;
41 typedef struct { doublereal r, i; } doublecomplex;
43 static inline _Fcomplex Cf(complex *z) {_Fcomplex zz={z->r , z->i}; return zz;}
44 static inline _Dcomplex Cd(doublecomplex *z) {_Dcomplex zz={z->r , z->i};return zz;}
45 static inline _Fcomplex * _pCf(complex *z) {return (_Fcomplex*)z;}
46 static inline _Dcomplex * _pCd(doublecomplex *z) {return (_Dcomplex*)z;}
48 static inline _Complex float Cf(complex *z) {return z->r + z->i*_Complex_I;}
49 static inline _Complex double Cd(doublecomplex *z) {return z->r + z->i*_Complex_I;}
50 static inline _Complex float * _pCf(complex *z) {return (_Complex float*)z;}
51 static inline _Complex double * _pCd(doublecomplex *z) {return (_Complex double*)z;}
53 #define pCf(z) (*_pCf(z))
54 #define pCd(z) (*_pCd(z))
56 typedef short int shortlogical;
57 typedef char logical1;
58 typedef char integer1;
63 /* Extern is for use with -E */
74 /*external read, write*/
83 /*internal read, write*/
113 /*rewind, backspace, endfile*/
125 ftnint *inex; /*parameters in standard's order*/
151 union Multitype { /* for multiple entry points */
162 typedef union Multitype Multitype;
164 struct Vardesc { /* for Namelist */
170 typedef struct Vardesc Vardesc;
177 typedef struct Namelist Namelist;
179 #define abs(x) ((x) >= 0 ? (x) : -(x))
180 #define dabs(x) (fabs(x))
181 #define f2cmin(a,b) ((a) <= (b) ? (a) : (b))
182 #define f2cmax(a,b) ((a) >= (b) ? (a) : (b))
183 #define dmin(a,b) (f2cmin(a,b))
184 #define dmax(a,b) (f2cmax(a,b))
185 #define bit_test(a,b) ((a) >> (b) & 1)
186 #define bit_clear(a,b) ((a) & ~((uinteger)1 << (b)))
187 #define bit_set(a,b) ((a) | ((uinteger)1 << (b)))
189 #define abort_() { sig_die("Fortran abort routine called", 1); }
190 #define c_abs(z) (cabsf(Cf(z)))
191 #define c_cos(R,Z) { pCf(R)=ccos(Cf(Z)); }
193 #define c_div(c, a, b) {Cf(c)._Val[0] = (Cf(a)._Val[0]/Cf(b)._Val[0]); Cf(c)._Val[1]=(Cf(a)._Val[1]/Cf(b)._Val[1]);}
194 #define z_div(c, a, b) {Cd(c)._Val[0] = (Cd(a)._Val[0]/Cd(b)._Val[0]); Cd(c)._Val[1]=(Cd(a)._Val[1]/df(b)._Val[1]);}
196 #define c_div(c, a, b) {pCf(c) = Cf(a)/Cf(b);}
197 #define z_div(c, a, b) {pCd(c) = Cd(a)/Cd(b);}
199 #define c_exp(R, Z) {pCf(R) = cexpf(Cf(Z));}
200 #define c_log(R, Z) {pCf(R) = clogf(Cf(Z));}
201 #define c_sin(R, Z) {pCf(R) = csinf(Cf(Z));}
202 //#define c_sqrt(R, Z) {*(R) = csqrtf(Cf(Z));}
203 #define c_sqrt(R, Z) {pCf(R) = csqrtf(Cf(Z));}
204 #define d_abs(x) (fabs(*(x)))
205 #define d_acos(x) (acos(*(x)))
206 #define d_asin(x) (asin(*(x)))
207 #define d_atan(x) (atan(*(x)))
208 #define d_atn2(x, y) (atan2(*(x),*(y)))
209 #define d_cnjg(R, Z) { pCd(R) = conj(Cd(Z)); }
210 #define r_cnjg(R, Z) { pCf(R) = conjf(Cf(Z)); }
211 #define d_cos(x) (cos(*(x)))
212 #define d_cosh(x) (cosh(*(x)))
213 #define d_dim(__a, __b) ( *(__a) > *(__b) ? *(__a) - *(__b) : 0.0 )
214 #define d_exp(x) (exp(*(x)))
215 #define d_imag(z) (cimag(Cd(z)))
216 #define r_imag(z) (cimagf(Cf(z)))
217 #define d_int(__x) (*(__x)>0 ? floor(*(__x)) : -floor(- *(__x)))
218 #define r_int(__x) (*(__x)>0 ? floor(*(__x)) : -floor(- *(__x)))
219 #define d_lg10(x) ( 0.43429448190325182765 * log(*(x)) )
220 #define r_lg10(x) ( 0.43429448190325182765 * log(*(x)) )
221 #define d_log(x) (log(*(x)))
222 #define d_mod(x, y) (fmod(*(x), *(y)))
223 #define u_nint(__x) ((__x)>=0 ? floor((__x) + .5) : -floor(.5 - (__x)))
224 #define d_nint(x) u_nint(*(x))
225 #define u_sign(__a,__b) ((__b) >= 0 ? ((__a) >= 0 ? (__a) : -(__a)) : -((__a) >= 0 ? (__a) : -(__a)))
226 #define d_sign(a,b) u_sign(*(a),*(b))
227 #define r_sign(a,b) u_sign(*(a),*(b))
228 #define d_sin(x) (sin(*(x)))
229 #define d_sinh(x) (sinh(*(x)))
230 #define d_sqrt(x) (sqrt(*(x)))
231 #define d_tan(x) (tan(*(x)))
232 #define d_tanh(x) (tanh(*(x)))
233 #define i_abs(x) abs(*(x))
234 #define i_dnnt(x) ((integer)u_nint(*(x)))
235 #define i_len(s, n) (n)
236 #define i_nint(x) ((integer)u_nint(*(x)))
237 #define i_sign(a,b) ((integer)u_sign((integer)*(a),(integer)*(b)))
238 #define pow_dd(ap, bp) ( pow(*(ap), *(bp)))
239 #define pow_si(B,E) spow_ui(*(B),*(E))
240 #define pow_ri(B,E) spow_ui(*(B),*(E))
241 #define pow_di(B,E) dpow_ui(*(B),*(E))
242 #define pow_zi(p, a, b) {pCd(p) = zpow_ui(Cd(a), *(b));}
243 #define pow_ci(p, a, b) {pCf(p) = cpow_ui(Cf(a), *(b));}
244 #define pow_zz(R,A,B) {pCd(R) = cpow(Cd(A),*(B));}
245 #define s_cat(lpp, rpp, rnp, np, llp) { ftnlen i, nc, ll; char *f__rp, *lp; ll = (llp); lp = (lpp); for(i=0; i < (int)*(np); ++i) { nc = ll; if((rnp)[i] < nc) nc = (rnp)[i]; ll -= nc; f__rp = (rpp)[i]; while(--nc >= 0) *lp++ = *(f__rp)++; } while(--ll >= 0) *lp++ = ' '; }
246 #define s_cmp(a,b,c,d) ((integer)strncmp((a),(b),f2cmin((c),(d))))
247 #define s_copy(A,B,C,D) { int __i,__m; for (__i=0, __m=f2cmin((C),(D)); __i<__m && (B)[__i] != 0; ++__i) (A)[__i] = (B)[__i]; }
248 #define sig_die(s, kill) { exit(1); }
249 #define s_stop(s, n) {exit(0);}
250 static char junk[] = "\n@(#)LIBF77 VERSION 19990503\n";
251 #define z_abs(z) (cabs(Cd(z)))
252 #define z_exp(R, Z) {pCd(R) = cexp(Cd(Z));}
253 #define z_sqrt(R, Z) {pCd(R) = csqrt(Cd(Z));}
254 #define myexit_() break;
255 #define mycycle() continue;
256 #define myceiling(w) {ceil(w)}
257 #define myhuge(w) {HUGE_VAL}
258 //#define mymaxloc_(w,s,e,n) {if (sizeof(*(w)) == sizeof(double)) dmaxloc_((w),*(s),*(e),n); else dmaxloc_((w),*(s),*(e),n);}
259 #define mymaxloc(w,s,e,n) {dmaxloc_(w,*(s),*(e),n)}
261 /* procedure parameter types for -A and -C++ */
263 #define F2C_proc_par_types 1
265 typedef logical (*L_fp)(...);
267 typedef logical (*L_fp)();
270 static float spow_ui(float x, integer n) {
271 float pow=1.0; unsigned long int u;
273 if(n < 0) n = -n, x = 1/x;
282 static double dpow_ui(double x, integer n) {
283 double pow=1.0; unsigned long int u;
285 if(n < 0) n = -n, x = 1/x;
295 static _Fcomplex cpow_ui(complex x, integer n) {
296 complex pow={1.0,0.0}; unsigned long int u;
298 if(n < 0) n = -n, x.r = 1/x.r, x.i=1/x.i;
300 if(u & 01) pow.r *= x.r, pow.i *= x.i;
301 if(u >>= 1) x.r *= x.r, x.i *= x.i;
305 _Fcomplex p={pow.r, pow.i};
309 static _Complex float cpow_ui(_Complex float x, integer n) {
310 _Complex float pow=1.0; unsigned long int u;
312 if(n < 0) n = -n, x = 1/x;
323 static _Dcomplex zpow_ui(_Dcomplex x, integer n) {
324 _Dcomplex pow={1.0,0.0}; unsigned long int u;
326 if(n < 0) n = -n, x._Val[0] = 1/x._Val[0], x._Val[1] =1/x._Val[1];
328 if(u & 01) pow._Val[0] *= x._Val[0], pow._Val[1] *= x._Val[1];
329 if(u >>= 1) x._Val[0] *= x._Val[0], x._Val[1] *= x._Val[1];
333 _Dcomplex p = {pow._Val[0], pow._Val[1]};
337 static _Complex double zpow_ui(_Complex double x, integer n) {
338 _Complex double pow=1.0; unsigned long int u;
340 if(n < 0) n = -n, x = 1/x;
350 static integer pow_ii(integer x, integer n) {
351 integer pow; unsigned long int u;
353 if (n == 0 || x == 1) pow = 1;
354 else if (x != -1) pow = x == 0 ? 1/x : 0;
357 if ((n > 0) || !(n == 0 || x == 1 || x != -1)) {
367 static integer dmaxloc_(double *w, integer s, integer e, integer *n)
369 double m; integer i, mi;
370 for(m=w[s-1], mi=s, i=s+1; i<=e; i++)
371 if (w[i-1]>m) mi=i ,m=w[i-1];
374 static integer smaxloc_(float *w, integer s, integer e, integer *n)
376 float m; integer i, mi;
377 for(m=w[s-1], mi=s, i=s+1; i<=e; i++)
378 if (w[i-1]>m) mi=i ,m=w[i-1];
381 static inline void cdotc_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) {
382 integer n = *n_, incx = *incx_, incy = *incy_, i;
384 _Fcomplex zdotc = {0.0, 0.0};
385 if (incx == 1 && incy == 1) {
386 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
387 zdotc._Val[0] += conjf(Cf(&x[i]))._Val[0] * Cf(&y[i])._Val[0];
388 zdotc._Val[1] += conjf(Cf(&x[i]))._Val[1] * Cf(&y[i])._Val[1];
391 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
392 zdotc._Val[0] += conjf(Cf(&x[i*incx]))._Val[0] * Cf(&y[i*incy])._Val[0];
393 zdotc._Val[1] += conjf(Cf(&x[i*incx]))._Val[1] * Cf(&y[i*incy])._Val[1];
399 _Complex float zdotc = 0.0;
400 if (incx == 1 && incy == 1) {
401 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
402 zdotc += conjf(Cf(&x[i])) * Cf(&y[i]);
405 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
406 zdotc += conjf(Cf(&x[i*incx])) * Cf(&y[i*incy]);
412 static inline void zdotc_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) {
413 integer n = *n_, incx = *incx_, incy = *incy_, i;
415 _Dcomplex zdotc = {0.0, 0.0};
416 if (incx == 1 && incy == 1) {
417 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
418 zdotc._Val[0] += conj(Cd(&x[i]))._Val[0] * Cd(&y[i])._Val[0];
419 zdotc._Val[1] += conj(Cd(&x[i]))._Val[1] * Cd(&y[i])._Val[1];
422 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
423 zdotc._Val[0] += conj(Cd(&x[i*incx]))._Val[0] * Cd(&y[i*incy])._Val[0];
424 zdotc._Val[1] += conj(Cd(&x[i*incx]))._Val[1] * Cd(&y[i*incy])._Val[1];
430 _Complex double zdotc = 0.0;
431 if (incx == 1 && incy == 1) {
432 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
433 zdotc += conj(Cd(&x[i])) * Cd(&y[i]);
436 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
437 zdotc += conj(Cd(&x[i*incx])) * Cd(&y[i*incy]);
443 static inline void cdotu_(complex *z, integer *n_, complex *x, integer *incx_, complex *y, integer *incy_) {
444 integer n = *n_, incx = *incx_, incy = *incy_, i;
446 _Fcomplex zdotc = {0.0, 0.0};
447 if (incx == 1 && incy == 1) {
448 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
449 zdotc._Val[0] += Cf(&x[i])._Val[0] * Cf(&y[i])._Val[0];
450 zdotc._Val[1] += Cf(&x[i])._Val[1] * Cf(&y[i])._Val[1];
453 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
454 zdotc._Val[0] += Cf(&x[i*incx])._Val[0] * Cf(&y[i*incy])._Val[0];
455 zdotc._Val[1] += Cf(&x[i*incx])._Val[1] * Cf(&y[i*incy])._Val[1];
461 _Complex float zdotc = 0.0;
462 if (incx == 1 && incy == 1) {
463 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
464 zdotc += Cf(&x[i]) * Cf(&y[i]);
467 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
468 zdotc += Cf(&x[i*incx]) * Cf(&y[i*incy]);
474 static inline void zdotu_(doublecomplex *z, integer *n_, doublecomplex *x, integer *incx_, doublecomplex *y, integer *incy_) {
475 integer n = *n_, incx = *incx_, incy = *incy_, i;
477 _Dcomplex zdotc = {0.0, 0.0};
478 if (incx == 1 && incy == 1) {
479 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
480 zdotc._Val[0] += Cd(&x[i])._Val[0] * Cd(&y[i])._Val[0];
481 zdotc._Val[1] += Cd(&x[i])._Val[1] * Cd(&y[i])._Val[1];
484 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
485 zdotc._Val[0] += Cd(&x[i*incx])._Val[0] * Cd(&y[i*incy])._Val[0];
486 zdotc._Val[1] += Cd(&x[i*incx])._Val[1] * Cd(&y[i*incy])._Val[1];
492 _Complex double zdotc = 0.0;
493 if (incx == 1 && incy == 1) {
494 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
495 zdotc += Cd(&x[i]) * Cd(&y[i]);
498 for (i=0;i<n;i++) { /* zdotc = zdotc + dconjg(x(i))* y(i) */
499 zdotc += Cd(&x[i*incx]) * Cd(&y[i*incy]);
505 /* -- translated by f2c (version 20000121).
506 You must link the resulting object file with the libraries:
507 -lf2c -lm (in that order)
513 /* > \brief \b DLAG2 computes the eigenvalues of a 2-by-2 generalized eigenvalue problem, with scaling as nece
514 ssary to avoid over-/underflow. */
516 /* =========== DOCUMENTATION =========== */
518 /* Online html documentation available at */
519 /* http://www.netlib.org/lapack/explore-html/ */
522 /* > Download DLAG2 + dependencies */
523 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlag2.f
526 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlag2.f
529 /* > <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlag2.f
537 /* SUBROUTINE DLAG2( A, LDA, B, LDB, SAFMIN, SCALE1, SCALE2, WR1, */
540 /* INTEGER LDA, LDB */
541 /* DOUBLE PRECISION SAFMIN, SCALE1, SCALE2, WI, WR1, WR2 */
542 /* DOUBLE PRECISION A( LDA, * ), B( LDB, * ) */
545 /* > \par Purpose: */
550 /* > DLAG2 computes the eigenvalues of a 2 x 2 generalized eigenvalue */
551 /* > problem A - w B, with scaling as necessary to avoid over-/underflow. */
553 /* > The scaling factor "s" results in a modified eigenvalue equation */
557 /* > where s is a non-negative scaling factor chosen so that w, w B, */
558 /* > and s A do not overflow and, if possible, do not underflow, either. */
566 /* > A is DOUBLE PRECISION array, dimension (LDA, 2) */
567 /* > On entry, the 2 x 2 matrix A. It is assumed that its 1-norm */
568 /* > is less than 1/SAFMIN. Entries less than */
569 /* > sqrt(SAFMIN)*norm(A) are subject to being treated as zero. */
572 /* > \param[in] LDA */
574 /* > LDA is INTEGER */
575 /* > The leading dimension of the array A. LDA >= 2. */
580 /* > B is DOUBLE PRECISION array, dimension (LDB, 2) */
581 /* > On entry, the 2 x 2 upper triangular matrix B. It is */
582 /* > assumed that the one-norm of B is less than 1/SAFMIN. The */
583 /* > diagonals should be at least sqrt(SAFMIN) times the largest */
584 /* > element of B (in absolute value); if a diagonal is smaller */
585 /* > than that, then +/- sqrt(SAFMIN) will be used instead of */
586 /* > that diagonal. */
589 /* > \param[in] LDB */
591 /* > LDB is INTEGER */
592 /* > The leading dimension of the array B. LDB >= 2. */
595 /* > \param[in] SAFMIN */
597 /* > SAFMIN is DOUBLE PRECISION */
598 /* > The smallest positive number s.t. 1/SAFMIN does not */
599 /* > overflow. (This should always be DLAMCH('S') -- it is an */
600 /* > argument in order to avoid having to call DLAMCH frequently.) */
603 /* > \param[out] SCALE1 */
605 /* > SCALE1 is DOUBLE PRECISION */
606 /* > A scaling factor used to avoid over-/underflow in the */
607 /* > eigenvalue equation which defines the first eigenvalue. If */
608 /* > the eigenvalues are complex, then the eigenvalues are */
609 /* > ( WR1 +/- WI i ) / SCALE1 (which may lie outside the */
610 /* > exponent range of the machine), SCALE1=SCALE2, and SCALE1 */
611 /* > will always be positive. If the eigenvalues are real, then */
612 /* > the first (real) eigenvalue is WR1 / SCALE1 , but this may */
613 /* > overflow or underflow, and in fact, SCALE1 may be zero or */
614 /* > less than the underflow threshold if the exact eigenvalue */
615 /* > is sufficiently large. */
618 /* > \param[out] SCALE2 */
620 /* > SCALE2 is DOUBLE PRECISION */
621 /* > A scaling factor used to avoid over-/underflow in the */
622 /* > eigenvalue equation which defines the second eigenvalue. If */
623 /* > the eigenvalues are complex, then SCALE2=SCALE1. If the */
624 /* > eigenvalues are real, then the second (real) eigenvalue is */
625 /* > WR2 / SCALE2 , but this may overflow or underflow, and in */
626 /* > fact, SCALE2 may be zero or less than the underflow */
627 /* > threshold if the exact eigenvalue is sufficiently large. */
630 /* > \param[out] WR1 */
632 /* > WR1 is DOUBLE PRECISION */
633 /* > If the eigenvalue is real, then WR1 is SCALE1 times the */
634 /* > eigenvalue closest to the (2,2) element of A B**(-1). If the */
635 /* > eigenvalue is complex, then WR1=WR2 is SCALE1 times the real */
636 /* > part of the eigenvalues. */
639 /* > \param[out] WR2 */
641 /* > WR2 is DOUBLE PRECISION */
642 /* > If the eigenvalue is real, then WR2 is SCALE2 times the */
643 /* > other eigenvalue. If the eigenvalue is complex, then */
644 /* > WR1=WR2 is SCALE1 times the real part of the eigenvalues. */
647 /* > \param[out] WI */
649 /* > WI is DOUBLE PRECISION */
650 /* > If the eigenvalue is real, then WI is zero. If the */
651 /* > eigenvalue is complex, then WI is SCALE1 times the imaginary */
652 /* > part of the eigenvalues. WI will always be non-negative. */
658 /* > \author Univ. of Tennessee */
659 /* > \author Univ. of California Berkeley */
660 /* > \author Univ. of Colorado Denver */
661 /* > \author NAG Ltd. */
663 /* > \date June 2016 */
665 /* > \ingroup doubleOTHERauxiliary */
667 /* ===================================================================== */
668 /* Subroutine */ int dlag2_(doublereal *a, integer *lda, doublereal *b,
669 integer *ldb, doublereal *safmin, doublereal *scale1, doublereal *
670 scale2, doublereal *wr1, doublereal *wr2, doublereal *wi)
672 /* System generated locals */
673 integer a_dim1, a_offset, b_dim1, b_offset;
674 doublereal d__1, d__2, d__3, d__4, d__5, d__6;
676 /* Local variables */
677 doublereal diff, bmin, wbig, wabs, wdet, r__, binv11, binv22, discr,
678 anorm, bnorm, bsize, shift, c1, c2, c3, c4, c5, rtmin, rtmax,
679 wsize, s1, s2, a11, a12, a21, a22, b11, b12, b22, ascale, bscale,
680 pp, qq, ss, wscale, safmax, wsmall, as11, as12, as22, sum, abi22;
683 /* -- LAPACK auxiliary routine (version 3.7.0) -- */
684 /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */
685 /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */
689 /* ===================================================================== */
692 /* Parameter adjustments */
694 a_offset = 1 + a_dim1 * 1;
697 b_offset = 1 + b_dim1 * 1;
701 rtmin = sqrt(*safmin);
703 safmax = 1. / *safmin;
708 d__5 = (d__1 = a[a_dim1 + 1], abs(d__1)) + (d__2 = a[a_dim1 + 2], abs(
709 d__2)), d__6 = (d__3 = a[(a_dim1 << 1) + 1], abs(d__3)) + (d__4 =
710 a[(a_dim1 << 1) + 2], abs(d__4)), d__5 = f2cmax(d__5,d__6);
711 anorm = f2cmax(d__5,*safmin);
713 a11 = ascale * a[a_dim1 + 1];
714 a21 = ascale * a[a_dim1 + 2];
715 a12 = ascale * a[(a_dim1 << 1) + 1];
716 a22 = ascale * a[(a_dim1 << 1) + 2];
718 /* Perturb B if necessary to insure non-singularity */
721 b12 = b[(b_dim1 << 1) + 1];
722 b22 = b[(b_dim1 << 1) + 2];
724 d__1 = abs(b11), d__2 = abs(b12), d__1 = f2cmax(d__1,d__2), d__2 = abs(b22),
725 d__1 = f2cmax(d__1,d__2);
726 bmin = rtmin * f2cmax(d__1,rtmin);
727 if (abs(b11) < bmin) {
728 b11 = d_sign(&bmin, &b11);
730 if (abs(b22) < bmin) {
731 b22 = d_sign(&bmin, &b22);
737 d__1 = abs(b11), d__2 = abs(b12) + abs(b22), d__1 = f2cmax(d__1,d__2);
738 bnorm = f2cmax(d__1,*safmin);
740 d__1 = abs(b11), d__2 = abs(b22);
741 bsize = f2cmax(d__1,d__2);
747 /* Compute larger eigenvalue by method described by C. van Loan */
749 /* ( AS is A shifted by -SHIFT*B ) */
755 if (abs(s1) <= abs(s2)) {
756 as12 = a12 - s1 * b12;
757 as22 = a22 - s1 * b22;
758 ss = a21 * (binv11 * binv22);
759 abi22 = as22 * binv22 - ss * b12;
763 as12 = a12 - s2 * b12;
764 as11 = a11 - s2 * b11;
765 ss = a21 * (binv11 * binv22);
767 pp = (as11 * binv11 + abi22) * .5;
771 if ((d__1 = pp * rtmin, abs(d__1)) >= 1.) {
772 /* Computing 2nd power */
774 discr = d__1 * d__1 + qq * *safmin;
775 r__ = sqrt((abs(discr))) * rtmax;
777 /* Computing 2nd power */
779 if (d__1 * d__1 + abs(qq) <= *safmin) {
780 /* Computing 2nd power */
782 discr = d__1 * d__1 + qq * safmax;
783 r__ = sqrt((abs(discr))) * rtmin;
785 /* Computing 2nd power */
787 discr = d__1 * d__1 + qq;
788 r__ = sqrt((abs(discr)));
792 /* Note: the test of R in the following IF is to cover the case when */
793 /* DISCR is small and negative and is flushed to zero during */
794 /* the calculation of R. On machines which have a consistent */
795 /* flush-to-zero threshold and handle numbers above that */
796 /* threshold correctly, it would not be necessary. */
798 if (discr >= 0. || r__ == 0.) {
799 sum = pp + d_sign(&r__, &pp);
800 diff = pp - d_sign(&r__, &pp);
803 /* Compute smaller eigenvalue */
805 wsmall = shift + diff;
808 if (abs(wbig) * .5 > f2cmax(d__1,*safmin)) {
809 wdet = (a11 * a22 - a12 * a21) * (binv11 * binv22);
810 wsmall = wdet / wbig;
813 /* Choose (real) eigenvalue closest to 2,2 element of A*B**(-1) */
817 *wr1 = f2cmin(wbig,wsmall);
818 *wr2 = f2cmax(wbig,wsmall);
820 *wr1 = f2cmax(wbig,wsmall);
821 *wr2 = f2cmin(wbig,wsmall);
826 /* Complex eigenvalues */
833 /* Further scaling to avoid underflow and overflow in computing */
834 /* SCALE1 and overflow in computing w*B. */
836 /* This scale factor (WSCALE) is bounded from above using C1 and C2, */
837 /* and from below using C3 and C4. */
838 /* C1 implements the condition s A must never overflow. */
839 /* C2 implements the condition w B must never overflow. */
841 /* implement the condition that s A - w B must never overflow. */
842 /* C4 implements the condition s should not underflow. */
843 /* C5 implements the condition f2cmax(s,|w|) should be at least 2. */
845 c1 = bsize * (*safmin * f2cmax(1.,ascale));
846 c2 = *safmin * f2cmax(1.,bnorm);
847 c3 = bsize * *safmin;
848 if (ascale <= 1. && bsize <= 1.) {
850 d__1 = 1., d__2 = ascale / *safmin * bsize;
851 c4 = f2cmin(d__1,d__2);
855 if (ascale <= 1. || bsize <= 1.) {
857 d__1 = 1., d__2 = ascale * bsize;
858 c5 = f2cmin(d__1,d__2);
863 /* Scale first eigenvalue */
865 wabs = abs(*wr1) + abs(*wi);
868 d__3 = c4, d__4 = f2cmax(wabs,c5) * .5;
869 d__1 = f2cmax(*safmin,c1), d__2 = (wabs * c2 + c3) * 1.0000100000000001,
870 d__1 = f2cmax(d__1,d__2), d__2 = f2cmin(d__3,d__4);
871 wsize = f2cmax(d__1,d__2);
875 *scale1 = f2cmax(ascale,bsize) * wscale * f2cmin(ascale,bsize);
877 *scale1 = f2cmin(ascale,bsize) * wscale * f2cmax(ascale,bsize);
886 *scale1 = ascale * bsize;
890 /* Scale second eigenvalue (if real) */
897 d__3 = c4, d__4 = f2cmax(d__5,c5) * .5;
898 d__1 = f2cmax(*safmin,c1), d__2 = (abs(*wr2) * c2 + c3) *
899 1.0000100000000001, d__1 = f2cmax(d__1,d__2), d__2 = f2cmin(d__3,
901 wsize = f2cmax(d__1,d__2);
905 *scale2 = f2cmax(ascale,bsize) * wscale * f2cmin(ascale,bsize);
907 *scale2 = f2cmin(ascale,bsize) * wscale * f2cmax(ascale,bsize);
911 *scale2 = ascale * bsize;