📄 inverse.f
字号:
C IF( UPPER )THEN DO 260, K = 1, N DO 240, J = 1, K - 1 IF( A( J, K ).NE.ZERO )THEN TEMP = ALPHA*A( J, K ) DO 230, I = 1, M B( I, J ) = B( I, J ) + TEMP*B( I, K ) 230 CONTINUE END IF 240 CONTINUE TEMP = ALPHA IF( NOUNIT ) $ TEMP = TEMP*A( K, K ) IF( TEMP.NE.ONE )THEN DO 250, I = 1, M B( I, K ) = TEMP*B( I, K ) 250 CONTINUE END IF 260 CONTINUE ELSE DO 300, K = N, 1, -1 DO 280, J = K + 1, N IF( A( J, K ).NE.ZERO )THEN TEMP = ALPHA*A( J, K ) DO 270, I = 1, M B( I, J ) = B( I, J ) + TEMP*B( I, K ) 270 CONTINUE END IF 280 CONTINUE TEMP = ALPHA IF( NOUNIT ) $ TEMP = TEMP*A( K, K ) IF( TEMP.NE.ONE )THEN DO 290, I = 1, M B( I, K ) = TEMP*B( I, K ) 290 CONTINUE END IF 300 CONTINUE END IF END IF END IFC RETURNCC End of DTRMM .C END*DECK DTRMV SUBROUTINE DTRMV (UPLO, TRANS, DIAG, N, A, LDA, X, INCX)C***BEGIN PROLOGUE DTRMVC***PURPOSE Perform one of the matrix-vector operations.C***LIBRARY SLATEC (BLAS)C***CATEGORY D1B4C***TYPE DOUBLE PRECISION (STRMV-S, DTRMV-D, CTRMV-C)C***KEYWORDS LEVEL 2 BLAS, LINEAR ALGEBRAC***AUTHOR Dongarra, J. J., (ANL)C Du Croz, J., (NAG)C Hammarling, S., (NAG)C Hanson, R. J., (SNLA)C***DESCRIPTIONCC DTRMV performs one of the matrix-vector operationsCC x := A*x, or x := A'*x,CC where x is an n element vector and A is an n by n unit, or non-unit,C upper or lower triangular matrix.CC ParametersC ==========CC UPLO - CHARACTER*1.C On entry, UPLO specifies whether the matrix 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 TRANS - CHARACTER*1.C On entry, TRANS specifies the operation to be performed asC follows:CC TRANS = 'N' or 'n' x := A*x.CC TRANS = 'T' or 't' x := A'*x.CC TRANS = 'C' or 'c' x := A'*x.CC Unchanged on exit.CC DIAG - CHARACTER*1.C On entry, DIAG specifies whether or not A is unitC triangular 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 N - INTEGER.C On entry, N specifies the order of the matrix A.C N must be at least zero.C Unchanged on exit.CC A - DOUBLE PRECISION array of DIMENSION ( LDA, n).C Before entry with UPLO = 'U' or 'u', the leading n by nC 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 n by nC 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. LDA must be at leastC max( 1, n ).C Unchanged on exit.CC X - DOUBLE PRECISION array of dimension at leastC ( 1 + ( n - 1 )*abs( INCX ) ).C Before entry, the incremented array X must contain the nC element vector x. On exit, X is overwritten with theC transformed vector x.CC INCX - INTEGER.C On entry, INCX specifies the increment for the elements ofC X. INCX must not be zero.C Unchanged on exit.CC***REFERENCES Dongarra, J. J., Du Croz, J., Hammarling, S., andC Hanson, R. J. An extended set of Fortran basic linearC algebra subprograms. ACM TOMS, Vol. 14, No. 1,C pp. 1-17, March 1988.C***ROUTINES CALLED LSAME, XERBLAC***REVISION HISTORY (YYMMDD)C 861022 DATE WRITTENC 910605 Modified to meet SLATEC prologue standards. Only commentC lines were modified. (BKS)C***END PROLOGUE DTRMVC .. Scalar Arguments .. INTEGER INCX, LDA, N CHARACTER*1 DIAG, TRANS, UPLOC .. Array Arguments .. DOUBLE PRECISION A( LDA, * ), X( * )C .. Parameters .. DOUBLE PRECISION ZERO PARAMETER ( ZERO = 0D+0 )C .. Local Scalars .. DOUBLE PRECISION TEMP INTEGER I, INFO, IX, J, JX, KX LOGICAL NOUNITC .. External Functions .. LOGICAL LSAME EXTERNAL LSAMEC .. External Subroutines .. EXTERNAL XERBLAC .. Intrinsic Functions .. INTRINSIC MAXC***FIRST EXECUTABLE STATEMENT DTRMVCC Test the input parameters.C INFO = 0 IF ( .NOT.LSAME( UPLO , 'U' ).AND. $ .NOT.LSAME( UPLO , 'L' ) )THEN INFO = 1 ELSE IF( .NOT.LSAME( TRANS, 'N' ).AND. $ .NOT.LSAME( TRANS, 'T' ).AND. $ .NOT.LSAME( TRANS, 'C' ) )THEN INFO = 2 ELSE IF( .NOT.LSAME( DIAG , 'U' ).AND. $ .NOT.LSAME( DIAG , 'N' ) )THEN INFO = 3 ELSE IF( N.LT.0 )THEN INFO = 4 ELSE IF( LDA.LT.MAX( 1, N ) )THEN INFO = 6 ELSE IF( INCX.EQ.0 )THEN INFO = 8 END IF IF( INFO.NE.0 )THEN CALL XERBLA( 'DTRMV ', INFO ) RETURN END IFCC Quick return if possible.C IF( N.EQ.0 ) $ RETURNC NOUNIT = LSAME( DIAG, 'N' )CC Set up the start point in X if the increment is not unity. ThisC will be ( N - 1 )*INCX too small for descending loops.C IF( INCX.LE.0 )THEN KX = 1 - ( N - 1 )*INCX ELSE IF( INCX.NE.1 )THEN KX = 1 END IFCC Start the operations. In this version the elements of A areC accessed sequentially with one pass through A.C IF( LSAME( TRANS, 'N' ) )THENCC Form x := A*x.C IF( LSAME( UPLO, 'U' ) )THEN IF( INCX.EQ.1 )THEN DO 20, J = 1, N IF( X( J ).NE.ZERO )THEN TEMP = X( J ) DO 10, I = 1, J - 1 X( I ) = X( I ) + TEMP*A( I, J ) 10 CONTINUE IF( NOUNIT ) $ X( J ) = X( J )*A( J, J ) END IF 20 CONTINUE ELSE JX = KX DO 40, J = 1, N IF( X( JX ).NE.ZERO )THEN TEMP = X( JX ) IX = KX DO 30, I = 1, J - 1 X( IX ) = X( IX ) + TEMP*A( I, J ) IX = IX + INCX 30 CONTINUE IF( NOUNIT ) $ X( JX ) = X( JX )*A( J, J ) END IF JX = JX + INCX 40 CONTINUE END IF ELSE IF( INCX.EQ.1 )THEN DO 60, J = N, 1, -1 IF( X( J ).NE.ZERO )THEN TEMP = X( J ) DO 50, I = N, J + 1, -1 X( I ) = X( I ) + TEMP*A( I, J ) 50 CONTINUE IF( NOUNIT ) $ X( J ) = X( J )*A( J, J ) END IF 60 CONTINUE ELSE KX = KX + ( N - 1 )*INCX JX = KX DO 80, J = N, 1, -1 IF( X( JX ).NE.ZERO )THEN TEMP = X( JX ) IX = KX DO 70, I = N, J + 1, -1 X( IX ) = X( IX ) + TEMP*A( I, J ) IX = IX - INCX 70 CONTINUE IF( NOUNIT ) $ X( JX ) = X( JX )*A( J, J ) END IF JX = JX - INCX 80 CONTINUE END IF END IF ELSECC Form x := A'*x.C IF( LSAME( UPLO, 'U' ) )THEN IF( INCX.EQ.1 )THEN DO 100, J = N, 1, -1 TEMP = X( J ) IF( NOUNIT ) $ TEMP = TEMP*A( J, J ) DO 90, I = J - 1, 1, -1 TEMP = TEMP + A( I, J )*X( I ) 90 CONTINUE X( J ) = TEMP 100 CONTINUE ELSE JX = KX + ( N - 1 )*INCX DO 120, J = N, 1, -1 TEMP = X( JX ) IX = JX IF( NOUNIT ) $ TEMP = TEMP*A( J, J ) DO 110, I = J - 1, 1, -1 IX = IX - INCX TEMP = TEMP + A( I, J )*X( IX ) 110 CONTINUE X( JX ) = TEMP JX = JX - INCX 120 CONTINUE END IF ELSE IF( INCX.EQ.1 )THEN DO 140, J = 1, N TEMP = X( J ) IF( NOUNIT ) $ TEMP = TEMP*A( J, J ) DO 130, I = J + 1, N TEMP = TEMP + A( I, J )*X( I ) 130 CONTINUE X( J ) = TEMP 140 CONTINUE ELSE JX = KX DO 160, J = 1, N TEMP = X( JX ) IX = JX IF( NOUNIT ) $ TEMP = TEMP*A( J, J ) DO 150, I = J + 1, N IX = IX + INCX TEMP = TEMP + A( I, J )*X( IX ) 150 CONTINUE X( JX ) = TEMP JX = JX + INCX 160 CONTINUE END IF END IF END IFC RETURNCC End of DTRMV .C END SUBROUTINE DTRSM ( SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, $ B, LDB )* .. Scalar Arguments .. CHARACTER*1 SIDE, UPLO, TRANSA, DIAG INTEGER M, N, LDA, LDB DOUBLE PRECISION ALPHA* .. Array Arguments .. DOUBLE PRECISION A( LDA, * ), B( LDB, * )* ..** Purpose* =======** DTRSM solves one of the matrix equations** op( A )*X = alpha*B, or X*op( A ) = alpha*B,** where alpha is a scalar, X and B are m by n matrices, A is a unit, or* non-unit, upper or lower triangular matrix and op( A ) is one of** op( A ) = A or op( A ) = A'.** The matrix X is overwritten on B.** Parameters* ==========** SIDE - CHARACTER*1.* On entry, SIDE specifies whether op( A ) appears on the left* or right of X as follows:** SIDE = 'L' or 'l' op( A )*X = alpha*B.** SIDE = 'R' or 'r' X*op( A ) = alpha*B.** Unchanged on exit.** UPLO - CHARACTER*1.* On entry, UPLO specifies whether the matrix A is an upper or* lower triangular matrix as follows:** UPLO = 'U' or 'u' A is an upper triangular matrix.** UPLO = 'L' or 'l' A is a lower triangular matrix.** Unchanged on exit.** TRANSA - CHARACTER*1.* On entry, TRANSA specifies the form of op( A ) to be used in* the matrix multiplication as follows:** TRANSA = 'N' or 'n' op( A ) = A.** TRANSA = 'T' or 't' op( A ) = A'.** TRANSA = 'C' or 'c' op( A ) = A'.** Unchanged on exit.** DIAG - CHARACTER*1.* On entry, DIAG specifies whether or not A is unit triangular* as follows:** DIAG = 'U' or 'u' A is assumed to be unit triangular.** DIAG = 'N' or 'n' A is not assumed to be unit* triangular.** Unchanged on exit.** M - INTEGER.* On entry, M specifies the number of rows of B. M must be at* least zero.* Unchanged on exit.** N - INTEGER.* On entry, N specifies the number of columns of B. N must be* at least zero.* Unchanged on exit.** ALPHA - DOUBLE PRECISION.* On entry, ALPHA specifies the scalar alpha. When alpha is* zero then A is not referenced and B need not be set before* entry.* Unchanged on exit.** A - DOUBLE PRECISION array of DIMENSION ( LDA, k ), where k is m* when SIDE = 'L' or 'l' and is n when SIDE = 'R' or 'r'.* Before entry with UPLO = 'U' or 'u', the leading k by k* upper triangular part of the array A must contain the upper*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -