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.");
99 bool initial_setup_required =
false;
116 if (initial_setup_required)
126 _should_run = &getReporterValue<std::vector<bool>>(
"should_run_reporter");
132 TIME_SECTION(
"solveStep", 3,
"Solving SamplerFullSolveMultiApp");
136 bool last_solve_converged =
true;
140 last_solve_converged =
solveStepBatch(dt, target_time, auto_advance);
146 return last_solve_converged;
152 TIME_SECTION(
"solveStepBatch", 3,
"Solving Step Batch For SamplerFullSolveMultiApp");
156 "Reporter deteriming multiapp run must be of size greater than or equal to the " 157 "number of local rows in the sampler, ",
164 bool last_solve_converged =
true;
167 std::vector<std::shared_ptr<StochasticToolsTransfer>> to_transfers =
169 std::vector<std::shared_ptr<StochasticToolsTransfer>> from_transfers =
173 for (
auto transfer : to_transfers)
176 transfer->initializeToMultiapp();
178 for (
auto transfer : from_transfers)
181 transfer->initializeFromMultiapp();
240 const bool curr_last_solve_converged =
242 last_solve_converged = last_solve_converged && curr_last_solve_converged;
256 for (
auto transfer : to_transfers)
257 transfer->finalizeToMultiapp();
258 for (
auto transfer : from_transfers)
259 transfer->finalizeFromMultiapp();
261 return last_solve_converged;
266 const std::vector<std::shared_ptr<StochasticToolsTransfer>> & transfers,
268 const std::vector<Real> & row_data,
273 if (verbose && transfers.size())
275 console << COLOR_CYAN <<
"\nBatch transfers for row " << global_row_index;
280 console <<
"MultiApps" << COLOR_DEFAULT <<
":" << std::endl;
282 console <<
"Sampler row " << global_row_index <<
" data: [" <<
Moose::stringify(row_data) <<
"]" 287 {
"Name",
"Type",
"From",
"To"});
288 for (
const auto & transfer : transfers)
290 transfer->name(), transfer->type(), transfer->getFromName(), transfer->getToName());
291 table.print(console);
294 for (
auto & transfer : transfers)
296 transfer->setGlobalRowIndex(global_row_index);
297 transfer->setCurrentRow(row_data);
299 transfer->executeToMultiapp();
301 transfer->executeFromMultiapp();
304 if (verbose && transfers.size())
305 console << COLOR_CYAN <<
"Batch transfers for row " << global_row_index <<
" Are Finished\n" 306 << COLOR_DEFAULT << std::endl;
339 _console << COLOR_CYAN <<
type() <<
" [" <<
name() <<
"] " << last_row <<
"/" 344 std::vector<std::shared_ptr<StochasticToolsTransfer>>
347 std::vector<std::shared_ptr<StochasticToolsTransfer>> output;
353 if (ptr && ptr->getMultiApp().get() ==
this)
354 output.push_back(ptr);
359 std::vector<std::string>
362 std::vector<std::string> args;
386 "Local index must be less than number of local rows.");
391 mooseAssert(local_index == 0,
392 "The first time calling updateRowData must have a local index of 0.");
403 "Local index must be equal or one greater than the index previously called.");
406 std::vector<std::string>
408 const std::vector<std::string> & full_args_name)
410 std::vector<std::string> args;
413 std::vector<std::string> cli_args_name;
414 for (
const auto & fan : full_args_name)
417 if (fan.find(
"=") == std::string::npos)
418 cli_args_name.push_back(fan);
424 bool has_brackets =
false;
425 if (cli_args_name.size())
427 has_brackets = cli_args_name[0].find(
"[") != std::string::npos;
428 for (
unsigned int i = 1; i < cli_args_name.size(); ++i)
429 if (has_brackets != (cli_args_name[i].
find(
"[") != std::string::npos))
430 ::
mooseError(
"If the bracket is used, it must be provided to every parameter.");
432 if (!has_brackets && cli_args_name.size() && cli_args_name.size() != row.size())
433 ::
mooseError(
"Number of command line arguments does not match number of sampler columns.");
435 for (
unsigned int i = 0; i < cli_args_name.size(); ++i)
441 const std::vector<std::string> & vector_param =
MooseUtils::split(cli_args_name[i],
"[");
443 const std::vector<std::string> & index_string =
447 std::vector<std::string> values;
448 for (
const auto & istr : index_string)
453 if (istr.find(
"(") != std::string::npos)
454 value = std::stod(istr.substr(istr.find(
"(") + 1));
459 if (index >= row.size())
460 ::
mooseError(
"The provided global column index (",
464 " 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.
KOKKOS_INLINE_FUNCTION const T * find(const T &target, const T *const begin, const T *const end)
virtual void initialSetup() override
static InputParameters validParams()
void paramError(const std::string ¶m, Args... args) const
const T & getParam(const std::string &name) const
bool verboseMultiApps() const
virtual void backup() override
This method is overridden so that we only store the initial state and not on any other timestep when ...
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)
static InputParameters validParams()
std::vector< Real > _row_data
Current row of data updated by updateRowData. Used by transfers and setting command line args...
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
const std::string & name() 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.
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
std::string stringJoin(const std::vector< std::string > &values, const std::string &separator)
void mooseError(Args &&... args) const
dof_id_type first_local_sim_index
bool isParamValid(const std::string &name) const
const ConsoleStream _console
void init(unsigned int num_apps, bool batch_mode=false)
std::vector< std::string > split(const std::string &str, const std::string &delimiter, std::size_t max_count)
processor_id_type processor_id() const
virtual bool solveStep(Real dt, Real target_time, bool auto_advance=true) override
int stringToInteger(const std::string &input, bool throw_on_failure)