00001
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
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;
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
00113 static concepts::QuadRuleFactory rule_;
00114 };
00115
00116
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
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
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
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
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 }
00431
00432 #endif // quad_hh