zunm2r.c

来自「算断裂的」· C语言 代码 · 共 223 行

C
223
字号
#include "f2c.h"/* Subroutine */ int zunm2r_(char *side, char *trans, integer *m, integer *n, 	integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, 	doublecomplex *c, integer *ldc, doublecomplex *work, integer *info){/*  -- LAPACK 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       =======       ZUNM2R overwrites the general complex m-by-n matrix C with             Q * C  if SIDE = 'L' and TRANS = 'N', or             Q'* C  if SIDE = 'L' and TRANS = 'C', or             C * Q  if SIDE = 'R' and TRANS = 'N', or             C * Q' if SIDE = 'R' and TRANS = 'C',       where Q is a complex unitary matrix defined as the product of k       elementary reflectors             Q = H(1) H(2) . . . H(k)       as returned by ZGEQRF. Q is of order m if SIDE = 'L' and of order n       if SIDE = 'R'.       Arguments       =========       SIDE    (input) CHARACTER*1               = 'L': apply Q or Q' from the Left               = 'R': apply Q or Q' from the Right       TRANS   (input) CHARACTER*1               = 'N': apply Q  (No transpose)               = 'C': apply Q' (Conjugate transpose)       M       (input) INTEGER               The number of rows of the matrix C. M >= 0.       N       (input) INTEGER               The number of columns of the matrix C. N >= 0.       K       (input) INTEGER               The number of elementary reflectors whose product defines               the matrix Q.               If SIDE = 'L', M >= K >= 0;               if SIDE = 'R', N >= K >= 0.       A       (input) COMPLEX*16 array, dimension (LDA,K)               The i-th column must contain the vector which defines the               elementary reflector H(i), for i = 1,2,...,k, as returned by               ZGEQRF in the first k columns of its array argument A.               A is modified by the routine but restored on exit.       LDA     (input) INTEGER               The leading dimension of the array A.               If SIDE = 'L', LDA >= max(1,M);               if SIDE = 'R', LDA >= max(1,N).       TAU     (input) COMPLEX*16 array, dimension (K)               TAU(i) must contain the scalar factor of the elementary               reflector H(i), as returned by ZGEQRF.       C       (input/output) COMPLEX*16 array, dimension (LDC,N)               On entry, the m-by-n matrix C.               On exit, C is overwritten by Q*C or Q'*C or C*Q' or C*Q.       LDC     (input) INTEGER               The leading dimension of the array C. LDC >= max(1,M).       WORK    (workspace) COMPLEX*16 array, dimension                                        (N) if SIDE = 'L',                                        (M) if SIDE = 'R'       INFO    (output) INTEGER               = 0: successful exit               < 0: if INFO = -i, the i-th argument had an illegal value       =====================================================================          Test the input arguments          Parameter adjustments          Function Body */    /* Table of constant values */    static integer c__1 = 1;        /* System generated locals */    integer a_dim1, a_offset, c_dim1, c_offset, i__1, i__2, i__3;    doublecomplex z__1;    /* Builtin functions */    void d_cnjg(doublecomplex *, doublecomplex *);    /* Local variables */    static logical left;    static doublecomplex taui;    static integer i;    extern logical lsame_(char *, char *);    extern /* Subroutine */ int zlarf_(char *, integer *, integer *, 	    doublecomplex *, integer *, doublecomplex *, doublecomplex *, 	    integer *, doublecomplex *);    static integer i1, i2, i3, ic, jc, mi, ni, nq;    extern /* Subroutine */ int xerbla_(char *, integer *);    static logical notran;    static doublecomplex aii;#define TAU(I) tau[(I)-1]#define WORK(I) work[(I)-1]#define A(I,J) a[(I)-1 + ((J)-1)* ( *lda)]#define C(I,J) c[(I)-1 + ((J)-1)* ( *ldc)]    *info = 0;    left = lsame_(side, "L");    notran = lsame_(trans, "N");/*     NQ is the order of Q */    if (left) {	nq = *m;    } else {	nq = *n;    }    if (! left && ! lsame_(side, "R")) {	*info = -1;    } else if (! notran && ! lsame_(trans, "C")) {	*info = -2;    } else if (*m < 0) {	*info = -3;    } else if (*n < 0) {	*info = -4;    } else if (*k < 0 || *k > nq) {	*info = -5;    } else if (*lda < max(1,nq)) {	*info = -7;    } else if (*ldc < max(1,*m)) {	*info = -10;    }    if (*info != 0) {	i__1 = -(*info);	xerbla_("ZUNM2R", &i__1);	return 0;    }/*     Quick return if possible */    if (*m == 0 || *n == 0 || *k == 0) {	return 0;    }    if (left && ! notran || ! left && notran) {	i1 = 1;	i2 = *k;	i3 = 1;    } else {	i1 = *k;	i2 = 1;	i3 = -1;    }    if (left) {	ni = *n;	jc = 1;    } else {	mi = *m;	ic = 1;    }    i__1 = i2;    i__2 = i3;    for (i = i1; i3 < 0 ? i >= i2 : i <= i2; i += i3) {	if (left) {/*           H(i) or H(i)' is applied to C(i:m,1:n) */	    mi = *m - i + 1;	    ic = i;	} else {/*           H(i) or H(i)' is applied to C(1:m,i:n) */	    ni = *n - i + 1;	    jc = i;	}/*        Apply H(i) or H(i)' */	if (notran) {	    i__3 = i;	    taui.r = TAU(i).r, taui.i = TAU(i).i;	} else {	    d_cnjg(&z__1, &TAU(i));	    taui.r = z__1.r, taui.i = z__1.i;	}	i__3 = i + i * a_dim1;	aii.r = A(i,i).r, aii.i = A(i,i).i;	i__3 = i + i * a_dim1;	A(i,i).r = 1., A(i,i).i = 0.;	zlarf_(side, &mi, &ni, &A(i,i), &c__1, &taui, &C(ic,jc), ldc, &WORK(1));	i__3 = i + i * a_dim1;	A(i,i).r = aii.r, A(i,i).i = aii.i;/* L10: */    }    return 0;/*     End of ZUNM2R */} /* zunm2r_ */

⌨️ 快捷键说明

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