www.mooseframework.org
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
 

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...
 
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 46 of file SamplerBase.h.

Constructor & Destructor Documentation

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 36 of file SamplerBase.C.

39  : _sampler_params(parameters),
40  _vpp(vpp),
41  _comm(comm),
42  _sort_by(parameters.get<MooseEnum>("sort_by")),
43  _x(vpp->declareVector("x")),
44  _y(vpp->declareVector("y")),
45  _z(vpp->declareVector("z")),
46  _id(vpp->declareVector("id"))
47 {
48 }
VectorPostprocessorValue & _y
y coordinate of the points
Definition: SamplerBase.h:119
const unsigned int _sort_by
What to sort by.
Definition: SamplerBase.h:114
VectorPostprocessor * _vpp
The child VectorPostprocessor.
Definition: SamplerBase.h:105
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:37
VectorPostprocessorValue & declareVector(const std::string &vector_name)
Register a new vector to fill up.
VectorPostprocessorValue & _x
x coordinate of the points
Definition: SamplerBase.h:117
const InputParameters & _sampler_params
The child params.
Definition: SamplerBase.h:102
VectorPostprocessorValue & _id
The node ID of each point.
Definition: SamplerBase.h:124
MPI_Comm comm
VectorPostprocessorValue & _z
x coordinate of the points
Definition: SamplerBase.h:121
const libMesh::Parallel::Communicator & _comm
The communicator of the child.
Definition: SamplerBase.h:108
virtual SamplerBase::~SamplerBase ( )
virtualdefault

Member Function Documentation

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 61 of file SamplerBase.C.

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

62 {
63  _x.push_back(p(0));
64  _y.push_back(p(1));
65  _z.push_back(p(2));
66 
67  _id.push_back(id);
68 
69  mooseAssert(values.size() == _variable_names.size(), "Mismatch of variable names to vector size");
70  for (auto i = beginIndex(values); i < values.size(); ++i)
71  _values[i]->emplace_back(values[i]);
72 }
std::vector< std::string > _variable_names
The variable names.
Definition: SamplerBase.h:111
VectorPostprocessorValue & _y
y coordinate of the points
Definition: SamplerBase.h:119
std::vector< VectorPostprocessorValue * > _values
Definition: SamplerBase.h:126
VectorPostprocessorValue & _x
x coordinate of the points
Definition: SamplerBase.h:117
VectorPostprocessorValue & _id
The node ID of each point.
Definition: SamplerBase.h:124
VectorPostprocessorValue & _z
x coordinate of the points
Definition: SamplerBase.h:121
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, LineFunctionSampler, NodalValueSampler, and SideValueSampler.

Definition at line 87 of file SamplerBase.C.

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

88 {
94  constexpr auto NUM_ID_VECTORS = 4;
95 
96  std::vector<VectorPostprocessorValue *> vec_ptrs;
97  vec_ptrs.reserve(_values.size() + NUM_ID_VECTORS);
98  // Initialize the pointer vector with the position and ID vectors
99  vec_ptrs = {{&_x, &_y, &_z, &_id}};
100  // Now extend the vector by all the remaining values vector before processing
101  vec_ptrs.insert(vec_ptrs.end(), _values.begin(), _values.end());
102 
103  // Gather up each of the partial vectors
104  for (auto vec_ptr : vec_ptrs)
105  _comm.allgather(*vec_ptr, /* identical buffer lengths = */ false);
106 
107  // Now create an index vector by using an indirect sort
108  std::vector<std::size_t> sorted_indices;
109  Moose::indirectSort(vec_ptrs[_sort_by]->begin(), vec_ptrs[_sort_by]->end(), sorted_indices);
110 
118  // This vector is used as temp storage to sort each of the remaining vectors according to the
119  // first
120  auto vector_length = sorted_indices.size();
121  VectorPostprocessorValue tmp_vector(vector_length);
122 
123 #ifndef NDEBUG
124  for (const auto vec_ptr : vec_ptrs)
125  if (vec_ptr->size() != vector_length)
126  mooseError("Vector length mismatch");
127 #endif
128 
129  // Sort each of the vectors using the same sorted indices
130  for (auto i = beginIndex(vec_ptrs); i < vec_ptrs.size(); ++i)
131  {
132  for (auto j = beginIndex(sorted_indices); j < sorted_indices.size(); ++j)
133  tmp_vector[j] = (*vec_ptrs[i])[sorted_indices[j]];
134 
135  // Swap vector storage with sorted vector
136  vec_ptrs[i]->swap(tmp_vector);
137  }
138 }
void mooseError(Args &&...args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:182
void indirectSort(RandomAccessIterator beg, RandomAccessIterator end, std::vector< size_t > &b)
Definition: IndirectSort.h:74
VectorPostprocessorValue & _y
y coordinate of the points
Definition: SamplerBase.h:119
const unsigned int _sort_by
What to sort by.
Definition: SamplerBase.h:114
std::vector< VectorPostprocessorValue * > _values
Definition: SamplerBase.h:126
VectorPostprocessorValue & _x
x coordinate of the points
Definition: SamplerBase.h:117
std::vector< Real > VectorPostprocessorValue
Definition: MooseTypes.h:74
VectorPostprocessorValue & _id
The node ID of each point.
Definition: SamplerBase.h:124
VectorPostprocessorValue & _z
x coordinate of the points
Definition: SamplerBase.h:121
const libMesh::Parallel::Communicator & _comm
The communicator of the child.
Definition: SamplerBase.h:108
void SamplerBase::initialize ( )
protectedvirtual

Initialize the datastructures.

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

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

Definition at line 75 of file SamplerBase.C.

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

76 {
77  _x.clear();
78  _y.clear();
79  _z.clear();
80  _id.clear();
81 
82  std::for_each(
83  _values.begin(), _values.end(), [](VectorPostprocessorValue * vec) { vec->clear(); });
84 }
VectorPostprocessorValue & _y
y coordinate of the points
Definition: SamplerBase.h:119
std::vector< VectorPostprocessorValue * > _values
Definition: SamplerBase.h:126
VectorPostprocessorValue & _x
x coordinate of the points
Definition: SamplerBase.h:117
std::vector< Real > VectorPostprocessorValue
Definition: MooseTypes.h:74
VectorPostprocessorValue & _id
The node ID of each point.
Definition: SamplerBase.h:124
VectorPostprocessorValue & _z
x coordinate of the points
Definition: SamplerBase.h:121
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 51 of file SamplerBase.C.

Referenced by LineFunctionSampler::LineFunctionSampler(), LineMaterialSamplerBase< T >::LineMaterialSamplerBase(), NodalValueSampler::NodalValueSampler(), PointSamplerBase::PointSamplerBase(), and SideValueSampler::SideValueSampler().

52 {
53  _variable_names = variable_names;
54  _values.reserve(variable_names.size());
55 
56  for (const auto & variable_name : variable_names)
57  _values.push_back(&_vpp->declareVector(variable_name));
58 }
std::vector< std::string > _variable_names
The variable names.
Definition: SamplerBase.h:111
std::vector< VectorPostprocessorValue * > _values
Definition: SamplerBase.h:126
VectorPostprocessor * _vpp
The child VectorPostprocessor.
Definition: SamplerBase.h:105
VectorPostprocessorValue & declareVector(const std::string &vector_name)
Register a new vector to fill up.
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 141 of file SamplerBase.C.

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

142 {
143  _x.insert(_x.end(), y._x.begin(), y._x.end());
144  _y.insert(_y.end(), y._y.begin(), y._y.end());
145  _z.insert(_z.end(), y._z.begin(), y._z.end());
146 
147  _id.insert(_id.end(), y._id.begin(), y._id.end());
148 
149  for (unsigned int i = 0; i < _variable_names.size(); i++)
150  _values[i]->insert(_values[i]->end(), y._values[i]->begin(), y._values[i]->end());
151 }
std::vector< std::string > _variable_names
The variable names.
Definition: SamplerBase.h:111
VectorPostprocessorValue & _y
y coordinate of the points
Definition: SamplerBase.h:119
std::vector< VectorPostprocessorValue * > _values
Definition: SamplerBase.h:126
VectorPostprocessorValue & _x
x coordinate of the points
Definition: SamplerBase.h:117
VectorPostprocessorValue & _id
The node ID of each point.
Definition: SamplerBase.h:124
VectorPostprocessorValue & _z
x coordinate of the points
Definition: SamplerBase.h:121

Member Data Documentation

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

The communicator of the child.

Definition at line 108 of file SamplerBase.h.

Referenced by finalize().

VectorPostprocessorValue& SamplerBase::_id
protected

The node ID of each point.

Definition at line 124 of file SamplerBase.h.

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

const InputParameters& SamplerBase::_sampler_params
protected

The child params.

Definition at line 102 of file SamplerBase.h.

const unsigned int SamplerBase::_sort_by
protected

What to sort by.

Definition at line 114 of file SamplerBase.h.

Referenced by finalize().

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

Definition at line 126 of file SamplerBase.h.

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

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

The variable names.

Definition at line 111 of file SamplerBase.h.

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

VectorPostprocessor* SamplerBase::_vpp
protected

The child VectorPostprocessor.

Definition at line 105 of file SamplerBase.h.

Referenced by setupVariables().

VectorPostprocessorValue& SamplerBase::_x
protected

x coordinate of the points

Definition at line 117 of file SamplerBase.h.

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

VectorPostprocessorValue& SamplerBase::_y
protected

y coordinate of the points

Definition at line 119 of file SamplerBase.h.

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

VectorPostprocessorValue& SamplerBase::_z
protected

x coordinate of the points

Definition at line 121 of file SamplerBase.h.

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


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