diff --git a/source/adios2/core/VariableBase.h b/source/adios2/core/VariableBase.h index ad81e63ea15cfdbfab9211aa0d26c6b4e5ca8013..c8953777d82669384fac8bf66d6c37ca4365f392 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 680e2186f16c45fb8be18342861e9ad2ed62a8b6..407b93c59b99134489acd3d178cce45a5ad70366 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 cd455f2a74b39cd9e86154d3da9287b229415486..15f6ce7426f49c9b3ca59b7e0295603bf0c8d4a8 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 5d5f547e5bc63acec28fe8f4282ca0336b30988e..801adcb7c636fe73b1e99a1e261762f0138ba10f 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; }