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 
222  // We do what we can to preserve the block restriction
223  const std::set<SubdomainID> * subdomains;
224  std::set<SubdomainID> restricted_subdomains;
226  subdomains = nullptr;
227  else
228  {
229  subdomains = &source_sys.variable(var_num).active_subdomains();
230  // Reduce the block restriction if the output is block restricted
231  if (isParamValid("sampling_blocks") && !subdomains->empty())
232  {
233  const auto & sampling_blocks = _sampling_mesh_ptr->getSubdomainIDs(
234  getParam<std::vector<SubdomainName>>("sampling_blocks"));
235  set_intersection(subdomains->begin(),
236  subdomains->end(),
237  sampling_blocks.begin(),
238  sampling_blocks.end(),
239  std::inserter(restricted_subdomains, restricted_subdomains.begin()));
240  subdomains = &restricted_subdomains;
241 
242  // None of the subdomains are included in the sampling, might as well skip
243  if (subdomains->empty())
244  {
245  hideAdditionalVariable(nodal_data.count(var_name) ? "nodal" : "elemental", var_name);
246  continue;
247  }
248  }
249  }
250 
251  // We are going to add the variable, let's count it
252  _variable_numbers_in_system[sys_num].push_back(var_num);
253  num_actual_vars++;
254 
255  // Add the variable. We essentially support nodal variables and constant monomials
256  const FEType & fe_type = source_sys.variable_type(var_num);
257  if (isSampledAtNodes(fe_type))
258  {
259  dest_sys.add_variable(source_sys.variable_name(var_num), fe_type, subdomains);
260  if (dist_mesh && !_serialize)
261  paramError("serialize_sampling",
262  "Variables sampled as nodal currently require serialization with a "
263  "distributed mesh.");
264  }
265  else
266  {
267  const auto & var_name = source_sys.variable_name(var_num);
268  if (fe_type != FEType(CONSTANT, MONOMIAL))
269  {
270  mooseInfoRepeated("Sampled output projects variable '" + var_name +
271  "' onto a constant monomial");
272  if (!_serialize)
273  paramWarning("serialize_sampling",
274  "Projection without serialization may fail with insufficient ghosting. "
275  "Consider setting 'serialize_sampling' to true.");
276  }
277  dest_sys.add_variable(var_name, FEType(CONSTANT, MONOMIAL), subdomains);
278  }
279  // Note: we could do more, using the generic projector. But exodus output of higher order
280  // or more exotic variables is limited anyway
281  }
282 
283  // Size for the actual number of variables output
284  _mesh_functions[sys_num].resize(num_actual_vars);
285  }
286  }
287 
288  // Initialize the newly created EquationSystem
289  _sampling_es->init();
290 }
291 
292 void
294 {
295  // Do nothing if oversampling and changing position are not enabled
296  if (!_use_sampled_output)
297  return;
298 
299  // We need the mesh functions to extend the whole domain so we serialize both the mesh and the
300  // solution. We need this because the partitioning of the sampling mesh may not match the
301  // partitioning of the source mesh
302  if (_serialize)
303  {
306  }
307 
308  // Get a reference to actual equation system
309  EquationSystems & source_es = _problem_ptr->es();
310  const auto num_systems = source_es.n_systems();
311 
312  // Loop through each system
313  for (const auto sys_num : make_range(num_systems))
314  {
315  if (!_mesh_functions[sys_num].empty())
316  {
317  // Get references to the source and destination systems
318  System & source_sys = source_es.get_system(sys_num);
319  System & dest_sys = _sampling_es->get_system(sys_num);
320 
321  // Update the solution for the sampling mesh
322  if (_serialize)
323  {
324  _serialized_solution->clear();
325  _serialized_solution->init(source_sys.n_dofs(), false, SERIAL);
326  // Pull down a full copy of this vector on every processor so we can get values in
327  // parallel
328  source_sys.solution->localize(*_serialized_solution);
329  }
330 
331  // Update the mesh functions
332  for (const auto var_num : index_range(_mesh_functions[sys_num]))
333  {
334  const auto original_var_num = _variable_numbers_in_system[sys_num][var_num];
335 
336  // If the mesh has changed, the MeshFunctions need to be re-built, otherwise simply clear
337  // it for re-initialization
338  // TODO: inherit from MeshChangedInterface and rebuild mesh functions on meshChanged()
339  if (!_mesh_functions[sys_num][var_num] || _sampling_mesh_changed)
340  _mesh_functions[sys_num][var_num] = std::make_unique<MeshFunction>(
341  source_es,
342  _serialize ? *_serialized_solution : *source_sys.solution,
343  source_sys.get_dof_map(),
344  original_var_num);
345  else
346  _mesh_functions[sys_num][var_num]->clear();
347 
348  // Initialize the MeshFunctions for application to the sampled solution
349  _mesh_functions[sys_num][var_num]->init();
350 
351  // Mesh functions are still defined on the original mesh, which might not fully overlap
352  // with the sampling mesh. We don't want to error with a libMesh assert on the out of mesh
353  // mode
354  _mesh_functions[sys_num][var_num]->enable_out_of_mesh_mode(-1e6);
355  }
356 
357  // Fill solution vectors by evaluating mesh functions on sampling mesh
358  for (const auto var_num : index_range(_mesh_functions[sys_num]))
359  {
360  // we serialized the mesh and the solution vector, we might as well just do this only on
361  // processor 0.
362  if (_serialize && processor_id() > 0)
363  break;
364 
365  const auto original_var_num = _variable_numbers_in_system[sys_num][var_num];
366  const FEType & fe_type = source_sys.variable_type(original_var_num);
367  // we use the original variable block restriction for sampling
368  const auto * var_blocks = &source_sys.variable(original_var_num).active_subdomains();
369  // NOTE: if we have overlapping domains between the sampling mesh and the source mesh
370  // we would get a value from the source mesh domain. We could further restrict this
371  // block restriction with the sampling mesh block restriction to prevent this.
372 
373  // Loop over the mesh, nodes for nodal data, elements for element data
374  if (isSampledAtNodes(fe_type))
375  {
376  for (const auto & node : (_serialize ? _mesh_ptr->getMesh().node_ptr_range()
377  : _mesh_ptr->getMesh().local_node_ptr_range()))
378  {
379  // Avoid working on ghosted dofs
380  if (node->n_dofs(sys_num, var_num) &&
381  (_serialize || processor_id() == node->processor_id()))
382  {
383  // the node has to be within the domain of the mesh function
385  if (var_blocks->size())
386  (*_mesh_functions[sys_num][var_num])(
387  *node - _position, /*time*/ 0., value, var_blocks);
388  else
389  value[0] = (*_mesh_functions[sys_num][var_num])(*node - _position);
390 
391  if (value[0] != -1e6)
392  dest_sys.solution->set(node->dof_number(sys_num, var_num, /*comp=*/0), value[0]);
393  else
394  mooseDoOnce(mooseWarning(
395  "Sampling at location ",
396  *node - _position,
397  " by process ",
398  std::to_string(processor_id()),
399  " was outside the problem mesh.\nThis message will not be repeated"));
400  }
401  }
402  }
403  else
404  {
405  const auto elem_range = _serialize
406  ? _mesh_ptr->getMesh().active_element_ptr_range()
407  : _mesh_ptr->getMesh().active_local_element_ptr_range();
408  for (const auto & elem : elem_range)
409  {
410  if (elem->n_dofs(sys_num, var_num) &&
411  (_serialize || processor_id() == elem->processor_id()))
412  {
414  if (var_blocks->size())
415  (*_mesh_functions[sys_num][var_num])(
416  elem->true_centroid() - _position, /*time*/ 0., value, var_blocks);
417  else
418  value[0] = (*_mesh_functions[sys_num][var_num])(elem->true_centroid() - _position);
419 
420  if (value[0] != -1e6)
421  dest_sys.solution->set(elem->dof_number(sys_num, var_num, /*comp=*/0), value[0]);
422  else
423  mooseDoOnce(mooseWarning(
424  "Sampling at location ",
425  elem->true_centroid() - _position,
426  " was outside the problem mesh.\nThis message will not be repeated."));
427  }
428  }
429  }
430  }
431 
432  // We modified the solution vector directly, we have to close it
433  dest_sys.solution->close();
434  }
435  }
436 
437  // Set this to false so that new output files are not created, since the sampling mesh
438  // doesn't actually change
439  _sampling_mesh_changed = false;
440 }
441 
442 void
444 {
445  // Create the new mesh from a file
446  if (isParamValid("file"))
447  {
448  InputParameters mesh_params = _app.getFactory().getValidParams("FileMesh");
449  mesh_params.applyParameters(parameters(), {}, true);
450  mesh_params.set<bool>("nemesis") = false;
452  _app.getFactory().createUnique<MooseMesh>("FileMesh", "output_problem_mesh", mesh_params);
453  _sampling_mesh_ptr->allowRecovery(false); // We actually want to reread the initial mesh
454  _sampling_mesh_ptr->init();
455  }
456  // Clone the existing mesh
457  else
458  {
459  if (_app.isRecovering())
460  mooseWarning("Recovering or Restarting with oversampling may not work (especially with "
461  "adapted meshes)!! Refs #2295");
463  }
464 
465  // Remove unspecified blocks
466  if (isParamValid("sampling_blocks"))
467  {
468  // Remove all elements not in the blocks
469  const auto & blocks_to_keep_names = getParam<std::vector<SubdomainName>>("sampling_blocks");
470  const auto & blocks_to_keep = _sampling_mesh_ptr->getSubdomainIDs(blocks_to_keep_names);
471  for (const auto & elem_ptr : _sampling_mesh_ptr->getMesh().element_ptr_range())
472  if (std::find(blocks_to_keep.begin(), blocks_to_keep.end(), elem_ptr->subdomain_id()) ==
473  blocks_to_keep.end())
474  _sampling_mesh_ptr->getMesh().delete_elem(elem_ptr);
475 
476  // Deleting elements and isolated nodes would cause renumbering. Not renumbering might help
477  // user examining the sampling mesh and the regular mesh. Also if we end up partitioning the
478  // elements, the node partitioning is unlikely to match if the element numbering is different.
479  // Still not enough of a guarantee, because of deleted elements the node partitioning could be
480  // different. We will rely on ghosting to make it work
481  _sampling_mesh_ptr->getMesh().allow_renumbering(false);
482  }
483 
484  // Set a partitioner
485  if (!_serialize)
486  {
487  _sampling_mesh_ptr->setIsCustomPartitionerRequested(true);
488  InputParameters partition_params = _app.getFactory().getValidParams("CopyMeshPartitioner");
489  partition_params.set<MooseMesh *>("mesh") = _sampling_mesh_ptr.get();
490  partition_params.set<MooseMesh *>("source_mesh") = _mesh_ptr;
491  std::shared_ptr<MoosePartitioner> mp = _factory.create<MoosePartitioner>(
492  "CopyMeshPartitioner", "sampled_output_part", partition_params);
493  _sampling_mesh_ptr->setCustomPartitioner(mp.get());
494 
495  _sampling_mesh_ptr->getMesh().prepare_for_use();
496  // this should be called by prepare_for_use, but is not.
497  // it also requires a prior call to prepare_for_use()
498  mp->partition(_sampling_mesh_ptr->getMesh(), comm().size());
499  }
500 
501  // Prepare mesh, needed for the mesh functions
503  _sampling_mesh_ptr->prepare(/*mesh to clone*/ nullptr);
504  else if (_serialize && isParamValid("sampling_blocks"))
505  // TODO: constraints have not been initialized?
506  _sampling_mesh_ptr->getMesh().prepare_for_use();
507 
508  if (_serialize)
509  // we want to avoid re-partitioning, as we will serialize anyway
510  _sampling_mesh_ptr->getMesh().skip_partitioning(true);
511 
512  // Make sure that the mesh pointer points to the newly cloned mesh
514 
515  // Check the source and target mesh in case their subdomains match
516  const std::vector<SubdomainID> mesh_subdomain_ids_vec(_mesh_ptr->meshSubdomains().begin(),
517  _mesh_ptr->meshSubdomains().end());
518  const std::vector<SubdomainID> initial_mesh_subdomain_ids_vec(
522  _mesh_ptr->getSubdomainNames(mesh_subdomain_ids_vec) ==
523  _problem_ptr->mesh().getSubdomainNames(initial_mesh_subdomain_ids_vec));
525  mooseInfoRepeated("Variable block restriction disabled in sampled output due to non-matching "
526  "subdomain names and ids");
527 }
528 
529 void
530 SampledOutput::setFileBaseInternal(const std::string & file_base)
531 {
533  // ** DEPRECATED SUPPORT **
534  if (getParam<bool>("append_oversample"))
535  _file_base += "_oversample";
536 }
537 
538 bool
540 {
541  // This is the same criterion as in MooseVariableData
542  const auto continuity = FEInterface::get_continuity(fe_type);
543  return (continuity == C_ZERO || continuity == C_ONE);
544 }
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
const Variable & variable(unsigned int var) 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:45
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:427
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
const std::set< subdomain_id_type > & active_subdomains() const
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:3446
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
const T & getParam(const std::string &name) const
Retrieve a parameter for the object.
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:1767
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...
void hideAdditionalVariable(const std::string &category, const std::string &var_name)
Add an additional variable to the hide list.
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:1811
const DofMap & get_dof_map() const
const ExecFlagType EXEC_FINAL
Definition: Moose.C:44
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:3169
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