https://mooseframework.inl.gov
StochasticReporter.h
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 #pragma once
11 
12 // MOOSE includes
13 #include "GeneralReporter.h"
14 #include "StochasticToolsUtils.h"
15 #include "Sampler.h"
16 
17 template <typename T>
18 class StochasticReporterContext : public ReporterGeneralContext<std::vector<T>>
19 {
20 public:
22  const MooseObject & producer,
23  ReporterState<std::vector<T>> & state,
24  const Sampler & sampler);
25 
26  virtual void copyValuesBack() override;
27  virtual void finalize() override;
28  virtual std::string contextType() const override { return MooseUtils::prettyCppType(this); }
29  virtual void storeInfo(nlohmann::json & json) const override;
30 
31 protected:
32  const Sampler & _sampler;
35 };
36 
37 template <typename T>
39  const MooseObject & producer,
40  ReporterState<std::vector<T>> & state,
41  const Sampler & sampler)
42  : ReporterGeneralContext<std::vector<T>>(other, producer, state),
43  _sampler(sampler),
44  _has_gathered(false),
45  _has_allgathered(false)
46 {
47  this->_state.value().resize(_sampler.getNumberOfLocalRows());
48 }
49 
50 template <typename T>
51 void
53 {
54  this->_state.copyValuesBack();
55  if (_has_allgathered || (_has_gathered && this->processor_id() == 0))
56  {
57  auto & val = this->_state.value();
58  val.erase(val.begin(), val.begin() + _sampler.getLocalRowBegin());
59  val.erase(val.begin() + _sampler.getLocalRowEnd(), val.end());
60  }
61  _has_gathered = false;
62  _has_allgathered = false;
63 }
64 
65 template <typename T>
66 void
68 {
69  bool gather_required = this->_producer_enum == REPORTER_MODE_ROOT;
70  bool allgather_required = this->_producer_enum == REPORTER_MODE_REPLICATED;
71  for (const auto & pair : this->_state.getConsumers())
72  {
73  const ReporterMode consumer = pair.first;
74  if (consumer == REPORTER_MODE_ROOT)
75  gather_required = true;
76  else if (consumer == REPORTER_MODE_REPLICATED)
77  allgather_required = true;
78  }
79 
80  if (allgather_required && !_has_allgathered)
81  StochasticTools::stochasticAllGather(this->comm(), this->_state.value());
82  else if (gather_required && !_has_gathered)
83  StochasticTools::stochasticGather(this->comm(), 0, this->_state.value());
84 
85  _has_gathered = gather_required || _has_gathered;
86  _has_allgathered = allgather_required || _has_allgathered;
87 }
88 
89 template <typename T>
90 void
91 StochasticReporterContext<T>::storeInfo(nlohmann::json & json) const
92 {
93  ReporterGeneralContext<std::vector<T>>::storeInfo(json);
94  if (_has_allgathered || (_has_gathered && this->processor_id() == 0))
95  {
96  json["row_begin"] = 0;
97  json["row_end"] = this->_sampler.getNumberOfRows();
98  }
99  else
100  {
101  json["row_begin"] = this->_sampler.getLocalRowBegin();
102  json["row_end"] = this->_sampler.getLocalRowEnd();
103  }
104 }
105 
107 {
108 public:
109  static InputParameters validParams();
110 
112  virtual void initialize() override {}
113  virtual void execute() override {}
114  virtual void finalize() override {}
115 
116 protected:
117  virtual ReporterName declareStochasticReporterClone(const Sampler & sampler,
118  const ReporterData & from_data,
119  const ReporterName & from_reporter,
120  std::string prefix = "");
121  template <typename T>
122  std::vector<T> & declareStochasticReporter(std::string value_name, const Sampler & sampler);
124 
125 private:
126  const unsigned int _parallel_type;
127 };
128 
129 template <typename T>
130 std::vector<T> &
131 StochasticReporter::declareStochasticReporter(std::string value_name, const Sampler & sampler)
132 {
133  const ReporterMode mode =
135  return this->template declareValueByName<std::vector<T>, StochasticReporterContext<T>>(
136  value_name, mode, sampler);
137 }
virtual void copyValuesBack() override
virtual void finalize() override
static InputParameters validParams()
const ReporterMode REPORTER_MODE_ROOT
const ReporterState< std::vector< T > > & state() const
virtual ReporterName declareStochasticReporterClone(const Sampler &sampler, const ReporterData &from_data, const ReporterName &from_reporter, std::string prefix="")
ReporterState< std::vector< T > > & _state
const unsigned int _parallel_type
dof_id_type getNumberOfLocalRows() const
StochasticReporter(const InputParameters &parameters)
virtual void storeInfo(nlohmann::json &json) const override
StochasticReporterContext(const libMesh::ParallelObject &other, const MooseObject &producer, ReporterState< std::vector< T >> &state, const Sampler &sampler)
virtual std::string contextType() const override
void stochasticGather(const libMesh::Parallel::Communicator &, processor_id_type, T &)
virtual void finalize() override
const ReporterMode REPORTER_MODE_DISTRIBUTED
virtual void initialize() override
const InputParameters & parameters() const
std::vector< T > & value(const std::size_t time_index=0)
const ReporterMode REPORTER_MODE_REPLICATED
std::vector< T > & declareStochasticReporter(std::string value_name, const Sampler &sampler)
Transfer Reporters from sub-applications to a StochasticReporter on the main application.
void stochasticAllGather(const libMesh::Parallel::Communicator &, T &)
virtual void execute() override
std::string prettyCppType(const std::string &cpp_type)