Flow123d  release_2.2.0-914-gf1a3a4f
quadrature_lib.cc
Go to the documentation of this file.
1 /*!
2  *
3  * Copyright (C) 2015 Technical University of Liberec. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it under
6  * the terms of the GNU General Public License version 3 as published by the
7  * Free Software Foundation. (http://www.gnu.org/licenses/gpl-3.0.en.html)
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12  *
13  *
14  * @file quadrature_lib.cc
15  * @brief Definitions of particular quadrature rules on simplices.
16  * @author Jan Stebel
17  */
18 
19 #include "system/global_defs.h"
20 #include "system/system.hh"
22 
23 
24 #define FLOAT double
25 #define SHORT int
26 #define _F(n) n
27 #include "quad.c"
28 #undef FLOAT
29 #undef SHORT
30 #undef _F
31 
32 
33 using namespace arma;
34 
35 
36 template<unsigned int dim>
37 QGauss<dim>::QGauss(const unsigned int order)
38 {
39  typedef QUAD* pQUAD;
40 
41  static const pQUAD
42  q1d[] = { QUAD_1D_P1,
50  },
51  q2d[] = { QUAD_2D_P1,
58  },
59  q3d[] = { QUAD_3D_P1,
64  };
65  static const double unit_cell_volume[] = { 1, 1, 0.5, 1./6 };
66  const pQUAD *q;
67  unsigned int nquads;
68  vec::fixed<dim> p;
69 
70  switch (dim)
71  {
72  case 0:
73  this->quadrature_points.push_back(p);
74  this->weights.push_back(1);
75  return;
76  case 1:
77  q = q1d;
78  nquads = sizeof(q1d) / sizeof(pQUAD);
79  break;
80  case 2:
81  q = q2d;
82  nquads = sizeof(q2d) / sizeof(pQUAD);
83  break;
84  case 3:
85  q = q3d;
86  nquads = sizeof(q3d) / sizeof(pQUAD);
87  break;
88  }
89 
90  OLD_ASSERT(order < nquads, "Quadrature of given order is not implemented.");
91 
92  for (int i=0; i<q[order]->npoints; i++)
93  {
94  for (unsigned int j=0; j<dim; j++)
95  p(j) = q[order]->points[i*(dim+1)+j];
96 
97  this->quadrature_points.push_back(p);
98  // The weights must be adjusted according to the volume of the unit cell:
99  // 1D cell: volume 1
100  // 2D cell: volume 1/2
101  // 3D cell: volume 1/6
102  this->weights.push_back(q[order]->weights[i]*unit_cell_volume[dim]);
103  }
104 }
105 
106 
107 template class QGauss<0>;
108 template class QGauss<1>;
109 template class QGauss<2>;
110 template class QGauss<3>;
#define QUAD_2D_P20
Definition: quad.h:115
#define QUAD_1D_P14
Definition: quad.h:63
#define QUAD_3D_P5
Definition: quad.h:129
#define QUAD_1D_P10
Definition: quad.h:57
#define QUAD_3D_P7
Definition: quad.h:133
#define QUAD_3D_P6
Definition: quad.h:131
#define QUAD_1D_P15
Definition: quad.h:64
#define QUAD_3D_P8
Definition: quad.h:135
#define QUAD_2D_P9
Definition: quad.h:93
#define QUAD_1D_P11
Definition: quad.h:58
#define QUAD_1D_P2
Definition: quad.h:45
#define QUAD_2D_P21
Definition: quad.h:117
#define QUAD_2D_P17
Definition: quad.h:109
#define QUAD_2D_P10
Definition: quad.h:95
Definition: quad.h:29
#define QUAD_1D_P18
Definition: quad.h:69
#define QUAD_2D_P19
Definition: quad.h:113
#define QUAD_2D_P2
Definition: quad.h:79
#define QUAD_1D_P5
Definition: quad.h:49
#define QUAD_1D_P21
Definition: quad.h:73
#define QUAD_3D_P13
Definition: quad.h:145
Symmetric Gauss-Legendre quadrature formulae on simplices.
#define QUAD_2D_P14
Definition: quad.h:103
#define QUAD_2D_P6
Definition: quad.h:87
#define OLD_ASSERT(...)
Definition: global_defs.h:131
#define QUAD_2D_P12
Definition: quad.h:99
Global macros to enhance readability and debugging, general constants.
#define QUAD_3D_P2
Definition: quad.h:123
#define QUAD_2D_P8
Definition: quad.h:91
#define QUAD_2D_P16
Definition: quad.h:107
#define QUAD_2D_P1
Definition: quad.h:77
#define QUAD_1D_P13
Definition: quad.h:61
#define QUAD_1D_P9
Definition: quad.h:55
#define QUAD_2D_P5
Definition: quad.h:85
#define QUAD_2D_P18
Definition: quad.h:111
#define QUAD_2D_P4
Definition: quad.h:83
#define QUAD_1D_P16
Definition: quad.h:66
#define QUAD_1D_P8
Definition: quad.h:54
#define QUAD_3D_P12
Definition: quad.h:143
#define QUAD_1D_P17
Definition: quad.h:67
#define QUAD_2D_P13
Definition: quad.h:101
#define QUAD_3D_P14
Definition: quad.h:147
#define QUAD_3D_P11
Definition: quad.h:141
#define QUAD_1D_P3
Definition: quad.h:46
#define QUAD_3D_P10
Definition: quad.h:139
Definitions of particular quadrature rules on simplices.
#define QUAD_1D_P19
Definition: quad.h:70
#define QUAD_3D_P1
Definition: quad.h:121
#define QUAD_2D_P7
Definition: quad.h:89
#define QUAD_1D_P4
Definition: quad.h:48
#define QUAD_1D_P1
Definition: quad.h:43
#define QUAD_1D_P12
Definition: quad.h:60
#define QUAD_2D_P11
Definition: quad.h:97
#define QUAD_2D_P15
Definition: quad.h:105
#define QUAD_1D_P20
Definition: quad.h:72
#define QUAD_2D_P3
Definition: quad.h:81
#define QUAD_1D_P7
Definition: quad.h:52
QGauss(const unsigned int order)
Create a formula of given order.
#define QUAD_3D_P4
Definition: quad.h:127
#define QUAD_3D_P9
Definition: quad.h:137
#define QUAD_3D_P3
Definition: quad.h:125
#define QUAD_1D_P6
Definition: quad.h:51