3#include <deal.II/lac/generic_linear_algebra.h>
5#include <deal.II/matrix_free/matrix_free.h>
6#include <deal.II/matrix_free/operators.h>
14 template <
typename number =
double>
15 using VectorType = dealii::LinearAlgebra::distributed::Vector<number>;
16 template <
typename number =
double>
34 typename number = double,
37 typename std::enable_if_t<std::is_same_v<DoFVectorType, VectorType<number>>,
int> = 0>
42 const SrcRhsVectorType &src,
44 const unsigned int dof_idx,
45 const unsigned int dof_no_bc_idx,
47 const std::optional<std::pair<std::vector<unsigned int>, std::vector<number>>>
48 &additional_inhomogeneous_constraints = std::nullopt)
56 DoFVectorType temp_rhs;
59 DoFVectorType bc_values;
63 if (additional_inhomogeneous_constraints)
65 const auto &bc = *additional_inhomogeneous_constraints;
66 for (
unsigned int i = 0; i < bc.first.size(); ++i)
67 bc_values.local_element(bc.first[i]) = bc.second[i];
74 operator_base.
vmult(temp_rhs, bc_values);
88 if (additional_inhomogeneous_constraints)
90 const auto &bc = *additional_inhomogeneous_constraints;
91 for (
const auto &i : bc.first)
93 rhs.local_element(i) = 0;
125 typename number = double,
126 typename DoFVectorType = BlockVectorType<number>,
127 typename SrcRhsVectorType = VectorType<number>,
128 typename std::enable_if_t<std::is_same_v<DoFVectorType, BlockVectorType<number>>,
int> = 0>
133 const SrcRhsVectorType &src,
135 const std::array<unsigned int, dim> &dof_indices_per_block,
136 const unsigned int &dof_no_bc_idx,
138 const std::optional<std::pair<std::vector<unsigned int>, std::vector<std::vector<number>>>>
139 &additional_inhomogeneous_constraints = std::nullopt)
147 DoFVectorType temp_rhs;
150 DoFVectorType bc_values;
153 for (
unsigned int d = 0; d < dim; ++d)
155 auto &bc_values_d = bc_values.block(d);
158 if (additional_inhomogeneous_constraints)
160 const auto &bc = *additional_inhomogeneous_constraints;
161 for (
unsigned int i = 0; i < bc.first.size(); ++i)
163 bc_values_d.local_element(bc.first[i]) = bc.second[d][i];
166 scratch_data.
get_constraint(dof_indices_per_block[d]).distribute(bc_values_d);
171 operator_base.
vmult(temp_rhs, bc_values);
184 for (
unsigned int d = 0; d < dim; ++d)
186 auto &rhs_d = rhs.block(d);
189 if (additional_inhomogeneous_constraints)
191 const auto &bc = *additional_inhomogeneous_constraints;
192 for (
const auto &i : bc.first)
194 rhs_d.local_element(i) = 0;
198 scratch_data.
get_constraint(dof_indices_per_block[d]).set_zero(rhs_d);
214 template <
int dim,
int n_components,
typename number>
219 const std::pair<unsigned int, unsigned int> &cell_range,
220 const unsigned int dof_idx,
221 const unsigned int quad_idx)
224 dealii::MatrixFreeOperators::CellwiseInverseMassMatrix<dim, -1, n_components, number> inverse(
227 for (
unsigned int cell = cell_range.first; cell < cell_range.second; ++cell)
230 phi.read_dof_values(src);
231 inverse.apply(phi.begin_dof_values(), phi.begin_dof_values());
232 phi.set_dof_values(dst);
void reset_dof_index(const unsigned int dof_idx_in)
Set the index for the current degrees of freedom (DoF).
Definition operator_base.hpp:32
Operator handling matrix-free computations.
Definition operator_base.hpp:190
virtual void create_rhs(VectorType &, const VectorType &) const
Compute the right-hand side vector.
Definition operator_base.hpp:208
virtual void vmult(VectorType &, const VectorType &) const
Definition operator_base.hpp:239
Container for shared scratch data between operations/operators.
Definition scratch_data.hpp:61
void initialize_dof_vector(VectorType &vec, const unsigned int dof_idx) const
Initialize a distributed vector for a given DoF index.
Definition scratch_data.cpp:272
const dealii::AffineConstraints< number > & get_constraint(const unsigned int constraint_index) const
Get a constraint object by index (const overload).
Definition scratch_data.cpp:375
Definition utilities_matrixfree.hpp:13
dealii::LinearAlgebra::distributed::BlockVector< number > BlockVectorType
Definition utilities_matrixfree.hpp:17
void create_rhs_and_apply_dirichlet_matrixfree(OperatorMatrixFree< dim, number > &operator_base, DoFVectorType &rhs, const SrcRhsVectorType &src, const ScratchData< dim, dim, number > &scratch_data, const unsigned int dof_idx, const unsigned int dof_no_bc_idx, const bool zero_out, const std::optional< std::pair< std::vector< unsigned int >, std::vector< number > > > &additional_inhomogeneous_constraints=std::nullopt)
Definition utilities_matrixfree.hpp:39
dealii::LinearAlgebra::distributed::Vector< number > VectorType
Definition utilities_matrixfree.hpp:15
void local_apply_inverse_mass_matrix(const dealii::MatrixFree< dim, number > &matrix_free, VectorType< number > &dst, const VectorType< number > &src, const std::pair< unsigned int, unsigned int > &cell_range, const unsigned int dof_idx, const unsigned int quad_idx)
Definition utilities_matrixfree.hpp:216
dealii::FEEvaluation< dim, -1, 0, n_components, number, VectorizedArrayType > FECellIntegrator
Definition fe_integrator.hpp:14