https://mooseframework.inl.gov
SampledOutput.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 // MOOSE includes
11 #include "SampledOutput.h"
12 #include "FEProblem.h"
13 #include "DisplacedProblem.h"
14 #include "MooseApp.h"
15 #include "MoosePartitioner.h"
16 
17 #include "libmesh/distributed_mesh.h"
18 #include "libmesh/equation_systems.h"
19 #include "libmesh/mesh_function.h"
20 #include "libmesh/explicit_system.h"
21 
22 using namespace libMesh;
23 
26 {
27 
28  // Get the parameters from the parent object
30  params.addParam<unsigned int>("refinements",
31  0,
32  "Number of uniform refinements for oversampling "
33  "(refinement levels beyond any level of "
34  "refinements already applied on the regular mesh)");
35  params.addParam<Point>("position",
36  "Set a positional offset, this vector will get added to the "
37  "nodal coordinates to move the domain.");
38  params.addParam<MeshFileName>("file", "The name of the mesh file to read, for oversampling");
39  params.addParam<std::vector<SubdomainName>>(
40  "sampling_blocks", "The list of blocks to restrict the mesh sampling to");
41  params.addParam<bool>(
42  "serialize_sampling",
43  true,
44  "If set to true, all sampled output (see sampling parameters) will be done "
45  "on rank 0. This option is useful to debug suspected parallel output issues");
46 
47  // **** DEPRECATED PARAMETERS ****
48  params.addDeprecatedParam<bool>("append_oversample",
49  false,
50  "Append '_oversample' to the output file base",
51  "This parameter is deprecated. To append '_oversample' utilize "
52  "the output block name or the 'file_base'");
53 
54  // 'Oversampling' Group
55  params.addParamNamesToGroup("refinements position file sampling_blocks serialize_sampling",
56  "Modified Mesh Sampling");
57 
58  return params;
59 }
60 
62  : AdvancedOutput(parameters),
63  _refinements(getParam<unsigned int>("refinements")),
64  _using_external_sampling_file(isParamValid("file")),
65  _change_position(isParamValid("position")),
66  _use_sampled_output(_refinements > 0 || _using_external_sampling_file ||
67  isParamValid("sampling_blocks") || _change_position),
68  _position(_change_position ? getParam<Point>("position") : Point()),
69  _sampling_mesh_changed(true),
70  _mesh_subdomains_match(true),
71  _serialize(getParam<bool>("serialize_sampling"))
72 {
73 }
74 
75 void
77 {
79 
80  // Creates and initializes the sampling mesh
81  initSample();
82 }
83 
84 void
86 {
87  // Output is not allowed
88  if (!_allow_output && type != EXEC_FORCED)
89  return;
90 
91  // If recovering disable output of initial condition, it was already output
92  if (type == EXEC_INITIAL && _app.isRecovering())
93  return;
94 
95  // Return if the current output is not on the desired interval
96  if (type != EXEC_FINAL && !onInterval())
97  return;
98 
99  // store current simulation time
101 
102  // set current type
104 
105  // Call the output method
106  if (shouldOutput())
107  {
108  TIME_SECTION("outputStep", 2, "Outputting Step");
109  updateSample();
110  output();
111  }
112 
114 }
115 
117 {
118  // TODO: Remove once libmesh Issue #1184 is fixed
119  _sampling_es.reset();
120  _sampling_mesh_ptr.reset();
121 }
122 
123 void
125 {
126  _sampling_mesh_changed = true;
127 }
128 
129 void
131 {
132  // Perform the mesh cloning, if needed
133  if (!_use_sampled_output)
134  return;
135 
136  cloneMesh();
137 
138  // Re-position the sampling mesh
139  if (_change_position)
140  for (auto & node : _mesh_ptr->getMesh().node_ptr_range())
141  *node += _position;
142 
143  // Perform the mesh refinement
144  if (_refinements > 0)
145  {
146  MeshRefinement mesh_refinement(_mesh_ptr->getMesh());
147 
148  // We want original and refined partitioning to match so we can
149  // query from one to the other safely on distributed meshes.
151  mesh_refinement.uniformly_refine(_refinements);
152 
153  // Note that nodesets are not propagated with mesh refinement, unless you built the nodesets
154  // from the sidesets again, which is what happens for the regular mesh with initial refinement
155  }
156 
157  // We can't allow renumbering if we want to output multiple time
158  // steps to the same Exodus file
160 
161  // This should be called after changing the mesh (block restriction for example)
162  if (_change_position || (_refinements > 0) || isParamValid("sampling_blocks"))
163  _sampling_mesh_ptr->meshChanged();
164 
165  // Create the new EquationSystems
166  _sampling_es = std::make_unique<EquationSystems>(_mesh_ptr->getMesh());
167  _es_ptr = _sampling_es.get();
168 
169  // Reference the system from which we are copying
170  EquationSystems & source_es = _problem_ptr->es();
171 
172  // If we're going to be copying from that system later, we need to keep its
173  // original elements as ghost elements even if it gets grossly
174  // repartitioned, since we can't repartition the sample mesh to
175  // match.
176  // FIXME: this is not enough. It assumes our initial partition of the sampling mesh
177  // and the source mesh match. But that's usually only true in the 'refinement' case,
178  // not with an arbitrary sampling mesh file
179  DistributedMesh * dist_mesh = dynamic_cast<DistributedMesh *>(&source_es.get_mesh());
180  if (dist_mesh)
181  {
182  for (auto & elem : dist_mesh->active_local_element_ptr_range())
183  dist_mesh->add_extra_ghost_elem(elem);
184  }
185 
186  // Initialize the _mesh_functions vector
187  const auto num_systems = source_es.n_systems();
188  _mesh_functions.resize(num_systems);
189 
190  // Keep track of the variable numbering in both regular and sampled system
191  _variable_numbers_in_system.resize(num_systems);
192 
193  // Get the list of nodal and elemental output data
194  const auto & nodal_data = getNodalVariableOutput();
195  const auto & elemental_data = getElementalVariableOutput();
196 
197  // Loop over the number of systems
198  for (const auto sys_num : make_range(num_systems))
199  {
200  // Reference to the current system
201  const auto & source_sys = source_es.get_system(sys_num);
202 
203  // Add the system to the new EquationsSystems
204  ExplicitSystem & dest_sys = _sampling_es->add_system<ExplicitSystem>(source_sys.name());
205 
206  // Loop through the variables in the System
207  const auto num_vars = source_sys.n_vars();
208  unsigned int num_actual_vars = 0;
209  if (num_vars > 0)
210  {
211  if (_serialize)
213 
214  // Add the variables to the system... simultaneously creating MeshFunctions for them.
215  for (const auto var_num : make_range(num_vars))
216  {
217  // Is the variable supposed to be output?
218  const auto & var_name = source_sys.variable_name(var_num);
219  if (!nodal_data.count(var_name) && !elemental_data.count(var_name))
220  continue;
221  _variable_numbers_in_system[sys_num].push_back(var_num);
222  num_actual_vars++;
223 
224  // We do what we can to preserve the block restriction
225  const auto * const subdomains = (_using_external_sampling_file && !_mesh_subdomains_match)
226  ? nullptr
227  : &source_sys.variable(var_num).active_subdomains();
228 
229  // Add the variable. We essentially support nodal variables and constant monomials
230  const FEType & fe_type = source_sys.variable_type(var_num);
231  if (isSampledAtNodes(fe_type))
232  {
233  dest_sys.add_variable(source_sys.variable_name(var_num), fe_type, subdomains);
234  if (dist_mesh && !_serialize)
235  paramError("serialize_sampling",
236  "Variables sampled as nodal currently require serialization with a "
237  "distributed mesh.");
238  }
239  else
240  {
241  const auto & var_name = source_sys.variable_name(var_num);
242  if (fe_type != FEType(CONSTANT, MONOMIAL))
243  {
244  mooseInfoRepeated("Sampled output projects variable '" + var_name +
245  "' onto a constant monomial");
246  if (!_serialize)
247  paramWarning("serialize_sampling",
248  "Projection without serialization may fail with insufficient ghosting. "
249  "Consider setting 'serialize_sampling' to true.");
250  }
251  dest_sys.add_variable(var_name, FEType(CONSTANT, MONOMIAL), subdomains);
252  }
253  // Note: we could do more, using the generic projector. But exodus output of higher order
254  // or more exotic variables is limited anyway
255  }
256 
257  // Size for the actual number of variables output
258  _mesh_functions[sys_num].resize(num_actual_vars);
259  }
260  }
261 
262  // Initialize the newly created EquationSystem
263  _sampling_es->init();
264 }
265 
266 void
268 {
269  // Do nothing if oversampling and changing position are not enabled
270  if (!_use_sampled_output)
271  return;
272 
273  // We need the mesh functions to extend the whole domain so we serialize both the mesh and the
274  // solution. We need this because the partitioning of the sampling mesh may not match the
275  // partitioning of the source mesh
276  if (_serialize)
277  {
280  }
281 
282  // Get a reference to actual equation system
283  EquationSystems & source_es = _problem_ptr->es();
284  const auto num_systems = source_es.n_systems();
285 
286  // Loop through each system
287  for (const auto sys_num : make_range(num_systems))
288  {
289  if (!_mesh_functions[sys_num].empty())
290  {
291  // Get references to the source and destination systems
292  System & source_sys = source_es.get_system(sys_num);
293  System & dest_sys = _sampling_es->get_system(sys_num);
294 
295  // Update the solution for the sampling mesh
296  if (_serialize)
297  {
298  _serialized_solution->clear();
299  _serialized_solution->init(source_sys.n_dofs(), false, SERIAL);
300  // Pull down a full copy of this vector on every processor so we can get values in parallel
301  source_sys.solution->localize(*_serialized_solution);
302  }
303 
304  // Update the mesh functions
305  for (const auto var_num : index_range(_mesh_functions[sys_num]))
306  {
307  const auto original_var_num = _variable_numbers_in_system[sys_num][var_num];
308 
309  // If the mesh has changed, the MeshFunctions need to be re-built, otherwise simply clear it
310  // for re-initialization
311  // TODO: inherit from MeshChangedInterface and rebuild mesh functions on meshChanged()
312  if (!_mesh_functions[sys_num][var_num] || _sampling_mesh_changed)
313  _mesh_functions[sys_num][var_num] = std::make_unique<MeshFunction>(
314  source_es,
315  _serialize ? *_serialized_solution : *source_sys.solution,
316  source_sys.get_dof_map(),
317  original_var_num);
318  else
319  _mesh_functions[sys_num][var_num]->clear();
320 
321  // Initialize the MeshFunctions for application to the sampled solution
322  _mesh_functions[sys_num][var_num]->init();
323 
324  // Mesh functions are still defined on the original mesh, which might not fully overlap with
325  // the sampling mesh. We don't want to error with a libMesh assert on the out of mesh mode
326  _mesh_functions[sys_num][var_num]->enable_out_of_mesh_mode(-1e6);
327  }
328 
329  // Fill solution vectors by evaluating mesh functions on sampling mesh
330  for (const auto var_num : index_range(_mesh_functions[sys_num]))
331  {
332  // we serialized the mesh and the solution vector, we might as well just do this only on
333  // processor 0.
334  if (_serialize && processor_id() > 0)
335  break;
336 
337  const auto original_var_num = _variable_numbers_in_system[sys_num][var_num];
338  const FEType & fe_type = source_sys.variable_type(original_var_num);
339  // Loop over the mesh, nodes for nodal data, elements for element data
340  if (isSampledAtNodes(fe_type))
341  {
342  for (const auto & node : (_serialize ? _mesh_ptr->getMesh().node_ptr_range()
343  : _mesh_ptr->getMesh().local_node_ptr_range()))
344  {
345  // Avoid working on ghosted dofs
346  if (node->n_dofs(sys_num, var_num) &&
347  (_serialize || processor_id() == node->processor_id()))
348  {
349  // the node has to be within the domain of the mesh function
350  const auto value = (*_mesh_functions[sys_num][var_num])(*node - _position);
351  if (value != -1e6)
352  dest_sys.solution->set(node->dof_number(sys_num, var_num, /*comp=*/0), value);
353  else
354  mooseDoOnce(mooseWarning(
355  "Sampling at location ",
356  *node - _position,
357  " by process ",
358  std::to_string(processor_id()),
359  " was outside the problem mesh.\nThis message will not be repeated"));
360  }
361  }
362  }
363  else
364  {
365  const auto elem_range = _serialize
366  ? _mesh_ptr->getMesh().active_element_ptr_range()
367  : _mesh_ptr->getMesh().active_local_element_ptr_range();
368  for (const auto & elem : elem_range)
369  {
370  if (elem->n_dofs(sys_num, var_num) &&
371  (_serialize || processor_id() == elem->processor_id()))
372  {
373  const auto value =
374  (*_mesh_functions[sys_num][var_num])(elem->true_centroid() - _position);
375  if (value != -1e6)
376  dest_sys.solution->set(elem->dof_number(sys_num, var_num, /*comp=*/0), value);
377  else
378  mooseDoOnce(mooseWarning(
379  "Sampling at location ",
380  elem->true_centroid() - _position,
381  " was outside the problem mesh.\nThis message will not be repeated."));
382  }
383  }
384  }
385  }
386 
387  // We modified the solution vector directly, we have to close it
388  dest_sys.solution->close();
389  }
390  }
391 
392  // Set this to false so that new output files are not created, since the sampling mesh
393  // doesn't actually change
394  _sampling_mesh_changed = false;
395 }
396 
397 void
399 {
400  // Create the new mesh from a file
401  if (isParamValid("file"))
402  {
403  InputParameters mesh_params = _app.getFactory().getValidParams("FileMesh");
404  mesh_params.applyParameters(parameters(), {}, true);
405  mesh_params.set<bool>("nemesis") = false;
407  _app.getFactory().createUnique<MooseMesh>("FileMesh", "output_problem_mesh", mesh_params);
408  _sampling_mesh_ptr->allowRecovery(false); // We actually want to reread the initial mesh
409  _sampling_mesh_ptr->init();
410  }
411  // Clone the existing mesh
412  else
413  {
414  if (_app.isRecovering())
415  mooseWarning("Recovering or Restarting with oversampling may not work (especially with "
416  "adapted meshes)!! Refs #2295");
418  }
419 
420  // Remove unspecified blocks
421  if (isParamValid("sampling_blocks"))
422  {
423  // Remove all elements not in the blocks
424  const auto & blocks_to_keep_names = getParam<std::vector<SubdomainName>>("sampling_blocks");
425  const auto & blocks_to_keep = _sampling_mesh_ptr->getSubdomainIDs(blocks_to_keep_names);
426  for (const auto & elem_ptr : _sampling_mesh_ptr->getMesh().element_ptr_range())
427  if (std::find(blocks_to_keep.begin(), blocks_to_keep.end(), elem_ptr->subdomain_id()) ==
428  blocks_to_keep.end())
429  _sampling_mesh_ptr->getMesh().delete_elem(elem_ptr);
430 
431  // Deleting elements and isolated nodes would cause renumbering. Not renumbering might help
432  // user examining the sampling mesh and the regular mesh. Also if we end up partitioning the
433  // elements, the node partitioning is unlikely to match if the element numbering is different.
434  // Still not enough of a guarantee, because of deleted elements the node partitioning could be
435  // different. We will rely on ghosting to make it work
436  _sampling_mesh_ptr->getMesh().allow_renumbering(false);
437  }
438 
439  // Set a partitioner
440  if (!_serialize)
441  {
442  _sampling_mesh_ptr->setIsCustomPartitionerRequested(true);
443  InputParameters partition_params = _app.getFactory().getValidParams("CopyMeshPartitioner");
444  partition_params.set<MooseMesh *>("mesh") = _sampling_mesh_ptr.get();
445  partition_params.set<MooseMesh *>("source_mesh") = _mesh_ptr;
446  std::shared_ptr<MoosePartitioner> mp = _factory.create<MoosePartitioner>(
447  "CopyMeshPartitioner", "sampled_output_part", partition_params);
448  _sampling_mesh_ptr->setCustomPartitioner(mp.get());
449 
450  _sampling_mesh_ptr->getMesh().prepare_for_use();
451  // this should be called by prepare_for_use, but is not.
452  // it also requires a prior call to prepare_for_use()
453  mp->partition(_sampling_mesh_ptr->getMesh(), comm().size());
454  }
455 
456  // Prepare mesh, needed for the mesh functions
458  _sampling_mesh_ptr->prepare(/*mesh to clone*/ nullptr);
459  else if (_serialize && isParamValid("sampling_blocks"))
460  // TODO: constraints have not been initialized?
461  _sampling_mesh_ptr->getMesh().prepare_for_use();
462 
463  if (_serialize)
464  // we want to avoid re-partitioning, as we will serialize anyway
465  _sampling_mesh_ptr->getMesh().skip_partitioning(true);
466 
467  // Make sure that the mesh pointer points to the newly cloned mesh
469 
470  // Check the source and target mesh in case their subdomains match
471  const std::vector<SubdomainID> mesh_subdomain_ids_vec(_mesh_ptr->meshSubdomains().begin(),
472  _mesh_ptr->meshSubdomains().end());
473  const std::vector<SubdomainID> initial_mesh_subdomain_ids_vec(
477  _mesh_ptr->getSubdomainNames(mesh_subdomain_ids_vec) ==
478  _problem_ptr->mesh().getSubdomainNames(initial_mesh_subdomain_ids_vec));
480  mooseInfoRepeated("Variable block restriction disabled in sampled output due to non-matching "
481  "subdomain names and ids");
482 }
483 
484 void
485 SampledOutput::setFileBaseInternal(const std::string & file_base)
486 {
488  // ** DEPRECATED SUPPORT **
489  if (getParam<bool>("append_oversample"))
490  _file_base += "_oversample";
491 }
492 
493 bool
495 {
496  // This is the same criterion as in MooseVariableData
497  const auto continuity = FEInterface::get_continuity(fe_type);
498  return (continuity == C_ZERO || continuity == C_ONE);
499 }
virtual void setFileBaseInternal(const std::string &file_base)
Internal function that sets the file_base.
Definition: FileOutput.C:126
bool _use_sampled_output
Flag indicating that the sampled output should be used to re-sample the underlying EquationSystem of ...
Definition: SampledOutput.h:71
virtual void updateSample()
Performs the update of the solution vector for the sample/re-positioned mesh.
const bool _change_position
Flag for re-positioning.
Definition: SampledOutput.h:68
unsigned int n_systems() const
void addDeprecatedParam(const std::string &name, const T &value, const std::string &doc_string, const std::string &deprecation_message)
virtual void outputStep(const ExecFlagType &type) override
A single call to this function should output all the necessary data for a single timestep.
Definition: SampledOutput.C:85
const ExecFlagType EXEC_FORCED
Definition: Moose.C:43
void allow_renumbering(bool allow)
virtual bool onInterval()
Returns true if the output interval is satisfied.
Definition: Output.C:285
void skip_partitioning(bool skip)
SampledOutput(const InputParameters &parameters)
Definition: SampledOutput.C:61
const bool _using_external_sampling_file
Flag indicating another file is being used for the sampling.
Definition: SampledOutput.h:65
const ExecFlagType EXEC_NONE
Definition: Moose.C:27
T & set(const std::string &name, bool quiet_mode=false)
Returns a writable reference to the named parameters.
virtual void gather_to_zero()
void mooseInfoRepeated(Args &&... args)
Emit an informational message with the given stringified, concatenated args.
Definition: MooseError.h:377
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
void applyParameters(const InputParameters &common, const std::vector< std::string > &exclude={}, const bool allow_private=false)
Method for applying common parameters.
const Parallel::Communicator & comm() const
std::string _file_base
The base filename from the input paramaters.
Definition: FileOutput.h:89
virtual bool shouldOutput()
Handles logic for determining if a step should be output.
virtual void output()
A single call to this function should output all the necessary data for a single timestep.
virtual ~SampledOutput()
const Parallel::Communicator & _communicator
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
bool _mesh_subdomains_match
A flag tracking whether the sampling and source meshes match in terms of subdomains.
virtual void add_extra_ghost_elem(Elem *e)
const T_sys & get_system(std::string_view name) const
void mooseWarning(Args &&... args) const
Emits a warning prefixed with object name and type.
bool _serialize
Flag indicating whether we are outputting in serial or parallel.
dof_id_type n_dofs() const
Factory & getFactory()
Retrieve a writable reference to the Factory associated with this App.
Definition: MooseApp.h:424
std::unique_ptr< EquationSystems > _sampling_es
Equation system holding the solution vectors for the sampled variables.
bool isParamValid(const std::string &name) const
Test if the supplied parameter is valid.
Factory & _factory
The Factory associated with the MooseApp.
processor_id_type size() const
Real & _last_output_simulation_time
last simulation time an output has occured
Definition: Output.h:283
CONSTANT
SERIAL
virtual std::unique_ptr< Base > create()=0
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
MeshBase & getMesh()
Accessor for the underlying libMesh Mesh object.
Definition: MooseMesh.C:3443
std::vector< std::vector< unsigned int > > _variable_numbers_in_system
A vector of vectors that keeps track of the variable numbers in each system for each mesh function...
std::unique_ptr< MooseMesh > _sampling_mesh_ptr
Mesh used for sampling. The Output class&#39; _mesh_ptr will refer to this mesh if sampling is being used...
C_ZERO
ExecFlagType _current_execute_flag
Current execute on flag.
Definition: Output.h:211
void initSample()
Setups the output object to produce re-positioned and/or sampled results.
virtual libMesh::EquationSystems & es() override
FEProblemBase * _problem_ptr
Pointer the the FEProblemBase object for output object (use this)
Definition: Output.h:185
std::unique_ptr< NumericVector< Number > > solution
MooseMesh wraps a libMesh::Mesh object and enhances its capabilities by caching additional data and s...
Definition: MooseMesh.h:88
bool _allow_output
Flag for disabling output.
Definition: Output.h:271
const std::string & type() const
Get the type of this class.
Definition: MooseBase.h:51
unsigned int add_variable(std::string_view var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
virtual void meshChanged() override
Called on this object when the mesh changes.
MooseApp & _app
The MOOSE application this is associated with.
Definition: MooseBase.h:84
void paramError(const std::string &param, Args... args) const
Emits an error prefixed with the file and line number of the given param (from the input file) along ...
std::vector< SubdomainName > getSubdomainNames(const std::vector< SubdomainID > &subdomain_ids) const
Get the associated subdomainNames for the subdomain ids that are passed in.
Definition: MooseMesh.C:1764
const unsigned int _refinements
The number of oversampling refinements.
Definition: SampledOutput.h:62
MONOMIAL
Based class for output objects.
virtual void initialSetup()
Call init() method on setup.
const FEType & variable_type(const unsigned int i) const
Class for containing MooseEnum item information.
Definition: MooseEnumItem.h:18
virtual std::unique_ptr< MooseMesh > safeClone() const =0
A safer version of the clone() method that hands back an allocated object wrapped in a smart pointer...
C_ONE
Point _position
When oversampling, the output is shift by this amount.
Base class for MOOSE partitioner.
libMesh::EquationSystems * _es_ptr
Reference the the libMesh::EquationSystems object that contains the data.
Definition: Output.h:194
bool _sampling_mesh_changed
A flag indicating that the mesh has changed and the sampled mesh needs to be re-initialized.
const MeshBase & get_mesh() const
IntRange< T > make_range(T beg, T end)
virtual MooseMesh & mesh() override
MooseMesh * _mesh_ptr
A convenience pointer to the current mesh (reference or displaced depending on "use_displaced") ...
Definition: Output.h:197
const std::set< std::string > & getElementalVariableOutput()
The list of elemental nonlinear variables names that are set for output.
std::unique_ptr< NumericVector< Number > > _serialized_solution
Sample solution vector.
const InputParameters & parameters() const
Get the parameters of the object.
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.
void paramWarning(const std::string &param, Args... args) const
Emits a warning prefixed with the file and line number of the given param (from the input file) along...
static InputParameters validParams()
bool isSampledAtNodes(const FEType &fe_type) const
Used to decide which variable is sampled at nodes, then output as a nodal variable for (over)sampling...
unsigned int n_vars() const
processor_id_type processor_id() const
std::vector< std::vector< std::unique_ptr< libMesh::MeshFunction > > > _mesh_functions
A vector of pointers to the mesh functions on the sampled mesh This is only populated when the initSa...
bool isRecovering() const
Whether or not this is a "recover" calculation.
Definition: MooseApp.C:1795
const DofMap & get_dof_map() const
const ExecFlagType EXEC_FINAL
Definition: Moose.C:42
static InputParameters validParams()
Definition: SampledOutput.C:25
Real & _time
The current time for output purposes.
Definition: Output.h:214
void ErrorVector unsigned int
auto index_range(const T &sizable)
virtual void setFileBaseInternal(const std::string &file_base) override
Appends the base class&#39;s file base string.
const std::set< SubdomainID > & meshSubdomains() const
Returns a read-only reference to the set of subdomains currently present in the Mesh.
Definition: MooseMesh.C:3166
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 cloneMesh()
Clone mesh in preperation for re-positioning or oversampling.
virtual void initialSetup() override
Call init() method on setup.
Definition: SampledOutput.C:76
const ExecFlagType EXEC_INITIAL
Definition: Moose.C:28