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

📄 clalsa.f

📁 计算矩阵的经典开源库.全世界都在用它.相信你也不能例外.
💻 F
📖 第 1 页 / 共 2 页
字号:
      SUBROUTINE CLALSA( ICOMPQ, SMLSIZ, N, NRHS, B, LDB, BX, LDBX, U,     $                   LDU, VT, K, DIFL, DIFR, Z, POLES, GIVPTR,     $                   GIVCOL, LDGCOL, PERM, GIVNUM, C, S, RWORK,     $                   IWORK, 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*     June 30, 1999**     .. Scalar Arguments ..      INTEGER            ICOMPQ, INFO, LDB, LDBX, LDGCOL, LDU, N, NRHS,     $                   SMLSIZ*     ..*     .. Array Arguments ..      INTEGER            GIVCOL( LDGCOL, * ), GIVPTR( * ), IWORK( * ),     $                   K( * ), PERM( LDGCOL, * )      REAL               C( * ), DIFL( LDU, * ), DIFR( LDU, * ),     $                   GIVNUM( LDU, * ), POLES( LDU, * ), RWORK( * ),     $                   S( * ), U( LDU, * ), VT( LDU, * ), Z( LDU, * )      COMPLEX            B( LDB, * ), BX( LDBX, * )*     ..*     .. Common block to return operation count ..      COMMON             / LATIME / OPS, ITCNT*     ..*     .. Scalars in Common ..      REAL               ITCNT, OPS*     ..**  Purpose*  =======**  CLALSA is an itermediate step in solving the least squares problem*  by computing the SVD of the coefficient matrix in compact form (The*  singular vectors are computed as products of simple orthorgonal*  matrices.).**  If ICOMPQ = 0, CLALSA applies the inverse of the left singular vector*  matrix of an upper bidiagonal matrix to the right hand side; and if*  ICOMPQ = 1, CLALSA applies the right singular vector matrix to the*  right hand side. The singular vector matrices were generated in*  compact form by CLALSA.**  Arguments*  =========**  ICOMPQ (input) INTEGER*         Specifies whether the left or the right singular vector*         matrix is involved.*         = 0: Left singular vector matrix*         = 1: Right singular vector matrix**  SMLSIZ (input) INTEGER*         The maximum size of the subproblems at the bottom of the*         computation tree.**  N      (input) INTEGER*         The row and column dimensions of the upper bidiagonal matrix.**  NRHS   (input) INTEGER*         The number of columns of B and BX. NRHS must be at least 1.**  B      (input) COMPLEX 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 in the calling subprogram.*         LDB must be at least max(1,MAX( M, N ) ).**  BX     (output) COMPLEX array, dimension ( LDBX, NRHS )*         On exit, the result of applying the left or right singular*         vector matrix to B.**  LDBX   (input) INTEGER*         The leading dimension of BX.**  U      (input) REAL array, dimension ( LDU, SMLSIZ ).*         On entry, U contains the left singular vector matrices of all*         subproblems at the bottom level.**  LDU    (input) INTEGER, LDU = > N.*         The leading dimension of arrays U, VT, DIFL, DIFR,*         POLES, GIVNUM, and Z.**  VT     (input) REAL array, dimension ( LDU, SMLSIZ+1 ).*         On entry, VT' contains the right singular vector matrices of*         all subproblems at the bottom level.**  K      (input) INTEGER array, dimension ( N ).**  DIFL   (input) REAL array, dimension ( LDU, NLVL ).*         where NLVL = INT(log_2 (N/(SMLSIZ+1))) + 1.**  DIFR   (input) REAL array, dimension ( LDU, 2 * NLVL ).*         On entry, DIFL(*, I) and DIFR(*, 2 * I -1) record*         distances between singular values on the I-th level and*         singular values on the (I -1)-th level, and DIFR(*, 2 * I)*         record the normalizing factors of the right singular vectors*         matrices of subproblems on I-th level.**  Z      (input) REAL array, dimension ( LDU, NLVL ).*         On entry, Z(1, I) contains the components of the deflation-*         adjusted updating row vector for subproblems on the I-th*         level.**  POLES  (input) REAL array, dimension ( LDU, 2 * NLVL ).*         On entry, POLES(*, 2 * I -1: 2 * I) contains the new and old*         singular values involved in the secular equations on the I-th*         level.**  GIVPTR (input) INTEGER array, dimension ( N ).*         On entry, GIVPTR( I ) records the number of Givens*         rotations performed on the I-th problem on the computation*         tree.**  GIVCOL (input) INTEGER array, dimension ( LDGCOL, 2 * NLVL ).*         On entry, for each I, GIVCOL(*, 2 * I - 1: 2 * I) records the*         locations of Givens rotations performed on the I-th level on*         the computation tree.**  LDGCOL (input) INTEGER, LDGCOL = > N.*         The leading dimension of arrays GIVCOL and PERM.**  PERM   (input) INTEGER array, dimension ( LDGCOL, NLVL ).*         On entry, PERM(*, I) records permutations done on the I-th*         level of the computation tree.**  GIVNUM (input) REAL array, dimension ( LDU, 2 * NLVL ).*         On entry, GIVNUM(*, 2 *I -1 : 2 * I) records the C- and S-*         values of Givens rotations performed on the I-th level on the*         computation tree.**  C      (input) REAL array, dimension ( N ).*         On entry, if the I-th subproblem is not square,*         C( I ) contains the C-value of a Givens rotation related to*         the right null space of the I-th subproblem.**  S      (input) REAL array, dimension ( N ).*         On entry, if the I-th subproblem is not square,*         S( I ) contains the S-value of a Givens rotation related to*         the right null space of the I-th subproblem.**  RWORK  (workspace) REAL array, dimension at least*         max ( N, (SMLSZ+1)*NRHS*3 ).**  IWORK  (workspace) INTEGER array.*         The dimension must be at least 3 * N**  INFO   (output) INTEGER*          = 0:  successful exit.*          < 0:  if INFO = -i, the i-th argument had an illegal value.**  =====================================================================**     .. Parameters ..      REAL               ZERO, ONE      PARAMETER          ( ZERO = 0.0E0, ONE = 1.0E0 )*     ..*     .. Local Scalars ..      INTEGER            I, I1, IC, IM1, INODE, J, JCOL, JIMAG, JREAL,     $                   JROW, LF, LL, LVL, LVL2, ND, NDB1, NDIML,     $                   NDIMR, NL, NLF, NLP1, NLVL, NR, NRF, NRP1, SQRE*     ..*     .. External Subroutines ..      EXTERNAL           CCOPY, CLALS0, SGEMM, SLASDT,     $                   XERBLA*     ..*     .. External Functions ..      REAL               SOPBL3      EXTERNAL           SOPBL3*     ..*     .. Intrinsic Functions ..      INTRINSIC          CMPLX, REAL, AIMAG*     ..*     .. Executable Statements ..**     Test the input parameters.*      INFO = 0*      IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN         INFO = -1      ELSE IF( SMLSIZ.LT.3 ) THEN         INFO = -2      ELSE IF( N.LT.SMLSIZ ) THEN         INFO = -3      ELSE IF( NRHS.LT.1 ) THEN         INFO = -4      ELSE IF( LDB.LT.N ) THEN         INFO = -6      ELSE IF( LDBX.LT.N ) THEN         INFO = -8      ELSE IF( LDU.LT.N ) THEN         INFO = -10      ELSE IF( LDGCOL.LT.N ) THEN         INFO = -19      END IF      IF( INFO.NE.0 ) THEN         CALL XERBLA( 'CLALSA', -INFO )         RETURN      END IF**     Book-keeping and  setting up the computation tree.*      INODE = 1      NDIML = INODE + N      NDIMR = NDIML + N*      CALL SLASDT( N, NLVL, ND, IWORK( INODE ), IWORK( NDIML ),     $             IWORK( NDIMR ), SMLSIZ )**     The following code applies back the left singular vector factors.*     For applying back the right singular vector factors, go to 170.*      IF( ICOMPQ.EQ.1 ) THEN         GO TO 170      END IF**     The nodes on the bottom level of the tree were solved*     by SLASDQ. The corresponding left and right singular vector*     matrices are in explicit form. First apply back the left*     singular vector matrices.*      NDB1 = ( ND+1 ) / 2      DO 130 I = NDB1, ND**        IC : center row of each node*        NL : number of rows of left  subproblem*        NR : number of rows of right subproblem*        NLF: starting row of the left   subproblem*        NRF: starting row of the right  subproblem*         I1 = I - 1         IC = IWORK( INODE+I1 )         NL = IWORK( NDIML+I1 )         NR = IWORK( NDIMR+I1 )         NLF = IC - NL         NRF = IC + 1**        Since B and BX are complex, the following call to SGEMM*        is performed in two steps (real and imaginary parts).**        CALL SGEMM( 'T', 'N', NL, NRHS, NL, ONE, U( NLF, 1 ), LDU,*     $               B( NLF, 1 ), LDB, ZERO, BX( NLF, 1 ), LDBX )*         J = NL*NRHS*2         DO 20 JCOL = 1, NRHS            DO 10 JROW = NLF, NLF + NL - 1               J = J + 1               RWORK( J ) = REAL( B( JROW, JCOL ) )   10       CONTINUE   20    CONTINUE         OPS = OPS + SOPBL3( 'SGEMM ', NL, NRHS, NL )          CALL SGEMM( 'T', 'N', NL, NRHS, NL, ONE, U( NLF, 1 ), LDU,     $               RWORK( 1+NL*NRHS*2 ), NL, ZERO, RWORK( 1 ), NL )         J = NL*NRHS*2

⌨️ 快捷键说明

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