PRISMS-PF Manual
Loading...
Searching...
No Matches
matrix_free_manager.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: © 2025 PRISMS Center at the University of Michigan
2// SPDX-License-Identifier: GNU Lesser General Public Version 2.1
3
4#pragma once
5
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>
14
18
19#include <prismspf/config.h>
20
22
26using dealii::MatrixFree;
27
31template <typename number>
32using BlockVector = dealii::LinearAlgebra::distributed::BlockVector<number>;
33
37template <typename number>
39
43template <unsigned int dim, typename number>
45{
46public:
47 using ScalarValue = dealii::VectorizedArray<number>;
48 using VectorValue = dealii::Tensor<1, dim, ScalarValue>;
49
53 MatrixFreeManager() = default;
54
59 template <unsigned int degree>
60 void
61 reinit(const DoFManager<dim, degree> &dof_manager,
62 const ConstraintManager<dim, degree, number> &constraint_manager);
63
64 [[nodiscard]] const MatrixFree<dim, number> &
66
67 [[nodiscard]] const MatrixFree<dim, number> &
69
70 [[nodiscard]] const std::vector<MatrixFree<dim, number>> &
72
73 [[nodiscard]] const MatrixFree<dim, number> &
74 get_mg_shared_matrix_free(unsigned int relative_level) const;
75
76 [[nodiscard]] const std::vector<MatrixFree<dim, number>> &
78
79 [[nodiscard]] const MatrixFree<dim, number> &
80 get_mg_generic_matrix_free(unsigned int relative_level) const;
81
82 [[nodiscard]] std::vector<std::shared_ptr<const dealii::Utilities::MPI::Partitioner>>
83 get_block_partitioners(const std::set<unsigned int> &field_indices) const;
84
85 [[nodiscard]] std::vector<std::shared_ptr<const dealii::Utilities::MPI::Partitioner>>
86 get_mg_block_partitioners(const std::set<unsigned int> &field_indices,
87 unsigned int relative_level) const;
88
89 void
91 const std::set<unsigned int> &field_indices) const;
92
93 void
95 const std::set<unsigned int> &field_indices,
96 unsigned int relative_level) const;
97
98private:
102 MatrixFree<dim, number> shared_matrix_free;
103
107 MatrixFree<dim, number> generic_matrix_free;
108
112 std::vector<MatrixFree<dim, number>> shared_matrix_free_levels;
113
117 std::vector<MatrixFree<dim, number>> generic_matrix_free_levels;
118};
119
120template <unsigned int dim, typename number>
121template <unsigned int degree>
122void
124 const DoFManager<dim, degree> &dof_manager,
125 const ConstraintManager<dim, degree, number> &constraint_manager)
126{
127 using AdditionalData = typename MatrixFree<dim, number>::AdditionalData;
128 // TODO: maybe make the flags determined by user dependencies. (Though I doubt this
129 // is a significant source of runtime)
130 static const AdditionalData additional_data(
131 AdditionalData::TasksParallelScheme::partition_partition,
132 0,
133 dealii::update_values | dealii::update_gradients | dealii::update_hessians |
134 dealii::update_JxW_values | dealii::update_quadrature_points);
135
136 const std::array<dealii::DoFHandler<dim>, 2> &generic_dof_handlers =
137 dof_manager.get_dof_handlers();
138
139 {
140 const std::array<dealii::AffineConstraints<number>, 2> &generic_constraints =
141 constraint_manager.get_generic_constraints();
142
143 // Reinit shared MatrixFree
145 dof_manager.get_field_dof_handlers(),
146 constraint_manager.get_field_constraints(),
147 dealii::QGaussLobatto<1>(degree + 1),
148 // should dim really be 1?
149 additional_data);
150
151 // Reinit generic MatrixFree
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 +
158 1)); // should dim really be 1?
159 }
160 const unsigned int num_levels = dof_manager.has_mg() ? dof_manager.num_levels() : 0;
161 shared_matrix_free_levels.resize(num_levels);
162 generic_matrix_free_levels.resize(num_levels);
163 for (unsigned int relative_level = 0; relative_level < num_levels; ++relative_level)
164 {
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 =
168 shared_matrix_free_levels[relative_level];
169 MatrixFree<dim, number> &generic_mg_matrix_free =
170 generic_matrix_free_levels[relative_level];
171
172 const std::array<dealii::AffineConstraints<number>, 2> &generic_constraints =
173 constraint_manager.get_mg_generic_constraints(relative_level);
174
175 AdditionalData shared_additional_data = additional_data;
176 shared_additional_data.mg_level = level;
177
178 // Reinit shared MatrixFree
179 shared_mg_matrix_free.reinit(
181 dof_manager.get_field_dof_handlers(),
182 constraint_manager.get_mg_field_constraints(relative_level),
183 dealii::QGaussLobatto<1>(degree + 1), // should dim really be 1?
184 shared_additional_data);
185
186 AdditionalData generic_additional_data;
187 generic_additional_data.mg_level = level;
188
189 // Reinit generic MatrixFree
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), // should dim really be 1?
197 generic_additional_data);
198 }
199}
200
201template <unsigned int dim, typename number>
202const MatrixFree<dim, number> &
207
208template <unsigned int dim, typename number>
209const MatrixFree<dim, number> &
214
215template <unsigned int dim, typename number>
216const std::vector<MatrixFree<dim, number>> &
221
222template <unsigned int dim, typename number>
223const MatrixFree<dim, number> &
225 unsigned int relative_level) const
226{
227 return shared_matrix_free_levels[relative_level];
228}
229
230template <unsigned int dim, typename number>
231const std::vector<MatrixFree<dim, number>> &
236
237template <unsigned int dim, typename number>
238const MatrixFree<dim, number> &
240 unsigned int relative_level) const
241{
242 return generic_matrix_free_levels[relative_level];
243}
244
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
249{
250 // These partitioners basically just provide the number of elements in a distributed way
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)
254 {
255 partitioners.push_back(shared_matrix_free.get_vector_partitioner(field_index));
256 }
257 return partitioners;
258}
259
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
265{
266 // These partitioners basically just provide the number of elements in a distributed way
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)
270 {
271 partitioners.push_back(
272 shared_matrix_free_levels[relative_level].get_vector_partitioner(field_index));
273 }
274 return partitioners;
275}
276
277template <unsigned int dim, typename number>
278void
281 const std::set<unsigned int> &field_indices) const
282{
283 vec.reinit(get_block_partitioners(field_indices));
284}
285
286template <unsigned int dim, typename number>
287void
290 const std::set<unsigned int> &field_indices,
291 unsigned int relative_level) const
292{
293 vec.reinit(get_mg_block_partitioners(field_indices, relative_level));
294}
295
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