00001 #ifndef ML_LINEARCOMBINATION_H
00002 #define ML_LINEARCOMBINATION_H
00003
00013
00014
00015
00016
00017
00018 #include "MLAPI_BaseLinearCombination.h"
00019
00020 namespace MLAPI {
00021
00022 class BaseOperator;
00023 class MultiVector;
00024
00025
00026 class LinearCombinationAdd : public BaseLinearCombination
00027 {
00028 public:
00029 LinearCombinationAdd(const BaseLinearCombination& left,
00030 const BaseLinearCombination& right) :
00031 left_(left),
00032 right_(right)
00033 {}
00034
00035 inline const Space GetVectorSpace() const
00036 {
00037 return(left_.GetVectorSpace());
00038 }
00039
00040 inline void Update(MultiVector& v) const
00041 {
00042 left_.Update(v);
00043 right_.Update(v);
00044 }
00045
00046 inline void Set(MultiVector& v) const
00047 {
00048 left_.Set(v);
00049 right_.Update(v);
00050 }
00051
00052 private:
00053 const BaseLinearCombination& left_;
00054 const BaseLinearCombination& right_;
00055 };
00056
00057
00058 class LinearCombinationMixed : public BaseLinearCombination
00059 {
00060 public:
00061
00062 LinearCombinationMixed(const BaseLinearCombination& left,
00063 const MultiVector& right, double alpha) :
00064 left_(left),
00065 right_(right),
00066 alpha_(alpha)
00067 {}
00068
00069 const Space GetVectorSpace() const;
00070
00071 void Update(MultiVector& v) const;
00072
00073 void Set(MultiVector& v) const;
00074
00075 private:
00076 const BaseLinearCombination& left_;
00077 const MultiVector right_;
00078 double alpha_;
00079 };
00080
00081
00082 class LinearCombinationScaled : public BaseLinearCombination
00083 {
00084 public:
00085 LinearCombinationScaled(const BaseLinearCombination& left, double scalar) :
00086 left_(left),
00087 scalar_(scalar)
00088 {}
00089
00090 const Space GetVectorSpace() const;
00091
00092 void Set(MultiVector& v) const;
00093
00094 void Update(MultiVector& v) const;
00095
00096 private:
00097 const BaseLinearCombination& left_;
00098 double scalar_;
00099 };
00100
00101
00102
00103
00104 class MultiVectorScaled : public BaseLinearCombination
00105 {
00106 public:
00107 MultiVectorScaled(const MultiVector& vector, const double alpha) :
00108 vector_(vector),
00109 alpha_(alpha)
00110 {}
00111
00112 const Space GetVectorSpace() const;
00113
00114 const MultiVector& GetMultiVector() const
00115 {
00116 return(vector_);
00117 }
00118
00119 double GetScalar() const
00120 {
00121 return(alpha_);
00122 }
00123
00124 void Update(MultiVector& v) const;
00125
00126 void Set(MultiVector& v) const;
00127
00128 private:
00129 const MultiVector vector_;
00130 double alpha_;
00131 };
00132
00133
00134 class MultiVectorCombination : public BaseLinearCombination
00135 {
00136 public:
00137 MultiVectorCombination(const double alpha,
00138 const MultiVector x,
00139 const double beta,
00140 const MultiVector y) :
00141 x_(x),
00142 y_(y),
00143 alpha_(alpha),
00144 beta_(beta)
00145 {}
00146
00147 const Space GetVectorSpace() const;
00148
00149 const MultiVector GetLeftMultiVector() const
00150 {
00151 return(x_);
00152 }
00153
00154 inline double GetLeftScalar() const
00155 {
00156 return(alpha_);
00157 }
00158
00159 inline const MultiVector GetRightMultiVector() const
00160 {
00161 return(y_);
00162 }
00163
00164 inline double GetRightScalar() const
00165 {
00166 return(beta_);
00167 }
00168
00169 void Update(MultiVector& v) const;
00170
00171 void Set(MultiVector& v) const;
00172
00173 private:
00174 const MultiVector x_;
00175 const MultiVector y_;
00176 double alpha_, beta_;
00177 };
00178
00179
00180
00181
00182 class BaseOperatorTimesMultiVector : public BaseLinearCombination
00183 {
00184 public:
00185 BaseOperatorTimesMultiVector(const BaseOperator& A,
00186 const MultiVector& x) :
00187 A_(A),
00188 x_(x)
00189 {}
00190
00191 const Space GetVectorSpace() const;
00192
00193 inline const BaseOperator& GetBaseOperator() const
00194 {
00195 return(A_);
00196 }
00197
00198 inline const MultiVector& GetMultiVector() const
00199 {
00200 return(x_);
00201 }
00202
00203 void Update(MultiVector& v) const;
00204
00205 void Set(MultiVector& v) const;
00206
00207 private:
00208 const BaseOperator& A_;
00209 const MultiVector x_;
00210 };
00211
00212
00213
00214
00215 class Residual : public BaseLinearCombination
00216 {
00217 public:
00218
00219 Residual(double alpha, const MultiVector& b, double beta,
00220 const BaseOperator& A, const MultiVector& x) :
00221 A_(A),
00222 b_(b),
00223 x_(x),
00224 alpha_(alpha),
00225 beta_(beta)
00226 {}
00227
00228 const Space GetVectorSpace() const;
00229
00230 void Update(MultiVector& v) const;
00231
00232 void Set(MultiVector& v) const;
00233
00234 private:
00235
00236 const BaseOperator& A_;
00237 const MultiVector b_;
00238 const MultiVector x_;
00239 double alpha_;
00240 double beta_;
00241 };
00242
00243 }
00244
00245 #endif