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

geometry/hexsubdiv.hh
Go to the documentation of this file.
00001 /* Topology.
00002  * how to subdivide a hex
00003  */
00004 
00005 #ifndef hexsubdiv_hh
00006 #define hexsubdiv_hh
00007 
00008 #include <iostream>
00009 #include "strategyChange.hh"
00010 #include "subdivision.hh"
00011 
00012 namespace concepts {
00013 
00014   // forward declaration
00015   class Hexahedron;
00016   class Z2;
00017   class Z4;
00018   class Quad;
00019   class Vertex;
00020 
00021   // ******************************************************** HexSubdivision **
00022 
00038   class HexSubdivision : public Subdivision {
00039   public:
00042     virtual void createChildren(Hexahedron& q) const = 0;
00046     virtual void removeChildren(Hexahedron& q) const = 0;
00047   protected:
00049 
00065     void subFace0011(Quad& q, Z2 rho, Z4 tau, Quad*& A, Quad*& B) const;
00066     void subFace1100(Quad& q, Z2 rho, Z4 tau, Quad*& A, Quad*& B) const;
00067     void subFace0110(Quad& q, Z2 rho, Z4 tau, Quad*& A, Quad*& B) const;
00068     void subFace1001(Quad& q, Z2 rho, Z4 tau, Quad*& A, Quad*& B) const;
00070 
00071 
00087     void subFace0123(Quad& q, Z2 rho, Z4 tau, Quad*& A, Quad*& B,
00088          Quad*& C, Quad*& D) const;
00089     void subFace1230(Quad& q, Z2 rho, Z4 tau, Quad*& A, Quad*& B,
00090          Quad*& C, Quad*& D) const;
00091     void subFace2301(Quad& q, Z2 rho, Z4 tau, Quad*& A, Quad*& B,
00092          Quad*& C, Quad*& D) const;
00094 
00108     bool faceSubdiv4(Quad& q) const throw(StrategyChange);
00109 
00125     Quad* findFace(const Vertex* const v, Quad* const q[4],
00126        const uint tau, const uint rho, const uint vtxIdx) const;
00128 
00140     void subdivFace0(Hexahedron& h, Quad*& A, Quad*& B,
00141          Quad*& C, Quad*& D, bool normal) const;
00142     void subdivFace1(Hexahedron& h, Quad*& A, Quad*& B,
00143          Quad*& C, Quad*& D, bool normal) const;
00144     void subdivFace2(Hexahedron& h, Quad*& A, Quad*& B,
00145          Quad*& C, Quad*& D, bool normal) const;
00146     void subdivFace3(Hexahedron& h, Quad*& A, Quad*& B,
00147          Quad*& C, Quad*& D, bool normal) const;
00148     void subdivFace4(Hexahedron& h, Quad*& A, Quad*& B,
00149          Quad*& C, Quad*& D, bool normal) const;
00150     void subdivFace5(Hexahedron& h, Quad*& A, Quad*& B,
00151          Quad*& C, Quad*& D, bool normal) const;
00153   };
00154 
00155   // ************************************************************ HexSubdiv8 **
00156 
00165   class HexSubdiv8 : public HexSubdivision {
00166   public:
00167     virtual void createChildren(Hexahedron& q) const;
00168     virtual void removeChildren(Hexahedron& q) const;
00169     static const HexSubdiv8* instance();
00170     virtual ~HexSubdiv8();
00171   protected:
00172     virtual std::ostream& info(std::ostream& os) const;
00173   private:
00174     static std::auto_ptr<HexSubdiv8> instance_;
00175   };
00176 
00177   // *********************************************************** HexSubdiv2x **
00178 
00187   class HexSubdiv2x : public HexSubdivision {
00188   public:
00189     virtual void createChildren(Hexahedron& q) const;
00190     virtual void removeChildren(Hexahedron& q) const;
00191     static const HexSubdiv2x* instance();
00192     virtual ~HexSubdiv2x();
00193   protected:
00194     virtual std::ostream& info(std::ostream& os) const;
00195   private:
00196     static std::auto_ptr<HexSubdiv2x> instance_;
00197   };
00198 
00199   // *********************************************************** HexSubdiv2y **
00200 
00209   class HexSubdiv2y : public HexSubdivision {
00210   public:
00211     virtual void createChildren(Hexahedron& q) const;
00212     virtual void removeChildren(Hexahedron& q) const;
00213     static const HexSubdiv2y* instance();
00214     virtual ~HexSubdiv2y();
00215   protected:
00216     virtual std::ostream& info(std::ostream& os) const;
00217   private:
00218     static std::auto_ptr<HexSubdiv2y> instance_;
00219   };
00220 
00221   // *********************************************************** HexSubdiv2z **
00222 
00231   class HexSubdiv2z : public HexSubdivision {
00232   public:
00233     virtual void createChildren(Hexahedron& q) const;
00234     virtual void removeChildren(Hexahedron& q) const;
00235     static const HexSubdiv2z* instance();
00236     virtual ~HexSubdiv2z();
00237   protected:
00238     virtual std::ostream& info(std::ostream& os) const;
00239   private:
00240     static std::auto_ptr<HexSubdiv2z> instance_;
00241   };
00242 
00243   // *********************************************************** HexSubdiv4x **
00244 
00253   class HexSubdiv4x : public HexSubdivision {
00254   public:
00255     virtual void createChildren(Hexahedron& q) const;
00256     virtual void removeChildren(Hexahedron& q) const;
00257     static const HexSubdiv4x* instance();
00258     virtual ~HexSubdiv4x();
00259   protected:
00260     virtual std::ostream& info(std::ostream& os) const;
00261   private:
00262     static std::auto_ptr<HexSubdiv4x> instance_;
00263   };
00264 
00265   // *********************************************************** HexSubdiv4y **
00266 
00275   class HexSubdiv4y : public HexSubdivision {
00276   public:
00277     virtual void createChildren(Hexahedron& q) const;
00278     virtual void removeChildren(Hexahedron& q) const;
00279     static const HexSubdiv4y* instance();
00280     virtual ~HexSubdiv4y();
00281   protected:
00282     virtual std::ostream& info(std::ostream& os) const;
00283   private:
00284     static std::auto_ptr<HexSubdiv4y> instance_;
00285   };
00286 
00287   // *********************************************************** HexSubdiv4z **
00288 
00297   class HexSubdiv4z : public HexSubdivision {
00298   public:
00299     virtual void createChildren(Hexahedron& q) const;
00300     virtual void removeChildren(Hexahedron& q) const;
00301     static const HexSubdiv4z* instance();
00302     virtual ~HexSubdiv4z();
00303   protected:
00304     virtual std::ostream& info(std::ostream& os) const;
00305   private:
00306     static std::auto_ptr<HexSubdiv4z> instance_;
00307   };
00308 
00309 } // namespace concepts
00310 
00311 #endif // hexsubdiv_hh

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