PRISMS-PF Manual
Loading...
Searching...
No Matches
nonlinear_solve_parameters.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/parameter_handler.h>
7
9
11
12#include <prismspf/config.h>
13
15
20{
21 // Nonlinear step length
22 double step_length = 1.0;
23
24 // Max number of iterations for the nonlinear solve
26
27 // Tolerance value for the nonlinear solve
29};
30
35{
39 void
40 validate();
41
45 void
47
51 void
52 declare_parameters(dealii::ParameterHandler &parameter_handler,
53 unsigned int max_criteria = 5) const;
54
58 void
59 assign_parameters(dealii::ParameterHandler &parameter_handler,
60 unsigned int max_criteria = 5);
61
62 // Map of nonlinear solve parameters for fields that require them
63 std::map<Types::Index, NonlinearSolverParameters> newton_solvers;
64};
65
66inline void
68{
69 for (const auto &[index, nonlinear_solver_parameters] : newton_solvers)
70 {
71 AssertThrow(
72 nonlinear_solver_parameters.step_length > 0.0 &&
73 nonlinear_solver_parameters.step_length <= 1.0,
74 dealii::ExcMessage(
75 "Step length must be greater than 0.0 and less than or equal to 1.0"));
76
77 AssertThrow(nonlinear_solver_parameters.tolerance_value > 0,
78 dealii::ExcMessage("Tolerance must be greater than 0.0"));
79 }
80}
81
82inline void
84{
85 if (!newton_solvers.empty())
86 {
88 << "================================================\n"
89 << " Nonlinear Solve Parameters\n"
90 << "================================================\n";
91
92 for (const auto &[index, nonlinear_solver_parameters] : newton_solvers)
93 {
95 << "Index: " << index << "\n"
96 << " Max iterations: " << nonlinear_solver_parameters.max_iterations << "\n"
97 << " Step length: " << nonlinear_solver_parameters.step_length << "\n";
98 }
99
100 ConditionalOStreams::pout_summary() << "\n" << std::flush;
101 }
102}
103
104inline void
106 dealii::ParameterHandler &parameter_handler,
107 unsigned int max_criteria) const
108{
109 for (unsigned int criterion_id = 0; criterion_id < max_criteria; criterion_id++)
110 { // For nonlinear solves
111 std::string subsection_text =
112 "newton solver parameters: " + std::to_string(criterion_id);
113 parameter_handler.enter_subsection(subsection_text);
114 {
115 parameter_handler.declare_entry(
116 "solver_ids",
117 "",
118 dealii::Patterns::Anything(),
119 "The ids of the solvers that will use these settings.");
120 parameter_handler.declare_entry("max iterations",
121 "100",
122 dealii::Patterns::Integer(1, INT_MAX),
123 "The maximum number of nonlinear solver "
124 "iterations before the loop is stopped.");
125 /* parameter_handler.declare_entry(
126 "tolerance type",
127 "AbsoluteResidual",
128 dealii::Patterns::Selection("AbsoluteResidual|RMSEPerField|IntegratedPerField|"
129 "RMSETotal|IntegratedTotal"),
130 "The tolerance type for the nonlinear solver."); */
131 parameter_handler.declare_entry(
132 "tolerance value",
133 "1.0e-10",
134 dealii::Patterns::Double(DBL_MIN, DBL_MAX),
135 "The value of for the nonlinear solver tolerance.");
136 /* parameter_handler.declare_entry(
137 "use backtracking line search",
138 "true",
139 dealii::Patterns::Bool(),
140 "Whether to use a backtracking line-search to find the best "
141 "choice of the damping coefficient.");
142 parameter_handler.declare_entry(
143 "step size modifier",
144 "0.5",
145 dealii::Patterns::Double(0.0, 1.0),
146 "The constant that determines how much the step size decreases "
147 "per backtrack. The 'tau' parameter.");
148 parameter_handler.declare_entry(
149 "residual decrease coefficient",
150 "0.5",
151 dealii::Patterns::Double(0.0, 1.0),
152 "The constant that determines how much the residual must "
153 "decrease to be accepted as sufficient. The 'c' parameter."); */
154 parameter_handler.declare_entry(
155 "step size",
156 "1.0",
157 dealii::Patterns::Double(0.0),
158 "The constant damping value to be used if the backtrace "
159 "line-search approach isn't used.");
160 parameter_handler.declare_alias("tolerance value", "tolerance");
161 parameter_handler.declare_alias("solver_ids", "solve blocks");
162 parameter_handler.declare_alias("solver_ids", "solve_blocks");
163 parameter_handler.declare_alias("solver_ids", "solve block ids");
164 parameter_handler.declare_alias("solver_ids", "solve_block_ids");
165 }
166 parameter_handler.leave_subsection();
167 }
168}
169
170inline void
171NonlinearSolveParameterSet::assign_parameters(dealii::ParameterHandler &parameter_handler,
172 unsigned int max_criteria)
173{
174 for (unsigned int criterion_id = 0; criterion_id < max_criteria; criterion_id++)
175 {
176 // For newton solves
177 std::string subsection_text =
178 "newton solver parameters: " + std::to_string(criterion_id);
179 parameter_handler.enter_subsection(subsection_text);
180 {
181 std::vector<int> solver_ids = dealii::Utilities::string_to_int(
182 dealii::Utilities::split_string_list(parameter_handler.get("solver_ids")));
183 NonlinearSolverParameters nonlinear_solver_parameters;
184 nonlinear_solver_parameters.max_iterations =
185 static_cast<unsigned int>(parameter_handler.get_integer("max iterations"));
186 nonlinear_solver_parameters.step_length =
187 parameter_handler.get_double("step size");
188 nonlinear_solver_parameters.tolerance_value =
189 parameter_handler.get_double("tolerance value");
190 for (auto solver_id : solver_ids)
191 {
192 newton_solvers[static_cast<unsigned int>(solver_id)] =
193 nonlinear_solver_parameters;
194 }
195 }
196 parameter_handler.leave_subsection();
197 }
198}
199
200PRISMS_PF_END_NAMESPACE
static dealii::ConditionalOStream & pout_summary()
Log output stream for writing a summary.log file.
Definition conditional_ostreams.cc:35
static const unsigned int iterations
Default iterations.
Definition types.h:67
static const double tolerance
Default tolerance.
Definition types.h:57
Definition conditional_ostreams.cc:20
Struct that holds nonlinear solver parameters.
Definition nonlinear_solve_parameters.h:35
void assign_parameters(dealii::ParameterHandler &parameter_handler, unsigned int max_criteria=5)
Assign the parameters read from an input file to this object.
Definition nonlinear_solve_parameters.h:171
void validate()
Validate parameters.
Definition nonlinear_solve_parameters.h:67
void declare_parameters(dealii::ParameterHandler &parameter_handler, unsigned int max_criteria=5) const
Declare the parameters to be read from an input file.
Definition nonlinear_solve_parameters.h:105
std::map< Types::Index, NonlinearSolverParameters > newton_solvers
Definition nonlinear_solve_parameters.h:63
void print_parameter_summary() const
Print parameters to summary.log.
Definition nonlinear_solve_parameters.h:83
Struct that stores relevant nonlinear solve information of a certain field.
Definition nonlinear_solve_parameters.h:20
double step_length
Definition nonlinear_solve_parameters.h:22
double tolerance_value
Definition nonlinear_solve_parameters.h:28
unsigned int max_iterations
Definition nonlinear_solve_parameters.h:25