16#ifndef dealii_vector_tools_evaluation_h
17#define dealii_vector_tools_evaluation_h
139 template <
int n_components,
152 typename VectorType::value_type>::
154 const MeshType<dim, spacedim> &mesh,
155 const VectorType &vector,
163 const
unsigned int first_selected_component = 0);
180 template <
int n_components,
187 (
concepts::is_dealii_vector_type<VectorType> &&
188 concepts::is_triangulation_or_dof_handler<MeshType<dim, spacedim>>))
193 typename VectorType::value_type>::
195 RemotePointEvaluation<dim, spacedim> &cache,
196 const MeshType<dim, spacedim> &mesh,
197 const VectorType &vector,
200 const
unsigned int first_selected_component = 0);
215 template <
int n_components,
222 (
concepts::is_dealii_vector_type<VectorType> &&
223 concepts::is_triangulation_or_dof_handler<MeshType<dim, spacedim>>))
228 typename VectorType::value_type>::
230 const MeshType<dim, spacedim> &mesh,
231 const VectorType &vector,
240 first_selected_component = 0);
256 template <
int n_components,
263 (
concepts::is_dealii_vector_type<VectorType> &&
264 concepts::is_triangulation_or_dof_handler<MeshType<dim, spacedim>>))
269 typename VectorType::value_type>::
271 RemotePointEvaluation<dim, spacedim>
273 const MeshType<dim, spacedim> &mesh,
274 const VectorType &vector,
278 first_selected_component = 0);
286 template <
int n_components,
299 typename VectorType::value_type>::
301 const MeshType<dim, spacedim> &mesh,
302 const VectorType &vector,
309 const
unsigned int first_selected_component)
311 cache.reinit(evaluation_points, mesh.get_triangulation(),
mapping);
314 cache, mesh, vector, flags, first_selected_component);
319 template <
int n_components,
332 typename VectorType::value_type>::
334 const MeshType<dim, spacedim> &mesh,
335 const VectorType &vector,
344 first_selected_component)
346 cache.
reinit(evaluation_points, mesh.get_triangulation(),
mapping);
349 cache, mesh, vector, flags, first_selected_component);
359 template <
typename T>
362 const ArrayView<const T> &values)
366 case EvaluationFlags::avg:
368 return std::accumulate(
values.begin(),
values.end(), T{}) /
371 case EvaluationFlags::max:
373 case EvaluationFlags::min:
375 case EvaluationFlags::insert:
388 template <
int rank,
int dim,
typename Number>
389 Tensor<rank, dim, Number>
391 const ArrayView<
const Tensor<rank, dim, Number>> &values)
395 case EvaluationFlags::avg:
397 return std::accumulate(
values.begin(),
399 Tensor<rank, dim, Number>{}) /
400 (Number(1.0) *
values.size());
402 case EvaluationFlags::insert:
416 template <
int n_components,
int rank,
int dim,
typename Number>
417 Tensor<1, n_components, Tensor<rank, dim, Number>>
420 const ArrayView<
const Tensor<1, n_components, Tensor<rank, dim, Number>>>
425 case EvaluationFlags::avg:
427 Tensor<1, n_components, Tensor<rank, dim, Number>> temp;
429 for (
unsigned int j = 0; j <
values.size(); ++j)
430 for (
unsigned int i = 0; i < n_components; ++i)
431 temp[i] = temp[i] + values[j][i];
433 for (
unsigned int i = 0; i < n_components; ++i)
434 temp[i] /= Number(
values.size());
438 case EvaluationFlags::insert:
448 template <
int n_components,
455 const unsigned int i,
456 const typename Utilities::MPI::RemotePointEvaluation<dim,
459 const Utilities::MPI::RemotePointEvaluation<dim, spacedim> &cache,
460 const DoFHandler<dim, spacedim> &dof_handler,
461 const VectorType &vector,
463 const ::EvaluationFlags::EvaluationFlags evaluation_flags,
464 const unsigned int first_selected_component,
466 value_type(
const FEPointEvaluation<n_components,
469 typename VectorType::value_type> &,
470 const unsigned int &)> process_quadrature_point,
471 const ArrayView<value_type> &values,
472 std::vector<typename VectorType::value_type> &solution_values,
474 std::unique_ptr<FEPointEvaluation<n_components,
477 typename VectorType::value_type>>>
480 if (evaluators.empty())
485 cell_data.cells[i].first,
486 cell_data.cells[i].second,
489 const ArrayView<const Point<dim>> unit_points(
490 cell_data.reference_point_values.data() +
491 cell_data.reference_point_ptrs[i],
492 cell_data.reference_point_ptrs[i + 1] -
493 cell_data.reference_point_ptrs[i]);
495 solution_values.resize(
497 cell->get_dof_values(vector,
498 solution_values.begin(),
499 solution_values.end());
501 if (evaluators[cell->active_fe_index()] ==
nullptr)
502 evaluators[cell->active_fe_index()] =
503 std::make_unique<FEPointEvaluation<n_components,
506 typename VectorType::value_type>>(
510 first_selected_component);
511 auto &evaluator = *evaluators[cell->active_fe_index()];
513 evaluator.reinit(cell, unit_points);
514 evaluator.evaluate(solution_values, evaluation_flags);
516 for (
unsigned int q = 0; q < unit_points.size(); ++q)
517 values[q + cell_data.reference_point_ptrs[i]] =
518 process_quadrature_point(evaluator, q);
523 template <
int dim,
int spacedim,
typename Number>
526 const Triangulation<dim, spacedim> &tria,
527 const Vector<Number> &vector,
531 return vector[cell->active_cell_index()];
536 template <
int dim,
int spacedim,
typename Number>
539 const Triangulation<dim, spacedim> &tria,
540 const LinearAlgebra::distributed::Vector<Number> &vector,
543 const auto distributed_tria =
544 dynamic_cast<const parallel::TriangulationBase<dim, spacedim> *
>(&tria);
546 const bool use_distributed_path =
547 (distributed_tria ==
nullptr) ?
549 (vector.get_partitioner().get() ==
550 distributed_tria->global_active_cell_index_partitioner()
554 if (use_distributed_path)
556 return vector[cell->global_active_cell_index()];
561 return vector[cell->active_cell_index()];
567 template <
typename Number,
typename Number2>
569 set_value(Number &dst,
const Number2 &src)
576 template <
typename Number,
int rank,
int dim,
typename Number2>
578 set_value(Tensor<rank, dim, Number> &,
const Number2 &)
582 "A cell-data vector can only have a single component."));
587 template <
int n_components,
594 const unsigned int i,
595 const typename Utilities::MPI::RemotePointEvaluation<dim,
598 const Utilities::MPI::RemotePointEvaluation<dim, spacedim> &,
599 const Triangulation<dim, spacedim> &triangulation,
600 const VectorType &vector,
602 const ::EvaluationFlags::EvaluationFlags evaluation_flags,
603 const unsigned int first_selected_component,
605 value_type(
const FEPointEvaluation<n_components,
608 typename VectorType::value_type> &,
609 const unsigned int &)>,
610 const ArrayView<value_type> &values,
611 std::vector<typename VectorType::value_type> &,
613 std::unique_ptr<FEPointEvaluation<n_components,
616 typename VectorType::value_type>>> &)
618 Assert(n_components == 1 && first_selected_component == 0,
620 "A cell-data vector can only have a single component."));
622 Assert(evaluation_flags ==
624 ExcMessage(
"For cell-data vectors, only values can be queried."));
627 &triangulation, cell_data.cells[i].first, cell_data.cells[i].second};
629 const auto value = get_value(triangulation, vector, cell);
631 for (
unsigned int q = cell_data.reference_point_ptrs[i];
632 q < cell_data.reference_point_ptrs[i + 1];
634 set_value(values[q],
value);
639 template <
int n_components,
646 concepts::is_dealii_vector_type<VectorType>
647 &&concepts::is_triangulation_or_dof_handler<MeshType>)
648 inline std::vector<value_type> evaluate_at_points(
649 const Utilities::MPI::RemotePointEvaluation<dim, spacedim> &cache,
650 const MeshType &mesh,
651 const VectorType &vector,
653 const unsigned int first_selected_component,
655 const ::EvaluationFlags::EvaluationFlags evaluation_flags,
657 value_type(
const FEPointEvaluation<n_components,
660 typename VectorType::value_type> &,
661 const unsigned int &)> process_quadrature_point)
665 "Utilities::MPI::RemotePointEvaluation is not ready yet! "
666 "Please call Utilities::MPI::RemotePointEvaluation::reinit() "
667 "yourself or another function that does this for you."));
672 "The provided Utilities::MPI::RemotePointEvaluation and DoFHandler "
673 "object have been set up with different Triangulation objects, "
674 "a scenario not supported!"));
677 const auto evaluation_point_results = [&]() {
680 const auto evaluation_function = [&](
auto &
values,
681 const auto &cell_data) {
682 std::vector<typename VectorType::value_type> solution_values;
685 std::unique_ptr<FEPointEvaluation<n_components,
688 typename VectorType::value_type>>>
691 for (
unsigned int i = 0; i < cell_data.cells.size(); ++i)
692 process_cell<n_components, dim, spacedim, VectorType, value_type>(
700 first_selected_component,
701 process_quadrature_point,
707 std::vector<value_type> evaluation_point_results;
708 std::vector<value_type> buffer;
710 cache.template evaluate_and_process<value_type>(
711 evaluation_point_results, buffer, evaluation_function);
713 return evaluation_point_results;
719 return evaluation_point_results;
725 std::vector<value_type> unique_evaluation_point_results(
730 for (
unsigned int i = 0; i < ptr.size() - 1; ++i)
732 const auto n_entries = ptr[i + 1] - ptr[i];
736 unique_evaluation_point_results[i] =
738 ArrayView<const value_type>(
739 evaluation_point_results.data() + ptr[i], n_entries));
742 return unique_evaluation_point_results;
747 template <
int n_components,
754 (concepts::is_dealii_vector_type<VectorType> &&
755 concepts::is_triangulation_or_dof_handler<MeshType<dim, spacedim>>))
757 typename FEPointEvaluation<n_components,
760 typename VectorType::value_type>::
762 RemotePointEvaluation<dim, spacedim> &cache,
763 const MeshType<dim, spacedim> &mesh,
764 const VectorType &vector,
766 const
unsigned int first_selected_component)
768 return internal::evaluate_at_points<
772 MeshType<dim, spacedim>,
774 typename FEPointEvaluation<n_components,
777 typename VectorType::value_type>::value_type>(
782 first_selected_component,
785 [](
const auto &evaluator,
const auto &q) {
786 return evaluator.get_value(q);
792 template <
int n_components,
799 (concepts::is_dealii_vector_type<VectorType> &&
800 concepts::is_triangulation_or_dof_handler<MeshType<dim, spacedim>>))
802 typename FEPointEvaluation<n_components,
805 typename VectorType::value_type>::
807 RemotePointEvaluation<dim, spacedim>
809 const MeshType<dim, spacedim> &mesh,
810 const VectorType &vector,
814 first_selected_component)
816 return internal::evaluate_at_points<
820 MeshType<dim, spacedim>,
822 typename FEPointEvaluation<
826 typename VectorType::value_type>::gradient_type>(
831 first_selected_component,
834 [](
const auto &evaluator,
const unsigned &q) {
835 return evaluator.get_gradient(q);
const hp::FECollection< dim, spacedim > & get_fe_collection() const
const FiniteElement< dim, spacedim > & get_fe(const types::fe_index index=0) const
void reinit(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const ArrayView< const Point< dim > > &unit_points)
unsigned int n_dofs_per_cell() const
size_type locally_owned_size() const
Abstract base class for mapping classes.
unsigned int n_active_cells() const
const Triangulation< dim, spacedim > & get_triangulation() const
const std::vector< unsigned int > & get_point_ptrs() const
bool is_map_unique() const
const Mapping< dim, spacedim > & get_mapping() const
virtual size_type size() const override
unsigned int size() const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_CXX20_REQUIRES(condition)
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_NOT_IMPLEMENTED()
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
static ::ExceptionBase & ExcMessage(std::string arg1)
TriaActiveIterator< CellAccessor< dim, spacedim > > active_cell_iterator
typename ActiveSelector::active_cell_iterator active_cell_iterator
const bool IsBlockVector< VectorType >::value
@ update_values
Shape function values.
@ update_gradients
Shape function gradients.
MappingQ< dim, spacedim > StaticMappingQ1< dim, spacedim >::mapping
The namespace for the EvaluationFlags enum.
EvaluationFlags
The EvaluationFlags enum.
Tpetra::Vector< Number, LO, GO, NodeType< MemorySpace > > VectorType
T reduce(const T &local_value, const MPI_Comm comm, const std::function< T(const T &, const T &)> &combiner, const unsigned int root_process=0)