PRISMS-PF Manual
Loading...
Searching...
No Matches
constraint_manager.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: © 2026 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/mg_level_object.h>
7#include <deal.II/dofs/dof_handler.h>
8#include <deal.II/fe/mapping.h>
9#include <deal.II/lac/affine_constraints.h>
10#include <deal.II/multigrid/mg_constrained_dofs.h>
11
17#include <prismspf/core/types.h>
18
21
22#include <prismspf/config.h>
23
25
26// Forward declaration to avoid circular dependency.
27template <unsigned int dim, unsigned int degree, typename number>
28class PDEOperatorBase;
29
30// TODO (fractalsbyx): The following snippet is from dealii. Using this (by
31// pre-constructing the needed maps and functions) may be cleaner than how dirichlet are
32// currently done.
33/* template <int dim, int spacedim, typename number>
34 void
35 interpolate_boundary_values(
36 const Mapping<dim, spacedim> &mapping,
37 const DoFHandler<dim, spacedim> &dof,
38 const std::map<types::boundary_id, const Function<spacedim, number> *>
39 &function_map,
40 AffineConstraints<number> &constraints,
41 const ComponentMask &component_mask = {}); */
42
43// TODO (fractalsbyx): I don't think we actually need 'change' constraints for newton
44// solves at all. Verify this and remove them.
45
50template <unsigned int dim, unsigned int degree, typename number>
52{
53public:
57 ConstraintManager() = default;
58
62 void
63 init(const BoundaryParameters &_boundary_parameters,
64 const SpatialDiscretization<dim> &_spatial_discretization,
65 const DoFManager<dim, degree> &_dof_manager,
66 const PDEOperatorBase<dim, degree, number> &_pde_operator,
67 const SimulationTimer &_sim_timer);
68
72 [[nodiscard]] std::vector<const dealii::AffineConstraints<number> *>
74
78 [[nodiscard]] const dealii::AffineConstraints<number> &
80
84 [[nodiscard]] const std::array<dealii::AffineConstraints<number>, 2> &
86
90 [[nodiscard]] const dealii::AffineConstraints<number> &
91 get_generic_constraint(unsigned int rank) const;
92
93 //-------------------------------------------------------------------------------------
94
98 [[nodiscard]] const std::vector<std::vector<dealii::AffineConstraints<number>>> &
100
104 [[nodiscard]] std::vector<const dealii::AffineConstraints<number> *>
105 get_mg_field_constraints(unsigned int relative_level) const;
106
110 [[nodiscard]] const dealii::AffineConstraints<number> &
111 get_mg_field_constraint(Types::Index index, unsigned int relative_level) const;
112
116 [[nodiscard]] const std::vector<std::array<dealii::AffineConstraints<number>, 2>> &
118
122 [[nodiscard]] const std::array<dealii::AffineConstraints<number>, 2> &
123 get_mg_generic_constraints(unsigned int relative_level) const;
124
128 [[nodiscard]] const dealii::AffineConstraints<number> &
129 get_mg_generic_constraint(unsigned int rank, unsigned int relative_level) const;
130
134 void
135 reinit(const std::vector<FieldAttributes> &field_attributes);
136
141 void
142 update_time_dependent_constraints(const std::vector<FieldAttributes> &field_attributes);
143
147 static const std::array<dealii::ComponentMask, dim> vector_component_mask;
148 static const dealii::ComponentMask scalar_empty_mask;
149
150private:
154 void
155 make_constraints_for_single_field(dealii::AffineConstraints<number> &constraint,
156 const dealii::DoFHandler<dim> &dof_handler,
157 const BoundaryConditionSet &_field_constraints,
158 TensorRank tensor_rank,
159 Types::Index field_index,
160 unsigned int relative_level = -1);
161
165 void
166 make_bc_constraints(dealii::AffineConstraints<number> &constraint,
167 const dealii::DoFHandler<dim> &dof_handler,
168 const BoundaryConditionSet &boundary_condition,
169 TensorRank tensor_rank,
170 Types::Index field_index);
171
175 void
176 make_one_boundary_constraint(dealii::AffineConstraints<number> &_constraints,
177 unsigned int boundary_id,
178 unsigned int component,
179 Condition boundary_type,
180 const dealii::DoFHandler<dim> &dof_handler,
181 TensorRank tensor_rank,
182 Types::Index field_index) const;
183
187 void
188 make_dirichlet_constraints(dealii::AffineConstraints<number> &_constraints,
189 const dealii::DoFHandler<dim> &dof_handler,
190 const unsigned int &boundary_id,
191 const unsigned int &field_index,
192 const bool &is_vector_field,
193 const dealii::ComponentMask &mask) const;
194
199
204
209
214
218 const SimulationTimer *sim_timer = nullptr;
219
223 std::vector<dealii::AffineConstraints<number>> field_constraints;
224
228 std::array<dealii::AffineConstraints<number>, 2> generic_constraints;
229
234 std::vector<std::vector<dealii::AffineConstraints<number>>> mg_field_constraints;
235
239 std::vector<std::array<dealii::AffineConstraints<number>, 2>> mg_generic_constraints;
240};
241
242template <unsigned int dim, unsigned int degree, typename number>
243inline const std::array<dealii::ComponentMask, dim>
245{
246 std::array<dealii::ComponentMask, dim> masks {};
247 for (unsigned int i = 0; i < dim; ++i)
248 {
249 dealii::ComponentMask temp_mask(dim, false);
250 temp_mask.set(i, true);
251 masks.at(i) = temp_mask;
252 }
253 return masks;
254}();
255
256template <unsigned int dim, unsigned int degree, typename number>
257inline const dealii::ComponentMask
259
260PRISMS_PF_END_NAMESPACE
void update_time_dependent_constraints(const std::vector< FieldAttributes > &field_attributes)
Update time-dependent constraints. For now this only updates the Dirichlet constraints.
Definition constraint_manager.cc:381
const dealii::AffineConstraints< number > & get_mg_generic_constraint(unsigned int rank, unsigned int relative_level) const
Getter function for the constraint of an index (constant reference).
Definition constraint_manager.cc:133
const PDEOperatorBase< dim, degree, number > * pde_operator
PDE operator.
Definition constraint_manager.h:213
const BoundaryParameters * boundary_parameters
User-inputs constraint parameters.
Definition constraint_manager.h:198
std::vector< const dealii::AffineConstraints< number > * > get_field_constraints() const
Getter function for the constraints.
Definition constraint_manager.cc:54
std::array< dealii::AffineConstraints< number >, 2 > generic_constraints
Constraints not specific to any field. We need this for invm.
Definition constraint_manager.h:228
std::vector< dealii::AffineConstraints< number > > field_constraints
Constraints. Outer vector is indexed by field index.
Definition constraint_manager.h:223
void make_dirichlet_constraints(dealii::AffineConstraints< number > &_constraints, const dealii::DoFHandler< dim > &dof_handler, const unsigned int &boundary_id, const unsigned int &field_index, const bool &is_vector_field, const dealii::ComponentMask &mask) const
Make dirichlet constraints.
Definition constraint_manager.cc:426
void make_one_boundary_constraint(dealii::AffineConstraints< number > &_constraints, unsigned int boundary_id, unsigned int component, Condition boundary_type, const dealii::DoFHandler< dim > &dof_handler, TensorRank tensor_rank, Types::Index field_index) const
Apply constraints for common boundary conditions.
Definition constraint_manager.cc:335
const std::array< dealii::AffineConstraints< number >, 2 > & get_generic_constraints() const
Getter function for the constraints.
Definition constraint_manager.cc:74
std::vector< std::array< dealii::AffineConstraints< number >, 2 > > mg_generic_constraints
Constraints not specific to any field. We need this for invm.
Definition constraint_manager.h:239
const dealii::AffineConstraints< number > & get_field_constraint(Types::Index index) const
Getter function for the constraint of an index.
Definition constraint_manager.cc:67
const dealii::AffineConstraints< number > & get_mg_field_constraint(Types::Index index, unsigned int relative_level) const
Getter function for the constraint of an index (constant reference).
Definition constraint_manager.cc:109
const SpatialDiscretization< dim > * spatial_discretization
User-inputs discretization.
Definition constraint_manager.h:203
void reinit(const std::vector< FieldAttributes > &field_attributes)
Make constraints based on the inputs of the constructor.
Definition constraint_manager.cc:142
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< std::vector< dealii::AffineConstraints< number > > > mg_field_constraints
Constraints. Outer vector is indexed by field index. Inner vector is indexed by relative mg level.
Definition constraint_manager.h:234
const std::vector< std::array< dealii::AffineConstraints< number >, 2 > > & get_mg_generic_constraints_levels() const
Getter function for the constraints.
Definition constraint_manager.cc:118
static const dealii::ComponentMask scalar_empty_mask
Definition constraint_manager.h:148
void make_bc_constraints(dealii::AffineConstraints< number > &constraint, const dealii::DoFHandler< dim > &dof_handler, const BoundaryConditionSet &boundary_condition, TensorRank tensor_rank, Types::Index field_index)
Add boundary conditions to a single constraint.
Definition constraint_manager.cc:307
const std::vector< std::vector< dealii::AffineConstraints< number > > > & get_mg_field_constraints_levels() const
Getter function for a selection of the constraints.
Definition constraint_manager.cc:88
void init(const BoundaryParameters &_boundary_parameters, const SpatialDiscretization< dim > &_spatial_discretization, const DoFManager< dim, degree > &_dof_manager, const PDEOperatorBase< dim, degree, number > &_pde_operator, const SimulationTimer &_sim_timer)
Initialize the constraint manager.
Definition constraint_manager.cc:36
static const std::array< dealii::ComponentMask, dim > vector_component_mask
Create a component mask.
Definition constraint_manager.h:147
const dealii::AffineConstraints< number > & get_generic_constraint(unsigned int rank) const
Getter function for the constraint of an index.
Definition constraint_manager.cc:81
const DoFManager< dim, degree > * dof_manager
Dof manager pointer.
Definition constraint_manager.h:208
const SimulationTimer * sim_timer
Simulation time for time-dependent constraints.
Definition constraint_manager.h:218
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
ConstraintManager()=default
Constructor.
void make_constraints_for_single_field(dealii::AffineConstraints< number > &constraint, const dealii::DoFHandler< dim > &dof_handler, const BoundaryConditionSet &_field_constraints, TensorRank tensor_rank, Types::Index field_index, unsigned int relative_level=-1)
Construct constraints for a single field based on the boundary conditions.
Definition constraint_manager.cc:257
Class that manages the deal.II DoFHandlers.
Definition dof_manager.h:25
This class contains the user implementation of each PDE operator.
Definition pde_operator_base.h:27
Definition simulation_timer.h:13
Condition
Condition of boundary condition.
Definition constraint_parameters.h:32
Definition conditional_ostreams.cc:20
unsigned int Index
Type for field indices.
Definition types.h:19
Definition constraint_parameters.h:73
Struct that holds boundary parameters.
Definition constraint_parameters.h:83
Struct that holds spatial discretization parameters.
Definition spatial_discretization.h:308
TensorRank
Tensor rank of the field.
Definition type_enums.h:52