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

hp2D/quad.hh
Go to the documentation of this file.
00001 /* quadrilateral element for 2D hp FEM
00002 */
00003 
00004 #ifndef quad_hh
00005 #define quad_hh
00006 
00007 #include <iostream>
00008 #include <memory>
00009 #include "basics/typedefs.hh"
00010 #include "basics/outputOperator.hh"
00011 #include "basics/vectorsMatrices.hh"
00012 #include "geometry/cell2D.hh"
00013 #include "geometry/integral.hh"
00014 #include "integration/quadRule.hh"
00015 #include "space/hpMethod.hh"
00016 #include "element.hh"
00017 #include "integration/karniadakis.hh"
00018 #include "integration/laguerre.hh"
00019 
00020 namespace hp2D {
00021 
00022   using concepts::Real;
00023 
00024   // ******************************************************** IntegrableQuad **
00025 
00029   class IntegrableQuad : public concepts::IntegrationCell {
00030   public:
00031     IntegrableQuad(concepts::Quad2d& cell);
00032 
00034     inline const concepts::QuadratureRule* integrationX() const 
00035     { return intX_.get(); }
00036 
00038     inline const concepts::QuadratureRule* integrationY() const 
00039     { return intY_.get(); }
00040 
00048     static concepts::QuadRuleFactory& rule() { return rule_; }
00049 
00055     inline concepts::Real2d chi(const Real x, const Real y) const {
00056       return cell_.chi(x, y); 
00057     }
00058 
00060     inline concepts::MapReal2d jacobian(const Real x, const Real y) const 
00061     {
00062       concepts::MapReal2d jac = cell_.jacobian(x, y);
00063       jac *= 0.5;         // factor comes due to integration over [-1,1]^2
00064       return jac; 
00065     }
00066 
00068     inline concepts::MapReal2d jacobianInverse(const Real x,
00069                                                const Real y) const 
00070     {
00071       return jacobian(x, y).inverse(); 
00072     }
00073 
00075     inline Real jacobianDeterminant(const Real x, const Real y) const 
00076     {
00077       return jacobian(x, y).determinant(); 
00078     }
00079 
00087     void setStrategy(const concepts::Quad2dSubdivision* strategy = 0)
00088       throw(concepts::StrategyChange) 
00089     { 
00090       cell_.setStrategy(strategy); 
00091     }
00092 
00096     const concepts::Quad2dSubdivision* getStrategy() const
00097     { 
00098       return cell_.getStrategy(); 
00099     }
00100 
00101     virtual bool quadraturePoint(uint i, intPoint& p,
00102                                  intFormType form = ZERO,
00103                                  bool localCoord = false) const;
00104   protected:
00106     std::auto_ptr<concepts::QuadratureRule> intX_;
00107     std::auto_ptr<concepts::QuadratureRule> intY_;
00108 
00110     concepts::Quad2d& cell_;
00111 
00112     // Factory for the integration rule
00113     static concepts::QuadRuleFactory rule_;
00114   };
00115 
00116   // ************************************************************** BaseQuad **
00117 
00120   template<class F = Real>
00121   class BaseQuad : public Element<F>, public IntegrableQuad {
00122   public:
00129     BaseQuad(concepts::Quad2d& cell, const ushort* p, 
00130              concepts::TColumn<F>* T0, concepts::TColumn<F>* T1);
00131     virtual ~BaseQuad();
00132 
00133     virtual const concepts::Quad& support() const { return cell_.connector(); }
00134     virtual concepts::Real3d vertex(uint i) const { return cell_.vertex(i); }
00135     virtual const concepts::Quad2d& cell() const  { return cell_; }
00136 
00138     virtual const concepts::ElementGraphics<F>* graphics() const = 0;
00139 
00140   protected:
00141     virtual std::ostream& info(std::ostream& os) const;
00142   };
00143 
00144   // **************************************************** QuadShapeFunctions **
00145 
00151   class QuadShapeFunctions {
00152     public:
00158       QuadShapeFunctions(const ushort p, const concepts::QuadratureRule *intX,
00159                          const concepts::QuadratureRule *intY);
00166       QuadShapeFunctions(const ushort* p, const concepts::QuadratureRule *intX,
00167                          const concepts::QuadratureRule *intY);
00168       virtual ~QuadShapeFunctions();
00169 
00172       inline const ushort* p() const { return p_; }
00173 
00175       inline const concepts::Karniadakis<1,0>* shpfctX() const {
00176         return shpfctX_.get(); 
00177       }
00179       inline const concepts::Karniadakis<1,0>* shpfctY() const {
00180         return shpfctY_.get(); }
00181 
00183       inline const concepts::Karniadakis<1,1>* shpfctDX() const {
00184         return shpfctDX_.get(); }
00186       inline const concepts::Karniadakis<1,1>* shpfctDY() const {
00187         return shpfctDY_.get(); }
00188     protected:
00190       void computeShapefunctions_(const concepts::QuadratureRule *intX,
00191                                   const concepts::QuadratureRule *intY);
00192     private:
00194       ushort p_[2];
00196       std::auto_ptr<concepts::Karniadakis<1,0> > shpfctX_, shpfctY_;
00198       std::auto_ptr<concepts::Karniadakis<1,1> > shpfctDX_, shpfctDY_;
00199   };
00200 
00201   // ****************************************************************** Quad **
00202 
00209   template<class F = Real>
00210   class Quad : public BaseQuad<F>, public QuadShapeFunctions {
00211   public:
00218     Quad(concepts::Quad2d& cell, const ushort* p, 
00219          concepts::TColumn<F>* T0, concepts::TColumn<F>* T1);
00220 
00221     virtual ~Quad();
00222 
00223     virtual const concepts::ElementGraphics<F>* graphics() const;
00227     void recomputeShapefunctions();
00228     void recomputeShapefunctions(const uint nq[2]);
00229 
00231     void edgeP(const uint i, const uint& p) {
00232       edges_[i] = &p;
00233     }
00234     const uint edgeP(const uint i) const { 
00235       conceptsAssert(i < 4, concepts::Assertion());
00236       conceptsAssert(edges_[i], concepts::Assertion());
00237       return *edges_[i];
00238     }
00239   protected:
00240     virtual std::ostream& info(std::ostream& os) const;
00241   private:
00243     static std::auto_ptr<concepts::ElementGraphics<F> > graphics_;
00245     const uint* edges_[4];
00246   };
00247 
00248 
00249   // ********************************************************** InfiniteQuad **
00250 
00255   class InfiniteQuad : public Element<Real> {
00256   public:
00263     InfiniteQuad(concepts::InfiniteQuad2d& cell, const ushort* p, 
00264                  concepts::TColumn<Real>* T0, concepts::TColumn<Real>* T1);
00265 
00266     virtual ~InfiniteQuad();
00267 
00268     const concepts::Connector2& support()  const { return cell_.connector(); }
00269     concepts::Real3d vertex(uint i)        const { return cell_.vertex(i); }
00270     const concepts::InfiniteQuad2d& cell() const { return cell_; }
00271 
00274     inline const ushort* p() const { return p_; }
00275 
00277     inline const concepts::QuadratureRule* integrationX() const 
00278     { return intX_.get(); }
00279     
00281     inline const concepts::QuadratureRule* integrationY() const 
00282     { return intY_.get(); }
00283 
00290     static void setIntegrationRuleX(enum concepts::intRule rule, bool constant,
00291                                     uint points);
00292 
00299     static void setIntegrationRuleY(bool constant, uint points,
00300                                     const Real border);
00301 
00303     static void resetIntegrationRule();
00304 
00306     static std::string integrationRule();
00307 
00309     inline const concepts::Karniadakis<1,0>* shpfctX() const {
00310       return shpfctX_.get(); 
00311     }
00312 
00314     inline const concepts::Karniadakis<1,1>* shpfctDX() const {
00315       return shpfctDX_.get(); }
00316 
00318     virtual const concepts::LaguerreBasis<0>* shpfctY() const = 0;
00319 
00321     virtual const concepts::LaguerreBasis<1>* shpfctDY() const = 0;
00322 
00323     virtual const concepts::ElementGraphics<Real>* graphics() const = 0;
00324 
00326     static Real& borderY() { return borderY_; }
00327   protected:
00328     void computeIntegrationRuleFromP_(const ushort* p);
00329 
00330     void computeIntegrationRule_(const uint nq[2]);
00331 
00333     void computeShapefunctionsX_();
00334 
00335     virtual std::ostream& info(std::ostream& os) const;
00336 
00338     ushort p_[2];
00339 
00341     std::auto_ptr<concepts::QuadratureRule> intX_;
00342     std::auto_ptr<concepts::QuadratureRule> intY_;
00343   private:
00345     concepts::InfiniteQuad2d& cell_;
00346 
00352     static enum concepts::intRule integrationTypeX_;
00355     static enum concepts::intRule integrationTypeY_;
00359     static uint constNumerOfPointsX_, constNumerOfPointsY_;
00363     static uint addNumberOfPointsX_, addNumberOfPointsY_;
00367     static bool useConstantNumberOfPointsX_, useConstantNumberOfPointsY_;
00369     static Real borderY_;
00370 
00372     std::auto_ptr<concepts::Karniadakis<1,0> > shpfctX_;
00374     std::auto_ptr<concepts::Karniadakis<1,1> > shpfctDX_;
00375   };
00376 
00377   // ************************************************** InfiniteLaguerreQuad **
00378 
00390   class InfiniteLaguerreQuad : public InfiniteQuad {
00391   public:
00398     InfiniteLaguerreQuad(concepts::InfiniteQuad2d& cell, const ushort* p, 
00399                          concepts::TColumn<Real>* T0,
00400                          concepts::TColumn<Real>* T1);
00401     virtual ~InfiniteLaguerreQuad();
00402 
00404     inline const concepts::LaguerreBasis<0>* shpfctY() const {
00405       return shpfctY_.get(); }
00406 
00408     inline const concepts::LaguerreBasis<1>* shpfctDY() const {
00409       return shpfctDY_.get(); }
00410 
00411     void recomputeShapefunctions();
00412 
00413     virtual const concepts::ElementGraphics<Real>* graphics() const;
00414   protected:
00415     virtual std::ostream& info(std::ostream& os) const;
00416   private:
00418     static std::auto_ptr<concepts::ElementGraphics<Real> > graphics_;
00419 
00421     std::auto_ptr<concepts::LaguerreBasis<0> > shpfctY_;
00423     std::auto_ptr<concepts::LaguerreBasis<1> > shpfctDY_;
00424 
00426     void computeShapefunctionsY_();
00427   };
00428 
00429 
00430 } // namespace hp2D
00431 
00432 #endif // quad_hh

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