Newer
Older
/*
* DataMan.h
*
* Created on: Jan 10, 2017
* Author: wfg
*/
#ifndef DATAMANWRITER_H_
#define DATAMANWRITER_H_
#include <iostream> //std::cout must be removed, only used for hello example
#include <unistd.h> //sleep must be removed
#include "capsule/heap/STLVector.h"
#include "DataManager.h" //here comes your DataMan header
class DataManWriter : public Engine
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/**
* Constructor for dataman engine Writer for WAN communications
* @param adios
* @param name unique name given to the engine
* @param accessMode
* @param mpiComm
* @param method
* @param debugMode
* @param nthreads
*/
DataManWriter(ADIOS &adios, const std::string name,
const std::string accessMode, MPI_Comm mpiComm,
const Method &method, const IOMode iomode,
const float timeout_sec, const bool debugMode = false,
const unsigned int nthreads = 1);
~DataManWriter();
void SetCallBack(std::function<void(const void *, std::string, std::string,
std::string, Dims)>
callback);
void Write(Variable<char> &variable, const char *values);
void Write(Variable<unsigned char> &variable, const unsigned char *values);
void Write(Variable<short> &variable, const short *values);
void Write(Variable<unsigned short> &variable, const unsigned short *values);
void Write(Variable<int> &variable, const int *values);
void Write(Variable<unsigned int> &variable, const unsigned int *values);
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<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(const std::string variableName, const char *values);
void Write(const std::string variableName, const unsigned char *values);
void Write(const std::string variableName, const short *values);
void Write(const std::string variableName, const unsigned short *values);
void Write(const std::string variableName, const int *values);
void Write(const std::string variableName, const unsigned int *values);
void Write(const std::string variableName, const long int *values);
void Write(const std::string variableName, const unsigned long int *values);
void Write(const std::string variableName, const long long int *values);
void Write(const std::string variableName,
const unsigned long long int *values);
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 Close(const int transportIndex = -1);
private:
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
bool m_DoRealTime = false;
bool m_DoMonitor = false;
DataManager m_Man;
std::function<void(const void *, std::string, std::string, std::string, Dims)>
m_CallBack; ///< call back function
void Init(); ///< calls InitCapsules and InitTransports based on Method,
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
void InitCapsules();
void InitTransports(); ///< from Transports
/**
* From transport Mdtm in m_Method
* @param parameter must be an accepted parameter
* @param mdtmParameters
* @return value either returns user-defined from "parameter=value" or a
* default
*/
std::string
GetMdtmParameter(const std::string parameter,
const std::map<std::string, std::string> &mdtmParameters);
template <class T>
void WriteVariableCommon(Variable<T> &variable, const T *values)
{
// here comes your magic at Writing now variable.m_UserValues has the data
// passed by the user
// set variable
variable.m_AppValues = values;
m_WrittenVariables.insert(variable.m_Name);
// This part will go away, this is just to monitor variables per rank
json jmsg;
jmsg["doid"] = m_Name;
jmsg["var"] = variable.m_Name;
jmsg["dtype"] = GetType<T>();
jmsg["putshape"] = variable.m_Dimensions;
if (variable.m_GlobalDimensions.size() == 0)
variable.m_GlobalDimensions = variable.m_Dimensions;
jmsg["varshape"] = variable.m_GlobalDimensions;
if (variable.m_GlobalOffsets.size() == 0)
variable.m_GlobalOffsets.assign(variable.m_Dimensions.size(), 0);
jmsg["offset"] = variable.m_GlobalOffsets;
jmsg["timestep"] = 0;
m_Man.put(values, jmsg);
if (m_DoMonitor)
MPI_Barrier(m_MPIComm);
std::cout << "I am hooked to the DataMan library\n";
std::cout << "putshape " << variable.m_Dimensions.size() << endl;
std::cout << "varshape " << variable.m_GlobalDimensions.size() << endl;
std::cout << "offset " << variable.m_GlobalOffsets.size() << endl;
for (int i = 0; i < m_SizeMPI; ++i)
{
if (i == m_RankMPI)
{
std::cout << "Rank: " << m_RankMPI << "\n";
variable.Monitor(std::cout);
std::cout << std::endl;
}
else
{
sleep(1);
#endif /* DATAMANWRITER_H_ */