22 const dealii::Function<dim> &function,
23 const dealii::Point<dim, dealii::VectorizedArray<number>> &p_vectorized,
24 const unsigned int component)
26 dealii::VectorizedArray<number> result;
27 for (
unsigned int v = 0; v < dealii::VectorizedArray<number>::size(); ++v)
30 for (
unsigned int d = 0; d < dim; ++d)
31 p[d] = p_vectorized[d][v];
32 result[v] = function.value(p, component);
40 const dealii::Function<dim> &func,
41 const dealii::Point<dim, dealii::VectorizedArray<number>> &points)
43 AssertDimension(func.n_components, n_components);
45 dealii::Tensor<1, n_components, dealii::VectorizedArray<number>> vec;
47 for (
unsigned int v = 0; v < dealii::VectorizedArray<number>::size(); ++v)
49 dealii::Point<dim> point_v;
51 for (
unsigned int d = 0; d < dim; ++d)
52 point_v[d] = points[d][v];
54 for (
unsigned int d = 0; d < n_components; ++d)
55 vec[d][v] = func.value(point_v, d);
64 const dealii::MatrixFree<dim, number, dealii::VectorizedArray<number>> &matrix_free,
66 unsigned int quad_idx,
67 const T &cell_operation)
71 dealii::MatrixFreeOperators::
72 CellwiseInverseMassMatrix<dim, -1, n_components, number, dealii::VectorizedArray<number>>
73 inverse_mass_matrix(fe_eval);
75 const auto &lexicographic_numbering =
76 matrix_free.get_shape_info(dof_idx, quad_idx).lexicographic_numbering;
80 std::vector<number> ones(fe_eval.dofs_per_cell, 1.0);
82 std::vector<dealii::types::global_dof_index> dof_indices(fe_eval.dofs_per_cell);
83 std::vector<dealii::types::global_dof_index> dof_indices_mf(fe_eval.dofs_per_cell);
84 std::vector<number> dof_values(fe_eval.dofs_per_cell);
86 dealii::AffineConstraints<number> dummy;
90 for (
unsigned int cell = 0; cell < matrix_free.n_cell_batches(); ++cell)
94 for (
unsigned int q = 0; q < fe_eval.n_q_points; ++q)
96 const auto temp = cell_operation(cell, q);
97 for (
int c = 0; c < n_components; ++c)
98 if constexpr (std::is_same<
typename std::remove_const<
decltype(temp)>::type,
99 dealii::VectorizedArray<number>>::value)
101 static_assert(n_components == 1,
102 "The path should be only accessed for a single component.");
103 fe_eval.begin_values()[q] = temp;
107 typename std::remove_const<
decltype(temp)>::type,
108 dealii::Tensor<1, n_components, dealii::VectorizedArray<number>>>::value)
110 fe_eval.begin_values()[c * fe_eval.n_q_points + q] = temp[c];
114 Assert(
false, dealii::ExcNotImplemented());
117 inverse_mass_matrix.transform_from_q_points_to_basis(n_components,
118 fe_eval.begin_values(),
119 fe_eval.begin_dof_values());
121 for (
unsigned int v = 0; v < matrix_free.n_active_entries_per_cell_batch(cell); ++v)
123 matrix_free.get_cell_iterator(cell, v, dof_idx)->get_dof_indices(dof_indices);
125 for (
unsigned int j = 0; j < dof_indices.size(); ++j)
127 dof_indices_mf[j] = dof_indices[lexicographic_numbering[j]];
128 dof_values[j] = fe_eval.begin_dof_values()[j][v];
131 dummy.distribute_local_to_global(dof_values, dof_indices_mf, vec);
132 dummy.distribute_local_to_global(ones, dof_indices_mf, weights);
136 vec.compress(dealii::VectorOperation::add);
137 weights.compress(dealii::VectorOperation::add);
139 for (
unsigned int i = 0; i < vec.locally_owned_size(); ++i)
140 if (weights.local_element(i) != 0.0)
141 vec.local_element(i) /= weights.local_element(i);
147 const dealii::DoFHandler<dim> &dof,
148 const dealii::AffineConstraints<typename VectorType::value_type> &constraints,
149 const dealii::Quadrature<dim> &quadrature,
150 const VectorType &vec_in,
153 using number =
typename VectorType::value_type;
155 typename dealii::MatrixFree<dim, number>::AdditionalData additional_data;
156 additional_data.tasks_parallel_scheme =
157 dealii::MatrixFree<dim, number>::AdditionalData::partition_color;
158 additional_data.mapping_update_flags = dealii::update_values | dealii::update_JxW_values;
160 const auto matrix_free = std::make_shared<dealii::MatrixFree<dim, number>>();
161 matrix_free->reinit(mapping, dof, constraints, quadrature, additional_data);
164 dealii::MatrixFreeOperators::MassOperator<dim, -1, 0, n_components, VectorType>;
165 MatrixType mass_matrix;
166 mass_matrix.initialize(matrix_free);
168 mass_matrix.compute_diagonal();
170 dealii::ReductionControl control(6 * vec_in.size(), 0., 1e-12,
false,
false);
171 dealii::SolverCG<VectorType> cg(control);
172 const dealii::DiagonalMatrix<VectorType> &preconditioner =
173 *mass_matrix.get_matrix_diagonal_inverse();
175 cg.solve(mass_matrix, vec_out, vec_in, preconditioner);
dealii::FEEvaluation< dim, -1, 0, n_components, number, VectorizedArrayType > FECellIntegrator
Definition fe_integrator.hpp:14