Home | Doxygen Documentation | Tutorials | Developer Tools (restricted)

cluster/multipoleDX.hh
Go to the documentation of this file.
00001 /* Multipole kernel expansion
00002  */
00003 
00004 #ifndef multipoleDX_hh
00005 #define multipoleDX_hh
00006 
00007 #include "basics/exceptions.hh"
00008 #include "bem/element.hh"
00009 #include "cluster/expansion.hh"
00010 #include "cluster/multipoleX.hh"
00011 
00012 namespace cluster {
00013 
00014   // *********************************************************** DMultipoleX **
00015 
00019   template <class F = concepts::Real>
00020   class DMultipoleX : public ExpansionXY<F> {
00021 
00023     MultipoleX<F> X_;
00024 
00026     uint m_;
00028     uint blksz_;
00030     uint gauss_;
00031 
00033     concepts::Real* foo_;
00034     concepts::Real* fee_;
00035 
00036   public:
00041     DMultipoleX(uint m, uint gauss);
00042 
00043     ~DMultipoleX() {delete[] fee_; delete[] foo_;}
00044 
00045     uint blksz() const {return blksz_;}
00046     uint m() const {return m_;}
00047     inline XYColReal* getCol(uint blksz, uint n) const;
00053     void evaluate(const concepts::Real3d& z, const concepts::Unit3d& h,
00054       concepts::Real X[]) const;
00056     inline void shift(const concepts::Real3d& z, const concepts::Real src[],
00057           concepts::Real dst[]) const;
00058     inline void shift(const concepts::Real3d& z, const concepts::Cmplx src[],
00059           concepts::Cmplx dst[]) const;
00061     inline void apply(const XYColExpPtr* X, const F src[], F dst[]) const;
00062 
00069     void evaluate(const concepts::Element<F>& elm,
00070       const concepts::Real3d& c, XYColExpPtr* X[]) const;
00072     void evaluate(const bem::Constant3d000<F>& elm,
00073       const concepts::Real3d& c, XYColExpPtr* X[]) const;
00075     void evaluate(const bem::Constant3d001<F>& elm,
00076       const concepts::Real3d& c, XYColExpPtr* X[]) const;
00078     void evaluate(const bem::Constant3d002<F>& elm,
00079       const concepts::Real3d& c, XYColExpPtr* X[]) const;
00081     void evaluate(const bem::Linear3d000<F>& elm,
00082       const concepts::Real3d& c, XYColExpPtr* X[]) const;
00083   };
00084 
00085   template <class F>
00086   inline XYColReal* DMultipoleX<F>::getCol(uint blksz, uint n) const {
00087     return new XYColReal(blksz, n);
00088   }
00089 
00090   template <class F>
00091   inline void DMultipoleX<F>::shift(const concepts::Real3d& z,
00092             const concepts::Real src[],
00093             concepts::Real dst[]) const {
00094     X_.shift(z, src, dst, 0);
00095   }
00096 
00097   template <class F>
00098   inline void DMultipoleX<F>::shift(const concepts::Real3d& z,
00099             const concepts::Cmplx src[],
00100             concepts::Cmplx dst[]) const {
00101     X_.shift(z, src, dst);
00102   }
00103 
00104   template <class F>
00105   inline void DMultipoleX<F>::apply(const XYColExpPtr* X,
00106             const F src[], F dst[]) const {
00107     const XYColRealPtr* XMPE = dynamic_cast<const XYColRealPtr*>(X);
00108     if (X) {X_.apply(XMPE->value(), src, dst);  return;}
00109 
00110     throw
00111       conceptsException(concepts::MissingFeature("XYColExp not supported"));
00112   }
00113 
00114 } // namespace cluster
00115 
00116 #endif // multipoleDX_hh

Home | Doxygen Documentation | Tutorials | Developer Tools (restricted)