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_