www.mooseframework.org
SamplerFullSolveMultiApp.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 // StochasticTools includes
12 #include "Sampler.h"
14 
15 registerMooseObject("StochasticToolsApp", SamplerFullSolveMultiApp);
16 
18 
19 InputParameters
21 {
22  InputParameters params = FullSolveMultiApp::validParams();
24  params.addClassDescription(
25  "Creates a full-solve type sub-application for each row of each Sampler matrix.");
26  params.addParam<SamplerName>("sampler", "The Sampler object to utilize for creating MultiApps.");
27  params.suppressParameter<std::vector<Point>>("positions");
28  params.suppressParameter<bool>("output_in_position");
29  params.suppressParameter<std::vector<FileName>>("positions_file");
30  params.suppressParameter<Real>("move_time");
31  params.suppressParameter<std::vector<Point>>("move_positions");
32  params.suppressParameter<std::vector<unsigned int>>("move_apps");
33  params.set<bool>("use_positions") = false;
34 
35  MooseEnum modes("normal=0 batch-reset=1 batch-restore=2", "normal");
36  params.addParam<MooseEnum>(
37  "mode",
38  modes,
39  "The operation mode, 'normal' creates one sub-application for each row in the Sampler and "
40  "'batch' creates on sub-application for each processor and re-executes for each row.");
41 
42  return params;
43 }
44 
45 SamplerFullSolveMultiApp::SamplerFullSolveMultiApp(const InputParameters & parameters)
46  : FullSolveMultiApp(parameters),
47  SamplerInterface(this),
48  _sampler(SamplerInterface::getSampler("sampler")),
49  _mode(getParam<MooseEnum>("mode").getEnum<StochasticTools::MultiAppMode>()),
50  _local_batch_app_index(0)
51 {
54  init(n_processors());
55 
56  else
57  init(_sampler.getNumberOfRows());
58 }
59 
60 bool
61 SamplerFullSolveMultiApp::solveStep(Real dt, Real target_time, bool auto_advance)
62 {
63  mooseAssert(_my_num_apps, _sampler.getNumberOfLocalRows());
64 
65  bool last_solve_converged = true;
68  last_solve_converged = solveStepBatch(dt, target_time, auto_advance);
69  else
70  last_solve_converged = FullSolveMultiApp::solveStep(dt, target_time, auto_advance);
71  return last_solve_converged;
72 }
73 
74 bool
75 SamplerFullSolveMultiApp::solveStepBatch(Real dt, Real target_time, bool auto_advance)
76 {
77  // Value to return
78  bool last_solve_converged = true;
79 
80  // List of active relevant Transfer objects
81  std::vector<std::shared_ptr<StochasticToolsTransfer>> to_transfers =
82  getActiveStochasticToolsTransfers(MultiAppTransfer::TO_MULTIAPP);
83  std::vector<std::shared_ptr<StochasticToolsTransfer>> from_transfers =
84  getActiveStochasticToolsTransfers(MultiAppTransfer::FROM_MULTIAPP);
85 
86  // Initialize to/from transfers
87  for (auto transfer : to_transfers)
88  transfer->initializeToMultiapp();
89 
90  for (auto transfer : from_transfers)
91  transfer->initializeFromMultiapp();
92 
94  backup();
95 
96  // Perform batch MultiApp solves
98  for (dof_id_type i = _sampler.getLocalRowBegin(); i < _sampler.getLocalRowEnd(); ++i)
99  {
100  for (auto & transfer : to_transfers)
101  {
102  transfer->setGlobalMultiAppIndex(i);
103  transfer->executeToMultiapp();
104  }
105 
106  last_solve_converged = FullSolveMultiApp::solveStep(dt, target_time, auto_advance);
107 
108  for (auto & transfer : from_transfers)
109  {
110  transfer->setGlobalMultiAppIndex(i);
111  transfer->executeFromMultiapp();
112  }
113 
114  if (i < _sampler.getLocalRowEnd() - 1)
115  {
117  restore();
118  else
119  {
120  // The app is being reset for the next loop, thus the batch index must be indexed as such
121  _local_batch_app_index = i + 1;
122  resetApp(_local_batch_app_index, target_time);
123  initialSetup();
124  }
125  }
126  }
127 
128  // Finalize to/from transfers
129  for (auto transfer : to_transfers)
130  transfer->finalizeToMultiapp();
131  for (auto transfer : from_transfers)
132  transfer->finalizeFromMultiapp();
133 
134  return last_solve_converged;
135 }
136 
137 std::vector<std::shared_ptr<StochasticToolsTransfer>>
139 {
140  std::vector<std::shared_ptr<StochasticToolsTransfer>> output;
141  const ExecuteMooseObjectWarehouse<Transfer> & warehouse =
142  _fe_problem.getMultiAppTransferWarehouse(direction);
143  for (std::shared_ptr<Transfer> transfer : warehouse.getActiveObjects())
144  {
145  auto ptr = std::dynamic_pointer_cast<StochasticToolsTransfer>(transfer);
146  if (ptr)
147  output.push_back(ptr);
148  }
149  return output;
150 }
151 
152 std::string
154 {
155  // Since we only store param_names in cli_args, we need to find the values for each param from
156  // sampler data and combine them to get full command line option strings.
157  std::vector<Real> row = _sampler.getNextLocalRow();
158 
159  std::ostringstream oss;
160  const std::vector<std::string> & cli_args_name =
161  MooseUtils::split(FullSolveMultiApp::getCommandLineArgsParamHelper(local_app), ";");
162 
163  for (dof_id_type col = 0; col < _sampler.getNumberOfCols(); ++col)
164  {
165  if (col > 0)
166  oss << ";";
167  oss << cli_args_name[col] << "=" << Moose::stringify(row[col]);
168  }
169  return oss.str();
170 }
SamplerFullSolveMultiApp
Definition: SamplerFullSolveMultiApp.h:25
SamplerFullSolveMultiApp::solveStep
virtual bool solveStep(Real dt, Real target_time, bool auto_advance=true) override
Definition: SamplerFullSolveMultiApp.C:61
SamplerFullSolveMultiApp.h
StochasticTools::MultiAppMode::BATCH_RESET
SamplerFullSolveMultiApp::solveStepBatch
bool solveStepBatch(Real dt, Real target_time, bool auto_advance=true)
Helper method for running in mode='batch'.
Definition: SamplerFullSolveMultiApp.C:75
SamplerFullSolveMultiApp::getCommandLineArgsParamHelper
virtual std::string getCommandLineArgsParamHelper(unsigned int local_app) override
Override to allow for batch mode to get correct cli_args.
Definition: SamplerFullSolveMultiApp.C:153
SamplerFullSolveMultiApp::_sampler
Sampler & _sampler
Sampler to utilize for creating MultiApps.
Definition: SamplerFullSolveMultiApp.h:36
SamplerFullSolveMultiApp::_mode
const StochasticTools::MultiAppMode _mode
The Sup-application solve mode.
Definition: SamplerFullSolveMultiApp.h:39
SamplerFullSolveMultiApp::validParams
static InputParameters validParams()
Definition: SamplerFullSolveMultiApp.C:20
StochasticToolsTransfer.h
validParams
InputParameters validParams()
SamplerFullSolveMultiApp::_local_batch_app_index
dof_id_type _local_batch_app_index
Counter for extracting command line arguments in batch mode.
Definition: SamplerFullSolveMultiApp.h:42
StochasticTools::MultiAppMode
MultiAppMode
Definition: StochasticToolsApp.h:37
SamplerFullSolveMultiApp::SamplerFullSolveMultiApp
SamplerFullSolveMultiApp(const InputParameters &parameters)
Definition: SamplerFullSolveMultiApp.C:45
registerMooseObject
registerMooseObject("StochasticToolsApp", SamplerFullSolveMultiApp)
StochasticTools
Enum for batch type in stochastic tools MultiApp.
Definition: StochasticToolsApp.h:35
StochasticTools::MultiAppMode::BATCH_RESTORE
SamplerFullSolveMultiApp::getActiveStochasticToolsTransfers
std::vector< std::shared_ptr< StochasticToolsTransfer > > getActiveStochasticToolsTransfers(Transfer::DIRECTION direction)
Helper for getting StochasticToolsTransfer objects.
Definition: SamplerFullSolveMultiApp.C:138
defineLegacyParams
defineLegacyParams(SamplerFullSolveMultiApp)