26 "Creates a full-solve type sub-application for each row of each Sampler matrix.");
28 "The Sampler object to utilize for creating MultiApps.");
35 params.
set<
bool>(
"use_positions") =
false;
37 MooseEnum modes(
"normal=0 batch-reset=1 batch-restore=2",
"normal");
41 "The operation mode, 'normal' creates one sub-application for each row in the Sampler and " 42 "'batch-reset' and 'batch-restore' creates N sub-applications, where N is the minimum of " 43 "'num_rows' in the Sampler and floor(number of processes / min_procs_per_app). To run " 44 "the rows in the Sampler, 'batch-reset' will destroy and re-create sub-apps as needed, " 45 "whereas the 'batch-restore' will backup and restore sub-apps to the initial state prior " 46 "to execution, without destruction.");
48 "should_run_reporter",
49 "Vector reporter value determining whether a certain multiapp should be run with this " 50 "multiapp. This only works in batch-reset or batch-restore mode.");
58 _sampler(getSampler(
"sampler")),
60 _local_batch_app_index(0),
63 if (getParam<unsigned int>(
"min_procs_per_app") !=
65 getParam<unsigned int>(
"max_procs_per_app") !=
68 "Sampler and multiapp communicator configuration inconsistent. Please ensure that " 71 "/min(max)_procs_per_app' and 'Samplers/",
73 "/min(max)_procs_per_row' are the same.");
82 "Conditionally run sampler multiapp only works in batch modes.");
106 _should_run = &getReporterValue<std::vector<bool>>(
"should_run_reporter");
112 TIME_SECTION(
"solveStep", 3,
"Solving SamplerFullSolveMultiApp");
116 bool last_solve_converged =
true;
120 last_solve_converged =
solveStepBatch(dt, target_time, auto_advance);
126 return last_solve_converged;
132 TIME_SECTION(
"solveStepBatch", 3,
"Solving Step Batch For SamplerFullSolveMultiApp");
136 "Reporter deteriming multiapp run must be of size greater than or equal to the " 137 "number of local rows in the sampler, ",
144 bool last_solve_converged =
true;
147 std::vector<std::shared_ptr<StochasticToolsTransfer>> to_transfers =
149 std::vector<std::shared_ptr<StochasticToolsTransfer>> from_transfers =
153 for (
auto transfer : to_transfers)
156 transfer->initializeToMultiapp();
158 for (
auto transfer : from_transfers)
161 transfer->initializeFromMultiapp();
220 const bool curr_last_solve_converged =
222 last_solve_converged = last_solve_converged && curr_last_solve_converged;
236 for (
auto transfer : to_transfers)
237 transfer->finalizeToMultiapp();
238 for (
auto transfer : from_transfers)
239 transfer->finalizeFromMultiapp();
241 return last_solve_converged;
246 const std::vector<std::shared_ptr<StochasticToolsTransfer>> & transfers,
248 const std::vector<Real> & row_data,
253 if (verbose && transfers.size())
255 console << COLOR_CYAN <<
"\nBatch transfers for row " << global_row_index;
260 console <<
"MultiApps" << COLOR_DEFAULT <<
":" << std::endl;
262 console <<
"Sampler row " << global_row_index <<
" data: [" <<
Moose::stringify(row_data) <<
"]" 267 {
"Name",
"Type",
"From",
"To"});
268 for (
const auto & transfer : transfers)
270 transfer->name(), transfer->type(), transfer->getFromName(), transfer->getToName());
271 table.print(console);
274 for (
auto & transfer : transfers)
276 transfer->setGlobalRowIndex(global_row_index);
277 transfer->setCurrentRow(row_data);
279 transfer->executeToMultiapp();
281 transfer->executeFromMultiapp();
284 if (verbose && transfers.size())
285 console << COLOR_CYAN <<
"Batch transfers for row " << global_row_index <<
" Are Finished\n" 286 << COLOR_DEFAULT << std::endl;
319 _console << COLOR_CYAN <<
type() <<
" [" <<
name() <<
"] " << last_row <<
"/" 324 std::vector<std::shared_ptr<StochasticToolsTransfer>>
327 std::vector<std::shared_ptr<StochasticToolsTransfer>> output;
333 if (ptr && ptr->getMultiApp().get() ==
this)
334 output.push_back(ptr);
339 std::vector<std::string>
342 std::vector<std::string> args;
366 "Local index must be less than number of local rows.");
371 mooseAssert(local_index == 0,
372 "The first time calling updateRowData must have a local index of 0.");
383 "Local index must be equal or one greater than the index previously called.");
386 std::vector<std::string>
388 const std::vector<std::string> & full_args_name)
390 std::vector<std::string> args;
393 std::vector<std::string> cli_args_name;
394 for (
const auto & fan : full_args_name)
397 if (fan.find(
"=") == std::string::npos)
398 cli_args_name.push_back(fan);
404 bool has_brackets =
false;
405 if (cli_args_name.size())
407 has_brackets = cli_args_name[0].find(
"[") != std::string::npos;
408 for (
unsigned int i = 1; i < cli_args_name.size(); ++i)
409 if (has_brackets != (cli_args_name[i].find(
"[") != std::string::npos))
410 ::
mooseError(
"If the bracket is used, it must be provided to every parameter.");
412 if (!has_brackets && cli_args_name.size() && cli_args_name.size() != row.size())
413 ::
mooseError(
"Number of command line arguments does not match number of sampler columns.");
415 for (
unsigned int i = 0; i < cli_args_name.size(); ++i)
421 const std::vector<std::string> & vector_param =
MooseUtils::split(cli_args_name[i],
"[");
423 const std::vector<std::string> & index_string =
427 std::vector<std::string> values;
428 for (
const auto & istr : index_string)
433 if (istr.find(
"(") != std::string::npos)
434 value = std::stod(istr.substr(istr.find(
"(") + 1));
439 if (index >= row.size())
440 ::
mooseError(
"The provided global column index (",
444 " is out of bound.");
const StochasticTools::MultiAppMode _mode
The Sup-application solve mode.
registerMooseObject("StochasticToolsApp", SamplerFullSolveMultiApp)
bool solveStepBatch(Real dt, Real target_time, bool auto_advance=true)
Helper method for running in mode='batch'.
std::vector< std::shared_ptr< StochasticToolsTransfer > > getActiveStochasticToolsTransfers(Transfer::DIRECTION direction)
Helper for getting StochasticToolsTransfer objects.
virtual void initialSetup() override
static InputParameters validParams()
int stringToInteger(const std::string &input, bool throw_on_failure=false)
bool verboseMultiApps() const
static InputParameters validParams()
LocalRankConfig _rank_config
virtual bool solveStep(Real dt, Real target_time, bool auto_advance=true) override
std::string getOutputFileBase(bool for_non_moose_build_output=false) const
std::vector< std::shared_ptr< MooseApp > > _apps
dof_id_type first_local_app_index
std::vector< Real > getNextLocalRow()
SamplerFullSolveMultiApp(const InputParameters ¶meters)
dof_id_type _local_batch_app_index
Counter for extracting command line arguments in batch mode.
const Parallel::Communicator & _communicator
FEProblemBase & _fe_problem
dof_id_type getNumberOfLocalRows() const
virtual std::vector< std::string > getCommandLineArgs(const unsigned int local_app)
virtual const std::string & name() const
static InputParameters validParams()
std::vector< Real > _row_data
Current row of data updated by updateRowData. Used by transfers and setting command line args...
std::vector< std::string > split(const std::string &str, const std::string &delimiter, std::size_t max_count=std::numeric_limits< std::size_t >::max())
bool isParamValid(const std::string &name) const
dof_id_type _local_row_index
Current local index representing _row_data.
std::string stringifyExact(Real)
static std::vector< std::string > sampledCommandLineArgs(const std::vector< Real > &row, const std::vector< std::string > &full_args_name)
Helper for inserting row data into commandline arguments Used here and in SamplerTransientMultiApp.
processor_id_type n_processors() const
Status receive(const unsigned int dest_processor_id, T &buf, const MessageTag &tag=any_tag) const
const std::vector< std::shared_ptr< Transfer > > & getActiveObjects(THREAD_ID tid=0) const
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
virtual std::vector< std::string > getCommandLineArgs(const unsigned int local_app) override
Override to allow for batch mode to get correct cli_args.
Sampler & _sampler
Sampler to utilize for creating MultiApps.
const std::string & type() const
virtual void showStatusMessage(unsigned int i) const override
Override to avoid 'solve converged' message and print when processors are finished.
const T & getParam(const std::string &name) const
void paramError(const std::string ¶m, Args... args) const
dof_id_type _number_of_sampler_rows
const LocalRankConfig & getRankConfig(bool batch_mode) const
std::string stringify(const T &t)
void addRow(Ts... entries)
static InputParameters validParams()
dof_id_type num_local_sims
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
unsigned int _my_num_apps
static std::string getMultiAppName(const std::string &base_name, dof_id_type index, dof_id_type total)
const std::vector< bool > * _should_run
Reporter value determining whether the sub-app should be run for a certain sample.
libMesh::Parallel::Communicator _my_communicator
static void execBatchTransfers(const std::vector< std::shared_ptr< StochasticToolsTransfer >> &transfers, dof_id_type global_row_index, const std::vector< Real > &row_data, Transfer::DIRECTION direction, bool verbose, const ConsoleStream &console)
Helper for executing transfers when doing batch stochastic simulations.
dof_id_type getNumberOfRows() const
const ExecuteMooseObjectWarehouse< Transfer > & getMultiAppTransferWarehouse(Transfer::DIRECTION direction) const
virtual void preTransfer(Real dt, Real target_time) override
void updateRowData(dof_id_type local_index)
Helper function for updating _row_data and _local_row_index.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void send(const unsigned int dest_processor_id, const T &buf, const MessageTag &tag=no_tag) const
IntRange< T > make_range(T beg, T end)
virtual void restore(bool force=true) override
void mooseError(Args &&... args) const
dof_id_type first_local_sim_index
const ConsoleStream _console
void init(unsigned int num_apps, bool batch_mode=false)
processor_id_type processor_id() const
virtual bool solveStep(Real dt, Real target_time, bool auto_advance=true) override
std::string stringJoin(const std::vector< std::string > &values, const std::string &separator=" ")