SUBROUTINESTPSVF(UPLO,TRANS,DIAG,N,AP,X,INCX)*..ScalarArguments..INTEGERINCX,NCHARACTER*1DIAG,TRANS,UPLO*..ArrayArguments..REALAP(*),X(*)*..**Purpose*=======**STPSVsolvesoneofthesystemsofequations**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, supplied in packed form.** 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.** AP - REAL array of DIMENSION at least* ( ( n*( n + 1 ) )/2 ).* Before entry with UPLO = 'U' or 'u', the array AP must* contain the upper triangular matrix packed sequentially,* column by column, so that AP( 1 ) contains a( 1, 1 ),* AP( 2 ) and AP( 3 ) contain a( 1, 2 ) and a( 2, 2 )* respectively, and so on.* Before entry with UPLO = 'L' or 'l', the array AP must* contain the lower triangular matrix packed sequentially,* column by column, so that AP( 1 ) contains a( 1, 1 ),* AP( 2 ) and AP( 3 ) contain a( 2, 1 ) and a( 3, 1 )* respectively, and so on.* Note that when DIAG = 'U' or 'u', the diagonal elements of* A are not referenced, but are assumed to be unity.* Unchanged on exit.** X - REAL 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 ..REAL ZEROPARAMETER ( ZERO = 0.0E+0 )* .. Local Scalars ..REAL TEMPINTEGER I, INFO, IX, J, JX, K, KK, KXLOGICAL NOUNIT* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* .. External Subroutines ..EXTERNAL XERBLA* ..* .. 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( INCX.EQ.0 )THENINFO = 7END IFIF( INFO.NE.0 )THENCALL XERBLA( 'STPSV', 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 AP are* accessed sequentially with one pass through AP.*IF( LSAME( TRANS, 'N' ) )THEN** Form x := inv( A )*x.*IF( LSAME( UPLO, 'U' ) )THENKK = ( N*( N + 1 ) )/2IF( INCX.EQ.1 )THENDO 20, J = N, 1, -1IF( X( J ).NE.ZERO )THENIF( NOUNIT )$ X( J ) = X( J )/AP( KK )TEMP = X( J )K = KK - 1DO 10, I = J - 1, 1, -1X( I ) = X( I ) - TEMP*AP( K )K = K - 110 CONTINUEEND IFKK = KK - J20 CONTINUEELSEJX = KX + ( N - 1 )*INCXDO 40, J = N, 1, -1IF( X( JX ).NE.ZERO )THENIF( NOUNIT )$ X( JX ) = X( JX )/AP( KK )TEMP = X( JX )IX = JXDO 30, K = KK - 1, KK - J + 1, -1IX = IX - INCXX( IX ) = X( IX ) - TEMP*AP( K )30 CONTINUEEND IFJX = JX - INCXKK = KK - J40 CONTINUEEND IFELSEKK = 1IF( INCX.EQ.1 )THENDO 60, J = 1, NIF( X( J ).NE.ZERO )THENIF( NOUNIT )$ X( J ) = X( J )/AP( KK )TEMP = X( J )K = KK + 1DO 50, I = J + 1, NX( I ) = X( I ) - TEMP*AP( K )K = K + 150 CONTINUEEND IFKK = KK + ( N - J + 1 )60 CONTINUEELSEJX = KXDO 80, J = 1, NIF( X( JX ).NE.ZERO )THENIF( NOUNIT )$ X( JX ) = X( JX )/AP( KK )TEMP = X( JX )IX = JXDO 70, K = KK + 1, KK + N - JIX = IX + INCXX( IX ) = X( IX ) - TEMP*AP( K )70 CONTINUEEND IFJX = JX + INCXKK = KK + ( N - J + 1 )80 CONTINUEEND IFEND IFELSE** Form x := inv( A')*x.*IF(LSAME(UPLO,'U'))THENKK=1IF(INCX.EQ.1)THENDO100,J=1,NTEMP=X(J)K=KKDO90,I=1,J-1TEMP=TEMP-AP(K)*X(I)K=K+190CONTINUEIF(NOUNIT)$TEMP=TEMP/AP(KK+J-1)X(J)=TEMPKK=KK+J100CONTINUEELSEJX=KXDO120,J=1,NTEMP=X(JX)IX=KXDO110,K=KK,KK+J-2TEMP=TEMP-AP(K)*X(IX)IX=IX+INCX110CONTINUEIF(NOUNIT)$TEMP=TEMP/AP(KK+J-1)X(JX)=TEMPJX=JX+INCXKK=KK+J120CONTINUEENDIFELSEKK=(N*(N+1))/2IF(INCX.EQ.1)THENDO140,J=N,1,-1TEMP=X(J)K=KKDO130,I=N,J+1,-1TEMP=TEMP-AP(K)*X(I)K=K-1130CONTINUEIF(NOUNIT)$TEMP=TEMP/AP(KK-N+J)X(J)=TEMPKK=KK-(N-J+1)140CONTINUEELSEKX=KX+(N-1)*INCXJX=KXDO160,J=N,1,-1TEMP=X(JX)IX=KXDO150,K=KK,KK-(N-(J+1)),-1TEMP=TEMP-AP(K)*X(IX)IX=IX-INCX150CONTINUEIF(NOUNIT)$TEMP=TEMP/AP(KK-N+J)X(JX)=TEMPJX=JX-INCXKK=KK-(N-J+1)160CONTINUEENDIFENDIFENDIF*RETURN**EndofSTPSV.*END
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。