deal.II version GIT relicensing-6809-ge913b9bb34 2026-09-25 17:20:01+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\}}\)
Loading...
Searching...
No Matches
quadrature.h
Go to the documentation of this file.
1// -----------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception OR LGPL-2.1-or-later
4// Copyright (C) 1998 - 2025 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Detailed license information governing the source code and contributions
9// can be found in LICENSE.md and CONTRIBUTING.md at the top level directory.
10//
11// -----------------------------------------------------------------------------
12
13#ifndef dealii_quadrature_h
14#define dealii_quadrature_h
15
16
17#include <deal.II/base/config.h>
18
22#include <deal.II/base/point.h>
23
24#include <array>
25#include <memory>
26#include <vector>
27
29
120template <int dim>
122{
123public:
129 using SubQuadrature = Quadrature<dim == 0 ? 0 : dim - 1>;
130
134 Quadrature();
135
144 Quadrature(const SubQuadrature &, const Quadrature<1> &);
145
165 explicit Quadrature(const Quadrature<dim != 1 ? 1 : 0> &quadrature_1d);
166
170 Quadrature(const Quadrature<dim> &q);
171
176 Quadrature(Quadrature<dim> &&) noexcept = default;
177
183 Quadrature(const std::vector<Point<dim>> &points,
184 const std::vector<double> &weights);
185
191 Quadrature(std::vector<Point<dim>> &&points, std::vector<double> &&weights);
192
200 Quadrature(const std::vector<Point<dim>> &points);
201
206 Quadrature(const Point<dim> &point);
207
211 virtual ~Quadrature() override = default;
212
217 Quadrature &
218 operator=(const Quadrature<dim> &);
219
224 Quadrature &
225 operator=(Quadrature<dim> &&) = default; // NOLINT
226
230 bool
231 operator==(const Quadrature<dim> &p) const;
232
241 void
242 initialize(const ArrayView<const Point<dim>> &points,
243 const ArrayView<const double> &weights = {});
244
248 unsigned int
249 size() const;
250
254 bool
255 empty() const;
256
260 const Point<dim> &
261 point(const unsigned int i) const;
262
266 const std::vector<Point<dim>> &
267 get_points() const;
268
272 double
273 weight(const unsigned int i) const;
274
278 const std::vector<double> &
279 get_weights() const;
280
285 std::size_t
286 memory_consumption() const;
287
293 template <class Archive>
294 void
295 serialize(Archive &ar, const unsigned int version);
296
302 bool
304
323#ifndef DOXYGEN
324 std::conditional_t<dim == 1,
325 std::array<Quadrature<1>, dim>,
326 const std::array<Quadrature<1>, dim> &>
327#else
328 const std::array<Quadrature<1>, dim> &
329#endif
330 get_tensor_basis() const;
331
332protected:
346 explicit Quadrature(const unsigned int n_quadrature_points);
347
352 std::vector<Point<dim>> quadrature_points;
353
358 std::vector<double> weights;
359
368
373 std::unique_ptr<std::array<Quadrature<1>, dim>> tensor_basis;
374};
375
376
385template <int dim>
386class QAnisotropic : public Quadrature<dim>
387{
388public:
393 QAnisotropic(const Quadrature<1> &qx);
394
398 QAnisotropic(const Quadrature<1> &qx, const Quadrature<1> &qy);
399
403 QAnisotropic(const Quadrature<1> &qx,
404 const Quadrature<1> &qy,
405 const Quadrature<1> &qz);
406};
407
408
432template <int dim>
433class QIterated : public Quadrature<dim>
434{
435public:
442 QIterated(const Quadrature<1> &base_quadrature, const unsigned int n_copies);
443
455 QIterated(const Quadrature<1> &base_quadrature,
456 const std::vector<Point<1>> &intervals);
457
462 "The quadrature formula you provided cannot be used "
463 "as the basis for iteration.");
464};
465
466
467
470#ifndef DOXYGEN
471
472// ------------------- inline and template functions ----------------
473
474
475template <int dim>
476inline unsigned int
478{
479 return weights.size();
480}
481
482
483
484template <int dim>
485inline bool
487{
488 return weights.empty();
489}
490
491
492
493template <int dim>
494inline const Point<dim> &
495Quadrature<dim>::point(const unsigned int i) const
496{
498 return quadrature_points[i];
499}
500
501
502
503template <int dim>
504double
505Quadrature<dim>::weight(const unsigned int i) const
506{
508 return weights[i];
509}
510
511
512
513template <int dim>
514inline const std::vector<Point<dim>> &
516{
517 return quadrature_points;
518}
519
520
521
522template <int dim>
523inline const std::vector<double> &
525{
526 return weights;
527}
528
529
530
531template <int dim>
532inline bool
534{
535 return is_tensor_product_flag;
536}
537
538
539
540template <int dim>
541template <class Archive>
542inline void
543Quadrature<dim>::serialize(Archive &ar, const unsigned int)
544{
545 // forward to serialization
546 // function in the base class.
547 ar &static_cast<EnableObserverPointer &>(*this);
548
549 ar &quadrature_points &weights;
550}
551
552
553
554/* -------------- declaration of explicit specializations ------------- */
555
556template <>
557Quadrature<0>::Quadrature(const unsigned int);
558template <>
560 const Quadrature<1> &);
561template <>
563template <>
565
566template <>
568
569template <>
571
572template <>
573QIterated<1>::QIterated(const Quadrature<1> &base_quadrature,
574 const unsigned int n_copies);
575
576#endif // DOXYGEN
578
579#endif
Definition point.h:111
QIterated(const Quadrature< 1 > &base_quadrature, const unsigned int n_copies)
std::vector< Point< dim > > quadrature_points
Definition quadrature.h:352
void initialize(const ArrayView< const Point< dim > > &points, const ArrayView< const double > &weights={})
Definition quadrature.cc:76
std::unique_ptr< std::array< Quadrature< 1 >, dim > > tensor_basis
Definition quadrature.h:373
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:367
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:358
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:38
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
static ::ExceptionBase & ExcInvalidQuadratureFormula()
#define AssertIndexRange(index, range)
#define DeclExceptionMsg(Exception, defaulttext)
std::size_t size
Definition mpi.cc:733
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< spacedim >()), const std::vector< std::vector< double > > &properties={})
STL namespace.