SUBROUTINECHERF(UPLO,N,ALPHA,X,INCX,A,LDA)*..ScalarArguments..REALALPHAINTEGERINCX,LDA,NCHARACTER*1UPLO*..ArrayArguments..COMPLEXA(LDA,*),X(*)*..**Purpose*=======**CHERperformsthehermitianrank1operation**A:=alpha*x*conjg(x' ) + A,** where alpha is a real scalar, x is an n element vector and A is an* n by n hermitian matrix.** Parameters* ==========** UPLO - CHARACTER*1.* On entry, UPLO specifies whether the upper or lower* triangular part of the array A is to be referenced as* follows:** UPLO = 'U' or 'u' Only the upper triangular part of A* is to be referenced.** UPLO = 'L' or 'l' Only the lower triangular part of A* is to be referenced.** Unchanged on exit.** N - INTEGER.* On entry, N specifies the order of the matrix A.* N must be at least zero.* Unchanged on exit.** ALPHA - REAL .* On entry, ALPHA specifies the scalar alpha.* Unchanged on exit.** X - COMPLEX array of dimension at least* ( 1 + ( n - 1 )*abs( INCX ) ).* Before entry, the incremented array X must contain the n* element vector x.* Unchanged on exit.** INCX - INTEGER.* On entry, INCX specifies the increment for the elements of* X. INCX must not be zero.* Unchanged on exit.** A - COMPLEX 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 part of the hermitian matrix and the strictly* lower triangular part of A is not referenced. On exit, the* upper triangular part of the array A is overwritten by the* upper triangular part of the updated matrix.* Before entry with UPLO = 'L' or 'l', the leading n by n* lower triangular part of the array A must contain the lower* triangular part of the hermitian matrix and the strictly* upper triangular part of A is not referenced. On exit, the* lower triangular part of the array A is overwritten by the* lower triangular part of the updated matrix.* Note that the imaginary parts of the diagonal elements need* not be set, they are assumed to be zero, and on exit they* are set to zero.** 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.*** 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 ..COMPLEX ZEROPARAMETER ( ZERO = ( 0.0E+0, 0.0E+0 ) )* .. Local Scalars ..COMPLEX TEMPINTEGER I, INFO, IX, J, JX, KX* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* .. External Subroutines ..EXTERNAL XERBLA* .. Intrinsic Functions ..INTRINSIC CONJG, MAX, REAL* ..* .. Executable Statements ..** Test the input parameters.*INFO = 0IF ( .NOT.LSAME( UPLO, 'U' ).AND.$ .NOT.LSAME( UPLO, 'L' ) )THENINFO = 1ELSE IF( N.LT.0 )THENINFO = 2ELSE IF( INCX.EQ.0 )THENINFO = 5ELSE IF( LDA.LT.MAX( 1, N ) )THENINFO = 7END IFIF( INFO.NE.0 )THENCALL XERBLA( 'CHER', INFO )RETURNEND IF** Quick return if possible.*IF( ( N.EQ.0 ).OR.( ALPHA.EQ.REAL( ZERO ) ) )$ RETURN** Set the start point in X if the increment is not unity.*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 the triangular part* of A.*IF( LSAME( UPLO, 'U' ) )THEN** Form A when A is stored in upper triangle.*IF( INCX.EQ.1 )THENDO 20, J = 1, NIF( X( J ).NE.ZERO )THENTEMP = ALPHA*CONJG( X( J ) )DO 10, I = 1, J - 1A( I, J ) = A( I, J ) + X( I )*TEMP10 CONTINUEA( J, J ) = REAL( A( J, J ) ) + REAL( X( J )*TEMP )ELSEA( J, J ) = REAL( A( J, J ) )END IF20 CONTINUEELSEJX = KXDO 40, J = 1, NIF( X( JX ).NE.ZERO )THENTEMP = ALPHA*CONJG( X( JX ) )IX = KXDO 30, I = 1, J - 1A( I, J ) = A( I, J ) + X( IX )*TEMPIX = IX + INCX30 CONTINUEA( J, J ) = REAL( A( J, J ) ) + REAL( X( JX )*TEMP )ELSEA( J, J ) = REAL( A( J, J ) )END IFJX = JX + INCX40 CONTINUEEND IFELSE** Form A when A is stored in lower triangle.*IF( INCX.EQ.1 )THENDO 60, J = 1, NIF( X( J ).NE.ZERO )THENTEMP = ALPHA*CONJG( X( J ) )A( J, J ) = REAL( A( J, J ) ) + REAL( TEMP*X( J ) )DO 50, I = J + 1, NA( I, J ) = A( I, J ) + X( I )*TEMP50 CONTINUEELSEA( J, J ) = REAL( A( J, J ) )END IF60 CONTINUEELSEJX = KXDO 80, J = 1, NIF( X( JX ).NE.ZERO )THENTEMP = ALPHA*CONJG( X( JX ) )A( J, J ) = REAL( A( J, J ) ) + REAL( TEMP*X( JX ) )IX = JXDO 70, I = J + 1, NIX = IX + INCXA( I, J ) = A( I, J ) + X( IX )*TEMP70 CONTINUEELSEA( J, J ) = REAL( A( J, J ) )END IFJX = JX + INCX80 CONTINUEEND IFEND IF*RETURN** End of CHER .*END
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。