https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Checkpoint.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10// C POSIX includes
11#include <sstream>
12#include <sys/stat.h>
13
14#include <system_error>
15
16// Moose includes
17#include "Checkpoint.h"
18#include "FEProblem.h"
19#include "MooseApp.h"
21#include "MooseMesh.h"
24
25#include "libmesh/checkpoint_io.h"
26#include "libmesh/enum_xdr_mode.h"
27#include "libmesh/utility.h"
28
29using namespace libMesh;
30
32
35{
36 // Get the parameters from the base classes
38
39 params.addClassDescription("Output for MOOSE recovery checkpoint files.");
40
41 // Typical checkpoint options
42 params.addParam<unsigned int>("num_files", 2, "Number of the restart files to save");
43 params.addParam<std::string>(
44 "suffix",
45 "cp",
46 "This will be appended to the file_base to create the directory name for checkpoint files.");
47 // For checkpoints, set the wall time output interval to defualt of 1 hour (3600 s)
48 params.addParam<Real>(
49 "wall_time_interval", 3600, "The target wall time interval (in seconds) at which to output");
50
51 // Since it makes the most sense to write checkpoints at the end of time steps,
52 // change the default value of execute_on to TIMESTEP_END
53 ExecFlagEnum & exec_enum = params.set<ExecFlagEnum>("execute_on", true);
54 exec_enum = {EXEC_TIMESTEP_END};
55
56 return params;
57}
58
60 : FileOutput(parameters),
61 _num_files(getParam<unsigned int>("num_files")),
62 _suffix(getParam<std::string>("suffix"))
63{
64 // Prevent the checkpoint from executing at any time other than INITIAL,
65 // TIMESTEP_END, and FINAL
67
68 // The following updates the value of _wall_time_interval if the
69 // '--output-wall-time-interval' command line parameter is used.
70 // If it is not used, _wall_time_interval keeps its current value.
71 // 'The --output-wall-time-interval parameter is necessary for testing
72 // and should only be used in the test suite.
74}
75
76std::string
78{
79 // Get the time step with correct zero padding
80 std::ostringstream output;
81 output << directory() << "/" << std::setw(_padding) << std::setprecision(0) << std::setfill('0')
82 << std::right << timeStep();
83
84 return output.str();
85}
86
87std::string
89{
90 return _file_base + "_" + _suffix;
91}
92
93bool
95{
96 // should_output_parent ensures that we output only when _execute_on contains
97 // _current_execute_flag (see Output::shouldOutput), ensuring that we wait
98 // until the end of the timestep to write, preventing the output of an
99 // unconverged solution.
100 const bool should_output_parent = FileOutput::shouldOutput();
101 if (!should_output_parent)
102 return false; // No point in continuing
103
104 // Check for signal
105 // Reading checkpoint on time step 0 is not supported
106 const bool should_output_signal = (Moose::interrupt_signal_number != 0) && (timeStep() > 0);
107 if (should_output_signal)
108 {
109 _console << "Unix signal SIGUSR1 detected. Outputting checkpoint file.\n";
110 // Reset signal number since we output
112 return true;
113 }
114
115 // Check if enough wall time has elapsed to output
116 const bool should_output_wall_time = _wall_time_since_last_output >= _wall_time_interval;
117 if (should_output_wall_time)
118 return true;
119
120 // Check if the checkpoint should "normally" output, i.e. if it was created
121 // through the input file
122 const bool should_output = (onInterval() || _current_execute_flag == EXEC_FINAL);
123
124 return should_output;
125}
126
127void
129{
130 // Create the output directory
131 const auto cp_dir = directory();
132 Utility::mkdir(cp_dir.c_str());
133
134 // Create the output filename
135 const auto current_file = filename();
136
137 // Create checkpoint file structure
138 CheckpointFileNames curr_file_struct;
139
140 curr_file_struct.checkpoint = current_file + _app.checkpointSuffix();
141
142 const auto mesh_paths = _problem_ptr->mesh().writeRecoveryFiles(curr_file_struct.checkpoint);
143 curr_file_struct.restart.insert(
144 curr_file_struct.restart.end(), mesh_paths.begin(), mesh_paths.end());
145
146 // Write out meta data if there is any (only on processor zero)
147 if (processor_id() == 0)
148 {
149 const auto paths = _app.writeRestartableMetaData(curr_file_struct.checkpoint);
150 curr_file_struct.restart.insert(curr_file_struct.restart.begin(), paths.begin(), paths.end());
151 }
152
153 // Write out the backup
154 const auto paths = _app.backup(_app.restartFolderBase(current_file));
155 curr_file_struct.restart.insert(curr_file_struct.restart.begin(), paths.begin(), paths.end());
156
157 // Remove old checkpoint files
158 updateCheckpointFiles(curr_file_struct);
159}
160
161void
163{
164 // It is possible to have already written a checkpoint with the same file
165 // names contained in file_struct. If this is the case, file_struct will
166 // already be stored in _file_names. When this happens, the current state of
167 // the simulation is likely different than the state when the duplicately
168 // named checkpoint was last written. Because of this, we want to go ahead and
169 // rewrite the duplicately named checkpoint, overwritting the files
170 // representing the old state. For accurate bookkeeping, we will delete the
171 // existing instance of file_struct from _file_names and re-append it to the
172 // end of _file_names (to keep the order in which checkpoints are written
173 // accurate).
174
175 const auto it = std::find(_file_names.begin(), _file_names.end(), file_struct);
176 // file_struct was found in _file_names.
177 // Delete it so it can be re-added as the last element.
178 if (it != _file_names.end())
179 _file_names.erase(it);
180
181 _file_names.push_back(file_struct);
182
183 // Remove the file and the corresponding directory if it's empty
184 const auto remove_file = [this](const std::filesystem::path & path)
185 {
186 std::error_code err;
187
188 if (!std::filesystem::remove(path, err))
189 mooseWarning("Error during the deletion of checkpoint file\n",
190 std::filesystem::absolute(path),
191 "\n\n",
192 err.message());
193
194 const auto dir = path.parent_path();
195 if (std::filesystem::is_empty(dir))
196 if (!std::filesystem::remove(dir, err))
197 mooseError("Error during the deletion of checkpoint directory\n",
198 std::filesystem::absolute(dir),
199 "\n\n",
200 err.message());
201 };
202
203 // Remove un-wanted files
204 if (_file_names.size() > _num_files)
205 {
206 // Extract the filenames to be removed
207 CheckpointFileNames delete_files = _file_names.front();
208
209 // Remove these filenames from the list
210 _file_names.pop_front();
211
212 // Delete restartable data
213 for (const auto & path : delete_files.restart)
214 remove_file(path);
215
216 // Delete checkpoint files
217 // This file may not exist so don't worry about checking for success
218 if (processor_id() == 0)
221 }
222}
223
224void
226{
227 const auto & execute_on = getParam<ExecFlagEnum>("execute_on");
228 const std::set<ExecFlagType> allowed = {EXEC_INITIAL, EXEC_TIMESTEP_END, EXEC_FINAL};
229 for (const auto & value : execute_on)
230 if (!allowed.count(value))
231 paramError("execute_on",
232 "The exec flag ",
233 value,
234 " is not allowed. Allowed flags are INITIAL, TIMESTEP_END, and FINAL.");
235}
236
237std::stringstream
239{
240 static const unsigned int console_field_width = 27;
241 std::stringstream checkpoint_info;
242
243 std::stringstream interval_info_ss;
244 interval_info_ss << "Every " << std::defaultfloat << _wall_time_interval << " s";
245 const std::string interval_info = interval_info_ss.str();
246
247 checkpoint_info << std::left << std::setw(console_field_width)
248 << " Wall Time Interval:" << interval_info << "\n";
249
250 const std::string user_info = "Outputs/" + name();
251
252 checkpoint_info << std::left << std::setw(console_field_width) << " Checkpoint:" << user_info
253 << "\n";
254
255 checkpoint_info << std::left << std::setw(console_field_width)
256 << " # Checkpoints Kept:" << std::to_string(_num_files) << "\n";
257 std::string exec_on_values = "";
258 for (const auto & item : _execute_on)
259 exec_on_values += item.name() + " ";
260 checkpoint_info << std::left << std::setw(console_field_width)
261 << " Execute On:" << exec_on_values << "\n";
262
263 return checkpoint_info;
264}
registerMooseObject("MooseApp", Checkpoint)
void mooseWarning(Args &&... args)
Emit a warning message with the given stringified, concatenated args.
Definition MooseError.h:345
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
const ExecFlagType EXEC_TIMESTEP_END
Definition Moose.C:36
const ExecFlagType EXEC_INITIAL
Definition Moose.C:30
const ExecFlagType EXEC_FINAL
Definition Moose.C:48
void ErrorVector unsigned int
Writes out three things:
Definition Checkpoint.h:49
void updateCheckpointFiles(CheckpointFileNames file_struct)
Definition Checkpoint.C:162
std::stringstream checkpointInfo() const
Gathers and records information used later for console output.
Definition Checkpoint.C:238
void validateExecuteOn() const
Determines if the requested values of execute_on are valid for checkpoints.
Definition Checkpoint.C:225
std::string directory() const
Retrieve the checkpoint output directory.
Definition Checkpoint.C:88
virtual std::string filename() override
Returns the base filename for the checkpoint files.
Definition Checkpoint.C:77
virtual void output() override
Outputs a checkpoint file.
Definition Checkpoint.C:128
virtual bool shouldOutput() override
Determines if the checkpoint should write out to a file.
Definition Checkpoint.C:94
static InputParameters validParams()
Definition Checkpoint.C:34
Checkpoint(const InputParameters &parameters)
Class constructor.
Definition Checkpoint.C:59
std::deque< CheckpointFileNames > _file_names
Vector of checkpoint filename structures.
Definition Checkpoint.h:108
const std::string _suffix
Directory suffix.
Definition Checkpoint.h:105
unsigned int _num_files
Max no. of output files to store.
Definition Checkpoint.h:102
const ConsoleStream _console
An instance of helper class to write streams to the Console objects.
A MultiMooseEnum object to hold "execute_on" flags.
virtual MooseMesh & mesh() override
An outputter with filename support.
Definition FileOutput.h:21
unsigned int _padding
Number of digits to pad the extensions.
Definition FileOutput.h:83
static InputParameters validParams()
Definition FileOutput.C:24
virtual bool shouldOutput() override
Checks if the output method should be executed.
Definition FileOutput.C:80
std::string _file_base
The base filename from the input paramaters.
Definition FileOutput.h:89
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
void addParam(const std::string &name, const S &value, const std::string &doc_string)
These methods add an optional parameter and a documentation string to the InputParameters object.
void addClassDescription(const std::string &doc_string)
This method adds a description of the class that will be displayed in the input file syntax dump.
T & set(const std::string &name, bool quiet_mode=false)
Returns a writable reference to the named parameters.
std::vector< std::filesystem::path > backup(const std::filesystem::path &folder_base)
Backs up the application to the folder folder_base.
Definition MooseApp.C:1716
static const std::string & checkpointSuffix()
The file suffix for the checkpoint mesh.
Definition MooseApp.C:3039
std::vector< std::filesystem::path > writeRestartableMetaData(const RestartableDataMapName &name, const std::filesystem::path &folder_base)
Writes the restartable meta data for name with a folder base of folder_base.
Definition MooseApp.C:2552
std::filesystem::path restartFolderBase(const std::filesystem::path &folder_base) const
The file suffix for restartable data.
Definition MooseApp.C:3054
const std::string & name() const
Get the name of the class.
Definition MooseBase.h:103
void paramError(const std::string &param, Args... args) const
Emits an error prefixed with the file and line number of the given param (from the input file) along ...
Definition MooseBase.h:457
virtual std::vector< std::filesystem::path > writeRecoveryFiles(const std::filesystem::path &file_base)
Write the mesh files needed for recovery/checkpointing.
Definition MooseMesh.C:2978
virtual bool isDistributedMesh() const
Returns the final Mesh distribution type.
Definition MooseMesh.h:1143
MooseApp & _app
The MOOSE application this is associated with.
Definition MooseBase.h:375
Real _wall_time_since_last_output
time in seconds since last output
Definition Output.h:286
Real _wall_time_interval
Target wall time between outputs in seconds.
Definition Output.h:241
ExecFlagEnum _execute_on
The common Execution types; this is used as the default execution type for everything except system i...
Definition Output.h:203
FEProblemBase * _problem_ptr
Pointer the the FEProblemBase object for output object (use this)
Definition Output.h:185
void setWallTimeIntervalFromCommandLineParam()
Function to set the wall time interval based on value of command line parameter (used for testing onl...
Definition Output.C:336
virtual int timeStep()
Get the current time step.
Definition Output.C:387
ExecFlagType _current_execute_flag
Current execute on flag.
Definition Output.h:211
virtual bool onInterval()
Returns true if the output interval is satisfied.
Definition Output.C:280
processor_id_type size() const
static void cleanup(const std::string &input_name, processor_id_type n_procs)
processor_id_type processor_id() const
const Parallel::Communicator & comm() const
volatile std::sig_atomic_t interrupt_signal_number
Used by the signal handler to determine if we should write a checkpoint file out at any point during ...
Definition Moose.C:898
int mkdir(const char *pathname)
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
OStreamProxy err(std::cerr)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
A structure for storing the various output files associated with checkpoint output.
Definition Checkpoint.h:25
std::string checkpoint
Filename for CheckpointIO file (the mesh)
Definition Checkpoint.h:27
std::vector< std::filesystem::path > restart
Filenames for restartable data.
Definition Checkpoint.h:30