Rev 82735 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
*> \brief \b DCABS1** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** DOUBLE PRECISION FUNCTION DCABS1(Z)** .. Scalar Arguments ..* DOUBLE COMPLEX Z* ..* ..***> \par Purpose:* =============*>*> \verbatim*>*> DCABS1 computes |Re(.)| + |Im(.)| of a double complex number*> \endverbatim** Arguments:* ==========**> \param[in] Z*> \verbatim*> Z is DOUBLE COMPLEX*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup double_blas_level1** =====================================================================DOUBLE PRECISION FUNCTION DCABS1(Z)** -- 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 COMPLEX Z* ..* ..* =====================================================================** .. Intrinsic Functions ..INTRINSIC ABS,DBLE,DIMAG*DCABS1 = ABS(DBLE(Z)) + ABS(DIMAG(Z))RETURN** End of DCABS1*END*> \brief \b DZASUM** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** DOUBLE PRECISION FUNCTION DZASUM(N,ZX,INCX)** .. Scalar Arguments ..* INTEGER INCX,N* ..* .. Array Arguments ..* DOUBLE COMPLEX ZX(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> DZASUM takes the sum of the (|Re(.)| + |Im(.)|)'s of a complex vector and*> returns a double precision result.*> \endverbatim** Arguments:* ==========**> \param[in] N*> \verbatim*> N is INTEGER*> number of elements in input vector(s)*> \endverbatim*>*> \param[in,out] ZX*> \verbatim*> ZX is DOUBLE COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCX ) )*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> storage spacing between elements of ZX*> \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, 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 DZASUM(N,ZX,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 COMPLEX ZX(*)* ..** =====================================================================** .. Local Scalars ..DOUBLE PRECISION STEMPINTEGER I,NINCX* ..* .. External Functions ..DOUBLE PRECISION DCABS1EXTERNAL DCABS1* ..DZASUM = 0.0d0STEMP = 0.0d0IF (N.LE.0 .OR. INCX.LE.0) RETURNIF (INCX.EQ.1) THEN** code for increment equal to 1*DO I = 1,NSTEMP = STEMP + DCABS1(ZX(I))END DOELSE** code for increment not equal to 1*NINCX = N*INCXDO I = 1,NINCX,INCXSTEMP = STEMP + DCABS1(ZX(I))END DOEND IFDZASUM = STEMPRETURN** End of DZASUM*END*> \brief \b IZAMAX** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** INTEGER FUNCTION IZAMAX(N,ZX,INCX)** .. Scalar Arguments ..* INTEGER INCX,N* ..* .. Array Arguments ..* DOUBLE COMPLEX ZX(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> IZAMAX finds the index of the first element having maximum |Re(.)| + |Im(.)|*> \endverbatim** Arguments:* ==========**> \param[in] N*> \verbatim*> N is INTEGER*> number of elements in input vector(s)*> \endverbatim*>*> \param[in] ZX*> \verbatim*> ZX is DOUBLE COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCX ) )*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> storage spacing between elements of ZX*> \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, 1/15/85.*> modified 3/93 to return if incx .le. 0.*> modified 12/3/93, array(1) declarations changed to array(*)*> \endverbatim*>* =====================================================================INTEGER FUNCTION IZAMAX(N,ZX,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 COMPLEX ZX(*)* ..** =====================================================================** .. Local Scalars ..DOUBLE PRECISION DMAXINTEGER I,IX* ..* .. External Functions ..DOUBLE PRECISION DCABS1EXTERNAL DCABS1* ..IZAMAX = 0IF (N.LT.1 .OR. INCX.LE.0) RETURNIZAMAX = 1IF (N.EQ.1) RETURNIF (INCX.EQ.1) THEN** code for increment equal to 1*DMAX = DCABS1(ZX(1))DO I = 2,NIF (DCABS1(ZX(I)).GT.DMAX) THENIZAMAX = IDMAX = DCABS1(ZX(I))END IFEND DOELSE** code for increment not equal to 1*IX = 1DMAX = DCABS1(ZX(1))IX = IX + INCXDO I = 2,NIF (DCABS1(ZX(IX)).GT.DMAX) THENIZAMAX = IDMAX = DCABS1(ZX(IX))END IFIX = IX + INCXEND DOEND IFRETURN** End of IZAMAX*END*> \brief \b ZAXPY** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZAXPY(N,ZA,ZX,INCX,ZY,INCY)** .. Scalar Arguments ..* DOUBLE COMPLEX ZA* INTEGER INCX,INCY,N* ..* .. Array Arguments ..* DOUBLE COMPLEX ZX(*),ZY(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZAXPY constant times a vector plus a vector.*> \endverbatim** Arguments:* ==========**> \param[in] N*> \verbatim*> N is INTEGER*> number of elements in input vector(s)*> \endverbatim*>*> \param[in] ZA*> \verbatim*> ZA is DOUBLE COMPLEX*> On entry, ZA specifies the scalar alpha.*> \endverbatim*>*> \param[in] ZX*> \verbatim*> ZX is DOUBLE COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCX ) )*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> storage spacing between elements of ZX*> \endverbatim*>*> \param[in,out] ZY*> \verbatim*> ZY is DOUBLE COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCY ) )*> \endverbatim*>*> \param[in] INCY*> \verbatim*> INCY is INTEGER*> storage spacing between elements of ZY*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup complex16_blas_level1**> \par Further Details:* =====================*>*> \verbatim*>*> jack dongarra, 3/11/78.*> modified 12/3/93, array(1) declarations changed to array(*)*> \endverbatim*>* =====================================================================SUBROUTINE ZAXPY(N,ZA,ZX,INCX,ZY,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 COMPLEX ZAINTEGER INCX,INCY,N* ..* .. Array Arguments ..DOUBLE COMPLEX ZX(*),ZY(*)* ..** =====================================================================** .. Local Scalars ..INTEGER I,IX,IY* ..* .. External Functions ..DOUBLE PRECISION DCABS1EXTERNAL DCABS1* ..IF (N.LE.0) RETURNIF (DCABS1(ZA).EQ.0.0d0) RETURNIF (INCX.EQ.1 .AND. INCY.EQ.1) THEN** code for both increments equal to 1*DO I = 1,NZY(I) = ZY(I) + ZA*ZX(I)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,NZY(IY) = ZY(IY) + ZA*ZX(IX)IX = IX + INCXIY = IY + INCYEND DOEND IF*RETURN** End of ZAXPY*END*> \brief \b ZCOPY** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZCOPY(N,ZX,INCX,ZY,INCY)** .. Scalar Arguments ..* INTEGER INCX,INCY,N* ..* .. Array Arguments ..* DOUBLE COMPLEX ZX(*),ZY(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZCOPY copies a vector, x, to a vector, y.*> \endverbatim** Arguments:* ==========**> \param[in] N*> \verbatim*> N is INTEGER*> number of elements in input vector(s)*> \endverbatim*>*> \param[in] ZX*> \verbatim*> ZX is DOUBLE COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCX ) )*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> storage spacing between elements of ZX*> \endverbatim*>*> \param[out] ZY*> \verbatim*> ZY is DOUBLE COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCY ) )*> \endverbatim*>*> \param[in] INCY*> \verbatim*> INCY is INTEGER*> storage spacing between elements of ZY*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup complex16_blas_level1**> \par Further Details:* =====================*>*> \verbatim*>*> jack dongarra, linpack, 4/11/78.*> modified 12/3/93, array(1) declarations changed to array(*)*> \endverbatim*>* =====================================================================SUBROUTINE ZCOPY(N,ZX,INCX,ZY,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 COMPLEX ZX(*),ZY(*)* ..** =====================================================================** .. Local Scalars ..INTEGER 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,NZY(I) = ZX(I)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,NZY(IY) = ZX(IX)IX = IX + INCXIY = IY + INCYEND DOEND IFRETURN** End of ZCOPY*END*> \brief \b ZDOTC** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** DOUBLE COMPLEX FUNCTION ZDOTC(N,ZX,INCX,ZY,INCY)** .. Scalar Arguments ..* INTEGER INCX,INCY,N* ..* .. Array Arguments ..* DOUBLE COMPLEX ZX(*),ZY(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZDOTC forms the dot product of two complex vectors*> ZDOTC = X^H * Y*>*> \endverbatim** Arguments:* ==========**> \param[in] N*> \verbatim*> N is INTEGER*> number of elements in input vector(s)*> \endverbatim*>*> \param[in] ZX*> \verbatim*> ZX is DOUBLE COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCX ) )*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> storage spacing between elements of ZX*> \endverbatim*>*> \param[in] ZY*> \verbatim*> ZY is DOUBLE COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCY ) )*> \endverbatim*>*> \param[in] INCY*> \verbatim*> INCY is INTEGER*> storage spacing between elements of ZY*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup complex16_blas_level1**> \par Further Details:* =====================*>*> \verbatim*>*> jack dongarra, 3/11/78.*> modified 12/3/93, array(1) declarations changed to array(*)*> \endverbatim*>* =====================================================================DOUBLE COMPLEX FUNCTION ZDOTC(N,ZX,INCX,ZY,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 COMPLEX ZX(*),ZY(*)* ..** =====================================================================** .. Local Scalars ..DOUBLE COMPLEX ZTEMPINTEGER I,IX,IY* ..* .. Intrinsic Functions ..INTRINSIC DCONJG* ..ZTEMP = (0.0d0,0.0d0)ZDOTC = (0.0d0,0.0d0)IF (N.LE.0) RETURNIF (INCX.EQ.1 .AND. INCY.EQ.1) THEN** code for both increments equal to 1*DO I = 1,NZTEMP = ZTEMP + DCONJG(ZX(I))*ZY(I)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,NZTEMP = ZTEMP + DCONJG(ZX(IX))*ZY(IY)IX = IX + INCXIY = IY + INCYEND DOEND IFZDOTC = ZTEMPRETURN** End of ZDOTC*END*> \brief \b ZDOTU** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** DOUBLE COMPLEX FUNCTION ZDOTU(N,ZX,INCX,ZY,INCY)** .. Scalar Arguments ..* INTEGER INCX,INCY,N* ..* .. Array Arguments ..* DOUBLE COMPLEX ZX(*),ZY(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZDOTU forms the dot product of two complex vectors*> ZDOTU = X^T * Y*>*> \endverbatim** Arguments:* ==========**> \param[in] N*> \verbatim*> N is INTEGER*> number of elements in input vector(s)*> \endverbatim*>*> \param[in] ZX*> \verbatim*> ZX is DOUBLE COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCX ) )*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> storage spacing between elements of ZX*> \endverbatim*>*> \param[in] ZY*> \verbatim*> ZY is DOUBLE COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCY ) )*> \endverbatim*>*> \param[in] INCY*> \verbatim*> INCY is INTEGER*> storage spacing between elements of ZY*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup complex16_blas_level1**> \par Further Details:* =====================*>*> \verbatim*>*> jack dongarra, 3/11/78.*> modified 12/3/93, array(1) declarations changed to array(*)*> \endverbatim*>* =====================================================================DOUBLE COMPLEX FUNCTION ZDOTU(N,ZX,INCX,ZY,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 COMPLEX ZX(*),ZY(*)* ..** =====================================================================** .. Local Scalars ..DOUBLE COMPLEX ZTEMPINTEGER I,IX,IY* ..ZTEMP = (0.0d0,0.0d0)ZDOTU = (0.0d0,0.0d0)IF (N.LE.0) RETURNIF (INCX.EQ.1 .AND. INCY.EQ.1) THEN** code for both increments equal to 1*DO I = 1,NZTEMP = ZTEMP + ZX(I)*ZY(I)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,NZTEMP = ZTEMP + ZX(IX)*ZY(IY)IX = IX + INCXIY = IY + INCYEND DOEND IFZDOTU = ZTEMPRETURN** End of ZDOTU*END*> \brief \b ZDROT** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZDROT( N, ZX, INCX, ZY, INCY, C, S )** .. Scalar Arguments ..* INTEGER INCX, INCY, N* DOUBLE PRECISION C, S* ..* .. Array Arguments ..* DOUBLE COMPLEX ZX( * ), ZY( * )* ..***> \par Purpose:* =============*>*> \verbatim*>*> Applies a plane rotation, where the cos and sin (c and s) are real*> and the vectors cx and cy are complex.*> jack dongarra, linpack, 3/11/78.*> \endverbatim** Arguments:* ==========**> \param[in] N*> \verbatim*> N is INTEGER*> On entry, N specifies the order of the vectors cx and cy.*> N must be at least zero.*> \endverbatim*>*> \param[in,out] ZX*> \verbatim*> ZX is DOUBLE COMPLEX array, dimension at least*> ( 1 + ( N - 1 )*abs( INCX ) ).*> Before entry, the incremented array ZX must contain the n*> element vector cx. On exit, ZX is overwritten by the updated*> vector cx.*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> On entry, INCX specifies the increment for the elements of*> ZX. INCX must not be zero.*> \endverbatim*>*> \param[in,out] ZY*> \verbatim*> ZY is DOUBLE COMPLEX array, dimension at least*> ( 1 + ( N - 1 )*abs( INCY ) ).*> Before entry, the incremented array ZY must contain the n*> element vector cy. On exit, ZY is overwritten by the updated*> vector cy.*> \endverbatim*>*> \param[in] INCY*> \verbatim*> INCY is INTEGER*> On entry, INCY specifies the increment for the elements of*> ZY. INCY must not be zero.*> \endverbatim*>*> \param[in] C*> \verbatim*> C is DOUBLE PRECISION*> On entry, C specifies the cosine, cos.*> \endverbatim*>*> \param[in] S*> \verbatim*> S is DOUBLE PRECISION*> On entry, S specifies the sine, sin.*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup complex16_blas_level1** =====================================================================SUBROUTINE ZDROT( N, ZX, INCX, ZY, 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 ..INTEGER INCX, INCY, NDOUBLE PRECISION C, S* ..* .. Array Arguments ..DOUBLE COMPLEX ZX( * ), ZY( * )* ..** =====================================================================** .. Local Scalars ..INTEGER I, IX, IYDOUBLE COMPLEX CTEMP* ..* .. Executable Statements ..*IF( N.LE.0 )$ RETURNIF( INCX.EQ.1 .AND. INCY.EQ.1 ) THEN** code for both increments equal to 1*DO I = 1, NCTEMP = C*ZX( I ) + S*ZY( I )ZY( I ) = C*ZY( I ) - S*ZX( I )ZX( I ) = CTEMPEND 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, NCTEMP = C*ZX( IX ) + S*ZY( IY )ZY( IY ) = C*ZY( IY ) - S*ZX( IX )ZX( IX ) = CTEMPIX = IX + INCXIY = IY + INCYEND DOEND IFRETURN** End of ZDROT*END*> \brief \b ZDSCAL** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZDSCAL(N,DA,ZX,INCX)** .. Scalar Arguments ..* DOUBLE PRECISION DA* INTEGER INCX,N* ..* .. Array Arguments ..* DOUBLE COMPLEX ZX(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZDSCAL scales a vector by a constant.*> \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] ZX*> \verbatim*> ZX is DOUBLE COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCX ) )*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> storage spacing between elements of ZX*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup complex16_blas_level1**> \par Further Details:* =====================*>*> \verbatim*>*> jack dongarra, 3/11/78.*> modified 3/93 to return if incx .le. 0.*> modified 12/3/93, array(1) declarations changed to array(*)*> \endverbatim*>* =====================================================================SUBROUTINE ZDSCAL(N,DA,ZX,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 COMPLEX ZX(*)* ..** =====================================================================** .. Local Scalars ..INTEGER I,NINCX* ..* .. Intrinsic Functions ..INTRINSIC DBLE, DCMPLX, DIMAG* ..IF (N.LE.0 .OR. INCX.LE.0) RETURNIF (INCX.EQ.1) THEN** code for increment equal to 1*DO I = 1,NZX(I) = DCMPLX(DA*DBLE(ZX(I)),DA*DIMAG(ZX(I)))END DOELSE** code for increment not equal to 1*NINCX = N*INCXDO I = 1,NINCX,INCXZX(I) = DCMPLX(DA*DBLE(ZX(I)),DA*DIMAG(ZX(I)))END DOEND IFRETURN** End of ZDSCAL*END*> \brief \b ZGBMV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZGBMV(TRANS,M,N,KL,KU,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)** .. Scalar Arguments ..* DOUBLE COMPLEX ALPHA,BETA* INTEGER INCX,INCY,KL,KU,LDA,M,N* CHARACTER TRANS* ..* .. Array Arguments ..* DOUBLE COMPLEX A(LDA,*),X(*),Y(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZGBMV performs one of the matrix-vector operations*>*> y := alpha*A*x + beta*y, or y := alpha*A**T*x + beta*y, or*>*> y := alpha*A**H*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**H*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 COMPLEX*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE COMPLEX 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 COMPLEX 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 COMPLEX*> 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 COMPLEX 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 complex16_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 ZGBMV(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 COMPLEX ALPHA,BETAINTEGER INCX,INCY,KL,KU,LDA,M,NCHARACTER TRANS* ..* .. Array Arguments ..DOUBLE COMPLEX A(LDA,*),X(*),Y(*)* ..** =====================================================================** .. Parameters ..DOUBLE COMPLEX ONEPARAMETER (ONE= (1.0D+0,0.0D+0))DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,0.0D+0))* ..* .. Local Scalars ..DOUBLE COMPLEX TEMPINTEGER I,INFO,IX,IY,J,JX,JY,K,KUP1,KX,KY,LENX,LENYLOGICAL NOCONJ* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC DCONJG,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('ZGBMV ',INFO)RETURNEND IF** Quick return if possible.*IF ((M.EQ.0) .OR. (N.EQ.0) .OR.+ ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN*NOCONJ = LSAME(TRANS,'T')** 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 or y := alpha*A**H*x + y.*JY = KYIF (INCX.EQ.1) THENDO 110 J = 1,NTEMP = ZEROK = KUP1 - JIF (NOCONJ) THENDO 90 I = MAX(1,J-KU),MIN(M,J+KL)TEMP = TEMP + A(K+I,J)*X(I)90 CONTINUEELSEDO 100 I = MAX(1,J-KU),MIN(M,J+KL)TEMP = TEMP + DCONJG(A(K+I,J))*X(I)100 CONTINUEEND IFY(JY) = Y(JY) + ALPHA*TEMPJY = JY + INCY110 CONTINUEELSEDO 140 J = 1,NTEMP = ZEROIX = KXK = KUP1 - JIF (NOCONJ) THENDO 120 I = MAX(1,J-KU),MIN(M,J+KL)TEMP = TEMP + A(K+I,J)*X(IX)IX = IX + INCX120 CONTINUEELSEDO 130 I = MAX(1,J-KU),MIN(M,J+KL)TEMP = TEMP + DCONJG(A(K+I,J))*X(IX)IX = IX + INCX130 CONTINUEEND IFY(JY) = Y(JY) + ALPHA*TEMPJY = JY + INCYIF (J.GT.KU) KX = KX + INCX140 CONTINUEEND IFEND IF*RETURN** End of ZGBMV*END*> \brief \b ZGEMM** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZGEMM(TRANSA,TRANSB,M,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC)** .. Scalar Arguments ..* DOUBLE COMPLEX ALPHA,BETA* INTEGER K,LDA,LDB,LDC,M,N* CHARACTER TRANSA,TRANSB* ..* .. Array Arguments ..* DOUBLE COMPLEX A(LDA,*),B(LDB,*),C(LDC,*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZGEMM 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 or op( X ) = X**H,*>*> 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**H.*> \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**H.*> \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 COMPLEX*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE COMPLEX 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 COMPLEX 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 COMPLEX*> 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 COMPLEX 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 complex16_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 ZGEMM(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 COMPLEX ALPHA,BETAINTEGER K,LDA,LDB,LDC,M,NCHARACTER TRANSA,TRANSB* ..* .. Array Arguments ..DOUBLE COMPLEX A(LDA,*),B(LDB,*),C(LDC,*)* ..** =====================================================================** .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC DCONJG,MAX* ..* .. Local Scalars ..DOUBLE COMPLEX TEMPINTEGER I,INFO,J,L,NROWA,NROWBLOGICAL CONJA,CONJB,NOTA,NOTB* ..* .. Parameters ..DOUBLE COMPLEX ONEPARAMETER (ONE= (1.0D+0,0.0D+0))DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,0.0D+0))* ..** Set NOTA and NOTB as true if A and B respectively are not* conjugated or transposed, set CONJA and CONJB as true if A and* B respectively are to be transposed but not conjugated and set* NROWA and NROWB as the number of rows of A and B respectively.*NOTA = LSAME(TRANSA,'N')NOTB = LSAME(TRANSB,'N')CONJA = LSAME(TRANSA,'C')CONJB = LSAME(TRANSB,'C')IF (NOTA) THENNROWA = MELSENROWA = KEND IFIF (NOTB) THENNROWB = KELSENROWB = NEND IF** Test the input parameters.*INFO = 0IF ((.NOT.NOTA) .AND. (.NOT.CONJA) .AND.+ (.NOT.LSAME(TRANSA,'T'))) THENINFO = 1ELSE IF ((.NOT.NOTB) .AND. (.NOT.CONJB) .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('ZGEMM ',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 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 (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 IF (CONJA) THEN** Form C := alpha*A**H*B + beta*C.*DO 120 J = 1,NDO 110 I = 1,MTEMP = ZERODO 100 L = 1,KTEMP = TEMP + DCONJG(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 CONTINUEELSE** Form C := alpha*A**T*B + beta*C*DO 150 J = 1,NDO 140 I = 1,MTEMP = ZERODO 130 L = 1,KTEMP = TEMP + A(L,I)*B(L,J)130 CONTINUEIF (BETA.EQ.ZERO) THENC(I,J) = ALPHA*TEMPELSEC(I,J) = ALPHA*TEMP + BETA*C(I,J)END IF140 CONTINUE150 CONTINUEEND IFELSE IF (NOTA) THENIF (CONJB) THEN** Form C := alpha*A*B**H + beta*C.*DO 200 J = 1,NIF (BETA.EQ.ZERO) THENDO 160 I = 1,MC(I,J) = ZERO160 CONTINUEELSE IF (BETA.NE.ONE) THENDO 170 I = 1,MC(I,J) = BETA*C(I,J)170 CONTINUEEND IFDO 190 L = 1,KTEMP = ALPHA*DCONJG(B(J,L))DO 180 I = 1,MC(I,J) = C(I,J) + TEMP*A(I,L)180 CONTINUE190 CONTINUE200 CONTINUEELSE** Form C := alpha*A*B**T + beta*C*DO 250 J = 1,NIF (BETA.EQ.ZERO) THENDO 210 I = 1,MC(I,J) = ZERO210 CONTINUEELSE IF (BETA.NE.ONE) THENDO 220 I = 1,MC(I,J) = BETA*C(I,J)220 CONTINUEEND IFDO 240 L = 1,KTEMP = ALPHA*B(J,L)DO 230 I = 1,MC(I,J) = C(I,J) + TEMP*A(I,L)230 CONTINUE240 CONTINUE250 CONTINUEEND IFELSE IF (CONJA) THENIF (CONJB) THEN** Form C := alpha*A**H*B**H + beta*C.*DO 280 J = 1,NDO 270 I = 1,MTEMP = ZERODO 260 L = 1,KTEMP = TEMP + DCONJG(A(L,I))*DCONJG(B(J,L))260 CONTINUEIF (BETA.EQ.ZERO) THENC(I,J) = ALPHA*TEMPELSEC(I,J) = ALPHA*TEMP + BETA*C(I,J)END IF270 CONTINUE280 CONTINUEELSE** Form C := alpha*A**H*B**T + beta*C*DO 310 J = 1,NDO 300 I = 1,MTEMP = ZERODO 290 L = 1,KTEMP = TEMP + DCONJG(A(L,I))*B(J,L)290 CONTINUEIF (BETA.EQ.ZERO) THENC(I,J) = ALPHA*TEMPELSEC(I,J) = ALPHA*TEMP + BETA*C(I,J)END IF300 CONTINUE310 CONTINUEEND IFELSEIF (CONJB) THEN** Form C := alpha*A**T*B**H + beta*C*DO 340 J = 1,NDO 330 I = 1,MTEMP = ZERODO 320 L = 1,KTEMP = TEMP + A(L,I)*DCONJG(B(J,L))320 CONTINUEIF (BETA.EQ.ZERO) THENC(I,J) = ALPHA*TEMPELSEC(I,J) = ALPHA*TEMP + BETA*C(I,J)END IF330 CONTINUE340 CONTINUEELSE** Form C := alpha*A**T*B**T + beta*C*DO 370 J = 1,NDO 360 I = 1,MTEMP = ZERODO 350 L = 1,KTEMP = TEMP + A(L,I)*B(J,L)350 CONTINUEIF (BETA.EQ.ZERO) THENC(I,J) = ALPHA*TEMPELSEC(I,J) = ALPHA*TEMP + BETA*C(I,J)END IF360 CONTINUE370 CONTINUEEND IFEND IF*RETURN** End of ZGEMM*END*> \brief \b ZGEMV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)** .. Scalar Arguments ..* DOUBLE COMPLEX ALPHA,BETA* INTEGER INCX,INCY,LDA,M,N* CHARACTER TRANS* ..* .. Array Arguments ..* DOUBLE COMPLEX A(LDA,*),X(*),Y(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZGEMV performs one of the matrix-vector operations*>*> y := alpha*A*x + beta*y, or y := alpha*A**T*x + beta*y, or*>*> y := alpha*A**H*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**H*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 COMPLEX*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE COMPLEX 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 COMPLEX 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 COMPLEX*> 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 COMPLEX 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 complex16_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 ZGEMV(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 COMPLEX ALPHA,BETAINTEGER INCX,INCY,LDA,M,NCHARACTER TRANS* ..* .. Array Arguments ..DOUBLE COMPLEX A(LDA,*),X(*),Y(*)* ..** =====================================================================** .. Parameters ..DOUBLE COMPLEX ONEPARAMETER (ONE= (1.0D+0,0.0D+0))DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,0.0D+0))* ..* .. Local Scalars ..DOUBLE COMPLEX TEMPINTEGER I,INFO,IX,IY,J,JX,JY,KX,KY,LENX,LENYLOGICAL NOCONJ* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC DCONJG,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('ZGEMV ',INFO)RETURNEND IF** Quick return if possible.*IF ((M.EQ.0) .OR. (N.EQ.0) .OR.+ ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN*NOCONJ = LSAME(TRANS,'T')** 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 or y := alpha*A**H*x + y.*JY = KYIF (INCX.EQ.1) THENDO 110 J = 1,NTEMP = ZEROIF (NOCONJ) THENDO 90 I = 1,MTEMP = TEMP + A(I,J)*X(I)90 CONTINUEELSEDO 100 I = 1,MTEMP = TEMP + DCONJG(A(I,J))*X(I)100 CONTINUEEND IFY(JY) = Y(JY) + ALPHA*TEMPJY = JY + INCY110 CONTINUEELSEDO 140 J = 1,NTEMP = ZEROIX = KXIF (NOCONJ) THENDO 120 I = 1,MTEMP = TEMP + A(I,J)*X(IX)IX = IX + INCX120 CONTINUEELSEDO 130 I = 1,MTEMP = TEMP + DCONJG(A(I,J))*X(IX)IX = IX + INCX130 CONTINUEEND IFY(JY) = Y(JY) + ALPHA*TEMPJY = JY + INCY140 CONTINUEEND IFEND IF*RETURN** End of ZGEMV*END*> \brief \b ZGERC** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZGERC(M,N,ALPHA,X,INCX,Y,INCY,A,LDA)** .. Scalar Arguments ..* DOUBLE COMPLEX ALPHA* INTEGER INCX,INCY,LDA,M,N* ..* .. Array Arguments ..* DOUBLE COMPLEX A(LDA,*),X(*),Y(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZGERC performs the rank 1 operation*>*> A := alpha*x*y**H + 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 COMPLEX*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] X*> \verbatim*> X is DOUBLE COMPLEX 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 COMPLEX 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 COMPLEX 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 complex16_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 ZGERC(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 COMPLEX ALPHAINTEGER INCX,INCY,LDA,M,N* ..* .. Array Arguments ..DOUBLE COMPLEX A(LDA,*),X(*),Y(*)* ..** =====================================================================** .. Parameters ..DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,0.0D+0))* ..* .. Local Scalars ..DOUBLE COMPLEX TEMPINTEGER I,INFO,IX,J,JY,KX* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC DCONJG,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('ZGERC ',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*DCONJG(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*DCONJG(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 ZGERC*END*> \brief \b ZGERU** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZGERU(M,N,ALPHA,X,INCX,Y,INCY,A,LDA)** .. Scalar Arguments ..* DOUBLE COMPLEX ALPHA* INTEGER INCX,INCY,LDA,M,N* ..* .. Array Arguments ..* DOUBLE COMPLEX A(LDA,*),X(*),Y(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZGERU 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 COMPLEX*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] X*> \verbatim*> X is DOUBLE COMPLEX 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 COMPLEX 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 COMPLEX 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 complex16_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 ZGERU(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 COMPLEX ALPHAINTEGER INCX,INCY,LDA,M,N* ..* .. Array Arguments ..DOUBLE COMPLEX A(LDA,*),X(*),Y(*)* ..** =====================================================================** .. Parameters ..DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,0.0D+0))* ..* .. Local Scalars ..DOUBLE COMPLEX 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('ZGERU ',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 ZGERU*END*> \brief \b ZHBMV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZHBMV(UPLO,N,K,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)** .. Scalar Arguments ..* DOUBLE COMPLEX ALPHA,BETA* INTEGER INCX,INCY,K,LDA,N* CHARACTER UPLO* ..* .. Array Arguments ..* DOUBLE COMPLEX A(LDA,*),X(*),Y(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZHBMV 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 hermitian 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 COMPLEX*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE COMPLEX 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 hermitian 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 hermitian 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 hermitian 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 hermitian 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 the imaginary parts of the diagonal elements need*> not be set and are assumed to be zero.*> \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 COMPLEX 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 COMPLEX*> On entry, BETA specifies the scalar beta.*> \endverbatim*>*> \param[in,out] Y*> \verbatim*> Y is DOUBLE COMPLEX 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 complex16_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 ZHBMV(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 COMPLEX ALPHA,BETAINTEGER INCX,INCY,K,LDA,NCHARACTER UPLO* ..* .. Array Arguments ..DOUBLE COMPLEX A(LDA,*),X(*),Y(*)* ..** =====================================================================** .. Parameters ..DOUBLE COMPLEX ONEPARAMETER (ONE= (1.0D+0,0.0D+0))DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,0.0D+0))* ..* .. Local Scalars ..DOUBLE COMPLEX 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 DBLE,DCONJG,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('ZHBMV ',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 + DCONJG(A(L+I,J))*X(I)50 CONTINUEY(J) = Y(J) + TEMP1*DBLE(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 + DCONJG(A(L+I,J))*X(IX)IX = IX + INCXIY = IY + INCY70 CONTINUEY(JY) = Y(JY) + TEMP1*DBLE(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*DBLE(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 + DCONJG(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*DBLE(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 + DCONJG(A(L+I,J))*X(IX)110 CONTINUEY(JY) = Y(JY) + ALPHA*TEMP2JX = JX + INCXJY = JY + INCY120 CONTINUEEND IFEND IF*RETURN** End of ZHBMV*END*> \brief \b ZHEMM** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZHEMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC)** .. Scalar Arguments ..* DOUBLE COMPLEX ALPHA,BETA* INTEGER LDA,LDB,LDC,M,N* CHARACTER SIDE,UPLO* ..* .. Array Arguments ..* DOUBLE COMPLEX A(LDA,*),B(LDB,*),C(LDC,*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZHEMM 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 an hermitian 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 hermitian 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 hermitian matrix A is to be*> referenced as follows:*>*> UPLO = 'U' or 'u' Only the upper triangular part of the*> hermitian matrix is to be referenced.*>*> UPLO = 'L' or 'l' Only the lower triangular part of the*> hermitian 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 COMPLEX*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE COMPLEX 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 hermitian 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 hermitian 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 hermitian*> 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 hermitian 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 hermitian 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 hermitian*> matrix and the strictly upper triangular part of A is not*> referenced.*> Note that the imaginary parts of the diagonal elements need*> not be set, they are assumed to be zero.*> \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 COMPLEX 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 COMPLEX*> 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 COMPLEX 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 complex16_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 ZHEMM(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 COMPLEX ALPHA,BETAINTEGER LDA,LDB,LDC,M,NCHARACTER SIDE,UPLO* ..* .. Array Arguments ..DOUBLE COMPLEX A(LDA,*),B(LDB,*),C(LDC,*)* ..** =====================================================================** .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC DBLE,DCONJG,MAX* ..* .. Local Scalars ..DOUBLE COMPLEX TEMP1,TEMP2INTEGER I,INFO,J,K,NROWALOGICAL UPPER* ..* .. Parameters ..DOUBLE COMPLEX ONEPARAMETER (ONE= (1.0D+0,0.0D+0))DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,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('ZHEMM ',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)*DCONJG(A(K,I))50 CONTINUEIF (BETA.EQ.ZERO) THENC(I,J) = TEMP1*DBLE(A(I,I)) + ALPHA*TEMP2ELSEC(I,J) = BETA*C(I,J) + TEMP1*DBLE(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)*DCONJG(A(K,I))80 CONTINUEIF (BETA.EQ.ZERO) THENC(I,J) = TEMP1*DBLE(A(I,I)) + ALPHA*TEMP2ELSEC(I,J) = BETA*C(I,J) + TEMP1*DBLE(A(I,I)) ++ ALPHA*TEMP2END IF90 CONTINUE100 CONTINUEEND IFELSE** Form C := alpha*B*A + beta*C.*DO 170 J = 1,NTEMP1 = ALPHA*DBLE(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*DCONJG(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*DCONJG(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 ZHEMM*END*> \brief \b ZHEMV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZHEMV(UPLO,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)** .. Scalar Arguments ..* DOUBLE COMPLEX ALPHA,BETA* INTEGER INCX,INCY,LDA,N* CHARACTER UPLO* ..* .. Array Arguments ..* DOUBLE COMPLEX A(LDA,*),X(*),Y(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZHEMV 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 hermitian 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 COMPLEX*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE COMPLEX 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 hermitian 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 hermitian matrix and the strictly*> upper triangular part of A is not referenced.*> Note that the imaginary parts of the diagonal elements need*> not be set and are assumed to be zero.*> \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 COMPLEX 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 COMPLEX*> 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 COMPLEX 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 complex16_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 ZHEMV(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 COMPLEX ALPHA,BETAINTEGER INCX,INCY,LDA,NCHARACTER UPLO* ..* .. Array Arguments ..DOUBLE COMPLEX A(LDA,*),X(*),Y(*)* ..** =====================================================================** .. Parameters ..DOUBLE COMPLEX ONEPARAMETER (ONE= (1.0D+0,0.0D+0))DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,0.0D+0))* ..* .. Local Scalars ..DOUBLE COMPLEX TEMP1,TEMP2INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC DBLE,DCONJG,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('ZHEMV ',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 + DCONJG(A(I,J))*X(I)50 CONTINUEY(J) = Y(J) + TEMP1*DBLE(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 + DCONJG(A(I,J))*X(IX)IX = IX + INCXIY = IY + INCY70 CONTINUEY(JY) = Y(JY) + TEMP1*DBLE(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*DBLE(A(J,J))DO 90 I = J + 1,NY(I) = Y(I) + TEMP1*A(I,J)TEMP2 = TEMP2 + DCONJG(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*DBLE(A(J,J))IX = JXIY = JYDO 110 I = J + 1,NIX = IX + INCXIY = IY + INCYY(IY) = Y(IY) + TEMP1*A(I,J)TEMP2 = TEMP2 + DCONJG(A(I,J))*X(IX)110 CONTINUEY(JY) = Y(JY) + ALPHA*TEMP2JX = JX + INCXJY = JY + INCY120 CONTINUEEND IFEND IF*RETURN** End of ZHEMV*END*> \brief \b ZHER2** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZHER2(UPLO,N,ALPHA,X,INCX,Y,INCY,A,LDA)** .. Scalar Arguments ..* DOUBLE COMPLEX ALPHA* INTEGER INCX,INCY,LDA,N* CHARACTER UPLO* ..* .. Array Arguments ..* DOUBLE COMPLEX A(LDA,*),X(*),Y(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZHER2 performs the hermitian rank 2 operation*>*> A := alpha*x*y**H + conjg( alpha )*y*x**H + A,*>*> where alpha is a scalar, x and y are n element vectors and A is an n*> by n hermitian 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 COMPLEX*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] X*> \verbatim*> X is DOUBLE COMPLEX 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 COMPLEX 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 COMPLEX 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 hermitian matrix and the strictly*> lower triangular part of A is not referenced. On exit, the*> upper triangular part of the array A is overwritten by the*> upper triangular part of the updated matrix.*> Before entry with UPLO = 'L' or 'l', the leading n by n*> lower triangular part of the array A must contain the lower*> triangular part of the hermitian matrix and the strictly*> upper triangular part of A is not referenced. On exit, the*> lower triangular part of the array A is overwritten by the*> lower triangular part of the updated matrix.*> Note that the imaginary parts of the diagonal elements need*> not be set, they are assumed to be zero, and on exit they*> are set to zero.*> \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 complex16_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 ZHER2(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 COMPLEX ALPHAINTEGER INCX,INCY,LDA,NCHARACTER UPLO* ..* .. Array Arguments ..DOUBLE COMPLEX A(LDA,*),X(*),Y(*)* ..** =====================================================================** .. Parameters ..DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,0.0D+0))* ..* .. Local Scalars ..DOUBLE COMPLEX TEMP1,TEMP2INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC DBLE,DCONJG,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('ZHER2 ',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*DCONJG(Y(J))TEMP2 = DCONJG(ALPHA*X(J))DO 10 I = 1,J - 1A(I,J) = A(I,J) + X(I)*TEMP1 + Y(I)*TEMP210 CONTINUEA(J,J) = DBLE(A(J,J)) ++ DBLE(X(J)*TEMP1+Y(J)*TEMP2)c ELSEc A(J,J) = DBLE(A(J,J))c END IF20 CONTINUEELSEDO 40 J = 1,Nc IF ((X(JX).NE.ZERO) .OR. (Y(JY).NE.ZERO)) THENTEMP1 = ALPHA*DCONJG(Y(JY))TEMP2 = DCONJG(ALPHA*X(JX))IX = KXIY = KYDO 30 I = 1,J - 1A(I,J) = A(I,J) + X(IX)*TEMP1 + Y(IY)*TEMP2IX = IX + INCXIY = IY + INCY30 CONTINUEA(J,J) = DBLE(A(J,J)) ++ DBLE(X(JX)*TEMP1+Y(JY)*TEMP2)c ELSEc A(J,J) = DBLE(A(J,J))c 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*DCONJG(Y(J))TEMP2 = DCONJG(ALPHA*X(J))A(J,J) = DBLE(A(J,J)) ++ DBLE(X(J)*TEMP1+Y(J)*TEMP2)DO 50 I = J + 1,NA(I,J) = A(I,J) + X(I)*TEMP1 + Y(I)*TEMP250 CONTINUEc ELSEc A(J,J) = DBLE(A(J,J))c END IF60 CONTINUEELSEDO 80 J = 1,Nc IF ((X(JX).NE.ZERO) .OR. (Y(JY).NE.ZERO)) THENTEMP1 = ALPHA*DCONJG(Y(JY))TEMP2 = DCONJG(ALPHA*X(JX))A(J,J) = DBLE(A(J,J)) ++ DBLE(X(JX)*TEMP1+Y(JY)*TEMP2)IX = JXIY = JYDO 70 I = J + 1,NIX = IX + INCXIY = IY + INCYA(I,J) = A(I,J) + X(IX)*TEMP1 + Y(IY)*TEMP270 CONTINUEc ELSEc A(J,J) = DBLE(A(J,J))c END IFJX = JX + INCXJY = JY + INCY80 CONTINUEEND IFEND IF*RETURN** End of ZHER2*END*> \brief \b ZHER2K** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZHER2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC)** .. Scalar Arguments ..* DOUBLE COMPLEX ALPHA* DOUBLE PRECISION BETA* INTEGER K,LDA,LDB,LDC,N* CHARACTER TRANS,UPLO* ..* .. Array Arguments ..* DOUBLE COMPLEX A(LDA,*),B(LDB,*),C(LDC,*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZHER2K performs one of the hermitian rank 2k operations*>*> C := alpha*A*B**H + conjg( alpha )*B*A**H + beta*C,*>*> or*>*> C := alpha*A**H*B + conjg( alpha )*B**H*A + beta*C,*>*> where alpha and beta are scalars with beta real, C is an n by n*> hermitian 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**H +*> conjg( alpha )*B*A**H +*> beta*C.*>*> TRANS = 'C' or 'c' C := alpha*A**H*B +*> conjg( alpha )*B**H*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 = '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 COMPLEX .*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE COMPLEX 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 COMPLEX 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 ).*> Unchanged on exit.*> \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 COMPLEX 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 hermitian 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 hermitian 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.*> Note that the imaginary parts of the diagonal elements need*> not be set, they are assumed to be zero, and on exit they*> are set to zero.*> \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 complex16_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.*>*> -- Modified 8-Nov-93 to set C(J,J) to DBLE( C(J,J) ) when BETA = 1.*> Ed Anderson, Cray Research Inc.*> \endverbatim*>* =====================================================================SUBROUTINE ZHER2K(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 COMPLEX ALPHADOUBLE PRECISION BETAINTEGER K,LDA,LDB,LDC,NCHARACTER TRANS,UPLO* ..* .. Array Arguments ..DOUBLE COMPLEX A(LDA,*),B(LDB,*),C(LDC,*)* ..** =====================================================================** .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC DBLE,DCONJG,MAX* ..* .. Local Scalars ..DOUBLE COMPLEX TEMP1,TEMP2INTEGER I,INFO,J,L,NROWALOGICAL UPPER* ..* .. Parameters ..DOUBLE PRECISION ONEPARAMETER (ONE=1.0D+0)DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,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,'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('ZHER2K',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.DBLE(ZERO)) THENDO 20 J = 1,NDO 10 I = 1,JC(I,J) = ZERO10 CONTINUE20 CONTINUEELSEDO 40 J = 1,NDO 30 I = 1,J - 1C(I,J) = BETA*C(I,J)30 CONTINUEC(J,J) = BETA*DBLE(C(J,J))40 CONTINUEEND IFELSEIF (BETA.EQ.DBLE(ZERO)) THENDO 60 J = 1,NDO 50 I = J,NC(I,J) = ZERO50 CONTINUE60 CONTINUEELSEDO 80 J = 1,NC(J,J) = BETA*DBLE(C(J,J))DO 70 I = J + 1,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**H + conjg( alpha )*B*A**H +* C.*IF (UPPER) THENDO 130 J = 1,NIF (BETA.EQ.DBLE(ZERO)) THENDO 90 I = 1,JC(I,J) = ZERO90 CONTINUEELSE IF (BETA.NE.ONE) THENDO 100 I = 1,J - 1C(I,J) = BETA*C(I,J)100 CONTINUEC(J,J) = BETA*DBLE(C(J,J))ELSEC(J,J) = DBLE(C(J,J))END IFDO 120 L = 1,Kc IF ((A(J,L).NE.ZERO) .OR. (B(J,L).NE.ZERO)) THENTEMP1 = ALPHA*DCONJG(B(J,L))TEMP2 = DCONJG(ALPHA*A(J,L))DO 110 I = 1,J - 1C(I,J) = C(I,J) + A(I,L)*TEMP1 ++ B(I,L)*TEMP2110 CONTINUEC(J,J) = DBLE(C(J,J)) ++ DBLE(A(J,L)*TEMP1+B(J,L)*TEMP2)c END IF120 CONTINUE130 CONTINUEELSEDO 180 J = 1,NIF (BETA.EQ.DBLE(ZERO)) THENDO 140 I = J,NC(I,J) = ZERO140 CONTINUEELSE IF (BETA.NE.ONE) THENDO 150 I = J + 1,NC(I,J) = BETA*C(I,J)150 CONTINUEC(J,J) = BETA*DBLE(C(J,J))ELSEC(J,J) = DBLE(C(J,J))END IFDO 170 L = 1,Kc IF ((A(J,L).NE.ZERO) .OR. (B(J,L).NE.ZERO)) THENTEMP1 = ALPHA*DCONJG(B(J,L))TEMP2 = DCONJG(ALPHA*A(J,L))DO 160 I = J + 1,NC(I,J) = C(I,J) + A(I,L)*TEMP1 ++ B(I,L)*TEMP2160 CONTINUEC(J,J) = DBLE(C(J,J)) ++ DBLE(A(J,L)*TEMP1+B(J,L)*TEMP2)c END IF170 CONTINUE180 CONTINUEEND IFELSE** Form C := alpha*A**H*B + conjg( alpha )*B**H*A +* C.*IF (UPPER) THENDO 210 J = 1,NDO 200 I = 1,JTEMP1 = ZEROTEMP2 = ZERODO 190 L = 1,KTEMP1 = TEMP1 + DCONJG(A(L,I))*B(L,J)TEMP2 = TEMP2 + DCONJG(B(L,I))*A(L,J)190 CONTINUEIF (I.EQ.J) THENIF (BETA.EQ.DBLE(ZERO)) THENC(J,J) = DBLE(ALPHA*TEMP1++ DCONJG(ALPHA)*TEMP2)ELSEC(J,J) = BETA*DBLE(C(J,J)) ++ DBLE(ALPHA*TEMP1++ DCONJG(ALPHA)*TEMP2)END IFELSEIF (BETA.EQ.DBLE(ZERO)) THENC(I,J) = ALPHA*TEMP1 + DCONJG(ALPHA)*TEMP2ELSEC(I,J) = BETA*C(I,J) + ALPHA*TEMP1 ++ DCONJG(ALPHA)*TEMP2END IFEND IF200 CONTINUE210 CONTINUEELSEDO 240 J = 1,NDO 230 I = J,NTEMP1 = ZEROTEMP2 = ZERODO 220 L = 1,KTEMP1 = TEMP1 + DCONJG(A(L,I))*B(L,J)TEMP2 = TEMP2 + DCONJG(B(L,I))*A(L,J)220 CONTINUEIF (I.EQ.J) THENIF (BETA.EQ.DBLE(ZERO)) THENC(J,J) = DBLE(ALPHA*TEMP1++ DCONJG(ALPHA)*TEMP2)ELSEC(J,J) = BETA*DBLE(C(J,J)) ++ DBLE(ALPHA*TEMP1++ DCONJG(ALPHA)*TEMP2)END IFELSEIF (BETA.EQ.DBLE(ZERO)) THENC(I,J) = ALPHA*TEMP1 + DCONJG(ALPHA)*TEMP2ELSEC(I,J) = BETA*C(I,J) + ALPHA*TEMP1 ++ DCONJG(ALPHA)*TEMP2END IFEND IF230 CONTINUE240 CONTINUEEND IFEND IF*RETURN** End of ZHER2K*END*> \brief \b ZHER** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZHER(UPLO,N,ALPHA,X,INCX,A,LDA)** .. Scalar Arguments ..* DOUBLE PRECISION ALPHA* INTEGER INCX,LDA,N* CHARACTER UPLO* ..* .. Array Arguments ..* DOUBLE COMPLEX A(LDA,*),X(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZHER performs the hermitian rank 1 operation*>*> A := alpha*x*x**H + A,*>*> where alpha is a real scalar, x is an n element vector and A is an*> n by n hermitian 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 COMPLEX 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 COMPLEX 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 hermitian matrix and the strictly*> lower triangular part of A is not referenced. On exit, the*> upper triangular part of the array A is overwritten by the*> upper triangular part of the updated matrix.*> Before entry with UPLO = 'L' or 'l', the leading n by n*> lower triangular part of the array A must contain the lower*> triangular part of the hermitian matrix and the strictly*> upper triangular part of A is not referenced. On exit, the*> lower triangular part of the array A is overwritten by the*> lower triangular part of the updated matrix.*> Note that the imaginary parts of the diagonal elements need*> not be set, they are assumed to be zero, and on exit they*> are set to zero.*> \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 complex16_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 ZHER(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 COMPLEX A(LDA,*),X(*)* ..** =====================================================================** .. Parameters ..DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,0.0D+0))* ..* .. Local Scalars ..DOUBLE COMPLEX TEMPINTEGER I,INFO,IX,J,JX,KX* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC DBLE,DCONJG,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('ZHER ',INFO)RETURNEND IF** Quick return if possible.*IF ((N.EQ.0) .OR. (ALPHA.EQ.DBLE(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*DCONJG(X(J))DO 10 I = 1,J - 1A(I,J) = A(I,J) + X(I)*TEMP10 CONTINUEA(J,J) = DBLE(A(J,J)) + DBLE(X(J)*TEMP)c ELSEc A(J,J) = DBLE(A(J,J))c END IF20 CONTINUEELSEJX = KXDO 40 J = 1,Nc IF (X(JX).NE.ZERO) THENTEMP = ALPHA*DCONJG(X(JX))IX = KXDO 30 I = 1,J - 1A(I,J) = A(I,J) + X(IX)*TEMPIX = IX + INCX30 CONTINUEA(J,J) = DBLE(A(J,J)) + DBLE(X(JX)*TEMP)c ELSEc A(J,J) = DBLE(A(J,J))c 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*DCONJG(X(J))A(J,J) = DBLE(A(J,J)) + DBLE(TEMP*X(J))DO 50 I = J + 1,NA(I,J) = A(I,J) + X(I)*TEMP50 CONTINUEc ELSEc A(J,J) = DBLE(A(J,J))c END IF60 CONTINUEELSEJX = KXDO 80 J = 1,Nc IF (X(JX).NE.ZERO) THENTEMP = ALPHA*DCONJG(X(JX))A(J,J) = DBLE(A(J,J)) + DBLE(TEMP*X(JX))IX = JXDO 70 I = J + 1,NIX = IX + INCXA(I,J) = A(I,J) + X(IX)*TEMP70 CONTINUEc ELSEc A(J,J) = DBLE(A(J,J))c END IFJX = JX + INCX80 CONTINUEEND IFEND IF*RETURN** End of ZHER*END*> \brief \b ZHERK** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZHERK(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 COMPLEX A(LDA,*),C(LDC,*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZHERK performs one of the hermitian rank k operations*>*> C := alpha*A*A**H + beta*C,*>*> or*>*> C := alpha*A**H*A + beta*C,*>*> where alpha and beta are real scalars, C is an n by n hermitian*> 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**H + beta*C.*>*> TRANS = 'C' or 'c' C := alpha*A**H*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 = '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 COMPLEX 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 COMPLEX 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 hermitian 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 hermitian 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.*> Note that the imaginary parts of the diagonal elements need*> not be set, they are assumed to be zero, and on exit they*> are set to zero.*> \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 complex16_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.*>*> -- Modified 8-Nov-93 to set C(J,J) to DBLE( C(J,J) ) when BETA = 1.*> Ed Anderson, Cray Research Inc.*> \endverbatim*>* =====================================================================SUBROUTINE ZHERK(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 COMPLEX A(LDA,*),C(LDC,*)* ..** =====================================================================** .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC DBLE,DCMPLX,DCONJG,MAX* ..* .. Local Scalars ..DOUBLE COMPLEX TEMPDOUBLE PRECISION RTEMPINTEGER 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,'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('ZHERK ',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,J - 1C(I,J) = BETA*C(I,J)30 CONTINUEC(J,J) = BETA*DBLE(C(J,J))40 CONTINUEEND IFELSEIF (BETA.EQ.ZERO) THENDO 60 J = 1,NDO 50 I = J,NC(I,J) = ZERO50 CONTINUE60 CONTINUEELSEDO 80 J = 1,NC(J,J) = BETA*DBLE(C(J,J))DO 70 I = J + 1,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**H + 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,J - 1C(I,J) = BETA*C(I,J)100 CONTINUEC(J,J) = BETA*DBLE(C(J,J))ELSEC(J,J) = DBLE(C(J,J))END IFDO 120 L = 1,KIF (A(J,L).NE.DCMPLX(ZERO)) THENTEMP = ALPHA*DCONJG(A(J,L))DO 110 I = 1,J - 1C(I,J) = C(I,J) + TEMP*A(I,L)110 CONTINUEC(J,J) = DBLE(C(J,J)) + DBLE(TEMP*A(I,L))END IF120 CONTINUE130 CONTINUEELSEDO 180 J = 1,NIF (BETA.EQ.ZERO) THENDO 140 I = J,NC(I,J) = ZERO140 CONTINUEELSE IF (BETA.NE.ONE) THENC(J,J) = BETA*DBLE(C(J,J))DO 150 I = J + 1,NC(I,J) = BETA*C(I,J)150 CONTINUEELSEC(J,J) = DBLE(C(J,J))END IFDO 170 L = 1,KIF (A(J,L).NE.DCMPLX(ZERO)) THENTEMP = ALPHA*DCONJG(A(J,L))C(J,J) = DBLE(C(J,J)) + DBLE(TEMP*A(J,L))DO 160 I = J + 1,NC(I,J) = C(I,J) + TEMP*A(I,L)160 CONTINUEEND IF170 CONTINUE180 CONTINUEEND IFELSE** Form C := alpha*A**H*A + beta*C.*IF (UPPER) THENDO 220 J = 1,NDO 200 I = 1,J - 1TEMP = ZERODO 190 L = 1,KTEMP = TEMP + DCONJG(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 CONTINUERTEMP = ZERODO 210 L = 1,KRTEMP = RTEMP + DBLE(DCONJG(A(L,J))*A(L,J))210 CONTINUEIF (BETA.EQ.ZERO) THENC(J,J) = ALPHA*RTEMPELSEC(J,J) = ALPHA*RTEMP + BETA*DBLE(C(J,J))END IF220 CONTINUEELSEDO 260 J = 1,NRTEMP = ZERODO 230 L = 1,KRTEMP = RTEMP + DBLE(DCONJG(A(L,J))*A(L,J))230 CONTINUEIF (BETA.EQ.ZERO) THENC(J,J) = ALPHA*RTEMPELSEC(J,J) = ALPHA*RTEMP + BETA*DBLE(C(J,J))END IFDO 250 I = J + 1,NTEMP = ZERODO 240 L = 1,KTEMP = TEMP + DCONJG(A(L,I))*A(L,J)240 CONTINUEIF (BETA.EQ.ZERO) THENC(I,J) = ALPHA*TEMPELSEC(I,J) = ALPHA*TEMP + BETA*C(I,J)END IF250 CONTINUE260 CONTINUEEND IFEND IF*RETURN** End of ZHERK*END*> \brief \b ZHPMV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZHPMV(UPLO,N,ALPHA,AP,X,INCX,BETA,Y,INCY)** .. Scalar Arguments ..* DOUBLE COMPLEX ALPHA,BETA* INTEGER INCX,INCY,N* CHARACTER UPLO* ..* .. Array Arguments ..* DOUBLE COMPLEX AP(*),X(*),Y(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZHPMV 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 hermitian 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 COMPLEX*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] AP*> \verbatim*> AP is DOUBLE COMPLEX 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 hermitian 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 hermitian 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 the imaginary parts of the diagonal elements need*> not be set and are assumed to be zero.*> \endverbatim*>*> \param[in] X*> \verbatim*> X is DOUBLE COMPLEX 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 COMPLEX*> 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 COMPLEX 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 complex16_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 ZHPMV(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 COMPLEX ALPHA,BETAINTEGER INCX,INCY,NCHARACTER UPLO* ..* .. Array Arguments ..DOUBLE COMPLEX AP(*),X(*),Y(*)* ..** =====================================================================** .. Parameters ..DOUBLE COMPLEX ONEPARAMETER (ONE= (1.0D+0,0.0D+0))DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,0.0D+0))* ..* .. Local Scalars ..DOUBLE COMPLEX TEMP1,TEMP2INTEGER I,INFO,IX,IY,J,JX,JY,K,KK,KX,KY* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC DBLE,DCONJG* ..** 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('ZHPMV ',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 + DCONJG(AP(K))*X(I)K = K + 150 CONTINUEY(J) = Y(J) + TEMP1*DBLE(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 + DCONJG(AP(K))*X(IX)IX = IX + INCXIY = IY + INCY70 CONTINUEY(JY) = Y(JY) + TEMP1*DBLE(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*DBLE(AP(KK))K = KK + 1DO 90 I = J + 1,NY(I) = Y(I) + TEMP1*AP(K)TEMP2 = TEMP2 + DCONJG(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*DBLE(AP(KK))IX = JXIY = JYDO 110 K = KK + 1,KK + N - JIX = IX + INCXIY = IY + INCYY(IY) = Y(IY) + TEMP1*AP(K)TEMP2 = TEMP2 + DCONJG(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 ZHPMV*END*> \brief \b ZHPR2** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZHPR2(UPLO,N,ALPHA,X,INCX,Y,INCY,AP)** .. Scalar Arguments ..* DOUBLE COMPLEX ALPHA* INTEGER INCX,INCY,N* CHARACTER UPLO* ..* .. Array Arguments ..* DOUBLE COMPLEX AP(*),X(*),Y(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZHPR2 performs the hermitian rank 2 operation*>*> A := alpha*x*y**H + conjg( alpha )*y*x**H + A,*>*> where alpha is a scalar, x and y are n element vectors and A is an*> n by n hermitian 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 COMPLEX*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] X*> \verbatim*> X is DOUBLE COMPLEX 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 COMPLEX 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 COMPLEX 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 hermitian 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 hermitian 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.*> Note that the imaginary parts of the diagonal elements need*> not be set, they are assumed to be zero, and on exit they*> are set to zero.*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup complex16_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 ZHPR2(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 COMPLEX ALPHAINTEGER INCX,INCY,NCHARACTER UPLO* ..* .. Array Arguments ..DOUBLE COMPLEX AP(*),X(*),Y(*)* ..** =====================================================================** .. Parameters ..DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,0.0D+0))* ..* .. Local Scalars ..DOUBLE COMPLEX TEMP1,TEMP2INTEGER I,INFO,IX,IY,J,JX,JY,K,KK,KX,KY* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC DBLE,DCONJG* ..** 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('ZHPR2 ',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*DCONJG(Y(J))TEMP2 = DCONJG(ALPHA*X(J))K = KKDO 10 I = 1,J - 1AP(K) = AP(K) + X(I)*TEMP1 + Y(I)*TEMP2K = K + 110 CONTINUEAP(KK+J-1) = DBLE(AP(KK+J-1)) ++ DBLE(X(J)*TEMP1+Y(J)*TEMP2)c ELSEc AP(KK+J-1) = DBLE(AP(KK+J-1))c END IFKK = KK + J20 CONTINUEELSEDO 40 J = 1,Nc IF ((X(JX).NE.ZERO) .OR. (Y(JY).NE.ZERO)) THENTEMP1 = ALPHA*DCONJG(Y(JY))TEMP2 = DCONJG(ALPHA*X(JX))IX = KXIY = KYDO 30 K = KK,KK + J - 2AP(K) = AP(K) + X(IX)*TEMP1 + Y(IY)*TEMP2IX = IX + INCXIY = IY + INCY30 CONTINUEAP(KK+J-1) = DBLE(AP(KK+J-1)) ++ DBLE(X(JX)*TEMP1+Y(JY)*TEMP2)c ELSEc AP(KK+J-1) = DBLE(AP(KK+J-1))c 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*DCONJG(Y(J))TEMP2 = DCONJG(ALPHA*X(J))AP(KK) = DBLE(AP(KK)) ++ DBLE(X(J)*TEMP1+Y(J)*TEMP2)K = KK + 1DO 50 I = J + 1,NAP(K) = AP(K) + X(I)*TEMP1 + Y(I)*TEMP2K = K + 150 CONTINUEc ELSEc AP(KK) = DBLE(AP(KK))c END IFKK = KK + N - J + 160 CONTINUEELSEDO 80 J = 1,Nc IF ((X(JX).NE.ZERO) .OR. (Y(JY).NE.ZERO)) THENTEMP1 = ALPHA*DCONJG(Y(JY))TEMP2 = DCONJG(ALPHA*X(JX))AP(KK) = DBLE(AP(KK)) ++ DBLE(X(JX)*TEMP1+Y(JY)*TEMP2)IX = JXIY = JYDO 70 K = KK + 1,KK + N - JIX = IX + INCXIY = IY + INCYAP(K) = AP(K) + X(IX)*TEMP1 + Y(IY)*TEMP270 CONTINUEc ELSEc AP(KK) = DBLE(AP(KK))c END IFJX = JX + INCXJY = JY + INCYKK = KK + N - J + 180 CONTINUEEND IFEND IF*RETURN** End of ZHPR2*END*> \brief \b ZHPR** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZHPR(UPLO,N,ALPHA,X,INCX,AP)** .. Scalar Arguments ..* DOUBLE PRECISION ALPHA* INTEGER INCX,N* CHARACTER UPLO* ..* .. Array Arguments ..* DOUBLE COMPLEX AP(*),X(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZHPR performs the hermitian rank 1 operation*>*> A := alpha*x*x**H + A,*>*> where alpha is a real scalar, x is an n element vector and A is an*> n by n hermitian 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 COMPLEX 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 COMPLEX 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 hermitian 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 hermitian 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.*> Note that the imaginary parts of the diagonal elements need*> not be set, they are assumed to be zero, and on exit they*> are set to zero.*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup complex16_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 ZHPR(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 COMPLEX AP(*),X(*)* ..** =====================================================================** .. Parameters ..DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,0.0D+0))* ..* .. Local Scalars ..DOUBLE COMPLEX TEMPINTEGER I,INFO,IX,J,JX,K,KK,KX* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC DBLE,DCONJG* ..** 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('ZHPR ',INFO)RETURNEND IF** Quick return if possible.*IF ((N.EQ.0) .OR. (ALPHA.EQ.DBLE(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*DCONJG(X(J))K = KKDO 10 I = 1,J - 1AP(K) = AP(K) + X(I)*TEMPK = K + 110 CONTINUEAP(KK+J-1) = DBLE(AP(KK+J-1)) + DBLE(X(J)*TEMP)c ELSEc AP(KK+J-1) = DBLE(AP(KK+J-1))c END IFKK = KK + J20 CONTINUEELSEJX = KXDO 40 J = 1,Nc IF (X(JX).NE.ZERO) THENTEMP = ALPHA*DCONJG(X(JX))IX = KXDO 30 K = KK,KK + J - 2AP(K) = AP(K) + X(IX)*TEMPIX = IX + INCX30 CONTINUEAP(KK+J-1) = DBLE(AP(KK+J-1)) + DBLE(X(JX)*TEMP)c ELSEc AP(KK+J-1) = DBLE(AP(KK+J-1))c 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*DCONJG(X(J))AP(KK) = DBLE(AP(KK)) + DBLE(TEMP*X(J))K = KK + 1DO 50 I = J + 1,NAP(K) = AP(K) + X(I)*TEMPK = K + 150 CONTINUEc ELSEc AP(KK) = DBLE(AP(KK))c END IFKK = KK + N - J + 160 CONTINUEELSEJX = KXDO 80 J = 1,Nc IF (X(JX).NE.ZERO) THENTEMP = ALPHA*DCONJG(X(JX))AP(KK) = DBLE(AP(KK)) + DBLE(TEMP*X(JX))IX = JXDO 70 K = KK + 1,KK + N - JIX = IX + INCXAP(K) = AP(K) + X(IX)*TEMP70 CONTINUEc ELSEc AP(KK) = DBLE(AP(KK))c END IFJX = JX + INCXKK = KK + N - J + 180 CONTINUEEND IFEND IF*RETURN** End of ZHPR*END*> \brief \b ZSCAL** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZSCAL(N,ZA,ZX,INCX)** .. Scalar Arguments ..* DOUBLE COMPLEX ZA* INTEGER INCX,N* ..* .. Array Arguments ..* DOUBLE COMPLEX ZX(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZSCAL scales a vector by a constant.*> \endverbatim** Arguments:* ==========**> \param[in] N*> \verbatim*> N is INTEGER*> number of elements in input vector(s)*> \endverbatim*>*> \param[in] ZA*> \verbatim*> ZA is DOUBLE COMPLEX*> On entry, ZA specifies the scalar alpha.*> \endverbatim*>*> \param[in,out] ZX*> \verbatim*> ZX is DOUBLE COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCX ) )*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> storage spacing between elements of ZX*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup complex16_blas_level1**> \par Further Details:* =====================*>*> \verbatim*>*> jack dongarra, 3/11/78.*> modified 3/93 to return if incx .le. 0.*> modified 12/3/93, array(1) declarations changed to array(*)*> \endverbatim*>* =====================================================================SUBROUTINE ZSCAL(N,ZA,ZX,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 COMPLEX ZAINTEGER INCX,N* ..* .. Array Arguments ..DOUBLE COMPLEX ZX(*)* ..** =====================================================================** .. Local Scalars ..INTEGER I,NINCX* ..IF (N.LE.0 .OR. INCX.LE.0) RETURNIF (INCX.EQ.1) THEN** code for increment equal to 1*DO I = 1,NZX(I) = ZA*ZX(I)END DOELSE** code for increment not equal to 1*NINCX = N*INCXDO I = 1,NINCX,INCXZX(I) = ZA*ZX(I)END DOEND IFRETURN** End of ZSCAL*END*> \brief \b ZSWAP** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZSWAP(N,ZX,INCX,ZY,INCY)** .. Scalar Arguments ..* INTEGER INCX,INCY,N* ..* .. Array Arguments ..* DOUBLE COMPLEX ZX(*),ZY(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZSWAP interchanges two vectors.*> \endverbatim** Arguments:* ==========**> \param[in] N*> \verbatim*> N is INTEGER*> number of elements in input vector(s)*> \endverbatim*>*> \param[in,out] ZX*> \verbatim*> ZX is DOUBLE COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCX ) )*> \endverbatim*>*> \param[in] INCX*> \verbatim*> INCX is INTEGER*> storage spacing between elements of ZX*> \endverbatim*>*> \param[in,out] ZY*> \verbatim*> ZY is DOUBLE COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCY ) )*> \endverbatim*>*> \param[in] INCY*> \verbatim*> INCY is INTEGER*> storage spacing between elements of ZY*> \endverbatim** Authors:* ========**> \author Univ. of Tennessee*> \author Univ. of California Berkeley*> \author Univ. of Colorado Denver*> \author NAG Ltd.**> \ingroup complex16_blas_level1**> \par Further Details:* =====================*>*> \verbatim*>*> jack dongarra, 3/11/78.*> modified 12/3/93, array(1) declarations changed to array(*)*> \endverbatim*>* =====================================================================SUBROUTINE ZSWAP(N,ZX,INCX,ZY,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 COMPLEX ZX(*),ZY(*)* ..** =====================================================================** .. Local Scalars ..DOUBLE COMPLEX ZTEMPINTEGER I,IX,IY* ..IF (N.LE.0) RETURNIF (INCX.EQ.1 .AND. INCY.EQ.1) THEN** code for both increments equal to 1DO I = 1,NZTEMP = ZX(I)ZX(I) = ZY(I)ZY(I) = ZTEMPEND 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,NZTEMP = ZX(IX)ZX(IX) = ZY(IY)ZY(IY) = ZTEMPIX = IX + INCXIY = IY + INCYEND DOEND IFRETURN** End of ZSWAP*END*> \brief \b ZSYMM** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZSYMM(SIDE,UPLO,M,N,ALPHA,A,LDA,B,LDB,BETA,C,LDC)** .. Scalar Arguments ..* DOUBLE COMPLEX ALPHA,BETA* INTEGER LDA,LDB,LDC,M,N* CHARACTER SIDE,UPLO* ..* .. Array Arguments ..* DOUBLE COMPLEX A(LDA,*),B(LDB,*),C(LDC,*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZSYMM 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 COMPLEX*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE COMPLEX 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 COMPLEX 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 COMPLEX*> 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 COMPLEX 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 complex16_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 ZSYMM(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 COMPLEX ALPHA,BETAINTEGER LDA,LDB,LDC,M,NCHARACTER SIDE,UPLO* ..* .. Array Arguments ..DOUBLE COMPLEX A(LDA,*),B(LDB,*),C(LDC,*)* ..** =====================================================================** .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC MAX* ..* .. Local Scalars ..DOUBLE COMPLEX TEMP1,TEMP2INTEGER I,INFO,J,K,NROWALOGICAL UPPER* ..* .. Parameters ..DOUBLE COMPLEX ONEPARAMETER (ONE= (1.0D+0,0.0D+0))DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,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('ZSYMM ',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 ZSYMM*END*> \brief \b ZSYR2K** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZSYR2K(UPLO,TRANS,N,K,ALPHA,A,LDA,B,LDB,BETA,C,LDC)** .. Scalar Arguments ..* DOUBLE COMPLEX ALPHA,BETA* INTEGER K,LDA,LDB,LDC,N* CHARACTER TRANS,UPLO* ..* .. Array Arguments ..* DOUBLE COMPLEX A(LDA,*),B(LDB,*),C(LDC,*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZSYR2K 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.*> \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', 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 COMPLEX*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE COMPLEX 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 COMPLEX 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 COMPLEX*> On entry, BETA specifies the scalar beta.*> \endverbatim*>*> \param[in,out] C*> \verbatim*> C is DOUBLE COMPLEX 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 complex16_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 ZSYR2K(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 COMPLEX ALPHA,BETAINTEGER K,LDA,LDB,LDC,NCHARACTER TRANS,UPLO* ..* .. Array Arguments ..DOUBLE COMPLEX A(LDA,*),B(LDB,*),C(LDC,*)* ..** =====================================================================** .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC MAX* ..* .. Local Scalars ..DOUBLE COMPLEX TEMP1,TEMP2INTEGER I,INFO,J,L,NROWALOGICAL UPPER* ..* .. Parameters ..DOUBLE COMPLEX ONEPARAMETER (ONE= (1.0D+0,0.0D+0))DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,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'))) 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('ZSYR2K',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 ZSYR2K*END*> \brief \b ZSYRK** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZSYRK(UPLO,TRANS,N,K,ALPHA,A,LDA,BETA,C,LDC)** .. Scalar Arguments ..* DOUBLE COMPLEX ALPHA,BETA* INTEGER K,LDA,LDC,N* CHARACTER TRANS,UPLO* ..* .. Array Arguments ..* DOUBLE COMPLEX A(LDA,*),C(LDC,*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZSYRK 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.*> \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', K specifies the number of rows of the*> matrix A. K must be at least zero.*> \endverbatim*>*> \param[in] ALPHA*> \verbatim*> ALPHA is DOUBLE COMPLEX*> On entry, ALPHA specifies the scalar alpha.*> \endverbatim*>*> \param[in] A*> \verbatim*> A is DOUBLE COMPLEX 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 COMPLEX*> On entry, BETA specifies the scalar beta.*> \endverbatim*>*> \param[in,out] C*> \verbatim*> C is DOUBLE COMPLEX 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 complex16_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 ZSYRK(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 COMPLEX ALPHA,BETAINTEGER K,LDA,LDC,NCHARACTER TRANS,UPLO* ..* .. Array Arguments ..DOUBLE COMPLEX A(LDA,*),C(LDC,*)* ..** =====================================================================** .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC MAX* ..* .. Local Scalars ..DOUBLE COMPLEX TEMPINTEGER I,INFO,J,L,NROWALOGICAL UPPER* ..* .. Parameters ..DOUBLE COMPLEX ONEPARAMETER (ONE= (1.0D+0,0.0D+0))DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,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'))) 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('ZSYRK ',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 ZSYRK*END*> \brief \b ZTBMV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZTBMV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX)** .. Scalar Arguments ..* INTEGER INCX,K,LDA,N* CHARACTER DIAG,TRANS,UPLO* ..* .. Array Arguments ..* DOUBLE COMPLEX A(LDA,*),X(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZTBMV performs one of the matrix-vector operations*>*> x := A*x, or x := A**T*x, or x := A**H*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**H*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 COMPLEX 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 COMPLEX 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 complex16_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 ZTBMV(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 COMPLEX A(LDA,*),X(*)* ..** =====================================================================** .. Parameters ..DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,0.0D+0))* ..* .. Local Scalars ..DOUBLE COMPLEX TEMPINTEGER I,INFO,IX,J,JX,KPLUS1,KX,LLOGICAL NOCONJ,NOUNIT* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC DCONJG,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('ZTBMV ',INFO)RETURNEND IF** Quick return if possible.*IF (N.EQ.0) RETURN*NOCONJ = LSAME(TRANS,'T')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 or x := A**H*x.*IF (LSAME(UPLO,'U')) THENKPLUS1 = K + 1IF (INCX.EQ.1) THENDO 110 J = N,1,-1TEMP = X(J)L = KPLUS1 - JIF (NOCONJ) THENIF (NOUNIT) TEMP = TEMP*A(KPLUS1,J)DO 90 I = J - 1,MAX(1,J-K),-1TEMP = TEMP + A(L+I,J)*X(I)90 CONTINUEELSEIF (NOUNIT) TEMP = TEMP*DCONJG(A(KPLUS1,J))DO 100 I = J - 1,MAX(1,J-K),-1TEMP = TEMP + DCONJG(A(L+I,J))*X(I)100 CONTINUEEND IFX(J) = TEMP110 CONTINUEELSEKX = KX + (N-1)*INCXJX = KXDO 140 J = N,1,-1TEMP = X(JX)KX = KX - INCXIX = KXL = KPLUS1 - JIF (NOCONJ) THENIF (NOUNIT) TEMP = TEMP*A(KPLUS1,J)DO 120 I = J - 1,MAX(1,J-K),-1TEMP = TEMP + A(L+I,J)*X(IX)IX = IX - INCX120 CONTINUEELSEIF (NOUNIT) TEMP = TEMP*DCONJG(A(KPLUS1,J))DO 130 I = J - 1,MAX(1,J-K),-1TEMP = TEMP + DCONJG(A(L+I,J))*X(IX)IX = IX - INCX130 CONTINUEEND IFX(JX) = TEMPJX = JX - INCX140 CONTINUEEND IFELSEIF (INCX.EQ.1) THENDO 170 J = 1,NTEMP = X(J)L = 1 - JIF (NOCONJ) THENIF (NOUNIT) TEMP = TEMP*A(1,J)DO 150 I = J + 1,MIN(N,J+K)TEMP = TEMP + A(L+I,J)*X(I)150 CONTINUEELSEIF (NOUNIT) TEMP = TEMP*DCONJG(A(1,J))DO 160 I = J + 1,MIN(N,J+K)TEMP = TEMP + DCONJG(A(L+I,J))*X(I)160 CONTINUEEND IFX(J) = TEMP170 CONTINUEELSEJX = KXDO 200 J = 1,NTEMP = X(JX)KX = KX + INCXIX = KXL = 1 - JIF (NOCONJ) THENIF (NOUNIT) TEMP = TEMP*A(1,J)DO 180 I = J + 1,MIN(N,J+K)TEMP = TEMP + A(L+I,J)*X(IX)IX = IX + INCX180 CONTINUEELSEIF (NOUNIT) TEMP = TEMP*DCONJG(A(1,J))DO 190 I = J + 1,MIN(N,J+K)TEMP = TEMP + DCONJG(A(L+I,J))*X(IX)IX = IX + INCX190 CONTINUEEND IFX(JX) = TEMPJX = JX + INCX200 CONTINUEEND IFEND IFEND IF*RETURN** End of ZTBMV*END*> \brief \b ZTBSV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZTBSV(UPLO,TRANS,DIAG,N,K,A,LDA,X,INCX)** .. Scalar Arguments ..* INTEGER INCX,K,LDA,N* CHARACTER DIAG,TRANS,UPLO* ..* .. Array Arguments ..* DOUBLE COMPLEX A(LDA,*),X(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZTBSV solves one of the systems of equations*>*> A*x = b, or A**T*x = b, or A**H*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**H*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 COMPLEX 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 COMPLEX 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 complex16_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 ZTBSV(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 COMPLEX A(LDA,*),X(*)* ..** =====================================================================** .. Parameters ..DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,0.0D+0))* ..* .. Local Scalars ..DOUBLE COMPLEX TEMPINTEGER I,INFO,IX,J,JX,KPLUS1,KX,LLOGICAL NOCONJ,NOUNIT* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC DCONJG,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('ZTBSV ',INFO)RETURNEND IF** Quick return if possible.*IF (N.EQ.0) RETURN*NOCONJ = LSAME(TRANS,'T')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 or x := inv( A**H )*x.*IF (LSAME(UPLO,'U')) THENKPLUS1 = K + 1IF (INCX.EQ.1) THENDO 110 J = 1,NTEMP = X(J)L = KPLUS1 - JIF (NOCONJ) THENDO 90 I = MAX(1,J-K),J - 1TEMP = TEMP - A(L+I,J)*X(I)90 CONTINUEIF (NOUNIT) TEMP = TEMP/A(KPLUS1,J)ELSEDO 100 I = MAX(1,J-K),J - 1TEMP = TEMP - DCONJG(A(L+I,J))*X(I)100 CONTINUEIF (NOUNIT) TEMP = TEMP/DCONJG(A(KPLUS1,J))END IFX(J) = TEMP110 CONTINUEELSEJX = KXDO 140 J = 1,NTEMP = X(JX)IX = KXL = KPLUS1 - JIF (NOCONJ) THENDO 120 I = MAX(1,J-K),J - 1TEMP = TEMP - A(L+I,J)*X(IX)IX = IX + INCX120 CONTINUEIF (NOUNIT) TEMP = TEMP/A(KPLUS1,J)ELSEDO 130 I = MAX(1,J-K),J - 1TEMP = TEMP - DCONJG(A(L+I,J))*X(IX)IX = IX + INCX130 CONTINUEIF (NOUNIT) TEMP = TEMP/DCONJG(A(KPLUS1,J))END IFX(JX) = TEMPJX = JX + INCXIF (J.GT.K) KX = KX + INCX140 CONTINUEEND IFELSEIF (INCX.EQ.1) THENDO 170 J = N,1,-1TEMP = X(J)L = 1 - JIF (NOCONJ) THENDO 150 I = MIN(N,J+K),J + 1,-1TEMP = TEMP - A(L+I,J)*X(I)150 CONTINUEIF (NOUNIT) TEMP = TEMP/A(1,J)ELSEDO 160 I = MIN(N,J+K),J + 1,-1TEMP = TEMP - DCONJG(A(L+I,J))*X(I)160 CONTINUEIF (NOUNIT) TEMP = TEMP/DCONJG(A(1,J))END IFX(J) = TEMP170 CONTINUEELSEKX = KX + (N-1)*INCXJX = KXDO 200 J = N,1,-1TEMP = X(JX)IX = KXL = 1 - JIF (NOCONJ) THENDO 180 I = MIN(N,J+K),J + 1,-1TEMP = TEMP - A(L+I,J)*X(IX)IX = IX - INCX180 CONTINUEIF (NOUNIT) TEMP = TEMP/A(1,J)ELSEDO 190 I = MIN(N,J+K),J + 1,-1TEMP = TEMP - DCONJG(A(L+I,J))*X(IX)IX = IX - INCX190 CONTINUEIF (NOUNIT) TEMP = TEMP/DCONJG(A(1,J))END IFX(JX) = TEMPJX = JX - INCXIF ((N-J).GE.K) KX = KX - INCX200 CONTINUEEND IFEND IFEND IF*RETURN** End of ZTBSV*END*> \brief \b ZTPMV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZTPMV(UPLO,TRANS,DIAG,N,AP,X,INCX)** .. Scalar Arguments ..* INTEGER INCX,N* CHARACTER DIAG,TRANS,UPLO* ..* .. Array Arguments ..* DOUBLE COMPLEX AP(*),X(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZTPMV performs one of the matrix-vector operations*>*> x := A*x, or x := A**T*x, or x := A**H*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**H*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 COMPLEX 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 COMPLEX 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 complex16_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 ZTPMV(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 COMPLEX AP(*),X(*)* ..** =====================================================================** .. Parameters ..DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,0.0D+0))* ..* .. Local Scalars ..DOUBLE COMPLEX TEMPINTEGER I,INFO,IX,J,JX,K,KK,KXLOGICAL NOCONJ,NOUNIT* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC DCONJG* ..** 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('ZTPMV ',INFO)RETURNEND IF** Quick return if possible.*IF (N.EQ.0) RETURN*NOCONJ = LSAME(TRANS,'T')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 or x := A**H*x.*IF (LSAME(UPLO,'U')) THENKK = (N* (N+1))/2IF (INCX.EQ.1) THENDO 110 J = N,1,-1TEMP = X(J)K = KK - 1IF (NOCONJ) THENIF (NOUNIT) TEMP = TEMP*AP(KK)DO 90 I = J - 1,1,-1TEMP = TEMP + AP(K)*X(I)K = K - 190 CONTINUEELSEIF (NOUNIT) TEMP = TEMP*DCONJG(AP(KK))DO 100 I = J - 1,1,-1TEMP = TEMP + DCONJG(AP(K))*X(I)K = K - 1100 CONTINUEEND IFX(J) = TEMPKK = KK - J110 CONTINUEELSEJX = KX + (N-1)*INCXDO 140 J = N,1,-1TEMP = X(JX)IX = JXIF (NOCONJ) THENIF (NOUNIT) TEMP = TEMP*AP(KK)DO 120 K = KK - 1,KK - J + 1,-1IX = IX - INCXTEMP = TEMP + AP(K)*X(IX)120 CONTINUEELSEIF (NOUNIT) TEMP = TEMP*DCONJG(AP(KK))DO 130 K = KK - 1,KK - J + 1,-1IX = IX - INCXTEMP = TEMP + DCONJG(AP(K))*X(IX)130 CONTINUEEND IFX(JX) = TEMPJX = JX - INCXKK = KK - J140 CONTINUEEND IFELSEKK = 1IF (INCX.EQ.1) THENDO 170 J = 1,NTEMP = X(J)K = KK + 1IF (NOCONJ) THENIF (NOUNIT) TEMP = TEMP*AP(KK)DO 150 I = J + 1,NTEMP = TEMP + AP(K)*X(I)K = K + 1150 CONTINUEELSEIF (NOUNIT) TEMP = TEMP*DCONJG(AP(KK))DO 160 I = J + 1,NTEMP = TEMP + DCONJG(AP(K))*X(I)K = K + 1160 CONTINUEEND IFX(J) = TEMPKK = KK + (N-J+1)170 CONTINUEELSEJX = KXDO 200 J = 1,NTEMP = X(JX)IX = JXIF (NOCONJ) THENIF (NOUNIT) TEMP = TEMP*AP(KK)DO 180 K = KK + 1,KK + N - JIX = IX + INCXTEMP = TEMP + AP(K)*X(IX)180 CONTINUEELSEIF (NOUNIT) TEMP = TEMP*DCONJG(AP(KK))DO 190 K = KK + 1,KK + N - JIX = IX + INCXTEMP = TEMP + DCONJG(AP(K))*X(IX)190 CONTINUEEND IFX(JX) = TEMPJX = JX + INCXKK = KK + (N-J+1)200 CONTINUEEND IFEND IFEND IF*RETURN** End of ZTPMV*END*> \brief \b ZTPSV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZTPSV(UPLO,TRANS,DIAG,N,AP,X,INCX)** .. Scalar Arguments ..* INTEGER INCX,N* CHARACTER DIAG,TRANS,UPLO* ..* .. Array Arguments ..* DOUBLE COMPLEX AP(*),X(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZTPSV solves one of the systems of equations*>*> A*x = b, or A**T*x = b, or A**H*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**H*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 COMPLEX 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 COMPLEX 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 complex16_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 ZTPSV(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 COMPLEX AP(*),X(*)* ..** =====================================================================** .. Parameters ..DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,0.0D+0))* ..* .. Local Scalars ..DOUBLE COMPLEX TEMPINTEGER I,INFO,IX,J,JX,K,KK,KXLOGICAL NOCONJ,NOUNIT* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC DCONJG* ..** 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('ZTPSV ',INFO)RETURNEND IF** Quick return if possible.*IF (N.EQ.0) RETURN*NOCONJ = LSAME(TRANS,'T')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 or x := inv( A**H )*x.*IF (LSAME(UPLO,'U')) THENKK = 1IF (INCX.EQ.1) THENDO 110 J = 1,NTEMP = X(J)K = KKIF (NOCONJ) THENDO 90 I = 1,J - 1TEMP = TEMP - AP(K)*X(I)K = K + 190 CONTINUEIF (NOUNIT) TEMP = TEMP/AP(KK+J-1)ELSEDO 100 I = 1,J - 1TEMP = TEMP - DCONJG(AP(K))*X(I)K = K + 1100 CONTINUEIF (NOUNIT) TEMP = TEMP/DCONJG(AP(KK+J-1))END IFX(J) = TEMPKK = KK + J110 CONTINUEELSEJX = KXDO 140 J = 1,NTEMP = X(JX)IX = KXIF (NOCONJ) THENDO 120 K = KK,KK + J - 2TEMP = TEMP - AP(K)*X(IX)IX = IX + INCX120 CONTINUEIF (NOUNIT) TEMP = TEMP/AP(KK+J-1)ELSEDO 130 K = KK,KK + J - 2TEMP = TEMP - DCONJG(AP(K))*X(IX)IX = IX + INCX130 CONTINUEIF (NOUNIT) TEMP = TEMP/DCONJG(AP(KK+J-1))END IFX(JX) = TEMPJX = JX + INCXKK = KK + J140 CONTINUEEND IFELSEKK = (N* (N+1))/2IF (INCX.EQ.1) THENDO 170 J = N,1,-1TEMP = X(J)K = KKIF (NOCONJ) THENDO 150 I = N,J + 1,-1TEMP = TEMP - AP(K)*X(I)K = K - 1150 CONTINUEIF (NOUNIT) TEMP = TEMP/AP(KK-N+J)ELSEDO 160 I = N,J + 1,-1TEMP = TEMP - DCONJG(AP(K))*X(I)K = K - 1160 CONTINUEIF (NOUNIT) TEMP = TEMP/DCONJG(AP(KK-N+J))END IFX(J) = TEMPKK = KK - (N-J+1)170 CONTINUEELSEKX = KX + (N-1)*INCXJX = KXDO 200 J = N,1,-1TEMP = X(JX)IX = KXIF (NOCONJ) THENDO 180 K = KK,KK - (N- (J+1)),-1TEMP = TEMP - AP(K)*X(IX)IX = IX - INCX180 CONTINUEIF (NOUNIT) TEMP = TEMP/AP(KK-N+J)ELSEDO 190 K = KK,KK - (N- (J+1)),-1TEMP = TEMP - DCONJG(AP(K))*X(IX)IX = IX - INCX190 CONTINUEIF (NOUNIT) TEMP = TEMP/DCONJG(AP(KK-N+J))END IFX(JX) = TEMPJX = JX - INCXKK = KK - (N-J+1)200 CONTINUEEND IFEND IFEND IF*RETURN** End of ZTPSV*END*> \brief \b ZTRMM** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZTRMM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB)** .. Scalar Arguments ..* DOUBLE COMPLEX ALPHA* INTEGER LDA,LDB,M,N* CHARACTER DIAG,SIDE,TRANSA,UPLO* ..* .. Array Arguments ..* DOUBLE COMPLEX A(LDA,*),B(LDB,*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZTRMM 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 or op( A ) = A**H.*> \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**H.*> \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 COMPLEX*> 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 COMPLEX 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 COMPLEX 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 complex16_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 ZTRMM(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 COMPLEX ALPHAINTEGER LDA,LDB,M,NCHARACTER DIAG,SIDE,TRANSA,UPLO* ..* .. Array Arguments ..DOUBLE COMPLEX A(LDA,*),B(LDB,*)* ..** =====================================================================** .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC DCONJG,MAX* ..* .. Local Scalars ..DOUBLE COMPLEX TEMPINTEGER I,INFO,J,K,NROWALOGICAL LSIDE,NOCONJ,NOUNIT,UPPER* ..* .. Parameters ..DOUBLE COMPLEX ONEPARAMETER (ONE= (1.0D+0,0.0D+0))DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,0.0D+0))* ..** Test the input parameters.*LSIDE = LSAME(SIDE,'L')IF (LSIDE) THENNROWA = MELSENROWA = NEND IFNOCONJ = LSAME(TRANSA,'T')NOUNIT = 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('ZTRMM ',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 or B := alpha*A**H*B.*IF (UPPER) THENDO 120 J = 1,NDO 110 I = M,1,-1TEMP = B(I,J)IF (NOCONJ) THENIF (NOUNIT) TEMP = TEMP*A(I,I)DO 90 K = 1,I - 1TEMP = TEMP + A(K,I)*B(K,J)90 CONTINUEELSEIF (NOUNIT) TEMP = TEMP*DCONJG(A(I,I))DO 100 K = 1,I - 1TEMP = TEMP + DCONJG(A(K,I))*B(K,J)100 CONTINUEEND IFB(I,J) = ALPHA*TEMP110 CONTINUE120 CONTINUEELSEDO 160 J = 1,NDO 150 I = 1,MTEMP = B(I,J)IF (NOCONJ) THENIF (NOUNIT) TEMP = TEMP*A(I,I)DO 130 K = I + 1,MTEMP = TEMP + A(K,I)*B(K,J)130 CONTINUEELSEIF (NOUNIT) TEMP = TEMP*DCONJG(A(I,I))DO 140 K = I + 1,MTEMP = TEMP + DCONJG(A(K,I))*B(K,J)140 CONTINUEEND IFB(I,J) = ALPHA*TEMP150 CONTINUE160 CONTINUEEND IFEND IFELSEIF (LSAME(TRANSA,'N')) THEN** Form B := alpha*B*A.*IF (UPPER) THENDO 200 J = N,1,-1TEMP = ALPHAIF (NOUNIT) TEMP = TEMP*A(J,J)DO 170 I = 1,MB(I,J) = TEMP*B(I,J)170 CONTINUEDO 190 K = 1,J - 1c IF (A(K,J).NE.ZERO) THENTEMP = ALPHA*A(K,J)DO 180 I = 1,MB(I,J) = B(I,J) + TEMP*B(I,K)180 CONTINUEc END IF190 CONTINUE200 CONTINUEELSEDO 240 J = 1,NTEMP = ALPHAIF (NOUNIT) TEMP = TEMP*A(J,J)DO 210 I = 1,MB(I,J) = TEMP*B(I,J)210 CONTINUEDO 230 K = J + 1,Nc IF (A(K,J).NE.ZERO) THENTEMP = ALPHA*A(K,J)DO 220 I = 1,MB(I,J) = B(I,J) + TEMP*B(I,K)220 CONTINUEc END IF230 CONTINUE240 CONTINUEEND IFELSE** Form B := alpha*B*A**T or B := alpha*B*A**H.*IF (UPPER) THENDO 280 K = 1,NDO 260 J = 1,K - 1c IF (A(J,K).NE.ZERO) THENIF (NOCONJ) THENTEMP = ALPHA*A(J,K)ELSETEMP = ALPHA*DCONJG(A(J,K))END IFDO 250 I = 1,MB(I,J) = B(I,J) + TEMP*B(I,K)250 CONTINUEc END IF260 CONTINUETEMP = ALPHAIF (NOUNIT) THENIF (NOCONJ) THENTEMP = TEMP*A(K,K)ELSETEMP = TEMP*DCONJG(A(K,K))END IFEND IFIF (TEMP.NE.ONE) THENDO 270 I = 1,MB(I,K) = TEMP*B(I,K)270 CONTINUEEND IF280 CONTINUEELSEDO 320 K = N,1,-1DO 300 J = K + 1,Nc IF (A(J,K).NE.ZERO) THENIF (NOCONJ) THENTEMP = ALPHA*A(J,K)ELSETEMP = ALPHA*DCONJG(A(J,K))END IFDO 290 I = 1,MB(I,J) = B(I,J) + TEMP*B(I,K)290 CONTINUEc END IF300 CONTINUETEMP = ALPHAIF (NOUNIT) THENIF (NOCONJ) THENTEMP = TEMP*A(K,K)ELSETEMP = TEMP*DCONJG(A(K,K))END IFEND IFIF (TEMP.NE.ONE) THENDO 310 I = 1,MB(I,K) = TEMP*B(I,K)310 CONTINUEEND IF320 CONTINUEEND IFEND IFEND IF*RETURN** End of ZTRMM*END*> \brief \b ZTRMV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX)** .. Scalar Arguments ..* INTEGER INCX,LDA,N* CHARACTER DIAG,TRANS,UPLO* ..* .. Array Arguments ..* DOUBLE COMPLEX A(LDA,*),X(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZTRMV performs one of the matrix-vector operations*>*> x := A*x, or x := A**T*x, or x := A**H*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**H*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 COMPLEX 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 COMPLEX 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 complex16_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 ZTRMV(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 COMPLEX A(LDA,*),X(*)* ..** =====================================================================** .. Parameters ..DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,0.0D+0))* ..* .. Local Scalars ..DOUBLE COMPLEX TEMPINTEGER I,INFO,IX,J,JX,KXLOGICAL NOCONJ,NOUNIT* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC DCONJG,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('ZTRMV ',INFO)RETURNEND IF** Quick return if possible.*IF (N.EQ.0) RETURN*NOCONJ = LSAME(TRANS,'T')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 or x := A**H*x.*IF (LSAME(UPLO,'U')) THENIF (INCX.EQ.1) THENDO 110 J = N,1,-1TEMP = X(J)IF (NOCONJ) THENIF (NOUNIT) TEMP = TEMP*A(J,J)DO 90 I = J - 1,1,-1TEMP = TEMP + A(I,J)*X(I)90 CONTINUEELSEIF (NOUNIT) TEMP = TEMP*DCONJG(A(J,J))DO 100 I = J - 1,1,-1TEMP = TEMP + DCONJG(A(I,J))*X(I)100 CONTINUEEND IFX(J) = TEMP110 CONTINUEELSEJX = KX + (N-1)*INCXDO 140 J = N,1,-1TEMP = X(JX)IX = JXIF (NOCONJ) THENIF (NOUNIT) TEMP = TEMP*A(J,J)DO 120 I = J - 1,1,-1IX = IX - INCXTEMP = TEMP + A(I,J)*X(IX)120 CONTINUEELSEIF (NOUNIT) TEMP = TEMP*DCONJG(A(J,J))DO 130 I = J - 1,1,-1IX = IX - INCXTEMP = TEMP + DCONJG(A(I,J))*X(IX)130 CONTINUEEND IFX(JX) = TEMPJX = JX - INCX140 CONTINUEEND IFELSEIF (INCX.EQ.1) THENDO 170 J = 1,NTEMP = X(J)IF (NOCONJ) THENIF (NOUNIT) TEMP = TEMP*A(J,J)DO 150 I = J + 1,NTEMP = TEMP + A(I,J)*X(I)150 CONTINUEELSEIF (NOUNIT) TEMP = TEMP*DCONJG(A(J,J))DO 160 I = J + 1,NTEMP = TEMP + DCONJG(A(I,J))*X(I)160 CONTINUEEND IFX(J) = TEMP170 CONTINUEELSEJX = KXDO 200 J = 1,NTEMP = X(JX)IX = JXIF (NOCONJ) THENIF (NOUNIT) TEMP = TEMP*A(J,J)DO 180 I = J + 1,NIX = IX + INCXTEMP = TEMP + A(I,J)*X(IX)180 CONTINUEELSEIF (NOUNIT) TEMP = TEMP*DCONJG(A(J,J))DO 190 I = J + 1,NIX = IX + INCXTEMP = TEMP + DCONJG(A(I,J))*X(IX)190 CONTINUEEND IFX(JX) = TEMPJX = JX + INCX200 CONTINUEEND IFEND IFEND IF*RETURN** End of ZTRMV*END*> \brief \b ZTRSM** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZTRSM(SIDE,UPLO,TRANSA,DIAG,M,N,ALPHA,A,LDA,B,LDB)** .. Scalar Arguments ..* DOUBLE COMPLEX ALPHA* INTEGER LDA,LDB,M,N* CHARACTER DIAG,SIDE,TRANSA,UPLO* ..* .. Array Arguments ..* DOUBLE COMPLEX A(LDA,*),B(LDB,*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZTRSM 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 or op( A ) = A**H.*>*> 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**H.*> \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 COMPLEX*> 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 COMPLEX 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 COMPLEX 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 complex16_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 ZTRSM(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 COMPLEX ALPHAINTEGER LDA,LDB,M,NCHARACTER DIAG,SIDE,TRANSA,UPLO* ..* .. Array Arguments ..DOUBLE COMPLEX A(LDA,*),B(LDB,*)* ..** =====================================================================** .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC DCONJG,MAX* ..* .. Local Scalars ..DOUBLE COMPLEX TEMPINTEGER I,INFO,J,K,NROWALOGICAL LSIDE,NOCONJ,NOUNIT,UPPER* ..* .. Parameters ..DOUBLE COMPLEX ONEPARAMETER (ONE= (1.0D+0,0.0D+0))DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,0.0D+0))* ..** Test the input parameters.*LSIDE = LSAME(SIDE,'L')IF (LSIDE) THENNROWA = MELSENROWA = NEND IFNOCONJ = LSAME(TRANSA,'T')NOUNIT = 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('ZTRSM ',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* or B := alpha*inv( A**H )*B.*IF (UPPER) THENDO 140 J = 1,NDO 130 I = 1,MTEMP = ALPHA*B(I,J)IF (NOCONJ) THENDO 110 K = 1,I - 1TEMP = TEMP - A(K,I)*B(K,J)110 CONTINUEIF (NOUNIT) TEMP = TEMP/A(I,I)ELSEDO 120 K = 1,I - 1TEMP = TEMP - DCONJG(A(K,I))*B(K,J)120 CONTINUEIF (NOUNIT) TEMP = TEMP/DCONJG(A(I,I))END IFB(I,J) = TEMP130 CONTINUE140 CONTINUEELSEDO 180 J = 1,NDO 170 I = M,1,-1TEMP = ALPHA*B(I,J)IF (NOCONJ) THENDO 150 K = I + 1,MTEMP = TEMP - A(K,I)*B(K,J)150 CONTINUEIF (NOUNIT) TEMP = TEMP/A(I,I)ELSEDO 160 K = I + 1,MTEMP = TEMP - DCONJG(A(K,I))*B(K,J)160 CONTINUEIF (NOUNIT) TEMP = TEMP/DCONJG(A(I,I))END IFB(I,J) = TEMP170 CONTINUE180 CONTINUEEND IFEND IFELSEIF (LSAME(TRANSA,'N')) THEN** Form B := alpha*B*inv( A ).*IF (UPPER) THENDO 230 J = 1,NIF (ALPHA.NE.ONE) THENDO 190 I = 1,MB(I,J) = ALPHA*B(I,J)190 CONTINUEEND IFDO 210 K = 1,J - 1c IF (A(K,J).NE.ZERO) THENDO 200 I = 1,MB(I,J) = B(I,J) - A(K,J)*B(I,K)200 CONTINUEc END IF210 CONTINUEIF (NOUNIT) THENTEMP = ONE/A(J,J)DO 220 I = 1,MB(I,J) = TEMP*B(I,J)220 CONTINUEEND IF230 CONTINUEELSEDO 280 J = N,1,-1IF (ALPHA.NE.ONE) THENDO 240 I = 1,MB(I,J) = ALPHA*B(I,J)240 CONTINUEEND IFDO 260 K = J + 1,Nc IF (A(K,J).NE.ZERO) THENDO 250 I = 1,MB(I,J) = B(I,J) - A(K,J)*B(I,K)250 CONTINUEc END IF260 CONTINUEIF (NOUNIT) THENTEMP = ONE/A(J,J)DO 270 I = 1,MB(I,J) = TEMP*B(I,J)270 CONTINUEEND IF280 CONTINUEEND IFELSE** Form B := alpha*B*inv( A**T )* or B := alpha*B*inv( A**H ).*IF (UPPER) THENDO 330 K = N,1,-1IF (NOUNIT) THENIF (NOCONJ) THENTEMP = ONE/A(K,K)ELSETEMP = ONE/DCONJG(A(K,K))END IFDO 290 I = 1,MB(I,K) = TEMP*B(I,K)290 CONTINUEEND IFDO 310 J = 1,K - 1c IF (A(J,K).NE.ZERO) THENIF (NOCONJ) THENTEMP = A(J,K)ELSETEMP = DCONJG(A(J,K))END IFDO 300 I = 1,MB(I,J) = B(I,J) - TEMP*B(I,K)300 CONTINUEc END IF310 CONTINUEIF (ALPHA.NE.ONE) THENDO 320 I = 1,MB(I,K) = ALPHA*B(I,K)320 CONTINUEEND IF330 CONTINUEELSEDO 380 K = 1,NIF (NOUNIT) THENIF (NOCONJ) THENTEMP = ONE/A(K,K)ELSETEMP = ONE/DCONJG(A(K,K))END IFDO 340 I = 1,MB(I,K) = TEMP*B(I,K)340 CONTINUEEND IFDO 360 J = K + 1,Nc IF (A(J,K).NE.ZERO) THENIF (NOCONJ) THENTEMP = A(J,K)ELSETEMP = DCONJG(A(J,K))END IFDO 350 I = 1,MB(I,J) = B(I,J) - TEMP*B(I,K)350 CONTINUEc END IF360 CONTINUEIF (ALPHA.NE.ONE) THENDO 370 I = 1,MB(I,K) = ALPHA*B(I,K)370 CONTINUEEND IF380 CONTINUEEND IFEND IFEND IF*RETURN** End of ZTRSM*END*> \brief \b ZTRSV** =========== DOCUMENTATION ===========** Online html documentation available at* http://www.netlib.org/lapack/explore-html/** Definition:* ===========** SUBROUTINE ZTRSV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX)** .. Scalar Arguments ..* INTEGER INCX,LDA,N* CHARACTER DIAG,TRANS,UPLO* ..* .. Array Arguments ..* DOUBLE COMPLEX A(LDA,*),X(*)* ..***> \par Purpose:* =============*>*> \verbatim*>*> ZTRSV solves one of the systems of equations*>*> A*x = b, or A**T*x = b, or A**H*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**H*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 COMPLEX 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 COMPLEX 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 complex16_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 ZTRSV(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 COMPLEX A(LDA,*),X(*)* ..** =====================================================================** .. Parameters ..DOUBLE COMPLEX ZEROPARAMETER (ZERO= (0.0D+0,0.0D+0))* ..* .. Local Scalars ..DOUBLE COMPLEX TEMPINTEGER I,INFO,IX,J,JX,KXLOGICAL NOCONJ,NOUNIT* ..* .. External Functions ..LOGICAL LSAMEEXTERNAL LSAME* ..* .. External Subroutines ..EXTERNAL XERBLA* ..* .. Intrinsic Functions ..INTRINSIC DCONJG,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('ZTRSV ',INFO)RETURNEND IF** Quick return if possible.*IF (N.EQ.0) RETURN*NOCONJ = LSAME(TRANS,'T')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 or x := inv( A**H )*x.*IF (LSAME(UPLO,'U')) THENIF (INCX.EQ.1) THENDO 110 J = 1,NTEMP = X(J)IF (NOCONJ) THENDO 90 I = 1,J - 1TEMP = TEMP - A(I,J)*X(I)90 CONTINUEIF (NOUNIT) TEMP = TEMP/A(J,J)ELSEDO 100 I = 1,J - 1TEMP = TEMP - DCONJG(A(I,J))*X(I)100 CONTINUEIF (NOUNIT) TEMP = TEMP/DCONJG(A(J,J))END IFX(J) = TEMP110 CONTINUEELSEJX = KXDO 140 J = 1,NIX = KXTEMP = X(JX)IF (NOCONJ) THENDO 120 I = 1,J - 1TEMP = TEMP - A(I,J)*X(IX)IX = IX + INCX120 CONTINUEIF (NOUNIT) TEMP = TEMP/A(J,J)ELSEDO 130 I = 1,J - 1TEMP = TEMP - DCONJG(A(I,J))*X(IX)IX = IX + INCX130 CONTINUEIF (NOUNIT) TEMP = TEMP/DCONJG(A(J,J))END IFX(JX) = TEMPJX = JX + INCX140 CONTINUEEND IFELSEIF (INCX.EQ.1) THENDO 170 J = N,1,-1TEMP = X(J)IF (NOCONJ) THENDO 150 I = N,J + 1,-1TEMP = TEMP - A(I,J)*X(I)150 CONTINUEIF (NOUNIT) TEMP = TEMP/A(J,J)ELSEDO 160 I = N,J + 1,-1TEMP = TEMP - DCONJG(A(I,J))*X(I)160 CONTINUEIF (NOUNIT) TEMP = TEMP/DCONJG(A(J,J))END IFX(J) = TEMP170 CONTINUEELSEKX = KX + (N-1)*INCXJX = KXDO 200 J = N,1,-1IX = KXTEMP = X(JX)IF (NOCONJ) THENDO 180 I = N,J + 1,-1TEMP = TEMP - A(I,J)*X(IX)IX = IX - INCX180 CONTINUEIF (NOUNIT) TEMP = TEMP/A(J,J)ELSEDO 190 I = N,J + 1,-1TEMP = TEMP - DCONJG(A(I,J))*X(IX)IX = IX - INCX190 CONTINUEIF (NOUNIT) TEMP = TEMP/DCONJG(A(J,J))END IFX(JX) = TEMPJX = JX - INCX200 CONTINUEEND IFEND IFEND IF*RETURN** End of ZTRSV*END