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

geometry_p/mesh_p.hh
Go to the documentation of this file.
00001 /* -*- c++ -*-
00002  * Meshes for parallel computing
00003  * These objects are created by a distributor and not by hand
00004  */
00005 
00006 #ifndef mesh_p_hh
00007 #define mesh_p_hh
00008 
00009 #include <memory>
00010 
00011 #include "basics/exceptions.hh"
00012 #include "basics/outputOperator.hh"
00013 #include "geometry/elementMaps.hh"
00014 #include "geometry/elementMaps3D.hh"
00015 #include "geometry/mesh.hh"
00016 #include "toolbox_p/using_p.hh"
00017 #include "toolbox_p/communicators.hh"
00018 
00019 namespace concepts {
00020 
00021   // ******************************************* Scanners **
00022 
00024   template <>
00025   class Scan<Connector0> :
00026     public Scan<Connector> {
00027   public:
00029     Connector0& operator++(int) = 0;
00030   };
00031 
00033   template <>
00034   class Scan<Connector1> :
00035     public Scan<Connector> {
00036   public:
00038     Connector1& operator++(int) = 0;
00039   };
00040 
00042   template <>
00043   class Scan<Connector2> :
00044     public Scan<Connector> {
00045   public:
00047     Connector2& operator++(int) = 0;
00048   };
00049 
00050   typedef Scan<Connector0> ScanCntr0;
00051   typedef Scan<Connector1> ScanCntr1;
00052   typedef Scan<Connector2> ScanCntr2;
00053 
00054 }  // namespace concepts
00055 
00056 
00057 
00058 namespace parallel {
00059 
00060   // ********************************************** Lists **
00061 
00064   template<class T>
00065   class ListElm {
00066   private:
00067     ListElm<T>* lnk_;
00068     T*          elm_;
00069 
00070   public:
00071     inline ListElm(T* elm, ListElm<T>* lnk = 0) : lnk_(lnk), elm_(elm) {};
00072 
00073     inline ListElm<T>** linkp() {return &lnk_;};
00074     inline ListElm<T>* link() const {return lnk_;};
00075     inline T* elm() const {return elm_;}
00076   };
00077 
00080   template<class ListNode>
00081   class ListHead : public concepts::OutputOperator {
00082   private:
00083     ListNode* root_;
00084 
00085   public:
00086     inline ListHead(ListNode* root = 0) : root_(root) {};
00087     inline ~ListHead() {
00088       while (root_)
00089   {ListNode* foo = root_; root_ = root_->link(); delete foo;}
00090     };
00091 
00092     inline ListNode** rootp() {return &root_;};
00093     inline ListNode* root() const {return root_;};
00094   };
00095 
00096   typedef ListElm<Connector0>  Cntr0LstEl;
00097   typedef ListElm<Connector1>  Cntr1LstEl;
00098   typedef ListElm<Connector2>  Cntr2LstEl;
00099   typedef ListElm<Cell1>       Cell1LstEl;
00100   typedef ListElm<Cell2>       Cell2LstEl;
00101   typedef ListElm<Cell3>       Cell3LstEl;
00102 
00103   typedef ListHead<Cntr0LstEl> Cntr0Lst;
00104   typedef ListHead<Cntr1LstEl> Cntr1Lst;
00105   typedef ListHead<Cntr2LstEl> Cntr2Lst;
00106   typedef ListHead<Cell1LstEl> Cell1Lst;
00107   typedef ListHead<Cell2LstEl> Cell2Lst;
00108   typedef ListHead<Cell3LstEl> Cell3Lst;
00109   
00110 
00111 
00112   // *********************************************** Mesh **
00113   
00121   class Mesh : public concepts::OutputOperator {
00122   private:
00123     const Communicator& com_;
00124   public:
00125     Mesh(const Communicator& com) : com_(com) {};
00126     virtual ~Mesh() {};
00127 
00128     inline const Communicator& comm() const {return com_;};
00129 
00131     virtual uint nglobcell() const = 0;
00132 
00134     virtual uint nloccell() const = 0;
00135 
00140     virtual Scan<Cell>* globscan() = 0;
00141 
00146     virtual Scan<Cell>* locscan() = 0;
00147 
00148   protected:
00149     virtual std::ostream& info(std::ostream& os) const;
00150   };
00151   
00152 
00153   // ********************************************** Mesh1 **
00154 
00157   class Mesh1 : public Mesh {
00158   private:
00160     class LocalS : public Scan<Cell1> {
00161       uint  n_;
00162       uint  idx_;
00163       Array<auto_ptr<Cell1> > *cell_;
00164     public:
00165       inline LocalS(uint n, Array<auto_ptr<Cell1> > *cell)
00166   : n_(n), idx_(0), cell_(cell) {};
00167       inline LocalS(const LocalS& scan) : n_(scan.n_), idx_(scan.idx_),
00168             cell_(scan.cell_) {};
00169       inline bool eos() const {return idx_ == n_;};
00170       inline Cell1& operator++(int) {return *((*cell_)[idx_++]);};
00171       inline concepts::Scan1* clone() const {return new LocalS(*this);};
00172     };
00173 
00175     class GlobalS : public Scan<Cell1> {
00176       uint  n_;
00177       uint  idx_;
00178       Array<auto_ptr<Cell1> > *cell_;
00179     public:
00180       inline GlobalS(uint n, Array<auto_ptr<Cell1> > *cell)
00181   : n_(n), idx_(0), cell_(cell) {
00182   throw conceptsException(MissingFeature("GlobalS not yet implemented"));
00183       };
00184       inline GlobalS(const GlobalS& scan) {
00185   throw conceptsException(MissingFeature("GlobalS not yet implemented"));
00186       };
00187       inline bool eos() const {return 1;};
00188       inline Cell1& operator++(int) {return *((*cell_)[idx_++]);};
00189       inline concepts::Scan1* clone() const {return new GlobalS(*this);};      
00190     };
00191 
00193     template<class T>
00194     class CapS : public Scan<T> {
00195     private:
00196       ListElm<T>* cntr_;
00197     public:
00198       inline CapS(ListElm<T>* cntr) : cntr_(cntr) {};
00199       inline CapS(const CapS<T>& scan) : cntr_(scan.cntr_) {};
00200       inline bool eos() const {return (!cntr_);};
00201       inline T& operator++(int) {
00202   ListElm<T>* foo = cntr_;  cntr_ = cntr_->link();
00203   return *(foo->elm());};
00204       inline Scan<T>* clone() const {return new CapS(*this);};
00205     };
00206 
00208     uint ngcell_;
00210     uint nlcell_;
00211 
00213     Array<auto_ptr<Connector0> >* cntr0_;
00214     uint                          ncntr0_;
00215 
00217     Array<auto_ptr<Connector1> >* cntr1_;
00219     Array<auto_ptr<Cell1> >*      cell_;
00220 
00222     Array<auto_ptr<concepts::Map1d> >* map_;
00223     uint                               nmap_;
00224 
00226     Array<Cntr0Lst>* cap0_;
00228     Array<Cell1Lst>* cap1_;
00229 
00230   public:
00249     inline Mesh1(Array<auto_ptr<Connector0> >* cntr0,
00250      Array<auto_ptr<Connector1> >* cntr1,
00251      Array<auto_ptr<Cell1> >* cell, uint ngcell,
00252      Array<auto_ptr<concepts::Map1d> >* map,
00253      Array<Cntr0Lst>* cap0, Array<Cell1Lst>* cap1,
00254      const Communicator& com);
00255     inline ~Mesh1();
00256 
00258     inline uint nglobcell() const {return ngcell_;};
00260     inline uint nloccell() const {return nlcell_;};
00261 
00263     inline concepts::Scan1* globscan() {return new GlobalS(nlcell_, cell_);};
00264 
00266     inline concepts::Scan1* locscan() {return new LocalS(nlcell_, cell_);};
00267 
00271     inline concepts::ScanCntr0* cap0scan(uint i) {
00272       return new CapS<Connector0>((*cap0_)[i].root());
00273     };
00277     inline concepts::Scan1* cap1scan(uint i) {
00278       return new CapS<Cell1>((*cap1_)[i].root());
00279     };
00280 
00281   protected:
00282     std::ostream& info(std::ostream& os) const;
00283   };
00284 
00285 
00286   Mesh1::Mesh1(Array<auto_ptr<Connector0> >* cntr0,
00287          Array<auto_ptr<Connector1> >* cntr1,
00288          Array<auto_ptr<Cell1> >* cell, uint ngcell,
00289          Array<auto_ptr<concepts::Map1d> >* map,
00290          Array<Cntr0Lst>* cap0, Array<Cell1Lst>* cap1,
00291          const Communicator& com)
00292     : Mesh(com), ngcell_(ngcell), nlcell_(cell->cursize()), cntr0_(cntr0),
00293       ncntr0_(cntr0->cursize()), cntr1_(cntr1), cell_(cell), map_(map),
00294       nmap_(map ? map->cursize() : 0), cap0_(cap0), cap1_(cap1) {
00295   }
00296 
00297   Mesh1::~Mesh1() {
00298     delete cap0_;
00299     delete cap1_;
00300     delete cell_;  delete map_;
00301     delete cntr1_;  delete cntr0_;
00302   }
00303 
00304 
00305   // ********************************************** Mesh2 **
00306 
00309   class Mesh2 : public Mesh {
00310   private:
00312     class LocalS : public Scan<Cell2> {
00313       uint n_;
00314       uint idx_;
00315       Array<auto_ptr<Cell2> > *cell_;
00316     public:
00317       inline LocalS(uint n, Array<auto_ptr<Cell2> > *cell)
00318   : n_(n), idx_(0), cell_(cell) {};
00319       inline LocalS(const LocalS& scan) : n_(scan.n_), idx_(scan.idx_),
00320             cell_(scan.cell_) {};
00321       inline bool eos() const {return idx_ == n_;};
00322       inline Cell2& operator++(int) {return *((*cell_)[idx_++]);};
00323       inline concepts::Scan2* clone() const {return new LocalS(*this);};
00324     };
00325 
00327     class GlobalS : public Scan<Cell2> {
00328       uint  n_;
00329       uint  idx_;
00330       Array<auto_ptr<Cell2> > *cell_;
00331     public:
00332       inline GlobalS(uint n, Array<auto_ptr<Cell2> > *cell)
00333   : n_(n), idx_(0), cell_(cell) {
00334   throw conceptsException(MissingFeature("GlobalS not yet implemented"));
00335       };
00336       inline GlobalS(const GlobalS& scan) {
00337   throw conceptsException(MissingFeature("GlobalS not yet implemented"));
00338       };
00339       inline bool eos() const {return 1;};
00340       inline Cell2& operator++(int) {return *((*cell_)[idx_++]);};
00341       inline concepts::Scan2* clone() const {return new GlobalS(*this);};      
00342     };
00343 
00345     template<class T>
00346     class CapS : public Scan<T> {
00347     private:
00348       ListElm<T>* cntr_;
00349     public:
00350       inline CapS(ListElm<T>* cntr) : cntr_(cntr) {};
00351       inline CapS(const CapS<T>& scan) : cntr_(scan.cntr_) {};
00352       inline bool eos() const {return (!cntr_);};
00353       inline T& operator++(int) {
00354   ListElm<T>* foo = cntr_;  cntr_ = cntr_->link();
00355   return *(foo->elm());};
00356       inline Scan<T>* clone() const {return new CapS(*this);};
00357     };
00358 
00359 
00361     uint ngcell_;
00363     uint nlcell_;
00364 
00366     Array<auto_ptr<Connector0> >* cntr0_;
00367     uint                          ncntr0_;
00369     Array<auto_ptr<Connector1> >* cntr1_;
00370     uint                          ncntr1_;
00371 
00373     Array<auto_ptr<Connector2> >* cntr2_;
00375     Array<auto_ptr<Cell2> >*      cell_;
00376 
00378     Array<auto_ptr<concepts::Map2d> >* map_;
00379     uint                               nmap_;
00380 
00382     Array<Cntr0Lst>* cap0_;
00384     Array<Cntr1Lst>* cap1_;
00386     Array<Cell2Lst>* cap2_;
00387 
00388   public:
00413     inline Mesh2(Array<auto_ptr<Connector0> >* cntr0,
00414      Array<auto_ptr<Connector1> >* cntr1,
00415      Array<auto_ptr<Connector2> >* cntr2,
00416      Array<auto_ptr<Cell2> >* cell, uint ngcell,
00417      Array<auto_ptr<concepts::Map2d> >* map,
00418      Array<Cntr0Lst>* cap0, Array<Cntr1Lst>* cap1,
00419      Array<Cell2Lst>* cap2, const Communicator& com);
00420     inline ~Mesh2();
00421 
00423     inline uint nglobcell() const {return ngcell_;};
00425     inline uint nloccell() const {return nlcell_;};
00426 
00428     inline concepts::Scan2* globscan() {return new GlobalS(nlcell_, cell_);};
00429 
00431     inline concepts::Scan2* locscan() {return new LocalS(nlcell_, cell_);};
00432 
00436     inline concepts::ScanCntr0* cap0scan(uint i) {
00437       return new CapS<Connector0>((*cap0_)[i].root());
00438     };
00442     inline concepts::ScanCntr1* cap1scan(uint i) {
00443       return new CapS<Connector1>((*cap1_)[i].root());
00444     };
00448     inline concepts::Scan2* cap2scan(uint i) {
00449       return new CapS<Cell2>((*cap2_)[i].root());
00450     };
00451 
00452   protected:
00453     std::ostream& info(std::ostream& os) const;
00454   };
00455 
00456 
00457   Mesh2::Mesh2(Array<auto_ptr<Connector0> >* cntr0,
00458          Array<auto_ptr<Connector1> >* cntr1,
00459          Array<auto_ptr<Connector2> >* cntr2,
00460          Array<auto_ptr<Cell2> >* cell, uint ngcell,
00461          Array<auto_ptr<concepts::Map2d> >* map,
00462          Array<Cntr0Lst>* cap0, Array<Cntr1Lst>* cap1,
00463          Array<Cell2Lst>* cap2, const Communicator& com)
00464     : Mesh(com), ngcell_(ngcell), nlcell_(cell->cursize()), cntr0_(cntr0),
00465       ncntr0_(cntr0->cursize()), cntr1_(cntr1), ncntr1_(cntr1->cursize()),
00466       cntr2_(cntr2), cell_(cell), map_(map), nmap_(map ? map->cursize() : 0),
00467       cap0_(cap0), cap1_(cap1), cap2_(cap2) {
00468   }
00469 
00470   Mesh2::~Mesh2() {
00471     delete cap2_;  delete cap1_;  delete cap0_;
00472     delete cell_;  delete map_;
00473     delete cntr2_;  delete cntr1_;  delete cntr0_;
00474   }
00475 
00476 
00477   // ********************************************** Mesh3 **
00478 
00481   class Mesh3 : public Mesh {
00482   private:
00484     class LocalS : public concepts::Scan<Cell3> {
00485       uint n_;
00486       uint idx_;
00487       Array<auto_ptr<Cell3> > *cell_;
00488     public:
00489       inline LocalS(uint n, Array<auto_ptr<Cell3> > *cell)
00490   : n_(n), idx_(0), cell_(cell) {};
00491       inline LocalS(const LocalS& scan) : n_(scan.n_), idx_(scan.idx_),
00492             cell_(scan.cell_) {};
00493       inline bool eos() const {return idx_ == n_;};
00494       inline Cell3& operator++(int) {return *((*cell_)[idx_++]);};
00495       inline concepts::Scan3* clone() const {return new LocalS(*this);};
00496     };
00497 
00499     class GlobalS : public concepts::Scan<Cell3> {
00500       uint  n_;
00501       uint  idx_;
00502       Array<auto_ptr<Cell3> > *cell_;
00503     public:
00504       inline GlobalS(uint n, Array<auto_ptr<Cell3> > *cell)
00505   : n_(n), idx_(0), cell_(cell) {
00506   throw conceptsException(MissingFeature("GlobalS not yet implemented"));
00507       };
00508       inline GlobalS(const GlobalS& scan) {
00509   throw conceptsException(MissingFeature("GlobalS not yet implemented"));
00510       };
00511       inline bool eos() const {return 1;};
00512       inline Cell3& operator++(int) {return *((*cell_)[idx_++]);};
00513       inline concepts::Scan3* clone() const {return new GlobalS(*this);};      
00514     };
00515 
00517     template<class T>
00518     class CapS : public Scan<T> {
00519     private:
00520       ListElm<T>* cntr_;
00521     public:
00522       inline CapS(ListElm<T>* cntr) : cntr_(cntr) {};
00523       inline CapS(const CapS<T>& scan) : cntr_(scan.cntr_) {};
00524       inline bool eos() const {return (!cntr_);};
00525       inline T& operator++(int) {
00526   ListElm<T>* foo = cntr_;  cntr_ = cntr_->link();
00527   return *(foo->elm());};
00528       inline concepts::Scan<T>* clone() const {return new CapS(*this);};
00529     };
00530 
00532     uint ngcell_;
00534     uint nlcell_;
00535 
00537     Array<auto_ptr<Connector0> >* cntr0_;
00538     uint                          ncntr0_;
00540     Array<auto_ptr<Connector1> >* cntr1_;
00541     uint                          ncntr1_;
00543     Array<auto_ptr<Connector2> >* cntr2_;
00544     uint                          ncntr2_;
00545 
00547     Array<auto_ptr<Connector3> >* cntr3_;
00549     Array<auto_ptr<Cell3> >*      cell_;
00550 
00552     Array<auto_ptr<concepts::Map3d> >* map_;
00553     uint                               nmap_;
00554 
00556     Array<Cntr0Lst>* cap0_;
00558     Array<Cntr1Lst>* cap1_;
00560     Array<Cntr2Lst>* cap2_;
00562     Array<Cell3Lst>* cap3_;
00563 
00564   public:
00595     inline Mesh3(Array<auto_ptr<Connector0> >* cntr0,
00596      Array<auto_ptr<Connector1> >* cntr1,
00597      Array<auto_ptr<Connector2> >* cntr2,
00598      Array<auto_ptr<Connector3> >* cntr3,
00599      Array<auto_ptr<Cell3> >* cell, uint ngcell,
00600      Array<auto_ptr<concepts::Map3d> >* map,
00601      Array<Cntr0Lst>* cap0, Array<Cntr1Lst>* cap1,
00602      Array<Cntr2Lst>* cap2, Array<Cell3Lst>* cap3_,
00603      const Communicator& com);
00604     inline ~Mesh3();
00605 
00607     inline uint nglobcell() const {return ngcell_;};
00609     inline uint nloccell() const {return nlcell_;};
00610 
00612     inline concepts::Scan3* globscan() {return new GlobalS(nlcell_, cell_);};
00613 
00615     inline concepts::Scan3* locscan() {return new LocalS(nlcell_, cell_);};
00616 
00620     inline concepts::ScanCntr0* cap0scan(uint i) {
00621       return new CapS<Connector0>((*cap0_)[i].root());
00622     };
00626     inline concepts::ScanCntr1* cap1scan(uint i) {
00627       return new CapS<Connector1>((*cap1_)[i].root());
00628     };
00632     inline concepts::ScanCntr2* cap2scan(uint i) {
00633       return new CapS<Connector2>((*cap2_)[i].root());
00634     };
00638     inline concepts::Scan3* cap3scan(uint i) {
00639       return new CapS<Cell3>((*cap3_)[i].root());
00640     };
00641 
00642   protected:
00643     std::ostream& info(std::ostream& os) const;
00644   };
00645 
00646 
00647   Mesh3::Mesh3(Array<auto_ptr<Connector0> >* cntr0,
00648          Array<auto_ptr<Connector1> >* cntr1,
00649          Array<auto_ptr<Connector2> >* cntr2,
00650          Array<auto_ptr<Connector3> >* cntr3,
00651          Array<auto_ptr<Cell3> >* cell, uint ngcell,
00652          Array<auto_ptr<concepts::Map3d> >* map,
00653          Array<Cntr0Lst>* cap0, Array<Cntr1Lst>* cap1,
00654          Array<Cntr2Lst>* cap2, Array<Cell3Lst>* cap3,
00655          const Communicator& com)
00656     : Mesh(com), ngcell_(ngcell), nlcell_(cell->cursize()), cntr0_(cntr0),
00657       ncntr0_(cntr0->cursize()), cntr1_(cntr1), ncntr1_(cntr1->cursize()),
00658       cntr2_(cntr2), ncntr2_(cntr2->cursize()), cntr3_(cntr3), cell_(cell),
00659       map_(map), nmap_(map ? map->cursize() : 0), cap0_(cap0), cap1_(cap1),
00660       cap2_(cap2), cap3_(cap3) {
00661   }
00662 
00663   Mesh3::~Mesh3() {
00664     delete cap3_;  delete cap2_;  delete cap1_;  delete cap0_;
00665     delete cell_;  delete map_;
00666     delete cntr3_;  delete cntr2_;  delete cntr1_;  delete cntr0_;
00667   }
00668 
00669 
00670 } // namespace parallel
00671 
00672 #endif // mesh_p_hh

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