📄 inverse.f
字号:
$ 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 + -