📄 zlals0.f
字号:
SUBROUTINE ZLALS0( ICOMPQ, NL, NR, SQRE, NRHS, B, LDB, BX, LDBX, $ PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM, $ POLES, DIFL, DIFR, Z, K, C, S, RWORK, INFO )** -- LAPACK routine (instrumented to count ops, version 3.0) --* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,* Courant Institute, Argonne National Lab, and Rice University* December 22, 1999** .. Scalar Arguments .. INTEGER GIVPTR, ICOMPQ, INFO, K, LDB, LDBX, LDGCOL, $ LDGNUM, NL, NR, NRHS, SQRE DOUBLE PRECISION C, S* ..* .. Array Arguments .. INTEGER GIVCOL( LDGCOL, * ), PERM( * ) DOUBLE PRECISION DIFL( * ), DIFR( LDGNUM, * ), $ GIVNUM( LDGNUM, * ), POLES( LDGNUM, * ), $ RWORK( * ), Z( * ) COMPLEX*16 B( LDB, * ), BX( LDBX, * )* ..* .. Common block to return operation count .. COMMON / LATIME / OPS, ITCNT* ..* .. Scalars in Common .. DOUBLE PRECISION ITCNT, OPS* ..** Purpose* =======** ZLALS0 applies back the multiplying factors of either the left or the* right singular vector matrix of a diagonal matrix appended by a row* to the right hand side matrix B in solving the least squares problem* using the divide-and-conquer SVD approach.** For the left singular vector matrix, three types of orthogonal* matrices are involved:** (1L) Givens rotations: the number of such rotations is GIVPTR; the* pairs of columns/rows they were applied to are stored in GIVCOL;* and the C- and S-values of these rotations are stored in GIVNUM.** (2L) Permutation. The (NL+1)-st row of B is to be moved to the first* row, and for J=2:N, PERM(J)-th row of B is to be moved to the* J-th row.** (3L) The left singular vector matrix of the remaining matrix.** For the right singular vector matrix, four types of orthogonal* matrices are involved:** (1R) The right singular vector matrix of the remaining matrix.** (2R) If SQRE = 1, one extra Givens rotation to generate the right* null space.** (3R) The inverse transformation of (2L).** (4R) The inverse transformation of (1L).** Arguments* =========** ICOMPQ (input) INTEGER* Specifies whether singular vectors are to be computed in* factored form:* = 0: Left singular vector matrix.* = 1: Right singular vector matrix.** NL (input) INTEGER* The row dimension of the upper block. NL >= 1.** NR (input) INTEGER* The row dimension of the lower block. NR >= 1.** SQRE (input) INTEGER* = 0: the lower block is an NR-by-NR square matrix.* = 1: the lower block is an NR-by-(NR+1) rectangular matrix.** The bidiagonal matrix has row dimension N = NL + NR + 1,* and column dimension M = N + SQRE.** NRHS (input) INTEGER* The number of columns of B and BX. NRHS must be at least 1.** B (input/output) COMPLEX*16 array, dimension ( LDB, NRHS )* On input, B contains the right hand sides of the least* squares problem in rows 1 through M. On output, B contains* the solution X in rows 1 through N.** LDB (input) INTEGER* The leading dimension of B. LDB must be at least* max(1,MAX( M, N ) ).** BX (workspace) COMPLEX*16 array, dimension ( LDBX, NRHS )** LDBX (input) INTEGER* The leading dimension of BX.** PERM (input) INTEGER array, dimension ( N )* The permutations (from deflation and sorting) applied* to the two blocks.** GIVPTR (input) INTEGER* The number of Givens rotations which took place in this* subproblem.** GIVCOL (input) INTEGER array, dimension ( LDGCOL, 2 )* Each pair of numbers indicates a pair of rows/columns* involved in a Givens rotation.** LDGCOL (input) INTEGER* The leading dimension of GIVCOL, must be at least N.** GIVNUM (input) DOUBLE PRECISION array, dimension ( LDGNUM, 2 )* Each number indicates the C or S value used in the* corresponding Givens rotation.** LDGNUM (input) INTEGER* The leading dimension of arrays DIFR, POLES and* GIVNUM, must be at least K.** POLES (input) DOUBLE PRECISION array, dimension ( LDGNUM, 2 )* On entry, POLES(1:K, 1) contains the new singular* values obtained from solving the secular equation, and* POLES(1:K, 2) is an array containing the poles in the secular* equation.** DIFL (input) DOUBLE PRECISION array, dimension ( K ).* On entry, DIFL(I) is the distance between I-th updated* (undeflated) singular value and the I-th (undeflated) old* singular value.** DIFR (input) DOUBLE PRECISION array, dimension ( LDGNUM, 2 ).* On entry, DIFR(I, 1) contains the distances between I-th* updated (undeflated) singular value and the I+1-th* (undeflated) old singular value. And DIFR(I, 2) is the* normalizing factor for the I-th right singular vector.** Z (input) DOUBLE PRECISION array, dimension ( K )* Contain the components of the deflation-adjusted updating row* vector.** K (input) INTEGER* Contains the dimension of the non-deflated matrix,* This is the order of the related secular equation. 1 <= K <=N.** C (input) DOUBLE PRECISION* C contains garbage if SQRE =0 and the C-value of a Givens* rotation related to the right null space if SQRE = 1.** S (input) DOUBLE PRECISION* S contains garbage if SQRE =0 and the S-value of a Givens* rotation related to the right null space if SQRE = 1.** RWORK (workspace) DOUBLE PRECISION array, dimension* ( K*(1+NRHS) + 2*NRHS )** INFO (output) INTEGER* = 0: successful exit.* < 0: if INFO = -i, the i-th argument had an illegal value.** =====================================================================** .. Parameters .. DOUBLE PRECISION ONE, ZERO, NEGONE PARAMETER ( ONE = 1.0D0, ZERO = 0.0D0, NEGONE = -1.0D0 )* ..* .. Local Scalars .. INTEGER I, J, JCOL, JROW, M, N, NLP1 DOUBLE PRECISION DIFLJ, DIFRJ, DJ, DSIGJ, DSIGJP, TEMP* ..* .. External Subroutines .. EXTERNAL ZDROT, ZDSCAL, ZCOPY, $ ZLACPY, ZLASCL, DGEMV, XERBLA* ..* .. External Functions .. DOUBLE PRECISION DLAMC3, DNRM2, DOPBL2 EXTERNAL DLAMC3, DNRM2, DOPBL2* ..* .. Intrinsic Functions .. INTRINSIC DCMPLX, DBLE, DIMAG* ..* .. Executable Statements ..** Test the input parameters.* INFO = 0* IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN INFO = -1 ELSE IF( NL.LT.1 ) THEN INFO = -2 ELSE IF( NR.LT.1 ) THEN INFO = -3 ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN INFO = -4 END IF* N = NL + NR + 1* IF( NRHS.LT.1 ) THEN INFO = -5 ELSE IF( LDB.LT.N ) THEN INFO = -7 ELSE IF( LDBX.LT.N ) THEN INFO = -9 ELSE IF( GIVPTR.LT.0 ) THEN INFO = -11 ELSE IF( LDGCOL.LT.N ) THEN INFO = -13 ELSE IF( LDGNUM.LT.N ) THEN INFO = -15 ELSE IF( K.LT.1 ) THEN INFO = -20 END IF IF( INFO.NE.0 ) THEN CALL XERBLA( 'ZLALS0', -INFO ) RETURN END IF* M = N + SQRE NLP1 = NL + 1*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -