8 #ifndef TEST_IO_OBSIOREAD_H_
9 #define TEST_IO_OBSIOREAD_H_
20 #define ECKIT_TESTING_SELF_REGISTER_CASES 0
22 #include "eckit/config/LocalConfiguration.h"
23 #include "eckit/testing/Test.h"
25 #include "oops/mpi/mpi.h"
26 #include "oops/runs/Test.h"
27 #include "oops/test/TestEnvironment.h"
28 #include "oops/util/DateTime.h"
29 #include "oops/util/FloatCompare.h"
30 #include "oops/util/Logger.h"
32 #include "ioda/core/IodaUtils.h"
33 #include "ioda/distribution/DistributionFactory.h"
34 #include "ioda/io/ObsIo.h"
35 #include "ioda/io/ObsIoFactory.h"
37 #include "ioda/ObsSpaceParameters.h"
53 const eckit::LocalConfiguration conf(::test::TestEnvironment::config());
54 std::vector<eckit::LocalConfiguration> confOspaces = conf.getSubConfigurations(
"observations");
55 util::DateTime bgn(::test::TestEnvironment::config().getString(
"window begin"));
56 util::DateTime end(::test::TestEnvironment::config().getString(
"window end"));
58 for (std::size_t i = 0; i < confOspaces.size(); ++i) {
59 eckit::LocalConfiguration obsConfig;
60 eckit::LocalConfiguration testConfig;
61 confOspaces[i].get(
"obs space", obsConfig);
62 confOspaces[i].get(
"test data", testConfig);
63 oops::Log::trace() <<
"ObsIo testRead obs space config: " << i <<
": "
64 << obsConfig << std::endl;
65 oops::Log::trace() <<
"ObsIo testRead test data config: " << i <<
": "
66 << testConfig << std::endl;
72 std::shared_ptr<ObsIo> obsIo;
76 float floatTol = testConfig.getFloat(
"tolerance", 1.0e-5);
77 std::vector<eckit::LocalConfiguration> readVarConfigs =
78 testConfig.getSubConfigurations(
"read variables");
80 for (std::size_t ivar = 0; ivar < readVarConfigs.size(); ++ivar) {
81 std::string varName = readVarConfigs[ivar].getString(
"name");
82 std::string expectedVarType = readVarConfigs[ivar].getString(
"type");
85 if (expectedVarType ==
"int") {
86 EXPECT(var.
isA<
int>());
87 std::vector<int> expectedVarValues =
88 readVarConfigs[ivar].getIntVector(
"values");
89 std::vector<int> varValues;
90 var.
read<
int>(varValues);
91 for (std::size_t ival = 0; ival < expectedVarValues.size(); ++ival) {
92 EXPECT_EQUAL(varValues[ival], expectedVarValues[ival]);
94 }
else if (expectedVarType ==
"float") {
95 EXPECT(var.
isA<
float>());
96 std::vector<float> expectedVarValues =
97 readVarConfigs[ivar].getFloatVector(
"values");
98 std::vector<float> varValues;
99 var.
read<
float>(varValues);
100 for (std::size_t ival = 0; ival < expectedVarValues.size(); ++ival) {
101 EXPECT(oops::is_close_relative(varValues[ival],
102 expectedVarValues[ival], floatTol));
104 }
else if (expectedVarType ==
"string") {
105 EXPECT(var.
isA<std::string>());
106 std::vector<std::string> expectedVarValues =
107 readVarConfigs[ivar].getStringVector(
"values");
108 std::vector<std::string> varValues;
110 if (varDims.dimensionality > 1) {
112 std::vector<std::string> stringArray = var.
readAsVector<std::string>();
115 var.
read<std::string>(varValues);
117 for (std::size_t ival = 0; ival < expectedVarValues.size(); ++ival) {
118 EXPECT_EQUAL(varValues[ival], expectedVarValues[ival]);
132 std::string
testid()
const override {
return "test::ObsIoRead";}
135 std::vector<eckit::testing::Test>& ts = eckit::testing::specification();
137 ts.emplace_back(
CASE(
"ioda/ObsIoRead/testRead")
Interfaces for ioda::ObsGroup and related classes.
Interfaces for ioda::Variable and related classes.
static std::shared_ptr< ObsIo > create(ObsIoModes mode, const ObsSpaceParameters ¶meters)
Create and return a new instance of an ObsIo subclass.
void deserialize(const eckit::Configuration &config)
deserialize the parameter sub groups
bool isA() const
Convenience function to check a Variable's storage type.
virtual Dimensions getDimensions() const
std::vector< DataType > readAsVector(const Selection &mem_selection=Selection::all, const Selection &file_selection=Selection::all) const
Read the variable into a new vector. Python convenience function.
virtual Variable read(gsl::span< char > data, const Type &in_memory_dataType, const Selection &mem_selection=Selection::all, const Selection &file_selection=Selection::all) const
Read the Variable - as char array. Ordering is row-major.
void clear() const override
void register_tests() const override
std::string testid() const override
CASE("Derived variable and unit conversion methods")
std::vector< std::string > StringArrayToStringVector(const std::vector< std::string > &arrayData, const std::vector< Dimensions_t > &arrayShape)
convert 2D string array to a vector of strings
std::vector< Dimensions_t > dimsCur
The dimensions of the data.