📄 dlasd2.f
字号:
SUBROUTINE DLASD2( NL, NR, SQRE, K, D, Z, ALPHA, BETA, U, LDU, VT, $ LDVT, DSIGMA, U2, LDU2, VT2, LDVT2, IDXP, IDX, $ IDXC, IDXQ, COLTYP, INFO )** -- LAPACK auxiliary routine (instrumented to count ops, version 3.0) --* Univ. of Tennessee, Oak Ridge National Lab, Argonne National Lab,* Courant Institute, NAG Ltd., and Rice University* October 31, 1999** .. Scalar Arguments .. INTEGER INFO, K, LDU, LDU2, LDVT, LDVT2, NL, NR, SQRE DOUBLE PRECISION ALPHA, BETA* ..* .. Array Arguments .. INTEGER COLTYP( * ), IDX( * ), IDXC( * ), IDXP( * ), $ IDXQ( * ) DOUBLE PRECISION D( * ), DSIGMA( * ), U( LDU, * ), $ U2( LDU2, * ), VT( LDVT, * ), VT2( LDVT2, * ), $ Z( * )* ..* .. Common block to return operation count .. COMMON / LATIME / OPS, ITCNT* ..* .. Scalars in Common .. DOUBLE PRECISION ITCNT, OPS* ..** Purpose* =======** DLASD2 merges the two sets of singular values together into a single* sorted set. Then it tries to deflate the size of the problem.* There are two ways in which deflation can occur: when two or more* singular values are close together or if there is a tiny entry in the* Z vector. For each such occurrence the order of the related secular* equation problem is reduced by one.** DLASD2 is called from DLASD1.** Arguments* =========** 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 N = NL + NR + 1 rows and* M = N + SQRE >= N columns.** K (output) INTEGER* Contains the dimension of the non-deflated matrix,* This is the order of the related secular equation. 1 <= K <=N.** D (input/output) DOUBLE PRECISION array, dimension(N)* On entry D contains the singular values of the two submatrices* to be combined. On exit D contains the trailing (N-K) updated* singular values (those which were deflated) sorted into* increasing order.** ALPHA (input) DOUBLE PRECISION* Contains the diagonal element associated with the added row.** BETA (input) DOUBLE PRECISION* Contains the off-diagonal element associated with the added* row.** U (input/output) DOUBLE PRECISION array, dimension(LDU,N)* On entry U contains the left singular vectors of two* submatrices in the two square blocks with corners at (1,1),* (NL, NL), and (NL+2, NL+2), (N,N).* On exit U contains the trailing (N-K) updated left singular* vectors (those which were deflated) in its last N-K columns.** LDU (input) INTEGER* The leading dimension of the array U. LDU >= N.** Z (output) DOUBLE PRECISION array, dimension(N)* On exit Z contains the updating row vector in the secular* equation.** DSIGMA (output) DOUBLE PRECISION array, dimension (N)* Contains a copy of the diagonal elements (K-1 singular values* and one zero) in the secular equation.** U2 (output) DOUBLE PRECISION array, dimension(LDU2,N)* Contains a copy of the first K-1 left singular vectors which* will be used by DLASD3 in a matrix multiply (DGEMM) to solve* for the new left singular vectors. U2 is arranged into four* blocks. The first block contains a column with 1 at NL+1 and* zero everywhere else; the second block contains non-zero* entries only at and above NL; the third contains non-zero* entries only below NL+1; and the fourth is dense.** LDU2 (input) INTEGER* The leading dimension of the array U2. LDU2 >= N.** VT (input/output) DOUBLE PRECISION array, dimension(LDVT,M)* On entry VT' contains the right singular vectors of two* submatrices in the two square blocks with corners at (1,1),* (NL+1, NL+1), and (NL+2, NL+2), (M,M).* On exit VT' contains the trailing (N-K) updated right singular* vectors (those which were deflated) in its last N-K columns.* In case SQRE =1, the last row of VT spans the right null* space.** LDVT (input) INTEGER* The leading dimension of the array VT. LDVT >= M.** VT2 (output) DOUBLE PRECISION array, dimension(LDVT2,N)* VT2' contains a copy of the first K right singular vectors* which will be used by DLASD3 in a matrix multiply (DGEMM) to* solve for the new right singular vectors. VT2 is arranged into* three blocks. The first block contains a row that corresponds* to the special 0 diagonal element in SIGMA; the second block* contains non-zeros only at and before NL +1; the third block* contains non-zeros only at and after NL +2.** LDVT2 (input) INTEGER* The leading dimension of the array VT2. LDVT2 >= M.** IDXP (workspace) INTEGER array, dimension(N)* This will contain the permutation used to place deflated* values of D at the end of the array. On output IDXP(2:K)* points to the nondeflated D-values and IDXP(K+1:N)* points to the deflated singular values.** IDX (workspace) INTEGER array, dimension(N)* This will contain the permutation used to sort the contents of* D into ascending order.** IDXC (output) INTEGER array, dimension(N)* This will contain the permutation used to arrange the columns* of the deflated U matrix into three groups: the first group* contains non-zero entries only at and above NL, the second* contains non-zero entries only below NL+2, and the third is* dense.** COLTYP (workspace/output) INTEGER array, dimension(N)* As workspace, this will contain a label which will indicate* which of the following types a column in the U2 matrix or a* row in the VT2 matrix is:* 1 : non-zero in the upper half only* 2 : non-zero in the lower half only* 3 : dense* 4 : deflated** On exit, it is an array of dimension 4, with COLTYP(I) being* the dimension of the I-th type columns.** IDXQ (input) INTEGER array, dimension(N)* This contains the permutation which separately sorts the two* sub-problems in D into ascending order. Note that entries in* the first hlaf of this permutation must first be moved one* position backward; and entries in the second half* must first have NL+1 added to their values.** INFO (output) INTEGER* = 0: successful exit.* < 0: if INFO = -i, the i-th argument had an illegal value.** Further Details* ===============** Based on contributions by* Ming Gu and Huan Ren, Computer Science Division, University of* California at Berkeley, USA** =====================================================================** .. Parameters .. DOUBLE PRECISION ZERO, ONE, TWO, EIGHT PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0, $ EIGHT = 8.0D0 )* ..* .. Local Arrays .. INTEGER CTOT( 4 ), PSM( 4 )* ..* .. Local Scalars .. INTEGER CT, I, IDXI, IDXJ, IDXJP, J, JP, JPREV, K2, M, $ N, NLP1, NLP2 DOUBLE PRECISION C, EPS, HLFTOL, S, TAU, TOL, Z1* ..* .. External Functions .. DOUBLE PRECISION DLAMCH, DLAPY2 EXTERNAL DLAMCH, DLAPY2* ..* .. External Subroutines .. EXTERNAL DCOPY, DLACPY, DLAMRG, DLASET, DROT, XERBLA* ..* .. Intrinsic Functions .. INTRINSIC DBLE, ABS, MAX* ..* .. Executable Statements ..** Test the input parameters.* INFO = 0* IF( NL.LT.1 ) THEN INFO = -1 ELSE IF( NR.LT.1 ) THEN INFO = -2 ELSE IF( ( SQRE.NE.1 ) .AND. ( SQRE.NE.0 ) ) THEN INFO = -3 END IF* N = NL + NR + 1 M = N + SQRE* IF( LDU.LT.N ) THEN INFO = -10 ELSE IF( LDVT.LT.M ) THEN INFO = -12 ELSE IF( LDU2.LT.N ) THEN INFO = -15 ELSE IF( LDVT2.LT.M ) THEN INFO = -17 END IF IF( INFO.NE.0 ) THEN CALL XERBLA( 'DLASD2', -INFO ) RETURN END IF* NLP1 = NL + 1 NLP2 = NL + 2** Generate the first part of the vector Z; and move the singular* values in the first part of D one position backward.* OPS = OPS + DBLE( 1 + NL ) Z1 = ALPHA*VT( NLP1, NLP1 ) Z( 1 ) = Z1 DO 10 I = NL, 1, -1 Z( I+1 ) = ALPHA*VT( I, NLP1 ) D( I+1 ) = D( I ) IDXQ( I+1 ) = IDXQ( I ) + 1 10 CONTINUE** Generate the second part of the vector Z.* OPS = OPS + DBLE( M-NLP2+1 ) DO 20 I = NLP2, M Z( I ) = BETA*VT( I, NLP2 ) 20 CONTINUE** Initialize some reference arrays.* DO 30 I = 2, NLP1 COLTYP( I ) = 1 30 CONTINUE DO 40 I = NLP2, N COLTYP( I ) = 2 40 CONTINUE** Sort the singular values into increasing order* DO 50 I = NLP2, N IDXQ( I ) = IDXQ( I ) + NLP1 50 CONTINUE*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -