Skip to content

Commit bb15fb9

Browse files
committed
Skip preparsing variables if not needed
1 parent 2fc1c41 commit bb15fb9

2 files changed

Lines changed: 45 additions & 2 deletions

File tree

include/openPMD/IO/ADIOS/ADIOS2IOHandler.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,11 @@ class ADIOS2IOHandlerImpl
436436
detail::AdiosVariables const &av)
437437
{
438438
auto var_steps = var.Steps();
439+
if (var_steps == 1 && step_selection == 0)
440+
{
441+
// variable has no steps
442+
return;
443+
}
439444
if (file_steps != var_steps)
440445
{
441446
if (!av.m_preparsed.has_value())

src/IO/ADIOS/ADIOS2IOHandler.cpp

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1551,6 +1551,22 @@ namespace
15511551
dtype, var, step, totalNumSteps, IO, out);
15521552
}
15531553
}
1554+
1555+
struct VariableNumSteps
1556+
{
1557+
template <typename T>
1558+
static size_t call(std::string const &varName, adios2::IO &IO)
1559+
{
1560+
auto var = IO.InquireVariable<T>(varName);
1561+
if (!var)
1562+
{
1563+
throw std::runtime_error(
1564+
"Failed inquiring variable '" + varName + "'.");
1565+
}
1566+
return var.Steps();
1567+
}
1568+
static constexpr char const *errorMsg = "VariableNumSteps";
1569+
};
15541570
} // namespace
15551571

15561572
void ADIOS2IOHandlerImpl::readAttributeAllsteps(
@@ -1588,15 +1604,37 @@ void ADIOS2IOHandlerImpl::readAttributeAllsteps(
15881604

15891605
std::vector<detail::PreloadAdiosAttributes> preload;
15901606
size_t totalNumSteps = engine.Steps();
1607+
1608+
bool requires_variable_preparsing = false;
1609+
for ([[maybe_unused]] auto const &[varName, _] :
1610+
preparsedVariableData.m_allVariables)
1611+
{
1612+
auto dtype = detail::fromADIOS2Type(ba.m_IO.VariableType(varName));
1613+
size_t variable_num_steps =
1614+
switchAdios2VariableType<VariableNumSteps>(dtype, varName, ba.m_IO);
1615+
if (variable_num_steps != totalNumSteps)
1616+
{
1617+
requires_variable_preparsing = true;
1618+
}
1619+
}
1620+
1621+
if (!requires_variable_preparsing)
1622+
{
1623+
ba.variables().m_preparsed.reset();
1624+
}
1625+
15911626
preload.reserve(totalNumSteps);
15921627
adios2::StepStatus status;
15931628
size_t step = 0;
15941629
while ((status = engine.BeginStep()) == adios2::StepStatus::OK)
15951630
{
15961631
auto &new_entry = preload.emplace_back();
15971632
new_entry.preloadAttributes(IO);
1598-
preparseVariablesForStep(
1599-
step, totalNumSteps, IO, preparsedVariableData);
1633+
if (requires_variable_preparsing)
1634+
{
1635+
preparseVariablesForStep(
1636+
step, totalNumSteps, IO, preparsedVariableData);
1637+
}
16001638
engine.EndStep();
16011639
++step;
16021640
}

0 commit comments

Comments
 (0)