added: flag to HDF5 writer to avoid opening/closing the file between operations.

while closing/opening is necessary to ensure a non-corrupt file between
time levels, this is very harmful for the performance in the HDF5toVTF
converter

git-svn-id: http://svn.sintef.no/trondheim/IFEM/trunk@1056 e10b68d5-8a6e-419e-a041-bce267b0401d
This commit is contained in:
akva
2011-06-16 12:48:48 +00:00
committed by Knut Morten Okstad
parent bb6dfd07bf
commit 4da953d41b
6 changed files with 17 additions and 10 deletions

View File

@@ -154,7 +154,7 @@ int main (int argc, char** argv)
<<"\nNumber of visualization points: "
<< n[0] <<" "<< n[1] << " " << n[2] << std::endl;
HDF5Writer hdf(strtok(infile,"."),true);
HDF5Writer hdf(strtok(infile,"."),true,true);
XMLWriter xml(infile);
xml.readInfo();
@@ -231,6 +231,7 @@ int main (int argc, char** argv)
}
if (!ok) return 3;
}
hdf.closeFile(levels,true);
return 0;
}

View File

@@ -28,7 +28,7 @@ class DataExporter
//! \brief Default constructor.
//! \param[in] dynWriters If \e true, delete the writers on destruction.
DataExporter(bool dynWriters = false) : m_delete(dynWriters), m_level(-1) {}
//! \brief The desctructor deletes the writers if \a dynWriters was \e true.
//! \brief The destructor deletes the writers if \a dynWriters was \e true.
~DataExporter();
//! \brief Registers an entry for storage.
@@ -77,7 +77,7 @@ public:
virtual int getLastTimeLevel() = 0;
virtual void openFile(int level) = 0;
virtual void closeFile(int level) = 0;
virtual void closeFile(int level, bool force=false) = 0;
virtual void writeVector(int level, const DataEntry& entry) = 0;
virtual bool readVector(int level, const DataEntry& entry) = 0;

View File

@@ -16,8 +16,8 @@
#endif
HDF5Writer::HDF5Writer (const std::string& name, bool append)
: DataWriter(name+".hdf5")
HDF5Writer::HDF5Writer (const std::string& name, bool append, bool keepOpen)
: DataWriter(name+".hdf5"), m_file(0), m_keepOpen(keepOpen)
{
#ifdef HAS_HDF5
struct stat temp;
@@ -60,6 +60,8 @@ int HDF5Writer::getLastTimeLevel ()
void HDF5Writer::openFile(int level)
{
if (m_file)
return;
#ifdef HAS_HDF5
hid_t acc_tpl = H5P_DEFAULT;
#ifdef PARALLEL_PETSC
@@ -83,12 +85,15 @@ void HDF5Writer::openFile(int level)
#endif
}
void HDF5Writer::closeFile(int level)
void HDF5Writer::closeFile(int level, bool force)
{
if (m_keepOpen && !force)
return;
#ifdef HAS_HDF5
H5Fflush(m_file,H5F_SCOPE_GLOBAL);
H5Fclose(m_file);
m_flag = H5F_ACC_RDWR;
m_file = 0;
#endif
}

View File

@@ -11,13 +11,13 @@ class SIMbase;
class HDF5Writer : public DataWriter
{
public:
HDF5Writer(const std::string& name, bool append = false);
HDF5Writer(const std::string& name, bool append = false, bool keepopen=false);
virtual ~HDF5Writer() {}
virtual int getLastTimeLevel();
virtual void openFile(int level);
virtual void closeFile(int level);
virtual void closeFile(int level, bool force=false);
virtual void writeVector(int level, const DataEntry& entry);
virtual bool readVector(int level, const DataEntry& entry);
@@ -41,4 +41,5 @@ protected:
int m_file;
unsigned int m_flag;
bool m_keepOpen;
};

View File

@@ -41,7 +41,7 @@ void XMLWriter::openFile(int level)
m_node = m_doc->InsertEndChild(element);
}
void XMLWriter::closeFile(int level)
void XMLWriter::closeFile(int level, bool close)
{
if (!m_doc || m_rank != 0)
return;

View File

@@ -29,7 +29,7 @@ public:
const std::vector<Entry>& getEntries() const { return m_entry; }
virtual void openFile(int level);
virtual void closeFile(int level);
virtual void closeFile(int level, bool force=false);
virtual void writeVector(int level, const DataEntry& entry);
virtual bool readVector(int level, const DataEntry& entry);