Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions include/openPMD/Iteration.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,14 @@ namespace internal
* Otherwise empty.
*/
std::optional<DeferredParseAccess> m_deferredParseAccess{};

/**
* Upon reading a file, set this field to the used file name.
* In inconsistent iteration paddings, we must remember the name of the
* file since it cannot be reconstructed from the filename pattern
* alone.
*/
std::optional<std::string> m_overrideFilebasedFilename{};
};
} // namespace internal
/** @brief Logical compilation of data from one snapshot (e.g. a single
Expand Down
2 changes: 1 addition & 1 deletion src/IO/JSON/JSONIOHandlerImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -916,7 +916,7 @@ JSONIOHandlerImpl::getFilehandle(File fileName, Access access)
fs->open(path, std::ios_base::in);
break;
}
VERIFY(fs->good(), "[JSON] Failed opening a file");
VERIFY(fs->good(), "[JSON] Failed opening a file '" + path + "'");
return fs;
}

Expand Down
1 change: 1 addition & 0 deletions src/Iteration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,7 @@ void Iteration::readFileBased(
auto series = retrieveSeries();

series.readOneIterationFileBased(filePath);
get().m_overrideFilebasedFilename = filePath;

read_impl(groupPath);
}
Expand Down
26 changes: 23 additions & 3 deletions src/Series.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1191,14 +1191,34 @@ void Series::readBase()

std::string Series::iterationFilename(uint64_t i)
{
/*
* The filename might have been overridden at the Series level or at the
* Iteration level. See the struct members' documentation for the reasons.
*/
auto &series = get();
if (series.m_overrideFilebasedFilename.has_value())
{
return series.m_overrideFilebasedFilename.value();
}
std::stringstream iteration("");
iteration << std::setw(series.m_filenamePadding) << std::setfill('0') << i;
return series.m_filenamePrefix + iteration.str() + series.m_filenamePostfix;
else if (auto iteration = iterations.find(i); //
iteration != iterations.end() &&
iteration->second.get().m_overrideFilebasedFilename.has_value())
{
return iteration->second.get().m_overrideFilebasedFilename.value();
}
else
{

/*
* If no filename has been explicitly stored, we use the filename
* pattern to compute it.
*/
std::stringstream iterationNr("");
iterationNr << std::setw(series.m_filenamePadding) << std::setfill('0')
<< i;
return series.m_filenamePrefix + iterationNr.str() +
series.m_filenamePostfix;
}
}

Series::iterations_iterator Series::indexOf(Iteration const &iteration)
Expand Down
44 changes: 44 additions & 0 deletions test/SerialIOTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5659,3 +5659,47 @@ TEST_CASE("late_setting_of_iterationencoding", "[serial]")
REQUIRE(
auxiliary::file_exists("../samples/change_name_and_encoding_10.json"));
}

void varying_pattern(std::string const file_ending)
{
{
std::string filename = "../samples/varying_pattern_%06T." + file_ending;
::openPMD::Series series =
::openPMD::Series(filename, ::openPMD::Access::CREATE);

for (auto i : {0, 8000, 10000, 100000, 2000000})
{
auto it = series.iterations[i];
it.setAttribute("my_step", i);
}
series.flush();
}
{
std::string filename = "../samples/varying_pattern_%T." + file_ending;
::openPMD::Series series =
::openPMD::Series(filename, ::openPMD::Access::READ_ONLY);

REQUIRE(series.iterations.size() == 5);
for (auto const &[step, it] : series.iterations)
{
std::cout << "Iteration: " << step << "\n";
REQUIRE(it.getAttribute("my_step").get<int>() == int(step));
}

helper::listSeries(series, true, std::cout);

for (auto i : {0, 8000, 10000, 100000, 2000000})
{
auto it = series.iterations[i];
REQUIRE(it.getAttribute("my_step").get<int>() == i);
}
}
}

TEST_CASE("varying_zero_pattern", "[serial]")
{
for (auto const &t : testedFileExtensions())
{
varying_pattern(t);
}
}