6#include <deal.II/base/vectorization.h>
7#include <deal.II/dofs/dof_handler.h>
8#include <deal.II/fe/fe_system.h>
9#include <deal.II/lac/affine_constraints.h>
10#include <deal.II/lac/la_parallel_block_vector.h>
11#include <deal.II/lac/la_parallel_vector.h>
12#include <deal.II/matrix_free/fe_evaluation.h>
13#include <deal.II/matrix_free/matrix_free.h>
19#include <prismspf/config.h>
26using dealii::MatrixFree;
31template <
typename number>
32using BlockVector = dealii::LinearAlgebra::distributed::BlockVector<number>;
37template <
typename number>
43template <
unsigned int dim,
typename number>
59 template <
unsigned int degree>
64 [[nodiscard]]
const MatrixFree<dim, number> &
67 [[nodiscard]]
const MatrixFree<dim, number> &
70 [[nodiscard]]
const std::vector<MatrixFree<dim, number>> &
73 [[nodiscard]]
const MatrixFree<dim, number> &
76 [[nodiscard]]
const std::vector<MatrixFree<dim, number>> &
79 [[nodiscard]]
const MatrixFree<dim, number> &
82 [[nodiscard]] std::vector<std::shared_ptr<const dealii::Utilities::MPI::Partitioner>>
85 [[nodiscard]] std::vector<std::shared_ptr<const dealii::Utilities::MPI::Partitioner>>
87 unsigned int relative_level)
const;
91 const std::set<unsigned int> &field_indices)
const;
95 const std::set<unsigned int> &field_indices,
96 unsigned int relative_level)
const;
120template <
unsigned int dim,
typename number>
121template <
unsigned int degree>
127 using AdditionalData =
typename MatrixFree<dim, number>::AdditionalData;
130 static const AdditionalData additional_data(
131 AdditionalData::TasksParallelScheme::partition_partition,
133 dealii::update_values | dealii::update_gradients | dealii::update_hessians |
134 dealii::update_JxW_values | dealii::update_quadrature_points);
136 const std::array<dealii::DoFHandler<dim>, 2> &generic_dof_handlers =
140 const std::array<dealii::AffineConstraints<number>, 2> &generic_constraints =
147 dealii::QGaussLobatto<1>(degree + 1),
153 std::vector<
const dealii::DoFHandler<dim> *>(
154 {&generic_dof_handlers[0], &generic_dof_handlers[1]}),
155 std::vector<const dealii::AffineConstraints<number> *>(
156 {&generic_constraints[0], &generic_constraints[1]}),
157 dealii::QGaussLobatto<1>(degree +
160 const unsigned int num_levels = dof_manager.
has_mg() ? dof_manager.
num_levels() : 0;
163 for (
unsigned int relative_level = 0; relative_level < num_levels; ++relative_level)
165 const unsigned int fine_level = num_levels - 1;
166 const unsigned int level = fine_level - relative_level;
167 MatrixFree<dim, number> &shared_mg_matrix_free =
169 MatrixFree<dim, number> &generic_mg_matrix_free =
172 const std::array<dealii::AffineConstraints<number>, 2> &generic_constraints =
175 AdditionalData shared_additional_data = additional_data;
176 shared_additional_data.mg_level = level;
179 shared_mg_matrix_free.reinit(
183 dealii::QGaussLobatto<1>(degree + 1),
184 shared_additional_data);
186 AdditionalData generic_additional_data;
187 generic_additional_data.mg_level = level;
190 generic_mg_matrix_free.reinit(
192 std::vector<
const dealii::DoFHandler<dim> *>(
193 {&generic_dof_handlers[0], &generic_dof_handlers[1]}),
194 std::vector<const dealii::AffineConstraints<number> *>(
195 {&generic_constraints[0], &generic_constraints[1]}),
196 dealii::QGaussLobatto<1>(degree + 1),
197 generic_additional_data);
201template <
unsigned int dim,
typename number>
202const MatrixFree<dim, number> &
208template <
unsigned int dim,
typename number>
209const MatrixFree<dim, number> &
215template <
unsigned int dim,
typename number>
216const std::vector<MatrixFree<dim, number>> &
222template <
unsigned int dim,
typename number>
223const MatrixFree<dim, number> &
225 unsigned int relative_level)
const
230template <
unsigned int dim,
typename number>
231const std::vector<MatrixFree<dim, number>> &
237template <
unsigned int dim,
typename number>
238const MatrixFree<dim, number> &
240 unsigned int relative_level)
const
245template <
unsigned int dim,
typename number>
246std::vector<std::shared_ptr<const dealii::Utilities::MPI::Partitioner>>
248 const std::set<unsigned int> &field_indices)
const
251 std::vector<std::shared_ptr<const dealii::Utilities::MPI::Partitioner>> partitioners;
252 partitioners.reserve(field_indices.size());
253 for (
unsigned int field_index : field_indices)
260template <
unsigned int dim,
typename number>
261std::vector<std::shared_ptr<const dealii::Utilities::MPI::Partitioner>>
263 const std::set<unsigned int> &field_indices,
264 unsigned int relative_level)
const
267 std::vector<std::shared_ptr<const dealii::Utilities::MPI::Partitioner>> partitioners;
268 partitioners.reserve(field_indices.size());
269 for (
unsigned int field_index : field_indices)
271 partitioners.push_back(
277template <
unsigned int dim,
typename number>
281 const std::set<unsigned int> &field_indices)
const
286template <
unsigned int dim,
typename number>
290 const std::set<unsigned int> &field_indices,
291 unsigned int relative_level)
const
296PRISMS_PF_END_NAMESPACE
The class handles the generation and application of boundary conditions based on the user-inputs.
Definition constraint_manager.h:51
std::vector< const dealii::AffineConstraints< number > * > get_field_constraints() const
Getter function for the constraints.
Definition constraint_manager.cc:52
const std::array< dealii::AffineConstraints< number >, 2 > & get_generic_constraints() const
Getter function for the constraints.
Definition constraint_manager.cc:72
const std::array< dealii::AffineConstraints< number >, 2 > & get_mg_generic_constraints(unsigned int relative_level) const
Getter function for the constraints.
Definition constraint_manager.cc:125
std::vector< const dealii::AffineConstraints< number > * > get_mg_field_constraints(unsigned int relative_level) const
Getter function for the constraints.
Definition constraint_manager.cc:95
Class that manages the deal.II DoFHandlers.
Definition dof_manager.h:25
const std::array< dealii::DoFHandler< dim >, 2 > & get_dof_handlers() const
Getter function for the scalar and vector DoFHandlers on a level.
Definition dof_manager.cc:74
bool has_mg() const
Has distribute_mg_dofs() been called?
Definition dof_manager.cc:88
unsigned int num_levels() const
Get the total number of levels in the triangulation.
Definition dof_manager.cc:95
const std::vector< const dealii::DoFHandler< dim > * > & get_field_dof_handlers() const
Getter function for all the DoFHandlers on a level.
Definition dof_manager.cc:46
void reinit(const DoFManager< dim, degree > &dof_manager, const ConstraintManager< dim, degree, number > &constraint_manager)
Reinit.
Definition matrix_free_manager.h:123
void initialize_block_vector(BlockVector< number > &vec, const std::set< unsigned int > &field_indices) const
Definition matrix_free_manager.h:279
const std::vector< MatrixFree< dim, number > > & get_generic_matrix_free_levels() const
Definition matrix_free_manager.h:232
void initialize_mg_block_vector(BlockVector< number > &vec, const std::set< unsigned int > &field_indices, unsigned int relative_level) const
Definition matrix_free_manager.h:288
std::vector< MatrixFree< dim, number > > shared_matrix_free_levels
MatrixFree object on each level for every field.
Definition matrix_free_manager.h:112
const MatrixFree< dim, number > & get_generic_matrix_free() const
Definition matrix_free_manager.h:210
dealii::VectorizedArray< number > ScalarValue
Definition matrix_free_manager.h:47
std::vector< std::shared_ptr< const dealii::Utilities::MPI::Partitioner > > get_mg_block_partitioners(const std::set< unsigned int > &field_indices, unsigned int relative_level) const
Definition matrix_free_manager.h:262
const MatrixFree< dim, number > & get_mg_shared_matrix_free(unsigned int relative_level) const
Definition matrix_free_manager.h:224
MatrixFree< dim, number > generic_matrix_free
Generic Matrix-free object with a scalar and vector entry.
Definition matrix_free_manager.h:107
std::vector< std::shared_ptr< const dealii::Utilities::MPI::Partitioner > > get_block_partitioners(const std::set< unsigned int > &field_indices) const
Definition matrix_free_manager.h:247
const MatrixFree< dim, number > & get_shared_matrix_free() const
Definition matrix_free_manager.h:203
MatrixFreeManager()=default
Constructor.
const MatrixFree< dim, number > & get_mg_generic_matrix_free(unsigned int relative_level) const
Definition matrix_free_manager.h:239
const std::vector< MatrixFree< dim, number > > & get_shared_matrix_free_levels() const
Definition matrix_free_manager.h:217
MatrixFree< dim, number > shared_matrix_free
MatrixFree object for every field.
Definition matrix_free_manager.h:102
std::vector< MatrixFree< dim, number > > generic_matrix_free_levels
Generic Matrix-free object with a scalar and vector entry on each level.
Definition matrix_free_manager.h:117
dealii::Tensor< 1, dim, ScalarValue > VectorValue
Definition matrix_free_manager.h:48
static const dealii::MappingQ1< dim > mapping
Mappings to and from reference cell.
Definition system_wide.h:36
typename BlockVector< number >::BlockType SolutionVector
Typedef for solution vector.
Definition matrix_free_manager.h:38
dealii::LinearAlgebra::distributed::BlockVector< number > BlockVector
Typedef for solution block vector.
Definition matrix_free_manager.h:32
Definition conditional_ostreams.cc:20