https://mooseframework.inl.gov
Functions
MultiApp.C File Reference

Go to the source code of this file.

Functions

LocalRankConfig rankConfig (processor_id_type rank, processor_id_type nprocs, dof_id_type napps, processor_id_type min_app_procs, processor_id_type max_app_procs, bool batch_mode)
 Returns app partitioning information relevant to the given rank for a multiapp scenario with the given number of apps (napps) and parallel/mpi procs (nprocs). More...
 
void dataStore (std::ostream &stream, SubAppBackups &backups, void *context)
 
void dataLoad (std::istream &stream, SubAppBackups &backups, void *context)
 

Function Documentation

◆ dataLoad()

void dataLoad ( std::istream &  stream,
SubAppBackups backups,
void context 
)

Definition at line 1496 of file MultiApp.C.

1497 {
1498  MultiApp * multi_app = static_cast<MultiApp *>(context);
1499  mooseAssert(multi_app, "Not set");
1500 
1501  dataLoad(stream, static_cast<std::vector<std::unique_ptr<Backup>> &>(backups), nullptr);
1502 
1503  multi_app->restore();
1504 }
virtual void restore(bool force=true)
Restore the state of every Sub App.
Definition: MultiApp.C:762
void dataLoad(std::istream &stream, SubAppBackups &backups, void *context)
Definition: MultiApp.C:1496
A MultiApp represents one or more MOOSE applications that are running simultaneously.
Definition: MultiApp.h:112

◆ dataStore()

void dataStore ( std::ostream &  stream,
SubAppBackups backups,
void context 
)

Definition at line 1485 of file MultiApp.C.

1486 {
1487  MultiApp * multi_app = static_cast<MultiApp *>(context);
1488  mooseAssert(multi_app, "Not set");
1489 
1490  multi_app->backup();
1491 
1492  dataStore(stream, static_cast<std::vector<std::unique_ptr<Backup>> &>(backups), nullptr);
1493 }
virtual void backup()
Save off the state of every Sub App.
Definition: MultiApp.C:747
void dataStore(std::ostream &stream, SubAppBackups &backups, void *context)
Definition: MultiApp.C:1485
A MultiApp represents one or more MOOSE applications that are running simultaneously.
Definition: MultiApp.h:112

◆ rankConfig()

LocalRankConfig rankConfig ( processor_id_type  rank,
processor_id_type  nprocs,
dof_id_type  napps,
processor_id_type  min_app_procs,
processor_id_type  max_app_procs,
bool  batch_mode = false 
)

Returns app partitioning information relevant to the given rank for a multiapp scenario with the given number of apps (napps) and parallel/mpi procs (nprocs).

min_app_procs and max_app_procs define the min and max number of procs that must/can be used in parallel to run a given (sub)app. batch_mode affects whether 1 subapp is assigned per rank to be re-used to run each of the (napps) simulations or whether 1 subapp is created for each napps simulation (globally).

Each proc calls this function in order to determine which (sub)apps among the global list of all subapps for a multiapp should be run by the given rank.

Definition at line 1292 of file MultiApp.C.

Referenced by Sampler::constructRankConfig(), and MultiApp::init().

1298 {
1299  if (min_app_procs > nprocs)
1300  mooseError("minimum number of procs per app is higher than the available number of procs");
1301  else if (min_app_procs > max_app_procs)
1302  mooseError("minimum number of procs per app must be lower than the max procs per app");
1303 
1304  mooseAssert(rank < nprocs, "rank must be smaller than the number of procs");
1305 
1306  // A "slot" is a group of procs/ranks that are grouped together to run a
1307  // single (sub)app/sim in parallel.
1308 
1309  const processor_id_type slot_size =
1310  std::max(std::min(cast_int<processor_id_type>(nprocs / napps), max_app_procs), min_app_procs);
1311  const processor_id_type nslots = std::min(
1312  nprocs / slot_size,
1313  cast_int<processor_id_type>(std::min(
1314  static_cast<dof_id_type>(std::numeric_limits<processor_id_type>::max()), napps)));
1315  mooseAssert(nprocs >= (nslots * slot_size),
1316  "Ensure that leftover procs is represented by an unsigned type");
1317  const processor_id_type leftover_procs = nprocs - nslots * slot_size;
1318  const dof_id_type apps_per_slot = napps / nslots;
1319  const dof_id_type leftover_apps = napps % nslots;
1320 
1321  std::vector<int> slot_for_rank(nprocs);
1322  processor_id_type slot = 0;
1323  processor_id_type procs_in_slot = 0;
1324  for (processor_id_type rankiter = 0; rankiter <= rank; rankiter++)
1325  {
1326  if (slot < nslots)
1327  slot_for_rank[rankiter] = cast_int<int>(slot);
1328  else
1329  slot_for_rank[rankiter] = -1;
1330  procs_in_slot++;
1331  // this slot keeps growing until we reach slot size plus possibly an extra
1332  // proc if there were any leftover from the slotization of nprocs - this
1333  // must also make sure we don't go over max app procs.
1334  if (procs_in_slot == slot_size + 1 * (slot < leftover_procs && slot_size < max_app_procs))
1335  {
1336  procs_in_slot = 0;
1337  slot++;
1338  }
1339  }
1340 
1341  if (slot_for_rank[rank] < 0)
1342  // ranks assigned a negative slot don't have any apps running on them.
1343  return {0, 0, 0, 0, false, 0};
1344  const processor_id_type slot_num = cast_int<processor_id_type>(slot_for_rank[rank]);
1345 
1346  const bool is_first_local_rank = rank == 0 || (slot_for_rank[rank - 1] != slot_for_rank[rank]);
1347  const dof_id_type n_local_apps = apps_per_slot + 1 * (slot_num < leftover_apps);
1348 
1349  processor_id_type my_first_rank = 0;
1350  for (processor_id_type rankiter = rank; rankiter > 0; rankiter--)
1351  if (slot_for_rank[rank] != slot_for_rank[rankiter])
1352  {
1353  my_first_rank = cast_int<processor_id_type>(slot_for_rank[rankiter + 1]);
1354  break;
1355  }
1356 
1357  dof_id_type app_index = 0;
1358  for (processor_id_type slot = 0; slot < slot_num; slot++)
1359  {
1360  const dof_id_type num_slot_apps = apps_per_slot + 1 * (slot < leftover_apps);
1361  app_index += num_slot_apps;
1362  }
1363 
1364  if (batch_mode)
1365  return {n_local_apps, app_index, 1, slot_num, is_first_local_rank, my_first_rank};
1366  return {n_local_apps, app_index, n_local_apps, app_index, is_first_local_rank, my_first_rank};
1367 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:302
auto max(const L &left, const R &right)
uint8_t processor_id_type
auto min(const L &left, const R &right)
uint8_t dof_id_type