PRISMS-PF Manual
Loading...
Searching...
No Matches
constraint_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/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
15#include <prismspf/core/types.h>
16
19
20#include <prismspf/config.h>
21
23
24// Forward declaration to avoid circular dependency.
25template <unsigned int dim, unsigned int degree, typename number>
26class PDEOperatorBase;
27
28// TODO (fractalsbyx): The following snippet is from dealii. Using this (by
29// pre-constructing the needed maps and functions) may be cleaner than how dirichlet are
30// currently done.
31/* template <int dim, int spacedim, typename number>
32 void
33 interpolate_boundary_values(
34 const Mapping<dim, spacedim> &mapping,
35 const DoFHandler<dim, spacedim> &dof,
36 const std::map<types::boundary_id, const Function<spacedim, number> *>
37 &function_map,
38 AffineConstraints<number> &constraints,
39 const ComponentMask &component_mask = {}); */
40
41// TODO (fractalsbyx): I don't think we actually need 'change' constraints for newton
42// solves at all. Verify this and remove them.
43
48template <unsigned int dim, unsigned int degree, typename number>
50{
51public:
55 ConstraintManager(const std::vector<FieldAttributes> &field_attributes,
56 const BoundaryParameters<dim> &_boundary_parameters,
57 const SpatialDiscretization<dim> &_spatial_discretization,
58 const DoFManager<dim, degree> &_dof_manager,
59 const PDEOperatorBase<dim, degree, number> &_pde_operator);
60
64 [[nodiscard]] std::vector<const dealii::AffineConstraints<number> *>
65 get_constraints(const std::set<unsigned int> &field_indices,
66 unsigned int relative_level = 0) const;
67
71 [[nodiscard]] const dealii::AffineConstraints<number> &
72 get_constraint(Types::Index index, unsigned int relative_level = 0) const;
73
77 [[nodiscard]] const std::vector<std::array<dealii::AffineConstraints<number>, 2>> &
79
83 [[nodiscard]] const dealii::AffineConstraints<number> &
84 get_generic_constraint(unsigned int rank, unsigned int relative_level = 0) const;
85
89 void
90 reinit(const std::vector<FieldAttributes> &field_attributes);
91
96 void
97 update_time_dependent_constraints(const std::vector<FieldAttributes> &field_attributes);
98
99private:
103 static const std::array<dealii::ComponentMask, dim> vector_component_mask;
104 static const dealii::ComponentMask scalar_empty_mask;
105
109 void
110 make_constraints_for_single_field(dealii::AffineConstraints<number> &constraint,
111 const dealii::DoFHandler<dim> &dof_handler,
112 const FieldConstraints<dim> &field_constraints,
113 TensorRank tensor_rank,
114 Types::Index field_index);
115
119 void
120 make_bc_constraints(dealii::AffineConstraints<number> &constraint,
121 const dealii::DoFHandler<dim> &dof_handler,
122 const FieldConstraints<dim> &boundary_condition,
123 TensorRank tensor_rank,
124 Types::Index field_index);
125
129 void
130 make_one_boundary_constraint(dealii::AffineConstraints<number> &_constraints,
131 unsigned int boundary_id,
132 unsigned int component,
133 Condition boundary_type,
134 const dealii::DoFHandler<dim> &dof_handler,
135 TensorRank tensor_rank,
136 Types::Index field_index) const;
137
141 void
143
147 void
148 make_dirichlet_constraints(dealii::AffineConstraints<number> &_constraints,
149 const dealii::DoFHandler<dim> &dof_handler,
150 const unsigned int &boundary_id,
151 const unsigned int &field_index,
152 const bool &is_vector_field,
153 const dealii::ComponentMask &mask) const;
154
159 void
160 make_periodic_constraints(dealii::AffineConstraints<number> &_constraints,
161 const dealii::DoFHandler<dim> &dof_handler,
162 const unsigned int &boundary_id,
163 const dealii::ComponentMask &mask) const;
164
168 void
169 set_pinned_point(dealii::AffineConstraints<number> &constraint,
170 const dealii::Point<dim> &target_point,
171 const std::array<number, dim> &value,
172 const dealii::DoFHandler<dim> &dof_handler,
173 TensorRank tensor_rank) const;
174
179
184
189
194
199 std::vector<std::vector<dealii::AffineConstraints<number>>> constraints;
200
204 std::vector<std::array<dealii::AffineConstraints<number>, 2>> generic_constraints;
205};
206
207PRISMS_PF_END_NAMESPACE
The class handles the generation and application of boundary conditions based on the user-inputs.
Definition constraint_manager.h:50
const dealii::AffineConstraints< number > & get_generic_constraint(unsigned int rank, unsigned int relative_level=0) const
Getter function for the constraint of an index (constant reference).
Definition constraint_manager.cc:89
void update_time_dependent_constraints(const std::vector< FieldAttributes > &field_attributes)
Update time-dependent constraints. For now this only updates the non-uniform dirichlet constraints.
Definition constraint_manager.cc:299
const PDEOperatorBase< dim, degree, number > * pde_operator
PDE operator.
Definition constraint_manager.h:193
std::vector< std::vector< dealii::AffineConstraints< number > > > constraints
Constraints. Outer vector is indexed by field index. Inner vector is indexed by relative mg level.
Definition constraint_manager.h:199
const BoundaryParameters< dim > * boundary_parameters
User-inputs constraint parameters.
Definition constraint_manager.h:178
std::vector< std::array< dealii::AffineConstraints< number >, 2 > > generic_constraints
Constraints not specific to any field. We need this for invm.
Definition constraint_manager.h:204
void make_periodic_constraints(dealii::AffineConstraints< number > &_constraints, const dealii::DoFHandler< dim > &dof_handler, const unsigned int &boundary_id, const dealii::ComponentMask &mask) const
make periodic constraints.
Definition constraint_manager.cc:381
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:359
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:236
const dealii::AffineConstraints< number > & get_constraint(Types::Index index, unsigned int relative_level=0) const
Getter function for the constraint of an index (constant reference).
Definition constraint_manager.cc:74
void make_bc_constraints(dealii::AffineConstraints< number > &constraint, const dealii::DoFHandler< dim > &dof_handler, const FieldConstraints< dim > &boundary_condition, TensorRank tensor_rank, Types::Index field_index)
Add boundary conditions to a single constraint.
Definition constraint_manager.cc:210
const SpatialDiscretization< dim > * spatial_discretization
User-inputs discretization.
Definition constraint_manager.h:183
void reinit(const std::vector< FieldAttributes > &field_attributes)
Make constraints based on the inputs of the constructor.
Definition constraint_manager.cc:98
std::vector< const dealii::AffineConstraints< number > * > get_constraints(const std::set< unsigned int > &field_indices, unsigned int relative_level=0) const
Getter function for the constraints.
Definition constraint_manager.cc:59
void make_natural_constraints() const
Apply natural constraints.
Definition constraint_manager.cc:352
static const dealii::ComponentMask scalar_empty_mask
Definition constraint_manager.h:104
const std::vector< std::array< dealii::AffineConstraints< number >, 2 > > & get_generic_constraints() const
Getter function for the constraints.
Definition constraint_manager.cc:82
void make_constraints_for_single_field(dealii::AffineConstraints< number > &constraint, const dealii::DoFHandler< dim > &dof_handler, const FieldConstraints< dim > &field_constraints, TensorRank tensor_rank, Types::Index field_index)
Construct constraints for a single field based on the boundary conditions.
Definition constraint_manager.cc:168
void set_pinned_point(dealii::AffineConstraints< number > &constraint, const dealii::Point< dim > &target_point, const std::array< number, dim > &value, const dealii::DoFHandler< dim > &dof_handler, TensorRank tensor_rank) const
Set the dirichlet constraint for the pinned point.
Definition constraint_manager.cc:411
const DoFManager< dim, degree > * dof_manager
Dof manager pointer.
Definition constraint_manager.h:188
static const std::array< dealii::ComponentMask, dim > vector_component_mask
Create a component mask.
Definition constraint_manager.h:103
Class that manages the deal.II DoFHandlers.
Definition dof_manager.h:27
This class contains the user implementation of each PDE operator.
Definition pde_operator_base.h:24
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
Struct that holds boundary parameters.
Definition constraint_parameters.h:164
Definition constraint_parameters.h:141
Struct that holds spatial discretization parameters.
Definition spatial_discretization.h:230
TensorRank
Tensor rank of the field.
Definition type_enums.h:30