Go to the documentation of this file.00001
00002
00003
00004
00005
00006 #ifndef cell1D_hh
00007 #define cell1D_hh
00008
00009 #include <iostream>
00010 #include <memory>
00011 #include "basics/typedefs.hh"
00012 #include "basics/vectorsMatrices.hh"
00013 #include "topology.hh"
00014 #include "cell.hh"
00015
00016 namespace concepts {
00017
00018
00019 class MapEdge1d;
00020 class MappingEdge2d;
00021
00022
00023
00029 class EdgeNd : public Cell1 {
00030 public:
00034 EdgeNd(Edge& cntr) : cntr_(cntr) {}
00035 virtual ~EdgeNd() {}
00036
00037 virtual EdgeNd* child(uint i) = 0;
00038 virtual const EdgeNd* child(uint i) const = 0;
00039
00041 inline Edge& connector() const { return cntr_; }
00042
00045 virtual Real jacobianDeterminant(const Real x) const = 0;
00046
00047 virtual Real3d vertex(const uint i) const;
00048 virtual Real3d center() const;
00049 protected:
00050 virtual std::ostream& info(std::ostream& os) const;
00052 Edge& cntr_;
00053 };
00054
00055
00056
00057
00062 class Edge1d : public EdgeNd {
00063 public:
00068 Edge1d(Edge& cntr, const MapEdge1d& map);
00069 virtual ~Edge1d();
00070
00075 virtual Edge1d* child(uint i);
00076 virtual const Edge1d* child(uint i) const;
00077
00084 Real chi(Real xi) const;
00085
00086 virtual concepts::Real3d elemMap(const Real xi) const;
00087 virtual concepts::Real3d elemMap(const Real2d& xi) const;
00088 virtual concepts::Real3d elemMap(const Real3d& xi) const;
00089
00093 inline Real jacobianDeterminant(const Real x) const { return jacobian(x); }
00094
00098 Real jacobian(Real x) const;
00099
00101 Real size() const;
00102
00106 inline Real jacobianInverse(const Real x) const { return 1.0/jacobian(x); }
00107
00108 inline const MapEdge1d* map() const { return map_; }
00109
00111 inline Edge1d* clone(Edge& cntr, MapEdge1d* map) const {
00112 return new Edge1d(cntr, map, l_, i_); }
00113 protected:
00114 virtual std::ostream& info(std::ostream& os) const;
00115 private:
00117 Edge1d* lnk_;
00118
00122 Edge1d* chld_;
00123
00125 MapEdge1d* map_;
00126
00128 uint l_;
00129
00131 uint i_;
00132
00139 Edge1d(Edge& cntr, MapEdge1d* map, const uint l, const uint i);
00140 };
00141
00142
00143
00148 class Edge2d : public EdgeNd {
00149 public:
00158 Edge2d(Edge& cntr, const MappingEdge2d& map, const Z2 dir = 0);
00159
00160 virtual ~Edge2d();
00161
00166 virtual Edge2d* child(uint i);
00167 virtual const Edge2d* child(uint i) const;
00168
00175 Real2d chi(Real xi) const;
00176
00177 virtual concepts::Real3d elemMap(const Real xi) const;
00178 virtual concepts::Real3d elemMap(const Real2d& xi) const;
00179 virtual concepts::Real3d elemMap(const Real3d& xi) const;
00180
00184 inline Real jacobianDeterminant(const Real x) const {
00185 return jacobian(x).l2();
00186 }
00187
00191 Real2d jacobian(Real x) const;
00192
00193 inline const MappingEdge2d* map() const { return map_; }
00194
00196 virtual Edge2d* clone() const;
00197
00198 virtual Edge2d* clone(Edge& cntr, MappingEdge2d* map) const {
00199 return new Edge2d(cntr, map, dir_, l_, i_); }
00200
00202 uchar level() const { return l_; }
00203
00205 Z2 dir() const { return dir_; }
00207 Z2& dir() { return dir_; }
00209 inline void swapdir() { ++dir_; }
00211 Real2d n0(Real x) const;
00212 protected:
00213 virtual std::ostream& info(std::ostream& os) const;
00214
00216 MappingEdge2d* map_;
00218 uint l_;
00219
00221 uint i_;
00222
00224 Z2 dir_;
00225
00233 Edge2d(Edge& cntr, MappingEdge2d* map, const Z2 dir,
00234 const uint l, const uint i);
00235 private:
00237 Edge2d* lnk_;
00238
00242 Edge2d* chld_;
00243 };
00244
00245 }
00246
00247 #endif // cell1D_hh