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

geometry/cell1D.hh
Go to the documentation of this file.
00001 /* 1D Cells, ie. triangles and quads
00002  * Geometrical information (coordinates), brings element maps and
00003  * topology together
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   // forward declaration
00019   class MapEdge1d;
00020   class MappingEdge2d;
00021 
00022   // **************************************************************** EdgeNd **
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   // **************************************************************** Edge1d **
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   // **************************************************************** Edge2d **
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 } // namespace concepts
00246 
00247 #endif // cell1D_hh

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