dtgsen.c
来自「InsightToolkit-1.4.0(有大量的优化算法程序)」· C语言 代码 · 共 752 行 · 第 1/3 页
C
752 行
#include "f2c.h"
#include "netlib.h"
extern double sqrt(double); /* #include <math.h> */
/* Table of constant values */
static integer c__1 = 1;
static integer c__2 = 2;
static doublereal c_b28 = 1.;
/* Subroutine */ void dtgsen_(ijob, wantq, wantz, select, n, a, lda, b, ldb,
alphar, alphai, beta, q, ldq, z, ldz, m, pl, pr, dif, work, lwork, iwork, liwork, info)
integer *ijob;
logical *wantq, *wantz, *select;
integer *n;
doublereal *a;
integer *lda;
doublereal *b;
integer *ldb;
doublereal *alphar, *alphai, *beta, *q;
integer *ldq;
doublereal *z;
integer *ldz, *m;
doublereal *pl, *pr, *dif, *work;
integer *lwork, *iwork, *liwork, *info;
{
/* System generated locals */
integer a_dim1, a_offset, b_dim1, b_offset, q_dim1, q_offset, z_dim1, z_offset, i__1;
doublereal d__1;
/* Local variables */
static integer kase;
static logical pair;
static integer ierr;
static doublereal dsum;
static logical swap;
static integer i, k;
static logical wantd;
static integer lwmin;
static logical wantp;
static integer n1, n2;
static logical wantd1, wantd2;
static integer kk;
static doublereal dscale;
static integer ks;
static doublereal rdscal;
static integer liwmin;
static doublereal smlnum;
static integer mn2;
static logical lquery;
static integer ijb;
static doublereal eps;
/* -- LAPACK routine (version 3.0) -- */
/* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., */
/* Courant Institute, Argonne National Lab, and Rice University */
/* June 30, 1999 */
/* */
/* Purpose */
/* ======= */
/* */
/* DTGSEN reorders the generalized real Schur decomposition of a real */
/* matrix pair (A, B) (in terms of an orthonormal equivalence trans- */
/* formation Q' * (A, B) * Z), so that a selected cluster of eigenvalues */
/* appears in the leading diagonal blocks of the upper quasi-triangular */
/* matrix A and the upper triangular B. The leading columns of Q and */
/* Z form orthonormal bases of the corresponding left and right eigen- */
/* spaces (deflating subspaces). (A, B) must be in generalized real */
/* Schur canonical form (as returned by DGGES), i.e. A is block upper */
/* triangular with 1-by-1 and 2-by-2 diagonal blocks. B is upper */
/* triangular. */
/* */
/* DTGSEN also computes the generalized eigenvalues */
/* */
/* w(j) = (ALPHAR(j) + i*ALPHAI(j))/BETA(j) */
/* */
/* of the reordered matrix pair (A, B). */
/* */
/* Optionally, DTGSEN computes the estimates of reciprocal condition */
/* numbers for eigenvalues and eigenspaces. These are Difu[(A11,B11), */
/* (A22,B22)] and Difl[(A11,B11), (A22,B22)], i.e. the separation(s) */
/* between the matrix pairs (A11, B11) and (A22,B22) that correspond to */
/* the selected cluster and the eigenvalues outside the cluster, resp., */
/* and norms of "projections" onto left and right eigenspaces w.r.t. */
/* the selected cluster in the (1,1)-block. */
/* */
/* Arguments */
/* ========= */
/* */
/* IJOB (input) INTEGER */
/* Specifies whether condition numbers are required for the */
/* cluster of eigenvalues (PL and PR) or the deflating subspaces */
/* (Difu and Difl): */
/* =0: Only reorder w.r.t. SELECT. No extras. */
/* =1: Reciprocal of norms of "projections" onto left and right */
/* eigenspaces w.r.t. the selected cluster (PL and PR). */
/* =2: Upper bounds on Difu and Difl. F-norm-based estimate */
/* (DIF(1:2)). */
/* =3: Estimate of Difu and Difl. 1-norm-based estimate */
/* (DIF(1:2)). */
/* About 5 times as expensive as IJOB = 2. */
/* =4: Compute PL, PR and DIF (i.e. 0, 1 and 2 above): Economic */
/* version to get it all. */
/* =5: Compute PL, PR and DIF (i.e. 0, 1 and 3 above) */
/* */
/* WANTQ (input) LOGICAL */
/* .TRUE. : update the left transformation matrix Q; */
/* .FALSE.: do not update Q. */
/* */
/* WANTZ (input) LOGICAL */
/* .TRUE. : update the right transformation matrix Z; */
/* .FALSE.: do not update Z. */
/* */
/* SELECT (input) LOGICAL array, dimension (N) */
/* SELECT specifies the eigenvalues in the selected cluster. */
/* To select a real eigenvalue w(j), SELECT(j) must be set to */
/* .TRUE.. To select a complex conjugate pair of eigenvalues */
/* w(j) and w(j+1), corresponding to a 2-by-2 diagonal block, */
/* either SELECT(j) or SELECT(j+1) or both must be set to */
/* .TRUE.; a complex conjugate pair of eigenvalues must be */
/* either both included in the cluster or both excluded. */
/* */
/* N (input) INTEGER */
/* The order of the matrices A and B. N >= 0. */
/* */
/* A (input/output) DOUBLE PRECISION array, dimension(LDA,N) */
/* On entry, the upper quasi-triangular matrix A, with (A, B) in */
/* generalized real Schur canonical form. */
/* On exit, A is overwritten by the reordered matrix A. */
/* */
/* LDA (input) INTEGER */
/* The leading dimension of the array A. LDA >= max(1,N). */
/* */
/* B (input/output) DOUBLE PRECISION array, dimension(LDB,N) */
/* On entry, the upper triangular matrix B, with (A, B) in */
/* generalized real Schur canonical form. */
/* On exit, B is overwritten by the reordered matrix B. */
/* */
/* LDB (input) INTEGER */
/* The leading dimension of the array B. LDB >= max(1,N). */
/* */
/* ALPHAR (output) DOUBLE PRECISION array, dimension (N) */
/* ALPHAI (output) DOUBLE PRECISION array, dimension (N) */
/* BETA (output) DOUBLE PRECISION array, dimension (N) */
/* On exit, (ALPHAR(j) + ALPHAI(j)*i)/BETA(j), j=1,...,N, will */
/* be the generalized eigenvalues. ALPHAR(j) + ALPHAI(j)*i */
/* and BETA(j),j=1,...,N are the diagonals of the complex Schur */
/* form (S,T) that would result if the 2-by-2 diagonal blocks of */
/* the real generalized Schur form of (A,B) were further reduced */
/* to triangular form using complex unitary transformations. */
/* If ALPHAI(j) is zero, then the j-th eigenvalue is real; if */
/* positive, then the j-th and (j+1)-st eigenvalues are a */
/* complex conjugate pair, with ALPHAI(j+1) negative. */
/* */
/* Q (input/output) DOUBLE PRECISION array, dimension (LDQ,N) */
/* On entry, if WANTQ = .TRUE., Q is an N-by-N matrix. */
/* On exit, Q has been postmultiplied by the left orthogonal */
/* transformation matrix which reorder (A, B); The leading M */
/* columns of Q form orthonormal bases for the specified pair of */
/* left eigenspaces (deflating subspaces). */
/* If WANTQ = .FALSE., Q is not referenced. */
/* */
/* LDQ (input) INTEGER */
/* The leading dimension of the array Q. LDQ >= 1; */
/* and if WANTQ = .TRUE., LDQ >= N. */
/* */
/* Z (input/output) DOUBLE PRECISION array, dimension (LDZ,N) */
/* On entry, if WANTZ = .TRUE., Z is an N-by-N matrix. */
/* On exit, Z has been postmultiplied by the left orthogonal */
/* transformation matrix which reorder (A, B); The leading M */
/* columns of Z form orthonormal bases for the specified pair of */
/* left eigenspaces (deflating subspaces). */
/* If WANTZ = .FALSE., Z is not referenced. */
/* */
/* LDZ (input) INTEGER */
/* The leading dimension of the array Z. LDZ >= 1; */
/* If WANTZ = .TRUE., LDZ >= N. */
/* */
/* M (output) INTEGER */
/* The dimension of the specified pair of left and right eigen- */
/* spaces (deflating subspaces). 0 <= M <= N. */
/* */
/* PL, PR (output) DOUBLE PRECISION */
/* If IJOB = 1, 4 or 5, PL, PR are lower bounds on the */
/* reciprocal of the norm of "projections" onto left and right */
/* eigenspaces with respect to the selected cluster. */
/* 0 < PL, PR <= 1. */
/* If M = 0 or M = N, PL = PR = 1. */
/* If IJOB = 0, 2 or 3, PL and PR are not referenced. */
/* */
/* DIF (output) DOUBLE PRECISION array, dimension (2). */
/* If IJOB >= 2, DIF(1:2) store the estimates of Difu and Difl. */
/* If IJOB = 2 or 4, DIF(1:2) are F-norm-based upper bounds on */
/* Difu and Difl. If IJOB = 3 or 5, DIF(1:2) are 1-norm-based */
/* estimates of Difu and Difl. */
/* If M = 0 or N, DIF(1:2) = F-norm([A, B]). */
/* If IJOB = 0 or 1, DIF is not referenced. */
/* */
/* WORK (workspace/output) DOUBLE PRECISION array, dimension (LWORK) */
/* IF IJOB = 0, WORK is not referenced. Otherwise, */
/* on exit, if INFO = 0, WORK(1) returns the optimal LWORK. */
/* */
/* LWORK (input) INTEGER */
/* The dimension of the array WORK. LWORK >= 4*N+16. */
/* If IJOB = 1, 2 or 4, LWORK >= MAX(4*N+16, 2*M*(N-M)). */
/* If IJOB = 3 or 5, LWORK >= MAX(4*N+16, 4*M*(N-M)). */
/* */
/* If LWORK = -1, then a workspace query is assumed; the routine */
/* only calculates the optimal size of the WORK array, returns */
/* this value as the first entry of the WORK array, and no error */
/* message related to LWORK is issued by XERBLA. */
/* */
/* IWORK (workspace/output) INTEGER array, dimension (LIWORK) */
/* IF IJOB = 0, IWORK is not referenced. Otherwise, */
/* on exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. */
/* */
/* LIWORK (input) INTEGER */
/* The dimension of the array IWORK. LIWORK >= 1. */
/* If IJOB = 1, 2 or 4, LIWORK >= N+6. */
/* If IJOB = 3 or 5, LIWORK >= MAX(2*M*(N-M), N+6). */
/* */
/* If LIWORK = -1, then a workspace query is assumed; the */
/* routine only calculates the optimal size of the IWORK array, */
/* returns this value as the first entry of the IWORK array, and */
/* no error message related to LIWORK is issued by XERBLA. */
/* */
/* INFO (output) INTEGER */
/* =0: Successful exit. */
/* <0: If INFO = -i, the i-th argument had an illegal value. */
/* =1: Reordering of (A, B) failed because the transformed */
/* matrix pair (A, B) would be too far from generalized */
/* Schur form; the problem is very ill-conditioned. */
/* (A, B) may have been partially reordered. */
/* If requested, 0 is returned in DIF(*), PL and PR. */
/* */
/* Further Details */
/* =============== */
/* */
/* DTGSEN first collects the selected eigenvalues by computing */
/* orthogonal U and W that move them to the top left corner of (A, B). */
/* In other words, the selected eigenvalues are the eigenvalues of */
/* (A11, B11) in: */
/* */
/* U'*(A, B)*W = (A11 A12) (B11 B12) n1 */
/* ( 0 A22),( 0 B22) n2 */
/* n1 n2 n1 n2 */
/* */
/* where N = n1+n2 and U' means the transpose of U. The first n1 columns */
/* of U and W span the specified pair of left and right eigenspaces */
/* (deflating subspaces) of (A, B). */
/* */
/* If (A, B) has been obtained from the generalized real Schur */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?