OGS
getCommunicator.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#include "getCommunicator.h"
5
6#include <hdf5.h>
7#include <math.h>
8#include <mpi.h>
9
10#include <cassert>
11
12#include "BaseLib/Logging.h"
13#include "BaseLib/MPI.h"
15
16namespace MeshLib::IO
17{
18int getGroupIndex(int const input_index, int const input_size,
19 int const new_group_size)
20{
21 // A grouping algorithm that determines the number of groups and return the
22 // group idx of the specified input_index
23 assert(input_size >= new_group_size);
24 int const minimum_output_group_size =
25 std::lround(input_size / new_group_size);
26 int const maximum_output_group_size = (input_size % new_group_size)
27 ? minimum_output_group_size + 1
28 : minimum_output_group_size;
29 return std::lround(input_index / maximum_output_group_size);
30};
31
32FileCommunicator getCommunicator(unsigned int const n_files)
33{
34 int num_procs;
35 MPI_Comm_size(BaseLib::MPI::OGS_COMM_WORLD, &num_procs);
36 int rank_id;
37 MPI_Comm_rank(BaseLib::MPI::OGS_COMM_WORLD, &rank_id);
38 int const file_group_id = getGroupIndex(rank_id, num_procs, n_files);
39 MPI_Comm new_communicator;
40 MPI_Comm_split(BaseLib::MPI::OGS_COMM_WORLD, file_group_id, rank_id,
41 &new_communicator);
42 return FileCommunicator{std::move(new_communicator),
43 std::move(file_group_id), ""};
44}
45} // namespace MeshLib::IO
MPI_Comm OGS_COMM_WORLD
Definition MPI.cpp:9
int getGroupIndex(int const input_index, int const input_size, int const new_group_size)
FileCommunicator getCommunicator(unsigned int const n_files)