@@ -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
15561572void 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