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_vector.h>
11#include <deal.II/matrix_free/fe_evaluation.h>
12#include <deal.II/matrix_free/matrix_free.h>
13
18
19#include <prismspf/config.h>
20
22
26template <unsigned int dim, typename number>
28{
29public:
30 using ScalarValue = dealii::VectorizedArray<number>;
31 using VectorValue = dealii::Tensor<1, dim, ScalarValue>;
32
36 MatrixFreeManager() = default;
37
42 template <unsigned int degree>
43 void
44 reinit(const DoFManager<dim, degree> &dof_manager,
45 const ConstraintManager<dim, degree, number> &constraint_manager);
46
47 [[nodiscard]] const std::vector<MatrixFree<dim, number>> &
49
50 [[nodiscard]] const MatrixFree<dim, number> &
51 get_shared_matrix_free(unsigned int relative_level) const;
52
53 [[nodiscard]] const std::vector<MatrixFree<dim, number>> &
55
56 [[nodiscard]] const MatrixFree<dim, number> &
57 get_generic_matrix_free(unsigned int relative_level) const;
58
59private:
63 std::vector<MatrixFree<dim, number>> shared_matrix_free_levels;
64
68 std::vector<MatrixFree<dim, number>> generic_matrix_free_levels;
69};
70
71template <unsigned int dim, typename number>
72template <unsigned int degree>
73void
75 const DoFManager<dim, degree> &dof_manager,
76 const ConstraintManager<dim, degree, number> &constraint_manager)
77{
78 using AdditionalData = typename MatrixFree<dim, number>::AdditionalData;
79 // TODO: maybe make the flags determined by user dependencies. (Though I doubt this
80 // is a significant source of runtime)
81 static const AdditionalData additional_data(
82 AdditionalData::TasksParallelScheme::partition_partition,
83 0,
84 dealii::update_values | dealii::update_gradients | dealii::update_hessians |
85 dealii::update_JxW_values | dealii::update_quadrature_points);
86
87 const std::vector<std::array<dealii::DoFHandler<dim>, 2>> &generic_dof_handlers_levels =
88 dof_manager.get_dof_handlers_levels();
89 const std::vector<std::array<dealii::AffineConstraints<number>, 2>>
90 &generic_constraints_levels = constraint_manager.get_generic_constraints_levels();
91
92 const unsigned int num_levels = generic_dof_handlers_levels.size();
93 shared_matrix_free_levels.resize(num_levels);
94 generic_matrix_free_levels.resize(num_levels);
95 for (unsigned int relative_level = 0; relative_level < num_levels; ++relative_level)
96 {
97 MatrixFree<dim, number> &shared_matrix_free =
98 shared_matrix_free_levels[relative_level];
99 MatrixFree<dim, number> &generic_matrix_free =
100 generic_matrix_free_levels[relative_level];
101
102 // Reinit shared MatrixFree
103 shared_matrix_free.reinit(SystemWide<dim, degree>::mapping,
104 dof_manager.get_field_dof_handlers(relative_level),
105 constraint_manager.get_field_constraints(relative_level),
106 dealii::QGaussLobatto<1>(degree + 1),
107 // should dim really be 1?
108 additional_data);
109
110 // Reinit generic MatrixFree
111 generic_matrix_free.reinit(SystemWide<dim, degree>::mapping,
112 std::vector<const dealii::DoFHandler<dim> *>(
113 {&generic_dof_handlers_levels[relative_level][0],
114 &generic_dof_handlers_levels[relative_level][1]}),
115 std::vector<const dealii::AffineConstraints<number> *>(
116 {&generic_constraints_levels[relative_level][0],
117 &generic_constraints_levels[relative_level][1]}),
119 }
120}
121
122template <unsigned int dim, typename number>
123const std::vector<MatrixFree<dim, number>> &
128
129template <unsigned int dim, typename number>
130const MatrixFree<dim, number> &
132{
133 return shared_matrix_free_levels[relative_level];
134}
135
136template <unsigned int dim, typename number>
137const std::vector<MatrixFree<dim, number>> &
142
143template <unsigned int dim, typename number>
144const MatrixFree<dim, number> &
146{
147 return generic_matrix_free_levels[relative_level];
148}
149
150PRISMS_PF_END_NAMESPACE
The class handles the generation and application of boundary conditions based on the user-inputs.
Definition constraint_manager.h:50
std::vector< const dealii::AffineConstraints< number > * > get_field_constraints(unsigned int relative_level=0) const
Getter function for the constraints.
Definition constraint_manager.cc:66
const std::vector< std::array< dealii::AffineConstraints< number >, 2 > > & get_generic_constraints_levels() const
Getter function for the constraints.
Definition constraint_manager.cc:88
Class that manages the deal.II DoFHandlers.
Definition dof_manager.h:25
const std::vector< std::array< dealii::DoFHandler< dim >, 2 > > & get_dof_handlers_levels() const
Getter function for the scalar and vector DoFHandlers.
Definition dof_manager.cc:93
const std::vector< const dealii::DoFHandler< dim > * > & get_field_dof_handlers(unsigned int relative_level=0) const
Getter function for all the DoFHandlers on a level.
Definition dof_manager.cc:78
void reinit(const DoFManager< dim, degree > &dof_manager, const ConstraintManager< dim, degree, number > &constraint_manager)
Reinit.
Definition matrix_free_manager.h:74
const std::vector< MatrixFree< dim, number > > & get_generic_matrix_free_levels() const
Definition matrix_free_manager.h:138
std::vector< MatrixFree< dim, number > > shared_matrix_free_levels
MatrixFree object on each level for every field.
Definition matrix_free_manager.h:63
const MatrixFree< dim, number > & get_shared_matrix_free(unsigned int relative_level) const
Definition matrix_free_manager.h:131
dealii::VectorizedArray< number > ScalarValue
Definition matrix_free_manager.h:30
const MatrixFree< dim, number > & get_generic_matrix_free(unsigned int relative_level) const
Definition matrix_free_manager.h:145
MatrixFreeManager()=default
Constructor.
const std::vector< MatrixFree< dim, number > > & get_shared_matrix_free_levels() const
Definition matrix_free_manager.h:124
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:68
dealii::Tensor< 1, dim, ScalarValue > VectorValue
Definition matrix_free_manager.h:31
static const dealii::QGaussLobatto< dim > quadrature
Quadrature rule.
Definition system_wide.h:41
static const dealii::MappingQ1< dim > mapping
Mappings to and from reference cell.
Definition system_wide.h:36
Definition conditional_ostreams.cc:20