https://mooseframework.inl.gov
OutputWarehouse.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 // MOOSE includes
11 #include "OutputWarehouse.h"
12 #include "Output.h"
13 #include "Console.h"
14 #include "FileOutput.h"
15 #include "Checkpoint.h"
16 #include "FEProblem.h"
17 #include "TableOutput.h"
18 #include "Exodus.h"
19 
20 #include <libgen.h>
21 #include <sys/types.h>
22 #include <sys/stat.h>
23 #include <unistd.h>
24 
26  : PerfGraphInterface(app, "OutputWarehouse"),
27  _app(app),
28  _buffer_action_console_outputs(false),
29  _common_params_ptr(NULL),
30  _output_exec_flag(EXEC_CUSTOM),
31  _force_output(false),
32  _last_message_ended_in_newline(true),
33  _last_buffer(NULL),
34  _num_printed(0)
35 {
36  // Set the reserved names
37  _reserved.insert("none"); // allows 'none' to be used as a keyword in 'outputs' parameter
38  _reserved.insert("all"); // allows 'all' to be used as a keyword in 'outputs' parameter
39 }
40 
42 {
43  // If the output buffer is not empty, it needs to be written
44  if (_console_buffer.str().length())
45  mooseConsole();
46 }
47 
48 void
50 {
51  TIME_SECTION("initialSetup", 5, "Setting Up Outputs");
52 
53  resetFileBase();
54 
55  for (const auto & obj : _all_objects)
56  obj->initialSetup();
57 }
58 
59 void
61 {
62  for (const auto & obj : _all_objects)
63  obj->timestepSetup();
64 }
65 
66 void
68 {
69  for (const auto & obj : _all_objects)
70  obj->customSetup(exec_type);
71 }
72 
73 void
75 {
76  for (const auto & obj : _all_objects)
77  obj->solveSetup();
78 }
79 
80 void
82 {
83  for (const auto & obj : _all_objects)
84  obj->jacobianSetup();
85 }
86 
87 void
89 {
90  for (const auto & obj : _all_objects)
91  obj->residualSetup();
92 }
93 
94 void
96 {
97  for (const auto & obj : _all_objects)
98  obj->subdomainSetup();
99 }
100 
101 void
102 OutputWarehouse::addOutput(std::shared_ptr<Output> const output)
103 {
104  _all_ptrs.push_back(output);
105 
106  // Add the object to the warehouse storage, Checkpoint placed at end so they are called last
107  Checkpoint * cp = dynamic_cast<Checkpoint *>(output.get());
108  if (cp != NULL)
109  _all_objects.push_back(output.get());
110  else
111  _all_objects.insert(_all_objects.begin(), output.get());
112 
113  // Store the name and pointer
114  _object_map[output->name()] = output.get();
115  _object_names.insert(output->name());
116 
117  // Insert object sync times to the global set
118  const std::set<Real> & sync_times = output->getSyncTimes();
119  _sync_times.insert(sync_times.begin(), sync_times.end());
120 }
121 
122 bool
123 OutputWarehouse::hasOutput(const std::string & name) const
124 {
125  return _object_map.find(name) != _object_map.end();
126 }
127 
128 bool
129 OutputWarehouse::hasMaterialPropertyOutput(const std::string & name) const
130 {
131  const auto found_object = hasOutput(name);
132  if (!found_object)
133  return false;
134  else
135  {
136  // Check if output object supports material property output
137  const auto * output_object = static_cast<const Output *>(_object_map.at(name));
138  return output_object->supportsMaterialPropertyOutput();
139  }
140 }
141 
142 const std::set<OutputName> &
144 {
145  if (_object_names.empty() && _app.actionWarehouse().hasActions("add_output"))
146  {
147  const auto & actions = _app.actionWarehouse().getActionListByName("add_output");
148  for (const auto & act : actions)
149  _object_names.insert(act->name());
150  }
151  return _object_names;
152 }
153 
154 void
155 OutputWarehouse::addOutputFilename(const OutputName & obj_name, const OutFileBase & filename)
156 {
157  _file_base_map[obj_name].insert(filename);
158  for (const auto & it : _file_base_map)
159  if (it.first != obj_name && it.second.find(filename) != it.second.end())
160  mooseError("An output file with the name, ", filename, ", already exists.");
161 }
162 
163 void
165 {
166  if (_force_output)
167  type = EXEC_FORCED;
168 
169  for (const auto & obj : _all_objects)
170  if (obj->enabled())
171  obj->outputStep(type);
172 
184 
185  // Reset force output flag
186  _force_output = false;
187 }
188 
189 void
191 {
192  for (const auto & obj : _all_objects)
193  obj->meshChanged();
194 }
195 
196 static std::mutex moose_console_mutex;
197 
198 void
200 {
202 }
203 
204 void
205 OutputWarehouse::mooseConsole(std::ostringstream & buffer)
206 {
207  std::lock_guard<std::mutex> lock(moose_console_mutex);
208 
209  std::string message = buffer.str();
210 
211  // If someone else is writing - then we may need a newline
212  if (&buffer != _last_buffer && !_last_message_ended_in_newline)
213  message = '\n' + message;
214 
215  // Loop through all Console Output objects and pass the current output buffer
216  std::vector<Console *> objects = getOutputs<Console>();
217  if (!objects.empty())
218  {
219  for (const auto & obj : objects)
220  obj->mooseConsole(message);
221 
222  // Reset
223  buffer.clear();
224  buffer.str("");
225  }
226  else if (_app.actionWarehouse().hasTask("add_output") &&
228  {
229  // this will cause messages to console before its construction immediately flushed and
230  // cleared.
231  bool this_message_ends_in_newline = message.empty() ? true : message.back() == '\n';
232 
233  // If that last message ended in newline then this one may need
234  // to start with indenting
235  // Note that we only indent the first line if the last message ended in new line
236  if (_app.multiAppLevel() > 0)
238 
239  Moose::out << message << std::flush;
240  buffer.clear();
241  buffer.str("");
242 
243  _last_message_ended_in_newline = this_message_ends_in_newline;
244  }
245 
246  _last_buffer = &buffer;
247 
248  _num_printed++;
249 }
250 
251 void
253 {
254  if (!_console_buffer.str().empty())
255  mooseConsole();
256 }
257 
258 void
259 OutputWarehouse::setFileNumbers(std::map<std::string, unsigned int> input, unsigned int offset)
260 {
261  for (const auto & obj : _all_objects)
262  {
263  FileOutput * ptr = dynamic_cast<FileOutput *>(obj);
264  if (ptr != NULL)
265  {
266  std::map<std::string, unsigned int>::const_iterator it = input.find(ptr->name());
267  if (it != input.end())
268  {
269  int value = it->second + offset;
270  if (value < 0)
271  ptr->setFileNumber(0);
272  else
273  ptr->setFileNumber(it->second + offset);
274  }
275  }
276  }
277 }
278 
279 std::map<std::string, unsigned int>
281 {
282 
283  std::map<std::string, unsigned int> output;
284  for (const auto & obj : _all_objects)
285  {
286  FileOutput * ptr = dynamic_cast<FileOutput *>(obj);
287  if (ptr != NULL)
288  output[ptr->name()] = ptr->getFileNumber();
289  }
290  return output;
291 }
292 
293 void
295 {
296  _common_params_ptr = params_ptr;
297 }
298 
299 const InputParameters *
301 {
302  return _common_params_ptr;
303 }
304 
305 std::set<Real> &
307 {
308  return _sync_times;
309 }
310 
311 void
312 OutputWarehouse::addInterfaceHideVariables(const std::string & output_name,
313  const std::set<std::string> & variable_names)
314 {
315  _interface_map[output_name].insert(variable_names.begin(), variable_names.end());
316 }
317 
318 void
319 OutputWarehouse::buildInterfaceHideVariables(const std::string & output_name,
320  std::set<std::string> & hide)
321 {
322  std::map<std::string, std::set<std::string>>::const_iterator it =
323  _interface_map.find(output_name);
324  if (it != _interface_map.end())
325  hide = it->second;
326 }
327 
328 void
329 OutputWarehouse::checkOutputs(const std::set<OutputName> & names,
330  const bool supports_material_output)
331 {
332  std::string reserved_name = "";
333  for (const auto & name : names)
334  {
335  const bool is_reserved_name = isReservedName(name);
336  if (is_reserved_name)
337  reserved_name = name;
338  if (!is_reserved_name)
339  {
340  if (!hasOutput(name))
341  mooseError("The output object '", name, "' is not a defined output object.");
342  if (supports_material_output && !hasMaterialPropertyOutput(name))
343  mooseError("The output object '", name, "' does not support material output.");
344  }
345  }
346  if (!reserved_name.empty() && names.size() > 1)
347  mooseError("When setting output name to reserved name '" + reserved_name +
348  "', only one entry is allowed in outputs parameter.");
349 }
350 
351 std::set<OutputName>
353 {
354  std::set<OutputName> output_names;
355  for (const auto & pair : _object_map)
356  {
357  const auto * output = static_cast<const Output *>(pair.second);
358  if (output->supportsMaterialPropertyOutput())
359  output_names.insert(pair.first);
360  }
361  return output_names;
362 }
363 
364 const std::set<std::string> &
366 {
367  return _reserved;
368 }
369 
370 bool
371 OutputWarehouse::isReservedName(const std::string & name)
372 {
373  return _reserved.find(name) != _reserved.end();
374 }
375 
376 void
378 {
379  _output_exec_flag = type;
380 }
381 
382 void
384 {
385  for (const auto & obj : _all_objects)
386  obj->allowOutput(state);
387 }
388 
389 void
391 {
392  _force_output = true;
393 }
394 
395 void
397 {
398  for (const auto & pair : _object_map)
399  {
400  auto * table = dynamic_cast<TableOutput *>(pair.second);
401  if (table != NULL)
402  table->clear();
403  auto * exodus = dynamic_cast<Exodus *>(pair.second);
404  if (exodus != NULL)
405  exodus->clear();
406  }
407 }
408 
409 void
411 {
412  // Set the file base from the application to FileOutputs and add associated filenames
413  for (const auto & obj : _all_objects)
414  if (FileOutput * file_output = dynamic_cast<FileOutput *>(obj))
415  {
416  std::string file_base;
417  if (obj->parameters().get<bool>("_built_by_moose"))
418  {
419  if (obj->isParamValid("file_base"))
420  file_base = obj->getParam<std::string>("file_base");
421  else
422  file_base = _app.getOutputFileBase();
423  }
424  else
425  file_base = _app.getOutputFileBase(true) + "_" + obj->name();
426 
427  file_output->setFileBase(file_base);
428  addOutputFilename(obj->name(), file_output->filename());
429  }
430 }
std::string name(const ElemQuality q)
std::map< OutputName, std::set< OutFileBase > > _file_base_map
List of object names.
void outputStep(ExecFlagType type)
Calls the outputStep method for each output object.
const InputParameters * _common_params_ptr
Pointer to the common InputParameters (.
bool _buffer_action_console_outputs
True to buffer console outputs in actions.
void initialSetup()
Calls the initialSetup function for each of the output objects.
const ExecFlagType EXEC_CUSTOM
Definition: Moose.C:49
const ExecFlagType EXEC_FORCED
Definition: Moose.C:47
std::map< OutputName, Output * > _object_map
A map of the output pointers.
void checkOutputs(const std::set< OutputName > &names, const bool supports_material_output=false)
Test that the output names exist.
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:333
bool isTaskComplete(const std::string &task) const
std::string getOutputFileBase(bool for_non_moose_build_output=false) const
Get the output file base name.
Definition: MooseApp.C:1669
bool hasTask(const std::string &task) const
std::set< OutputName > _object_names
A set of output names.
unsigned int multiAppLevel() const
The MultiApp Level.
Definition: MooseApp.h:802
bool isReservedName(const std::string &name)
Test if the given name is reserved.
bool hasOutput(const std::string &name) const
Returns true if the output object exists.
Base class for MOOSE-based applications.
Definition: MooseApp.h:96
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
unsigned int getFileNumber()
Return the current file number for this outputter.
Definition: FileOutput.C:180
void customSetup(const ExecFlagType &exec_type)
Calls the setup function for each of the output objects.
void clear()
Reset Exodus output.
Definition: Exodus.C:534
const std::list< Action * > & getActionListByName(const std::string &task) const
Retrieve a constant list of Action pointers associated with the passed in task.
void setOutputExecutionType(ExecFlagType type)
Sets the execution flag type.
std::vector< Output * > _all_objects
All instances of objects (raw pointers)
bool hasMaterialPropertyOutput(const std::string &name) const
Returns true if the output object exists, and it supports material property output.
void forceOutput()
Indicates that the next call to outputStep should be forced This is private, users should utilize FEP...
std::set< std::string > _reserved
List of reserved names.
void jacobianSetup()
Calls the jacobianSetup function for each of the output objects.
void setFileNumber(unsigned int num)
Sets the file number manually.
Definition: FileOutput.C:174
std::map< std::string, std::set< std::string > > _interface_map
Storage for variables to hide as prescribed by the object via the OutputInterface.
Based class for output objects.
Definition: Output.h:43
std::set< OutputName > getAllMaterialPropertyOutputNames() const
Returns all output names that support material output.
const std::ostringstream * _last_buffer
What the last buffer was that was printed.
ExecFlagType _output_exec_flag
The current output execution flag.
const std::string & name() const
Get the name of the class.
Definition: MooseBase.h:99
MooseApp & _app
MooseApp.
void resetFileBase()
Resets the file base for all FileOutput objects.
OutputWarehouse(MooseApp &app)
Class constructor.
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
void indentMessage(const std::string &prefix, std::string &message, const char *color=COLOR_CYAN, bool dont_indent_first_line=true, const std::string &post_prefix=": ")
Indents the supplied message given the prefix and color.
Definition: MooseUtils.C:734
static std::mutex moose_console_mutex
std::map< std::string, unsigned int > getFileNumbers()
Extracts the file numbers from the output objects.
Writes out three things:
Definition: Checkpoint.h:63
void meshChanged()
Calls the meshChanged method for every output object.
bool _force_output
Flag indicating that next call to outputStep is forced.
virtual ~OutputWarehouse()
Class for output data to the ExodusII format.
Definition: Exodus.h:24
void clear()
Definition: TableOutput.C:296
ActionWarehouse & actionWarehouse()
Return a writable reference to the ActionWarehouse associated with this app.
Definition: MooseApp.h:204
std::atomic< unsigned long long int > _num_printed
Number of times the stream has been printed to.
virtual bool supportsMaterialPropertyOutput() const
A virtual function that stores whether output type supports material output.
Definition: Output.h:150
Interface for objects interacting with the PerfGraph.
std::ostringstream _console_buffer
The stream for holding messages passed to _console prior to Output object construction.
void addOutputFilename(const OutputName &obj_name, const OutFileBase &filename)
Adds the file name to the map of filenames being output with an associated object The main function o...
std::vector< std::shared_ptr< Output > > _all_ptrs
We are using std::shared_ptr to handle the cleanup of the pointers at the end of execution.
void residualSetup()
Calls the residualSetup function for each of the output objects.
void solveSetup()
Calls the timestepSetup function for each of the output objects.
const std::set< OutputName > & getOutputNames()
Get a complete set of all output object names.
bool hasActions(const std::string &task) const
Check if Actions associated with passed in task exist.
const InputParameters * getCommonParameters() const
Get a reference to the common output parameters.
Class for containing MooseEnum item information.
Definition: MooseEnumItem.h:18
void subdomainSetup()
Calls the subdomainSetup function for each of the output objects.
void allowOutput(bool state)
Ability to enable/disable output calls This is private, users should utilize FEProblemBase::allowOutp...
void addOutput(std::shared_ptr< Output > output)
Adds an existing output object to the warehouse.
Base class for scalar variables and postprocessors output objects.
Definition: TableOutput.h:28
void mooseConsole()
Send current output buffer to Console output objects.
void reset()
Reset the output system.
void setCommonParameters(const InputParameters *params_ptr)
Stores the common InputParameters object.
void addInterfaceHideVariables(const std::string &output_name, const std::set< std::string > &variable_names)
Insert variable names for hiding via the OutoutInterface.
void buildInterfaceHideVariables(const std::string &output_name, std::set< std::string > &hide)
Return the list of hidden variables for the given output name.
An outputter with filename support.
Definition: FileOutput.h:20
const std::set< std::string > & getReservedNames() const
Return a set of reserved output names.
void setFileNumbers(std::map< std::string, unsigned int > input, unsigned int offset=0)
Calls the setFileNumber method for every FileOutput output object.
std::set< Real > & getSyncTimes()
Return the sync times for all objects.
void timestepSetup()
Calls the timestepSetup function for each of the output objects.
bool _last_message_ended_in_newline
Whether or not the last thing output by mooseConsole had a newline as the last character.
void flushConsoleBuffer()
If content exists in the buffer, write it.
std::set< Real > _sync_times
Sync times for all objects.