https://mooseframework.inl.gov
AdvancedOutput.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 // Standard includes
11 #include <math.h>
12 
13 // MOOSE includes
14 #include "AdvancedOutput.h"
15 #include "DisplacedProblem.h"
16 #include "FEProblem.h"
17 #include "FileMesh.h"
18 #include "FileOutput.h"
19 #include "InfixIterator.h"
20 #include "MooseApp.h"
21 #include "MooseUtils.h"
22 #include "MooseVariableFE.h"
23 #include "Postprocessor.h"
24 #include "Restartable.h"
25 #include "VectorPostprocessor.h"
26 
27 #include "libmesh/fe_interface.h"
28 
29 using namespace libMesh;
30 
31 // A function, only available in this file, for adding the AdvancedOutput parameters. This is
32 // used to eliminate code duplication between the difference specializations of the validParams
33 // function.
34 namespace
35 {
36 void
37 addAdvancedOutputParams(InputParameters & params)
38 {
39  // Hide/show variable output options
40  params.addParam<std::vector<VariableName>>(
41  "hide",
42  {},
43  "A list of the variables and postprocessors that should NOT be output to the Exodus "
44  "file (may include Variables, ScalarVariables, and Postprocessor names).");
45 
46  params.addParam<std::vector<VariableName>>(
47  "show",
48  {},
49  "A list of the variables and postprocessors that should be output to the Exodus file "
50  "(may include Variables, ScalarVariables, and Postprocessor names).");
51 
52  // Enable output of PP/VPP to JSON
53  params.addParam<bool>(
54  "postprocessors_as_reporters", false, "Output Postprocessors values as Reporter values.");
55  params.addParam<bool>("vectorpostprocessors_as_reporters",
56  false,
57  "Output VectorsPostprocessors vectors as Reporter values.");
58 
59  // Group for selecting the output
60  params.addParamNamesToGroup("hide show", "Selection/restriction of output");
61 
62  // Group for converting outputs
63  params.addParamNamesToGroup("postprocessors_as_reporters vectorpostprocessors_as_reporters",
64  "Conversions before output");
65 
66  // **** DEPRECATED PARAMS ****
67  params.addDeprecatedParam<bool>("output_postprocessors",
68  true,
69  "Enable/disable the output of postprocessors",
70  "'execute_postprocessors_on' has replaced this parameter");
71  params.addDeprecatedParam<bool>("execute_vector_postprocessors",
72  true,
73  "Enable/disable the output of vector postprocessors",
74  "'execute_vector_postprocessors_on' has replaced this parameter");
75  params.addDeprecatedParam<bool>("execute_system_information",
76  true,
77  "Enable/disable the output of the simulation information",
78  "'execute_system_information_on' has replaced this parameter");
79  params.addDeprecatedParam<bool>("execute_elemental_variables",
80  true,
81  "Enable/disable the output of elemental variables",
82  "'execute_elemental_on' has replaced this parameter");
83  params.addDeprecatedParam<bool>("execute_nodal_variables",
84  true,
85  "Enable/disable the output of nodal variables",
86  "'execute_nodal_on' has replaced this parameter");
87  params.addDeprecatedParam<bool>("execute_scalar_variables",
88  true,
89  "Enable/disable the output of aux scalar variables",
90  "'execute_scalars_on' has replaced this parameter");
91  params.addDeprecatedParam<bool>("execute_input",
92  true,
93  "Enable/disable the output of input file information",
94  "'execute_input_on' has replaced this parameter");
95 }
96 }
97 
100 {
101  // Get the parameters from the parent object
103  addAdvancedOutputParams(params);
104  return params;
105 }
106 
107 // Defines the output types to enable for the AdvancedOutput object
110 {
111  return MultiMooseEnum("nodal=0 elemental=1 scalar=2 postprocessor=3 vector_postprocessor=4 "
112  "input=5 system_information=6 reporter=7");
113 }
114 
115 // Enables the output types (see getOutputTypes) for an AdvancedOutput object
117 AdvancedOutput::enableOutputTypes(const std::string & names)
118 {
119  // The parameters object that will be returned
121 
122  // Get the MultiEnum of output types
123  MultiMooseEnum output_types = getOutputTypes();
124 
125  // Update the enum of output types to append
126  if (names.empty())
127  output_types = output_types.getRawNames();
128  else
129  output_types = names;
130 
131  // Add the parameters and return them
132  addValidParams(params, output_types);
133  return params;
134 }
135 
136 // Constructor
138  : FileOutput(parameters),
139  _elemental_as_nodal(isParamValid("elemental_as_nodal") ? getParam<bool>("elemental_as_nodal")
140  : false),
141  _scalar_as_nodal(isParamValid("scalar_as_nodal") ? getParam<bool>("scalar_as_nodal") : false),
142  _reporter_data(_problem_ptr->getReporterData()),
143  _last_execute_time(declareRecoverableData<std::map<std::string, Real>>("last_execute_time")),
144  _postprocessors_as_reporters(getParam<bool>("postprocessors_as_reporters")),
145  _vectorpostprocessors_as_reporters(getParam<bool>("vectorpostprocessors_as_reporters"))
146 {
147  _is_advanced = true;
149 }
150 
151 void
153 {
154  init();
155 }
156 
157 void
159 {
160  // Initialize the execution flags
161  for (auto & [name, input] : _advanced_execute_on)
162  initExecutionTypes(name, input);
163 
164  // Clear existing execute information lists
166 
167  // Initialize the available output
169 
170  // Separate the hide/show list into components
171  initShowHideLists(getParam<std::vector<VariableName>>("show"),
172  getParam<std::vector<VariableName>>("hide"));
173 
174  // If 'elemental_as_nodal = true' the elemental variable names must be appended to the
175  // nodal variable names. Thus, when libMesh::EquationSystem::build_solution_vector is called
176  // it will create the correct nodal variable from the elemental
178  {
179  OutputData & nodal = _execute_data["nodal"];
180  OutputData & elemental = _execute_data["elemental"];
181  nodal.show.insert(elemental.show.begin(), elemental.show.end());
182  nodal.hide.insert(elemental.hide.begin(), elemental.hide.end());
183  nodal.available.insert(elemental.available.begin(), elemental.available.end());
184  }
185 
186  // Similarly as above, if 'scalar_as_nodal = true' append the elemental variable lists
187  if (_scalar_as_nodal)
188  {
189  OutputData & nodal = _execute_data["nodal"];
190  OutputData & scalar = _execute_data["scalars"];
191  nodal.show.insert(scalar.show.begin(), scalar.show.end());
192  nodal.hide.insert(scalar.hide.begin(), scalar.hide.end());
193  nodal.available.insert(scalar.available.begin(), scalar.available.end());
194  }
195 
196  // Initialize the show/hide/output lists for each of the types of output
197  for (auto & it : _execute_data)
198  initOutputList(it.second);
199 }
200 
202 
203 void
205 {
206  mooseError("Individual output of nodal variables is not support for the output object named '",
207  name(),
208  "'");
209 }
210 
211 void
213 {
214  mooseError(
215  "Individual output of elemental variables is not support for this output object named '",
216  name(),
217  "'");
218 }
219 
220 void
222 {
223  mooseError("Individual output of postprocessors is not support for this output object named '",
224  name(),
225  "'");
226 }
227 
228 void
230 {
231  mooseError(
232  "Individual output of VectorPostprocessors is not support for this output object named '",
233  name(),
234  "'");
235 }
236 
237 void
239 {
240  mooseError(
241  "Individual output of scalars is not support for this output object named '", name(), "'");
242 }
243 
244 void
246 {
247  mooseError(
248  "Output of system information is not support for this output object named '", name(), "'");
249 }
250 
251 void
253 {
254  mooseError("Output of the input file information is not support for this output object named '",
255  name(),
256  "'");
257 }
258 
259 void
261 {
262  mooseError(
263  "Output of the Reporter value(s) is not support for this output object named '", name(), "'");
264 }
265 
266 bool
268 {
269  if (!checkFilename())
270  return false;
271 
273  return true;
274  else
275  return Output::shouldOutput();
276 }
277 
278 void
280 {
281  const auto & type = _current_execute_flag;
282 
283  // (re)initialize the list of available items for output
284  init();
285 
286  // Call the various output types, if data exists
287  if (wantOutput("nodal", type))
288  {
290  _last_execute_time["nodal"] = _time;
291  }
292 
293  if (wantOutput("elemental", type))
294  {
296  _last_execute_time["elemental"] = _time;
297  }
298 
299  if (wantOutput("postprocessors", type))
300  {
302  _last_execute_time["postprocessors"] = _time;
303  }
304 
305  if (wantOutput("vector_postprocessors", type))
306  {
308  _last_execute_time["vector_postprocessors"] = _time;
309  }
310 
311  if (wantOutput("scalars", type))
312  {
314  _last_execute_time["scalars"] = _time;
315  }
316 
317  if (wantOutput("system_information", type))
318  {
320  _last_execute_time["system_information"] = _time;
321  }
322 
323  if (wantOutput("input", type))
324  {
325  outputInput();
326  _last_execute_time["input"] = _time;
327  }
328 
329  if (wantOutput("reporters", type))
330  {
331  outputReporters();
332  _last_execute_time["reporters"] = _time;
333  }
334 }
335 
336 bool
337 AdvancedOutput::wantOutput(const std::string & name, const ExecFlagType & type)
338 {
339  // Ignore EXEC_FORCED for system information and input, there is no reason to force this
340  if (type == EXEC_FORCED && (name == "system_information" || name == "input"))
341  return false;
342 
343  // Do not output if the 'none' is contained by the execute_on
344  if (_advanced_execute_on.contains(name) && _advanced_execute_on[name].isValueSet("none"))
345  return false;
346 
347  // Data output flag, true if data exists to be output
348  bool execute_data_flag = true;
349 
350  // Set flag to false, if the OutputData exists and the output variable list is empty
351  std::map<std::string, OutputData>::const_iterator iter = _execute_data.find(name);
352  if (iter != _execute_data.end() && iter->second.output.empty())
353  execute_data_flag = false;
354 
355  // Set flag to false, if the OutputOnWarehouse DOES NOT contain an entry
357  execute_data_flag = false;
358 
359  // Force the output, if there is something to output and the time has not been output
360  if (type == EXEC_FORCED && execute_data_flag && _last_execute_time[name] != _time)
361  return true;
362 
363  // Return true (output should occur) if three criteria are satisfied, else do not output:
364  // (1) The execute_data_flag = true (i.e, there is data to output)
365  // (2) The current output type is contained in the list of output execution types
366  // (3) The current execution time is "final" or "forced" and the data has not already been
367  // output
368  if (execute_data_flag && _advanced_execute_on[name].isValueSet(type) &&
370  return true;
371  else
372  return false;
373 }
374 
375 bool
377 {
378  // If any of the component outputs are true, then there is some output to perform
379  for (const auto & it : _advanced_execute_on)
380  if (wantOutput(it.first, type))
381  return true;
382 
383  // There is nothing to output
384  return false;
385 }
386 
387 bool
389 {
390  // Test that variables exist for output AND that output execution flags are valid
391  for (const auto & it : _execute_data)
392  if (!(it.second).output.empty() && _advanced_execute_on.contains(it.first) &&
393  _advanced_execute_on[it.first].isValid())
394  return true;
395 
396  // Test execution flags for non-variable output
397  if (_advanced_execute_on.contains("system_information") &&
398  _advanced_execute_on["system_information"].isValid())
399  return true;
400  if (_advanced_execute_on.contains("input") && _advanced_execute_on["input"].isValid())
401  return true;
402 
403  return false;
404 }
405 
406 void
408 {
409  // Initialize Postprocessor list
410  // This flag is set to true if any postprocessor has the 'outputs' parameter set, it is then used
411  // to produce an warning if postprocessor output is disabled
413  initPostprocessorOrVectorPostprocessorLists<Postprocessor>("postprocessors");
414 
415  // Initialize vector postprocessor list
416  // This flag is set to true if any vector postprocessor has the 'outputs' parameter set, it is
417  // then used
418  // to produce an warning if vector postprocessor output is disabled
420  initPostprocessorOrVectorPostprocessorLists<VectorPostprocessor>("vector_postprocessors");
421 
422  // Get a list of the available variables
423  std::vector<VariableName> variables = _problem_ptr->getVariableNames();
424 
425  // Loop through the variables and store the names in the correct available lists
426  for (const auto & var_name : variables)
427  {
428  if (_problem_ptr->hasVariable(var_name))
429  {
432 
433  // Skip if the 'outputs' parameter has been set to exclude this output
434  if (var.isParamValid("outputs"))
435  {
436  const auto & outputs = var.getParam<std::vector<OutputName>>("outputs");
437  if (outputs.size() && std::find(outputs.begin(), outputs.end(), name()) == outputs.end() &&
438  outputs[0] != "all")
439  continue;
440  }
441 
442  const FEType type = var.feType();
443  for (unsigned int i = 0; i < var.count(); ++i)
444  {
445  VariableName vname = var_name;
446  if (var.isArray())
447  vname = var.arrayVariableComponent(i);
448 
449  // A note that if we have p-refinement we assume "worst-case" scenario that our constant
450  // monomial/monomial-vec families have been refined and we can no longer write them as
451  // elemental
452  if (type.order == CONSTANT && !_problem_ptr->havePRefinement() &&
453  type.family != MONOMIAL_VEC)
454  _execute_data["elemental"].available.insert(vname);
455  else if (FEInterface::field_type(type) == TYPE_VECTOR)
456  {
457  const auto geom_type = ((type.family == MONOMIAL_VEC) && (type.order == CONSTANT) &&
459  ? "elemental"
460  : "nodal";
461  switch (_es_ptr->get_mesh().spatial_dimension())
462  {
463  case 0:
464  case 1:
465  _execute_data[geom_type].available.insert(vname);
466  break;
467  case 2:
468  _execute_data[geom_type].available.insert(vname + "_x");
469  _execute_data[geom_type].available.insert(vname + "_y");
470  break;
471  case 3:
472  _execute_data[geom_type].available.insert(vname + "_x");
473  _execute_data[geom_type].available.insert(vname + "_y");
474  _execute_data[geom_type].available.insert(vname + "_z");
475  break;
476  }
477  }
478  else
479  _execute_data["nodal"].available.insert(vname);
480  }
481  }
482 
483  else if (_problem_ptr->hasScalarVariable(var_name))
484  _execute_data["scalars"].available.insert(var_name);
485  }
486 
487  // Initialize Reporter name list
488  for (auto && r_name : _reporter_data.getReporterNames())
489  if ((_postprocessors_as_reporters || !r_name.isPostprocessor()) &&
490  (_vectorpostprocessors_as_reporters || !r_name.isVectorPostprocessor()))
491  _execute_data["reporters"].available.insert(r_name);
492 }
493 
494 void
495 AdvancedOutput::initExecutionTypes(const std::string & name, ExecFlagEnum & input)
496 {
497  // Build the input parameter name
498  std::string param_name = "execute_";
499  param_name += name + "_on";
500 
501  // The parameters exists and has been set by the user
502  if (_pars.have_parameter<ExecFlagEnum>(param_name) && isParamValid(param_name))
503  input = getParam<ExecFlagEnum>(param_name);
504 
505  // If the parameter does not exists; set it to a state where no valid entries exists so nothing
506  // gets executed
507  else if (!_pars.have_parameter<ExecFlagEnum>(param_name))
508  {
509  input = _execute_on;
510  input.clearSetValues();
511  }
512 }
513 
514 void
515 AdvancedOutput::initShowHideLists(const std::vector<VariableName> & show,
516  const std::vector<VariableName> & hide)
517 {
518 
519  // Storage for user-supplied input that is unknown as a variable or postprocessor
520  std::set<std::string> unknown;
521 
522  // If a show hide/list exists, let the data warehouse know about it. This allows for the proper
523  // handling of output lists (see initOutputList)
524  if (show.size() > 0)
526 
527  // Populate the show lists
528  for (const auto & var_name : show)
529  {
530  if (_problem_ptr->hasVariable(var_name))
531  {
534  const FEType type = var.feType();
535  for (unsigned int i = 0; i < var.count(); ++i)
536  {
537  VariableName vname = var_name;
538  if (var.isArray())
539  vname = var.arrayVariableComponent(i);
540 
541  if (type.order == CONSTANT)
542  _execute_data["elemental"].show.insert(vname);
543  else if (FEInterface::field_type(type) == TYPE_VECTOR)
544  {
545  const auto geom_type =
546  ((type.family == MONOMIAL_VEC) && (type.order == CONSTANT)) ? "elemental" : "nodal";
547  switch (_es_ptr->get_mesh().spatial_dimension())
548  {
549  case 0:
550  case 1:
551  _execute_data[geom_type].show.insert(vname);
552  break;
553  case 2:
554  _execute_data[geom_type].show.insert(vname + "_x");
555  _execute_data[geom_type].show.insert(vname + "_y");
556  break;
557  case 3:
558  _execute_data[geom_type].show.insert(vname + "_x");
559  _execute_data[geom_type].show.insert(vname + "_y");
560  _execute_data[geom_type].show.insert(vname + "_z");
561  break;
562  }
563  }
564  else
565  _execute_data["nodal"].show.insert(vname);
566  }
567  }
568  else if (_problem_ptr->hasScalarVariable(var_name))
569  _execute_data["scalars"].show.insert(var_name);
570  else if (hasPostprocessorByName(var_name))
571  _execute_data["postprocessors"].show.insert(var_name);
572  else if (hasVectorPostprocessorByName(var_name))
573  _execute_data["vector_postprocessors"].show.insert(var_name);
574  else if ((var_name.find("/") != std::string::npos) &&
576  _execute_data["reporters"].show.insert(var_name);
577  else
578  unknown.insert(var_name);
579  }
580 
581  // Populate the hide lists
582  for (const auto & var_name : hide)
583  {
584  if (_problem_ptr->hasVariable(var_name))
585  {
588  const FEType type = var.feType();
589  for (unsigned int i = 0; i < var.count(); ++i)
590  {
591  VariableName vname = var_name;
592  if (var.isArray())
593  vname = var.arrayVariableComponent(i);
594 
595  if (type.order == CONSTANT)
596  _execute_data["elemental"].hide.insert(vname);
597  else if (FEInterface::field_type(type) == TYPE_VECTOR)
598  {
599  switch (_es_ptr->get_mesh().spatial_dimension())
600  {
601  case 0:
602  case 1:
603  _execute_data["nodal"].hide.insert(vname);
604  break;
605  case 2:
606  _execute_data["nodal"].hide.insert(vname + "_x");
607  _execute_data["nodal"].hide.insert(vname + "_y");
608  break;
609  case 3:
610  _execute_data["nodal"].hide.insert(vname + "_x");
611  _execute_data["nodal"].hide.insert(vname + "_y");
612  _execute_data["nodal"].hide.insert(vname + "_z");
613  break;
614  }
615  }
616  else
617  _execute_data["nodal"].hide.insert(vname);
618  }
619  }
620  else if (_problem_ptr->hasScalarVariable(var_name))
621  _execute_data["scalars"].hide.insert(var_name);
622  else if (hasPostprocessorByName(var_name))
623  _execute_data["postprocessors"].hide.insert(var_name);
624  else if (hasVectorPostprocessorByName(var_name))
625  _execute_data["vector_postprocessors"].hide.insert(var_name);
626  else if ((var_name.find("/") != std::string::npos) &&
628  _execute_data["reporters"].hide.insert(var_name);
629 
630  else
631  unknown.insert(var_name);
632  }
633 
634  // Error if an unknown variable or postprocessor is found
635  if (!unknown.empty())
636  {
637  std::ostringstream oss;
638  oss << "Output(s) do not exist (must be variable, scalar, postprocessor, or vector "
639  "postprocessor): ";
640  std::copy(unknown.begin(), unknown.end(), infix_ostream_iterator<std::string>(oss, " "));
641  mooseError(oss.str());
642  }
643 }
644 
645 void
647 {
648  // References to the vectors of variable names
649  std::set<std::string> & hide = data.hide;
650  std::set<std::string> & show = data.show;
651  std::set<std::string> & avail = data.available;
652  std::set<std::string> & output = data.output;
653 
654  // Get the hide list from OutputInterface objects
655  std::set<std::string> interface_hide_all_types;
656  _app.getOutputWarehouse().buildInterfaceHideVariables(name(), interface_hide_all_types);
657 
658  // OutputInterface hide list includes all types; only include those that are available
659  std::set<std::string> interface_hide;
660  std::set_intersection(interface_hide_all_types.begin(),
661  interface_hide_all_types.end(),
662  avail.begin(),
663  avail.end(),
664  std::inserter(interface_hide, interface_hide.begin()));
665 
666  // Append to the hide list from OutputInterface objects
667  hide.insert(interface_hide.begin(), interface_hide.end());
668 
669  // Both show and hide are empty and no show/hide settings were provided (show all available)
670  if (!_execute_data.hasShowList() && hide.empty())
671  output = avail;
672 
673  // Only hide is empty (show all the variables listed)
674  else if (_execute_data.hasShowList() && hide.empty())
675  output = show;
676 
677  // Only show is empty (show all except those hidden)
678  else if (!_execute_data.hasShowList() && !hide.empty())
679  std::set_difference(avail.begin(),
680  avail.end(),
681  hide.begin(),
682  hide.end(),
683  std::inserter(output, output.begin()));
684 
685  // Both hide and show are present (show all those listed)
686  else // (_execute_data.hasShowList() && !hide.empty())
687  {
688  // Check if variables are in both, which is invalid
689  std::vector<std::string> tmp;
690  std::set_intersection(
691  hide.begin(), hide.end(), show.begin(), show.end(), std::inserter(tmp, tmp.begin()));
692  if (!tmp.empty())
693  {
694  std::ostringstream oss;
695  oss << "Output(s) specified to be both shown and hidden: ";
696  std::copy(tmp.begin(), tmp.end(), infix_ostream_iterator<std::string>(oss, " "));
697  mooseError(oss.str());
698  }
699 
700  // Define the output variable list
701  output = show;
702  }
703 }
704 
705 void
707 {
709  empty_execute_on.addAvailableFlags(EXEC_FAILED);
710 
711  // Nodal output
712  if (types.isValueSet("nodal"))
713  {
714  params.addParam<ExecFlagEnum>(
715  "execute_nodal_on", empty_execute_on, "Control the output of nodal variables");
716  params.addParamNamesToGroup("execute_nodal_on", "Selection/restriction of output");
717  }
718 
719  // Elemental output
720  if (types.isValueSet("elemental"))
721  {
722  params.addParam<ExecFlagEnum>(
723  "execute_elemental_on", empty_execute_on, "Control the output of elemental variables");
724  params.addParamNamesToGroup("execute_elemental_on", "Selection/restriction of output");
725 
726  // Add material output control, which are output via elemental variables
727  params.addParam<bool>("output_material_properties",
728  false,
729  "Flag indicating if material properties should be output");
730  params.addParam<std::vector<std::string>>(
731  "show_material_properties",
732  "List of material properties that should be written to the output");
733  params.addParamNamesToGroup("output_material_properties show_material_properties", "Materials");
734 
735  // Add mesh extra element id control, which are output via elemental variables
736  params.addParam<bool>(
737  "output_extra_element_ids",
738  false,
739  "Flag indicating if extra element ids defined on the mesh should be outputted");
740  params.addParam<std::vector<std::string>>(
741  "extra_element_ids_to_output",
742  "List of extra element ids defined on the mesh that should be written to the output.");
743  params.addParamNamesToGroup("output_extra_element_ids extra_element_ids_to_output", "Mesh");
744  }
745 
746  // Scalar variable output
747  if (types.isValueSet("scalar"))
748  {
749  params.addParam<ExecFlagEnum>(
750  "execute_scalars_on", empty_execute_on, "Control the output of scalar variables");
751  params.addParamNamesToGroup("execute_scalars_on", "Selection/restriction of output");
752  }
753 
754  // Nodal and scalar output
755  if (types.isValueSet("nodal") && types.isValueSet("scalar"))
756  {
757  params.addParam<bool>("scalar_as_nodal", false, "Output scalar variables as nodal");
758  params.addParamNamesToGroup("scalar_as_nodal", "Conversions before output");
759  }
760 
761  // Elemental and nodal
762  if (types.isValueSet("elemental") && types.isValueSet("nodal"))
763  {
764  params.addParam<bool>(
765  "elemental_as_nodal", false, "Output elemental nonlinear variables as nodal");
766  params.addParamNamesToGroup("elemental_as_nodal", "Conversions before output");
767  }
768 
769  // Postprocessors
770  if (types.isValueSet("postprocessor"))
771  {
772  params.addParam<ExecFlagEnum>(
773  "execute_postprocessors_on", empty_execute_on, "Control of when postprocessors are output");
774  params.addParamNamesToGroup("execute_postprocessors_on", "Selection/restriction of output");
775  }
776 
777  // Vector Postprocessors
778  if (types.isValueSet("vector_postprocessor"))
779  {
780  params.addParam<ExecFlagEnum>("execute_vector_postprocessors_on",
781  empty_execute_on,
782  "Enable/disable the output of VectorPostprocessors");
783  params.addParamNamesToGroup("execute_vector_postprocessors_on",
784  "Selection/restriction of output");
785  }
786 
787  // Reporters
788  if (types.isValueSet("reporter"))
789  {
790  params.addParam<ExecFlagEnum>(
791  "execute_reporters_on", empty_execute_on, "Control of when Reporter values are output");
792  params.addParamNamesToGroup("execute_reporters_on", "Selection/restriction of output");
793  }
794 
795  // Input file
796  if (types.isValueSet("input"))
797  {
798  params.addParam<ExecFlagEnum>(
799  "execute_input_on", empty_execute_on, "Enable/disable the output of the input file");
800  params.addParamNamesToGroup("execute_input_on", "Selection/restriction of output");
801  }
802 
803  // System Information
804  if (types.isValueSet("system_information"))
805  {
806  params.addParam<ExecFlagEnum>("execute_system_information_on",
807  empty_execute_on,
808  "Control when the output of the simulation information occurs");
809  params.addParamNamesToGroup("execute_system_information_on", "Selection/restriction of output");
810  }
811 }
812 
813 bool
814 AdvancedOutput::hasOutputHelper(const std::string & name)
815 {
816  return !_execute_data[name].output.empty() && _advanced_execute_on.contains(name) &&
817  _advanced_execute_on[name].isValid() && !_advanced_execute_on[name].isValueSet("none");
818 }
819 
820 bool
822 {
823  return hasOutputHelper("nodal");
824 }
825 
826 const std::set<std::string> &
828 {
829  return _execute_data["nodal"].output;
830 }
831 
832 bool
834 {
835  return hasOutputHelper("elemental");
836 }
837 
838 const std::set<std::string> &
840 {
841  return _execute_data["elemental"].output;
842 }
843 
844 bool
846 {
847  return hasOutputHelper("scalars");
848 }
849 
850 const std::set<std::string> &
852 {
853  return _execute_data["scalars"].output;
854 }
855 
856 bool
858 {
859  return hasOutputHelper("postprocessors");
860 }
861 
862 const std::set<std::string> &
864 {
865  return _execute_data["postprocessors"].output;
866 }
867 
868 bool
870 {
871  return hasOutputHelper("vector_postprocessors");
872 }
873 
874 const std::set<std::string> &
876 {
877  return _execute_data["vector_postprocessors"].output;
878 }
879 
880 bool
882 {
883  return hasOutputHelper("reporters");
884 }
885 
886 const std::set<std::string> &
888 {
889  return _execute_data["reporters"].output;
890 }
891 
892 const OutputOnWarehouse &
894 {
895  return _advanced_execute_on;
896 }
virtual void outputVectorPostprocessors()
Performs output of VectorPostprocessors The child class must define this method to output the VectorP...
virtual bool hasVariable(const std::string &var_name) const override
Whether or not this problem has the variable.
virtual void outputSystemInformation()
const std::set< std::string > & getPostprocessorOutput()
The list of postprocessor names that are set for output.
std::set< std::string > output
A list of the outputs to write.
const ExecFlagType EXEC_FAILED
Definition: Moose.C:48
bool hasPostprocessorOutput()
Returns true if there exists postprocessors for output.
virtual bool hasOutput()
Returns true if any of the other has methods return true.
KOKKOS_INLINE_FUNCTION const T * find(const T &target, const T *const begin, const T *const end)
Find a value in an array.
Definition: KokkosUtils.h:40
const libMesh::FEType & feType() const
Get the type of finite element object.
A MultiMooseEnum object to hold "execute_on" flags.
Definition: ExecFlagEnum.h:21
ExecFlagEnum _execute_on
The common Execution types; this is used as the default execution type for everything except system i...
Definition: Output.h:203
const InputParameters & _pars
The object&#39;s parameters.
Definition: MooseBase.h:394
bool hasVectorPostprocessorOutput()
Returns true if there exists VectorPostprocessors for output.
const bool _postprocessors_as_reporters
Flags for outputting PP/VPP data as a reporter.
void addDeprecatedParam(const std::string &name, const T &value, const std::string &doc_string, const std::string &deprecation_message)
const T & getParam(const std::string &name) const
Retrieve a parameter for the object.
Definition: MooseBase.h:416
const ExecFlagType EXEC_FORCED
Definition: Moose.C:47
OutputOnWarehouse _advanced_execute_on
Storage for the individual component execute flags.
Definition: Output.h:277
AdvancedOutput(const InputParameters &parameters)
Class constructor.
virtual void outputElementalVariables()
Performs output of elemental nonlinear variables The child class must define this method to output th...
const InputParameters & parameters() const
Get the parameters of the object.
Definition: MooseBase.h:131
unsigned int count() const
Get the number of components Note: For standard and vector variables, the number is one...
bool hasOutputHelper(const std::string &name)
Helper method for checking if output types exists.
bool _elemental_as_nodal
Flags to control nodal output.
void initShowHideLists(const std::vector< VariableName > &show, const std::vector< VariableName > &hide)
Parses the user-supplied input for hiding and showing variables and postprocessors into a list for ea...
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
OutputDataWarehouse _execute_data
Storage structures for the various output types.
virtual bool hasScalarVariable(const std::string &var_name) const override
Returns a Boolean indicating whether any system contains a variable with the name provided...
virtual bool shouldOutput()
Handles logic for determining if a step should be output.
virtual ~AdvancedOutput()
Class destructor.
virtual void output()
A single call to this function should output all the necessary data for a single timestep.
void addAvailableFlags(const ExecFlagType &flag, Args... flags)
Add additional execute_on flags to the list of possible flags.
Definition: ExecFlagEnum.h:82
This class provides an interface for common operations on field variables of both FE and FV types wit...
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
const std::set< std::string > & getVectorPostprocessorOutput()
The list of VectorPostprocessor names that are set for output.
std::string getRawNames() const
Method for returning the raw name strings for this instance.
A structure for storing the various lists that contain the names of the items to be exported...
void initOutputList(OutputData &data)
Initializes the list of items to be output using the available, show, and hide lists.
virtual const MooseVariableFieldBase & getVariable(const THREAD_ID tid, const std::string &var_name, Moose::VarKindType expected_var_type=Moose::VarKindType::VAR_ANY, Moose::VarFieldType expected_var_field_type=Moose::VarFieldType::VAR_FIELD_ANY) const override
Returns the variable reference for requested variable which must be of the expected_var_type (Nonline...
InputParameters emptyInputParameters()
MONOMIAL_VEC
virtual void outputScalarVariables()
Performs output of scalar variables The child class must define this method to output the scalar vari...
ExecFlagEnum getDefaultExecFlagEnum()
Definition: MooseUtils.C:961
virtual bool shouldOutput()
Handles logic for determining if a step should be output.
Definition: Output.C:268
const OutputOnWarehouse & advancedExecuteOn() const
Get the current advanced &#39;execute_on&#39; selections for display.
void initAvailableLists()
Initializes the available lists for each of the output types.
const std::set< std::string > & getReporterOutput()
The list of Reporter names that are set for output.
bool hasShowList()
False when the show lists for all variables is empty.
CONSTANT
virtual std::vector< VariableName > getVariableNames()
Returns a list of all the variables in the problem (both from the NL and Aux systems.
const std::string & name() const
Get the name of the class.
Definition: MooseBase.h:103
bool hasNodalVariableOutput()
Returns true if there exists nodal nonlinear variables for output.
virtual void outputNodalVariables()
Performs output of nodal nonlinear variables The child class must define this method to output the no...
bool havePRefinement() const
Query whether p-refinement has been requested at any point during the simulation. ...
Definition: SubProblem.h:1016
void reset()
Clear existing lists for re-initialization.
const std::set< std::string > & getScalarOutput()
The list of scalar variables names that are set for output.
std::set< std::string > available
A list of all possible outputs.
bool hasPostprocessorByName(const PostprocessorName &name) const
Determine if the Postprocessor data exists.
virtual void outputInput()
Performs the output of the input file By default this method does nothing and is not called...
ExecFlagType _current_execute_flag
Current execute on flag.
Definition: Output.h:211
bool contains(const std::string &name) const
A method for testing of a key exists.
const bool _vectorpostprocessors_as_reporters
static void addValidParams(InputParameters &params, const MultiMooseEnum &types)
Method for defining the available parameters based on the types of outputs.
FEProblemBase * _problem_ptr
Pointer the the FEProblemBase object for output object (use this)
Definition: Output.h:185
static InputParameters validParams()
Definition: FileOutput.C:24
virtual bool isArray() const
const std::string & type() const
Get the type of this class.
Definition: MooseBase.h:93
A helper warehouse class for storing the "execute_on" settings for the various output types...
bool hasScalarOutput()
Returns true if there exists scalar variables for output.
std::map< std::string, Real > & _last_execute_time
Storage for the last output time for the various output types, this is used to avoid duplicate output...
MooseApp & _app
The MOOSE application this is associated with.
Definition: MooseBase.h:385
bool isValueSet(const std::string &value) const
Methods for seeing if a value is set in the MultiMooseEnum.
static InputParameters enableOutputTypes(const std::string &names=std::string())
A method for enabling individual output type control.
bool hasElementalVariableOutput()
Returns true if there exists elemental nonlinear variables for output.
std::set< std::string > hide
User-supplied list of outputs to hide.
std::set< ReporterName > getReporterNames() const
Return a list of all reporter names.
Definition: ReporterData.C:62
std::map< std::string, T >::iterator end()
const ReporterData & _reporter_data
Storage for Reporter values.
bool _is_advanced
Flag for advanced output testing.
Definition: Output.h:271
bool wantOutput(const std::string &name, const ExecFlagType &type)
Handles logic for determining if a step should be output.
bool have_parameter(std::string_view name) const
A wrapper around the Parameters base class method.
virtual void outputReporters()
Output Reporter values.
bool hasVectorPostprocessorByName(const VectorPostprocessorName &name, const std::string &vector_name) const
Determine if the VectorPostprocessor data exists by name.
virtual void initialSetup()
Call init() method on setup.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Class for containing MooseEnum item information.
Definition: MooseEnumItem.h:18
virtual void outputPostprocessors()
Performs output of postprocessors The child class must define this method to output the postprocessor...
unsigned int spatial_dimension() const
libMesh::EquationSystems * _es_ptr
Reference the the libMesh::EquationSystems object that contains the data.
Definition: Output.h:194
const std::string & arrayVariableComponent(const unsigned int i) const
Returns the variable name of a component of an array variable.
const MeshBase & get_mesh() const
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type and optionally a file path to the top-level block p...
Definition: MooseBase.h:281
const std::set< std::string > & getElementalVariableOutput()
The list of elemental nonlinear variables names that are set for output.
static MultiMooseEnum getOutputTypes()
Get the supported types of output (e.g., postprocessors, etc.)
std::set< std::string > show
User-supplied list of outputs to display.
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...
const std::set< std::string > & getNodalVariableOutput()
The list of nodal nonlinear variables names that are set for output.
bool isParamValid(const std::string &name) const
Test if the supplied parameter is valid.
Definition: MooseBase.h:209
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type...
void buildInterfaceHideVariables(const std::string &output_name, std::set< std::string > &hide)
Return the list of hidden variables for the given output name.
bool hasReporterOutput()
Returns true if there exists Reporter for output.
static InputParameters validParams()
An outputter with filename support.
Definition: FileOutput.h:20
bool checkFilename()
Checks the filename for output Checks the output against the &#39;output_if_base_contians&#39; list...
Definition: FileOutput.C:88
void initExecutionTypes(const std::string &name, ExecFlagEnum &input)
Initialize the possible execution types.
TYPE_VECTOR
std::map< std::string, T >::iterator find(const std::string &name)
const ExecFlagType EXEC_FINAL
Definition: Moose.C:46
Real & _time
The current time for output purposes.
Definition: Output.h:214
void clearSetValues()
Clear the MultiMooseEnum.
bool hasReporterValueByName(const ReporterName &reporter_name) const
The Reporter system is comprised of objects that can contain any number of data values.
Definition: ReporterName.h:30
OutputWarehouse & getOutputWarehouse()
Get the OutputWarehouse objects.
Definition: MooseApp.C:2136
virtual void init()
Populates the various data structures needed to control the output.
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)
This method takes a space delimited list of parameter names and adds them to the specified group name...
void setHasShowList(bool value)
Set the show list bool.