Loading...
Searching...
No Matches
agglomerated_distribution.hpp
Go to the documentation of this file.
1
2#pragma once
3
6
8
9/// @brief Wrap an existing subdomain_to_rank function to emit sub-comm-local ranks.
10///
11/// If the original function assigns subdomain s to parent-comm rank r, the wrapped
12/// function returns mpi::agglomerate_rank(r, factor), i.e. the corresponding rank on
13/// the factor-reduced sub-comm built by mpi::build_level_comms.
14///
15/// Assumes the sub-comm was produced with the same contiguous-stride rule (every
16/// factor-th parent rank kept), which is how build_level_comms constructs them.
17///
18/// @param orig Original assignment against the parent comm.
19/// @param factor Agglomeration factor for this descent step.
20/// @return New assignment function targeting the sub-comm.
23{
24 return [orig = std::move( orig ), factor](
25 const SubdomainInfo& s,
26 const int num_subdomains_per_diamond_side,
27 const int num_subdomains_in_radial_direction ) -> mpi::MPIRank {
28 const auto parent_rank = orig( s, num_subdomains_per_diamond_side, num_subdomains_in_radial_direction );
29 return mpi::agglomerate_rank( parent_rank, factor );
30 };
31}
32
33/// @brief Compose a chain of agglomerated subdomain_to_rank functions for a level ladder.
34///
35/// Given an original function for the finest level and a list of descent factors
36/// (the same vector passed to build_level_comms), returns a per-level subdomain_to_rank
37/// list with index i corresponding to level_comms[i]. Level 0 is the finest (original
38/// function unchanged); each later level composes one more factor division.
39///
40/// @param orig Subdomain assignment on the finest comm.
41/// @param factors Per-descent agglomeration factors.
42/// @return Per-level assignment functions. Length = factors.size() + 1.
43inline std::vector< SubdomainToRankDistributionFunction > build_level_subdomain_to_rank(
45 const std::vector< int >& factors )
46{
47 std::vector< SubdomainToRankDistributionFunction > result;
48 result.reserve( factors.size() + 1 );
49 result.push_back( orig );
50
51 int cumulative_factor = 1;
52 for ( const int f : factors )
53 {
54 cumulative_factor *= f;
55 result.push_back( agglomerated_subdomain_to_rank( orig, cumulative_factor ) );
56 }
57 return result;
58}
59
60} // namespace terra::grid::shell
(Sortable) Globally unique identifier for a single subdomain of a diamond.
Definition spherical_shell.hpp:595
Definition agglomerated_distribution.hpp:7
SubdomainToRankDistributionFunction agglomerated_subdomain_to_rank(SubdomainToRankDistributionFunction orig, int factor)
Wrap an existing subdomain_to_rank function to emit sub-comm-local ranks.
Definition agglomerated_distribution.hpp:22
std::function< mpi::MPIRank(const SubdomainInfo &, const int, const int) > SubdomainToRankDistributionFunction
Definition spherical_shell.hpp:700
std::vector< SubdomainToRankDistributionFunction > build_level_subdomain_to_rank(const SubdomainToRankDistributionFunction &orig, const std::vector< int > &factors)
Compose a chain of agglomerated subdomain_to_rank functions for a level ladder.
Definition agglomerated_distribution.hpp:43
MPIRank agglomerate_rank(MPIRank parent_rank, int factor)
Translate a parent-comm rank into its agglomerated sub-comm rank.
Definition level_comms.hpp:90
int MPIRank
Definition mpi.hpp:11