/////////////////////////////////////////////////////////////////////////////// // // // The Template Matrix/Vector Library for C++ was created by Mike Jarvis // // Copyright (C) 1998 - 2016 // // All rights reserved // // // // The project is hosted at https://code.google.com/p/tmv-cpp/ // // where you can find the current version and current documention. // // // // For concerns or problems with the software, Mike may be contacted at // // mike_jarvis17 [at] gmail. // // // // This software is licensed under a FreeBSD license. The file // // TMV_LICENSE should have bee included with this distribution. // // It not, you can get a copy from https://code.google.com/p/tmv-cpp/. // // // // Essentially, you can use this software however you want provided that // // you include the TMV_LICENSE file in any distribution that uses it. // // // /////////////////////////////////////////////////////////////////////////////// #ifndef TMV_BandMatrixArithFunc_H #define TMV_BandMatrixArithFunc_H #include "tmv/TMV_BaseBandMatrix.h" #include "tmv/TMV_Array.h" #define CT std::complex namespace tmv { // y (+)= alpha * A * x template void MultMV( const T alpha, const GenBandMatrix& A, const GenVector& x, VectorView y); // A *= alpha template void MultXM(const T alpha, BandMatrixView A); // B += alpha * A template void AddMM( const T alpha, const GenBandMatrix& A, BandMatrixView B); template inline void AddMM( const T alpha, const GenBandMatrix& A, MatrixView B) { AddMM(alpha,A,BandMatrixView(B,A.nlo(),A.nhi())); } // C = alpha * A + beta * B template void AddMM( const T alpha, const GenBandMatrix& A, const T beta, const GenBandMatrix& B, BandMatrixView C); template void AddMM( const T alpha, const GenBandMatrix& A, const T beta, const GenMatrix& B, MatrixView C); template inline void AddMM( const T alpha, const GenMatrix& A, const T beta, const GenBandMatrix& B, MatrixView C) { AddMM(beta,B,alpha,A,C); } // C (+)= alpha * A * B template void MultMM( const T alpha, const GenBandMatrix& A, const GenMatrix& B, MatrixView C); template void MultMM( const T alpha, const GenBandMatrix& A, const GenBandMatrix& B, BandMatrixView C); template inline void MultMM( const T alpha, const GenMatrix& A, const GenBandMatrix& B, MatrixView C) { MultMM(alpha,B.transpose(),A.transpose(),C.transpose()); } template void ElemMultMM( const T alpha, const GenBandMatrix& A, const GenBandMatrix& B, BandMatrixView C); template class BandMatrixComposite : public GenBandMatrix { public: inline BandMatrixComposite() : itsm(0) {} inline BandMatrixComposite(const BandMatrixComposite&) : itsm(0) {} virtual inline ~BandMatrixComposite() {} // Definitions are in TMV_MultBV.cpp const T* cptr() const; ptrdiff_t stepi() const; ptrdiff_t stepj() const; ptrdiff_t diagstep() const; inline ConjType ct() const { return NonConj; } inline bool isconj() const { return false; } ptrdiff_t ls() const; ConstVectorView constLinearView() const; inline bool canLinearize() const { return true; } private: mutable AlignedArray itsm1; mutable T* itsm; BandMatrixComposite& operator=(const BandMatrixComposite&); }; // Specialize allowed complex combinations: template inline void MultMV( const T alpha, const GenBandMatrix& A, const GenVector& x, VectorView y) { MultMV(CT(alpha),A,x,y); } template inline void MultXM( const T x, BandMatrixView m) { MultXM(CT(x),m); } template inline void AddMM( const T alpha, const GenBandMatrix& A, BandMatrixView B) { AddMM(CT(alpha),A,B); } template inline void AddMM( const T alpha, const GenBandMatrix& A, MatrixView B) { AddMM(CT(alpha),A,B); } template inline void AddMM( const T alpha, const GenBandMatrix& A, const T beta, const GenBandMatrix& B, BandMatrixView C) { AddMM(CT(alpha),A,CT(beta),B,C); } template inline void AddMM( const T alpha, const GenBandMatrix& A, const T beta, const GenMatrix& B, MatrixView C) { AddMM(CT(alpha),A,CT(beta),B,C); } template inline void AddMM( const T alpha, const GenMatrix& A, const T beta, const GenBandMatrix& B, MatrixView C) { AddMM(CT(alpha),A,CT(beta),B,C); } template inline void AddMM( const CT alpha, const GenBandMatrix& A, const CT beta, const GenBandMatrix& B, BandMatrixView C) { AddMM(beta,B,alpha,A,C); } template inline void MultMM( const T alpha, const GenBandMatrix& A, const GenMatrix& B, MatrixView C) { MultMM(CT(alpha),A,B,C); } template inline void MultMM( const T alpha, const GenBandMatrix& A, const GenBandMatrix& B, BandMatrixView C) { MultMM(CT(alpha),A,B,C); } template inline void MultMM( const T alpha, const GenMatrix& A, const GenBandMatrix& B, MatrixView C) { MultMM(CT(alpha),A,B,C); } template inline void ElemMultMM( const T alpha, const GenBandMatrix& A, const GenBandMatrix& B, BandMatrixView C) { ElemMultMM(CT(alpha),A,B,C); } // Specialize disallowed complex combinations: template inline void MultMV( const CT , const GenBandMatrix& , const GenVector& , VectorView ) { TMVAssert(TMV_FALSE); } template inline void MultXM(const CT , BandMatrixView ) { TMVAssert(TMV_FALSE); } template inline void AddMM( const CT , const GenBandMatrix& , BandMatrixView ) { TMVAssert(TMV_FALSE); } template inline void AddMM( const CT , const GenBandMatrix& , MatrixView ) { TMVAssert(TMV_FALSE); } template inline void AddMM( const CT , const GenBandMatrix& , const CT , const GenBandMatrix& , BandMatrixView ) { TMVAssert(TMV_FALSE); } template inline void AddMM( const CT , const GenBandMatrix& , const CT , const GenMatrix& , MatrixView ) { TMVAssert(TMV_FALSE); } template inline void AddMM( const CT , const GenMatrix& , const CT , const GenBandMatrix& , MatrixView ) { TMVAssert(TMV_FALSE); } template inline void MultMM( const CT , const GenBandMatrix& , const GenMatrix& , MatrixView ) { TMVAssert(TMV_FALSE); } template inline void MultMM( const CT , const GenBandMatrix& , const GenBandMatrix& , BandMatrixView ) { TMVAssert(TMV_FALSE); } template inline void MultMM( const CT , const GenMatrix& , const GenBandMatrix& , MatrixView ) { TMVAssert(TMV_FALSE); } template inline void ElemMultMM( const CT , const GenBandMatrix& , const GenBandMatrix& , BandMatrixView ) { TMVAssert(TMV_FALSE); } } #undef CT #endif