https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Classes | Namespaces | Functions
MultiApp.h File Reference

Go to the source code of this file.

Classes

struct  LocalRankConfig
 Holds app partitioning information relevant to the a particular rank for a multiapp scenario. More...
 
class  SubAppBackups
 Helper class for holding Sub-app backups. More...
 
class  MultiApp
 A MultiApp represents one or more MOOSE applications that are running simultaneously. More...
 

Namespaces

namespace  libMesh
 The following methods are specializations for using the libMesh::Parallel::packed_range_* routines for std::strings.
 
namespace  libMesh::MeshTools
 

Functions

template<>
void dataStore (std::ostream &stream, LocalRankConfig &v, void *context)
 
template<>
void dataLoad (std::istream &stream, LocalRankConfig &v, void *context)
 
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).
 
void dataStore (std::ostream &stream, SubAppBackups &backups, void *context)
 
void dataLoad (std::istream &stream, SubAppBackups &backups, void *context)
 

Function Documentation

◆ dataLoad() [1/2]

template<>
void dataLoad ( std::istream &  stream,
LocalRankConfig &  v,
void *  context 
)
inline

Definition at line 91 of file MultiApp.h.

92{
93 dataLoad(stream, v.num_local_sims, context);
94 dataLoad(stream, v.first_local_sim_index, context);
95 dataLoad(stream, v.num_local_apps, context);
96 dataLoad(stream, v.first_local_app_index, context);
97 dataLoad(stream, v.is_first_local_rank, context);
98 dataLoad(stream, v.my_first_rank, context);
99}
void dataLoad(std::istream &stream, LocalRankConfig &v, void *context)
Definition MultiApp.h:91
dof_id_type num_local_sims
The number of simulations that should/will be run locally on this rank.
Definition MultiApp.h:49
dof_id_type first_local_sim_index
The (global) index of the first local simulation for this rank.
Definition MultiApp.h:53
processor_id_type my_first_rank
For every rank working on a subapp, we store the first rank on each process to make the communication...
Definition MultiApp.h:74
bool is_first_local_rank
This is true if this rank is the primary/zero rank for a (sub)app slot.
Definition MultiApp.h:71
dof_id_type num_local_apps
The number of (sub)apps that should/will be run locally on this rank.
Definition MultiApp.h:58
dof_id_type first_local_app_index
The (global) index of the first local app for this rank.
Definition MultiApp.h:64

Referenced by dataLoad().

◆ dataLoad() [2/2]

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

Definition at line 1573 of file MultiApp.C.

1574{
1575 MultiApp * multi_app = static_cast<MultiApp *>(context);
1576 mooseAssert(multi_app, "Not set");
1577
1578 dataLoad(stream, cast_ref<std::vector<std::unique_ptr<Backup>> &>(backups), nullptr);
1579
1580 multi_app->restore();
1581}
void dataLoad(std::istream &stream, SubAppBackups &backups, void *context)
Definition MultiApp.C:1573
A MultiApp represents one or more MOOSE applications that are running simultaneously.
Definition MultiApp.h:140
virtual void restore(bool force=true)
Restore the state of every Sub App.
Definition MultiApp.C:806

Referenced by dataLoad().

◆ dataStore() [1/2]

template<>
void dataStore ( std::ostream &  stream,
LocalRankConfig &  v,
void *  context 
)
inline

Definition at line 79 of file MultiApp.h.

80{
81 dataStore(stream, v.num_local_sims, context);
82 dataStore(stream, v.first_local_sim_index, context);
83 dataStore(stream, v.num_local_apps, context);
84 dataStore(stream, v.first_local_app_index, context);
85 dataStore(stream, v.is_first_local_rank, context);
86 dataStore(stream, v.my_first_rank, context);
87}
void dataStore(std::ostream &stream, LocalRankConfig &v, void *context)
Definition MultiApp.h:79

Referenced by dataStore().

◆ dataStore() [2/2]

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

Definition at line 1562 of file MultiApp.C.

1563{
1564 MultiApp * multi_app = static_cast<MultiApp *>(context);
1565 mooseAssert(multi_app, "Not set");
1566
1567 multi_app->backup();
1568
1569 dataStore(stream, cast_ref<std::vector<std::unique_ptr<Backup>> &>(backups), nullptr);
1570}
void dataStore(std::ostream &stream, SubAppBackups &backups, void *context)
Definition MultiApp.C:1562
virtual void backup()
Save off the state of every Sub App.
Definition MultiApp.C:791

Referenced by dataStore().

◆ 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 1369 of file MultiApp.C.

1375{
1376 if (min_app_procs > nprocs)
1377 mooseError("minimum number of procs per app is higher than the available number of procs");
1378 else if (min_app_procs > max_app_procs)
1379 mooseError("minimum number of procs per app must be lower than the max procs per app");
1380
1381 mooseAssert(rank < nprocs, "rank must be smaller than the number of procs");
1382
1383 // A "slot" is a group of procs/ranks that are grouped together to run a
1384 // single (sub)app/sim in parallel.
1385
1386 const processor_id_type slot_size =
1387 std::max(std::min(cast_int<processor_id_type>(nprocs / napps), max_app_procs), min_app_procs);
1388 const processor_id_type nslots = std::min(
1389 nprocs / slot_size,
1390 cast_int<processor_id_type>(std::min(
1391 static_cast<dof_id_type>(std::numeric_limits<processor_id_type>::max()), napps)));
1392 mooseAssert(nprocs >= (nslots * slot_size),
1393 "Ensure that leftover procs is represented by an unsigned type");
1394 const processor_id_type leftover_procs = nprocs - nslots * slot_size;
1395 const dof_id_type apps_per_slot = napps / nslots;
1396 const dof_id_type leftover_apps = napps % nslots;
1397
1398 std::vector<int> slot_for_rank(nprocs);
1399 processor_id_type slot = 0;
1400 processor_id_type procs_in_slot = 0;
1401 for (processor_id_type rankiter = 0; rankiter <= rank; rankiter++)
1402 {
1403 if (slot < nslots)
1404 slot_for_rank[rankiter] = cast_int<int>(slot);
1405 else
1406 slot_for_rank[rankiter] = -1;
1407 procs_in_slot++;
1408 // this slot keeps growing until we reach slot size plus possibly an extra
1409 // proc if there were any leftover from the slotization of nprocs - this
1410 // must also make sure we don't go over max app procs.
1411 if (procs_in_slot == slot_size + 1 * (slot < leftover_procs && slot_size < max_app_procs))
1412 {
1413 procs_in_slot = 0;
1414 slot++;
1415 }
1416 }
1417
1418 if (slot_for_rank[rank] < 0)
1419 // ranks assigned a negative slot don't have any apps running on them.
1420 return {0, 0, 0, 0, false, 0};
1421 const processor_id_type slot_num = cast_int<processor_id_type>(slot_for_rank[rank]);
1422
1423 const bool is_first_local_rank = rank == 0 || (slot_for_rank[rank - 1] != slot_for_rank[rank]);
1424 const dof_id_type n_local_apps = apps_per_slot + 1 * (slot_num < leftover_apps);
1425
1426 processor_id_type my_first_rank = 0;
1427 for (processor_id_type rankiter = rank; rankiter > 0; rankiter--)
1428 if (slot_for_rank[rank] != slot_for_rank[rankiter])
1429 {
1430 my_first_rank = cast_int<processor_id_type>(slot_for_rank[rankiter + 1]);
1431 break;
1432 }
1433
1434 dof_id_type app_index = 0;
1435 for (processor_id_type slot = 0; slot < slot_num; slot++)
1436 {
1437 const dof_id_type num_slot_apps = apps_per_slot + 1 * (slot < leftover_apps);
1438 app_index += num_slot_apps;
1439 }
1440
1441 if (batch_mode)
1442 return {n_local_apps, app_index, 1, slot_num, is_first_local_rank, my_first_rank};
1443 return {n_local_apps, app_index, n_local_apps, app_index, is_first_local_rank, my_first_rank};
1444}
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
uint8_t processor_id_type
uint8_t dof_id_type

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