https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
22using 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
75void
77{
79
80 // Creates and initializes the sampling mesh
81 initSample();
82}
83
84void
86{
87 // Output is not allowed
89 return;
90
91 // If recovering disable output of initial condition, it was already output
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
126void
131
132void
134{
135 // Perform the mesh cloning, if needed
137 return;
138
139 cloneMesh();
140
141 // Re-position the sampling mesh
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
295void
297{
298 // Do nothing if oversampling and changing position are not enabled
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 {
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,
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
387 DenseVector<Real> value(1);
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 {
416 DenseVector<Real> value(1);
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
443}
444
445void
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
532void
533SampledOutput::setFileBaseInternal(const std::string & file_base)
534{
536 // ** DEPRECATED SUPPORT **
537 if (getParam<bool>("append_oversample"))
538 _file_base += "_oversample";
539}
540
541bool
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}
void mooseInfoRepeated(Args &&... args)
Emit an informational message with the given stringified, concatenated args.
Definition MooseError.h:409
void mooseWarning(Args &&... args)
Emit a warning message with the given stringified, concatenated args.
Definition MooseError.h:345
const ExecFlagType EXEC_FORCED
Definition Moose.C:49
const ExecFlagType EXEC_INITIAL
Definition Moose.C:30
const ExecFlagType EXEC_NONE
Definition Moose.C:29
const ExecFlagType EXEC_FINAL
Definition Moose.C:48
void ErrorVector unsigned int
Based class for output objects.
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 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.
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.
static InputParameters validParams()
virtual libMesh::EquationSystems & es() override
virtual MooseMesh & mesh() override
std::string _file_base
The base filename from the input paramaters.
Definition FileOutput.h:89
virtual void setFileBaseInternal(const std::string &file_base)
Internal function that sets the file_base.
Definition FileOutput.C:126
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)
T & set(const std::string &name, bool quiet_mode=false)
Returns a writable reference to the named parameters.
void applyParameters(const InputParameters &common, const std::vector< std::string > &exclude={}, const bool allow_private=false)
Method for applying common parameters.
Factory & getFactory()
Retrieve a writable reference to the Factory associated with this App.
Definition MooseApp.h:407
bool isRecovering() const
Whether or not this is a "recover" calculation.
Definition MooseApp.C:1669
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
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:457
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
Class for containing MooseEnum item information.
MooseMesh wraps a libMesh::Mesh object and enhances its capabilities by caching additional data and s...
Definition MooseMesh.h:95
void allowRecovery(bool allow)
Set whether or not this mesh is allowed to read a recovery file.
Definition MooseMesh.h:1173
MeshBase & getMesh()
Accessor for the underlying libMesh Mesh object.
Definition MooseMesh.C:3549
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:1757
const std::set< SubdomainID > & meshSubdomains() const
Returns a read-only reference to the set of subdomains currently present in the Mesh.
Definition MooseMesh.C:3272
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.
MooseApp & _app
The MOOSE application this is associated with.
Definition MooseBase.h:375
Base class for MOOSE partitioner.
bool _allow_output
Flag for disabling output.
Definition Output.h:268
FEProblemBase * _problem_ptr
Pointer the the FEProblemBase object for output object (use this)
Definition Output.h:185
ExecFlagType _current_execute_flag
Current execute on flag.
Definition Output.h:211
virtual bool onInterval()
Returns true if the output interval is satisfied.
Definition Output.C:280
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
Real & _last_output_simulation_time
last simulation time an output has occured
Definition Output.h:280
MooseMesh * _mesh_ptr
A convenience pointer to the current mesh (reference or displaced depending on "use_displaced")
Definition Output.h:197
std::chrono::time_point< std::chrono::steady_clock > _last_output_wall_time
last wall time an output has occured
Definition Output.h:283
Factory & _factory
The Factory associated with the MooseApp.
bool _use_sampled_output
Flag indicating that the sampled output should be used to re-sample the underlying EquationSystem of ...
std::unique_ptr< EquationSystems > _sampling_es
Equation system holding the solution vectors for the sampled variables.
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...
virtual void outputStep(const ExecFlagType &type) override
A single call to this function should output all the necessary data for a single timestep.
void cloneMesh()
Clone mesh in preperation for re-positioning or oversampling.
bool _sampling_mesh_changed
A flag indicating that the mesh has changed and the sampled mesh needs to be re-initialized.
const bool _using_external_sampling_file
Flag indicating another file is being used for the sampling.
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...
std::unique_ptr< NumericVector< Number > > _serialized_solution
Sample solution vector.
void initSample()
Setups the output object to produce re-positioned and/or sampled results.
const unsigned int _refinements
The number of oversampling refinements.
virtual void setFileBaseInternal(const std::string &file_base) override
Appends the base class's file base string.
virtual void updateSample()
Performs the update of the solution vector for the sample/re-positioned mesh.
bool _mesh_subdomains_match
A flag tracking whether the sampling and source meshes match in terms of subdomains.
const bool _change_position
Flag for re-positioning.
virtual ~SampledOutput()
virtual void initialSetup() override
Call init() method on setup.
bool _serialize
Flag indicating whether we are outputting in serial or parallel.
virtual void meshChanged() override
Called on this object when the mesh changes.
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' _mesh_ptr will refer to this mesh if sampling is being used...
Point _position
When oversampling, the output is shift by this amount.
static InputParameters validParams()
SampledOutput(const InputParameters &parameters)
void paramWarning(const std::string &param, Args... args) const
processor_id_type size() const
virtual void add_extra_ghost_elem(Elem *e)
unsigned int n_systems() const
const MeshBase & get_mesh() const
const T_sys & get_system(std::string_view name) const
static FEContinuity get_continuity(const FEType &fe_type)
virtual std::unique_ptr< Base > create()=0
void allow_renumbering(bool allow)
virtual void gather_to_zero()
void skip_partitioning(bool skip)
void uniformly_refine(unsigned int n=1)
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, SolverPackage solver_package=libMesh::default_solver_package(), ParallelType parallel_type=AUTOMATIC)
const Parallel::Communicator & _communicator
processor_id_type processor_id() const
const Parallel::Communicator & comm() const
virtual void partition(MeshBase &mesh, const unsigned int n)
const Variable & variable(unsigned int var) const
dof_id_type n_dofs() const
const FEType & variable_type(const unsigned int i) const
unsigned int add_variable(std::string_view var, const FEType &type, const std::set< subdomain_id_type > *const active_subdomains=nullptr)
virtual void clear()
std::unique_ptr< NumericVector< Number > > solution
unsigned int n_vars() const
const DofMap & get_dof_map() const
const std::set< subdomain_id_type > & active_subdomains() const
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
auto index_range(const T &sizable)
IntRange< T > make_range(T beg, T end)