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

aglowav2/space.hh
Go to the documentation of this file.
00001 /* Spaces for the wavelets.
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   // ********************************************************* Haar3dDFSScan **
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   // ********************************************************* Haar3dBFSScan **
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   // **************************************************************** Haar3d **
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   // ******************************************************** Haar3d0DFSScan **
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   // ******************************************************** Haar3d0BFSScan **
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   // *************************************************************** Haar3d0 **
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 } // namespace aglowav2
00292 
00293 #endif // aglowav2Space_hh

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