From cb0d2c11ad46064665965ba355e84e704d683906 Mon Sep 17 00:00:00 2001 From: wfg <wfg@pc0098504.ornl.gov> Date: Tue, 24 Jan 2017 18:13:10 -0500 Subject: [PATCH] Working on format/BP1Writer.h Template functions for Writing in BP Format Modified Makefile to take default g++ and mpic++ in PATH Modified DataMan.cpp and Removed functions/bp1Write.h, in favor of class format/BP1Writer.h To do: Buffer management (maybe capsule needs data offset variables?) Work on BP format under BP1Writer.h --- Makefile | 8 +- include/core/Engine.h | 2 +- include/engine/writer/Writer.h | 5 +- include/engine/writer/WriterTemplates.h | 33 +- include/format/BP1Writer.h | 413 ++++++++++++++++++++++++ include/functions/bp1Write.h | 311 ------------------ include/functions/capsuleTemplates.h | 4 +- src/engine/dataman/DataMan.cpp | 68 +--- src/engine/writer/Writer.cpp | 113 +++++-- 9 files changed, 546 insertions(+), 411 deletions(-) create mode 100644 include/format/BP1Writer.h delete mode 100644 include/functions/bp1Write.h diff --git a/Makefile b/Makefile index 00e1f0d1d..898f40eee 100644 --- a/Makefile +++ b/Makefile @@ -7,10 +7,10 @@ SYS_BIN:=/usr/bin SYS_LIB:=/usr/lib/x86_64-linux-gnu LOCAL_LIB:=/usr/local/lib -#COMPILERS AND LIBRARY LOCATIONS -CC:=$(SYS_BIN)/g++ -AR:=$(SYS_BIN)/ar -MPICC:=$(SYS_BIN)/mpic++ +#COMPILERS IN PATH AND LIBRARY LOCATIONS +CC:=g++ +AR:=ar +MPICC:=mpic++ LIBS:= -L$(SYS_LIB) -L$(LOCAL_LIB) CFLAGS:=-c -Wall -Wpedantic -Woverloaded-virtual -std=c++11 -O0 -g diff --git a/include/core/Engine.h b/include/core/Engine.h index 06eef756f..a28b7500c 100644 --- a/include/core/Engine.h +++ b/include/core/Engine.h @@ -118,7 +118,7 @@ public: virtual void Write( const std::string variableName, const double* values ) = 0; virtual void Write( const std::string variableName, const long double* values ) = 0; - virtual void Close( int transportIndex = -1 ); ///< Closes a particular transport + virtual void Close( const int transportIndex = -1 ); ///< Closes a particular transport protected: diff --git a/include/engine/writer/Writer.h b/include/engine/writer/Writer.h index d995aa4e5..676faa488 100644 --- a/include/engine/writer/Writer.h +++ b/include/engine/writer/Writer.h @@ -9,6 +9,7 @@ #define WRITER_H_ #include "core/Engine.h" +#include "format/BP1Writer.h" namespace adios @@ -61,10 +62,12 @@ public: void Write( const std::string variableName, const double* values ); void Write( const std::string variableName, const long double* values ); - void Close( int transportIndex = -1 ); + void Close( const int transportIndex = -1 ); private: + format::BP1Writer m_BP1Writer; ///< format object will provide the required BP functionality to be applied on m_Capsules and m_Transports + void Init( ); void InitCapsules( ); void InitTransports( ); diff --git a/include/engine/writer/WriterTemplates.h b/include/engine/writer/WriterTemplates.h index 314d6c3a4..a572c2300 100644 --- a/include/engine/writer/WriterTemplates.h +++ b/include/engine/writer/WriterTemplates.h @@ -9,26 +9,43 @@ #define WRITERTEMPLATES_H_ #include <string> +#include <vector> +#include <iostream> +#include <memory> #include "core/Group.h" #include "core/Variable.h" #include "capsule/Heap.h" -#include "functions/adiosFunctions.h" -#include "functions/capsuleTemplates.h" - +#include "format/BP1Writer.h" namespace adios { +/** + * Unique template function that replaces macros to write any variable type to a single heap capsule + * @param group variable owner + * @param variableName + * @param variable + * @param buffers single heap capsule containing data and metadata buffers + * @param transports all transports from Writer Engine, info is flushed in case of buffer overflow + * @param bp1Writer from Writer Engine + */ template <class T> -void WriterWriteVariable( Group& group, const std::string variableName, Variable<T>& variable, Heap& capsule ) +void WriterWriteVariable( const Group& group, const std::string variableName, const Variable<T>& variable, + Capsule& buffers, std::vector< std::shared_ptr<Transport> >& transports, + format::BP1Writer& bp1Writer ) { - const auto localDimensions = group.GetDimensions( variable.DimensionsCSV ); - const auto size = GetTotalSize( localDimensions ); - T min, max; - GetMinMax( variable.Values, size, min, max ); + + std::cout << "Hello from writing variable " << variableName << "of type " << typeid(T).name() << "\n"; + //here deal with buffers allocation + + +// const auto localDimensions = group.GetDimensions( variable.DimensionsCSV ); +// const auto size = GetTotalSize( localDimensions ); +// T min, max; +// GetMinMax( variable.Values, size, min, max ); // // const std::size_t bytesToWrite = localSize * sizeof( double ); //size of values + min + max in bytes diff --git a/include/format/BP1Writer.h b/include/format/BP1Writer.h new file mode 100644 index 000000000..5c26215b4 --- /dev/null +++ b/include/format/BP1Writer.h @@ -0,0 +1,413 @@ +/* + * BP1.h + * + * Created on: Jan 24, 2017 + * Author: wfg + */ + +#ifndef BP1WRITER_H_ +#define BP1WRITER_H_ + + +#include <vector> +#include <cstdint> +#include <algorithm> //std::count +#include <cstring> //std::memcpy + +#include "core/Variable.h" +#include "core/Group.h" + + + +namespace adios +{ +namespace format +{ + + +class BP1Writer +{ + +public: + + std::vector<char> m_PGIndex; ///< process group index + std::vector<char> m_VariableIndex; ///< metadata variable index + std::vector<char> m_AttributeIndex; ///< metadata attribute index + + const unsigned int m_Cores = 1; + + /** + * DataTypes mapping in BP Format + */ + enum DataTypes + { + type_unknown = -1, //!< type_unknown + type_byte = 0, //!< type_byte + type_short = 1, //!< type_short + type_integer = 2, //!< type_integer + type_long = 4, //!< type_long + + type_unsigned_byte = 50, //!< type_unsigned_byte + type_unsigned_short = 51, //!< type_unsigned_short + type_unsigned_integer = 52,//!< type_unsigned_integer + type_unsigned_long = 54, //!< type_unsigned_long + + type_real = 5, //!< type_real or float + type_double = 6, //!< type_double + type_long_double = 7, //!< type_long_double + + type_string = 9, //!< type_string + type_complex = 10, //!< type_complex + type_double_complex = 11, //!< type_double_complex + type_string_array = 12 //!< type_string_array + }; + + /** + * Characteristic ID in variable metadata + */ + enum VariableCharacteristicID + { + characteristic_value = 0, //!< characteristic_value + characteristic_min = 1, //!< This is no longer used. Used to read in older bp file format + characteristic_max = 2, //!< This is no longer used. Used to read in older bp file format + characteristic_offset = 3, //!< characteristic_offset + characteristic_dimensions = 4, //!< characteristic_dimensions + characteristic_var_id = 5, //!< characteristic_var_id + characteristic_payload_offset = 6, //!< characteristic_payload_offset + characteristic_file_index = 7, //!< characteristic_file_index + characteristic_time_index = 8, //!< characteristic_time_index + characteristic_bitmap = 9, //!< characteristic_bitmap + characteristic_stat = 10,//!< characteristic_stat + characteristic_transform_type = 11 //!< characteristic_transform_type + }; + + + /** Define statistics type for characteristic ID = 10 in bp1 format */ + enum VariableStatistics + { + statistic_min = 0, + statistic_max = 1, + statistic_cnt = 2, + statistic_sum = 3, + statistic_sum_square = 4, + statistic_hist = 5, + statistic_finite = 6 + }; + + + /** + * Returns data type index from enum Datatypes + * @param variable input variable + * @return data type + */ + template< class T > + std::int8_t GetDataType( const Variable<T>& variable ) + { + std::int8_t dataType = -1; + if( std::is_same<T,char>::value ) + dataType = type_byte; + + else if( std::is_same<T,short>::value ) + dataType = type_short; + + else if( std::is_same<T,int>::value ) + dataType = type_integer; + + else if( std::is_same<T,long int>::value ) + dataType = type_long; + + else if( std::is_same<T,unsigned char>::value ) + dataType = type_unsigned_byte; + + else if( std::is_same<T,unsigned short>::value ) + dataType = type_unsigned_short; + + else if( std::is_same<T,unsigned int>::value ) + dataType = type_unsigned_integer; + + else if( std::is_same<T,unsigned long int>::value ) + dataType = type_unsigned_long; + + else if( std::is_same<T,float>::value ) + dataType = type_real; + + else if( std::is_same<T,double>::value ) + dataType = type_double; + + else if( std::is_same<T,long double>::value ) + dataType = type_long_double; + //need to implement complex and string + return dataType; + } + + + /** + * Returns the estimated variable index size + * @param group + * @param variableName + * @param variable + * @param verbosity + * @return variable index size + */ + template< class T > + size_t GetVariableIndexSize( const Group& group, const std::string variableName, + const Variable<T> variable, const unsigned int verbosity ) + { + //size_t indexSize = varEntryLength + memberID + lengthGroupName + groupName + lengthVariableName + lengthOfPath + path + datatype + size_t indexSize = 23; //without characteristics + indexSize += group.m_Name.size(); + indexSize += variableName.size(); + + // characteristics 3 and 4, check variable number of dimensions + std::size_t dimensions = std::count( variable.DimensionsCSV.begin(), variable.DimensionsCSV.end(), ',' ) + 1; //number of commas in CSV + 1 + indexSize += 28 * dimensions; //28 bytes per dimension + indexSize += 1; //id + + //characteristics 3, variable offset in data + indexSize += 8; + indexSize += 1; //id + //characteristics 6, variable payload offset in data + indexSize += 8; + indexSize += 1; //id + + //characteristic 0, if scalar add value, for now only allowing string + if( dimensions == 1 ) + { + indexSize += sizeof(T); + indexSize += 1; //id + //must have an if here + indexSize += 2 + variableName.size(); + indexSize += 1; //id + } + + //characteristic statistics + if( verbosity == 0 ) //default, only min and max + { + indexSize += 2 * ( sizeof(T) + 1 ); + indexSize += 1 + 1; //id + } + + return indexSize; + //need to add transform characteristics + } + + /** + * Write to many buffers and updates offset + * @param buffers + * @param source + * @param size + * @param offset + */ + template< class T > + void WriteToBuffers( std::vector<char*>& buffers, const T* source, std::size_t size, std::size_t& offset ) + { + for( auto& buffer : buffers ) + { + std::memcpy( &buffer[offset], source, size ); + } + offset += size; + } + + /** + * + * @param group variable owner + * @param variableName name of variable to be written + * @param variable object carrying variable information + * @param dataBuffers buffers to which variable metadata and payload (values) will be written. Metadata is added in case of system corruption to allow regeneration. + * @param metadataBuffers buffers to which only variable metadata will be written + * @param characteristicsVerbosity default = 0 min and max only, + */ + template< class T > + void WriteVariable( const Group& group, const std::string variableName, + const Variable<T>& variable, + std::vector<char*>& dataBuffers, const std::size_t dataPosition, + std::vector<char*>& metadataBuffers, const std::size_t metadataPosition, + const unsigned int memberID, const bool writeDimensionsInData, + const unsigned int verbose ) + { + std::size_t metadataOffset = metadataPosition + 8; //length of var, will come at the end from this offset + std::size_t dataOffset = dataPosition + 8; //length of var, will come at the end from this offset + + //memberID + WriteToBuffers( metadataBuffers, &memberID, 4, metadataOffset ); + //group + const std::uint16_t lengthGroupName = group.m_Name.length(); + WriteToBuffers( metadataBuffers, &lengthGroupName, 2, metadataOffset ); //2 bytes + //const char* groupName = ; + WriteToBuffers( metadataBuffers, group.m_Name.c_str(), lengthGroupName, metadataOffset ); + //variable name to metadata and data + const std::uint16_t lengthVariableName = variableName.length(); + WriteToBuffers( metadataBuffers, &lengthVariableName, 2, metadataOffset ); + WriteToBuffers( metadataBuffers, variableName.c_str(), lengthVariableName, metadataOffset ); + WriteToBuffers( dataBuffers, &lengthVariableName, 2, dataOffset ); + WriteToBuffers( dataBuffers, variableName.c_str(), lengthVariableName, dataOffset ); + //skip path (jump 2 bytes) + metadataOffset += 2; + dataOffset += 2; + //dataType + const std::uint8_t dataType = GetBPDataType( variable ); + WriteToBuffers( metadataBuffers, &dataType, 1, metadataOffset ); + WriteToBuffers( dataBuffers, &dataType, 1, dataOffset ); + + //Characteristics Sets in Metadata and Data + const std::size_t metadataCharacteristicsSetsCountPosition = metadataOffset; //very important piece + std::size_t dataCharacteristicsCountPosition = dataOffset; + const std::uint64_t sets = 1; //write one for now + WriteToBuffers( metadataBuffers, &sets, 8, metadataOffset ); + + unsigned int characteristicsCounter = 0; //used for characteristics count, characteristics length will be calculated at the end + + //DIMENSIONS CHARACTERISTIC + const std::vector<unsigned long long int> localDimensions = group.GetDimensions( variable.DimensionsCSV ); + + //write to metadata characteristic + //characteristic: dimension + std::uint8_t characteristicID = characteristic_dimensions; + WriteToBuffers( metadataBuffers, &characteristicID, 1, metadataOffset ); + const std::uint8_t dimensions = localDimensions.size(); + WriteToBuffers( metadataBuffers, &dimensions, 1, metadataOffset ); + const std::uint16_t dimensionsLength = dimensions * 24; //24 is from 8 bytes for each: local dimension, global dimension, global offset + WriteToBuffers( metadataBuffers, &dimensionsLength, 2, metadataOffset ); + + //dimensions in data buffer, header + if( writeDimensionsInData == true ) + { + const char yes = 'y'; // dimension y or n + WriteToBuffers( dataBuffers, &yes, 1, dataOffset ); + //for now only support unsigned long integer value (8 bytes), as in metadata + WriteToBuffers( dataBuffers, &dimensions, 1, dataOffset ); + const std::uint16_t dimensionsLengthInData = dimensions * 27; //27 is from 9 bytes for each: var y/n + local, var y/n + global dimension, var y/n + global offset + WriteToBuffers( dataBuffers, &dimensionsLengthInData, 2, dataOffset ); + } + else + { + const char no = 'n'; // dimension y or n + WriteToBuffers( dataBuffers, &no, 1, dataOffset ); + dataCharacteristicsCountPosition += 1; + } + + if( variable.GlobalBoundsIndex == -1 ) //local variable + { + for( unsigned int d = 0; d < (unsigned int)localDimensions.size(); ++d ) + { + //metadata characteristics + WriteToBuffers( metadataBuffers, &localDimensions[d], 8, metadataOffset ); + metadataOffset += 16; //skipping global dimension(8), global offset (8) + } + + if( writeDimensionsInData == true ) + { + for( unsigned int d = 0; d < (unsigned int)localDimensions.size(); ++d ) + { + const char no = 'n'; //dimension format unsigned int value + WriteToBuffers( dataBuffers, &no, 1, dataOffset ); + WriteToBuffers( dataBuffers, &localDimensions[d], 8, dataOffset ); + dataOffset += 18; //skipping var no + global dimension(8), var no + global offset (8) + } + } + //dimensions in data characteristic entry (might not be required) + dataCharacteristicsCountPosition = dataOffset; + dataOffset += 5; //skip characteristics count(1) + length (4) + WriteToBuffers( dataBuffers, &characteristicID, 1, dataOffset ); + + std::int16_t lengthOfDimensionsCharacteristic = 3 + 24 * dimensions; // 3 = dimension(1) + length(2) ; 24 = 3 local, global, global offset x 8 bytes/each + WriteToBuffers( dataBuffers, &lengthOfDimensionsCharacteristic, 2, dataOffset ); + + WriteToBuffers( dataBuffers, &dimensions, 1, dataOffset ); + WriteToBuffers( dataBuffers, &dimensionsLength, 2, dataOffset ); + + for( unsigned int d = 0; d < (unsigned int)localDimensions.size(); ++d ) + { + //metadata characteristics + WriteToBuffers( dataBuffers, &localDimensions[d], 8, dataOffset ); + metadataOffset += 16; //skipping global dimension(8), global offset (8) + } + } + else //global variable + { + std::vector<unsigned long long int> globalDimensions = group.GetDimensions( group.m_GlobalBounds[variable.GlobalBoundsIndex].first ); + std::vector<unsigned long long int> globalOffsets = group.GetDimensions( group.m_GlobalBounds[variable.GlobalBoundsIndex].second ); + + //metadata, writing in characteristics + for( unsigned int d = 0; d < (unsigned int)localDimensions.size(); ++d ) + { + WriteToBuffers( metadataBuffers, &localDimensions[d], 8, metadataOffset ); + WriteToBuffers( metadataBuffers, &globalDimensions[d], 8, metadataOffset ); + WriteToBuffers( metadataBuffers, &globalOffsets[d], 8, metadataOffset ); + } + + //data dimensions entry + if( writeDimensionsInData == true ) + { + for( unsigned int d = 0; d < (unsigned int)localDimensions.size(); ++d ) + { + const char no = 'n'; //dimension format unsigned int value + WriteToBuffers( dataBuffers, &no, 1, dataOffset ); + WriteToBuffers( dataBuffers, &localDimensions[d], 8, dataOffset ); + WriteToBuffers( dataBuffers, &no, 1, dataOffset ); + WriteToBuffers( dataBuffers, &localDimensions[d], 8, dataOffset ); + } + } + //dimensions in data characteristic entry (might not be required) + dataCharacteristicsCountPosition = dataOffset; + dataOffset += 5; //skip characteristics count(1) + length (4) + WriteToBuffers( dataBuffers, &characteristicID, 1, dataOffset ); //id + + std::int16_t lengthOfDimensionsCharacteristic = 3 + 24 * dimensions; // 3 = dimension(1) + length(2) ; 24 = 3 local, global, global offset x 8 bytes/each + WriteToBuffers( dataBuffers, &lengthOfDimensionsCharacteristic, 2, dataOffset ); + + WriteToBuffers( dataBuffers, &dimensions, 1, dataOffset ); + WriteToBuffers( dataBuffers, &dimensionsLength, 2, dataOffset ); + + for( unsigned int d = 0; d < (unsigned int)localDimensions.size(); ++d ) + { + WriteToBuffers( dataBuffers, &localDimensions[d], 8, dataOffset ); + WriteToBuffers( dataBuffers, &globalDimensions[d], 8, dataOffset ); + WriteToBuffers( dataBuffers, &globalOffsets[d], 8, dataOffset ); + } + } + + ++characteristicsCounter; + + //Stat -> Min, Max + characteristicID = characteristic_stat; + if( verbose == 0 ) //default verbose + { + const std::size_t valuesSize = GetTotalSize( localDimensions ); + //here we can make decisions for threads based on valuesSize + T min, max; + + if( valuesSize >= 10000000 ) //ten million? + GetMinMax( variable.Values, valuesSize, min, max, m_Cores ); //here we can add cores from constructor + else + GetMinMax( variable.Values, valuesSize, min, max ); + + const std::int8_t statisticMinID = statistic_min; + const std::int8_t statisticMaxID = statistic_max; + //write statistics here + + } + //Offsets should be last + + + + } //end of function + + + + +private: + + bool m_DebugMode = false; + +}; + + + + + + +} //end namespace format +} //end namespace adios + +#endif /* BP1WRITER_H_ */ diff --git a/include/functions/bp1Write.h b/include/functions/bp1Write.h deleted file mode 100644 index 9c490de33..000000000 --- a/include/functions/bp1Write.h +++ /dev/null @@ -1,311 +0,0 @@ -/* - * bp1Format.h - * - * Created on: Jan 12, 2017 - * Author: wfg - */ - -#ifndef BP1WRITE_H_ -#define BP1WRITE_H_ - -#include <algorithm> //std::count -#include <cstring> //std::memcpy - - -#include "core/Group.h" -#include "core/Variable.h" -#include "core/Capsule.h" - - -namespace adios -{ - - -enum DataTypes { - type_unknown = -1, - type_byte = 0, // char type - type_short = 1, - type_integer = 2, - type_long = 4, - - type_unsigned_byte = 50, - type_unsigned_short = 51, - type_unsigned_integer = 52, - type_unsigned_long = 54, - - type_real = 5, // float - type_double = 6, - type_long_double = 7, - - type_string = 9, - type_complex = 10, - type_double_complex = 11, - type_string_array = 12 -}; - - - -/** Define variable characteristic IDs in bp1 format */ -enum VariableCharacteristicID -{ - characteristic_value = 0, //!< characteristic_value - characteristic_min = 1, //!< This is no longer used. Used to read in older bp file format - characteristic_max = 2, //!< This is no longer used. Used to read in older bp file format - characteristic_offset = 3, //!< characteristic_offset - characteristic_dimensions = 4, //!< characteristic_dimensions - characteristic_var_id = 5, //!< characteristic_var_id - characteristic_payload_offset = 6, //!< characteristic_payload_offset - characteristic_file_index = 7, //!< characteristic_file_index - characteristic_time_index = 8, //!< characteristic_time_index - characteristic_bitmap = 9, //!< characteristic_bitmap - characteristic_stat = 10,//!< characteristic_stat - characteristic_transform_type = 11 //!< characteristic_transform_type -}; - -/** Define statistics type for characteristic ID = 10 in bp1 format */ -enum VariableStatistics -{ - statistic_min = 0, - statistic_max = 1, - statistic_cnt = 2, - statistic_sum = 3, - statistic_sum_square = 4, - statistic_hist = 5, - statistic_finite = 6 -}; - -/** - * Write a piece of - * @param buffers - * @param source - * @param size - * @param offset - */ -template< class T > -void WriteToBuffers( std::vector<char*>& buffers, const T* source, std::size_t size, std::size_t& offset ) -{ - for( auto& buffer : buffers ) - { - std::memcpy( &buffer[offset], source, size ); - } - offset += size; -} - - -template< class T> -std::int8_t GetBPDataType( const Variable<T>& variable ) -{ - int dataType = -1; - if( std::is_same<T,char> ) - dataType = type_byte; - - else if( std::is_same<T,short> ) - dataType = type_short; - - else if( std::is_same<T,int> ) - dataType = type_integer; - - else if( std::is_same<T,long int> ) - dataType = type_long; - - else if( std::is_same<T,unsigned char> ) - dataType = type_unsigned_byte; - - else if( std::is_same<T,unsigned short> ) - dataType = type_unsigned_short; - - else if( std::is_same<T,unsigned int> ) - dataType = type_unsigned_integer; - - else if( std::is_same<T,unsigned long int> ) - dataType = type_unsigned_long; - - else if( std::is_same<T,float> ) - dataType = type_real; - - else if( std::is_same<T,double> ) - dataType = type_double; - - else if( std::is_same<T,long double> ) - dataType = type_long_double; - - //need to implement complex and string -} - - -/** - * - * @param group variable owner - * @param variableName name of variable to be written - * @param variable object carrying variable information - * @param dataBuffers buffers to which variable metadata and payload (values) will be written. Metadata is added in case of system corruption to allow regeneration. - * @param metadataBuffers buffers to which only variable metadata will be written - * @param characteristicsVerbosity default = 0 min and max only, - */ -template< class T > -void WriteVariableToBuffers( const Group& group, const std::string variableName, - const Variable<T>& variable, std::vector<char*>& dataBuffers, - const std::size_t dataBuffersPosition, - std::vector<char*>& metadataBuffers, - const std::size_t metadataBuffersPosition, - const unsigned int memberID, const bool writeDimensionsInData, - const unsigned int characteristicsVerbosity ) -{ - std::size_t metadataOffset = metadataBuffersPosition + 8; //length of var, will come at the end from this offset - std::size_t dataOffset = dataBuffersPosition + 8; //length of var, will come at the end from this offset - - //memberID - WriteToBuffers( metadataBuffers, &memberID, 4, metadataOffset ); - //group - const std::uint16_t lengthGroupName = group.m_Name.length(); - WriteToBuffers( metadataBuffers, &lengthGroupName, 2, metadataOffset ); //2 bytes - WriteToBuffers( metadataBuffers, &group.m_Name.c_str(), lengthGroupName, metadataOffset ); - //variable name to metadata and data - const std::uint16_t lengthVariableName = variableName.length(); - WriteToBuffers( metadataBuffers, &lengthVariableName, 2, metadataOffset ); - WriteToBuffers( metadataBuffers, variableName.c_str(), lengthVariableName, metadataOffset ); - WriteToBuffers( dataBuffers, &lengthVariableName, 2, dataOffset ); - WriteToBuffers( dataBuffers, variableName.c_str(), lengthVariableName, dataOffset ); - //skip path (jump 2 bytes) - metadataOffset += 2; - dataOffset += 2; - //dataType - const std::uint8_t dataType = GetBPDataType( variable ); - WriteToBuffers( metadataBuffers, &dataType, 1, metadataOffset ); - WriteToBuffers( dataBuffers, &dataType, 1, dataOffset ); - - //Characteristics Sets in Metadata - const std::size_t metadataCharacteristicPosition = metadataOffset; - const std::uint64_t sets = 1; //write one for now - WriteToBuffers( metadataBuffers, &sets, 8, metadataOffset ); - - unsigned int characteristicsCounter = 0; //used for characteristics count, characteristics length will be calculated at the end - - //Get dimensions - const std::vector<unsigned long long int> localDimensions = group.GetDimensions( variable.DimensionsCSV ); - - //write to metadata characteristic - //characteristic: dimension - const std::uint8_t characteristicID = characteristic_dimensions; - WriteToBuffers( metadataBuffers, &characteristicID, 1, metadataOffset ); - const std::uint8_t dimensions = localDimensions.size(); - WriteToBuffers( metadataBuffers, &dimensions, 1, metadataOffset ); - const std::uint16_t dimensionsLength = dimensions * 24; //24 is from 8 bytes for each: local, global dimension, global offset - WriteToBuffers( metadataBuffers, &dimensions, 2, metadataOffset ); - - //dimensions in data buffer - if( writeDimensionsInData == true ) - { - const char yes = 'y'; - WriteToBuffers( dataBuffers, &yes, 1, dataOffset ); - //for now only support unsigned long integer value (8 bytes), as in metadata - WriteToBuffers( dataBuffers, &dimensions, 1, dataOffset ); - const std::uint16_t dimensionsLengthInData = dimensions * 27; //27 is from 9 bytes for each: var y/n + local, var y/n + global dimension, var y/n + global offset - WriteToBuffers( dataBuffers, &dimensionsLengthInData, 2, dataOffset ); - } - else - { - const char no = 'n'; - WriteToBuffers( dataBuffers, &no, 1, dataOffset ); - } - - - if( variable.GlobalBoundsIndex == -1 ) //local variable - { - for( unsigned int d = 0; d < (unsigned int)localDimensions.size(); ++d ) - { - //metadata - WriteToBuffers( metadataBuffers, &localDimensions[d], 8, metadataOffset ); - metadataOffset += 16; //skipping global dimension(8), global offset (8) - - //data - if( writeDimensionsInData == true ) - { - const char no = 'n'; - WriteToBuffers( dataBuffers, &no, 1, dataOffset ); - WriteToBuffers( dataBuffers, &localDimensions[d], 8, dataOffset ); - dataOffset += 18; //skipping var no + global dimension(8), var no + global offset (8) - } - } - } - else //global variable - { - std::vector<unsigned long long int> globalDimensions = group.GetDimensions( group.m_GlobalBounds[variable.GlobalBoundsIndex].first ); - std::vector<unsigned long long int> globalOffsets = group.GetDimensions( group.m_GlobalBounds[variable.GlobalBoundsIndex].second ); - - for( unsigned int d = 0; d < (unsigned int)localDimensions.size(); ++d ) - { - //metadata - WriteToBuffers( metadataBuffers, &localDimensions[d], 8, metadataOffset ); - WriteToBuffers( metadataBuffers, &globalDimensions[d], 8, metadataOffset ); - WriteToBuffers( metadataBuffers, &globalOffsets[d], 8, metadataOffset ); - - //data - if( writeDimensionsInData == true ) - { - const char no = 'n'; - WriteToBuffers( dataBuffers, &no, 1, dataOffset ); - WriteToBuffers( dataBuffers, &localDimensions[d], 8, dataOffset ); - WriteToBuffers( dataBuffers, &no, 1, dataOffset ); - WriteToBuffers( dataBuffers, &localDimensions[d], 8, dataOffset ); - - } - } - } - - -} - - - - -template< class T > -size_t GetVariableIndexSize( const Group& group, const std::string variableName, - const Variable<T> variable, const unsigned int characteristicsVerbosity ) -{ - //size_t indexSize = varEntryLength + memberID + lengthGroupName + groupName + lengthVariableName + lengthOfPath + path + datatype - size_t indexSize = 23; //without characteristics - indexSize += group.m_Name.size(); - indexSize += variableName.size(); - - // characteristics 3 and 4, check variable number of dimensions - std::size_t dimensions = std::count( variable.DimensionsCSV.begin(), variable.DimensionsCSV.end(), ',' ) + 1; //number of commas in CSV + 1 - indexSize += 28 * dimensions; //28 bytes per dimension - indexSize += 1; //id - - //characteristics 3, variable offset in data - indexSize += 8; - indexSize += 1; //id - //characteristics 6, variable payload offset in data - indexSize += 8; - indexSize += 1; //id - - //characteristic 0, if scalar add value, for now only allowing string - if( dimensions == 1 ) - { - indexSize += sizeof(T); - indexSize += 1; //id - //must have an if here - indexSize += 2 + variableName.size(); - indexSize += 1; //id - } - - //characteristic statistics - if( characteristicsVerbosity == 0 ) //default, only min and max - { - indexSize += 2 * ( sizeof(T) + 1 ); - indexSize += 1 + 1; //id - } - - //need to add transform -} - - - - - -} //end namespace - - - -#endif /* BP1WRITE_H_ */ diff --git a/include/functions/capsuleTemplates.h b/include/functions/capsuleTemplates.h index 802c12244..d8f234d6e 100644 --- a/include/functions/capsuleTemplates.h +++ b/include/functions/capsuleTemplates.h @@ -30,7 +30,7 @@ namespace adios * @param max */ template<class T> -void GetMinMax( const T* values, const size_t size, T& min, T& max, const unsigned int cores = 1 ) +void GetMinMax( const T* values, const size_t size, T& min, T& max, const unsigned int cores = 1 ) noexcept { min = values[0]; max = values[0]; @@ -78,7 +78,7 @@ void MemcpyThreads( T* destination, const U* source, std::size_t count, const un else memcpyThreads.push_back( std::thread( std::memcpy, &destination[initialDestination], &source[initialSource], stride ) ); } - //Now join the threads + //Now join the threads (is this really needed?) for( auto& thread : memcpyThreads ) thread.join( ); } diff --git a/src/engine/dataman/DataMan.cpp b/src/engine/dataman/DataMan.cpp index 56dbf1af0..8c784b970 100644 --- a/src/engine/dataman/DataMan.cpp +++ b/src/engine/dataman/DataMan.cpp @@ -162,108 +162,67 @@ void DataMan::Write( Group& group, const std::string variableName, const long do //USING Preset Group void DataMan::Write( const std::string variableName, const char* values ) { - auto index = PreSetVariable( *m_Group, variableName, Support::DatatypesAliases.at("char"), " from call to Write char*" ); - Variable<char>& variable = m_Group->m_Char[index]; //must be a reference - variable.Values = values; - DataManWriteVariable( *m_Group, variableName, variable, m_Capsules, m_Transports ); + Write( *m_Group, variableName, values ); } void DataMan::Write( const std::string variableName, const unsigned char* values ) { - auto index = PreSetVariable( *m_Group, variableName, Support::DatatypesAliases.at("unsigned char"), " from call to Write unsigned char*" ); - Variable<unsigned char>& variable = m_Group->m_UChar[index]; //must be a reference - variable.Values = values; - DataManWriteVariable( *m_Group, variableName, variable, m_Capsules, m_Transports ); + Write( *m_Group, variableName, values ); } void DataMan::Write( const std::string variableName, const short* values ) { - auto index = PreSetVariable( *m_Group, variableName, Support::DatatypesAliases.at("short"), " from call to Write short*" ); - Variable<short>& variable = m_Group->m_Short[index]; //must be a reference - variable.Values = values; - DataManWriteVariable( *m_Group, variableName, variable, m_Capsules, m_Transports ); + Write( *m_Group, variableName, values ); } void DataMan::Write( const std::string variableName, const unsigned short* values ) { - auto index = PreSetVariable( *m_Group, variableName, Support::DatatypesAliases.at("unsigned short"), " from call to Write unsigned short*" ); - Variable<unsigned short>& variable = m_Group->m_UShort[index]; //must be a reference - variable.Values = values; - DataManWriteVariable( *m_Group, variableName, variable, m_Capsules, m_Transports ); + Write( *m_Group, variableName, values ); } void DataMan::Write( const std::string variableName, const int* values ) { - auto index = PreSetVariable( *m_Group, variableName, Support::DatatypesAliases.at("int"), " from call to Write int*" ); - Variable<int>& variable = m_Group->m_Int[index]; //must be a reference - variable.Values = values; - DataManWriteVariable( *m_Group, variableName, variable, m_Capsules, m_Transports ); - + Write( *m_Group, variableName, values ); } void DataMan::Write( const std::string variableName, const unsigned int* values ) { - auto index = PreSetVariable( *m_Group, variableName, Support::DatatypesAliases.at("unsigned int"), " from call to Write unsigned int*" ); - Variable<unsigned int>& variable = m_Group->m_UInt[index]; //must be a reference - variable.Values = values; - DataManWriteVariable( *m_Group, variableName, variable, m_Capsules, m_Transports ); + Write( *m_Group, variableName, values ); } void DataMan::Write( const std::string variableName, const long int* values ) { - auto index = PreSetVariable( *m_Group, variableName, Support::DatatypesAliases.at("long int"), " from call to Write long int*" ); - Variable<long int>& variable = m_Group->m_LInt[index]; //must be a reference - variable.Values = values; - DataManWriteVariable( *m_Group, variableName, variable, m_Capsules, m_Transports ); + Write( *m_Group, variableName, values ); } void DataMan::Write( const std::string variableName, const unsigned long int* values ) { - auto index = PreSetVariable( *m_Group, variableName, Support::DatatypesAliases.at("unsigned long int"), " from call to Write unsigned long int*" ); - Variable<unsigned long int>& variable = m_Group->m_ULInt[index]; //must be a reference - variable.Values = values; - DataManWriteVariable( *m_Group, variableName, variable, m_Capsules, m_Transports ); + Write( *m_Group, variableName, values ); } void DataMan::Write( const std::string variableName, const long long int* values ) { - auto index = PreSetVariable( *m_Group, variableName, Support::DatatypesAliases.at("long long int"), " from call to Write long long int*" ); - Variable<long long int>& variable = m_Group->m_LLInt[index]; //must be a reference - variable.Values = values; - DataManWriteVariable( *m_Group, variableName, variable, m_Capsules, m_Transports ); + Write( *m_Group, variableName, values ); } void DataMan::Write( const std::string variableName, const unsigned long long int* values ) { - auto index = PreSetVariable( *m_Group, variableName, Support::DatatypesAliases.at("unsigned long long int"), " from call to Write unsigned long long int*" ); - Variable<unsigned long long int>& variable = m_Group->m_ULLInt[index]; //must be a reference - variable.Values = values; - DataManWriteVariable( *m_Group, variableName, variable, m_Capsules, m_Transports ); + Write( *m_Group, variableName, values ); } void DataMan::Write( const std::string variableName, const float* values ) { - auto index = PreSetVariable( *m_Group, variableName, Support::DatatypesAliases.at("float"), " from call to Write float*" ); - Variable<float>& variable = m_Group->m_Float[index]; //must be a reference - variable.Values = values; - DataManWriteVariable( *m_Group, variableName, variable, m_Capsules, m_Transports ); + Write( *m_Group, variableName, values ); } void DataMan::Write( const std::string variableName, const double* values ) { - auto index = PreSetVariable( *m_Group, variableName, Support::DatatypesAliases.at("double"), " from call to Write double*" ); - Variable<double>& variable = m_Group->m_Double[index]; //must be a reference - variable.Values = values; - DataManWriteVariable( *m_Group, variableName, variable, m_Capsules, m_Transports ); + Write( *m_Group, variableName, values ); } - void DataMan::Write( const std::string variableName, const long double* values ) { - auto index = PreSetVariable( *m_Group, variableName, Support::DatatypesAliases.at("long double"), " from call to Write long double*" ); - Variable<long double>& variable = m_Group->m_LDouble[index]; //must be a reference - variable.Values = values; - DataManWriteVariable( *m_Group, variableName, variable, m_Capsules, m_Transports ); + Write( *m_Group, variableName, values ); } @@ -274,7 +233,6 @@ void DataMan::InitCapsules( ) } - void DataMan::InitTransports( ) { std::set< std::string > transportStreamNames; //used to check for name conflict between transports diff --git a/src/engine/writer/Writer.cpp b/src/engine/writer/Writer.cpp index 5819e3634..73d3730b9 100644 --- a/src/engine/writer/Writer.cpp +++ b/src/engine/writer/Writer.cpp @@ -46,139 +46,186 @@ void Writer::Init( ) void Writer::Write( Group& group, const std::string variableName, const char* values ) { - + auto index = PreSetVariable( group, variableName, Support::DatatypesAliases.at("char"), " from call to Write char*" ); + Variable<char>& variable = group.m_Char[index]; //must be a reference + variable.Values = values; + WriterWriteVariable( group, variableName, variable, *m_Capsules[0], m_Transports, m_BP1Writer ); } void Writer::Write( Group& group, const std::string variableName, const unsigned char* values ) { - + auto index = PreSetVariable( group, variableName, Support::DatatypesAliases.at("unsigned char"), " from call to Write unsigned char*" ); + Variable<unsigned char>& variable = group.m_UChar[index]; //must be a reference + variable.Values = values; + WriterWriteVariable( group, variableName, variable, *m_Capsules[0], m_Transports, m_BP1Writer ); } void Writer::Write( Group& group, const std::string variableName, const short* values ) { - + auto index = PreSetVariable( group, variableName, Support::DatatypesAliases.at("short"), " from call to Write short*" ); + Variable<short>& variable = group.m_Short[index]; //must be a reference + variable.Values = values; + WriterWriteVariable( group, variableName, variable, *m_Capsules[0], m_Transports, m_BP1Writer ); } void Writer::Write( Group& group, const std::string variableName, const unsigned short* values ) { - + auto index = PreSetVariable( group, variableName, Support::DatatypesAliases.at("unsigned short"), " from call to Write unsigned short*" ); + Variable<unsigned short>& variable = group.m_UShort[index]; //must be a reference + variable.Values = values; + WriterWriteVariable( group, variableName, variable, *m_Capsules[0], m_Transports, m_BP1Writer ); } void Writer::Write( Group& group, const std::string variableName, const int* values ) { - + auto index = PreSetVariable( group, variableName, Support::DatatypesAliases.at("int"), " from call to Write int*" ); + Variable<int>& variable = group.m_Int[index]; //must be a reference + variable.Values = values; + WriterWriteVariable( group, variableName, variable, *m_Capsules[0], m_Transports, m_BP1Writer ); } void Writer::Write( Group& group, const std::string variableName, const unsigned int* values ) { - + auto index = PreSetVariable( group, variableName, Support::DatatypesAliases.at("unsigned int"), " from call to Write unsigned int*" ); + Variable<unsigned int>& variable = group.m_UInt[index]; //must be a reference + variable.Values = values; + WriterWriteVariable( group, variableName, variable, *m_Capsules[0], m_Transports, m_BP1Writer ); } void Writer::Write( Group& group, const std::string variableName, const long int* values ) { - + auto index = PreSetVariable( group, variableName, Support::DatatypesAliases.at("long int"), " from call to Write long int*" ); + Variable<long int>& variable = group.m_LInt[index]; //must be a reference + variable.Values = values; + WriterWriteVariable( group, variableName, variable, *m_Capsules[0], m_Transports, m_BP1Writer ); } void Writer::Write( Group& group, const std::string variableName, const unsigned long int* values ) { - + auto index = PreSetVariable( group, variableName, Support::DatatypesAliases.at("unsigned long int"), " from call to Write unsigned long int*" ); + Variable<unsigned long int>& variable = group.m_ULInt[index]; //must be a reference + variable.Values = values; + WriterWriteVariable( group, variableName, variable, *m_Capsules[0], m_Transports, m_BP1Writer ); } void Writer::Write( Group& group, const std::string variableName, const long long int* values ) { - + auto index = PreSetVariable( group, variableName, Support::DatatypesAliases.at("long long int"), " from call to Write long long int*" ); + Variable<long long int>& variable = group.m_LLInt[index]; //must be a reference + variable.Values = values; + WriterWriteVariable( group, variableName, variable, *m_Capsules[0], m_Transports, m_BP1Writer ); } void Writer::Write( Group& group, const std::string variableName, const unsigned long long int* values ) { - + auto index = PreSetVariable( group, variableName, Support::DatatypesAliases.at("unsigned long long int"), " from call to Write unsigned long long int*" ); + Variable<unsigned long long int>& variable = group.m_ULLInt[index]; //must be a reference + variable.Values = values; + WriterWriteVariable( group, variableName, variable, *m_Capsules[0], m_Transports, m_BP1Writer ); } void Writer::Write( Group& group, const std::string variableName, const float* values ) { - + auto index = PreSetVariable( group, variableName, Support::DatatypesAliases.at("float"), " from call to Write float*" ); + Variable<float>& variable = group.m_Float[index]; //must be a reference + variable.Values = values; + WriterWriteVariable( group, variableName, variable, *m_Capsules[0], m_Transports, m_BP1Writer ); } void Writer::Write( Group& group, const std::string variableName, const double* values ) { - //auto index = PreSetVariable( group, variableName, Support::DatatypesAliases.at("double"), " from call to Write double*" ); + auto index = PreSetVariable( group, variableName, Support::DatatypesAliases.at("double"), " from call to Write double*" ); + Variable<double>& variable = group.m_Double[index]; //must be a reference + variable.Values = values; + WriterWriteVariable( group, variableName, variable, *m_Capsules[0], m_Transports, m_BP1Writer ); } void Writer::Write( Group& group, const std::string variableName, const long double* values ) { - + auto index = PreSetVariable( group, variableName, Support::DatatypesAliases.at("long double"), " from call to Write long double*" ); + Variable<long double>& variable = group.m_LDouble[index]; //must be a reference + variable.Values = values; + WriterWriteVariable( group, variableName, variable, *m_Capsules[0], m_Transports, m_BP1Writer ); } void Writer::Write( const std::string variableName, const char* values ) { - + Write( *m_Group, variableName, values ); } + void Writer::Write( const std::string variableName, const unsigned char* values ) { - + Write( *m_Group, variableName, values ); } + void Writer::Write( const std::string variableName, const short* values ) { - + Write( *m_Group, variableName, values ); } + void Writer::Write( const std::string variableName, const unsigned short* values ) { - + Write( *m_Group, variableName, values ); } + void Writer::Write( const std::string variableName, const int* values ) { - const unsigned int index = PreSetVariable( *m_Group, variableName, Support::DatatypesAliases.at("int"), " from call to Write int*" ); - m_Group->m_Int[index].Values = values; - //here call the Template function WriteHelper( m_Group, variable, ) + Write( *m_Group, variableName, values ); } + void Writer::Write( const std::string variableName, const unsigned int* values ) { - + Write( *m_Group, variableName, values ); } + void Writer::Write( const std::string variableName, const long int* values ) { - + Write( *m_Group, variableName, values ); } + void Writer::Write( const std::string variableName, const unsigned long int* values ) { - + Write( *m_Group, variableName, values ); } + void Writer::Write( const std::string variableName, const long long int* values ) { - + Write( *m_Group, variableName, values ); } + void Writer::Write( const std::string variableName, const unsigned long long int* values ) { - + Write( *m_Group, variableName, values ); } + void Writer::Write( const std::string variableName, const float* values ) { - + Write( *m_Group, variableName, values ); } + void Writer::Write( const std::string variableName, const double* values ) { - auto index = PreSetVariable( *m_Group, variableName, Support::DatatypesAliases.at("double"), " from call to Write double*" ); - std::cout << "Hello from SingleBP Write double with index " << index << "\n"; + Write( *m_Group, variableName, values ); } void Writer::Write( const std::string variableName, const long double* values ) { - + Write( *m_Group, variableName, values ); } @@ -192,6 +239,7 @@ void Writer::InitCapsules( ) void Writer::InitTransports( ) { + //Let BPFormat handle this?? std::set< std::string > transportStreamNames; //used to check for name conflict between transports const unsigned int transportsSize = m_Method.m_TransportParameters.size(); @@ -253,6 +301,13 @@ void Writer::InitTransports( ) } +void Writer::Close( const int transportIndex ) +{ + +} + + + } //end namespace adios -- GitLab