00001 #ifndef VIENNAFEM_QUADRATURE_TRIANGLE_HPP
00002 #define VIENNAFEM_QUADRATURE_TRIANGLE_HPP
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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
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
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
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
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
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
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
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
00477
00478
00479
00480
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
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