www.mooseframework.org
SamplerBase.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 #include "SamplerBase.h"
11 
12 // MOOSE includes
13 #include "IndirectSort.h"
14 #include "InputParameters.h"
15 #include "MooseEnum.h"
16 #include "MooseError.h"
17 #include "VectorPostprocessor.h"
18 
19 #include "libmesh/point.h"
20 
23 {
25 
26  MooseEnum sort_options("x y z id");
27  params.addRequiredParam<MooseEnum>("sort_by", sort_options, "What to sort the samples by");
28 
29  // The value from this VPP is naturally already on every processor
30  // TODO: Make this not the case! See #11415
31  params.set<bool>("_auto_broadcast") = false;
32 
33  return params;
34 }
35 
37  VectorPostprocessor * vpp,
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 }
49 
50 void
51 SamplerBase::setupVariables(const std::vector<std::string> & variable_names)
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 }
59 
60 void
61 SamplerBase::addSample(const Point & p, const Real & id, const std::vector<Real> & values)
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 (MooseIndex(values) i = 0; i < values.size(); ++i)
71  _values[i]->emplace_back(values[i]);
72 }
73 
74 void
76 {
77  // Don't reset the vectors if we want to retain history
78  if (_vpp->containsCompleteHistory() && _comm.rank() == 0)
79  return;
80 
81  _x.clear();
82  _y.clear();
83  _z.clear();
84  _id.clear();
85 
86  std::for_each(
87  _values.begin(), _values.end(), [](VectorPostprocessorValue * vec) { vec->clear(); });
88 }
89 
90 void
92 {
98  constexpr auto NUM_ID_VECTORS = 4;
99 
100  std::vector<VectorPostprocessorValue *> vec_ptrs;
101  vec_ptrs.reserve(_values.size() + NUM_ID_VECTORS);
102  // Initialize the pointer vector with the position and ID vectors
103  vec_ptrs = {{&_x, &_y, &_z, &_id}};
104  // Now extend the vector by all the remaining values vector before processing
105  vec_ptrs.insert(vec_ptrs.end(), _values.begin(), _values.end());
106 
107  // Gather up each of the partial vectors
108  for (auto vec_ptr : vec_ptrs)
109  _comm.allgather(*vec_ptr, /* identical buffer lengths = */ false);
110 
111  // Now create an index vector by using an indirect sort
112  std::vector<std::size_t> sorted_indices;
113  Moose::indirectSort(vec_ptrs[_sort_by]->begin(), vec_ptrs[_sort_by]->end(), sorted_indices);
114 
122  // This vector is used as temp storage to sort each of the remaining vectors according to the
123  // first
124  auto vector_length = sorted_indices.size();
125  VectorPostprocessorValue tmp_vector(vector_length);
126 
127 #ifndef NDEBUG
128  for (const auto vec_ptr : vec_ptrs)
129  if (vec_ptr->size() != vector_length)
130  mooseError("Vector length mismatch");
131 #endif
132 
133  // Sort each of the vectors using the same sorted indices
134  for (auto & vec_ptr : vec_ptrs)
135  {
136  for (MooseIndex(sorted_indices) j = 0; j < sorted_indices.size(); ++j)
137  tmp_vector[j] = (*vec_ptr)[sorted_indices[j]];
138 
139  // Swap vector storage with sorted vector
140  vec_ptr->swap(tmp_vector);
141  }
142 }
143 
144 void
146 {
147  _x.insert(_x.end(), y._x.begin(), y._x.end());
148  _y.insert(_y.end(), y._y.begin(), y._y.end());
149  _z.insert(_z.end(), y._z.begin(), y._z.end());
150 
151  _id.insert(_id.end(), y._id.begin(), y._id.end());
152 
153  for (MooseIndex(_variable_names) i = 0; i < _variable_names.size(); i++)
154  _values[i]->insert(_values[i]->end(), y._values[i]->begin(), y._values[i]->end());
155 }
Base class for VectorPostprocessors that need to do "sampling" of values in the domain.
Definition: SamplerBase.h:36
virtual void initialize()
Initialize the datastructures.
Definition: SamplerBase.C:75
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:284
T * get(const std::unique_ptr< T > &u)
The MooseUtils::get() specializations are used to support making forwards-compatible code changes fro...
Definition: MooseUtils.h:1147
T & set(const std::string &name, bool quiet_mode=false)
Returns a writable reference to the named parameters.
void indirectSort(RandomAccessIterator beg, RandomAccessIterator end, std::vector< size_t > &b)
Definition: IndirectSort.h:68
processor_id_type rank() const
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
std::vector< std::string > _variable_names
The variable names.
Definition: SamplerBase.h:103
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()
VectorPostprocessorValue & _y
y coordinate of the points
Definition: SamplerBase.h:111
const unsigned int _sort_by
What to sort by.
Definition: SamplerBase.h:106
std::vector< VectorPostprocessorValue * > _values
Definition: SamplerBase.h:118
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...
Definition: SamplerBase.C:51
bool containsCompleteHistory() const
Return whether or not this VectorPostprocessor contains complete history.
VectorPostprocessor * _vpp
The child VectorPostprocessor.
Definition: SamplerBase.h:97
virtual void threadJoin(const SamplerBase &y)
Join the values.
Definition: SamplerBase.C:145
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:31
VectorPostprocessorValue & declareVector(const std::string &vector_name)
Register a new vector to fill up.
VectorPostprocessorValue & _x
x coordinate of the points
Definition: SamplerBase.h:109
static InputParameters validParams()
Definition: SamplerBase.C:22
SamplerBase(const InputParameters &parameters, VectorPostprocessor *vpp, const libMesh::Parallel::Communicator &comm)
Definition: SamplerBase.C:36
virtual void finalize()
Finalize the values.
Definition: SamplerBase.C:91
std::vector< Real > VectorPostprocessorValue
Definition: MooseTypes.h:192
VectorPostprocessorValue & _id
The node ID of each point.
Definition: SamplerBase.h:116
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.
Definition: SamplerBase.C:61
VectorPostprocessorValue & _z
x coordinate of the points
Definition: SamplerBase.h:113
const libMesh::Parallel::Communicator & _comm
The communicator of the child.
Definition: SamplerBase.h:100
Base class for Postprocessors that produce a vector of values.