kusano 7d535a
#include "f2c.h"
kusano 7d535a
kusano 7d535a
/* Subroutine */ int zlartg_(doublecomplex *f, doublecomplex *g, doublereal *
kusano 7d535a
	cs, doublecomplex *sn, doublecomplex *r)
kusano 7d535a
{
kusano 7d535a
/*  -- LAPACK auxiliary routine (version 2.0) --   
kusano 7d535a
       Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,   
kusano 7d535a
       Courant Institute, Argonne National Lab, and Rice University   
kusano 7d535a
       September 30, 1994   
kusano 7d535a
kusano 7d535a
kusano 7d535a
    Purpose   
kusano 7d535a
    =======   
kusano 7d535a
kusano 7d535a
    ZLARTG generates a plane rotation so that   
kusano 7d535a
kusano 7d535a
       [  CS  SN  ]     [ F ]     [ R ]   
kusano 7d535a
       [  __      ]  .  [   ]  =  [   ]   where CS**2 + |SN|**2 = 1.   
kusano 7d535a
       [ -SN  CS  ]     [ G ]     [ 0 ]   
kusano 7d535a
kusano 7d535a
    This is a faster version of the BLAS1 routine ZROTG, except for   
kusano 7d535a
    the following differences:   
kusano 7d535a
       F and G are unchanged on return.   
kusano 7d535a
       If G=0, then CS=1 and SN=0.   
kusano 7d535a
       If F=0 and (G .ne. 0), then CS=0 and SN=1 without doing any   
kusano 7d535a
          floating point operations.   
kusano 7d535a
kusano 7d535a
    Arguments   
kusano 7d535a
    =========   
kusano 7d535a
kusano 7d535a
    F       (input) COMPLEX*16   
kusano 7d535a
            The first component of vector to be rotated.   
kusano 7d535a
kusano 7d535a
    G       (input) COMPLEX*16   
kusano 7d535a
            The second component of vector to be rotated.   
kusano 7d535a
kusano 7d535a
    CS      (output) DOUBLE PRECISION   
kusano 7d535a
            The cosine of the rotation.   
kusano 7d535a
kusano 7d535a
    SN      (output) COMPLEX*16   
kusano 7d535a
            The sine of the rotation.   
kusano 7d535a
kusano 7d535a
    R       (output) COMPLEX*16   
kusano 7d535a
            The nonzero component of the rotated vector.   
kusano 7d535a
kusano 7d535a
    ===================================================================== 
kusano 7d535a
  
kusano 7d535a
kusano 7d535a
kusano 7d535a
       [ 25 or 38 ops for main paths ] */
kusano 7d535a
    /* System generated locals */
kusano 7d535a
    doublereal d__1, d__2;
kusano 7d535a
    doublecomplex z__1, z__2, z__3;
kusano 7d535a
    /* Builtin functions */
kusano 7d535a
    void d_cnjg(doublecomplex *, doublecomplex *);
kusano 7d535a
    double z_abs(doublecomplex *), d_imag(doublecomplex *), sqrt(doublereal);
kusano 7d535a
    /* Local variables */
kusano 7d535a
    static doublereal d, f1, f2, g1, g2, fa, ga, di;
kusano 7d535a
    static doublecomplex fs, gs, ss;
kusano 7d535a
kusano 7d535a
kusano 7d535a
    if (g->r == 0. && g->i == 0.) {
kusano 7d535a
	*cs = 1.;
kusano 7d535a
	sn->r = 0., sn->i = 0.;
kusano 7d535a
	r->r = f->r, r->i = f->i;
kusano 7d535a
    } else if (f->r == 0. && f->i == 0.) {
kusano 7d535a
	*cs = 0.;
kusano 7d535a
kusano 7d535a
	d_cnjg(&z__2, g);
kusano 7d535a
	d__1 = z_abs(g);
kusano 7d535a
	z__1.r = z__2.r / d__1, z__1.i = z__2.i / d__1;
kusano 7d535a
	sn->r = z__1.r, sn->i = z__1.i;
kusano 7d535a
	d__1 = z_abs(g);
kusano 7d535a
	r->r = d__1, r->i = 0.;
kusano 7d535a
kusano 7d535a
/*         SN = ONE   
kusano 7d535a
           R = G */
kusano 7d535a
kusano 7d535a
    } else {
kusano 7d535a
	f1 = (d__1 = f->r, abs(d__1)) + (d__2 = d_imag(f), abs(d__2));
kusano 7d535a
	g1 = (d__1 = g->r, abs(d__1)) + (d__2 = d_imag(g), abs(d__2));
kusano 7d535a
	if (f1 >= g1) {
kusano 7d535a
	    z__1.r = g->r / f1, z__1.i = g->i / f1;
kusano 7d535a
	    gs.r = z__1.r, gs.i = z__1.i;
kusano 7d535a
/* Computing 2nd power */
kusano 7d535a
	    d__1 = gs.r;
kusano 7d535a
/* Computing 2nd power */
kusano 7d535a
	    d__2 = d_imag(&gs);
kusano 7d535a
	    g2 = d__1 * d__1 + d__2 * d__2;
kusano 7d535a
	    z__1.r = f->r / f1, z__1.i = f->i / f1;
kusano 7d535a
	    fs.r = z__1.r, fs.i = z__1.i;
kusano 7d535a
/* Computing 2nd power */
kusano 7d535a
	    d__1 = fs.r;
kusano 7d535a
/* Computing 2nd power */
kusano 7d535a
	    d__2 = d_imag(&fs);
kusano 7d535a
	    f2 = d__1 * d__1 + d__2 * d__2;
kusano 7d535a
	    d = sqrt(g2 / f2 + 1.);
kusano 7d535a
	    *cs = 1. / d;
kusano 7d535a
	    d_cnjg(&z__3, &gs);
kusano 7d535a
	    z__2.r = z__3.r * fs.r - z__3.i * fs.i, z__2.i = z__3.r * fs.i + 
kusano 7d535a
		    z__3.i * fs.r;
kusano 7d535a
	    d__1 = *cs / f2;
kusano 7d535a
	    z__1.r = d__1 * z__2.r, z__1.i = d__1 * z__2.i;
kusano 7d535a
	    sn->r = z__1.r, sn->i = z__1.i;
kusano 7d535a
	    z__1.r = d * f->r, z__1.i = d * f->i;
kusano 7d535a
	    r->r = z__1.r, r->i = z__1.i;
kusano 7d535a
	} else {
kusano 7d535a
	    z__1.r = f->r / g1, z__1.i = f->i / g1;
kusano 7d535a
	    fs.r = z__1.r, fs.i = z__1.i;
kusano 7d535a
/* Computing 2nd power */
kusano 7d535a
	    d__1 = fs.r;
kusano 7d535a
/* Computing 2nd power */
kusano 7d535a
	    d__2 = d_imag(&fs);
kusano 7d535a
	    f2 = d__1 * d__1 + d__2 * d__2;
kusano 7d535a
	    fa = sqrt(f2);
kusano 7d535a
	    z__1.r = g->r / g1, z__1.i = g->i / g1;
kusano 7d535a
	    gs.r = z__1.r, gs.i = z__1.i;
kusano 7d535a
/* Computing 2nd power */
kusano 7d535a
	    d__1 = gs.r;
kusano 7d535a
/* Computing 2nd power */
kusano 7d535a
	    d__2 = d_imag(&gs);
kusano 7d535a
	    g2 = d__1 * d__1 + d__2 * d__2;
kusano 7d535a
	    ga = sqrt(g2);
kusano 7d535a
	    d = sqrt(f2 / g2 + 1.);
kusano 7d535a
	    di = 1. / d;
kusano 7d535a
	    *cs = fa / ga * di;
kusano 7d535a
	    d_cnjg(&z__3, &gs);
kusano 7d535a
	    z__2.r = z__3.r * fs.r - z__3.i * fs.i, z__2.i = z__3.r * fs.i + 
kusano 7d535a
		    z__3.i * fs.r;
kusano 7d535a
	    d__1 = fa * ga;
kusano 7d535a
	    z__1.r = z__2.r / d__1, z__1.i = z__2.i / d__1;
kusano 7d535a
	    ss.r = z__1.r, ss.i = z__1.i;
kusano 7d535a
	    z__1.r = di * ss.r, z__1.i = di * ss.i;
kusano 7d535a
	    sn->r = z__1.r, sn->i = z__1.i;
kusano 7d535a
	    z__2.r = g->r * ss.r - g->i * ss.i, z__2.i = g->r * ss.i + g->i * 
kusano 7d535a
		    ss.r;
kusano 7d535a
	    z__1.r = d * z__2.r, z__1.i = d * z__2.i;
kusano 7d535a
	    r->r = z__1.r, r->i = z__1.i;
kusano 7d535a
	}
kusano 7d535a
    }
kusano 7d535a
    return 0;
kusano 7d535a
kusano 7d535a
/*     End of ZLARTG */
kusano 7d535a
kusano 7d535a
} /* zlartg_ */
kusano 7d535a