11 #ifndef TEST_DISTRIBUTION_DISTRIBUTION_H_
12 #define TEST_DISTRIBUTION_DISTRIBUTION_H_
21 #define ECKIT_TESTING_SELF_REGISTER_CASES 0
23 #include <boost/noncopyable.hpp>
25 #include "eckit/config/LocalConfiguration.h"
26 #include "eckit/mpi/Comm.h"
27 #include "eckit/testing/Test.h"
29 #include "oops/mpi/mpi.h"
30 #include "oops/runs/Test.h"
31 #include "oops/test/TestEnvironment.h"
32 #include "oops/util/Logger.h"
34 #include "ioda/distribution/Distribution.h"
35 #include "ioda/distribution/DistributionFactory.h"
43 const eckit::LocalConfiguration conf(::test::TestEnvironment::config());
44 std::vector<eckit::LocalConfiguration> dist_types;
45 const eckit::mpi::Comm & MpiComm = oops::mpi::world();
47 std::string TestDistType;
49 std::unique_ptr<ioda::Distribution> TestDist;
50 DistributionFactory * DistFactory =
nullptr;
53 conf.get(
"distribution types", dist_types);
54 for (std::size_t i = 0; i < dist_types.size(); ++i) {
55 oops::Log::debug() <<
"Distribution::DistributionTypes: conf: " << dist_types[i] << std::endl;
57 TestDistType = dist_types[i].getString(
"distribution");
58 oops::Log::debug() <<
"Distribution::DistType: " << TestDistType << std::endl;
60 DistName = dist_types[i].getString(
"specs.name");
61 TestDist.reset(DistFactory->createDistribution(MpiComm, DistName));
62 EXPECT(TestDist.get());
69 const eckit::LocalConfiguration conf(::test::TestEnvironment::config());
70 std::vector<eckit::LocalConfiguration> dist_types;
71 const eckit::mpi::Comm & MpiComm = oops::mpi::world();
73 std::string TestDistType;
75 std::unique_ptr<ioda::Distribution> TestDist;
78 std::size_t MyRank = MpiComm.rank();
81 conf.get(
"distribution types", dist_types);
82 for (std::size_t i = 0; i < dist_types.size(); ++i) {
83 oops::Log::debug() <<
"Distribution::DistributionTypes: conf: "
84 << dist_types[i] << std::endl;
86 TestDistType = dist_types[i].getString(
"distribution");
87 oops::Log::debug() <<
"Distribution::DistType: " << TestDistType << std::endl;
89 DistName = dist_types[i].getString(
"specs.name");
91 EXPECT(TestDist.get());
95 std::string MyRankCfgName =
"specs.rank" + std::to_string(MyRank);
96 eckit::LocalConfiguration MyRankConfig = dist_types[i].getSubConfiguration(MyRankCfgName);
97 oops::Log::debug() <<
"Distribution::DistributionTypes: "
98 << MyRankCfgName <<
": " << MyRankConfig << std::endl;
100 std::size_t ExpectedNlocs = MyRankConfig.getUnsigned(
"nlocs");
101 std::size_t ExpectedNrecs = MyRankConfig.getUnsigned(
"nrecs");
102 std::vector<std::size_t> ExpectedIndex =
103 MyRankConfig.getUnsignedVector(
"index");
104 std::vector<std::size_t> ExpectedRecnums =
105 MyRankConfig.getUnsignedVector(
"recnums");
110 std::size_t Gnlocs = dist_types[i].getInt(
"specs.gnlocs");
111 std::vector<std::size_t> Groups(Gnlocs, 0);
112 if (dist_types[i].has(
"specs.obsgrouping")) {
113 Groups = dist_types[i].getUnsignedVector(
"specs.obsgrouping");
115 std::iota(Groups.begin(), Groups.end(), 0);
119 std::vector<std::size_t> Index;
120 std::vector<std::size_t> Recnums;
121 std::set<std::size_t> UniqueRecnums;
122 for (std::size_t j = 0; j < Gnlocs; ++j) {
123 std::size_t RecNum = Groups[j];
124 if (TestDist->isMyRecord(RecNum)) {
126 Recnums.push_back(RecNum);
127 UniqueRecnums.insert(RecNum);
132 std::size_t Nlocs = Index.size();
133 std::size_t Nrecs = UniqueRecnums.size();
134 EXPECT(Nlocs == ExpectedNlocs);
135 EXPECT(Nrecs == ExpectedNrecs);
138 for (std::size_t j = 0; j < ExpectedIndex.size(); ++j) {
139 EXPECT(Index[j] == ExpectedIndex[j]);
142 for (std::size_t j = 0; j < ExpectedRecnums.size(); ++j) {
143 EXPECT(Recnums[j] == ExpectedRecnums[j]);
155 std::string
testid()
const override {
return "test::Distribution";}
158 std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
160 ts.emplace_back(CASE(
"distribution/Distribution/testConstructor")
162 ts.emplace_back(CASE(
"distribution/Distribution/testDistribution")
174 #endif // TEST_DISTRIBUTION_DISTRIBUTION_H_