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
00016 namespace concepts {
00017 class Quad;
00018 }
00019
00020 namespace hp2D {
00021
00022 using concepts::Real;
00023
00024
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
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
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
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
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 }
00239
00240 #endif // APRIORIRef2D_hh