Go to the documentation of this file.00001
00002
00003
00004
00005
00006 #ifndef smatrix_hh
00007 #define smatrix_hh
00008
00009 #include "basics/outputOperator.hh"
00010 #include "basics/typedefs.hh"
00011 #include "toolbox/array.hh"
00012
00013 namespace concepts {
00014
00015
00016 template<class F>
00017 class TColumn;
00018
00019 template<class F>
00020 class ShapeFunction1D;
00021
00022
00023
00051 template<class F>
00052 class SMatrixBase : public OutputOperator {
00053 public:
00055 virtual void operator()(const TColumn<F>& src, TColumn<F>& dest) const = 0;
00056
00058 virtual uint size() const = 0;
00059 protected:
00060 virtual std::ostream& info(std::ostream& os) const;
00061 };
00062
00063
00064
00076 class SMatrix1D : public SMatrixBase<Real> {
00077 public:
00093 SMatrix1D(const ShapeFunction1D<Real>& small,
00094 const ShapeFunction1D<Real>& left,
00095 const ShapeFunction1D<Real>& right);
00096
00108 SMatrix1D(const SMatrix1D& s, const bool flip = false);
00109 virtual void operator()(const TColumn<Real>& src,
00110 TColumn<Real>& dest) const;
00112 void scale(const Real factor);
00113 virtual uint size() const;
00114 protected:
00115 virtual std::ostream& info(std::ostream& os) const;
00116 private:
00118 const uint n_;
00119
00130 Array<Real> data_;
00131
00140 Real* left_;
00141
00149 Real* right_;
00150 };
00151
00152
00153
00164 template<class F, int dim>
00165 class SMatrixTensor : public SMatrixBase<F> {
00166 public:
00172 SMatrixTensor(const SMatrixBase<F>& matrix, const uint position);
00173 virtual void operator()(const TColumn<F>& src, TColumn<F>& dest) const;
00174 virtual uint size() const;
00175 protected:
00176 virtual std::ostream& info(std::ostream& os) const;
00177 private:
00178 const SMatrixBase<Real>& matrix_;
00179 const uint position_;
00180 };
00181
00182
00183
00188 template<class F>
00189 class SMatrixCompose : public SMatrixBase<F> {
00190 public:
00196 inline SMatrixCompose(const SMatrixBase<F>& A, const SMatrixBase<F>& B,
00197 const SMatrixBase<F>* C = 0) : A_(A), B_(B), C_(C) {}
00198 virtual void operator()(const TColumn<F>& src, TColumn<F>& dest) const;
00199 virtual uint size() const;
00200 protected:
00201 virtual std::ostream& info(std::ostream& os) const;
00202 private:
00204 const SMatrixBase<F>& A_;
00206 const SMatrixBase<F>& B_;
00208 const SMatrixBase<F>* C_;
00209 };
00210
00211
00212
00213
00225 template<class F, int dim>
00226 class SMatrixGeneralTensor : public SMatrixBase<F> {
00227 public:
00235 SMatrixGeneralTensor(const SMatrixBase<F>& matrix, const uint* n,
00236 const uint position);
00243 SMatrixGeneralTensor(const SMatrixBase<F>& matrix, const uint position);
00244 virtual void operator()(const TColumn<F>& src, TColumn<F>& dest) const;
00245 virtual uint size() const;
00246 protected:
00247 virtual std::ostream& info(std::ostream& os) const;
00248 private:
00249 const SMatrixBase<Real>& matrix_;
00250 uint n_[dim];
00251 const uint position_;
00252 };
00253
00254
00255
00256
00270 template<class F, int dim>
00271 class SMatrixBlock : public SMatrixBase<F> {
00272 public:
00278 SMatrixBlock(const SMatrixBase<F>& A, const SMatrixBase<F>& B,
00279 const SMatrixBase<F>* C = 0);
00280 virtual void operator()(const TColumn<F>& src, TColumn<F>& dest) const;
00282 inline uint size() const { return size_; }
00283 protected:
00284 virtual std::ostream& info(std::ostream& os) const;
00285 private:
00287 const SMatrixBase<F>& A_;
00289 const SMatrixBase<F>& B_;
00291 const SMatrixBase<F>* C_;
00293 uint* n_;
00295 uint size_;
00296 };
00297
00298 }
00299
00300 #endif // smatrix_hh