25#include <Kokkos_Macros.hpp>
45 : is_tensor_product_flag(false)
52 , is_tensor_product_flag(false)
60 : is_tensor_product_flag(dim == 1)
67 : quadrature_points(n_q,
Point<dim>())
69 , is_tensor_product_flag(dim == 1)
79 this->weights.clear();
80 if (weights.
size() > 0)
83 this->weights.insert(this->weights.
end(), weights.
begin(), weights.
end());
86 this->weights.resize(points.size(),
87 std::numeric_limits<double>::infinity());
89 quadrature_points.clear();
90 quadrature_points.insert(quadrature_points.end(),
94 is_tensor_product_flag = dim == 1;
101 const std::vector<double> &weights)
102 : quadrature_points(points)
104 , is_tensor_product_flag(dim == 1)
114 std::vector<double> &&weights)
115 : quadrature_points(
std::move(points))
116 , weights(
std::move(weights))
117 , is_tensor_product_flag(dim == 1)
127 : quadrature_points(points)
128 , weights(points.
size(),
std::numeric_limits<double>::infinity())
129 , is_tensor_product_flag(dim == 1)
139 : quadrature_points(
std::vector<
Point<dim>>(1, point))
140 , weights(
std::vector<double>(1, 1.))
141 , is_tensor_product_flag(true)
144 for (
unsigned int i = 0; i < dim; ++i)
146 const std::vector<Point<1>> quad_vec_1d(1,
Point<1>(
point[i]));
157 , weights(
std::vector<double>(1, 1.))
158 , is_tensor_product_flag(true)
165 : is_tensor_product_flag(false)
185 , is_tensor_product_flag(q1.is_tensor_product())
187 unsigned int present_index = 0;
188 for (
unsigned int i2 = 0; i2 < q2.
size(); ++i2)
189 for (
unsigned int i1 = 0; i1 < q1.
size(); ++i1)
193 for (
unsigned int d = 0; d < dim - 1; ++d)
194 quadrature_points[present_index][d] = q1.
point(i1)[d];
195 quadrature_points[present_index][dim - 1] = q2.
point(i2)[0];
207 for (
unsigned int i = 0; i <
size(); ++i)
215 if (is_tensor_product_flag)
217 tensor_basis = std::make_unique<std::array<Quadrature<1>, dim>>();
218 for (
unsigned int i = 0; i < dim - 1; ++i)
220 (*tensor_basis)[dim - 1] = q2;
230 , is_tensor_product_flag(true)
232 unsigned int present_index = 0;
233 for (
unsigned int i2 = 0; i2 < q2.
size(); ++i2)
237 quadrature_points[present_index][0] = q2.
point(i2)[0];
239 weights[present_index] = q2.
weight(i2);
249 for (
unsigned int i = 0; i <
size(); ++i)
265 , is_tensor_product_flag(false)
286 , is_tensor_product_flag(true)
290 const unsigned int n0 = q.
size();
291 const unsigned int n1 = (dim > 1) ? n0 : 1;
292 const unsigned int n2 = (dim > 2) ? n0 : 1;
295 for (
unsigned int i2 = 0; i2 < n2; ++i2)
296 for (
unsigned int i1 = 0; i1 < n1; ++i1)
297 for (
unsigned int i0 = 0; i0 < n0; ++i0)
299 quadrature_points[k][0] = q.
point(i0)[0];
301 quadrature_points[k][1] = q.
point(i1)[0];
303 quadrature_points[k][2] = q.
point(i2)[0];
304 weights[k] = q.
weight(i0);
306 weights[k] *= q.
weight(i1);
308 weights[k] *= q.
weight(i2);
312 tensor_basis = std::make_unique<std::array<Quadrature<1>, dim>>();
313 for (
unsigned int i = 0; i < dim; ++i)
314 (*tensor_basis)[i] = q;
322 , quadrature_points(q.quadrature_points)
324 , is_tensor_product_flag(q.is_tensor_product_flag)
328 std::make_unique<std::array<Quadrature<1>, dim>>(*q.
tensor_basis);
340 if (dim > 1 && is_tensor_product_flag)
342 if (tensor_basis ==
nullptr)
344 std::make_unique<std::array<Quadrature<1>, dim>>(*q.
tensor_basis);
373typename std::conditional_t<dim == 1,
374 std::array<Quadrature<1>, dim>,
375 const std::array<Quadrature<1>, dim> &>
378 Assert(this->is_tensor_product_flag ==
true,
379 ExcMessage(
"This function only makes sense if "
380 "this object represents a tensor product!"));
383 return *tensor_basis;
389std::array<Quadrature<1>, 1>
392 Assert(this->is_tensor_product_flag ==
true,
393 ExcMessage(
"This function only makes sense if "
394 "this object represents a tensor product!"));
396 return std::array<Quadrature<1>, 1>{{*
this}};
409 for (
unsigned int k1 = 0; k1 < qx.
size(); ++k1)
411 this->quadrature_points[k][0] = qx.
point(k1)[0];
412 this->weights[k++] = qx.
weight(k1);
415 this->is_tensor_product_flag =
true;
428 constexpr int dim_1 = dim == 2 ? 1 : 0;
431 for (
unsigned int k2 = 0; k2 < qy.
size(); ++k2)
432 for (
unsigned int k1 = 0; k1 < qx.
size(); ++k1)
434 this->quadrature_points[k][0] = qx.
point(k1)[0];
435 this->quadrature_points[k][dim_1] = qy.
point(k2)[0];
440 this->is_tensor_product_flag =
true;
441 this->tensor_basis = std::make_unique<std::array<Quadrature<1>, dim>>();
442 (*this->tensor_basis)[0] = qx;
443 (*this->tensor_basis)[dim_1] = qy;
457 constexpr int dim_1 = dim == 3 ? 1 : 0;
458 constexpr int dim_2 = dim == 3 ? 2 : 0;
461 for (
unsigned int k3 = 0; k3 < qz.
size(); ++k3)
462 for (
unsigned int k2 = 0; k2 < qy.
size(); ++k2)
463 for (
unsigned int k1 = 0; k1 < qx.
size(); ++k1)
465 this->quadrature_points[k][0] = qx.
point(k1)[0];
466 this->quadrature_points[k][dim_1] = qy.
point(k2)[0];
467 this->quadrature_points[k][dim_2] = qz.
point(k3)[0];
472 this->is_tensor_product_flag =
true;
473 this->tensor_basis = std::make_unique<std::array<Quadrature<1>, dim>>();
474 (*this->tensor_basis)[0] = qx;
475 (*this->tensor_basis)[dim_1] = qy;
476 (*this->tensor_basis)[dim_2] = qz;
485 namespace QIteratedImplementation
493 std::any_of(base_quadrature.
get_points().cbegin(),
495 [](
const Point<1> &p) { return p == Point<1>{0.}; });
496 const bool at_right =
497 std::any_of(base_quadrature.
get_points().cbegin(),
499 [](
const Point<1> &p) { return p == Point<1>{1.}; });
500 return (at_left && at_right);
503 std::vector<Point<1>>
504 create_equidistant_interval_points(
const unsigned int n_copies)
506 std::vector<Point<1>> support_points(n_copies + 1);
508 for (
unsigned int copy = 0; copy < n_copies; ++copy)
509 support_points[copy][0] =
510 static_cast<double>(copy) /
static_cast<double>(n_copies);
512 support_points[n_copies][0] = 1.0;
514 return support_points;
542 const std::vector<
Point<1>> &intervals)
544 internal::QIteratedImplementation::uses_both_endpoints(base_quadrature) ?
545 (base_quadrature.
size() - 1) * (intervals.
size() - 1) + 1 :
546 base_quadrature.
size() * (intervals.
size() - 1))
551 const unsigned int n_copies = intervals.size() - 1;
553 if (!internal::QIteratedImplementation::uses_both_endpoints(base_quadrature))
557 unsigned int next_point = 0;
558 for (
unsigned int copy = 0; copy < n_copies; ++copy)
559 for (
unsigned int q_point = 0; q_point < base_quadrature.
size();
562 this->quadrature_points[next_point] =
564 (intervals[copy + 1][0] - intervals[copy][0]) +
566 this->weights[next_point] =
567 base_quadrature.
weight(q_point) *
568 (intervals[copy + 1][0] - intervals[copy][0]);
576 const unsigned int left_index =
577 std::distance(base_quadrature.
get_points().begin(),
578 std::find_if(base_quadrature.
get_points().cbegin(),
581 return p == Point<1>{0.};
584 const unsigned int right_index =
585 std::distance(base_quadrature.
get_points().begin(),
586 std::find_if(base_quadrature.
get_points().cbegin(),
589 return p == Point<1>{1.};
592 const unsigned double_point_offset =
593 left_index + (base_quadrature.size() - right_index);
595 for (
unsigned int copy = 0, next_point = 0; copy < n_copies; ++copy)
596 for (
unsigned int q_point = 0; q_point < base_quadrature.size();
601 if ((copy > 0) && (base_quadrature.point(q_point) ==
Point<1>(0.0)))
603 Assert(this->quadrature_points[next_point - double_point_offset]
605 base_quadrature.point(q_point)[0] *
606 (intervals[copy + 1][0] - intervals[copy][0]) +
607 intervals[copy][0])) < 1e-10 ,
610 this->weights[next_point - double_point_offset] +=
611 base_quadrature.weight(q_point) *
612 (intervals[copy + 1][0] - intervals[copy][0]);
618 Point<1>(base_quadrature.point(q_point)[0] *
619 (intervals[copy + 1][0] - intervals[copy][0]) +
624 this->weights[next_point] =
625 base_quadrature.weight(q_point) *
626 (intervals[
copy + 1][0] - intervals[
copy][0]);
638 else if (
std::abs(i[0] - 1.0) < 1e-12)
643 double sum_of_weights = 0;
644 for (
unsigned int i = 0; i < this->
size(); ++i)
645 sum_of_weights += this->weight(i);
654 const unsigned int n_copies)
657 internal::QIteratedImplementation::create_equidistant_interval_points(
670 const std::vector<
Point<1>> &intervals)
672 QIterated<1>(base_quadrature, intervals))
679 const unsigned int n_copies)
QAnisotropic(const Quadrature< 1 > &qx)
QIterated(const Quadrature< 1 > &base_quadrature, const unsigned int n_copies)
std::vector< Point< dim > > quadrature_points
void initialize(const ArrayView< const Point< dim > > &points, const ArrayView< const double > &weights={})
std::unique_ptr< std::array< Quadrature< 1 >, dim > > tensor_basis
Quadrature & operator=(const Quadrature< dim > &)
std::size_t memory_consumption() const
const Point< dim > & point(const unsigned int i) const
bool is_tensor_product_flag
double weight(const unsigned int i) const
bool operator==(const Quadrature< dim > &p) const
const std::array< Quadrature< 1 >, dim > & get_tensor_basis() const
std::vector< double > weights
const std::vector< Point< dim > > & get_points() const
unsigned int size() const
#define DEAL_II_NAMESPACE_OPEN
constexpr bool running_in_debug_mode()
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_NOT_IMPLEMENTED()
static ::ExceptionBase & ExcZero()
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
static ::ExceptionBase & ExcImpossibleInDim(int arg1)
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
static ::ExceptionBase & ExcNotInitialized()
static ::ExceptionBase & ExcMessage(std::string arg1)
std::enable_if_t< std::is_fundamental_v< T >, std::size_t > memory_consumption(const T &t)
Point< spacedim > point(const gp_Pnt &p, const double tolerance=1e-10)
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={})
SymmetricTensor< 2, dim, Number > e(const Tensor< 2, dim, Number > &F)
* * if(update_pressure &update_flags) * compute_pressure(constitutive_request
void copy(const T *begin, const T *end, U *dest)
::VectorizedArray< Number, width > abs(const ::VectorizedArray< Number, width > &)