17#ifndef dealii_matrix_free_h
18#define dealii_matrix_free_h
110 typename Number = double,
115 std::is_same<Number, typename VectorizedArrayType::value_type>::value,
116 "Type of Number and of VectorizedArrayType do not match.");
291 other.mapping_update_flags_boundary_faces;
294 other.mapping_update_flags_faces_by_cells;
300 other.overlap_communication_computation;
304 other.cell_vectorization_categories_strict;
587 template <
typename QuadratureType,
typename number2,
typename MappingType>
616 template <
typename QuadratureType,
typename number2,
typename MappingType>
621 const std::vector<QuadratureType> & quad,
631 template <
typename QuadratureType,
typename number2,
typename MappingType>
793 template <
typename OutVector,
typename InVector>
850 template <
typename CLASS,
typename OutVector,
typename InVector>
865 template <
typename CLASS,
typename OutVector,
typename InVector>
961 template <
typename CLASS,
typename OutVector,
typename InVector>
980 template <
typename CLASS,
typename OutVector,
typename InVector>
1000 template <
typename OutVector,
typename InVector>
1009 const std::function<
void(
const unsigned int,
const unsigned int)>
1011 const std::function<
void(
const unsigned int,
const unsigned int)>
1090 template <
typename OutVector,
typename InVector>
1097 const std::function<
1102 const std::function<
void(
1200 template <
typename CLASS,
typename OutVector,
typename InVector>
1230 template <
typename CLASS,
typename OutVector,
typename InVector>
1375 template <
typename CLASS,
typename OutVector,
typename InVector>
1409 template <
typename CLASS,
typename OutVector,
typename InVector>
1444 template <
typename OutVector,
typename InVector>
1451 const std::function<
1456 const std::function<
void(
1463 const std::function<
void(
const unsigned int,
const unsigned int)>
1465 const std::function<
void(
const unsigned int,
const unsigned int)>
1537 template <
typename CLASS,
typename OutVector,
typename InVector>
1554 template <
typename CLASS,
typename OutVector,
typename InVector>
1571 template <
typename OutVector,
typename InVector>
1577 const std::pair<unsigned int, unsigned int> &)>
1592 std::pair<unsigned int, unsigned int>
1594 const unsigned int fe_degree,
1603 std::pair<unsigned int, unsigned int>
1605 const std::pair<unsigned int, unsigned int> &
range,
1606 const unsigned int fe_index,
1620 const std::pair<unsigned int, unsigned int>
range)
const;
1627 const bool is_interior_face =
true)
const;
1640 template <
typename T>
1649 template <
typename T>
1666 template <
typename VectorType>
1688 template <
typename Number2>
1703 const std::shared_ptr<const Utilities::MPI::Partitioner> &
1727 const std::vector<unsigned int> &
1753 template <
int spacedim>
1852 const unsigned int face_number)
const;
1918 std::pair<typename DoFHandler<dim>::cell_iterator,
unsigned int>
1921 const bool interior =
true,
2027 std::pair<unsigned int, unsigned int>
2049 std::pair<unsigned int, unsigned int>
2083 template <
typename StreamType>
2111 const internal::MatrixFreeFunctions::
2112 MappingInfo<dim, Number, VectorizedArrayType> &
2147 const unsigned int quad_index = 0,
2156 VectorizedArrayType::size()> &
2216 template <
typename number2,
int q_dim>
2232 template <
typename number2>
2264 std::vector<internal::MatrixFreeFunctions::DoFInfo>
dof_info;
2347 std::list<std::pair<bool, AlignedVector<VectorizedArrayType>>>>
2354 mutable std::list<std::pair<bool, AlignedVector<Number>>>
2371template <
int dim,
typename Number,
typename VectorizedArrayType>
2372template <
typename T>
2377 vec.resize(this->n_cell_batches() + this->n_ghost_cell_batches());
2382template <
int dim,
typename Number,
typename VectorizedArrayType>
2383template <
typename T>
2388 vec.resize(this->n_inner_face_batches() + this->n_boundary_face_batches() +
2389 this->n_ghost_inner_face_batches());
2394template <
int dim,
typename Number,
typename VectorizedArrayType>
2395template <
typename VectorType>
2399 const unsigned int comp)
const
2402 "This function is not supported for block vectors.");
2404 Assert(task_info.n_procs == 1,
2405 ExcMessage(
"This function can only be used in serial."));
2413template <
int dim,
typename Number,
typename VectorizedArrayType>
2414template <
typename Number2>
2418 const unsigned int comp)
const
2421 vec.
reinit(dof_info[
comp].vector_partitioner, task_info.communicator_sm);
2426template <
int dim,
typename Number,
typename VectorizedArrayType>
2427inline const std::shared_ptr<const Utilities::MPI::Partitioner> &
2429 const unsigned int comp)
const
2432 return dof_info[
comp].vector_partitioner;
2437template <
int dim,
typename Number,
typename VectorizedArrayType>
2438inline const std::vector<unsigned int> &
2440 const unsigned int comp)
const
2443 return dof_info[
comp].constrained_dofs;
2448template <
int dim,
typename Number,
typename VectorizedArrayType>
2453 return dof_handlers.size();
2458template <
int dim,
typename Number,
typename VectorizedArrayType>
2461 const unsigned int dof_no)
const
2465 return dof_handlers[
dof_no]->get_fe().n_base_elements();
2470template <
int dim,
typename Number,
typename VectorizedArrayType>
2479template <
int dim,
typename Number,
typename VectorizedArrayType>
2483 return task_info.n_active_cells;
2488template <
int dim,
typename Number,
typename VectorizedArrayType>
2492 return *(task_info.cell_partition_data.end() - 2);
2497template <
int dim,
typename Number,
typename VectorizedArrayType>
2501 return *(task_info.cell_partition_data.end() - 1) -
2502 *(task_info.cell_partition_data.end() - 2);
2507template <
int dim,
typename Number,
typename VectorizedArrayType>
2511 if (task_info.face_partition_data.size() == 0)
2513 return task_info.face_partition_data.back();
2518template <
int dim,
typename Number,
typename VectorizedArrayType>
2522 if (task_info.face_partition_data.size() == 0)
2524 return task_info.boundary_partition_data.back() -
2525 task_info.face_partition_data.back();
2530template <
int dim,
typename Number,
typename VectorizedArrayType>
2534 if (task_info.face_partition_data.size() == 0)
2536 return face_info.faces.size() - task_info.boundary_partition_data.back();
2541template <
int dim,
typename Number,
typename VectorizedArrayType>
2549 task_info.boundary_partition_data[0],
2550 task_info.boundary_partition_data.back()));
2556template <
int dim,
typename Number,
typename VectorizedArrayType>
2560 const unsigned int face_number)
const
2564 Assert(face_info.cell_and_face_boundary_id.size(0) >= n_cell_batches(),
2568 for (
unsigned int v = 0;
2578template <
int dim,
typename Number,
typename VectorizedArrayType>
2579inline const internal::MatrixFreeFunctions::
2580 MappingInfo<dim, Number, VectorizedArrayType> &
2583 return mapping_info;
2588template <
int dim,
typename Number,
typename VectorizedArrayType>
2591 const unsigned int dof_index)
const
2594 return dof_info[dof_index];
2599template <
int dim,
typename Number,
typename VectorizedArrayType>
2603 return constraint_pool_row_index.size() - 1;
2608template <
int dim,
typename Number,
typename VectorizedArrayType>
2609inline const Number *
2611 const unsigned int row)
const
2614 return constraint_pool_data.empty() ?
2616 constraint_pool_data.data() + constraint_pool_row_index[row];
2621template <
int dim,
typename Number,
typename VectorizedArrayType>
2622inline const Number *
2624 const unsigned int row)
const
2627 return constraint_pool_data.empty() ?
2629 constraint_pool_data.data() + constraint_pool_row_index[row + 1];
2634template <
int dim,
typename Number,
typename VectorizedArrayType>
2635inline std::pair<unsigned int, unsigned int>
2637 const std::pair<unsigned int, unsigned int> &
range,
2638 const unsigned int degree,
2658 return create_cell_subrange_hp_by_index(
range,
2665template <
int dim,
typename Number,
typename VectorizedArrayType>
2671 return VectorizedArrayType::size() > 1 &&
2674 VectorizedArrayType::size() -
2680template <
int dim,
typename Number,
typename VectorizedArrayType>
2684 return shape_info.size(2);
2688template <
int dim,
typename Number,
typename VectorizedArrayType>
2691 const std::pair<unsigned int, unsigned int>
range)
const
2693 const auto &
fe_indices = dof_info[0].cell_active_fe_index;
2700 for (
unsigned int i =
range.first; i <
range.second; ++i)
2708template <
int dim,
typename Number,
typename VectorizedArrayType>
2711 const std::pair<unsigned int, unsigned int>
range,
2712 const bool is_interior_face)
const
2714 const auto &
fe_indices = dof_info[0].cell_active_fe_index;
2719 if (is_interior_face)
2721 const unsigned int index =
2723 VectorizedArrayType::size()];
2725 for (
unsigned int i =
range.first; i <
range.second; ++i)
2727 fe_indices[face_info.faces[i].cells_interior[0] /
2728 VectorizedArrayType::size()]);
2734 const unsigned int index =
2736 VectorizedArrayType::size()];
2738 for (
unsigned int i =
range.first; i <
range.second; ++i)
2740 fe_indices[face_info.faces[i].cells_exterior[0] /
2741 VectorizedArrayType::size()]);
2749template <
int dim,
typename Number,
typename VectorizedArrayType>
2757 dof_info[0].n_vectorization_lanes_filled
2766template <
int dim,
typename Number,
typename VectorizedArrayType>
2774 dof_info[0].n_vectorization_lanes_filled
2782template <
int dim,
typename Number,
typename VectorizedArrayType>
2786 const unsigned int active_fe_index)
const
2793template <
int dim,
typename Number,
typename VectorizedArrayType>
2796 const unsigned int quad_index,
2797 const unsigned int active_fe_index)
const
2800 return mapping_info.cell_data[quad_index]
2801 .descriptor[active_fe_index]
2807template <
int dim,
typename Number,
typename VectorizedArrayType>
2811 const unsigned int active_fe_index)
const
2818template <
int dim,
typename Number,
typename VectorizedArrayType>
2821 const unsigned int quad_index,
2822 const unsigned int active_fe_index)
const
2825 return mapping_info.face_data[quad_index]
2826 .descriptor[active_fe_index]
2832template <
int dim,
typename Number,
typename VectorizedArrayType>
2842template <
int dim,
typename Number,
typename VectorizedArrayType>
2852template <
int dim,
typename Number,
typename VectorizedArrayType>
2858 const unsigned int active_fe_index,
2859 const unsigned int active_quad_index)
const
2862 const unsigned int ind =
2868 return shape_info(
ind,
index_quad, active_fe_index, active_quad_index);
2873template <
int dim,
typename Number,
typename VectorizedArrayType>
2875 VectorizedArrayType::size()> &
2885template <
int dim,
typename Number,
typename VectorizedArrayType>
2890 return face_info.cell_and_face_to_plain_faces;
2895template <
int dim,
typename Number,
typename VectorizedArrayType>
2898 const unsigned int quad_index,
2899 const unsigned int active_fe_index)
const
2902 return mapping_info.cell_data[quad_index]
2903 .descriptor[active_fe_index]
2909template <
int dim,
typename Number,
typename VectorizedArrayType>
2912 const unsigned int quad_index,
2913 const unsigned int active_fe_index)
const
2916 return mapping_info.face_data[quad_index]
2917 .descriptor[active_fe_index]
2923template <
int dim,
typename Number,
typename VectorizedArrayType>
2926 const std::pair<unsigned int, unsigned int>
range)
const
2930 for (
unsigned int i =
range.first; i <
range.second; ++i)
2938template <
int dim,
typename Number,
typename VectorizedArrayType>
2939inline std::pair<unsigned int, unsigned int>
2941 const std::pair<unsigned int, unsigned int>
range)
const
2945 for (
unsigned int i =
range.first; i <
range.second; ++i)
2956template <
int dim,
typename Number,
typename VectorizedArrayType>
2963 if (dof_info[0].cell_active_fe_index.empty())
2971template <
int dim,
typename Number,
typename VectorizedArrayType>
2972inline std::pair<unsigned int, unsigned int>
2977 if (dof_info[0].cell_active_fe_index.empty())
2978 return std::make_pair(0U, 0U);
2980 std::pair<unsigned int, unsigned int>
result = std::make_pair(0U, 0U);
2981 for (
unsigned int v = 0;
2982 v < VectorizedArrayType::size() &&
2989 .cells_interior[v] /
2990 VectorizedArrayType::size()]);
2993 for (
unsigned int v = 0;
2994 v < VectorizedArrayType::size() &&
3001 .cells_exterior[v] /
3002 VectorizedArrayType::size()]);
3010template <
int dim,
typename Number,
typename VectorizedArrayType>
3014 return indices_are_initialized;
3019template <
int dim,
typename Number,
typename VectorizedArrayType>
3023 return mapping_is_initialized;
3027template <
int dim,
typename Number,
typename VectorizedArrayType>
3036template <
int dim,
typename Number,
typename VectorizedArrayType>
3041 std::list<std::pair<bool, AlignedVector<VectorizedArrayType>>>;
3044 if (
it->first ==
false)
3050 return &
data.front().second;
3055template <
int dim,
typename Number,
typename VectorizedArrayType>
3061 std::list<std::pair<bool, AlignedVector<VectorizedArrayType>>>;
3064 if (&
it->second == scratch)
3075template <
int dim,
typename Number,
typename VectorizedArrayType>
3081 scratch_pad_non_threadsafe.
begin();
3082 it != scratch_pad_non_threadsafe.
end();
3084 if (
it->first ==
false)
3089 scratch_pad_non_threadsafe.push_front(
3091 return &scratch_pad_non_threadsafe.front().second;
3096template <
int dim,
typename Number,
typename VectorizedArrayType>
3103 scratch_pad_non_threadsafe.
begin();
3104 it != scratch_pad_non_threadsafe.
end();
3106 if (&
it->second == scratch)
3123 template <
int dim,
int spacedim>
3124 inline std::vector<IndexSet>
3127 const unsigned int level)
3143template <
int dim,
typename Number,
typename VectorizedArrayType>
3144template <
typename QuadratureType,
typename number2,
typename MappingType>
3154 std::vector<const DoFHandler<dim, dim> *> dof_handlers;
3155 std::vector<const AffineConstraints<number2> *> constraints;
3157 dof_handlers.push_back(&dof_handler);
3161 internal::MatrixFreeImplementation::extract_locally_owned_index_sets(
3162 dof_handlers, additional_data.
mg_level);
3164 std::vector<hp::QCollection<dim>>
quad_hp;
3177template <
int dim,
typename Number,
typename VectorizedArrayType>
3178template <
typename QuadratureType,
typename number2,
typename MappingType>
3189 internal::MatrixFreeImplementation::extract_locally_owned_index_sets(
3190 dof_handler, additional_data.
mg_level);
3191 std::vector<hp::QCollection<dim>>
quad_hp;
3204template <
int dim,
typename Number,
typename VectorizedArrayType>
3205template <
typename QuadratureType,
typename number2,
typename MappingType>
3211 const std::vector<QuadratureType> & quad,
3216 internal::MatrixFreeImplementation::extract_locally_owned_index_sets(
3217 dof_handler, additional_data.
mg_level);
3218 std::vector<hp::QCollection<dim>>
quad_hp;
3219 for (
unsigned int q = 0;
q < quad.
size(); ++
q)
3247 template <
int dim,
typename Number,
typename VectorizedArrayType>
3248 struct VectorDataExchange
3264 const ::MatrixFree<dim, Number, VectorizedArrayType> &matrix_free,
3265 const typename ::MatrixFree<dim, Number, VectorizedArrayType>::
3268 : matrix_free(matrix_free)
3270 matrix_free.get_task_info().face_partition_data.empty() ?
3271 ::
MatrixFree<dim, Number, VectorizedArrayType>::
3272 DataAccessOnFaces::unspecified :
3277 , requests(n_components)
3283 DataAccessOnFaces::unspecified)
3284 for (unsigned
int c = 0; c < matrix_free.n_components(); ++c)
3286 matrix_free.get_dof_info(c).vector_exchanger_face_variants.size(),
3295 ~VectorDataExchange()
3297# ifdef DEAL_II_WITH_MPI
3300 matrix_free.release_scratch_data_non_threadsafe(
tmp_data[i]);
3310 template <
typename VectorType>
3316 for (
unsigned int c = 0; c < matrix_free.n_components(); ++c)
3317 if (
vec.get_partitioner().get() ==
3318 matrix_free.get_dof_info(c).vector_partitioner.get())
3322 for (
unsigned int c = 0; c < matrix_free.n_components(); ++c)
3324 vec.get_partitioner()->is_globally_compatible(
3325 *matrix_free.get_dof_info(c).vector_partitioner) :
3326 vec.get_partitioner()->is_compatible(
3327 *matrix_free.get_dof_info(c).vector_partitioner))
3346 .vector_exchanger_face_variants.size(),
3350 DataAccessOnFaces::
none)
3352 .vector_exchanger_face_variants[0];
3355 DataAccessOnFaces::
values)
3357 .vector_exchanger_face_variants[1];
3362 .vector_exchanger_face_variants[2];
3365 DataAccessOnFaces::values_all_faces)
3367 .vector_exchanger_face_variants[3];
3370 DataAccessOnFaces::gradients_all_faces)
3372 .vector_exchanger_face_variants[4];
3374 return *matrix_free.get_dof_info(
mf_component).vector_exchanger.get();
3382 template <
typename VectorType,
3383 std::enable_if_t<is_not_parallel_vector<VectorType>, VectorType>
3386 update_ghost_values_start(
const unsigned int ,
3387 const VectorType & )
3395 template <
typename VectorType,
3396 std::enable_if_t<!has_update_ghost_values_start<VectorType> &&
3398 VectorType> * =
nullptr>
3401 const VectorType &
vec)
3406 Assert(matrix_free.get_task_info().allow_ghosted_vectors_in_loops ||
3413 vec.update_ghost_values();
3423 template <
typename VectorType,
3424 std::enable_if_t<has_update_ghost_values_start<VectorType> &&
3426 VectorType> * =
nullptr>
3429 const VectorType &
vec)
3434 Assert(matrix_free.get_task_info().allow_ghosted_vectors_in_loops ||
3452 template <
typename VectorType,
3453 std::enable_if_t<has_update_ghost_values_start<VectorType> &&
3455 VectorType> * =
nullptr>
3458 const VectorType &
vec)
3461 std::is_same<Number, typename VectorType::value_type>::value,
3462 "Type mismatch between VectorType and VectorDataExchange");
3466 Assert(matrix_free.get_task_info().allow_ghosted_vectors_in_loops ||
3475# ifdef DEAL_II_WITH_MPI
3480 if (
part.n_ghost_indices() == 0 &&
part.n_import_indices() == 0 &&
3481 part.n_import_sm_procs() == 0)
3485 matrix_free.acquire_scratch_data_non_threadsafe();
3487 part.n_import_indices());
3490 part.export_to_ghosted_array_start(
3493 vec.shared_vector_data(),
3495 part.locally_owned_size(),
3497 .vector_partitioner->n_ghost_indices()),
3499 part.n_import_indices()),
3511 template <
typename VectorType,
3512 std::enable_if_t<!has_update_ghost_values_start<VectorType>,
3513 VectorType> * =
nullptr>
3515 update_ghost_values_finish(
const unsigned int ,
3516 const VectorType & )
3526 template <
typename VectorType,
3527 std::enable_if_t<has_update_ghost_values_start<VectorType> &&
3529 VectorType> * =
nullptr>
3532 const VectorType &
vec)
3535 vec.update_ghost_values_finish();
3546 template <
typename VectorType,
3547 std::enable_if_t<has_update_ghost_values_start<VectorType> &&
3549 VectorType> * =
nullptr>
3552 const VectorType &
vec)
3555 std::is_same<Number, typename VectorType::value_type>::value,
3556 "Type mismatch between VectorType and VectorDataExchange");
3561# ifdef DEAL_II_WITH_MPI
3569 if (
part.n_ghost_indices() != 0 ||
part.n_import_indices() != 0 ||
3570 part.n_import_sm_procs() != 0)
3572 part.export_to_ghosted_array_finish(
3574 vec.shared_vector_data(),
3576 part.locally_owned_size(),
3578 .vector_partitioner->n_ghost_indices()),
3581 matrix_free.release_scratch_data_non_threadsafe(
3589 vec.set_ghost_state(
true);
3597 template <
typename VectorType,
3598 std::enable_if_t<is_not_parallel_vector<VectorType>, VectorType>
3601 compress_start(
const unsigned int ,
3611 template <
typename VectorType,
3612 std::enable_if_t<!has_compress_start<VectorType> &&
3614 VectorType> * =
nullptr>
3631 template <
typename VectorType,
3632 std::enable_if_t<has_compress_start<VectorType> &&
3634 VectorType> * =
nullptr>
3652 template <
typename VectorType,
3653 std::enable_if_t<has_compress_start<VectorType> &&
3655 VectorType> * =
nullptr>
3661 std::is_same<Number, typename VectorType::value_type>::value,
3662 "Type mismatch between VectorType and VectorDataExchange");
3668# ifdef DEAL_II_WITH_MPI
3673 if (
part.n_ghost_indices() == 0 &&
part.n_import_indices() == 0 &&
3674 part.n_import_sm_procs() == 0)
3678 matrix_free.acquire_scratch_data_non_threadsafe();
3680 part.n_import_indices());
3683 part.import_from_ghosted_array_start(
3687 vec.shared_vector_data(),
3690 .vector_partitioner->n_ghost_indices()),
3692 part.n_import_indices()),
3705 typename VectorType,
3706 std::enable_if_t<!has_compress_start<VectorType>, VectorType> * =
nullptr>
3708 compress_finish(
const unsigned int ,
3719 template <
typename VectorType,
3720 std::enable_if_t<has_compress_start<VectorType> &&
3722 VectorType> * =
nullptr>
3739 template <
typename VectorType,
3740 std::enable_if_t<has_compress_start<VectorType> &&
3742 VectorType> * =
nullptr>
3748 std::is_same<Number, typename VectorType::value_type>::value,
3749 "Type mismatch between VectorType and VectorDataExchange");
3753# ifdef DEAL_II_WITH_MPI
3761 if (
part.n_ghost_indices() != 0 ||
part.n_import_indices() != 0 ||
3762 part.n_import_sm_procs() != 0)
3764 part.import_from_ghosted_array_finish(
3767 vec.shared_vector_data(),
3770 .vector_partitioner->n_ghost_indices()),
3773 part.n_import_indices()),
3776 matrix_free.release_scratch_data_non_threadsafe(
3784 MPI_Barrier(matrix_free.get_task_info().communicator_sm);
3796 template <
typename VectorType,
3797 std::enable_if_t<is_not_parallel_vector<VectorType>, VectorType>
3800 reset_ghost_values(
const VectorType & )
const
3809 template <
typename VectorType,
3810 std::enable_if_t<!has_exchange_on_subset<VectorType> &&
3812 VectorType> * =
nullptr>
3814 reset_ghost_values(
const VectorType &
vec)
const
3819 vec.zero_out_ghost_values();
3829 template <
typename VectorType,
3830 std::enable_if_t<has_exchange_on_subset<VectorType>, VectorType>
3833 reset_ghost_values(
const VectorType &
vec)
const
3836 std::is_same<Number, typename VectorType::value_type>::value,
3837 "Type mismatch between VectorType and VectorDataExchange");
3843# ifdef DEAL_II_WITH_MPI
3850 if (
part.n_ghost_indices() > 0)
3855 part.locally_owned_size(),
3857 .vector_partitioner->n_ghost_indices()));
3863 vec.set_ghost_state(
false);
3873 template <
typename VectorType,
3874 std::enable_if_t<has_exchange_on_subset<VectorType>, VectorType>
3880 std::is_same<Number, typename VectorType::value_type>::value,
3881 "Type mismatch between VectorType and VectorDataExchange");
3896 for (
unsigned int id =
3915 template <
typename VectorType,
3916 std::enable_if_t<!has_exchange_on_subset<VectorType>, VectorType>
3918 typename VectorType::value_type * =
nullptr>
3923 vec =
typename VectorType::value_type();
3937 "which provide VectorType::value_type"));
3942 const ::MatrixFree<dim, Number, VectorizedArrayType> &matrix_free;
3943 const typename ::MatrixFree<dim, Number, VectorizedArrayType>
::
3946# ifdef DEAL_II_WITH_MPI
3947 std::vector<AlignedVector<Number> *>
tmp_data;
3948 std::vector<std::vector<MPI_Request>> requests;
3952 template <
typename VectorStruct>
3956 template <
typename VectorStruct>
3959 std::integral_constant<bool, true>)
3961 unsigned int components = 0;
3962 for (
unsigned int bl = 0;
bl <
vec.n_blocks(); ++
bl)
3963 components += n_components(
vec.block(
bl));
3967 template <
typename VectorStruct>
3974 template <
typename VectorStruct>
3982 template <
typename VectorStruct>
3984 n_components(
const std::vector<VectorStruct> &
vec)
3986 unsigned int components = 0;
3994 template <
typename VectorStruct>
3996 n_components(
const std::vector<VectorStruct *> &
vec)
3998 unsigned int components = 0;
4014 std::enable_if_t<!has_communication_block_size<VectorStruct>,
4016 constexpr unsigned int
4025 std::enable_if_t<has_communication_block_size<VectorStruct>,
4027 constexpr unsigned int
4030 return VectorStruct::communication_block_size;
4035 template <
typename VectorType,
4036 std::enable_if_t<is_not_parallel_vector<VectorType>, VectorType> * =
4039 has_ghost_elements(
const VectorType &
vec)
4047 template <
typename VectorType,
4048 std::enable_if_t<!is_not_parallel_vector<VectorType>, VectorType>
4051 has_ghost_elements(
const VectorType &
vec)
4053 return vec.has_ghost_elements();
4070 typename VectorizedArrayType,
4071 std::enable_if_t<IsBlockVector<VectorStruct>::value,
VectorStruct>
4074 update_ghost_values_start(
4077 const unsigned int channel = 0)
4084 .allow_ghosted_vectors_in_loops ||
4091 vec.update_ghost_values();
4095 for (
unsigned int i = 0; i <
vec.n_blocks(); ++i)
4106 typename VectorizedArrayType,
4107 std::enable_if_t<!IsBlockVector<VectorStruct>::value,
VectorStruct>
4110 update_ghost_values_start(
4113 const unsigned int channel = 0)
4124 typename VectorizedArrayType>
4126 update_ghost_values_start(
4127 const std::vector<VectorStruct> &
vec,
4144 typename VectorizedArrayType>
4146 update_ghost_values_start(
4147 const std::vector<VectorStruct *> &
vec,
4168 typename VectorizedArrayType,
4169 std::enable_if_t<IsBlockVector<VectorStruct>::value,
VectorStruct>
4172 update_ghost_values_finish(
4175 const unsigned int channel = 0)
4183 for (
unsigned int i = 0; i <
vec.n_blocks(); ++i)
4193 typename VectorizedArrayType,
4194 std::enable_if_t<!IsBlockVector<VectorStruct>::value,
VectorStruct>
4197 update_ghost_values_finish(
4200 const unsigned int channel = 0)
4211 typename VectorizedArrayType>
4213 update_ghost_values_finish(
4214 const std::vector<VectorStruct> &
vec,
4231 typename VectorizedArrayType>
4233 update_ghost_values_finish(
4234 const std::vector<VectorStruct *> &
vec,
4255 typename VectorizedArrayType,
4256 std::enable_if_t<IsBlockVector<VectorStruct>::value,
VectorStruct>
4262 const unsigned int channel = 0)
4267 for (
unsigned int i = 0; i <
vec.n_blocks(); ++i)
4277 typename VectorizedArrayType,
4278 std::enable_if_t<!IsBlockVector<VectorStruct>::value,
VectorStruct>
4284 const unsigned int channel = 0)
4295 typename VectorizedArrayType>
4298 std::vector<VectorStruct> &
vec,
4315 typename VectorizedArrayType>
4318 std::vector<VectorStruct *> &
vec,
4339 typename VectorizedArrayType,
4340 std::enable_if_t<IsBlockVector<VectorStruct>::value,
VectorStruct>
4346 const unsigned int channel = 0)
4354 for (
unsigned int i = 0; i <
vec.n_blocks(); ++i)
4364 typename VectorizedArrayType,
4365 std::enable_if_t<!IsBlockVector<VectorStruct>::value,
VectorStruct>
4371 const unsigned int channel = 0)
4382 typename VectorizedArrayType>
4385 std::vector<VectorStruct> &
vec,
4402 typename VectorizedArrayType>
4405 std::vector<VectorStruct *> &
vec,
4430 typename VectorizedArrayType,
4431 std::enable_if_t<IsBlockVector<VectorStruct>::value,
VectorStruct>
4442 for (
unsigned int i = 0; i <
vec.n_blocks(); ++i)
4452 typename VectorizedArrayType,
4453 std::enable_if_t<!IsBlockVector<VectorStruct>::value,
VectorStruct>
4469 typename VectorizedArrayType>
4472 const std::vector<VectorStruct> &
vec,
4489 typename VectorizedArrayType>
4492 const std::vector<VectorStruct *> &
vec,
4513 typename VectorizedArrayType,
4514 std::enable_if_t<IsBlockVector<VectorStruct>::value,
VectorStruct>
4522 for (
unsigned int i = 0; i <
vec.n_blocks(); ++i)
4532 typename VectorizedArrayType,
4533 std::enable_if_t<!IsBlockVector<VectorStruct>::value,
VectorStruct>
4550 typename VectorizedArrayType>
4554 std::vector<VectorStruct> &
vec,
4567 typename VectorizedArrayType>
4571 std::vector<VectorStruct *> &
vec,
4583 template <
typename VectorStruct1,
typename VectorStruct2>
4590 template <
typename Number>
4593 const std::vector<unsigned int> & constrained_dofs,
4597 for (
const unsigned int i : constrained_dofs)
4598 dst.local_element(i) = src.local_element(i);
4602 namespace MatrixFreeFunctions
4606 template <
typename,
typename,
typename,
typename,
bool>
4611 template <
typename MF,
4625 template <
typename MF,
4632 void (Container::*)(
const MF &,
4643 template <
typename MF,
4648 class MFWorker :
public MFWorkerInterface
4653 InterfaceSelector<MF, InVector, OutVector, Container, is_constant>
::
4661 const Container & container,
4666 MF::DataAccessOnFaces::none,
4668 MF::DataAccessOnFaces::none,
4669 const std::function<
void(
const unsigned int,
const unsigned int)>
4671 const std::function<void(
const unsigned int,
const unsigned int)>
4674 : matrix_free(matrix_free)
4675 , container(
const_cast<Container &>(container))
4694 Assert(!has_ghost_elements(dst),
4695 ExcMessage(
"The destination vector passed to the matrix-free "
4696 "loop is ghosted. This is not allowed."));
4701 cell(
const std::pair<unsigned int, unsigned int> &
cell_range)
override
4704 for (
unsigned int i = 0; i < matrix_free.n_active_fe_indices(); ++i)
4707 matrix_free.create_cell_subrange_hp_by_index(
cell_range, i);
4721 matrix_free.get_task_info().cell_partition_data_hp_ptr,
4722 matrix_free.get_task_info().cell_partition_data_hp,
4730 matrix_free.get_task_info().face_partition_data_hp_ptr,
4731 matrix_free.get_task_info().face_partition_data_hp,
4739 matrix_free.get_task_info().boundary_partition_data_hp_ptr,
4740 matrix_free.get_task_info().boundary_partition_data_hp,
4747 const std::vector<unsigned int> &ptr,
4748 const std::vector<unsigned int> &data,
4758 (container.*
fu)(matrix_free,
4761 std::make_pair(data[2 * i], data[2 * i + 1]));
4773 vector_update_ghosts_start()
override
4781 vector_update_ghosts_finish()
override
4789 vector_compress_start()
override
4796 vector_compress_finish()
override
4805 zero_dst_vector_range(
const unsigned int range_index)
override
4812 cell_loop_pre_range(
const unsigned int range_index)
override
4831 for (
unsigned int id =
4842 cell_loop_post_range(
const unsigned int range_index)
override
4848 const std::vector<unsigned int> &partition_row_index =
4849 matrix_free.get_task_info().partition_row_index;
4851 partition_row_index[partition_row_index.size() - 2] - 1)
4872 for (
unsigned int id =
4883 const MF & matrix_free;
4884 Container & container;
4891 VectorDataExchange<MF::dimension,
4893 typename MF::vectorized_value_type>
4895 VectorDataExchange<MF::dimension,
4897 typename MF::vectorized_value_type>
4901 const std::function<void(
const unsigned int,
const unsigned int)>
4903 const std::function<void(
const unsigned int,
const unsigned int)>
4914 template <
class MF,
typename InVector,
typename OutVector>
4918 std::function<void(
const MF &,
4921 const std::pair<unsigned int, unsigned int> &)>;
4928 , boundary(boundary)
4935 const std::pair<unsigned int, unsigned int> &
range)
const
4945 const std::pair<unsigned int, unsigned int> &
range)
const
4956 const std::pair<unsigned int, unsigned int> &
range)
const
4959 boundary(
mf, dst, src,
range);
4971template <
int dim,
typename Number,
typename VectorizedArrayType>
4972template <
typename OutVector,
typename InVector>
4978 const std::pair<unsigned int, unsigned int> &)>
4985 internal::MFClassWrapper<MatrixFree<dim, Number, VectorizedArrayType>,
4989 internal::MFWorker<MatrixFree<dim, Number, VectorizedArrayType>,
5003 task_info.loop(worker);
5008template <
int dim,
typename Number,
typename VectorizedArrayType>
5009template <
typename OutVector,
typename InVector>
5015 const std::pair<unsigned int, unsigned int> &)>
5019 const std::function<
void(
const unsigned int,
const unsigned int)>
5021 const std::function<
void(
const unsigned int,
const unsigned int)>
5026 internal::MFClassWrapper<MatrixFree<dim, Number, VectorizedArrayType>,
5030 internal::MFWorker<MatrixFree<dim, Number, VectorizedArrayType>,
5043 DataAccessOnFaces::none,
5044 DataAccessOnFaces::none,
5049 task_info.loop(worker);
5054template <
int dim,
typename Number,
typename VectorizedArrayType>
5055template <
typename OutVector,
typename InVector>
5061 const std::pair<unsigned int, unsigned int> &)>
5066 const std::pair<unsigned int, unsigned int> &)>
5071 const std::pair<unsigned int, unsigned int> &)>
5080 internal::MFClassWrapper<MatrixFree<dim, Number, VectorizedArrayType>,
5084 internal::MFWorker<MatrixFree<dim, Number, VectorizedArrayType>,
5100 task_info.loop(worker);
5105template <
int dim,
typename Number,
typename VectorizedArrayType>
5106template <
typename CLASS,
typename OutVector,
typename InVector>
5119 internal::MFWorker<MatrixFree<dim, Number, VectorizedArrayType>,
5137template <
int dim,
typename Number,
typename VectorizedArrayType>
5138template <
typename CLASS,
typename OutVector,
typename InVector>
5155 internal::MFWorker<MatrixFree<dim, Number, VectorizedArrayType>,
5178template <
int dim,
typename Number,
typename VectorizedArrayType>
5179template <
typename CLASS,
typename OutVector,
typename InVector>
5204 internal::MFWorker<MatrixFree<dim, Number, VectorizedArrayType>,
5224template <
int dim,
typename Number,
typename VectorizedArrayType>
5225template <
typename CLASS,
typename OutVector,
typename InVector>
5238 internal::MFWorker<MatrixFree<dim, Number, VectorizedArrayType>,
5256template <
int dim,
typename Number,
typename VectorizedArrayType>
5257template <
typename CLASS,
typename OutVector,
typename InVector>
5274 internal::MFWorker<MatrixFree<dim, Number, VectorizedArrayType>,
5297template <
int dim,
typename Number,
typename VectorizedArrayType>
5298template <
typename CLASS,
typename OutVector,
typename InVector>
5323 internal::MFWorker<MatrixFree<dim, Number, VectorizedArrayType>,
5343template <
int dim,
typename Number,
typename VectorizedArrayType>
5344template <
typename OutVector,
typename InVector>
5350 const std::pair<unsigned int, unsigned int> &)>
5355 const std::pair<unsigned int, unsigned int> &)>
5360 const std::pair<unsigned int, unsigned int> &)>
5364 const std::function<
void(
const unsigned int,
const unsigned int)>
5366 const std::function<
void(
const unsigned int,
const unsigned int)>
5373 internal::MFClassWrapper<MatrixFree<dim, Number, VectorizedArrayType>,
5377 internal::MFWorker<MatrixFree<dim, Number, VectorizedArrayType>,
5396 task_info.loop(worker);
5401template <
int dim,
typename Number,
typename VectorizedArrayType>
5402template <
typename CLASS,
typename OutVector,
typename InVector>
5431 internal::MFWorker<MatrixFree<dim, Number, VectorizedArrayType>,
5454template <
int dim,
typename Number,
typename VectorizedArrayType>
5455template <
typename CLASS,
typename OutVector,
typename InVector>
5482 internal::MFWorker<MatrixFree<dim, Number, VectorizedArrayType>,
5505template <
int dim,
typename Number,
typename VectorizedArrayType>
5506template <
typename CLASS,
typename OutVector,
typename InVector>
5526 internal::MFWorker<MatrixFree<dim, Number, VectorizedArrayType>,
5546template <
int dim,
typename Number,
typename VectorizedArrayType>
5547template <
typename CLASS,
typename OutVector,
typename InVector>
5567 internal::MFWorker<MatrixFree<dim, Number, VectorizedArrayType>,
5587template <
int dim,
typename Number,
typename VectorizedArrayType>
5588template <
typename OutVector,
typename InVector>
5594 const std::pair<unsigned int, unsigned int> &)>
5608 internal::MFClassWrapper<MatrixFree<dim, Number, VectorizedArrayType>,
5613 internal::MFWorker<MatrixFree<dim, Number, VectorizedArrayType>,
5627 DataAccessOnFaces::none);
5628 task_info.loop(worker);
value_type * data() const noexcept
void reinit(value_type *starting_element, const std::size_t n_elements)
unsigned int n_active_fe_indices() const
std::pair< typename DoFHandler< dim >::cell_iterator, unsigned int > get_face_iterator(const unsigned int face_batch_index, const unsigned int lane_index, const bool interior=true, const unsigned int fe_component=0) const
void loop_cell_centric(void(CLASS::*cell_operation)(const MatrixFree &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &), CLASS *owning_class, OutVector &dst, const InVector &src, const bool zero_dst_vector=false, const DataAccessOnFaces src_vector_face_access=DataAccessOnFaces::unspecified) const
internal::MatrixFreeFunctions::MappingInfo< dim, Number, VectorizedArrayType > mapping_info
unsigned int get_cell_active_fe_index(const std::pair< unsigned int, unsigned int > range) const
const internal::MatrixFreeFunctions::TaskInfo & get_task_info() const
unsigned int n_ghost_cell_batches() const
void loop(const std::function< void(const MatrixFree< dim, Number, VectorizedArrayType > &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &)> &cell_operation, const std::function< void(const MatrixFree< dim, Number, VectorizedArrayType > &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &)> &face_operation, const std::function< void(const MatrixFree< dim, Number, VectorizedArrayType > &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &)> &boundary_operation, OutVector &dst, const InVector &src, const bool zero_dst_vector=false, const DataAccessOnFaces dst_vector_face_access=DataAccessOnFaces::unspecified, const DataAccessOnFaces src_vector_face_access=DataAccessOnFaces::unspecified) const
const internal::MatrixFreeFunctions::ShapeInfo< VectorizedArrayType > & get_shape_info(const unsigned int dof_handler_index_component=0, const unsigned int quad_index=0, const unsigned int fe_base_element=0, const unsigned int hp_active_fe_index=0, const unsigned int hp_active_quad_index=0) const
void initialize_dof_handlers(const std::vector< const DoFHandler< dim, dim > * > &dof_handlers, const AdditionalData &additional_data)
types::boundary_id get_boundary_id(const unsigned int face_batch_index) const
Table< 4, internal::MatrixFreeFunctions::ShapeInfo< VectorizedArrayType > > shape_info
void print(std::ostream &out) const
void update_mapping(const std::shared_ptr< hp::MappingCollection< dim > > &mapping)
const Table< 3, unsigned int > & get_cell_and_face_to_plain_faces() const
unsigned int n_inner_face_batches() const
unsigned int n_active_entries_per_cell_batch(const unsigned int cell_batch_index) const
void update_mapping(const Mapping< dim > &mapping)
const Quadrature< dim > & get_quadrature(const unsigned int quad_index=0, const unsigned int hp_active_fe_index=0) const
const internal::MatrixFreeFunctions::FaceToCellTopology< VectorizedArrayType::size()> & get_face_info(const unsigned int face_batch_index) const
unsigned int get_mg_level() const
void print_memory_consumption(StreamType &out) const
bool mapping_initialized() const
void cell_loop(const std::function< void(const MatrixFree< dim, Number, VectorizedArrayType > &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &)> &cell_operation, OutVector &dst, const InVector &src, const std::function< void(const unsigned int, const unsigned int)> &operation_before_loop, const std::function< void(const unsigned int, const unsigned int)> &operation_after_loop, const unsigned int dof_handler_index_pre_post=0) const
void internal_reinit(const std::shared_ptr< hp::MappingCollection< dim > > &mapping, const std::vector< const DoFHandler< dim, dim > * > &dof_handlers, const std::vector< const AffineConstraints< number2 > * > &constraint, const std::vector< IndexSet > &locally_owned_set, const std::vector< hp::QCollection< q_dim > > &quad, const AdditionalData &additional_data)
unsigned int get_n_q_points_face(const unsigned int quad_index=0, const unsigned int hp_active_fe_index=0) const
const internal::MatrixFreeFunctions::DoFInfo & get_dof_info(const unsigned int dof_handler_index_component=0) const
AlignedVector< VectorizedArrayType > * acquire_scratch_data() const
bool at_irregular_cell(const unsigned int cell_batch_index) const
~MatrixFree() override=default
const AffineConstraints< Number > & get_affine_constraints(const unsigned int dof_handler_index=0) const
void copy_from(const MatrixFree< dim, Number, VectorizedArrayType > &matrix_free_base)
void initialize_face_data_vector(AlignedVector< T > &vec) const
unsigned int get_dofs_per_cell(const unsigned int dof_handler_index=0, const unsigned int hp_active_fe_index=0) const
unsigned int n_constraint_pool_entries() const
void cell_loop(void(CLASS::*cell_operation)(const MatrixFree &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &), CLASS *owning_class, OutVector &dst, const InVector &src, const std::function< void(const unsigned int, const unsigned int)> &operation_before_loop, const std::function< void(const unsigned int, const unsigned int)> &operation_after_loop, const unsigned int dof_handler_index_pre_post=0) const
const Number * constraint_pool_begin(const unsigned int pool_index) const
AlignedVector< Number > * acquire_scratch_data_non_threadsafe() const
const IndexSet & get_locally_owned_set(const unsigned int dof_handler_index=0) const
unsigned int get_dofs_per_face(const unsigned int dof_handler_index=0, const unsigned int hp_active_fe_index=0) const
internal::MatrixFreeFunctions::TaskInfo task_info
const DoFHandler< dim > & get_dof_handler(const unsigned int dof_handler_index=0) const
void release_scratch_data(const AlignedVector< VectorizedArrayType > *memory) const
void loop(void(CLASS::*cell_operation)(const MatrixFree &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &) const, void(CLASS::*face_operation)(const MatrixFree &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &) const, void(CLASS::*boundary_operation)(const MatrixFree &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &) const, const CLASS *owning_class, OutVector &dst, const InVector &src, const bool zero_dst_vector=false, const DataAccessOnFaces dst_vector_face_access=DataAccessOnFaces::unspecified, const DataAccessOnFaces src_vector_face_access=DataAccessOnFaces::unspecified) const
bool mapping_is_initialized
void loop_cell_centric(void(CLASS::*cell_operation)(const MatrixFree &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &) const, const CLASS *owning_class, OutVector &dst, const InVector &src, const bool zero_dst_vector=false, const DataAccessOnFaces src_vector_face_access=DataAccessOnFaces::unspecified) const
void initialize_dof_vector(LinearAlgebra::distributed::Vector< Number2 > &vec, const unsigned int dof_handler_index=0) const
DoFHandler< dim >::cell_iterator get_cell_iterator(const unsigned int cell_batch_index, const unsigned int lane_index, const unsigned int dof_handler_index=0) const
MatrixFree(const MatrixFree< dim, Number, VectorizedArrayType > &other)
std::pair< unsigned int, unsigned int > create_cell_subrange_hp(const std::pair< unsigned int, unsigned int > &range, const unsigned int fe_degree, const unsigned int dof_handler_index=0) const
std::pair< unsigned int, unsigned int > create_cell_subrange_hp_by_index(const std::pair< unsigned int, unsigned int > &range, const unsigned int fe_index, const unsigned int dof_handler_index=0) const
std::pair< unsigned int, unsigned int > get_face_range_category(const std::pair< unsigned int, unsigned int > face_batch_range) const
void cell_loop(void(CLASS::*cell_operation)(const MatrixFree &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &) const, const CLASS *owning_class, OutVector &dst, const InVector &src, const std::function< void(const unsigned int, const unsigned int)> &operation_before_loop, const std::function< void(const unsigned int, const unsigned int)> &operation_after_loop, const unsigned int dof_handler_index_pre_post=0) const
std::vector< std::pair< unsigned int, unsigned int > > cell_level_index
const std::shared_ptr< const Utilities::MPI::Partitioner > & get_vector_partitioner(const unsigned int dof_handler_index=0) const
const internal::MatrixFreeFunctions::MappingInfo< dim, Number, VectorizedArrayType > & get_mapping_info() const
std::vector< Number > constraint_pool_data
VectorizedArrayType vectorized_value_type
unsigned int n_cell_batches() const
const IndexSet & get_ghost_set(const unsigned int dof_handler_index=0) const
std::pair< int, int > get_cell_level_and_index(const unsigned int cell_batch_index, const unsigned int lane_index) const
bool indices_initialized() const
const Quadrature< dim - 1 > & get_face_quadrature(const unsigned int quad_index=0, const unsigned int hp_active_fe_index=0) const
unsigned int get_cell_category(const unsigned int cell_batch_index) const
Threads::ThreadLocalStorage< std::list< std::pair< bool, AlignedVector< VectorizedArrayType > > > > scratch_pad
unsigned int get_matrix_free_cell_index(const typename Triangulation< dim >::cell_iterator &cell) const
std::size_t memory_consumption() const
std::pair< unsigned int, unsigned int > get_face_category(const unsigned int face_batch_index) const
unsigned int n_boundary_face_batches() const
void cell_loop(void(CLASS::*cell_operation)(const MatrixFree &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &) const, const CLASS *owning_class, OutVector &dst, const InVector &src, const bool zero_dst_vector=false) const
std::list< std::pair< bool, AlignedVector< Number > > > scratch_pad_non_threadsafe
const Number * constraint_pool_end(const unsigned int pool_index) const
void loop_cell_centric(const std::function< void(const MatrixFree &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &)> &cell_operation, OutVector &dst, const InVector &src, const bool zero_dst_vector=false, const DataAccessOnFaces src_vector_face_access=DataAccessOnFaces::unspecified) const
std::vector< SmartPointer< const DoFHandler< dim > > > dof_handlers
void initialize_indices(const std::vector< const AffineConstraints< number2 > * > &constraint, const std::vector< IndexSet > &locally_owned_set, const AdditionalData &additional_data)
std::vector< SmartPointer< const AffineConstraints< Number > > > affine_constraints
unsigned int n_components() const
unsigned int n_physical_cells() const
void initialize_dof_vector(VectorType &vec, const unsigned int dof_handler_index=0) const
unsigned int get_n_q_points(const unsigned int quad_index=0, const unsigned int hp_active_fe_index=0) const
void reinit(const MappingType &mapping, const std::vector< const DoFHandler< dim > * > &dof_handler, const std::vector< const AffineConstraints< number2 > * > &constraint, const QuadratureType &quad, const AdditionalData &additional_data=AdditionalData())
std::vector< unsigned int > mf_cell_indices
void cell_loop(const std::function< void(const MatrixFree< dim, Number, VectorizedArrayType > &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &)> &cell_operation, OutVector &dst, const InVector &src, const bool zero_dst_vector=false) const
void loop(void(CLASS::*cell_operation)(const MatrixFree &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &), void(CLASS::*face_operation)(const MatrixFree &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &), void(CLASS::*boundary_operation)(const MatrixFree &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &), const CLASS *owning_class, OutVector &dst, const InVector &src, const std::function< void(const unsigned int, const unsigned int)> &operation_before_loop, const std::function< void(const unsigned int, const unsigned int)> &operation_after_loop, const unsigned int dof_handler_index_pre_post=0, const DataAccessOnFaces dst_vector_face_access=DataAccessOnFaces::unspecified, const DataAccessOnFaces src_vector_face_access=DataAccessOnFaces::unspecified) const
void cell_loop(void(CLASS::*cell_operation)(const MatrixFree &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &), CLASS *owning_class, OutVector &dst, const InVector &src, const bool zero_dst_vector=false) const
std::vector< internal::MatrixFreeFunctions::DoFInfo > dof_info
void initialize_cell_data_vector(AlignedVector< T > &vec) const
unsigned int n_ghost_inner_face_batches() const
void release_scratch_data_non_threadsafe(const AlignedVector< Number > *memory) const
void renumber_dofs(std::vector< types::global_dof_index > &renumbering, const unsigned int dof_handler_index=0)
unsigned int get_face_active_fe_index(const std::pair< unsigned int, unsigned int > range, const bool is_interior_face=true) const
unsigned int n_active_entries_per_face_batch(const unsigned int face_batch_index) const
bool indices_are_initialized
internal::MatrixFreeFunctions::FaceInfo< VectorizedArrayType::size()> face_info
void reinit(const MappingType &mapping, const DoFHandler< dim > &dof_handler, const AffineConstraints< number2 > &constraint, const QuadratureType &quad, const AdditionalData &additional_data=AdditionalData())
unsigned int get_cell_range_category(const std::pair< unsigned int, unsigned int > cell_batch_range) const
void loop(void(CLASS::*cell_operation)(const MatrixFree &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &), void(CLASS::*face_operation)(const MatrixFree &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &), void(CLASS::*boundary_operation)(const MatrixFree &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &), CLASS *owning_class, OutVector &dst, const InVector &src, const bool zero_dst_vector=false, const DataAccessOnFaces dst_vector_face_access=DataAccessOnFaces::unspecified, const DataAccessOnFaces src_vector_face_access=DataAccessOnFaces::unspecified) const
void reinit(const MappingType &mapping, const std::vector< const DoFHandler< dim > * > &dof_handler, const std::vector< const AffineConstraints< number2 > * > &constraint, const std::vector< QuadratureType > &quad, const AdditionalData &additional_data=AdditionalData())
std::array< types::boundary_id, VectorizedArrayType::size()> get_faces_by_cells_boundary_id(const unsigned int cell_batch_index, const unsigned int face_number) const
std::vector< unsigned int > constraint_pool_row_index
void loop(const std::function< void(const MatrixFree< dim, Number, VectorizedArrayType > &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &)> &cell_operation, const std::function< void(const MatrixFree< dim, Number, VectorizedArrayType > &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &)> &face_operation, const std::function< void(const MatrixFree< dim, Number, VectorizedArrayType > &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &)> &boundary_operation, OutVector &dst, const InVector &src, const std::function< void(const unsigned int, const unsigned int)> &operation_before_loop, const std::function< void(const unsigned int, const unsigned int)> &operation_after_loop, const unsigned int dof_handler_index_pre_post=0, const DataAccessOnFaces dst_vector_face_access=DataAccessOnFaces::unspecified, const DataAccessOnFaces src_vector_face_access=DataAccessOnFaces::unspecified) const
const std::vector< unsigned int > & get_constrained_dofs(const unsigned int dof_handler_index=0) const
unsigned int cell_level_index_end_local
unsigned int n_base_elements(const unsigned int dof_handler_index) const
void loop(void(CLASS::*cell_operation)(const MatrixFree &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &) const, void(CLASS::*face_operation)(const MatrixFree &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &) const, void(CLASS::*boundary_operation)(const MatrixFree &, OutVector &, const InVector &, const std::pair< unsigned int, unsigned int > &) const, const CLASS *owning_class, OutVector &dst, const InVector &src, const std::function< void(const unsigned int, const unsigned int)> &operation_before_loop, const std::function< void(const unsigned int, const unsigned int)> &operation_after_loop, const unsigned int dof_handler_index_pre_post=0, const DataAccessOnFaces dst_vector_face_access=DataAccessOnFaces::unspecified, const DataAccessOnFaces src_vector_face_access=DataAccessOnFaces::unspecified) const
static bool is_supported(const FiniteElement< dim, spacedim > &fe)
static constexpr unsigned int dimension
A class that provides a separate storage location on each thread that accesses the object.
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
#define AssertThrowMPI(error_code)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcIndexRange(std::size_t arg1, std::size_t arg2, std::size_t arg3)
static ::ExceptionBase & ExcNotInitialized()
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
typename ActiveSelector::cell_iterator cell_iterator
@ update_JxW_values
Transformed quadrature weights.
@ update_gradients
Shape function gradients.
@ update_default
No update.
VectorType::value_type * begin(VectorType &V)
unsigned int minimum_parallel_grain_size
const types::boundary_id invalid_boundary_id
static const unsigned int invalid_unsigned_int
void apply_to_subranges(const Iterator &begin, const std_cxx20::type_identity_t< Iterator > &end, const Function &f, const unsigned int grainsize)
::VectorizedArray< Number, width > max(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
unsigned short int fe_index
TasksParallelScheme tasks_parallel_scheme
bool hold_all_faces_to_owned_cells
UpdateFlags mapping_update_flags_inner_faces
AdditionalData(const TasksParallelScheme tasks_parallel_scheme=partition_partition, const unsigned int tasks_block_size=0, const UpdateFlags mapping_update_flags=update_gradients|update_JxW_values, const UpdateFlags mapping_update_flags_boundary_faces=update_default, const UpdateFlags mapping_update_flags_inner_faces=update_default, const UpdateFlags mapping_update_flags_faces_by_cells=update_default, const unsigned int mg_level=numbers::invalid_unsigned_int, const bool store_plain_indices=true, const bool initialize_indices=true, const bool initialize_mapping=true, const bool overlap_communication_computation=true, const bool hold_all_faces_to_owned_cells=false, const bool cell_vectorization_categories_strict=false, const bool allow_ghosted_vectors_in_loops=true)
std::vector< unsigned int > cell_vectorization_category
AdditionalData & operator=(const AdditionalData &other)
bool cell_vectorization_categories_strict
UpdateFlags mapping_update_flags_boundary_faces
UpdateFlags mapping_update_flags
UpdateFlags mapping_update_flags_faces_by_cells
AdditionalData(const AdditionalData &other)
bool allow_ghosted_vectors_in_loops
unsigned int tasks_block_size
bool overlap_communication_computation
@ dof_access_face_interior
std::vector< unsigned int > cell_loop_pre_list_index
std::vector< unsigned int > cell_loop_post_list_index
std::vector< std::pair< unsigned int, unsigned int > > vector_zero_range_list
std::shared_ptr< const Utilities::MPI::Partitioner > vector_partitioner
std::vector< std::pair< unsigned int, unsigned int > > cell_loop_pre_list
std::vector< unsigned int > vector_zero_range_list_index
std::vector< std::pair< unsigned int, unsigned int > > cell_loop_post_list
void loop(MFWorkerInterface &worker) const