diff --git a/include/openPMD/Error.hpp b/include/openPMD/Error.hpp index 3e516e16ec..d1762e7e6d 100644 --- a/include/openPMD/Error.hpp +++ b/include/openPMD/Error.hpp @@ -109,6 +109,12 @@ namespace error public: NoSuchAttribute(std::string attributeName); }; + + class IllegalInOpenPMDStandard : public Error + { + public: + IllegalInOpenPMDStandard(std::string what); + }; } // namespace error /** diff --git a/include/openPMD/version.hpp b/include/openPMD/version.hpp index c57e3ecf17..e9748b3939 100644 --- a/include/openPMD/version.hpp +++ b/include/openPMD/version.hpp @@ -37,11 +37,20 @@ * compile-time) * @{ */ -#define OPENPMD_STANDARD_MAJOR 1 -#define OPENPMD_STANDARD_MINOR 1 +#define OPENPMD_STANDARD_MAJOR 2 +#define OPENPMD_STANDARD_MINOR 0 #define OPENPMD_STANDARD_PATCH 0 /** @} */ +/** maximum supported version of the openPMD standard (read & write, + * compile-time) + * @{ + */ +#define OPENPMD_STANDARD_DEFAULT_MAJOR 1 +#define OPENPMD_STANDARD_DEFAULT_MINOR 1 +#define OPENPMD_STANDARD_DEFAULT_PATCH 0 +/** @} */ + /** minimum supported version of the openPMD standard (read, compile-time) * @{ */ @@ -79,6 +88,13 @@ std::string getVersion(); */ std::string getStandard(); +/** Return the default used version of the openPMD standard (read & write, + * run-time) + * + * @return std::string openPMD standard version (dot separated) + */ +std::string getStandardDefault(); + /** Return the minimum supported version of the openPMD standard (read, * run-time) * diff --git a/src/Error.cpp b/src/Error.cpp index f2e27a0213..dbc13f40b0 100644 --- a/src/Error.cpp +++ b/src/Error.cpp @@ -122,6 +122,12 @@ namespace error , description(std::move(description_in)) {} + IllegalInOpenPMDStandard::IllegalInOpenPMDStandard(std::string what_in) + : Error( + "Operation leads to illegal use of the openPMD standard:\n" + + std::move(what_in)) + {} + void throwReadError( AffectedObject affectedObject, Reason reason, diff --git a/src/Series.cpp b/src/Series.cpp index 84758aaac0..b92a5eff37 100644 --- a/src/Series.cpp +++ b/src/Series.cpp @@ -147,9 +147,10 @@ std::string Series::basePath() const Series &Series::setBasePath(std::string const &bp) { std::string version = openPMD(); - if (version == "1.0.0" || version == "1.0.1" || version == "1.1.0") + if (version == "1.0.0" || version == "1.0.1" || version == "1.1.0" || + version == "2.0.0") throw std::runtime_error( - "Custom basePath not allowed in openPMD <=1.1.0"); + "Custom basePath not allowed in openPMD <=2.0"); setAttribute("basePath", bp); return *this; @@ -684,7 +685,7 @@ void Series::initDefaults(IterationEncoding ie, bool initAll) } } if (!containsAttribute("openPMD")) - setOpenPMD(getStandard()); + setOpenPMD(getStandardDefault()); /* * In Append mode, only init the rest of the defaults after checking that * the file does not yet exist to avoid overriding more than needed. @@ -1273,7 +1274,8 @@ void Series::readOneIterationFileBased(std::string const &filePath) Parameter pOpen; std::string version = openPMD(); - if (version == "1.0.0" || version == "1.0.1" || version == "1.1.0") + if (version == "1.0.0" || version == "1.0.1" || version == "1.1.0" || + version == "2.0.0") pOpen.path = auxiliary::replace_first(basePath(), "/%T/", ""); else throw error::ReadError( @@ -1425,7 +1427,8 @@ creating new iterations. Parameter pOpen; std::string version = openPMD(); - if (version == "1.0.0" || version == "1.0.1" || version == "1.1.0") + if (version == "1.0.0" || version == "1.0.1" || version == "1.1.0" || + version == "2.0.0") pOpen.path = auxiliary::replace_first(basePath(), "/%T/", ""); else throw error::ReadError( diff --git a/src/binding/python/Error.cpp b/src/binding/python/Error.cpp index 681398c579..27d9c7d9b4 100644 --- a/src/binding/python/Error.cpp +++ b/src/binding/python/Error.cpp @@ -9,6 +9,7 @@ #include "openPMD/Error.hpp" #include "openPMD/binding/python/Common.hpp" +#include void init_Error(py::module &m) { @@ -22,6 +23,8 @@ void init_Error(py::module &m) py::register_exception(m, "ErrorInternal", baseError); py::register_exception( m, "ErrorNoSuchAttribute", baseError); + py::register_exception( + m, "ErrorIllegalInOpenPMDStandard", baseError); #ifndef NDEBUG m.def("test_throw", [](std::string description) { diff --git a/src/version.cpp b/src/version.cpp index c2e8809a32..5feeccba13 100644 --- a/src/version.cpp +++ b/src/version.cpp @@ -41,6 +41,16 @@ std::string openPMD::getStandard() return standard.str(); } +std::string openPMD::getStandardDefault() +{ + std::stringstream standard; + standard << OPENPMD_STANDARD_DEFAULT_MAJOR << "." + << OPENPMD_STANDARD_DEFAULT_MINOR << "." + << OPENPMD_STANDARD_DEFAULT_PATCH; + std::string const standardstr = standard.str(); + return standardstr; +} + std::string openPMD::getStandardMinimum() { std::stringstream standardMin; diff --git a/test/CoreTest.cpp b/test/CoreTest.cpp index 084d118578..ac06aaf4c7 100644 --- a/test/CoreTest.cpp +++ b/test/CoreTest.cpp @@ -35,8 +35,11 @@ TEST_CASE("versions_test", "[core]") auto const is_dot = [](char const c) { return c == '.'; }; REQUIRE(2u == std::count_if(apiVersion.begin(), apiVersion.end(), is_dot)); + auto const standardDefault = getStandardDefault(); + REQUIRE(standardDefault == "1.1.0"); + auto const standard = getStandard(); - REQUIRE(standard == "1.1.0"); + REQUIRE(standard == "2.0.0"); auto const standardMin = getStandardMinimum(); REQUIRE(standardMin == "1.0.0"); diff --git a/test/SerialIOTest.cpp b/test/SerialIOTest.cpp index e0d4c75348..3a57a6c185 100644 --- a/test/SerialIOTest.cpp +++ b/test/SerialIOTest.cpp @@ -905,6 +905,7 @@ inline void constant_scalar(std::string const &file_ending) // constant scalar Series s = Series("../samples/constant_scalar." + file_ending, Access::CREATE); + s.setOpenPMD("2.0.0"); auto rho = s.iterations[1].meshes["rho"][MeshRecordComponent::SCALAR]; REQUIRE(s.iterations[1].meshes["rho"].scalar()); rho.resetDataset(Dataset(Datatype::CHAR, {1, 2, 3}));