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

📄 inverse.f

📁 一个基于打靶法的最优控制求解软件 求解过程中采用参数延续算法
💻 F
📖 第 1 页 / 共 5 页
字号:
     $         CALL DSWAP( N, A( I, 1 ), LDA, A( IP, 1 ), LDA )            IX = IX + INCX   20    CONTINUE      ELSE IF( INCX.LT.0 ) THEN         DO 30 I = K2, K1, -1            IP = IPIV( IX )            IF( IP.NE.I )     $         CALL DSWAP( N, A( I, 1 ), LDA, A( IP, 1 ), LDA )            IX = IX + INCX   30    CONTINUE      END IF*      RETURN**     End of DLASWP*      ENDc      subroutine  dscal(n,da,dx,incx)cccc     scales a vector by a constant.cc     uses unrolled loops for increment equal to one.cc     jack dongarra, linpack, 3/11/78.cc     modified to correct problem with negative increment, 8/21/90.ccc      double precision da,dx(1)c      integer i,incx,ix,m,mp1,nccc      if(n.le.0)returnc      if(incx.eq.1)go to 20cccc        code for increment not equal to 1ccc      ix = 1c      if(incx.lt.0)ix = (-n+1)*incx + 1c      do 10 i = 1,nc        dx(ix) = da*dx(ix)c        ix = ix + incxc   10 continuec      returncccc        code for increment equal to 1cccccc        clean-up loopccc   20 m = mod(n,5)c      if( m .eq. 0 ) go to 40c      do 30 i = 1,mc        dx(i) = da*dx(i)c   30 continuec      if( n .lt. 5 ) returnc   40 mp1 = m + 1c      do 50 i = mp1,n,5c        dx(i) = da*dx(i)c        dx(i + 1) = da*dx(i + 1)c        dx(i + 2) = da*dx(i + 2)c        dx(i + 3) = da*dx(i + 3)c        dx(i + 4) = da*dx(i + 4)c   50 continuec      returnc      end      subroutine  dswap (n,dx,incx,dy,incy)cc     interchanges two vectors.c     uses unrolled loops for increments equal one.c     jack dongarra, linpack, 3/11/78.c      double precision dx(1),dy(1),dtemp      integer i,incx,incy,ix,iy,m,mp1,nc      if(n.le.0)return      if(incx.eq.1.and.incy.eq.1)go to 20cc       code for unequal increments or equal increments not equalc         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        dtemp = dx(ix)        dx(ix) = dy(iy)        dy(iy) = dtemp        ix = ix + incx        iy = iy + incy   10 continue      returncc       code for both increments equal to 1ccc       clean-up loopc   20 m = mod(n,3)      if( m .eq. 0 ) go to 40      do 30 i = 1,m        dtemp = dx(i)        dx(i) = dy(i)        dy(i) = dtemp   30 continue      if( n .lt. 3 ) return   40 mp1 = m + 1      do 50 i = mp1,n,3        dtemp = dx(i)        dx(i) = dy(i)        dy(i) = dtemp        dtemp = dx(i + 1)        dx(i + 1) = dy(i + 1)        dy(i + 1) = dtemp        dtemp = dx(i + 2)        dx(i + 2) = dy(i + 2)        dy(i + 2) = dtemp   50 continue      return      end      SUBROUTINE DTRMM (SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA,     $   B, LDB)C***BEGIN PROLOGUE  DTRMMC***PURPOSE  Perform one of the matrix-matrix operations.C***LIBRARY   SLATEC (BLAS)C***CATEGORY  D1B6C***TYPE      DOUBLE PRECISION (STRMM-S, DTRMM-D, CTRMM-C)C***KEYWORDS  LEVEL 3 BLAS, LINEAR ALGEBRAC***AUTHOR  Dongarra, J., (ANL)C           Duff, I., (AERE)C           Du Croz, J., (NAG)C           Hammarling, S. (NAG)C***DESCRIPTIONCC  DTRMM  performs one of the matrix-matrix operationsCC     B := alpha*op( A )*B,   or   B := alpha*B*op( A ),CC  where  alpha  is a scalar,  B  is an m by n matrix,  A  is a unit, orC  non-unit,  upper or lower triangular matrix  and  op( A )  is one  ofCC     op( A ) = A   or   op( A ) = A'.CC  ParametersC  ==========CC  SIDE   - CHARACTER*1.C           On entry,  SIDE specifies whether  op( A ) multiplies B fromC           the left or right as follows:CC              SIDE = 'L' or 'l'   B := alpha*op( A )*B.CC              SIDE = 'R' or 'r'   B := alpha*B*op( A ).CC           Unchanged on exit.CC  UPLO   - CHARACTER*1.C           On entry, UPLO specifies whether the matrix A is an upper orC           lower triangular matrix as follows:CC              UPLO = 'U' or 'u'   A is an upper triangular matrix.CC              UPLO = 'L' or 'l'   A is a lower triangular matrix.CC           Unchanged on exit.CC  TRANSA - CHARACTER*1.C           On entry, TRANSA specifies the form of op( A ) to be used inC           the matrix multiplication as follows:CC              TRANSA = 'N' or 'n'   op( A ) = A.CC              TRANSA = 'T' or 't'   op( A ) = A'.CC              TRANSA = 'C' or 'c'   op( A ) = A'.CC           Unchanged on exit.CC  DIAG   - CHARACTER*1.C           On entry, DIAG specifies whether or not A is unit triangularC           as follows:CC              DIAG = 'U' or 'u'   A is assumed to be unit triangular.CC              DIAG = 'N' or 'n'   A is not assumed to be unitC                                  triangular.CC           Unchanged on exit.CC  M      - INTEGER.C           On entry, M specifies the number of rows of B. M must be atC           least zero.C           Unchanged on exit.CC  N      - INTEGER.C           On entry, N specifies the number of columns of B.  N must beC           at least zero.C           Unchanged on exit.CC  ALPHA  - DOUBLE PRECISION.C           On entry,  ALPHA specifies the scalar  alpha. When  alpha isC           zero then  A is not referenced and  B need not be set beforeC           entry.C           Unchanged on exit.CC  A      - DOUBLE PRECISION array of DIMENSION ( LDA, k ), where k is mC           when  SIDE = 'L' or 'l'  and is  n  when  SIDE = 'R' or 'r'.C           Before entry  with  UPLO = 'U' or 'u',  the  leading  k by kC           upper triangular part of the array  A must contain the upperC           triangular matrix  and the strictly lower triangular part ofC           A is not referenced.C           Before entry  with  UPLO = 'L' or 'l',  the  leading  k by kC           lower triangular part of the array  A must contain the lowerC           triangular matrix  and the strictly upper triangular part ofC           A is not referenced.C           Note that when  DIAG = 'U' or 'u',  the diagonal elements ofC           A  are not referenced either,  but are assumed to be  unity.C           Unchanged on exit.CC  LDA    - INTEGER.C           On entry, LDA specifies the first dimension of A as declaredC           in the calling (sub) program.  When  SIDE = 'L' or 'l'  thenC           LDA  must be at least  max( 1, m ),  when  SIDE = 'R' or 'r'C           then LDA must be at least max( 1, n ).C           Unchanged on exit.CC  B      - DOUBLE PRECISION array of DIMENSION ( LDB, n ).C           Before entry,  the leading  m by n part of the array  B mustC           contain the matrix  B,  and  on exit  is overwritten  by theC           transformed matrix.CC  LDB    - INTEGER.C           On entry, LDB specifies the first dimension of B as declaredC           in  the  calling  (sub)  program.   LDB  must  be  at  leastC           max( 1, m ).C           Unchanged on exit.CC***REFERENCES  Dongarra, J., Du Croz, J., Duff, I., and Hammarling, S.C                 A set of level 3 basic linear algebra subprograms.C                 ACM TOMS, Vol. 16, No. 1, pp. 1-17, March 1990.C***ROUTINES CALLED  LSAME, XERBLAC***REVISION HISTORY  (YYMMDD)C   890208  DATE WRITTENC   910605  Modified to meet SLATEC prologue standards.  Only commentC           lines were modified.  (BKS)C***END PROLOGUE  DTRMMC     .. Scalar Arguments ..      CHARACTER*1        SIDE, UPLO, TRANSA, DIAG      INTEGER            M, N, LDA, LDB      DOUBLE PRECISION   ALPHAC     .. Array Arguments ..      DOUBLE PRECISION   A( LDA, * ), B( LDB, * )C     .. External Functions ..      LOGICAL            LSAME      EXTERNAL           LSAMEC     .. External Subroutines ..      EXTERNAL           XERBLAC     .. Intrinsic Functions ..      INTRINSIC          MAXC     .. Local Scalars ..      LOGICAL            LSIDE, NOUNIT, UPPER      INTEGER            I, INFO, J, K, NROWA      DOUBLE PRECISION   TEMPC     .. Parameters ..      DOUBLE PRECISION   ONE         , ZERO      PARAMETER        ( ONE = 1D+0, ZERO = 0D+0 )C***FIRST EXECUTABLE STATEMENT  DTRMMCC     Test the input parameters.C      LSIDE  = LSAME( SIDE  , 'L' )      IF( LSIDE )THEN         NROWA = M      ELSE         NROWA = N      END IF      NOUNIT = LSAME( DIAG  , 'N' )      UPPER  = LSAME( UPLO  , 'U' )C      INFO   = 0      IF(      ( .NOT.LSIDE                ).AND.     $         ( .NOT.LSAME( SIDE  , 'R' ) )      )THEN         INFO = 1      ELSE IF( ( .NOT.UPPER                ).AND.     $         ( .NOT.LSAME( UPLO  , 'L' ) )      )THEN         INFO = 2      ELSE IF( ( .NOT.LSAME( TRANSA, 'N' ) ).AND.     $         ( .NOT.LSAME( TRANSA, 'T' ) ).AND.     $         ( .NOT.LSAME( TRANSA, 'C' ) )      )THEN         INFO = 3      ELSE IF( ( .NOT.LSAME( DIAG  , 'U' ) ).AND.     $         ( .NOT.LSAME( DIAG  , 'N' ) )      )THEN         INFO = 4      ELSE IF( M  .LT.0               )THEN         INFO = 5      ELSE IF( N  .LT.0               )THEN         INFO = 6      ELSE IF( LDA.LT.MAX( 1, NROWA ) )THEN         INFO = 9      ELSE IF( LDB.LT.MAX( 1, M     ) )THEN         INFO = 11      END IF      IF( INFO.NE.0 )THEN         CALL XERBLA( 'DTRMM ', INFO )         RETURN      END IFCC     Quick return if possible.C      IF( N.EQ.0 )     $   RETURNCC     And when  alpha.eq.zero.C      IF( ALPHA.EQ.ZERO )THEN         DO 20, J = 1, N            DO 10, I = 1, M               B( I, J ) = ZERO   10       CONTINUE   20    CONTINUE         RETURN      END IFCC     Start the operations.C      IF( LSIDE )THEN         IF( LSAME( TRANSA, 'N' ) )THENCC           Form  B := alpha*A*B.C            IF( UPPER )THEN               DO 50, J = 1, N                  DO 40, K = 1, M                     IF( B( K, J ).NE.ZERO )THEN                        TEMP = ALPHA*B( K, J )                        DO 30, I = 1, K - 1                           B( I, J ) = B( I, J ) + TEMP*A( I, K )   30                   CONTINUE                        IF( NOUNIT )     $                     TEMP = TEMP*A( K, K )                        B( K, J ) = TEMP                     END IF   40             CONTINUE   50          CONTINUE            ELSE               DO 80, J = 1, N                  DO 70 K = M, 1, -1                     IF( B( K, J ).NE.ZERO )THEN                        TEMP      = ALPHA*B( K, J )                        B( K, J ) = TEMP                        IF( NOUNIT )     $                     B( K, J ) = B( K, J )*A( K, K )                        DO 60, I = K + 1, M                           B( I, J ) = B( I, J ) + TEMP*A( I, K )   60                   CONTINUE                     END IF   70             CONTINUE   80          CONTINUE            END IF         ELSECC           Form  B := alpha*B*A'.C            IF( UPPER )THEN               DO 110, J = 1, N                  DO 100, I = M, 1, -1                     TEMP = B( I, J )                     IF( NOUNIT )     $                  TEMP = TEMP*A( I, I )                     DO 90, K = 1, I - 1                        TEMP = TEMP + A( K, I )*B( K, J )   90                CONTINUE                     B( I, J ) = ALPHA*TEMP  100             CONTINUE  110          CONTINUE            ELSE               DO 140, J = 1, N                  DO 130, I = 1, M                     TEMP = B( I, J )                     IF( NOUNIT )     $                  TEMP = TEMP*A( I, I )                     DO 120, K = I + 1, M                        TEMP = TEMP + A( K, I )*B( K, J )  120                CONTINUE                     B( I, J ) = ALPHA*TEMP  130             CONTINUE  140          CONTINUE            END IF         END IF      ELSE         IF( LSAME( TRANSA, 'N' ) )THENCC           Form  B := alpha*B*A.C            IF( UPPER )THEN               DO 180, J = N, 1, -1                  TEMP = ALPHA                  IF( NOUNIT )     $               TEMP = TEMP*A( J, J )                  DO 150, I = 1, M                     B( I, J ) = TEMP*B( I, J )  150             CONTINUE                  DO 170, K = 1, J - 1                     IF( A( K, J ).NE.ZERO )THEN                        TEMP = ALPHA*A( K, J )                        DO 160, I = 1, M                           B( I, J ) = B( I, J ) + TEMP*B( I, K )  160                   CONTINUE                     END IF  170             CONTINUE  180          CONTINUE            ELSE               DO 220, J = 1, N                  TEMP = ALPHA                  IF( NOUNIT )     $               TEMP = TEMP*A( J, J )                  DO 190, I = 1, M                     B( I, J ) = TEMP*B( I, J )  190             CONTINUE                  DO 210, K = J + 1, N                     IF( A( K, J ).NE.ZERO )THEN                        TEMP = ALPHA*A( K, J )                        DO 200, I = 1, M                           B( I, J ) = B( I, J ) + TEMP*B( I, K )  200                   CONTINUE                     END IF  210             CONTINUE  220          CONTINUE            END IF         ELSECC           Form  B := alpha*B*A'.

⌨️ 快捷键说明

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