Go to the documentation of this file.00001
00002
00003
00004 #ifndef quadRule_hh
00005 #define quadRule_hh
00006
00007 #include <map>
00008
00009 #include "basics/typedefs.hh"
00010 #include "basics/defines.hh"
00011 #include "basics/outputOperator.hh"
00012 #include "quadrature.hh"
00013
00014 namespace concepts {
00015
00016
00017
00021 class QuadratureRule : public OutputOperator {
00022 private:
00023 QuadratureRule(const QuadratureRule& other);
00024 QuadratureRule& operator=(const QuadratureRule& other);
00025 public:
00026 QuadratureRule() { }
00027 virtual ~QuadratureRule() { }
00028
00030 virtual const Real* abscissas() const = 0;
00031
00033 virtual const Real* weights() const = 0;
00034
00036 virtual uint n() const = 0;
00037
00039 void printRule();
00040 };
00041
00042
00043
00049 class QuadratureRuleDynamic : public QuadratureRule {
00050 public:
00051 QuadratureRuleDynamic(const Real* abscissas = 0, const Real* weights = 0) :
00052 abscissas_(abscissas), weights_(weights) {}
00053 virtual const Real* abscissas() const { return abscissas_; }
00054 virtual const Real* weights() const { return weights_; }
00055 protected:
00057 const Real* abscissas_;
00059 const Real* weights_;
00060 };
00061
00062
00063
00085 class QuadratureRuleGaussLobatto : public QuadratureRuleDynamic {
00086 public:
00091 QuadratureRuleGaussLobatto(uint n) : rule_(n) {
00092 abscissas_ = rule_.abscissas();
00093 weights_ = rule_.weights();
00094 }
00095 virtual ~QuadratureRuleGaussLobatto();
00096 virtual uint n() const { return rule_.n(); }
00097 protected:
00098 virtual std::ostream& info(std::ostream& os) const;
00099 private:
00100 Quadrature<0> rule_;
00101 };
00102
00103
00104
00126 class QuadratureRuleGaussJacobi : public QuadratureRuleDynamic {
00127 public:
00131 QuadratureRuleGaussJacobi(uint n) : rule_(n) {
00132 abscissas_ = rule_.abscissas();
00133 weights_ = rule_.weights();
00134 }
00135 virtual ~QuadratureRuleGaussJacobi();
00136 virtual uint n() const { return rule_.n(); }
00137 protected:
00138 virtual std::ostream& info(std::ostream& os) const;
00139 private:
00140 Quadrature<4> rule_;
00141 };
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169 class QuadratureRuleTrapeze : public QuadratureRuleDynamic {
00170 public:
00174 QuadratureRuleTrapeze(uint n)
00175 : rule_(n), shAbscissas_(0), shWeights_(0) {
00176 abscissas_ = rule_.abscissas();
00177 weights_ = rule_.weights();
00178 }
00189 QuadratureRuleTrapeze(uint n, Real x0, Real xend);
00190 virtual ~QuadratureRuleTrapeze();
00191
00192 virtual const Real* abscissas() const {
00193 return abscissas_ ? abscissas_ : shAbscissas_;
00194 }
00195 virtual const Real* weights() const {
00196 return weights_ ? weights_ : shWeights_;
00197 }
00198
00199 virtual uint n() const { return rule_.n(); }
00200 protected:
00201 virtual std::ostream& info(std::ostream& os) const;
00202 private:
00203 Quadrature<5> rule_;
00205 Real *shAbscissas_, *shWeights_;
00206 };
00207
00208
00209
00215 class QuadRuleFactory : public OutputOperator {
00216 public:
00217 QuadRuleFactory(enum intRule type = GAUSS_JACOBI, uint constPoints = 10,
00218 uint addPoints = 2, bool constant = false);
00219
00226 QuadratureRule* operator()(const ushort p = 1) const;
00227
00234 void set(enum concepts::intRule rule, bool constant, uint points);
00235
00237 void reset();
00238
00240 inline const uint count() const { return cnt_; }
00241
00243 const std::string integrationRule() const;
00244
00246 enum intRule type() const { return integrationType_; }
00247 protected:
00248 virtual std::ostream& info(std::ostream& os) const;
00249 private:
00255 enum intRule integrationType_;
00259 uint constNumerOfPoints_;
00263 uint addNumberOfPoints_;
00267 bool useConstantNumberOfPoints_;
00268
00270 uint cnt_;
00271 };
00272
00273 }
00274
00275 #endif // quadRule_hh