SUBROUTINEDTRSVF(UPLO,TRANS,DIAG,N,A,LDA,X,INCX)*..ScalarArguments..INTEGERINCX,LDA,NCHARACTER*1DIAG,TRANS,UPLO*..ArrayArguments..DOUBLE PRECISIONA(LDA,*),X(*)*..**Purpose*=======**DTRSVsolvesoneofthesystemsofequations**A*x=b,orA'*x = b,** where b and x are n element vectors and A is an n by n unit, or* non-unit, upper or lower triangular matrix.** No test for singularity or near-singularity is included in this* routine. Such tests must be performed before calling this routine.** Parameters* ==========** UPLO - CHARACTER*1.* On entry, UPLO specifies whether the matrix 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.** TRANS - CHARACTER*1.* On entry, TRANS specifies the equations to be solved as* follows:** TRANS = 'N' or 'n' A*x = b.** TRANS = 'T' or 't' A'*x=b.**TRANS='C'or'c'A'*x = b.** 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.** N - INTEGER.* On entry, N specifies the order of the matrix A.* N must be at least zero.* Unchanged on exit.** A - DOUBLE PRECISION array of DIMENSION ( LDA, n ).* Before entry with UPLO = 'U' or 'u', the leading n by n* upper triangular part of the array A must contain the upper* triangular matrix and the strictly lower triangular part of* A is not referenced.* Before entry with UPLO = 'L' or 'l', the leading n by n* lower triangular part of the array A must contain the lower* triangular matrix and the strictly upper triangular part of* A is not referenced.* Note that when DIAG = 'U' or 'u', the diagonal elements of* A are not referenced either, but are assumed to be unity.* 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, n ).* Unchanged on exit.** X - DOUBLE PRECISION array of dimension at least* ( 1 + ( n - 1 )*abs( INCX ) ).* Before entry, the incremented array X must contain the n* element right-hand side vector b. On exit, X is overwritten* with the solution vector x.** INCX - INTEGER.* On entry, INCX specifies the increment for the elements of* X. INCX 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 ..DOUBLE PRECISION ZEROPARAMETER ( ZERO = 0.0D+0 )* .. Local Scalars ..DOUBLE PRECISION TEMPINTEGER I, INFO, IX, J, JX, KXLOGICAL NOUNIT* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* .. External Subroutines ..EXTERNAL XERBLA* .. Intrinsic Functions ..INTRINSIC MAX* ..* .. Executable Statements ..** Test the input parameters.*INFO = 0IF ( .NOT.LSAME( UPLO , 'U' ).AND.$ .NOT.LSAME( UPLO , 'L' ) )THENINFO = 1ELSE IF( .NOT.LSAME( TRANS, 'N' ).AND.$ .NOT.LSAME( TRANS, 'T' ).AND.$ .NOT.LSAME( TRANS, 'C' ) )THENINFO = 2ELSE IF( .NOT.LSAME( DIAG , 'U' ).AND.$ .NOT.LSAME( DIAG , 'N' ) )THENINFO = 3ELSE IF( N.LT.0 )THENINFO = 4ELSE IF( LDA.LT.MAX( 1, N ) )THENINFO = 6ELSE IF( INCX.EQ.0 )THENINFO = 8END IFIF( INFO.NE.0 )THENCALL XERBLA( 'DTRSV', INFO )RETURNEND IF** Quick return if possible.*IF( N.EQ.0 )$ RETURN*NOUNIT = LSAME( DIAG, 'N' )** Set up the start point in X if the increment is not unity. This* will be ( N - 1 )*INCX too small for descending loops.*IF( INCX.LE.0 )THENKX = 1 - ( N - 1 )*INCXELSE IF( INCX.NE.1 )THENKX = 1END IF** Start the operations. In this version the elements of A are* accessed sequentially with one pass through A.*IF( LSAME( TRANS, 'N' ) )THEN** Form x := inv( A )*x.*IF( LSAME( UPLO, 'U' ) )THENIF( INCX.EQ.1 )THENDO 20, J = N, 1, -1IF( X( J ).NE.ZERO )THENIF( NOUNIT )$ X( J ) = X( J )/A( J, J )TEMP = X( J )DO 10, I = J - 1, 1, -1X( I ) = X( I ) - TEMP*A( I, J )10 CONTINUEEND IF20 CONTINUEELSEJX = KX + ( N - 1 )*INCXDO 40, J = N, 1, -1IF( X( JX ).NE.ZERO )THENIF( NOUNIT )$ X( JX ) = X( JX )/A( J, J )TEMP = X( JX )IX = JXDO 30, I = J - 1, 1, -1IX = IX - INCXX( IX ) = X( IX ) - TEMP*A( I, J )30 CONTINUEEND IFJX = JX - INCX40 CONTINUEEND IFELSEIF( INCX.EQ.1 )THENDO 60, J = 1, NIF( X( J ).NE.ZERO )THENIF( NOUNIT )$ X( J ) = X( J )/A( J, J )TEMP = X( J )DO 50, I = J + 1, NX( I ) = X( I ) - TEMP*A( I, J )50 CONTINUEEND IF60 CONTINUEELSEJX = KXDO 80, J = 1, NIF( X( JX ).NE.ZERO )THENIF( NOUNIT )$ X( JX ) = X( JX )/A( J, J )TEMP = X( JX )IX = JXDO 70, I = J + 1, NIX = IX + INCXX( IX ) = X( IX ) - TEMP*A( I, J )70 CONTINUEEND IFJX = JX + INCX80 CONTINUEEND IFEND IFELSE** Form x := inv( A')*x.*IF(LSAME(UPLO,'U'))THENIF(INCX.EQ.1)THENDO100,J=1,NTEMP=X(J)DO90,I=1,J-1TEMP=TEMP-A(I,J)*X(I)90CONTINUEIF(NOUNIT)$TEMP=TEMP/A(J,J)X(J)=TEMP100CONTINUEELSEJX=KXDO120,J=1,NTEMP=X(JX)IX=KXDO110,I=1,J-1TEMP=TEMP-A(I,J)*X(IX)IX=IX+INCX110CONTINUEIF(NOUNIT)$TEMP=TEMP/A(J,J)X(JX)=TEMPJX=JX+INCX120CONTINUEENDIFELSEIF(INCX.EQ.1)THENDO140,J=N,1,-1TEMP=X(J)DO130,I=N,J+1,-1TEMP=TEMP-A(I,J)*X(I)130CONTINUEIF(NOUNIT)$TEMP=TEMP/A(J,J)X(J)=TEMP140CONTINUEELSEKX=KX+(N-1)*INCXJX=KXDO160,J=N,1,-1TEMP=X(JX)IX=KXDO150,I=N,J+1,-1TEMP=TEMP-A(I,J)*X(IX)IX=IX-INCX150CONTINUEIF(NOUNIT)$TEMP=TEMP/A(J,J)X(JX)=TEMPJX=JX-INCX160CONTINUEENDIFENDIFENDIF*RETURN**EndofDTRSV.*END
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。