OGS
getCommunicator.cpp
Go to the documentation of this file.
1
14#include "getCommunicator.h"
15
16#include <hdf5.h>
17#include <math.h>
18#include <mpi.h>
19
20#include <cassert>
21
22#include "BaseLib/Logging.h"
23#include "BaseLib/MPI.h"
25
26namespace MeshLib::IO
27{
28int getGroupIndex(int const input_index, int const input_size,
29 int const new_group_size)
30{
31 // A grouping algorithm that determines the number of groups and return the
32 // group idx of the specified input_index
33 assert(input_size >= new_group_size);
34 int const minimum_output_group_size =
35 std::lround(input_size / new_group_size);
36 int const maximum_output_group_size = (input_size % new_group_size)
37 ? minimum_output_group_size + 1
38 : minimum_output_group_size;
39 return std::lround(input_index / maximum_output_group_size);
40};
41
42FileCommunicator getCommunicator(unsigned int const n_files)
43{
44 int num_procs;
45 MPI_Comm_size(BaseLib::MPI::OGS_COMM_WORLD, &num_procs);
46 int rank_id;
47 MPI_Comm_rank(BaseLib::MPI::OGS_COMM_WORLD, &rank_id);
48 int const file_group_id = getGroupIndex(rank_id, num_procs, n_files);
49 MPI_Comm new_communicator;
50 MPI_Comm_split(BaseLib::MPI::OGS_COMM_WORLD, file_group_id, rank_id,
51 &new_communicator);
52 return FileCommunicator{std::move(new_communicator),
53 std::move(file_group_id), ""};
54}
55} // namespace MeshLib::IO
Dispatches HDF5 functions specific to execution platform (w/o MPI). There are multiple implementation...
Assigns to each MPI communicator an output file name by attribute color There are multiple implementa...
MPI_Comm OGS_COMM_WORLD
Definition MPI.cpp:15
int getGroupIndex(int const input_index, int const input_size, int const new_group_size)
FileCommunicator getCommunicator(unsigned int const n_files)