Go to the documentation of this file.00001
00002
00003 #ifndef periodicSquare_hh
00004 #define periodicSquare_hh
00005
00006 #include "basics/typedefs.hh"
00007 #include "geometry/mesh.hh"
00008 #include "geometry/cell2D.hh"
00009
00010 using concepts::Real;
00011
00016 class PeriodicSquare : public concepts::Mesh2 {
00017 public:
00024 PeriodicSquare(uint n, Real jitter = 0);
00026 virtual ~PeriodicSquare();
00028 virtual unsigned int ncell() const { return 2*n_*n_; }
00030 virtual concepts::Scan2* scan() { return new S(cell_, n_); }
00032 virtual std::ostream& info(std::ostream& os) const;
00034 uint n() { return n_; };
00035 private:
00037 class S : public concepts::Scan<concepts::Cell2> {
00039 unsigned int idx_;
00041 unsigned int n_;
00043 concepts::Triangle2d** cell_;
00044 public:
00046 S(concepts::Triangle2d* cell[], uint n) : idx_(0), n_(n), cell_(cell) {}
00048 S(const S& scan) : idx_(scan.idx_), cell_(scan.cell_) {}
00050 bool eos() const { return idx_ == 2*n_*n_; }
00052 concepts::Cell2& operator++(int) { return *cell_[idx_++]; }
00054 concepts::Scan2* clone() const { return new S(*this); }
00055 };
00057 uint ii(uint a, uint b) {
00058 return a + (1+n_)*b;
00059 };
00061 uint j(uint a, uint b) { return (a%n_) + n_*(b%n_); };
00063 uint k(uint a, uint b, uint c) { return c + 3*j(a, b); };
00065 uint l(uint a, uint b, uint d) { return d + 2*j(a, b); };
00067 Real dRand() {
00068 return jitter_*2*((static_cast<Real>(std::rand()) /
00069 static_cast<Real>(RAND_MAX))-0.5);
00070 }
00072 double x(uint a) { return static_cast<double>(a)/static_cast<double>(n_); }
00074 uint n_;
00076 Real jitter_;
00078 concepts::Real2d** coord_;
00080 concepts::Vertex** vtx_;
00082 concepts::Edge** edg_;
00084 concepts::Triangle** tri_;
00086 concepts::Triangle2d** cell_;
00087 };
00088
00089 #endif // periodicSquare_hh