⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zlartg.c

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -