00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #if !defined(HDFFILE_HPP)
00013 #define HDFFILE_HPP
00014
00015 #include "mpi.h"
00016 #include "gasparFile.hpp"
00017 #include "hdf5.h"
00018 #include "gtypes.h"
00019 #include <iostream.h>
00020 #include <string.h>
00021 #include <stdlib.h>
00022
00023 class HDFFile : public GasparFile{
00024
00025 public:
00026
00027
00028 HDFFile(const char* fileNameIn, IO_TYPE fType = COLLECTIVE_IO, IO_TYPE dType = INDEPENDENT_IO, MPI_Comm commIn = MPI_COMM_WORLD);
00029 HDFFile(const char* fileNameIn, ISUB** procGrid, ISUB nLists, ISUB* listSizes, IO_TYPE dType = INDEPENDENT_IO, MPI_Comm commIn = MPI_COMM_WORLD);
00030 ~HDFFile();
00031 GBOOL close();
00032 GBOOL open(FILE_ACCESS accessIn, ISUB fileNestDepth = FILE_DEPTH_DEFAULT);
00033 GBOOL openCreate(GBOOL overWriteIn, ISUB fileNestDepth = FILE_DEPTH_DEFAULT);
00034 GBOOL openGroup(const char* groupName);
00035 GBOOL createGroup(const char* groupName, GUSHORT hint = GROUP_HINT);
00036 GBOOL closeGroup();
00037 GBOOL up();
00038 GBOOL top();
00039 GBOOL writeMeta(const char* metaName, HDFID location, GDOUBLE meta);
00040 GBOOL writeMeta(const char* metaName, HDFID location, GDOUBLE *meta, GSHORT len);
00041 GBOOL writeMeta(const char* metaName, HDFID location, ISUB meta);
00042 GBOOL readMeta(const char* metaName, HDFID location, GDOUBLE& meta);
00043 GBOOL readMeta(const char* metaName, HDFID location, ISUB& meta);
00044 GBOOL writeVector(const char* dataName, const GDOUBLE* data, ISUB dataSize){ return writeTVector(dataName, data, dataSize); }
00045 GBOOL writeVector(const char* dataName, const ISUB* data, ISUB dataSize){ return writeTVector(dataName, data, dataSize); }
00046 GBOOL readVector(const char* dataName, GDOUBLE*& data, ISUB& dataSize){ return readTVector(dataName, data, dataSize); }
00047 GBOOL readVector(const char* dataName, ISUB*& data, ISUB& dataSize){ return readTVector(dataName, data, dataSize); }
00048 GBOOL writeMatrix(const char* dataName, GDOUBLE* data, ISUB n1, ISUB n2);
00049 GBOOL readMatrix(const char* dataName, GDOUBLE*& data, ISUB& n1, ISUB& n2);
00050 GBOOL checkHDF(HDFID statusIn, char* message = NULL) const;
00051 HDFID getCurrentHDFObj();
00052
00053 private:
00054
00055
00056 GBOOL setFilePlist();
00057 GBOOL setDataPlist(IO_TYPE ioType, DATA_OPERATION op);
00058 void cleanPath();
00059 GBOOL gatherNames(const char* name, char*& nameBuffer, ISUB& offset);
00060 template<class T> T max(T* array, ISUB length);
00061 template<class T> GBOOL writeTVector(const char* dataName, const T* data, ISUB dataSize);
00062 template<class T> GBOOL readTVector(const char* dataName, T*& data, ISUB& dataSize);
00063 friend HDFERR stripLinkLayer(HDFID location, const char* memName, void* nada);
00064 friend HDFERR makeLink(HDFID location, const char* memName, void* parentName);
00065
00066
00067 enum DEGREE {ONED=1, TWOD=2, THREED=3};
00068 HDFID filePlistID;
00069 HDFID dataPlistID;
00070 HDFID** path;
00071 HDFID fileID;
00072 ISUB cursorD;
00073 HDFERR status;
00074 GBOOL pass;
00075 IO_TYPE dataIO;
00076 ISUB nProcs, rank, depth, breadth;
00077 char* nameBuffer;
00078 ISUB nbOffset;
00079 char* errorMsg;
00080 static const ISUB TOP;
00081 static const char* THIS;
00082 };
00083 #endif
00084
00085
00086
00087
00088
00089
00090
00091
00092