• Main Page
  • Namespaces
  • Data Structures
  • Files
  • File List

/export/development/ViennaFEM/viennafem/quadrature/triangle.hpp

Go to the documentation of this file.
00001 #ifndef VIENNAFEM_QUADRATURE_TRIANGLE_HPP
00002 #define VIENNAFEM_QUADRATURE_TRIANGLE_HPP
00003 
00004 /* =========================================================================
00005    Copyright (c) 2012, Institute for Microelectronics,
00006                        Institute for Analysis and Scientific Computing,
00007                        TU Wien.
00008                              -----------------
00009                ViennaFEM - The Vienna Finite Element Method Library
00010                              -----------------
00011 
00012    Author:     Karl Rupp                          rupp@iue.tuwien.ac.at
00013 
00014    License:    MIT (X11), see file LICENSE in the ViennaFEM base directory
00015 ============================================================================ */
00016 
00017 #include "viennafem/forwards.h"
00018 #include "viennafem/cell_quan.hpp"
00019 
00020 #include "viennamath/forwards.h"
00021 #include "viennamath/expression.hpp"
00022 #include "viennamath/manipulation/substitute.hpp"
00023 #include "viennamath/manipulation/diff.hpp"
00024 #include "viennamath/manipulation/eval.hpp"
00025 #include "viennamath/runtime/numerical_quadrature.hpp"
00026 
00027 #include "viennagrid/topology/triangle.hpp"
00028 #include "viennagrid/topology/tetrahedron.hpp"
00029 
00034 namespace viennafem
00035 {
00036   
00037   //
00038   //
00039   // Exact for polynomials up to order 1
00040   //
00041   //
00043   template <typename InterfaceType>
00044   class rt_gauss_quad_element <viennafem::unit_triangle, 1, InterfaceType> : public viennamath::numerical_quadrature_interface<InterfaceType>
00045   {
00046       typedef typename InterfaceType::numeric_type         NumericT;
00047       typedef rt_gauss_quad_element <viennafem::unit_triangle, 1, InterfaceType>  self_type;
00048       typedef viennamath::numerical_quadrature_interface<InterfaceType>    BaseType;
00049     public:
00050       explicit rt_gauss_quad_element() : p_(2)
00051       {
00052         p_[0] = 1.0/3.0;
00053         p_[1] = 1.0/3.0;
00054       }
00055       
00056       BaseType * clone() const { return new self_type(); }
00057       
00058       NumericT eval(viennamath::rt_interval<InterfaceType> const & interv,
00059                     viennamath::rt_expr<InterfaceType> const & e,
00060                     viennamath::rt_variable<InterfaceType> const & var) const
00061       {
00062         return 0.5 * viennamath::eval(e, p_);
00063       }
00064       
00065     private:
00066       std::vector<NumericT> p_;
00067   };
00068   
00069   
00070   
00071   
00072   //
00073   //
00074   // Exact for polynomials up to degree 2
00075   //
00076   //
00081   template <typename InterfaceType>
00082   class rt_strang_quad_element <viennafem::unit_triangle, 2, InterfaceType> : public viennamath::numerical_quadrature_interface<InterfaceType>
00083   {
00084       typedef typename InterfaceType::numeric_type         NumericT;
00085       typedef rt_strang_quad_element <viennafem::unit_triangle, 2, InterfaceType>  self_type;
00086       typedef viennamath::numerical_quadrature_interface<InterfaceType>    BaseType;
00087     public:
00088       explicit rt_strang_quad_element() : p1_(2), p2_(2), p3_(2)
00089       {
00090         p1_[0] = 2.0/3.0; p1_[1] = 1.0/6.0;
00091         p2_[0] = 1.0/6.0; p2_[1] = 2.0/3.0;
00092         p3_[0] = 1.0/6.0; p3_[1] = 1.0/6.0;
00093       }
00094       
00095       BaseType * clone() const { return new self_type(); }
00096       
00097       NumericT eval(viennamath::rt_interval<InterfaceType> const & interv,
00098                     viennamath::rt_expr<InterfaceType> const & e,
00099                     viennamath::rt_variable<InterfaceType> const & var) const
00100       {
00101         return (viennamath::eval(e, p1_) + viennamath::eval(e, p2_) + viennamath::eval(e, p3_)) / 6.0;
00102       }
00103       
00104     private:
00105       std::vector<NumericT> p1_;
00106       std::vector<NumericT> p2_;
00107       std::vector<NumericT> p3_;
00108   };
00109   
00110   
00111   
00112   //
00113   //
00114   // Exact for polynomials up to degree 3
00115   //
00116   //
00121   template <typename InterfaceType>
00122   class rt_strang_quad_element <viennafem::unit_triangle, 3, InterfaceType> : public viennamath::numerical_quadrature_interface<InterfaceType>
00123   {
00124       typedef typename InterfaceType::numeric_type         NumericT;
00125       typedef rt_strang_quad_element <viennafem::unit_triangle, 3, InterfaceType>  self_type;
00126       typedef viennamath::numerical_quadrature_interface<InterfaceType>    BaseType;
00127     public:
00128       enum { num_points = 6 };
00129       
00130       explicit rt_strang_quad_element() : abscissas_(num_points, std::vector<numeric_type>(2)), weights_(num_points)
00131       {
00132         abscissas_[0][0] = 0.659027622374092; abscissas_[0][1] = 0.231933368553031;
00133         abscissas_[1][0] = 0.659027622374092; abscissas_[1][1] = 0.109039009072877;
00134         abscissas_[2][0] = 0.231933368553031; abscissas_[2][1] = 0.659027622374092;
00135         abscissas_[3][0] = 0.231933368553031; abscissas_[3][1] = 0.109039009072877;
00136         abscissas_[4][0] = 0.109039009072877; abscissas_[4][1] = 0.659027622374092;
00137         abscissas_[5][0] = 0.109039009072877; abscissas_[5][1] = 0.231933368553031;
00138         
00139         weights_[0] = 0.16666666666666666667;
00140         weights_[1] = 0.16666666666666666667;
00141         weights_[2] = 0.16666666666666666667;
00142         weights_[3] = 0.16666666666666666667;
00143         weights_[4] = 0.16666666666666666667;
00144         weights_[5] = 0.16666666666666666667;
00145       }
00146       
00147       BaseType * clone() const { return new self_type(); }
00148       
00149       NumericT eval(viennamath::rt_interval<InterfaceType> const & interv,
00150                     viennamath::rt_expr<InterfaceType> const & e,
00151                     viennamath::rt_variable<InterfaceType> const & var) const
00152       {
00153         NumericT result = 0;
00154         for (std::size_t i=0; i<num_points; ++i)
00155           result += weights_[i] * viennamath::eval(e, abscissas_[i]);
00156         return 0.5 * result;
00157       }
00158       
00159     private:
00160       std::vector<std::vector<NumericT> > abscissas_;
00161       std::vector<NumericT> weights_;
00162   };
00163 
00164   
00165   
00166   //
00167   //
00168   // Exact for polynomials up to degree 4
00169   //
00170   //
00175   template <typename InterfaceType>
00176   class rt_strang_quad_element <viennafem::unit_triangle, 4, InterfaceType> : public viennamath::numerical_quadrature_interface<InterfaceType>
00177   {
00178       typedef typename InterfaceType::numeric_type         NumericT;
00179       typedef rt_strang_quad_element <viennafem::unit_triangle, 4, InterfaceType>  self_type;
00180       typedef viennamath::numerical_quadrature_interface<InterfaceType>    BaseType;
00181     public:
00182       enum { num_points = 6 };
00183       
00184       explicit rt_strang_quad_element() : abscissas_(num_points, std::vector<numeric_type>(2)), weights_(num_points)
00185       {
00186         abscissas_[0][0] = 0.816847572980459; abscissas_[0][1] = 0.091576213509771;
00187         abscissas_[1][0] = 0.091576213509771; abscissas_[1][1] = 0.816847572980459;
00188         abscissas_[2][0] = 0.091576213509771; abscissas_[2][1] = 0.091576213509771;
00189         abscissas_[3][0] = 0.108103018168070; abscissas_[3][1] = 0.445948490915965;
00190         abscissas_[4][0] = 0.445948490915965; abscissas_[4][1] = 0.108103018168070;
00191         abscissas_[5][0] = 0.445948490915965; abscissas_[5][1] = 0.445948490915965;
00192         
00193         weights_[0] = 0.109951743655322;
00194         weights_[1] = 0.109951743655322;
00195         weights_[2] = 0.109951743655322;
00196         weights_[3] = 0.223381589678011;
00197         weights_[4] = 0.223381589678011;
00198         weights_[5] = 0.223381589678011;
00199       }
00200       
00201       BaseType * clone() const { return new self_type(); }
00202       
00203       NumericT eval(viennamath::rt_interval<InterfaceType> const & interv,
00204                     viennamath::rt_expr<InterfaceType> const & e,
00205                     viennamath::rt_variable<InterfaceType> const & var) const
00206       {
00207         NumericT result = 0;
00208         for (std::size_t i=0; i<num_points; ++i)
00209           result += weights_[i] * viennamath::eval(e, abscissas_[i]);
00210         return 0.5 * result;
00211       }
00212       
00213     private:
00214       std::vector<std::vector<NumericT> > abscissas_;
00215       std::vector<NumericT> weights_;
00216   };
00217   
00218   
00219   //
00220   //
00221   // Exact for polynomials up to degree 5
00222   //
00223   //
00228   template <typename InterfaceType>
00229   class rt_strang_quad_element <viennafem::unit_triangle, 5, InterfaceType> : public viennamath::numerical_quadrature_interface<InterfaceType>
00230   {
00231       typedef typename InterfaceType::numeric_type         NumericT;
00232       typedef rt_strang_quad_element <viennafem::unit_triangle, 5, InterfaceType>  self_type;
00233       typedef viennamath::numerical_quadrature_interface<InterfaceType>    BaseType;
00234     public:
00235       enum { num_points = 7 };
00236       
00237       explicit rt_strang_quad_element() : abscissas_(num_points, std::vector<numeric_type>(2)), weights_(num_points)
00238       {
00239         abscissas_[0][0] = 0.33333333333333333; abscissas_[0][1] = 0.33333333333333333;
00240         abscissas_[1][0] = 0.79742698535308720; abscissas_[1][1] = 0.10128650732345633;
00241         abscissas_[2][0] = 0.10128650732345633; abscissas_[2][1] = 0.79742698535308720;
00242         abscissas_[3][0] = 0.10128650732345633; abscissas_[3][1] = 0.10128650732345633;
00243         abscissas_[4][0] = 0.05971587178976981; abscissas_[4][1] = 0.47014206410511505;
00244         abscissas_[5][0] = 0.47014206410511505; abscissas_[5][1] = 0.05971587178976981;
00245         abscissas_[6][0] = 0.47014206410511505; abscissas_[6][1] = 0.47014206410511505;
00246         
00247         weights_[0] = 0.22500000000000000;
00248         weights_[1] = 0.12593918054482717;
00249         weights_[2] = 0.12593918054482717;
00250         weights_[3] = 0.12593918054482717;
00251         weights_[4] = 0.13239415278850616;
00252         weights_[5] = 0.13239415278850616;
00253         weights_[6] = 0.13239415278850616;
00254       }
00255 
00256       BaseType * clone() const { return new self_type(); }
00257 
00258       NumericT eval(viennamath::rt_interval<InterfaceType> const & interv,
00259                     viennamath::rt_expr<InterfaceType> const & e,
00260                     viennamath::rt_variable<InterfaceType> const & var) const
00261       {
00262         NumericT result = 0;
00263         for (std::size_t i=0; i<num_points; ++i)
00264           result += weights_[i] * viennamath::eval(e, abscissas_[i]);
00265         return 0.5 * result;
00266       }
00267       
00268     private:
00269       std::vector<std::vector<NumericT> > abscissas_;
00270       std::vector<NumericT> weights_;
00271   };
00272 
00273   
00274   //
00275   //
00276   // Exact for polynomials up to degree 6
00277   //
00278   //
00283   template <typename InterfaceType>
00284   class rt_strang_quad_element <viennafem::unit_triangle, 6, InterfaceType> : public viennamath::numerical_quadrature_interface<InterfaceType>
00285   {
00286       typedef typename InterfaceType::numeric_type         NumericT;
00287       typedef rt_strang_quad_element <viennafem::unit_triangle, 6, InterfaceType>  self_type;
00288       typedef viennamath::numerical_quadrature_interface<InterfaceType>    BaseType;
00289     public:
00290       enum { num_points = 9 };
00291       
00292       explicit rt_strang_quad_element() : abscissas_(num_points, std::vector<numeric_type>(2)), weights_(num_points)
00293       {
00294         abscissas_[0][0] = 0.124949503233232; abscissas_[0][1] = 0.437525248383384;
00295         abscissas_[1][0] = 0.437525248383384; abscissas_[1][1] = 0.124949503233232;
00296         abscissas_[2][0] = 0.437525248383384; abscissas_[2][1] = 0.437525248383384;
00297         abscissas_[3][0] = 0.797112651860071; abscissas_[3][1] = 0.165409927389841;
00298         abscissas_[4][0] = 0.797112651860071; abscissas_[4][1] = 0.037477420750088;
00299         abscissas_[5][0] = 0.165409927389841; abscissas_[5][1] = 0.797112651860071;
00300         abscissas_[6][0] = 0.165409927389841; abscissas_[6][1] = 0.037477420750088;
00301         abscissas_[7][0] = 0.037477420750088; abscissas_[7][1] = 0.797112651860071;
00302         abscissas_[8][0] = 0.037477420750088; abscissas_[8][1] = 0.165409927389841;
00303         
00304         weights_[0] = 0.205950504760887;
00305         weights_[1] = 0.205950504760887;
00306         weights_[2] = 0.205950504760887;
00307         weights_[3] = 0.063691414286223;
00308         weights_[4] = 0.063691414286223;
00309         weights_[5] = 0.063691414286223;
00310         weights_[6] = 0.063691414286223;
00311         weights_[7] = 0.063691414286223;
00312         weights_[8] = 0.063691414286223;
00313       }
00314 
00315       BaseType * clone() const { return new self_type(); }
00316 
00317       NumericT eval(viennamath::rt_interval<InterfaceType> const & interv,
00318                     viennamath::rt_expr<InterfaceType> const & e,
00319                     viennamath::rt_variable<InterfaceType> const & var) const
00320       {
00321         NumericT result = 0;
00322         for (std::size_t i=0; i<num_points; ++i)
00323           result += weights_[i] * viennamath::eval(e, abscissas_[i]);
00324         return 0.5 * result;
00325       }
00326       
00327     private:
00328       std::vector<std::vector<NumericT> > abscissas_;
00329       std::vector<NumericT> weights_;
00330   };
00331   
00332   
00333   //
00334   //
00335   // Exact for polynomials up to degree 7:
00336   //
00337   //
00342   template <typename InterfaceType>
00343   class rt_gauss_quad_element <viennafem::unit_triangle, 7, InterfaceType> : public viennamath::numerical_quadrature_interface<InterfaceType>
00344   {
00345       typedef typename InterfaceType::numeric_type         NumericT;
00346       typedef rt_gauss_quad_element <viennafem::unit_triangle, 7, InterfaceType>  self_type;
00347       typedef viennamath::numerical_quadrature_interface<InterfaceType>    BaseType;
00348     public:
00349       enum { num_points = 16 };
00350       
00351       explicit rt_gauss_quad_element() : abscissas_(num_points, std::vector<numeric_type>(2)), weights_(num_points)
00352       {
00353         abscissas_[0][0] = 0.0571041961; abscissas_[0][1] = 0.06546699455602246;
00354         abscissas_[1][0] = 0.2768430136; abscissas_[1][1] = 0.05021012321401679;
00355         abscissas_[2][0] = 0.5835904324; abscissas_[2][1] = 0.02891208422223085;
00356         abscissas_[3][0] = 0.8602401357; abscissas_[3][1] = 0.009703785123906346;
00357         abscissas_[4][0] = 0.0571041961; abscissas_[4][1] = 0.3111645522491480;
00358         abscissas_[5][0] = 0.2768430136; abscissas_[5][1] = 0.2386486597440242;
00359         abscissas_[6][0] = 0.5835904324; abscissas_[6][1] = 0.1374191041243166;
00360         abscissas_[7][0] = 0.8602401357; abscissas_[7][1] = 0.04612207989200404;
00361         abscissas_[8][0] = 0.0571041961; abscissas_[8][1] = 0.6317312516508520;
00362         abscissas_[9][0] = 0.2768430136; abscissas_[9][1] = 0.4845083266559759;
00363         abscissas_[10][0] = 0.5835904324; abscissas_[10][1] = 0.2789904634756834;
00364         abscissas_[11][0] = 0.8602401357; abscissas_[11][1] = 0.09363778440799593;
00365         abscissas_[12][0] = 0.0571041961; abscissas_[12][1] = 0.8774288093439775;
00366         abscissas_[13][0] = 0.2768430136; abscissas_[13][1] = 0.6729468631859832;
00367         abscissas_[14][0] = 0.5835904324; abscissas_[14][1] = 0.3874974833777692;
00368         abscissas_[15][0] = 0.8602401357; abscissas_[15][1] = 0.1300560791760936;
00369         
00370         weights_[0] = 0.04713673637581137;
00371         weights_[1] = 0.07077613579259895;
00372         weights_[2] = 0.04516809856187617;
00373         weights_[3] = 0.01084645180365496;
00374         weights_[4] = 0.08837017702418863;
00375         weights_[5] = 0.1326884322074010;
00376         weights_[6] = 0.08467944903812383;
00377         weights_[7] = 0.02033451909634504;
00378         weights_[8] = 0.08837017702418863;
00379         weights_[9] = 0.1326884322074010;
00380         weights_[10] = 0.08467944903812383;
00381         weights_[11] = 0.02033451909634504;
00382         weights_[12] = 0.04713673637581137;
00383         weights_[13] = 0.07077613579259895;
00384         weights_[14] = 0.04516809856187617;
00385         weights_[15] = 0.01084645180365496;
00386         
00387       }
00388 
00389       BaseType * clone() const { return new self_type(); }
00390 
00391       NumericT eval(viennamath::rt_interval<InterfaceType> const & interv,
00392                     viennamath::rt_expr<InterfaceType> const & e,
00393                     viennamath::rt_variable<InterfaceType> const & var) const
00394       {
00395         NumericT result = 0;
00396         for (std::size_t i=0; i<num_points; ++i)
00397           result += weights_[i] * viennamath::eval(e, abscissas_[i]);
00398         return 0.5 * result;
00399       }
00400       
00401     private:
00402       std::vector<std::vector<NumericT> > abscissas_;
00403       std::vector<NumericT> weights_;
00404   };
00405   
00406   
00411   template <typename InterfaceType>
00412   class rt_strang_quad_element <viennafem::unit_triangle, 7, InterfaceType> : public viennamath::numerical_quadrature_interface<InterfaceType>
00413   {
00414       typedef typename InterfaceType::numeric_type         NumericT;
00415       typedef rt_strang_quad_element <viennafem::unit_triangle, 7, InterfaceType>  self_type;
00416       typedef viennamath::numerical_quadrature_interface<InterfaceType>    BaseType;
00417     public:
00418       enum { num_points = 13 };
00419       
00420       explicit rt_strang_quad_element() : abscissas_(num_points, std::vector<numeric_type>(2)), weights_(num_points)
00421       {
00422         abscissas_[ 0][0] = 0.333333333333333; abscissas_[ 0][1] = 0.333333333333333;
00423         abscissas_[ 1][0] = 0.479308067841923; abscissas_[ 1][1] = 0.260345966079038;
00424         abscissas_[ 2][0] = 0.260345966079038; abscissas_[ 2][1] = 0.479308067841923;
00425         abscissas_[ 3][0] = 0.260345966079038; abscissas_[ 3][1] = 0.260345966079038;
00426         
00427         abscissas_[ 4][0] = 0.869739794195568; abscissas_[ 4][1] = 0.065130102902216;
00428         abscissas_[ 5][0] = 0.065130102902216; abscissas_[ 5][1] = 0.869739794195568;
00429         abscissas_[ 6][0] = 0.065130102902216; abscissas_[ 6][1] = 0.065130102902216;
00430         
00431         abscissas_[ 7][0] = 0.638444188569809; abscissas_[ 7][1] = 0.312865496004875;
00432         abscissas_[ 8][0] = 0.638444188569809; abscissas_[ 8][1] = 0.048690315425316;
00433         abscissas_[ 9][0] = 0.312865496004875; abscissas_[ 9][1] = 0.638444188569809;
00434         abscissas_[10][0] = 0.312865496004875; abscissas_[10][1] = 0.048690315425316;
00435         abscissas_[11][0] = 0.048690315425316; abscissas_[11][1] = 0.638444188569809;
00436         abscissas_[12][0] = 0.048690315425316; abscissas_[12][1] = 0.312865496004875;
00437         
00438         weights_[ 0] = -0.149570044467670;
00439         weights_[ 1] = 0.175615257433204;
00440         weights_[ 2] = 0.175615257433204;
00441         weights_[ 3] = 0.175615257433204;
00442         
00443         weights_[ 4] = 0.053347235608839;
00444         weights_[ 5] = 0.053347235608839;
00445         weights_[ 6] = 0.053347235608839;
00446         
00447         weights_[ 7] = 0.077113760890257;
00448         weights_[ 8] = 0.077113760890257;
00449         weights_[ 9] = 0.077113760890257;
00450         weights_[10] = 0.077113760890257;
00451         weights_[11] = 0.077113760890257;
00452         weights_[12] = 0.077113760890257;
00453       }
00454 
00455       BaseType * clone() const { return new self_type(); }
00456 
00457       NumericT eval(viennamath::rt_interval<InterfaceType> const & interv,
00458                     viennamath::rt_expr<InterfaceType> const & e,
00459                     viennamath::rt_variable<InterfaceType> const & var) const
00460       {
00461         NumericT result = 0;
00462         for (std::size_t i=0; i<num_points; ++i)
00463           result += weights_[i] * viennamath::eval(e, abscissas_[i]);
00464         return 0.5 * result;
00465       }
00466       
00467     private:
00468       std::vector<std::vector<NumericT> > abscissas_;
00469       std::vector<NumericT> weights_;
00470   };
00471   
00472 
00473   
00474   //
00475   //
00476   // Exact for polynomials up to degree 13
00477   //
00478   //
00479 
00480   // TOMS algorithm #706
00482   template <typename InterfaceType>
00483   class rt_strang_quad_element <viennafem::unit_triangle, 13, InterfaceType> : public viennamath::numerical_quadrature_interface<InterfaceType>
00484   {
00485       typedef typename InterfaceType::numeric_type         NumericT;
00486       typedef rt_strang_quad_element <viennafem::unit_triangle, 13, InterfaceType>  self_type;
00487       typedef viennamath::numerical_quadrature_interface<InterfaceType>    BaseType;
00488     public:
00489       enum { num_points = 37 };
00490       
00491       explicit rt_strang_quad_element() : abscissas_(num_points, std::vector<numeric_type>(2)), weights_(num_points)
00492       {
00493         abscissas_[0][0] = 1.0/3.0; abscissas_[0][1] = 1.0/3.0;
00494         
00495         abscissas_[1][0] = 0.950275662924105565450352089520; abscissas_[1][1] = 0.024862168537947217274823955239;
00496         abscissas_[2][0] = 0.024862168537947217274823955239; abscissas_[2][1] = 0.950275662924105565450352089520;
00497         abscissas_[3][0] = 0.024862168537947217274823955239; abscissas_[3][1] = 0.024862168537947217274823955239;
00498         
00499         abscissas_[4][0] = 0.171614914923835347556304795551; abscissas_[4][1] = 0.414192542538082326221847602214;
00500         abscissas_[5][0] = 0.414192542538082326221847602214; abscissas_[5][1] = 0.171614914923835347556304795551;
00501         abscissas_[6][0] = 0.414192542538082326221847602214; abscissas_[6][1] = 0.414192542538082326221847602214;
00502         
00503         abscissas_[7][0] = 0.539412243677190440263092985511; abscissas_[7][1] = 0.230293878161404779868453507244;
00504         abscissas_[8][0] = 0.230293878161404779868453507244; abscissas_[8][1] = 0.539412243677190440263092985511;
00505         abscissas_[9][0] = 0.230293878161404779868453507244; abscissas_[9][1] = 0.230293878161404779868453507244;
00506 
00507         abscissas_[10][0] = 0.772160036676532561750285570113; abscissas_[10][1] = 0.113919981661733719124857214943;
00508         abscissas_[11][0] = 0.113919981661733719124857214943; abscissas_[11][1] = 0.772160036676532561750285570113;
00509         abscissas_[12][0] = 0.113919981661733719124857214943; abscissas_[12][1] = 0.113919981661733719124857214943;
00510 
00511         abscissas_[13][0] = 0.009085399949835353883572964740; abscissas_[13][1] = 0.495457300025082323058213517632;
00512         abscissas_[14][0] = 0.495457300025082323058213517632; abscissas_[14][1] = 0.009085399949835353883572964740;
00513         abscissas_[15][0] = 0.495457300025082323058213517632; abscissas_[15][1] = 0.495457300025082323058213517632;
00514 
00515         abscissas_[16][0] = 0.062277290305886993497083640527; abscissas_[16][1] = 0.468861354847056503251458179727;
00516         abscissas_[17][0] = 0.468861354847056503251458179727; abscissas_[17][1] = 0.062277290305886993497083640527;
00517         abscissas_[18][0] = 0.468861354847056503251458179727; abscissas_[18][1] = 0.468861354847056503251458179727;
00518 
00519         abscissas_[19][0] = 0.022076289653624405142446876931; abscissas_[19][1] = 0.851306504174348550389457672223;
00520         abscissas_[20][0] = 0.022076289653624405142446876931; abscissas_[20][1] = 0.126617206172027096933163647918;
00521         abscissas_[21][0] = 0.851306504174348550389457672223; abscissas_[21][1] = 0.022076289653624405142446876931;
00522         abscissas_[22][0] = 0.851306504174348550389457672223; abscissas_[22][1] = 0.126617206172027096933163647918;
00523         abscissas_[23][0] = 0.126617206172027096933163647918; abscissas_[23][1] = 0.022076289653624405142446876931;
00524         abscissas_[24][0] = 0.126617206172027096933163647918; abscissas_[24][1] = 0.851306504174348550389457672223;
00525 
00526         abscissas_[25][0] = 0.018620522802520968955913511549; abscissas_[25][1] = 0.689441970728591295496647976487;
00527         abscissas_[26][0] = 0.018620522802520968955913511549; abscissas_[26][1] = 0.291937506468887771754472382212;
00528         abscissas_[27][0] = 0.689441970728591295496647976487; abscissas_[27][1] = 0.018620522802520968955913511549;
00529         abscissas_[28][0] = 0.689441970728591295496647976487; abscissas_[28][1] = 0.291937506468887771754472382212;
00530         abscissas_[29][0] = 0.291937506468887771754472382212; abscissas_[29][1] = 0.018620522802520968955913511549;
00531         abscissas_[30][0] = 0.291937506468887771754472382212; abscissas_[30][1] = 0.689441970728591295496647976487;
00532 
00533         abscissas_[31][0] = 0.096506481292159228736516560903; abscissas_[31][1] = 0.635867859433872768286976979827;
00534         abscissas_[32][0] = 0.096506481292159228736516560903; abscissas_[32][1] = 0.267625659273967961282458816185;
00535         abscissas_[33][0] = 0.635867859433872768286976979827; abscissas_[33][1] = 0.096506481292159228736516560903;
00536         abscissas_[34][0] = 0.635867859433872768286976979827; abscissas_[34][1] = 0.267625659273967961282458816185;
00537         abscissas_[35][0] = 0.267625659273967961282458816185; abscissas_[35][1] = 0.096506481292159228736516560903;
00538         abscissas_[36][0] = 0.267625659273967961282458816185; abscissas_[36][1] = 0.635867859433872768286976979827;
00539         
00540         //weights:
00541         weights_[0] = 0.051739766065744133555179145422;
00542         
00543         weights_[1] = 0.008007799555564801597804123460;
00544         weights_[2] = 0.008007799555564801597804123460;
00545         weights_[3] = 0.008007799555564801597804123460;
00546         
00547         weights_[4] = 0.046868898981821644823226732071;
00548         weights_[5] = 0.046868898981821644823226732071;
00549         weights_[6] = 0.046868898981821644823226732071;
00550         
00551         weights_[7] = 0.046590940183976487960361770070;
00552         weights_[8] = 0.046590940183976487960361770070;
00553         weights_[9] = 0.046590940183976487960361770070;
00554         
00555         weights_[10] = 0.031016943313796381407646220131;
00556         weights_[11] = 0.031016943313796381407646220131;
00557         weights_[12] = 0.031016943313796381407646220131;
00558 
00559         weights_[13] = 0.010791612736631273623178240136;
00560         weights_[14] = 0.010791612736631273623178240136;
00561         weights_[15] = 0.010791612736631273623178240136;
00562         
00563         weights_[16] = 0.032195534242431618819414482205;
00564         weights_[17] = 0.032195534242431618819414482205;
00565         weights_[18] = 0.032195534242431618819414482205;
00566         
00567         weights_[19] = 0.015445834210701583817692900053;
00568         weights_[20] = 0.015445834210701583817692900053;
00569         weights_[21] = 0.015445834210701583817692900053;
00570         weights_[22] = 0.015445834210701583817692900053;
00571         weights_[23] = 0.015445834210701583817692900053;
00572         weights_[24] = 0.015445834210701583817692900053;
00573         
00574         weights_[25] = 0.017822989923178661888748319485;
00575         weights_[26] = 0.017822989923178661888748319485;
00576         weights_[27] = 0.017822989923178661888748319485;
00577         weights_[28] = 0.017822989923178661888748319485;
00578         weights_[29] = 0.017822989923178661888748319485;
00579         weights_[30] = 0.017822989923178661888748319485;
00580         
00581         weights_[31] = 0.037038683681384627918546472190;
00582         weights_[32] = 0.037038683681384627918546472190;
00583         weights_[33] = 0.037038683681384627918546472190;
00584         weights_[34] = 0.037038683681384627918546472190;
00585         weights_[35] = 0.037038683681384627918546472190;
00586         weights_[36] = 0.037038683681384627918546472190;
00587       }
00588       
00589       BaseType * clone() const { return new self_type(); }
00590 
00591       NumericT eval(viennamath::rt_interval<InterfaceType> const & interv,
00592                     viennamath::rt_expr<InterfaceType> const & e,
00593                     viennamath::rt_variable<InterfaceType> const & var) const
00594       {
00595         NumericT result = 0;
00596         for (std::size_t i=0; i<num_points; ++i)
00597           result += weights_[i] * viennamath::eval(e, abscissas_[i]);
00598         return 0.5 * result;
00599       }
00600       
00601     private:
00602       std::vector<std::vector<NumericT> > abscissas_;
00603       std::vector<NumericT> weights_;
00604   };
00605   
00606   
00607 }
00608 #endif

Generated on Wed Feb 29 2012 21:51:05 for ViennaFEM - The Vienna Finite Element Method Library by  doxygen 1.7.1