8 #ifndef TEST_MPI_MPI_H_
9 #define TEST_MPI_MPI_H_
11 #include <Eigen/Dense>
16 #include "eckit/config/LocalConfiguration.h"
17 #include "eckit/mpi/Comm.h"
18 #include "eckit/testing/Test.h"
23 #include "oops/util/DateTime.h"
24 #include "oops/util/Expect.h"
25 #include "oops/util/parameters/Parameters.h"
26 #include "oops/util/parameters/RequiredParameter.h"
32 template <>
struct VectorPrintSelector<
util::DateTime> {
typedef VectorPrintSimple selector; };
40 oops::RequiredParameter<std::vector<util::DateTime>>
values{
"values",
this};
44 CASE(
"mpi/mpi/defaultCommunicators") {
46 size_t worldsize =
world.size();
47 EXPECT_EQUAL(worldsize, 4);
50 size_t myownsize = talk_to_myself.size();
51 EXPECT_EQUAL(myownsize, 1);
54 CASE(
"mpi/mpi/allGathervUsingSerialize") {
59 const size_t rank = comm.rank();
60 localParams.deserialize(conf.getSubConfiguration(
"local" + std::to_string(rank)));
61 const std::vector<util::DateTime> &localValues = localParams.
values;
64 globalParams.deserialize(conf.getSubConfiguration(
"global"));
65 const std::vector<util::DateTime> &expectedGlobalValues = globalParams.
values;
67 size_t numGlobalValues;
68 comm.allReduce(localValues.size(), numGlobalValues, eckit::mpi::Operation::SUM);
70 std::vector<util::DateTime> globalValues(numGlobalValues);
72 globalValues.begin());
73 EXPECT_EQUAL(globalValues, expectedGlobalValues);
76 CASE(
"mpi/mpi/SendReceive") {
79 const size_t rank = comm.rank();
80 int source = (rank + 3) % comm.size();
81 int destination = (rank + 1) % comm.size();
82 int tag_send = destination;
85 util::DateTime sendValue(conf.getString(
"send"+ std::to_string(rank)));
86 util::DateTime expectedValue(conf.getString(
"expected"+ std::to_string(rank)));
87 util::DateTime receivedValue;
96 EXPECT_EQUAL(receivedValue, expectedValue);
99 CASE(
"mpi/mpi/gatherSerializable") {
104 const size_t rank = comm.rank();
105 localParams.deserialize(conf.getSubConfiguration(
"local" + std::to_string(rank)));
106 const std::vector<util::DateTime> &localValues = localParams.
values;
109 globalParams.deserialize(conf.getSubConfiguration(
"global"));
110 const std::vector<util::DateTime> &expectedGlobalValues = globalParams.
values;
112 size_t numGlobalValues;
113 comm.allReduce(localValues.size(), numGlobalValues, eckit::mpi::Operation::SUM);
115 std::vector<util::DateTime> globalValues(numGlobalValues);
117 util::DateTime zeroDate(
"0001-01-01T00:00:00Z");
118 for (
int ii = 0; ii < numGlobalValues; ++ii) {
119 globalValues[ii] = zeroDate;
122 std::vector<util::DateTime> zeroValues = globalValues;
124 int root_gather = conf.getInt(
"root for gathering", 0);
127 if (rank == root_gather) {
128 EXPECT_EQUAL(globalValues, expectedGlobalValues);
130 EXPECT_EQUAL(globalValues, zeroValues);
137 const size_t rank = comm.rank();
139 std::vector<double> localDouble;
140 conf.get(
"localDouble" + std::to_string(rank), localDouble);
142 std::vector<double> globalDoubleExpected;
143 conf.get(
"globalDouble", globalDoubleExpected);
145 size_t numGlobalDouble;
146 comm.allReduce(localDouble.size(), numGlobalDouble, eckit::mpi::Operation::SUM);
148 std::vector<double> globalDouble(numGlobalDouble, 0.0);
149 std::vector<double> zerosDouble = globalDouble;
151 int root_gather = conf.getInt(
"root for gathering", 0);
155 if (rank == root_gather) {
156 EXPECT_EQUAL(globalDouble, globalDoubleExpected);
158 EXPECT_EQUAL(globalDouble, zerosDouble);
162 CASE(
"mpi/mpi/allGatherEigen") {
164 const size_t rank = comm.rank();
165 Eigen::VectorXd localEigen = rank * Eigen::VectorXd::Ones(5);
166 std::vector<Eigen::VectorXd> globalEigen = {Eigen::VectorXd::Zero(5), Eigen::VectorXd::Zero(5),
167 Eigen::VectorXd::Zero(5), Eigen::VectorXd::Zero(5)};
168 std::vector<Eigen::VectorXd> expectedEigen = {0*Eigen::VectorXd::Ones(5),
169 1*Eigen::VectorXd::Ones(5),
170 2*Eigen::VectorXd::Ones(5),
171 3*Eigen::VectorXd::Ones(5)};
173 EXPECT_EQUAL(expectedEigen[0], globalEigen[0]);
174 EXPECT_EQUAL(expectedEigen[1], globalEigen[1]);
175 EXPECT_EQUAL(expectedEigen[2], globalEigen[2]);
176 EXPECT_EQUAL(expectedEigen[3], globalEigen[3]);
182 std::string
testid()
const override {
return "test::mpi::mpi";}
190 #endif // TEST_MPI_MPI_H_