diff --git a/source/adios2/core/Engine.h b/source/adios2/core/Engine.h index c102ef64ba..f91e264b68 100644 --- a/source/adios2/core/Engine.h +++ b/source/adios2/core/Engine.h @@ -486,9 +486,10 @@ class Engine } // in this call, Step is RELATIVE, not absolute - virtual Dims *VarShape(const VariableBase &, const size_t Step) const + virtual bool VarShape(const VariableBase &, const size_t Step, + Dims &Shape) const { - return nullptr; + return false; } virtual bool VariableMinMax(const VariableBase &, const size_t Step, diff --git a/source/adios2/core/VariableBase.cpp b/source/adios2/core/VariableBase.cpp index c12e017859..684f15356e 100644 --- a/source/adios2/core/VariableBase.cpp +++ b/source/adios2/core/VariableBase.cpp @@ -628,12 +628,10 @@ Dims VariableBase::Shape(const size_t step) const if (m_Engine) { + Dims tmp; // see if the engine implements Variable Shape inquiry - auto ShapePtr = m_Engine->VarShape(*this, step); - if (ShapePtr) - { - return *ShapePtr; - } + if (m_Engine->VarShape(*this, step, tmp)) + return tmp; } if (m_FirstStreamingStep && step == adios2::EngineCurrentStep) { diff --git a/source/adios2/engine/bp5/BP5Reader.cpp b/source/adios2/engine/bp5/BP5Reader.cpp index f82ca482f1..80034dedba 100644 --- a/source/adios2/engine/bp5/BP5Reader.cpp +++ b/source/adios2/engine/bp5/BP5Reader.cpp @@ -684,9 +684,10 @@ MinVarInfo *BP5Reader::MinBlocksInfo(const VariableBase &Var, return m_BP5Deserializer->MinBlocksInfo(Var, Step); } -Dims *BP5Reader::VarShape(const VariableBase &Var, const size_t Step) const +bool BP5Reader::VarShape(const VariableBase &Var, const size_t Step, + Dims &Shape) const { - return m_BP5Deserializer->VarShape(Var, Step); + return m_BP5Deserializer->VarShape(Var, Step, Shape); } bool BP5Reader::VariableMinMax(const VariableBase &Var, const size_t Step, diff --git a/source/adios2/engine/bp5/BP5Reader.h b/source/adios2/engine/bp5/BP5Reader.h index 6b947764b3..b8cd74d4b3 100644 --- a/source/adios2/engine/bp5/BP5Reader.h +++ b/source/adios2/engine/bp5/BP5Reader.h @@ -57,7 +57,8 @@ class BP5Reader : public BP5Engine, public Engine void PerformGets() final; MinVarInfo *MinBlocksInfo(const VariableBase &, const size_t Step) const; - Dims *VarShape(const VariableBase &, const size_t Step) const; + bool VarShape(const VariableBase &Var, const size_t Step, + Dims &Shape) const; bool VariableMinMax(const VariableBase &, const size_t Step, MinMaxStruct &MinMax); diff --git a/source/adios2/engine/sst/SstReader.cpp b/source/adios2/engine/sst/SstReader.cpp index cb11ca971d..7628fd2b2f 100644 --- a/source/adios2/engine/sst/SstReader.cpp +++ b/source/adios2/engine/sst/SstReader.cpp @@ -691,12 +691,13 @@ void SstReader::DoGetStructDeferred(VariableStruct &variable, void *data) m_BP5Deserializer->QueueGet(variable, data); } -Dims *SstReader::VarShape(const VariableBase &Var, const size_t Step) const +bool SstReader::VarShape(const VariableBase &Var, const size_t Step, + Dims &Shape) const { if (m_WriterMarshalMethod != SstMarshalBP5) - return nullptr; + return false; - return m_BP5Deserializer->VarShape(Var, Step); + return m_BP5Deserializer->VarShape(Var, Step, Shape); } bool SstReader::VariableMinMax(const VariableBase &Var, const size_t Step, diff --git a/source/adios2/engine/sst/SstReader.h b/source/adios2/engine/sst/SstReader.h index 2e5bfe2d32..e612a12c6f 100644 --- a/source/adios2/engine/sst/SstReader.h +++ b/source/adios2/engine/sst/SstReader.h @@ -51,7 +51,8 @@ class SstReader : public Engine void PerformGets(); void Flush(const int transportIndex = -1) final; MinVarInfo *MinBlocksInfo(const VariableBase &, const size_t Step) const; - Dims *VarShape(const VariableBase &, const size_t Step) const; + bool VarShape(const VariableBase &Var, const size_t Step, + Dims &Shape) const; bool VariableMinMax(const VariableBase &, const size_t Step, MinMaxStruct &MinMax); diff --git a/source/adios2/toolkit/format/bp5/BP5Deserializer.cpp b/source/adios2/toolkit/format/bp5/BP5Deserializer.cpp index 1bf2681cb1..b7edfc9e50 100644 --- a/source/adios2/toolkit/format/bp5/BP5Deserializer.cpp +++ b/source/adios2/toolkit/format/bp5/BP5Deserializer.cpp @@ -498,6 +498,7 @@ void *BP5Deserializer::VarSetup(core::Engine *engine, const char *variableName, { \ core::Variable *variable = \ &(engine->m_IO.DefineVariable(variableName)); \ + engine->RegisterCreatedVariable(variable); \ variable->SetData((T *)data); \ variable->m_AvailableStepsCount = 1; \ return (void *)variable; \ @@ -547,6 +548,7 @@ void *BP5Deserializer::ArrayVarSetup(core::Engine *engine, { core::VariableStruct *variable = &(engine->m_IO.DefineStructVariable( variableName, *Def, VecShape, VecStart, VecCount)); + engine->RegisterCreatedVariable(variable); variable->m_ReadStructDefinition = ReaderDef; return (void *)variable; } @@ -555,6 +557,7 @@ void *BP5Deserializer::ArrayVarSetup(core::Engine *engine, { \ core::Variable *variable = \ &(engine->m_IO.DefineVariable(variableName)); \ + engine->RegisterCreatedVariable(variable); \ variable->m_Shape = VecShape; \ variable->m_Start = VecStart; \ variable->m_Count = VecCount; \ @@ -2100,13 +2103,13 @@ void BP5Deserializer::GetAbsoluteSteps(const VariableBase &Var, } } -Dims *BP5Deserializer::VarShape(const VariableBase &Var, - const size_t RelStep) const +bool BP5Deserializer::VarShape(const VariableBase &Var, const size_t RelStep, + Dims &Shape) const { BP5VarRec *VarRec = LookupVarByKey((void *)&Var); if (VarRec->OrigShapeID != ShapeID::GlobalArray) { - return nullptr; + return false; } size_t AbsStep = RelStep; if (m_RandomAccessMode) @@ -2127,16 +2130,15 @@ Dims *BP5Deserializer::VarShape(const VariableBase &Var, (MetaArrayRec *)GetMetadataBase(VarRec, AbsStep, WriterRank); if (writer_meta_base && writer_meta_base->Shape) { - Dims *Shape = new Dims(); - Shape->reserve(writer_meta_base->Dims); + Shape.resize(writer_meta_base->Dims); for (size_t i = 0; i < writer_meta_base->Dims; i++) { - Shape->push_back(writer_meta_base->Shape[i]); + Shape[i] = writer_meta_base->Shape[i]; } - return Shape; + return true; } } - return nullptr; + return false; } bool BP5Deserializer::VariableMinMax(const VariableBase &Var, const size_t Step, diff --git a/source/adios2/toolkit/format/bp5/BP5Deserializer.h b/source/adios2/toolkit/format/bp5/BP5Deserializer.h index 81579d835e..f662695c3c 100644 --- a/source/adios2/toolkit/format/bp5/BP5Deserializer.h +++ b/source/adios2/toolkit/format/bp5/BP5Deserializer.h @@ -84,7 +84,7 @@ class BP5Deserializer : virtual public BP5Base MinVarInfo *AllRelativeStepsMinBlocksInfo(const VariableBase &var); MinVarInfo *AllStepsMinBlocksInfo(const VariableBase &var); MinVarInfo *MinBlocksInfo(const VariableBase &Var, const size_t Step); - Dims *VarShape(const VariableBase &, const size_t Step) const; + bool VarShape(const VariableBase &, const size_t Step, Dims &Shape) const; bool VariableMinMax(const VariableBase &var, const size_t Step, MinMaxStruct &MinMax); void GetAbsoluteSteps(const VariableBase &variable, diff --git a/testing/adios2/engine/staging-common/TestCommonRead.cpp b/testing/adios2/engine/staging-common/TestCommonRead.cpp index 6639c70db9..867cdce32e 100644 --- a/testing/adios2/engine/staging-common/TestCommonRead.cpp +++ b/testing/adios2/engine/staging-common/TestCommonRead.cpp @@ -85,6 +85,8 @@ TEST_F(CommonReadTest, ADIOS2CommonRead1D8) } ts = std::chrono::steady_clock::now(); adios2::StepStatus status = engine.BeginStep(); + auto av = io.AvailableVariables(); + Seconds timeBeginStep = std::chrono::steady_clock::now() - ts; begin_statuses.push_back(status); begin_times.push_back(timeBeginStep);