00001
00002
00003
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
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 }
00055
00056
00057
00058 namespace parallel {
00059
00060
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
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
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
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
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 }
00671
00672 #endif // mesh_p_hh