diff --git a/Apps/HDF5toVTF/HDF5toVTF.C b/Apps/HDF5toVTF/HDF5toVTF.C index 8278fef2..2b186299 100644 --- a/Apps/HDF5toVTF/HDF5toVTF.C +++ b/Apps/HDF5toVTF/HDF5toVTF.C @@ -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; } diff --git a/src/Utility/DataExporter.h b/src/Utility/DataExporter.h index e0f2c0a3..b607fa5e 100644 --- a/src/Utility/DataExporter.h +++ b/src/Utility/DataExporter.h @@ -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; diff --git a/src/Utility/HDF5Writer.C b/src/Utility/HDF5Writer.C index f0849280..37fb02fb 100644 --- a/src/Utility/HDF5Writer.C +++ b/src/Utility/HDF5Writer.C @@ -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 } diff --git a/src/Utility/HDF5Writer.h b/src/Utility/HDF5Writer.h index 3a16824a..63be7e02 100644 --- a/src/Utility/HDF5Writer.h +++ b/src/Utility/HDF5Writer.h @@ -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; }; diff --git a/src/Utility/XMLWriter.C b/src/Utility/XMLWriter.C index ec485d5a..45cfb706 100644 --- a/src/Utility/XMLWriter.C +++ b/src/Utility/XMLWriter.C @@ -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; diff --git a/src/Utility/XMLWriter.h b/src/Utility/XMLWriter.h index fb45a207..debc98a9 100644 --- a/src/Utility/XMLWriter.h +++ b/src/Utility/XMLWriter.h @@ -29,7 +29,7 @@ public: const std::vector& 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);