https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
29using 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.
34namespace
35{
36void
37addAdvancedOutputParams(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
117AdvancedOutput::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
151void
156
157void
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
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
203void
205{
206 mooseError("Individual output of nodal variables is not support for the output object named '",
207 name(),
208 "'");
209}
210
211void
213{
215 "Individual output of elemental variables is not support for this output object named '",
216 name(),
217 "'");
218}
219
220void
222{
223 mooseError("Individual output of postprocessors is not support for this output object named '",
224 name(),
225 "'");
226}
227
228void
230{
232 "Individual output of VectorPostprocessors is not support for this output object named '",
233 name(),
234 "'");
235}
236
237void
239{
241 "Individual output of scalars is not support for this output object named '", name(), "'");
242}
243
244void
246{
248 "Output of system information is not support for this output object named '", name(), "'");
249}
250
251void
253{
254 mooseError("Output of the input file information is not support for this output object named '",
255 name(),
256 "'");
257}
258
259void
261{
263 "Output of the Reporter value(s) is not support for this output object named '", name(), "'");
264}
265
266bool
268{
269 if (!checkFilename())
270 return false;
271
273 return true;
274 else
275 return Output::shouldOutput();
276}
277
278void
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 {
332 _last_execute_time["reporters"] = _time;
333 }
334}
335
336void
341
342bool
343AdvancedOutput::wantOutput(const std::string & name, const ExecFlagType & type)
344{
345 // Ignore EXEC_FORCED for system information and input, there is no reason to force this
346 if (type == EXEC_FORCED && (name == "system_information" || name == "input"))
347 return false;
348
349 // Do not output if the 'none' is contained by the execute_on
350 if (_advanced_execute_on.contains(name) && _advanced_execute_on[name].isValueSet("none"))
351 return false;
352
353 // Data output flag, true if data exists to be output
354 bool execute_data_flag = true;
355
356 // Set flag to false, if the OutputData exists and the output variable list is empty
357 std::map<std::string, OutputData>::const_iterator iter = _execute_data.find(name);
358 if (iter != _execute_data.end() && iter->second.output.empty())
359 execute_data_flag = false;
360
361 // Set flag to false, if the OutputOnWarehouse DOES NOT contain an entry
363 execute_data_flag = false;
364
365 // Force the output, if there is something to output and the time has not been output
366 if (type == EXEC_FORCED && execute_data_flag && _last_execute_time[name] != _time)
367 return true;
368
369 // Return true (output should occur) if three criteria are satisfied, else do not output:
370 // (1) The execute_data_flag = true (i.e, there is data to output)
371 // (2) The current output type is contained in the list of output execution types
372 // (3) The current execution time is "final" or "forced" and the data has not already been
373 // output
374 if (execute_data_flag && _advanced_execute_on[name].isValueSet(type) &&
376 return true;
377 else
378 return false;
379}
380
381bool
383{
384 // If any of the component outputs are true, then there is some output to perform
385 for (const auto & it : _advanced_execute_on)
386 if (wantOutput(it.first, type))
387 return true;
388
389 // There is nothing to output
390 return false;
391}
392
393bool
395{
396 // Test that variables exist for output AND that output execution flags are valid
397 for (const auto & it : _execute_data)
398 if (!(it.second).output.empty() && _advanced_execute_on.contains(it.first) &&
399 _advanced_execute_on[it.first].isValid())
400 return true;
401
402 // Test execution flags for non-variable output
403 if (_advanced_execute_on.contains("system_information") &&
404 _advanced_execute_on["system_information"].isValid())
405 return true;
406 if (_advanced_execute_on.contains("input") && _advanced_execute_on["input"].isValid())
407 return true;
408
409 return false;
410}
411
412void
414{
415 // Initialize Postprocessor list
416 // This flag is set to true if any postprocessor has the 'outputs' parameter set, it is then used
417 // to produce an warning if postprocessor output is disabled
419 initPostprocessorOrVectorPostprocessorLists<Postprocessor>("postprocessors");
420
421 // Initialize vector postprocessor list
422 // This flag is set to true if any vector postprocessor has the 'outputs' parameter set, it is
423 // then used
424 // to produce an warning if vector postprocessor output is disabled
426 initPostprocessorOrVectorPostprocessorLists<VectorPostprocessor>("vector_postprocessors");
427
428 // Get a list of the available variables
429 std::vector<VariableName> variables = _problem_ptr->getVariableNames();
430
431 // Loop through the variables and store the names in the correct available lists
432 for (const auto & var_name : variables)
433 {
434 if (_problem_ptr->hasVariable(var_name))
435 {
438
439 // Skip if the 'outputs' parameter has been set to exclude this output
440 if (var.isParamValid("outputs"))
441 {
442 const auto & outputs = var.getParam<std::vector<OutputName>>("outputs");
443 if (outputs.size() && std::find(outputs.begin(), outputs.end(), name()) == outputs.end() &&
444 outputs[0] != "all")
445 continue;
446 }
447
448 const FEType type = var.feType();
449 for (unsigned int i = 0; i < var.count(); ++i)
450 {
451 VariableName vname = var_name;
452 if (var.isArray())
453 vname = var.arrayVariableComponent(i);
454
455 // A note that if we have p-refinement we assume "worst-case" scenario that our constant
456 // monomial/monomial-vec families have been refined and we can no longer write them as
457 // elemental
458 if (type.order == CONSTANT && !_problem_ptr->havePRefinement() &&
459 type.family != MONOMIAL_VEC)
460 _execute_data["elemental"].available.insert(vname);
462 {
463 const auto geom_type = ((type.family == MONOMIAL_VEC) && (type.order == CONSTANT) &&
465 ? "elemental"
466 : "nodal";
468 {
469 case 0:
470 case 1:
471 _execute_data[geom_type].available.insert(vname);
472 break;
473 case 2:
474 _execute_data[geom_type].available.insert(vname + "_x");
475 _execute_data[geom_type].available.insert(vname + "_y");
476 break;
477 case 3:
478 _execute_data[geom_type].available.insert(vname + "_x");
479 _execute_data[geom_type].available.insert(vname + "_y");
480 _execute_data[geom_type].available.insert(vname + "_z");
481 break;
482 }
483 }
484 else
485 _execute_data["nodal"].available.insert(vname);
486 }
487 }
488
489 else if (_problem_ptr->hasScalarVariable(var_name))
490 _execute_data["scalars"].available.insert(var_name);
491 }
492
493 // Initialize Reporter name list
494 for (auto && r_name : _reporter_data.getReporterNames())
495 if ((_postprocessors_as_reporters || !r_name.isPostprocessor()) &&
496 (_vectorpostprocessors_as_reporters || !r_name.isVectorPostprocessor()))
497 _execute_data["reporters"].available.insert(r_name);
498}
499
500void
501AdvancedOutput::initExecutionTypes(const std::string & name, ExecFlagEnum & input)
502{
503 // Build the input parameter name
504 std::string param_name = "execute_";
505 param_name += name + "_on";
506
507 // The parameters exists and has been set by the user
508 if (_pars.have_parameter<ExecFlagEnum>(param_name) && isParamValid(param_name))
509 input = getParam<ExecFlagEnum>(param_name);
510
511 // If the parameter does not exists; set it to a state where no valid entries exists so nothing
512 // gets executed
513 else if (!_pars.have_parameter<ExecFlagEnum>(param_name))
514 {
515 input = _execute_on;
516 input.clearSetValues();
517 }
518}
519
520void
521AdvancedOutput::initShowHideLists(const std::vector<VariableName> & show,
522 const std::vector<VariableName> & hide)
523{
524
525 // Storage for user-supplied input that is unknown as a variable or postprocessor
526 std::set<std::string> unknown;
527
528 // If a show hide/list exists, let the data warehouse know about it. This allows for the proper
529 // handling of output lists (see initOutputList)
530 if (show.size() > 0)
532
533 // Populate the show lists
534 for (const auto & var_name : show)
535 {
536 if (_problem_ptr->hasVariable(var_name))
537 {
540 const FEType type = var.feType();
541 for (unsigned int i = 0; i < var.count(); ++i)
542 {
543 VariableName vname = var_name;
544 if (var.isArray())
545 vname = var.arrayVariableComponent(i);
546
547 if (type.order == CONSTANT)
548 _execute_data["elemental"].show.insert(vname);
550 {
551 const auto geom_type =
552 ((type.family == MONOMIAL_VEC) && (type.order == CONSTANT)) ? "elemental" : "nodal";
554 {
555 case 0:
556 case 1:
557 _execute_data[geom_type].show.insert(vname);
558 break;
559 case 2:
560 _execute_data[geom_type].show.insert(vname + "_x");
561 _execute_data[geom_type].show.insert(vname + "_y");
562 break;
563 case 3:
564 _execute_data[geom_type].show.insert(vname + "_x");
565 _execute_data[geom_type].show.insert(vname + "_y");
566 _execute_data[geom_type].show.insert(vname + "_z");
567 break;
568 }
569 }
570 else
571 _execute_data["nodal"].show.insert(vname);
572 }
573 }
574 else if (_problem_ptr->hasScalarVariable(var_name))
575 _execute_data["scalars"].show.insert(var_name);
576 else if (hasPostprocessorByName(var_name))
577 _execute_data["postprocessors"].show.insert(var_name);
578 else if (hasVectorPostprocessorByName(var_name))
579 _execute_data["vector_postprocessors"].show.insert(var_name);
580 else if ((var_name.find("/") != std::string::npos) &&
582 _execute_data["reporters"].show.insert(var_name);
583 else
584 unknown.insert(var_name);
585 }
586
587 // Populate the hide lists
588 for (const auto & var_name : hide)
589 {
590 if (_problem_ptr->hasVariable(var_name))
591 {
594 const FEType type = var.feType();
595 for (unsigned int i = 0; i < var.count(); ++i)
596 {
597 VariableName vname = var_name;
598 if (var.isArray())
599 vname = var.arrayVariableComponent(i);
600
601 if (type.order == CONSTANT)
602 _execute_data["elemental"].hide.insert(vname);
604 {
606 {
607 case 0:
608 case 1:
609 _execute_data["nodal"].hide.insert(vname);
610 break;
611 case 2:
612 _execute_data["nodal"].hide.insert(vname + "_x");
613 _execute_data["nodal"].hide.insert(vname + "_y");
614 break;
615 case 3:
616 _execute_data["nodal"].hide.insert(vname + "_x");
617 _execute_data["nodal"].hide.insert(vname + "_y");
618 _execute_data["nodal"].hide.insert(vname + "_z");
619 break;
620 }
621 }
622 else
623 _execute_data["nodal"].hide.insert(vname);
624 }
625 }
626 else if (_problem_ptr->hasScalarVariable(var_name))
627 _execute_data["scalars"].hide.insert(var_name);
628 else if (hasPostprocessorByName(var_name))
629 _execute_data["postprocessors"].hide.insert(var_name);
630 else if (hasVectorPostprocessorByName(var_name))
631 _execute_data["vector_postprocessors"].hide.insert(var_name);
632 else if ((var_name.find("/") != std::string::npos) &&
634 _execute_data["reporters"].hide.insert(var_name);
635
636 else
637 unknown.insert(var_name);
638 }
639
640 // Error if an unknown variable or postprocessor is found
641 if (!unknown.empty())
642 {
643 std::ostringstream oss;
644 oss << "Output(s) do not exist (must be variable, scalar, postprocessor, or vector "
645 "postprocessor): ";
646 std::copy(unknown.begin(), unknown.end(), infix_ostream_iterator<std::string>(oss, " "));
647 mooseError(oss.str());
648 }
649}
650
651void
653{
654 // References to the vectors of variable names
655 std::set<std::string> & hide = data.hide;
656 std::set<std::string> & show = data.show;
657 std::set<std::string> & avail = data.available;
658 std::set<std::string> & output = data.output;
659
660 // Get the hide list from OutputInterface objects
661 std::set<std::string> interface_hide_all_types;
662 _app.getOutputWarehouse().buildInterfaceHideVariables(name(), interface_hide_all_types);
663
664 // OutputInterface hide list includes all types; only include those that are available
665 std::set<std::string> interface_hide;
666 std::set_intersection(interface_hide_all_types.begin(),
667 interface_hide_all_types.end(),
668 avail.begin(),
669 avail.end(),
670 std::inserter(interface_hide, interface_hide.begin()));
671
672 // Append to the hide list from OutputInterface objects
673 hide.insert(interface_hide.begin(), interface_hide.end());
674
675 // Both show and hide are empty and no show/hide settings were provided (show all available)
676 if (!_execute_data.hasShowList() && hide.empty())
677 output = avail;
678
679 // Only hide is empty (show all the variables listed)
680 else if (_execute_data.hasShowList() && hide.empty())
681 output = show;
682
683 // Only show is empty (show all except those hidden)
684 else if (!_execute_data.hasShowList() && !hide.empty())
685 std::set_difference(avail.begin(),
686 avail.end(),
687 hide.begin(),
688 hide.end(),
689 std::inserter(output, output.begin()));
690
691 // Both hide and show are present (show all those listed)
692 else // (_execute_data.hasShowList() && !hide.empty())
693 {
694 // Check if variables are in both, which is invalid
695 std::vector<std::string> tmp;
696 std::set_intersection(
697 hide.begin(), hide.end(), show.begin(), show.end(), std::inserter(tmp, tmp.begin()));
698 if (!tmp.empty())
699 {
700 std::ostringstream oss;
701 oss << "Output(s) specified to be both shown and hidden: ";
702 std::copy(tmp.begin(), tmp.end(), infix_ostream_iterator<std::string>(oss, " "));
703 mooseError(oss.str());
704 }
705
706 // Define the output variable list
707 output = show;
708 }
709}
710
711void
713{
715 empty_execute_on.addAvailableFlags(EXEC_FAILED);
716
717 // Nodal output
718 if (types.isValueSet("nodal"))
719 {
720 params.addParam<ExecFlagEnum>(
721 "execute_nodal_on", empty_execute_on, "Control the output of nodal variables");
722 params.addParamNamesToGroup("execute_nodal_on", "Selection/restriction of output");
723 }
724
725 // Elemental output
726 if (types.isValueSet("elemental"))
727 {
728 params.addParam<ExecFlagEnum>(
729 "execute_elemental_on", empty_execute_on, "Control the output of elemental variables");
730 params.addParamNamesToGroup("execute_elemental_on", "Selection/restriction of output");
731
732 // Add material output control, which are output via elemental variables
733 params.addParam<bool>("output_material_properties",
734 false,
735 "Flag indicating if material properties should be output");
736 params.addParam<std::vector<std::string>>(
737 "show_material_properties",
738 "List of material properties that should be written to the output");
739 params.addParamNamesToGroup("output_material_properties show_material_properties", "Materials");
740
741 // Add mesh extra element id control, which are output via elemental variables
742 params.addParam<bool>(
743 "output_extra_element_ids",
744 false,
745 "Flag indicating if extra element ids defined on the mesh should be outputted");
746 params.addParam<std::vector<std::string>>(
747 "extra_element_ids_to_output",
748 "List of extra element ids defined on the mesh that should be written to the output.");
749 params.addParamNamesToGroup("output_extra_element_ids extra_element_ids_to_output", "Mesh");
750 }
751
752 // Scalar variable output
753 if (types.isValueSet("scalar"))
754 {
755 params.addParam<ExecFlagEnum>(
756 "execute_scalars_on", empty_execute_on, "Control the output of scalar variables");
757 params.addParamNamesToGroup("execute_scalars_on", "Selection/restriction of output");
758 }
759
760 // Nodal and scalar output
761 if (types.isValueSet("nodal") && types.isValueSet("scalar"))
762 {
763 params.addParam<bool>("scalar_as_nodal", false, "Output scalar variables as nodal");
764 params.addParamNamesToGroup("scalar_as_nodal", "Conversions before output");
765 }
766
767 // Elemental and nodal
768 if (types.isValueSet("elemental") && types.isValueSet("nodal"))
769 {
770 params.addParam<bool>(
771 "elemental_as_nodal", false, "Output elemental nonlinear variables as nodal");
772 params.addParamNamesToGroup("elemental_as_nodal", "Conversions before output");
773 }
774
775 // Postprocessors
776 if (types.isValueSet("postprocessor"))
777 {
778 params.addParam<ExecFlagEnum>(
779 "execute_postprocessors_on", empty_execute_on, "Control of when postprocessors are output");
780 params.addParamNamesToGroup("execute_postprocessors_on", "Selection/restriction of output");
781 }
782
783 // Vector Postprocessors
784 if (types.isValueSet("vector_postprocessor"))
785 {
786 params.addParam<ExecFlagEnum>("execute_vector_postprocessors_on",
787 empty_execute_on,
788 "Enable/disable the output of VectorPostprocessors");
789 params.addParamNamesToGroup("execute_vector_postprocessors_on",
790 "Selection/restriction of output");
791 }
792
793 // Reporters
794 if (types.isValueSet("reporter"))
795 {
796 params.addParam<ExecFlagEnum>(
797 "execute_reporters_on", empty_execute_on, "Control of when Reporter values are output");
798 params.addParamNamesToGroup("execute_reporters_on", "Selection/restriction of output");
799 }
800
801 // Input file
802 if (types.isValueSet("input"))
803 {
804 params.addParam<ExecFlagEnum>(
805 "execute_input_on", empty_execute_on, "Enable/disable the output of the input file");
806 params.addParamNamesToGroup("execute_input_on", "Selection/restriction of output");
807 }
808
809 // System Information
810 if (types.isValueSet("system_information"))
811 {
812 params.addParam<ExecFlagEnum>("execute_system_information_on",
813 empty_execute_on,
814 "Control when the output of the simulation information occurs");
815 params.addParamNamesToGroup("execute_system_information_on", "Selection/restriction of output");
816 }
817}
818
819bool
820AdvancedOutput::hasOutputHelper(const std::string & name)
821{
822 return !_execute_data[name].output.empty() && _advanced_execute_on.contains(name) &&
823 _advanced_execute_on[name].isValid() && !_advanced_execute_on[name].isValueSet("none");
824}
825
826bool
831
832const std::set<std::string> &
834{
835 return _execute_data["nodal"].output;
836}
837
838bool
843
844const std::set<std::string> &
846{
847 return _execute_data["elemental"].output;
848}
849
850bool
852{
853 return hasOutputHelper("scalars");
854}
855
856const std::set<std::string> &
858{
859 return _execute_data["scalars"].output;
860}
861
862bool
864{
865 return hasOutputHelper("postprocessors");
866}
867
868const std::set<std::string> &
870{
871 return _execute_data["postprocessors"].output;
872}
873
874bool
876{
877 return hasOutputHelper("vector_postprocessors");
878}
879
880const std::set<std::string> &
882{
883 return _execute_data["vector_postprocessors"].output;
884}
885
886bool
888{
889 return hasOutputHelper("reporters");
890}
891
892const std::set<std::string> &
894{
895 return _execute_data["reporters"].output;
896}
897
898const OutputOnWarehouse &
InputParameters emptyInputParameters()
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
const ExecFlagType EXEC_FORCED
Definition Moose.C:49
const ExecFlagType EXEC_FAILED
Definition Moose.C:50
const ExecFlagType EXEC_FINAL
Definition Moose.C:48
virtual bool hasOutput()
Returns true if any of the other has methods return true.
bool hasReporterOutput()
Returns true if there exists Reporter for output.
bool hasOutputHelper(const std::string &name)
Helper method for checking if output types exists.
virtual void outputScalarVariables()
Performs output of scalar variables The child class must define this method to output the scalar vari...
const std::set< std::string > & getReporterOutput()
The list of Reporter names that are set for output.
void initExecutionTypes(const std::string &name, ExecFlagEnum &input)
Initialize the possible execution types.
void initAvailableLists()
Initializes the available lists for each of the output types.
static InputParameters enableOutputTypes(const std::string &names=std::string())
A method for enabling individual output type control.
virtual void output()
A single call to this function should output all the necessary data for a single timestep.
virtual void initialSetup()
Call init() method on setup.
virtual void outputSystemInformation()
bool hasElementalVariableOutput()
Returns true if there exists elemental nonlinear variables for output.
virtual bool shouldOutput()
Handles logic for determining if a step should be output.
const std::set< std::string > & getElementalVariableOutput()
The list of elemental nonlinear variables names that are set for output.
bool hasNodalVariableOutput()
Returns true if there exists nodal nonlinear variables for output.
const bool _postprocessors_as_reporters
Flags for outputting PP/VPP data as a reporter.
bool _elemental_as_nodal
Flags to control nodal output.
bool hasPostprocessorOutput()
Returns true if there exists postprocessors for output.
AdvancedOutput(const InputParameters &parameters)
Class constructor.
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...
const ReporterData & _reporter_data
Storage for Reporter values.
void clearLastExecuteTime()
Clears bookkeeping used to suppress duplicate EXEC_FINAL output at the same time.
const bool _vectorpostprocessors_as_reporters
const std::set< std::string > & getNodalVariableOutput()
The list of nodal nonlinear variables names that are set for output.
static InputParameters validParams()
static MultiMooseEnum getOutputTypes()
Get the supported types of output (e.g., postprocessors, etc.)
bool hasScalarOutput()
Returns true if there exists scalar variables for output.
const std::set< std::string > & getScalarOutput()
The list of scalar variables names that are set for 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...
bool wantOutput(const std::string &name, const ExecFlagType &type)
Handles logic for determining if a step should be output.
virtual void outputElementalVariables()
Performs output of elemental nonlinear variables The child class must define this method to output th...
virtual ~AdvancedOutput()
Class destructor.
virtual void outputReporters()
Output Reporter values.
bool hasVectorPostprocessorOutput()
Returns true if there exists VectorPostprocessors for output.
virtual void outputPostprocessors()
Performs output of postprocessors The child class must define this method to output the postprocessor...
virtual void outputVectorPostprocessors()
Performs output of VectorPostprocessors The child class must define this method to output the VectorP...
const std::set< std::string > & getVectorPostprocessorOutput()
The list of VectorPostprocessor names that are set for output.
virtual void outputInput()
Performs the output of the input file By default this method does nothing and is not called,...
virtual void init()
Populates the various data structures needed to control the output.
OutputDataWarehouse _execute_data
Storage structures for the various output types.
virtual void outputNodalVariables()
Performs output of nodal nonlinear variables The child class must define this method to output the no...
void initOutputList(OutputData &data)
Initializes the list of items to be output using the available, show, and hide lists.
const std::set< std::string > & getPostprocessorOutput()
The list of postprocessor names that are set for output.
static void addValidParams(InputParameters &params, const MultiMooseEnum &types)
Method for defining the available parameters based on the types of outputs.
const OutputOnWarehouse & advancedExecuteOn() const
Get the current advanced 'execute_on' selections for display.
A MultiMooseEnum object to hold "execute_on" flags.
void addAvailableFlags(const ExecFlagType &flag, Args... flags)
Add additional execute_on flags to the list of possible flags.
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 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...
virtual bool hasVariable(const std::string &var_name) const override
Whether or not this problem has the variable.
virtual std::vector< VariableName > getVariableNames()
Returns a list of all the variables in the problem (both from the NL and Aux systems.
An outputter with filename support.
Definition FileOutput.h:21
static InputParameters validParams()
Definition FileOutput.C:24
bool checkFilename()
Checks the filename for output Checks the output against the 'output_if_base_contians' list.
Definition FileOutput.C:88
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
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 addParam(const std::string &name, const S &value, const std::string &doc_string)
These methods add an optional parameter and a documentation string to the InputParameters object.
void addDeprecatedParam(const std::string &name, const T &value, const std::string &doc_string, const std::string &deprecation_message)
bool have_parameter(std::string_view name) const
A wrapper around the Parameters base class method.
OutputWarehouse & getOutputWarehouse()
Get the OutputWarehouse objects.
Definition MooseApp.C:2409
const InputParameters & parameters() const
Get the parameters of the object.
Definition MooseBase.h:131
const std::string & type() const
Get the type of this class.
Definition MooseBase.h:93
const std::string & name() const
Get the name of the class.
Definition MooseBase.h:103
const InputParameters & _pars
The object's parameters.
Definition MooseBase.h:384
const T & getParam(const std::string &name) const
Retrieve a parameter for the object.
Definition MooseBase.h:406
bool isParamValid(const std::string &name) const
Test if the supplied parameter is valid.
Definition MooseBase.h:199
std::string getRawNames() const
Method for returning the raw name strings for this instance.
Class for containing MooseEnum item information.
MooseApp & _app
The MOOSE application this is associated with.
Definition MooseBase.h:375
const libMesh::FEType & feType() const
Get the type of finite element object.
virtual bool isArray() const
const std::string & arrayVariableComponent(const unsigned int i) const
Returns the variable name of a component of an array variable.
unsigned int count() const
Get the number of components Note: For standard and vector variables, the number is one.
This class provides an interface for common operations on field variables of both FE and FV types wit...
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type.
bool isValueSet(const std::string &value) const
Methods for seeing if a value is set in the MultiMooseEnum.
void clearSetValues()
Clear the MultiMooseEnum.
void reset()
Clear existing lists for re-initialization.
bool hasShowList()
False when the show lists for all variables is empty.
void setHasShowList(bool value)
Set the show list bool.
std::map< std::string, T >::iterator end()
bool contains(const std::string &name) const
A method for testing of a key exists.
std::map< std::string, T >::iterator find(const std::string &name)
A helper warehouse class for storing the "execute_on" settings for the various output types.
void buildInterfaceHideVariables(const std::string &output_name, std::set< std::string > &hide)
Return the list of hidden variables for the given output name.
ExecFlagEnum _execute_on
The common Execution types; this is used as the default execution type for everything except system i...
Definition Output.h:203
FEProblemBase * _problem_ptr
Pointer the the FEProblemBase object for output object (use this)
Definition Output.h:185
virtual bool shouldOutput()
Handles logic for determining if a step should be output.
Definition Output.C:272
bool _is_advanced
Flag for advanced output testing.
Definition Output.h:271
ExecFlagType _current_execute_flag
Current execute on flag.
Definition Output.h:211
libMesh::EquationSystems * _es_ptr
Reference the the libMesh::EquationSystems object that contains the data.
Definition Output.h:194
Real & _time
The current time for output purposes.
Definition Output.h:214
OutputOnWarehouse _advanced_execute_on
Storage for the individual component execute flags.
Definition Output.h:277
bool hasPostprocessorByName(const PostprocessorName &name) const
Determine if the Postprocessor data exists.
std::set< ReporterName > getReporterNames() const
Return a list of all reporter names.
bool hasReporterValueByName(const ReporterName &reporter_name) const
The Reporter system is comprised of objects that can contain any number of data values.
bool havePRefinement() const
Query whether p-refinement has been requested at any point during the simulation.
bool hasVectorPostprocessorByName(const VectorPostprocessorName &name, const std::string &vector_name) const
Determine if the VectorPostprocessor data exists by name.
GCC9 currently hits a "no type named 'value_type'" error during build if this is removed and iterator...
const MeshBase & get_mesh() const
static FEFieldType field_type(const FEType &fe_type)
unsigned int spatial_dimension() const
ExecFlagEnum getDefaultExecFlagEnum()
Definition MooseUtils.C:972
@ VAR_FIELD_ANY
Definition MooseTypes.h:781
@ VAR_ANY
Definition MooseTypes.h:772
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
A structure for storing the various lists that contain the names of the items to be exported.
std::set< std::string > show
User-supplied list of outputs to display.
std::set< std::string > available
A list of all possible outputs.
std::set< std::string > output
A list of the outputs to write.
std::set< std::string > hide
User-supplied list of outputs to hide.