PRISMS-PF Manual
Loading...
Searching...
No Matches
checkpoint_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
10
12
14
15#include <prismspf/config.h>
16
17#include <climits>
18#include <set>
19#include <string>
20
22
27{
31 [[nodiscard]] bool
32 should_checkpoint(unsigned int increment) const
33 {
34 return checkpoint_list.contains(increment);
35 }
36
40 void
42 { // todo
43 }
44
48 void
50
54 template <typename ListType>
55 void
56 add_checkpoint_list(const ListType &list)
57 {
58 checkpoint_list.insert(list.begin(), list.end());
59 }
60
64 void
65 add_equal_spacing_checkpoints(unsigned int num_checkpoints, unsigned int num_increments)
66 {
67 if (!num_checkpoints)
68 {
69 return;
70 }
71 for (unsigned int checkpoint = 0; checkpoint <= num_increments;
72 checkpoint += num_increments / num_checkpoints)
73 {
74 checkpoint_list.insert(checkpoint);
75 }
76 }
77
81 void
82 add_log_spacing_checkpoints(unsigned int num_checkpoints, unsigned int num_increments)
83 {
84 if (!num_checkpoints)
85 {
86 return;
87 }
88 for (unsigned int checkpoint = 1; checkpoint <= num_checkpoints; checkpoint++)
89 {
90 checkpoint_list.insert(static_cast<unsigned int>(
91 std::round(std::pow(double(num_increments),
92 double(checkpoint) / double(num_checkpoints)))));
93 }
94 }
95
99 void
100 add_n_per_decade_checkpoints(unsigned int num_checkpoints, unsigned int num_increments)
101 {
102 if (!num_checkpoints)
103 {
104 return;
105 }
106 AssertThrow(num_increments > 1,
107 dealii::ExcMessage("For n per decaded spaced checkpoints, the number of "
108 "increments must be greater than 1."));
109
110 for (unsigned int iteration = 2; iteration <= num_increments; iteration++)
111 {
112 const auto decade = static_cast<unsigned int>(std::ceil(std::log10(iteration)));
113 const auto step_size =
114 static_cast<unsigned int>(std::pow(10, decade) / num_checkpoints);
115 if (iteration % step_size == 0)
116 {
117 checkpoint_list.insert(iteration);
118 }
119 }
120 }
121
125 void
127 {
128 checkpoint_list.clear();
129 }
130
134 [[nodiscard]] unsigned int
136 {
137 return checkpoint_list.size();
138 }
139
143 void
144 declare_parameters(dealii::ParameterHandler &parameter_handler) const;
145
149 void
150 assign_parameters(dealii::ParameterHandler &parameter_handler,
151 const TemporalDiscretization &temporal_discretization);
152
153 // Whether to load from a checkpoint
155
156 // Checkpoint file name
157 std::string file_name;
158
159 // Whether to print timing information with checkpoint
160 // TODO (landinjm): Implement this.
162
163 // List of increments that checkpoint the solution to file
164 std::set<unsigned int> checkpoint_list;
165};
166
167inline void
169{
171 << "================================================\n"
172 << " Checkpoint Parameters\n"
173 << "================================================\n"
174 << "Checkpoint file name: " << file_name << "\n"
175 << "Number of checkpoints: " << get_num_checkpoints() << "\n"
176 << "Print timing info: " << bool_to_string(print_timing_with_checkpoint) << "\n";
177
178 ConditionalOStreams::pout_summary() << "Checkpoint increment list: ";
179 for (const auto &iteration : checkpoint_list)
180 {
181 ConditionalOStreams::pout_summary() << iteration << " ";
182 }
183 ConditionalOStreams::pout_summary() << "\n\n" << std::flush;
184}
185
186inline void
188 dealii::ParameterHandler &parameter_handler) const
189{
190 parameter_handler.enter_subsection("checkpoints");
191 {
192 parameter_handler.declare_entry(
193 "load from checkpoint",
194 "false",
195 dealii::Patterns::Bool(),
196 "Whether to load from a checkpoint created during a previous simulation.");
197 parameter_handler.declare_entry(
198 "condition",
199 "EQUAL_SPACING",
200 dealii::Patterns::Selection("EQUAL_SPACING|LOG_SPACING|N_PER_DECADE|LIST"),
201 "The spacing type for saving checkpoints (either EQUAL_SPACING, "
202 "LOG_SPACING, N_PER_DECADE, or LIST).");
203 parameter_handler.declare_entry(
204 "list",
205 "0",
206 dealii::Patterns::List(dealii::Patterns::Integer(0, INT_MAX), 0, INT_MAX, ","),
207 "The list of time steps to save checkpoints, used for the LIST type.");
208 parameter_handler.declare_entry(
209 "number",
210 "0",
211 dealii::Patterns::Integer(0, INT_MAX),
212 "The number of checkpoints (or number of checkpoints per decade for the "
213 "N_PER_DECADE type).");
214 }
215 parameter_handler.leave_subsection();
216}
217
218inline void
220 dealii::ParameterHandler &parameter_handler,
221 const TemporalDiscretization &temporal_discretization)
222{
223 parameter_handler.enter_subsection("checkpoints");
224 {
225 should_load_checkpoint = parameter_handler.get_bool("load from checkpoint");
226
227 std::string condition = parameter_handler.get("condition");
228 unsigned int num_checkpoints =
229 static_cast<unsigned int>(parameter_handler.get_integer("number"));
230 unsigned int num_increments = temporal_discretization.num_increments;
231 if (condition == "EQUAL_SPACING")
232 {
233 add_equal_spacing_checkpoints(num_checkpoints, num_increments);
234 }
235 else if (condition == "LOG_SPACING")
236 {
237 add_log_spacing_checkpoints(num_checkpoints, num_increments);
238 }
239 else if (condition == "N_PER_DECADE")
240 {
241 add_n_per_decade_checkpoints(num_checkpoints, num_increments);
242 }
243 add_checkpoint_list(dealii::Utilities::string_to_int(
244 dealii::Utilities::split_string_list(parameter_handler.get("list"))));
245 }
246 parameter_handler.leave_subsection();
247}
248
249PRISMS_PF_END_NAMESPACE
static dealii::ConditionalOStream & pout_summary()
Log output stream for writing a summary.log file.
Definition conditional_ostreams.cc:35
Definition conditional_ostreams.cc:20
Struct that holds checkpoint parameters.
Definition checkpoint_parameters.h:27
std::set< unsigned int > checkpoint_list
Definition checkpoint_parameters.h:164
void declare_parameters(dealii::ParameterHandler &parameter_handler) const
Declare the parameters to be read from an input file.
Definition checkpoint_parameters.h:187
bool print_timing_with_checkpoint
Definition checkpoint_parameters.h:161
void print_parameter_summary() const
Print parameters to summary.log.
Definition checkpoint_parameters.h:168
void clear_checkpoint_list()
Set the user checkpoint list.
Definition checkpoint_parameters.h:126
std::string file_name
Definition checkpoint_parameters.h:157
void add_log_spacing_checkpoints(unsigned int num_checkpoints, unsigned int num_increments)
Set the user checkpoint list.
Definition checkpoint_parameters.h:82
void validate()
Postprocess and validate parameters.
Definition checkpoint_parameters.h:41
void add_n_per_decade_checkpoints(unsigned int num_checkpoints, unsigned int num_increments)
Set the user checkpoint list.
Definition checkpoint_parameters.h:100
void assign_parameters(dealii::ParameterHandler &parameter_handler, const TemporalDiscretization &temporal_discretization)
Assign the parameters read from an input file to this object.
Definition checkpoint_parameters.h:219
bool should_load_checkpoint
Definition checkpoint_parameters.h:154
void add_equal_spacing_checkpoints(unsigned int num_checkpoints, unsigned int num_increments)
Set the user checkpoint list.
Definition checkpoint_parameters.h:65
void add_checkpoint_list(const ListType &list)
Set the user checkpoint list.
Definition checkpoint_parameters.h:56
bool should_checkpoint(unsigned int increment) const
Return if the increment should be checkpointted.
Definition checkpoint_parameters.h:32
unsigned int get_num_checkpoints() const
Get the number of checkpoints that will be made.
Definition checkpoint_parameters.h:135
Struct that holds temporal discretization parameters.
Definition temporal_discretization.h:21
unsigned int num_increments
Definition temporal_discretization.h:68
const char * bool_to_string(bool boolean)
Convert bool to string.
Definition utilities.h:399