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  const FEType type = var.feType();
434  for (unsigned int i = 0; i < var.count(); ++i)
435  {
436  VariableName vname = var_name;
437  if (var.isArray())
438  vname = var.arrayVariableComponent(i);
439 
440  // A note that if we have p-refinement we assume "worst-case" scenario that our constant
441  // monomial/monomial-vec families have been refined and we can no longer write them as
442  // elemental
443  if (type.order == CONSTANT && !_problem_ptr->havePRefinement() &&
444  type.family != MONOMIAL_VEC)
445  _execute_data["elemental"].available.insert(vname);
446  else if (FEInterface::field_type(type) == TYPE_VECTOR)
447  {
448  const auto geom_type = ((type.family == MONOMIAL_VEC) && (type.order == CONSTANT) &&
450  ? "elemental"
451  : "nodal";
452  switch (_es_ptr->get_mesh().spatial_dimension())
453  {
454  case 0:
455  case 1:
456  _execute_data[geom_type].available.insert(vname);
457  break;
458  case 2:
459  _execute_data[geom_type].available.insert(vname + "_x");
460  _execute_data[geom_type].available.insert(vname + "_y");
461  break;
462  case 3:
463  _execute_data[geom_type].available.insert(vname + "_x");
464  _execute_data[geom_type].available.insert(vname + "_y");
465  _execute_data[geom_type].available.insert(vname + "_z");
466  break;
467  }
468  }
469  else
470  _execute_data["nodal"].available.insert(vname);
471  }
472  }
473 
474  else if (_problem_ptr->hasScalarVariable(var_name))
475  _execute_data["scalars"].available.insert(var_name);
476  }
477 
478  // Initialize Reporter name list
479  for (auto && r_name : _reporter_data.getReporterNames())
480  if ((_postprocessors_as_reporters || !r_name.isPostprocessor()) &&
481  (_vectorpostprocessors_as_reporters || !r_name.isVectorPostprocessor()))
482  _execute_data["reporters"].available.insert(r_name);
483 }
484 
485 void
486 AdvancedOutput::initExecutionTypes(const std::string & name, ExecFlagEnum & input)
487 {
488  // Build the input parameter name
489  std::string param_name = "execute_";
490  param_name += name + "_on";
491 
492  // The parameters exists and has been set by the user
493  if (_pars.have_parameter<ExecFlagEnum>(param_name) && isParamValid(param_name))
494  input = getParam<ExecFlagEnum>(param_name);
495 
496  // If the parameter does not exists; set it to a state where no valid entries exists so nothing
497  // gets executed
498  else if (!_pars.have_parameter<ExecFlagEnum>(param_name))
499  {
500  input = _execute_on;
501  input.clearSetValues();
502  }
503 }
504 
505 void
506 AdvancedOutput::initShowHideLists(const std::vector<VariableName> & show,
507  const std::vector<VariableName> & hide)
508 {
509 
510  // Storage for user-supplied input that is unknown as a variable or postprocessor
511  std::set<std::string> unknown;
512 
513  // If a show hide/list exists, let the data warehouse know about it. This allows for the proper
514  // handling of output lists (see initOutputList)
515  if (show.size() > 0)
517 
518  // Populate the show lists
519  for (const auto & var_name : show)
520  {
521  if (_problem_ptr->hasVariable(var_name))
522  {
525  const FEType type = var.feType();
526  for (unsigned int i = 0; i < var.count(); ++i)
527  {
528  VariableName vname = var_name;
529  if (var.isArray())
530  vname = var.arrayVariableComponent(i);
531 
532  if (type.order == CONSTANT)
533  _execute_data["elemental"].show.insert(vname);
534  else if (FEInterface::field_type(type) == TYPE_VECTOR)
535  {
536  const auto geom_type =
537  ((type.family == MONOMIAL_VEC) && (type.order == CONSTANT)) ? "elemental" : "nodal";
538  switch (_es_ptr->get_mesh().spatial_dimension())
539  {
540  case 0:
541  case 1:
542  _execute_data[geom_type].show.insert(vname);
543  break;
544  case 2:
545  _execute_data[geom_type].show.insert(vname + "_x");
546  _execute_data[geom_type].show.insert(vname + "_y");
547  break;
548  case 3:
549  _execute_data[geom_type].show.insert(vname + "_x");
550  _execute_data[geom_type].show.insert(vname + "_y");
551  _execute_data[geom_type].show.insert(vname + "_z");
552  break;
553  }
554  }
555  else
556  _execute_data["nodal"].show.insert(vname);
557  }
558  }
559  else if (_problem_ptr->hasScalarVariable(var_name))
560  _execute_data["scalars"].show.insert(var_name);
561  else if (hasPostprocessorByName(var_name))
562  _execute_data["postprocessors"].show.insert(var_name);
563  else if (hasVectorPostprocessorByName(var_name))
564  _execute_data["vector_postprocessors"].show.insert(var_name);
565  else if ((var_name.find("/") != std::string::npos) &&
567  _execute_data["reporters"].show.insert(var_name);
568  else
569  unknown.insert(var_name);
570  }
571 
572  // Populate the hide lists
573  for (const auto & var_name : hide)
574  {
575  if (_problem_ptr->hasVariable(var_name))
576  {
579  const FEType type = var.feType();
580  for (unsigned int i = 0; i < var.count(); ++i)
581  {
582  VariableName vname = var_name;
583  if (var.isArray())
584  vname = var.arrayVariableComponent(i);
585 
586  if (type.order == CONSTANT)
587  _execute_data["elemental"].hide.insert(vname);
588  else if (FEInterface::field_type(type) == TYPE_VECTOR)
589  {
590  switch (_es_ptr->get_mesh().spatial_dimension())
591  {
592  case 0:
593  case 1:
594  _execute_data["nodal"].hide.insert(vname);
595  break;
596  case 2:
597  _execute_data["nodal"].hide.insert(vname + "_x");
598  _execute_data["nodal"].hide.insert(vname + "_y");
599  break;
600  case 3:
601  _execute_data["nodal"].hide.insert(vname + "_x");
602  _execute_data["nodal"].hide.insert(vname + "_y");
603  _execute_data["nodal"].hide.insert(vname + "_z");
604  break;
605  }
606  }
607  else
608  _execute_data["nodal"].hide.insert(vname);
609  }
610  }
611  else if (_problem_ptr->hasScalarVariable(var_name))
612  _execute_data["scalars"].hide.insert(var_name);
613  else if (hasPostprocessorByName(var_name))
614  _execute_data["postprocessors"].hide.insert(var_name);
615  else if (hasVectorPostprocessorByName(var_name))
616  _execute_data["vector_postprocessors"].hide.insert(var_name);
617  else if ((var_name.find("/") != std::string::npos) &&
619  _execute_data["reporters"].hide.insert(var_name);
620 
621  else
622  unknown.insert(var_name);
623  }
624 
625  // Error if an unknown variable or postprocessor is found
626  if (!unknown.empty())
627  {
628  std::ostringstream oss;
629  oss << "Output(s) do not exist (must be variable, scalar, postprocessor, or vector "
630  "postprocessor): ";
631  std::copy(unknown.begin(), unknown.end(), infix_ostream_iterator<std::string>(oss, " "));
632  mooseError(oss.str());
633  }
634 }
635 
636 void
638 {
639  // References to the vectors of variable names
640  std::set<std::string> & hide = data.hide;
641  std::set<std::string> & show = data.show;
642  std::set<std::string> & avail = data.available;
643  std::set<std::string> & output = data.output;
644 
645  // Append to the hide list from OutputInterface objects
646  std::set<std::string> interface_hide;
648  hide.insert(interface_hide.begin(), interface_hide.end());
649 
650  // Both show and hide are empty and no show/hide settings were provided (show all available)
651  if (show.empty() && hide.empty() && !_execute_data.hasShowList())
652  output = avail;
653 
654  // Only hide is empty (show all the variables listed)
655  else if (!show.empty() && hide.empty())
656  output = show;
657 
658  // Only show is empty (show all except those hidden)
659  else if (show.empty() && !hide.empty())
660  std::set_difference(avail.begin(),
661  avail.end(),
662  hide.begin(),
663  hide.end(),
664  std::inserter(output, output.begin()));
665 
666  // Both hide and show are present (show all those listed)
667  else
668  {
669  // Check if variables are in both, which is invalid
670  std::vector<std::string> tmp;
671  std::set_intersection(
672  hide.begin(), hide.end(), show.begin(), show.end(), std::inserter(tmp, tmp.begin()));
673  if (!tmp.empty())
674  {
675  std::ostringstream oss;
676  oss << "Output(s) specified to be both shown and hidden: ";
677  std::copy(tmp.begin(), tmp.end(), infix_ostream_iterator<std::string>(oss, " "));
678  mooseError(oss.str());
679  }
680 
681  // Define the output variable list
682  output = show;
683  }
684 }
685 
686 void
688 {
690  empty_execute_on.addAvailableFlags(EXEC_FAILED);
691 
692  // Nodal output
693  if (types.isValueSet("nodal"))
694  {
695  params.addParam<ExecFlagEnum>(
696  "execute_nodal_on", empty_execute_on, "Control the output of nodal variables");
697  params.addParamNamesToGroup("execute_nodal_on", "Selection/restriction of output");
698  }
699 
700  // Elemental output
701  if (types.isValueSet("elemental"))
702  {
703  params.addParam<ExecFlagEnum>(
704  "execute_elemental_on", empty_execute_on, "Control the output of elemental variables");
705  params.addParamNamesToGroup("execute_elemental_on", "Selection/restriction of output");
706 
707  // Add material output control, which are output via elemental variables
708  params.addParam<bool>("output_material_properties",
709  false,
710  "Flag indicating if material properties should be output");
711  params.addParam<std::vector<std::string>>(
712  "show_material_properties",
713  "List of material properties that should be written to the output");
714  params.addParamNamesToGroup("output_material_properties show_material_properties", "Materials");
715 
716  // Add mesh extra element id control, which are output via elemental variables
717  params.addParam<bool>(
718  "output_extra_element_ids",
719  false,
720  "Flag indicating if extra element ids defined on the mesh should be outputted");
721  params.addParam<std::vector<std::string>>(
722  "extra_element_ids_to_output",
723  "List of extra element ids defined on the mesh that should be written to the output.");
724  params.addParamNamesToGroup("output_extra_element_ids extra_element_ids_to_output", "Mesh");
725  }
726 
727  // Scalar variable output
728  if (types.isValueSet("scalar"))
729  {
730  params.addParam<ExecFlagEnum>(
731  "execute_scalars_on", empty_execute_on, "Control the output of scalar variables");
732  params.addParamNamesToGroup("execute_scalars_on", "Selection/restriction of output");
733  }
734 
735  // Nodal and scalar output
736  if (types.isValueSet("nodal") && types.isValueSet("scalar"))
737  {
738  params.addParam<bool>("scalar_as_nodal", false, "Output scalar variables as nodal");
739  params.addParamNamesToGroup("scalar_as_nodal", "Conversions before output");
740  }
741 
742  // Elemental and nodal
743  if (types.isValueSet("elemental") && types.isValueSet("nodal"))
744  {
745  params.addParam<bool>(
746  "elemental_as_nodal", false, "Output elemental nonlinear variables as nodal");
747  params.addParamNamesToGroup("elemental_as_nodal", "Conversions before output");
748  }
749 
750  // Postprocessors
751  if (types.isValueSet("postprocessor"))
752  {
753  params.addParam<ExecFlagEnum>(
754  "execute_postprocessors_on", empty_execute_on, "Control of when postprocessors are output");
755  params.addParamNamesToGroup("execute_postprocessors_on", "Selection/restriction of output");
756  }
757 
758  // Vector Postprocessors
759  if (types.isValueSet("vector_postprocessor"))
760  {
761  params.addParam<ExecFlagEnum>("execute_vector_postprocessors_on",
762  empty_execute_on,
763  "Enable/disable the output of VectorPostprocessors");
764  params.addParamNamesToGroup("execute_vector_postprocessors_on",
765  "Selection/restriction of output");
766  }
767 
768  // Reporters
769  if (types.isValueSet("reporter"))
770  {
771  params.addParam<ExecFlagEnum>(
772  "execute_reporters_on", empty_execute_on, "Control of when Reporter values are output");
773  params.addParamNamesToGroup("execute_reporters_on", "Selection/restriction of output");
774  }
775 
776  // Input file
777  if (types.isValueSet("input"))
778  {
779  params.addParam<ExecFlagEnum>(
780  "execute_input_on", empty_execute_on, "Enable/disable the output of the input file");
781  params.addParamNamesToGroup("execute_input_on", "Selection/restriction of output");
782  }
783 
784  // System Information
785  if (types.isValueSet("system_information"))
786  {
787  params.addParam<ExecFlagEnum>("execute_system_information_on",
788  empty_execute_on,
789  "Control when the output of the simulation information occurs");
790  params.addParamNamesToGroup("execute_system_information_on", "Selection/restriction of output");
791  }
792 }
793 
794 bool
795 AdvancedOutput::hasOutputHelper(const std::string & name)
796 {
797  return !_execute_data[name].output.empty() && _advanced_execute_on.contains(name) &&
798  _advanced_execute_on[name].isValid() && !_advanced_execute_on[name].isValueSet("none");
799 }
800 
801 bool
803 {
804  return hasOutputHelper("nodal");
805 }
806 
807 const std::set<std::string> &
809 {
810  return _execute_data["nodal"].output;
811 }
812 
813 bool
815 {
816  return hasOutputHelper("elemental");
817 }
818 
819 const std::set<std::string> &
821 {
822  return _execute_data["elemental"].output;
823 }
824 
825 bool
827 {
828  return hasOutputHelper("scalars");
829 }
830 
831 const std::set<std::string> &
833 {
834  return _execute_data["scalars"].output;
835 }
836 
837 bool
839 {
840  return hasOutputHelper("postprocessors");
841 }
842 
843 const std::set<std::string> &
845 {
846  return _execute_data["postprocessors"].output;
847 }
848 
849 bool
851 {
852  return hasOutputHelper("vector_postprocessors");
853 }
854 
855 const std::set<std::string> &
857 {
858  return _execute_data["vector_postprocessors"].output;
859 }
860 
861 bool
863 {
864  return hasOutputHelper("reporters");
865 }
866 
867 const std::set<std::string> &
869 {
870  return _execute_data["reporters"].output;
871 }
872 
873 const OutputOnWarehouse &
875 {
876  return _advanced_execute_on;
877 }
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:46
bool hasPostprocessorOutput()
Returns true if there exists postprocessors for output.
virtual bool hasOutput()
Returns true if any of the other has methods return true.
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
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 ExecFlagType EXEC_FORCED
Definition: Moose.C:45
OutputOnWarehouse _advanced_execute_on
Storage for the individual component execute flags.
Definition: Output.h:280
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...
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 std::string & name() const
Get the name of the class.
Definition: MooseBase.h:57
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()
Return the default ExecFlagEnum for MOOSE.
Definition: MooseUtils.C:1067
bool isParamValid(const std::string &name) const
Test if the supplied parameter is valid.
virtual bool shouldOutput()
Handles logic for determining if a step should be output.
Definition: Output.C:277
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.
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:1009
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:51
const T & getParam(const std::string &name) const
Retrieve a parameter for the object.
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:84
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:274
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.
const InputParameters & _pars
Parameters of this object, references the InputParameters stored in the InputParametersWarehouse.
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.)
const InputParameters & parameters() const
Get the parameters of the object.
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.
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:44
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:2436
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.