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  // store current wall time of output
103  _last_output_wall_time = std::chrono::steady_clock::now();
104 
105  // set current type
107 
108  // Call the output method
109  if (shouldOutput())
110  {
111  TIME_SECTION("outputStep", 2, "Outputting Step");
112  updateSample();
113  output();
114  }
115 
117 }
118 
120 {
121  // TODO: Remove once libmesh Issue #1184 is fixed
122  _sampling_es.reset();
123  _sampling_mesh_ptr.reset();
124 }
125 
126 void
128 {
129  _sampling_mesh_changed = true;
130 }
131 
132 void
134 {
135  // Perform the mesh cloning, if needed
136  if (!_use_sampled_output)
137  return;
138 
139  cloneMesh();
140 
141  // Re-position the sampling mesh
142  if (_change_position)
143  for (auto & node : _mesh_ptr->getMesh().node_ptr_range())
144  *node += _position;
145 
146  // Perform the mesh refinement
147  if (_refinements > 0)
148  {
149  MeshRefinement mesh_refinement(_mesh_ptr->getMesh());
150 
151  // We want original and refined partitioning to match so we can
152  // query from one to the other safely on distributed meshes.
154  mesh_refinement.uniformly_refine(_refinements);
155 
156  // Note that nodesets are not propagated with mesh refinement, unless you built the nodesets
157  // from the sidesets again, which is what happens for the regular mesh with initial refinement
158  }
159 
160  // We can't allow renumbering if we want to output multiple time
161  // steps to the same Exodus file
163 
164  // This should be called after changing the mesh (block restriction for example)
165  if (_change_position || (_refinements > 0) || isParamValid("sampling_blocks"))
166  _sampling_mesh_ptr->meshChanged();
167 
168  // Create the new EquationSystems
169  _sampling_es = std::make_unique<EquationSystems>(_mesh_ptr->getMesh());
170  _es_ptr = _sampling_es.get();
171 
172  // Reference the system from which we are copying
173  EquationSystems & source_es = _problem_ptr->es();
174 
175  // If we're going to be copying from that system later, we need to keep its
176  // original elements as ghost elements even if it gets grossly
177  // repartitioned, since we can't repartition the sample mesh to
178  // match.
179  // FIXME: this is not enough. It assumes our initial partition of the sampling mesh
180  // and the source mesh match. But that's usually only true in the 'refinement' case,
181  // not with an arbitrary sampling mesh file
182  DistributedMesh * dist_mesh = dynamic_cast<DistributedMesh *>(&source_es.get_mesh());
183  if (dist_mesh)
184  {
185  for (auto & elem : dist_mesh->active_local_element_ptr_range())
186  dist_mesh->add_extra_ghost_elem(elem);
187  }
188 
189  // Initialize the _mesh_functions vector
190  const auto num_systems = source_es.n_systems();
191  _mesh_functions.resize(num_systems);
192 
193  // Keep track of the variable numbering in both regular and sampled system
194  _variable_numbers_in_system.resize(num_systems);
195 
196  // Get the list of nodal and elemental output data
197  const auto & nodal_data = getNodalVariableOutput();
198  const auto & elemental_data = getElementalVariableOutput();
199 
200  // Loop over the number of systems
201  for (const auto sys_num : make_range(num_systems))
202  {
203  // Reference to the current system
204  const auto & source_sys = source_es.get_system(sys_num);
205 
206  // Add the system to the new EquationsSystems
207  ExplicitSystem & dest_sys = _sampling_es->add_system<ExplicitSystem>(source_sys.name());
208 
209  // Loop through the variables in the System
210  const auto num_vars = source_sys.n_vars();
211  unsigned int num_actual_vars = 0;
212  if (num_vars > 0)
213  {
214  if (_serialize)
216 
217  // Add the variables to the system... simultaneously creating MeshFunctions for them.
218  for (const auto var_num : make_range(num_vars))
219  {
220  // Is the variable supposed to be output?
221  const auto & var_name = source_sys.variable_name(var_num);
222  if (!nodal_data.count(var_name) && !elemental_data.count(var_name))
223  continue;
224 
225  // We do what we can to preserve the block restriction
226  const std::set<SubdomainID> * subdomains;
227  std::set<SubdomainID> restricted_subdomains;
229  subdomains = nullptr;
230  else
231  {
232  subdomains = &source_sys.variable(var_num).active_subdomains();
233  // Reduce the block restriction if the output is block restricted
234  if (isParamValid("sampling_blocks") && !subdomains->empty())
235  {
236  const auto & sampling_blocks = _sampling_mesh_ptr->getSubdomainIDs(
237  getParam<std::vector<SubdomainName>>("sampling_blocks"));
238  set_intersection(subdomains->begin(),
239  subdomains->end(),
240  sampling_blocks.begin(),
241  sampling_blocks.end(),
242  std::inserter(restricted_subdomains, restricted_subdomains.begin()));
243  subdomains = &restricted_subdomains;
244 
245  // None of the subdomains are included in the sampling, might as well skip
246  if (subdomains->empty())
247  {
248  hideAdditionalVariable(nodal_data.count(var_name) ? "nodal" : "elemental", var_name);
249  continue;
250  }
251  }
252  }
253 
254  // We are going to add the variable, let's count it
255  _variable_numbers_in_system[sys_num].push_back(var_num);
256  num_actual_vars++;
257 
258  // Add the variable. We essentially support nodal variables and constant monomials
259  const FEType & fe_type = source_sys.variable_type(var_num);
260  if (isSampledAtNodes(fe_type))
261  {
262  dest_sys.add_variable(source_sys.variable_name(var_num), fe_type, subdomains);
263  if (dist_mesh && !_serialize)
264  paramError("serialize_sampling",
265  "Variables sampled as nodal currently require serialization with a "
266  "distributed mesh.");
267  }
268  else
269  {
270  const auto & var_name = source_sys.variable_name(var_num);
271  if (fe_type != FEType(CONSTANT, MONOMIAL))
272  {
273  mooseInfoRepeated("Sampled output projects variable '" + var_name +
274  "' onto a constant monomial");
275  if (!_serialize)
276  paramWarning("serialize_sampling",
277  "Projection without serialization may fail with insufficient ghosting. "
278  "Consider setting 'serialize_sampling' to true.");
279  }
280  dest_sys.add_variable(var_name, FEType(CONSTANT, MONOMIAL), subdomains);
281  }
282  // Note: we could do more, using the generic projector. But exodus output of higher order
283  // or more exotic variables is limited anyway
284  }
285 
286  // Size for the actual number of variables output
287  _mesh_functions[sys_num].resize(num_actual_vars);
288  }
289  }
290 
291  // Initialize the newly created EquationSystem
292  _sampling_es->init();
293 }
294 
295 void
297 {
298  // Do nothing if oversampling and changing position are not enabled
299  if (!_use_sampled_output)
300  return;
301 
302  // We need the mesh functions to extend the whole domain so we serialize both the mesh and the
303  // solution. We need this because the partitioning of the sampling mesh may not match the
304  // partitioning of the source mesh
305  if (_serialize)
306  {
309  }
310 
311  // Get a reference to actual equation system
312  EquationSystems & source_es = _problem_ptr->es();
313  const auto num_systems = source_es.n_systems();
314 
315  // Loop through each system
316  for (const auto sys_num : make_range(num_systems))
317  {
318  if (!_mesh_functions[sys_num].empty())
319  {
320  // Get references to the source and destination systems
321  System & source_sys = source_es.get_system(sys_num);
322  System & dest_sys = _sampling_es->get_system(sys_num);
323 
324  // Update the solution for the sampling mesh
325  if (_serialize)
326  {
327  _serialized_solution->clear();
328  _serialized_solution->init(source_sys.n_dofs(), false, SERIAL);
329  // Pull down a full copy of this vector on every processor so we can get values in
330  // parallel
331  source_sys.solution->localize(*_serialized_solution);
332  }
333 
334  // Update the mesh functions
335  for (const auto var_num : index_range(_mesh_functions[sys_num]))
336  {
337  const auto original_var_num = _variable_numbers_in_system[sys_num][var_num];
338 
339  // If the mesh has changed, the MeshFunctions need to be re-built, otherwise simply clear
340  // it for re-initialization
341  // TODO: inherit from MeshChangedInterface and rebuild mesh functions on meshChanged()
342  if (!_mesh_functions[sys_num][var_num] || _sampling_mesh_changed)
343  _mesh_functions[sys_num][var_num] = std::make_unique<MeshFunction>(
344  source_es,
345  _serialize ? *_serialized_solution : *source_sys.solution,
346  source_sys.get_dof_map(),
347  original_var_num);
348  else
349  _mesh_functions[sys_num][var_num]->clear();
350 
351  // Initialize the MeshFunctions for application to the sampled solution
352  _mesh_functions[sys_num][var_num]->init();
353 
354  // Mesh functions are still defined on the original mesh, which might not fully overlap
355  // with the sampling mesh. We don't want to error with a libMesh assert on the out of mesh
356  // mode
357  _mesh_functions[sys_num][var_num]->enable_out_of_mesh_mode(-1e6);
358  }
359 
360  // Fill solution vectors by evaluating mesh functions on sampling mesh
361  for (const auto var_num : index_range(_mesh_functions[sys_num]))
362  {
363  // we serialized the mesh and the solution vector, we might as well just do this only on
364  // processor 0.
365  if (_serialize && processor_id() > 0)
366  break;
367 
368  const auto original_var_num = _variable_numbers_in_system[sys_num][var_num];
369  const FEType & fe_type = source_sys.variable_type(original_var_num);
370  // we use the original variable block restriction for sampling
371  const auto * var_blocks = &source_sys.variable(original_var_num).active_subdomains();
372  // NOTE: if we have overlapping domains between the sampling mesh and the source mesh
373  // we would get a value from the source mesh domain. We could further restrict this
374  // block restriction with the sampling mesh block restriction to prevent this.
375 
376  // Loop over the mesh, nodes for nodal data, elements for element data
377  if (isSampledAtNodes(fe_type))
378  {
379  for (const auto & node : (_serialize ? _mesh_ptr->getMesh().node_ptr_range()
380  : _mesh_ptr->getMesh().local_node_ptr_range()))
381  {
382  // Avoid working on ghosted dofs
383  if (node->n_dofs(sys_num, var_num) &&
384  (_serialize || processor_id() == node->processor_id()))
385  {
386  // the node has to be within the domain of the mesh function
388  if (var_blocks->size())
389  (*_mesh_functions[sys_num][var_num])(
390  *node - _position, /*time*/ 0., value, var_blocks);
391  else
392  value[0] = (*_mesh_functions[sys_num][var_num])(*node - _position);
393 
394  if (value[0] != -1e6)
395  dest_sys.solution->set(node->dof_number(sys_num, var_num, /*comp=*/0), value[0]);
396  else
397  mooseDoOnce(mooseWarning(
398  "Sampling at location ",
399  *node - _position,
400  " by process ",
401  std::to_string(processor_id()),
402  " was outside the problem mesh.\nThis message will not be repeated"));
403  }
404  }
405  }
406  else
407  {
408  const auto elem_range = _serialize
409  ? _mesh_ptr->getMesh().active_element_ptr_range()
410  : _mesh_ptr->getMesh().active_local_element_ptr_range();
411  for (const auto & elem : elem_range)
412  {
413  if (elem->n_dofs(sys_num, var_num) &&
414  (_serialize || processor_id() == elem->processor_id()))
415  {
417  if (var_blocks->size())
418  (*_mesh_functions[sys_num][var_num])(
419  elem->true_centroid() - _position, /*time*/ 0., value, var_blocks);
420  else
421  value[0] = (*_mesh_functions[sys_num][var_num])(elem->true_centroid() - _position);
422 
423  if (value[0] != -1e6)
424  dest_sys.solution->set(elem->dof_number(sys_num, var_num, /*comp=*/0), value[0]);
425  else
426  mooseDoOnce(mooseWarning(
427  "Sampling at location ",
428  elem->true_centroid() - _position,
429  " was outside the problem mesh.\nThis message will not be repeated."));
430  }
431  }
432  }
433  }
434 
435  // We modified the solution vector directly, we have to close it
436  dest_sys.solution->close();
437  }
438  }
439 
440  // Set this to false so that new output files are not created, since the sampling mesh
441  // doesn't actually change
442  _sampling_mesh_changed = false;
443 }
444 
445 void
447 {
448  // Create the new mesh from a file
449  if (isParamValid("file"))
450  {
451  InputParameters mesh_params = _app.getFactory().getValidParams("FileMesh");
452  mesh_params.applyParameters(parameters(), {}, true);
453  mesh_params.set<bool>("nemesis") = false;
455  _app.getFactory().createUnique<MooseMesh>("FileMesh", "output_problem_mesh", mesh_params);
456  _sampling_mesh_ptr->allowRecovery(false); // We actually want to reread the initial mesh
457  _sampling_mesh_ptr->init();
458  }
459  // Clone the existing mesh
460  else
461  {
462  if (_app.isRecovering())
463  mooseWarning("Recovering or Restarting with oversampling may not work (especially with "
464  "adapted meshes)!! Refs #2295");
466  }
467 
468  // Remove unspecified blocks
469  if (isParamValid("sampling_blocks"))
470  {
471  // Remove all elements not in the blocks
472  const auto & blocks_to_keep_names = getParam<std::vector<SubdomainName>>("sampling_blocks");
473  const auto & blocks_to_keep = _sampling_mesh_ptr->getSubdomainIDs(blocks_to_keep_names);
474  for (const auto & elem_ptr : _sampling_mesh_ptr->getMesh().element_ptr_range())
475  if (std::find(blocks_to_keep.begin(), blocks_to_keep.end(), elem_ptr->subdomain_id()) ==
476  blocks_to_keep.end())
477  _sampling_mesh_ptr->getMesh().delete_elem(elem_ptr);
478 
479  // Deleting elements and isolated nodes would cause renumbering. Not renumbering might help
480  // user examining the sampling mesh and the regular mesh. Also if we end up partitioning the
481  // elements, the node partitioning is unlikely to match if the element numbering is different.
482  // Still not enough of a guarantee, because of deleted elements the node partitioning could be
483  // different. We will rely on ghosting to make it work
484  _sampling_mesh_ptr->getMesh().allow_renumbering(false);
485  }
486 
487  // Set a partitioner
488  if (!_serialize)
489  {
490  _sampling_mesh_ptr->setIsCustomPartitionerRequested(true);
491  InputParameters partition_params = _app.getFactory().getValidParams("CopyMeshPartitioner");
492  partition_params.set<MooseMesh *>("mesh") = _sampling_mesh_ptr.get();
493  partition_params.set<MooseMesh *>("source_mesh") = _mesh_ptr;
494  std::shared_ptr<MoosePartitioner> mp = _factory.create<MoosePartitioner>(
495  "CopyMeshPartitioner", "sampled_output_part", partition_params);
496  _sampling_mesh_ptr->setCustomPartitioner(mp.get());
497 
498  _sampling_mesh_ptr->getMesh().prepare_for_use();
499  // this should be called by prepare_for_use, but is not.
500  // it also requires a prior call to prepare_for_use()
501  mp->partition(_sampling_mesh_ptr->getMesh(), comm().size());
502  }
503 
504  // Prepare mesh, needed for the mesh functions
506  _sampling_mesh_ptr->prepare(/*mesh to clone*/ nullptr);
507  else if (_serialize && isParamValid("sampling_blocks"))
508  // TODO: constraints have not been initialized?
509  _sampling_mesh_ptr->getMesh().prepare_for_use();
510 
511  if (_serialize)
512  // we want to avoid re-partitioning, as we will serialize anyway
513  _sampling_mesh_ptr->getMesh().skip_partitioning(true);
514 
515  // Make sure that the mesh pointer points to the newly cloned mesh
517 
518  // Check the source and target mesh in case their subdomains match
519  const std::vector<SubdomainID> mesh_subdomain_ids_vec(_mesh_ptr->meshSubdomains().begin(),
520  _mesh_ptr->meshSubdomains().end());
521  const std::vector<SubdomainID> initial_mesh_subdomain_ids_vec(
525  _mesh_ptr->getSubdomainNames(mesh_subdomain_ids_vec) ==
526  _problem_ptr->mesh().getSubdomainNames(initial_mesh_subdomain_ids_vec));
528  mooseInfoRepeated("Variable block restriction disabled in sampled output due to non-matching "
529  "subdomain names and ids");
530 }
531 
532 void
533 SampledOutput::setFileBaseInternal(const std::string & file_base)
534 {
536  // ** DEPRECATED SUPPORT **
537  if (getParam<bool>("append_oversample"))
538  _file_base += "_oversample";
539 }
540 
541 bool
543 {
544  // This is the same criterion as in MooseVariableData
545  const auto continuity = FEInterface::get_continuity(fe_type);
546  return (continuity == C_ZERO || continuity == C_ONE);
547 }
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.
KOKKOS_INLINE_FUNCTION const T * find(const T &target, const T *const begin, const T *const end)
Find a value in an array.
Definition: KokkosUtils.h:40
const 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
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 ...
Definition: MooseBase.h:467
const T & getParam(const std::string &name) const
Retrieve a parameter for the object.
Definition: MooseBase.h:416
const ExecFlagType EXEC_FORCED
Definition: Moose.C:47
void allow_renumbering(bool allow)
virtual bool onInterval()
Returns true if the output interval is satisfied.
Definition: Output.C:276
void skip_partitioning(bool skip)
SampledOutput(const InputParameters &parameters)
Definition: SampledOutput.C:61
Factory & _factory
The Factory associated with the MooseApp.
const bool _using_external_sampling_file
Flag indicating another file is being used for the sampling.
Definition: SampledOutput.h:65
const InputParameters & parameters() const
Get the parameters of the object.
Definition: MooseBase.h:131
const ExecFlagType EXEC_NONE
Definition: Moose.C:29
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:409
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
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:406
std::unique_ptr< EquationSystems > _sampling_es
Equation system holding the solution vectors for the sampled variables.
processor_id_type size() const
void mooseWarning(Args &&... args) const
Real & _last_output_simulation_time
last simulation time an output has occured
Definition: Output.h:280
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:3575
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:93
bool _allow_output
Flag for disabling output.
Definition: Output.h:268
const std::string & type() const
Get the type of this class.
Definition: MooseBase.h:93
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:385
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:1791
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
std::chrono::time_point< std::chrono::steady_clock > _last_output_wall_time
last wall time an output has occured
Definition: Output.h:283
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.
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.
bool isParamValid(const std::string &name) const
Test if the supplied parameter is valid.
Definition: MooseBase.h:209
void paramWarning(const std::string &param, Args... args) const
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:1493
const DofMap & get_dof_map() const
const ExecFlagType EXEC_FINAL
Definition: Moose.C:46
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:3298
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:30