libMesh
Public Member Functions | Static Public Member Functions | Public Attributes | Protected Types | Protected Member Functions | Protected Attributes | Static Protected Attributes | Private Member Functions | List of all members
libMesh::QGauss Class Reference

This class implements specific orders of Gauss quadrature. More...

#include <quadrature_gauss.h>

Inheritance diagram for libMesh::QGauss:
[legend]

Public Member Functions

 QGauss (unsigned int dim, Order order=INVALID_ORDER)
 Constructor. More...
 
 QGauss (const QGauss &)=default
 Copy/move ctor, copy/move assignment operator, and destructor are all explicitly defaulted for this simple class. More...
 
 QGauss (QGauss &&)=default
 
QGaussoperator= (const QGauss &)=default
 
QGaussoperator= (QGauss &&)=default
 
virtual ~QGauss ()=default
 
virtual QuadratureType type () const override
 
virtual std::unique_ptr< QBaseclone () const override
 
ElemType get_elem_type () const
 
unsigned int get_p_level () const
 
unsigned int n_points () const
 
unsigned int size () const
 Alias for n_points() to enable use in index_range. More...
 
unsigned int get_dim () const
 
const std::vector< Point > & get_points () const
 
std::vector< Point > & get_points ()
 
const std::vector< Real > & get_weights () const
 
std::vector< Real > & get_weights ()
 
Point qp (const unsigned int i) const
 
Real w (const unsigned int i) const
 
virtual void init (const ElemType type=INVALID_ELEM, unsigned int p_level=0)
 Initializes the data structures for a quadrature rule for an element of type type. More...
 
virtual void init (const Elem &elem, const std::vector< Real > &vertex_distance_func, unsigned int p_level=0)
 Initializes the data structures for an element potentially "cut" by a signed distance function. More...
 
Order get_order () const
 
void print_info (std::ostream &os=libMesh::out) const
 Prints information relevant to the quadrature rule, by default to libMesh::out. More...
 
void scale (std::pair< Real, Real > old_range, std::pair< Real, Real > new_range)
 Maps the points of a 1D quadrature rule defined by "old_range" to another 1D interval defined by "new_range" and scales the weights accordingly. More...
 
virtual bool shapes_need_reinit ()
 

Static Public Member Functions

static std::unique_ptr< QBasebuild (std::string_view name, const unsigned int dim, const Order order=INVALID_ORDER)
 Builds a specific quadrature rule based on the name string. More...
 
static std::unique_ptr< QBasebuild (const QuadratureType qt, const unsigned int dim, const Order order=INVALID_ORDER)
 Builds a specific quadrature rule based on the QuadratureType. More...
 
static void print_info (std::ostream &out_stream=libMesh::out)
 Prints the reference information, by default to libMesh::out. More...
 
static std::string get_info ()
 Gets a string containing the reference information. More...
 
static unsigned int n_objects ()
 Prints the number of outstanding (created, but not yet destroyed) objects. More...
 
static void enable_print_counter_info ()
 Methods to enable/disable the reference counter output from print_info() More...
 
static void disable_print_counter_info ()
 

Public Attributes

bool allow_rules_with_negative_weights
 Flag (default true) controlling the use of quadrature rules with negative weights. More...
 
bool allow_nodal_pyramid_quadrature
 The flag's value defaults to false so that one does not accidentally use a nodal quadrature rule on Pyramid elements, since evaluating the inverse element Jacobian (e.g. More...
 

Protected Types

typedef std::map< std::string, std::pair< unsigned int, unsigned int > > Counts
 Data structure to log the information. More...
 

Protected Member Functions

virtual void init_0D (const ElemType type=INVALID_ELEM, unsigned int p_level=0)
 Initializes the 0D quadrature rule by filling the points and weights vectors with the appropriate values. More...
 
void tensor_product_quad (const QBase &q1D)
 Constructs a 2D rule from the tensor product of q1D with itself. More...
 
void tensor_product_hex (const QBase &q1D)
 Computes the tensor product quadrature rule [q1D x q1D x q1D] from the 1D rule q1D. More...
 
void tensor_product_prism (const QBase &q1D, const QBase &q2D)
 Computes the tensor product of a 1D quadrature rule and a 2D quadrature rule. More...
 
void increment_constructor_count (const std::string &name) noexcept
 Increments the construction counter. More...
 
void increment_destructor_count (const std::string &name) noexcept
 Increments the destruction counter. More...
 

Protected Attributes

unsigned int _dim
 The spatial dimension of the quadrature rule. More...
 
Order _order
 The polynomial order which the quadrature rule is capable of integrating exactly. More...
 
ElemType _type
 The type of element for which the current values have been computed. More...
 
unsigned int _p_level
 The p-level of the element for which the current values have been computed. More...
 
std::vector< Point_points
 The locations of the quadrature points in reference element space. More...
 
std::vector< Real_weights
 The quadrature weights. More...
 

Static Protected Attributes

static Counts _counts
 Actually holds the data. More...
 
static Threads::atomic< unsigned int_n_objects
 The number of objects. More...
 
static Threads::spin_mutex _mutex
 Mutual exclusion object to enable thread-safe reference counting. More...
 
static bool _enable_print_counter = true
 Flag to control whether reference count information is printed when print_info is called. More...
 

Private Member Functions

virtual void init_1D (const ElemType, unsigned int) override
 Initializes the 1D quadrature rule by filling the points and weights vectors with the appropriate values. More...
 
virtual void init_2D (const ElemType, unsigned int) override
 Initializes the 2D quadrature rule by filling the points and weights vectors with the appropriate values. More...
 
virtual void init_3D (const ElemType, unsigned int) override
 Initializes the 3D quadrature rule by filling the points and weights vectors with the appropriate values. More...
 
void dunavant_rule (const Real rule_data[][4], const unsigned int n_pts)
 The Dunavant rules are for triangles. More...
 
void dunavant_rule2 (const Real *wts, const Real *a, const Real *b, const unsigned int *permutation_ids, const unsigned int n_wts)
 
void keast_rule (const Real rule_data[][4], const unsigned int n_pts)
 The Keast rules are for tets. More...
 

Detailed Description

This class implements specific orders of Gauss quadrature.

The rules of Order p are capable of integrating polynomials of degree p exactly.

Author
Benjamin Kirk
John W. Peterson
Date
2003 Implements 1, 2, and 3D "Gaussian" quadrature rules.

Definition at line 39 of file quadrature_gauss.h.

Member Typedef Documentation

◆ Counts

typedef std::map<std::string, std::pair<unsigned int, unsigned int> > libMesh::ReferenceCounter::Counts
protectedinherited

Data structure to log the information.

The log is identified by the class name.

Definition at line 119 of file reference_counter.h.

Constructor & Destructor Documentation

◆ QGauss() [1/3]

libMesh::QGauss::QGauss ( unsigned int  dim,
Order  order = INVALID_ORDER 
)
inline

Constructor.

Declares the order of the quadrature rule. We explicitly call the init function in 1D since the other tensor-product rules require this one.

Note
The element type, EDGE2, will not be used internally, however if we called the function with INVALID_ELEM it would try to be smart and return, thinking it had already done the work.

Definition at line 52 of file quadrature_gauss.h.

References dim, libMesh::EDGE2, and libMesh::QBase::init().

53  :
54  QBase(dim, order)
55  {
56  if (dim == 1)
57  init(EDGE2);
58  }
virtual void init(const ElemType type=INVALID_ELEM, unsigned int p_level=0)
Initializes the data structures for a quadrature rule for an element of type type.
Definition: quadrature.C:64
unsigned int dim
QBase(unsigned int dim, Order order=INVALID_ORDER)
Constructor.
Definition: quadrature.C:27

◆ QGauss() [2/3]

libMesh::QGauss::QGauss ( const QGauss )
default

Copy/move ctor, copy/move assignment operator, and destructor are all explicitly defaulted for this simple class.

◆ QGauss() [3/3]

libMesh::QGauss::QGauss ( QGauss &&  )
default

◆ ~QGauss()

virtual libMesh::QGauss::~QGauss ( )
virtualdefault

Member Function Documentation

◆ build() [1/2]

std::unique_ptr< QBase > libMesh::QBase::build ( std::string_view  name,
const unsigned int  dim,
const Order  order = INVALID_ORDER 
)
staticinherited

Builds a specific quadrature rule based on the name string.

This enables selection of the quadrature rule at run-time. The input parameter name must be mappable through the Utility::string_to_enum<>() function.

This function allocates memory, therefore a std::unique_ptr<QBase> is returned so that the user does not accidentally leak it.

Definition at line 43 of file quadrature_build.C.

References libMesh::QBase::_dim, libMesh::QBase::_order, and libMesh::QBase::type().

Referenced by assemble_poisson(), libMesh::InfFE< Dim, T_radial, T_map >::attach_quadrature_rule(), libMesh::QBase::clone(), main(), libMesh::InfFE< Dim, T_radial, T_map >::reinit(), QuadratureTest::testBuild(), QuadratureTest::testJacobi(), and QuadratureTest::testPolynomials().

46 {
47  return QBase::build (Utility::string_to_enum<QuadratureType> (type),
48  _dim,
49  _order);
50 }
unsigned int _dim
The spatial dimension of the quadrature rule.
Definition: quadrature.h:359
virtual QuadratureType type() const =0
Order _order
The polynomial order which the quadrature rule is capable of integrating exactly. ...
Definition: quadrature.h:365
static std::unique_ptr< QBase > build(std::string_view name, const unsigned int dim, const Order order=INVALID_ORDER)
Builds a specific quadrature rule based on the name string.

◆ build() [2/2]

std::unique_ptr< QBase > libMesh::QBase::build ( const QuadratureType  qt,
const unsigned int  dim,
const Order  order = INVALID_ORDER 
)
staticinherited

Builds a specific quadrature rule based on the QuadratureType.

This enables selection of the quadrature rule at run-time.

This function allocates memory, therefore a std::unique_ptr<QBase> is returned so that the user does not accidentally leak it.

Definition at line 54 of file quadrature_build.C.

References libMesh::QBase::_dim, libMesh::QBase::_order, libMesh::FIRST, libMesh::FORTYTHIRD, libMesh::out, libMesh::QCLOUGH, libMesh::QCONICAL, libMesh::QGAUSS, libMesh::QGAUSS_LOBATTO, libMesh::QGRID, libMesh::QGRUNDMANN_MOLLER, libMesh::QJACOBI_1_0, libMesh::QJACOBI_2_0, libMesh::QMONOMIAL, libMesh::QNODAL, libMesh::QSIMPSON, libMesh::QTRAP, libMesh::THIRD, and libMesh::TWENTYTHIRD.

57 {
58  switch (_qt)
59  {
60 
61  case QCLOUGH:
62  {
63 #ifdef DEBUG
64  if (_order > TWENTYTHIRD)
65  {
66  libMesh::out << "WARNING: Clough quadrature implemented" << std::endl
67  << " up to TWENTYTHIRD order." << std::endl;
68  }
69 #endif
70 
71  return std::make_unique<QClough>(_dim, _order);
72  }
73 
74  case QGAUSS:
75  {
76 
77 #ifdef DEBUG
78  if (_order > FORTYTHIRD)
79  {
80  libMesh::out << "WARNING: Gauss quadrature implemented" << std::endl
81  << " up to FORTYTHIRD order." << std::endl;
82  }
83 #endif
84 
85  return std::make_unique<QGauss>(_dim, _order);
86  }
87 
88  case QJACOBI_1_0:
89  {
90 
91 #ifdef DEBUG
92  if (_order > FORTYTHIRD)
93  {
94  libMesh::out << "WARNING: Jacobi(1,0) quadrature implemented" << std::endl
95  << " up to FORTYTHIRD order." << std::endl;
96  }
97 
98  if (_dim > 1)
99  {
100  libMesh::out << "WARNING: Jacobi(1,0) quadrature implemented" << std::endl
101  << " in 1D only." << std::endl;
102  }
103 #endif
104 
105  return std::make_unique<QJacobi>(_dim, _order, 1, 0);
106  }
107 
108  case QJACOBI_2_0:
109  {
110 
111 #ifdef DEBUG
112  if (_order > FORTYTHIRD)
113  {
114  libMesh::out << "WARNING: Jacobi(2,0) quadrature implemented" << std::endl
115  << " up to FORTYTHIRD order." << std::endl;
116  }
117 
118  if (_dim > 1)
119  {
120  libMesh::out << "WARNING: Jacobi(2,0) quadrature implemented" << std::endl
121  << " in 1D only." << std::endl;
122  }
123 #endif
124 
125  return std::make_unique<QJacobi>(_dim, _order, 2, 0);
126  }
127 
128  case QSIMPSON:
129  {
130 
131 #ifdef DEBUG
132  if (_order > THIRD)
133  {
134  libMesh::out << "WARNING: Simpson rule provides only" << std::endl
135  << " THIRD order!" << std::endl;
136  }
137 #endif
138 
139  return std::make_unique<QSimpson>(_dim);
140  }
141 
142  case QTRAP:
143  {
144 
145 #ifdef DEBUG
146  if (_order > FIRST)
147  {
148  libMesh::out << "WARNING: Trapezoidal rule provides only" << std::endl
149  << " FIRST order!" << std::endl;
150  }
151 #endif
152 
153  return std::make_unique<QTrap>(_dim);
154  }
155 
156  case QGRID:
157  return std::make_unique<QGrid>(_dim, _order);
158 
159  case QGRUNDMANN_MOLLER:
160  return std::make_unique<QGrundmann_Moller>(_dim, _order);
161 
162  case QMONOMIAL:
163  return std::make_unique<QMonomial>(_dim, _order);
164 
165  case QGAUSS_LOBATTO:
166  return std::make_unique<QGaussLobatto>(_dim, _order);
167 
168  case QCONICAL:
169  return std::make_unique<QConical>(_dim, _order);
170 
171  case QNODAL:
172  return std::make_unique<QNodal>(_dim, _order);
173 
174  default:
175  libmesh_error_msg("ERROR: Bad qt=" << _qt);
176  }
177 }
unsigned int _dim
The spatial dimension of the quadrature rule.
Definition: quadrature.h:359
Order _order
The polynomial order which the quadrature rule is capable of integrating exactly. ...
Definition: quadrature.h:365
OStreamProxy out

◆ clone()

std::unique_ptr< QBase > libMesh::QGauss::clone ( ) const
overridevirtual
Returns
A copy of this quadrature rule wrapped in a smart pointer.

Reimplemented from libMesh::QBase.

Definition at line 38 of file quadrature_gauss.C.

39 {
40  return std::make_unique<QGauss>(*this);
41 }

◆ disable_print_counter_info()

void libMesh::ReferenceCounter::disable_print_counter_info ( )
staticinherited

Definition at line 100 of file reference_counter.C.

References libMesh::ReferenceCounter::_enable_print_counter.

101 {
102  _enable_print_counter = false;
103  return;
104 }
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called...

◆ dunavant_rule()

void libMesh::QGauss::dunavant_rule ( const Real  rule_data[][4],
const unsigned int  n_pts 
)
private

The Dunavant rules are for triangles.

This function takes permutation points and weights in a specific format as input and fills the _points and _weights vectors.

Definition at line 270 of file quadrature_gauss.C.

References libMesh::QBase::_points, and libMesh::QBase::_weights.

Referenced by init_2D().

272 {
273  // The input data array has 4 columns. The first 3 are the permutation points.
274  // The last column is the weights for a given set of permutation points. A zero
275  // in two of the first 3 columns implies the point is a 1-permutation (centroid).
276  // A zero in one of the first 3 columns implies the point is a 3-permutation.
277  // Otherwise each point is assumed to be a 6-permutation.
278 
279  // Always insert into the points & weights vector relative to the offset
280  unsigned int offset=0;
281 
282 
283  for (unsigned int p=0; p<n_pts; ++p)
284  {
285 
286  // There must always be a non-zero entry to start the row
287  libmesh_assert_not_equal_to ( rule_data[p][0], static_cast<Real>(0.0) );
288 
289  // A zero weight may imply you did not set up the raw data correctly
290  libmesh_assert_not_equal_to ( rule_data[p][3], static_cast<Real>(0.0) );
291 
292  // What kind of point is this?
293  // One non-zero entry in first 3 cols ? 1-perm (centroid) point = 1
294  // Two non-zero entries in first 3 cols ? 3-perm point = 3
295  // Three non-zero entries ? 6-perm point = 6
296  unsigned int pointtype=1;
297 
298  if (rule_data[p][1] != static_cast<Real>(0.0))
299  {
300  if (rule_data[p][2] != static_cast<Real>(0.0))
301  pointtype = 6;
302  else
303  pointtype = 3;
304  }
305 
306  switch (pointtype)
307  {
308  case 1:
309  {
310  // Be sure we have enough space to insert this point
311  libmesh_assert_less (offset + 0, _points.size());
312 
313  // The point has only a single permutation (the centroid!)
314  _points[offset + 0] = Point(rule_data[p][0], rule_data[p][0]);
315 
316  // The weight is always the last entry in the row.
317  _weights[offset + 0] = rule_data[p][3];
318 
319  offset += 1;
320  break;
321  }
322 
323  case 3:
324  {
325  // Be sure we have enough space to insert these points
326  libmesh_assert_less (offset + 2, _points.size());
327 
328  // Here it's understood the second entry is to be used twice, and
329  // thus there are three possible permutations.
330  _points[offset + 0] = Point(rule_data[p][0], rule_data[p][1]);
331  _points[offset + 1] = Point(rule_data[p][1], rule_data[p][0]);
332  _points[offset + 2] = Point(rule_data[p][1], rule_data[p][1]);
333 
334  for (unsigned int j=0; j<3; ++j)
335  _weights[offset + j] = rule_data[p][3];
336 
337  offset += 3;
338  break;
339  }
340 
341  case 6:
342  {
343  // Be sure we have enough space to insert these points
344  libmesh_assert_less (offset + 5, _points.size());
345 
346  // Three individual entries with six permutations.
347  _points[offset + 0] = Point(rule_data[p][0], rule_data[p][1]);
348  _points[offset + 1] = Point(rule_data[p][0], rule_data[p][2]);
349  _points[offset + 2] = Point(rule_data[p][1], rule_data[p][0]);
350  _points[offset + 3] = Point(rule_data[p][1], rule_data[p][2]);
351  _points[offset + 4] = Point(rule_data[p][2], rule_data[p][0]);
352  _points[offset + 5] = Point(rule_data[p][2], rule_data[p][1]);
353 
354  for (unsigned int j=0; j<6; ++j)
355  _weights[offset + j] = rule_data[p][3];
356 
357  offset += 6;
358  break;
359  }
360 
361  default:
362  libmesh_error_msg("Don't know what to do with this many permutation points!");
363  }
364  }
365 }
std::vector< Point > _points
The locations of the quadrature points in reference element space.
Definition: quadrature.h:383
std::vector< Real > _weights
The quadrature weights.
Definition: quadrature.h:389

◆ dunavant_rule2()

void libMesh::QGauss::dunavant_rule2 ( const Real wts,
const Real a,
const Real b,
const unsigned int permutation_ids,
const unsigned int  n_wts 
)
private

Definition at line 195 of file quadrature_gauss.C.

References libMesh::QBase::_points, libMesh::QBase::_weights, and libMesh::Real.

Referenced by init_2D().

200 {
201  // Figure out how many total points by summing up the entries
202  // in the permutation_ids array, and resize the _points and _weights
203  // vectors appropriately.
204  unsigned int total_pts = 0;
205  for (unsigned int p=0; p<n_wts; ++p)
206  total_pts += permutation_ids[p];
207 
208  // Resize point and weight vectors appropriately.
209  _points.resize(total_pts);
210  _weights.resize(total_pts);
211 
212  // Always insert into the points & weights vector relative to the offset
213  unsigned int offset=0;
214 
215  for (unsigned int p=0; p<n_wts; ++p)
216  {
217  switch (permutation_ids[p])
218  {
219  case 1:
220  {
221  // The point has only a single permutation (the centroid!)
222  // So we don't even need to look in the a or b arrays.
223  _points [offset + 0] = Point(Real(1)/3, Real(1)/3);
224  _weights[offset + 0] = wts[p];
225 
226  offset += 1;
227  break;
228  }
229 
230 
231  case 3:
232  {
233  // For this type of rule, don't need to look in the b array.
234  _points[offset + 0] = Point(a[p], a[p]); // (a,a)
235  _points[offset + 1] = Point(a[p], 1-2*a[p]); // (a,1-2a)
236  _points[offset + 2] = Point(1-2*a[p], a[p]); // (1-2a,a)
237 
238  for (unsigned int j=0; j<3; ++j)
239  _weights[offset + j] = wts[p];
240 
241  offset += 3;
242  break;
243  }
244 
245  case 6:
246  {
247  // This type of point uses all 3 arrays...
248  _points[offset + 0] = Point(a[p], b[p]);
249  _points[offset + 1] = Point(b[p], a[p]);
250  _points[offset + 2] = Point(a[p], 1-a[p]-b[p]);
251  _points[offset + 3] = Point(1-a[p]-b[p], a[p]);
252  _points[offset + 4] = Point(b[p], 1-a[p]-b[p]);
253  _points[offset + 5] = Point(1-a[p]-b[p], b[p]);
254 
255  for (unsigned int j=0; j<6; ++j)
256  _weights[offset + j] = wts[p];
257 
258  offset += 6;
259  break;
260  }
261 
262  default:
263  libmesh_error_msg("Unknown permutation id: " << permutation_ids[p] << "!");
264  }
265  }
266 
267 }
std::vector< Point > _points
The locations of the quadrature points in reference element space.
Definition: quadrature.h:383
std::vector< Real > _weights
The quadrature weights.
Definition: quadrature.h:389
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ enable_print_counter_info()

void libMesh::ReferenceCounter::enable_print_counter_info ( )
staticinherited

Methods to enable/disable the reference counter output from print_info()

Definition at line 94 of file reference_counter.C.

References libMesh::ReferenceCounter::_enable_print_counter.

95 {
96  _enable_print_counter = true;
97  return;
98 }
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called...

◆ get_dim()

unsigned int libMesh::QBase::get_dim ( ) const
inlineinherited
Returns
The spatial dimension of the quadrature rule.

Definition at line 142 of file quadrature.h.

References libMesh::QBase::_dim.

Referenced by libMesh::InfFE< Dim, T_radial, T_map >::attach_quadrature_rule(), libMesh::QBase::clone(), libMesh::QConical::conical_product_pyramid(), libMesh::QConical::conical_product_tet(), libMesh::QConical::conical_product_tri(), and QuadratureTest::testPolynomial().

142 { return _dim; }
unsigned int _dim
The spatial dimension of the quadrature rule.
Definition: quadrature.h:359

◆ get_elem_type()

ElemType libMesh::QBase::get_elem_type ( ) const
inlineinherited
Returns
The element type we're currently using.

Definition at line 113 of file quadrature.h.

References libMesh::QBase::_type.

113 { return _type; }
ElemType _type
The type of element for which the current values have been computed.
Definition: quadrature.h:371

◆ get_info()

std::string libMesh::ReferenceCounter::get_info ( )
staticinherited

Gets a string containing the reference information.

Definition at line 47 of file reference_counter.C.

References libMesh::ReferenceCounter::_counts, and libMesh::Quality::name().

Referenced by libMesh::ReferenceCounter::print_info().

48 {
49 #if defined(LIBMESH_ENABLE_REFERENCE_COUNTING) && defined(DEBUG)
50 
51  std::ostringstream oss;
52 
53  oss << '\n'
54  << " ---------------------------------------------------------------------------- \n"
55  << "| Reference count information |\n"
56  << " ---------------------------------------------------------------------------- \n";
57 
58  for (const auto & [name, cd] : _counts)
59  oss << "| " << name << " reference count information:\n"
60  << "| Creations: " << cd.first << '\n'
61  << "| Destructions: " << cd.second << '\n';
62 
63  oss << " ---------------------------------------------------------------------------- \n";
64 
65  return oss.str();
66 
67 #else
68 
69  return "";
70 
71 #endif
72 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
static Counts _counts
Actually holds the data.

◆ get_order()

Order libMesh::QBase::get_order ( ) const
inlineinherited
Returns
The current "total" order of the quadrature rule which can vary element by element, depending on the Elem::p_level(), which gets passed to us during init().

Each additional power of p increases the quadrature order required to integrate the mass matrix by 2, hence the formula below.

Definition at line 218 of file quadrature.h.

References libMesh::QBase::_order, and libMesh::QBase::_p_level.

Referenced by libMesh::InfFE< Dim, T_radial, T_map >::attach_quadrature_rule(), libMesh::QBase::clone(), libMesh::QConical::conical_product_pyramid(), libMesh::QConical::conical_product_tet(), libMesh::QConical::conical_product_tri(), libMesh::QGaussLobatto::init_1D(), init_1D(), libMesh::QConical::init_1D(), libMesh::QJacobi::init_1D(), libMesh::QGrundmann_Moller::init_1D(), init_2D(), libMesh::QMonomial::init_2D(), libMesh::QGrundmann_Moller::init_2D(), init_3D(), libMesh::QMonomial::init_3D(), and libMesh::QGrundmann_Moller::init_3D().

218 { return static_cast<Order>(_order + 2 * _p_level); }
Order
defines an enum for polynomial orders.
Definition: enum_order.h:40
unsigned int _p_level
The p-level of the element for which the current values have been computed.
Definition: quadrature.h:377
Order _order
The polynomial order which the quadrature rule is capable of integrating exactly. ...
Definition: quadrature.h:365

◆ get_p_level()

unsigned int libMesh::QBase::get_p_level ( ) const
inlineinherited
Returns
The p-refinement level we're currently using.

Definition at line 118 of file quadrature.h.

References libMesh::QBase::_p_level.

118 { return _p_level; }
unsigned int _p_level
The p-level of the element for which the current values have been computed.
Definition: quadrature.h:377

◆ get_points() [1/2]

const std::vector<Point>& libMesh::QBase::get_points ( ) const
inlineinherited

◆ get_points() [2/2]

std::vector<Point>& libMesh::QBase::get_points ( )
inlineinherited
Returns
A std::vector containing the quadrature point locations in reference element space as a writable reference.

Definition at line 154 of file quadrature.h.

References libMesh::QBase::_points.

154 { return _points; }
std::vector< Point > _points
The locations of the quadrature points in reference element space.
Definition: quadrature.h:383

◆ get_weights() [1/2]

const std::vector<Real>& libMesh::QBase::get_weights ( ) const
inlineinherited

◆ get_weights() [2/2]

std::vector<Real>& libMesh::QBase::get_weights ( )
inlineinherited
Returns
A writable references to a std::vector containing the quadrature weights.

Definition at line 166 of file quadrature.h.

References libMesh::QBase::_weights.

166 { return _weights; }
std::vector< Real > _weights
The quadrature weights.
Definition: quadrature.h:389

◆ increment_constructor_count()

void libMesh::ReferenceCounter::increment_constructor_count ( const std::string &  name)
inlineprotectednoexceptinherited

Increments the construction counter.

Should be called in the constructor of any derived class that will be reference counted.

Definition at line 183 of file reference_counter.h.

References libMesh::err, libMesh::BasicOStreamProxy< charT, traits >::get(), libMesh::Quality::name(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< RBParametrized >::ReferenceCountedObject().

184 {
185  libmesh_try
186  {
187  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
188  std::pair<unsigned int, unsigned int> & p = _counts[name];
189  p.first++;
190  }
191  libmesh_catch (...)
192  {
193  auto stream = libMesh::err.get();
194  stream->exceptions(stream->goodbit); // stream must not throw
195  libMesh::err << "Encountered unrecoverable error while calling "
196  << "ReferenceCounter::increment_constructor_count() "
197  << "for a(n) " << name << " object." << std::endl;
198  std::terminate();
199  }
200 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
OStreamProxy err
static Counts _counts
Actually holds the data.
streamT * get()
Rather than implement every ostream/ios/ios_base function, we&#39;ll be lazy and make esoteric uses go th...
spin_mutex spin_mtx
A convenient spin mutex object which can be used for obtaining locks.
Definition: threads.C:30

◆ increment_destructor_count()

void libMesh::ReferenceCounter::increment_destructor_count ( const std::string &  name)
inlineprotectednoexceptinherited

Increments the destruction counter.

Should be called in the destructor of any derived class that will be reference counted.

Definition at line 207 of file reference_counter.h.

References libMesh::err, libMesh::BasicOStreamProxy< charT, traits >::get(), libMesh::Quality::name(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< RBParametrized >::~ReferenceCountedObject().

208 {
209  libmesh_try
210  {
211  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
212  std::pair<unsigned int, unsigned int> & p = _counts[name];
213  p.second++;
214  }
215  libmesh_catch (...)
216  {
217  auto stream = libMesh::err.get();
218  stream->exceptions(stream->goodbit); // stream must not throw
219  libMesh::err << "Encountered unrecoverable error while calling "
220  << "ReferenceCounter::increment_destructor_count() "
221  << "for a(n) " << name << " object." << std::endl;
222  std::terminate();
223  }
224 }
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42
OStreamProxy err
static Counts _counts
Actually holds the data.
streamT * get()
Rather than implement every ostream/ios/ios_base function, we&#39;ll be lazy and make esoteric uses go th...
spin_mutex spin_mtx
A convenient spin mutex object which can be used for obtaining locks.
Definition: threads.C:30

◆ init() [1/2]

void libMesh::QBase::init ( const ElemType  type = INVALID_ELEM,
unsigned int  p_level = 0 
)
virtualinherited

Initializes the data structures for a quadrature rule for an element of type type.

Definition at line 64 of file quadrature.C.

References libMesh::QBase::_dim, libMesh::QBase::_p_level, libMesh::QBase::_type, libMesh::QBase::init_0D(), libMesh::QBase::init_1D(), libMesh::QBase::init_2D(), and libMesh::QBase::init_3D().

Referenced by libMesh::QBase::init(), libMesh::QClough::init_1D(), libMesh::QNodal::init_1D(), libMesh::QMonomial::init_1D(), libMesh::QClough::init_2D(), libMesh::QGaussLobatto::init_2D(), libMesh::QGrid::init_2D(), init_2D(), libMesh::QSimpson::init_2D(), libMesh::QTrap::init_2D(), libMesh::QNodal::init_2D(), libMesh::QMonomial::init_2D(), libMesh::QGaussLobatto::init_3D(), libMesh::QGrid::init_3D(), init_3D(), libMesh::QSimpson::init_3D(), libMesh::QTrap::init_3D(), libMesh::QNodal::init_3D(), libMesh::QMonomial::init_3D(), QGauss(), libMesh::QGaussLobatto::QGaussLobatto(), libMesh::QJacobi::QJacobi(), libMesh::QNodal::QNodal(), libMesh::QSimpson::QSimpson(), libMesh::QTrap::QTrap(), and libMesh::FE< Dim, LAGRANGE_VEC >::reinit_default_dual_shape_coeffs().

66 {
67  // check to see if we have already
68  // done the work for this quadrature rule
69  if (t == _type && p == _p_level)
70  return;
71  else
72  {
73  _type = t;
74  _p_level = p;
75  }
76 
77 
78 
79  switch(_dim)
80  {
81  case 0:
82  this->init_0D();
83 
84  return;
85 
86  case 1:
87  this->init_1D();
88 
89  return;
90 
91  case 2:
92  this->init_2D();
93 
94  return;
95 
96  case 3:
97  this->init_3D();
98 
99  return;
100 
101  default:
102  libmesh_error_msg("Invalid dimension _dim = " << _dim);
103  }
104 }
virtual void init_3D(const ElemType type=INVALID_ELEM, unsigned int p_level=0)
Initializes the 3D quadrature rule by filling the points and weights vectors with the appropriate val...
Definition: quadrature.C:135
virtual void init_2D(const ElemType type=INVALID_ELEM, unsigned int p_level=0)
Initializes the 2D quadrature rule by filling the points and weights vectors with the appropriate val...
Definition: quadrature.C:128
ElemType _type
The type of element for which the current values have been computed.
Definition: quadrature.h:371
unsigned int _dim
The spatial dimension of the quadrature rule.
Definition: quadrature.h:359
unsigned int _p_level
The p-level of the element for which the current values have been computed.
Definition: quadrature.h:377
virtual void init_1D(const ElemType type=INVALID_ELEM, unsigned int p_level=0)=0
Initializes the 1D quadrature rule by filling the points and weights vectors with the appropriate val...
virtual void init_0D(const ElemType type=INVALID_ELEM, unsigned int p_level=0)
Initializes the 0D quadrature rule by filling the points and weights vectors with the appropriate val...
Definition: quadrature.C:118

◆ init() [2/2]

void libMesh::QBase::init ( const Elem elem,
const std::vector< Real > &  vertex_distance_func,
unsigned int  p_level = 0 
)
virtualinherited

Initializes the data structures for an element potentially "cut" by a signed distance function.

The array vertex_distance_func contains vertex values of the signed distance function. If the signed distance function changes sign on the vertices, then the element is considered to be cut.) This interface can be extended by derived classes in order to subdivide the element and construct a composite quadrature rule.

Definition at line 108 of file quadrature.C.

References libMesh::QBase::init(), and libMesh::Elem::type().

111 {
112  // dispatch generic implementation
113  this->init(elem.type(), p_level);
114 }
virtual void init(const ElemType type=INVALID_ELEM, unsigned int p_level=0)
Initializes the data structures for a quadrature rule for an element of type type.
Definition: quadrature.C:64

◆ init_0D()

void libMesh::QBase::init_0D ( const ElemType  type = INVALID_ELEM,
unsigned int  p_level = 0 
)
protectedvirtualinherited

Initializes the 0D quadrature rule by filling the points and weights vectors with the appropriate values.

Generally this is just one point with weight 1.

Note
The arguments should no longer be used for anything in derived classes, they are only maintained for backwards compatibility and will eventually be removed.

Definition at line 118 of file quadrature.C.

References libMesh::QBase::_points, and libMesh::QBase::_weights.

Referenced by libMesh::QBase::init().

119 {
120  _points.resize(1);
121  _weights.resize(1);
122  _points[0] = Point(0.);
123  _weights[0] = 1.0;
124 }
std::vector< Point > _points
The locations of the quadrature points in reference element space.
Definition: quadrature.h:383
std::vector< Real > _weights
The quadrature weights.
Definition: quadrature.h:389

◆ init_1D()

void libMesh::QGauss::init_1D ( const ElemType  type,
unsigned  p_level 
)
overrideprivatevirtual

Initializes the 1D quadrature rule by filling the points and weights vectors with the appropriate values.

The order of the rule will be defined by the implementing class. It is assumed that derived quadrature rules will at least define the init_1D function, therefore it is pure virtual.

Note
The arguments should no longer be used for anything in derived classes, they are only maintained for backwards compatibility and will eventually be removed.

Implements libMesh::QBase.

Definition at line 30 of file quadrature_gauss_1D.C.

References libMesh::QBase::_order, libMesh::QBase::_points, libMesh::QBase::_weights, libMesh::CONSTANT, libMesh::EIGHTH, libMesh::EIGHTTEENTH, libMesh::ELEVENTH, libMesh::FIFTEENTH, libMesh::FIFTH, libMesh::FIRST, libMesh::FORTIETH, libMesh::FORTYFIRST, libMesh::FORTYSECOND, libMesh::FORTYTHIRD, libMesh::FOURTEENTH, libMesh::FOURTH, libMesh::QBase::get_order(), libMesh::NINETEENTH, libMesh::NINTH, libMesh::Real, libMesh::SECOND, libMesh::SEVENTEENTH, libMesh::SEVENTH, libMesh::SIXTEENTH, libMesh::SIXTH, libMesh::TENTH, libMesh::THIRD, libMesh::THIRTEENTH, libMesh::THIRTIETH, libMesh::THIRTYEIGHTH, libMesh::THIRTYFIFTH, libMesh::THIRTYFIRST, libMesh::THIRTYFOURTH, libMesh::THIRTYNINTH, libMesh::THIRTYSECOND, libMesh::THIRTYSEVENTH, libMesh::THIRTYSIXTH, libMesh::THIRTYTHIRD, libMesh::TWELFTH, libMesh::TWENTIETH, libMesh::TWENTYEIGHTH, libMesh::TWENTYFIFTH, libMesh::TWENTYFIRST, libMesh::TWENTYFOURTH, libMesh::TWENTYNINTH, libMesh::TWENTYSECOND, libMesh::TWENTYSEVENTH, libMesh::TWENTYSIXTH, and libMesh::TWENTYTHIRD.

31 {
32  //----------------------------------------------------------------------
33  // 1D quadrature rules
34  switch(get_order())
35  {
36  case CONSTANT:
37  case FIRST:
38  {
39  _points.resize (1);
40  _weights.resize(1);
41 
42  _points[0](0) = 0.;
43 
44  _weights[0] = 2.;
45 
46  return;
47  }
48  case SECOND:
49  case THIRD:
50  {
51  _points.resize (2);
52  _weights.resize(2);
53 
54  _points[0](0) = Real(-5.7735026918962576450914878050196e-01L); // -sqrt(3)/3
55  _points[1] = -_points[0];
56 
57  _weights[0] = 1.;
58  _weights[1] = _weights[0];
59 
60  return;
61  }
62  case FOURTH:
63  case FIFTH:
64  {
65  _points.resize (3);
66  _weights.resize(3);
67 
68  _points[ 0](0) = Real(-7.7459666924148337703585307995648e-01L);
69  _points[ 1](0) = 0.;
70  _points[ 2] = -_points[0];
71 
72  _weights[ 0] = Real(5.5555555555555555555555555555556e-01L);
73  _weights[ 1] = Real(8.8888888888888888888888888888889e-01L);
74  _weights[ 2] = _weights[0];
75 
76  return;
77  }
78  case SIXTH:
79  case SEVENTH:
80  {
81  _points.resize (4);
82  _weights.resize(4);
83 
84  _points[ 0](0) = Real(-8.6113631159405257522394648889281e-01L);
85  _points[ 1](0) = Real(-3.3998104358485626480266575910324e-01L);
86  _points[ 2] = -_points[1];
87  _points[ 3] = -_points[0];
88 
89  _weights[ 0] = Real(3.4785484513745385737306394922200e-01L);
90  _weights[ 1] = Real(6.5214515486254614262693605077800e-01L);
91  _weights[ 2] = _weights[1];
92  _weights[ 3] = _weights[0];
93 
94  return;
95  }
96  case EIGHTH:
97  case NINTH:
98  {
99  _points.resize (5);
100  _weights.resize(5);
101 
102  _points[ 0](0) = Real(-9.0617984593866399279762687829939e-01L);
103  _points[ 1](0) = Real(-5.3846931010568309103631442070021e-01L);
104  _points[ 2](0) = 0.;
105  _points[ 3] = -_points[1];
106  _points[ 4] = -_points[0];
107 
108  _weights[ 0] = Real(2.3692688505618908751426404071992e-01L);
109  _weights[ 1] = Real(4.7862867049936646804129151483564e-01L);
110  _weights[ 2] = Real(5.6888888888888888888888888888889e-01L);
111  _weights[ 3] = _weights[1];
112  _weights[ 4] = _weights[0];
113 
114  return;
115  }
116  case TENTH:
117  case ELEVENTH:
118  {
119  _points.resize (6);
120  _weights.resize(6);
121 
122  _points[ 0](0) = Real(-9.3246951420315202781230155449399e-01L);
123  _points[ 1](0) = Real(-6.6120938646626451366139959501991e-01L);
124  _points[ 2](0) = Real(-2.3861918608319690863050172168071e-01L);
125  _points[ 3] = -_points[2];
126  _points[ 4] = -_points[1];
127  _points[ 5] = -_points[0];
128 
129  _weights[ 0] = Real(1.7132449237917034504029614217273e-01L);
130  _weights[ 1] = Real(3.6076157304813860756983351383772e-01L);
131  _weights[ 2] = Real(4.6791393457269104738987034398955e-01L);
132  _weights[ 3] = _weights[2];
133  _weights[ 4] = _weights[1];
134  _weights[ 5] = _weights[0];
135 
136  return;
137  }
138  case TWELFTH:
139  case THIRTEENTH:
140  {
141  _points.resize (7);
142  _weights.resize(7);
143 
144  _points[ 0](0) = Real(-9.4910791234275852452618968404785e-01L);
145  _points[ 1](0) = Real(-7.4153118559939443986386477328079e-01L);
146  _points[ 2](0) = Real(-4.0584515137739716690660641207696e-01L);
147  _points[ 3](0) = 0.;
148  _points[ 4] = -_points[2];
149  _points[ 5] = -_points[1];
150  _points[ 6] = -_points[0];
151 
152  _weights[ 0] = Real(1.2948496616886969327061143267908e-01L);
153  _weights[ 1] = Real(2.7970539148927666790146777142378e-01L);
154  _weights[ 2] = Real(3.8183005050511894495036977548898e-01L);
155  _weights[ 3] = Real(4.1795918367346938775510204081633e-01L);
156  _weights[ 4] = _weights[2];
157  _weights[ 5] = _weights[1];
158  _weights[ 6] = _weights[0];
159 
160  return;
161  }
162  case FOURTEENTH:
163  case FIFTEENTH:
164  {
165  _points.resize (8);
166  _weights.resize(8);
167 
168  _points[ 0](0) = Real(-9.6028985649753623168356086856947e-01L);
169  _points[ 1](0) = Real(-7.9666647741362673959155393647583e-01L);
170  _points[ 2](0) = Real(-5.2553240991632898581773904918925e-01L);
171  _points[ 3](0) = Real(-1.8343464249564980493947614236018e-01L);
172  _points[ 4] = -_points[3];
173  _points[ 5] = -_points[2];
174  _points[ 6] = -_points[1];
175  _points[ 7] = -_points[0];
176 
177  _weights[ 0] = Real(1.0122853629037625915253135430996e-01L);
178  _weights[ 1] = Real(2.2238103445337447054435599442624e-01L);
179  _weights[ 2] = Real(3.1370664587788728733796220198660e-01L);
180  _weights[ 3] = Real(3.6268378337836198296515044927720e-01L);
181  _weights[ 4] = _weights[3];
182  _weights[ 5] = _weights[2];
183  _weights[ 6] = _weights[1];
184  _weights[ 7] = _weights[0];
185 
186  return;
187  }
188  case SIXTEENTH:
189  case SEVENTEENTH:
190  {
191  _points.resize (9);
192  _weights.resize(9);
193 
194  _points[ 0](0) = Real(-9.6816023950762608983557620290367e-01L);
195  _points[ 1](0) = Real(-8.3603110732663579429942978806973e-01L);
196  _points[ 2](0) = Real(-6.1337143270059039730870203934147e-01L);
197  _points[ 3](0) = Real(-3.2425342340380892903853801464334e-01L);
198  _points[ 4](0) = 0.;
199  _points[ 5] = -_points[3];
200  _points[ 6] = -_points[2];
201  _points[ 7] = -_points[1];
202  _points[ 8] = -_points[0];
203 
204  _weights[ 0] = Real(8.1274388361574411971892158110524e-02L);
205  _weights[ 1] = Real(1.8064816069485740405847203124291e-01L);
206  _weights[ 2] = Real(2.6061069640293546231874286941863e-01L);
207  _weights[ 3] = Real(3.1234707704000284006863040658444e-01L);
208  _weights[ 4] = Real(3.3023935500125976316452506928697e-01L);
209  _weights[ 5] = _weights[3];
210  _weights[ 6] = _weights[2];
211  _weights[ 7] = _weights[1];
212  _weights[ 8] = _weights[0];
213 
214  return;
215  }
216  case EIGHTTEENTH:
217  case NINETEENTH:
218  {
219  _points.resize (10);
220  _weights.resize(10);
221 
222  _points[ 0](0) = Real(-9.7390652851717172007796401208445e-01L);
223  _points[ 1](0) = Real(-8.6506336668898451073209668842349e-01L);
224  _points[ 2](0) = Real(-6.7940956829902440623432736511487e-01L);
225  _points[ 3](0) = Real(-4.3339539412924719079926594316578e-01L);
226  _points[ 4](0) = Real(-1.4887433898163121088482600112972e-01L);
227  _points[ 5] = -_points[4];
228  _points[ 6] = -_points[3];
229  _points[ 7] = -_points[2];
230  _points[ 8] = -_points[1];
231  _points[ 9] = -_points[0];
232 
233  _weights[ 0] = Real(6.6671344308688137593568809893332e-02L);
234  _weights[ 1] = Real(1.4945134915058059314577633965770e-01L);
235  _weights[ 2] = Real(2.1908636251598204399553493422816e-01L);
236  _weights[ 3] = Real(2.6926671930999635509122692156947e-01L);
237  _weights[ 4] = Real(2.9552422471475287017389299465134e-01L);
238  _weights[ 5] = _weights[4];
239  _weights[ 6] = _weights[3];
240  _weights[ 7] = _weights[2];
241  _weights[ 8] = _weights[1];
242  _weights[ 9] = _weights[0];
243 
244  return;
245  }
246 
247  case TWENTIETH:
248  case TWENTYFIRST:
249  {
250  _points.resize (11);
251  _weights.resize(11);
252 
253  _points[ 0](0) = Real(-9.7822865814605699280393800112286e-01L);
254  _points[ 1](0) = Real(-8.8706259976809529907515776930393e-01L);
255  _points[ 2](0) = Real(-7.3015200557404932409341625203115e-01L);
256  _points[ 3](0) = Real(-5.1909612920681181592572566945861e-01L);
257  _points[ 4](0) = Real(-2.6954315595234497233153198540086e-01L);
258  _points[ 5](0) = 0.;
259  _points[ 6] = -_points[4];
260  _points[ 7] = -_points[3];
261  _points[ 8] = -_points[2];
262  _points[ 9] = -_points[1];
263  _points[10] = -_points[0];
264 
265  _weights[ 0] = Real(5.5668567116173666482753720442549e-02L);
266  _weights[ 1] = Real(1.2558036946490462463469429922394e-01L);
267  _weights[ 2] = Real(1.8629021092773425142609764143166e-01L);
268  _weights[ 3] = Real(2.3319376459199047991852370484318e-01L);
269  _weights[ 4] = Real(2.6280454451024666218068886989051e-01L);
270  _weights[ 5] = Real(2.7292508677790063071448352833634e-01L);
271  _weights[ 6] = _weights[4];
272  _weights[ 7] = _weights[3];
273  _weights[ 8] = _weights[2];
274  _weights[ 9] = _weights[1];
275  _weights[10] = _weights[0];
276 
277  return;
278  }
279 
280  case TWENTYSECOND:
281  case TWENTYTHIRD:
282  {
283  _points.resize (12);
284  _weights.resize(12);
285 
286  _points[ 0](0) = Real(-9.8156063424671925069054909014928e-01L);
287  _points[ 1](0) = Real(-9.0411725637047485667846586611910e-01L);
288  _points[ 2](0) = Real(-7.6990267419430468703689383321282e-01L);
289  _points[ 3](0) = Real(-5.8731795428661744729670241894053e-01L);
290  _points[ 4](0) = Real(-3.6783149899818019375269153664372e-01L);
291  _points[ 5](0) = Real(-1.2523340851146891547244136946385e-01L);
292  _points[ 6] = -_points[5];
293  _points[ 7] = -_points[4];
294  _points[ 8] = -_points[3];
295  _points[ 9] = -_points[2];
296  _points[10] = -_points[1];
297  _points[11] = -_points[0];
298 
299  _weights[ 0] = Real(4.7175336386511827194615961485017e-02L);
300  _weights[ 1] = Real(1.0693932599531843096025471819400e-01L);
301  _weights[ 2] = Real(1.6007832854334622633465252954336e-01L);
302  _weights[ 3] = Real(2.0316742672306592174906445580980e-01L);
303  _weights[ 4] = Real(2.3349253653835480876084989892483e-01L);
304  _weights[ 5] = Real(2.4914704581340278500056243604295e-01L);
305  _weights[ 6] = _weights[5];
306  _weights[ 7] = _weights[4];
307  _weights[ 8] = _weights[3];
308  _weights[ 9] = _weights[2];
309  _weights[10] = _weights[1];
310  _weights[11] = _weights[0];
311 
312  return;
313  }
314 
315  case TWENTYFOURTH:
316  case TWENTYFIFTH:
317  {
318  _points.resize (13);
319  _weights.resize(13);
320 
321  _points[ 0](0) = Real(-9.8418305471858814947282944880711e-01L);
322  _points[ 1](0) = Real(-9.1759839922297796520654783650072e-01L);
323  _points[ 2](0) = Real(-8.0157809073330991279420648958286e-01L);
324  _points[ 3](0) = Real(-6.4234933944034022064398460699552e-01L);
325  _points[ 4](0) = Real(-4.4849275103644685287791285212764e-01L);
326  _points[ 5](0) = Real(-2.3045831595513479406552812109799e-01L);
327  _points[ 6](0) = 0.;
328  _points[ 7] = -_points[5];
329  _points[ 8] = -_points[4];
330  _points[ 9] = -_points[3];
331  _points[10] = -_points[2];
332  _points[11] = -_points[1];
333  _points[12] = -_points[0];
334 
335  _weights[ 0] = Real(4.0484004765315879520021592200986e-02L);
336  _weights[ 1] = Real(9.2121499837728447914421775953797e-02L);
337  _weights[ 2] = Real(1.3887351021978723846360177686887e-01L);
338  _weights[ 3] = Real(1.7814598076194573828004669199610e-01L);
339  _weights[ 4] = Real(2.0781604753688850231252321930605e-01L);
340  _weights[ 5] = Real(2.2628318026289723841209018603978e-01L);
341  _weights[ 6] = Real(2.3255155323087391019458951526884e-01L);
342  _weights[ 7] = _weights[5];
343  _weights[ 8] = _weights[4];
344  _weights[ 9] = _weights[3];
345  _weights[10] = _weights[2];
346  _weights[11] = _weights[1];
347  _weights[12] = _weights[0];
348 
349  return;
350  }
351 
352  case TWENTYSIXTH:
353  case TWENTYSEVENTH:
354  {
355  _points.resize (14);
356  _weights.resize(14);
357 
358  _points[ 0](0) = Real(-9.8628380869681233884159726670405e-01L);
359  _points[ 1](0) = Real(-9.2843488366357351733639113937787e-01L);
360  _points[ 2](0) = Real(-8.2720131506976499318979474265039e-01L);
361  _points[ 3](0) = Real(-6.8729290481168547014801980301933e-01L);
362  _points[ 4](0) = Real(-5.1524863635815409196529071855119e-01L);
363  _points[ 5](0) = Real(-3.1911236892788976043567182416848e-01L);
364  _points[ 6](0) = Real(-1.0805494870734366206624465021983e-01L);
365  _points[ 7] = -_points[6];
366  _points[ 8] = -_points[5];
367  _points[ 9] = -_points[4];
368  _points[10] = -_points[3];
369  _points[11] = -_points[2];
370  _points[12] = -_points[1];
371  _points[13] = -_points[0];
372 
373  _weights[ 0] = Real(3.5119460331751863031832876138192e-02L);
374  _weights[ 1] = Real(8.0158087159760209805633277062854e-02L);
375  _weights[ 2] = Real(1.2151857068790318468941480907248e-01L);
376  _weights[ 3] = Real(1.5720316715819353456960193862384e-01L);
377  _weights[ 4] = Real(1.8553839747793781374171659012516e-01L);
378  _weights[ 5] = Real(2.0519846372129560396592406566122e-01L);
379  _weights[ 6] = Real(2.1526385346315779019587644331626e-01L);
380  _weights[ 7] = _weights[6];
381  _weights[ 8] = _weights[5];
382  _weights[ 9] = _weights[4];
383  _weights[10] = _weights[3];
384  _weights[11] = _weights[2];
385  _weights[12] = _weights[1];
386  _weights[13] = _weights[0];
387 
388  return;
389  }
390 
391  case TWENTYEIGHTH:
392  case TWENTYNINTH:
393  {
394  _points.resize (15);
395  _weights.resize(15);
396 
397  _points[ 0](0) = Real(-9.8799251802048542848956571858661e-01L);
398  _points[ 1](0) = Real(-9.3727339240070590430775894771021e-01L);
399  _points[ 2](0) = Real(-8.4820658341042721620064832077422e-01L);
400  _points[ 3](0) = Real(-7.2441773136017004741618605461394e-01L);
401  _points[ 4](0) = Real(-5.7097217260853884753722673725391e-01L);
402  _points[ 5](0) = Real(-3.9415134707756336989720737098105e-01L);
403  _points[ 6](0) = Real(-2.0119409399743452230062830339460e-01L);
404  _points[ 7](0) = 0.;
405  _points[ 8] = -_points[6];
406  _points[ 9] = -_points[5];
407  _points[10] = -_points[4];
408  _points[11] = -_points[3];
409  _points[12] = -_points[2];
410  _points[13] = -_points[1];
411  _points[14] = -_points[0];
412 
413  _weights[ 0] = Real(3.0753241996117268354628393577204e-02L);
414  _weights[ 1] = Real(7.0366047488108124709267416450667e-02L);
415  _weights[ 2] = Real(1.0715922046717193501186954668587e-01L);
416  _weights[ 3] = Real(1.3957067792615431444780479451103e-01L);
417  _weights[ 4] = Real(1.6626920581699393355320086048121e-01L);
418  _weights[ 5] = Real(1.8616100001556221102680056186642e-01L);
419  _weights[ 6] = Real(1.9843148532711157645611832644384e-01L);
420  _weights[ 7] = Real(2.0257824192556127288062019996752e-01L);
421  _weights[ 8] = _weights[6];
422  _weights[ 9] = _weights[5];
423  _weights[10] = _weights[4];
424  _weights[11] = _weights[3];
425  _weights[12] = _weights[2];
426  _weights[13] = _weights[1];
427  _weights[14] = _weights[0];
428 
429  return;
430  }
431 
432  case THIRTIETH:
433  case THIRTYFIRST:
434  {
435  _points.resize (16);
436  _weights.resize(16);
437 
438  _points[ 0](0) = Real(-9.8940093499164993259615417345033e-01L);
439  _points[ 1](0) = Real(-9.4457502307323257607798841553461e-01L);
440  _points[ 2](0) = Real(-8.6563120238783174388046789771239e-01L);
441  _points[ 3](0) = Real(-7.5540440835500303389510119484744e-01L);
442  _points[ 4](0) = Real(-6.1787624440264374844667176404879e-01L);
443  _points[ 5](0) = Real(-4.5801677765722738634241944298358e-01L);
444  _points[ 6](0) = Real(-2.8160355077925891323046050146050e-01L);
445  _points[ 7](0) = Real(-9.5012509837637440185319335424958e-02L);
446  _points[ 8] = -_points[7];
447  _points[ 9] = -_points[6];
448  _points[10] = -_points[5];
449  _points[11] = -_points[4];
450  _points[12] = -_points[3];
451  _points[13] = -_points[2];
452  _points[14] = -_points[1];
453  _points[15] = -_points[0];
454 
455  _weights[ 0] = Real(2.7152459411754094851780572456018e-02L);
456  _weights[ 1] = Real(6.2253523938647892862843836994378e-02L);
457  _weights[ 2] = Real(9.5158511682492784809925107602246e-02L);
458  _weights[ 3] = Real(1.2462897125553387205247628219202e-01L);
459  _weights[ 4] = Real(1.4959598881657673208150173054748e-01L);
460  _weights[ 5] = Real(1.6915651939500253818931207903033e-01L);
461  _weights[ 6] = Real(1.8260341504492358886676366796922e-01L);
462  _weights[ 7] = Real(1.8945061045506849628539672320828e-01L);
463  _weights[ 8] = _weights[7];
464  _weights[ 9] = _weights[6];
465  _weights[10] = _weights[5];
466  _weights[11] = _weights[4];
467  _weights[12] = _weights[3];
468  _weights[13] = _weights[2];
469  _weights[14] = _weights[1];
470  _weights[15] = _weights[0];
471 
472  return;
473  }
474 
475  case THIRTYSECOND:
476  case THIRTYTHIRD:
477  {
478  _points.resize (17);
479  _weights.resize(17);
480 
481  _points[ 0](0) = Real(-9.9057547531441733567543401994067e-01L);
482  _points[ 1](0) = Real(-9.5067552176876776122271695789580e-01L);
483  _points[ 2](0) = Real(-8.8023915372698590212295569448816e-01L);
484  _points[ 3](0) = Real(-7.8151400389680140692523005552048e-01L);
485  _points[ 4](0) = Real(-6.5767115921669076585030221664300e-01L);
486  _points[ 5](0) = Real(-5.1269053708647696788624656862955e-01L);
487  _points[ 6](0) = Real(-3.5123176345387631529718551709535e-01L);
488  _points[ 7](0) = Real(-1.7848418149584785585067749365407e-01L);
489  _points[ 8](0) = 0.;
490  _points[ 9] = -_points[7];
491  _points[10] = -_points[6];
492  _points[11] = -_points[5];
493  _points[12] = -_points[4];
494  _points[13] = -_points[3];
495  _points[14] = -_points[2];
496  _points[15] = -_points[1];
497  _points[16] = -_points[0];
498 
499  _weights[ 0] = Real(2.4148302868547931960110026287565e-02L);
500  _weights[ 1] = Real(5.5459529373987201129440165358245e-02L);
501  _weights[ 2] = Real(8.5036148317179180883535370191062e-02L);
502  _weights[ 3] = Real(1.1188384719340397109478838562636e-01L);
503  _weights[ 4] = Real(1.3513636846852547328631998170235e-01L);
504  _weights[ 5] = Real(1.5404576107681028808143159480196e-01L);
505  _weights[ 6] = Real(1.6800410215645004450997066378832e-01L);
506  _weights[ 7] = Real(1.7656270536699264632527099011320e-01L);
507  _weights[ 8] = Real(1.7944647035620652545826564426189e-01L);
508  _weights[ 9] = _weights[7];
509  _weights[10] = _weights[6];
510  _weights[11] = _weights[5];
511  _weights[12] = _weights[4];
512  _weights[13] = _weights[3];
513  _weights[14] = _weights[2];
514  _weights[15] = _weights[1];
515  _weights[16] = _weights[0];
516 
517  return;
518  }
519 
520  case THIRTYFOURTH:
521  case THIRTYFIFTH:
522  {
523  _points.resize (18);
524  _weights.resize(18);
525 
526  _points[ 0](0) = Real(-9.9156516842093094673001600470615e-01L);
527  _points[ 1](0) = Real(-9.5582394957139775518119589292978e-01L);
528  _points[ 2](0) = Real(-8.9260246649755573920606059112715e-01L);
529  _points[ 3](0) = Real(-8.0370495897252311568241745501459e-01L);
530  _points[ 4](0) = Real(-6.9168704306035320787489108128885e-01L);
531  _points[ 5](0) = Real(-5.5977083107394753460787154852533e-01L);
532  _points[ 6](0) = Real(-4.1175116146284264603593179383305e-01L);
533  _points[ 7](0) = Real(-2.5188622569150550958897285487791e-01L);
534  _points[ 8](0) = Real(-8.4775013041735301242261852935784e-02L);
535  _points[ 9] = -_points[8];
536  _points[10] = -_points[7];
537  _points[11] = -_points[6];
538  _points[12] = -_points[5];
539  _points[13] = -_points[4];
540  _points[14] = -_points[3];
541  _points[15] = -_points[2];
542  _points[16] = -_points[1];
543  _points[17] = -_points[0];
544 
545  _weights[ 0] = Real(2.1616013526483310313342710266452e-02L);
546  _weights[ 1] = Real(4.9714548894969796453334946202639e-02L);
547  _weights[ 2] = Real(7.6425730254889056529129677616637e-02L);
548  _weights[ 3] = Real(1.0094204410628716556281398492483e-01L);
549  _weights[ 4] = Real(1.2255520671147846018451912680020e-01L);
550  _weights[ 5] = Real(1.4064291467065065120473130375195e-01L);
551  _weights[ 6] = Real(1.5468467512626524492541800383637e-01L);
552  _weights[ 7] = Real(1.6427648374583272298605377646593e-01L);
553  _weights[ 8] = Real(1.6914238296314359184065647013499e-01L);
554  _weights[ 9] = _weights[8];
555  _weights[10] = _weights[7];
556  _weights[11] = _weights[6];
557  _weights[12] = _weights[5];
558  _weights[13] = _weights[4];
559  _weights[14] = _weights[3];
560  _weights[15] = _weights[2];
561  _weights[16] = _weights[1];
562  _weights[17] = _weights[0];
563 
564  return;
565  }
566 
567  case THIRTYSIXTH:
568  case THIRTYSEVENTH:
569  {
570  _points.resize (19);
571  _weights.resize(19);
572 
573  _points[ 0](0) = Real(-9.9240684384358440318901767025326e-01L);
574  _points[ 1](0) = Real(-9.6020815213483003085277884068765e-01L);
575  _points[ 2](0) = Real(-9.0315590361481790164266092853231e-01L);
576  _points[ 3](0) = Real(-8.2271465653714282497892248671271e-01L);
577  _points[ 4](0) = Real(-7.2096617733522937861709586082378e-01L);
578  _points[ 5](0) = Real(-6.0054530466168102346963816494624e-01L);
579  _points[ 6](0) = Real(-4.6457074137596094571726714810410e-01L);
580  _points[ 7](0) = Real(-3.1656409996362983199011732884984e-01L);
581  _points[ 8](0) = Real(-1.6035864564022537586809611574074e-01L);
582  _points[ 9](0) = 0.;
583  _points[10] = -_points[8];
584  _points[11] = -_points[7];
585  _points[12] = -_points[6];
586  _points[13] = -_points[5];
587  _points[14] = -_points[4];
588  _points[15] = -_points[3];
589  _points[16] = -_points[2];
590  _points[17] = -_points[1];
591  _points[18] = -_points[0];
592 
593  _weights[ 0] = Real(1.9461788229726477036312041464438e-02L);
594  _weights[ 1] = Real(4.4814226765699600332838157401994e-02L);
595  _weights[ 2] = Real(6.9044542737641226580708258006013e-02L);
596  _weights[ 3] = Real(9.1490021622449999464462094123840e-02L);
597  _weights[ 4] = Real(1.1156664554733399471602390168177e-01L);
598  _weights[ 5] = Real(1.2875396253933622767551578485688e-01L);
599  _weights[ 6] = Real(1.4260670217360661177574610944190e-01L);
600  _weights[ 7] = Real(1.5276604206585966677885540089766e-01L);
601  _weights[ 8] = Real(1.5896884339395434764995643946505e-01L);
602  _weights[ 9] = Real(1.6105444984878369597916362532092e-01L);
603  _weights[10] = _weights[8];
604  _weights[11] = _weights[7];
605  _weights[12] = _weights[6];
606  _weights[13] = _weights[5];
607  _weights[14] = _weights[4];
608  _weights[15] = _weights[3];
609  _weights[16] = _weights[2];
610  _weights[17] = _weights[1];
611  _weights[18] = _weights[0];
612 
613  return;
614  }
615 
616  case THIRTYEIGHTH:
617  case THIRTYNINTH:
618  {
619  _points.resize (20);
620  _weights.resize(20);
621 
622  _points[ 0](0) = Real(-9.9312859918509492478612238847132e-01L);
623  _points[ 1](0) = Real(-9.6397192727791379126766613119728e-01L);
624  _points[ 2](0) = Real(-9.1223442825132590586775244120330e-01L);
625  _points[ 3](0) = Real(-8.3911697182221882339452906170152e-01L);
626  _points[ 4](0) = Real(-7.4633190646015079261430507035564e-01L);
627  _points[ 5](0) = Real(-6.3605368072651502545283669622629e-01L);
628  _points[ 6](0) = Real(-5.1086700195082709800436405095525e-01L);
629  _points[ 7](0) = Real(-3.7370608871541956067254817702493e-01L);
630  _points[ 8](0) = Real(-2.2778585114164507808049619536857e-01L);
631  _points[ 9](0) = Real(-7.6526521133497333754640409398838e-02L);
632  _points[10] = -_points[9];
633  _points[11] = -_points[8];
634  _points[12] = -_points[7];
635  _points[13] = -_points[6];
636  _points[14] = -_points[5];
637  _points[15] = -_points[4];
638  _points[16] = -_points[3];
639  _points[17] = -_points[2];
640  _points[18] = -_points[1];
641  _points[19] = -_points[0];
642 
643  _weights[ 0] = Real(1.7614007139152118311861962351853e-02L);
644  _weights[ 1] = Real(4.0601429800386941331039952274932e-02L);
645  _weights[ 2] = Real(6.2672048334109063569506535187042e-02L);
646  _weights[ 3] = Real(8.3276741576704748724758143222046e-02L);
647  _weights[ 4] = Real(1.0193011981724043503675013548035e-01L);
648  _weights[ 5] = Real(1.1819453196151841731237737771138e-01L);
649  _weights[ 6] = Real(1.3168863844917662689849449974816e-01L);
650  _weights[ 7] = Real(1.4209610931838205132929832506716e-01L);
651  _weights[ 8] = Real(1.4917298647260374678782873700197e-01L);
652  _weights[ 9] = Real(1.5275338713072585069808433195510e-01L);
653  _weights[10] = _weights[9];
654  _weights[11] = _weights[8];
655  _weights[12] = _weights[7];
656  _weights[13] = _weights[6];
657  _weights[14] = _weights[5];
658  _weights[15] = _weights[4];
659  _weights[16] = _weights[3];
660  _weights[17] = _weights[2];
661  _weights[18] = _weights[1];
662  _weights[19] = _weights[0];
663 
664  return;
665  }
666 
667  case FORTIETH:
668  case FORTYFIRST:
669  {
670  _points.resize (21);
671  _weights.resize(21);
672 
673  _points[ 0](0) = Real(-9.9375217062038950026024203593794e-01L);
674  _points[ 1](0) = Real(-9.6722683856630629431662221490770e-01L);
675  _points[ 2](0) = Real(-9.2009933415040082879018713371497e-01L);
676  _points[ 3](0) = Real(-8.5336336458331728364725063858757e-01L);
677  _points[ 4](0) = Real(-7.6843996347567790861587785130623e-01L);
678  _points[ 5](0) = Real(-6.6713880419741231930596666999034e-01L);
679  _points[ 6](0) = Real(-5.5161883588721980705901879672431e-01L);
680  _points[ 7](0) = Real(-4.2434212020743878357366888854379e-01L);
681  _points[ 8](0) = Real(-2.8802131680240109660079251606460e-01L);
682  _points[ 9](0) = Real(-1.4556185416089509093703098233869e-01L);
683  _points[10](0) = 0.;
684  _points[11] = -_points[9];
685  _points[12] = -_points[8];
686  _points[13] = -_points[7];
687  _points[14] = -_points[6];
688  _points[15] = -_points[5];
689  _points[16] = -_points[4];
690  _points[17] = -_points[3];
691  _points[18] = -_points[2];
692  _points[19] = -_points[1];
693  _points[20] = -_points[0];
694 
695  _weights[ 0] = Real(1.6017228257774333324224616858471e-02L);
696  _weights[ 1] = Real(3.6953789770852493799950668299330e-02L);
697  _weights[ 2] = Real(5.7134425426857208283635826472448e-02L);
698  _weights[ 3] = Real(7.6100113628379302017051653300183e-02L);
699  _weights[ 4] = Real(9.3444423456033861553289741113932e-02L);
700  _weights[ 5] = Real(1.0879729916714837766347457807011e-01L);
701  _weights[ 6] = Real(1.2183141605372853419536717712572e-01L);
702  _weights[ 7] = Real(1.3226893863333746178105257449678e-01L);
703  _weights[ 8] = Real(1.3988739479107315472213342386758e-01L);
704  _weights[ 9] = Real(1.4452440398997005906382716655375e-01L);
705  _weights[10] = Real(1.4608113364969042719198514768337e-01L);
706  _weights[11] = _weights[9];
707  _weights[12] = _weights[8];
708  _weights[13] = _weights[7];
709  _weights[14] = _weights[6];
710  _weights[15] = _weights[5];
711  _weights[16] = _weights[4];
712  _weights[17] = _weights[3];
713  _weights[18] = _weights[2];
714  _weights[19] = _weights[1];
715  _weights[20] = _weights[0];
716 
717  return;
718  }
719 
720  case FORTYSECOND:
721  case FORTYTHIRD:
722  {
723  _points.resize (22);
724  _weights.resize(22);
725 
726  _points[ 0](0) = Real(-9.9429458548239929207303142116130e-01L);
727  _points[ 1](0) = Real(-9.7006049783542872712395098676527e-01L);
728  _points[ 2](0) = Real(-9.2695677218717400052069293925905e-01L);
729  _points[ 3](0) = Real(-8.6581257772030013653642563701938e-01L);
730  _points[ 4](0) = Real(-7.8781680597920816200427795540835e-01L);
731  _points[ 5](0) = Real(-6.9448726318668278005068983576226e-01L);
732  _points[ 6](0) = Real(-5.8764040350691159295887692763865e-01L);
733  _points[ 7](0) = Real(-4.6935583798675702640633071096641e-01L);
734  _points[ 8](0) = Real(-3.4193582089208422515814742042738e-01L);
735  _points[ 9](0) = Real(-2.0786042668822128547884653391955e-01L);
736  _points[10](0) = Real(-6.9739273319722221213841796118628e-02L);
737  _points[11] = -_points[10];
738  _points[12] = -_points[9];
739  _points[13] = -_points[8];
740  _points[14] = -_points[7];
741  _points[15] = -_points[6];
742  _points[16] = -_points[5];
743  _points[17] = -_points[4];
744  _points[18] = -_points[3];
745  _points[19] = -_points[2];
746  _points[20] = -_points[1];
747  _points[21] = -_points[0];
748 
749  _weights[ 0] = Real(1.4627995298272200684991098047185e-02L);
750  _weights[ 1] = Real(3.3774901584814154793302246865913e-02L);
751  _weights[ 2] = Real(5.2293335152683285940312051273211e-02L);
752  _weights[ 3] = Real(6.9796468424520488094961418930218e-02L);
753  _weights[ 4] = Real(8.5941606217067727414443681372703e-02L);
754  _weights[ 5] = Real(1.0041414444288096493207883783054e-01L);
755  _weights[ 6] = Real(1.1293229608053921839340060742175e-01L);
756  _weights[ 7] = Real(1.2325237681051242428556098615481e-01L);
757  _weights[ 8] = Real(1.3117350478706237073296499253031e-01L);
758  _weights[ 9] = Real(1.3654149834601517135257383123152e-01L);
759  _weights[10] = Real(1.3925187285563199337541024834181e-01L);
760  _weights[11] = _weights[10];
761  _weights[12] = _weights[9];
762  _weights[13] = _weights[8];
763  _weights[14] = _weights[7];
764  _weights[15] = _weights[6];
765  _weights[16] = _weights[5];
766  _weights[17] = _weights[4];
767  _weights[18] = _weights[3];
768  _weights[19] = _weights[2];
769  _weights[20] = _weights[1];
770  _weights[21] = _weights[0];
771 
772  return;
773  }
774 
775 
776  default:
777  libmesh_error_msg("Quadrature rule " << _order << " not supported!");
778  }
779 }
std::vector< Point > _points
The locations of the quadrature points in reference element space.
Definition: quadrature.h:383
std::vector< Real > _weights
The quadrature weights.
Definition: quadrature.h:389
Order get_order() const
Definition: quadrature.h:218
Order _order
The polynomial order which the quadrature rule is capable of integrating exactly. ...
Definition: quadrature.h:365
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ init_2D()

void libMesh::QGauss::init_2D ( const ElemType  type,
unsigned int  p_level 
)
overrideprivatevirtual

Initializes the 2D quadrature rule by filling the points and weights vectors with the appropriate values.

The order of the rule will be defined by the implementing class. Should not be pure virtual since a derived quadrature rule may only be defined in 1D. If not overridden, throws an error.

Note
The arguments should no longer be used for anything in derived classes, they are only maintained for backwards compatibility and will eventually be removed.

Reimplemented from libMesh::QBase.

Definition at line 29 of file quadrature_gauss_2D.C.

References libMesh::QBase::_order, libMesh::QBase::_p_level, libMesh::QBase::_points, libMesh::QBase::_type, libMesh::QBase::_weights, libMesh::CONSTANT, dunavant_rule(), dunavant_rule2(), libMesh::EDGE2, libMesh::EIGHTH, libMesh::EIGHTTEENTH, libMesh::ELEVENTH, libMesh::Utility::enum_to_string(), libMesh::FIFTEENTH, libMesh::FIFTH, libMesh::FIRST, libMesh::FOURTEENTH, libMesh::FOURTH, libMesh::QBase::get_order(), libMesh::QBase::get_points(), libMesh::QBase::get_weights(), libMesh::QBase::init(), libMesh::NINETEENTH, libMesh::NINTH, libMesh::QUAD4, libMesh::QUAD8, libMesh::QUAD9, libMesh::QUADSHELL4, libMesh::QUADSHELL8, libMesh::Real, libMesh::SECOND, libMesh::SEVENTEENTH, libMesh::SEVENTH, libMesh::SIXTEENTH, libMesh::SIXTH, std::sqrt(), libMesh::QBase::tensor_product_quad(), libMesh::TENTH, libMesh::THIRD, libMesh::THIRTEENTH, libMesh::THIRTIETH, libMesh::TRI3, libMesh::TRI3SUBDIVISION, libMesh::TRI6, libMesh::TRI7, libMesh::TRISHELL3, libMesh::TWELFTH, libMesh::TWENTIETH, libMesh::TWENTYEIGHTH, libMesh::TWENTYFIFTH, libMesh::TWENTYFOURTH, libMesh::TWENTYNINTH, libMesh::TWENTYSECOND, libMesh::TWENTYSEVENTH, libMesh::TWENTYSIXTH, and libMesh::TWENTYTHIRD.

30 {
31 #if LIBMESH_DIM > 1
32 
33  //-----------------------------------------------------------------------
34  // 2D quadrature rules
35  switch (_type)
36  {
37 
38 
39  //---------------------------------------------
40  // Quadrilateral quadrature rules
41  case QUAD4:
42  case QUADSHELL4:
43  case QUAD8:
44  case QUADSHELL8:
45  case QUAD9:
46  {
47  // We compute the 2D quadrature rule as a tensor
48  // product of the 1D quadrature rule.
49  //
50  // For QUADs, a quadrature rule of order 'p' must be able to integrate
51  // bilinear (p=1), biquadratic (p=2), bicubic (p=3), etc. polynomials of the form
52  //
53  // (x^p + x^{p-1} + ... + 1) * (y^p + y^{p-1} + ... + 1)
54  //
55  // These polynomials have terms *up to* degree 2p but they are *not* complete
56  // polynomials of degree 2p. For example, when p=2 we have
57  // 1
58  // x y
59  // x^2 xy y^2
60  // yx^2 xy^2
61  // x^2y^2
62  QGauss q1D(1,_order);
63  q1D.init(EDGE2, _p_level);
64  tensor_product_quad( q1D );
65  return;
66  }
67 
68 
69  //---------------------------------------------
70  // Triangle quadrature rules
71  case TRI3:
72  case TRISHELL3:
73  case TRI3SUBDIVISION:
74  case TRI6:
75  case TRI7:
76  {
77  switch(get_order())
78  {
79  case CONSTANT:
80  case FIRST:
81  {
82  // Exact for linears
83  _points.resize(1);
84  _weights.resize(1);
85 
86  _points[0](0) = Real(1)/3;
87  _points[0](1) = Real(1)/3;
88 
89  _weights[0] = 0.5;
90 
91  return;
92  }
93  case SECOND:
94  {
95  // Exact for quadratics
96  _points.resize(3);
97  _weights.resize(3);
98 
99  // Alternate rule with points on ref. elt. boundaries.
100  // Not ideal for problems with material coefficient discontinuities
101  // aligned along element boundaries.
102  // _points[0](0) = .5;
103  // _points[0](1) = .5;
104  // _points[1](0) = 0.;
105  // _points[1](1) = .5;
106  // _points[2](0) = .5;
107  // _points[2](1) = .0;
108 
109  _points[0](0) = Real(2)/3;
110  _points[0](1) = Real(1)/6;
111 
112  _points[1](0) = Real(1)/6;
113  _points[1](1) = Real(2)/3;
114 
115  _points[2](0) = Real(1)/6;
116  _points[2](1) = Real(1)/6;
117 
118 
119  _weights[0] = Real(1)/6;
120  _weights[1] = Real(1)/6;
121  _weights[2] = Real(1)/6;
122 
123  return;
124  }
125  case THIRD:
126  {
127  // Exact for cubics
128  _points.resize(4);
129  _weights.resize(4);
130 
131  // This rule is formed from a tensor product of
132  // appropriately-scaled Gauss and Jacobi rules. (See
133  // also the QConical quadrature class, this is a
134  // hard-coded version of one of those rules.) For high
135  // orders these rules generally have too many points,
136  // but at extremely low order they are competitive and
137  // have the additional benefit of having all positive
138  // weights.
139  _points[0](0) = Real(1.5505102572168219018027159252941e-01L);
140  _points[0](1) = Real(1.7855872826361642311703513337422e-01L);
141  _points[1](0) = Real(6.4494897427831780981972840747059e-01L);
142  _points[1](1) = Real(7.5031110222608118177475598324603e-02L);
143  _points[2](0) = Real(1.5505102572168219018027159252941e-01L);
144  _points[2](1) = Real(6.6639024601470138670269327409637e-01L);
145  _points[3](0) = Real(6.4494897427831780981972840747059e-01L);
146  _points[3](1) = Real(2.8001991549907407200279599420481e-01L);
147 
148  _weights[0] = Real(1.5902069087198858469718450103758e-01L);
149  _weights[1] = Real(9.0979309128011415302815498962418e-02L);
150  _weights[2] = Real(1.5902069087198858469718450103758e-01L);
151  _weights[3] = Real(9.0979309128011415302815498962418e-02L);
152 
153  return;
154 
155 
156  // The following third-order rule is quite commonly cited
157  // in the literature and most likely works fine. However,
158  // we generally prefer a rule with all positive weights
159  // and an equal number of points, when available.
160  //
161  // (allow_rules_with_negative_weights)
162  // {
163  // // Exact for cubics
164  // _points.resize(4);
165  // _weights.resize(4);
166  //
167  // _points[0](0) = .33333333333333333333333333333333;
168  // _points[0](1) = .33333333333333333333333333333333;
169  //
170  // _points[1](0) = .2;
171  // _points[1](1) = .6;
172  //
173  // _points[2](0) = .2;
174  // _points[2](1) = .2;
175  //
176  // _points[3](0) = .6;
177  // _points[3](1) = .2;
178  //
179  //
180  // _weights[0] = -27./96.;
181  // _weights[1] = 25./96.;
182  // _weights[2] = 25./96.;
183  // _weights[3] = 25./96.;
184  //
185  // return;
186  // } // end if (allow_rules_with_negative_weights)
187  // Note: if !allow_rules_with_negative_weights, fall through to next case.
188  }
189 
190 
191 
192  // A degree 4 rule with six points. This rule can be found in many places
193  // including:
194  //
195  // J.N. Lyness and D. Jespersen, Moderate degree symmetric
196  // quadrature rules for the triangle, J. Inst. Math. Appl. 15 (1975),
197  // 19--32.
198  //
199  // We used the code in:
200  // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
201  // on triangles and tetrahedra" Journal of Computational Mathematics,
202  // v. 27, no. 1, 2009, pp. 89-96.
203  // to generate additional precision.
204  case FOURTH:
205  {
206  const unsigned int n_wts = 2;
207  const Real wts[n_wts] =
208  {
209  Real(1.1169079483900573284750350421656140e-01L),
210  Real(5.4975871827660933819163162450105264e-02L)
211  };
212 
213  const Real a[n_wts] =
214  {
215  Real(4.4594849091596488631832925388305199e-01L),
216  Real(9.1576213509770743459571463402201508e-02L)
217  };
218 
219  const Real b[n_wts] = {0., 0.}; // not used
220  const unsigned int permutation_ids[n_wts] = {3, 3};
221 
222  dunavant_rule2(wts, a, b, permutation_ids, n_wts); // 6 total points
223 
224  return;
225  }
226 
227 
228 
229  // Exact for quintics
230  // Can be found in "Quadrature on Simplices of Arbitrary
231  // Dimension" by Walkington.
232  case FIFTH:
233  {
234  const unsigned int n_wts = 3;
235  const Real wts[n_wts] =
236  {
237  Real(9)/80,
238  Real(31)/480 + std::sqrt(Real(15.0L))/2400,
239  Real(31)/480 - std::sqrt(Real(15.0L))/2400
240  };
241 
242  const Real a[n_wts] =
243  {
244  0., // 'a' parameter not used for origin permutation
245  Real(2)/7 + std::sqrt(Real(15.0L))/21,
246  Real(2)/7 - std::sqrt(Real(15.0L))/21
247  };
248 
249  const Real b[n_wts] = {0., 0., 0.}; // not used
250  const unsigned int permutation_ids[n_wts] = {1, 3, 3};
251 
252  dunavant_rule2(wts, a, b, permutation_ids, n_wts); // 7 total points
253 
254  return;
255  }
256 
257 
258 
259  // A degree 6 rule with 12 points. This rule can be found in many places
260  // including:
261  //
262  // J.N. Lyness and D. Jespersen, Moderate degree symmetric
263  // quadrature rules for the triangle, J. Inst. Math. Appl. 15 (1975),
264  // 19--32.
265  //
266  // We used the code in:
267  // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
268  // on triangles and tetrahedra" Journal of Computational Mathematics,
269  // v. 27, no. 1, 2009, pp. 89-96.
270  // to generate additional precision.
271  //
272  // Note that the following 7th-order Ro3-invariant rule also has only 12 points,
273  // which technically makes it the superior rule. This one is here for completeness.
274  case SIXTH:
275  {
276  const unsigned int n_wts = 3;
277  const Real wts[n_wts] =
278  {
279  Real(5.8393137863189683012644805692789721e-02L),
280  Real(2.5422453185103408460468404553434492e-02L),
281  Real(4.1425537809186787596776728210221227e-02L)
282  };
283 
284  const Real a[n_wts] =
285  {
286  Real(2.4928674517091042129163855310701908e-01L),
287  Real(6.3089014491502228340331602870819157e-02L),
288  Real(3.1035245103378440541660773395655215e-01L)
289  };
290 
291  const Real b[n_wts] =
292  {
293  0.,
294  0.,
295  Real(6.3650249912139864723014259441204970e-01L)
296  };
297 
298  const unsigned int permutation_ids[n_wts] = {3, 3, 6}; // 12 total points
299 
300  dunavant_rule2(wts, a, b, permutation_ids, n_wts);
301 
302  return;
303  }
304 
305 
306  // A degree 7 rule with 12 points. This rule can be found in:
307  //
308  // K. Gatermann, The construction of symmetric cubature
309  // formulas for the square and the triangle, Computing 40
310  // (1988), 229--240.
311  //
312  // This rule, which is provably minimal in the number of
313  // integration points, is said to be 'Ro3 invariant' which
314  // means that a given set of barycentric coordinates
315  // (z1,z2,z3) implies the quadrature points (z1,z2),
316  // (z3,z1), (z2,z3) which are formed by taking the first
317  // two entries in cyclic permutations of the barycentric
318  // point. Barycentric coordinates are related in the
319  // sense that: z3 = 1 - z1 - z2.
320  //
321  // The 12-point sixth-order rule for triangles given in
322  // Flaherty's (http://www.cs.rpi.edu/~flaherje/FEM/fem6.ps)
323  // lecture notes has been removed in favor of this rule
324  // which is higher-order (for the same number of
325  // quadrature points) and has a few more digits of
326  // precision in the points and weights. Some 10-point
327  // degree 6 rules exist for the triangle but they have
328  // quadrature points outside the region of integration.
329  case SEVENTH:
330  {
331  _points.resize (12);
332  _weights.resize(12);
333 
334  const unsigned int nrows=4;
335 
336  // In each of the rows below, the first two entries are (z1, z2) which imply
337  // z3. The third entry is the weight for each of the points in the cyclic permutation.
338  // The original publication tabulated about 16 decimal digits for each point and weight
339  // parameter. The additional digits shown here were obtained using a code in the
340  // mp-quadrature library, https://github.com/jwpeterson/mp-quadrature
341  const Real rule_data[nrows][3] = {
342  {Real(6.2382265094402118173683000996350e-02L), Real(6.7517867073916085442557131050869e-02L), Real(2.6517028157436251428754180460739e-02L)}, // group A
343  {Real(5.5225456656926611737479190275645e-02L), Real(3.2150249385198182266630784919920e-01L), Real(4.3881408714446055036769903139288e-02L)}, // group B
344  {Real(3.4324302945097146469630642483938e-02L), Real(6.6094919618673565761198031019780e-01L), Real(2.8775042784981585738445496900219e-02L)}, // group C
345  {Real(5.1584233435359177925746338682643e-01L), Real(2.7771616697639178256958187139372e-01L), Real(6.7493187009802774462697086166421e-02L)} // group D
346  };
347 
348  for (unsigned int i=0, offset=0; i<nrows; ++i)
349  {
350  _points[offset + 0] = Point(rule_data[i][0], rule_data[i][1]); // (z1,z2)
351  _points[offset + 1] = Point(1.-rule_data[i][0]-rule_data[i][1], rule_data[i][0]); // (z3,z1)
352  _points[offset + 2] = Point(rule_data[i][1], 1.-rule_data[i][0]-rule_data[i][1]); // (z2,z3)
353 
354  // All these points get the same weight
355  _weights[offset + 0] = rule_data[i][2];
356  _weights[offset + 1] = rule_data[i][2];
357  _weights[offset + 2] = rule_data[i][2];
358 
359  // Increment offset
360  offset += 3;
361  }
362 
363  return;
364 
365 
366  // // The following is an inferior 7th-order Lyness-style rule with 15 points.
367  // // It's here only for completeness and the Ro3-invariant rule above should
368  // // be used instead!
369  // const unsigned int n_wts = 3;
370  // const Real wts[n_wts] =
371  // {
372  // Real(2.6538900895116205835977487499847719e-02L),
373  // Real(3.5426541846066783659206291623201826e-02L),
374  // Real(3.4637341039708446756138297960207647e-02L)
375  // };
376  //
377  // const Real a[n_wts] =
378  // {
379  // Real(6.4930513159164863078379776030396538e-02L),
380  // Real(2.8457558424917033519741605734978046e-01L),
381  // Real(3.1355918438493150795585190219862865e-01L)
382  // };
383  //
384  // const Real b[n_wts] =
385  // {
386  // 0.,
387  // Real(1.9838447668150671917987659863332941e-01L),
388  // Real(4.3863471792372471511798695971295936e-02L)
389  // };
390  //
391  // const unsigned int permutation_ids[n_wts] = {3, 6, 6}; // 15 total points
392  //
393  // dunavant_rule2(wts, a, b, permutation_ids, n_wts);
394  //
395  // return;
396  }
397 
398 
399 
400 
401  // Another Dunavant rule. This one has all positive weights. This rule has
402  // 16 points while a comparable conical product rule would have 5*5=25.
403  //
404  // It was copied 23rd June 2008 from:
405  // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90
406  //
407  // Additional precision obtained from the code in:
408  // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
409  // on triangles and tetrahedra" Journal of Computational Mathematics,
410  // v. 27, no. 1, 2009, pp. 89-96.
411  case EIGHTH:
412  {
413  const unsigned int n_wts = 5;
414  const Real wts[n_wts] =
415  {
416  Real(7.2157803838893584125545555244532310e-02L),
417  Real(4.7545817133642312396948052194292159e-02L),
418  Real(5.1608685267359125140895775146064515e-02L),
419  Real(1.6229248811599040155462964170890299e-02L),
420  Real(1.3615157087217497132422345036954462e-02L)
421  };
422 
423  const Real a[n_wts] =
424  {
425  0.0, // 'a' parameter not used for origin permutation
426  Real(4.5929258829272315602881551449416932e-01L),
427  Real(1.7056930775176020662229350149146450e-01L),
428  Real(5.0547228317030975458423550596598947e-02L),
429  Real(2.6311282963463811342178578628464359e-01L),
430  };
431 
432  const Real b[n_wts] =
433  {
434  0.,
435  0.,
436  0.,
437  0.,
438  Real(7.2849239295540428124100037917606196e-01L)
439  };
440 
441  const unsigned int permutation_ids[n_wts] = {1, 3, 3, 3, 6}; // 16 total points
442 
443  dunavant_rule2(wts, a, b, permutation_ids, n_wts);
444 
445  return;
446  }
447 
448 
449 
450  // Another Dunavant rule. This one has all positive weights. This rule has 19
451  // points. The comparable conical product rule would have 25.
452  // It was copied 23rd June 2008 from:
453  // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90
454  //
455  // Additional precision obtained from the code in:
456  // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
457  // on triangles and tetrahedra" Journal of Computational Mathematics,
458  // v. 27, no. 1, 2009, pp. 89-96.
459  case NINTH:
460  {
461  const unsigned int n_wts = 6;
462  const Real wts[n_wts] =
463  {
464  Real(4.8567898141399416909620991253644315e-02L),
465  Real(1.5667350113569535268427415643604658e-02L),
466  Real(1.2788837829349015630839399279499912e-02L),
467  Real(3.8913770502387139658369678149701978e-02L),
468  Real(3.9823869463605126516445887132022637e-02L),
469  Real(2.1641769688644688644688644688644689e-02L)
470  };
471 
472  const Real a[n_wts] =
473  {
474  0.0, // 'a' parameter not used for origin permutation
475  Real(4.8968251919873762778370692483619280e-01L),
476  Real(4.4729513394452709865106589966276365e-02L),
477  Real(4.3708959149293663726993036443535497e-01L),
478  Real(1.8820353561903273024096128046733557e-01L),
479  Real(2.2196298916076569567510252769319107e-01L)
480  };
481 
482  const Real b[n_wts] =
483  {
484  0.,
485  0.,
486  0.,
487  0.,
488  0.,
489  Real(7.4119859878449802069007987352342383e-01L)
490  };
491 
492  const unsigned int permutation_ids[n_wts] = {1, 3, 3, 3, 3, 6}; // 19 total points
493 
494  dunavant_rule2(wts, a, b, permutation_ids, n_wts);
495 
496  return;
497  }
498 
499 
500  // Another Dunavant rule with all positive weights. This rule has 25
501  // points. The comparable conical product rule would have 36.
502  // It was copied 23rd June 2008 from:
503  // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90
504  //
505  // Additional precision obtained from the code in:
506  // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
507  // on triangles and tetrahedra" Journal of Computational Mathematics,
508  // v. 27, no. 1, 2009, pp. 89-96.
509  case TENTH:
510  {
511  const unsigned int n_wts = 6;
512  const Real wts[n_wts] =
513  {
514  Real(4.5408995191376790047643297550014267e-02L),
515  Real(1.8362978878233352358503035945683300e-02L),
516  Real(2.2660529717763967391302822369298659e-02L),
517  Real(3.6378958422710054302157588309680344e-02L),
518  Real(1.4163621265528742418368530791049552e-02L),
519  Real(4.7108334818664117299637354834434138e-03L)
520  };
521 
522  const Real a[n_wts] =
523  {
524  0.0, // 'a' parameter not used for origin permutation
525  Real(4.8557763338365737736750753220812615e-01L),
526  Real(1.0948157548503705479545863134052284e-01L),
527  Real(3.0793983876412095016515502293063162e-01L),
528  Real(2.4667256063990269391727646541117681e-01L),
529  Real(6.6803251012200265773540212762024737e-02L)
530  };
531 
532  const Real b[n_wts] =
533  {
534  0.,
535  0.,
536  0.,
537  Real(5.5035294182099909507816172659300821e-01L),
538  Real(7.2832390459741092000873505358107866e-01L),
539  Real(9.2365593358750027664630697761508843e-01L)
540  };
541 
542  const unsigned int permutation_ids[n_wts] = {1, 3, 3, 6, 6, 6}; // 25 total points
543 
544  dunavant_rule2(wts, a, b, permutation_ids, n_wts);
545 
546  return;
547  }
548 
549 
550  // Dunavant's 11th-order rule contains points outside the region of
551  // integration, and is thus unacceptable for our FEM calculations.
552  //
553  // This 30-point, 11th-order rule was obtained by me [JWP] using the code in
554  //
555  // Additional precision obtained from the code in:
556  // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
557  // on triangles and tetrahedra" Journal of Computational Mathematics,
558  // v. 27, no. 1, 2009, pp. 89-96.
559  //
560  // Note: the 28-point 11th-order rule obtained by Zhang in the paper above
561  // does not appear to be unique. It is a solution in the sense that it
562  // minimizes the error in the least-squares minimization problem, but
563  // it involves too many unknowns and the Jacobian is therefore singular
564  // when attempting to improve the solution via Newton's method.
565  case ELEVENTH:
566  {
567  const unsigned int n_wts = 6;
568  const Real wts[n_wts] =
569  {
570  Real(3.6089021198604635216985338480426484e-02L),
571  Real(2.1607717807680420303346736867931050e-02L),
572  Real(3.1144524293927978774861144478241807e-03L),
573  Real(2.9086855161081509446654185084988077e-02L),
574  Real(8.4879241614917017182977532679947624e-03L),
575  Real(1.3795732078224796530729242858347546e-02L)
576  };
577 
578  const Real a[n_wts] =
579  {
580  Real(3.9355079629947969884346551941969960e-01L),
581  Real(4.7979065808897448654107733982929214e-01L),
582  Real(5.1003445645828061436081405648347852e-03L),
583  Real(2.6597620190330158952732822450744488e-01L),
584  Real(2.8536418538696461608233522814483715e-01L),
585  Real(1.3723536747817085036455583801851025e-01L)
586  };
587 
588  const Real b[n_wts] =
589  {
590  0.,
591  0.,
592  Real(5.6817155788572446538150614865768991e-02L),
593  Real(1.2539956353662088473247489775203396e-01L),
594  Real(1.2409970153698532116262152247041742e-02L),
595  Real(5.2792057988217708934207928630851643e-02L)
596  };
597 
598  const unsigned int permutation_ids[n_wts] = {3, 3, 6, 6, 6, 6}; // 30 total points
599 
600  dunavant_rule2(wts, a, b, permutation_ids, n_wts);
601 
602  return;
603  }
604 
605 
606 
607 
608  // Another Dunavant rule with all positive weights. This rule has 33
609  // points. The comparable conical product rule would have 36 (ELEVENTH) or 49 (TWELFTH).
610  //
611  // It was copied 23rd June 2008 from:
612  // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90
613  //
614  // Additional precision obtained from the code in:
615  // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
616  // on triangles and tetrahedra" Journal of Computational Mathematics,
617  // v. 27, no. 1, 2009, pp. 89-96.
618  case TWELFTH:
619  {
620  const unsigned int n_wts = 8;
621  const Real wts[n_wts] =
622  {
623  Real(3.0831305257795086169332418926151771e-03L),
624  Real(3.1429112108942550177135256546441273e-02L),
625  Real(1.7398056465354471494664198647499687e-02L),
626  Real(2.1846272269019201067728631278737487e-02L),
627  Real(1.2865533220227667708895461535782215e-02L),
628  Real(1.1178386601151722855919538351159995e-02L),
629  Real(8.6581155543294461858210504055170332e-03L),
630  Real(2.0185778883190464758914349626118386e-02L)
631  };
632 
633  const Real a[n_wts] =
634  {
635  Real(2.1317350453210370246856975515728246e-02L),
636  Real(2.7121038501211592234595134039689474e-01L),
637  Real(1.2757614554158592467389632515428357e-01L),
638  Real(4.3972439229446027297973662348436108e-01L),
639  Real(4.8821738977380488256466206525881104e-01L),
640  Real(2.8132558098993954824813069297455275e-01L),
641  Real(1.1625191590759714124135414784260182e-01L),
642  Real(2.7571326968551419397479634607976398e-01L)
643  };
644 
645  const Real b[n_wts] =
646  {
647  0.,
648  0.,
649  0.,
650  0.,
651  0.,
652  Real(6.9583608678780342214163552323607254e-01L),
653  Real(8.5801403354407263059053661662617818e-01L),
654  Real(6.0894323577978780685619243776371007e-01L)
655  };
656 
657  const unsigned int permutation_ids[n_wts] = {3, 3, 3, 3, 3, 6, 6, 6}; // 33 total points
658 
659  dunavant_rule2(wts, a, b, permutation_ids, n_wts);
660 
661  return;
662  }
663 
664 
665  // Another Dunavant rule with all positive weights. This rule has 37
666  // points. The comparable conical product rule would have 49 points.
667  //
668  // It was copied 23rd June 2008 from:
669  // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90
670  //
671  // A second rule with additional precision obtained from the code in:
672  // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
673  // on triangles and tetrahedra" Journal of Computational Mathematics,
674  // v. 27, no. 1, 2009, pp. 89-96.
675  case THIRTEENTH:
676  {
677  const unsigned int n_wts = 9;
678  const Real wts[n_wts] =
679  {
680  Real(3.3980018293415822140887212340442440e-02L),
681  Real(2.7800983765226664353628733005230734e-02L),
682  Real(2.9139242559599990702383541756669905e-02L),
683  Real(3.0261685517695859208964000161454122e-03L),
684  Real(1.1997200964447365386855399725479827e-02L),
685  Real(1.7320638070424185232993414255459110e-02L),
686  Real(7.4827005525828336316229285664517190e-03L),
687  Real(1.2089519905796909568722872786530380e-02L),
688  Real(4.7953405017716313612975450830554457e-03L)
689  };
690 
691  const Real a[n_wts] =
692  {
693  0., // 'a' parameter not used for origin permutation
694  Real(4.2694141425980040602081253503137421e-01L),
695  Real(2.2137228629183290065481255470507908e-01L),
696  Real(2.1509681108843183869291313534052083e-02L),
697  Real(4.8907694645253934990068971909020439e-01L),
698  Real(3.0844176089211777465847185254124531e-01L),
699  Real(1.1092204280346339541286954522167452e-01L),
700  Real(1.6359740106785048023388790171095725e-01L),
701  Real(2.7251581777342966618005046435408685e-01L)
702  };
703 
704  const Real b[n_wts] =
705  {
706  0.,
707  0.,
708  0.,
709  0.,
710  0.,
711  Real(6.2354599555367557081585435318623659e-01L),
712  Real(8.6470777029544277530254595089569318e-01L),
713  Real(7.4850711589995219517301859578870965e-01L),
714  Real(7.2235779312418796526062013230478405e-01L)
715  };
716 
717  const unsigned int permutation_ids[n_wts] = {1, 3, 3, 3, 3, 6, 6, 6, 6}; // 37 total points
718 
719  dunavant_rule2(wts, a, b, permutation_ids, n_wts);
720 
721  return;
722  }
723 
724 
725  // Another Dunavant rule. This rule has 42 points, while
726  // a comparable conical product rule would have 64.
727  //
728  // It was copied 23rd June 2008 from:
729  // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90
730  //
731  // Additional precision obtained from the code in:
732  // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
733  // on triangles and tetrahedra" Journal of Computational Mathematics,
734  // v. 27, no. 1, 2009, pp. 89-96.
735  case FOURTEENTH:
736  {
737  const unsigned int n_wts = 10;
738  const Real wts[n_wts] =
739  {
740  Real(1.0941790684714445320422472981662986e-02L),
741  Real(1.6394176772062675320655489369312672e-02L),
742  Real(2.5887052253645793157392455083198201e-02L),
743  Real(2.1081294368496508769115218662093065e-02L),
744  Real(7.2168498348883338008549607403266583e-03L),
745  Real(2.4617018012000408409130117545210774e-03L),
746  Real(1.2332876606281836981437622591818114e-02L),
747  Real(1.9285755393530341614244513905205430e-02L),
748  Real(7.2181540567669202480443459995079017e-03L),
749  Real(2.5051144192503358849300465412445582e-03L)
750  };
751 
752  const Real a[n_wts] =
753  {
754  Real(4.8896391036217863867737602045239024e-01L),
755  Real(4.1764471934045392250944082218564344e-01L),
756  Real(2.7347752830883865975494428326269856e-01L),
757  Real(1.7720553241254343695661069046505908e-01L),
758  Real(6.1799883090872601267478828436935788e-02L),
759  Real(1.9390961248701048178250095054529511e-02L),
760  Real(1.7226668782135557837528960161365733e-01L),
761  Real(3.3686145979634500174405519708892539e-01L),
762  Real(2.9837288213625775297083151805961273e-01L),
763  Real(1.1897449769695684539818196192990548e-01L)
764  };
765 
766  const Real b[n_wts] =
767  {
768  0.,
769  0.,
770  0.,
771  0.,
772  0.,
773  0.,
774  Real(7.7060855477499648258903327416742796e-01L),
775  Real(5.7022229084668317349769621336235426e-01L),
776  Real(6.8698016780808783735862715402031306e-01L),
777  Real(8.7975717137017112951457163697460183e-01L)
778  };
779 
780  const unsigned int permutation_ids[n_wts]
781  = {3, 3, 3, 3, 3, 3, 6, 6, 6, 6}; // 42 total points
782 
783  dunavant_rule2(wts, a, b, permutation_ids, n_wts);
784 
785  return;
786  }
787 
788 
789  // This 49-point rule was found by me [JWP] using the code in:
790  //
791  // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
792  // on triangles and tetrahedra" Journal of Computational Mathematics,
793  // v. 27, no. 1, 2009, pp. 89-96.
794  //
795  // A 54-point, 15th-order rule is reported by
796  //
797  // Stephen Wandzura, Hong Xiao,
798  // Symmetric Quadrature Rules on a Triangle,
799  // Computers and Mathematics with Applications,
800  // Volume 45, Number 12, June 2003, pages 1829-1840.
801  //
802  // can be found here:
803  // http://people.scs.fsu.edu/~burkardt/f_src/wandzura/wandzura.f90
804  //
805  // but this 49-point rule is superior.
806  case FIFTEENTH:
807  {
808  const unsigned int n_wts = 11;
809  const Real wts[n_wts] =
810  {
811  Real(2.4777380743035579804788826970198951e-02L),
812  Real(9.2433943023307730591540642828347660e-03L),
813  Real(2.2485768962175402793245929133296627e-03L),
814  Real(6.7052581900064143760518398833360903e-03L),
815  Real(1.9011381726930579256700190357527956e-02L),
816  Real(1.4605445387471889398286155981802858e-02L),
817  Real(1.5087322572773133722829435011138258e-02L),
818  Real(1.5630213780078803020711746273129099e-02L),
819  Real(6.1808086085778203192616856133701233e-03L),
820  Real(3.2209366452594664857296985751120513e-03L),
821  Real(5.8747373242569702667677969985668817e-03L)
822  };
823 
824  const Real a[n_wts] =
825  {
826  0.0, // 'a' parameter not used for origin
827  Real(7.9031013655541635005816956762252155e-02L),
828  Real(1.8789501810770077611247984432284226e-02L),
829  Real(4.9250168823249670532514526605352905e-01L),
830  Real(4.0886316907744105975059040108092775e-01L),
831  Real(5.3877851064220142445952549348423733e-01L),
832  Real(2.0250549804829997692885033941362673e-01L),
833  Real(5.5349674918711643207148086558288110e-01L),
834  Real(7.8345022567320812359258882143250181e-01L),
835  Real(8.9514624528794883409864566727625002e-01L),
836  Real(3.2515745241110782862789881780746490e-01L)
837  };
838 
839  const Real b[n_wts] =
840  {
841  0.,
842  0.,
843  0.,
844  0.,
845  0.,
846  Real(1.9412620368774630292701241080996842e-01L),
847  Real(9.8765911355712115933807754318089099e-02L),
848  Real(7.7663767064308164090246588765178087e-02L),
849  Real(2.1594628433980258573654682690950798e-02L),
850  Real(1.2563596287784997705599005477153617e-02L),
851  Real(1.5082654870922784345283124845552190e-02L)
852  };
853 
854  const unsigned int permutation_ids[n_wts]
855  = {1, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6}; // 49 total points
856 
857  dunavant_rule2(wts, a, b, permutation_ids, n_wts);
858 
859  return;
860  }
861 
862 
863 
864 
865  // Dunavant's 16th-order rule contains points outside the region of
866  // integration, and is thus unacceptable for our FEM calculations.
867  //
868  // This 55-point, 16th-order rule was obtained by me [JWP] using the code in
869  //
870  // Additional precision obtained from the code in:
871  // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
872  // on triangles and tetrahedra" Journal of Computational Mathematics,
873  // v. 27, no. 1, 2009, pp. 89-96.
874  //
875  // Note: the 55-point 16th-order rule obtained by Zhang in the paper above
876  // does not appear to be unique. It is a solution in the sense that it
877  // minimizes the error in the least-squares minimization problem, but
878  // it involves too many unknowns and the Jacobian is therefore singular
879  // when attempting to improve the solution via Newton's method.
880  case SIXTEENTH:
881  {
882  const unsigned int n_wts = 12;
883  const Real wts[n_wts] =
884  {
885  Real(2.2668082505910087151996321171534230e-02L),
886  Real(8.4043060714818596159798961899306135e-03L),
887  Real(1.0850949634049747713966288634484161e-03L),
888  Real(7.2252773375423638869298219383808751e-03L),
889  Real(1.2997715227338366024036316182572871e-02L),
890  Real(2.0054466616677715883228810959112227e-02L),
891  Real(9.7299841600417010281624372720122710e-03L),
892  Real(1.1651974438298104227427176444311766e-02L),
893  Real(9.1291185550484450744725847363097389e-03L),
894  Real(3.5568614040947150231712567900113671e-03L),
895  Real(5.8355861686234326181790822005304303e-03L),
896  Real(4.7411314396804228041879331486234396e-03L)
897  };
898 
899  const Real a[n_wts] =
900  {
901  0.0, // 'a' parameter not used for centroid weight
902  Real(8.5402539407933203673769900926355911e-02L),
903  Real(1.2425572001444092841183633409631260e-02L),
904  Real(4.9174838341891594024701017768490960e-01L),
905  Real(4.5669426695387464162068900231444462e-01L),
906  Real(4.8506759880447437974189793537259677e-01L),
907  Real(2.0622099278664205707909858461264083e-01L),
908  Real(3.2374950270039093446805340265853956e-01L),
909  Real(7.3834330556606586255186213302750029e-01L),
910  Real(9.1210673061680792565673823935174611e-01L),
911  Real(6.6129919222598721544966837350891531e-01L),
912  Real(1.7807138906021476039088828811346122e-01L)
913  };
914 
915  const Real b[n_wts] =
916  {
917  0.0,
918  0.0,
919  0.0,
920  0.0,
921  0.0,
922  Real(3.2315912848634384647700266402091638e-01L),
923  Real(1.5341553679414688425981898952416987e-01L),
924  Real(7.4295478991330687632977899141707872e-02L),
925  Real(7.1278762832147862035977841733532020e-02L),
926  Real(1.6623223223705792825395256602140459e-02L),
927  Real(1.4160772533794791868984026749196156e-02L),
928  Real(1.4539694958941854654807449467759690e-02L)
929  };
930 
931  const unsigned int permutation_ids[n_wts]
932  = {1, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6}; // 55 total points
933 
934  dunavant_rule2(wts, a, b, permutation_ids, n_wts);
935 
936  return;
937  }
938 
939 
940  // Dunavant's 17th-order rule has 61 points, while a
941  // comparable conical product rule would have 81 (16th and 17th orders).
942  //
943  // It can be found here:
944  // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90
945  //
946  // Zhang reports an identical rule in:
947  // L. Zhang, T. Cui, and H. Liu. "A set of symmetric quadrature rules
948  // on triangles and tetrahedra" Journal of Computational Mathematics,
949  // v. 27, no. 1, 2009, pp. 89-96.
950  //
951  // Note: the 61-point 17th-order rule obtained by Dunavant and Zhang
952  // does not appear to be unique. It is a solution in the sense that it
953  // minimizes the error in the least-squares minimization problem, but
954  // it involves too many unknowns and the Jacobian is therefore singular
955  // when attempting to improve the solution via Newton's method.
956  //
957  // Therefore, we prefer the following 63-point rule which
958  // I [JWP] found. It appears to be more accurate than the
959  // rule reported by Dunavant and Zhang, even though it has
960  // a few more points.
961  case SEVENTEENTH:
962  {
963  const unsigned int n_wts = 12;
964  const Real wts[n_wts] =
965  {
966  Real(1.7464603792572004485690588092246146e-02L),
967  Real(5.9429003555801725246549713984660076e-03L),
968  Real(1.2490753345169579649319736639588729e-02L),
969  Real(1.5386987188875607593083456905596468e-02L),
970  Real(1.1185807311917706362674684312990270e-02L),
971  Real(1.0301845740670206831327304917180007e-02L),
972  Real(1.1767783072977049696840016810370464e-02L),
973  Real(3.8045312849431209558329128678945240e-03L),
974  Real(4.5139302178876351271037137230354382e-03L),
975  Real(2.2178812517580586419412547665472893e-03L),
976  Real(5.2216271537483672304731416553063103e-03L),
977  Real(9.8381136389470256422419930926212114e-04L)
978  };
979 
980  const Real a[n_wts] =
981  {
982  Real(2.8796825754667362165337965123570514e-01L),
983  Real(4.9216175986208465345536805750663939e-01L),
984  Real(4.6252866763171173685916780827044612e-01L),
985  Real(1.6730292951631792248498303276090273e-01L),
986  Real(1.5816335500814652972296428532213019e-01L),
987  Real(1.6352252138387564873002458959679529e-01L),
988  Real(6.2447680488959768233910286168417367e-01L),
989  Real(8.7317249935244454285263604347964179e-01L),
990  Real(3.4428164322282694677972239461699271e-01L),
991  Real(9.1584484467813674010523309855340209e-02L),
992  Real(2.0172088013378989086826623852040632e-01L),
993  Real(9.6538762758254643474731509845084691e-01L)
994  };
995 
996  const Real b[n_wts] =
997  {
998  0.0,
999  0.0,
1000  0.0,
1001  Real(3.4429160695501713926320695771253348e-01L),
1002  Real(2.2541623431550639817203145525444726e-01L),
1003  Real(8.0670083153531811694942222940484991e-02L),
1004  Real(6.5967451375050925655738829747288190e-02L),
1005  Real(4.5677879890996762665044366994439565e-02L),
1006  Real(1.1528411723154215812386518751976084e-02L),
1007  Real(9.3057714323900610398389176844165892e-03L),
1008  Real(1.5916814107619812717966560404970160e-02L),
1009  Real(1.0734733163764032541125434215228937e-02L)
1010  };
1011 
1012  const unsigned int permutation_ids[n_wts]
1013  = {3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6}; // 63 total points
1014 
1015  dunavant_rule2(wts, a, b, permutation_ids, n_wts);
1016 
1017  return;
1018 
1019  // _points.resize (61);
1020  // _weights.resize(61);
1021 
1022  // // The raw data for the quadrature rule.
1023  // const Real p[15][4] = {
1024  // { 1./3., 0., 0., 0.033437199290803e+00 / 2.0}, // 1-perm
1025  // {0.005658918886452e+00, 0.497170540556774e+00, 0., 0.005093415440507e+00 / 2.0}, // 3-perm
1026  // {0.035647354750751e+00, 0.482176322624625e+00, 0., 0.014670864527638e+00 / 2.0}, // 3-perm
1027  // {0.099520061958437e+00, 0.450239969020782e+00, 0., 0.024350878353672e+00 / 2.0}, // 3-perm
1028  // {0.199467521245206e+00, 0.400266239377397e+00, 0., 0.031107550868969e+00 / 2.0}, // 3-perm
1029  // {0.495717464058095e+00, 0.252141267970953e+00, 0., 0.031257111218620e+00 / 2.0}, // 3-perm
1030  // {0.675905990683077e+00, 0.162047004658461e+00, 0., 0.024815654339665e+00 / 2.0}, // 3-perm
1031  // {0.848248235478508e+00, 0.075875882260746e+00, 0., 0.014056073070557e+00 / 2.0}, // 3-perm
1032  // {0.968690546064356e+00, 0.015654726967822e+00, 0., 0.003194676173779e+00 / 2.0}, // 3-perm
1033  // {0.010186928826919e+00, 0.334319867363658e+00, 0.655493203809423e+00, 0.008119655318993e+00 / 2.0}, // 6-perm
1034  // {0.135440871671036e+00, 0.292221537796944e+00, 0.572337590532020e+00, 0.026805742283163e+00 / 2.0}, // 6-perm
1035  // {0.054423924290583e+00, 0.319574885423190e+00, 0.626001190286228e+00, 0.018459993210822e+00 / 2.0}, // 6-perm
1036  // {0.012868560833637e+00, 0.190704224192292e+00, 0.796427214974071e+00, 0.008476868534328e+00 / 2.0}, // 6-perm
1037  // {0.067165782413524e+00, 0.180483211648746e+00, 0.752351005937729e+00, 0.018292796770025e+00 / 2.0}, // 6-perm
1038  // {0.014663182224828e+00, 0.080711313679564e+00, 0.904625504095608e+00, 0.006665632004165e+00 / 2.0} // 6-perm
1039  // };
1040 
1041 
1042  // // Now call the dunavant routine to generate _points and _weights
1043  // dunavant_rule(p, 15);
1044 
1045  // return;
1046  }
1047 
1048 
1049 
1050  // Dunavant's 18th-order rule contains points outside the region and is therefore unsuitable
1051  // for our FEM calculations. His 19th-order rule has 73 points, compared with 100 points for
1052  // a comparable-order conical product rule.
1053  //
1054  // It was copied 23rd June 2008 from:
1055  // http://people.scs.fsu.edu/~burkardt/f_src/dunavant/dunavant.f90
1056  case EIGHTTEENTH:
1057  case NINETEENTH:
1058  {
1059  _points.resize (73);
1060  _weights.resize(73);
1061 
1062  // The raw data for the quadrature rule.
1063  const Real rule_data[17][4] = {
1064  { 1./3., 0., 0., 0.032906331388919e+00 / 2.0}, // 1-perm
1065  {0.020780025853987e+00, 0.489609987073006e+00, 0., 0.010330731891272e+00 / 2.0}, // 3-perm
1066  {0.090926214604215e+00, 0.454536892697893e+00, 0., 0.022387247263016e+00 / 2.0}, // 3-perm
1067  {0.197166638701138e+00, 0.401416680649431e+00, 0., 0.030266125869468e+00 / 2.0}, // 3-perm
1068  {0.488896691193805e+00, 0.255551654403098e+00, 0., 0.030490967802198e+00 / 2.0}, // 3-perm
1069  {0.645844115695741e+00, 0.177077942152130e+00, 0., 0.024159212741641e+00 / 2.0}, // 3-perm
1070  {0.779877893544096e+00, 0.110061053227952e+00, 0., 0.016050803586801e+00 / 2.0}, // 3-perm
1071  {0.888942751496321e+00, 0.055528624251840e+00, 0., 0.008084580261784e+00 / 2.0}, // 3-perm
1072  {0.974756272445543e+00, 0.012621863777229e+00, 0., 0.002079362027485e+00 / 2.0}, // 3-perm
1073  {0.003611417848412e+00, 0.395754787356943e+00, 0.600633794794645e+00, 0.003884876904981e+00 / 2.0}, // 6-perm
1074  {0.134466754530780e+00, 0.307929983880436e+00, 0.557603261588784e+00, 0.025574160612022e+00 / 2.0}, // 6-perm
1075  {0.014446025776115e+00, 0.264566948406520e+00, 0.720987025817365e+00, 0.008880903573338e+00 / 2.0}, // 6-perm
1076  {0.046933578838178e+00, 0.358539352205951e+00, 0.594527068955871e+00, 0.016124546761731e+00 / 2.0}, // 6-perm
1077  {0.002861120350567e+00, 0.157807405968595e+00, 0.839331473680839e+00, 0.002491941817491e+00 / 2.0}, // 6-perm
1078  {0.223861424097916e+00, 0.075050596975911e+00, 0.701087978926173e+00, 0.018242840118951e+00 / 2.0}, // 6-perm
1079  {0.034647074816760e+00, 0.142421601113383e+00, 0.822931324069857e+00, 0.010258563736199e+00 / 2.0}, // 6-perm
1080  {0.010161119296278e+00, 0.065494628082938e+00, 0.924344252620784e+00, 0.003799928855302e+00 / 2.0} // 6-perm
1081  };
1082 
1083 
1084  // Now call the dunavant routine to generate _points and _weights
1085  dunavant_rule(rule_data, 17);
1086 
1087  return;
1088  }
1089 
1090 
1091  // 20th-order rule by Wandzura.
1092  //
1093  // Stephen Wandzura, Hong Xiao,
1094  // Symmetric Quadrature Rules on a Triangle,
1095  // Computers and Mathematics with Applications,
1096  // Volume 45, Number 12, June 2003, pages 1829-1840.
1097  //
1098  // Wandzura's work extends the work of Dunavant by providing degree
1099  // 5,10,15,20,25, and 30 rules with positive weights for the triangle.
1100  //
1101  // Copied on 3rd July 2008 from:
1102  // http://people.scs.fsu.edu/~burkardt/f_src/wandzura/wandzura.f90
1103  case TWENTIETH:
1104  {
1105  // The equivalent conical product rule would have 121 points
1106  _points.resize (85);
1107  _weights.resize(85);
1108 
1109  // The raw data for the quadrature rule.
1110  const Real rule_data[19][4] = {
1111  {0.33333333333333e+00, 0.0, 0.0, 0.2761042699769952e-01 / 2.0}, // 1-perm
1112  {0.00150064932443e+00, 0.49924967533779e+00, 0.0, 0.1779029547326740e-02 / 2.0}, // 3-perm
1113  {0.09413975193895e+00, 0.45293012403052e+00, 0.0, 0.2011239811396117e-01 / 2.0}, // 3-perm
1114  {0.20447212408953e+00, 0.39776393795524e+00, 0.0, 0.2681784725933157e-01 / 2.0}, // 3-perm
1115  {0.47099959493443e+00, 0.26450020253279e+00, 0.0, 0.2452313380150201e-01 / 2.0}, // 3-perm
1116  {0.57796207181585e+00, 0.21101896409208e+00, 0.0, 0.1639457841069539e-01 / 2.0}, // 3-perm
1117  {0.78452878565746e+00, 0.10773560717127e+00, 0.0, 0.1479590739864960e-01 / 2.0}, // 3-perm
1118  {0.92186182432439e+00, 0.03906908783780e+00, 0.0, 0.4579282277704251e-02 / 2.0}, // 3-perm
1119  {0.97765124054134e+00, 0.01117437972933e+00, 0.0, 0.1651826515576217e-02 / 2.0}, // 3-perm
1120  {0.00534961818734e+00, 0.06354966590835e+00, 0.93110071590431e+00, 0.2349170908575584e-02 / 2.0}, // 6-perm
1121  {0.00795481706620e+00, 0.15710691894071e+00, 0.83493826399309e+00, 0.4465925754181793e-02 / 2.0}, // 6-perm
1122  {0.01042239828126e+00, 0.39564211436437e+00, 0.59393548735436e+00, 0.6099566807907972e-02 / 2.0}, // 6-perm
1123  {0.01096441479612e+00, 0.27316757071291e+00, 0.71586801449097e+00, 0.6891081327188203e-02 / 2.0}, // 6-perm
1124  {0.03856671208546e+00, 0.10178538248502e+00, 0.85964790542952e+00, 0.7997475072478163e-02 / 2.0}, // 6-perm
1125  {0.03558050781722e+00, 0.44665854917641e+00, 0.51776094300637e+00, 0.7386134285336024e-02 / 2.0}, // 6-perm
1126  {0.04967081636276e+00, 0.19901079414950e+00, 0.75131838948773e+00, 0.1279933187864826e-01 / 2.0}, // 6-perm
1127  {0.05851972508433e+00, 0.32426118369228e+00, 0.61721909122339e+00, 0.1725807117569655e-01 / 2.0}, // 6-perm
1128  {0.12149778700439e+00, 0.20853136321013e+00, 0.66997084978547e+00, 0.1867294590293547e-01 / 2.0}, // 6-perm
1129  {0.14071084494394e+00, 0.32317056653626e+00, 0.53611858851980e+00, 0.2281822405839526e-01 / 2.0} // 6-perm
1130  };
1131 
1132 
1133  // Now call the dunavant routine to generate _points and _weights
1134  dunavant_rule(rule_data, 19);
1135 
1136  return;
1137  }
1138 
1139 
1140 
1141  // 25th-order rule by Wandzura.
1142  //
1143  // Stephen Wandzura, Hong Xiao,
1144  // Symmetric Quadrature Rules on a Triangle,
1145  // Computers and Mathematics with Applications,
1146  // Volume 45, Number 12, June 2003, pages 1829-1840.
1147  //
1148  // Wandzura's work extends the work of Dunavant by providing degree
1149  // 5,10,15,20,25, and 30 rules with positive weights for the triangle.
1150  //
1151  // Copied on 3rd July 2008 from:
1152  // http://people.scs.fsu.edu/~burkardt/f_src/wandzura/wandzura.f90
1153  // case TWENTYFIRST: // fall through to 121 point conical product rule below
1154  case TWENTYSECOND:
1155  case TWENTYTHIRD:
1156  case TWENTYFOURTH:
1157  case TWENTYFIFTH:
1158  {
1159  // The equivalent conical product rule would have 169 points
1160  _points.resize (126);
1161  _weights.resize(126);
1162 
1163  // The raw data for the quadrature rule.
1164  const Real rule_data[26][4] = {
1165  {0.02794648307317e+00, 0.48602675846341e+00, 0.0, 0.8005581880020417e-02 / 2.0}, // 3-perm
1166  {0.13117860132765e+00, 0.43441069933617e+00, 0.0, 0.1594707683239050e-01 / 2.0}, // 3-perm
1167  {0.22022172951207e+00, 0.38988913524396e+00, 0.0, 0.1310914123079553e-01 / 2.0}, // 3-perm
1168  {0.40311353196039e+00, 0.29844323401980e+00, 0.0, 0.1958300096563562e-01 / 2.0}, // 3-perm
1169  {0.53191165532526e+00, 0.23404417233737e+00, 0.0, 0.1647088544153727e-01 / 2.0}, // 3-perm
1170  {0.69706333078196e+00, 0.15146833460902e+00, 0.0, 0.8547279074092100e-02 / 2.0}, // 3-perm
1171  {0.77453221290801e+00, 0.11273389354599e+00, 0.0, 0.8161885857226492e-02 / 2.0}, // 3-perm
1172  {0.84456861581695e+00, 0.07771569209153e+00, 0.0, 0.6121146539983779e-02 / 2.0}, // 3-perm
1173  {0.93021381277141e+00, 0.03489309361430e+00, 0.0, 0.2908498264936665e-02 / 2.0}, // 3-perm
1174  {0.98548363075813e+00, 0.00725818462093e+00, 0.0, 0.6922752456619963e-03 / 2.0}, // 3-perm
1175  {0.00129235270444e+00, 0.22721445215336e+00, 0.77149319514219e+00, 0.1248289199277397e-02 / 2.0}, // 6-perm
1176  {0.00539970127212e+00, 0.43501055485357e+00, 0.55958974387431e+00, 0.3404752908803022e-02 / 2.0}, // 6-perm
1177  {0.00638400303398e+00, 0.32030959927220e+00, 0.67330639769382e+00, 0.3359654326064051e-02 / 2.0}, // 6-perm
1178  {0.00502821150199e+00, 0.09175032228001e+00, 0.90322146621800e+00, 0.1716156539496754e-02 / 2.0}, // 6-perm
1179  {0.00682675862178e+00, 0.03801083585872e+00, 0.95516240551949e+00, 0.1480856316715606e-02 / 2.0}, // 6-perm
1180  {0.01001619963993e+00, 0.15742521848531e+00, 0.83255858187476e+00, 0.3511312610728685e-02 / 2.0}, // 6-perm
1181  {0.02575781317339e+00, 0.23988965977853e+00, 0.73435252704808e+00, 0.7393550149706484e-02 / 2.0}, // 6-perm
1182  {0.03022789811992e+00, 0.36194311812606e+00, 0.60782898375402e+00, 0.7983087477376558e-02 / 2.0}, // 6-perm
1183  {0.03050499010716e+00, 0.08355196095483e+00, 0.88594304893801e+00, 0.4355962613158041e-02 / 2.0}, // 6-perm
1184  {0.04595654736257e+00, 0.14844322073242e+00, 0.80560023190501e+00, 0.7365056701417832e-02 / 2.0}, // 6-perm
1185  {0.06744280054028e+00, 0.28373970872753e+00, 0.64881749073219e+00, 0.1096357284641955e-01 / 2.0}, // 6-perm
1186  {0.07004509141591e+00, 0.40689937511879e+00, 0.52305553346530e+00, 0.1174996174354112e-01 / 2.0}, // 6-perm
1187  {0.08391152464012e+00, 0.19411398702489e+00, 0.72197448833499e+00, 0.1001560071379857e-01 / 2.0}, // 6-perm
1188  {0.12037553567715e+00, 0.32413434700070e+00, 0.55549011732214e+00, 0.1330964078762868e-01 / 2.0}, // 6-perm
1189  {0.14806689915737e+00, 0.22927748355598e+00, 0.62265561728665e+00, 0.1415444650522614e-01 / 2.0}, // 6-perm
1190  {0.19177186586733e+00, 0.32561812259598e+00, 0.48261001153669e+00, 0.1488137956116801e-01 / 2.0} // 6-perm
1191  };
1192 
1193 
1194  // Now call the dunavant routine to generate _points and _weights
1195  dunavant_rule(rule_data, 26);
1196 
1197  return;
1198  }
1199 
1200 
1201 
1202  // 30th-order rule by Wandzura.
1203  //
1204  // Stephen Wandzura, Hong Xiao,
1205  // Symmetric Quadrature Rules on a Triangle,
1206  // Computers and Mathematics with Applications,
1207  // Volume 45, Number 12, June 2003, pages 1829-1840.
1208  //
1209  // Wandzura's work extends the work of Dunavant by providing degree
1210  // 5,10,15,20,25, and 30 rules with positive weights for the triangle.
1211  //
1212  // Copied on 3rd July 2008 from:
1213  // http://people.scs.fsu.edu/~burkardt/f_src/wandzura/wandzura.f90
1214  case TWENTYSIXTH:
1215  case TWENTYSEVENTH:
1216  case TWENTYEIGHTH:
1217  case TWENTYNINTH:
1218  case THIRTIETH:
1219  {
1220  // The equivalent conical product rule would have 256 points
1221  _points.resize (175);
1222  _weights.resize(175);
1223 
1224  // The raw data for the quadrature rule.
1225  const Real rule_data[36][4] = {
1226  {0.33333333333333e+00, 0.0, 0.0, 0.1557996020289920e-01 / 2.0}, // 1-perm
1227  {0.00733011643277e+00, 0.49633494178362e+00, 0.0, 0.3177233700534134e-02 / 2.0}, // 3-perm
1228  {0.08299567580296e+00, 0.45850216209852e+00, 0.0, 0.1048342663573077e-01 / 2.0}, // 3-perm
1229  {0.15098095612541e+00, 0.42450952193729e+00, 0.0, 0.1320945957774363e-01 / 2.0}, // 3-perm
1230  {0.23590585989217e+00, 0.38204707005392e+00, 0.0, 0.1497500696627150e-01 / 2.0}, // 3-perm
1231  {0.43802430840785e+00, 0.28098784579608e+00, 0.0, 0.1498790444338419e-01 / 2.0}, // 3-perm
1232  {0.54530204829193e+00, 0.22734897585403e+00, 0.0, 0.1333886474102166e-01 / 2.0}, // 3-perm
1233  {0.65088177698254e+00, 0.17455911150873e+00, 0.0, 0.1088917111390201e-01 / 2.0}, // 3-perm
1234  {0.75348314559713e+00, 0.12325842720144e+00, 0.0, 0.8189440660893461e-02 / 2.0}, // 3-perm
1235  {0.83983154221561e+00, 0.08008422889220e+00, 0.0, 0.5575387588607785e-02 / 2.0}, // 3-perm
1236  {0.90445106518420e+00, 0.04777446740790e+00, 0.0, 0.3191216473411976e-02 / 2.0}, // 3-perm
1237  {0.95655897063972e+00, 0.02172051468014e+00, 0.0, 0.1296715144327045e-02 / 2.0}, // 3-perm
1238  {0.99047064476913e+00, 0.00476467761544e+00, 0.0, 0.2982628261349172e-03 / 2.0}, // 3-perm
1239  {0.00092537119335e+00, 0.41529527091331e+00, 0.58377935789334e+00, 0.9989056850788964e-03 / 2.0}, // 6-perm
1240  {0.00138592585556e+00, 0.06118990978535e+00, 0.93742416435909e+00, 0.4628508491732533e-03 / 2.0}, // 6-perm
1241  {0.00368241545591e+00, 0.16490869013691e+00, 0.83140889440718e+00, 0.1234451336382413e-02 / 2.0}, // 6-perm
1242  {0.00390322342416e+00, 0.02503506223200e+00, 0.97106171434384e+00, 0.5707198522432062e-03 / 2.0}, // 6-perm
1243  {0.00323324815501e+00, 0.30606446515110e+00, 0.69070228669389e+00, 0.1126946125877624e-02 / 2.0}, // 6-perm
1244  {0.00646743211224e+00, 0.10707328373022e+00, 0.88645928415754e+00, 0.1747866949407337e-02 / 2.0}, // 6-perm
1245  {0.00324747549133e+00, 0.22995754934558e+00, 0.76679497516308e+00, 0.1182818815031657e-02 / 2.0}, // 6-perm
1246  {0.00867509080675e+00, 0.33703663330578e+00, 0.65428827588746e+00, 0.1990839294675034e-02 / 2.0}, // 6-perm
1247  {0.01559702646731e+00, 0.05625657618206e+00, 0.92814639735063e+00, 0.1900412795035980e-02 / 2.0}, // 6-perm
1248  {0.01797672125369e+00, 0.40245137521240e+00, 0.57957190353391e+00, 0.4498365808817451e-02 / 2.0}, // 6-perm
1249  {0.01712424535389e+00, 0.24365470201083e+00, 0.73922105263528e+00, 0.3478719460274719e-02 / 2.0}, // 6-perm
1250  {0.02288340534658e+00, 0.16538958561453e+00, 0.81172700903888e+00, 0.4102399036723953e-02 / 2.0}, // 6-perm
1251  {0.03273759728777e+00, 0.09930187449585e+00, 0.86796052821639e+00, 0.4021761549744162e-02 / 2.0}, // 6-perm
1252  {0.03382101234234e+00, 0.30847833306905e+00, 0.65770065458860e+00, 0.6033164660795066e-02 / 2.0}, // 6-perm
1253  {0.03554761446002e+00, 0.46066831859211e+00, 0.50378406694787e+00, 0.3946290302129598e-02 / 2.0}, // 6-perm
1254  {0.05053979030687e+00, 0.21881529945393e+00, 0.73064491023920e+00, 0.6644044537680268e-02 / 2.0}, // 6-perm
1255  {0.05701471491573e+00, 0.37920955156027e+00, 0.56377573352399e+00, 0.8254305856078458e-02 / 2.0}, // 6-perm
1256  {0.06415280642120e+00, 0.14296081941819e+00, 0.79288637416061e+00, 0.6496056633406411e-02 / 2.0}, // 6-perm
1257  {0.08050114828763e+00, 0.28373128210592e+00, 0.63576756960645e+00, 0.9252778144146602e-02 / 2.0}, // 6-perm
1258  {0.10436706813453e+00, 0.19673744100444e+00, 0.69889549086103e+00, 0.9164920726294280e-02 / 2.0}, // 6-perm
1259  {0.11384489442875e+00, 0.35588914121166e+00, 0.53026596435959e+00, 0.1156952462809767e-01 / 2.0}, // 6-perm
1260  {0.14536348771552e+00, 0.25981868535191e+00, 0.59481782693256e+00, 0.1176111646760917e-01 / 2.0}, // 6-perm
1261  {0.18994565282198e+00, 0.32192318123130e+00, 0.48813116594672e+00, 0.1382470218216540e-01 / 2.0} // 6-perm
1262  };
1263 
1264 
1265  // Now call the dunavant routine to generate _points and _weights
1266  dunavant_rule(rule_data, 36);
1267 
1268  return;
1269  }
1270 
1271 
1272  // By default, we fall back on the conical product rules. If the user
1273  // requests an order higher than what is currently available in the 1D
1274  // rules, an error will be thrown from the respective 1D code.
1275  default:
1276  {
1277  // The following quadrature rules are generated as
1278  // conical products. These tend to be non-optimal
1279  // (use too many points, cluster points in certain
1280  // regions of the domain) but they are quite easy to
1281  // automatically generate using a 1D Gauss rule on
1282  // [0,1] and two 1D Jacobi-Gauss rules on [0,1].
1283  QConical conical_rule(2, _order);
1284  conical_rule.init(_type, _p_level);
1285 
1286  // Swap points and weights with the about-to-be destroyed rule.
1287  _points.swap (conical_rule.get_points() );
1288  _weights.swap(conical_rule.get_weights());
1289 
1290  return;
1291  }
1292  }
1293  }
1294 
1295 
1296  //---------------------------------------------
1297  // Unsupported type
1298  default:
1299  libmesh_error_msg("Element type not supported:" << Utility::enum_to_string(_type));
1300  }
1301 #endif
1302 }
ElemType _type
The type of element for which the current values have been computed.
Definition: quadrature.h:371
ADRealEigenVector< T, D, asd > sqrt(const ADRealEigenVector< T, D, asd > &)
Definition: type_vector.h:53
std::vector< Point > _points
The locations of the quadrature points in reference element space.
Definition: quadrature.h:383
std::vector< Real > _weights
The quadrature weights.
Definition: quadrature.h:389
unsigned int _p_level
The p-level of the element for which the current values have been computed.
Definition: quadrature.h:377
void dunavant_rule2(const Real *wts, const Real *a, const Real *b, const unsigned int *permutation_ids, const unsigned int n_wts)
Order get_order() const
Definition: quadrature.h:218
void dunavant_rule(const Real rule_data[][4], const unsigned int n_pts)
The Dunavant rules are for triangles.
std::string enum_to_string(const T e)
Order _order
The polynomial order which the quadrature rule is capable of integrating exactly. ...
Definition: quadrature.h:365
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
QGauss(unsigned int dim, Order order=INVALID_ORDER)
Constructor.
void tensor_product_quad(const QBase &q1D)
Constructs a 2D rule from the tensor product of q1D with itself.
Definition: quadrature.C:176

◆ init_3D()

void libMesh::QGauss::init_3D ( const ElemType  type,
unsigned int  p_level 
)
overrideprivatevirtual

Initializes the 3D quadrature rule by filling the points and weights vectors with the appropriate values.

The order of the rule will be defined by the implementing class. Should not be pure virtual since a derived quadrature rule may only be defined in 1D. If not overridden, throws an error.

Note
The arguments should no longer be used for anything in derived classes, they are only maintained for backwards compatibility and will eventually be removed.

Reimplemented from libMesh::QBase.

Definition at line 29 of file quadrature_gauss_3D.C.

References libMesh::QBase::_order, libMesh::QBase::_p_level, libMesh::QBase::_points, libMesh::QBase::_type, libMesh::QBase::_weights, libMesh::QBase::allow_rules_with_negative_weights, libMesh::CONSTANT, libMesh::EDGE2, libMesh::EIGHTH, libMesh::Utility::enum_to_string(), libMesh::FIFTH, libMesh::FIRST, libMesh::FOURTH, libMesh::QBase::get_order(), libMesh::QBase::get_points(), libMesh::QBase::get_weights(), libMesh::HEX20, libMesh::HEX27, libMesh::HEX8, libMesh::QBase::init(), keast_rule(), libMesh::PRISM15, libMesh::PRISM18, libMesh::PRISM20, libMesh::PRISM21, libMesh::PRISM6, libMesh::PYRAMID13, libMesh::PYRAMID14, libMesh::PYRAMID18, libMesh::PYRAMID5, libMesh::Real, libMesh::SECOND, libMesh::SEVENTH, libMesh::SIXTH, libMesh::QBase::tensor_product_hex(), libMesh::QBase::tensor_product_prism(), libMesh::TET10, libMesh::TET14, libMesh::TET4, libMesh::THIRD, and libMesh::TRI3.

30 {
31 #if LIBMESH_DIM == 3
32 
33  //-----------------------------------------------------------------------
34  // 3D quadrature rules
35  switch (_type)
36  {
37  //---------------------------------------------
38  // Hex quadrature rules
39  case HEX8:
40  case HEX20:
41  case HEX27:
42  {
43  // We compute the 3D quadrature rule as a tensor
44  // product of the 1D quadrature rule.
45  QGauss q1D(1, _order);
46  q1D.init(EDGE2, _p_level);
47  tensor_product_hex( q1D );
48  return;
49  }
50 
51 
52 
53  //---------------------------------------------
54  // Tetrahedral quadrature rules
55  case TET4:
56  case TET10:
57  case TET14:
58  {
59  switch(get_order())
60  {
61  // Taken from pg. 222 of "The finite element method," vol. 1
62  // ed. 5 by Zienkiewicz & Taylor
63  case CONSTANT:
64  case FIRST:
65  {
66  // Exact for linears
67  _points.resize(1);
68  _weights.resize(1);
69 
70 
71  _points[0](0) = .25;
72  _points[0](1) = .25;
73  _points[0](2) = .25;
74 
75  _weights[0] = Real(1)/6;
76 
77  return;
78  }
79  case SECOND:
80  {
81  // Exact for quadratics
82  _points.resize(4);
83  _weights.resize(4);
84 
85 
86  const Real a = .585410196624969;
87  const Real b = .138196601125011;
88 
89  _points[0](0) = a;
90  _points[0](1) = b;
91  _points[0](2) = b;
92 
93  _points[1](0) = b;
94  _points[1](1) = a;
95  _points[1](2) = b;
96 
97  _points[2](0) = b;
98  _points[2](1) = b;
99  _points[2](2) = a;
100 
101  _points[3](0) = b;
102  _points[3](1) = b;
103  _points[3](2) = b;
104 
105 
106 
107  _weights[0] = Real(1)/24;
108  _weights[1] = _weights[0];
109  _weights[2] = _weights[0];
110  _weights[3] = _weights[0];
111 
112  return;
113  }
114 
115 
116 
117  // Can be found in the class notes
118  // http://www.cs.rpi.edu/~flaherje/FEM/fem6.ps
119  // by Flaherty.
120  //
121  // Caution: this rule has a negative weight and may be
122  // unsuitable for some problems.
123  // Exact for cubics.
124  //
125  // Note: Keast (see ref. elsewhere in this file) also gives
126  // a third-order rule with positive weights, but it contains points
127  // on the ref. elt. boundary, making it less suitable for FEM calculations.
128  case THIRD:
129  {
131  {
132  _points.resize(5);
133  _weights.resize(5);
134 
135 
136  _points[0](0) = .25;
137  _points[0](1) = .25;
138  _points[0](2) = .25;
139 
140  _points[1](0) = .5;
141  _points[1](1) = Real(1)/6;
142  _points[1](2) = Real(1)/6;
143 
144  _points[2](0) = Real(1)/6;
145  _points[2](1) = .5;
146  _points[2](2) = Real(1)/6;
147 
148  _points[3](0) = Real(1)/6;
149  _points[3](1) = Real(1)/6;
150  _points[3](2) = .5;
151 
152  _points[4](0) = Real(1)/6;
153  _points[4](1) = Real(1)/6;
154  _points[4](2) = Real(1)/6;
155 
156 
157  _weights[0] = Real(-2)/15;
158  _weights[1] = .075;
159  _weights[2] = _weights[1];
160  _weights[3] = _weights[1];
161  _weights[4] = _weights[1];
162 
163  return;
164  } // end if (allow_rules_with_negative_weights)
165  else
166  {
167  // If a rule with positive weights is required, the 2x2x2 conical
168  // product rule is third-order accurate and has less points than
169  // the next-available positive-weight rule at FIFTH order.
170  QConical conical_rule(3, _order);
171  conical_rule.init(_type, _p_level);
172 
173  // Swap points and weights with the about-to-be destroyed rule.
174  _points.swap (conical_rule.get_points() );
175  _weights.swap(conical_rule.get_weights());
176 
177  return;
178  }
179  // Note: if !allow_rules_with_negative_weights, fall through to next case.
180  }
181 
182 
183 
184  // Originally a Keast rule,
185  // Patrick Keast,
186  // Moderate Degree Tetrahedral Quadrature Formulas,
187  // Computer Methods in Applied Mechanics and Engineering,
188  // Volume 55, Number 3, May 1986, pages 339-348.
189  //
190  // Can also be found the class notes
191  // http://www.cs.rpi.edu/~flaherje/FEM/fem6.ps
192  // by Flaherty.
193  //
194  // Caution: this rule has a negative weight and may be
195  // unsuitable for some problems.
196  case FOURTH:
197  {
199  {
200  _points.resize(11);
201  _weights.resize(11);
202 
203  // The raw data for the quadrature rule.
204  const Real rule_data[3][4] = {
205  {0.250000000000000000e+00, 0., 0., -0.131555555555555556e-01}, // 1
206  {0.785714285714285714e+00, 0.714285714285714285e-01, 0., 0.762222222222222222e-02}, // 4
207  {0.399403576166799219e+00, 0., 0.100596423833200785e+00, 0.248888888888888889e-01} // 6
208  };
209 
210 
211  // Now call the keast routine to generate _points and _weights
212  keast_rule(rule_data, 3);
213 
214  return;
215  } // end if (allow_rules_with_negative_weights)
216  // Note: if !allow_rules_with_negative_weights, fall through to next case.
217  }
218 
219  libmesh_fallthrough();
220 
221 
222  // Walkington's fifth-order 14-point rule from
223  // "Quadrature on Simplices of Arbitrary Dimension"
224  //
225  // We originally had a Keast rule here, but this rule had
226  // more points than an equivalent rule by Walkington and
227  // also contained points on the boundary of the ref. elt,
228  // making it less suitable for FEM calculations.
229  case FIFTH:
230  {
231  _points.resize(14);
232  _weights.resize(14);
233 
234  // permutations of these points and suitably-modified versions of
235  // these points are the quadrature point locations
236  const Real a[3] = {0.31088591926330060980, // a1 from the paper
237  0.092735250310891226402, // a2 from the paper
238  0.045503704125649649492}; // a3 from the paper
239 
240  // weights. a[] and wt[] are the only floating-point inputs required
241  // for this rule.
242  const Real wt[3] = {0.018781320953002641800, // w1 from the paper
243  0.012248840519393658257, // w2 from the paper
244  0.0070910034628469110730}; // w3 from the paper
245 
246  // The first two sets of 4 points are formed in a similar manner
247  for (unsigned int i=0; i<2; ++i)
248  {
249  // Where we will insert values into _points and _weights
250  const unsigned int offset=4*i;
251 
252  // Stuff points and weights values into their arrays
253  const Real b = 1. - 3.*a[i];
254 
255  // Here are the permutations. Order of these is not important,
256  // all have the same weight
257  _points[offset + 0] = Point(a[i], a[i], a[i]);
258  _points[offset + 1] = Point(a[i], b, a[i]);
259  _points[offset + 2] = Point( b, a[i], a[i]);
260  _points[offset + 3] = Point(a[i], a[i], b);
261 
262  // These 4 points all have the same weights
263  for (unsigned int j=0; j<4; ++j)
264  _weights[offset + j] = wt[i];
265  } // end for
266 
267 
268  {
269  // The third set contains 6 points and is formed a little differently
270  const unsigned int offset = 8;
271  const Real b = 0.5*(1. - 2.*a[2]);
272 
273  // Here are the permutations. Order of these is not important,
274  // all have the same weight
275  _points[offset + 0] = Point(b , b, a[2]);
276  _points[offset + 1] = Point(b , a[2], a[2]);
277  _points[offset + 2] = Point(a[2], a[2], b);
278  _points[offset + 3] = Point(a[2], b, a[2]);
279  _points[offset + 4] = Point( b, a[2], b);
280  _points[offset + 5] = Point(a[2], b, b);
281 
282  // These 6 points all have the same weights
283  for (unsigned int j=0; j<6; ++j)
284  _weights[offset + j] = wt[2];
285  }
286 
287 
288  // Original rule by Keast, unsuitable because it has points on the
289  // reference element boundary!
290  // _points.resize(15);
291  // _weights.resize(15);
292 
293  // _points[0](0) = 0.25;
294  // _points[0](1) = 0.25;
295  // _points[0](2) = 0.25;
296 
297  // {
298  // const Real a = 0.;
299  // const Real b = Real(1)/3;
300 
301  // _points[1](0) = a;
302  // _points[1](1) = b;
303  // _points[1](2) = b;
304 
305  // _points[2](0) = b;
306  // _points[2](1) = a;
307  // _points[2](2) = b;
308 
309  // _points[3](0) = b;
310  // _points[3](1) = b;
311  // _points[3](2) = a;
312 
313  // _points[4](0) = b;
314  // _points[4](1) = b;
315  // _points[4](2) = b;
316  // }
317  // {
318  // const Real a = Real(8)/11;
319  // const Real b = Real(1)/11;
320 
321  // _points[5](0) = a;
322  // _points[5](1) = b;
323  // _points[5](2) = b;
324 
325  // _points[6](0) = b;
326  // _points[6](1) = a;
327  // _points[6](2) = b;
328 
329  // _points[7](0) = b;
330  // _points[7](1) = b;
331  // _points[7](2) = a;
332 
333  // _points[8](0) = b;
334  // _points[8](1) = b;
335  // _points[8](2) = b;
336  // }
337  // {
338  // const Real a = 0.066550153573664;
339  // const Real b = 0.433449846426336;
340 
341  // _points[9](0) = b;
342  // _points[9](1) = a;
343  // _points[9](2) = a;
344 
345  // _points[10](0) = a;
346  // _points[10](1) = a;
347  // _points[10](2) = b;
348 
349  // _points[11](0) = a;
350  // _points[11](1) = b;
351  // _points[11](2) = b;
352 
353  // _points[12](0) = b;
354  // _points[12](1) = a;
355  // _points[12](2) = b;
356 
357  // _points[13](0) = b;
358  // _points[13](1) = b;
359  // _points[13](2) = a;
360 
361  // _points[14](0) = a;
362  // _points[14](1) = b;
363  // _points[14](2) = a;
364  // }
365 
366  // _weights[0] = 0.030283678097089;
367  // _weights[1] = 0.006026785714286;
368  // _weights[2] = _weights[1];
369  // _weights[3] = _weights[1];
370  // _weights[4] = _weights[1];
371  // _weights[5] = 0.011645249086029;
372  // _weights[6] = _weights[5];
373  // _weights[7] = _weights[5];
374  // _weights[8] = _weights[5];
375  // _weights[9] = 0.010949141561386;
376  // _weights[10] = _weights[9];
377  // _weights[11] = _weights[9];
378  // _weights[12] = _weights[9];
379  // _weights[13] = _weights[9];
380  // _weights[14] = _weights[9];
381 
382  return;
383  }
384 
385 
386 
387 
388  // This rule is originally from Keast:
389  // Patrick Keast,
390  // Moderate Degree Tetrahedral Quadrature Formulas,
391  // Computer Methods in Applied Mechanics and Engineering,
392  // Volume 55, Number 3, May 1986, pages 339-348.
393  //
394  // It is accurate on 6th-degree polynomials and has 24 points
395  // vs. 64 for the comparable conical product rule.
396  //
397  // Values copied 24th June 2008 from:
398  // http://people.scs.fsu.edu/~burkardt/f_src/keast/keast.f90
399  case SIXTH:
400  {
401  _points.resize (24);
402  _weights.resize(24);
403 
404  // The raw data for the quadrature rule.
405  const Real rule_data[4][4] = {
406  {0.356191386222544953e+00 , 0.214602871259151684e+00 , 0., 0.00665379170969464506e+00}, // 4
407  {0.877978124396165982e+00 , 0.0406739585346113397e+00, 0., 0.00167953517588677620e+00}, // 4
408  {0.0329863295731730594e+00, 0.322337890142275646e+00 , 0., 0.00922619692394239843e+00}, // 4
409  {0.0636610018750175299e+00, 0.269672331458315867e+00 , 0.603005664791649076e+00, 0.00803571428571428248e+00} // 12
410  };
411 
412 
413  // Now call the keast routine to generate _points and _weights
414  keast_rule(rule_data, 4);
415 
416  return;
417  }
418 
419 
420  // Keast's 31 point, 7th-order rule contains points on the reference
421  // element boundary, so we've decided not to include it here.
422  //
423  // Keast's 8th-order rule has 45 points. and a negative
424  // weight, so if you've explicitly disallowed such rules
425  // you will fall through to the conical product rules
426  // below.
427  case SEVENTH:
428  case EIGHTH:
429  {
431  {
432  _points.resize (45);
433  _weights.resize(45);
434 
435  // The raw data for the quadrature rule.
436  const Real rule_data[7][4] = {
437  {0.250000000000000000e+00, 0., 0., -0.393270066412926145e-01}, // 1
438  {0.617587190300082967e+00, 0.127470936566639015e+00, 0., 0.408131605934270525e-02}, // 4
439  {0.903763508822103123e+00, 0.320788303926322960e-01, 0., 0.658086773304341943e-03}, // 4
440  {0.497770956432810185e-01, 0., 0.450222904356718978e+00, 0.438425882512284693e-02}, // 6
441  {0.183730447398549945e+00, 0., 0.316269552601450060e+00, 0.138300638425098166e-01}, // 6
442  {0.231901089397150906e+00, 0.229177878448171174e-01, 0.513280033360881072e+00, 0.424043742468372453e-02}, // 12
443  {0.379700484718286102e-01, 0.730313427807538396e+00, 0.193746475248804382e+00, 0.223873973961420164e-02} // 12
444  };
445 
446 
447  // Now call the keast routine to generate _points and _weights
448  keast_rule(rule_data, 7);
449 
450  return;
451  } // end if (allow_rules_with_negative_weights)
452  // Note: if !allow_rules_with_negative_weights, fall through to next case.
453  }
454 
455  libmesh_fallthrough();
456 
457 
458  // Fall back on Grundmann-Moller or Conical Product rules at high orders.
459  default:
460  {
462  {
463  // The Grundmann-Moller rules are defined to arbitrary order and
464  // can have significantly fewer evaluation points than conical product
465  // rules. If you allow rules with negative weights, the GM rules
466  // will be more efficient for degree up to 33 (for degree 34 and
467  // higher, CP is more efficient!) but may be more susceptible
468  // to round-off error. Safest is to disallow rules with negative
469  // weights, but this decision should be made on a case-by-case basis.
470  QGrundmann_Moller gm_rule(3, _order);
471  gm_rule.init(_type, _p_level);
472 
473  // Swap points and weights with the about-to-be destroyed rule.
474  _points.swap (gm_rule.get_points() );
475  _weights.swap(gm_rule.get_weights());
476 
477  return;
478  }
479 
480  else
481  {
482  // The following quadrature rules are generated as
483  // conical products. These tend to be non-optimal
484  // (use too many points, cluster points in certain
485  // regions of the domain) but they are quite easy to
486  // automatically generate using a 1D Gauss rule on
487  // [0,1] and two 1D Jacobi-Gauss rules on [0,1].
488  QConical conical_rule(3, _order);
489  conical_rule.init(_type, _p_level);
490 
491  // Swap points and weights with the about-to-be destroyed rule.
492  _points.swap (conical_rule.get_points() );
493  _weights.swap(conical_rule.get_weights());
494 
495  return;
496  }
497  }
498  }
499  } // end case TET
500 
501 
502 
503  //---------------------------------------------
504  // Prism quadrature rules
505  case PRISM6:
506  case PRISM15:
507  case PRISM18:
508  case PRISM20:
509  case PRISM21:
510  {
511  // We compute the 3D quadrature rule as a tensor
512  // product of the 1D quadrature rule and a 2D
513  // triangle quadrature rule
514 
515  QGauss q1D(1,_order);
516  QGauss q2D(2,_order);
517 
518  // Initialize
519  q1D.init(EDGE2, _p_level);
520  q2D.init(TRI3, _p_level);
521 
522  tensor_product_prism(q1D, q2D);
523 
524  return;
525  }
526 
527 
528 
529  //---------------------------------------------
530  // Pyramid
531  case PYRAMID5:
532  case PYRAMID13:
533  case PYRAMID14:
534  case PYRAMID18:
535  {
536  // We compute the Pyramid rule as a conical product of a
537  // Jacobi rule with alpha==2 on the interval [0,1] two 1D
538  // Gauss rules with suitably modified points. The idea comes
539  // from: Stroud, A.H. "Approximate Calculation of Multiple
540  // Integrals."
541  QConical conical_rule(3, _order);
542  conical_rule.init(_type, _p_level);
543 
544  // Swap points and weights with the about-to-be destroyed rule.
545  _points.swap (conical_rule.get_points() );
546  _weights.swap(conical_rule.get_weights());
547 
548  return;
549 
550  }
551 
552 
553 
554  //---------------------------------------------
555  // Unsupported type
556  default:
557  libmesh_error_msg("ERROR: Unsupported type: " << Utility::enum_to_string(_type));
558  }
559 #endif
560 }
bool allow_rules_with_negative_weights
Flag (default true) controlling the use of quadrature rules with negative weights.
Definition: quadrature.h:261
ElemType _type
The type of element for which the current values have been computed.
Definition: quadrature.h:371
std::vector< Point > _points
The locations of the quadrature points in reference element space.
Definition: quadrature.h:383
std::vector< Real > _weights
The quadrature weights.
Definition: quadrature.h:389
void tensor_product_prism(const QBase &q1D, const QBase &q2D)
Computes the tensor product of a 1D quadrature rule and a 2D quadrature rule.
Definition: quadrature.C:230
unsigned int _p_level
The p-level of the element for which the current values have been computed.
Definition: quadrature.h:377
void tensor_product_hex(const QBase &q1D)
Computes the tensor product quadrature rule [q1D x q1D x q1D] from the 1D rule q1D.
Definition: quadrature.C:203
Order get_order() const
Definition: quadrature.h:218
std::string enum_to_string(const T e)
Order _order
The polynomial order which the quadrature rule is capable of integrating exactly. ...
Definition: quadrature.h:365
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void keast_rule(const Real rule_data[][4], const unsigned int n_pts)
The Keast rules are for tets.
QGauss(unsigned int dim, Order order=INVALID_ORDER)
Constructor.

◆ keast_rule()

void libMesh::QGauss::keast_rule ( const Real  rule_data[][4],
const unsigned int  n_pts 
)
private

The Keast rules are for tets.

This function takes permutation points and weights in a specific format as input and fills the _points and _weights vectors.

Definition at line 43 of file quadrature_gauss.C.

References libMesh::QBase::_points, libMesh::QBase::_weights, and libMesh::Real.

Referenced by init_3D().

45 {
46  // Like the Dunavant rule, the input data should have 4 columns. These columns
47  // have the following format and implied permutations (w=weight).
48  // {a, 0, 0, w} = 1-permutation (a,a,a)
49  // {a, b, 0, w} = 4-permutation (a,b,b), (b,a,b), (b,b,a), (b,b,b)
50  // {a, 0, b, w} = 6-permutation (a,a,b), (a,b,b), (b,b,a), (b,a,b), (b,a,a), (a,b,a)
51  // {a, b, c, w} = 12-permutation (a,a,b), (a,a,c), (b,a,a), (c,a,a), (a,b,a), (a,c,a)
52  // (a,b,c), (a,c,b), (b,a,c), (b,c,a), (c,a,b), (c,b,a)
53 
54  // Always insert into the points & weights vector relative to the offset
55  unsigned int offset=0;
56 
57 
58  for (unsigned int p=0; p<n_pts; ++p)
59  {
60 
61  // There must always be a non-zero entry to start the row
62  libmesh_assert_not_equal_to (rule_data[p][0], static_cast<Real>(0.0));
63 
64  // A zero weight may imply you did not set up the raw data correctly
65  libmesh_assert_not_equal_to (rule_data[p][3], static_cast<Real>(0.0));
66 
67  // What kind of point is this?
68  // One non-zero entry in first 3 cols ? 1-perm (centroid) point = 1
69  // Two non-zero entries in first 3 cols ? 3-perm point = 3
70  // Three non-zero entries ? 6-perm point = 6
71  unsigned int pointtype=1;
72 
73  if (rule_data[p][1] != static_cast<Real>(0.0))
74  {
75  if (rule_data[p][2] != static_cast<Real>(0.0))
76  pointtype = 12;
77  else
78  pointtype = 4;
79  }
80  else
81  {
82  // The second entry is zero. What about the third?
83  if (rule_data[p][2] != static_cast<Real>(0.0))
84  pointtype = 6;
85  }
86 
87 
88  switch (pointtype)
89  {
90  case 1:
91  {
92  // Be sure we have enough space to insert this point
93  libmesh_assert_less (offset + 0, _points.size());
94 
95  const Real a = rule_data[p][0];
96 
97  // The point has only a single permutation (the centroid!)
98  _points[offset + 0] = Point(a,a,a);
99 
100  // The weight is always the last entry in the row.
101  _weights[offset + 0] = rule_data[p][3];
102 
103  offset += pointtype;
104  break;
105  }
106 
107  case 4:
108  {
109  // Be sure we have enough space to insert these points
110  libmesh_assert_less (offset + 3, _points.size());
111 
112  const Real a = rule_data[p][0];
113  const Real b = rule_data[p][1];
114  const Real wt = rule_data[p][3];
115 
116  // Here it's understood the second entry is to be used twice, and
117  // thus there are three possible permutations.
118  _points[offset + 0] = Point(a,b,b);
119  _points[offset + 1] = Point(b,a,b);
120  _points[offset + 2] = Point(b,b,a);
121  _points[offset + 3] = Point(b,b,b);
122 
123  for (unsigned int j=0; j<pointtype; ++j)
124  _weights[offset + j] = wt;
125 
126  offset += pointtype;
127  break;
128  }
129 
130  case 6:
131  {
132  // Be sure we have enough space to insert these points
133  libmesh_assert_less (offset + 5, _points.size());
134 
135  const Real a = rule_data[p][0];
136  const Real b = rule_data[p][2];
137  const Real wt = rule_data[p][3];
138 
139  // Three individual entries with six permutations.
140  _points[offset + 0] = Point(a,a,b);
141  _points[offset + 1] = Point(a,b,b);
142  _points[offset + 2] = Point(b,b,a);
143  _points[offset + 3] = Point(b,a,b);
144  _points[offset + 4] = Point(b,a,a);
145  _points[offset + 5] = Point(a,b,a);
146 
147  for (unsigned int j=0; j<pointtype; ++j)
148  _weights[offset + j] = wt;
149 
150  offset += pointtype;
151  break;
152  }
153 
154 
155  case 12:
156  {
157  // Be sure we have enough space to insert these points
158  libmesh_assert_less (offset + 11, _points.size());
159 
160  const Real a = rule_data[p][0];
161  const Real b = rule_data[p][1];
162  const Real c = rule_data[p][2];
163  const Real wt = rule_data[p][3];
164 
165  // Three individual entries with six permutations.
166  _points[offset + 0] = Point(a,a,b); _points[offset + 6] = Point(a,b,c);
167  _points[offset + 1] = Point(a,a,c); _points[offset + 7] = Point(a,c,b);
168  _points[offset + 2] = Point(b,a,a); _points[offset + 8] = Point(b,a,c);
169  _points[offset + 3] = Point(c,a,a); _points[offset + 9] = Point(b,c,a);
170  _points[offset + 4] = Point(a,b,a); _points[offset + 10] = Point(c,a,b);
171  _points[offset + 5] = Point(a,c,a); _points[offset + 11] = Point(c,b,a);
172 
173  for (unsigned int j=0; j<pointtype; ++j)
174  _weights[offset + j] = wt;
175 
176  offset += pointtype;
177  break;
178  }
179 
180  default:
181  libmesh_error_msg("Don't know what to do with this many permutation points!");
182  }
183 
184  }
185 
186 }
std::vector< Point > _points
The locations of the quadrature points in reference element space.
Definition: quadrature.h:383
std::vector< Real > _weights
The quadrature weights.
Definition: quadrature.h:389
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ n_objects()

static unsigned int libMesh::ReferenceCounter::n_objects ( )
inlinestaticinherited

Prints the number of outstanding (created, but not yet destroyed) objects.

Definition at line 85 of file reference_counter.h.

References libMesh::ReferenceCounter::_n_objects.

Referenced by libMesh::LibMeshInit::~LibMeshInit().

86  { return _n_objects; }
static Threads::atomic< unsigned int > _n_objects
The number of objects.

◆ n_points()

unsigned int libMesh::QBase::n_points ( ) const
inlineinherited
Returns
The number of points associated with the quadrature rule.

Definition at line 123 of file quadrature.h.

References libMesh::QBase::_points, and libMesh::libmesh_assert().

Referenced by libMesh::ExactSolution::_compute_error(), assemble(), assemble_1D(), assemble_divgrad(), assemble_ellipticdg(), assemble_helmholtz(), assemble_poisson(), assemble_shell(), assemble_wave(), assembly_with_dg_fem_context(), AssemblyA0::boundary_assembly(), AssemblyA1::boundary_assembly(), AssemblyF0::boundary_assembly(), AssemblyF1::boundary_assembly(), AssemblyA2::boundary_assembly(), AssemblyF2::boundary_assembly(), A2::boundary_assembly(), A3::boundary_assembly(), F0::boundary_assembly(), Output0::boundary_assembly(), compute_enriched_soln(), libMesh::FirstOrderUnsteadySolver::compute_second_order_eqns(), libMesh::QConical::conical_product_pyramid(), libMesh::QConical::conical_product_tet(), libMesh::QConical::conical_product_tri(), HDGProblem::create_identity_jacobian(), HDGProblem::create_identity_residual(), SecondOrderScalarSystemSecondOrderTimeSolverBase::damping_residual(), SecondOrderScalarSystemFirstOrderTimeSolverBase::damping_residual(), NavierSystem::element_constraint(), CoupledSystem::element_constraint(), PoissonSystem::element_postprocess(), LaplaceSystem::element_postprocess(), LaplaceQoI::element_qoi(), HeatSystem::element_qoi(), LaplaceQoI::element_qoi_derivative(), LaplaceSystem::element_qoi_derivative(), HeatSystem::element_qoi_derivative(), NavierSystem::element_time_derivative(), SolidSystem::element_time_derivative(), PoissonSystem::element_time_derivative(), LaplaceSystem::element_time_derivative(), CurlCurlSystem::element_time_derivative(), ElasticitySystem::element_time_derivative(), L2System::element_time_derivative(), CoupledSystem::element_time_derivative(), HeatSystem::element_time_derivative(), FirstOrderScalarSystemBase::element_time_derivative(), SecondOrderScalarSystemFirstOrderTimeSolverBase::element_time_derivative(), fe_assembly(), A0::interior_assembly(), B::interior_assembly(), M0::interior_assembly(), A1::interior_assembly(), AssemblyA0::interior_assembly(), AcousticsInnerProduct::interior_assembly(), AssemblyA1::interior_assembly(), A2::interior_assembly(), AssemblyA2::interior_assembly(), F0::interior_assembly(), OutputAssembly::interior_assembly(), EIM_IP_assembly::interior_assembly(), EIM_F::interior_assembly(), AssemblyEIM::interior_assembly(), InnerProductAssembly::interior_assembly(), AssemblyF0::interior_assembly(), AssemblyF1::interior_assembly(), Ex6InnerProduct::interior_assembly(), LaplaceYoung::jacobian(), NavierSystem::mass_residual(), ElasticitySystem::mass_residual(), libMesh::FEMPhysics::mass_residual(), FirstOrderScalarSystemBase::mass_residual(), SecondOrderScalarSystemSecondOrderTimeSolverBase::mass_residual(), SecondOrderScalarSystemFirstOrderTimeSolverBase::mass_residual(), libMesh::QBase::print_info(), libMesh::RBEIMEvaluation::project_qp_data_map_onto_system(), LaplaceYoung::residual(), LaplaceSystem::side_constraint(), LaplaceSystem::side_postprocess(), CoupledSystemQoI::side_qoi(), CoupledSystemQoI::side_qoi_derivative(), LaplaceSystem::side_qoi_derivative(), SolidSystem::side_time_derivative(), CurlCurlSystem::side_time_derivative(), ElasticitySystem::side_time_derivative(), libMesh::QBase::size(), libMesh::QBase::tensor_product_hex(), libMesh::QBase::tensor_product_prism(), libMesh::QBase::tensor_product_quad(), and QuadratureTest::testPolynomial().

124  {
125  libmesh_assert (!_points.empty());
126  return cast_int<unsigned int>(_points.size());
127  }
std::vector< Point > _points
The locations of the quadrature points in reference element space.
Definition: quadrature.h:383
libmesh_assert(ctx)

◆ operator=() [1/2]

QGauss& libMesh::QGauss::operator= ( const QGauss )
default

◆ operator=() [2/2]

QGauss& libMesh::QGauss::operator= ( QGauss &&  )
default

◆ print_info() [1/2]

void libMesh::ReferenceCounter::print_info ( std::ostream &  out_stream = libMesh::out)
staticinherited

Prints the reference information, by default to libMesh::out.

Definition at line 81 of file reference_counter.C.

References libMesh::ReferenceCounter::_enable_print_counter, and libMesh::ReferenceCounter::get_info().

Referenced by libMesh::LibMeshInit::~LibMeshInit().

82 {
84  out_stream << ReferenceCounter::get_info();
85 }
static std::string get_info()
Gets a string containing the reference information.
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called...

◆ print_info() [2/2]

void libMesh::QBase::print_info ( std::ostream &  os = libMesh::out) const
inherited

Prints information relevant to the quadrature rule, by default to libMesh::out.

Definition at line 42 of file quadrature.C.

References libMesh::QBase::_points, libMesh::QBase::_weights, libMesh::index_range(), libMesh::libmesh_assert(), libMesh::QBase::n_points(), and libMesh::Real.

Referenced by libMesh::operator<<().

43 {
44  libmesh_assert(!_points.empty());
45  libmesh_assert(!_weights.empty());
46 
47  Real summed_weights=0;
48  os << "N_Q_Points=" << this->n_points() << std::endl << std::endl;
49  for (auto qpoint: index_range(_points))
50  {
51  os << " Point " << qpoint << ":\n"
52  << " "
53  << _points[qpoint]
54  << "\n Weight:\n "
55  << " w=" << _weights[qpoint] << "\n" << std::endl;
56 
57  summed_weights += _weights[qpoint];
58  }
59  os << "Summed Weights: " << summed_weights << std::endl;
60 }
std::vector< Point > _points
The locations of the quadrature points in reference element space.
Definition: quadrature.h:383
std::vector< Real > _weights
The quadrature weights.
Definition: quadrature.h:389
libmesh_assert(ctx)
unsigned int n_points() const
Definition: quadrature.h:123
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:111

◆ qp()

Point libMesh::QBase::qp ( const unsigned int  i) const
inlineinherited
Returns
The \( i^{th} \) quadrature point in reference element space.

Definition at line 171 of file quadrature.h.

References libMesh::QBase::_points.

Referenced by libMesh::QConical::conical_product_pyramid(), libMesh::QConical::conical_product_tet(), libMesh::QConical::conical_product_tri(), libMesh::QBase::tensor_product_hex(), libMesh::QBase::tensor_product_prism(), libMesh::QBase::tensor_product_quad(), and QuadratureTest::testPolynomial().

172  {
173  libmesh_assert_less (i, _points.size());
174  return _points[i];
175  }
std::vector< Point > _points
The locations of the quadrature points in reference element space.
Definition: quadrature.h:383

◆ scale()

void libMesh::QBase::scale ( std::pair< Real, Real old_range,
std::pair< Real, Real new_range 
)
inherited

Maps the points of a 1D quadrature rule defined by "old_range" to another 1D interval defined by "new_range" and scales the weights accordingly.

Definition at line 142 of file quadrature.C.

References libMesh::QBase::_dim, libMesh::QBase::_points, libMesh::QBase::_weights, libMesh::index_range(), and libMesh::Real.

Referenced by libMesh::QConical::conical_product_tet(), and libMesh::QConical::conical_product_tri().

144 {
145  // Make sure we are in 1D
146  libmesh_assert_equal_to (_dim, 1);
147 
148  Real
149  h_new = new_range.second - new_range.first,
150  h_old = old_range.second - old_range.first;
151 
152  // Make sure that we have sane ranges
153  libmesh_assert_greater (h_new, 0.);
154  libmesh_assert_greater (h_old, 0.);
155 
156  // Make sure there are some points
157  libmesh_assert_greater (_points.size(), 0);
158 
159  // Compute the scale factor
160  Real scfact = h_new/h_old;
161 
162  // We're mapping from old_range -> new_range
163  for (auto i : index_range(_points))
164  {
165  _points[i](0) = new_range.first +
166  (_points[i](0) - old_range.first) * scfact;
167 
168  // Scale the weights
169  _weights[i] *= scfact;
170  }
171 }
unsigned int _dim
The spatial dimension of the quadrature rule.
Definition: quadrature.h:359
std::vector< Point > _points
The locations of the quadrature points in reference element space.
Definition: quadrature.h:383
std::vector< Real > _weights
The quadrature weights.
Definition: quadrature.h:389
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition: int_range.h:111

◆ shapes_need_reinit()

virtual bool libMesh::QBase::shapes_need_reinit ( )
inlinevirtualinherited
Returns
true if the shape functions need to be recalculated, false otherwise.

This may be required if the number of quadrature points or their position changes.

Definition at line 246 of file quadrature.h.

246 { return false; }

◆ size()

unsigned int libMesh::QBase::size ( ) const
inlineinherited

Alias for n_points() to enable use in index_range.

Returns
The number of points associated with the quadrature rule.

Definition at line 134 of file quadrature.h.

References libMesh::QBase::n_points().

Referenced by libMesh::Elem::true_centroid().

135  {
136  return n_points();
137  }
unsigned int n_points() const
Definition: quadrature.h:123

◆ tensor_product_hex()

void libMesh::QBase::tensor_product_hex ( const QBase q1D)
protectedinherited

Computes the tensor product quadrature rule [q1D x q1D x q1D] from the 1D rule q1D.

Used in the init_3D routines for hexahedral element types.

Definition at line 203 of file quadrature.C.

References libMesh::QBase::_points, libMesh::QBase::_weights, libMesh::QBase::n_points(), libMesh::QBase::qp(), and libMesh::QBase::w().

Referenced by libMesh::QGaussLobatto::init_3D(), libMesh::QGrid::init_3D(), libMesh::QTrap::init_3D(), libMesh::QSimpson::init_3D(), and init_3D().

204 {
205  const unsigned int np = q1D.n_points();
206 
207  _points.resize(np * np * np);
208 
209  _weights.resize(np * np * np);
210 
211  unsigned int q=0;
212 
213  for (unsigned int k=0; k<np; k++)
214  for (unsigned int j=0; j<np; j++)
215  for (unsigned int i=0; i<np; i++)
216  {
217  _points[q](0) = q1D.qp(i)(0);
218  _points[q](1) = q1D.qp(j)(0);
219  _points[q](2) = q1D.qp(k)(0);
220 
221  _weights[q] = q1D.w(i) * q1D.w(j) * q1D.w(k);
222 
223  q++;
224  }
225 }
std::vector< Point > _points
The locations of the quadrature points in reference element space.
Definition: quadrature.h:383
std::vector< Real > _weights
The quadrature weights.
Definition: quadrature.h:389

◆ tensor_product_prism()

void libMesh::QBase::tensor_product_prism ( const QBase q1D,
const QBase q2D 
)
protectedinherited

Computes the tensor product of a 1D quadrature rule and a 2D quadrature rule.

Used in the init_3D routines for prismatic element types.

Definition at line 230 of file quadrature.C.

References libMesh::QBase::_points, libMesh::QBase::_weights, libMesh::QBase::n_points(), libMesh::QBase::qp(), and libMesh::QBase::w().

Referenced by libMesh::QGrid::init_3D(), init_3D(), libMesh::QSimpson::init_3D(), and libMesh::QTrap::init_3D().

231 {
232  const unsigned int n_points1D = q1D.n_points();
233  const unsigned int n_points2D = q2D.n_points();
234 
235  _points.resize (n_points1D * n_points2D);
236  _weights.resize (n_points1D * n_points2D);
237 
238  unsigned int q=0;
239 
240  for (unsigned int j=0; j<n_points1D; j++)
241  for (unsigned int i=0; i<n_points2D; i++)
242  {
243  _points[q](0) = q2D.qp(i)(0);
244  _points[q](1) = q2D.qp(i)(1);
245  _points[q](2) = q1D.qp(j)(0);
246 
247  _weights[q] = q2D.w(i) * q1D.w(j);
248 
249  q++;
250  }
251 
252 }
std::vector< Point > _points
The locations of the quadrature points in reference element space.
Definition: quadrature.h:383
std::vector< Real > _weights
The quadrature weights.
Definition: quadrature.h:389

◆ tensor_product_quad()

void libMesh::QBase::tensor_product_quad ( const QBase q1D)
protectedinherited

Constructs a 2D rule from the tensor product of q1D with itself.

Used in the init_2D() routines for quadrilateral element types.

Definition at line 176 of file quadrature.C.

References libMesh::QBase::_points, libMesh::QBase::_weights, libMesh::QBase::n_points(), libMesh::QBase::qp(), and libMesh::QBase::w().

Referenced by libMesh::QGaussLobatto::init_2D(), libMesh::QGrid::init_2D(), libMesh::QTrap::init_2D(), libMesh::QSimpson::init_2D(), and init_2D().

177 {
178 
179  const unsigned int np = q1D.n_points();
180 
181  _points.resize(np * np);
182 
183  _weights.resize(np * np);
184 
185  unsigned int q=0;
186 
187  for (unsigned int j=0; j<np; j++)
188  for (unsigned int i=0; i<np; i++)
189  {
190  _points[q](0) = q1D.qp(i)(0);
191  _points[q](1) = q1D.qp(j)(0);
192 
193  _weights[q] = q1D.w(i)*q1D.w(j);
194 
195  q++;
196  }
197 }
std::vector< Point > _points
The locations of the quadrature points in reference element space.
Definition: quadrature.h:383
std::vector< Real > _weights
The quadrature weights.
Definition: quadrature.h:389

◆ type()

QuadratureType libMesh::QGauss::type ( ) const
overridevirtual
Returns
QGAUSS.

Implements libMesh::QBase.

Definition at line 33 of file quadrature_gauss.C.

References libMesh::QGAUSS.

34 {
35  return QGAUSS;
36 }

◆ w()

Real libMesh::QBase::w ( const unsigned int  i) const
inlineinherited
Returns
The \( i^{th} \) quadrature weight.

Definition at line 180 of file quadrature.h.

References libMesh::QBase::_weights.

Referenced by libMesh::QConical::conical_product_pyramid(), libMesh::QConical::conical_product_tet(), libMesh::QConical::conical_product_tri(), libMesh::QBase::tensor_product_hex(), libMesh::QBase::tensor_product_prism(), libMesh::QBase::tensor_product_quad(), and QuadratureTest::testPolynomial().

181  {
182  libmesh_assert_less (i, _weights.size());
183  return _weights[i];
184  }
std::vector< Real > _weights
The quadrature weights.
Definition: quadrature.h:389

Member Data Documentation

◆ _counts

ReferenceCounter::Counts libMesh::ReferenceCounter::_counts
staticprotectedinherited

Actually holds the data.

Definition at line 124 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::get_info().

◆ _dim

unsigned int libMesh::QBase::_dim
protectedinherited

◆ _enable_print_counter

bool libMesh::ReferenceCounter::_enable_print_counter = true
staticprotectedinherited

Flag to control whether reference count information is printed when print_info is called.

Definition at line 143 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::disable_print_counter_info(), libMesh::ReferenceCounter::enable_print_counter_info(), and libMesh::ReferenceCounter::print_info().

◆ _mutex

Threads::spin_mutex libMesh::ReferenceCounter::_mutex
staticprotectedinherited

Mutual exclusion object to enable thread-safe reference counting.

Definition at line 137 of file reference_counter.h.

◆ _n_objects

Threads::atomic< unsigned int > libMesh::ReferenceCounter::_n_objects
staticprotectedinherited

The number of objects.

Print the reference count information when the number returns to 0.

Definition at line 132 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::n_objects(), libMesh::ReferenceCounter::ReferenceCounter(), and libMesh::ReferenceCounter::~ReferenceCounter().

◆ _order

Order libMesh::QBase::_order
protectedinherited

◆ _p_level

unsigned int libMesh::QBase::_p_level
protectedinherited

◆ _points

std::vector<Point> libMesh::QBase::_points
protectedinherited

◆ _type

ElemType libMesh::QBase::_type
protectedinherited

◆ _weights

std::vector<Real> libMesh::QBase::_weights
protectedinherited

◆ allow_nodal_pyramid_quadrature

bool libMesh::QBase::allow_nodal_pyramid_quadrature
inherited

The flag's value defaults to false so that one does not accidentally use a nodal quadrature rule on Pyramid elements, since evaluating the inverse element Jacobian (e.g.

dphi) is not well-defined at the Pyramid apex because the element Jacobian is zero there.

We do not want to completely prevent someone from using a nodal quadrature rule on Pyramids, however, since there are legitimate use cases (lumped mass matrix) so the flag can be set to true to override this behavior.

Definition at line 274 of file quadrature.h.

Referenced by libMesh::QSimpson::init_3D(), libMesh::QTrap::init_3D(), and libMesh::QNodal::init_3D().

◆ allow_rules_with_negative_weights

bool libMesh::QBase::allow_rules_with_negative_weights
inherited

Flag (default true) controlling the use of quadrature rules with negative weights.

Set this to false to require rules with all positive weights.

Rules with negative weights can be unsuitable for some problems. For example, it is possible for a rule with negative weights to obtain a negative result when integrating a positive function.

A particular example: if rules with negative weights are not allowed, a request for TET,THIRD (5 points) will return the TET,FIFTH (14 points) rule instead, nearly tripling the computational effort required!

Definition at line 261 of file quadrature.h.

Referenced by libMesh::QGrundmann_Moller::init_2D(), init_3D(), libMesh::QMonomial::init_3D(), and libMesh::QGrundmann_Moller::init_3D().


The documentation for this class was generated from the following files: