17 #ifndef __ESYS_FILEWRITER_H__ 18 #define __ESYS_FILEWRITER_H__ 24 #include <esysUtils/Esys_MPI.h> 52 bool openFile(std::string filename,
size_t initialSize=0,
53 bool binary=
false,
bool append=
false)
68 std::ifstream f(filename.c_str());
71 if (std::remove(filename.c_str())) {
78 std::cerr <<
"Error removing " << filename <<
"!" 84 MPI_Info mpiInfo = MPI_INFO_NULL;
85 int amode = MPI_MODE_CREATE|MPI_MODE_WRONLY|MPI_MODE_UNIQUE_OPEN;
87 amode |= MPI_MODE_APPEND;
89 mpiErr = MPI_File_open(
mpiComm, const_cast<char*>(filename.c_str()),
90 amode, mpiInfo, &fileHandle);
91 if (mpiErr == MPI_SUCCESS) {
92 mpiErr = MPI_File_set_view(fileHandle, 0, MPI_CHAR, MPI_CHAR,
93 const_cast<char*>(
"native"), mpiInfo);
95 if (mpiErr == MPI_SUCCESS) {
97 mpiErr = MPI_File_seek_shared(fileHandle, 0, MPI_SEEK_END);
99 mpiErr = MPI_File_set_size(fileHandle, initialSize);
102 if (mpiErr != MPI_SUCCESS) {
103 char errorstr[MPI_MAX_ERROR_STRING];
105 MPI_Error_string(mpiErr, errorstr, &len);
106 std::cerr <<
"Error " <<
" opening " << filename
107 <<
" for parallel writing: " << errorstr << std::endl;
113 std::ios_base::openmode mode =
114 (binary ? std::ios_base::binary : std::ios_base::out);
116 mode |= std::ios_base::app;
118 ofs.open(filename.c_str(), mode);
119 success = !
ofs.fail();
120 if (success && initialSize>0 && !append) {
121 ofs.seekp(initialSize-1,
ofs.beg).put(0).seekp(0,
ofs.beg);
122 success = !
ofs.fail();
138 std::string contents = oss.str();
139 int mpiErr = MPI_File_write_ordered(
140 fileHandle, const_cast<char*>(contents.c_str()),
141 contents.length(), MPI_CHAR, &mpiStatus);
142 oss.str(std::string());
147 oss.str(std::string());
162 std::string contents = oss.str();
163 int mpiErr = MPI_File_write_shared(
164 fileHandle, const_cast<char*>(contents.c_str()),
165 contents.length(), MPI_CHAR, &mpiStatus);
166 oss.str(std::string());
171 oss.str(std::string());
177 bool writeAt(std::ostringstream& oss,
long offset)
186 std::string contents = oss.str();
187 int mpiErr = MPI_File_write_at(
188 fileHandle, offset, const_cast<char*>(contents.c_str()),
189 contents.length(), MPI_CHAR, &mpiStatus);
190 oss.str(std::string());
196 oss.str(std::string());
209 MPI_File_close(&fileHandle);
231 #endif // __ESYS_FILEWRITER_H__ #define MPI_COMM_NULL
Definition: Esys_MPI.h:45
int mpiRank
Definition: esysFileWriter.h:219
bool writeOrdered(std::ostringstream &oss)
Definition: esysFileWriter.h:129
MPI_Comm mpiComm
Definition: esysFileWriter.h:218
~FileWriter()
Definition: esysFileWriter.h:46
#define MPI_INT
Definition: Esys_MPI.h:42
int MPI_Comm
Definition: Esys_MPI.h:38
bool openFile(std::string filename, size_t initialSize=0, bool binary=false, bool append=false)
Definition: esysFileWriter.h:52
bool m_open
Definition: esysFileWriter.h:221
bool writeAt(std::ostringstream &oss, long offset)
Definition: esysFileWriter.h:177
Definition: esysFileWriter.h:28
Definition: Esys_MPI.cpp:32
int mpiSize
Definition: esysFileWriter.h:220
int MPI_Status
Definition: Esys_MPI.h:41
FileWriter(MPI_Comm comm=MPI_COMM_NULL)
Definition: esysFileWriter.h:31
void close()
Definition: esysFileWriter.h:202
#define MPI_MAX
Definition: Esys_MPI.h:51
bool writeShared(std::ostringstream &oss)
Definition: esysFileWriter.h:153
std::ofstream ofs
Definition: esysFileWriter.h:225