https://mooseframework.inl.gov
Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
SamplerBase Class Reference

Base class for VectorPostprocessors that need to do "sampling" of values in the domain. More...

#include <SamplerBase.h>

Inheritance diagram for SamplerBase:
[legend]

Public Member Functions

 SamplerBase (const InputParameters &parameters, VectorPostprocessor *vpp, const libMesh::Parallel::Communicator &comm)
 
virtual ~SamplerBase ()=default
 

Static Public Member Functions

static InputParameters validParams ()
 

Protected Member Functions

void setupVariables (const std::vector< std::string > &variable_names)
 You MUST call this in the constructor of the child class and pass down the name of the variables. More...
 
void checkForStandardFieldVariableType (const MooseVariableFieldBase *const var_ptr, const std::string &var_param_name="variable") const
 Checks whether the passed variable pointer corresponds to a regular single-valued field variable. More...
 
virtual void addSample (const Point &p, const Real &id, const std::vector< Real > &values)
 Call this with the value of every variable at each point you want to sample at. More...
 
virtual void initialize ()
 Initialize the datastructures. More...
 
virtual void finalize ()
 Finalize the values. More...
 
virtual void threadJoin (const SamplerBase &y)
 Join the values. More...
 

Protected Attributes

const InputParameters_sampler_params
 The child params. More...
 
VectorPostprocessor_vpp
 The child VectorPostprocessor. More...
 
const libMesh::Parallel::Communicator_comm
 The communicator of the child. More...
 
std::vector< std::string > _variable_names
 The variable names. More...
 
const unsigned int _sort_by
 What to sort by. More...
 
VectorPostprocessorValue_x
 x coordinate of the points More...
 
VectorPostprocessorValue_y
 y coordinate of the points More...
 
VectorPostprocessorValue_z
 x coordinate of the points More...
 
VectorPostprocessorValue_id
 The node ID of each point. More...
 
std::vector< VectorPostprocessorValue * > _values
 

Detailed Description

Base class for VectorPostprocessors that need to do "sampling" of values in the domain.

Definition at line 36 of file SamplerBase.h.

Constructor & Destructor Documentation

◆ SamplerBase()

SamplerBase::SamplerBase ( const InputParameters parameters,
VectorPostprocessor vpp,
const libMesh::Parallel::Communicator comm 
)
Parameters
parametersThe parameters for the object
vppA pointer to the child object
commThe communicator of the child

Definition at line 38 of file SamplerBase.C.

41  : _sampler_params(parameters),
42  _vpp(vpp),
43  _comm(comm),
44  _sort_by(parameters.get<MooseEnum>("sort_by")),
45  _x(vpp->declareVector("x")),
46  _y(vpp->declareVector("y")),
47  _z(vpp->declareVector("z")),
48  _id(vpp->declareVector("id"))
49 {
50 }
std::vector< std::pair< R1, R2 > > get(const std::string &param1, const std::string &param2) const
Combine two vector parameters into a single vector of pairs.
VectorPostprocessorValue & _y
y coordinate of the points
Definition: SamplerBase.h:120
const unsigned int _sort_by
What to sort by.
Definition: SamplerBase.h:115
VectorPostprocessor * _vpp
The child VectorPostprocessor.
Definition: SamplerBase.h:106
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:33
VectorPostprocessorValue & declareVector(const std::string &vector_name)
Register a new vector to fill up.
VectorPostprocessorValue & _x
x coordinate of the points
Definition: SamplerBase.h:118
const InputParameters & _sampler_params
The child params.
Definition: SamplerBase.h:103
VectorPostprocessorValue & _id
The node ID of each point.
Definition: SamplerBase.h:125
VectorPostprocessorValue & _z
x coordinate of the points
Definition: SamplerBase.h:122
const libMesh::Parallel::Communicator & _comm
The communicator of the child.
Definition: SamplerBase.h:109

◆ ~SamplerBase()

virtual SamplerBase::~SamplerBase ( )
virtualdefault

Member Function Documentation

◆ addSample()

void SamplerBase::addSample ( const Point &  p,
const Real id,
const std::vector< Real > &  values 
)
protectedvirtual

Call this with the value of every variable at each point you want to sample at.

Parameters
pThe point where you took the sample
idThis can either be an actual ID or a distance or anything else you want
valuesThe value of each variable

Definition at line 63 of file SamplerBase.C.

Referenced by SideValueSampler::execute(), LineFunctionSampler::execute(), ElementValueSampler::execute(), NodalValueSampler::execute(), and PointSamplerBase::finalize().

64 {
65  _x.push_back(p(0));
66  _y.push_back(p(1));
67  _z.push_back(p(2));
68 
69  _id.push_back(id);
70 
71  mooseAssert(values.size() == _variable_names.size(), "Mismatch of variable names to vector size");
72  for (MooseIndex(values) i = 0; i < values.size(); ++i)
73  _values[i]->emplace_back(values[i]);
74 }
std::vector< std::string > _variable_names
The variable names.
Definition: SamplerBase.h:112
VectorPostprocessorValue & _y
y coordinate of the points
Definition: SamplerBase.h:120
std::vector< VectorPostprocessorValue * > _values
Definition: SamplerBase.h:127
VectorPostprocessorValue & _x
x coordinate of the points
Definition: SamplerBase.h:118
VectorPostprocessorValue & _id
The node ID of each point.
Definition: SamplerBase.h:125
VectorPostprocessorValue & _z
x coordinate of the points
Definition: SamplerBase.h:122

◆ checkForStandardFieldVariableType()

void SamplerBase::checkForStandardFieldVariableType ( const MooseVariableFieldBase *const  var_ptr,
const std::string &  var_param_name = "variable" 
) const
protected

Checks whether the passed variable pointer corresponds to a regular single-valued field variable.

Parameters
var_param_namename of the variable parameter in which the variables were passed
var_ptrpointer to the field variable

Definition at line 93 of file SamplerBase.C.

Referenced by ElementValueSampler::ElementValueSampler(), NodalValueSampler::NodalValueSampler(), PointVariableSamplerBase::PointVariableSamplerBase(), and SideValueSampler::SideValueSampler().

95 {
96  // A pointer to a MooseVariableFieldBase should never be SCALAR
97  mooseAssert(var_ptr->feType().family != SCALAR,
98  "Scalar variable '" + var_ptr->name() + "' cannot be sampled.");
99  mooseAssert(dynamic_cast<const MooseObject *>(_vpp), "Should have succeeded");
100  if (var_ptr->isVector())
101  dynamic_cast<const MooseObject *>(_vpp)->paramError(
102  var_param_name,
103  "The variable '",
104  var_ptr->name(),
105  "' is a vector variable. Sampling those is not currently supported in the "
106  "framework. It may be supported using a dedicated object in your application. Use "
107  "'VectorVariableComponentAux' auxkernel to copy those values into a regular field "
108  "variable");
109  if (var_ptr->isArray())
110  dynamic_cast<const MooseObject *>(_vpp)->paramError(
111  var_param_name,
112  "The variable '",
113  var_ptr->name(),
114  "' is an array variable. Sampling those is not currently supported in the "
115  "framework. It may be supported using a dedicated object in your application. Use "
116  "'ArrayVariableComponent' auxkernel to copy those values into a regular field variable");
117 }
const libMesh::FEType & feType() const
Get the type of finite element object.
SCALAR
const std::string & name() const override
Get the variable name.
virtual bool isVector() const =0
VectorPostprocessor * _vpp
The child VectorPostprocessor.
Definition: SamplerBase.h:106
virtual bool isArray() const

◆ finalize()

void SamplerBase::finalize ( )
protectedvirtual

Finalize the values.

YOU MUST CALL THIS DURING finalize() in the child class!

We have several vectors that all need to be processed in the same way. Rather than enumerate them all, let's just create a vector of pointers and work on them that way.

We now have one sorted vector. The remaining vectors need to be sorted according to that vector. We'll need a temporary vector to hold values as we map them according to the sorted indices. After that, we'll swap the vector contents with the sorted vector to get the values back into the original vector.

Reimplemented in LineMaterialSamplerBase< T >, LineMaterialSamplerBase< Real >, PointSamplerBase, ElementValueSampler, NodalValueSampler, LineFunctionSampler, and SideValueSampler.

Definition at line 120 of file SamplerBase.C.

Referenced by SideValueSampler::finalize(), LineFunctionSampler::finalize(), NodalValueSampler::finalize(), ElementValueSampler::finalize(), PointSamplerBase::finalize(), and LineMaterialSamplerBase< Real >::finalize().

121 {
127  constexpr auto NUM_ID_VECTORS = 4;
128 
129  std::vector<VectorPostprocessorValue *> vec_ptrs;
130  vec_ptrs.reserve(_values.size() + NUM_ID_VECTORS);
131  // Initialize the pointer vector with the position and ID vectors
132  vec_ptrs = {{&_x, &_y, &_z, &_id}};
133  // Now extend the vector by all the remaining values vector before processing
134  vec_ptrs.insert(vec_ptrs.end(), _values.begin(), _values.end());
135 
136  // Gather up each of the partial vectors
137  for (auto vec_ptr : vec_ptrs)
138  _comm.allgather(*vec_ptr, /* identical buffer lengths = */ false);
139 
140  // Now create an index vector by using an indirect sort
141  std::vector<std::size_t> sorted_indices;
142  Moose::indirectSort(vec_ptrs[_sort_by]->begin(), vec_ptrs[_sort_by]->end(), sorted_indices);
143 
151  // This vector is used as temp storage to sort each of the remaining vectors according to the
152  // first
153  auto vector_length = sorted_indices.size();
154  VectorPostprocessorValue tmp_vector(vector_length);
155 
156 #ifndef NDEBUG
157  for (const auto vec_ptr : vec_ptrs)
158  if (vec_ptr->size() != vector_length)
159  mooseError("Vector length mismatch");
160 #endif
161 
162  // Sort each of the vectors using the same sorted indices
163  for (auto & vec_ptr : vec_ptrs)
164  {
165  for (MooseIndex(sorted_indices) j = 0; j < sorted_indices.size(); ++j)
166  tmp_vector[j] = (*vec_ptr)[sorted_indices[j]];
167 
168  // Swap vector storage with sorted vector
169  vec_ptr->swap(tmp_vector);
170  }
171 }
void allgather(const T &send_data, std::vector< T, A > &recv_data) const
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:302
void indirectSort(RandomAccessIterator beg, RandomAccessIterator end, std::vector< size_t > &b)
Definition: IndirectSort.h:68
VectorPostprocessorValue & _y
y coordinate of the points
Definition: SamplerBase.h:120
const unsigned int _sort_by
What to sort by.
Definition: SamplerBase.h:115
std::vector< VectorPostprocessorValue * > _values
Definition: SamplerBase.h:127
VectorPostprocessorValue & _x
x coordinate of the points
Definition: SamplerBase.h:118
std::vector< Real > VectorPostprocessorValue
Definition: MooseTypes.h:203
VectorPostprocessorValue & _id
The node ID of each point.
Definition: SamplerBase.h:125
VectorPostprocessorValue & _z
x coordinate of the points
Definition: SamplerBase.h:122
const libMesh::Parallel::Communicator & _comm
The communicator of the child.
Definition: SamplerBase.h:109

◆ initialize()

void SamplerBase::initialize ( )
protectedvirtual

Initialize the datastructures.

YOU MUST CALL THIS DURING initialize() in the child class!

Reimplemented in LineMaterialSamplerBase< T >, LineMaterialSamplerBase< Real >, PointSamplerBase, PointVariableSamplerBase, PositionsFunctorValueSampler, ElementValueSampler, NodalValueSampler, LineFunctionSampler, PointValueSampler, and SideValueSampler.

Definition at line 77 of file SamplerBase.C.

Referenced by SideValueSampler::initialize(), LineFunctionSampler::initialize(), NodalValueSampler::initialize(), ElementValueSampler::initialize(), PointVariableSamplerBase::initialize(), PointSamplerBase::initialize(), and LineMaterialSamplerBase< Real >::initialize().

78 {
79  // Don't reset the vectors if we want to retain history
80  if (_vpp->containsCompleteHistory() && _comm.rank() == 0)
81  return;
82 
83  _x.clear();
84  _y.clear();
85  _z.clear();
86  _id.clear();
87 
88  std::for_each(
89  _values.begin(), _values.end(), [](VectorPostprocessorValue * vec) { vec->clear(); });
90 }
processor_id_type rank() const
VectorPostprocessorValue & _y
y coordinate of the points
Definition: SamplerBase.h:120
std::vector< VectorPostprocessorValue * > _values
Definition: SamplerBase.h:127
bool containsCompleteHistory() const
Return whether or not this VectorPostprocessor contains complete history.
VectorPostprocessor * _vpp
The child VectorPostprocessor.
Definition: SamplerBase.h:106
VectorPostprocessorValue & _x
x coordinate of the points
Definition: SamplerBase.h:118
std::vector< Real > VectorPostprocessorValue
Definition: MooseTypes.h:203
VectorPostprocessorValue & _id
The node ID of each point.
Definition: SamplerBase.h:125
VectorPostprocessorValue & _z
x coordinate of the points
Definition: SamplerBase.h:122
const libMesh::Parallel::Communicator & _comm
The communicator of the child.
Definition: SamplerBase.h:109

◆ setupVariables()

void SamplerBase::setupVariables ( const std::vector< std::string > &  variable_names)
protected

You MUST call this in the constructor of the child class and pass down the name of the variables.

Parameters
variable_namesThe names of the variables. Note: The order of the variables sets the order of the values for addSample()

Definition at line 53 of file SamplerBase.C.

Referenced by ElementValueSampler::ElementValueSampler(), LineFunctionSampler::LineFunctionSampler(), LineMaterialSamplerBase< Real >::LineMaterialSamplerBase(), NodalValueSampler::NodalValueSampler(), PointVariableSamplerBase::PointVariableSamplerBase(), PositionsFunctorValueSampler::PositionsFunctorValueSampler(), and SideValueSampler::SideValueSampler().

54 {
55  _variable_names = variable_names;
56  _values.reserve(variable_names.size());
57 
58  for (const auto & variable_name : variable_names)
59  _values.push_back(&_vpp->declareVector(variable_name));
60 }
std::vector< std::string > _variable_names
The variable names.
Definition: SamplerBase.h:112
std::vector< VectorPostprocessorValue * > _values
Definition: SamplerBase.h:127
VectorPostprocessor * _vpp
The child VectorPostprocessor.
Definition: SamplerBase.h:106
VectorPostprocessorValue & declareVector(const std::string &vector_name)
Register a new vector to fill up.

◆ threadJoin()

void SamplerBase::threadJoin ( const SamplerBase y)
protectedvirtual

Join the values.

YOU MUST CALL THIS DURING threadJoin() in the child class!

Parameters
yYou must cast the UserObject to your child class type first then you can pass it in here.

Definition at line 174 of file SamplerBase.C.

Referenced by SideValueSampler::threadJoin(), ElementValueSampler::threadJoin(), and NodalValueSampler::threadJoin().

175 {
176  _x.insert(_x.end(), y._x.begin(), y._x.end());
177  _y.insert(_y.end(), y._y.begin(), y._y.end());
178  _z.insert(_z.end(), y._z.begin(), y._z.end());
179 
180  _id.insert(_id.end(), y._id.begin(), y._id.end());
181 
182  for (MooseIndex(_variable_names) i = 0; i < _variable_names.size(); i++)
183  _values[i]->insert(_values[i]->end(), y._values[i]->begin(), y._values[i]->end());
184 }
std::vector< std::string > _variable_names
The variable names.
Definition: SamplerBase.h:112
VectorPostprocessorValue & _y
y coordinate of the points
Definition: SamplerBase.h:120
std::vector< VectorPostprocessorValue * > _values
Definition: SamplerBase.h:127
VectorPostprocessorValue & _x
x coordinate of the points
Definition: SamplerBase.h:118
VectorPostprocessorValue & _id
The node ID of each point.
Definition: SamplerBase.h:125
VectorPostprocessorValue & _z
x coordinate of the points
Definition: SamplerBase.h:122

◆ validParams()

InputParameters SamplerBase::validParams ( )
static

Definition at line 24 of file SamplerBase.C.

Referenced by SideValueSampler::validParams(), LineFunctionSampler::validParams(), NodalValueSampler::validParams(), ElementValueSampler::validParams(), PointVariableSamplerBase::validParams(), PointSamplerBase::validParams(), and LineMaterialSamplerBase< Real >::validParams().

25 {
27 
28  MooseEnum sort_options("x y z id");
29  params.addRequiredParam<MooseEnum>("sort_by", sort_options, "What to sort the samples by");
30 
31  // The value from this VPP is naturally already on every processor
32  // TODO: Make this not the case! See #11415
33  params.set<bool>("_auto_broadcast") = false;
34 
35  return params;
36 }
T & set(const std::string &name, bool quiet_mode=false)
Returns a writable reference to the named parameters.
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
void addRequiredParam(const std::string &name, const std::string &doc_string)
This method adds a parameter and documentation string to the InputParameters object that will be extr...
InputParameters emptyInputParameters()
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:33

Member Data Documentation

◆ _comm

const libMesh::Parallel::Communicator& SamplerBase::_comm
protected

The communicator of the child.

Definition at line 109 of file SamplerBase.h.

Referenced by PointSamplerBase::finalize(), finalize(), and initialize().

◆ _id

VectorPostprocessorValue& SamplerBase::_id
protected

The node ID of each point.

Definition at line 125 of file SamplerBase.h.

Referenced by addSample(), finalize(), LineValueSampler::getValue(), initialize(), and threadJoin().

◆ _sampler_params

const InputParameters& SamplerBase::_sampler_params
protected

The child params.

Definition at line 103 of file SamplerBase.h.

◆ _sort_by

const unsigned int SamplerBase::_sort_by
protected

What to sort by.

Definition at line 115 of file SamplerBase.h.

Referenced by finalize(), and LineValueSampler::getValue().

◆ _values

std::vector<VectorPostprocessorValue *> SamplerBase::_values
protected

◆ _variable_names

std::vector<std::string> SamplerBase::_variable_names
protected

The variable names.

Definition at line 112 of file SamplerBase.h.

Referenced by addSample(), setupVariables(), and threadJoin().

◆ _vpp

VectorPostprocessor* SamplerBase::_vpp
protected

The child VectorPostprocessor.

Definition at line 106 of file SamplerBase.h.

Referenced by checkForStandardFieldVariableType(), initialize(), and setupVariables().

◆ _x

VectorPostprocessorValue& SamplerBase::_x
protected

x coordinate of the points

Definition at line 118 of file SamplerBase.h.

Referenced by addSample(), finalize(), initialize(), and threadJoin().

◆ _y

VectorPostprocessorValue& SamplerBase::_y
protected

y coordinate of the points

Definition at line 120 of file SamplerBase.h.

Referenced by addSample(), finalize(), initialize(), and threadJoin().

◆ _z

VectorPostprocessorValue& SamplerBase::_z
protected

x coordinate of the points

Definition at line 122 of file SamplerBase.h.

Referenced by addSample(), finalize(), initialize(), and threadJoin().


The documentation for this class was generated from the following files: