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

integration/quadRule.hh
Go to the documentation of this file.
00001 /* 1D quadrature rules
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   // ******************************************************** QuadratureRule **
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   // ************************************************* QuadratureRuleDynamic **
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   // ******************************************** QuadratureRuleGaussLobatto **
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   // ********************************************* QuadratureRuleGaussJacobi **
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   // ************************************************** QuadratureRuleTrapeze **
00144 
00145   /* Trapeze quadrature rule including both endpoints -1 and 1.
00146      \f[ \int_{-1}^1 f(x) \, dx \approx \sum_{i=0}^(n-1) w_i f(x_i) \f]
00147      is only exact for \f$f \in P_{1}\f$.
00148      n must be greater or equal to 2.
00149      \n
00150      The abscissas \f$x_i = -1 + 2i/(n-1)\f$ are equidistant
00151      and the weights are
00152      \f[w_i = \frac{1}{n-1}\left\{\begin{array}{ll}1 & i \in \{0,n\}\\2 & \mbox{otherwise}\end{array}\right.\f]
00153 
00154      The computations and the storage of the values are done by the
00155      class Quadrature with template parameter 4. The difference
00156      between this class and Quadrature is that it is in a class
00157      hierarchy of quadrature rules. This has advantages when
00158      dynamically switching quadrature rules is needed. On the other
00159      hand, this class returns the values via a virtual function call
00160      \c abscissas() and \c weights() should therefore not be called
00161      to often (inside loops etc.).
00162 
00163      The abscissas are good for graphical output.
00164 
00165      @see Quadrature
00166      @author Kersten Schmidt, 2004
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   // ******************************************************* QuadRuleFactory **
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 } // namespace concepts
00274 
00275 #endif // quadRule_hh

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