Loading [MathJax]/extensions/TeX/newcommand.js
 deal.II version GIT relicensing-3057-gb5b616642a 2025-04-10 20:30:00+00:00
\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}} \newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=} \newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]} \newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
quadrature.h
Go to the documentation of this file.
1// ------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: LGPL-2.1-or-later
4// Copyright (C) 1998 - 2024 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Part of the source code is dual licensed under Apache-2.0 WITH
9// LLVM-exception OR LGPL-2.1-or-later. Detailed license information
10// governing the source code and code contributions can be found in
11// LICENSE.md and CONTRIBUTING.md at the top level directory of deal.II.
12//
13// ------------------------------------------------------------------------
14
15#ifndef dealii_quadrature_h
16#define dealii_quadrature_h
17
18
19#include <deal.II/base/config.h>
20
24#include <deal.II/base/point.h>
25
26#include <array>
27#include <memory>
28#include <vector>
29
31
122template <int dim>
124{
125public:
131 using SubQuadrature = Quadrature<dim == 0 ? 0 : dim - 1>;
132
136 Quadrature();
137
146 Quadrature(const SubQuadrature &, const Quadrature<1> &);
147
167 explicit Quadrature(const Quadrature<dim != 1 ? 1 : 0> &quadrature_1d);
168
172 Quadrature(const Quadrature<dim> &q);
173
178 Quadrature(Quadrature<dim> &&) noexcept = default;
179
185 Quadrature(const std::vector<Point<dim>> &points,
186 const std::vector<double> &weights);
187
193 Quadrature(std::vector<Point<dim>> &&points, std::vector<double> &&weights);
194
202 Quadrature(const std::vector<Point<dim>> &points);
203
208 Quadrature(const Point<dim> &point);
209
213 virtual ~Quadrature() override = default;
214
219 Quadrature &
220 operator=(const Quadrature<dim> &);
221
226 Quadrature &
227 operator=(Quadrature<dim> &&) = default; // NOLINT
228
232 bool
233 operator==(const Quadrature<dim> &p) const;
234
243 void
244 initialize(const ArrayView<const Point<dim>> &points,
245 const ArrayView<const double> &weights = {});
246
250 unsigned int
251 size() const;
252
256 bool
257 empty() const;
258
262 const Point<dim> &
263 point(const unsigned int i) const;
264
268 const std::vector<Point<dim>> &
269 get_points() const;
270
274 double
275 weight(const unsigned int i) const;
276
280 const std::vector<double> &
281 get_weights() const;
282
287 std::size_t
288 memory_consumption() const;
289
295 template <class Archive>
296 void
297 serialize(Archive &ar, const unsigned int version);
298
304 bool
306
325#ifndef DOXYGEN
326 std::conditional_t<dim == 1,
327 std::array<Quadrature<1>, dim>,
328 const std::array<Quadrature<1>, dim> &>
329#else
330 const std::array<Quadrature<1>, dim> &
331#endif
332 get_tensor_basis() const;
333
334protected:
348 explicit Quadrature(const unsigned int n_quadrature_points);
349
354 std::vector<Point<dim>> quadrature_points;
355
360 std::vector<double> weights;
361
370
375 std::unique_ptr<std::array<Quadrature<1>, dim>> tensor_basis;
376};
377
378
387template <int dim>
388class QAnisotropic : public Quadrature<dim>
389{
390public:
395 QAnisotropic(const Quadrature<1> &qx);
396
400 QAnisotropic(const Quadrature<1> &qx, const Quadrature<1> &qy);
401
405 QAnisotropic(const Quadrature<1> &qx,
406 const Quadrature<1> &qy,
407 const Quadrature<1> &qz);
408};
409
410
434template <int dim>
435class QIterated : public Quadrature<dim>
436{
437public:
444 QIterated(const Quadrature<1> &base_quadrature, const unsigned int n_copies);
445
457 QIterated(const Quadrature<1> &base_quadrature,
458 const std::vector<Point<1>> &intervals);
459
464 "The quadrature formula you provided cannot be used "
465 "as the basis for iteration.");
466};
467
468
469
472#ifndef DOXYGEN
473
474// ------------------- inline and template functions ----------------
475
476
477template <int dim>
478inline unsigned int
480{
481 return weights.size();
482}
483
484
485
486template <int dim>
487inline bool
489{
490 return weights.empty();
491}
492
493
494
495template <int dim>
496inline const Point<dim> &
497Quadrature<dim>::point(const unsigned int i) const
498{
500 return quadrature_points[i];
501}
502
503
504
505template <int dim>
506double
507Quadrature<dim>::weight(const unsigned int i) const
508{
510 return weights[i];
511}
512
513
514
515template <int dim>
516inline const std::vector<Point<dim>> &
518{
519 return quadrature_points;
520}
521
522
523
524template <int dim>
525inline const std::vector<double> &
527{
528 return weights;
529}
530
531
532
533template <int dim>
534inline bool
536{
537 return is_tensor_product_flag;
538}
539
540
541
542template <int dim>
543template <class Archive>
544inline void
545Quadrature<dim>::serialize(Archive &ar, const unsigned int)
546{
547 // forward to serialization
548 // function in the base class.
549 ar &static_cast<EnableObserverPointer &>(*this);
550
551 ar &quadrature_points &weights;
552}
553
554
555
556/* -------------- declaration of explicit specializations ------------- */
557
558template <>
559Quadrature<0>::Quadrature(const unsigned int);
560template <>
562 const Quadrature<1> &);
563template <>
565template <>
567
568template <>
570
571template <>
573
574template <>
575QIterated<1>::QIterated(const Quadrature<1> &base_quadrature,
576 const unsigned int n_copies);
577
578#endif // DOXYGEN
580
581#endif
Definition point.h:113
QIterated(const Quadrature< 1 > &base_quadrature, const unsigned int n_copies)
std::vector< Point< dim > > quadrature_points
Definition quadrature.h:354
void initialize(const ArrayView< const Point< dim > > &points, const ArrayView< const double > &weights={})
Definition quadrature.cc:63
std::unique_ptr< std::array< Quadrature< 1 >, dim > > tensor_basis
Definition quadrature.h:375
bool is_tensor_product() const
std::size_t memory_consumption() const
const Point< dim > & point(const unsigned int i) const
bool is_tensor_product_flag
Definition quadrature.h:369
double weight(const unsigned int i) const
const std::vector< double > & get_weights() const
const std::array< Quadrature< 1 >, dim > & get_tensor_basis() const
Quadrature(Quadrature< dim > &&) noexcept=default
std::vector< double > weights
Definition quadrature.h:360
const std::vector< Point< dim > > & get_points() const
bool empty() const
unsigned int size() const
void serialize(Archive &ar, const unsigned int version)
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:35
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:36
static ::ExceptionBase & ExcInvalidQuadratureFormula()
#define AssertIndexRange(index, range)
#define DeclExceptionMsg(Exception, defaulttext)
std::size_t size
Definition mpi.cc:745
void quadrature_points(const Triangulation< dim, spacedim > &triangulation, const Quadrature< dim > &quadrature, const std::vector< std::vector< BoundingBox< spacedim > > > &global_bounding_boxes, ParticleHandler< dim, spacedim > &particle_handler, const Mapping< dim, spacedim > &mapping=(ReferenceCells::get_hypercube< dim >() .template get_default_linear_mapping< dim, spacedim >()), const std::vector< std::vector< double > > &properties={})
STL namespace.