mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-12 03:39:01 +08:00
Implement packed triangular matrix-vector product.
This commit is contained in:
parent
2828c995c5
commit
3642ca4d46
@ -18,9 +18,9 @@ if(EIGEN_Fortran_COMPILER_WORKS)
|
|||||||
set(EigenBlas_SRCS ${EigenBlas_SRCS}
|
set(EigenBlas_SRCS ${EigenBlas_SRCS}
|
||||||
complexdots.f
|
complexdots.f
|
||||||
srotm.f srotmg.f drotm.f drotmg.f
|
srotm.f srotmg.f drotm.f drotmg.f
|
||||||
lsame.f dspmv.f dtpsv.f ssbmv.f stpmv.f
|
lsame.f dspmv.f dtpsv.f ssbmv.f
|
||||||
chbmv.f chpr.f ctpmv.f sspmv.f stpsv.f
|
chbmv.f chpr.f sspmv.f stpsv.f
|
||||||
zhbmv.f zhpr.f ztpmv.f chpmv.f ctpsv.f dsbmv.f dtpmv.f
|
zhbmv.f zhpr.f chpmv.f ctpsv.f dsbmv.f
|
||||||
zhpmv.f ztpsv.f
|
zhpmv.f ztpsv.f
|
||||||
dtbmv.f stbmv.f ctbmv.f ztbmv.f
|
dtbmv.f stbmv.f ctbmv.f ztbmv.f
|
||||||
)
|
)
|
||||||
|
79
blas/PackedTriangularMatrixVector.h
Normal file
79
blas/PackedTriangularMatrixVector.h
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
// This file is part of Eigen, a lightweight C++ template library
|
||||||
|
// for linear algebra.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2012 Chen-Pang He <jdh8@ms63.hinet.net>
|
||||||
|
//
|
||||||
|
// This Source Code Form is subject to the terms of the Mozilla
|
||||||
|
// Public License v. 2.0. If a copy of the MPL was not distributed
|
||||||
|
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
#ifndef EIGEN_PACKED_TRIANGULAR_MATRIX_VECTOR_H
|
||||||
|
#define EIGEN_PACKED_TRIANGULAR_MATRIX_VECTOR_H
|
||||||
|
|
||||||
|
namespace internal {
|
||||||
|
|
||||||
|
template<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs, int StorageOrder>
|
||||||
|
struct packed_triangular_matrix_vector_product;
|
||||||
|
|
||||||
|
template<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs>
|
||||||
|
struct packed_triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,ColMajor>
|
||||||
|
{
|
||||||
|
typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;
|
||||||
|
enum {
|
||||||
|
IsLower = (Mode & Lower) ==Lower,
|
||||||
|
HasUnitDiag = (Mode & UnitDiag)==UnitDiag,
|
||||||
|
HasZeroDiag = (Mode & ZeroDiag)==ZeroDiag
|
||||||
|
};
|
||||||
|
static void run(Index size, const LhsScalar* lhs, const RhsScalar* rhs, ResScalar* res, ResScalar alpha)
|
||||||
|
{
|
||||||
|
internal::conj_if<ConjRhs> cj;
|
||||||
|
typedef Map<const Matrix<LhsScalar,Dynamic,1> > LhsMap;
|
||||||
|
typedef typename conj_expr_if<ConjLhs,LhsMap>::type ConjLhsType;
|
||||||
|
typedef Map<Matrix<ResScalar,Dynamic,1> > ResMap;
|
||||||
|
|
||||||
|
for (Index i=0; i<size; ++i)
|
||||||
|
{
|
||||||
|
Index s = IsLower&&(HasUnitDiag||HasZeroDiag) ? 1 : 0;
|
||||||
|
Index r = IsLower ? size-i: i+1;
|
||||||
|
if (EIGEN_IMPLIES(HasUnitDiag||HasZeroDiag, (--r)>0))
|
||||||
|
ResMap(res+(IsLower ? s+i : 0),r) += alpha * cj(rhs[i]) * ConjLhsType(LhsMap(lhs+s,r));
|
||||||
|
if (HasUnitDiag)
|
||||||
|
res[i] += alpha * cj(rhs[i]);
|
||||||
|
lhs += IsLower ? size-i: i+1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs>
|
||||||
|
struct packed_triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,RowMajor>
|
||||||
|
{
|
||||||
|
typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;
|
||||||
|
enum {
|
||||||
|
IsLower = (Mode & Lower) ==Lower,
|
||||||
|
HasUnitDiag = (Mode & UnitDiag)==UnitDiag,
|
||||||
|
HasZeroDiag = (Mode & ZeroDiag)==ZeroDiag
|
||||||
|
};
|
||||||
|
static void run(Index size, const LhsScalar* lhs, const RhsScalar* rhs, ResScalar* res, ResScalar alpha)
|
||||||
|
{
|
||||||
|
internal::conj_if<ConjRhs> cj;
|
||||||
|
typedef Map<const Matrix<LhsScalar,Dynamic,1> > LhsMap;
|
||||||
|
typedef typename conj_expr_if<ConjLhs,LhsMap>::type ConjLhsType;
|
||||||
|
typedef Map<const Matrix<RhsScalar,Dynamic,1> > RhsMap;
|
||||||
|
typedef typename conj_expr_if<ConjRhs,RhsMap>::type ConjRhsType;
|
||||||
|
|
||||||
|
for (Index i=0; i<size; ++i)
|
||||||
|
{
|
||||||
|
Index s = !IsLower&&(HasUnitDiag||HasZeroDiag) ? 1 : 0;
|
||||||
|
Index r = IsLower ? i+1 : size-i;
|
||||||
|
if (EIGEN_IMPLIES(HasUnitDiag||HasZeroDiag, (--r)>0))
|
||||||
|
res[i] += alpha * (ConjLhsType(LhsMap(lhs+s,r)).cwiseProduct(ConjRhsType(RhsMap(rhs+(IsLower ? 0 : s+i),r)))).sum();
|
||||||
|
if (HasUnitDiag)
|
||||||
|
res[i] += alpha * cj(rhs[i]);
|
||||||
|
lhs += IsLower ? i+1 : size-i;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // end namespace internal
|
||||||
|
|
||||||
|
#endif // EIGEN_PACKED_TRIANGULAR_MATRIX_VECTOR_H
|
@ -76,6 +76,7 @@ namespace Eigen {
|
|||||||
#include "BandTriangularSolver.h"
|
#include "BandTriangularSolver.h"
|
||||||
#include "GeneralRank1Update.h"
|
#include "GeneralRank1Update.h"
|
||||||
#include "PackedSelfadjointProduct.h"
|
#include "PackedSelfadjointProduct.h"
|
||||||
|
#include "PackedTriangularMatrixVector.h"
|
||||||
#include "Rank2Update.h"
|
#include "Rank2Update.h"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
329
blas/ctpmv.f
329
blas/ctpmv.f
@ -1,329 +0,0 @@
|
|||||||
SUBROUTINE CTPMV(UPLO,TRANS,DIAG,N,AP,X,INCX)
|
|
||||||
* .. Scalar Arguments ..
|
|
||||||
INTEGER INCX,N
|
|
||||||
CHARACTER DIAG,TRANS,UPLO
|
|
||||||
* ..
|
|
||||||
* .. Array Arguments ..
|
|
||||||
COMPLEX AP(*),X(*)
|
|
||||||
* ..
|
|
||||||
*
|
|
||||||
* Purpose
|
|
||||||
* =======
|
|
||||||
*
|
|
||||||
* CTPMV performs one of the matrix-vector operations
|
|
||||||
*
|
|
||||||
* x := A*x, or x := A'*x, or x := conjg( A' )*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.
|
|
||||||
*
|
|
||||||
* Arguments
|
|
||||||
* ==========
|
|
||||||
*
|
|
||||||
* UPLO - CHARACTER*1.
|
|
||||||
* On entry, UPLO specifies whether the matrix is an upper or
|
|
||||||
* lower triangular matrix as follows:
|
|
||||||
*
|
|
||||||
* UPLO = 'U' or 'u' A is an upper triangular matrix.
|
|
||||||
*
|
|
||||||
* UPLO = 'L' or 'l' A is a lower triangular matrix.
|
|
||||||
*
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* TRANS - CHARACTER*1.
|
|
||||||
* On entry, TRANS specifies the operation to be performed as
|
|
||||||
* follows:
|
|
||||||
*
|
|
||||||
* TRANS = 'N' or 'n' x := A*x.
|
|
||||||
*
|
|
||||||
* TRANS = 'T' or 't' x := A'*x.
|
|
||||||
*
|
|
||||||
* TRANS = 'C' or 'c' x := conjg( A' )*x.
|
|
||||||
*
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* DIAG - CHARACTER*1.
|
|
||||||
* On entry, DIAG specifies whether or not A is unit
|
|
||||||
* triangular as follows:
|
|
||||||
*
|
|
||||||
* DIAG = 'U' or 'u' A is assumed to be unit triangular.
|
|
||||||
*
|
|
||||||
* DIAG = 'N' or 'n' A is not assumed to be unit
|
|
||||||
* triangular.
|
|
||||||
*
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* N - INTEGER.
|
|
||||||
* On entry, N specifies the order of the matrix A.
|
|
||||||
* N must be at least zero.
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* AP - COMPLEX array of DIMENSION at least
|
|
||||||
* ( ( n*( n + 1 ) )/2 ).
|
|
||||||
* Before entry with UPLO = 'U' or 'u', the array AP must
|
|
||||||
* contain the upper triangular matrix packed sequentially,
|
|
||||||
* column by column, so that AP( 1 ) contains a( 1, 1 ),
|
|
||||||
* AP( 2 ) and AP( 3 ) contain a( 1, 2 ) and a( 2, 2 )
|
|
||||||
* respectively, and so on.
|
|
||||||
* Before entry with UPLO = 'L' or 'l', the array AP must
|
|
||||||
* contain the lower triangular matrix packed sequentially,
|
|
||||||
* column by column, so that AP( 1 ) contains a( 1, 1 ),
|
|
||||||
* AP( 2 ) and AP( 3 ) contain a( 2, 1 ) and a( 3, 1 )
|
|
||||||
* respectively, and so on.
|
|
||||||
* Note that when DIAG = 'U' or 'u', the diagonal elements of
|
|
||||||
* A are not referenced, but are assumed to be unity.
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* X - 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
|
|
||||||
* tranformed vector x.
|
|
||||||
*
|
|
||||||
* INCX - INTEGER.
|
|
||||||
* On entry, INCX specifies the increment for the elements of
|
|
||||||
* X. INCX must not be zero.
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* Further Details
|
|
||||||
* ===============
|
|
||||||
*
|
|
||||||
* Level 2 Blas routine.
|
|
||||||
*
|
|
||||||
* -- Written on 22-October-1986.
|
|
||||||
* Jack Dongarra, Argonne National Lab.
|
|
||||||
* Jeremy Du Croz, Nag Central Office.
|
|
||||||
* Sven Hammarling, Nag Central Office.
|
|
||||||
* Richard Hanson, Sandia National Labs.
|
|
||||||
*
|
|
||||||
* =====================================================================
|
|
||||||
*
|
|
||||||
* .. Parameters ..
|
|
||||||
COMPLEX ZERO
|
|
||||||
PARAMETER (ZERO= (0.0E+0,0.0E+0))
|
|
||||||
* ..
|
|
||||||
* .. Local Scalars ..
|
|
||||||
COMPLEX TEMP
|
|
||||||
INTEGER I,INFO,IX,J,JX,K,KK,KX
|
|
||||||
LOGICAL NOCONJ,NOUNIT
|
|
||||||
* ..
|
|
||||||
* .. External Functions ..
|
|
||||||
LOGICAL LSAME
|
|
||||||
EXTERNAL LSAME
|
|
||||||
* ..
|
|
||||||
* .. External Subroutines ..
|
|
||||||
EXTERNAL XERBLA
|
|
||||||
* ..
|
|
||||||
* .. Intrinsic Functions ..
|
|
||||||
INTRINSIC CONJG
|
|
||||||
* ..
|
|
||||||
*
|
|
||||||
* 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 (INCX.EQ.0) THEN
|
|
||||||
INFO = 7
|
|
||||||
END IF
|
|
||||||
IF (INFO.NE.0) THEN
|
|
||||||
CALL XERBLA('CTPMV ',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 AP are
|
|
||||||
* accessed sequentially with one pass through AP.
|
|
||||||
*
|
|
||||||
IF (LSAME(TRANS,'N')) THEN
|
|
||||||
*
|
|
||||||
* Form x:= A*x.
|
|
||||||
*
|
|
||||||
IF (LSAME(UPLO,'U')) THEN
|
|
||||||
KK = 1
|
|
||||||
IF (INCX.EQ.1) THEN
|
|
||||||
DO 20 J = 1,N
|
|
||||||
IF (X(J).NE.ZERO) THEN
|
|
||||||
TEMP = X(J)
|
|
||||||
K = KK
|
|
||||||
DO 10 I = 1,J - 1
|
|
||||||
X(I) = X(I) + TEMP*AP(K)
|
|
||||||
K = K + 1
|
|
||||||
10 CONTINUE
|
|
||||||
IF (NOUNIT) X(J) = X(J)*AP(KK+J-1)
|
|
||||||
END IF
|
|
||||||
KK = KK + J
|
|
||||||
20 CONTINUE
|
|
||||||
ELSE
|
|
||||||
JX = KX
|
|
||||||
DO 40 J = 1,N
|
|
||||||
IF (X(JX).NE.ZERO) THEN
|
|
||||||
TEMP = X(JX)
|
|
||||||
IX = KX
|
|
||||||
DO 30 K = KK,KK + J - 2
|
|
||||||
X(IX) = X(IX) + TEMP*AP(K)
|
|
||||||
IX = IX + INCX
|
|
||||||
30 CONTINUE
|
|
||||||
IF (NOUNIT) X(JX) = X(JX)*AP(KK+J-1)
|
|
||||||
END IF
|
|
||||||
JX = JX + INCX
|
|
||||||
KK = KK + J
|
|
||||||
40 CONTINUE
|
|
||||||
END IF
|
|
||||||
ELSE
|
|
||||||
KK = (N* (N+1))/2
|
|
||||||
IF (INCX.EQ.1) THEN
|
|
||||||
DO 60 J = N,1,-1
|
|
||||||
IF (X(J).NE.ZERO) THEN
|
|
||||||
TEMP = X(J)
|
|
||||||
K = KK
|
|
||||||
DO 50 I = N,J + 1,-1
|
|
||||||
X(I) = X(I) + TEMP*AP(K)
|
|
||||||
K = K - 1
|
|
||||||
50 CONTINUE
|
|
||||||
IF (NOUNIT) X(J) = X(J)*AP(KK-N+J)
|
|
||||||
END IF
|
|
||||||
KK = KK - (N-J+1)
|
|
||||||
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 K = KK,KK - (N- (J+1)),-1
|
|
||||||
X(IX) = X(IX) + TEMP*AP(K)
|
|
||||||
IX = IX - INCX
|
|
||||||
70 CONTINUE
|
|
||||||
IF (NOUNIT) X(JX) = X(JX)*AP(KK-N+J)
|
|
||||||
END IF
|
|
||||||
JX = JX - INCX
|
|
||||||
KK = KK - (N-J+1)
|
|
||||||
80 CONTINUE
|
|
||||||
END IF
|
|
||||||
END IF
|
|
||||||
ELSE
|
|
||||||
*
|
|
||||||
* Form x := A'*x or x := conjg( A' )*x.
|
|
||||||
*
|
|
||||||
IF (LSAME(UPLO,'U')) THEN
|
|
||||||
KK = (N* (N+1))/2
|
|
||||||
IF (INCX.EQ.1) THEN
|
|
||||||
DO 110 J = N,1,-1
|
|
||||||
TEMP = X(J)
|
|
||||||
K = KK - 1
|
|
||||||
IF (NOCONJ) THEN
|
|
||||||
IF (NOUNIT) TEMP = TEMP*AP(KK)
|
|
||||||
DO 90 I = J - 1,1,-1
|
|
||||||
TEMP = TEMP + AP(K)*X(I)
|
|
||||||
K = K - 1
|
|
||||||
90 CONTINUE
|
|
||||||
ELSE
|
|
||||||
IF (NOUNIT) TEMP = TEMP*CONJG(AP(KK))
|
|
||||||
DO 100 I = J - 1,1,-1
|
|
||||||
TEMP = TEMP + CONJG(AP(K))*X(I)
|
|
||||||
K = K - 1
|
|
||||||
100 CONTINUE
|
|
||||||
END IF
|
|
||||||
X(J) = TEMP
|
|
||||||
KK = KK - J
|
|
||||||
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*AP(KK)
|
|
||||||
DO 120 K = KK - 1,KK - J + 1,-1
|
|
||||||
IX = IX - INCX
|
|
||||||
TEMP = TEMP + AP(K)*X(IX)
|
|
||||||
120 CONTINUE
|
|
||||||
ELSE
|
|
||||||
IF (NOUNIT) TEMP = TEMP*CONJG(AP(KK))
|
|
||||||
DO 130 K = KK - 1,KK - J + 1,-1
|
|
||||||
IX = IX - INCX
|
|
||||||
TEMP = TEMP + CONJG(AP(K))*X(IX)
|
|
||||||
130 CONTINUE
|
|
||||||
END IF
|
|
||||||
X(JX) = TEMP
|
|
||||||
JX = JX - INCX
|
|
||||||
KK = KK - J
|
|
||||||
140 CONTINUE
|
|
||||||
END IF
|
|
||||||
ELSE
|
|
||||||
KK = 1
|
|
||||||
IF (INCX.EQ.1) THEN
|
|
||||||
DO 170 J = 1,N
|
|
||||||
TEMP = X(J)
|
|
||||||
K = KK + 1
|
|
||||||
IF (NOCONJ) THEN
|
|
||||||
IF (NOUNIT) TEMP = TEMP*AP(KK)
|
|
||||||
DO 150 I = J + 1,N
|
|
||||||
TEMP = TEMP + AP(K)*X(I)
|
|
||||||
K = K + 1
|
|
||||||
150 CONTINUE
|
|
||||||
ELSE
|
|
||||||
IF (NOUNIT) TEMP = TEMP*CONJG(AP(KK))
|
|
||||||
DO 160 I = J + 1,N
|
|
||||||
TEMP = TEMP + CONJG(AP(K))*X(I)
|
|
||||||
K = K + 1
|
|
||||||
160 CONTINUE
|
|
||||||
END IF
|
|
||||||
X(J) = TEMP
|
|
||||||
KK = KK + (N-J+1)
|
|
||||||
170 CONTINUE
|
|
||||||
ELSE
|
|
||||||
JX = KX
|
|
||||||
DO 200 J = 1,N
|
|
||||||
TEMP = X(JX)
|
|
||||||
IX = JX
|
|
||||||
IF (NOCONJ) THEN
|
|
||||||
IF (NOUNIT) TEMP = TEMP*AP(KK)
|
|
||||||
DO 180 K = KK + 1,KK + N - J
|
|
||||||
IX = IX + INCX
|
|
||||||
TEMP = TEMP + AP(K)*X(IX)
|
|
||||||
180 CONTINUE
|
|
||||||
ELSE
|
|
||||||
IF (NOUNIT) TEMP = TEMP*CONJG(AP(KK))
|
|
||||||
DO 190 K = KK + 1,KK + N - J
|
|
||||||
IX = IX + INCX
|
|
||||||
TEMP = TEMP + CONJG(AP(K))*X(IX)
|
|
||||||
190 CONTINUE
|
|
||||||
END IF
|
|
||||||
X(JX) = TEMP
|
|
||||||
JX = JX + INCX
|
|
||||||
KK = KK + (N-J+1)
|
|
||||||
200 CONTINUE
|
|
||||||
END IF
|
|
||||||
END IF
|
|
||||||
END IF
|
|
||||||
*
|
|
||||||
RETURN
|
|
||||||
*
|
|
||||||
* End of CTPMV .
|
|
||||||
*
|
|
||||||
END
|
|
293
blas/dtpmv.f
293
blas/dtpmv.f
@ -1,293 +0,0 @@
|
|||||||
SUBROUTINE DTPMV(UPLO,TRANS,DIAG,N,AP,X,INCX)
|
|
||||||
* .. Scalar Arguments ..
|
|
||||||
INTEGER INCX,N
|
|
||||||
CHARACTER DIAG,TRANS,UPLO
|
|
||||||
* ..
|
|
||||||
* .. Array Arguments ..
|
|
||||||
DOUBLE PRECISION AP(*),X(*)
|
|
||||||
* ..
|
|
||||||
*
|
|
||||||
* Purpose
|
|
||||||
* =======
|
|
||||||
*
|
|
||||||
* DTPMV performs one of the matrix-vector operations
|
|
||||||
*
|
|
||||||
* x := A*x, or x := A'*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.
|
|
||||||
*
|
|
||||||
* Arguments
|
|
||||||
* ==========
|
|
||||||
*
|
|
||||||
* UPLO - CHARACTER*1.
|
|
||||||
* On entry, UPLO specifies whether the matrix is an upper or
|
|
||||||
* lower triangular matrix as follows:
|
|
||||||
*
|
|
||||||
* UPLO = 'U' or 'u' A is an upper triangular matrix.
|
|
||||||
*
|
|
||||||
* UPLO = 'L' or 'l' A is a lower triangular matrix.
|
|
||||||
*
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* TRANS - CHARACTER*1.
|
|
||||||
* On entry, TRANS specifies the operation to be performed as
|
|
||||||
* follows:
|
|
||||||
*
|
|
||||||
* TRANS = 'N' or 'n' x := A*x.
|
|
||||||
*
|
|
||||||
* TRANS = 'T' or 't' x := A'*x.
|
|
||||||
*
|
|
||||||
* TRANS = 'C' or 'c' x := A'*x.
|
|
||||||
*
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* DIAG - CHARACTER*1.
|
|
||||||
* On entry, DIAG specifies whether or not A is unit
|
|
||||||
* triangular as follows:
|
|
||||||
*
|
|
||||||
* DIAG = 'U' or 'u' A is assumed to be unit triangular.
|
|
||||||
*
|
|
||||||
* DIAG = 'N' or 'n' A is not assumed to be unit
|
|
||||||
* triangular.
|
|
||||||
*
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* N - INTEGER.
|
|
||||||
* On entry, N specifies the order of the matrix A.
|
|
||||||
* N must be at least zero.
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* AP - DOUBLE PRECISION array of DIMENSION at least
|
|
||||||
* ( ( n*( n + 1 ) )/2 ).
|
|
||||||
* Before entry with UPLO = 'U' or 'u', the array AP must
|
|
||||||
* contain the upper triangular matrix packed sequentially,
|
|
||||||
* column by column, so that AP( 1 ) contains a( 1, 1 ),
|
|
||||||
* AP( 2 ) and AP( 3 ) contain a( 1, 2 ) and a( 2, 2 )
|
|
||||||
* respectively, and so on.
|
|
||||||
* Before entry with UPLO = 'L' or 'l', the array AP must
|
|
||||||
* contain the lower triangular matrix packed sequentially,
|
|
||||||
* column by column, so that AP( 1 ) contains a( 1, 1 ),
|
|
||||||
* AP( 2 ) and AP( 3 ) contain a( 2, 1 ) and a( 3, 1 )
|
|
||||||
* respectively, and so on.
|
|
||||||
* Note that when DIAG = 'U' or 'u', the diagonal elements of
|
|
||||||
* A are not referenced, but are assumed to be unity.
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* X - DOUBLE PRECISION 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
|
|
||||||
* tranformed vector x.
|
|
||||||
*
|
|
||||||
* INCX - INTEGER.
|
|
||||||
* On entry, INCX specifies the increment for the elements of
|
|
||||||
* X. INCX must not be zero.
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* Further Details
|
|
||||||
* ===============
|
|
||||||
*
|
|
||||||
* Level 2 Blas routine.
|
|
||||||
*
|
|
||||||
* -- Written on 22-October-1986.
|
|
||||||
* Jack Dongarra, Argonne National Lab.
|
|
||||||
* Jeremy Du Croz, Nag Central Office.
|
|
||||||
* Sven Hammarling, Nag Central Office.
|
|
||||||
* Richard Hanson, Sandia National Labs.
|
|
||||||
*
|
|
||||||
* =====================================================================
|
|
||||||
*
|
|
||||||
* .. Parameters ..
|
|
||||||
DOUBLE PRECISION ZERO
|
|
||||||
PARAMETER (ZERO=0.0D+0)
|
|
||||||
* ..
|
|
||||||
* .. Local Scalars ..
|
|
||||||
DOUBLE PRECISION TEMP
|
|
||||||
INTEGER I,INFO,IX,J,JX,K,KK,KX
|
|
||||||
LOGICAL NOUNIT
|
|
||||||
* ..
|
|
||||||
* .. External Functions ..
|
|
||||||
LOGICAL LSAME
|
|
||||||
EXTERNAL LSAME
|
|
||||||
* ..
|
|
||||||
* .. External Subroutines ..
|
|
||||||
EXTERNAL XERBLA
|
|
||||||
* ..
|
|
||||||
*
|
|
||||||
* 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 (INCX.EQ.0) THEN
|
|
||||||
INFO = 7
|
|
||||||
END IF
|
|
||||||
IF (INFO.NE.0) THEN
|
|
||||||
CALL XERBLA('DTPMV ',INFO)
|
|
||||||
RETURN
|
|
||||||
END IF
|
|
||||||
*
|
|
||||||
* Quick return if possible.
|
|
||||||
*
|
|
||||||
IF (N.EQ.0) RETURN
|
|
||||||
*
|
|
||||||
NOUNIT = LSAME(DIAG,'N')
|
|
||||||
*
|
|
||||||
* Set up the start point in X if the increment is not unity. This
|
|
||||||
* will be ( N - 1 )*INCX too small for descending loops.
|
|
||||||
*
|
|
||||||
IF (INCX.LE.0) 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 AP are
|
|
||||||
* accessed sequentially with one pass through AP.
|
|
||||||
*
|
|
||||||
IF (LSAME(TRANS,'N')) THEN
|
|
||||||
*
|
|
||||||
* Form x:= A*x.
|
|
||||||
*
|
|
||||||
IF (LSAME(UPLO,'U')) THEN
|
|
||||||
KK = 1
|
|
||||||
IF (INCX.EQ.1) THEN
|
|
||||||
DO 20 J = 1,N
|
|
||||||
IF (X(J).NE.ZERO) THEN
|
|
||||||
TEMP = X(J)
|
|
||||||
K = KK
|
|
||||||
DO 10 I = 1,J - 1
|
|
||||||
X(I) = X(I) + TEMP*AP(K)
|
|
||||||
K = K + 1
|
|
||||||
10 CONTINUE
|
|
||||||
IF (NOUNIT) X(J) = X(J)*AP(KK+J-1)
|
|
||||||
END IF
|
|
||||||
KK = KK + J
|
|
||||||
20 CONTINUE
|
|
||||||
ELSE
|
|
||||||
JX = KX
|
|
||||||
DO 40 J = 1,N
|
|
||||||
IF (X(JX).NE.ZERO) THEN
|
|
||||||
TEMP = X(JX)
|
|
||||||
IX = KX
|
|
||||||
DO 30 K = KK,KK + J - 2
|
|
||||||
X(IX) = X(IX) + TEMP*AP(K)
|
|
||||||
IX = IX + INCX
|
|
||||||
30 CONTINUE
|
|
||||||
IF (NOUNIT) X(JX) = X(JX)*AP(KK+J-1)
|
|
||||||
END IF
|
|
||||||
JX = JX + INCX
|
|
||||||
KK = KK + J
|
|
||||||
40 CONTINUE
|
|
||||||
END IF
|
|
||||||
ELSE
|
|
||||||
KK = (N* (N+1))/2
|
|
||||||
IF (INCX.EQ.1) THEN
|
|
||||||
DO 60 J = N,1,-1
|
|
||||||
IF (X(J).NE.ZERO) THEN
|
|
||||||
TEMP = X(J)
|
|
||||||
K = KK
|
|
||||||
DO 50 I = N,J + 1,-1
|
|
||||||
X(I) = X(I) + TEMP*AP(K)
|
|
||||||
K = K - 1
|
|
||||||
50 CONTINUE
|
|
||||||
IF (NOUNIT) X(J) = X(J)*AP(KK-N+J)
|
|
||||||
END IF
|
|
||||||
KK = KK - (N-J+1)
|
|
||||||
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 K = KK,KK - (N- (J+1)),-1
|
|
||||||
X(IX) = X(IX) + TEMP*AP(K)
|
|
||||||
IX = IX - INCX
|
|
||||||
70 CONTINUE
|
|
||||||
IF (NOUNIT) X(JX) = X(JX)*AP(KK-N+J)
|
|
||||||
END IF
|
|
||||||
JX = JX - INCX
|
|
||||||
KK = KK - (N-J+1)
|
|
||||||
80 CONTINUE
|
|
||||||
END IF
|
|
||||||
END IF
|
|
||||||
ELSE
|
|
||||||
*
|
|
||||||
* Form x := A'*x.
|
|
||||||
*
|
|
||||||
IF (LSAME(UPLO,'U')) THEN
|
|
||||||
KK = (N* (N+1))/2
|
|
||||||
IF (INCX.EQ.1) THEN
|
|
||||||
DO 100 J = N,1,-1
|
|
||||||
TEMP = X(J)
|
|
||||||
IF (NOUNIT) TEMP = TEMP*AP(KK)
|
|
||||||
K = KK - 1
|
|
||||||
DO 90 I = J - 1,1,-1
|
|
||||||
TEMP = TEMP + AP(K)*X(I)
|
|
||||||
K = K - 1
|
|
||||||
90 CONTINUE
|
|
||||||
X(J) = TEMP
|
|
||||||
KK = KK - J
|
|
||||||
100 CONTINUE
|
|
||||||
ELSE
|
|
||||||
JX = KX + (N-1)*INCX
|
|
||||||
DO 120 J = N,1,-1
|
|
||||||
TEMP = X(JX)
|
|
||||||
IX = JX
|
|
||||||
IF (NOUNIT) TEMP = TEMP*AP(KK)
|
|
||||||
DO 110 K = KK - 1,KK - J + 1,-1
|
|
||||||
IX = IX - INCX
|
|
||||||
TEMP = TEMP + AP(K)*X(IX)
|
|
||||||
110 CONTINUE
|
|
||||||
X(JX) = TEMP
|
|
||||||
JX = JX - INCX
|
|
||||||
KK = KK - J
|
|
||||||
120 CONTINUE
|
|
||||||
END IF
|
|
||||||
ELSE
|
|
||||||
KK = 1
|
|
||||||
IF (INCX.EQ.1) THEN
|
|
||||||
DO 140 J = 1,N
|
|
||||||
TEMP = X(J)
|
|
||||||
IF (NOUNIT) TEMP = TEMP*AP(KK)
|
|
||||||
K = KK + 1
|
|
||||||
DO 130 I = J + 1,N
|
|
||||||
TEMP = TEMP + AP(K)*X(I)
|
|
||||||
K = K + 1
|
|
||||||
130 CONTINUE
|
|
||||||
X(J) = TEMP
|
|
||||||
KK = KK + (N-J+1)
|
|
||||||
140 CONTINUE
|
|
||||||
ELSE
|
|
||||||
JX = KX
|
|
||||||
DO 160 J = 1,N
|
|
||||||
TEMP = X(JX)
|
|
||||||
IX = JX
|
|
||||||
IF (NOUNIT) TEMP = TEMP*AP(KK)
|
|
||||||
DO 150 K = KK + 1,KK + N - J
|
|
||||||
IX = IX + INCX
|
|
||||||
TEMP = TEMP + AP(K)*X(IX)
|
|
||||||
150 CONTINUE
|
|
||||||
X(JX) = TEMP
|
|
||||||
JX = JX + INCX
|
|
||||||
KK = KK + (N-J+1)
|
|
||||||
160 CONTINUE
|
|
||||||
END IF
|
|
||||||
END IF
|
|
||||||
END IF
|
|
||||||
*
|
|
||||||
RETURN
|
|
||||||
*
|
|
||||||
* End of DTPMV .
|
|
||||||
*
|
|
||||||
END
|
|
@ -187,7 +187,7 @@ int EIGEN_BLAS_FUNC(trmv)(char *uplo, char *opa, char *diag, int *n, RealScalar
|
|||||||
copy_back(res.data(),b,*n,*incb);
|
copy_back(res.data(),b,*n,*incb);
|
||||||
if(actual_b!=b) delete[] actual_b;
|
if(actual_b!=b) delete[] actual_b;
|
||||||
|
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** GBMV performs one of the matrix-vector operations
|
/** GBMV performs one of the matrix-vector operations
|
||||||
@ -399,10 +399,66 @@ int EIGEN_BLAS_FUNC(tbsv)(char *uplo, char *op, char *diag, int *n, int *k, Real
|
|||||||
* where x is an n element vector and A is an n by n unit, or non-unit,
|
* 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.
|
* upper or lower triangular matrix, supplied in packed form.
|
||||||
*/
|
*/
|
||||||
// int EIGEN_BLAS_FUNC(tpmv)(char *uplo, char *trans, char *diag, int *n, RealScalar *ap, RealScalar *x, int *incx)
|
int EIGEN_BLAS_FUNC(tpmv)(char *uplo, char *opa, char *diag, int *n, RealScalar *pap, RealScalar *px, int *incx)
|
||||||
// {
|
{
|
||||||
// return 1;
|
typedef void (*functype)(int, const Scalar*, const Scalar*, Scalar*, Scalar);
|
||||||
// }
|
static functype func[16];
|
||||||
|
|
||||||
|
static bool init = false;
|
||||||
|
if(!init)
|
||||||
|
{
|
||||||
|
for(int k=0; k<16; ++k)
|
||||||
|
func[k] = 0;
|
||||||
|
|
||||||
|
func[NOTR | (UP << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|0, Scalar,false,Scalar,false,ColMajor>::run);
|
||||||
|
func[TR | (UP << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|0, Scalar,false,Scalar,false,RowMajor>::run);
|
||||||
|
func[ADJ | (UP << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|0, Scalar,Conj, Scalar,false,RowMajor>::run);
|
||||||
|
|
||||||
|
func[NOTR | (LO << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|0, Scalar,false,Scalar,false,ColMajor>::run);
|
||||||
|
func[TR | (LO << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|0, Scalar,false,Scalar,false,RowMajor>::run);
|
||||||
|
func[ADJ | (LO << 2) | (NUNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|0, Scalar,Conj, Scalar,false,RowMajor>::run);
|
||||||
|
|
||||||
|
func[NOTR | (UP << 2) | (UNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,false,Scalar,false,ColMajor>::run);
|
||||||
|
func[TR | (UP << 2) | (UNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,false,Scalar,false,RowMajor>::run);
|
||||||
|
func[ADJ | (UP << 2) | (UNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,Conj, Scalar,false,RowMajor>::run);
|
||||||
|
|
||||||
|
func[NOTR | (LO << 2) | (UNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Lower|UnitDiag,Scalar,false,Scalar,false,ColMajor>::run);
|
||||||
|
func[TR | (LO << 2) | (UNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,false,Scalar,false,RowMajor>::run);
|
||||||
|
func[ADJ | (LO << 2) | (UNIT << 3)] = (internal::packed_triangular_matrix_vector_product<int,Upper|UnitDiag,Scalar,Conj, Scalar,false,RowMajor>::run);
|
||||||
|
|
||||||
|
init = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Scalar* ap = reinterpret_cast<Scalar*>(pap);
|
||||||
|
Scalar* x = reinterpret_cast<Scalar*>(px);
|
||||||
|
|
||||||
|
int info = 0;
|
||||||
|
if(UPLO(*uplo)==INVALID) info = 1;
|
||||||
|
else if(OP(*opa)==INVALID) info = 2;
|
||||||
|
else if(DIAG(*diag)==INVALID) info = 3;
|
||||||
|
else if(*n<0) info = 4;
|
||||||
|
else if(*incx==0) info = 7;
|
||||||
|
if(info)
|
||||||
|
return xerbla_(SCALAR_SUFFIX_UP"TPMV ",&info,6);
|
||||||
|
|
||||||
|
if(*n==0)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
Scalar* actual_x = get_compact_vector(x,*n,*incx);
|
||||||
|
Matrix<Scalar,Dynamic,1> res(*n);
|
||||||
|
res.setZero();
|
||||||
|
|
||||||
|
int code = OP(*opa) | (UPLO(*uplo) << 2) | (DIAG(*diag) << 3);
|
||||||
|
if(code>=16 || func[code]==0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
func[code](*n, ap, actual_x, res.data(), Scalar(1));
|
||||||
|
|
||||||
|
copy_back(res.data(),x,*n,*incx);
|
||||||
|
if(actual_x!=x) delete[] actual_x;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/** DTPSV solves one of the systems of equations
|
/** DTPSV solves one of the systems of equations
|
||||||
*
|
*
|
||||||
|
293
blas/stpmv.f
293
blas/stpmv.f
@ -1,293 +0,0 @@
|
|||||||
SUBROUTINE STPMV(UPLO,TRANS,DIAG,N,AP,X,INCX)
|
|
||||||
* .. Scalar Arguments ..
|
|
||||||
INTEGER INCX,N
|
|
||||||
CHARACTER DIAG,TRANS,UPLO
|
|
||||||
* ..
|
|
||||||
* .. Array Arguments ..
|
|
||||||
REAL AP(*),X(*)
|
|
||||||
* ..
|
|
||||||
*
|
|
||||||
* Purpose
|
|
||||||
* =======
|
|
||||||
*
|
|
||||||
* STPMV performs one of the matrix-vector operations
|
|
||||||
*
|
|
||||||
* x := A*x, or x := A'*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.
|
|
||||||
*
|
|
||||||
* Arguments
|
|
||||||
* ==========
|
|
||||||
*
|
|
||||||
* UPLO - CHARACTER*1.
|
|
||||||
* On entry, UPLO specifies whether the matrix is an upper or
|
|
||||||
* lower triangular matrix as follows:
|
|
||||||
*
|
|
||||||
* UPLO = 'U' or 'u' A is an upper triangular matrix.
|
|
||||||
*
|
|
||||||
* UPLO = 'L' or 'l' A is a lower triangular matrix.
|
|
||||||
*
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* TRANS - CHARACTER*1.
|
|
||||||
* On entry, TRANS specifies the operation to be performed as
|
|
||||||
* follows:
|
|
||||||
*
|
|
||||||
* TRANS = 'N' or 'n' x := A*x.
|
|
||||||
*
|
|
||||||
* TRANS = 'T' or 't' x := A'*x.
|
|
||||||
*
|
|
||||||
* TRANS = 'C' or 'c' x := A'*x.
|
|
||||||
*
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* DIAG - CHARACTER*1.
|
|
||||||
* On entry, DIAG specifies whether or not A is unit
|
|
||||||
* triangular as follows:
|
|
||||||
*
|
|
||||||
* DIAG = 'U' or 'u' A is assumed to be unit triangular.
|
|
||||||
*
|
|
||||||
* DIAG = 'N' or 'n' A is not assumed to be unit
|
|
||||||
* triangular.
|
|
||||||
*
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* N - INTEGER.
|
|
||||||
* On entry, N specifies the order of the matrix A.
|
|
||||||
* N must be at least zero.
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* AP - REAL array of DIMENSION at least
|
|
||||||
* ( ( n*( n + 1 ) )/2 ).
|
|
||||||
* Before entry with UPLO = 'U' or 'u', the array AP must
|
|
||||||
* contain the upper triangular matrix packed sequentially,
|
|
||||||
* column by column, so that AP( 1 ) contains a( 1, 1 ),
|
|
||||||
* AP( 2 ) and AP( 3 ) contain a( 1, 2 ) and a( 2, 2 )
|
|
||||||
* respectively, and so on.
|
|
||||||
* Before entry with UPLO = 'L' or 'l', the array AP must
|
|
||||||
* contain the lower triangular matrix packed sequentially,
|
|
||||||
* column by column, so that AP( 1 ) contains a( 1, 1 ),
|
|
||||||
* AP( 2 ) and AP( 3 ) contain a( 2, 1 ) and a( 3, 1 )
|
|
||||||
* respectively, and so on.
|
|
||||||
* Note that when DIAG = 'U' or 'u', the diagonal elements of
|
|
||||||
* A are not referenced, but are assumed to be unity.
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* X - REAL array of dimension at least
|
|
||||||
* ( 1 + ( n - 1 )*abs( INCX ) ).
|
|
||||||
* Before entry, the incremented array X must contain the n
|
|
||||||
* element vector x. On exit, X is overwritten with the
|
|
||||||
* tranformed vector x.
|
|
||||||
*
|
|
||||||
* INCX - INTEGER.
|
|
||||||
* On entry, INCX specifies the increment for the elements of
|
|
||||||
* X. INCX must not be zero.
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* Further Details
|
|
||||||
* ===============
|
|
||||||
*
|
|
||||||
* Level 2 Blas routine.
|
|
||||||
*
|
|
||||||
* -- Written on 22-October-1986.
|
|
||||||
* Jack Dongarra, Argonne National Lab.
|
|
||||||
* Jeremy Du Croz, Nag Central Office.
|
|
||||||
* Sven Hammarling, Nag Central Office.
|
|
||||||
* Richard Hanson, Sandia National Labs.
|
|
||||||
*
|
|
||||||
* =====================================================================
|
|
||||||
*
|
|
||||||
* .. Parameters ..
|
|
||||||
REAL ZERO
|
|
||||||
PARAMETER (ZERO=0.0E+0)
|
|
||||||
* ..
|
|
||||||
* .. Local Scalars ..
|
|
||||||
REAL TEMP
|
|
||||||
INTEGER I,INFO,IX,J,JX,K,KK,KX
|
|
||||||
LOGICAL NOUNIT
|
|
||||||
* ..
|
|
||||||
* .. External Functions ..
|
|
||||||
LOGICAL LSAME
|
|
||||||
EXTERNAL LSAME
|
|
||||||
* ..
|
|
||||||
* .. External Subroutines ..
|
|
||||||
EXTERNAL XERBLA
|
|
||||||
* ..
|
|
||||||
*
|
|
||||||
* 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 (INCX.EQ.0) THEN
|
|
||||||
INFO = 7
|
|
||||||
END IF
|
|
||||||
IF (INFO.NE.0) THEN
|
|
||||||
CALL XERBLA('STPMV ',INFO)
|
|
||||||
RETURN
|
|
||||||
END IF
|
|
||||||
*
|
|
||||||
* Quick return if possible.
|
|
||||||
*
|
|
||||||
IF (N.EQ.0) RETURN
|
|
||||||
*
|
|
||||||
NOUNIT = LSAME(DIAG,'N')
|
|
||||||
*
|
|
||||||
* Set up the start point in X if the increment is not unity. This
|
|
||||||
* will be ( N - 1 )*INCX too small for descending loops.
|
|
||||||
*
|
|
||||||
IF (INCX.LE.0) 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 AP are
|
|
||||||
* accessed sequentially with one pass through AP.
|
|
||||||
*
|
|
||||||
IF (LSAME(TRANS,'N')) THEN
|
|
||||||
*
|
|
||||||
* Form x:= A*x.
|
|
||||||
*
|
|
||||||
IF (LSAME(UPLO,'U')) THEN
|
|
||||||
KK = 1
|
|
||||||
IF (INCX.EQ.1) THEN
|
|
||||||
DO 20 J = 1,N
|
|
||||||
IF (X(J).NE.ZERO) THEN
|
|
||||||
TEMP = X(J)
|
|
||||||
K = KK
|
|
||||||
DO 10 I = 1,J - 1
|
|
||||||
X(I) = X(I) + TEMP*AP(K)
|
|
||||||
K = K + 1
|
|
||||||
10 CONTINUE
|
|
||||||
IF (NOUNIT) X(J) = X(J)*AP(KK+J-1)
|
|
||||||
END IF
|
|
||||||
KK = KK + J
|
|
||||||
20 CONTINUE
|
|
||||||
ELSE
|
|
||||||
JX = KX
|
|
||||||
DO 40 J = 1,N
|
|
||||||
IF (X(JX).NE.ZERO) THEN
|
|
||||||
TEMP = X(JX)
|
|
||||||
IX = KX
|
|
||||||
DO 30 K = KK,KK + J - 2
|
|
||||||
X(IX) = X(IX) + TEMP*AP(K)
|
|
||||||
IX = IX + INCX
|
|
||||||
30 CONTINUE
|
|
||||||
IF (NOUNIT) X(JX) = X(JX)*AP(KK+J-1)
|
|
||||||
END IF
|
|
||||||
JX = JX + INCX
|
|
||||||
KK = KK + J
|
|
||||||
40 CONTINUE
|
|
||||||
END IF
|
|
||||||
ELSE
|
|
||||||
KK = (N* (N+1))/2
|
|
||||||
IF (INCX.EQ.1) THEN
|
|
||||||
DO 60 J = N,1,-1
|
|
||||||
IF (X(J).NE.ZERO) THEN
|
|
||||||
TEMP = X(J)
|
|
||||||
K = KK
|
|
||||||
DO 50 I = N,J + 1,-1
|
|
||||||
X(I) = X(I) + TEMP*AP(K)
|
|
||||||
K = K - 1
|
|
||||||
50 CONTINUE
|
|
||||||
IF (NOUNIT) X(J) = X(J)*AP(KK-N+J)
|
|
||||||
END IF
|
|
||||||
KK = KK - (N-J+1)
|
|
||||||
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 K = KK,KK - (N- (J+1)),-1
|
|
||||||
X(IX) = X(IX) + TEMP*AP(K)
|
|
||||||
IX = IX - INCX
|
|
||||||
70 CONTINUE
|
|
||||||
IF (NOUNIT) X(JX) = X(JX)*AP(KK-N+J)
|
|
||||||
END IF
|
|
||||||
JX = JX - INCX
|
|
||||||
KK = KK - (N-J+1)
|
|
||||||
80 CONTINUE
|
|
||||||
END IF
|
|
||||||
END IF
|
|
||||||
ELSE
|
|
||||||
*
|
|
||||||
* Form x := A'*x.
|
|
||||||
*
|
|
||||||
IF (LSAME(UPLO,'U')) THEN
|
|
||||||
KK = (N* (N+1))/2
|
|
||||||
IF (INCX.EQ.1) THEN
|
|
||||||
DO 100 J = N,1,-1
|
|
||||||
TEMP = X(J)
|
|
||||||
IF (NOUNIT) TEMP = TEMP*AP(KK)
|
|
||||||
K = KK - 1
|
|
||||||
DO 90 I = J - 1,1,-1
|
|
||||||
TEMP = TEMP + AP(K)*X(I)
|
|
||||||
K = K - 1
|
|
||||||
90 CONTINUE
|
|
||||||
X(J) = TEMP
|
|
||||||
KK = KK - J
|
|
||||||
100 CONTINUE
|
|
||||||
ELSE
|
|
||||||
JX = KX + (N-1)*INCX
|
|
||||||
DO 120 J = N,1,-1
|
|
||||||
TEMP = X(JX)
|
|
||||||
IX = JX
|
|
||||||
IF (NOUNIT) TEMP = TEMP*AP(KK)
|
|
||||||
DO 110 K = KK - 1,KK - J + 1,-1
|
|
||||||
IX = IX - INCX
|
|
||||||
TEMP = TEMP + AP(K)*X(IX)
|
|
||||||
110 CONTINUE
|
|
||||||
X(JX) = TEMP
|
|
||||||
JX = JX - INCX
|
|
||||||
KK = KK - J
|
|
||||||
120 CONTINUE
|
|
||||||
END IF
|
|
||||||
ELSE
|
|
||||||
KK = 1
|
|
||||||
IF (INCX.EQ.1) THEN
|
|
||||||
DO 140 J = 1,N
|
|
||||||
TEMP = X(J)
|
|
||||||
IF (NOUNIT) TEMP = TEMP*AP(KK)
|
|
||||||
K = KK + 1
|
|
||||||
DO 130 I = J + 1,N
|
|
||||||
TEMP = TEMP + AP(K)*X(I)
|
|
||||||
K = K + 1
|
|
||||||
130 CONTINUE
|
|
||||||
X(J) = TEMP
|
|
||||||
KK = KK + (N-J+1)
|
|
||||||
140 CONTINUE
|
|
||||||
ELSE
|
|
||||||
JX = KX
|
|
||||||
DO 160 J = 1,N
|
|
||||||
TEMP = X(JX)
|
|
||||||
IX = JX
|
|
||||||
IF (NOUNIT) TEMP = TEMP*AP(KK)
|
|
||||||
DO 150 K = KK + 1,KK + N - J
|
|
||||||
IX = IX + INCX
|
|
||||||
TEMP = TEMP + AP(K)*X(IX)
|
|
||||||
150 CONTINUE
|
|
||||||
X(JX) = TEMP
|
|
||||||
JX = JX + INCX
|
|
||||||
KK = KK + (N-J+1)
|
|
||||||
160 CONTINUE
|
|
||||||
END IF
|
|
||||||
END IF
|
|
||||||
END IF
|
|
||||||
*
|
|
||||||
RETURN
|
|
||||||
*
|
|
||||||
* End of STPMV .
|
|
||||||
*
|
|
||||||
END
|
|
329
blas/ztpmv.f
329
blas/ztpmv.f
@ -1,329 +0,0 @@
|
|||||||
SUBROUTINE ZTPMV(UPLO,TRANS,DIAG,N,AP,X,INCX)
|
|
||||||
* .. Scalar Arguments ..
|
|
||||||
INTEGER INCX,N
|
|
||||||
CHARACTER DIAG,TRANS,UPLO
|
|
||||||
* ..
|
|
||||||
* .. Array Arguments ..
|
|
||||||
DOUBLE COMPLEX AP(*),X(*)
|
|
||||||
* ..
|
|
||||||
*
|
|
||||||
* Purpose
|
|
||||||
* =======
|
|
||||||
*
|
|
||||||
* ZTPMV performs one of the matrix-vector operations
|
|
||||||
*
|
|
||||||
* x := A*x, or x := A'*x, or x := conjg( A' )*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.
|
|
||||||
*
|
|
||||||
* Arguments
|
|
||||||
* ==========
|
|
||||||
*
|
|
||||||
* UPLO - CHARACTER*1.
|
|
||||||
* On entry, UPLO specifies whether the matrix is an upper or
|
|
||||||
* lower triangular matrix as follows:
|
|
||||||
*
|
|
||||||
* UPLO = 'U' or 'u' A is an upper triangular matrix.
|
|
||||||
*
|
|
||||||
* UPLO = 'L' or 'l' A is a lower triangular matrix.
|
|
||||||
*
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* TRANS - CHARACTER*1.
|
|
||||||
* On entry, TRANS specifies the operation to be performed as
|
|
||||||
* follows:
|
|
||||||
*
|
|
||||||
* TRANS = 'N' or 'n' x := A*x.
|
|
||||||
*
|
|
||||||
* TRANS = 'T' or 't' x := A'*x.
|
|
||||||
*
|
|
||||||
* TRANS = 'C' or 'c' x := conjg( A' )*x.
|
|
||||||
*
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* DIAG - CHARACTER*1.
|
|
||||||
* On entry, DIAG specifies whether or not A is unit
|
|
||||||
* triangular as follows:
|
|
||||||
*
|
|
||||||
* DIAG = 'U' or 'u' A is assumed to be unit triangular.
|
|
||||||
*
|
|
||||||
* DIAG = 'N' or 'n' A is not assumed to be unit
|
|
||||||
* triangular.
|
|
||||||
*
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* N - INTEGER.
|
|
||||||
* On entry, N specifies the order of the matrix A.
|
|
||||||
* N must be at least zero.
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* AP - COMPLEX*16 array of DIMENSION at least
|
|
||||||
* ( ( n*( n + 1 ) )/2 ).
|
|
||||||
* Before entry with UPLO = 'U' or 'u', the array AP must
|
|
||||||
* contain the upper triangular matrix packed sequentially,
|
|
||||||
* column by column, so that AP( 1 ) contains a( 1, 1 ),
|
|
||||||
* AP( 2 ) and AP( 3 ) contain a( 1, 2 ) and a( 2, 2 )
|
|
||||||
* respectively, and so on.
|
|
||||||
* Before entry with UPLO = 'L' or 'l', the array AP must
|
|
||||||
* contain the lower triangular matrix packed sequentially,
|
|
||||||
* column by column, so that AP( 1 ) contains a( 1, 1 ),
|
|
||||||
* AP( 2 ) and AP( 3 ) contain a( 2, 1 ) and a( 3, 1 )
|
|
||||||
* respectively, and so on.
|
|
||||||
* Note that when DIAG = 'U' or 'u', the diagonal elements of
|
|
||||||
* A are not referenced, but are assumed to be unity.
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* X - COMPLEX*16 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
|
|
||||||
* tranformed vector x.
|
|
||||||
*
|
|
||||||
* INCX - INTEGER.
|
|
||||||
* On entry, INCX specifies the increment for the elements of
|
|
||||||
* X. INCX must not be zero.
|
|
||||||
* Unchanged on exit.
|
|
||||||
*
|
|
||||||
* Further Details
|
|
||||||
* ===============
|
|
||||||
*
|
|
||||||
* Level 2 Blas routine.
|
|
||||||
*
|
|
||||||
* -- Written on 22-October-1986.
|
|
||||||
* Jack Dongarra, Argonne National Lab.
|
|
||||||
* Jeremy Du Croz, Nag Central Office.
|
|
||||||
* Sven Hammarling, Nag Central Office.
|
|
||||||
* Richard Hanson, Sandia National Labs.
|
|
||||||
*
|
|
||||||
* =====================================================================
|
|
||||||
*
|
|
||||||
* .. Parameters ..
|
|
||||||
DOUBLE COMPLEX ZERO
|
|
||||||
PARAMETER (ZERO= (0.0D+0,0.0D+0))
|
|
||||||
* ..
|
|
||||||
* .. Local Scalars ..
|
|
||||||
DOUBLE COMPLEX TEMP
|
|
||||||
INTEGER I,INFO,IX,J,JX,K,KK,KX
|
|
||||||
LOGICAL NOCONJ,NOUNIT
|
|
||||||
* ..
|
|
||||||
* .. External Functions ..
|
|
||||||
LOGICAL LSAME
|
|
||||||
EXTERNAL LSAME
|
|
||||||
* ..
|
|
||||||
* .. External Subroutines ..
|
|
||||||
EXTERNAL XERBLA
|
|
||||||
* ..
|
|
||||||
* .. Intrinsic Functions ..
|
|
||||||
INTRINSIC DCONJG
|
|
||||||
* ..
|
|
||||||
*
|
|
||||||
* 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 (INCX.EQ.0) THEN
|
|
||||||
INFO = 7
|
|
||||||
END IF
|
|
||||||
IF (INFO.NE.0) THEN
|
|
||||||
CALL XERBLA('ZTPMV ',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 AP are
|
|
||||||
* accessed sequentially with one pass through AP.
|
|
||||||
*
|
|
||||||
IF (LSAME(TRANS,'N')) THEN
|
|
||||||
*
|
|
||||||
* Form x:= A*x.
|
|
||||||
*
|
|
||||||
IF (LSAME(UPLO,'U')) THEN
|
|
||||||
KK = 1
|
|
||||||
IF (INCX.EQ.1) THEN
|
|
||||||
DO 20 J = 1,N
|
|
||||||
IF (X(J).NE.ZERO) THEN
|
|
||||||
TEMP = X(J)
|
|
||||||
K = KK
|
|
||||||
DO 10 I = 1,J - 1
|
|
||||||
X(I) = X(I) + TEMP*AP(K)
|
|
||||||
K = K + 1
|
|
||||||
10 CONTINUE
|
|
||||||
IF (NOUNIT) X(J) = X(J)*AP(KK+J-1)
|
|
||||||
END IF
|
|
||||||
KK = KK + J
|
|
||||||
20 CONTINUE
|
|
||||||
ELSE
|
|
||||||
JX = KX
|
|
||||||
DO 40 J = 1,N
|
|
||||||
IF (X(JX).NE.ZERO) THEN
|
|
||||||
TEMP = X(JX)
|
|
||||||
IX = KX
|
|
||||||
DO 30 K = KK,KK + J - 2
|
|
||||||
X(IX) = X(IX) + TEMP*AP(K)
|
|
||||||
IX = IX + INCX
|
|
||||||
30 CONTINUE
|
|
||||||
IF (NOUNIT) X(JX) = X(JX)*AP(KK+J-1)
|
|
||||||
END IF
|
|
||||||
JX = JX + INCX
|
|
||||||
KK = KK + J
|
|
||||||
40 CONTINUE
|
|
||||||
END IF
|
|
||||||
ELSE
|
|
||||||
KK = (N* (N+1))/2
|
|
||||||
IF (INCX.EQ.1) THEN
|
|
||||||
DO 60 J = N,1,-1
|
|
||||||
IF (X(J).NE.ZERO) THEN
|
|
||||||
TEMP = X(J)
|
|
||||||
K = KK
|
|
||||||
DO 50 I = N,J + 1,-1
|
|
||||||
X(I) = X(I) + TEMP*AP(K)
|
|
||||||
K = K - 1
|
|
||||||
50 CONTINUE
|
|
||||||
IF (NOUNIT) X(J) = X(J)*AP(KK-N+J)
|
|
||||||
END IF
|
|
||||||
KK = KK - (N-J+1)
|
|
||||||
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 K = KK,KK - (N- (J+1)),-1
|
|
||||||
X(IX) = X(IX) + TEMP*AP(K)
|
|
||||||
IX = IX - INCX
|
|
||||||
70 CONTINUE
|
|
||||||
IF (NOUNIT) X(JX) = X(JX)*AP(KK-N+J)
|
|
||||||
END IF
|
|
||||||
JX = JX - INCX
|
|
||||||
KK = KK - (N-J+1)
|
|
||||||
80 CONTINUE
|
|
||||||
END IF
|
|
||||||
END IF
|
|
||||||
ELSE
|
|
||||||
*
|
|
||||||
* Form x := A'*x or x := conjg( A' )*x.
|
|
||||||
*
|
|
||||||
IF (LSAME(UPLO,'U')) THEN
|
|
||||||
KK = (N* (N+1))/2
|
|
||||||
IF (INCX.EQ.1) THEN
|
|
||||||
DO 110 J = N,1,-1
|
|
||||||
TEMP = X(J)
|
|
||||||
K = KK - 1
|
|
||||||
IF (NOCONJ) THEN
|
|
||||||
IF (NOUNIT) TEMP = TEMP*AP(KK)
|
|
||||||
DO 90 I = J - 1,1,-1
|
|
||||||
TEMP = TEMP + AP(K)*X(I)
|
|
||||||
K = K - 1
|
|
||||||
90 CONTINUE
|
|
||||||
ELSE
|
|
||||||
IF (NOUNIT) TEMP = TEMP*DCONJG(AP(KK))
|
|
||||||
DO 100 I = J - 1,1,-1
|
|
||||||
TEMP = TEMP + DCONJG(AP(K))*X(I)
|
|
||||||
K = K - 1
|
|
||||||
100 CONTINUE
|
|
||||||
END IF
|
|
||||||
X(J) = TEMP
|
|
||||||
KK = KK - J
|
|
||||||
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*AP(KK)
|
|
||||||
DO 120 K = KK - 1,KK - J + 1,-1
|
|
||||||
IX = IX - INCX
|
|
||||||
TEMP = TEMP + AP(K)*X(IX)
|
|
||||||
120 CONTINUE
|
|
||||||
ELSE
|
|
||||||
IF (NOUNIT) TEMP = TEMP*DCONJG(AP(KK))
|
|
||||||
DO 130 K = KK - 1,KK - J + 1,-1
|
|
||||||
IX = IX - INCX
|
|
||||||
TEMP = TEMP + DCONJG(AP(K))*X(IX)
|
|
||||||
130 CONTINUE
|
|
||||||
END IF
|
|
||||||
X(JX) = TEMP
|
|
||||||
JX = JX - INCX
|
|
||||||
KK = KK - J
|
|
||||||
140 CONTINUE
|
|
||||||
END IF
|
|
||||||
ELSE
|
|
||||||
KK = 1
|
|
||||||
IF (INCX.EQ.1) THEN
|
|
||||||
DO 170 J = 1,N
|
|
||||||
TEMP = X(J)
|
|
||||||
K = KK + 1
|
|
||||||
IF (NOCONJ) THEN
|
|
||||||
IF (NOUNIT) TEMP = TEMP*AP(KK)
|
|
||||||
DO 150 I = J + 1,N
|
|
||||||
TEMP = TEMP + AP(K)*X(I)
|
|
||||||
K = K + 1
|
|
||||||
150 CONTINUE
|
|
||||||
ELSE
|
|
||||||
IF (NOUNIT) TEMP = TEMP*DCONJG(AP(KK))
|
|
||||||
DO 160 I = J + 1,N
|
|
||||||
TEMP = TEMP + DCONJG(AP(K))*X(I)
|
|
||||||
K = K + 1
|
|
||||||
160 CONTINUE
|
|
||||||
END IF
|
|
||||||
X(J) = TEMP
|
|
||||||
KK = KK + (N-J+1)
|
|
||||||
170 CONTINUE
|
|
||||||
ELSE
|
|
||||||
JX = KX
|
|
||||||
DO 200 J = 1,N
|
|
||||||
TEMP = X(JX)
|
|
||||||
IX = JX
|
|
||||||
IF (NOCONJ) THEN
|
|
||||||
IF (NOUNIT) TEMP = TEMP*AP(KK)
|
|
||||||
DO 180 K = KK + 1,KK + N - J
|
|
||||||
IX = IX + INCX
|
|
||||||
TEMP = TEMP + AP(K)*X(IX)
|
|
||||||
180 CONTINUE
|
|
||||||
ELSE
|
|
||||||
IF (NOUNIT) TEMP = TEMP*DCONJG(AP(KK))
|
|
||||||
DO 190 K = KK + 1,KK + N - J
|
|
||||||
IX = IX + INCX
|
|
||||||
TEMP = TEMP + DCONJG(AP(K))*X(IX)
|
|
||||||
190 CONTINUE
|
|
||||||
END IF
|
|
||||||
X(JX) = TEMP
|
|
||||||
JX = JX + INCX
|
|
||||||
KK = KK + (N-J+1)
|
|
||||||
200 CONTINUE
|
|
||||||
END IF
|
|
||||||
END IF
|
|
||||||
END IF
|
|
||||||
*
|
|
||||||
RETURN
|
|
||||||
*
|
|
||||||
* End of ZTPMV .
|
|
||||||
*
|
|
||||||
END
|
|
Loading…
x
Reference in New Issue
Block a user