Rev 78769 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
*> \brief \b DASUM** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** DOUBLE PRECISION FUNCTION DASUM(N,DX,INCX)** .. Scalar Arguments ..* INTEGER INCX,N* ..* .. Array Arguments ..* DOUBLE PRECISION DX(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DASUM takes the sum of the absolute values.*> \endverbatim** Arguments:* ==========**> \param[in] N*> \verbatim*> N is INTEGER*> number of elements in input vector(s)*> \endverbatim*>*> \param[in] DX*> \verbatim*> DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) )*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> storage spacing between elements of DX*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level1**> \par Further Details:* =====================*>*> \verbatim*>*> jack dongarra, linpack, 3/11/78.*> modified 3/93 to return if incx .le. 0.*> modified 12/3/93, array(1) declarations changed to array(*)*> \endverbatim*>* =====================================================================DOUBLE PRECISION FUNCTION DASUM(N,DX,INCX)** -- Reference BLAS level1 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..INTEGER INCX,N* ..* .. Array Arguments ..DOUBLE PRECISION DX(*)* ..** =====================================================================** .. Local Scalars ..DOUBLE PRECISION DTEMPINTEGER I,M,MP1,NINCX* ..* .. Intrinsic Functions ..INTRINSIC DABS,MOD* ..DASUM = 0.0d0DTEMP = 0.0d0IF (N.LE.0 .OR. INCX.LE.0) RETURNIF (INCX.EQ.1) THEN* code for increment equal to 1*** clean-up loop*M = MOD(N,6)IF (M.NE.0) THENDO I = 1,MDTEMP = DTEMP + DABS(DX(I))END DOIF (N.LT.6) THENDASUM = DTEMPRETURNEND IFEND IFMP1 = M + 1DO I = MP1,N,6DTEMP = DTEMP + DABS(DX(I)) + DABS(DX(I+1)) +$ DABS(DX(I+2)) + DABS(DX(I+3)) +$ DABS(DX(I+4)) + DABS(DX(I+5))END DOELSE** code for increment not equal to 1*NINCX = N*INCXDO I = 1,NINCX,INCXDTEMP = DTEMP + DABS(DX(I))END DOEND IFDASUM = DTEMPRETURN** End of DASUM*END*> \brief \b DAXPY** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DAXPY(N,DA,DX,INCX,DY,INCY)** .. Scalar Arguments ..* DOUBLE PRECISION DA* INTEGER INCX,INCY,N* ..* .. Array Arguments ..* DOUBLE PRECISION DX(*),DY(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DAXPY constant times a vector plus a vector.*> uses unrolled loops for increments equal to one.*> \endverbatim** Arguments:* ==========**> \param[in] N*> \verbatim*> N is INTEGER*> number of elements in input vector(s)*> \endverbatim*>*> \param[in] DA*> \verbatim*> DA is DOUBLE PRECISION*> On entry, DA specifies the scalar alpha.*> \endverbatim*>*> \param[in] DX*> \verbatim*> DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) )*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> storage spacing between elements of DX*> \endverbatim*>*> \param[in,out] DY*> \verbatim*> DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) )*> \endverbatim*>*> \param[in] INCY*> \verbatim*> INCY is INTEGER*> storage spacing between elements of DY*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level1**> \par Further Details:* =====================*>*> \verbatim*>*> jack dongarra, linpack, 3/11/78.*> modified 12/3/93, array(1) declarations changed to array(*)*> \endverbatim*>* =====================================================================SUBROUTINE DAXPY(N,DA,DX,INCX,DY,INCY)** -- Reference BLAS level1 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..DOUBLE PRECISION DAINTEGER INCX,INCY,N* ..* .. Array Arguments ..DOUBLE PRECISION DX(*),DY(*)* ..** =====================================================================** .. Local Scalars ..INTEGER I,IX,IY,M,MP1* ..* .. Intrinsic Functions ..INTRINSIC MOD* ..IF (N.LE.0) RETURNIF (DA.EQ.0.0d0) RETURNIF (INCX.EQ.1 .AND. INCY.EQ.1) THEN** code for both increments equal to 1*** clean-up loop*M = MOD(N,4)IF (M.NE.0) THENDO I = 1,MDY(I) = DY(I) + DA*DX(I)END DOEND IFIF (N.LT.4) RETURNMP1 = M + 1DO I = MP1,N,4DY(I) = DY(I) + DA*DX(I)DY(I+1) = DY(I+1) + DA*DX(I+1)DY(I+2) = DY(I+2) + DA*DX(I+2)DY(I+3) = DY(I+3) + DA*DX(I+3)END DOELSE** code for unequal increments or equal increments* not equal to 1*IX = 1IY = 1IF (INCX.LT.0) IX = (-N+1)*INCX + 1IF (INCY.LT.0) IY = (-N+1)*INCY + 1DO I = 1,NDY(IY) = DY(IY) + DA*DX(IX)IX = IX + INCXIY = IY + INCYEND DOEND IFRETURN** End of DAXPY*END*> \brief \b DCOPY** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DCOPY(N,DX,INCX,DY,INCY)** .. Scalar Arguments ..* INTEGER INCX,INCY,N* ..* .. Array Arguments ..* DOUBLE PRECISION DX(*),DY(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DCOPY copies a vector, x, to a vector, y.*> uses unrolled loops for increments equal to 1.*> \endverbatim** Arguments:* ==========**> \param[in] N*> \verbatim*> N is INTEGER*> number of elements in input vector(s)*> \endverbatim*>*> \param[in] DX*> \verbatim*> DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) )*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> storage spacing between elements of DX*> \endverbatim*>*> \param[out] DY*> \verbatim*> DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) )*> \endverbatim*>*> \param[in] INCY*> \verbatim*> INCY is INTEGER*> storage spacing between elements of DY*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level1**> \par Further Details:* =====================*>*> \verbatim*>*> jack dongarra, linpack, 3/11/78.*> modified 12/3/93, array(1) declarations changed to array(*)*> \endverbatim*>* =====================================================================SUBROUTINE DCOPY(N,DX,INCX,DY,INCY)** -- Reference BLAS level1 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..INTEGER INCX,INCY,N* ..* .. Array Arguments ..DOUBLE PRECISION DX(*),DY(*)* ..** =====================================================================** .. Local Scalars ..INTEGER I,IX,IY,M,MP1* ..* .. Intrinsic Functions ..INTRINSIC MOD* ..IF (N.LE.0) RETURNIF (INCX.EQ.1 .AND. INCY.EQ.1) THEN** code for both increments equal to 1*** clean-up loop*M = MOD(N,7)IF (M.NE.0) THENDO I = 1,MDY(I) = DX(I)END DOIF (N.LT.7) RETURNEND IFMP1 = M + 1DO I = MP1,N,7DY(I) = DX(I)DY(I+1) = DX(I+1)DY(I+2) = DX(I+2)DY(I+3) = DX(I+3)DY(I+4) = DX(I+4)DY(I+5) = DX(I+5)DY(I+6) = DX(I+6)END DOELSE** code for unequal increments or equal increments* not equal to 1*IX = 1IY = 1IF (INCX.LT.0) IX = (-N+1)*INCX + 1IF (INCY.LT.0) IY = (-N+1)*INCY + 1DO I = 1,NDY(IY) = DX(IX)IX = IX + INCXIY = IY + INCYEND DOEND IFRETURN** End of DCOPY*END*> \brief \b DDOT** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** DOUBLE PRECISION FUNCTION DDOT(N,DX,INCX,DY,INCY)** .. Scalar Arguments ..* INTEGER INCX,INCY,N* ..* .. Array Arguments ..* DOUBLE PRECISION DX(*),DY(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DDOT forms the dot product of two vectors.*> uses unrolled loops for increments equal to one.*> \endverbatim** Arguments:* ==========**> \param[in] N*> \verbatim*> N is INTEGER*> number of elements in input vector(s)*> \endverbatim*>*> \param[in] DX*> \verbatim*> DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) )*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> storage spacing between elements of DX*> \endverbatim*>*> \param[in] DY*> \verbatim*> DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) )*> \endverbatim*>*> \param[in] INCY*> \verbatim*> INCY is INTEGER*> storage spacing between elements of DY*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level1**> \par Further Details:* =====================*>*> \verbatim*>*> jack dongarra, linpack, 3/11/78.*> modified 12/3/93, array(1) declarations changed to array(*)*> \endverbatim*>* =====================================================================DOUBLE PRECISION FUNCTION DDOT(N,DX,INCX,DY,INCY)** -- Reference BLAS level1 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..INTEGER INCX,INCY,N* ..* .. Array Arguments ..DOUBLE PRECISION DX(*),DY(*)* ..** =====================================================================** .. Local Scalars ..DOUBLE PRECISION DTEMPINTEGER I,IX,IY,M,MP1* ..* .. Intrinsic Functions ..INTRINSIC MOD* ..DDOT = 0.0d0DTEMP = 0.0d0IF (N.LE.0) RETURNIF (INCX.EQ.1 .AND. INCY.EQ.1) THEN** code for both increments equal to 1*** clean-up loop*M = MOD(N,5)IF (M.NE.0) THENDO I = 1,MDTEMP = DTEMP + DX(I)*DY(I)END DOIF (N.LT.5) THENDDOT=DTEMPRETURNEND IFEND IFMP1 = M + 1DO I = MP1,N,5DTEMP = DTEMP + DX(I)*DY(I) + DX(I+1)*DY(I+1) +$ DX(I+2)*DY(I+2) + DX(I+3)*DY(I+3) + DX(I+4)*DY(I+4)END DOELSE** code for unequal increments or equal increments* not equal to 1*IX = 1IY = 1IF (INCX.LT.0) IX = (-N+1)*INCX + 1IF (INCY.LT.0) IY = (-N+1)*INCY + 1DO I = 1,NDTEMP = DTEMP + DX(IX)*DY(IY)IX = IX + INCXIY = IY + INCYEND DOEND IFDDOT = DTEMPRETURN** End of DDOT*END*> \brief \b DGBMV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DGBMV(TRANS,M,N,KL,KU,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)** .. Scalar Arguments ..* DOUBLE PRECISION ALPHA,BETA* INTEGER INCX,INCY,KL,KU,LDA,M,N* CHARACTER TRANS* ..* .. Array Arguments ..* DOUBLE PRECISION A(LDA,*),X(*),Y(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DGBMV performs one of the matrix-vector operations*>*> y := alpha*A*x + beta*y, or y := alpha*A**T*x + beta*y,*>*> where alpha and beta are scalars, x and y are vectors and A is an*> m by n band matrix, with kl sub-diagonals and ku super-diagonals.*> \endverbatim** Arguments:* ==========**> \param[in] TRANS*> \verbatim*> TRANS is CHARACTER*1*> On entry, TRANS specifies the operation to be performed as*> follows:*>*> TRANS = 'N' or 'n' y := alpha*A*x + beta*y.*>*> TRANS = 'T' or 't' y := alpha*A**T*x + beta*y.*>*> TRANS = 'C' or 'c' y := alpha*A**T*x + beta*y.*> \endverbatim*>*> \param[in] M*> \verbatim*> M is INTEGER*> On entry, M specifies the number of rows of the matrix A.*> M must be at least zero.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the number of columns of the matrix A.*> N must be at least zero.*> \endverbatim*>*> \param[in] KL*> \verbatim*> KL is INTEGER*> On entry, KL specifies the number of sub-diagonals of the*> matrix A. KL must satisfy 0 .le. KL.*> \endverbatim*>*> \param[in] KU*> \verbatim*> KU is INTEGER*> On entry, KU specifies the number of super-diagonals of the*> matrix A. KU must satisfy 0 .le. KU.*> \endverbatim*>*> \param[in] ALPHA*> \verbatim*> ALPHA is DOUBLE PRECISION.*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE PRECISION array, dimension ( LDA, N )*> Before entry, the leading ( kl + ku + 1 ) by n part of the*> array A must contain the matrix of coefficients, supplied*> column by column, with the leading diagonal of the matrix in*> row ( ku + 1 ) of the array, the first super-diagonal*> starting at position 2 in row ku, the first sub-diagonal*> starting at position 1 in row ( ku + 2 ), and so on.*> Elements in the array A that do not correspond to elements*> in the band matrix (such as the top left ku by ku triangle)*> are not referenced.*> The following program segment will transfer a band matrix*> from conventional full matrix storage to band storage:*>*> DO 20, J = 1, N*> K = KU + 1 - J*> DO 10, I = MAX( 1, J - KU ), MIN( M, J + KL )*> A( K + I, J ) = matrix( I, J )*> 10 CONTINUE*> 20 CONTINUE*> \endverbatim*>*> \param[in] LDA*> \verbatim*> LDA is INTEGER*> On entry, LDA specifies the first dimension of A as declared*> in the calling (sub) program. LDA must be at least*> ( kl + ku + 1 ).*> \endverbatim*>*> \param[in] X*> \verbatim*> X is DOUBLE PRECISION array, dimension at least*> ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n'*> and at least*> ( 1 + ( m - 1 )*abs( INCX ) ) otherwise.*> Before entry, the incremented array X must contain the*> vector x.*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> On entry, INCX specifies the increment for the elements of*> X. INCX must not be zero.*> \endverbatim*>*> \param[in] BETA*> \verbatim*> BETA is DOUBLE PRECISION.*> On entry, BETA specifies the scalar beta. When BETA is*> supplied as zero then Y need not be set on input.*> \endverbatim*>*> \param[in,out] Y*> \verbatim*> Y is DOUBLE PRECISION array, dimension at least*> ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n'*> and at least*> ( 1 + ( n - 1 )*abs( INCY ) ) otherwise.*> Before entry, the incremented array Y must contain the*> vector y. On exit, Y is overwritten by the updated vector y.*> \endverbatim*>*> \param[in] INCY*> \verbatim*> INCY is INTEGER*> On entry, INCY specifies the increment for the elements of*> Y. INCY must not be zero.*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level2**> \par Further Details:* =====================*>*> \verbatim*>*> Level 2 Blas routine.*> The vector and matrix arguments are not referenced when N = 0, or M = 0*>*> -- 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.*> \endverbatim*>* =====================================================================SUBROUTINE DGBMV(TRANS,M,N,KL,KU,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)** -- Reference BLAS level2 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..DOUBLE PRECISION ALPHA,BETAINTEGER INCX,INCY,KL,KU,LDA,M,NCHARACTER TRANS* ..* .. Array Arguments ..DOUBLE PRECISION A(LDA,*),X(*),Y(*)* ..** =====================================================================** .. Parameters ..DOUBLE PRECISION ONE,ZEROPARAMETER (ONE=1.0D+0,ZERO=0.0D+0)* ..* .. Local Scalars ..DOUBLE PRECISION TEMPINTEGER I,INFO,IX,IY,J,JX,JY,K,KUP1,KX,KY,LENX,LENY* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC MAX,MIN* ..** Test the input parameters.*INFO = 0IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.+ .NOT.LSAME(TRANS,'C')) THENINFO = 1ELSE IF (M.LT.0) THENINFO = 2ELSE IF (N.LT.0) THENINFO = 3ELSE IF (KL.LT.0) THENINFO = 4ELSE IF (KU.LT.0) THENINFO = 5ELSE IF (LDA.LT. (KL+KU+1)) THENINFO = 8ELSE IF (INCX.EQ.0) THENINFO = 10ELSE IF (INCY.EQ.0) THENINFO = 13END IFIF (INFO.NE.0) THENCALL XERBLA('DGBMV ',INFO)RETURNEND IF** Quick return if possible.*IF ((M.EQ.0) .OR. (N.EQ.0) .OR.+ ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN** Set LENX and LENY, the lengths of the vectors x and y, and set* up the start points in X and Y.*IF (LSAME(TRANS,'N')) THENLENX = NLENY = MELSELENX = MLENY = NEND IFIF (INCX.GT.0) THENKX = 1ELSEKX = 1 - (LENX-1)*INCXEND IFIF (INCY.GT.0) THENKY = 1ELSEKY = 1 - (LENY-1)*INCYEND IF** Start the operations. In this version the elements of A are* accessed sequentially with one pass through the band part of A.** First form y := beta*y.*IF (BETA.NE.ONE) THENIF (INCY.EQ.1) THENIF (BETA.EQ.ZERO) THENDO 10 I = 1,LENYY(I) = ZERO10 CONTINUEELSEDO 20 I = 1,LENYY(I) = BETA*Y(I)20 CONTINUEEND IFELSEIY = KYIF (BETA.EQ.ZERO) THENDO 30 I = 1,LENYY(IY) = ZEROIY = IY + INCY30 CONTINUEELSEDO 40 I = 1,LENYY(IY) = BETA*Y(IY)IY = IY + INCY40 CONTINUEEND IFEND IFEND IFIF (ALPHA.EQ.ZERO) RETURNKUP1 = KU + 1IF (LSAME(TRANS,'N')) THEN** Form y := alpha*A*x + y.*JX = KXIF (INCY.EQ.1) THENDO 60 J = 1,NTEMP = ALPHA*X(JX)K = KUP1 - JDO 50 I = MAX(1,J-KU),MIN(M,J+KL)Y(I) = Y(I) + TEMP*A(K+I,J)50 CONTINUEJX = JX + INCX60 CONTINUEELSEDO 80 J = 1,NTEMP = ALPHA*X(JX)IY = KYK = KUP1 - JDO 70 I = MAX(1,J-KU),MIN(M,J+KL)Y(IY) = Y(IY) + TEMP*A(K+I,J)IY = IY + INCY70 CONTINUEJX = JX + INCXIF (J.GT.KU) KY = KY + INCY80 CONTINUEEND IFELSE** Form y := alpha*A**T*x + y.*JY = KYIF (INCX.EQ.1) THENDO 100 J = 1,NTEMP = ZEROK = KUP1 - JDO 90 I = MAX(1,J-KU),MIN(M,J+KL)TEMP = TEMP + A(K+I,J)*X(I)90 CONTINUEY(JY) = Y(JY) + ALPHA*TEMPJY = JY + INCY100 CONTINUEELSEDO 120 J = 1,NTEMP = ZEROIX = KXK = KUP1 - JDO 110 I = MAX(1,J-KU),MIN(M,J+KL)TEMP = TEMP + A(K+I,J)*X(IX)IX = IX + INCX110 CONTINUEY(JY) = Y(JY) + ALPHA*TEMPJY = JY + INCYIF (J.GT.KU) KX = KX + INCX120 CONTINUEEND IFEND IF*RETURN** End of DGBMV*END*> \brief \b DGEMM** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC)** .. Scalar Arguments ..* DOUBLE PRECISION ALPHA,BETA* INTEGER K,LDA,LDB,LDC,M,N* CHARACTER TRANSA,TRANSB* ..* .. Array Arguments ..* DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DGEMM performs one of the matrix-matrix operations*>*> C := alpha*op( A )*op( B ) + beta*C,*>*> where op( X ) is one of*>*> op( X ) = X or op( X ) = X**T,*>*> alpha and beta are scalars, and A, B and C are matrices, with op( A )*> an m by k matrix, op( B ) a k by n matrix and C an m by n matrix.*> \endverbatim** Arguments:* ==========**> \param[in] TRANSA*> \verbatim*> TRANSA is 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**T.*>*> TRANSA = 'C' or 'c', op( A ) = A**T.*> \endverbatim*>*> \param[in] TRANSB*> \verbatim*> TRANSB is CHARACTER*1*> On entry, TRANSB specifies the form of op( B ) to be used in*> the matrix multiplication as follows:*>*> TRANSB = 'N' or 'n', op( B ) = B.*>*> TRANSB = 'T' or 't', op( B ) = B**T.*>*> TRANSB = 'C' or 'c', op( B ) = B**T.*> \endverbatim*>*> \param[in] M*> \verbatim*> M is INTEGER*> On entry, M specifies the number of rows of the matrix*> op( A ) and of the matrix C. M must be at least zero.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the number of columns of the matrix*> op( B ) and the number of columns of the matrix C. N must be*> at least zero.*> \endverbatim*>*> \param[in] K*> \verbatim*> K is INTEGER*> On entry, K specifies the number of columns of the matrix*> op( A ) and the number of rows of the matrix op( B ). K must*> be at least zero.*> \endverbatim*>*> \param[in] ALPHA*> \verbatim*> ALPHA is DOUBLE PRECISION.*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE PRECISION array, dimension ( LDA, ka ), where ka is*> k when TRANSA = 'N' or 'n', and is m otherwise.*> Before entry with TRANSA = 'N' or 'n', the leading m by k*> part of the array A must contain the matrix A, otherwise*> the leading k by m part of the array A must contain the*> matrix A.*> \endverbatim*>*> \param[in] LDA*> \verbatim*> LDA is INTEGER*> On entry, LDA specifies the first dimension of A as declared*> in the calling (sub) program. When TRANSA = 'N' or 'n' then*> LDA must be at least max( 1, m ), otherwise LDA must be at*> least max( 1, k ).*> \endverbatim*>*> \param[in] B*> \verbatim*> B is DOUBLE PRECISION array, dimension ( LDB, kb ), where kb is*> n when TRANSB = 'N' or 'n', and is k otherwise.*> Before entry with TRANSB = 'N' or 'n', the leading k by n*> part of the array B must contain the matrix B, otherwise*> the leading n by k part of the array B must contain the*> matrix B.*> \endverbatim*>*> \param[in] LDB*> \verbatim*> LDB is INTEGER*> On entry, LDB specifies the first dimension of B as declared*> in the calling (sub) program. When TRANSB = 'N' or 'n' then*> LDB must be at least max( 1, k ), otherwise LDB must be at*> least max( 1, n ).*> \endverbatim*>*> \param[in] BETA*> \verbatim*> BETA is DOUBLE PRECISION.*> On entry, BETA specifies the scalar beta. When BETA is*> supplied as zero then C need not be set on input.*> \endverbatim*>*> \param[in,out] C*> \verbatim*> C is DOUBLE PRECISION array, dimension ( LDC, N )*> Before entry, the leading m by n part of the array C must*> contain the matrix C, except when beta is zero, in which*> case C need not be set on entry.*> On exit, the array C is overwritten by the m by n matrix*> ( alpha*op( A )*op( B ) + beta*C ).*> \endverbatim*>*> \param[in] LDC*> \verbatim*> LDC is INTEGER*> On entry, LDC specifies the first dimension of C as declared*> in the calling (sub) program. LDC must be at least*> max( 1, m ).*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level3**> \par Further Details:* =====================*>*> \verbatim*>*> Level 3 Blas routine.*>*> -- Written on 8-February-1989.*> Jack Dongarra, Argonne National Laboratory.*> Iain Duff, AERE Harwell.*> Jeremy Du Croz, Numerical Algorithms Group Ltd.*> Sven Hammarling, Numerical Algorithms Group Ltd.*> \endverbatim*>* =====================================================================SUBROUTINE DGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC)** -- Reference BLAS level3 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..DOUBLE PRECISION ALPHA,BETAINTEGER K,LDA,LDB,LDC,M,NCHARACTER TRANSA,TRANSB* ..* .. Array Arguments ..DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*)* ..** =====================================================================** .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC MAX* ..* .. Local Scalars ..DOUBLE PRECISION TEMPINTEGER I,INFO,J,L,NROWA,NROWBLOGICAL NOTA,NOTB* ..* .. Parameters ..DOUBLE PRECISION ONE,ZEROPARAMETER (ONE=1.0D+0,ZERO=0.0D+0)* ..** Set NOTA and NOTB as true if A and B respectively are not* transposed and set NROWA and NROWB as the number of rows of A* and B respectively.*NOTA = LSAME(TRANSA,'N')NOTB = LSAME(TRANSB,'N')IF (NOTA) THENNROWA = MELSENROWA = KEND IFIF (NOTB) THENNROWB = KELSENROWB = NEND IF** Test the input parameters.*INFO = 0IF ((.NOT.NOTA) .AND. (.NOT.LSAME(TRANSA,'C')) .AND.+ (.NOT.LSAME(TRANSA,'T'))) THENINFO = 1ELSE IF ((.NOT.NOTB) .AND. (.NOT.LSAME(TRANSB,'C')) .AND.+ (.NOT.LSAME(TRANSB,'T'))) THENINFO = 2ELSE IF (M.LT.0) THENINFO = 3ELSE IF (N.LT.0) THENINFO = 4ELSE IF (K.LT.0) THENINFO = 5ELSE IF (LDA.LT.MAX(1,NROWA)) THENINFO = 8ELSE IF (LDB.LT.MAX(1,NROWB)) THENINFO = 10ELSE IF (LDC.LT.MAX(1,M)) THENINFO = 13END IFIF (INFO.NE.0) THENCALL XERBLA('DGEMM ',INFO)RETURNEND IF** Quick return if possible.*IF ((M.EQ.0) .OR. (N.EQ.0) .OR.+ (((ALPHA.EQ.ZERO).OR. (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN** And if alpha.eq.zero.*IF (ALPHA.EQ.ZERO) THENIF (BETA.EQ.ZERO) THENDO 20 J = 1,NDO 10 I = 1,MC(I,J) = ZERO10 CONTINUE20 CONTINUEELSEDO 40 J = 1,NDO 30 I = 1,MC(I,J) = BETA*C(I,J)30 CONTINUE40 CONTINUEEND IFRETURNEND IF** Start the operations.*IF (NOTB) THENIF (NOTA) THEN** Form C := alpha*A*B + beta*C.*DO 90 J = 1,NIF (BETA.EQ.ZERO) THENDO 50 I = 1,MC(I,J) = ZERO50 CONTINUEELSE IF (BETA.NE.ONE) THENDO 60 I = 1,MC(I,J) = BETA*C(I,J)60 CONTINUEEND IFDO 80 L = 1,KTEMP = ALPHA*B(L,J)DO 70 I = 1,MC(I,J) = C(I,J) + TEMP*A(I,L)70 CONTINUE80 CONTINUE90 CONTINUEELSE** Form C := alpha*A**T*B + beta*C*DO 120 J = 1,NDO 110 I = 1,MTEMP = ZERODO 100 L = 1,KTEMP = TEMP + A(L,I)*B(L,J)100 CONTINUEIF (BETA.EQ.ZERO) THENC(I,J) = ALPHA*TEMPELSEC(I,J) = ALPHA*TEMP + BETA*C(I,J)END IF110 CONTINUE120 CONTINUEEND IFELSEIF (NOTA) THEN** Form C := alpha*A*B**T + beta*C*DO 170 J = 1,NIF (BETA.EQ.ZERO) THENDO 130 I = 1,MC(I,J) = ZERO130 CONTINUEELSE IF (BETA.NE.ONE) THENDO 140 I = 1,MC(I,J) = BETA*C(I,J)140 CONTINUEEND IFDO 160 L = 1,KTEMP = ALPHA*B(J,L)DO 150 I = 1,MC(I,J) = C(I,J) + TEMP*A(I,L)150 CONTINUE160 CONTINUE170 CONTINUEELSE** Form C := alpha*A**T*B**T + beta*C*DO 200 J = 1,NDO 190 I = 1,MTEMP = ZERODO 180 L = 1,KTEMP = TEMP + A(L,I)*B(J,L)180 CONTINUEIF (BETA.EQ.ZERO) THENC(I,J) = ALPHA*TEMPELSEC(I,J) = ALPHA*TEMP + BETA*C(I,J)END IF190 CONTINUE200 CONTINUEEND IFEND IF*RETURN** End of DGEMM*END*> \brief \b DGEMV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)** .. Scalar Arguments ..* DOUBLE PRECISION ALPHA,BETA* INTEGER INCX,INCY,LDA,M,N* CHARACTER TRANS* ..* .. Array Arguments ..* DOUBLE PRECISION A(LDA,*),X(*),Y(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DGEMV performs one of the matrix-vector operations*>*> y := alpha*A*x + beta*y, or y := alpha*A**T*x + beta*y,*>*> where alpha and beta are scalars, x and y are vectors and A is an*> m by n matrix.*> \endverbatim** Arguments:* ==========**> \param[in] TRANS*> \verbatim*> TRANS is CHARACTER*1*> On entry, TRANS specifies the operation to be performed as*> follows:*>*> TRANS = 'N' or 'n' y := alpha*A*x + beta*y.*>*> TRANS = 'T' or 't' y := alpha*A**T*x + beta*y.*>*> TRANS = 'C' or 'c' y := alpha*A**T*x + beta*y.*> \endverbatim*>*> \param[in] M*> \verbatim*> M is INTEGER*> On entry, M specifies the number of rows of the matrix A.*> M must be at least zero.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the number of columns of the matrix A.*> N must be at least zero.*> \endverbatim*>*> \param[in] ALPHA*> \verbatim*> ALPHA is DOUBLE PRECISION.*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE PRECISION array, dimension ( LDA, N )*> Before entry, the leading m by n part of the array A must*> contain the matrix of coefficients.*> \endverbatim*>*> \param[in] LDA*> \verbatim*> LDA is INTEGER*> On entry, LDA specifies the first dimension of A as declared*> in the calling (sub) program. LDA must be at least*> max( 1, m ).*> \endverbatim*>*> \param[in] X*> \verbatim*> X is DOUBLE PRECISION array, dimension at least*> ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n'*> and at least*> ( 1 + ( m - 1 )*abs( INCX ) ) otherwise.*> Before entry, the incremented array X must contain the*> vector x.*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> On entry, INCX specifies the increment for the elements of*> X. INCX must not be zero.*> \endverbatim*>*> \param[in] BETA*> \verbatim*> BETA is DOUBLE PRECISION.*> On entry, BETA specifies the scalar beta. When BETA is*> supplied as zero then Y need not be set on input.*> \endverbatim*>*> \param[in,out] Y*> \verbatim*> Y is DOUBLE PRECISION array, dimension at least*> ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n'*> and at least*> ( 1 + ( n - 1 )*abs( INCY ) ) otherwise.*> Before entry with BETA non-zero, the incremented array Y*> must contain the vector y. On exit, Y is overwritten by the*> updated vector y.*> \endverbatim*>*> \param[in] INCY*> \verbatim*> INCY is INTEGER*> On entry, INCY specifies the increment for the elements of*> Y. INCY must not be zero.*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level2**> \par Further Details:* =====================*>*> \verbatim*>*> Level 2 Blas routine.*> The vector and matrix arguments are not referenced when N = 0, or M = 0*>*> -- 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.*> \endverbatim*>* =====================================================================SUBROUTINE DGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)** -- Reference BLAS level2 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..DOUBLE PRECISION ALPHA,BETAINTEGER INCX,INCY,LDA,M,NCHARACTER TRANS* ..* .. Array Arguments ..DOUBLE PRECISION A(LDA,*),X(*),Y(*)* ..** =====================================================================** .. Parameters ..DOUBLE PRECISION ONE,ZEROPARAMETER (ONE=1.0D+0,ZERO=0.0D+0)* ..* .. Local Scalars ..DOUBLE PRECISION TEMPINTEGER I,INFO,IX,IY,J,JX,JY,KX,KY,LENX,LENY* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC MAX* ..** Test the input parameters.*INFO = 0IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.+ .NOT.LSAME(TRANS,'C')) THENINFO = 1ELSE IF (M.LT.0) THENINFO = 2ELSE IF (N.LT.0) THENINFO = 3ELSE IF (LDA.LT.MAX(1,M)) THENINFO = 6ELSE IF (INCX.EQ.0) THENINFO = 8ELSE IF (INCY.EQ.0) THENINFO = 11END IFIF (INFO.NE.0) THENCALL XERBLA('DGEMV ',INFO)RETURNEND IF** Quick return if possible.*IF ((M.EQ.0) .OR. (N.EQ.0) .OR.+ ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN** Set LENX and LENY, the lengths of the vectors x and y, and set* up the start points in X and Y.*IF (LSAME(TRANS,'N')) THENLENX = NLENY = MELSELENX = MLENY = NEND IFIF (INCX.GT.0) THENKX = 1ELSEKX = 1 - (LENX-1)*INCXEND IFIF (INCY.GT.0) THENKY = 1ELSEKY = 1 - (LENY-1)*INCYEND IF** Start the operations. In this version the elements of A are* accessed sequentially with one pass through A.** First form y := beta*y.*IF (BETA.NE.ONE) THENIF (INCY.EQ.1) THENIF (BETA.EQ.ZERO) THENDO 10 I = 1,LENYY(I) = ZERO10 CONTINUEELSEDO 20 I = 1,LENYY(I) = BETA*Y(I)20 CONTINUEEND IFELSEIY = KYIF (BETA.EQ.ZERO) THENDO 30 I = 1,LENYY(IY) = ZEROIY = IY + INCY30 CONTINUEELSEDO 40 I = 1,LENYY(IY) = BETA*Y(IY)IY = IY + INCY40 CONTINUEEND IFEND IFEND IFIF (ALPHA.EQ.ZERO) RETURNIF (LSAME(TRANS,'N')) THEN** Form y := alpha*A*x + y.*JX = KXIF (INCY.EQ.1) THENDO 60 J = 1,NTEMP = ALPHA*X(JX)DO 50 I = 1,MY(I) = Y(I) + TEMP*A(I,J)50 CONTINUEJX = JX + INCX60 CONTINUEELSEDO 80 J = 1,NTEMP = ALPHA*X(JX)IY = KYDO 70 I = 1,MY(IY) = Y(IY) + TEMP*A(I,J)IY = IY + INCY70 CONTINUEJX = JX + INCX80 CONTINUEEND IFELSE** Form y := alpha*A**T*x + y.*JY = KYIF (INCX.EQ.1) THENDO 100 J = 1,NTEMP = ZERODO 90 I = 1,MTEMP = TEMP + A(I,J)*X(I)90 CONTINUEY(JY) = Y(JY) + ALPHA*TEMPJY = JY + INCY100 CONTINUEELSEDO 120 J = 1,NTEMP = ZEROIX = KXDO 110 I = 1,MTEMP = TEMP + A(I,J)*X(IX)IX = IX + INCX110 CONTINUEY(JY) = Y(JY) + ALPHA*TEMPJY = JY + INCY120 CONTINUEEND IFEND IF*RETURN** End of DGEMV*END*> \brief \b DGER** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DGER(M,N,ALPHA,X,INCX,Y,INCY,A,LDA)** .. Scalar Arguments ..* DOUBLE PRECISION ALPHA* INTEGER INCX,INCY,LDA,M,N* ..* .. Array Arguments ..* DOUBLE PRECISION A(LDA,*),X(*),Y(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DGER performs the rank 1 operation*>*> A := alpha*x*y**T + A,*>*> where alpha is a scalar, x is an m element vector, y is an n element*> vector and A is an m by n matrix.*> \endverbatim** Arguments:* ==========**> \param[in] M*> \verbatim*> M is INTEGER*> On entry, M specifies the number of rows of the matrix A.*> M must be at least zero.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the number of columns of the matrix A.*> N must be at least zero.*> \endverbatim*>*> \param[in] ALPHA*> \verbatim*> ALPHA is DOUBLE PRECISION.*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] X*> \verbatim*> X is DOUBLE PRECISION array, dimension at least*> ( 1 + ( m - 1 )*abs( INCX ) ).*> Before entry, the incremented array X must contain the m*> element vector x.*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> On entry, INCX specifies the increment for the elements of*> X. INCX must not be zero.*> \endverbatim*>*> \param[in] Y*> \verbatim*> Y is DOUBLE PRECISION array, dimension at least*> ( 1 + ( n - 1 )*abs( INCY ) ).*> Before entry, the incremented array Y must contain the n*> element vector y.*> \endverbatim*>*> \param[in] INCY*> \verbatim*> INCY is INTEGER*> On entry, INCY specifies the increment for the elements of*> Y. INCY must not be zero.*> \endverbatim*>*> \param[in,out] A*> \verbatim*> A is DOUBLE PRECISION array, dimension ( LDA, N )*> Before entry, the leading m by n part of the array A must*> contain the matrix of coefficients. On exit, A is*> overwritten by the updated matrix.*> \endverbatim*>*> \param[in] LDA*> \verbatim*> LDA is INTEGER*> On entry, LDA specifies the first dimension of A as declared*> in the calling (sub) program. LDA must be at least*> max( 1, m ).*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level2**> \par Further Details:* =====================*>*> \verbatim*>*> 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.*> \endverbatim*>* =====================================================================SUBROUTINE DGER(M,N,ALPHA,X,INCX,Y,INCY,A,LDA)** -- Reference BLAS level2 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..DOUBLE PRECISION ALPHAINTEGER INCX,INCY,LDA,M,N* ..* .. Array Arguments ..DOUBLE PRECISION A(LDA,*),X(*),Y(*)* ..** =====================================================================** .. Parameters ..DOUBLE PRECISION ZEROPARAMETER (ZERO=0.0D+0)* ..* .. Local Scalars ..DOUBLE PRECISION TEMPINTEGER I,INFO,IX,J,JY,KX* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC MAX* ..** Test the input parameters.*INFO = 0IF (M.LT.0) THENINFO = 1ELSE IF (N.LT.0) THENINFO = 2ELSE IF (INCX.EQ.0) THENINFO = 5ELSE IF (INCY.EQ.0) THENINFO = 7ELSE IF (LDA.LT.MAX(1,M)) THENINFO = 9END IFIF (INFO.NE.0) THENCALL XERBLA('DGER ',INFO)RETURNEND IF** Quick return if possible.*IF ((M.EQ.0) .OR. (N.EQ.0) .OR. (ALPHA.EQ.ZERO)) RETURN** Start the operations. In this version the elements of A are* accessed sequentially with one pass through A.*IF (INCY.GT.0) THENJY = 1ELSEJY = 1 - (N-1)*INCYEND IFIF (INCX.EQ.1) THENDO 20 J = 1,Nc IF (Y(JY).NE.ZERO) THENTEMP = ALPHA*Y(JY)DO 10 I = 1,MA(I,J) = A(I,J) + X(I)*TEMP10 CONTINUEc END IFJY = JY + INCY20 CONTINUEELSEIF (INCX.GT.0) THENKX = 1ELSEKX = 1 - (M-1)*INCXEND IFDO 40 J = 1,Nc IF (Y(JY).NE.ZERO) THENTEMP = ALPHA*Y(JY)IX = KXDO 30 I = 1,MA(I,J) = A(I,J) + X(IX)*TEMPIX = IX + INCX30 CONTINUEc END IFJY = JY + INCY40 CONTINUEEND IF*RETURN** End of DGER*END*> \brief \b DROT** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DROT(N,DX,INCX,DY,INCY,C,S)** .. Scalar Arguments ..* DOUBLE PRECISION C,S* INTEGER INCX,INCY,N* ..* .. Array Arguments ..* DOUBLE PRECISION DX(*),DY(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DROT applies a plane rotation.*> \endverbatim** Arguments:* ==========**> \param[in] N*> \verbatim*> N is INTEGER*> number of elements in input vector(s)*> \endverbatim*>*> \param[in,out] DX*> \verbatim*> DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) )*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> storage spacing between elements of DX*> \endverbatim*>*> \param[in,out] DY*> \verbatim*> DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) )*> \endverbatim*>*> \param[in] INCY*> \verbatim*> INCY is INTEGER*> storage spacing between elements of DY*> \endverbatim*>*> \param[in] C*> \verbatim*> C is DOUBLE PRECISION*> \endverbatim*>*> \param[in] S*> \verbatim*> S is DOUBLE PRECISION*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level1**> \par Further Details:* =====================*>*> \verbatim*>*> jack dongarra, linpack, 3/11/78.*> modified 12/3/93, array(1) declarations changed to array(*)*> \endverbatim*>* =====================================================================SUBROUTINE DROT(N,DX,INCX,DY,INCY,C,S)** -- Reference BLAS level1 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..DOUBLE PRECISION C,SINTEGER INCX,INCY,N* ..* .. Array Arguments ..DOUBLE PRECISION DX(*),DY(*)* ..** =====================================================================** .. Local Scalars ..DOUBLE PRECISION DTEMPINTEGER I,IX,IY* ..IF (N.LE.0) RETURNIF (INCX.EQ.1 .AND. INCY.EQ.1) THEN** code for both increments equal to 1*DO I = 1,NDTEMP = C*DX(I) + S*DY(I)DY(I) = C*DY(I) - S*DX(I)DX(I) = DTEMPEND DOELSE** code for unequal increments or equal increments not equal* to 1*IX = 1IY = 1IF (INCX.LT.0) IX = (-N+1)*INCX + 1IF (INCY.LT.0) IY = (-N+1)*INCY + 1DO I = 1,NDTEMP = C*DX(IX) + S*DY(IY)DY(IY) = C*DY(IY) - S*DX(IX)DX(IX) = DTEMPIX = IX + INCXIY = IY + INCYEND DOEND IFRETURN** End of DROT*END*> \brief \b DROTM** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DROTM(N,DX,INCX,DY,INCY,DPARAM)** .. Scalar Arguments ..* INTEGER INCX,INCY,N* ..* .. Array Arguments ..* DOUBLE PRECISION DPARAM(5),DX(*),DY(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> APPLY THE MODIFIED GIVENS TRANSFORMATION, H, TO THE 2 BY N MATRIX*>*> (DX**T) , WHERE **T INDICATES TRANSPOSE. THE ELEMENTS OF DX ARE IN*> (DY**T)*>*> DX(LX+I*INCX), I = 0 TO N-1, WHERE LX = 1 IF INCX .GE. 0, ELSE*> LX = (-INCX)*N, AND SIMILARLY FOR SY USING LY AND INCY.*> WITH DPARAM(1)=DFLAG, H HAS ONE OF THE FOLLOWING FORMS..*>*> DFLAG=-1.D0 DFLAG=0.D0 DFLAG=1.D0 DFLAG=-2.D0*>*> (DH11 DH12) (1.D0 DH12) (DH11 1.D0) (1.D0 0.D0)*> H=( ) ( ) ( ) ( )*> (DH21 DH22), (DH21 1.D0), (-1.D0 DH22), (0.D0 1.D0).*> SEE DROTMG FOR A DESCRIPTION OF DATA STORAGE IN DPARAM.*> \endverbatim** Arguments:* ==========**> \param[in] N*> \verbatim*> N is INTEGER*> number of elements in input vector(s)*> \endverbatim*>*> \param[in,out] DX*> \verbatim*> DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) )*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> storage spacing between elements of DX*> \endverbatim*>*> \param[in,out] DY*> \verbatim*> DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) )*> \endverbatim*>*> \param[in] INCY*> \verbatim*> INCY is INTEGER*> storage spacing between elements of DY*> \endverbatim*>*> \param[in] DPARAM*> \verbatim*> DPARAM is DOUBLE PRECISION array, dimension (5)*> DPARAM(1)=DFLAG*> DPARAM(2)=DH11*> DPARAM(3)=DH21*> DPARAM(4)=DH12*> DPARAM(5)=DH22*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level1** =====================================================================SUBROUTINE DROTM(N,DX,INCX,DY,INCY,DPARAM)** -- Reference BLAS level1 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..INTEGER INCX,INCY,N* ..* .. Array Arguments ..DOUBLE PRECISION DPARAM(5),DX(*),DY(*)* ..** =====================================================================** .. Local Scalars ..DOUBLE PRECISION DFLAG,DH11,DH12,DH21,DH22,TWO,W,Z,ZEROINTEGER I,KX,KY,NSTEPS* ..* .. Data statements ..DATA ZERO,TWO/0.D0,2.D0/* ..*DFLAG = DPARAM(1)IF (N.LE.0 .OR. (DFLAG+TWO.EQ.ZERO)) RETURNIF (INCX.EQ.INCY.AND.INCX.GT.0) THEN*NSTEPS = N*INCXIF (DFLAG.LT.ZERO) THENDH11 = DPARAM(2)DH12 = DPARAM(4)DH21 = DPARAM(3)DH22 = DPARAM(5)DO I = 1,NSTEPS,INCXW = DX(I)Z = DY(I)DX(I) = W*DH11 + Z*DH12DY(I) = W*DH21 + Z*DH22END DOELSE IF (DFLAG.EQ.ZERO) THENDH12 = DPARAM(4)DH21 = DPARAM(3)DO I = 1,NSTEPS,INCXW = DX(I)Z = DY(I)DX(I) = W + Z*DH12DY(I) = W*DH21 + ZEND DOELSEDH11 = DPARAM(2)DH22 = DPARAM(5)DO I = 1,NSTEPS,INCXW = DX(I)Z = DY(I)DX(I) = W*DH11 + ZDY(I) = -W + DH22*ZEND DOEND IFELSEKX = 1KY = 1IF (INCX.LT.0) KX = 1 + (1-N)*INCXIF (INCY.LT.0) KY = 1 + (1-N)*INCY*IF (DFLAG.LT.ZERO) THENDH11 = DPARAM(2)DH12 = DPARAM(4)DH21 = DPARAM(3)DH22 = DPARAM(5)DO I = 1,NW = DX(KX)Z = DY(KY)DX(KX) = W*DH11 + Z*DH12DY(KY) = W*DH21 + Z*DH22KX = KX + INCXKY = KY + INCYEND DOELSE IF (DFLAG.EQ.ZERO) THENDH12 = DPARAM(4)DH21 = DPARAM(3)DO I = 1,NW = DX(KX)Z = DY(KY)DX(KX) = W + Z*DH12DY(KY) = W*DH21 + ZKX = KX + INCXKY = KY + INCYEND DOELSEDH11 = DPARAM(2)DH22 = DPARAM(5)DO I = 1,NW = DX(KX)Z = DY(KY)DX(KX) = W*DH11 + ZDY(KY) = -W + DH22*ZKX = KX + INCXKY = KY + INCYEND DOEND IFEND IFRETURN** End of DROTM*END*> \brief \b DROTMG** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DROTMG(DD1,DD2,DX1,DY1,DPARAM)** .. Scalar Arguments ..* DOUBLE PRECISION DD1,DD2,DX1,DY1* ..* .. Array Arguments ..* DOUBLE PRECISION DPARAM(5)* ..***> \par Purpose:* =============*>*> \verbatim*>*> CONSTRUCT THE MODIFIED GIVENS TRANSFORMATION MATRIX H WHICH ZEROS*> THE SECOND COMPONENT OF THE 2-VECTOR (DSQRT(DD1)*DX1,DSQRT(DD2)*> DY2)**T.*> WITH DPARAM(1)=DFLAG, H HAS ONE OF THE FOLLOWING FORMS..*>*> DFLAG=-1.D0 DFLAG=0.D0 DFLAG=1.D0 DFLAG=-2.D0*>*> (DH11 DH12) (1.D0 DH12) (DH11 1.D0) (1.D0 0.D0)*> H=( ) ( ) ( ) ( )*> (DH21 DH22), (DH21 1.D0), (-1.D0 DH22), (0.D0 1.D0).*> LOCATIONS 2-4 OF DPARAM CONTAIN DH11, DH21, DH12, AND DH22*> RESPECTIVELY. (VALUES OF 1.D0, -1.D0, OR 0.D0 IMPLIED BY THE*> VALUE OF DPARAM(1) ARE NOT STORED IN DPARAM.)*>*> THE VALUES OF GAMSQ AND RGAMSQ SET IN THE DATA STATEMENT MAY BE*> INEXACT. THIS IS OK AS THEY ARE ONLY USED FOR TESTING THE SIZE*> OF DD1 AND DD2. ALL ACTUAL SCALING OF DATA IS DONE USING GAM.*>*> \endverbatim** Arguments:* ==========**> \param[in,out] DD1*> \verbatim*> DD1 is DOUBLE PRECISION*> \endverbatim*>*> \param[in,out] DD2*> \verbatim*> DD2 is DOUBLE PRECISION*> \endverbatim*>*> \param[in,out] DX1*> \verbatim*> DX1 is DOUBLE PRECISION*> \endverbatim*>*> \param[in] DY1*> \verbatim*> DY1 is DOUBLE PRECISION*> \endverbatim*>*> \param[out] DPARAM*> \verbatim*> DPARAM is DOUBLE PRECISION array, dimension (5)*> DPARAM(1)=DFLAG*> DPARAM(2)=DH11*> DPARAM(3)=DH21*> DPARAM(4)=DH12*> DPARAM(5)=DH22*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level1** =====================================================================SUBROUTINE DROTMG(DD1,DD2,DX1,DY1,DPARAM)** -- Reference BLAS level1 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..DOUBLE PRECISION DD1,DD2,DX1,DY1* ..* .. Array Arguments ..DOUBLE PRECISION DPARAM(5)* ..** =====================================================================** .. Local Scalars ..DOUBLE PRECISION DFLAG,DH11,DH12,DH21,DH22,DP1,DP2,DQ1,DQ2,DTEMP,$ DU,GAM,GAMSQ,ONE,RGAMSQ,TWO,ZERO* ..* .. Intrinsic Functions ..INTRINSIC DABS* ..* .. Data statements ..*DATA ZERO,ONE,TWO/0.D0,1.D0,2.D0/DATA GAM,GAMSQ,RGAMSQ/4096.D0,16777216.D0,5.9604645D-8/* ..IF (DD1.LT.ZERO) THEN* GO ZERO-H-D-AND-DX1..DFLAG = -ONEDH11 = ZERODH12 = ZERODH21 = ZERODH22 = ZERO*DD1 = ZERODD2 = ZERODX1 = ZEROELSE* CASE-DD1-NONNEGATIVEDP2 = DD2*DY1IF (DP2.EQ.ZERO) THENDFLAG = -TWODPARAM(1) = DFLAGRETURNEND IF* REGULAR-CASE..DP1 = DD1*DX1DQ2 = DP2*DY1DQ1 = DP1*DX1*IF (DABS(DQ1).GT.DABS(DQ2)) THENDH21 = -DY1/DX1DH12 = DP2/DP1*DU = ONE - DH12*DH21*IF (DU.GT.ZERO) THENDFLAG = ZERODD1 = DD1/DUDD2 = DD2/DUDX1 = DX1*DUELSE* This code path if here for safety. We do not expect this* condition to ever hold except in edge cases with rounding* errors. See DOI: 10.1145/355841.355847DFLAG = -ONEDH11 = ZERODH12 = ZERODH21 = ZERODH22 = ZERO*DD1 = ZERODD2 = ZERODX1 = ZEROEND IFELSEIF (DQ2.LT.ZERO) THEN* GO ZERO-H-D-AND-DX1..DFLAG = -ONEDH11 = ZERODH12 = ZERODH21 = ZERODH22 = ZERO*DD1 = ZERODD2 = ZERODX1 = ZEROELSEDFLAG = ONEDH11 = DP1/DP2DH22 = DX1/DY1DU = ONE + DH11*DH22DTEMP = DD2/DUDD2 = DD1/DUDD1 = DTEMPDX1 = DY1*DUEND IFEND IF* PROCEDURE..SCALE-CHECKIF (DD1.NE.ZERO) THENDO WHILE ((DD1.LE.RGAMSQ) .OR. (DD1.GE.GAMSQ))IF (DFLAG.EQ.ZERO) THENDH11 = ONEDH22 = ONEDFLAG = -ONEELSEDH21 = -ONEDH12 = ONEDFLAG = -ONEEND IFIF (DD1.LE.RGAMSQ) THENDD1 = DD1*GAM**2DX1 = DX1/GAMDH11 = DH11/GAMDH12 = DH12/GAMELSEDD1 = DD1/GAM**2DX1 = DX1*GAMDH11 = DH11*GAMDH12 = DH12*GAMEND IFENDDOEND IFIF (DD2.NE.ZERO) THENDO WHILE ( (DABS(DD2).LE.RGAMSQ) .OR. (DABS(DD2).GE.GAMSQ) )IF (DFLAG.EQ.ZERO) THENDH11 = ONEDH22 = ONEDFLAG = -ONEELSEDH21 = -ONEDH12 = ONEDFLAG = -ONEEND IFIF (DABS(DD2).LE.RGAMSQ) THENDD2 = DD2*GAM**2DH21 = DH21/GAMDH22 = DH22/GAMELSEDD2 = DD2/GAM**2DH21 = DH21*GAMDH22 = DH22*GAMEND IFEND DOEND IFEND IFIF (DFLAG.LT.ZERO) THENDPARAM(2) = DH11DPARAM(3) = DH21DPARAM(4) = DH12DPARAM(5) = DH22ELSE IF (DFLAG.EQ.ZERO) THENDPARAM(3) = DH21DPARAM(4) = DH12ELSEDPARAM(2) = DH11DPARAM(5) = DH22END IFDPARAM(1) = DFLAGRETURN** End of DROTMG*END*> \brief \b DSBMV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DSBMV(UPLO,N,K,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)** .. Scalar Arguments ..* DOUBLE PRECISION ALPHA,BETA* INTEGER INCX,INCY,K,LDA,N* CHARACTER UPLO* ..* .. Array Arguments ..* DOUBLE PRECISION A(LDA,*),X(*),Y(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DSBMV performs the matrix-vector operation*>*> y := alpha*A*x + beta*y,*>*> where alpha and beta are scalars, x and y are n element vectors and*> A is an n by n symmetric band matrix, with k super-diagonals.*> \endverbatim** Arguments:* ==========**> \param[in] UPLO*> \verbatim*> UPLO is CHARACTER*1*> On entry, UPLO specifies whether the upper or lower*> triangular part of the band matrix A is being supplied as*> follows:*>*> UPLO = 'U' or 'u' The upper triangular part of A is*> being supplied.*>*> UPLO = 'L' or 'l' The lower triangular part of A is*> being supplied.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the order of the matrix A.*> N must be at least zero.*> \endverbatim*>*> \param[in] K*> \verbatim*> K is INTEGER*> On entry, K specifies the number of super-diagonals of the*> matrix A. K must satisfy 0 .le. K.*> \endverbatim*>*> \param[in] ALPHA*> \verbatim*> ALPHA is DOUBLE PRECISION.*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE PRECISION array, dimension ( LDA, N )*> Before entry with UPLO = 'U' or 'u', the leading ( k + 1 )*> by n part of the array A must contain the upper triangular*> band part of the symmetric matrix, supplied column by*> column, with the leading diagonal of the matrix in row*> ( k + 1 ) of the array, the first super-diagonal starting at*> position 2 in row k, and so on. The top left k by k triangle*> of the array A is not referenced.*> The following program segment will transfer the upper*> triangular part of a symmetric band matrix from conventional*> full matrix storage to band storage:*>*> DO 20, J = 1, N*> M = K + 1 - J*> DO 10, I = MAX( 1, J - K ), J*> A( M + I, J ) = matrix( I, J )*> 10 CONTINUE*> 20 CONTINUE*>*> Before entry with UPLO = 'L' or 'l', the leading ( k + 1 )*> by n part of the array A must contain the lower triangular*> band part of the symmetric matrix, supplied column by*> column, with the leading diagonal of the matrix in row 1 of*> the array, the first sub-diagonal starting at position 1 in*> row 2, and so on. The bottom right k by k triangle of the*> array A is not referenced.*> The following program segment will transfer the lower*> triangular part of a symmetric band matrix from conventional*> full matrix storage to band storage:*>*> DO 20, J = 1, N*> M = 1 - J*> DO 10, I = J, MIN( N, J + K )*> A( M + I, J ) = matrix( I, J )*> 10 CONTINUE*> 20 CONTINUE*> \endverbatim*>*> \param[in] LDA*> \verbatim*> LDA is INTEGER*> On entry, LDA specifies the first dimension of A as declared*> in the calling (sub) program. LDA must be at least*> ( k + 1 ).*> \endverbatim*>*> \param[in] X*> \verbatim*> X is DOUBLE PRECISION array, dimension at least*> ( 1 + ( n - 1 )*abs( INCX ) ).*> Before entry, the incremented array X must contain the*> vector x.*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> On entry, INCX specifies the increment for the elements of*> X. INCX must not be zero.*> \endverbatim*>*> \param[in] BETA*> \verbatim*> BETA is DOUBLE PRECISION.*> On entry, BETA specifies the scalar beta.*> \endverbatim*>*> \param[in,out] Y*> \verbatim*> Y is DOUBLE PRECISION array, dimension at least*> ( 1 + ( n - 1 )*abs( INCY ) ).*> Before entry, the incremented array Y must contain the*> vector y. On exit, Y is overwritten by the updated vector y.*> \endverbatim*>*> \param[in] INCY*> \verbatim*> INCY is INTEGER*> On entry, INCY specifies the increment for the elements of*> Y. INCY must not be zero.*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level2**> \par Further Details:* =====================*>*> \verbatim*>*> Level 2 Blas routine.*> The vector and matrix arguments are not referenced when N = 0, or M = 0*>*> -- 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.*> \endverbatim*>* =====================================================================SUBROUTINE DSBMV(UPLO,N,K,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)** -- Reference BLAS level2 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..DOUBLE PRECISION ALPHA,BETAINTEGER INCX,INCY,K,LDA,NCHARACTER UPLO* ..* .. Array Arguments ..DOUBLE PRECISION A(LDA,*),X(*),Y(*)* ..** =====================================================================** .. Parameters ..DOUBLE PRECISION ONE,ZEROPARAMETER (ONE=1.0D+0,ZERO=0.0D+0)* ..* .. Local Scalars ..DOUBLE PRECISION TEMP1,TEMP2INTEGER I,INFO,IX,IY,J,JX,JY,KPLUS1,KX,KY,L* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC MAX,MIN* ..** Test the input parameters.*INFO = 0IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THENINFO = 1ELSE IF (N.LT.0) THENINFO = 2ELSE IF (K.LT.0) THENINFO = 3ELSE IF (LDA.LT. (K+1)) THENINFO = 6ELSE IF (INCX.EQ.0) THENINFO = 8ELSE IF (INCY.EQ.0) THENINFO = 11END IFIF (INFO.NE.0) THENCALL XERBLA('DSBMV ',INFO)RETURNEND IF** Quick return if possible.*IF ((N.EQ.0) .OR. ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN** Set up the start points in X and Y.*IF (INCX.GT.0) THENKX = 1ELSEKX = 1 - (N-1)*INCXEND IFIF (INCY.GT.0) THENKY = 1ELSEKY = 1 - (N-1)*INCYEND IF** Start the operations. In this version the elements of the array A* are accessed sequentially with one pass through A.** First form y := beta*y.*IF (BETA.NE.ONE) THENIF (INCY.EQ.1) THENIF (BETA.EQ.ZERO) THENDO 10 I = 1,NY(I) = ZERO10 CONTINUEELSEDO 20 I = 1,NY(I) = BETA*Y(I)20 CONTINUEEND IFELSEIY = KYIF (BETA.EQ.ZERO) THENDO 30 I = 1,NY(IY) = ZEROIY = IY + INCY30 CONTINUEELSEDO 40 I = 1,NY(IY) = BETA*Y(IY)IY = IY + INCY40 CONTINUEEND IFEND IFEND IFIF (ALPHA.EQ.ZERO) RETURNIF (LSAME(UPLO,'U')) THEN** Form y when upper triangle of A is stored.*KPLUS1 = K + 1IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THENDO 60 J = 1,NTEMP1 = ALPHA*X(J)TEMP2 = ZEROL = KPLUS1 - JDO 50 I = MAX(1,J-K),J - 1Y(I) = Y(I) + TEMP1*A(L+I,J)TEMP2 = TEMP2 + A(L+I,J)*X(I)50 CONTINUEY(J) = Y(J) + TEMP1*A(KPLUS1,J) + ALPHA*TEMP260 CONTINUEELSEJX = KXJY = KYDO 80 J = 1,NTEMP1 = ALPHA*X(JX)TEMP2 = ZEROIX = KXIY = KYL = KPLUS1 - JDO 70 I = MAX(1,J-K),J - 1Y(IY) = Y(IY) + TEMP1*A(L+I,J)TEMP2 = TEMP2 + A(L+I,J)*X(IX)IX = IX + INCXIY = IY + INCY70 CONTINUEY(JY) = Y(JY) + TEMP1*A(KPLUS1,J) + ALPHA*TEMP2JX = JX + INCXJY = JY + INCYIF (J.GT.K) THENKX = KX + INCXKY = KY + INCYEND IF80 CONTINUEEND IFELSE** Form y when lower triangle of A is stored.*IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THENDO 100 J = 1,NTEMP1 = ALPHA*X(J)TEMP2 = ZEROY(J) = Y(J) + TEMP1*A(1,J)L = 1 - JDO 90 I = J + 1,MIN(N,J+K)Y(I) = Y(I) + TEMP1*A(L+I,J)TEMP2 = TEMP2 + A(L+I,J)*X(I)90 CONTINUEY(J) = Y(J) + ALPHA*TEMP2100 CONTINUEELSEJX = KXJY = KYDO 120 J = 1,NTEMP1 = ALPHA*X(JX)TEMP2 = ZEROY(JY) = Y(JY) + TEMP1*A(1,J)L = 1 - JIX = JXIY = JYDO 110 I = J + 1,MIN(N,J+K)IX = IX + INCXIY = IY + INCYY(IY) = Y(IY) + TEMP1*A(L+I,J)TEMP2 = TEMP2 + A(L+I,J)*X(IX)110 CONTINUEY(JY) = Y(JY) + ALPHA*TEMP2JX = JX + INCXJY = JY + INCY120 CONTINUEEND IFEND IF*RETURN** End of DSBMV*END*> \brief \b DSCAL** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DSCAL(N,DA,DX,INCX)** .. Scalar Arguments ..* DOUBLE PRECISION DA* INTEGER INCX,N* ..* .. Array Arguments ..* DOUBLE PRECISION DX(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DSCAL scales a vector by a constant.*> uses unrolled loops for increment equal to 1.*> \endverbatim** Arguments:* ==========**> \param[in] N*> \verbatim*> N is INTEGER*> number of elements in input vector(s)*> \endverbatim*>*> \param[in] DA*> \verbatim*> DA is DOUBLE PRECISION*> On entry, DA specifies the scalar alpha.*> \endverbatim*>*> \param[in,out] DX*> \verbatim*> DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) )*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> storage spacing between elements of DX*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level1**> \par Further Details:* =====================*>*> \verbatim*>*> jack dongarra, linpack, 3/11/78.*> modified 3/93 to return if incx .le. 0.*> modified 12/3/93, array(1) declarations changed to array(*)*> \endverbatim*>* =====================================================================SUBROUTINE DSCAL(N,DA,DX,INCX)** -- Reference BLAS level1 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..DOUBLE PRECISION DAINTEGER INCX,N* ..* .. Array Arguments ..DOUBLE PRECISION DX(*)* ..** =====================================================================** .. Local Scalars ..INTEGER I,M,MP1,NINCX* ..* .. Intrinsic Functions ..INTRINSIC MOD* ..IF (N.LE.0 .OR. INCX.LE.0) RETURNIF (INCX.EQ.1) THEN** code for increment equal to 1*** clean-up loop*M = MOD(N,5)IF (M.NE.0) THENDO I = 1,MDX(I) = DA*DX(I)END DOIF (N.LT.5) RETURNEND IFMP1 = M + 1DO I = MP1,N,5DX(I) = DA*DX(I)DX(I+1) = DA*DX(I+1)DX(I+2) = DA*DX(I+2)DX(I+3) = DA*DX(I+3)DX(I+4) = DA*DX(I+4)END DOELSE** code for increment not equal to 1*NINCX = N*INCXDO I = 1,NINCX,INCXDX(I) = DA*DX(I)END DOEND IFRETURN** End of DSCAL*END*> \brief \b DSDOT** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** DOUBLE PRECISION FUNCTION DSDOT(N,SX,INCX,SY,INCY)** .. Scalar Arguments ..* INTEGER INCX,INCY,N* ..* .. Array Arguments ..* REAL SX(*),SY(*)* ..** AUTHORS* =======* Lawson, C. L., (JPL), Hanson, R. J., (SNLA),* Kincaid, D. R., (U. of Texas), Krogh, F. T., (JPL)***> \par Purpose:* =============*>*> \verbatim*>*> Compute the inner product of two vectors with extended*> precision accumulation and result.*>*> Returns D.P. dot product accumulated in D.P., for S.P. SX and SY*> DSDOT = sum for I = 0 to N-1 of SX(LX+I*INCX) * SY(LY+I*INCY),*> where LX = 1 if INCX .GE. 0, else LX = 1+(1-N)*INCX, and LY is*> defined in a similar way using INCY.*> \endverbatim** Arguments:* ==========**> \param[in] N*> \verbatim*> N is INTEGER*> number of elements in input vector(s)*> \endverbatim*>*> \param[in] SX*> \verbatim*> SX is REAL array, dimension(N)*> single precision vector with N elements*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> storage spacing between elements of SX*> \endverbatim*>*> \param[in] SY*> \verbatim*> SY is REAL array, dimension(N)*> single precision vector with N elements*> \endverbatim*>*> \param[in] INCY*> \verbatim*> INCY is INTEGER*> storage spacing between elements of SY*> \endverbatim*>*> \result DSDOT*> \verbatim*> DSDOT is DOUBLE PRECISION*> DSDOT double precision dot product (zero if N.LE.0)*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level1**> \par Further Details:* =====================*>*> \verbatim*> \endverbatim**> \par References:* ================*>*> \verbatim*>*>*> C. L. Lawson, R. J. Hanson, D. R. Kincaid and F. T.*> Krogh, Basic linear algebra subprograms for Fortran*> usage, Algorithm No. 539, Transactions on Mathematical*> Software 5, 3 (September 1979), pp. 308-323.*>*> REVISION HISTORY (YYMMDD)*>*> 791001 DATE WRITTEN*> 890831 Modified array declarations. (WRB)*> 890831 REVISION DATE from Version 3.2*> 891214 Prologue converted to Version 4.0 format. (BAB)*> 920310 Corrected definition of LX in DESCRIPTION. (WRB)*> 920501 Reformatted the REFERENCES section. (WRB)*> 070118 Reformat to LAPACK style (JL)*> \endverbatim*>* =====================================================================DOUBLE PRECISION FUNCTION DSDOT(N,SX,INCX,SY,INCY)** -- Reference BLAS level1 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..INTEGER INCX,INCY,N* ..* .. Array Arguments ..REAL SX(*),SY(*)* ..** Authors:* ========* Lawson, C. L., (JPL), Hanson, R. J., (SNLA),* Kincaid, D. R., (U. of Texas), Krogh, F. T., (JPL)** =====================================================================** .. Local Scalars ..INTEGER I,KX,KY,NS* ..* .. Intrinsic Functions ..INTRINSIC DBLE* ..DSDOT = 0.0D0IF (N.LE.0) RETURNIF (INCX.EQ.INCY .AND. INCX.GT.0) THEN** Code for equal, positive, non-unit increments.*NS = N*INCXDO I = 1,NS,INCXDSDOT = DSDOT + DBLE(SX(I))*DBLE(SY(I))END DOELSE** Code for unequal or nonpositive increments.*KX = 1KY = 1IF (INCX.LT.0) KX = 1 + (1-N)*INCXIF (INCY.LT.0) KY = 1 + (1-N)*INCYDO I = 1,NDSDOT = DSDOT + DBLE(SX(KX))*DBLE(SY(KY))KX = KX + INCXKY = KY + INCYEND DOEND IFRETURN** End of DSDOT*END*> \brief \b DSPMV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DSPMV(UPLO,N,ALPHA,AP,X,INCX,BETA,Y,INCY)** .. Scalar Arguments ..* DOUBLE PRECISION ALPHA,BETA* INTEGER INCX,INCY,N* CHARACTER UPLO* ..* .. Array Arguments ..* DOUBLE PRECISION AP(*),X(*),Y(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DSPMV performs the matrix-vector operation*>*> y := alpha*A*x + beta*y,*>*> where alpha and beta are scalars, x and y are n element vectors and*> A is an n by n symmetric matrix, supplied in packed form.*> \endverbatim** Arguments:* ==========**> \param[in] UPLO*> \verbatim*> UPLO is CHARACTER*1*> On entry, UPLO specifies whether the upper or lower*> triangular part of the matrix A is supplied in the packed*> array AP as follows:*>*> UPLO = 'U' or 'u' The upper triangular part of A is*> supplied in AP.*>*> UPLO = 'L' or 'l' The lower triangular part of A is*> supplied in AP.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the order of the matrix A.*> N must be at least zero.*> \endverbatim*>*> \param[in] ALPHA*> \verbatim*> ALPHA is DOUBLE PRECISION.*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] AP*> \verbatim*> AP is DOUBLE PRECISION array, dimension at least*> ( ( n*( n + 1 ) )/2 ).*> Before entry with UPLO = 'U' or 'u', the array AP must*> contain the upper triangular part of the symmetric 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 part of the symmetric 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.*> \endverbatim*>*> \param[in] X*> \verbatim*> X is DOUBLE PRECISION array, dimension at least*> ( 1 + ( n - 1 )*abs( INCX ) ).*> Before entry, the incremented array X must contain the n*> element vector x.*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> On entry, INCX specifies the increment for the elements of*> X. INCX must not be zero.*> \endverbatim*>*> \param[in] BETA*> \verbatim*> BETA is DOUBLE PRECISION.*> On entry, BETA specifies the scalar beta. When BETA is*> supplied as zero then Y need not be set on input.*> \endverbatim*>*> \param[in,out] Y*> \verbatim*> Y is DOUBLE PRECISION array, dimension at least*> ( 1 + ( n - 1 )*abs( INCY ) ).*> Before entry, the incremented array Y must contain the n*> element vector y. On exit, Y is overwritten by the updated*> vector y.*> \endverbatim*>*> \param[in] INCY*> \verbatim*> INCY is INTEGER*> On entry, INCY specifies the increment for the elements of*> Y. INCY must not be zero.*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level2**> \par Further Details:* =====================*>*> \verbatim*>*> Level 2 Blas routine.*> The vector and matrix arguments are not referenced when N = 0, or M = 0*>*> -- 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.*> \endverbatim*>* =====================================================================SUBROUTINE DSPMV(UPLO,N,ALPHA,AP,X,INCX,BETA,Y,INCY)** -- Reference BLAS level2 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..DOUBLE PRECISION ALPHA,BETAINTEGER INCX,INCY,NCHARACTER UPLO* ..* .. Array Arguments ..DOUBLE PRECISION AP(*),X(*),Y(*)* ..** =====================================================================** .. Parameters ..DOUBLE PRECISION ONE,ZEROPARAMETER (ONE=1.0D+0,ZERO=0.0D+0)* ..* .. Local Scalars ..DOUBLE PRECISION TEMP1,TEMP2INTEGER I,INFO,IX,IY,J,JX,JY,K,KK,KX,KY* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..** 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 = 6ELSE IF (INCY.EQ.0) THENINFO = 9END IFIF (INFO.NE.0) THENCALL XERBLA('DSPMV ',INFO)RETURNEND IF** Quick return if possible.*IF ((N.EQ.0) .OR. ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN** Set up the start points in X and Y.*IF (INCX.GT.0) THENKX = 1ELSEKX = 1 - (N-1)*INCXEND IFIF (INCY.GT.0) THENKY = 1ELSEKY = 1 - (N-1)*INCYEND IF** Start the operations. In this version the elements of the array AP* are accessed sequentially with one pass through AP.** First form y := beta*y.*IF (BETA.NE.ONE) THENIF (INCY.EQ.1) THENIF (BETA.EQ.ZERO) THENDO 10 I = 1,NY(I) = ZERO10 CONTINUEELSEDO 20 I = 1,NY(I) = BETA*Y(I)20 CONTINUEEND IFELSEIY = KYIF (BETA.EQ.ZERO) THENDO 30 I = 1,NY(IY) = ZEROIY = IY + INCY30 CONTINUEELSEDO 40 I = 1,NY(IY) = BETA*Y(IY)IY = IY + INCY40 CONTINUEEND IFEND IFEND IFIF (ALPHA.EQ.ZERO) RETURNKK = 1IF (LSAME(UPLO,'U')) THEN** Form y when AP contains the upper triangle.*IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THENDO 60 J = 1,NTEMP1 = ALPHA*X(J)TEMP2 = ZEROK = KKDO 50 I = 1,J - 1Y(I) = Y(I) + TEMP1*AP(K)TEMP2 = TEMP2 + AP(K)*X(I)K = K + 150 CONTINUEY(J) = Y(J) + TEMP1*AP(KK+J-1) + ALPHA*TEMP2KK = KK + J60 CONTINUEELSEJX = KXJY = KYDO 80 J = 1,NTEMP1 = ALPHA*X(JX)TEMP2 = ZEROIX = KXIY = KYDO 70 K = KK,KK + J - 2Y(IY) = Y(IY) + TEMP1*AP(K)TEMP2 = TEMP2 + AP(K)*X(IX)IX = IX + INCXIY = IY + INCY70 CONTINUEY(JY) = Y(JY) + TEMP1*AP(KK+J-1) + ALPHA*TEMP2JX = JX + INCXJY = JY + INCYKK = KK + J80 CONTINUEEND IFELSE** Form y when AP contains the lower triangle.*IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THENDO 100 J = 1,NTEMP1 = ALPHA*X(J)TEMP2 = ZEROY(J) = Y(J) + TEMP1*AP(KK)K = KK + 1DO 90 I = J + 1,NY(I) = Y(I) + TEMP1*AP(K)TEMP2 = TEMP2 + AP(K)*X(I)K = K + 190 CONTINUEY(J) = Y(J) + ALPHA*TEMP2KK = KK + (N-J+1)100 CONTINUEELSEJX = KXJY = KYDO 120 J = 1,NTEMP1 = ALPHA*X(JX)TEMP2 = ZEROY(JY) = Y(JY) + TEMP1*AP(KK)IX = JXIY = JYDO 110 K = KK + 1,KK + N - JIX = IX + INCXIY = IY + INCYY(IY) = Y(IY) + TEMP1*AP(K)TEMP2 = TEMP2 + AP(K)*X(IX)110 CONTINUEY(JY) = Y(JY) + ALPHA*TEMP2JX = JX + INCXJY = JY + INCYKK = KK + (N-J+1)120 CONTINUEEND IFEND IF*RETURN** End of DSPMV*END*> \brief \b DSPR2** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DSPR2(UPLO,N,ALPHA,X,INCX,Y,INCY,AP)** .. Scalar Arguments ..* DOUBLE PRECISION ALPHA* INTEGER INCX,INCY,N* CHARACTER UPLO* ..* .. Array Arguments ..* DOUBLE PRECISION AP(*),X(*),Y(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DSPR2 performs the symmetric rank 2 operation*>*> A := alpha*x*y**T + alpha*y*x**T + A,*>*> where alpha is a scalar, x and y are n element vectors and A is an*> n by n symmetric matrix, supplied in packed form.*> \endverbatim** Arguments:* ==========**> \param[in] UPLO*> \verbatim*> UPLO is CHARACTER*1*> On entry, UPLO specifies whether the upper or lower*> triangular part of the matrix A is supplied in the packed*> array AP as follows:*>*> UPLO = 'U' or 'u' The upper triangular part of A is*> supplied in AP.*>*> UPLO = 'L' or 'l' The lower triangular part of A is*> supplied in AP.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the order of the matrix A.*> N must be at least zero.*> \endverbatim*>*> \param[in] ALPHA*> \verbatim*> ALPHA is DOUBLE PRECISION.*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] X*> \verbatim*> X is DOUBLE PRECISION array, dimension at least*> ( 1 + ( n - 1 )*abs( INCX ) ).*> Before entry, the incremented array X must contain the n*> element vector x.*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> On entry, INCX specifies the increment for the elements of*> X. INCX must not be zero.*> \endverbatim*>*> \param[in] Y*> \verbatim*> Y is DOUBLE PRECISION array, dimension at least*> ( 1 + ( n - 1 )*abs( INCY ) ).*> Before entry, the incremented array Y must contain the n*> element vector y.*> \endverbatim*>*> \param[in] INCY*> \verbatim*> INCY is INTEGER*> On entry, INCY specifies the increment for the elements of*> Y. INCY must not be zero.*> \endverbatim*>*> \param[in,out] AP*> \verbatim*> AP is DOUBLE PRECISION array, dimension at least*> ( ( n*( n + 1 ) )/2 ).*> Before entry with UPLO = 'U' or 'u', the array AP must*> contain the upper triangular part of the symmetric 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. On exit, the array*> AP is overwritten by the upper triangular part of the*> updated matrix.*> Before entry with UPLO = 'L' or 'l', the array AP must*> contain the lower triangular part of the symmetric 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. On exit, the array*> AP is overwritten by the lower triangular part of the*> updated matrix.*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level2**> \par Further Details:* =====================*>*> \verbatim*>*> 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.*> \endverbatim*>* =====================================================================SUBROUTINE DSPR2(UPLO,N,ALPHA,X,INCX,Y,INCY,AP)** -- Reference BLAS level2 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..DOUBLE PRECISION ALPHAINTEGER INCX,INCY,NCHARACTER UPLO* ..* .. Array Arguments ..DOUBLE PRECISION AP(*),X(*),Y(*)* ..** =====================================================================** .. Parameters ..DOUBLE PRECISION ZEROPARAMETER (ZERO=0.0D+0)* ..* .. Local Scalars ..DOUBLE PRECISION TEMP1,TEMP2INTEGER I,INFO,IX,IY,J,JX,JY,K,KK,KX,KY* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..** 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 (INCY.EQ.0) THENINFO = 7END IFIF (INFO.NE.0) THENCALL XERBLA('DSPR2 ',INFO)RETURNEND IF** Quick return if possible.*IF ((N.EQ.0) .OR. (ALPHA.EQ.ZERO)) RETURN** Set up the start points in X and Y if the increments are not both* unity.*IF ((INCX.NE.1) .OR. (INCY.NE.1)) THENIF (INCX.GT.0) THENKX = 1ELSEKX = 1 - (N-1)*INCXEND IFIF (INCY.GT.0) THENKY = 1ELSEKY = 1 - (N-1)*INCYEND IFJX = KXJY = KYEND IF** Start the operations. In this version the elements of the array AP* are accessed sequentially with one pass through AP.*KK = 1IF (LSAME(UPLO,'U')) THEN** Form A when upper triangle is stored in AP.*IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THENDO 20 J = 1,Nc IF ((X(J).NE.ZERO) .OR. (Y(J).NE.ZERO)) THENTEMP1 = ALPHA*Y(J)TEMP2 = ALPHA*X(J)K = KKDO 10 I = 1,JAP(K) = AP(K) + X(I)*TEMP1 + Y(I)*TEMP2K = K + 110 CONTINUEc END IFKK = KK + J20 CONTINUEELSEDO 40 J = 1,Nc IF ((X(JX).NE.ZERO) .OR. (Y(JY).NE.ZERO)) THENTEMP1 = ALPHA*Y(JY)TEMP2 = ALPHA*X(JX)IX = KXIY = KYDO 30 K = KK,KK + J - 1AP(K) = AP(K) + X(IX)*TEMP1 + Y(IY)*TEMP2IX = IX + INCXIY = IY + INCY30 CONTINUEc END IFJX = JX + INCXJY = JY + INCYKK = KK + J40 CONTINUEEND IFELSE** Form A when lower triangle is stored in AP.*IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THENDO 60 J = 1,Nc IF ((X(J).NE.ZERO) .OR. (Y(J).NE.ZERO)) THENTEMP1 = ALPHA*Y(J)TEMP2 = ALPHA*X(J)K = KKDO 50 I = J,NAP(K) = AP(K) + X(I)*TEMP1 + Y(I)*TEMP2K = K + 150 CONTINUEc END IFKK = KK + N - J + 160 CONTINUEELSEDO 80 J = 1,Nc IF ((X(JX).NE.ZERO) .OR. (Y(JY).NE.ZERO)) THENTEMP1 = ALPHA*Y(JY)TEMP2 = ALPHA*X(JX)IX = JXIY = JYDO 70 K = KK,KK + N - JAP(K) = AP(K) + X(IX)*TEMP1 + Y(IY)*TEMP2IX = IX + INCXIY = IY + INCY70 CONTINUEc END IFJX = JX + INCXJY = JY + INCYKK = KK + N - J + 180 CONTINUEEND IFEND IF*RETURN** End of DSPR2*END*> \brief \b DSPR** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DSPR(UPLO,N,ALPHA,X,INCX,AP)** .. Scalar Arguments ..* DOUBLE PRECISION ALPHA* INTEGER INCX,N* CHARACTER UPLO* ..* .. Array Arguments ..* DOUBLE PRECISION AP(*),X(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DSPR performs the symmetric rank 1 operation*>*> A := alpha*x*x**T + A,*>*> where alpha is a real scalar, x is an n element vector and A is an*> n by n symmetric matrix, supplied in packed form.*> \endverbatim** Arguments:* ==========**> \param[in] UPLO*> \verbatim*> UPLO is CHARACTER*1*> On entry, UPLO specifies whether the upper or lower*> triangular part of the matrix A is supplied in the packed*> array AP as follows:*>*> UPLO = 'U' or 'u' The upper triangular part of A is*> supplied in AP.*>*> UPLO = 'L' or 'l' The lower triangular part of A is*> supplied in AP.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the order of the matrix A.*> N must be at least zero.*> \endverbatim*>*> \param[in] ALPHA*> \verbatim*> ALPHA is DOUBLE PRECISION.*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] X*> \verbatim*> X is DOUBLE PRECISION array, dimension at least*> ( 1 + ( n - 1 )*abs( INCX ) ).*> Before entry, the incremented array X must contain the n*> element vector x.*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> On entry, INCX specifies the increment for the elements of*> X. INCX must not be zero.*> \endverbatim*>*> \param[in,out] AP*> \verbatim*> AP is DOUBLE PRECISION array, dimension at least*> ( ( n*( n + 1 ) )/2 ).*> Before entry with UPLO = 'U' or 'u', the array AP must*> contain the upper triangular part of the symmetric 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. On exit, the array*> AP is overwritten by the upper triangular part of the*> updated matrix.*> Before entry with UPLO = 'L' or 'l', the array AP must*> contain the lower triangular part of the symmetric 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. On exit, the array*> AP is overwritten by the lower triangular part of the*> updated matrix.*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level2**> \par Further Details:* =====================*>*> \verbatim*>*> 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.*> \endverbatim*>* =====================================================================SUBROUTINE DSPR(UPLO,N,ALPHA,X,INCX,AP)** -- Reference BLAS level2 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..DOUBLE PRECISION ALPHAINTEGER INCX,NCHARACTER UPLO* ..* .. Array Arguments ..DOUBLE PRECISION AP(*),X(*)* ..** =====================================================================** .. Parameters ..DOUBLE PRECISION ZEROPARAMETER (ZERO=0.0D+0)* ..* .. Local Scalars ..DOUBLE PRECISION TEMPINTEGER I,INFO,IX,J,JX,K,KK,KX* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..** 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 = 5END IFIF (INFO.NE.0) THENCALL XERBLA('DSPR ',INFO)RETURNEND IF** Quick return if possible.*IF ((N.EQ.0) .OR. (ALPHA.EQ.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 the array AP* are accessed sequentially with one pass through AP.*KK = 1IF (LSAME(UPLO,'U')) THEN** Form A when upper triangle is stored in AP.*IF (INCX.EQ.1) THENDO 20 J = 1,Nc IF (X(J).NE.ZERO) THENTEMP = ALPHA*X(J)K = KKDO 10 I = 1,JAP(K) = AP(K) + X(I)*TEMPK = K + 110 CONTINUEc END IFKK = KK + J20 CONTINUEELSEJX = KXDO 40 J = 1,Nc IF (X(JX).NE.ZERO) THENTEMP = ALPHA*X(JX)IX = KXDO 30 K = KK,KK + J - 1AP(K) = AP(K) + X(IX)*TEMPIX = IX + INCX30 CONTINUEc END IFJX = JX + INCXKK = KK + J40 CONTINUEEND IFELSE** Form A when lower triangle is stored in AP.*IF (INCX.EQ.1) THENDO 60 J = 1,Nc IF (X(J).NE.ZERO) THENTEMP = ALPHA*X(J)K = KKDO 50 I = J,NAP(K) = AP(K) + X(I)*TEMPK = K + 150 CONTINUEc END IFKK = KK + N - J + 160 CONTINUEELSEJX = KXDO 80 J = 1,Nc IF (X(JX).NE.ZERO) THENTEMP = ALPHA*X(JX)IX = JXDO 70 K = KK,KK + N - JAP(K) = AP(K) + X(IX)*TEMPIX = IX + INCX70 CONTINUEc END IFJX = JX + INCXKK = KK + N - J + 180 CONTINUEEND IFEND IF*RETURN** End of DSPR*END*> \brief \b DSWAP** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DSWAP(N,DX,INCX,DY,INCY)** .. Scalar Arguments ..* INTEGER INCX,INCY,N* ..* .. Array Arguments ..* DOUBLE PRECISION DX(*),DY(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DSWAP interchanges two vectors.*> uses unrolled loops for increments equal to 1.*> \endverbatim** Arguments:* ==========**> \param[in] N*> \verbatim*> N is INTEGER*> number of elements in input vector(s)*> \endverbatim*>*> \param[in,out] DX*> \verbatim*> DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) )*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> storage spacing between elements of DX*> \endverbatim*>*> \param[in,out] DY*> \verbatim*> DY is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCY ) )*> \endverbatim*>*> \param[in] INCY*> \verbatim*> INCY is INTEGER*> storage spacing between elements of DY*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level1**> \par Further Details:* =====================*>*> \verbatim*>*> jack dongarra, linpack, 3/11/78.*> modified 12/3/93, array(1) declarations changed to array(*)*> \endverbatim*>* =====================================================================SUBROUTINE DSWAP(N,DX,INCX,DY,INCY)** -- Reference BLAS level1 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..INTEGER INCX,INCY,N* ..* .. Array Arguments ..DOUBLE PRECISION DX(*),DY(*)* ..** =====================================================================** .. Local Scalars ..DOUBLE PRECISION DTEMPINTEGER I,IX,IY,M,MP1* ..* .. Intrinsic Functions ..INTRINSIC MOD* ..IF (N.LE.0) RETURNIF (INCX.EQ.1 .AND. INCY.EQ.1) THEN** code for both increments equal to 1*** clean-up loop*M = MOD(N,3)IF (M.NE.0) THENDO I = 1,MDTEMP = DX(I)DX(I) = DY(I)DY(I) = DTEMPEND DOIF (N.LT.3) RETURNEND IFMP1 = M + 1DO I = MP1,N,3DTEMP = DX(I)DX(I) = DY(I)DY(I) = DTEMPDTEMP = DX(I+1)DX(I+1) = DY(I+1)DY(I+1) = DTEMPDTEMP = DX(I+2)DX(I+2) = DY(I+2)DY(I+2) = DTEMPEND DOELSE** code for unequal increments or equal increments not equal* to 1*IX = 1IY = 1IF (INCX.LT.0) IX = (-N+1)*INCX + 1IF (INCY.LT.0) IY = (-N+1)*INCY + 1DO I = 1,NDTEMP = DX(IX)DX(IX) = DY(IY)DY(IY) = DTEMPIX = IX + INCXIY = IY + INCYEND DOEND IFRETURN** End of DSWAP*END*> \brief \b DSYMM** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DSYMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC)** .. Scalar Arguments ..* DOUBLE PRECISION ALPHA,BETA* INTEGER LDA,LDB,LDC,M,N* CHARACTER SIDE,UPLO* ..* .. Array Arguments ..* DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DSYMM performs one of the matrix-matrix operations*>*> C := alpha*A*B + beta*C,*>*> or*>*> C := alpha*B*A + beta*C,*>*> where alpha and beta are scalars, A is a symmetric matrix and B and*> C are m by n matrices.*> \endverbatim** Arguments:* ==========**> \param[in] SIDE*> \verbatim*> SIDE is CHARACTER*1*> On entry, SIDE specifies whether the symmetric matrix A*> appears on the left or right in the operation as follows:*>*> SIDE = 'L' or 'l' C := alpha*A*B + beta*C,*>*> SIDE = 'R' or 'r' C := alpha*B*A + beta*C,*> \endverbatim*>*> \param[in] UPLO*> \verbatim*> UPLO is CHARACTER*1*> On entry, UPLO specifies whether the upper or lower*> triangular part of the symmetric matrix A is to be*> referenced as follows:*>*> UPLO = 'U' or 'u' Only the upper triangular part of the*> symmetric matrix is to be referenced.*>*> UPLO = 'L' or 'l' Only the lower triangular part of the*> symmetric matrix is to be referenced.*> \endverbatim*>*> \param[in] M*> \verbatim*> M is INTEGER*> On entry, M specifies the number of rows of the matrix C.*> M must be at least zero.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the number of columns of the matrix C.*> N must be at least zero.*> \endverbatim*>*> \param[in] ALPHA*> \verbatim*> ALPHA is DOUBLE PRECISION.*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE PRECISION array, dimension ( LDA, ka ), where ka is*> m when SIDE = 'L' or 'l' and is n otherwise.*> Before entry with SIDE = 'L' or 'l', the m by m part of*> the array A must contain the symmetric matrix, such that*> when UPLO = 'U' or 'u', the leading m by m upper triangular*> part of the array A must contain the upper triangular part*> of the symmetric matrix and the strictly lower triangular*> part of A is not referenced, and when UPLO = 'L' or 'l',*> the leading m by m lower triangular part of the array A*> must contain the lower triangular part of the symmetric*> matrix and the strictly upper triangular part of A is not*> referenced.*> Before entry with SIDE = 'R' or 'r', the n by n part of*> the array A must contain the symmetric matrix, such that*> when UPLO = 'U' or 'u', the leading n by n upper triangular*> part of the array A must contain the upper triangular part*> of the symmetric matrix and the strictly lower triangular*> part of A is not referenced, and when UPLO = 'L' or 'l',*> the leading n by n lower triangular part of the array A*> must contain the lower triangular part of the symmetric*> matrix and the strictly upper triangular part of A is not*> referenced.*> \endverbatim*>*> \param[in] LDA*> \verbatim*> LDA is INTEGER*> On entry, LDA specifies the first dimension of A as declared*> in the calling (sub) program. When SIDE = 'L' or 'l' then*> LDA must be at least max( 1, m ), otherwise LDA must be at*> least max( 1, n ).*> \endverbatim*>*> \param[in] B*> \verbatim*> B is DOUBLE PRECISION array, dimension ( LDB, N )*> Before entry, the leading m by n part of the array B must*> contain the matrix B.*> \endverbatim*>*> \param[in] LDB*> \verbatim*> LDB is INTEGER*> On entry, LDB specifies the first dimension of B as declared*> in the calling (sub) program. LDB must be at least*> max( 1, m ).*> \endverbatim*>*> \param[in] BETA*> \verbatim*> BETA is DOUBLE PRECISION.*> On entry, BETA specifies the scalar beta. When BETA is*> supplied as zero then C need not be set on input.*> \endverbatim*>*> \param[in,out] C*> \verbatim*> C is DOUBLE PRECISION array, dimension ( LDC, N )*> Before entry, the leading m by n part of the array C must*> contain the matrix C, except when beta is zero, in which*> case C need not be set on entry.*> On exit, the array C is overwritten by the m by n updated*> matrix.*> \endverbatim*>*> \param[in] LDC*> \verbatim*> LDC is INTEGER*> On entry, LDC specifies the first dimension of C as declared*> in the calling (sub) program. LDC must be at least*> max( 1, m ).*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level3**> \par Further Details:* =====================*>*> \verbatim*>*> Level 3 Blas routine.*>*> -- Written on 8-February-1989.*> Jack Dongarra, Argonne National Laboratory.*> Iain Duff, AERE Harwell.*> Jeremy Du Croz, Numerical Algorithms Group Ltd.*> Sven Hammarling, Numerical Algorithms Group Ltd.*> \endverbatim*>* =====================================================================SUBROUTINE DSYMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC)** -- Reference BLAS level3 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..DOUBLE PRECISION ALPHA,BETAINTEGER LDA,LDB,LDC,M,NCHARACTER SIDE,UPLO* ..* .. Array Arguments ..DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*)* ..** =====================================================================** .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC MAX* ..* .. Local Scalars ..DOUBLE PRECISION TEMP1,TEMP2INTEGER I,INFO,J,K,NROWALOGICAL UPPER* ..* .. Parameters ..DOUBLE PRECISION ONE,ZEROPARAMETER (ONE=1.0D+0,ZERO=0.0D+0)* ..** Set NROWA as the number of rows of A.*IF (LSAME(SIDE,'L')) THENNROWA = MELSENROWA = NEND IFUPPER = LSAME(UPLO,'U')** Test the input parameters.*INFO = 0IF ((.NOT.LSAME(SIDE,'L')) .AND. (.NOT.LSAME(SIDE,'R'))) THENINFO = 1ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THENINFO = 2ELSE IF (M.LT.0) THENINFO = 3ELSE IF (N.LT.0) THENINFO = 4ELSE IF (LDA.LT.MAX(1,NROWA)) THENINFO = 7ELSE IF (LDB.LT.MAX(1,M)) THENINFO = 9ELSE IF (LDC.LT.MAX(1,M)) THENINFO = 12END IFIF (INFO.NE.0) THENCALL XERBLA('DSYMM ',INFO)RETURNEND IF** Quick return if possible.*IF ((M.EQ.0) .OR. (N.EQ.0) .OR.+ ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN** And when alpha.eq.zero.*IF (ALPHA.EQ.ZERO) THENIF (BETA.EQ.ZERO) THENDO 20 J = 1,NDO 10 I = 1,MC(I,J) = ZERO10 CONTINUE20 CONTINUEELSEDO 40 J = 1,NDO 30 I = 1,MC(I,J) = BETA*C(I,J)30 CONTINUE40 CONTINUEEND IFRETURNEND IF** Start the operations.*IF (LSAME(SIDE,'L')) THEN** Form C := alpha*A*B + beta*C.*IF (UPPER) THENDO 70 J = 1,NDO 60 I = 1,MTEMP1 = ALPHA*B(I,J)TEMP2 = ZERODO 50 K = 1,I - 1C(K,J) = C(K,J) + TEMP1*A(K,I)TEMP2 = TEMP2 + B(K,J)*A(K,I)50 CONTINUEIF (BETA.EQ.ZERO) THENC(I,J) = TEMP1*A(I,I) + ALPHA*TEMP2ELSEC(I,J) = BETA*C(I,J) + TEMP1*A(I,I) ++ ALPHA*TEMP2END IF60 CONTINUE70 CONTINUEELSEDO 100 J = 1,NDO 90 I = M,1,-1TEMP1 = ALPHA*B(I,J)TEMP2 = ZERODO 80 K = I + 1,MC(K,J) = C(K,J) + TEMP1*A(K,I)TEMP2 = TEMP2 + B(K,J)*A(K,I)80 CONTINUEIF (BETA.EQ.ZERO) THENC(I,J) = TEMP1*A(I,I) + ALPHA*TEMP2ELSEC(I,J) = BETA*C(I,J) + TEMP1*A(I,I) ++ ALPHA*TEMP2END IF90 CONTINUE100 CONTINUEEND IFELSE** Form C := alpha*B*A + beta*C.*DO 170 J = 1,NTEMP1 = ALPHA*A(J,J)IF (BETA.EQ.ZERO) THENDO 110 I = 1,MC(I,J) = TEMP1*B(I,J)110 CONTINUEELSEDO 120 I = 1,MC(I,J) = BETA*C(I,J) + TEMP1*B(I,J)120 CONTINUEEND IFDO 140 K = 1,J - 1IF (UPPER) THENTEMP1 = ALPHA*A(K,J)ELSETEMP1 = ALPHA*A(J,K)END IFDO 130 I = 1,MC(I,J) = C(I,J) + TEMP1*B(I,K)130 CONTINUE140 CONTINUEDO 160 K = J + 1,NIF (UPPER) THENTEMP1 = ALPHA*A(J,K)ELSETEMP1 = ALPHA*A(K,J)END IFDO 150 I = 1,MC(I,J) = C(I,J) + TEMP1*B(I,K)150 CONTINUE160 CONTINUE170 CONTINUEEND IF*RETURN** End of DSYMM*END*> \brief \b DSYMV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DSYMV(UPLO,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)** .. Scalar Arguments ..* DOUBLE PRECISION ALPHA,BETA* INTEGER INCX,INCY,LDA,N* CHARACTER UPLO* ..* .. Array Arguments ..* DOUBLE PRECISION A(LDA,*),X(*),Y(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DSYMV performs the matrix-vector operation*>*> y := alpha*A*x + beta*y,*>*> where alpha and beta are scalars, x and y are n element vectors and*> A is an n by n symmetric matrix.*> \endverbatim** Arguments:* ==========**> \param[in] UPLO*> \verbatim*> UPLO is 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.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the order of the matrix A.*> N must be at least zero.*> \endverbatim*>*> \param[in] ALPHA*> \verbatim*> ALPHA is DOUBLE PRECISION.*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE PRECISION array, 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 symmetric 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 part of the symmetric matrix and the strictly*> upper triangular part of A is not referenced.*> \endverbatim*>*> \param[in] LDA*> \verbatim*> LDA is 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 ).*> \endverbatim*>*> \param[in] X*> \verbatim*> X is DOUBLE PRECISION array, dimension at least*> ( 1 + ( n - 1 )*abs( INCX ) ).*> Before entry, the incremented array X must contain the n*> element vector x.*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> On entry, INCX specifies the increment for the elements of*> X. INCX must not be zero.*> \endverbatim*>*> \param[in] BETA*> \verbatim*> BETA is DOUBLE PRECISION.*> On entry, BETA specifies the scalar beta. When BETA is*> supplied as zero then Y need not be set on input.*> \endverbatim*>*> \param[in,out] Y*> \verbatim*> Y is DOUBLE PRECISION array, dimension at least*> ( 1 + ( n - 1 )*abs( INCY ) ).*> Before entry, the incremented array Y must contain the n*> element vector y. On exit, Y is overwritten by the updated*> vector y.*> \endverbatim*>*> \param[in] INCY*> \verbatim*> INCY is INTEGER*> On entry, INCY specifies the increment for the elements of*> Y. INCY must not be zero.*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level2**> \par Further Details:* =====================*>*> \verbatim*>*> Level 2 Blas routine.*> The vector and matrix arguments are not referenced when N = 0, or M = 0*>*> -- 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.*> \endverbatim*>* =====================================================================SUBROUTINE DSYMV(UPLO,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)** -- Reference BLAS level2 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..DOUBLE PRECISION ALPHA,BETAINTEGER INCX,INCY,LDA,NCHARACTER UPLO* ..* .. Array Arguments ..DOUBLE PRECISION A(LDA,*),X(*),Y(*)* ..** =====================================================================** .. Parameters ..DOUBLE PRECISION ONE,ZEROPARAMETER (ONE=1.0D+0,ZERO=0.0D+0)* ..* .. Local Scalars ..DOUBLE PRECISION TEMP1,TEMP2INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC MAX* ..** Test the input parameters.*INFO = 0IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THENINFO = 1ELSE IF (N.LT.0) THENINFO = 2ELSE IF (LDA.LT.MAX(1,N)) THENINFO = 5ELSE IF (INCX.EQ.0) THENINFO = 7ELSE IF (INCY.EQ.0) THENINFO = 10END IFIF (INFO.NE.0) THENCALL XERBLA('DSYMV ',INFO)RETURNEND IF** Quick return if possible.*IF ((N.EQ.0) .OR. ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN** Set up the start points in X and Y.*IF (INCX.GT.0) THENKX = 1ELSEKX = 1 - (N-1)*INCXEND IFIF (INCY.GT.0) THENKY = 1ELSEKY = 1 - (N-1)*INCYEND IF** Start the operations. In this version the elements of A are* accessed sequentially with one pass through the triangular part* of A.** First form y := beta*y.*IF (BETA.NE.ONE) THENIF (INCY.EQ.1) THENIF (BETA.EQ.ZERO) THENDO 10 I = 1,NY(I) = ZERO10 CONTINUEELSEDO 20 I = 1,NY(I) = BETA*Y(I)20 CONTINUEEND IFELSEIY = KYIF (BETA.EQ.ZERO) THENDO 30 I = 1,NY(IY) = ZEROIY = IY + INCY30 CONTINUEELSEDO 40 I = 1,NY(IY) = BETA*Y(IY)IY = IY + INCY40 CONTINUEEND IFEND IFEND IFIF (ALPHA.EQ.ZERO) RETURNIF (LSAME(UPLO,'U')) THEN** Form y when A is stored in upper triangle.*IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THENDO 60 J = 1,NTEMP1 = ALPHA*X(J)TEMP2 = ZERODO 50 I = 1,J - 1Y(I) = Y(I) + TEMP1*A(I,J)TEMP2 = TEMP2 + A(I,J)*X(I)50 CONTINUEY(J) = Y(J) + TEMP1*A(J,J) + ALPHA*TEMP260 CONTINUEELSEJX = KXJY = KYDO 80 J = 1,NTEMP1 = ALPHA*X(JX)TEMP2 = ZEROIX = KXIY = KYDO 70 I = 1,J - 1Y(IY) = Y(IY) + TEMP1*A(I,J)TEMP2 = TEMP2 + A(I,J)*X(IX)IX = IX + INCXIY = IY + INCY70 CONTINUEY(JY) = Y(JY) + TEMP1*A(J,J) + ALPHA*TEMP2JX = JX + INCXJY = JY + INCY80 CONTINUEEND IFELSE** Form y when A is stored in lower triangle.*IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THENDO 100 J = 1,NTEMP1 = ALPHA*X(J)TEMP2 = ZEROY(J) = Y(J) + TEMP1*A(J,J)DO 90 I = J + 1,NY(I) = Y(I) + TEMP1*A(I,J)TEMP2 = TEMP2 + A(I,J)*X(I)90 CONTINUEY(J) = Y(J) + ALPHA*TEMP2100 CONTINUEELSEJX = KXJY = KYDO 120 J = 1,NTEMP1 = ALPHA*X(JX)TEMP2 = ZEROY(JY) = Y(JY) + TEMP1*A(J,J)IX = JXIY = JYDO 110 I = J + 1,NIX = IX + INCXIY = IY + INCYY(IY) = Y(IY) + TEMP1*A(I,J)TEMP2 = TEMP2 + A(I,J)*X(IX)110 CONTINUEY(JY) = Y(JY) + ALPHA*TEMP2JX = JX + INCXJY = JY + INCY120 CONTINUEEND IFEND IF*RETURN** End of DSYMV*END*> \brief \b DSYR2** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DSYR2(UPLO,N,ALPHA,X,INCX,Y,INCY,A,LDA)** .. Scalar Arguments ..* DOUBLE PRECISION ALPHA* INTEGER INCX,INCY,LDA,N* CHARACTER UPLO* ..* .. Array Arguments ..* DOUBLE PRECISION A(LDA,*),X(*),Y(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DSYR2 performs the symmetric rank 2 operation*>*> A := alpha*x*y**T + alpha*y*x**T + A,*>*> where alpha is a scalar, x and y are n element vectors and A is an n*> by n symmetric matrix.*> \endverbatim** Arguments:* ==========**> \param[in] UPLO*> \verbatim*> UPLO is 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.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the order of the matrix A.*> N must be at least zero.*> \endverbatim*>*> \param[in] ALPHA*> \verbatim*> ALPHA is DOUBLE PRECISION.*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] X*> \verbatim*> X is DOUBLE PRECISION array, dimension at least*> ( 1 + ( n - 1 )*abs( INCX ) ).*> Before entry, the incremented array X must contain the n*> element vector x.*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> On entry, INCX specifies the increment for the elements of*> X. INCX must not be zero.*> \endverbatim*>*> \param[in] Y*> \verbatim*> Y is DOUBLE PRECISION array, dimension at least*> ( 1 + ( n - 1 )*abs( INCY ) ).*> Before entry, the incremented array Y must contain the n*> element vector y.*> \endverbatim*>*> \param[in] INCY*> \verbatim*> INCY is INTEGER*> On entry, INCY specifies the increment for the elements of*> Y. INCY must not be zero.*> \endverbatim*>*> \param[in,out] A*> \verbatim*> A is DOUBLE PRECISION array, 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 symmetric 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 symmetric 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.*> \endverbatim*>*> \param[in] LDA*> \verbatim*> LDA is 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 ).*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level2**> \par Further Details:* =====================*>*> \verbatim*>*> 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.*> \endverbatim*>* =====================================================================SUBROUTINE DSYR2(UPLO,N,ALPHA,X,INCX,Y,INCY,A,LDA)** -- Reference BLAS level2 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..DOUBLE PRECISION ALPHAINTEGER INCX,INCY,LDA,NCHARACTER UPLO* ..* .. Array Arguments ..DOUBLE PRECISION A(LDA,*),X(*),Y(*)* ..** =====================================================================** .. Parameters ..DOUBLE PRECISION ZEROPARAMETER (ZERO=0.0D+0)* ..* .. Local Scalars ..DOUBLE PRECISION TEMP1,TEMP2INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC MAX* ..** 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 (INCY.EQ.0) THENINFO = 7ELSE IF (LDA.LT.MAX(1,N)) THENINFO = 9END IFIF (INFO.NE.0) THENCALL XERBLA('DSYR2 ',INFO)RETURNEND IF** Quick return if possible.*IF ((N.EQ.0) .OR. (ALPHA.EQ.ZERO)) RETURN** Set up the start points in X and Y if the increments are not both* unity.*IF ((INCX.NE.1) .OR. (INCY.NE.1)) THENIF (INCX.GT.0) THENKX = 1ELSEKX = 1 - (N-1)*INCXEND IFIF (INCY.GT.0) THENKY = 1ELSEKY = 1 - (N-1)*INCYEND IFJX = KXJY = KYEND 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 the upper triangle.*IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THENDO 20 J = 1,Nc IF ((X(J).NE.ZERO) .OR. (Y(J).NE.ZERO)) THENTEMP1 = ALPHA*Y(J)TEMP2 = ALPHA*X(J)DO 10 I = 1,JA(I,J) = A(I,J) + X(I)*TEMP1 + Y(I)*TEMP210 CONTINUEc END IF20 CONTINUEELSEDO 40 J = 1,Nc IF ((X(JX).NE.ZERO) .OR. (Y(JY).NE.ZERO)) THENTEMP1 = ALPHA*Y(JY)TEMP2 = ALPHA*X(JX)IX = KXIY = KYDO 30 I = 1,JA(I,J) = A(I,J) + X(IX)*TEMP1 + Y(IY)*TEMP2IX = IX + INCXIY = IY + INCY30 CONTINUEc END IFJX = JX + INCXJY = JY + INCY40 CONTINUEEND IFELSE** Form A when A is stored in the lower triangle.*IF ((INCX.EQ.1) .AND. (INCY.EQ.1)) THENDO 60 J = 1,Nc IF ((X(J).NE.ZERO) .OR. (Y(J).NE.ZERO)) THENTEMP1 = ALPHA*Y(J)TEMP2 = ALPHA*X(J)DO 50 I = J,NA(I,J) = A(I,J) + X(I)*TEMP1 + Y(I)*TEMP250 CONTINUEc END IF60 CONTINUEELSEDO 80 J = 1,Nc IF ((X(JX).NE.ZERO) .OR. (Y(JY).NE.ZERO)) THENTEMP1 = ALPHA*Y(JY)TEMP2 = ALPHA*X(JX)IX = JXIY = JYDO 70 I = J,NA(I,J) = A(I,J) + X(IX)*TEMP1 + Y(IY)*TEMP2IX = IX + INCXIY = IY + INCY70 CONTINUEc END IFJX = JX + INCXJY = JY + INCY80 CONTINUEEND IFEND IF*RETURN** End of DSYR2*END*> \brief \b DSYR2K** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DSYR2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC)** .. Scalar Arguments ..* DOUBLE PRECISION ALPHA,BETA* INTEGER K,LDA,LDB,LDC,N* CHARACTER TRANS,UPLO* ..* .. Array Arguments ..* DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DSYR2K performs one of the symmetric rank 2k operations*>*> C := alpha*A*B**T + alpha*B*A**T + beta*C,*>*> or*>*> C := alpha*A**T*B + alpha*B**T*A + beta*C,*>*> where alpha and beta are scalars, C is an n by n symmetric matrix*> and A and B are n by k matrices in the first case and k by n*> matrices in the second case.*> \endverbatim** Arguments:* ==========**> \param[in] UPLO*> \verbatim*> UPLO is CHARACTER*1*> On entry, UPLO specifies whether the upper or lower*> triangular part of the array C is to be referenced as*> follows:*>*> UPLO = 'U' or 'u' Only the upper triangular part of C*> is to be referenced.*>*> UPLO = 'L' or 'l' Only the lower triangular part of C*> is to be referenced.*> \endverbatim*>*> \param[in] TRANS*> \verbatim*> TRANS is CHARACTER*1*> On entry, TRANS specifies the operation to be performed as*> follows:*>*> TRANS = 'N' or 'n' C := alpha*A*B**T + alpha*B*A**T +*> beta*C.*>*> TRANS = 'T' or 't' C := alpha*A**T*B + alpha*B**T*A +*> beta*C.*>*> TRANS = 'C' or 'c' C := alpha*A**T*B + alpha*B**T*A +*> beta*C.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the order of the matrix C. N must be*> at least zero.*> \endverbatim*>*> \param[in] K*> \verbatim*> K is INTEGER*> On entry with TRANS = 'N' or 'n', K specifies the number*> of columns of the matrices A and B, and on entry with*> TRANS = 'T' or 't' or 'C' or 'c', K specifies the number*> of rows of the matrices A and B. K must be at least zero.*> \endverbatim*>*> \param[in] ALPHA*> \verbatim*> ALPHA is DOUBLE PRECISION.*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE PRECISION array, dimension ( LDA, ka ), where ka is*> k when TRANS = 'N' or 'n', and is n otherwise.*> Before entry with TRANS = 'N' or 'n', the leading n by k*> part of the array A must contain the matrix A, otherwise*> the leading k by n part of the array A must contain the*> matrix A.*> \endverbatim*>*> \param[in] LDA*> \verbatim*> LDA is INTEGER*> On entry, LDA specifies the first dimension of A as declared*> in the calling (sub) program. When TRANS = 'N' or 'n'*> then LDA must be at least max( 1, n ), otherwise LDA must*> be at least max( 1, k ).*> \endverbatim*>*> \param[in] B*> \verbatim*> B is DOUBLE PRECISION array, dimension ( LDB, kb ), where kb is*> k when TRANS = 'N' or 'n', and is n otherwise.*> Before entry with TRANS = 'N' or 'n', the leading n by k*> part of the array B must contain the matrix B, otherwise*> the leading k by n part of the array B must contain the*> matrix B.*> \endverbatim*>*> \param[in] LDB*> \verbatim*> LDB is INTEGER*> On entry, LDB specifies the first dimension of B as declared*> in the calling (sub) program. When TRANS = 'N' or 'n'*> then LDB must be at least max( 1, n ), otherwise LDB must*> be at least max( 1, k ).*> \endverbatim*>*> \param[in] BETA*> \verbatim*> BETA is DOUBLE PRECISION.*> On entry, BETA specifies the scalar beta.*> \endverbatim*>*> \param[in,out] C*> \verbatim*> C is DOUBLE PRECISION array, dimension ( LDC, N )*> Before entry with UPLO = 'U' or 'u', the leading n by n*> upper triangular part of the array C must contain the upper*> triangular part of the symmetric matrix and the strictly*> lower triangular part of C is not referenced. On exit, the*> upper triangular part of the array C 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 C must contain the lower*> triangular part of the symmetric matrix and the strictly*> upper triangular part of C is not referenced. On exit, the*> lower triangular part of the array C is overwritten by the*> lower triangular part of the updated matrix.*> \endverbatim*>*> \param[in] LDC*> \verbatim*> LDC is INTEGER*> On entry, LDC specifies the first dimension of C as declared*> in the calling (sub) program. LDC must be at least*> max( 1, n ).*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level3**> \par Further Details:* =====================*>*> \verbatim*>*> Level 3 Blas routine.*>*>*> -- Written on 8-February-1989.*> Jack Dongarra, Argonne National Laboratory.*> Iain Duff, AERE Harwell.*> Jeremy Du Croz, Numerical Algorithms Group Ltd.*> Sven Hammarling, Numerical Algorithms Group Ltd.*> \endverbatim*>* =====================================================================SUBROUTINE DSYR2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC)** -- Reference BLAS level3 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..DOUBLE PRECISION ALPHA,BETAINTEGER K,LDA,LDB,LDC,NCHARACTER TRANS,UPLO* ..* .. Array Arguments ..DOUBLE PRECISION A(LDA,*),B(LDB,*),C(LDC,*)* ..** =====================================================================** .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC MAX* ..* .. Local Scalars ..DOUBLE PRECISION TEMP1,TEMP2INTEGER I,INFO,J,L,NROWALOGICAL UPPER* ..* .. Parameters ..DOUBLE PRECISION ONE,ZEROPARAMETER (ONE=1.0D+0,ZERO=0.0D+0)* ..** Test the input parameters.*IF (LSAME(TRANS,'N')) THENNROWA = NELSENROWA = KEND IFUPPER = LSAME(UPLO,'U')*INFO = 0IF ((.NOT.UPPER) .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 (N.LT.0) THENINFO = 3ELSE IF (K.LT.0) THENINFO = 4ELSE IF (LDA.LT.MAX(1,NROWA)) THENINFO = 7ELSE IF (LDB.LT.MAX(1,NROWA)) THENINFO = 9ELSE IF (LDC.LT.MAX(1,N)) THENINFO = 12END IFIF (INFO.NE.0) THENCALL XERBLA('DSYR2K',INFO)RETURNEND IF** Quick return if possible.*IF ((N.EQ.0) .OR. (((ALPHA.EQ.ZERO).OR.+ (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN** And when alpha.eq.zero.*IF (ALPHA.EQ.ZERO) THENIF (UPPER) THENIF (BETA.EQ.ZERO) THENDO 20 J = 1,NDO 10 I = 1,JC(I,J) = ZERO10 CONTINUE20 CONTINUEELSEDO 40 J = 1,NDO 30 I = 1,JC(I,J) = BETA*C(I,J)30 CONTINUE40 CONTINUEEND IFELSEIF (BETA.EQ.ZERO) THENDO 60 J = 1,NDO 50 I = J,NC(I,J) = ZERO50 CONTINUE60 CONTINUEELSEDO 80 J = 1,NDO 70 I = J,NC(I,J) = BETA*C(I,J)70 CONTINUE80 CONTINUEEND IFEND IFRETURNEND IF** Start the operations.*IF (LSAME(TRANS,'N')) THEN** Form C := alpha*A*B**T + alpha*B*A**T + C.*IF (UPPER) THENDO 130 J = 1,NIF (BETA.EQ.ZERO) THENDO 90 I = 1,JC(I,J) = ZERO90 CONTINUEELSE IF (BETA.NE.ONE) THENDO 100 I = 1,JC(I,J) = BETA*C(I,J)100 CONTINUEEND IFDO 120 L = 1,Kc IF ((A(J,L).NE.ZERO) .OR. (B(J,L).NE.ZERO)) THENTEMP1 = ALPHA*B(J,L)TEMP2 = ALPHA*A(J,L)DO 110 I = 1,JC(I,J) = C(I,J) + A(I,L)*TEMP1 ++ B(I,L)*TEMP2110 CONTINUEc END IF120 CONTINUE130 CONTINUEELSEDO 180 J = 1,NIF (BETA.EQ.ZERO) THENDO 140 I = J,NC(I,J) = ZERO140 CONTINUEELSE IF (BETA.NE.ONE) THENDO 150 I = J,NC(I,J) = BETA*C(I,J)150 CONTINUEEND IFDO 170 L = 1,Kc IF ((A(J,L).NE.ZERO) .OR. (B(J,L).NE.ZERO)) THENTEMP1 = ALPHA*B(J,L)TEMP2 = ALPHA*A(J,L)DO 160 I = J,NC(I,J) = C(I,J) + A(I,L)*TEMP1 ++ B(I,L)*TEMP2160 CONTINUEc END IF170 CONTINUE180 CONTINUEEND IFELSE** Form C := alpha*A**T*B + alpha*B**T*A + C.*IF (UPPER) THENDO 210 J = 1,NDO 200 I = 1,JTEMP1 = ZEROTEMP2 = ZERODO 190 L = 1,KTEMP1 = TEMP1 + A(L,I)*B(L,J)TEMP2 = TEMP2 + B(L,I)*A(L,J)190 CONTINUEIF (BETA.EQ.ZERO) THENC(I,J) = ALPHA*TEMP1 + ALPHA*TEMP2ELSEC(I,J) = BETA*C(I,J) + ALPHA*TEMP1 ++ ALPHA*TEMP2END IF200 CONTINUE210 CONTINUEELSEDO 240 J = 1,NDO 230 I = J,NTEMP1 = ZEROTEMP2 = ZERODO 220 L = 1,KTEMP1 = TEMP1 + A(L,I)*B(L,J)TEMP2 = TEMP2 + B(L,I)*A(L,J)220 CONTINUEIF (BETA.EQ.ZERO) THENC(I,J) = ALPHA*TEMP1 + ALPHA*TEMP2ELSEC(I,J) = BETA*C(I,J) + ALPHA*TEMP1 ++ ALPHA*TEMP2END IF230 CONTINUE240 CONTINUEEND IFEND IF*RETURN** End of DSYR2K*END*> \brief \b DSYR** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DSYR(UPLO,N,ALPHA,X,INCX,A,LDA)** .. Scalar Arguments ..* DOUBLE PRECISION ALPHA* INTEGER INCX,LDA,N* CHARACTER UPLO* ..* .. Array Arguments ..* DOUBLE PRECISION A(LDA,*),X(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DSYR performs the symmetric rank 1 operation*>*> A := alpha*x*x**T + A,*>*> where alpha is a real scalar, x is an n element vector and A is an*> n by n symmetric matrix.*> \endverbatim** Arguments:* ==========**> \param[in] UPLO*> \verbatim*> UPLO is 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.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the order of the matrix A.*> N must be at least zero.*> \endverbatim*>*> \param[in] ALPHA*> \verbatim*> ALPHA is DOUBLE PRECISION.*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] X*> \verbatim*> X is DOUBLE PRECISION array, dimension at least*> ( 1 + ( n - 1 )*abs( INCX ) ).*> Before entry, the incremented array X must contain the n*> element vector x.*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> On entry, INCX specifies the increment for the elements of*> X. INCX must not be zero.*> \endverbatim*>*> \param[in,out] A*> \verbatim*> A is DOUBLE PRECISION array, 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 symmetric 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 symmetric 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.*> \endverbatim*>*> \param[in] LDA*> \verbatim*> LDA is 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 ).*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level2**> \par Further Details:* =====================*>*> \verbatim*>*> 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.*> \endverbatim*>* =====================================================================SUBROUTINE DSYR(UPLO,N,ALPHA,X,INCX,A,LDA)** -- Reference BLAS level2 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..DOUBLE PRECISION ALPHAINTEGER INCX,LDA,NCHARACTER UPLO* ..* .. Array Arguments ..DOUBLE PRECISION A(LDA,*),X(*)* ..** =====================================================================** .. Parameters ..DOUBLE PRECISION ZEROPARAMETER (ZERO=0.0D+0)* ..* .. Local Scalars ..DOUBLE PRECISION TEMPINTEGER I,INFO,IX,J,JX,KX* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC MAX* ..** 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('DSYR ',INFO)RETURNEND IF** Quick return if possible.*IF ((N.EQ.0) .OR. (ALPHA.EQ.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,Nc IF (X(J).NE.ZERO) THENTEMP = ALPHA*X(J)DO 10 I = 1,JA(I,J) = A(I,J) + X(I)*TEMP10 CONTINUEc END IF20 CONTINUEELSEJX = KXDO 40 J = 1,Nc IF (X(JX).NE.ZERO) THENTEMP = ALPHA*X(JX)IX = KXDO 30 I = 1,JA(I,J) = A(I,J) + X(IX)*TEMPIX = IX + INCX30 CONTINUEc END IFJX = JX + INCX40 CONTINUEEND IFELSE** Form A when A is stored in lower triangle.*IF (INCX.EQ.1) THENDO 60 J = 1,Nc IF (X(J).NE.ZERO) THENTEMP = ALPHA*X(J)DO 50 I = J,NA(I,J) = A(I,J) + X(I)*TEMP50 CONTINUEc END IF60 CONTINUEELSEJX = KXDO 80 J = 1,Nc IF (X(JX).NE.ZERO) THENTEMP = ALPHA*X(JX)IX = JXDO 70 I = J,NA(I,J) = A(I,J) + X(IX)*TEMPIX = IX + INCX70 CONTINUEc END IFJX = JX + INCX80 CONTINUEEND IFEND IF*RETURN** End of DSYR*END*> \brief \b DSYRK** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DSYRK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC)** .. Scalar Arguments ..* DOUBLE PRECISION ALPHA,BETA* INTEGER K,LDA,LDC,N* CHARACTER TRANS,UPLO* ..* .. Array Arguments ..* DOUBLE PRECISION A(LDA,*),C(LDC,*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DSYRK performs one of the symmetric rank k operations*>*> C := alpha*A*A**T + beta*C,*>*> or*>*> C := alpha*A**T*A + beta*C,*>*> where alpha and beta are scalars, C is an n by n symmetric matrix*> and A is an n by k matrix in the first case and a k by n matrix*> in the second case.*> \endverbatim** Arguments:* ==========**> \param[in] UPLO*> \verbatim*> UPLO is CHARACTER*1*> On entry, UPLO specifies whether the upper or lower*> triangular part of the array C is to be referenced as*> follows:*>*> UPLO = 'U' or 'u' Only the upper triangular part of C*> is to be referenced.*>*> UPLO = 'L' or 'l' Only the lower triangular part of C*> is to be referenced.*> \endverbatim*>*> \param[in] TRANS*> \verbatim*> TRANS is CHARACTER*1*> On entry, TRANS specifies the operation to be performed as*> follows:*>*> TRANS = 'N' or 'n' C := alpha*A*A**T + beta*C.*>*> TRANS = 'T' or 't' C := alpha*A**T*A + beta*C.*>*> TRANS = 'C' or 'c' C := alpha*A**T*A + beta*C.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the order of the matrix C. N must be*> at least zero.*> \endverbatim*>*> \param[in] K*> \verbatim*> K is INTEGER*> On entry with TRANS = 'N' or 'n', K specifies the number*> of columns of the matrix A, and on entry with*> TRANS = 'T' or 't' or 'C' or 'c', K specifies the number*> of rows of the matrix A. K must be at least zero.*> \endverbatim*>*> \param[in] ALPHA*> \verbatim*> ALPHA is DOUBLE PRECISION.*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE PRECISION array, dimension ( LDA, ka ), where ka is*> k when TRANS = 'N' or 'n', and is n otherwise.*> Before entry with TRANS = 'N' or 'n', the leading n by k*> part of the array A must contain the matrix A, otherwise*> the leading k by n part of the array A must contain the*> matrix A.*> \endverbatim*>*> \param[in] LDA*> \verbatim*> LDA is INTEGER*> On entry, LDA specifies the first dimension of A as declared*> in the calling (sub) program. When TRANS = 'N' or 'n'*> then LDA must be at least max( 1, n ), otherwise LDA must*> be at least max( 1, k ).*> \endverbatim*>*> \param[in] BETA*> \verbatim*> BETA is DOUBLE PRECISION.*> On entry, BETA specifies the scalar beta.*> \endverbatim*>*> \param[in,out] C*> \verbatim*> C is DOUBLE PRECISION array, dimension ( LDC, N )*> Before entry with UPLO = 'U' or 'u', the leading n by n*> upper triangular part of the array C must contain the upper*> triangular part of the symmetric matrix and the strictly*> lower triangular part of C is not referenced. On exit, the*> upper triangular part of the array C 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 C must contain the lower*> triangular part of the symmetric matrix and the strictly*> upper triangular part of C is not referenced. On exit, the*> lower triangular part of the array C is overwritten by the*> lower triangular part of the updated matrix.*> \endverbatim*>*> \param[in] LDC*> \verbatim*> LDC is INTEGER*> On entry, LDC specifies the first dimension of C as declared*> in the calling (sub) program. LDC must be at least*> max( 1, n ).*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level3**> \par Further Details:* =====================*>*> \verbatim*>*> Level 3 Blas routine.*>*> -- Written on 8-February-1989.*> Jack Dongarra, Argonne National Laboratory.*> Iain Duff, AERE Harwell.*> Jeremy Du Croz, Numerical Algorithms Group Ltd.*> Sven Hammarling, Numerical Algorithms Group Ltd.*> \endverbatim*>* =====================================================================SUBROUTINE DSYRK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC)** -- Reference BLAS level3 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..DOUBLE PRECISION ALPHA,BETAINTEGER K,LDA,LDC,NCHARACTER TRANS,UPLO* ..* .. Array Arguments ..DOUBLE PRECISION A(LDA,*),C(LDC,*)* ..** =====================================================================** .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC MAX* ..* .. Local Scalars ..DOUBLE PRECISION TEMPINTEGER I,INFO,J,L,NROWALOGICAL UPPER* ..* .. Parameters ..DOUBLE PRECISION ONE,ZEROPARAMETER (ONE=1.0D+0,ZERO=0.0D+0)* ..** Test the input parameters.*IF (LSAME(TRANS,'N')) THENNROWA = NELSENROWA = KEND IFUPPER = LSAME(UPLO,'U')*INFO = 0IF ((.NOT.UPPER) .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 (N.LT.0) THENINFO = 3ELSE IF (K.LT.0) THENINFO = 4ELSE IF (LDA.LT.MAX(1,NROWA)) THENINFO = 7ELSE IF (LDC.LT.MAX(1,N)) THENINFO = 10END IFIF (INFO.NE.0) THENCALL XERBLA('DSYRK ',INFO)RETURNEND IF** Quick return if possible.*IF ((N.EQ.0) .OR. (((ALPHA.EQ.ZERO).OR.+ (K.EQ.0)).AND. (BETA.EQ.ONE))) RETURN** And when alpha.eq.zero.*IF (ALPHA.EQ.ZERO) THENIF (UPPER) THENIF (BETA.EQ.ZERO) THENDO 20 J = 1,NDO 10 I = 1,JC(I,J) = ZERO10 CONTINUE20 CONTINUEELSEDO 40 J = 1,NDO 30 I = 1,JC(I,J) = BETA*C(I,J)30 CONTINUE40 CONTINUEEND IFELSEIF (BETA.EQ.ZERO) THENDO 60 J = 1,NDO 50 I = J,NC(I,J) = ZERO50 CONTINUE60 CONTINUEELSEDO 80 J = 1,NDO 70 I = J,NC(I,J) = BETA*C(I,J)70 CONTINUE80 CONTINUEEND IFEND IFRETURNEND IF** Start the operations.*IF (LSAME(TRANS,'N')) THEN** Form C := alpha*A*A**T + beta*C.*IF (UPPER) THENDO 130 J = 1,NIF (BETA.EQ.ZERO) THENDO 90 I = 1,JC(I,J) = ZERO90 CONTINUEELSE IF (BETA.NE.ONE) THENDO 100 I = 1,JC(I,J) = BETA*C(I,J)100 CONTINUEEND IFDO 120 L = 1,Kc IF (A(J,L).NE.ZERO) THENTEMP = ALPHA*A(J,L)DO 110 I = 1,JC(I,J) = C(I,J) + TEMP*A(I,L)110 CONTINUEc END IF120 CONTINUE130 CONTINUEELSEDO 180 J = 1,NIF (BETA.EQ.ZERO) THENDO 140 I = J,NC(I,J) = ZERO140 CONTINUEELSE IF (BETA.NE.ONE) THENDO 150 I = J,NC(I,J) = BETA*C(I,J)150 CONTINUEEND IFDO 170 L = 1,Kc IF (A(J,L).NE.ZERO) THENTEMP = ALPHA*A(J,L)DO 160 I = J,NC(I,J) = C(I,J) + TEMP*A(I,L)160 CONTINUEc END IF170 CONTINUE180 CONTINUEEND IFELSE** Form C := alpha*A**T*A + beta*C.*IF (UPPER) THENDO 210 J = 1,NDO 200 I = 1,JTEMP = ZERODO 190 L = 1,KTEMP = TEMP + A(L,I)*A(L,J)190 CONTINUEIF (BETA.EQ.ZERO) THENC(I,J) = ALPHA*TEMPELSEC(I,J) = ALPHA*TEMP + BETA*C(I,J)END IF200 CONTINUE210 CONTINUEELSEDO 240 J = 1,NDO 230 I = J,NTEMP = ZERODO 220 L = 1,KTEMP = TEMP + A(L,I)*A(L,J)220 CONTINUEIF (BETA.EQ.ZERO) THENC(I,J) = ALPHA*TEMPELSEC(I,J) = ALPHA*TEMP + BETA*C(I,J)END IF230 CONTINUE240 CONTINUEEND IFEND IF*RETURN** End of DSYRK*END*> \brief \b DTBMV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DTBMV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX)** .. Scalar Arguments ..* INTEGER INCX,K,LDA,N* CHARACTER DIAG,TRANS,UPLO* ..* .. Array Arguments ..* DOUBLE PRECISION A(LDA,*),X(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DTBMV performs one of the matrix-vector operations*>*> x := A*x, or x := A**T*x,*>*> where x is an n element vector and A is an n by n unit, or non-unit,*> upper or lower triangular band matrix, with ( k + 1 ) diagonals.*> \endverbatim** Arguments:* ==========**> \param[in] UPLO*> \verbatim*> UPLO is 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.*> \endverbatim*>*> \param[in] TRANS*> \verbatim*> TRANS is CHARACTER*1*> On entry, TRANS specifies the operation to be performed as*> follows:*>*> TRANS = 'N' or 'n' x := A*x.*>*> TRANS = 'T' or 't' x := A**T*x.*>*> TRANS = 'C' or 'c' x := A**T*x.*> \endverbatim*>*> \param[in] DIAG*> \verbatim*> DIAG is 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.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the order of the matrix A.*> N must be at least zero.*> \endverbatim*>*> \param[in] K*> \verbatim*> K is INTEGER*> On entry with UPLO = 'U' or 'u', K specifies the number of*> super-diagonals of the matrix A.*> On entry with UPLO = 'L' or 'l', K specifies the number of*> sub-diagonals of the matrix A.*> K must satisfy 0 .le. K.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE PRECISION array, dimension ( LDA, N )*> Before entry with UPLO = 'U' or 'u', the leading ( k + 1 )*> by n part of the array A must contain the upper triangular*> band part of the matrix of coefficients, supplied column by*> column, with the leading diagonal of the matrix in row*> ( k + 1 ) of the array, the first super-diagonal starting at*> position 2 in row k, and so on. The top left k by k triangle*> of the array A is not referenced.*> The following program segment will transfer an upper*> triangular band matrix from conventional full matrix storage*> to band storage:*>*> DO 20, J = 1, N*> M = K + 1 - J*> DO 10, I = MAX( 1, J - K ), J*> A( M + I, J ) = matrix( I, J )*> 10 CONTINUE*> 20 CONTINUE*>*> Before entry with UPLO = 'L' or 'l', the leading ( k + 1 )*> by n part of the array A must contain the lower triangular*> band part of the matrix of coefficients, supplied column by*> column, with the leading diagonal of the matrix in row 1 of*> the array, the first sub-diagonal starting at position 1 in*> row 2, and so on. The bottom right k by k triangle of the*> array A is not referenced.*> The following program segment will transfer a lower*> triangular band matrix from conventional full matrix storage*> to band storage:*>*> DO 20, J = 1, N*> M = 1 - J*> DO 10, I = J, MIN( N, J + K )*> A( M + I, J ) = matrix( I, J )*> 10 CONTINUE*> 20 CONTINUE*>*> Note that when DIAG = 'U' or 'u' the elements of the array A*> corresponding to the diagonal elements of the matrix are not*> referenced, but are assumed to be unity.*> \endverbatim*>*> \param[in] LDA*> \verbatim*> LDA is INTEGER*> On entry, LDA specifies the first dimension of A as declared*> in the calling (sub) program. LDA must be at least*> ( k + 1 ).*> \endverbatim*>*> \param[in,out] X*> \verbatim*> X is DOUBLE PRECISION array, dimension at least*> ( 1 + ( n - 1 )*abs( INCX ) ).*> Before entry, the incremented array X must contain the n*> element vector x. On exit, X is overwritten with the*> transformed vector x.*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> On entry, INCX specifies the increment for the elements of*> X. INCX must not be zero.*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level2**> \par Further Details:* =====================*>*> \verbatim*>*> Level 2 Blas routine.*> The vector and matrix arguments are not referenced when N = 0, or M = 0*>*> -- 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.*> \endverbatim*>* =====================================================================SUBROUTINE DTBMV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX)** -- Reference BLAS level2 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..INTEGER INCX,K,LDA,NCHARACTER DIAG,TRANS,UPLO* ..* .. Array Arguments ..DOUBLE PRECISION A(LDA,*),X(*)* ..** =====================================================================** .. Parameters ..DOUBLE PRECISION ZEROPARAMETER (ZERO=0.0D+0)* ..* .. Local Scalars ..DOUBLE PRECISION TEMPINTEGER I,INFO,IX,J,JX,KPLUS1,KX,LLOGICAL NOUNIT* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC MAX,MIN* ..** 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 (K.LT.0) THENINFO = 5ELSE IF (LDA.LT. (K+1)) THENINFO = 7ELSE IF (INCX.EQ.0) THENINFO = 9END IFIF (INFO.NE.0) THENCALL XERBLA('DTBMV ',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 := A*x.*IF (LSAME(UPLO,'U')) THENKPLUS1 = K + 1IF (INCX.EQ.1) THENDO 20 J = 1,Nc IF (X(J).NE.ZERO) THENTEMP = X(J)L = KPLUS1 - JDO 10 I = MAX(1,J-K),J - 1X(I) = X(I) + TEMP*A(L+I,J)10 CONTINUEIF (NOUNIT) X(J) = X(J)*A(KPLUS1,J)c END IF20 CONTINUEELSEJX = KXDO 40 J = 1,Nc IF (X(JX).NE.ZERO) THENTEMP = X(JX)IX = KXL = KPLUS1 - JDO 30 I = MAX(1,J-K),J - 1X(IX) = X(IX) + TEMP*A(L+I,J)IX = IX + INCX30 CONTINUEIF (NOUNIT) X(JX) = X(JX)*A(KPLUS1,J)c END IFJX = JX + INCXIF (J.GT.K) KX = KX + INCX40 CONTINUEEND IFELSEIF (INCX.EQ.1) THENDO 60 J = N,1,-1c IF (X(J).NE.ZERO) THENTEMP = X(J)L = 1 - JDO 50 I = MIN(N,J+K),J + 1,-1X(I) = X(I) + TEMP*A(L+I,J)50 CONTINUEIF (NOUNIT) X(J) = X(J)*A(1,J)c END IF60 CONTINUEELSEKX = KX + (N-1)*INCXJX = KXDO 80 J = N,1,-1c IF (X(JX).NE.ZERO) THENTEMP = X(JX)IX = KXL = 1 - JDO 70 I = MIN(N,J+K),J + 1,-1X(IX) = X(IX) + TEMP*A(L+I,J)IX = IX - INCX70 CONTINUEIF (NOUNIT) X(JX) = X(JX)*A(1,J)c END IFJX = JX - INCXIF ((N-J).GE.K) KX = KX - INCX80 CONTINUEEND IFEND IFELSE** Form x := A**T*x.*IF (LSAME(UPLO,'U')) THENKPLUS1 = K + 1IF (INCX.EQ.1) THENDO 100 J = N,1,-1TEMP = X(J)L = KPLUS1 - JIF (NOUNIT) TEMP = TEMP*A(KPLUS1,J)DO 90 I = J - 1,MAX(1,J-K),-1TEMP = TEMP + A(L+I,J)*X(I)90 CONTINUEX(J) = TEMP100 CONTINUEELSEKX = KX + (N-1)*INCXJX = KXDO 120 J = N,1,-1TEMP = X(JX)KX = KX - INCXIX = KXL = KPLUS1 - JIF (NOUNIT) TEMP = TEMP*A(KPLUS1,J)DO 110 I = J - 1,MAX(1,J-K),-1TEMP = TEMP + A(L+I,J)*X(IX)IX = IX - INCX110 CONTINUEX(JX) = TEMPJX = JX - INCX120 CONTINUEEND IFELSEIF (INCX.EQ.1) THENDO 140 J = 1,NTEMP = X(J)L = 1 - JIF (NOUNIT) TEMP = TEMP*A(1,J)DO 130 I = J + 1,MIN(N,J+K)TEMP = TEMP + A(L+I,J)*X(I)130 CONTINUEX(J) = TEMP140 CONTINUEELSEJX = KXDO 160 J = 1,NTEMP = X(JX)KX = KX + INCXIX = KXL = 1 - JIF (NOUNIT) TEMP = TEMP*A(1,J)DO 150 I = J + 1,MIN(N,J+K)TEMP = TEMP + A(L+I,J)*X(IX)IX = IX + INCX150 CONTINUEX(JX) = TEMPJX = JX + INCX160 CONTINUEEND IFEND IFEND IF*RETURN** End of DTBMV*END*> \brief \b DTBSV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DTBSV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX)** .. Scalar Arguments ..* INTEGER INCX,K,LDA,N* CHARACTER DIAG,TRANS,UPLO* ..* .. Array Arguments ..* DOUBLE PRECISION A(LDA,*),X(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DTBSV solves one of the systems of equations*>*> A*x = b, or A**T*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 band matrix, with ( k + 1 )*> diagonals.*>*> No test for singularity or near-singularity is included in this*> routine. Such tests must be performed before calling this routine.*> \endverbatim** Arguments:* ==========**> \param[in] UPLO*> \verbatim*> UPLO is 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.*> \endverbatim*>*> \param[in] TRANS*> \verbatim*> TRANS is 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**T*x = b.*>*> TRANS = 'C' or 'c' A**T*x = b.*> \endverbatim*>*> \param[in] DIAG*> \verbatim*> DIAG is 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.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the order of the matrix A.*> N must be at least zero.*> \endverbatim*>*> \param[in] K*> \verbatim*> K is INTEGER*> On entry with UPLO = 'U' or 'u', K specifies the number of*> super-diagonals of the matrix A.*> On entry with UPLO = 'L' or 'l', K specifies the number of*> sub-diagonals of the matrix A.*> K must satisfy 0 .le. K.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE PRECISION array, dimension ( LDA, N )*> Before entry with UPLO = 'U' or 'u', the leading ( k + 1 )*> by n part of the array A must contain the upper triangular*> band part of the matrix of coefficients, supplied column by*> column, with the leading diagonal of the matrix in row*> ( k + 1 ) of the array, the first super-diagonal starting at*> position 2 in row k, and so on. The top left k by k triangle*> of the array A is not referenced.*> The following program segment will transfer an upper*> triangular band matrix from conventional full matrix storage*> to band storage:*>*> DO 20, J = 1, N*> M = K + 1 - J*> DO 10, I = MAX( 1, J - K ), J*> A( M + I, J ) = matrix( I, J )*> 10 CONTINUE*> 20 CONTINUE*>*> Before entry with UPLO = 'L' or 'l', the leading ( k + 1 )*> by n part of the array A must contain the lower triangular*> band part of the matrix of coefficients, supplied column by*> column, with the leading diagonal of the matrix in row 1 of*> the array, the first sub-diagonal starting at position 1 in*> row 2, and so on. The bottom right k by k triangle of the*> array A is not referenced.*> The following program segment will transfer a lower*> triangular band matrix from conventional full matrix storage*> to band storage:*>*> DO 20, J = 1, N*> M = 1 - J*> DO 10, I = J, MIN( N, J + K )*> A( M + I, J ) = matrix( I, J )*> 10 CONTINUE*> 20 CONTINUE*>*> Note that when DIAG = 'U' or 'u' the elements of the array A*> corresponding to the diagonal elements of the matrix are not*> referenced, but are assumed to be unity.*> \endverbatim*>*> \param[in] LDA*> \verbatim*> LDA is INTEGER*> On entry, LDA specifies the first dimension of A as declared*> in the calling (sub) program. LDA must be at least*> ( k + 1 ).*> \endverbatim*>*> \param[in,out] X*> \verbatim*> X is DOUBLE PRECISION array, 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.*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> On entry, INCX specifies the increment for the elements of*> X. INCX must not be zero.*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level2**> \par Further Details:* =====================*>*> \verbatim*>*> 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.*> \endverbatim*>* =====================================================================SUBROUTINE DTBSV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX)** -- Reference BLAS level2 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..INTEGER INCX,K,LDA,NCHARACTER DIAG,TRANS,UPLO* ..* .. Array Arguments ..DOUBLE PRECISION A(LDA,*),X(*)* ..** =====================================================================** .. Parameters ..DOUBLE PRECISION ZEROPARAMETER (ZERO=0.0D+0)* ..* .. Local Scalars ..DOUBLE PRECISION TEMPINTEGER I,INFO,IX,J,JX,KPLUS1,KX,LLOGICAL NOUNIT* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC MAX,MIN* ..** 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 (K.LT.0) THENINFO = 5ELSE IF (LDA.LT. (K+1)) THENINFO = 7ELSE IF (INCX.EQ.0) THENINFO = 9END IFIF (INFO.NE.0) THENCALL XERBLA('DTBSV ',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 by sequentially with one pass through A.*IF (LSAME(TRANS,'N')) THEN** Form x := inv( A )*x.*IF (LSAME(UPLO,'U')) THENKPLUS1 = K + 1IF (INCX.EQ.1) THENDO 20 J = N,1,-1c IF (X(J).NE.ZERO) THENL = KPLUS1 - JIF (NOUNIT) X(J) = X(J)/A(KPLUS1,J)TEMP = X(J)DO 10 I = J - 1,MAX(1,J-K),-1X(I) = X(I) - TEMP*A(L+I,J)10 CONTINUEc END IF20 CONTINUEELSEKX = KX + (N-1)*INCXJX = KXDO 40 J = N,1,-1KX = KX - INCXc IF (X(JX).NE.ZERO) THENIX = KXL = KPLUS1 - JIF (NOUNIT) X(JX) = X(JX)/A(KPLUS1,J)TEMP = X(JX)DO 30 I = J - 1,MAX(1,J-K),-1X(IX) = X(IX) - TEMP*A(L+I,J)IX = IX - INCX30 CONTINUEc END IFJX = JX - INCX40 CONTINUEEND IFELSEIF (INCX.EQ.1) THENDO 60 J = 1,Nc IF (X(J).NE.ZERO) THENL = 1 - JIF (NOUNIT) X(J) = X(J)/A(1,J)TEMP = X(J)DO 50 I = J + 1,MIN(N,J+K)X(I) = X(I) - TEMP*A(L+I,J)50 CONTINUEc END IF60 CONTINUEELSEJX = KXDO 80 J = 1,NKX = KX + INCXc IF (X(JX).NE.ZERO) THENIX = KXL = 1 - JIF (NOUNIT) X(JX) = X(JX)/A(1,J)TEMP = X(JX)DO 70 I = J + 1,MIN(N,J+K)X(IX) = X(IX) - TEMP*A(L+I,J)IX = IX + INCX70 CONTINUEc END IFJX = JX + INCX80 CONTINUEEND IFEND IFELSE** Form x := inv( A**T)*x.*IF (LSAME(UPLO,'U')) THENKPLUS1 = K + 1IF (INCX.EQ.1) THENDO 100 J = 1,NTEMP = X(J)L = KPLUS1 - JDO 90 I = MAX(1,J-K),J - 1TEMP = TEMP - A(L+I,J)*X(I)90 CONTINUEIF (NOUNIT) TEMP = TEMP/A(KPLUS1,J)X(J) = TEMP100 CONTINUEELSEJX = KXDO 120 J = 1,NTEMP = X(JX)IX = KXL = KPLUS1 - JDO 110 I = MAX(1,J-K),J - 1TEMP = TEMP - A(L+I,J)*X(IX)IX = IX + INCX110 CONTINUEIF (NOUNIT) TEMP = TEMP/A(KPLUS1,J)X(JX) = TEMPJX = JX + INCXIF (J.GT.K) KX = KX + INCX120 CONTINUEEND IFELSEIF (INCX.EQ.1) THENDO 140 J = N,1,-1TEMP = X(J)L = 1 - JDO 130 I = MIN(N,J+K),J + 1,-1TEMP = TEMP - A(L+I,J)*X(I)130 CONTINUEIF (NOUNIT) TEMP = TEMP/A(1,J)X(J) = TEMP140 CONTINUEELSEKX = KX + (N-1)*INCXJX = KXDO 160 J = N,1,-1TEMP = X(JX)IX = KXL = 1 - JDO 150 I = MIN(N,J+K),J + 1,-1TEMP = TEMP - A(L+I,J)*X(IX)IX = IX - INCX150 CONTINUEIF (NOUNIT) TEMP = TEMP/A(1,J)X(JX) = TEMPJX = JX - INCXIF ((N-J).GE.K) KX = KX - INCX160 CONTINUEEND IFEND IFEND IF*RETURN** End of DTBSV*END*> \brief \b DTPMV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DTPMV(UPLO,TRANS,DIAG,N,AP,X,INCX)** .. Scalar Arguments ..* INTEGER INCX,N* CHARACTER DIAG,TRANS,UPLO* ..* .. Array Arguments ..* DOUBLE PRECISION AP(*),X(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DTPMV performs one of the matrix-vector operations*>*> x := A*x, or x := A**T*x,*>*> where x is an n element vector and A is an n by n unit, or non-unit,*> upper or lower triangular matrix, supplied in packed form.*> \endverbatim** Arguments:* ==========**> \param[in] UPLO*> \verbatim*> UPLO is 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.*> \endverbatim*>*> \param[in] TRANS*> \verbatim*> TRANS is CHARACTER*1*> On entry, TRANS specifies the operation to be performed as*> follows:*>*> TRANS = 'N' or 'n' x := A*x.*>*> TRANS = 'T' or 't' x := A**T*x.*>*> TRANS = 'C' or 'c' x := A**T*x.*> \endverbatim*>*> \param[in] DIAG*> \verbatim*> DIAG is 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.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the order of the matrix A.*> N must be at least zero.*> \endverbatim*>*> \param[in] AP*> \verbatim*> AP is DOUBLE PRECISION array, 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.*> \endverbatim*>*> \param[in,out] X*> \verbatim*> X is DOUBLE PRECISION array, dimension at least*> ( 1 + ( n - 1 )*abs( INCX ) ).*> Before entry, the incremented array X must contain the n*> element vector x. On exit, X is overwritten with the*> transformed vector x.*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> On entry, INCX specifies the increment for the elements of*> X. INCX must not be zero.*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level2**> \par Further Details:* =====================*>*> \verbatim*>*> Level 2 Blas routine.*> The vector and matrix arguments are not referenced when N = 0, or M = 0*>*> -- 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.*> \endverbatim*>* =====================================================================SUBROUTINE DTPMV(UPLO,TRANS,DIAG,N,AP,X,INCX)** -- Reference BLAS level2 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..INTEGER INCX,NCHARACTER DIAG,TRANS,UPLO* ..* .. Array Arguments ..DOUBLE PRECISION AP(*),X(*)* ..** =====================================================================** .. Parameters ..DOUBLE PRECISION ZEROPARAMETER (ZERO=0.0D+0)* ..* .. Local Scalars ..DOUBLE PRECISION TEMPINTEGER I,INFO,IX,J,JX,K,KK,KXLOGICAL NOUNIT* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..** 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('DTPMV ',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:= A*x.*IF (LSAME(UPLO,'U')) THENKK = 1IF (INCX.EQ.1) THENDO 20 J = 1,Nc IF (X(J).NE.ZERO) THENTEMP = X(J)K = KKDO 10 I = 1,J - 1X(I) = X(I) + TEMP*AP(K)K = K + 110 CONTINUEIF (NOUNIT) X(J) = X(J)*AP(KK+J-1)c END IFKK = KK + J20 CONTINUEELSEJX = KXDO 40 J = 1,Nc IF (X(JX).NE.ZERO) THENTEMP = X(JX)IX = KXDO 30 K = KK,KK + J - 2X(IX) = X(IX) + TEMP*AP(K)IX = IX + INCX30 CONTINUEIF (NOUNIT) X(JX) = X(JX)*AP(KK+J-1)c END IFJX = JX + INCXKK = KK + J40 CONTINUEEND IFELSEKK = (N* (N+1))/2IF (INCX.EQ.1) THENDO 60 J = N,1,-1c IF (X(J).NE.ZERO) THENTEMP = X(J)K = KKDO 50 I = N,J + 1,-1X(I) = X(I) + TEMP*AP(K)K = K - 150 CONTINUEIF (NOUNIT) X(J) = X(J)*AP(KK-N+J)c END IFKK = KK - (N-J+1)60 CONTINUEELSEKX = KX + (N-1)*INCXJX = KXDO 80 J = N,1,-1c IF (X(JX).NE.ZERO) THENTEMP = X(JX)IX = KXDO 70 K = KK,KK - (N- (J+1)),-1X(IX) = X(IX) + TEMP*AP(K)IX = IX - INCX70 CONTINUEIF (NOUNIT) X(JX) = X(JX)*AP(KK-N+J)c END IFJX = JX - INCXKK = KK - (N-J+1)80 CONTINUEEND IFEND IFELSE** Form x := A**T*x.*IF (LSAME(UPLO,'U')) THENKK = (N* (N+1))/2IF (INCX.EQ.1) THENDO 100 J = N,1,-1TEMP = X(J)IF (NOUNIT) TEMP = TEMP*AP(KK)K = KK - 1DO 90 I = J - 1,1,-1TEMP = TEMP + AP(K)*X(I)K = K - 190 CONTINUEX(J) = TEMPKK = KK - J100 CONTINUEELSEJX = KX + (N-1)*INCXDO 120 J = N,1,-1TEMP = X(JX)IX = JXIF (NOUNIT) TEMP = TEMP*AP(KK)DO 110 K = KK - 1,KK - J + 1,-1IX = IX - INCXTEMP = TEMP + AP(K)*X(IX)110 CONTINUEX(JX) = TEMPJX = JX - INCXKK = KK - J120 CONTINUEEND IFELSEKK = 1IF (INCX.EQ.1) THENDO 140 J = 1,NTEMP = X(J)IF (NOUNIT) TEMP = TEMP*AP(KK)K = KK + 1DO 130 I = J + 1,NTEMP = TEMP + AP(K)*X(I)K = K + 1130 CONTINUEX(J) = TEMPKK = KK + (N-J+1)140 CONTINUEELSEJX = KXDO 160 J = 1,NTEMP = X(JX)IX = JXIF (NOUNIT) TEMP = TEMP*AP(KK)DO 150 K = KK + 1,KK + N - JIX = IX + INCXTEMP = TEMP + AP(K)*X(IX)150 CONTINUEX(JX) = TEMPJX = JX + INCXKK = KK + (N-J+1)160 CONTINUEEND IFEND IFEND IF*RETURN** End of DTPMV*END*> \brief \b DTPSV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DTPSV(UPLO,TRANS,DIAG,N,AP,X,INCX)** .. Scalar Arguments ..* INTEGER INCX,N* CHARACTER DIAG,TRANS,UPLO* ..* .. Array Arguments ..* DOUBLE PRECISION AP(*),X(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DTPSV solves one of the systems of equations*>*> A*x = b, or A**T*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.*> \endverbatim** Arguments:* ==========**> \param[in] UPLO*> \verbatim*> UPLO is 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.*> \endverbatim*>*> \param[in] TRANS*> \verbatim*> TRANS is 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**T*x = b.*>*> TRANS = 'C' or 'c' A**T*x = b.*> \endverbatim*>*> \param[in] DIAG*> \verbatim*> DIAG is 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.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the order of the matrix A.*> N must be at least zero.*> \endverbatim*>*> \param[in] AP*> \verbatim*> AP is DOUBLE PRECISION array, 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.*> \endverbatim*>*> \param[in,out] X*> \verbatim*> X is DOUBLE PRECISION array, 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.*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> On entry, INCX specifies the increment for the elements of*> X. INCX must not be zero.*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level2**> \par Further Details:* =====================*>*> \verbatim*>*> 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.*> \endverbatim*>* =====================================================================SUBROUTINE DTPSV(UPLO,TRANS,DIAG,N,AP,X,INCX)** -- Reference BLAS level2 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..INTEGER INCX,NCHARACTER DIAG,TRANS,UPLO* ..* .. Array Arguments ..DOUBLE PRECISION AP(*),X(*)* ..** =====================================================================** .. Parameters ..DOUBLE PRECISION ZEROPARAMETER (ZERO=0.0D+0)* ..* .. Local Scalars ..DOUBLE PRECISION TEMPINTEGER I,INFO,IX,J,JX,K,KK,KXLOGICAL NOUNIT* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..** 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('DTPSV ',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,-1c IF (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 CONTINUEc END IFKK = KK - J20 CONTINUEELSEJX = KX + (N-1)*INCXDO 40 J = N,1,-1c IF (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 CONTINUEc END IFJX = JX - INCXKK = KK - J40 CONTINUEEND IFELSEKK = 1IF (INCX.EQ.1) THENDO 60 J = 1,Nc IF (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 CONTINUEc END IFKK = KK + (N-J+1)60 CONTINUEELSEJX = KXDO 80 J = 1,Nc IF (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 CONTINUEc END IFJX = JX + INCXKK = KK + (N-J+1)80 CONTINUEEND IFEND IFELSE** Form x := inv( A**T )*x.*IF (LSAME(UPLO,'U')) THENKK = 1IF (INCX.EQ.1) THENDO 100 J = 1,NTEMP = X(J)K = KKDO 90 I = 1,J - 1TEMP = TEMP - AP(K)*X(I)K = K + 190 CONTINUEIF (NOUNIT) TEMP = TEMP/AP(KK+J-1)X(J) = TEMPKK = KK + J100 CONTINUEELSEJX = KXDO 120 J = 1,NTEMP = X(JX)IX = KXDO 110 K = KK,KK + J - 2TEMP = TEMP - AP(K)*X(IX)IX = IX + INCX110 CONTINUEIF (NOUNIT) TEMP = TEMP/AP(KK+J-1)X(JX) = TEMPJX = JX + INCXKK = KK + J120 CONTINUEEND IFELSEKK = (N* (N+1))/2IF (INCX.EQ.1) THENDO 140 J = N,1,-1TEMP = X(J)K = KKDO 130 I = N,J + 1,-1TEMP = TEMP - AP(K)*X(I)K = K - 1130 CONTINUEIF (NOUNIT) TEMP = TEMP/AP(KK-N+J)X(J) = TEMPKK = KK - (N-J+1)140 CONTINUEELSEKX = KX + (N-1)*INCXJX = KXDO 160 J = N,1,-1TEMP = X(JX)IX = KXDO 150 K = KK,KK - (N- (J+1)),-1TEMP = TEMP - AP(K)*X(IX)IX = IX - INCX150 CONTINUEIF (NOUNIT) TEMP = TEMP/AP(KK-N+J)X(JX) = TEMPJX = JX - INCXKK = KK - (N-J+1)160 CONTINUEEND IFEND IFEND IF*RETURN** End of DTPSV*END*> \brief \b DTRMM** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DTRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB)** .. Scalar Arguments ..* DOUBLE PRECISION ALPHA* INTEGER LDA,LDB,M,N* CHARACTER DIAG,SIDE,TRANSA,UPLO* ..* .. Array Arguments ..* DOUBLE PRECISION A(LDA,*),B(LDB,*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DTRMM performs one of the matrix-matrix operations*>*> B := alpha*op( A )*B, or B := alpha*B*op( A ),*>*> where alpha is a scalar, B is an m by n matrix, 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**T.*> \endverbatim** Arguments:* ==========**> \param[in] SIDE*> \verbatim*> SIDE is CHARACTER*1*> On entry, SIDE specifies whether op( A ) multiplies B from*> the left or right as follows:*>*> SIDE = 'L' or 'l' B := alpha*op( A )*B.*>*> SIDE = 'R' or 'r' B := alpha*B*op( A ).*> \endverbatim*>*> \param[in] UPLO*> \verbatim*> UPLO is 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.*> \endverbatim*>*> \param[in] TRANSA*> \verbatim*> TRANSA is 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**T.*>*> TRANSA = 'C' or 'c' op( A ) = A**T.*> \endverbatim*>*> \param[in] DIAG*> \verbatim*> DIAG is 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.*> \endverbatim*>*> \param[in] M*> \verbatim*> M is INTEGER*> On entry, M specifies the number of rows of B. M must be at*> least zero.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the number of columns of B. N must be*> at least zero.*> \endverbatim*>*> \param[in] ALPHA*> \verbatim*> ALPHA is 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.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE PRECISION array, 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*> triangular matrix and the strictly lower triangular part of*> A is not referenced.*> Before entry with UPLO = 'L' or 'l', the leading k by k*> 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.*> \endverbatim*>*> \param[in] LDA*> \verbatim*> LDA is INTEGER*> On entry, LDA specifies the first dimension of A as declared*> in the calling (sub) program. When SIDE = 'L' or 'l' then*> LDA must be at least max( 1, m ), when SIDE = 'R' or 'r'*> then LDA must be at least max( 1, n ).*> \endverbatim*>*> \param[in,out] B*> \verbatim*> B is DOUBLE PRECISION array, dimension ( LDB, N )*> Before entry, the leading m by n part of the array B must*> contain the matrix B, and on exit is overwritten by the*> transformed matrix.*> \endverbatim*>*> \param[in] LDB*> \verbatim*> LDB is INTEGER*> On entry, LDB specifies the first dimension of B as declared*> in the calling (sub) program. LDB must be at least*> max( 1, m ).*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level3**> \par Further Details:* =====================*>*> \verbatim*>*> Level 3 Blas routine.*>*> -- Written on 8-February-1989.*> Jack Dongarra, Argonne National Laboratory.*> Iain Duff, AERE Harwell.*> Jeremy Du Croz, Numerical Algorithms Group Ltd.*> Sven Hammarling, Numerical Algorithms Group Ltd.*> \endverbatim*>* =====================================================================SUBROUTINE DTRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB)** -- Reference BLAS level3 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..DOUBLE PRECISION ALPHAINTEGER LDA,LDB,M,NCHARACTER DIAG,SIDE,TRANSA,UPLO* ..* .. Array Arguments ..DOUBLE PRECISION A(LDA,*),B(LDB,*)* ..** =====================================================================** .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC MAX* ..* .. Local Scalars ..DOUBLE PRECISION TEMPINTEGER I,INFO,J,K,NROWALOGICAL LSIDE,NOUNIT,UPPER* ..* .. Parameters ..DOUBLE PRECISION ONE,ZEROPARAMETER (ONE=1.0D+0,ZERO=0.0D+0)* ..** Test the input parameters.*LSIDE = LSAME(SIDE,'L')IF (LSIDE) THENNROWA = MELSENROWA = NEND IFNOUNIT = LSAME(DIAG,'N')UPPER = LSAME(UPLO,'U')*INFO = 0IF ((.NOT.LSIDE) .AND. (.NOT.LSAME(SIDE,'R'))) THENINFO = 1ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THENINFO = 2ELSE IF ((.NOT.LSAME(TRANSA,'N')) .AND.+ (.NOT.LSAME(TRANSA,'T')) .AND.+ (.NOT.LSAME(TRANSA,'C'))) THENINFO = 3ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. (.NOT.LSAME(DIAG,'N'))) THENINFO = 4ELSE IF (M.LT.0) THENINFO = 5ELSE IF (N.LT.0) THENINFO = 6ELSE IF (LDA.LT.MAX(1,NROWA)) THENINFO = 9ELSE IF (LDB.LT.MAX(1,M)) THENINFO = 11END IFIF (INFO.NE.0) THENCALL XERBLA('DTRMM ',INFO)RETURNEND IF** Quick return if possible.*IF (M.EQ.0 .OR. N.EQ.0) RETURN** And when alpha.eq.zero.*IF (ALPHA.EQ.ZERO) THENDO 20 J = 1,NDO 10 I = 1,MB(I,J) = ZERO10 CONTINUE20 CONTINUERETURNEND IF** Start the operations.*IF (LSIDE) THENIF (LSAME(TRANSA,'N')) THEN** Form B := alpha*A*B.*IF (UPPER) THENDO 50 J = 1,NDO 40 K = 1,Mc IF (B(K,J).NE.ZERO) THENTEMP = ALPHA*B(K,J)DO 30 I = 1,K - 1B(I,J) = B(I,J) + TEMP*A(I,K)30 CONTINUEIF (NOUNIT) TEMP = TEMP*A(K,K)B(K,J) = TEMPc END IF40 CONTINUE50 CONTINUEELSEDO 80 J = 1,NDO 70 K = M,1,-1c IF (B(K,J).NE.ZERO) THENTEMP = ALPHA*B(K,J)B(K,J) = TEMPIF (NOUNIT) B(K,J) = B(K,J)*A(K,K)DO 60 I = K + 1,MB(I,J) = B(I,J) + TEMP*A(I,K)60 CONTINUEc END IF70 CONTINUE80 CONTINUEEND IFELSE** Form B := alpha*A**T*B.*IF (UPPER) THENDO 110 J = 1,NDO 100 I = M,1,-1TEMP = B(I,J)IF (NOUNIT) TEMP = TEMP*A(I,I)DO 90 K = 1,I - 1TEMP = TEMP + A(K,I)*B(K,J)90 CONTINUEB(I,J) = ALPHA*TEMP100 CONTINUE110 CONTINUEELSEDO 140 J = 1,NDO 130 I = 1,MTEMP = B(I,J)IF (NOUNIT) TEMP = TEMP*A(I,I)DO 120 K = I + 1,MTEMP = TEMP + A(K,I)*B(K,J)120 CONTINUEB(I,J) = ALPHA*TEMP130 CONTINUE140 CONTINUEEND IFEND IFELSEIF (LSAME(TRANSA,'N')) THEN** Form B := alpha*B*A.*IF (UPPER) THENDO 180 J = N,1,-1TEMP = ALPHAIF (NOUNIT) TEMP = TEMP*A(J,J)DO 150 I = 1,MB(I,J) = TEMP*B(I,J)150 CONTINUEDO 170 K = 1,J - 1c IF (A(K,J).NE.ZERO) THENTEMP = ALPHA*A(K,J)DO 160 I = 1,MB(I,J) = B(I,J) + TEMP*B(I,K)160 CONTINUEc END IF170 CONTINUE180 CONTINUEELSEDO 220 J = 1,NTEMP = ALPHAIF (NOUNIT) TEMP = TEMP*A(J,J)DO 190 I = 1,MB(I,J) = TEMP*B(I,J)190 CONTINUEDO 210 K = J + 1,Nc IF (A(K,J).NE.ZERO) THENTEMP = ALPHA*A(K,J)DO 200 I = 1,MB(I,J) = B(I,J) + TEMP*B(I,K)200 CONTINUEc END IF210 CONTINUE220 CONTINUEEND IFELSE** Form B := alpha*B*A**T.*IF (UPPER) THENDO 260 K = 1,NDO 240 J = 1,K - 1c IF (A(J,K).NE.ZERO) THENTEMP = ALPHA*A(J,K)DO 230 I = 1,MB(I,J) = B(I,J) + TEMP*B(I,K)230 CONTINUEc END IF240 CONTINUETEMP = ALPHAIF (NOUNIT) TEMP = TEMP*A(K,K)IF (TEMP.NE.ONE) THENDO 250 I = 1,MB(I,K) = TEMP*B(I,K)250 CONTINUEEND IF260 CONTINUEELSEDO 300 K = N,1,-1DO 280 J = K + 1,Nc IF (A(J,K).NE.ZERO) THENTEMP = ALPHA*A(J,K)DO 270 I = 1,MB(I,J) = B(I,J) + TEMP*B(I,K)270 CONTINUEc END IF280 CONTINUETEMP = ALPHAIF (NOUNIT) TEMP = TEMP*A(K,K)IF (TEMP.NE.ONE) THENDO 290 I = 1,MB(I,K) = TEMP*B(I,K)290 CONTINUEEND IF300 CONTINUEEND IFEND IFEND IF*RETURN** End of DTRMM*END*> \brief \b DTRMV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX)** .. Scalar Arguments ..* INTEGER INCX,LDA,N* CHARACTER DIAG,TRANS,UPLO* ..* .. Array Arguments ..* DOUBLE PRECISION A(LDA,*),X(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DTRMV performs one of the matrix-vector operations*>*> x := A*x, or x := A**T*x,*>*> where x is an n element vector and A is an n by n unit, or non-unit,*> upper or lower triangular matrix.*> \endverbatim** Arguments:* ==========**> \param[in] UPLO*> \verbatim*> UPLO is 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.*> \endverbatim*>*> \param[in] TRANS*> \verbatim*> TRANS is CHARACTER*1*> On entry, TRANS specifies the operation to be performed as*> follows:*>*> TRANS = 'N' or 'n' x := A*x.*>*> TRANS = 'T' or 't' x := A**T*x.*>*> TRANS = 'C' or 'c' x := A**T*x.*> \endverbatim*>*> \param[in] DIAG*> \verbatim*> DIAG is 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.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the order of the matrix A.*> N must be at least zero.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE PRECISION array, 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.*> \endverbatim*>*> \param[in] LDA*> \verbatim*> LDA is 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 ).*> \endverbatim*>*> \param[in,out] X*> \verbatim*> X is DOUBLE PRECISION array, dimension at least*> ( 1 + ( n - 1 )*abs( INCX ) ).*> Before entry, the incremented array X must contain the n*> element vector x. On exit, X is overwritten with the*> transformed vector x.*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> On entry, INCX specifies the increment for the elements of*> X. INCX must not be zero.*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level2**> \par Further Details:* =====================*>*> \verbatim*>*> Level 2 Blas routine.*> The vector and matrix arguments are not referenced when N = 0, or M = 0*>*> -- 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.*> \endverbatim*>* =====================================================================SUBROUTINE DTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX)** -- Reference BLAS level2 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..INTEGER INCX,LDA,NCHARACTER DIAG,TRANS,UPLO* ..* .. Array Arguments ..DOUBLE PRECISION A(LDA,*),X(*)* ..** =====================================================================** .. 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* ..** 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('DTRMV ',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 := A*x.*IF (LSAME(UPLO,'U')) THENIF (INCX.EQ.1) THENDO 20 J = 1,Nc IF (X(J).NE.ZERO) THENTEMP = X(J)DO 10 I = 1,J - 1X(I) = X(I) + TEMP*A(I,J)10 CONTINUEIF (NOUNIT) X(J) = X(J)*A(J,J)c END IF20 CONTINUEELSEJX = KXDO 40 J = 1,Nc IF (X(JX).NE.ZERO) THENTEMP = X(JX)IX = KXDO 30 I = 1,J - 1X(IX) = X(IX) + TEMP*A(I,J)IX = IX + INCX30 CONTINUEIF (NOUNIT) X(JX) = X(JX)*A(J,J)c END IFJX = JX + INCX40 CONTINUEEND IFELSEIF (INCX.EQ.1) THENDO 60 J = N,1,-1c IF (X(J).NE.ZERO) THENTEMP = X(J)DO 50 I = N,J + 1,-1X(I) = X(I) + TEMP*A(I,J)50 CONTINUEIF (NOUNIT) X(J) = X(J)*A(J,J)c END IF60 CONTINUEELSEKX = KX + (N-1)*INCXJX = KXDO 80 J = N,1,-1c IF (X(JX).NE.ZERO) THENTEMP = X(JX)IX = KXDO 70 I = N,J + 1,-1X(IX) = X(IX) + TEMP*A(I,J)IX = IX - INCX70 CONTINUEIF (NOUNIT) X(JX) = X(JX)*A(J,J)c END IFJX = JX - INCX80 CONTINUEEND IFEND IFELSE** Form x := A**T*x.*IF (LSAME(UPLO,'U')) THENIF (INCX.EQ.1) THENDO 100 J = N,1,-1TEMP = X(J)IF (NOUNIT) TEMP = TEMP*A(J,J)DO 90 I = J - 1,1,-1TEMP = TEMP + A(I,J)*X(I)90 CONTINUEX(J) = TEMP100 CONTINUEELSEJX = KX + (N-1)*INCXDO 120 J = N,1,-1TEMP = X(JX)IX = JXIF (NOUNIT) TEMP = TEMP*A(J,J)DO 110 I = J - 1,1,-1IX = IX - INCXTEMP = TEMP + A(I,J)*X(IX)110 CONTINUEX(JX) = TEMPJX = JX - INCX120 CONTINUEEND IFELSEIF (INCX.EQ.1) THENDO 140 J = 1,NTEMP = X(J)IF (NOUNIT) TEMP = TEMP*A(J,J)DO 130 I = J + 1,NTEMP = TEMP + A(I,J)*X(I)130 CONTINUEX(J) = TEMP140 CONTINUEELSEJX = KXDO 160 J = 1,NTEMP = X(JX)IX = JXIF (NOUNIT) TEMP = TEMP*A(J,J)DO 150 I = J + 1,NIX = IX + INCXTEMP = TEMP + A(I,J)*X(IX)150 CONTINUEX(JX) = TEMPJX = JX + INCX160 CONTINUEEND IFEND IFEND IF*RETURN** End of DTRMV*END*> \brief \b DTRSM** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DTRSM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB)** .. Scalar Arguments ..* DOUBLE PRECISION ALPHA* INTEGER LDA,LDB,M,N* CHARACTER DIAG,SIDE,TRANSA,UPLO* ..* .. Array Arguments ..* DOUBLE PRECISION A(LDA,*),B(LDB,*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> 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**T.*>*> The matrix X is overwritten on B.*> \endverbatim** Arguments:* ==========**> \param[in] SIDE*> \verbatim*> SIDE is 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.*> \endverbatim*>*> \param[in] UPLO*> \verbatim*> UPLO is 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.*> \endverbatim*>*> \param[in] TRANSA*> \verbatim*> TRANSA is 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**T.*>*> TRANSA = 'C' or 'c' op( A ) = A**T.*> \endverbatim*>*> \param[in] DIAG*> \verbatim*> DIAG is 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.*> \endverbatim*>*> \param[in] M*> \verbatim*> M is INTEGER*> On entry, M specifies the number of rows of B. M must be at*> least zero.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the number of columns of B. N must be*> at least zero.*> \endverbatim*>*> \param[in] ALPHA*> \verbatim*> ALPHA is 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.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE PRECISION array, dimension ( LDA, k ),*> where k is m when SIDE = 'L' or 'l'*> and k 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*> triangular matrix and the strictly lower triangular part of*> A is not referenced.*> Before entry with UPLO = 'L' or 'l', the leading k by k*> 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.*> \endverbatim*>*> \param[in] LDA*> \verbatim*> LDA is INTEGER*> On entry, LDA specifies the first dimension of A as declared*> in the calling (sub) program. When SIDE = 'L' or 'l' then*> LDA must be at least max( 1, m ), when SIDE = 'R' or 'r'*> then LDA must be at least max( 1, n ).*> \endverbatim*>*> \param[in,out] B*> \verbatim*> B is DOUBLE PRECISION array, dimension ( LDB, N )*> Before entry, the leading m by n part of the array B must*> contain the right-hand side matrix B, and on exit is*> overwritten by the solution matrix X.*> \endverbatim*>*> \param[in] LDB*> \verbatim*> LDB is INTEGER*> On entry, LDB specifies the first dimension of B as declared*> in the calling (sub) program. LDB must be at least*> max( 1, m ).*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level3**> \par Further Details:* =====================*>*> \verbatim*>*> Level 3 Blas routine.*>*>*> -- Written on 8-February-1989.*> Jack Dongarra, Argonne National Laboratory.*> Iain Duff, AERE Harwell.*> Jeremy Du Croz, Numerical Algorithms Group Ltd.*> Sven Hammarling, Numerical Algorithms Group Ltd.*> \endverbatim*>* =====================================================================SUBROUTINE DTRSM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB)** -- Reference BLAS level3 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..DOUBLE PRECISION ALPHAINTEGER LDA,LDB,M,NCHARACTER DIAG,SIDE,TRANSA,UPLO* ..* .. Array Arguments ..DOUBLE PRECISION A(LDA,*),B(LDB,*)* ..** =====================================================================** .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC MAX* ..* .. Local Scalars ..DOUBLE PRECISION TEMPINTEGER I,INFO,J,K,NROWALOGICAL LSIDE,NOUNIT,UPPER* ..* .. Parameters ..DOUBLE PRECISION ONE,ZEROPARAMETER (ONE=1.0D+0,ZERO=0.0D+0)* ..** Test the input parameters.*LSIDE = LSAME(SIDE,'L')IF (LSIDE) THENNROWA = MELSENROWA = NEND IFNOUNIT = LSAME(DIAG,'N')UPPER = LSAME(UPLO,'U')*INFO = 0IF ((.NOT.LSIDE) .AND. (.NOT.LSAME(SIDE,'R'))) THENINFO = 1ELSE IF ((.NOT.UPPER) .AND. (.NOT.LSAME(UPLO,'L'))) THENINFO = 2ELSE IF ((.NOT.LSAME(TRANSA,'N')) .AND.+ (.NOT.LSAME(TRANSA,'T')) .AND.+ (.NOT.LSAME(TRANSA,'C'))) THENINFO = 3ELSE IF ((.NOT.LSAME(DIAG,'U')) .AND. (.NOT.LSAME(DIAG,'N'))) THENINFO = 4ELSE IF (M.LT.0) THENINFO = 5ELSE IF (N.LT.0) THENINFO = 6ELSE IF (LDA.LT.MAX(1,NROWA)) THENINFO = 9ELSE IF (LDB.LT.MAX(1,M)) THENINFO = 11END IFIF (INFO.NE.0) THENCALL XERBLA('DTRSM ',INFO)RETURNEND IF** Quick return if possible.*IF (M.EQ.0 .OR. N.EQ.0) RETURN** And when alpha.eq.zero.*IF (ALPHA.EQ.ZERO) THENDO 20 J = 1,NDO 10 I = 1,MB(I,J) = ZERO10 CONTINUE20 CONTINUERETURNEND IF** Start the operations.*IF (LSIDE) THENIF (LSAME(TRANSA,'N')) THEN** Form B := alpha*inv( A )*B.*IF (UPPER) THENDO 60 J = 1,NIF (ALPHA.NE.ONE) THENDO 30 I = 1,MB(I,J) = ALPHA*B(I,J)30 CONTINUEEND IFDO 50 K = M,1,-1c IF (B(K,J).NE.ZERO) THENIF (NOUNIT) B(K,J) = B(K,J)/A(K,K)DO 40 I = 1,K - 1B(I,J) = B(I,J) - B(K,J)*A(I,K)40 CONTINUEc END IF50 CONTINUE60 CONTINUEELSEDO 100 J = 1,NIF (ALPHA.NE.ONE) THENDO 70 I = 1,MB(I,J) = ALPHA*B(I,J)70 CONTINUEEND IFDO 90 K = 1,Mc IF (B(K,J).NE.ZERO) THENIF (NOUNIT) B(K,J) = B(K,J)/A(K,K)DO 80 I = K + 1,MB(I,J) = B(I,J) - B(K,J)*A(I,K)80 CONTINUEc END IF90 CONTINUE100 CONTINUEEND IFELSE** Form B := alpha*inv( A**T )*B.*IF (UPPER) THENDO 130 J = 1,NDO 120 I = 1,MTEMP = ALPHA*B(I,J)DO 110 K = 1,I - 1TEMP = TEMP - A(K,I)*B(K,J)110 CONTINUEIF (NOUNIT) TEMP = TEMP/A(I,I)B(I,J) = TEMP120 CONTINUE130 CONTINUEELSEDO 160 J = 1,NDO 150 I = M,1,-1TEMP = ALPHA*B(I,J)DO 140 K = I + 1,MTEMP = TEMP - A(K,I)*B(K,J)140 CONTINUEIF (NOUNIT) TEMP = TEMP/A(I,I)B(I,J) = TEMP150 CONTINUE160 CONTINUEEND IFEND IFELSEIF (LSAME(TRANSA,'N')) THEN** Form B := alpha*B*inv( A ).*IF (UPPER) THENDO 210 J = 1,NIF (ALPHA.NE.ONE) THENDO 170 I = 1,MB(I,J) = ALPHA*B(I,J)170 CONTINUEEND IFDO 190 K = 1,J - 1c IF (A(K,J).NE.ZERO) THENDO 180 I = 1,MB(I,J) = B(I,J) - A(K,J)*B(I,K)180 CONTINUEc END IF190 CONTINUEIF (NOUNIT) THENTEMP = ONE/A(J,J)DO 200 I = 1,MB(I,J) = TEMP*B(I,J)200 CONTINUEEND IF210 CONTINUEELSEDO 260 J = N,1,-1IF (ALPHA.NE.ONE) THENDO 220 I = 1,MB(I,J) = ALPHA*B(I,J)220 CONTINUEEND IFDO 240 K = J + 1,Nc IF (A(K,J).NE.ZERO) THENDO 230 I = 1,MB(I,J) = B(I,J) - A(K,J)*B(I,K)230 CONTINUEc END IF240 CONTINUEIF (NOUNIT) THENTEMP = ONE/A(J,J)DO 250 I = 1,MB(I,J) = TEMP*B(I,J)250 CONTINUEEND IF260 CONTINUEEND IFELSE** Form B := alpha*B*inv( A**T ).*IF (UPPER) THENDO 310 K = N,1,-1IF (NOUNIT) THENTEMP = ONE/A(K,K)DO 270 I = 1,MB(I,K) = TEMP*B(I,K)270 CONTINUEEND IFDO 290 J = 1,K - 1c IF (A(J,K).NE.ZERO) THENTEMP = A(J,K)DO 280 I = 1,MB(I,J) = B(I,J) - TEMP*B(I,K)280 CONTINUEc END IF290 CONTINUEIF (ALPHA.NE.ONE) THENDO 300 I = 1,MB(I,K) = ALPHA*B(I,K)300 CONTINUEEND IF310 CONTINUEELSEDO 360 K = 1,NIF (NOUNIT) THENTEMP = ONE/A(K,K)DO 320 I = 1,MB(I,K) = TEMP*B(I,K)320 CONTINUEEND IFDO 340 J = K + 1,Nc IF (A(J,K).NE.ZERO) THENTEMP = A(J,K)DO 330 I = 1,MB(I,J) = B(I,J) - TEMP*B(I,K)330 CONTINUEc END IF340 CONTINUEIF (ALPHA.NE.ONE) THENDO 350 I = 1,MB(I,K) = ALPHA*B(I,K)350 CONTINUEEND IF360 CONTINUEEND IFEND IFEND IF*RETURN** End of DTRSM*END*> \brief \b DTRSV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE DTRSV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX)** .. Scalar Arguments ..* INTEGER INCX,LDA,N* CHARACTER DIAG,TRANS,UPLO* ..* .. Array Arguments ..* DOUBLE PRECISION A(LDA,*),X(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DTRSV solves one of the systems of equations*>*> A*x = b, or A**T*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.*> \endverbatim** Arguments:* ==========**> \param[in] UPLO*> \verbatim*> UPLO is 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.*> \endverbatim*>*> \param[in] TRANS*> \verbatim*> TRANS is 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**T*x = b.*>*> TRANS = 'C' or 'c' A**T*x = b.*> \endverbatim*>*> \param[in] DIAG*> \verbatim*> DIAG is 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.*> \endverbatim*>*> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the order of the matrix A.*> N must be at least zero.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE PRECISION array, 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.*> \endverbatim*>*> \param[in] LDA*> \verbatim*> LDA is 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 ).*> \endverbatim*>*> \param[in,out] X*> \verbatim*> X is DOUBLE PRECISION array, 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.*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> On entry, INCX specifies the increment for the elements of*> X. INCX must not be zero.*>*> 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.*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level1** =====================================================================SUBROUTINE DTRSV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX)** -- Reference BLAS level1 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..INTEGER INCX,LDA,NCHARACTER DIAG,TRANS,UPLO* ..* .. Array Arguments ..DOUBLE PRECISION A(LDA,*),X(*)* ..** =====================================================================** .. 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* ..** 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,-1c IF (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 CONTINUEc END IF20 CONTINUEELSEJX = KX + (N-1)*INCXDO 40 J = N,1,-1c IF (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 CONTINUEc END IFJX = JX - INCX40 CONTINUEEND IFELSEIF (INCX.EQ.1) THENDO 60 J = 1,Nc IF (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 CONTINUEc END IF60 CONTINUEELSEJX = KXDO 80 J = 1,Nc IF (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 CONTINUEc END IFJX = JX + INCX80 CONTINUEEND IFEND IFELSE** Form x := inv( A**T )*x.*IF (LSAME(UPLO,'U')) THENIF (INCX.EQ.1) THENDO 100 J = 1,NTEMP = X(J)DO 90 I = 1,J - 1TEMP = TEMP - A(I,J)*X(I)90 CONTINUEIF (NOUNIT) TEMP = TEMP/A(J,J)X(J) = TEMP100 CONTINUEELSEJX = KXDO 120 J = 1,NTEMP = X(JX)IX = KXDO 110 I = 1,J - 1TEMP = TEMP - A(I,J)*X(IX)IX = IX + INCX110 CONTINUEIF (NOUNIT) TEMP = TEMP/A(J,J)X(JX) = TEMPJX = JX + INCX120 CONTINUEEND IFELSEIF (INCX.EQ.1) THENDO 140 J = N,1,-1TEMP = X(J)DO 130 I = N,J + 1,-1TEMP = TEMP - A(I,J)*X(I)130 CONTINUEIF (NOUNIT) TEMP = TEMP/A(J,J)X(J) = TEMP140 CONTINUEELSEKX = KX + (N-1)*INCXJX = KXDO 160 J = N,1,-1TEMP = X(JX)IX = KXDO 150 I = N,J + 1,-1TEMP = TEMP - A(I,J)*X(IX)IX = IX - INCX150 CONTINUEIF (NOUNIT) TEMP = TEMP/A(J,J)X(JX) = TEMPJX = JX - INCX160 CONTINUEEND IFEND IFEND IF*RETURN** End of DTRSV*END*> \brief \b IDAMAX** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** INTEGER FUNCTION IDAMAX(N,DX,INCX)** .. Scalar Arguments ..* INTEGER INCX,N* ..* .. Array Arguments ..* DOUBLE PRECISION DX(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> IDAMAX finds the index of the first element having maximum absolute value.*> \endverbatim** Arguments:* ==========**> \param[in] N*> \verbatim*> N is INTEGER*> number of elements in input vector(s)*> \endverbatim*>*> \param[in] DX*> \verbatim*> DX is DOUBLE PRECISION array, dimension ( 1 + ( N - 1 )*abs( INCX ) )*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> storage spacing between elements of DX*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup aux_blas**> \par Further Details:* =====================*>*> \verbatim*>*> jack dongarra, linpack, 3/11/78.*> modified 3/93 to return if incx .le. 0.*> modified 12/3/93, array(1) declarations changed to array(*)*> \endverbatim*>* =====================================================================INTEGER FUNCTION IDAMAX(N,DX,INCX)** -- Reference BLAS level1 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..INTEGER INCX,N* ..* .. Array Arguments ..DOUBLE PRECISION DX(*)* ..** =====================================================================** .. Local Scalars ..DOUBLE PRECISION DMAXINTEGER I,IX* ..* .. Intrinsic Functions ..INTRINSIC DABS* ..IDAMAX = 0IF (N.LT.1 .OR. INCX.LE.0) RETURNIDAMAX = 1IF (N.EQ.1) RETURNIF (INCX.EQ.1) THEN** code for increment equal to 1*DMAX = DABS(DX(1))DO I = 2,NIF (DABS(DX(I)).GT.DMAX) THENIDAMAX = IDMAX = DABS(DX(I))END IFEND DOELSE** code for increment not equal to 1*IX = 1DMAX = DABS(DX(1))IX = IX + INCXDO I = 2,NIF (DABS(DX(IX)).GT.DMAX) THENIDAMAX = IDMAX = DABS(DX(IX))END IFIX = IX + INCXEND DOEND IFRETURN** End of IDAMAX*END*> \brief \b LSAME** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** LOGICAL FUNCTION LSAME(CA,CB)** .. Scalar Arguments ..* CHARACTER CA,CB* ..***> \par Purpose:* =============*>*> \verbatim*>*> LSAME returns .TRUE. if CA is the same letter as CB regardless of*> case.*> \endverbatim** Arguments:* ==========**> \param[in] CA*> \verbatim*> CA is CHARACTER*1*> \endverbatim*>*> \param[in] CB*> \verbatim*> CB is CHARACTER*1*> CA and CB specify the single characters to be compared.*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup aux_blas** =====================================================================LOGICAL FUNCTION LSAME(CA,CB)** -- Reference BLAS level1 routine --* -- Reference BLAS is a software package provided by Univ. of Tennessee, --* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--** .. Scalar Arguments ..CHARACTER CA,CB* ..** =====================================================================** .. Intrinsic Functions ..INTRINSIC ICHAR* ..* .. Local Scalars ..INTEGER INTA,INTB,ZCODE* ..** Test if the characters are equal*LSAME = CA .EQ. CBIF (LSAME) RETURN** Now test for equivalence if both characters are alphabetic.*ZCODE = ICHAR('Z')** Use 'Z' rather than 'A' so that ASCII can be detected on Prime* machines, on which ICHAR returns a value with bit 8 set.* ICHAR('A') on Prime machines returns 193 which is the same as* ICHAR('A') on an EBCDIC machine.*INTA = ICHAR(CA)INTB = ICHAR(CB)*IF (ZCODE.EQ.90 .OR. ZCODE.EQ.122) THEN** ASCII is assumed - ZCODE is the ASCII code of either lower or* upper case 'Z'.*IF (INTA.GE.97 .AND. INTA.LE.122) INTA = INTA - 32IF (INTB.GE.97 .AND. INTB.LE.122) INTB = INTB - 32*ELSE IF (ZCODE.EQ.233 .OR. ZCODE.EQ.169) THEN** EBCDIC is assumed - ZCODE is the EBCDIC code of either lower or* upper case 'Z'.*IF (INTA.GE.129 .AND. INTA.LE.137 .OR.+ INTA.GE.145 .AND. INTA.LE.153 .OR.+ INTA.GE.162 .AND. INTA.LE.169) INTA = INTA + 64IF (INTB.GE.129 .AND. INTB.LE.137 .OR.+ INTB.GE.145 .AND. INTB.LE.153 .OR.+ INTB.GE.162 .AND. INTB.LE.169) INTB = INTB + 64*ELSE IF (ZCODE.EQ.218 .OR. ZCODE.EQ.250) THEN** ASCII is assumed, on Prime machines - ZCODE is the ASCII code* plus 128 of either lower or upper case 'Z'.*IF (INTA.GE.225 .AND. INTA.LE.250) INTA = INTA - 32IF (INTB.GE.225 .AND. INTB.LE.250) INTB = INTB - 32END IFLSAME = INTA .EQ. INTB** RETURN** End of LSAME*END