1 #ifndef _theplu_yat_utility_blas_level1 2 #define _theplu_yat_utility_blas_level1 25 #include "BasicVector.h" 26 #include "BLAS_utility.h" 27 #include "VectorExpression.h" 29 #include "yat_assert.h" 31 #include "gsl/gsl_vector.h" 43 namespace expression {
45 template<
typename LHS,
typename RHS,
class OP>
47 :
public VectorExpression<VectorBinary<LHS, RHS, OP> >
50 VectorBinary(
const BasicVector<LHS>& lhs,
const BasicVector<RHS>& rhs)
51 : lhs_(lhs), rhs_(rhs)
53 YAT_ASSERT(lhs.size() == rhs.size());
56 size_t size(
void)
const {
return lhs_.size(); }
58 double operator()(
size_t i)
const 59 {
return get(i, op_); }
61 void calculate_gsl_vector_p(
void)
const 63 this->allocate_memory(size());
64 for (
size_t i=0; i<size(); ++i)
65 gsl_vector_set(this->v_, i,
get(i, op_));
69 const BasicVector<LHS>& lhs_;
70 const BasicVector<RHS>& rhs_;
73 double get(
size_t i, Plus)
const 75 return lhs_(i) + rhs_(i);
79 double get(
size_t i, Minus)
const 81 return lhs_(i) - rhs_(i);
87 class ScaledVector :
public VectorExpression<ScaledVector<T> >
90 ScaledVector(
double factor,
const BasicVector<T>& vec)
91 : vec_(vec), factor_(factor) {}
93 size_t size(
void)
const 99 double operator()(
size_t i)
const 101 return factor_ * vec_(i);
105 void calculate_gsl_vector_p(
void)
const 107 YAT_ASSERT(this->v_ == NULL);
108 this->allocate_memory(size());
109 gsl_vector_memcpy(this->v_, vec_.gsl_vector_p());
110 gsl_vector_scale(this->v_, factor_);
114 const BasicVector<T>& vec_;
131 template<
class Derived1,
class Derived2>
132 expression::VectorBinary<Derived1, Derived2, expression::Plus>
135 return expression::VectorBinary<Derived1, Derived2,
147 template<
class Derived1,
class Derived2>
148 expression::VectorBinary<Derived1, Derived2, expression::Minus>
152 return expression::VectorBinary<Derived1, Derived2,
162 template<
class Derived1,
class Derived2>
181 expression::ScaledVector<T>
184 return expression::ScaledVector<T>(k, vec);
196 expression::ScaledVector<T>
199 return expression::ScaledVector<T>(k, vec);
211 expression::ScaledVector<T>
214 return expression::ScaledVector<T>(-1.0, vec);
expression::VectorBinary< Derived1, Derived2, expression::Plus > operator+(const BasicVector< Derived1 > &lhs, const BasicVector< Derived2 > &rhs)
Definition: BLAS_level1.h:133
The Department of Theoretical Physics namespace as we define it.
expression::ScaledVector< T > operator-(const BasicVector< T > &vec)
negation operator
Definition: BLAS_level1.h:212
Definition: BLAS_utility.h:31
expression::ScaledVector< T > operator*(const BasicVector< T > &vec, double k)
scale a vector expression
Definition: BLAS_level1.h:197
Definition: BasicVector.h:48
Definition: BLAS_utility.h:30
expression::VectorBinary< Derived1, Derived2, expression::Minus > operator-(const BasicVector< Derived1 > &lhs, const BasicVector< Derived2 > &rhs)
Definition: BLAS_level1.h:149
expression::ScaledVector< T > operator*(double k, const BasicVector< T > &vec)
scale a vector expression
Definition: BLAS_level1.h:182
const gsl_vector * gsl_vector_p(void) const
Definition: BasicVector.h:65
double operator*(const BasicVector< Derived1 > &lhs, const BasicVector< Derived2 > &rhs)
Definition: BLAS_level1.h:163