/*! _zssmatrix*_zcovector operator */ inline _zcovector operator*(const _zssmatrix& mat, const _zcovector& vec) { #ifdef CPPL_VERBOSE std::cerr << "# [MARK] operator*(const _zssmatrix&, const _zcovector&)" << std::endl; #endif//CPPL_VERBOSE #ifdef CPPL_DEBUG if(mat.N!=vec.L){ std::cerr << "[ERROR] operator*(const _zssmatrix&, const _zcovector&)" << std::endl << "These matrix and vector can not make a product." << std::endl << "Your input was (" << mat.M << "x" << mat.N << ") * (" << vec.L << ")." << std::endl; exit(1); } #endif//CPPL_DEBUG zcovector newvec(mat.M); newvec.zero(); for(int c=0; c<mat.VOL; c++){ newvec(mat.Indx[c]) +=mat.Array[c]*vec(mat.Jndx[c]); } mat.destroy(); vec.destroy(); return _(newvec); }
/*! _zcovector*zrovector operator */ inline _zgematrix operator*(const _zcovector& covec, const zrovector& rovec) { #ifdef CPPL_VERBOSE std::cerr << "# [MARK] operator*(const _zcovector&, const zrovector&)" << std::endl; #endif//CPPL_VERBOSE #ifdef CPPL_DEBUG if(covec.L!=rovec.L){ std::cerr << "[ERROR] operator*(const _zcovector&, const zrovector&)" << std::endl << "These two vectors can not make a product." << std::endl << "Your input was (" << covec.L << ") * (" << rovec.L << ")." << std::endl; exit(1); } #endif//CPPL_DEBUG zgematrix newmat(covec.L, covec.L); for(long i=0; i<newmat.m; i++){ for(long j=0; j<newmat.n; j++){ newmat(i,j) =covec(i)*rovec(j); } } covec.destroy(); return _(newmat); }
/*! _zcovector^T*_zcovector operator (inner product) */ inline comple operator%(const _zcovector& vecA, const _zcovector& vecB) {VERBOSE_REPORT; #ifdef CPPL_DEBUG if(vecA.l!=vecB.l){ ERROR_REPORT; std::cerr << "These two vectors can not make a dot product." << std::endl << "Your input was (" << vecA.l << ") % (" << vecB.l << ")." << std::endl; exit(1); } #endif//CPPL_DEBUG comple val( zdotu_( vecA.l, vecA.array, 1, vecB.array, 1 ) ); vecA.destroy(); vecB.destroy(); return val; }
/*! _zcovector-_zcovector operator */ inline _zcovector operator-(const _zcovector& vecA, const _zcovector& vecB) {VERBOSE_REPORT; #ifdef CPPL_DEBUG if(vecA.l!=vecB.l){ ERROR_REPORT; std::cerr << "These two vectors can not make a subtraction." << std::endl << "Your input was (" << vecA.l << ") - (" << vecB.l << ")." << std::endl; exit(1); } #endif//CPPL_DEBUG for(long i=0; i<vecA.l; i++){ vecA.array[i]-=vecB.array[i]; } vecB.destroy(); return vecA; }
/*! zgematrix*_zcovector operator */ inline _zcovector operator*(const zgematrix& mat, const _zcovector& vec) {VERBOSE_REPORT; #ifdef CPPL_DEBUG if(mat.n!=vec.l){ ERROR_REPORT; std::cerr << "These matrix and vector can not make a product." << std::endl << "Your input was (" << mat.m << "x" << mat.n << ") * (" << vec.l << ")." << std::endl; exit(1); } #endif//CPPL_DEBUG zcovector newvec(mat.m); zgemv_( 'n', mat.m, mat.n, comple(1.0,0.0), mat.array, mat.m, vec.array, 1, comple(0.0,0.0), newvec.array, 1 ); vec.destroy(); return _(newvec); }
/*! _zgsmatrix*_zcovector operator */ inline _zcovector operator*(const _zgsmatrix& mat, const _zcovector& vec) {VERBOSE_REPORT; #ifdef CPPL_DEBUG if(mat.n!=vec.l){ ERROR_REPORT; std::cerr << "These matrix and vector can not make a product." << std::endl << "Your input was (" << mat.m << "x" << mat.n << ") * (" << vec.l << ")." << std::endl; exit(1); } #endif//CPPL_DEBUG zcovector newvec(mat.m); newvec.zero(); for(std::vector<zcomponent>::const_iterator it=mat.data.begin(); it!=mat.data.end(); it++){ newvec(it->i) += it->v*vec(it->j); } mat.destroy(); vec.destroy(); return _(newvec); }
/*! zcovector^T*zcovector operator (inner product) */ inline std::complex<double> operator%(const zcovector& vecA, const _zcovector& vecB) { #ifdef CPPL_VERBOSE std::cerr << "# [MARK] operator%(const zcovector&, const _zcovector&)" << std::endl; #endif//CPPL_VERBOSE #ifdef CPPL_DEBUG if(vecA.L!=vecB.L){ std::cerr << "[ERROR] operator%(const zcovector&, const _zcovector&)" << std::endl << "These two vectors can not make a dot product." << std::endl << "Your input was (" << vecA.L << ") % (" << vecB.L << ")." << std::endl; exit(1); } #endif//CPPL_DEBUG std::complex<double> val( zdotu_( vecA.L, vecA.Array, 1, vecB.Array, 1 ) ); vecB.destroy(); return val; }