PRISMS-PF Manual v3.0-pre
All Classes Functions Variables Enumerations Pages
nonexplicit_linear_solver.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 nonexplicit_linear_solver_h
5#define nonexplicit_linear_solver_h
6
7#include <deal.II/lac/precondition.h>
8#include <deal.II/lac/solver_cg.h>
9#include <deal.II/lac/solver_control.h>
10
11#include <prismspf/config.h>
12#include <prismspf/core/constraint_handler.h>
13#include <prismspf/core/dof_handler.h>
14#include <prismspf/core/matrix_free_handler.h>
15#include <prismspf/core/solution_handler.h>
16#include <prismspf/core/type_enums.h>
17#include <prismspf/core/variable_attributes.h>
18#include <prismspf/solvers/linear_solver_gmg.h>
19#include <prismspf/solvers/linear_solver_identity.h>
20#include <prismspf/solvers/nonexplicit_base.h>
21#include <prismspf/user_inputs/user_input_parameters.h>
22
23#ifdef PRISMS_PF_WITH_CALIPER
24# include <caliper/cali.h>
25#endif
26
27PRISMS_PF_BEGIN_NAMESPACE
28
32template <int dim, int degree, typename number>
33class customPDE;
34
38template <int dim, int degree>
39class nonexplicitLinearSolver : public nonexplicitBase<dim, degree>
40{
41public:
43
48 const userInputParameters<dim> &_user_inputs,
49 const matrixfreeHandler<dim> &_matrix_free_handler,
50 const triangulationHandler<dim> &_triangulation_handler,
51 const invmHandler<dim, degree> &_invm_handler,
52 const constraintHandler<dim> &_constraint_handler,
53 const dofHandler<dim> &_dof_handler,
54 const dealii::MappingQ1<dim> &_mapping,
55 dealii::MGLevelObject<matrixfreeHandler<dim, float>> &_mg_matrix_free_handler,
56 solutionHandler<dim> &_solution_handler);
57
62
66 void
67 init() override;
68
72 void
73 solve() override;
74
75private:
79 std::map<unsigned int, std::unique_ptr<identitySolver<dim, degree>>> identity_solvers;
80
84 std::map<unsigned int, std::unique_ptr<GMGSolver<dim, degree>>> gmg_solvers;
85};
86
87template <int dim, int degree>
89 const userInputParameters<dim> &_user_inputs,
90 const matrixfreeHandler<dim> &_matrix_free_handler,
91 const triangulationHandler<dim> &_triangulation_handler,
92 const invmHandler<dim, degree> &_invm_handler,
93 const constraintHandler<dim> &_constraint_handler,
94 const dofHandler<dim> &_dof_handler,
95 const dealii::MappingQ1<dim> &_mapping,
96 dealii::MGLevelObject<matrixfreeHandler<dim, float>> &_mg_matrix_free_handler,
97 solutionHandler<dim> &_solution_handler)
98 : nonexplicitBase<dim, degree>(_user_inputs,
99 _matrix_free_handler,
100 _triangulation_handler,
101 _invm_handler,
102 _constraint_handler,
103 _dof_handler,
104 _mapping,
105 _mg_matrix_free_handler,
106 _solution_handler)
107{}
108
109template <int dim, int degree>
110inline void
112{
113 this->compute_subset_attributes(fieldSolveType::NONEXPLICIT_LINEAR);
114
115 // If the subset attribute is empty return early
116 if (this->subset_attributes.empty())
117 {
118 return;
119 }
120
121 this->set_initial_condition();
122
123 for (const auto &[index, variable] : this->subset_attributes)
124 {
125 if (this->user_inputs.linear_solve_parameters.linear_solve.at(index)
126 .preconditioner == preconditionerType::GMG)
127 {
128 gmg_solvers.emplace(
129 index,
130 std::make_unique<GMGSolver<dim, degree>>(this->user_inputs,
131 variable,
132 this->matrix_free_handler,
133 this->constraint_handler,
134 this->triangulation_handler,
135 this->dof_handler,
136 this->mg_matrix_free_handler,
137 this->solution_handler));
138 gmg_solvers.at(index)->init();
139 }
140 else
141 {
142 identity_solvers.emplace(
143 index,
144 std::make_unique<identitySolver<dim, degree>>(this->user_inputs,
145 variable,
146 this->matrix_free_handler,
147 this->constraint_handler,
148 this->solution_handler));
149 identity_solvers.at(index)->init();
150 }
151 }
152}
153
154template <int dim, int degree>
155inline void
157{
158 // If the subset attribute is empty return early
159 if (this->subset_attributes.empty())
160 {
161 return;
162 }
163
164 for (const auto &[index, variable] : this->subset_attributes)
165 {
166 if (this->user_inputs.linear_solve_parameters.linear_solve.at(index)
167 .preconditioner == preconditionerType::GMG)
168 {
169 gmg_solvers.at(index)->solve();
170 }
171 else
172 {
173 identity_solvers.at(index)->solve();
174 }
175 }
176}
177
178PRISMS_PF_END_NAMESPACE
179
180#endif
Class that handles the assembly and solving of a field with a GMG preconditioner.
Definition linear_solver_gmg.h:44
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
Class that handles the assembly and solving of a field with the identity preconditioner (no precondit...
Definition linear_solver_identity.h:26
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
Base class for nonexplicit solves.
Definition nonexplicit_base.h:35
This class handles all linear solves.
Definition nonexplicit_linear_solver.h:40
~nonexplicitLinearSolver()=default
Destructor.
nonexplicitLinearSolver(const userInputParameters< dim > &_user_inputs, const matrixfreeHandler< dim > &_matrix_free_handler, const triangulationHandler< dim > &_triangulation_handler, const invmHandler< dim, degree > &_invm_handler, const constraintHandler< dim > &_constraint_handler, const dofHandler< dim > &_dof_handler, const dealii::MappingQ1< dim > &_mapping, dealii::MGLevelObject< matrixfreeHandler< dim, float > > &_mg_matrix_free_handler, solutionHandler< dim > &_solution_handler)
Constructor.
Definition nonexplicit_linear_solver.h:88
void solve() override
Solve a single update step.
Definition nonexplicit_linear_solver.h:156
void init() override
Initialize system.
Definition nonexplicit_linear_solver.h:111
Class that manages solution initialization and swapping with old solutions.
Definition solution_handler.h:22
This class handlers the generation and manipulation of triangulations.
Definition triangulation_handler.h:24
Definition user_input_parameters.h:22