PRISMS-PF Manual v3.0-pre
All Classes Functions Variables Enumerations Pages
explicit_base.h
1// SPDX-FileCopyrightText: © 2025 PRISMS Center at the University of Michigan
2// SPDX-License-Identifier: GNU Lesser General Public Version 2.1
3
4#ifndef explicit_base_h
5#define explicit_base_h
6
7#include <deal.II/numerics/vector_tools.h>
8
9#include <prismspf/config.h>
10#include <prismspf/core/constraint_handler.h>
11#include <prismspf/core/dof_handler.h>
12#include <prismspf/core/exceptions.h>
13#include <prismspf/core/initial_conditions.h>
14#include <prismspf/core/invm_handler.h>
15#include <prismspf/core/matrix_free_handler.h>
16#include <prismspf/core/solution_handler.h>
17#include <prismspf/core/type_enums.h>
18#include <prismspf/core/variable_attributes.h>
19#include <prismspf/user_inputs/user_input_parameters.h>
20
21PRISMS_PF_BEGIN_NAMESPACE
22
26template <int dim, int degree, typename number>
28
32template <int dim, int degree>
34{
35public:
37
41 explicitBase(const userInputParameters<dim> &_user_inputs,
42 const matrixfreeHandler<dim> &_matrix_free_handler,
43 const invmHandler<dim, degree> &_invm_handler,
44 const constraintHandler<dim> &_constraint_handler,
45 const dofHandler<dim> &_dof_handler,
46 const dealii::MappingQ1<dim> &_mapping,
47 solutionHandler<dim> &_solution_handler);
48
52 ~explicitBase() = default;
53
57 virtual void
58 init() = 0;
59
63 virtual void
64 solve() = 0;
65
66protected:
72 void
73 compute_subset_attributes(const fieldSolveType &field_solve_type);
74
80 void
82
86 void
88
92 void
93 print();
94
99
104
109
114
119
123 const dealii::MappingQ1<dim> &mapping;
124
129
133 std::map<unsigned int, variableAttributes> subset_attributes;
134
138 std::unique_ptr<SystemMatrixType> system_matrix;
139};
140
141template <int dim, int degree>
143 const userInputParameters<dim> &_user_inputs,
144 const matrixfreeHandler<dim> &_matrix_free_handler,
145 const invmHandler<dim, degree> &_invm_handler,
146 const constraintHandler<dim> &_constraint_handler,
147 const dofHandler<dim> &_dof_handler,
148 const dealii::MappingQ1<dim> &_mapping,
149 solutionHandler<dim> &_solution_handler)
150 : user_inputs(_user_inputs)
151 , matrix_free_handler(_matrix_free_handler)
152 , invm_handler(_invm_handler)
153 , constraint_handler(_constraint_handler)
154 , dof_handler(_dof_handler)
155 , mapping(_mapping)
156 , solution_handler(_solution_handler)
157{}
158
159template <int dim, int degree>
160inline void
162 const fieldSolveType &field_solve_type)
163{
164 Assert((field_solve_type == fieldSolveType::EXPLICIT ||
165 field_solve_type == fieldSolveType::EXPLICIT_POSTPROCESS ||
166 field_solve_type == fieldSolveType::EXPLICIT_CONSTANT),
167 dealii::ExcMessage(
168 "compute_subset_attributes() should only be used for "
169 "EXPLICIT, EXPLICIT_POSTPROCESS, and EXPLICIT_CONSTANT fieldSolveTypes"));
170
171 subset_attributes.clear();
172
173 for (const auto &[index, variable] : user_inputs.var_attributes)
174 {
175 if (variable.field_solve_type == field_solve_type)
176 {
177 subset_attributes.emplace(index, variable);
178 }
179 }
180}
181
182template <int dim, int degree>
183inline void
185{
186 // Compute the shared dependency flags
187 auto &dependency_flag_set = subset_attributes.begin()->second.eval_flag_set_RHS;
188 for (const auto &[index, variable] : subset_attributes)
189 {
190 if (!variable.eval_flag_set_RHS.empty())
191 {
192 for (const auto &[pair, flag] : variable.eval_flag_set_RHS)
193 {
194 dependency_flag_set[pair] |= flag;
195 }
196 }
197 }
198 for (auto &[index, variable] : subset_attributes)
199 {
200 for (const auto &[pair, flag] : dependency_flag_set)
201 {
202 variable.eval_flag_set_RHS[pair] |= flag;
203 }
204 }
205
206 // Compute the shared dependency set
207 auto &dependency_set = subset_attributes.begin()->second.dependency_set_RHS;
208 for (const auto &[index, variable] : subset_attributes)
209 {
210 for (const auto &[index, map] : variable.dependency_set_RHS)
211 {
212 for (const auto &[dependency_type, field_type] : map)
213 {
214 dependency_set[index].emplace(dependency_type, field_type);
215 }
216 }
217 }
218 for (auto &[index, variable] : subset_attributes)
219 {
220 variable.dependency_set_RHS = dependency_set;
221 }
222
223#ifdef DEBUG
224 print();
225#endif
226}
227
228template <int dim, int degree>
229inline void
231{
232 for (const auto &[index, variable] : subset_attributes)
233 {
234 Assert(dof_handler.get_dof_handlers().size() > index,
235 dealii::ExcMessage(
236 "The const DoFHandler set is smaller than the given index = " +
237 std::to_string(index)));
238 Assert(subset_attributes.find(index) != subset_attributes.end(),
239 dealii::ExcMessage(
240 "There is no entry in the attribute subset for the given index = " +
241 std::to_string(index)));
242 Assert(solution_handler.solution_set.find(
243 std::make_pair(index, dependencyType::NORMAL)) !=
244 solution_handler.solution_set.end(),
245 dealii::ExcMessage("There is no solution vector for the given index = " +
246 std::to_string(index) +
247 " and type = " + to_string(dependencyType::NORMAL)));
248
249 dealii::VectorTools::interpolate(
250 mapping,
251 *(dof_handler.get_dof_handlers().at(index)),
252 initialCondition<dim>(index, subset_attributes.at(index).field_type, user_inputs),
253 *(solution_handler.solution_set.at(
254 std::make_pair(index, dependencyType::NORMAL))));
255 }
256}
257
258template <int dim, int degree>
259inline void
261{
263 << " ==============================================\n"
264 << " Shared dependency set\n"
265 << " ==============================================\n";
266 const auto &dependency_set = subset_attributes.begin()->second.dependency_set_RHS;
267 for (const auto &[index, map] : dependency_set)
268 {
269 for (const auto &[dependency_type, field_type] : map)
270 {
272 << " Index: " << index << " Dependency: " << to_string(dependency_type)
273 << " Field: " << to_string(field_type) << "\n";
274 }
275 }
276 conditionalOStreams::pout_summary() << "\n" << std::flush;
277}
278
279PRISMS_PF_END_NAMESPACE
280
281#endif
static dealii::ConditionalOStream & pout_summary()
Log output stream for writing a summary.log file.
Definition conditional_ostreams.cc:22
The class handles the generation and application of boundary conditions based on the user-inputs.
Definition constraint_handler.h:25
Definition explicit_base.h:27
Class that manages the deal.II DoFHandlers.
Definition dof_handler.h:25
Base class for explicit solves.
Definition explicit_base.h:34
const userInputParameters< dim > & user_inputs
User-inputs.
Definition explicit_base.h:98
explicitBase(const userInputParameters< dim > &_user_inputs, const matrixfreeHandler< dim > &_matrix_free_handler, const invmHandler< dim, degree > &_invm_handler, const constraintHandler< dim > &_constraint_handler, const dofHandler< dim > &_dof_handler, const dealii::MappingQ1< dim > &_mapping, solutionHandler< dim > &_solution_handler)
Constructor.
Definition explicit_base.h:142
const matrixfreeHandler< dim > & matrix_free_handler
Matrix-free object handler for non-multigrid data.
Definition explicit_base.h:103
solutionHandler< dim > & solution_handler
Solution handler.
Definition explicit_base.h:128
void set_initial_condition()
Set the initial condition according to subset_attributes.
Definition explicit_base.h:230
const constraintHandler< dim > & constraint_handler
Constraint handler.
Definition explicit_base.h:113
void compute_subset_attributes(const fieldSolveType &field_solve_type)
Compute the subset of variableAttributes that belongs to a given fieldSolveType. This function should...
Definition explicit_base.h:161
void compute_shared_dependencies()
Compute the shared dependency set and copy it to all eval_flag_set_RHS. Also do something similar wit...
Definition explicit_base.h:184
std::map< unsigned int, variableAttributes > subset_attributes
Subset of variable attributes.
Definition explicit_base.h:133
std::unique_ptr< SystemMatrixType > system_matrix
PDE operator.
Definition explicit_base.h:138
virtual void init()=0
Initialize system.
void print()
Print dependency_set_RHS to summary.log.
Definition explicit_base.h:260
const dealii::MappingQ1< dim > & mapping
Mappings to and from reference cell.
Definition explicit_base.h:123
virtual void solve()=0
Solve a single update step.
const dofHandler< dim > & dof_handler
DoF handler.
Definition explicit_base.h:118
~explicitBase()=default
Destructor.
const invmHandler< dim, degree > & invm_handler
invm handler.
Definition explicit_base.h:108
Function for user-implemented initial conditions. These are only ever calculated for explicit time de...
Definition initial_conditions.h:30
This class handles the computation and access of the inverted mass matrix for explicit solves.
Definition invm_handler.h:25
This class handlers the management and access of the matrix-free objects.
Definition matrix_free_handler.h:25
Class that manages solution initialization and swapping with old solutions.
Definition solution_handler.h:22
Definition user_input_parameters.h:22