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

hp2D/aprioriRef2D.hh
Go to the documentation of this file.
00001 
00004 #ifndef APRIORIRef2D_hh
00005 #define APRIORIRef2D_hh
00006 
00007 #include "basics/typedefs.hh"
00008 #include "basics/exceptions.hh"
00009 #include "basics/level.hh"
00010 #include "toolbox/set.hh"
00011 #include "geometry/connector.hh"
00012 #include "space/postProcess.hh"
00013 #include "space/hpMethod.hh"
00014 
00015 // forward declaration
00016 namespace concepts {
00017   class Quad;
00018 }
00019 
00020 namespace hp2D {
00021 
00022   using concepts::Real;
00023 
00024   // ***************************************************** APrioriRefinement **
00025 
00038   class APrioriRefinement : public concepts::CellPostprocess<Real> {
00039   public:
00040     enum subdivTypes { NONE = 0, X = 1, Y = 2};
00041     static const short MAXSHORT = 32767;
00054     APrioriRefinement
00055     (concepts::AdaptiveSpace<Real, concepts::AdaptiveAdjustP<2> >& spc,
00056      concepts::Attribute attribVtx, concepts::Attribute attribEdge,
00057      const int* const p, const uint subdiv = X | Y,
00058      const concepts::Attribute attribCell = 0) :
00059       spc_(&spc), attribVtx_(attribVtx), attribEdge_(attribEdge), 
00060       attribCell_(0), p_(p),
00061       subdiv_(subdiv), level_(MAXSHORT) {
00062       if (attribCell) attribCell_.reset(new concepts::Attribute(attribCell));
00063     }
00064     APrioriRefinement
00065     (concepts::AdaptiveSpace<Real, concepts::AdaptiveAdjustP<2> >& spc,
00066      const int* const p, const uint subdiv = X | Y,
00067      const concepts::Level<2> level = MAXSHORT) :
00068       spc_(&spc), adj_(0), attribVtx_(0), attribEdge_(0), attribCell_(0), 
00069       p_(p), subdiv_(subdiv), level_(level) {}
00084     APrioriRefinement(concepts::Adaptivity<concepts::Connector,
00085           concepts::AdaptiveAdjustP<2> >& adj,
00086           concepts::Attribute attribVtx,
00087           concepts::Attribute attribEdge,
00088           const int* const p, const uint subdiv = X | Y) :
00089       spc_(0), adj_(&adj), attribVtx_(attribVtx), attribEdge_(attribEdge),
00090       attribCell_(0), p_(p), subdiv_(subdiv), level_(MAXSHORT) {}
00091 
00092     virtual void operator() (const concepts::Element<Real>& elm)
00093       throw(concepts::MissingFeature);
00094     virtual void operator() (const concepts::Cell& cell)
00095       throw(concepts::MissingFeature);
00096   protected:
00097     virtual std::ostream& info(std::ostream& os) const;
00098   private:
00100     concepts::AdaptiveSpace<Real, concepts::AdaptiveAdjustP<2> >* spc_;
00102     concepts::Adaptivity<concepts::Connector,
00103        concepts::AdaptiveAdjustP<2> >* adj_;
00105     concepts::Attribute attribVtx_, attribEdge_;
00107     std::auto_ptr<concepts::Attribute> attribCell_;
00109     const int* const p_;
00111     const uint subdiv_;
00113     const concepts::Level<2> level_;
00115     concepts::AdaptiveAdjustP<2>
00116     computeRef_(const concepts::Quad& q, concepts::Level<2> level) const;
00117   };
00118 
00119   // ************************************************* APrioriRefinementRule **
00120 
00121   class APrioriRefinementRule : public concepts::OutputOperator {
00122   public:
00123     enum subdivTypes { NONE = 0, X = 1, Y = 2};
00124     static const short MAXSHORT = 32767;
00125 
00126     virtual concepts::AdaptiveAdjustP<2> operator()
00127       (const concepts::Connector2& q) const = 0;
00128   protected:
00129     virtual std::ostream& info(std::ostream& os) const;
00130   };
00131 
00132   // ******************************************** APrioriGeometricRefinement **
00133 
00137   class APrioriGeometricRefinement : public APrioriRefinementRule {
00138   public:
00149     APrioriGeometricRefinement(concepts::Attribute attribVtx,
00150                                concepts::Attribute attribEdge,
00151                                const int* const p, const uint subdiv = X | Y);
00153     APrioriGeometricRefinement(const APrioriGeometricRefinement& rule) :
00154       attribVtx_(rule.attribVtx_), attribEdge_(rule.attribEdge_),
00155       p_(rule.p_), subdiv_(rule.subdiv_) {}
00157     concepts::Set<concepts::Attribute>& attribVtx() { return attribVtx_; }
00159     concepts::Set<concepts::Attribute>& attribEdge() { return attribEdge_; }
00160 
00161     virtual concepts::AdaptiveAdjustP<2> operator()
00162       (const concepts::Connector2& q) const;
00163   protected:
00164     virtual std::ostream& info(std::ostream& os) const;
00165   private:
00167     concepts::Set<concepts::Attribute> attribVtx_, attribEdge_;
00169     const int* const p_;
00171     const uint subdiv_;
00172   };
00173 
00174   // ********************************************** APrioriRegularRefinement **
00175 
00179   class APrioriRegularRefinement : public APrioriRefinementRule {
00180   public:
00186     APrioriRegularRefinement(const int* const p, const uint subdiv = X | Y) :
00187       p_(p), subdiv_(subdiv) {}
00189     APrioriRegularRefinement(const APrioriRegularRefinement& rule) :
00190       p_(rule.p_), subdiv_(rule.subdiv_) {}
00191     virtual concepts::AdaptiveAdjustP<2> operator()
00192       (const concepts::Connector2& q) const;
00193   protected:
00194     virtual std::ostream& info(std::ostream& os) const;
00195   private:
00197     const int* const p_;
00199     const uint subdiv_;
00200   };
00201 
00202   // ************************************************** APrioriRefinementNew **
00203 
00204   class APrioriRefinementNew : public concepts::CellPostprocess<Real> {
00205   public:
00210     APrioriRefinementNew(concepts::Adaptivity<concepts::Connector,
00211                          concepts::AdaptiveAdjustP<2> >& adj,
00212                          APrioriRefinementRule* rule = 0) : 
00213       adj_(&adj), rule_(rule) {}
00215     void add(concepts::Attribute attrib, APrioriRefinementRule* rule) {
00216       if (rule)
00217         rules_[attrib] = rule;
00218       else {
00219         std::map<uint, APrioriRefinementRule*>::
00220           iterator i = rules_.find(attrib);
00221         if (i != rules_.end()) rules_.erase(i);
00222       }
00223     }
00224     virtual void operator() (const concepts::Element<Real>& elm)
00225       throw(concepts::MissingFeature);
00226     virtual void operator() (const concepts::Cell& cell)
00227       throw(concepts::MissingFeature);
00228   private:
00230     concepts::Adaptivity<concepts::Connector,
00231                          concepts::AdaptiveAdjustP<2> >* adj_;
00233     APrioriRefinementRule* rule_;
00235     std::map<uint, APrioriRefinementRule*> rules_;
00236   };
00237 
00238 } // namespace hp2D
00239 
00240 #endif // APRIORIRef2D_hh

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