PRISMS-PF Manual v3.0-pre
All Classes Functions Variables Enumerations Pages
nonexplicit_self_nonlinear_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_self_nonlinear_solver_h
5#define nonexplicit_self_nonlinear_solver_h
6
7#include <prismspf/config.h>
8
9#ifdef PRISMS_PF_WITH_CALIPER
10# include <caliper/cali.h>
11#endif
12
13PRISMS_PF_BEGIN_NAMESPACE
14
18template <int dim, int degree, typename number>
19class customPDE;
20
24template <int dim, int degree>
26{
27public:
29
34 const userInputParameters<dim> &_user_inputs,
35 const matrixfreeHandler<dim> &_matrix_free_handler,
36 const triangulationHandler<dim> &_triangulation_handler,
37 const invmHandler<dim, degree> &_invm_handler,
38 const constraintHandler<dim> &_constraint_handler,
39 const dofHandler<dim> &_dof_handler,
40 const dealii::MappingQ1<dim> &_mapping,
41 dealii::MGLevelObject<matrixfreeHandler<dim, float>> &_mg_matrix_free_handler,
42 solutionHandler<dim> &_solution_handler);
43
48
52 void
53 init() override;
54
58 void
59 solve() override;
60
61private:
65 std::map<unsigned int, std::unique_ptr<identitySolver<dim, degree>>> identity_solvers;
66
70 std::map<unsigned int, std::unique_ptr<GMGSolver<dim, degree>>> gmg_solvers;
71};
72
73template <int dim, int degree>
75 const userInputParameters<dim> &_user_inputs,
76 const matrixfreeHandler<dim> &_matrix_free_handler,
77 const triangulationHandler<dim> &_triangulation_handler,
78 const invmHandler<dim, degree> &_invm_handler,
79 const constraintHandler<dim> &_constraint_handler,
80 const dofHandler<dim> &_dof_handler,
81 const dealii::MappingQ1<dim> &_mapping,
82 dealii::MGLevelObject<matrixfreeHandler<dim, float>> &_mg_matrix_free_handler,
83 solutionHandler<dim> &_solution_handler)
84 : nonexplicitBase<dim, degree>(_user_inputs,
85 _matrix_free_handler,
86 _triangulation_handler,
87 _invm_handler,
88 _constraint_handler,
89 _dof_handler,
90 _mapping,
91 _mg_matrix_free_handler,
92 _solution_handler)
93{}
94
95template <int dim, int degree>
96inline void
98{
99 this->compute_subset_attributes(fieldSolveType::NONEXPLICIT_SELF_NONLINEAR);
100
101 // If the subset attribute is empty return early
102 if (this->subset_attributes.empty())
103 {
104 return;
105 }
106
107 this->set_initial_condition();
108
109 for (const auto &[index, variable] : this->subset_attributes)
110 {
111 if (this->user_inputs.linear_solve_parameters.linear_solve.at(index)
112 .preconditioner == preconditionerType::GMG)
113 {
114 gmg_solvers.emplace(
115 index,
116 std::make_unique<GMGSolver<dim, degree>>(this->user_inputs,
117 variable,
118 this->matrix_free_handler,
119 this->constraint_handler,
120 this->triangulation_handler,
121 this->dof_handler,
122 this->mg_matrix_free_handler,
123 this->solution_handler));
124 gmg_solvers.at(index)->init();
125 }
126 else
127 {
128 identity_solvers.emplace(
129 index,
130 std::make_unique<identitySolver<dim, degree>>(this->user_inputs,
131 variable,
132 this->matrix_free_handler,
133 this->constraint_handler,
134 this->solution_handler));
135 identity_solvers.at(index)->init();
136 }
137 }
138}
139
140template <int dim, int degree>
141inline void
143{
144 // If the subset attribute is empty return early
145 if (this->subset_attributes.empty())
146 {
147 return;
148 }
149
150 for (const auto &[index, variable] : this->subset_attributes)
151 {
152 bool is_converged = true;
153 unsigned int iteration = 0;
154 auto &step_length =
155 this->user_inputs.nonlinear_solve_parameters.nonlinear_solve.at(index)
156 .step_length;
157
158 while (is_converged)
159 {
160 is_converged = false;
161
162 // Perform the linear solve with the step length
163 if (this->user_inputs.linear_solve_parameters.linear_solve.at(index)
164 .preconditioner == preconditionerType::GMG)
165 {
166 gmg_solvers.at(index)->solve(step_length);
167 }
168 else
169 {
170 identity_solvers.at(index)->solve(step_length);
171 }
172
173 iteration++;
174
175 if (iteration <
176 this->user_inputs.nonlinear_solve_parameters.nonlinear_solve.at(index)
177 .max_iterations)
178 {
179 is_converged = true;
180 }
181 }
182 }
183}
184
185PRISMS_PF_END_NAMESPACE
186
187#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 the self-nonlinear solves of a single nonexplicit field.
Definition nonexplicit_self_nonlinear_solver.h:26
void init() override
Initialize system.
Definition nonexplicit_self_nonlinear_solver.h:97
nonexplicitSelfNonlinearSolver(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_self_nonlinear_solver.h:74
~nonexplicitSelfNonlinearSolver()=default
Destructor.
void solve() override
Solve a single update step.
Definition nonexplicit_self_nonlinear_solver.h:142
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