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

📄 matrix.f

📁 CLM集合卡曼滤波数据同化算法
💻 F
📖 第 1 页 / 共 5 页
字号:
      if(incx.lt.0)ix = (-n+1)*incx + 1      if(incy.lt.0)iy = (-n+1)*incy + 1      do 10 i = 1,n        sy(iy) = sy(iy) + sa*sx(ix)        ix = ix + incx        iy = iy + incy   10 continue      returncc        code for both increments equal to 1ccc        clean-up loopc   20 m = mod(n,4)      if( m .eq. 0 ) go to 40      do 30 i = 1,m        sy(i) = sy(i) + sa*sx(i)   30 continue      if( n .lt. 4 ) return   40 mp1 = m + 1      do 50 i = mp1,n,4        sy(i) = sy(i) + sa*sx(i)        sy(i + 1) = sy(i + 1) + sa*sx(i + 1)        sy(i + 2) = sy(i + 2) + sa*sx(i + 2)        sy(i + 3) = sy(i + 3) + sa*sx(i + 3)   50 continue      return      end!========================================================================      real function sdot(n,sx,incx,sy,incy)cc     forms the dot product of two vectors.c     uses unrolled loops for increments equal to one.c     jack dongarra, linpack, 3/11/78.c     modified 12/3/93, array(1) declarations changed to array(*)c      real sx(*),sy(*),stemp      integer i,incx,incy,ix,iy,m,mp1,nc      stemp = 0.0e0      sdot = 0.0e0      if(n.le.0)return      if(incx.eq.1.and.incy.eq.1)go to 20cc        code for unequal increments or equal incrementsc          not equal to 1c      ix = 1      iy = 1      if(incx.lt.0)ix = (-n+1)*incx + 1      if(incy.lt.0)iy = (-n+1)*incy + 1      do 10 i = 1,n        stemp = stemp + sx(ix)*sy(iy)        ix = ix + incx        iy = iy + incy   10 continue      sdot = stemp      returncc        code for both increments equal to 1ccc        clean-up loopc   20 m = mod(n,5)      if( m .eq. 0 ) go to 40      do 30 i = 1,m        stemp = stemp + sx(i)*sy(i)   30 continue      if( n .lt. 5 ) go to 60   40 mp1 = m + 1      do 50 i = mp1,n,5        stemp = stemp + sx(i)*sy(i) + sx(i + 1)*sy(i + 1) +     *   sx(i + 2)*sy(i + 2) + sx(i + 3)*sy(i + 3) + sx(i + 4)*sy(i + 4)   50 continue   60 sdot = stemp      return      end!===========================================================================      SUBROUTINE SGEMV ( TRANS, M, N, ALPHA, A, LDA, X, INCX,     $                   BETA, Y, INCY )*     .. Scalar Arguments ..      REAL               ALPHA, BETA      INTEGER            INCX, INCY, LDA, M, N      CHARACTER*1        TRANS*     .. Array Arguments ..      REAL               A( LDA, * ), X( * ), Y( * )*     ..**  Purpose*  =======**  SGEMV  performs one of the matrix-vector operations**     y := alpha*A*x + beta*y,   or   y := alpha*A'*x + beta*y,**  where alpha and beta are scalars, x and y are vectors and A is an*  m by n matrix.**  Parameters*  ==========**  TRANS  - CHARACTER*1.*           On entry, TRANS specifies the operation to be performed as*           follows:**              TRANS = 'N' or 'n'   y := alpha*A*x + beta*y.**              TRANS = 'T' or 't'   y := alpha*A'*x + beta*y.**              TRANS = 'C' or 'c'   y := alpha*A'*x + beta*y.**           Unchanged on exit.**  M      - INTEGER.*           On entry, M specifies the number of rows of the matrix A.*           M must be at least zero.*           Unchanged on exit.**  N      - INTEGER.*           On entry, N specifies the number of columns of the matrix A.*           N must be at least zero.*           Unchanged on exit.**  ALPHA  - REAL            .*           On entry, ALPHA specifies the scalar alpha.*           Unchanged on exit.**  A      - REAL             array of DIMENSION ( LDA, n ).*           Before entry, the leading m by n part of the array A must*           contain the matrix of coefficients.*           Unchanged on exit.**  LDA    - INTEGER.*           On entry, LDA specifies the first dimension of A as declared*           in the calling (sub) program. LDA must be at least*           max( 1, m ).*           Unchanged on exit.**  X      - REAL             array of DIMENSION at least*           ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n'*           and at least*           ( 1 + ( m - 1 )*abs( INCX ) ) otherwise.*           Before entry, the incremented array X must contain the*           vector x.*           Unchanged on exit.**  INCX   - INTEGER.*           On entry, INCX specifies the increment for the elements of*           X. INCX must not be zero.*           Unchanged on exit.**  BETA   - REAL            .*           On entry, BETA specifies the scalar beta. When BETA is*           supplied as zero then Y need not be set on input.*           Unchanged on exit.**  Y      - REAL             array of DIMENSION at least*           ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n'*           and at least*           ( 1 + ( n - 1 )*abs( INCY ) ) otherwise.*           Before entry with BETA non-zero, the incremented array Y*           must contain the vector y. On exit, Y is overwritten by the*           updated vector y.**  INCY   - INTEGER.*           On entry, INCY specifies the increment for the elements of*           Y. INCY must not be zero.*           Unchanged on exit.***  Level 2 Blas routine.**  -- Written on 22-October-1986.*     Jack Dongarra, Argonne National Lab.*     Jeremy Du Croz, Nag Central Office.*     Sven Hammarling, Nag Central Office.*     Richard Hanson, Sandia National Labs.***     .. Parameters ..      REAL               ONE         , ZERO      PARAMETER        ( ONE = 1.0E+0, ZERO = 0.0E+0 )*     .. Local Scalars ..      REAL               TEMP      INTEGER            I, INFO, IX, IY, J, JX, JY, KX, KY, LENX, LENY*     .. External Functions ..      LOGICAL            LSAME      EXTERNAL           LSAME*     .. External Subroutines ..      EXTERNAL           XERBLA*     .. Intrinsic Functions ..      INTRINSIC          MAX*     ..*     .. Executable Statements ..**     Test the input parameters.*      INFO = 0      IF     ( .NOT.LSAME( TRANS, 'N' ).AND.     $         .NOT.LSAME( TRANS, 'T' ).AND.     $         .NOT.LSAME( TRANS, 'C' )      )THEN         INFO = 1      ELSE IF( M.LT.0 )THEN         INFO = 2      ELSE IF( N.LT.0 )THEN         INFO = 3      ELSE IF( LDA.LT.MAX( 1, M ) )THEN         INFO = 6      ELSE IF( INCX.EQ.0 )THEN         INFO = 8      ELSE IF( INCY.EQ.0 )THEN         INFO = 11      END IF      IF( INFO.NE.0 )THEN         CALL XERBLA( 'SGEMV ', INFO )         RETURN      END IF**     Quick return if possible.*      IF( ( M.EQ.0 ).OR.( N.EQ.0 ).OR.     $    ( ( ALPHA.EQ.ZERO ).AND.( BETA.EQ.ONE ) ) )     $   RETURN**     Set  LENX  and  LENY, the lengths of the vectors x and y, and set*     up the start points in  X  and  Y.*      IF( LSAME( TRANS, 'N' ) )THEN         LENX = N         LENY = M      ELSE         LENX = M         LENY = N      END IF      IF( INCX.GT.0 )THEN         KX = 1      ELSE         KX = 1 - ( LENX - 1 )*INCX      END IF      IF( INCY.GT.0 )THEN         KY = 1      ELSE         KY = 1 - ( LENY - 1 )*INCY      END IF**     Start the operations. In this version the elements of A are*     accessed sequentially with one pass through A.**     First form  y := beta*y.*      IF( BETA.NE.ONE )THEN         IF( INCY.EQ.1 )THEN            IF( BETA.EQ.ZERO )THEN               DO 10, I = 1, LENY                  Y( I ) = ZERO   10          CONTINUE            ELSE               DO 20, I = 1, LENY                  Y( I ) = BETA*Y( I )   20          CONTINUE            END IF         ELSE            IY = KY            IF( BETA.EQ.ZERO )THEN               DO 30, I = 1, LENY                  Y( IY ) = ZERO                  IY      = IY   + INCY   30          CONTINUE            ELSE               DO 40, I = 1, LENY                  Y( IY ) = BETA*Y( IY )                  IY      = IY           + INCY   40          CONTINUE            END IF         END IF      END IF      IF( ALPHA.EQ.ZERO )     $   RETURN      IF( LSAME( TRANS, 'N' ) )THEN**        Form  y := alpha*A*x + y.*         JX = KX         IF( INCY.EQ.1 )THEN            DO 60, J = 1, N               IF( X( JX ).NE.ZERO )THEN                  TEMP = ALPHA*X( JX )                  DO 50, I = 1, M                     Y( I ) = Y( I ) + TEMP*A( I, J )   50             CONTINUE               END IF               JX = JX + INCX   60       CONTINUE         ELSE            DO 80, J = 1, N               IF( X( JX ).NE.ZERO )THEN                  TEMP = ALPHA*X( JX )                  IY   = KY                  DO 70, I = 1, M                     Y( IY ) = Y( IY ) + TEMP*A( I, J )                     IY      = IY      + INCY   70             CONTINUE               END IF               JX = JX + INCX   80       CONTINUE         END IF      ELSE**        Form  y := alpha*A'*x + y.*         JY = KY         IF( INCX.EQ.1 )THEN            DO 100, J = 1, N               TEMP = ZERO               DO 90, I = 1, M                  TEMP = TEMP + A( I, J )*X( I )   90          CONTINUE               Y( JY ) = Y( JY ) + ALPHA*TEMP               JY      = JY      + INCY  100       CONTINUE         ELSE            DO 120, J = 1, N               TEMP = ZERO               IX   = KX               DO 110, I = 1, M                  TEMP = TEMP + A( I, J )*X( IX )                  IX   = IX   + INCX  110          CONTINUE               Y( JY ) = Y( JY ) + ALPHA*TEMP               JY      = JY      + INCY  120       CONTINUE         END IF      END IF*      RETURN**     End of SGEMV .*      END!==========================================================================      SUBROUTINE SLAEBZ( IJOB, NITMAX, N, MMAX, MINP, NBMIN, ABSTOL,     $                   RELTOL, PIVMIN, D, E, E2, NVAL, AB, C, MOUT,     $                   NAB, WORK, IWORK, INFO )**  -- LAPACK auxiliary routine (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            IJOB, INFO, MINP, MMAX, MOUT, N, NBMIN, NITMAX      REAL               ABSTOL, PIVMIN, RELTOL*     ..*     .. Array Arguments ..      INTEGER            IWORK( * ), NAB( MMAX, * ), NVAL( * )      REAL               AB( MMAX, * ), C( * ), D( * ), E( * ), E2( * ),     $                   WORK( * )*     ..**  Purpose*  =======**  SLAEBZ contains the iteration loops which compute and use the*  function N(w), which is the count of eigenvalues of a symmetric*  tridiagonal matrix T less than or equal to its argument  w.  It*  performs a choice of two types of loops:**  IJOB=1, followed by*  IJOB=2: It takes as input a list of intervals and returns a list of*          sufficiently small intervals whose union contains the same*          eigenvalues as the union of the original intervals.*          The input intervals are (AB(j,1),AB(j,2)], j=1,...,MINP.*          The output interval (AB(j,1),AB(j,2)] will contain*          eigenvalues NAB(j,1)+1,...,NAB(j,2), where 1 <= j <= MOUT.**  IJOB=3: It performs a binary search in each input interval*          (AB(j,1),AB(j,2)] for a point  w(j)  such that*          N(w(j))=NVAL(j), and uses  C(j)  as the starting point of*          the search.  If such a w(j) is found, then on output*          AB(j,1)=AB(j,2)=w.  If no such w(j) is found, then on output*          (AB(j,1),AB(j,2)] will be a small interval containing the*          point where N(w) jumps through NVAL(j), unless that point*          lies outside the initial interval.**  Note that the intervals are in all cases half-open intervals,*  i.e., of the form  (a,b] , which includes  b  but not  a .**  To avoid underflow, the matrix should be scaled so that its largest*  element is no greater than  overflow**(1/2) * underflow**(1/4)*  in absolute value.  To assure the most accurate computation*  of small eigenvalues, the matrix should be scaled to be*  not much smaller than that, either.**  See W. Kahan "Accurate Eigenvalues of a Symmetric Tridiagonal*  Matrix", Report CS41, Computer Science Dept., Stanford*  University, July 21, 1966**  Note: the arguments are, in general, *not* checked for unreasonable*  values.**  Arguments*  =========**  IJOB    (input) INTEGER*          Specifies what is to be done:*          = 1:  Compute NAB for the initial intervals.*          = 2:  Perform bisection iteration to find eigenvalues of T.*          = 3:  Perform bisection iteration to invert N(w), i.e.,*                to find a point which has a specified number of*                eigenvalues of T to its left.*          Other values will cause SLAEBZ to return with INFO=-1.**  NITMAX  (input) INTEGER*          The maximum number of "levels" of bisection to be*          performed, i.e., an interval of width W will not be made*          smaller than 2^(-NITMAX) * W.  If not all intervals*          have converged after NITMAX iterations, then INFO is set*          to the number of non-converged intervals.*

⌨️ 快捷键说明

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