• Main Page
  • Related Pages
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

MLAPI_LinearCombinations.h

Go to the documentation of this file.
00001 #ifndef ML_LINEARCOMBINATION_H
00002 #define ML_LINEARCOMBINATION_H
00003 
00013 /* ******************************************************************** */
00014 /* See the file COPYRIGHT for a complete copyright notice, contact      */
00015 /* person and disclaimer.                                               */        
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 // scaled vector, ScaledMultiVector = alpha * MultiVector
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 // v = A * x
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 // v += alpha * b + beta * A * x
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 } // namespace MLAPI
00244 
00245 #endif