include/meltpooldg/utilities/constraints.hpp Source File

Developer Documentation: include/meltpooldg/utilities/constraints.hpp Source File
Developer Documentation
constraints.hpp
Go to the documentation of this file.
1#pragma once
2#include <deal.II/dofs/dof_tools.h>
3
4#include <deal.II/numerics/vector_tools.h>
5
9
11{
16 template <int dim, int spacedim, typename number>
17 void
18 check_constraints([[maybe_unused]] const dealii::DoFHandler<dim, spacedim> &dof_handler,
19 [[maybe_unused]] const dealii::AffineConstraints<number> &constraints)
20 {
21#ifndef DEBUG
22 return;
23#endif
24
25 dealii::IndexSet locally_active_dofs =
26 dealii::DoFTools::extract_locally_active_dofs(dof_handler);
27
28 Assert(constraints.is_consistent_in_parallel(
29 dealii::Utilities::MPI::all_gather(dof_handler.get_mpi_communicator(),
30 dof_handler.locally_owned_dofs()),
31 locally_active_dofs,
32 dof_handler.get_mpi_communicator()),
33 dealii::ExcInternalError());
34 }
35
49 template <int dim, typename number>
50 void
53 const std::map<dealii::types::boundary_id, std::shared_ptr<dealii::Function<dim>>> &bc_data,
54 const unsigned int dof_idx,
55 const bool set_inhomogeneities = true,
56 const bool close = true)
57 {
58 if (!bc_data.empty())
59 {
60 for (const auto &bc : bc_data)
61 {
62 if (set_inhomogeneities)
63 dealii::VectorTools::interpolate_boundary_values<dim>(
64 scratch_data.get_mapping(),
65 scratch_data.get_dof_handler(dof_idx),
66 bc.first,
67 *bc.second,
68 scratch_data.get_constraint(dof_idx));
69 else
70 dealii::DoFTools::make_zero_boundary_constraints<dim>(
71 scratch_data.get_dof_handler(dof_idx),
72 bc.first,
73 scratch_data.get_constraint(dof_idx));
74 }
75 }
76
77 if (close)
78 {
79 scratch_data.get_constraint(dof_idx).close();
80 check_constraints(scratch_data.get_dof_handler(dof_idx),
81 scratch_data.get_constraint(dof_idx));
82 }
83 }
84
95 template <int dim, typename number>
96 void
99 const std::map<dealii::types::boundary_id, std::shared_ptr<dealii::Function<dim>>> &bc_data,
100 const unsigned int dof_idx,
101 const bool set_inhomogeneities = true,
102 const bool close = true)
103 {
104 scratch_data.get_constraint(dof_idx).reinit(scratch_data.get_locally_owned_dofs(dof_idx),
105 scratch_data.get_locally_relevant_dofs(dof_idx));
106
107 fill_DBC(scratch_data, bc_data, dof_idx, set_inhomogeneities, close);
108 }
109
117 template <int dim, typename number>
118 void
120 const unsigned int dof_hanging_nodes_idx,
121 const bool close = true)
122 {
123 scratch_data.get_constraint(dof_hanging_nodes_idx)
124 .reinit(scratch_data.get_locally_owned_dofs(dof_hanging_nodes_idx),
125 scratch_data.get_locally_relevant_dofs(dof_hanging_nodes_idx));
126 dealii::DoFTools::make_hanging_node_constraints(
127 scratch_data.get_dof_handler(dof_hanging_nodes_idx),
128 scratch_data.get_constraint(dof_hanging_nodes_idx));
129
130 if (close)
131 {
132 scratch_data.get_constraint(dof_hanging_nodes_idx).close();
133 check_constraints(scratch_data.get_dof_handler(dof_hanging_nodes_idx),
134 scratch_data.get_constraint(dof_hanging_nodes_idx));
135 }
136 }
137
142 template <int dim, typename number>
143 void
145 const unsigned int dof_idx,
146 const unsigned int dof_hanging_nodes_idx)
147 {
148 scratch_data.get_constraint(dof_idx).merge(
149 scratch_data.get_constraint(dof_hanging_nodes_idx),
150 dealii::AffineConstraints<number>::MergeConflictBehavior::right_object_wins);
151 }
152
169 template <int dim, typename number>
170 void
172 ScratchData<dim, dim, number> &scratch_data,
173 const std::map<dealii::types::boundary_id, std::shared_ptr<dealii::Function<dim>>> &bc_data,
174 const unsigned int dof_idx,
175 const unsigned int dof_hanging_nodes_idx,
176 const bool set_inhomogeneities = true)
177 {
178 make_DBC(scratch_data, bc_data, dof_idx, set_inhomogeneities, true /* close */);
179 make_HNC(scratch_data, dof_hanging_nodes_idx, true /* close */);
180
181 merge_HNC_into_DBC<dim, number>(scratch_data, dof_idx, dof_hanging_nodes_idx);
182
183 check_constraints(scratch_data.get_dof_handler(dof_idx), scratch_data.get_constraint(dof_idx));
184 }
185
192 template <int dim, typename number>
193 void
196 const unsigned int dof_idx)
197 {
198 for (const auto &bc : pbc.get_data())
199 {
200 const auto [id_in, id_out, direction] = bc;
201 dealii::DoFTools::make_periodicity_constraints(scratch_data.get_dof_handler(dof_idx),
202 id_in,
203 id_out,
204 direction,
205 scratch_data.get_constraint(dof_idx));
206 }
207 }
208
219 template <int dim, typename number>
220 void
223 const unsigned int dof_hanging_nodes_idx)
224 {
225 make_HNC(scratch_data, dof_hanging_nodes_idx, false /* close */);
226
227 insert_PBC(scratch_data, pbc, dof_hanging_nodes_idx);
228
229 scratch_data.get_constraint(dof_hanging_nodes_idx).close();
230 check_constraints(scratch_data.get_dof_handler(dof_hanging_nodes_idx),
231 scratch_data.get_constraint(dof_hanging_nodes_idx));
232 }
233
254 template <int dim, typename number>
255 void
257 ScratchData<dim, dim, number> &scratch_data,
258 const std::map<dealii::types::boundary_id, std::shared_ptr<dealii::Function<dim>>> &bc_data,
260 const unsigned int dof_idx,
261 const unsigned int dof_hanging_nodes_idx,
262 const bool set_inhomogeneities = true)
263 {
264 make_HNC_plus_PBC(scratch_data, pbc, dof_hanging_nodes_idx);
265 make_DBC(scratch_data, bc_data, dof_idx, set_inhomogeneities, true /* close */);
266 merge_HNC_into_DBC<dim, number>(scratch_data, dof_idx, dof_hanging_nodes_idx);
267
268 check_constraints(scratch_data.get_dof_handler(dof_idx), scratch_data.get_constraint(dof_idx));
269 }
270} // namespace MeltPoolDG::Constraints
Container for shared scratch data between operations/operators.
Definition scratch_data.hpp:61
const dealii::IndexSet & get_locally_owned_dofs(const unsigned int dof_idx) const
Get the set of locally owned DoFs for a given DoFHandler index.
Definition scratch_data.cpp:529
const dealii::DoFHandler< dim, spacedim > & get_dof_handler(const unsigned int dof_idx) const
Get a DoFHandler by index (const overload).
Definition scratch_data.cpp:438
const dealii::Mapping< dim, spacedim > & get_mapping() const
Access the stored mapping.
Definition scratch_data.cpp:361
const dealii::AffineConstraints< number > & get_constraint(const unsigned int constraint_index) const
Get a constraint object by index (const overload).
Definition scratch_data.cpp:375
const dealii::IndexSet & get_locally_relevant_dofs(const unsigned int dof_idx) const
Get the set of locally relevant DoFs for a given DoFHandler index.
Definition scratch_data.cpp:536
Definition constraints.hpp:11
void make_DBC_and_HNC_and_merge_HNC_into_DBC(ScratchData< dim, dim, number > &scratch_data, const std::map< dealii::types::boundary_id, std::shared_ptr< dealii::Function< dim > > > &bc_data, const unsigned int dof_idx, const unsigned int dof_hanging_nodes_idx, const bool set_inhomogeneities=true)
Definition constraints.hpp:171
void merge_HNC_into_DBC(ScratchData< dim, dim, number > &scratch_data, const unsigned int dof_idx, const unsigned int dof_hanging_nodes_idx)
Definition constraints.hpp:144
void check_constraints(const dealii::DoFHandler< dim, spacedim > &dof_handler, const dealii::AffineConstraints< number > &constraints)
Definition constraints.hpp:18
void make_HNC(ScratchData< dim, dim, number > &scratch_data, const unsigned int dof_hanging_nodes_idx, const bool close=true)
Definition constraints.hpp:119
void fill_DBC(ScratchData< dim, dim, number > &scratch_data, const std::map< dealii::types::boundary_id, std::shared_ptr< dealii::Function< dim > > > &bc_data, const unsigned int dof_idx, const bool set_inhomogeneities=true, const bool close=true)
Definition constraints.hpp:51
void make_HNC_plus_PBC(ScratchData< dim, dim, number > &scratch_data, const PeriodicBoundaryConditions< dim > &pbc, const unsigned int dof_hanging_nodes_idx)
Definition constraints.hpp:221
void insert_PBC(ScratchData< dim, dim, number > &scratch_data, const PeriodicBoundaryConditions< dim > &pbc, const unsigned int dof_idx)
Definition constraints.hpp:194
void make_DBC_and_HNC_plus_PBC_and_merge_HNC_plus_PBC_into_DBC(ScratchData< dim, dim, number > &scratch_data, const std::map< dealii::types::boundary_id, std::shared_ptr< dealii::Function< dim > > > &bc_data, const PeriodicBoundaryConditions< dim > &pbc, const unsigned int dof_idx, const unsigned int dof_hanging_nodes_idx, const bool set_inhomogeneities=true)
Definition constraints.hpp:256
void make_DBC(ScratchData< dim, dim, number > &scratch_data, const std::map< dealii::types::boundary_id, std::shared_ptr< dealii::Function< dim > > > &bc_data, const unsigned int dof_idx, const bool set_inhomogeneities=true, const bool close=true)
Definition constraints.hpp:97
Definition periodic_boundary_conditions.hpp:11
const Type & get_data() const
Definition periodic_boundary_conditions.cpp:33