This is mostly a long term maintenance improvement.
Many coding styles require elimination of trailing whitespace, and
many editors and source code management configurations automatically
gobble up whitespace. When these tools gobble up whitespace, it
complicates reviewing the meaningful code changes.
By removing whitespace on one patch, it makes future
code reviews much easier.
=SCRIPT====================================================================
if which tempfile &>/dev/null; then
TEMPMAKER=tempfile
elif which mktemp &>/dev/null; then
TEMPMAKER=mktemp
else
echo "Cannot find tempfile program." 2>&1
exit 1
fi
MYTEMP=$($TEMPMAKER)
trap 'rm -f $MYTEMP' SIGINT SIGTERM
stripit() {
echo "stripping $1"
sed 's/[ \t]*$//' "$1" > $MYTEMP
cp $MYTEMP "$1"
}
if [ $# -gt 0 ]; then
while [ "$1" != "" ]; do
stripit $1
shift
done
else
while read -t 2; do
stripit $REPLY
done
fi
rm $MYTEMP
=================================================
374 lines
11 KiB
FortranFixed
374 lines
11 KiB
FortranFixed
*> \brief \b CTRMV
|
|
*
|
|
* =========== DOCUMENTATION ===========
|
|
*
|
|
* Online html documentation available at
|
|
* http://www.netlib.org/lapack/explore-html/
|
|
*
|
|
* Definition:
|
|
* ===========
|
|
*
|
|
* SUBROUTINE CTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX)
|
|
*
|
|
* .. Scalar Arguments ..
|
|
* INTEGER INCX,LDA,N
|
|
* CHARACTER DIAG,TRANS,UPLO
|
|
* ..
|
|
* .. Array Arguments ..
|
|
* COMPLEX A(LDA,*),X(*)
|
|
* ..
|
|
*
|
|
*
|
|
*> \par Purpose:
|
|
* =============
|
|
*>
|
|
*> \verbatim
|
|
*>
|
|
*> CTRMV 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 COMPLEX array of DIMENSION ( LDA, n ).
|
|
*> Before entry with UPLO = 'U' or 'u', the leading n by n
|
|
*> upper triangular part of the array A must contain the upper
|
|
*> triangular 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 COMPLEX array of 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.
|
|
*
|
|
*> \date November 2011
|
|
*
|
|
*> \ingroup complex_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 CTRMV(UPLO,TRANS,DIAG,N,A,LDA,X,INCX)
|
|
*
|
|
* -- Reference BLAS level2 routine (version 3.4.0) --
|
|
* -- Reference BLAS is a software package provided by Univ. of Tennessee, --
|
|
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
|
|
* November 2011
|
|
*
|
|
* .. Scalar Arguments ..
|
|
INTEGER INCX,LDA,N
|
|
CHARACTER DIAG,TRANS,UPLO
|
|
* ..
|
|
* .. Array Arguments ..
|
|
COMPLEX A(LDA,*),X(*)
|
|
* ..
|
|
*
|
|
* =====================================================================
|
|
*
|
|
* .. Parameters ..
|
|
COMPLEX ZERO
|
|
PARAMETER (ZERO= (0.0E+0,0.0E+0))
|
|
* ..
|
|
* .. Local Scalars ..
|
|
COMPLEX TEMP
|
|
INTEGER I,INFO,IX,J,JX,KX
|
|
LOGICAL NOCONJ,NOUNIT
|
|
* ..
|
|
* .. External Functions ..
|
|
LOGICAL LSAME
|
|
EXTERNAL LSAME
|
|
* ..
|
|
* .. External Subroutines ..
|
|
EXTERNAL XERBLA
|
|
* ..
|
|
* .. Intrinsic Functions ..
|
|
INTRINSIC CONJG,MAX
|
|
* ..
|
|
*
|
|
* Test the input parameters.
|
|
*
|
|
INFO = 0
|
|
IF (.NOT.LSAME(UPLO,'U') .AND. .NOT.LSAME(UPLO,'L')) THEN
|
|
INFO = 1
|
|
ELSE IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.
|
|
+ .NOT.LSAME(TRANS,'C')) THEN
|
|
INFO = 2
|
|
ELSE IF (.NOT.LSAME(DIAG,'U') .AND. .NOT.LSAME(DIAG,'N')) THEN
|
|
INFO = 3
|
|
ELSE IF (N.LT.0) THEN
|
|
INFO = 4
|
|
ELSE IF (LDA.LT.MAX(1,N)) THEN
|
|
INFO = 6
|
|
ELSE IF (INCX.EQ.0) THEN
|
|
INFO = 8
|
|
END IF
|
|
IF (INFO.NE.0) THEN
|
|
CALL XERBLA('CTRMV ',INFO)
|
|
RETURN
|
|
END 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) THEN
|
|
KX = 1 - (N-1)*INCX
|
|
ELSE IF (INCX.NE.1) THEN
|
|
KX = 1
|
|
END 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')) THEN
|
|
IF (INCX.EQ.1) THEN
|
|
DO 20 J = 1,N
|
|
IF (X(J).NE.ZERO) THEN
|
|
TEMP = X(J)
|
|
DO 10 I = 1,J - 1
|
|
X(I) = X(I) + TEMP*A(I,J)
|
|
10 CONTINUE
|
|
IF (NOUNIT) X(J) = X(J)*A(J,J)
|
|
END IF
|
|
20 CONTINUE
|
|
ELSE
|
|
JX = KX
|
|
DO 40 J = 1,N
|
|
IF (X(JX).NE.ZERO) THEN
|
|
TEMP = X(JX)
|
|
IX = KX
|
|
DO 30 I = 1,J - 1
|
|
X(IX) = X(IX) + TEMP*A(I,J)
|
|
IX = IX + INCX
|
|
30 CONTINUE
|
|
IF (NOUNIT) X(JX) = X(JX)*A(J,J)
|
|
END IF
|
|
JX = JX + INCX
|
|
40 CONTINUE
|
|
END IF
|
|
ELSE
|
|
IF (INCX.EQ.1) THEN
|
|
DO 60 J = N,1,-1
|
|
IF (X(J).NE.ZERO) THEN
|
|
TEMP = X(J)
|
|
DO 50 I = N,J + 1,-1
|
|
X(I) = X(I) + TEMP*A(I,J)
|
|
50 CONTINUE
|
|
IF (NOUNIT) X(J) = X(J)*A(J,J)
|
|
END IF
|
|
60 CONTINUE
|
|
ELSE
|
|
KX = KX + (N-1)*INCX
|
|
JX = KX
|
|
DO 80 J = N,1,-1
|
|
IF (X(JX).NE.ZERO) THEN
|
|
TEMP = X(JX)
|
|
IX = KX
|
|
DO 70 I = N,J + 1,-1
|
|
X(IX) = X(IX) + TEMP*A(I,J)
|
|
IX = IX - INCX
|
|
70 CONTINUE
|
|
IF (NOUNIT) X(JX) = X(JX)*A(J,J)
|
|
END IF
|
|
JX = JX - INCX
|
|
80 CONTINUE
|
|
END IF
|
|
END IF
|
|
ELSE
|
|
*
|
|
* Form x := A**T*x or x := A**H*x.
|
|
*
|
|
IF (LSAME(UPLO,'U')) THEN
|
|
IF (INCX.EQ.1) THEN
|
|
DO 110 J = N,1,-1
|
|
TEMP = X(J)
|
|
IF (NOCONJ) THEN
|
|
IF (NOUNIT) TEMP = TEMP*A(J,J)
|
|
DO 90 I = J - 1,1,-1
|
|
TEMP = TEMP + A(I,J)*X(I)
|
|
90 CONTINUE
|
|
ELSE
|
|
IF (NOUNIT) TEMP = TEMP*CONJG(A(J,J))
|
|
DO 100 I = J - 1,1,-1
|
|
TEMP = TEMP + CONJG(A(I,J))*X(I)
|
|
100 CONTINUE
|
|
END IF
|
|
X(J) = TEMP
|
|
110 CONTINUE
|
|
ELSE
|
|
JX = KX + (N-1)*INCX
|
|
DO 140 J = N,1,-1
|
|
TEMP = X(JX)
|
|
IX = JX
|
|
IF (NOCONJ) THEN
|
|
IF (NOUNIT) TEMP = TEMP*A(J,J)
|
|
DO 120 I = J - 1,1,-1
|
|
IX = IX - INCX
|
|
TEMP = TEMP + A(I,J)*X(IX)
|
|
120 CONTINUE
|
|
ELSE
|
|
IF (NOUNIT) TEMP = TEMP*CONJG(A(J,J))
|
|
DO 130 I = J - 1,1,-1
|
|
IX = IX - INCX
|
|
TEMP = TEMP + CONJG(A(I,J))*X(IX)
|
|
130 CONTINUE
|
|
END IF
|
|
X(JX) = TEMP
|
|
JX = JX - INCX
|
|
140 CONTINUE
|
|
END IF
|
|
ELSE
|
|
IF (INCX.EQ.1) THEN
|
|
DO 170 J = 1,N
|
|
TEMP = X(J)
|
|
IF (NOCONJ) THEN
|
|
IF (NOUNIT) TEMP = TEMP*A(J,J)
|
|
DO 150 I = J + 1,N
|
|
TEMP = TEMP + A(I,J)*X(I)
|
|
150 CONTINUE
|
|
ELSE
|
|
IF (NOUNIT) TEMP = TEMP*CONJG(A(J,J))
|
|
DO 160 I = J + 1,N
|
|
TEMP = TEMP + CONJG(A(I,J))*X(I)
|
|
160 CONTINUE
|
|
END IF
|
|
X(J) = TEMP
|
|
170 CONTINUE
|
|
ELSE
|
|
JX = KX
|
|
DO 200 J = 1,N
|
|
TEMP = X(JX)
|
|
IX = JX
|
|
IF (NOCONJ) THEN
|
|
IF (NOUNIT) TEMP = TEMP*A(J,J)
|
|
DO 180 I = J + 1,N
|
|
IX = IX + INCX
|
|
TEMP = TEMP + A(I,J)*X(IX)
|
|
180 CONTINUE
|
|
ELSE
|
|
IF (NOUNIT) TEMP = TEMP*CONJG(A(J,J))
|
|
DO 190 I = J + 1,N
|
|
IX = IX + INCX
|
|
TEMP = TEMP + CONJG(A(I,J))*X(IX)
|
|
190 CONTINUE
|
|
END IF
|
|
X(JX) = TEMP
|
|
JX = JX + INCX
|
|
200 CONTINUE
|
|
END IF
|
|
END IF
|
|
END IF
|
|
*
|
|
RETURN
|
|
*
|
|
* End of CTRMV .
|
|
*
|
|
END
|