Reference documentation for deal.II version 9.1.0-pre
quadrature.h
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 1998 - 2018 by the deal.II authors
4 //
5 // This file is part of the deal.II library.
6 //
7 // The deal.II library is free software; you can use it, redistribute
8 // it, and/or modify it under the terms of the GNU Lesser General
9 // Public License as published by the Free Software Foundation; either
10 // version 2.1 of the License, or (at your option) any later version.
11 // The full text of the license can be found in the file LICENSE.md at
12 // the top level directory of deal.II.
13 //
14 // ---------------------------------------------------------------------
15 
16 #ifndef dealii_quadrature_h
17 #define dealii_quadrature_h
18 
19 
20 #include <deal.II/base/config.h>
21 
22 #include <deal.II/base/point.h>
23 #include <deal.II/base/subscriptor.h>
24 
25 #include <array>
26 #include <memory>
27 #include <vector>
28 
29 DEAL_II_NAMESPACE_OPEN
30 
33 
84 template <int dim>
85 class Quadrature : public Subscriptor
86 {
87 public:
92  using SubQuadrature = Quadrature<dim - 1>;
93 
102  explicit Quadrature(const unsigned int n_quadrature_points = 0);
103 
112  Quadrature(const SubQuadrature &, const Quadrature<1> &);
113 
130  explicit Quadrature(const Quadrature<dim != 1 ? 1 : 0> &quadrature_1d);
131 
135  Quadrature(const Quadrature<dim> &q);
136 
141  Quadrature(Quadrature<dim> &&) noexcept = default;
142 
148  Quadrature(const std::vector<Point<dim>> &points,
149  const std::vector<double> & weights);
150 
158  Quadrature(const std::vector<Point<dim>> &points);
159 
164  Quadrature(const Point<dim> &point);
165 
169  virtual ~Quadrature() override = default;
170 
175  Quadrature &
176  operator=(const Quadrature<dim> &);
177 
182  Quadrature &
183  operator=(Quadrature<dim> &&) = default; // NOLINT
184 
188  bool
189  operator==(const Quadrature<dim> &p) const;
190 
195  void
196  initialize(const std::vector<Point<dim>> &points,
197  const std::vector<double> & weights);
198 
202  unsigned int
203  size() const;
204 
208  const Point<dim> &
209  point(const unsigned int i) const;
210 
214  const std::vector<Point<dim>> &
215  get_points() const;
216 
220  double
221  weight(const unsigned int i) const;
222 
226  const std::vector<double> &
227  get_weights() const;
228 
233  std::size_t
234  memory_consumption() const;
235 
240  template <class Archive>
241  void
242  serialize(Archive &ar, const unsigned int version);
243 
249  bool
250  is_tensor_product() const;
251 
257  typename std::conditional<dim == 1,
258  std::array<Quadrature<1>, dim>,
259  const std::array<Quadrature<1>, dim> &>::type
260  get_tensor_basis() const;
261 
262 protected:
267  std::vector<Point<dim>> quadrature_points;
268 
273  std::vector<double> weights;
274 
283 
288  std::unique_ptr<std::array<Quadrature<1>, dim>> tensor_basis;
289 };
290 
291 
302 template <int dim>
303 class QAnisotropic : public Quadrature<dim>
304 {
305 public:
310  QAnisotropic(const Quadrature<1> &qx);
311 
315  QAnisotropic(const Quadrature<1> &qx, const Quadrature<1> &qy);
316 
320  QAnisotropic(const Quadrature<1> &qx,
321  const Quadrature<1> &qy,
322  const Quadrature<1> &qz);
323 };
324 
325 
351 template <int dim>
352 class QIterated : public Quadrature<dim>
353 {
354 public:
359  QIterated(const Quadrature<1> &base_quadrature, const unsigned int n_copies);
360 
364  DeclExceptionMsg(ExcInvalidQuadratureFormula,
365  "The quadrature formula you provided cannot be used "
366  "as the basis for iteration.");
367 };
368 
369 
370 
373 #ifndef DOXYGEN
374 
375 // ------------------- inline and template functions ----------------
376 
377 
378 template <int dim>
379 inline unsigned int
380 Quadrature<dim>::size() const
381 {
382  return weights.size();
383 }
384 
385 
386 template <int dim>
387 inline const Point<dim> &
388 Quadrature<dim>::point(const unsigned int i) const
389 {
390  AssertIndexRange(i, size());
391  return quadrature_points[i];
392 }
393 
394 
395 
396 template <int dim>
397 double
398 Quadrature<dim>::weight(const unsigned int i) const
399 {
400  AssertIndexRange(i, size());
401  return weights[i];
402 }
403 
404 
405 
406 template <int dim>
407 inline const std::vector<Point<dim>> &
409 {
410  return quadrature_points;
411 }
412 
413 
414 
415 template <int dim>
416 inline const std::vector<double> &
418 {
419  return weights;
420 }
421 
422 
423 
424 template <int dim>
425 inline bool
427 {
428  return is_tensor_product_flag;
429 }
430 
431 
432 
433 template <int dim>
434 template <class Archive>
435 inline void
436 Quadrature<dim>::serialize(Archive &ar, const unsigned int)
437 {
438  // forward to serialization
439  // function in the base class.
440  ar &static_cast<Subscriptor &>(*this);
441 
443 }
444 
445 
446 
447 /* -------------- declaration of explicit specializations ------------- */
448 
449 template <>
450 Quadrature<0>::Quadrature(const unsigned int);
451 template <>
453 template <>
455 
456 template <>
458 
459 template <>
461 
462 #endif // DOXYGEN
463 DEAL_II_NAMESPACE_CLOSE
464 
465 #endif
std::vector< double > weights
Definition: quadrature.h:273
std::conditional< dim==1, std::array< Quadrature< 1 >, dim >, const std::array< Quadrature< 1 >, dim > & >::type get_tensor_basis() const
Definition: quadrature.cc:316
Quadrature(const unsigned int n_quadrature_points=0)
Definition: quadrature.cc:40
#define AssertIndexRange(index, range)
Definition: exceptions.h:1407
STL namespace.
Definition: point.h:106
const Point< dim > & point(const unsigned int i) const
const std::vector< Point< dim > > & get_points() const
unsigned int size() const
double weight(const unsigned int i) const
#define DeclExceptionMsg(Exception, defaulttext)
Definition: exceptions.h:397
bool is_tensor_product_flag
Definition: quadrature.h:282
std::vector< Point< dim > > quadrature_points
Definition: quadrature.h:267
const std::vector< double > & get_weights() const
std::size_t memory_consumption() const
Definition: quadrature.cc:304
bool is_tensor_product() const
std::unique_ptr< std::array< Quadrature< 1 >, dim > > tensor_basis
Definition: quadrature.h:288
void initialize(const std::vector< Point< dim >> &points, const std::vector< double > &weights)
Definition: quadrature.cc:50
void serialize(Archive &ar, const unsigned int version)