diff --git a/Makefile b/Makefile index 86b405b8d6fb215b39fc4d13322042cc9cf72a7a..7dc1c449713f6f3163a65a3f05e686ddce49a2db 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ AR:=ar MPICC:=mpic++ LIBS:= -L$(SYS_LIB) -L$(LOCAL_LIB) -CFLAGS:=-c -Wall -Wpedantic -Woverloaded-virtual -std=c++11 -O0 -g +CFLAGS:=-c -Wall -Wpedantic -std=c++11 -O0 -g ARFLAGS:=rcs #ADIOS @@ -21,8 +21,11 @@ HFiles:=$(shell find ./include -type f -name "*.h") CPPFiles:=$(shell find ./src -type f -name "*.cpp") INC:=-I./include VPATH = ./src ./src/core ./src/functions \ - ./src/engine ./src/engine/writer ./src/engine/dataman \ - ./src/capsule ./src/transform ./src/transport ./src/format + ./src/engine/bp ./src/engine/dataman \ + ./src/transport/file ./src/transport/wan \ + ./src/capsule/heap ./src/capsule/shmem \ + ./src/transform \ + ./src/format #SEPARATE EXTERNAL LIBRARIES HANDLING in Makefile.libs export $(HFiles) $(CPPFiles) $(CFLAGS) $(LIBS) diff --git a/examples/hello/compound/Makefile b/examples/hello/compound/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..60eac201256d193410cbf9e4bf74fff50ebad6ac --- /dev/null +++ b/examples/hello/compound/Makefile @@ -0,0 +1,31 @@ +# Makefile for testing purposes, will build helloWriter_OOP_mpi (make or make mpi) or helloWriter_OOP_nompi (make nompi) +# Created on: Oct 4, 2016 +# Author: wfg + +BASE_NAME=helloCompound + +#COMPILERS +CC=g++ +MPICC=mpic++ + +#ADIOS LOCATION +ADIOS_DIR=../../.. +ADIOS_INCLUDE=-I$(ADIOS_DIR)/include +ADIOS_LIB=$(ADIOS_DIR)/lib/libadios.a +ADIOS_NOMPI_LIB=$(ADIOS_DIR)/lib/libadios_nompi.a + +#FLAGS +CFLAGS=-Wall -Wpedantic -std=c++11 -O0 -g +LDFLAGS= + +all: mpi nompi + +mpi: $(ADIOS_LIB) $(ADIOS_HFiles) + $(MPICC) $(CFLAGS) $(ADIOS_INCLUDE) -DHAVE_MPI $(BASE_NAME).cpp -o $(BASE_NAME).exe $(ADIOS_LIB) $(LDFLAGS) -lpthread + +nompi: $(ADIOS_NOMPI_LIB) $(NoMPI_HFiles) + $(CC) $(CFLAGS) $(ADIOS_INCLUDE) $(BASE_NAME)_nompi.cpp -o $(BASE_NAME)_nompi.exe $(ADIOS_NOMPI_LIB) $(LDFLAGS) -lpthread + +clean: + rm *.exe + \ No newline at end of file diff --git a/examples/hello/compound/helloCompound.cpp b/examples/hello/compound/helloCompound.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c34e3f5b43961b5f2102b7095827b9c2ca906b4b --- /dev/null +++ b/examples/hello/compound/helloCompound.cpp @@ -0,0 +1,104 @@ +/* + * helloCompound.cpp + * + * Created on: Feb 20, 2017 + * Author: wfg + */ + +#include <vector> +#include <iostream> +#include <cstddef> // offsetof + + +#include <mpi.h> + + +#include "ADIOS_CPP.h" + + +struct Particle +{ + char Type[10]; ///< alpha, beta, gamma, etc. + double Position[3]; ///< x, y, z + double Velocity[3]; ///< Vx, Vy, Vz +}; + + +int main( int argc, char* argv [] ) +{ + MPI_Init( &argc, &argv ); + int rank; + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + const bool adiosDebug = true; + adios::ADIOS adios( MPI_COMM_WORLD, adiosDebug ); + + //Application variable + std::vector<double> myDoubles = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + const std::size_t Nx = myDoubles.size(); + + Particle myParticle; + sprintf( myParticle.Type, "%s", "photon" ); + myParticle.Position[0] = 0; + myParticle.Position[1] = 1; + myParticle.Position[2] = 2; + + myParticle.Velocity[0] = 10; + myParticle.Velocity[1] = 11; + myParticle.Velocity[2] = 12; + + try + { + //Define variable and local size + adios::Variable<double>& ioMyDoubles = adios.DefineVariable<double>( "myDoubles", adios::Dims{Nx} ); + + adios::VariableCompound& ioMyParticle = adios.DefineVariableCompound<Particle>( "myParticle", adios::Dims{1} ); + ioMyParticle.InsertMember<std::string>( "Type", offsetof(Particle,Type) ); + ioMyParticle.InsertMember<std::vector<double>>( "Position", offsetof(Particle,Position) ); + ioMyParticle.InsertMember<std::vector<double>>( "Velocity", offsetof(Particle,Velocity) ); + + //Define method for engine creation, it is basically straight-forward parameters + adios::Method& bpWriterSettings = adios.DeclareMethod( "SingleFile" ); //default method type is BPWriter + bpWriterSettings.AddTransport( "File", "have_metadata_file=yes" ); //uses default POSIX library + + //Create engine smart pointer due to polymorphism, + //Open returns a smart pointer to Engine containing the Derived class Writer + auto bpWriter = adios.Open( "myDoubles.bp", "w", bpWriterSettings ); + + if( bpWriter == nullptr ) + throw std::ios_base::failure( "ERROR: couldn't create bpWriter at Open\n" ); + + bpWriter->Write( ioMyDoubles, myDoubles.data() ); // Base class Engine own the Write<T> that will call overloaded Write from Derived + bpWriter->Close( ); + } + catch( std::invalid_argument& e ) + { + if( rank == 0 ) + { + std::cout << "Invalid argument exception, STOPPING PROGRAM\n"; + std::cout << e.what() << "\n"; + } + } + catch( std::ios_base::failure& e ) + { + if( rank == 0 ) + { + std::cout << "System exception, STOPPING PROGRAM\n"; + std::cout << e.what() << "\n"; + } + } + catch( std::exception& e ) + { + if( rank == 0 ) + { + std::cout << "Exception, STOPPING PROGRAM\n"; + std::cout << e.what() << "\n"; + } + } + + MPI_Finalize( ); + + return 0; + +} + + diff --git a/examples/hello/compound/helloCompound_nompi.cpp b/examples/hello/compound/helloCompound_nompi.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1bb0cb1a959677c05a47b37addf18a350522169d --- /dev/null +++ b/examples/hello/compound/helloCompound_nompi.cpp @@ -0,0 +1,87 @@ +/* + * helloCompound.cpp + * + * Created on: Feb 20, 2017 + * Author: wfg + */ + +#include <vector> +#include <iostream> +#include <cstddef> // offsetof +#include <cstdio> + +#include "ADIOS_CPP.h" + + +struct Particle +{ + char Type[10]; ///< alpha, beta, gamma, etc. + double Position[3]; ///< x, y, z + double Velocity[3]; ///< Vx, Vy, Vz +}; + + +int main( int argc, char* argv [] ) +{ + const bool adiosDebug = true; + adios::ADIOS adios( adiosDebug ); + + //Application variable + std::vector<double> myDoubles = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + const std::size_t Nx = myDoubles.size(); + + Particle myParticle; + sprintf( myParticle.Type, "%s", "photon" ); + myParticle.Position[0] = 0; + myParticle.Position[1] = 1; + myParticle.Position[2] = 2; + + myParticle.Velocity[0] = 10; + myParticle.Velocity[1] = 11; + myParticle.Velocity[2] = 12; + + try + { + //Define variable and local size + adios::Variable<double>& ioMyDoubles = adios.DefineVariable<double>( "myDoubles", adios::Dims{Nx} ); + + adios::VariableCompound& ioMyParticle = adios.DefineVariableCompound<Particle>( "myParticle" ); + ioMyParticle.InsertMember<char>( "Type", offsetof(Particle,Type) ); + ioMyParticle.InsertMember<double>( "Position", offsetof(Particle,Position) ); + ioMyParticle.InsertMember<double>( "Velocity", offsetof(Particle,Velocity) ); + + //Define method for engine creation, it is basically straight-forward parameters + adios::Method& bpWriterSettings = adios.DeclareMethod( "SingleFile" ); //default method type is BPWriter + bpWriterSettings.AddTransport( "File", "have_metadata_file=yes" ); //uses default POSIX library + + //Create engine smart pointer due to polymorphism, + //Open returns a smart pointer to Engine containing the Derived class Writer + auto bpWriter = adios.Open( "myDoubles.bp", "w", bpWriterSettings ); + + if( bpWriter == nullptr ) + throw std::ios_base::failure( "ERROR: couldn't create bpWriter at Open\n" ); + + bpWriter->Write( ioMyDoubles, myDoubles.data() ); // Base class Engine own the Write<T> that will call overloaded Write from Derived + bpWriter->Close( ); + } + catch( std::invalid_argument& e ) + { + std::cout << "Invalid argument exception, STOPPING PROGRAM\n"; + std::cout << e.what() << "\n"; + } + catch( std::ios_base::failure& e ) + { + std::cout << "System exception, STOPPING PROGRAM\n"; + std::cout << e.what() << "\n"; + } + catch( std::exception& e ) + { + std::cout << "Exception, STOPPING PROGRAM\n"; + std::cout << e.what() << "\n"; + } + + return 0; + +} + + diff --git a/examples/hello/dataman/Makefile b/examples/hello/dataman/Makefile index 64efaa2a4a3c30103831febc991815633b58f634..3b8cfcce537bbe8ddce4a3e116cfcff7059e272a 100644 --- a/examples/hello/dataman/Makefile +++ b/examples/hello/dataman/Makefile @@ -3,7 +3,7 @@ # Author: wfg -BASE_NAME=helloDataMan +BASE_NAME=helloDataManWriter CC=g++ # Compiling with defaults MPICC=mpic++ diff --git a/examples/hello/dataman/helloDataMan.cpp b/examples/hello/dataman/helloDataManWriter.cpp similarity index 93% rename from examples/hello/dataman/helloDataMan.cpp rename to examples/hello/dataman/helloDataManWriter.cpp index c6c1f653e366e895ca770aa70f8729375b0549d4..e9e961e997f3b706d7b8f6dae20bfba3a82a5dc9 100644 --- a/examples/hello/dataman/helloDataMan.cpp +++ b/examples/hello/dataman/helloDataManWriter.cpp @@ -35,8 +35,8 @@ int main( int argc, char* argv [] ) auto& ioMyDoubles = adios.DefineVariable<double>( "myDoubles", {Nx} ); //Define method for engine creation, it is basically straight-forward parameters - adios::Method& datamanSettings = adios.DeclareMethod( "WAN", "DataMan" ); //default method type is Writer - datamanSettings.SetParameters( "peer-to-peer=yes", "optimize=yes", "compress=yes" ); + adios::Method& datamanSettings = adios.DeclareMethod( "WAN", "DataManWriter" ); //default method type is Writer + datamanSettings.SetParameters( "peer-to-peer=yes", "real_time=yes", "compress=no" ); datamanSettings.AddTransport( "Mdtm", "localIP=128.0.0.0.1", "remoteIP=128.0.0.0.2", "tolerances=1,2,3" ); //datamanSettings.AddTransport( "ZeroMQ", "localIP=128.0.0.0.1.1", "remoteIP=128.0.0.0.2.1", "tolerances=1,2,3" ); not yet supported, will throw an exception diff --git a/examples/hello/dataman/helloDataMan_nompi.cpp b/examples/hello/dataman/helloDataManWriter_nompi.cpp similarity index 74% rename from examples/hello/dataman/helloDataMan_nompi.cpp rename to examples/hello/dataman/helloDataManWriter_nompi.cpp index fe7ebbafd5da3c5bc668535b5652c28df3ddcf71..fb0f3c35185e39d6c8e85c85328ccaacd94d2067 100644 --- a/examples/hello/dataman/helloDataMan_nompi.cpp +++ b/examples/hello/dataman/helloDataManWriter_nompi.cpp @@ -24,11 +24,11 @@ int main( int argc, char* argv [] ) { //Define variable and local size //Define variable and local size - auto& ioMyDoubles = adios.DefineVariable<double>( "myDoubles", {Nx} ); + auto& ioMyDoubles = adios.DefineVariable<double>( "myDoubles", adios::Dims{Nx} ); //Define method for engine creation, it is basically straight-forward parameters - adios::Method& datamanSettings = adios.DeclareMethod( "WAN", "DataMan" ); //default method type is Writer - datamanSettings.SetParameters( "peer-to-peer=yes", "optimize=yes", "compress=yes" ); + adios::Method& datamanSettings = adios.DeclareMethod( "WAN", "DataManWriter" ); //default method type is Writer + datamanSettings.SetParameters( "peer-to-peer=yes", "real_time=yes", "compress=no" ); datamanSettings.AddTransport( "Mdtm", "localIP=128.0.0.0.1", "remoteIP=128.0.0.0.2", "tolerances=1,2,3" ); //datamanSettings.AddTransport( "ZeroMQ", "localIP=128.0.0.0.1.1", "remoteIP=128.0.0.0.2.1", "tolerances=1,2,3" ); not yet supported , will throw an exception @@ -42,6 +42,26 @@ int main( int argc, char* argv [] ) //datamanWriter->Write( "myDoubles", myDoubles.data() ); //you can write either by string or by object datamanWriter->Write( ioMyDoubles, myDoubles.data() ); // Base class Engine own the Write<T> that will call overloaded Write from Derived datamanWriter->Close( ); + + +// auto datamanReader = adios.Open( "myDoubles.bp", "r", datamanSettings ); +// +// if( datamanReader == nullptr ) +// throw std::ios_base::failure( "ERROR: failed to create DataMan I/O engine at Open\n" ); +// +// adios::Variable<double>& readMyDoubles = datamanReader->Inquire<double>( "myDoubles" ); +// std::cout << "Hello dataman Reader\n"; +// for( auto value : readMyDoubles.m_Values ) +// { +// std::cout << value << "\n"; +// } +// +// +// datamanReader->Close( ); + + + + } catch( std::invalid_argument& e ) { diff --git a/examples/hello/writer/Makefile b/examples/hello/writer/Makefile index 30851e670e052a65824167c3d545ce7a272facaa..b63e867e402f007f5e7d78eb9bb6241b778968cb 100644 --- a/examples/hello/writer/Makefile +++ b/examples/hello/writer/Makefile @@ -15,7 +15,7 @@ ADIOS_LIB=$(ADIOS_DIR)/lib/libadios.a ADIOS_NOMPI_LIB=$(ADIOS_DIR)/lib/libadios_nompi.a #FLAGS -CFLAGS=-Wall -Wpedantic -Woverloaded-virtual -std=c++11 -O0 -g +CFLAGS=-Wall -Wpedantic -std=c++11 -O0 -g LDFLAGS= all: mpi nompi diff --git a/examples/hello/writer/helloWriter.cpp b/examples/hello/writer/helloWriter.cpp index 9667b3ae484d563344e62e75aced778aa644aa6b..3bc89f0c1d4d8481bc431e274ec9c41f85aaa343 100644 --- a/examples/hello/writer/helloWriter.cpp +++ b/examples/hello/writer/helloWriter.cpp @@ -35,8 +35,8 @@ int main( int argc, char* argv [] ) auto& ioMyDoubles = adios.DefineVariable<double>( "myDoubles", adios::Dims{Nx} ); //Define method for engine creation, it is basically straight-forward parameters - adios::Method& bpWriterSettings = adios.DeclareMethod( "SinglePOSIXFile" ); //default method type is Writer - bpWriterSettings.AddTransport( "POSIX", "have_metadata_file=yes" ); + adios::Method& bpWriterSettings = adios.DeclareMethod( "SingleFile" ); //default method type is BPWriter + bpWriterSettings.AddTransport( "File", "have_metadata_file=yes" ); //uses default POSIX library //Create engine smart pointer due to polymorphism, //Open returns a smart pointer to Engine containing the Derived class Writer diff --git a/include/ADIOS.h b/include/ADIOS.h index 001334b700a30ddfb2ec300672faa5e5e72db962..a1e8c701e06e9c6eb1f8525fcbb11b7bdded49e0 100644 --- a/include/ADIOS.h +++ b/include/ADIOS.h @@ -15,6 +15,7 @@ #include <ostream> #include <set> #include <map> +#include <complex> /// \endcond #ifdef HAVE_MPI @@ -25,6 +26,7 @@ #include "core/Transform.h" #include "core/Variable.h" +#include "core/VariableCompound.h" #include "core/Method.h" #include "core/Support.h" #include "functions/adiosTemplates.h" @@ -54,20 +56,6 @@ public: // PUBLIC Constructors and Functions define the User Interface with ADIO std::string m_HostLanguage = "C++"; - std::vector< Variable<char> > m_Char; ///< Key: variable name, Value: variable of type char - std::vector< Variable<unsigned char> > m_UChar; ///< Key: variable name, Value: variable of type unsigned char - std::vector< Variable<short> > m_Short; ///< Key: variable name, Value: variable of type short - std::vector< Variable<unsigned short> > m_UShort; ///< Key: variable name, Value: variable of type unsigned short - std::vector< Variable<int> > m_Int; ///< Key: variable name, Value: variable of type int - std::vector< Variable<unsigned int> > m_UInt; ///< Key: variable name, Value: variable of type unsigned int - std::vector< Variable<long int> > m_LInt; ///< Key: variable name, Value: variable of type long int - std::vector< Variable<unsigned long int> > m_ULInt; ///< Key: variable name, Value: variable of type unsigned long int - std::vector< Variable<long long int> > m_LLInt; ///< Key: variable name, Value: variable of type long long int - std::vector< Variable<unsigned long long int> > m_ULLInt; ///< Key: variable name, Value: variable of type unsigned long long int - std::vector< Variable<float> > m_Float; ///< Key: variable name, Value: variable of type float - std::vector< Variable<double> > m_Double; ///< Key: variable name, Value: variable of type double - std::vector< Variable<long double> > m_LDouble; ///< Key: variable name, Value: variable of type double - /** * @brief ADIOS empty constructor. Used for non XML config file API calls. */ @@ -113,20 +101,30 @@ public: // PUBLIC Constructors and Functions define the User Interface with ADIO //throw std::invalid_argument( "ERROR: type not supported for variable " + name + "\n" ); } - template<class T> inline Variable<T>& GetVariable( const std::string name ) + { } + + + template<class T> + VariableCompound& DefineVariableCompound( const std::string name, const Dims dimensions = Dims{1}, + const Dims globalDimensions = Dims(), + const Dims globalOffsets = Dims() ) { - //throw std::invalid_argument( "ERROR: variable " + name + " and type don't match in call to GetVariable\n" ); + CheckVariableInput( name, dimensions ); + m_Compound.emplace_back( name, sizeof(T), dimensions, globalDimensions, globalOffsets, m_DebugMode ); + m_Variables.emplace( name, std::make_pair( GetType<T>(), m_Compound.size()-1 ) ); + return m_Compound.back(); } + VariableCompound& GetVariableCompound( const std::string name ); /** * Declares a new method * @param name must be unique * @param type supported type : "Writer" (default), "DataMan"...future: "Sirius" */ - Method& DeclareMethod( const std::string methodName, const std::string type = "Writer" ); + Method& DeclareMethod( const std::string methodName, const std::string type = "BPWriter" ); /** @@ -190,6 +188,24 @@ public: // PUBLIC Constructors and Functions define the User Interface with ADIO private: //no const to allow default empty and copy constructors + std::vector< Variable<char> > m_Char; ///< Key: variable name, Value: variable of type char + std::vector< Variable<unsigned char> > m_UChar; ///< Key: variable name, Value: variable of type unsigned char + std::vector< Variable<short> > m_Short; ///< Key: variable name, Value: variable of type short + std::vector< Variable<unsigned short> > m_UShort; ///< Key: variable name, Value: variable of type unsigned short + std::vector< Variable<int> > m_Int; ///< Key: variable name, Value: variable of type int + std::vector< Variable<unsigned int> > m_UInt; ///< Key: variable name, Value: variable of type unsigned int + std::vector< Variable<long int> > m_LInt; ///< Key: variable name, Value: variable of type long int + std::vector< Variable<unsigned long int> > m_ULInt; ///< Key: variable name, Value: variable of type unsigned long int + std::vector< Variable<long long int> > m_LLInt; ///< Key: variable name, Value: variable of type long long int + std::vector< Variable<unsigned long long int> > m_ULLInt; ///< Key: variable name, Value: variable of type unsigned long long int + std::vector< Variable<float> > m_Float; ///< Key: variable name, Value: variable of type float + std::vector< Variable<double> > m_Double; ///< Key: variable name, Value: variable of type double + std::vector< Variable<long double> > m_LDouble; ///< Key: variable name, Value: variable of type double + std::vector< Variable<std::complex<float>> > m_CFloat; ///< Key: variable name, Value: variable of type complex<float> + std::vector< Variable<std::complex<double>> > m_CDouble; ///< Key: variable name, Value: variable of type complex<float> + std::vector< Variable<std::complex<long double>> > m_CLDouble; ///< Key: variable name, Value: variable of type complex<float> + std::vector< VariableCompound > m_Compound; ///< Key: variable name, Value: compound type variable + std::string m_ConfigFile; ///< XML File to be read containing configuration information bool m_DebugMode = false; ///< if true will do more checks, exceptions, warnings, expect slower code @@ -239,7 +255,7 @@ private: //no const to allow default empty and copy constructors unsigned int GetVariableIndex( const std::string name ) { auto itVariable = m_Variables.find( name ); - CheckVariableName( itVariable, name, "in call to GetVariable<" + GetType<T>() + ">" ); + CheckVariableName( itVariable, name, "in call to GetVariable<" + GetType<T>() + ">, or call to GetVariableCompound if <T> = <compound>\n" ); return itVariable->second.second; } diff --git a/include/ADIOS_CPP.h b/include/ADIOS_CPP.h index 033de1873b91eecbaea946bc5e52b406a7ec4d6d..0292313fd538bdbe9667780bc486d0dd45ac0d40 100644 --- a/include/ADIOS_CPP.h +++ b/include/ADIOS_CPP.h @@ -13,10 +13,9 @@ #include "core/Method.h" #include "core/Engine.h" -#include "engine/writer/Writer.h" -#include "engine/dataman/DataMan.h" - #include "core/Transform.h" +#include "engine/bp/BPWriter.h" +#include "engine/dataman/DataManWriter.h" #include "transform/BZip2.h" diff --git a/include/capsule/Heap.h b/include/capsule/heap/STLVector.h similarity index 77% rename from include/capsule/Heap.h rename to include/capsule/heap/STLVector.h index 5a1fa8d1966093e046b8b646eb6bd9c75cebaaef..1ae8ce9f5c65f0f4304d6f349677d00b2c2517cc 100644 --- a/include/capsule/Heap.h +++ b/include/capsule/heap/STLVector.h @@ -5,8 +5,8 @@ * Author: wfg */ -#ifndef HEAP_H_ -#define HEAP_H_ +#ifndef STLVECTOR_H_ +#define STLVECTOR_H_ /// \cond EXCLUDE_FROM_DOXYGEN #include <vector> @@ -18,11 +18,13 @@ namespace adios { +namespace capsule +{ /** * Data and Metadata buffers are allocated in the Heap */ -class Heap : public Capsule +class STLVector : public Capsule { public: @@ -36,9 +38,9 @@ public: * @param rankMPI MPI rank * @param debugMode true: extra checks, slower */ - Heap( const std::string accessMode, const int rankMPI, const bool debugMode = false ); + STLVector( const std::string accessMode, const int rankMPI, const bool debugMode = false ); - ~Heap( ); + ~STLVector( ); char* GetData( ); char* GetMetadata( ); @@ -52,14 +54,9 @@ public: }; - - - +} //end namespace capsule } //end namespace - - - -#endif /* HEAP_H_ */ +#endif /* STLVECTOR_H_ */ diff --git a/include/capsule/ShmSystemV.h b/include/capsule/shmem/ShmSystemV.h similarity index 100% rename from include/capsule/ShmSystemV.h rename to include/capsule/shmem/ShmSystemV.h diff --git a/include/core/Engine.h b/include/core/Engine.h index 2255cbf9db60cd5d4fe0b4b40cc2d7017e26c39f..9fe6adaace30f4c9a3e59c6957a1cc9f271dc079 100644 --- a/include/core/Engine.h +++ b/include/core/Engine.h @@ -15,6 +15,7 @@ #include <memory> //std::shared_ptr #include <map> #include <utility> //std::pair +#include <complex> //std::complex /// \endcond #ifdef HAVE_MPI @@ -26,6 +27,7 @@ #include "ADIOS.h" #include "core/Method.h" #include "core/Variable.h" +#include "core/VariableCompound.h" #include "core/Transform.h" #include "core/Transport.h" #include "core/Capsule.h" @@ -88,19 +90,57 @@ public: Write( variable, values ); } - virtual void Write( Variable<char>& variable, const char* values ) = 0; - virtual void Write( Variable<unsigned char>& variable, const unsigned char* values ) = 0; - virtual void Write( Variable<short>& variable, const short* values ) = 0; - virtual void Write( Variable<unsigned short>& variable, const unsigned short* values ) = 0; - virtual void Write( Variable<int>& variable, const int* values ) = 0; - virtual void Write( Variable<unsigned int>& variable, const unsigned int* values ) = 0; - virtual void Write( Variable<long int>& variable, const long int* values ) = 0; - virtual void Write( Variable<unsigned long int>& variable, const unsigned long int* values ) = 0; - virtual void Write( Variable<long long int>& variable, const long long int* values ) = 0; - virtual void Write( Variable<unsigned long long int>& variable, const unsigned long long int* values ) = 0; - virtual void Write( Variable<float>& variable, const float* values ) = 0; - virtual void Write( Variable<double>& variable, const double* values ) = 0; - virtual void Write( Variable<long double>& variable, const long double* values ) = 0; + /** + * String version + * @param variableName + * @param values + */ + template< class T > + void Write( const std::string variableName, const T* values ) + { + Write( variableName, values ); + } + + /** + * Single value version + * @param variable + * @param values + */ + template< class T > + void Write( Variable<T>& variable, const T& values ) + { + Write( variable, &values ); + } + + /** + * Single value version using string as variable handlers + * @param variableName + * @param values + */ + template< class T > + void Write( const std::string variableName, const T& values ) + { + Write( variableName, &values ); + } + + virtual void Write( Variable<char>& variable, const char* values ); + virtual void Write( Variable<unsigned char>& variable, const unsigned char* values ); + virtual void Write( Variable<short>& variable, const short* values ); + virtual void Write( Variable<unsigned short>& variable, const unsigned short* values ); + virtual void Write( Variable<int>& variable, const int* values ); + virtual void Write( Variable<unsigned int>& variable, const unsigned int* values ); + virtual void Write( Variable<long int>& variable, const long int* values ); + virtual void Write( Variable<unsigned long int>& variable, const unsigned long int* values ); + virtual void Write( Variable<long long int>& variable, const long long int* values ); + virtual void Write( Variable<unsigned long long int>& variable, const unsigned long long int* values ); + virtual void Write( Variable<float>& variable, const float* values ); + virtual void Write( Variable<double>& variable, const double* values ); + virtual void Write( Variable<long double>& variable, const long double* values ); + virtual void Write( Variable<std::complex<float>>& variable, const std::complex<float>* values ); + virtual void Write( Variable<std::complex<double>>& variable, const std::complex<double>* values ); + virtual void Write( Variable<std::complex<long double>>& variable, const std::complex<long double>* values ); + virtual void Write( VariableCompound& variable, const void* values ); + /** * @brief Write functions can be overridden by derived classes. Base class behavior is to: @@ -110,19 +150,48 @@ public: * @param variableName * @param values coming from user app */ - virtual void Write( const std::string variableName, const char* values ) = 0; - virtual void Write( const std::string variableName, const unsigned char* values ) = 0; - virtual void Write( const std::string variableName, const short* values ) = 0; - virtual void Write( const std::string variableName, const unsigned short* values ) = 0; - virtual void Write( const std::string variableName, const int* values ) = 0; - virtual void Write( const std::string variableName, const unsigned int* values ) = 0; - virtual void Write( const std::string variableName, const long int* values ) = 0; - virtual void Write( const std::string variableName, const unsigned long int* values ) = 0; - virtual void Write( const std::string variableName, const long long int* values ) = 0; - virtual void Write( const std::string variableName, const unsigned long long int* values ) = 0; - virtual void Write( const std::string variableName, const float* values ) = 0; - 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 Write( const std::string variableName, const char* values ); + virtual void Write( const std::string variableName, const unsigned char* values ); + virtual void Write( const std::string variableName, const short* values ); + virtual void Write( const std::string variableName, const unsigned short* values ); + virtual void Write( const std::string variableName, const int* values ); + virtual void Write( const std::string variableName, const unsigned int* values ); + virtual void Write( const std::string variableName, const long int* values ); + virtual void Write( const std::string variableName, const unsigned long int* values ); + virtual void Write( const std::string variableName, const long long int* values ); + virtual void Write( const std::string variableName, const unsigned long long int* values ); + virtual void Write( const std::string variableName, const float* values ); + virtual void Write( const std::string variableName, const double* values ); + virtual void Write( const std::string variableName, const long double* values ); + virtual void Write( const std::string variableName, const std::complex<float>* values ); + virtual void Write( const std::string variableName, const std::complex<double>* values ); + virtual void Write( const std::string variableName, const std::complex<long double>* values ); + virtual void Write( const std::string variableName, const void* values ); + + //Read API +// template< class T > +// virtual Variable<T>* InquireVariable( const std::string name ) +// { +// return InquireVariable<T>( name ); +// } +// +// virtual Variable<char>* InquireVariable( const std::string name ); +// virtual Variable<unsigned char>* InquireVariable( const std::string name ); +// virtual Variable<short>* InquireVariable( const std::string name ); +// virtual Variable<unsigned short>* InquireVariable( const std::string name ); +// virtual Variable<int>* InquireVariable( const std::string name ); +// virtual Variable<unsigned int>* InquireVariable( const std::string name ); +// virtual Variable<long int>* InquireVariable( const std::string name ); +// virtual Variable<unsigned long int>* InquireVariable( const std::string name ); +// virtual Variable<long long int>* InquireVariable( const std::string name ); +// virtual Variable<unsigned long long int>* InquireVariable( const std::string name ); +// virtual Variable<float>* InquireVariable( const std::string name ); +// virtual Variable<double>* InquireVariable( const std::string name ); +// virtual Variable<long double>* InquireVariable( const std::string name ); +// virtual Variable<std::complex<float>>* InquireVariable( const std::string name ); +// virtual Variable<std::complex<double>>* InquireVariable( const std::string name ); +// virtual Variable<std::complex<long double>>* InquireVariable( const std::string name ); + virtual void Close( const int transportIndex = -1 ); ///< Closes a particular transport, or all if -1 diff --git a/include/core/Variable.h b/include/core/Variable.h index 24f54ef135a282efa27addc0239b777e1a3f67a9..036e68e3daf927bcbe094356760f4d104ef6c322 100644 --- a/include/core/Variable.h +++ b/include/core/Variable.h @@ -15,16 +15,13 @@ #include <ostream> //std::ostream in MonitorGroups /// \endcond +#include "core/VariableBase.h" #include "core/Transform.h" -#include "functions/adiosFunctions.h" -#include "functions/adiosTemplates.h" - namespace adios { -using Dims = std::vector<size_t>; struct TransformData { @@ -37,39 +34,18 @@ struct TransformData * @param Base (parent) class for template derived (child) class CVariable. Required to put CVariable objects in STL containers. */ template< class T > -class Variable +class Variable : public VariableBase { public: - const std::string m_Name; ///< variable name - const std::string m_Type; ///< variable type - - Dims m_Dimensions; - std::string m_DimensionsCSV; ///< comma separated list for variables to search for local dimensions - - Dims m_GlobalDimensions; - std::string m_GlobalDimensionsCSV; ///< comma separated list for variables to search for global dimensions - - Dims m_GlobalOffsets; - std::string m_GlobalOffsetsCSV; ///< comma separated list for variables to search for global offsets - - const bool m_DebugMode = false; - const T* m_AppValues = nullptr; ///< pointer to values passed from user in ADIOS Write, it might change in ADIOS Read std::vector<T> m_Values; ///< Vector variable returned to user, might be used for zero-copy? - - bool m_IsScalar = false; - const bool m_IsDimension = false; std::vector< TransformData > m_Transforms; ///< associated transforms, sequence determines application order, e.g. first Transforms[0] then Transforms[1]. Pointer used as reference (no memory management). - Variable( const std::string name, const Dims dimensions, const Dims globalDimensions, const Dims globalOffsets, const bool debugMode ): - m_Name{ name }, - m_Type{ GetType<T>() }, - m_Dimensions{ dimensions }, - m_GlobalDimensions{ globalDimensions }, - m_GlobalOffsets{ globalOffsets }, - m_DebugMode{ debugMode } + Variable<T>( const std::string name, const Dims dimensions, const Dims globalDimensions, const Dims globalOffsets, + const bool debugMode ): + VariableBase( name, GetType<T>(), sizeof(T), dimensions, globalDimensions, globalOffsets, debugMode ) { if( m_Dimensions == Dims{1} ) m_IsScalar = true; @@ -82,7 +58,6 @@ public: m_Transforms.emplace_back( transform, BuildParametersMap( parameters, m_DebugMode ) ); //need to check } - void Monitor( std::ostream& logInfo ) const noexcept { logInfo << "Variable: " << m_Name << "\n"; @@ -103,27 +78,9 @@ public: } logInfo << " ..."; } - logInfo << "\n"; } - /** - * Returns the payload size in bytes - * @return TotalSize * sizeof(T) - */ - std::size_t PayLoadSize( ) const noexcept - { - return GetTotalSize( m_Dimensions ) * sizeof(T); - } - - /** - * Returns the total size - * @return number of elements - */ - std::size_t TotalSize( ) const noexcept - { - return GetTotalSize( m_Dimensions ); - } }; diff --git a/include/core/VariableBase.h b/include/core/VariableBase.h new file mode 100644 index 0000000000000000000000000000000000000000..07d6602f7d31bc412f825c9bac52bcfde3ed8526 --- /dev/null +++ b/include/core/VariableBase.h @@ -0,0 +1,95 @@ +/* + * VariableBase.h + * + * Created on: Feb 20, 2017 + * Author: wfg + */ + +#ifndef VARIABLEBASE_H_ +#define VARIABLEBASE_H_ + +/// \cond EXCLUDE_FROM_DOXYGEN +#include <vector> +#include <string> +/// \endcond + +#include "functions/adiosFunctions.h" //GetTotalSize +#include "functions/adiosTemplates.h" //GetType<T> + + +namespace adios +{ + +using Dims = std::vector<std::size_t>; + + +class VariableBase +{ + +public: + + const std::string m_Name; ///< variable name + const std::string m_Type; ///< variable type + const std::size_t m_ElementSize; ///< Variable -> sizeof(T), VariableCompound -> from constructor + + bool m_IsScalar = false; + const bool m_IsDimension = false; + + + VariableBase( const std::string name, const std::string type, const std::size_t elementSize, + const Dims dimensions, const Dims globalDimensions, const Dims globalOffsets, + const bool debugMode ): + m_Name{ name }, + m_Type{ type }, + m_ElementSize{ elementSize }, + m_Dimensions{ dimensions }, + m_GlobalDimensions{ globalDimensions }, + m_GlobalOffsets{ globalOffsets }, + m_DebugMode{ debugMode } + { } + + virtual ~VariableBase( ) + { } + + + std::size_t DimensionsSize( ) const noexcept + { + return m_Dimensions.size(); + } + + /** + * Returns the payload size in bytes + * @return TotalSize * sizeof(T) + */ + std::size_t PayLoadSize( ) const noexcept + { + return GetTotalSize( m_Dimensions ) * m_ElementSize; + } + + /** + * Returns the total size + * @return number of elements + */ + std::size_t TotalSize( ) const noexcept + { + return GetTotalSize( m_Dimensions ); + } + + +//protected: off for now + + Dims m_Dimensions; ///< array of local dimensions + Dims m_GlobalDimensions; ///< array of global dimensions + Dims m_GlobalOffsets; ///< array of global offsets + const bool m_DebugMode = false; + + +}; + + + + +} + + +#endif /* VARIABLEBASE_H_ */ diff --git a/include/core/VariableCompound.h b/include/core/VariableCompound.h new file mode 100644 index 0000000000000000000000000000000000000000..1fda61ab485d8007eea108a90ab1b114d6231987 --- /dev/null +++ b/include/core/VariableCompound.h @@ -0,0 +1,67 @@ +/* + * VariableCompound.h + * + * Created on: Feb 20, 2017 + * Author: wfg + */ + +#ifndef VARIABLECOMPOUND_H_ +#define VARIABLECOMPOUND_H_ + +#include "core/VariableBase.h" + +namespace adios +{ + +struct CompoundElement +{ + const std::string m_Name; + const std::size_t m_Offset; + const std::string m_Type; +}; + + +/** + * @param Base (parent) class for template derived (child) class CVariable. Required to put CVariable objects in STL containers. + */ +class VariableCompound : public VariableBase +{ + +public: + + const void* m_AppValue = nullptr; + + + VariableCompound( const std::string name, const std::size_t sizeOfStruct, const Dims dimensions, + const Dims globalDimensions, const Dims globalOffsets, const bool debugMode ): + VariableBase( name, "compound", sizeOfStruct, dimensions, globalDimensions, globalOffsets, debugMode ) + { } + + template< class U > + void InsertMember( const std::string name, const std::size_t offset ) + { + m_Elements.push_back( CompoundElement{ name, offset, GetType<U>() } ); + } + + void Monitor( std::ostream& logInfo ) const noexcept + { + logInfo << "Variable Compound: " << m_Name << "\n"; + logInfo << "Type: " << m_Type << "\n"; + logInfo << "Size: " << TotalSize() << " elements\n"; + logInfo << "Payload: " << PayLoadSize() << " bytes\n"; + } + + +private: + + std::vector<CompoundElement> m_Elements; ///< vector of element types + +}; + + + + +} //end namespace + + +#endif /* VARIABLECOMPOUND_H_ */ diff --git a/include/engine/writer/Writer.h b/include/engine/bp/BPWriter.h similarity index 80% rename from include/engine/writer/Writer.h rename to include/engine/bp/BPWriter.h index 8e9fc634b339a8f33c80b3f56a804408aaae94bb..33d09c7d6d790e12a0361b0475b530630d778215 100644 --- a/include/engine/writer/Writer.h +++ b/include/engine/bp/BPWriter.h @@ -5,19 +5,20 @@ * Author: wfg */ -#ifndef WRITER_H_ -#define WRITER_H_ +#ifndef BPWRITER_H_ +#define BPWRITER_H_ #include "core/Engine.h" #include "format/BP1Writer.h" -#include "capsule/Heap.h" + +//supported capsules +#include "capsule/heap/STLVector.h" namespace adios { - -class Writer : public Engine +class BPWriter : public Engine { public: @@ -30,10 +31,10 @@ public: * @param method * @param debugMode */ - Writer( ADIOS& adios, const std::string name, const std::string accessMode, MPI_Comm mpiComm, - const Method& method, const bool debugMode = false, const unsigned int cores = 1 ); + BPWriter( ADIOS& adios, const std::string name, const std::string accessMode, MPI_Comm mpiComm, + const Method& method, const bool debugMode = false, const unsigned int cores = 1 ); - ~Writer( ); + ~BPWriter( ); void Write( Variable<char>& variable, const char* values ); void Write( Variable<unsigned char>& variable, const unsigned char* values ); @@ -44,10 +45,14 @@ public: void Write( Variable<long int>& variable, const long int* values ); void Write( Variable<unsigned long int>& variable, const unsigned long int* values ); void Write( Variable<long long int>& variable, const long long int* values ); - void Write( Variable<unsigned long long int>& variable, const unsigned long long int* values ) ; + void Write( Variable<unsigned long long int>& variable, const unsigned long long int* values ); void Write( Variable<float>& variable, const float* values ); void Write( Variable<double>& variable, const double* values ); void Write( Variable<long double>& variable, const long double* values ); + void Write( Variable<std::complex<float>>& variable, const std::complex<float>* values ); + void Write( Variable<std::complex<double>>& variable, const std::complex<double>* values ); + void Write( Variable<std::complex<long double>>& variable, const std::complex<long double>* values ); + void Write( VariableCompound& variable, const void* values ); void Write( const std::string variableName, const char* values ); void Write( const std::string variableName, const unsigned char* values ); @@ -62,19 +67,22 @@ public: void Write( const std::string variableName, const float* values ); void Write( const std::string variableName, const double* values ); void Write( const std::string variableName, const long double* values ); + void Write( const std::string variableName, const std::complex<float>* values ); + void Write( const std::string variableName, const std::complex<double>* values ); + void Write( const std::string variableName, const std::complex<long double>* values ); + void Write( const std::string variableName, const void* values ); void Close( const int transportIndex = -1 ); private: - Heap m_Buffer; ///< heap capsule + capsule::STLVector m_Buffer; ///< heap capsule using STL std::vector<char> format::BP1Writer m_BP1Writer; ///< format object will provide the required BP functionality to be applied on m_Buffer and m_Transports format::BP1MetadataSet m_MetadataSet; ///< metadata set accompanying the heap buffer data in bp format. Needed by m_BP1Writer std::size_t m_MaxBufferSize; float m_GrowthFactor = 1.5; bool m_TransportFlush = false; ///< true: transport flush happened, buffer must be reset - void Init( ); void InitTransports( ); void InitProcessGroup( ); @@ -138,4 +146,4 @@ private: } //end namespace adios -#endif /* WRITER_H_ */ +#endif /* BPWRITER_H_ */ diff --git a/include/engine/dataman/DataMan.h b/include/engine/dataman/DataManWriter.h similarity index 91% rename from include/engine/dataman/DataMan.h rename to include/engine/dataman/DataManWriter.h index 10d13a1201467145ec59bbc2c5fcc11f5fb1ca6c..04a3848a3a76ed8f950f4e6e95553a5bba4e5501 100644 --- a/include/engine/dataman/DataMan.h +++ b/include/engine/dataman/DataManWriter.h @@ -5,21 +5,22 @@ * Author: wfg */ -#ifndef DATAMAN_H_ -#define DATAMAN_H_ +#ifndef DATAMANWRITER_H_ +#define DATAMANWRITER_H_ #include <iostream> //must be removed #include <unistd.h> //must be removed #include "core/Engine.h" -#include "capsule/Heap.h" #include "format/BP1Writer.h" +//supported capsules +#include "capsule/heap/STLVector.h" namespace adios { -class DataMan : public Engine +class DataManWriter : public Engine { public: @@ -33,10 +34,10 @@ public: * @param debugMode * @param hostLanguage */ - DataMan( ADIOS& adios, const std::string name, const std::string accessMode, MPI_Comm mpiComm, + DataManWriter( ADIOS& adios, const std::string name, const std::string accessMode, MPI_Comm mpiComm, const Method& method, const bool debugMode = false, const unsigned int cores = 1 ); - ~DataMan( ); + ~DataManWriter( ); void Write( Variable<char>& variable, const char* values ); void Write( Variable<unsigned char>& variable, const unsigned char* values ); @@ -68,7 +69,7 @@ public: private: - Heap m_Buffer; ///< heap capsule, contains data and metadata buffers + capsule::STLVector m_Buffer; ///< heap capsule, contains data and metadata buffers format::BP1Writer m_BP1Writer; ///< format object will provide the required BP functionality to be applied on m_Buffer and m_Transports void Init( ); ///< calls InitCapsules and InitTransports based on Method, called from constructor @@ -120,4 +121,4 @@ private: -#endif /* DATAMAN_H_ */ +#endif /* DATAMANWRITER_H_ */ diff --git a/include/format/BP1Writer.h b/include/format/BP1Writer.h index dd20dbc9695d4119e9dd3b566ca15243f8eccc88..9b697dc6d87bd27745c9fc8516567bf9bd43965a 100644 --- a/include/format/BP1Writer.h +++ b/include/format/BP1Writer.h @@ -19,7 +19,7 @@ #include "BP1.h" #include "core/Variable.h" #include "core/Capsule.h" -#include "capsule/Heap.h" +#include "capsule/heap/STLVector.h" #include "functions/adiosTemplates.h" #include "functions/adiosFunctions.h" @@ -65,7 +65,7 @@ public: void WriteProcessGroupIndex( const bool isFortran, const std::string name, const unsigned int processID, const std::string timeStepName, const unsigned int timeStep, const std::vector< std::shared_ptr<Transport> >& transports, - Heap& buffer, + capsule::STLVector& buffer, BP1MetadataSet& metadataSet ) const noexcept; /** * Writes a process group index PGIndex and list of methods (from transports), done at Open or aggregation of new time step @@ -102,7 +102,7 @@ public: indexSize += variable.m_Name.size(); // characteristics 3 and 4, check variable number of dimensions - const std::size_t dimensions = variable.m_Dimensions.size(); //number of commas in CSV + 1 + const std::size_t dimensions = variable.DimensionsSize(); //number of commas in CSV + 1 indexSize += 28 * dimensions; //28 bytes per dimension indexSize += 1; //id @@ -144,7 +144,7 @@ public: * @param metadataSet */ template< class T > - void WriteVariableIndex( const Variable<T>& variable, Heap& buffer, BP1MetadataSet& metadataSet ) const noexcept + void WriteVariableIndex( const Variable<T>& variable, capsule::STLVector& buffer, BP1MetadataSet& metadataSet ) const noexcept { // adapt this part to local variables std::vector<char*> dataBuffers{ buffer.m_Data.data() }; diff --git a/include/functions/adiosTemplates.h b/include/functions/adiosTemplates.h index 96d0969a128adb4baf291b752f57dbb229fb1391..b13e6fcb51530440b92d5c8cf96e9ccef2a146cf 100644 --- a/include/functions/adiosTemplates.h +++ b/include/functions/adiosTemplates.h @@ -13,6 +13,7 @@ #include <vector> #include <thread> #include <set> +#include <complex> /// \endcond @@ -24,8 +25,7 @@ namespace adios * Get the primitive type in a string from a template * @return if T is a char, returns string = "char" */ -template< class T> inline std::string GetType( ) noexcept { return ""; } - +template< class T> inline std::string GetType( ) noexcept { return "compound"; } template<> inline std::string GetType<char>() noexcept { return "char"; } template<> inline std::string GetType<unsigned char>() noexcept { return "unsigned char"; } template<> inline std::string GetType<short>() noexcept { return "short"; } @@ -39,6 +39,10 @@ template<> inline std::string GetType<unsigned long long int>() noexcept { retur template<> inline std::string GetType<float>() noexcept { return "float"; } template<> inline std::string GetType<double>() noexcept { return "double"; } template<> inline std::string GetType<long double>() noexcept { return "long double"; } +template<> inline std::string GetType<std::complex<float>>() noexcept { return "float complex"; } +template<> inline std::string GetType<std::complex<double>>() noexcept { return "double complex"; } +template<> inline std::string GetType<std::complex<long double>>() noexcept { return "long double complex"; } + /** diff --git a/include/transport/POSIX.h b/include/transport/file/FD.h similarity index 60% rename from include/transport/POSIX.h rename to include/transport/file/FD.h index 9dea1b463b10d43ca47c19087010433d9b7c5fcd..4c005ccbb8f85adb1c1a3fbada36ecb1a8b0174a 100644 --- a/include/transport/POSIX.h +++ b/include/transport/file/FD.h @@ -5,8 +5,8 @@ * Author: wfg */ -#ifndef POSIX_H_ -#define POSIX_H_ +#ifndef FD_H_ +#define FD_H_ #include "core/Transport.h" @@ -14,16 +14,20 @@ namespace adios { +namespace transport +{ - -class POSIX : public Transport +/** + * File descriptor transport using the POSIX library + */ +class FD : public Transport { public: - POSIX( MPI_Comm mpiComm, const bool debugMode ); + FD( MPI_Comm mpiComm, const bool debugMode ); - ~POSIX( ); + ~FD( ); void Open( const std::string name, const std::string accessMode ); @@ -38,7 +42,8 @@ private: }; -} //end namespace -#endif /* POSIX_H_ */ +} //end namespace transport +} //end namespace +#endif /* FD_H_ */ diff --git a/include/transport/File.h b/include/transport/file/FP.h similarity index 60% rename from include/transport/File.h rename to include/transport/file/FP.h index a9b763828f905cfab0a4f0ce6396a902c81f7d60..2ac13458722228a83d5bac8356a6c4e2406cd215 100644 --- a/include/transport/File.h +++ b/include/transport/file/FP.h @@ -5,29 +5,32 @@ * Author: wfg */ -#ifndef FILE_H_ -#define FILE_H_ - +#ifndef FP_H_ +#define FP_H_ +/// \cond EXCLUDE_FROM_DOXYGEN #include <stdio.h> // FILE* +/// \endcond #include "core/Transport.h" namespace adios { +namespace transport +{ /** - * Class that defines a transport method using C file pointer to streams FILE* + * Class that defines a transport method using C file pointer (FP) to streams FILE* */ -class File : public Transport +class FP : public Transport { public: - File( MPI_Comm mpiComm, const bool debugMode ); + FP( MPI_Comm mpiComm, const bool debugMode ); - ~File( ); + ~FP( ); void Open( const std::string name, const std::string accessMode ); @@ -47,9 +50,10 @@ private: }; +} //end namespace transport } //end namespace -#endif /* FILE_H_ */ +#endif /* FP_H_ */ diff --git a/include/transport/FStream.h b/include/transport/file/FStream.h similarity index 81% rename from include/transport/FStream.h rename to include/transport/file/FStream.h index feedb3a7b3398a3fa3f97baa62ed63822647ca2a..fed11ac1fa1a63221e57b4e8930bc0688a33ff56 100644 --- a/include/transport/FStream.h +++ b/include/transport/file/FStream.h @@ -1,5 +1,5 @@ /* - * CFStream.h + * FStream.h * * Created on: Oct 18, 2016 * Author: wfg @@ -8,17 +8,20 @@ #ifndef FSTREAM_H_ #define FSTREAM_H_ - +/// \cond EXCLUDE_FROM_DOXYGEN #include <fstream> +/// \endcond #include "core/Transport.h" namespace adios { +namespace transport +{ /** - * Class that defines a transport method using C++ file streams + * File stream transport using C++ fstream */ class FStream : public Transport { @@ -47,6 +50,7 @@ private: }; +} //end namespace transport } //end namespace diff --git a/include/transport/MPIFile.h b/include/transport/file/MPI_File.h similarity index 65% rename from include/transport/MPIFile.h rename to include/transport/file/MPI_File.h index 57389b334e9edc38fcaaaf67e7838ef144b9d528..0e5d1892a4ff44eb81584deadacaa7f92b1ca7f7 100644 --- a/include/transport/MPIFile.h +++ b/include/transport/file/MPI_File.h @@ -5,26 +5,31 @@ * Author: wfg */ -#ifndef MPIFILE_H_ -#define MPIFILE_H_ +#ifndef MPI_FILE_H_ +#define MPI_FILE_H_ + +/// \cond EXCLUDE_FROM_DOXYGEN #include <mpi.h> +/// \endcond namespace adios { +namespace transport +{ /** * Class that defines a transport method using C++ file streams */ -class MPIFile : public Transport +class MPI_File : public Transport { public: - MPIFile( MPI_Comm mpiComm, const bool debugMode ); + MPI_File( MPI_Comm mpiComm, const bool debugMode ); - ~MPIFile( ); + ~MPI_File( ); void Open( const std::string streamName, const std::string accessMode ); @@ -45,11 +50,11 @@ private: - +} //end namespace transport } //end namespace -#endif /* MPIFILE_H_ */ +#endif /* MPI_FILE_H_ */ diff --git a/include/transport/MdtmMan.h b/include/transport/wan/MdtmMan.h similarity index 98% rename from include/transport/MdtmMan.h rename to include/transport/wan/MdtmMan.h index c6e0285bd4b5fd442c12a1d7e1523b77098d2210..6752a58d3f562c302d7f2f00fe83aaa30430b4c9 100644 --- a/include/transport/MdtmMan.h +++ b/include/transport/wan/MdtmMan.h @@ -15,6 +15,8 @@ namespace adios { +namespace transport +{ class MdtmMan : public Transport { @@ -126,6 +128,7 @@ private: }; +} //end namespace transport } //end namespace diff --git a/src/ADIOS.cpp b/src/ADIOS.cpp index a5fd9a0f096c3cc7e50acb4c98e483c00ad2e478..edae670b8983e628f98029d5b996715596905f4c 100644 --- a/src/ADIOS.cpp +++ b/src/ADIOS.cpp @@ -13,12 +13,13 @@ /// \endcond #include "ADIOS.h" + + #include "functions/adiosFunctions.h" //Engines -#include "engine/writer/Writer.h" -#include "engine/dataman/DataMan.h" -//#include "engine/vis/Vis.h" +#include "engine/bp/BPWriter.h" +#include "engine/dataman/DataManWriter.h" namespace adios @@ -94,18 +95,18 @@ std::shared_ptr<Engine> ADIOS::Open( const std::string name, const std::string a const std::string type( method.m_Type ); - if( type == "Writer" || type == "writer" ) + if( type == "BPWriter" || type == "bpwriter" ) { - return std::make_shared<Writer>( *this, name, accessMode, mpiComm, method, m_DebugMode, cores ); + return std::make_shared<BPWriter>( *this, name, accessMode, mpiComm, method, m_DebugMode, cores ); } else if( type == "SIRIUS" || type == "sirius" || type == "Sirius" ) { //not yet supported //return std::make_shared<engine::DataMan>( name, accessMode, mpiComm, method, m_DebugMode, cores, m_HostLanguage ); } - else if( type == "DataMan" ) + else if( type == "DataManWriter" ) { - return std::make_shared<DataMan>( *this, name, accessMode, mpiComm, method, m_DebugMode, cores ); + return std::make_shared<DataManWriter>( *this, name, accessMode, mpiComm, method, m_DebugMode, cores ); } else if( type == "Vis" ) { @@ -149,6 +150,12 @@ std::shared_ptr<Engine> ADIOS::Open( const std::string name, const std::string a } +VariableCompound& ADIOS::GetVariableCompound( const std::string name ) +{ + return m_Compound[ GetVariableIndex<void>(name) ]; +} + + void ADIOS::MonitorVariables( std::ostream& logStream ) { logStream << "\tVariable \t Type\n"; diff --git a/src/capsule/Heap.cpp b/src/capsule/heap/STLVector.cpp similarity index 73% rename from src/capsule/Heap.cpp rename to src/capsule/heap/STLVector.cpp index ef099762ff2322ed228b7381b81fd79f5b64221b..27455f29b1b146166fe70c812773246fea81b280 100644 --- a/src/capsule/Heap.cpp +++ b/src/capsule/heap/STLVector.cpp @@ -10,14 +10,16 @@ #include <stdexcept> //std::runtime_error /// \endcond -#include "capsule/Heap.h" +#include "capsule/heap/STLVector.h" namespace adios { +namespace capsule +{ -Heap::Heap( const std::string accessMode, const int rankMPI, const bool debugMode ): +STLVector::STLVector( const std::string accessMode, const int rankMPI, const bool debugMode ): Capsule( "Heap", accessMode, rankMPI, debugMode ), m_Data( 16777216, '\0' ) { @@ -25,35 +27,35 @@ Heap::Heap( const std::string accessMode, const int rankMPI, const bool debugMod } -Heap::~Heap( ) +STLVector::~STLVector( ) { } -char* Heap::GetData( ) +char* STLVector::GetData( ) { return m_Data.data( ); } -char* Heap::GetMetadata( ) +char* STLVector::GetMetadata( ) { return m_Metadata.data( ); } -std::size_t Heap::GetDataSize( ) const +std::size_t STLVector::GetDataSize( ) const { return m_Data.size( ); } -std::size_t Heap::GetMetadataSize( ) const +std::size_t STLVector::GetMetadataSize( ) const { return m_Metadata.size( ); } -void Heap::ResizeData( const std::size_t size ) +void STLVector::ResizeData( const std::size_t size ) { if( m_DebugMode == true ) { @@ -67,7 +69,7 @@ void Heap::ResizeData( const std::size_t size ) } } -void Heap::ResizeMetadata( const std::size_t size ) +void STLVector::ResizeMetadata( const std::size_t size ) { if( m_DebugMode == true ) { @@ -82,4 +84,5 @@ void Heap::ResizeMetadata( const std::size_t size ) } +} //end namespace heap } //end namespace diff --git a/src/capsule/ShmSystemV.cpp b/src/capsule/shmem/ShmSystemV.cpp similarity index 97% rename from src/capsule/ShmSystemV.cpp rename to src/capsule/shmem/ShmSystemV.cpp index 40b5ccba05ab14a39a91db16fc46aa38ef3f26d5..8d3d508ac8894ed68dbbdf9b8216ae5071c94104 100644 --- a/src/capsule/ShmSystemV.cpp +++ b/src/capsule/shmem/ShmSystemV.cpp @@ -4,11 +4,13 @@ * Created on: Dec 22, 2016 * Author: wfg */ - +/// \cond EXCLUDE_FROM_DOXYGEN #include <sys/shm.h> #include <ios> //std::ios_base::failure +/// \endcond + -#include "capsule/ShmSystemV.h" +#include "capsule/shmem/ShmSystemV.h" namespace adios diff --git a/src/core/Engine.cpp b/src/core/Engine.cpp index 8e3dcb4ac1a5fa124b3bfdc29d11a9830622468a..fc4ef69f9798b692e7cda1b5d2364281c9441325 100644 --- a/src/core/Engine.cpp +++ b/src/core/Engine.cpp @@ -37,9 +37,46 @@ Engine::~Engine( ) { } -//PROTECTED - -void Engine::Close( int transportIndex ) +//should these functions throw an exception? +void Engine::Write( Variable<char>& variable, const char* values ){ } +void Engine::Write( Variable<unsigned char>& variable, const unsigned char* values ){ } +void Engine::Write( Variable<short>& variable, const short* values ){ } +void Engine::Write( Variable<unsigned short>& variable, const unsigned short* values ){ } +void Engine::Write( Variable<int>& variable, const int* values ){ } +void Engine::Write( Variable<unsigned int>& variable, const unsigned int* values ){ } +void Engine::Write( Variable<long int>& variable, const long int* values ){ } +void Engine::Write( Variable<unsigned long int>& variable, const unsigned long int* values ){ } +void Engine::Write( Variable<long long int>& variable, const long long int* values ){ } +void Engine::Write( Variable<unsigned long long int>& variable, const unsigned long long int* values ){ } +void Engine::Write( Variable<float>& variable, const float* values ){ } +void Engine::Write( Variable<double>& variable, const double* values ){ } +void Engine::Write( Variable<long double>& variable, const long double* values ){ } +void Engine::Write( Variable<std::complex<float>>& variable, const std::complex<float>* values ){ } +void Engine::Write( Variable<std::complex<double>>& variable, const std::complex<double>* values ){ } +void Engine::Write( Variable<std::complex<long double>>& variable, const std::complex<long double>* values ){ } +void Engine::Write( VariableCompound& variable, const void* values ){ } + +void Engine::Write( const std::string variableName, const char* values ){ } +void Engine::Write( const std::string variableName, const unsigned char* values ){ } +void Engine::Write( const std::string variableName, const short* values ){ } +void Engine::Write( const std::string variableName, const unsigned short* values ){ } +void Engine::Write( const std::string variableName, const int* values ){ } +void Engine::Write( const std::string variableName, const unsigned int* values ){ } +void Engine::Write( const std::string variableName, const long int* values ){ } +void Engine::Write( const std::string variableName, const unsigned long int* values ){ } +void Engine::Write( const std::string variableName, const long long int* values ){ } +void Engine::Write( const std::string variableName, const unsigned long long int* values ){ } +void Engine::Write( const std::string variableName, const float* values ){ } +void Engine::Write( const std::string variableName, const double* values ){ } +void Engine::Write( const std::string variableName, const long double* values ){ } +void Engine::Write( const std::string variableName, const std::complex<float>* values ){ } +void Engine::Write( const std::string variableName, const std::complex<double>* values ){ } +void Engine::Write( const std::string variableName, const std::complex<long double>* values ){ } +void Engine::Write( const std::string variableName, const void* values ){ } + + + +void Engine::Close( const int transportIndex ) { if( transportIndex == -1 ) //close all transports { @@ -52,6 +89,7 @@ void Engine::Close( int transportIndex ) } } +//PROTECTED void Engine::Init( ) { } @@ -109,4 +147,5 @@ bool Engine::TransportNamesUniqueness( ) const } + } //end namespace diff --git a/src/engine/writer/Writer.cpp b/src/engine/bp/BPWriter.cpp similarity index 53% rename from src/engine/writer/Writer.cpp rename to src/engine/bp/BPWriter.cpp index 7ddc5a5627a8f0be79859d6d73fe485a3a5d65ca..9157987336394f953b9c4ca8ccb51b0465cfe39d 100644 --- a/src/engine/writer/Writer.cpp +++ b/src/engine/bp/BPWriter.cpp @@ -1,42 +1,39 @@ /* - * SingleBP.cpp + * BPWriter.cpp * * Created on: Dec 19, 2016 * Author: wfg */ -#include "engine/writer/Writer.h" -#include "functions/adiosFunctions.h" //GetTotalSize +#include "engine/bp/BPWriter.h" +#include "ADIOS.h" -//supported capsules -#include "capsule/Heap.h" //supported transports -#include "transport/POSIX.h" -#include "transport/FStream.h" -#include "transport/File.h" +#include "transport/file/FD.h" +#include "transport/file/FP.h" +#include "transport/file/FStream.h" -#include "ADIOS.h" namespace adios { -Writer::Writer( ADIOS& adios, const std::string name, const std::string accessMode, const MPI_Comm mpiComm, - const Method& method, const bool debugMode, const unsigned int cores ): - Engine( adios, "Writer", name, accessMode, mpiComm, method, debugMode, cores, " Writer constructor (or call to ADIOS Open).\n" ), - m_Buffer{ Heap( accessMode, m_RankMPI, m_DebugMode ) }, +BPWriter::BPWriter( ADIOS& adios, const std::string name, const std::string accessMode, const MPI_Comm mpiComm, + const Method& method, const bool debugMode, const unsigned int cores ): + Engine( adios, "BPWriter", name, accessMode, mpiComm, method, debugMode, cores, " BPWriter constructor (or call to ADIOS Open).\n" ), + m_Buffer{ capsule::STLVector( accessMode, m_RankMPI, m_DebugMode ) }, m_MaxBufferSize{ m_Buffer.m_Data.max_size() } { Init( ); } -Writer::~Writer( ) +BPWriter::~BPWriter( ) { } -void Writer::Init( ) +void BPWriter::Init( ) { auto itGrowthFactor = m_Method.m_Parameters.find( "buffer_growth" ); if( itGrowthFactor != m_Method.m_Parameters.end() ) @@ -55,101 +52,123 @@ void Writer::Init( ) InitTransports( ); InitProcessGroup( ); - } -void Writer::Write( Variable<char>& variable, const char* values ) +void BPWriter::Write( Variable<char>& variable, const char* values ) { WriteVariable( variable, values ); } -void Writer::Write( Variable<unsigned char>& variable, const unsigned char* values ) +void BPWriter::Write( Variable<unsigned char>& variable, const unsigned char* values ) { WriteVariable( variable, values ); } -void Writer::Write( Variable<short>& variable, const short* values ) +void BPWriter::Write( Variable<short>& variable, const short* values ) { WriteVariable( variable, values ); } -void Writer::Write( Variable<unsigned short>& variable, const unsigned short* values ) +void BPWriter::Write( Variable<unsigned short>& variable, const unsigned short* values ) { WriteVariable( variable, values ); } -void Writer::Write( Variable<int>& variable, const int* values ) +void BPWriter::Write( Variable<int>& variable, const int* values ) { WriteVariable( variable, values ); } -void Writer::Write( Variable<unsigned int>& variable, const unsigned int* values ) +void BPWriter::Write( Variable<unsigned int>& variable, const unsigned int* values ) { WriteVariable( variable, values ); } -void Writer::Write( Variable<long int>& variable, const long int* values ) +void BPWriter::Write( Variable<long int>& variable, const long int* values ) { WriteVariable( variable, values ); } -void Writer::Write( Variable<unsigned long int>& variable, const unsigned long int* values ) +void BPWriter::Write( Variable<unsigned long int>& variable, const unsigned long int* values ) { WriteVariable( variable, values ); } -void Writer::Write( Variable<long long int>& variable, const long long int* values ) +void BPWriter::Write( Variable<long long int>& variable, const long long int* values ) { WriteVariable( variable, values ); } -void Writer::Write( Variable<unsigned long long int>& variable, const unsigned long long int* values ) +void BPWriter::Write( Variable<unsigned long long int>& variable, const unsigned long long int* values ) { WriteVariable( variable, values ); } -void Writer::Write( Variable<float>& variable, const float* values ) +void BPWriter::Write( Variable<float>& variable, const float* values ) { WriteVariable( variable, values ); } -void Writer::Write( Variable<double>& variable, const double* values ) +void BPWriter::Write( Variable<double>& variable, const double* values ) { WriteVariable( variable, values ); } -void Writer::Write( Variable<long double>& variable, const long double* values ) +void BPWriter::Write( Variable<long double>& variable, const long double* values ) { WriteVariable( variable, values ); } +void BPWriter::Write( Variable<std::complex<float>>& variable, const std::complex<float>* values ) +{ } + +void BPWriter::Write( Variable<std::complex<double>>& variable, const std::complex<double>* values ) +{ } + +void BPWriter::Write( Variable<std::complex<long double>>& variable, const std::complex<long double>* values ) +{ } + +void BPWriter::Write( VariableCompound& variable, const void* values ) +{ } + //String version -void Writer::Write( const std::string variableName, const char* values ) +void BPWriter::Write( const std::string variableName, const char* values ) { WriteVariable( m_ADIOS.GetVariable<char>( variableName ), values ); } -void Writer::Write( const std::string variableName, const unsigned char* values ) +void BPWriter::Write( const std::string variableName, const unsigned char* values ) { WriteVariable( m_ADIOS.GetVariable<unsigned char>( variableName ), values ); } -void Writer::Write( const std::string variableName, const short* values ) +void BPWriter::Write( const std::string variableName, const short* values ) { WriteVariable( m_ADIOS.GetVariable<short>( variableName ), values ); } -void Writer::Write( const std::string variableName, const unsigned short* values ) +void BPWriter::Write( const std::string variableName, const unsigned short* values ) { WriteVariable( m_ADIOS.GetVariable<unsigned short>( variableName ), values ); } -void Writer::Write( const std::string variableName, const int* values ) +void BPWriter::Write( const std::string variableName, const int* values ) { WriteVariable( m_ADIOS.GetVariable<int>( variableName ), values ); } -void Writer::Write( const std::string variableName, const unsigned int* values ) +void BPWriter::Write( const std::string variableName, const unsigned int* values ) { WriteVariable( m_ADIOS.GetVariable<unsigned int>( variableName ), values ); } -void Writer::Write( const std::string variableName, const long int* values ) +void BPWriter::Write( const std::string variableName, const long int* values ) { WriteVariable( m_ADIOS.GetVariable<long int>( variableName ), values ); } -void Writer::Write( const std::string variableName, const unsigned long int* values ) +void BPWriter::Write( const std::string variableName, const unsigned long int* values ) { WriteVariable( m_ADIOS.GetVariable<unsigned long int>( variableName ), values ); } -void Writer::Write( const std::string variableName, const long long int* values ) +void BPWriter::Write( const std::string variableName, const long long int* values ) { WriteVariable( m_ADIOS.GetVariable<long long int>( variableName ), values ); } -void Writer::Write( const std::string variableName, const unsigned long long int* values ) +void BPWriter::Write( const std::string variableName, const unsigned long long int* values ) { WriteVariable( m_ADIOS.GetVariable<unsigned long long int>( variableName ), values ); } -void Writer::Write( const std::string variableName, const float* values ) +void BPWriter::Write( const std::string variableName, const float* values ) { WriteVariable( m_ADIOS.GetVariable<float>( variableName ), values ); } -void Writer::Write( const std::string variableName, const double* values ) +void BPWriter::Write( const std::string variableName, const double* values ) { WriteVariable( m_ADIOS.GetVariable<double>( variableName ), values ); } -void Writer::Write( const std::string variableName, const long double* values ) +void BPWriter::Write( const std::string variableName, const long double* values ) { WriteVariable( m_ADIOS.GetVariable<long double>( variableName ), values ); } +void BPWriter::Write( const std::string variableName, const std::complex<float>* values ) +{ } + +void BPWriter::Write( const std::string variableName, const std::complex<double>* values ) +{ } + +void BPWriter::Write( const std::string variableName, const std::complex<long double>* values ) +{ } + +void BPWriter::Write( const std::string variableName, const void* values ) +{ } -void Writer::Close( const int transportIndex ) +void BPWriter::Close( const int transportIndex ) { - //BP1Writer to update the metadata indices + //BP1BPWriter to update the metadata indices //merge all metadata indices in capsule.m_Metadata buffer or capsule.m_Data buffer (depends on transport predefined functionality) - //BP1Writer to write to corresponding transport + //BP1BPWriter to write to corresponding transport if( transportIndex == -1 ) // all transports { @@ -168,7 +187,7 @@ void Writer::Close( const int transportIndex ) } -void Writer::InitTransports( ) +void BPWriter::InitTransports( ) { if( m_DebugMode == true ) { @@ -182,40 +201,44 @@ void Writer::InitTransports( ) for( const auto& parameters : m_Method.m_TransportParameters ) { auto itTransport = parameters.find( "transport" ); - - if( itTransport->second == "POSIX" ) - { - auto file = std::make_shared<POSIX>( m_MPIComm, m_DebugMode ); - m_BP1Writer.OpenRankFiles( m_Name, m_AccessMode, *file ); - m_Transports.push_back( std::move( file ) ); - } - else if( itTransport->second == "File" ) + if( itTransport->second == "file" || itTransport->second == "File" ) { - auto file = std::make_shared<File>( m_MPIComm, m_DebugMode ); - m_BP1Writer.OpenRankFiles( m_Name, m_AccessMode, *file ); - m_Transports.push_back( std::move( file ) ); - } - else if( itTransport->second == "FStream" ) - { - auto file = std::make_shared<FStream>( m_MPIComm, m_DebugMode ); - m_BP1Writer.OpenRankFiles( m_Name, m_AccessMode, *file ); - m_Transports.push_back( std::move( file ) ); - } - else if( itTransport->second == "MPIFile" ) //not yet supported - { - //m_Transports.push_back( std::make_shared<MPIFile>( m_MPIComm, m_DebugMode ) ); - } - else - { - if( m_DebugMode == true ) - throw std::invalid_argument( "ERROR: transport + " + itTransport->second + " not supported, in " + - m_Name + m_EndMessage ); + auto itLibrary = parameters.find( "library" ); + if( itLibrary == parameters.end() || itLibrary->second == "POSIX" ) //use default POSIX + { + auto file = std::make_shared<transport::FD>( m_MPIComm, m_DebugMode ); + m_BP1Writer.OpenRankFiles( m_Name, m_AccessMode, *file ); + m_Transports.push_back( std::move( file ) ); + } + else if( itLibrary->second == "FILE*" ) + { + auto file = std::make_shared<transport::FP>( m_MPIComm, m_DebugMode ); + m_BP1Writer.OpenRankFiles( m_Name, m_AccessMode, *file ); + m_Transports.push_back( std::move( file ) ); + + } + else if( itLibrary->second == "fstream" || itLibrary->second == "std::fstream" ) + { + auto file = std::make_shared<transport::FStream>( m_MPIComm, m_DebugMode ); + m_BP1Writer.OpenRankFiles( m_Name, m_AccessMode, *file ); + m_Transports.push_back( std::move( file ) ); + } + else if( itLibrary->second == "MPI-IO" ) + { + + } + else + { + if( m_DebugMode == true ) + throw std::invalid_argument( "ERROR: transport + " + itTransport->second + " not supported, in " + + m_Name + m_EndMessage ); + } } } } -void Writer::InitProcessGroup( ) +void BPWriter::InitProcessGroup( ) { if( m_AccessMode == "a" ) { @@ -226,7 +249,7 @@ void Writer::InitProcessGroup( ) -void Writer::WriteProcessGroupIndex( ) +void BPWriter::WriteProcessGroupIndex( ) { //pg = process group const std::string pgName( std::to_string( m_RankMPI ) ); //using rank as name @@ -243,7 +266,7 @@ void Writer::WriteProcessGroupIndex( ) // const bool isFortran = ( m_HostLanguage == "Fortran" ) ? true : false; // const unsigned int processID = static_cast<unsigned int> ( m_RankMPI ); -// m_BP1Writer.WriteProcessGroupIndex( isFortran, name, processID, timeStepName, timeStep, m_Transports, +// m_BP1BPWriter.WriteProcessGroupIndex( isFortran, name, processID, timeStepName, timeStep, m_Transports, // m_Buffer.m_Data, m_Buffer.m_DataPosition, m_Buffer.m_DataAbsolutePosition, // m_MetadataSet.PGIndex, m_MetadataSet.PGIndexPosition ); @@ -256,7 +279,7 @@ void Writer::WriteProcessGroupIndex( ) } -bool Writer::CheckBuffersAllocation( const std::size_t indexSize, const std::size_t payloadSize ) +bool BPWriter::CheckBuffersAllocation( const std::size_t indexSize, const std::size_t payloadSize ) { //Check if data in buffer needs to be reallocated const std::size_t dataSize = payloadSize + indexSize + 10; //adding some bytes tolerance @@ -274,4 +297,3 @@ bool Writer::CheckBuffersAllocation( const std::size_t indexSize, const std::siz } //end namespace adios - diff --git a/src/engine/dataman/DataMan.cpp b/src/engine/dataman/DataMan.cpp deleted file mode 100644 index 96212d60a7bc64866d1e861db7486ef03b8f99dc..0000000000000000000000000000000000000000 --- a/src/engine/dataman/DataMan.cpp +++ /dev/null @@ -1,217 +0,0 @@ -/* - * DataMan.cpp - * - * Created on: Jan 10, 2017 - * Author: wfg - */ - -#include <iostream> - - -#include "engine/dataman/DataMan.h" -#include "core/Support.h" -#include "functions/adiosFunctions.h" //CSVToVector - -//supported capsules -#include "capsule/Heap.h" - -//supported transports -#include "transport/POSIX.h" -#include "transport/FStream.h" -#include "transport/File.h" -#include "transport/MdtmMan.h" - - -namespace adios -{ - -DataMan::DataMan( ADIOS& adios, const std::string name, const std::string accessMode, MPI_Comm mpiComm, - const Method& method, const bool debugMode, const unsigned int cores ): - Engine( adios, "DataMan", name, accessMode, mpiComm, method, debugMode, cores, " Dataman constructor (or call to ADIOS Open).\n" ), - m_Buffer( accessMode, m_RankMPI, m_DebugMode ) -{ - Init( ); -} - - -DataMan::~DataMan( ) -{ } - - -void DataMan::Init( ) -{ - InitCapsules( ); - InitTransports( ); -} - - -void DataMan::Write( Variable<char>& variable, const char* values ) -{ WriteVariable( variable, values ); } - -void DataMan::Write( Variable<unsigned char>& variable, const unsigned char* values ) -{ WriteVariable( variable, values ); } - -void DataMan::Write( Variable<short>& variable, const short* values ) -{ WriteVariable( variable, values ); } - -void DataMan::Write( Variable<unsigned short>& variable, const unsigned short* values ) -{ WriteVariable( variable, values ); } - -void DataMan::Write( Variable<int>& variable, const int* values ) -{ WriteVariable( variable, values ); } - -void DataMan::Write( Variable<unsigned int>& variable, const unsigned int* values ) -{ WriteVariable( variable, values ); } - -void DataMan::Write( Variable<long int>& variable, const long int* values ) -{ WriteVariable( variable, values ); } - -void DataMan::Write( Variable<unsigned long int>& variable, const unsigned long int* values ) -{ WriteVariable( variable, values ); } - -void DataMan::Write( Variable<long long int>& variable, const long long int* values ) -{ WriteVariable( variable, values ); } - -void DataMan::Write( Variable<unsigned long long int>& variable, const unsigned long long int* values ) -{ WriteVariable( variable, values ); } - -void DataMan::Write( Variable<float>& variable, const float* values ) -{ WriteVariable( variable, values ); } - -void DataMan::Write( Variable<double>& variable, const double* values ) -{ WriteVariable( variable, values ); } - -void DataMan::Write( Variable<long double>& variable, const long double* values ) -{ WriteVariable( variable, values ); } - -void DataMan::Write( const std::string variableName, const char* values ) -{ WriteVariable( m_ADIOS.GetVariable<char>( variableName ), values ); } - -void DataMan::Write( const std::string variableName, const unsigned char* values ) -{ WriteVariable( m_ADIOS.GetVariable<unsigned char>( variableName ), values ); } - -void DataMan::Write( const std::string variableName, const short* values ) -{ WriteVariable( m_ADIOS.GetVariable<short>( variableName ), values ); } - -void DataMan::Write( const std::string variableName, const unsigned short* values ) -{ WriteVariable( m_ADIOS.GetVariable<unsigned short>( variableName ), values ); } - -void DataMan::Write( const std::string variableName, const int* values ) -{ WriteVariable( m_ADIOS.GetVariable<int>( variableName ), values ); } - -void DataMan::Write( const std::string variableName, const unsigned int* values ) -{ WriteVariable( m_ADIOS.GetVariable<unsigned int>( variableName ), values ); } - -void DataMan::Write( const std::string variableName, const long int* values ) -{ WriteVariable( m_ADIOS.GetVariable<long int>( variableName ), values ); } - -void DataMan::Write( const std::string variableName, const unsigned long int* values ) -{ WriteVariable( m_ADIOS.GetVariable<unsigned long int>( variableName ), values ); } - -void DataMan::Write( const std::string variableName, const long long int* values ) -{ WriteVariable( m_ADIOS.GetVariable<long long int>( variableName ), values ); } - -void DataMan::Write( const std::string variableName, const unsigned long long int* values ) -{ WriteVariable( m_ADIOS.GetVariable<unsigned long long int>( variableName ), values ); } - -void DataMan::Write( const std::string variableName, const float* values ) -{ WriteVariable( m_ADIOS.GetVariable<float>( variableName ), values ); } - -void DataMan::Write( const std::string variableName, const double* values ) -{ WriteVariable( m_ADIOS.GetVariable<double>( variableName ), values ); } - -void DataMan::Write( const std::string variableName, const long double* values ) -{ WriteVariable( m_ADIOS.GetVariable<long double>( variableName ), values ); } - - -void DataMan::InitCapsules( ) -{ - //here init memory capsules -} - - -void DataMan::InitTransports( ) //maybe move this? -{ - TransportNamesUniqueness( ); - - for( const auto& parameters : m_Method.m_TransportParameters ) - { - auto itTransport = parameters.find( "transport" ); - - if( itTransport->second == "POSIX" ) - { - m_Transports.push_back( std::make_shared<POSIX>( m_MPIComm, m_DebugMode ) ); - } - else if( itTransport->second == "File" ) - { - m_Transports.push_back( std::make_shared<File>( m_MPIComm, m_DebugMode ) ); - } - else if( itTransport->second == "FStream" ) - { - m_Transports.push_back( std::make_shared<FStream>( m_MPIComm, m_DebugMode ) ); - } - else if( itTransport->second == "Mdtm" || itTransport->second == "MdtmMan" ) - { - const std::string localIP( GetMdtmParameter( "localIP", parameters ) ); //mandatory - const std::string remoteIP( GetMdtmParameter( "remoteIP", parameters ) ); //mandatory - const std::string prefix( GetMdtmParameter( "prefix", parameters ) ); - const int numberOfPipes = std::stoi( GetMdtmParameter( "pipes", parameters ) ); - const std::vector<int> tolerances = CSVToVectorInt( GetMdtmParameter( "tolerances", parameters ) ); - const std::vector<int> priorities = CSVToVectorInt( GetMdtmParameter( "priorities", parameters ) ); - - m_Transports.push_back( std::make_shared<MdtmMan>( localIP, remoteIP, m_AccessMode, prefix, numberOfPipes, - tolerances, priorities, m_MPIComm, m_DebugMode ) ); - } - else if( itTransport->second == "MPIFile" ) - { - //m_Transports.push_back( std::make_shared<MPIFile>( m_MPIComm, m_DebugMode ) ); //not yet supported - } - else - { - if( m_DebugMode == true ) - throw std::invalid_argument( "ERROR: transport + " + itTransport->second + " not supported, in " + - m_Name + m_EndMessage ); - } - } -} - - -std::string DataMan::GetMdtmParameter( const std::string parameter, const std::map<std::string,std::string>& mdtmParameters ) -{ - auto itParam = mdtmParameters.find( parameter ); - if( itParam != mdtmParameters.end() ) //found - { - return itParam->second; //return value - } - // if not found - //mandatory ones - if( parameter == "localIP" || parameter == "remoteIP" ) - { - if( m_DebugMode == true ) - throw std::invalid_argument( "ERROR: " + parameter + " parameter not found in Method, in call to DataMan constructor\n" ); - } - else if( parameter == "prefix" ) - { - return ""; - } - else if( parameter == "pipes" ) - { - return "0"; // or 1? - } - else if( parameter == "tolerances" ) //so far empty string - { - - } - else if( parameter == "priority" ) - { - - } - - return ""; //return empty string -} - - -} //end namespace adios - - - diff --git a/src/engine/dataman/DataManWriter.cpp b/src/engine/dataman/DataManWriter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d04c2185713403a04fee179df6b6c51026f9dab4 --- /dev/null +++ b/src/engine/dataman/DataManWriter.cpp @@ -0,0 +1,200 @@ +/* + * DataMan.cpp + * + * Created on: Jan 10, 2017 + * Author: wfg + */ + +#include <iostream> //needs to go away, this is just for demo purposes + +#include "engine/dataman/DataManWriter.h" + +#include "core/Support.h" +#include "functions/adiosFunctions.h" //CSVToVector + +//supported transports +#include "transport/file/FD.h" // uses POSIX +#include "transport/file/FP.h" // uses C FILE* +#include "transport/file/FStream.h" // uses C++ fstream +#include "transport/wan/MdtmMan.h" //uses Mdtm library + + +namespace adios +{ + + +DataManWriter::DataManWriter( ADIOS& adios, const std::string name, const std::string accessMode, MPI_Comm mpiComm, + const Method& method, const bool debugMode, const unsigned int cores ): + Engine( adios, "DataManWriter", name, accessMode, mpiComm, method, debugMode, cores, " Dataman constructor (or call to ADIOS Open).\n" ), + m_Buffer( accessMode, m_RankMPI, m_DebugMode ) +{ + Init( ); +} + + +DataManWriter::~DataManWriter( ) +{ } + + +void DataManWriter::Init( ) +{ + InitCapsules( ); + InitTransports( ); +} + + +void DataManWriter::Write( Variable<char>& variable, const char* values ) +{ WriteVariable( variable, values ); } + +void DataManWriter::Write( Variable<unsigned char>& variable, const unsigned char* values ) +{ WriteVariable( variable, values ); } + +void DataManWriter::Write( Variable<short>& variable, const short* values ) +{ WriteVariable( variable, values ); } + +void DataManWriter::Write( Variable<unsigned short>& variable, const unsigned short* values ) +{ WriteVariable( variable, values ); } + +void DataManWriter::Write( Variable<int>& variable, const int* values ) +{ WriteVariable( variable, values ); } + +void DataManWriter::Write( Variable<unsigned int>& variable, const unsigned int* values ) +{ WriteVariable( variable, values ); } + +void DataManWriter::Write( Variable<long int>& variable, const long int* values ) +{ WriteVariable( variable, values ); } + +void DataManWriter::Write( Variable<unsigned long int>& variable, const unsigned long int* values ) +{ WriteVariable( variable, values ); } + +void DataManWriter::Write( Variable<long long int>& variable, const long long int* values ) +{ WriteVariable( variable, values ); } + +void DataManWriter::Write( Variable<unsigned long long int>& variable, const unsigned long long int* values ) +{ WriteVariable( variable, values ); } + +void DataManWriter::Write( Variable<float>& variable, const float* values ) +{ WriteVariable( variable, values ); } + +void DataManWriter::Write( Variable<double>& variable, const double* values ) +{ WriteVariable( variable, values ); } + +void DataManWriter::Write( Variable<long double>& variable, const long double* values ) +{ WriteVariable( variable, values ); } + +void DataManWriter::Write( const std::string variableName, const char* values ) +{ WriteVariable( m_ADIOS.GetVariable<char>( variableName ), values ); } + +void DataManWriter::Write( const std::string variableName, const unsigned char* values ) +{ WriteVariable( m_ADIOS.GetVariable<unsigned char>( variableName ), values ); } + +void DataManWriter::Write( const std::string variableName, const short* values ) +{ WriteVariable( m_ADIOS.GetVariable<short>( variableName ), values ); } + +void DataManWriter::Write( const std::string variableName, const unsigned short* values ) +{ WriteVariable( m_ADIOS.GetVariable<unsigned short>( variableName ), values ); } + +void DataManWriter::Write( const std::string variableName, const int* values ) +{ WriteVariable( m_ADIOS.GetVariable<int>( variableName ), values ); } + +void DataManWriter::Write( const std::string variableName, const unsigned int* values ) +{ WriteVariable( m_ADIOS.GetVariable<unsigned int>( variableName ), values ); } + +void DataManWriter::Write( const std::string variableName, const long int* values ) +{ WriteVariable( m_ADIOS.GetVariable<long int>( variableName ), values ); } + +void DataManWriter::Write( const std::string variableName, const unsigned long int* values ) +{ WriteVariable( m_ADIOS.GetVariable<unsigned long int>( variableName ), values ); } + +void DataManWriter::Write( const std::string variableName, const long long int* values ) +{ WriteVariable( m_ADIOS.GetVariable<long long int>( variableName ), values ); } + +void DataManWriter::Write( const std::string variableName, const unsigned long long int* values ) +{ WriteVariable( m_ADIOS.GetVariable<unsigned long long int>( variableName ), values ); } + +void DataManWriter::Write( const std::string variableName, const float* values ) +{ WriteVariable( m_ADIOS.GetVariable<float>( variableName ), values ); } + +void DataManWriter::Write( const std::string variableName, const double* values ) +{ WriteVariable( m_ADIOS.GetVariable<double>( variableName ), values ); } + +void DataManWriter::Write( const std::string variableName, const long double* values ) +{ WriteVariable( m_ADIOS.GetVariable<long double>( variableName ), values ); } + + +void DataManWriter::InitCapsules( ) +{ + //here init memory capsules +} + + +void DataManWriter::InitTransports( ) //maybe move this? +{ + TransportNamesUniqueness( ); + + for( const auto& parameters : m_Method.m_TransportParameters ) + { + auto itTransport = parameters.find( "transport" ); + + if( itTransport->second == "Mdtm" || itTransport->second == "MdtmMan" ) + { + const std::string localIP( GetMdtmParameter( "localIP", parameters ) ); //mandatory + const std::string remoteIP( GetMdtmParameter( "remoteIP", parameters ) ); //mandatory + const std::string prefix( GetMdtmParameter( "prefix", parameters ) ); + const int numberOfPipes = std::stoi( GetMdtmParameter( "pipes", parameters ) ); + const std::vector<int> tolerances = CSVToVectorInt( GetMdtmParameter( "tolerances", parameters ) ); + const std::vector<int> priorities = CSVToVectorInt( GetMdtmParameter( "priorities", parameters ) ); + + m_Transports.push_back( std::make_shared<transport::MdtmMan>( localIP, remoteIP, m_AccessMode, prefix, numberOfPipes, + tolerances, priorities, m_MPIComm, m_DebugMode ) ); + } + else if( itTransport->second == "Zmq" ) + { + + } + else + { + if( m_DebugMode == true ) + throw std::invalid_argument( "ERROR: transport + " + itTransport->second + " not supported, in " + + m_Name + m_EndMessage ); + } + } +} + + +std::string DataManWriter::GetMdtmParameter( const std::string parameter, const std::map<std::string,std::string>& mdtmParameters ) +{ + auto itParam = mdtmParameters.find( parameter ); + if( itParam != mdtmParameters.end() ) //found + { + return itParam->second; //return value + } + // if not found + //mandatory ones + if( parameter == "localIP" || parameter == "remoteIP" ) + { + if( m_DebugMode == true ) + throw std::invalid_argument( "ERROR: " + parameter + " parameter not found in Method, in call to DataManWriter constructor\n" ); + } + else if( parameter == "prefix" ) + { + return ""; + } + else if( parameter == "pipes" ) + { + return "0"; // or 1? + } + else if( parameter == "tolerances" ) //so far empty string + { + + } + else if( parameter == "priority" ) + { + + } + + return ""; //return empty string +} + + +} //end namespace adios diff --git a/src/format/BP1Writer.cpp b/src/format/BP1Writer.cpp index d5bbaf46bb66f8c8dfbdcb0536ad05bffcba914e..09a1e8cac84ec84959ba27c756ba70d867844bbb 100644 --- a/src/format/BP1Writer.cpp +++ b/src/format/BP1Writer.cpp @@ -23,10 +23,11 @@ std::size_t BP1Writer::GetProcessGroupIndexSize( const std::string name, const s return ( name.length() + timeStepName.length() + 23 ) + ( 3 + numberOfTransports ); //should be sufficient for data and metadata pgindices } + void BP1Writer::WriteProcessGroupIndex( const bool isFortran, const std::string name, const unsigned int processID, const std::string timeStepName, const unsigned int timeStep, const std::vector< std::shared_ptr<Transport> >& transports, - Heap& buffer, BP1MetadataSet& metadataSet ) const noexcept + capsule::STLVector& buffer, BP1MetadataSet& metadataSet ) const noexcept { // adapt this part to local variables std::vector<char*> dataBuffers{ buffer.m_Data.data() }; @@ -45,9 +46,9 @@ void BP1Writer::WriteProcessGroupIndex( const bool isFortran, const std::string buffer.m_DataPosition = dataPositions[0]; buffer.m_DataAbsolutePosition = dataAbsolutePositions[0]; metadataSet.PGIndexPosition = metadataPositions[0]; - } + void BP1Writer::WriteProcessGroupIndex( const bool isFortran, const std::string name, const unsigned int processID, const std::string timeStepName, const unsigned int timeStep, const std::vector< std::shared_ptr<Transport> >& transports, diff --git a/src/functions/adiosFunctions.cpp b/src/functions/adiosFunctions.cpp index e0ec7ce420ff8a132bce14f589cb7336eb0d630a..fa18131dea59adab2f6277ed3846e34fa3932603 100644 --- a/src/functions/adiosFunctions.cpp +++ b/src/functions/adiosFunctions.cpp @@ -9,6 +9,7 @@ #include <fstream> #include <sstream> #include <stdexcept> +#include <ios> //std::ios_base::failure #include <thread> //std::thread #include <cstring> //std::memcpy #include <algorithm> //std::count diff --git a/src/transport/POSIX.cpp b/src/transport/file/FD.cpp similarity index 85% rename from src/transport/POSIX.cpp rename to src/transport/file/FD.cpp index bf7c40b6e0d94dcbd491c7038b03418c7ba0ddec..8f2ef36e0cd41eee53c24cfb7f8ce73fe7af2c47 100644 --- a/src/transport/POSIX.cpp +++ b/src/transport/file/FD.cpp @@ -1,5 +1,5 @@ /* - * POSIX.cpp + * FD.cpp file descriptor * * Created on: Oct 6, 2016 * Author: wfg @@ -15,19 +15,20 @@ /// \endcond -#include "transport/POSIX.h" +#include "transport/file/FD.h" namespace adios { +namespace transport +{ - -POSIX::POSIX( MPI_Comm mpiComm, const bool debugMode ): - Transport( "POSIX", mpiComm, debugMode ) +FD::FD( MPI_Comm mpiComm, const bool debugMode ): + Transport( "FD", mpiComm, debugMode ) { } -POSIX::~POSIX( ) +FD::~FD( ) { if( m_FileDescriptor != -1 ) { @@ -36,7 +37,7 @@ POSIX::~POSIX( ) } -void POSIX::Open( const std::string name, const std::string accessMode ) +void FD::Open( const std::string name, const std::string accessMode ) { m_Name = name; m_AccessMode = accessMode; @@ -63,7 +64,7 @@ void POSIX::Open( const std::string name, const std::string accessMode ) } -void POSIX::Write( const char* buffer, std::size_t size ) +void FD::Write( const char* buffer, std::size_t size ) { auto writtenSize = write( m_FileDescriptor, buffer, size ); @@ -82,7 +83,7 @@ void POSIX::Write( const char* buffer, std::size_t size ) } -void POSIX::Close( ) +void FD::Close( ) { int status = close( m_FileDescriptor ); @@ -95,4 +96,5 @@ void POSIX::Close( ) } +} //end namespace transport }//end namespace diff --git a/src/transport/File.cpp b/src/transport/file/FP.cpp similarity index 74% rename from src/transport/File.cpp rename to src/transport/file/FP.cpp index 4a5f9f3cb68051e2723fdde74ea44401f6597859..b9f1e26d2f652bb889fbf036ac3ba4d5f28bd2c0 100644 --- a/src/transport/File.cpp +++ b/src/transport/file/FP.cpp @@ -1,32 +1,37 @@ /* - * File.cpp + * FP.cpp * * Created on: Jan 6, 2017 * Author: wfg */ +/// \cond EXCLUDE_FROM_DOXYGEN #include <ios> //std::ios_base::failure +/// \endcond -#include "transport/File.h" + +#include "transport/file/FP.h" namespace adios { +namespace transport +{ -File::File( MPI_Comm mpiComm, const bool debugMode ): +FP::FP( MPI_Comm mpiComm, const bool debugMode ): Transport( "File", mpiComm, debugMode ) { } -File::~File( ) +FP::~FP( ) { if( m_File != NULL ) fclose( m_File ); } -void File::Open( const std::string name, const std::string accessMode ) +void FP::Open( const std::string name, const std::string accessMode ) { m_Name = name; m_AccessMode = accessMode; @@ -49,7 +54,7 @@ void File::Open( const std::string name, const std::string accessMode ) } -void File::SetBuffer( char* buffer, std::size_t size ) +void FP::SetBuffer( char* buffer, std::size_t size ) { int status = setvbuf( m_File, buffer, _IOFBF, size ); @@ -62,7 +67,7 @@ void File::SetBuffer( char* buffer, std::size_t size ) } -void File::Write( const char* buffer, std::size_t size ) +void FP::Write( const char* buffer, std::size_t size ) { fwrite( buffer, sizeof(char), size, m_File ); @@ -70,22 +75,22 @@ void File::Write( const char* buffer, std::size_t size ) { if( ferror( m_File ) ) throw std::ios_base::failure( "ERROR: couldn't write to file " + m_Name + - ", in call to File write\n" ); + ", in call to FP write\n" ); } } -void File::Flush( ) +void FP::Flush( ) { fflush( m_File ); } -void File::Close( ) +void FP::Close( ) { fclose( m_File ); } - +} //end namespace transport } //end namespace diff --git a/src/transport/FStream.cpp b/src/transport/file/FStream.cpp similarity index 90% rename from src/transport/FStream.cpp rename to src/transport/file/FStream.cpp index c299a639ebdca4f970a18172f0d1801dc22b55a3..e471b2f6a61184aa0ca66588725010b811e37137 100644 --- a/src/transport/FStream.cpp +++ b/src/transport/file/FStream.cpp @@ -9,11 +9,13 @@ #include <stdexcept> /// \endcond -#include "transport/FStream.h" +#include "transport/file/FStream.h" namespace adios { +namespace transport +{ FStream::FStream( MPI_Comm mpiComm, const bool debugMode ): @@ -60,8 +62,7 @@ void FStream::Write( const char* buffer, std::size_t size ) if( m_DebugMode == true ) { if( !m_FStream ) - throw std::ios_base::failure( "ERROR: couldn't write to file " + m_Name + - ", in call to FStream write\n" ); + throw std::ios_base::failure( "ERROR: couldn't write to file " + m_Name + ", in call to FStream write\n" ); } } @@ -78,5 +79,6 @@ void FStream::Close( ) } +} //end namespace transport } //end namespace diff --git a/src/transport/MdtmMan.cpp b/src/transport/wan/MdtmMan.cpp similarity index 95% rename from src/transport/MdtmMan.cpp rename to src/transport/wan/MdtmMan.cpp index a043647a399437de84a7903878e1ca32489a0791..6df6b1951c763519db378426a6b2a2a8f8f030ea 100644 --- a/src/transport/MdtmMan.cpp +++ b/src/transport/wan/MdtmMan.cpp @@ -7,13 +7,14 @@ -#include "transport/MdtmMan.h" +#include "transport/wan/MdtmMan.h" namespace adios { - +namespace transport +{ MdtmMan::MdtmMan( const std::string localIP, const std::string remoteIP, const std::string mode, const std::string prefix, const int numberOfPipes, const std::vector<int> tolerances, const std::vector<int> priorities, @@ -91,5 +92,5 @@ void MdtmMan::OnReceive( nlohmann::json& jData ) - +} //end namespace transport } //end namespace