Go to the documentation of this file.00001
00002
00003
00004 #ifndef aglowav2Space_hh
00005 #define aglowav2Space_hh
00006
00007 #ifdef __GUNG__
00008 #pragma interface
00009 #endif
00010
00011 #include "toolbox/scannerConnectors.hh"
00012 #include "space/space.hh"
00013 #include "bem/element.hh"
00014 #include "cluster/tree.hh"
00015 #include "aglowav2/element.hh"
00016
00017 namespace aglowav2 {
00018
00019
00020
00025 template<class F = concepts::Real>
00026 class Haar3dDFSScan : public concepts::Scan<concepts::Element<F> > {
00027 public:
00029 virtual Haar3dXXX<F>& operator++(int) = 0;
00030 };
00031
00032
00033
00038 template<class F = concepts::Real>
00039 class Haar3dBFSScan : public concepts::Scan<concepts::Element<F> > {
00040 public:
00042 virtual Haar3dXXX<F>& operator++(int) = 0;
00044 virtual void skip(uint lvl) = 0;
00045 };
00046
00047
00048
00052 template<class F = concepts::Real>
00053 class Haar3d : public concepts::Space<F> {
00054 public:
00056 virtual ~Haar3d() {}
00057
00059 virtual uint nlvl() const = 0;
00061 virtual uint maxLocDim() const = 0;
00063 virtual Haar3dDFSScan<F>* dfsscan() const = 0;
00065 virtual Haar3dBFSScan<F>* bfsscan() const = 0;
00066 };
00067
00068
00069
00074 template<class F = concepts::Real>
00075 class Haar3d0DFSScan : public Haar3dDFSScan<F> {
00076 public:
00081 Haar3d0DFSScan(Haar3d000<F>* elm, uint ht);
00083 Haar3d0DFSScan(const Haar3d0DFSScan<F>& sc);
00085 inline ~Haar3d0DFSScan() {delete[] stk_;}
00086
00088 Haar3d000<F>& operator++(int);
00090 inline Haar3d0DFSScan<F>* clone() const {
00091 return new Haar3d0DFSScan<F>(*this);
00092 }
00094 inline bool eos() const {return sptr_[0] ? 0 : 1;}
00095
00096 private:
00098 uint ht_;
00100 Haar3d000<F>** stk_;
00102 Haar3d000<F>** sptr_;
00103 };
00104
00105
00106
00111 template<class F = concepts::Real>
00112 class Haar3d0BFSScan : public Haar3dBFSScan<F> {
00113 public:
00118 Haar3d0BFSScan(Haar3d000<F>* elm, uint ht);
00120 Haar3d0BFSScan(const Haar3d0BFSScan<F>& sc);
00122 inline ~Haar3d0BFSScan() {delete[] stk_;}
00123
00125 Haar3d000<F>& operator++(int);
00127 inline Haar3d0BFSScan<F>* clone() const {
00128 return new Haar3d0BFSScan<F>(*this);
00129 }
00131 inline bool eos() const {return sptr_[0] ? 0 : 1;}
00133 void skip(uint lvl);
00134
00135 private:
00137 uint ht_;
00139 Haar3d000<F>** stk_;
00141 Haar3d000<F>** sptr_;
00142 };
00143
00144
00145
00149 template<class F = concepts::Real>
00150 class Haar3d0 : public Haar3d<F> {
00151 public:
00158 Haar3d0(cluster::Tree<cluster::Cluster<F> >& tree, uint d = 0);
00160 virtual ~Haar3d0() {destructor_(elm_);}
00161
00163 inline uint dim() const {return dim_;}
00165 inline uint nelm() const {return nelm_;}
00167 inline uint nlvl() const {return nlvl_;}
00169 inline uint d() const {return d_;}
00171 inline uint maxLocDim() const {return maxLocDim_;}
00173 inline uint sumLocDim() const {return sLocDim_;}
00175 inline concepts::Real size() const {return sz_;}
00177 inline const concepts::Space<F>& space() const {return spc_;}
00178
00180 inline Haar3d0DFSScan<F>* dfsscan() const;
00182 inline Haar3d0BFSScan<F>* bfsscan() const;
00184 inline Haar3d0BFSScan<F>* scan() const;
00185
00186 protected:
00188 std::ostream& info(std::ostream& os) const;
00189
00190 private:
00201 void constructor_(const cluster::Cluster<F>* clst, uint lvl,
00202 Haar3d000<F>** Chld, Haar3d000<F>** Curchld,
00203 uint* nChld, const bem::Constant3d002<F>** Elm,
00204 uint* nElm, concepts::Real* At, uint* nAt);
00205
00207 void destructor_(Haar3d000<F>* elm);
00208
00211 void keyset_(Haar3d000<F>* elm, uint lvl, uint gamma);
00212
00219 void moments_(const bem::Constant3d002<F>& elm, concepts::Real* mnts);
00221 uint dim_;
00223 uint nelm_;
00225 uint nlvl_;
00227 uint d_;
00229 uint maxLocDim_;
00231 uint sLocDim_;
00233 concepts::Real sz_;
00235 Haar3d000<F>* elm_;
00237 const concepts::Space<F>& spc_;
00238
00240 uint *j_, *idx_;
00241
00245 concepts::Real *v0x_, *v0y_, *v0z_, *x_, *y_, *z_;
00246
00248 uint* bc_;
00249
00251 const bem::Constant3d002<F>** locelm_;
00252
00259 concepts::Real *S_, *Ut_, *At_, *work_;
00260
00264 static const uint MAXLOCDIM_;
00266 static const concepts::Real EPS_;
00267 };
00268
00269 template<class F>
00270 inline Haar3d0DFSScan<F>* Haar3d0<F>::dfsscan() const {
00271 return new Haar3d0DFSScan<F>(elm_, nlvl_);
00272 }
00273
00274 template<class F>
00275 inline Haar3d0BFSScan<F>* Haar3d0<F>::bfsscan() const {
00276 return new Haar3d0BFSScan<F>(elm_, nlvl_);
00277 }
00278
00279 template<class F>
00280 inline Haar3d0BFSScan<F>* Haar3d0<F>::scan() const {
00281 return new Haar3d0BFSScan<F>(elm_, nlvl_);
00282 }
00283
00284 template<class F>
00285 std::ostream& Haar3d0<F>::info(std::ostream& os) const {
00286 os << "aglowav2::Haar3d0(dim=" << dim_ << ", maxLocDim=" << maxLocDim_;
00287 os << ", nlvl=" << nlvl_ << ", nelm=" << nelm_ << ", d=" << d_ << ')';
00288 return os;
00289 }
00290
00291 }
00292
00293 #endif // aglowav2Space_hh