Go to the documentation of this file.00001
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
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 }
00115
00116 #endif // multipoleDX_hh