From 412ef7df87c2a600c84aa72c9d06dba9507711c1 Mon Sep 17 00:00:00 2001 From: Norbert Podhorszki <pnorbert@ornl.gov> Date: Fri, 28 Apr 2017 09:41:06 -0400 Subject: [PATCH] Added SetStepSelection() to Variables --- source/adios2/core/VariableBase.h | 30 ++++++++-- source/adios2/engine/adios1/ADIOS1Reader.cpp | 62 +++++++++++++------- source/adios2/engine/adios1/ADIOS1Reader.h | 7 +-- source/adios2/engine/adios1/ADIOS1Writer.cpp | 4 +- 4 files changed, 72 insertions(+), 31 deletions(-) diff --git a/source/adios2/core/VariableBase.h b/source/adios2/core/VariableBase.h index ad81e63ea..c8953777d 100644 --- a/source/adios2/core/VariableBase.h +++ b/source/adios2/core/VariableBase.h @@ -145,18 +145,40 @@ public: ConvertUint64VectorToSizetVector(sel.m_Start, m_MemoryOffsets); } + /** + * Set the steps for the variable to read from. The pointer passed at + * reading must be able to hold enough memory to store multiple steps in a + * single read. + * @param fromStep The first step to read. Steps start from 0 + * @param nSteps Number of consecutive steps to read at once. + * + */ + void SetStepSelection(const unsigned int fromStep, + const unsigned int nSteps) + { + m_ReadFromStep = fromStep; + m_ReadNSteps = nSteps; + } + /** Return the number of steps available for the variable * @return Number of steps */ - unsigned int GetNSteps() { return m_nsteps; } + unsigned int GetNSteps() { return m_NStepsAvailable; } ///< Should only be called by read engines - void SetNSteps(unsigned int steps) { m_nsteps = steps; } + void SetNSteps(unsigned int steps) { m_NStepsAvailable = steps; } + unsigned int GetReadFromStep() { return m_ReadFromStep; } + unsigned int GetReadNSteps() { return m_ReadNSteps; } private: + ///< Read from this step (must be 0 in staging) + unsigned int m_ReadFromStep = 0; + ///< Read this many steps at once (must be 1 in staging) + unsigned int m_ReadNSteps = 1; + /* Values filled by InquireVariable() */ - unsigned int m_nsteps = - 1; ///< number of steps available in a file (or 1 in staging), + ///< number of steps available in a file (or 1 in staging), + unsigned int m_NStepsAvailable = 1; }; } // end namespace diff --git a/source/adios2/engine/adios1/ADIOS1Reader.cpp b/source/adios2/engine/adios1/ADIOS1Reader.cpp index 680e2186f..407b93c59 100644 --- a/source/adios2/engine/adios1/ADIOS1Reader.cpp +++ b/source/adios2/engine/adios1/ADIOS1Reader.cpp @@ -173,9 +173,9 @@ ADIOS1Reader::InquireVariableCompound(const std::string &variableName, return nullptr; } -void ADIOS1Reader::ScheduleReadCommon(const std::string &name, - const Dims &ldims, const Dims &offs, - void *data) +void ADIOS1Reader::ScheduleReadCommon(const std::string &name, const Dims &offs, + const Dims &ldims, const int fromStep, + const int nSteps, void *data) { uint64_t start[32], count[32]; @@ -184,100 +184,120 @@ void ADIOS1Reader::ScheduleReadCommon(const std::string &name, start[i] = (uint64_t)offs[i]; count[i] = (uint64_t)ldims[i]; } - ADIOS_SELECTION *sel = + ADIOS_SELECTION *sel = nullptr; + if (ldims.size() > 0) + { adios_selection_boundingbox(ldims.size(), start, count); - adios_schedule_read(m_fh, sel, name.c_str(), 1, 0, data); + } + adios_schedule_read(m_fh, sel, name.c_str(), (int)fromStep, (int)nSteps, + data); adios_selection_delete(sel); } void ADIOS1Reader::ScheduleRead(Variable<char> &variable, char *values) { - ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start, + ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count, + variable.GetReadFromStep(), variable.GetReadNSteps(), (void *)values); } void ADIOS1Reader::ScheduleRead(Variable<unsigned char> &variable, unsigned char *values) { - ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start, + ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count, + variable.GetReadFromStep(), variable.GetReadNSteps(), (void *)values); } void ADIOS1Reader::ScheduleRead(Variable<short> &variable, short *values) { - ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start, + ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count, + variable.GetReadFromStep(), variable.GetReadNSteps(), (void *)values); } void ADIOS1Reader::ScheduleRead(Variable<unsigned short> &variable, unsigned short *values) { - ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start, + ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count, + variable.GetReadFromStep(), variable.GetReadNSteps(), (void *)values); } void ADIOS1Reader::ScheduleRead(Variable<int> &variable, int *values) { - ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start, + ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count, + variable.GetReadFromStep(), variable.GetReadNSteps(), (void *)values); } void ADIOS1Reader::ScheduleRead(Variable<unsigned int> &variable, unsigned int *values) { - ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start, + ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count, + variable.GetReadFromStep(), variable.GetReadNSteps(), (void *)values); } void ADIOS1Reader::ScheduleRead(Variable<long int> &variable, long int *values) { - ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start, + ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count, + variable.GetReadFromStep(), variable.GetReadNSteps(), (void *)values); } void ADIOS1Reader::ScheduleRead(Variable<unsigned long int> &variable, unsigned long int *values) { - ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start, + ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count, + variable.GetReadFromStep(), variable.GetReadNSteps(), (void *)values); } void ADIOS1Reader::ScheduleRead(Variable<long long int> &variable, long long int *values) { - ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start, + ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count, + variable.GetReadFromStep(), variable.GetReadNSteps(), (void *)values); } void ADIOS1Reader::ScheduleRead(Variable<unsigned long long int> &variable, unsigned long long int *values) { - ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start, + ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count, + variable.GetReadFromStep(), variable.GetReadNSteps(), (void *)values); } void ADIOS1Reader::ScheduleRead(Variable<float> &variable, float *values) { - ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start, + ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count, + variable.GetReadFromStep(), variable.GetReadNSteps(), (void *)values); } void ADIOS1Reader::ScheduleRead(Variable<double> &variable, double *values) { - ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start, + ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count, + variable.GetReadFromStep(), variable.GetReadNSteps(), (void *)values); } void ADIOS1Reader::ScheduleRead(Variable<long double> &variable, long double *values) { - ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start, + ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count, + variable.GetReadFromStep(), variable.GetReadNSteps(), (void *)values); } void ADIOS1Reader::ScheduleRead(Variable<std::complex<float>> &variable, std::complex<float> *values) { - ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start, + ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count, + variable.GetReadFromStep(), variable.GetReadNSteps(), (void *)values); } void ADIOS1Reader::ScheduleRead(Variable<std::complex<double>> &variable, std::complex<double> *values) { - ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start, + ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count, + variable.GetReadFromStep(), variable.GetReadNSteps(), (void *)values); } void ADIOS1Reader::ScheduleRead(Variable<std::complex<long double>> &variable, std::complex<long double> *values) { - ScheduleReadCommon(variable.m_Name, variable.m_Count, variable.m_Start, + ScheduleReadCommon(variable.m_Name, variable.m_Start, variable.m_Count, + variable.GetReadFromStep(), variable.GetReadNSteps(), (void *)values); } diff --git a/source/adios2/engine/adios1/ADIOS1Reader.h b/source/adios2/engine/adios1/ADIOS1Reader.h index cd455f2a7..15f6ce742 100644 --- a/source/adios2/engine/adios1/ADIOS1Reader.h +++ b/source/adios2/engine/adios1/ADIOS1Reader.h @@ -169,8 +169,6 @@ private: Variable<T> *InquireVariableCommon(const std::string &name, const bool readIn) { - std::cout << "Hello ADIOS1Reader::InquireVariableCommon\n"; - // here read variable metadata (dimensions, type, etc.)...then create a // Variable like below: // Variable<T>& variable = m_ADIOS.DefineVariable<T>( m_Name + "/" + @@ -202,8 +200,9 @@ private: return var; } - void ScheduleReadCommon(const std::string &name, const Dims &ldims, - const Dims &offs, void *data); + void ScheduleReadCommon(const std::string &name, const Dims &offs, + const Dims &ldims, const int fromStep, + const int nSteps, void *data); bool CheckADIOS1TypeCompatibility(const std::string &name, std::string adios2Type, diff --git a/source/adios2/engine/adios1/ADIOS1Writer.cpp b/source/adios2/engine/adios1/ADIOS1Writer.cpp index 5d5f547e5..801adcb7c 100644 --- a/source/adios2/engine/adios1/ADIOS1Writer.cpp +++ b/source/adios2/engine/adios1/ADIOS1Writer.cpp @@ -117,10 +117,10 @@ static std::string DimsToCSV_LocalAware(const std::vector<std::size_t> &dims) dimsCSV.pop_back(); } - if (localVar) + /*if (localVar) { dimsCSV.clear(); - } + }*/ return dimsCSV; } -- GitLab