diff --git a/examples/hello/bpAttributeWriter/helloBPAttributeWriter.cpp b/examples/hello/bpAttributeWriter/helloBPAttributeWriter.cpp index c208a9d656df3d126c03ae3f4044c003aa001316..cd22988919dbf5a15151409e056978236ac8253a 100644 --- a/examples/hello/bpAttributeWriter/helloBPAttributeWriter.cpp +++ b/examples/hello/bpAttributeWriter/helloBPAttributeWriter.cpp @@ -57,7 +57,7 @@ int main(int argc, char *argv[]) /** Engine derived class, spawned to start IO operations */ adios2::Engine &bpWriter = - bpIO.Open("myVector.bp", adios2::Mode::Write); + bpIO.Open("fileAttributes.bp", adios2::Mode::Write); /** Write variable for buffering */ bpWriter.PutSync<float>(bpFloats, myFloats.data()); diff --git a/source/adios2/engine/bp/BPFileReader.cpp b/source/adios2/engine/bp/BPFileReader.cpp index 4c806ea839bed6687ee5e7ddb582245e090ff1a5..938e268c9e9d41a130763a697e07519ad90ea2e9 100644 --- a/source/adios2/engine/bp/BPFileReader.cpp +++ b/source/adios2/engine/bp/BPFileReader.cpp @@ -130,7 +130,6 @@ void BPFileReader::ReadVariables( const std::string subFile( m_BP3Deserializer.GetBPSubFileName(m_Name, subFileIndex)); - // TODO: fix this part if (m_SubFileManager.m_Transports.count(subFileIndex) == 0) { m_SubFileManager.OpenFiles({subFile}, adios2::Mode::Read, diff --git a/source/adios2/toolkit/format/bp3/BP3Base.tcc b/source/adios2/toolkit/format/bp3/BP3Base.tcc index b600f13e19d99340ced6a0069c71d54981fa6b0b..8e613100e5ade1113e611eafc53fff40d4757362 100644 --- a/source/adios2/toolkit/format/bp3/BP3Base.tcc +++ b/source/adios2/toolkit/format/bp3/BP3Base.tcc @@ -300,7 +300,8 @@ BP3Base::ParseCharacteristics(const std::vector<char> &buffer, size_t &position, while (localPosition < characteristics.EntryLength) { - const uint8_t id = ReadValue<uint8_t>(buffer, position); + const CharacteristicID id = + static_cast<CharacteristicID>(ReadValue<uint8_t>(buffer, position)); switch (id) { @@ -321,9 +322,21 @@ BP3Base::ParseCharacteristics(const std::vector<char> &buffer, size_t &position, case (characteristic_value): { - characteristics.Statistics.Value = - ReadValue<typename TypeInfo<T>::ValueType>(buffer, position); - characteristics.Statistics.IsValue = true; + // we are relying that count contains the dimensions + if (characteristics.Count.empty() || characteristics.Count[0] == 1) + { + characteristics.Statistics.Value = + ReadValue<typename TypeInfo<T>::ValueType>(buffer, + position); + characteristics.Statistics.IsValue = true; + } + else // used for attributes + { + const size_t size = characteristics.Count[0]; + characteristics.Statistics.Values.resize(size); + CopyFromBuffer(buffer, position, + characteristics.Statistics.Values.data(), size); + } break; } diff --git a/source/adios2/toolkit/format/bp3/BP3Serializer.cpp b/source/adios2/toolkit/format/bp3/BP3Serializer.cpp index e9bea1dd02525a168133aa94d2100b31ff2c42c6..e9e7a3bedcfba82b479693c1ff3f326b6ad0134d 100644 --- a/source/adios2/toolkit/format/bp3/BP3Serializer.cpp +++ b/source/adios2/toolkit/format/bp3/BP3Serializer.cpp @@ -297,6 +297,8 @@ void BP3Serializer::PutAttributes(IO &io) Stats<T> stats; \ stats.Offset = absolutePosition; \ stats.MemberID = memberID; \ + stats.Step = m_MetadataSet.TimeStep; \ + stats.FileIndex = static_cast<uint32_t>(m_RankMPI); \ Attribute<T> &attribute = *io.InquireAttribute<T>(name); \ PutAttributeInData(attribute, stats); \ PutAttributeInIndex(attribute, stats); \ @@ -789,7 +791,9 @@ void BP3Serializer::MergeSerializeIndices( uint32_t &timeStep) { - switch (dataType) + const DataTypes dataTypeEnum = static_cast<DataTypes>(dataType); + + switch (dataTypeEnum) { case (type_string): @@ -803,6 +807,17 @@ void BP3Serializer::MergeSerializeIndices( break; } + case (type_string_array): + { + const auto characteristics = + ReadElementIndexCharacteristics<std::string>( + buffer, position, type_string_array, true); + count = characteristics.EntryCount; + length = characteristics.EntryLength; + timeStep = characteristics.Statistics.Step; + break; + } + case (type_byte): { const auto characteristics = ReadElementIndexCharacteristics<char>( @@ -907,7 +922,13 @@ void BP3Serializer::MergeSerializeIndices( timeStep = characteristics.Statistics.Step; break; } + + default: // TODO: complex, string array, long double + throw std::invalid_argument("ERROR: type " + + std::to_string(dataType) + + " not supported in Merge\n"); + } // end switch }; diff --git a/source/adios2/toolkit/format/bp3/BP3Serializer.tcc b/source/adios2/toolkit/format/bp3/BP3Serializer.tcc index 439bc3cd7b7ed83ef4ae088a5608c8a39a2a26fc..d6bbf840cf0c7ac613aa03ed55f067ac715f3a9f 100644 --- a/source/adios2/toolkit/format/bp3/BP3Serializer.tcc +++ b/source/adios2/toolkit/format/bp3/BP3Serializer.tcc @@ -272,6 +272,12 @@ void BP3Serializer::PutAttributeInIndex(const Attribute<T> &attribute, uint8_t characteristicsCounter = 0; // DIMENSIONS + PutCharacteristicRecord(characteristic_time_index, characteristicsCounter, + stats.Step, buffer); + + PutCharacteristicRecord(characteristic_file_index, characteristicsCounter, + stats.FileIndex, buffer); + uint8_t characteristicID = characteristic_dimensions; InsertToBuffer(buffer, &characteristicID); constexpr uint8_t dimensions = 1; @@ -285,13 +291,6 @@ void BP3Serializer::PutAttributeInIndex(const Attribute<T> &attribute, PutAttributeCharacteristicValueInIndex(characteristicsCounter, attribute, buffer); - // TIME Index - PutCharacteristicRecord(characteristic_time_index, characteristicsCounter, - stats.Step, buffer); - - PutCharacteristicRecord(characteristic_file_index, characteristicsCounter, - stats.FileIndex, buffer); - PutCharacteristicRecord(characteristic_offset, characteristicsCounter, stats.Offset, buffer);