Commit 7a4cb5d9 authored by Kenneth Leiter's avatar Kenneth Leiter
Browse files

ENH: Add XdmfHDF5Controller so that heavy data can be written and released...

ENH: Add XdmfHDF5Controller so that heavy data can be written and released before light data is written.
Modify XdmfWriter to accept an XdmfHDF5Writer to use for heavy data writing and allow users to specify
XML file name to write to.  Add a test that performs the write release write release workflow.
parent a7f5d5c0
...@@ -42,6 +42,7 @@ set(XdmfSources ...@@ -42,6 +42,7 @@ set(XdmfSources
XdmfGeometry XdmfGeometry
XdmfGeometryType XdmfGeometryType
XdmfGrid XdmfGrid
XdmfHDF5Controller
XdmfHDF5Writer XdmfHDF5Writer
XdmfItem XdmfItem
XdmfItemProperty XdmfItemProperty
......
...@@ -14,6 +14,7 @@ swig -v -c++ -python -o XdmfPython.cpp Xdmf.i ...@@ -14,6 +14,7 @@ swig -v -c++ -python -o XdmfPython.cpp Xdmf.i
#include <XdmfGeometry.hpp> #include <XdmfGeometry.hpp>
#include <XdmfGeometryType.hpp> #include <XdmfGeometryType.hpp>
#include <XdmfGrid.hpp> #include <XdmfGrid.hpp>
#include <XdmfHDF5Controller.hpp>
#include <XdmfHDF5Writer.hpp> #include <XdmfHDF5Writer.hpp>
#include <XdmfItem.hpp> #include <XdmfItem.hpp>
#include <XdmfItemProperty.hpp> #include <XdmfItemProperty.hpp>
...@@ -53,6 +54,7 @@ namespace boost { ...@@ -53,6 +54,7 @@ namespace boost {
%template(XdmfDomainPtr) boost::shared_ptr<XdmfDomain>; %template(XdmfDomainPtr) boost::shared_ptr<XdmfDomain>;
%template(XdmfGeometryPtr) boost::shared_ptr<XdmfGeometry>; %template(XdmfGeometryPtr) boost::shared_ptr<XdmfGeometry>;
%template(XdmfGridPtr) boost::shared_ptr<XdmfGrid>; %template(XdmfGridPtr) boost::shared_ptr<XdmfGrid>;
%template(XdmfHDF5ControllerPtr) boost::shared_ptr<XdmfHDF5Controller>;
%template(XdmfHDF5WriterPtr) boost::shared_ptr<XdmfHDF5Writer>; %template(XdmfHDF5WriterPtr) boost::shared_ptr<XdmfHDF5Writer>;
%template(XdmfItemPtr) boost::shared_ptr<XdmfItem>; %template(XdmfItemPtr) boost::shared_ptr<XdmfItem>;
%template(XdmfObjPtr) boost::shared_ptr<XdmfObject>; %template(XdmfObjPtr) boost::shared_ptr<XdmfObject>;
...@@ -84,6 +86,7 @@ SWIG_SHARED_PTR_DERIVED(XdmfGeometry, XdmfItem); ...@@ -84,6 +86,7 @@ SWIG_SHARED_PTR_DERIVED(XdmfGeometry, XdmfItem);
SWIG_SHARED_PTR_DERIVED(XdmfGeometry, XdmfObject); SWIG_SHARED_PTR_DERIVED(XdmfGeometry, XdmfObject);
SWIG_SHARED_PTR_DERIVED(XdmfGrid, XdmfItem); SWIG_SHARED_PTR_DERIVED(XdmfGrid, XdmfItem);
SWIG_SHARED_PTR_DERIVED(XdmfGrid, XdmfObject); SWIG_SHARED_PTR_DERIVED(XdmfGrid, XdmfObject);
SWIG_SHARED_PTR_DERIVED(XdmfHDF5Controller, XdmfObject);
SWIG_SHARED_PTR_DERIVED(XdmfHDF5Writer, XdmfVisitor); SWIG_SHARED_PTR_DERIVED(XdmfHDF5Writer, XdmfVisitor);
SWIG_SHARED_PTR_DERIVED(XdmfHDF5Writer, Loki::BaseVisitor); SWIG_SHARED_PTR_DERIVED(XdmfHDF5Writer, Loki::BaseVisitor);
SWIG_SHARED_PTR_DERIVED(XdmfHDF5Writer, XdmfObject); SWIG_SHARED_PTR_DERIVED(XdmfHDF5Writer, XdmfObject);
...@@ -103,6 +106,7 @@ SWIG_SHARED_PTR_DERIVED(XdmfWriter, XdmfObject); ...@@ -103,6 +106,7 @@ SWIG_SHARED_PTR_DERIVED(XdmfWriter, XdmfObject);
%include XdmfItemProperty.hpp %include XdmfItemProperty.hpp
%include XdmfVisitor.hpp %include XdmfVisitor.hpp
%include XdmfHDF5Controller.hpp
%include XdmfHDF5Writer.hpp %include XdmfHDF5Writer.hpp
%include XdmfWriter.hpp %include XdmfWriter.hpp
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
*/ */
#include "XdmfArray.hpp" #include "XdmfArray.hpp"
#include "XdmfHDF5Controller.hpp"
#include "XdmfVisitor.hpp" #include "XdmfVisitor.hpp"
#include <sstream> #include <sstream>
...@@ -346,6 +347,7 @@ XdmfArray::XdmfArray() : ...@@ -346,6 +347,7 @@ XdmfArray::XdmfArray() :
mHaveArray(false), mHaveArray(false),
mHaveArrayPointer(false), mHaveArrayPointer(false),
mArrayPointerNumValues(0), mArrayPointerNumValues(0),
mHDF5Controller(boost::shared_ptr<XdmfHDF5Controller>()),
mTmpReserveSize(0) mTmpReserveSize(0)
{ {
std::cout << "Created Array " << this << std::endl; std::cout << "Created Array " << this << std::endl;
...@@ -390,6 +392,16 @@ unsigned int XdmfArray::getCapacity() const ...@@ -390,6 +392,16 @@ unsigned int XdmfArray::getCapacity() const
return 0; return 0;
} }
boost::shared_ptr<XdmfHDF5Controller> XdmfArray::getHDF5Controller()
{
return mHDF5Controller;
}
const boost::shared_ptr<const XdmfHDF5Controller> XdmfArray::getHDF5Controller() const
{
return mHDF5Controller;
}
std::map<std::string, std::string> XdmfArray::getItemProperties() const std::map<std::string, std::string> XdmfArray::getItemProperties() const
{ {
std::map<std::string, std::string> arrayProperties; std::map<std::string, std::string> arrayProperties;
...@@ -419,6 +431,10 @@ unsigned int XdmfArray::getPrecision() const ...@@ -419,6 +431,10 @@ unsigned int XdmfArray::getPrecision() const
{ {
return boost::apply_visitor(GetPrecision(), mArrayPointer); return boost::apply_visitor(GetPrecision(), mArrayPointer);
} }
else if(mHDF5Controller)
{
return mHDF5Controller->getPrecision();
}
return 0; return 0;
} }
...@@ -432,6 +448,10 @@ unsigned int XdmfArray::getSize() const ...@@ -432,6 +448,10 @@ unsigned int XdmfArray::getSize() const
{ {
return mArrayPointerNumValues; return mArrayPointerNumValues;
} }
else if(mHDF5Controller)
{
return mHDF5Controller->getSize();
}
return 0; return 0;
} }
...@@ -445,6 +465,10 @@ std::string XdmfArray::getType() const ...@@ -445,6 +465,10 @@ std::string XdmfArray::getType() const
{ {
return boost::apply_visitor(GetType(), mArrayPointer); return boost::apply_visitor(GetType(), mArrayPointer);
} }
else if(mHDF5Controller)
{
return mHDF5Controller->getType();
}
return ""; return "";
} }
...@@ -482,6 +506,12 @@ void XdmfArray::internalizeArrayPointer() ...@@ -482,6 +506,12 @@ void XdmfArray::internalizeArrayPointer()
} }
} }
void XdmfArray::release()
{
releaseArray();
releaseArrayPointer();
}
void XdmfArray::releaseArray() void XdmfArray::releaseArray()
{ {
boost::shared_ptr<std::vector<char> > emptyArray; boost::shared_ptr<std::vector<char> > emptyArray;
...@@ -496,12 +526,6 @@ void XdmfArray::releaseArrayPointer() ...@@ -496,12 +526,6 @@ void XdmfArray::releaseArrayPointer()
mHaveArrayPointer = false; mHaveArrayPointer = false;
} }
void XdmfArray::releaseData()
{
releaseArray();
releaseArrayPointer();
}
void XdmfArray::reserve(const unsigned int size) void XdmfArray::reserve(const unsigned int size)
{ {
if(mHaveArrayPointer) if(mHaveArrayPointer)
...@@ -518,6 +542,11 @@ void XdmfArray::reserve(const unsigned int size) ...@@ -518,6 +542,11 @@ void XdmfArray::reserve(const unsigned int size)
} }
} }
void XdmfArray::setHDF5Controller(boost::shared_ptr<XdmfHDF5Controller> hdf5Controller)
{
mHDF5Controller = hdf5Controller;
}
void XdmfArray::swap(boost::shared_ptr<XdmfArray> array) void XdmfArray::swap(boost::shared_ptr<XdmfArray> array)
{ {
ArrayVariant tmpArray = array->mArray; ArrayVariant tmpArray = array->mArray;
......
#ifndef XDMFARRAY_HPP_ #ifndef XDMFARRAY_HPP_
#define XDMFARRAY_HPP_ #define XDMFARRAY_HPP_
// Forward Declarations
class XdmfHDF5Controller;
// Includes // Includes
#include "XdmfItem.hpp" #include "XdmfItem.hpp"
#include <boost/shared_array.hpp> #include <boost/shared_array.hpp>
...@@ -89,6 +92,20 @@ public: ...@@ -89,6 +92,20 @@ public:
std::string getItemTag() const; std::string getItemTag() const;
/**
* Get the hdf5 controller attached to this XdmfArray.
*
* @return the hdf5 controller attached to this XdmfArray.
*/
boost::shared_ptr<XdmfHDF5Controller> getHDF5Controller();
/**
* Get the hdf5 controller attached to this XdmfArray (const version).
*
* @return the hdf5 controller attached to this XdmfArray.
*/
const boost::shared_ptr<const XdmfHDF5Controller> getHDF5Controller() const;
/** /**
* Get the precision, in bytes, of the data type of this array. * Get the precision, in bytes, of the data type of this array.
* *
...@@ -132,7 +149,7 @@ public: ...@@ -132,7 +149,7 @@ public:
* *
* @return a void pointer to the first value stored in this array. * @return a void pointer to the first value stored in this array.
*/ */
virtual const void* const getValuesPointer() const; virtual const void * const getValuesPointer() const;
/** /**
* Get the values stored in this array as a string. * Get the values stored in this array as a string.
...@@ -152,7 +169,7 @@ public: ...@@ -152,7 +169,7 @@ public:
/** /**
* Release all data held by this XdmfArray. * Release all data held by this XdmfArray.
*/ */
void releaseData(); void release();
/** /**
* Set the capacity of the XdmfArray to at least size. * Set the capacity of the XdmfArray to at least size.
...@@ -171,6 +188,13 @@ public: ...@@ -171,6 +188,13 @@ public:
template<typename T> template<typename T>
void resize(const unsigned int numValues, const T & val); void resize(const unsigned int numValues, const T & val);
/**
* Attach an hdf5 controller to this XdmfArray.
*
* @param hdf5Controller the hdf5 controller to attach to this XdmfArray.
*/
void setHDF5Controller(boost::shared_ptr<XdmfHDF5Controller> hdf5Controller);
/** /**
* Sets the values of this array to the values stored in the arrayPointer array. No copy is made. Modifications to the array are * Sets the values of this array to the values stored in the arrayPointer array. No copy is made. Modifications to the array are
* not permitted through the XdmfArray API. Any calls through the XdmfArray API to modify the array (i.e. any non-const function) * not permitted through the XdmfArray API. Any calls through the XdmfArray API to modify the array (i.e. any non-const function)
...@@ -310,6 +334,7 @@ private: ...@@ -310,6 +334,7 @@ private:
unsigned int mArrayPointerNumValues; unsigned int mArrayPointerNumValues;
bool mHaveArray; bool mHaveArray;
bool mHaveArrayPointer; bool mHaveArrayPointer;
boost::shared_ptr<XdmfHDF5Controller> mHDF5Controller;
unsigned int mTmpReserveSize; unsigned int mTmpReserveSize;
}; };
......
// Kenneth Leiter
// Xdmf Smart Pointer Test
#include "XdmfHDF5Controller.hpp"
XdmfHDF5Controller::XdmfHDF5Controller(const std::string & dataSetPath, const int precision,
const int size, const std::string & type) :
mDataSetPath(dataSetPath),
mPrecision(precision),
mSize(size),
mType(type)
{
}
XdmfHDF5Controller::~XdmfHDF5Controller()
{
}
std::string XdmfHDF5Controller::getDataSetPath() const
{
return mDataSetPath;
}
int XdmfHDF5Controller::getPrecision() const
{
return mPrecision;
}
int XdmfHDF5Controller::getSize() const
{
return mSize;
}
std::string XdmfHDF5Controller::getType() const
{
return mType;
}
#ifndef XDMFHDF5CONTROLLER_HPP_
#define XDMFHDF5CONTROLLER_HPP_
// Includes
#include <string>
#include "XdmfObject.hpp"
/**
* @brief Couples an XdmfArray with HDF5 data stored on disk.
*
* Serves as an interface between data stored in XdmfArrays and data stored on disk. When an Xdmf file is read from or
* written to disk an XdmfHDF5Controller is attached to XdmfArrays. This allows data to be released
* from memory but still be accessible or have its location written to light data.
*/
class XdmfHDF5Controller : public XdmfObject {
public:
template <typename T> friend void boost::checked_delete(T * x);
/**
* Create a new controller for an hdf5 data set on disk.
*
* @param dataSetPath the path to the hdf5 data set on disk.
*/
static boost::shared_ptr<XdmfHDF5Controller> New(const std::string & dataSetPath, const int precision,
const int size, const std::string & type)
{
boost::shared_ptr<XdmfHDF5Controller> p(new XdmfHDF5Controller(dataSetPath, precision, size, type));
return p;
}
/**
* Get the path to the hdf5 data set on disk owned by this controller.
*
* @return a std::string to the hdf5 data set location on disk.
*/
std::string getDataSetPath() const;
/**
* Get the precision of the hdf5 data set owned by this controller.
*
* @return a int containing the precision of the hdf5 data set.
*/
int getPrecision() const;
/**
* Get the size of the hdf5 data set owned by this controller.
*
* @return a int containing the size of the hdf5 data set.
*/
int getSize() const;
/**
* Get the data type of the hdf5 data set owned by this controller.
*
* @return a std::string containing the name of the data type of the hdf5 data set.
*/
std::string getType() const;
protected:
XdmfHDF5Controller(const std::string & dataSetPath, const int precision, const int size,
const std::string & type);
virtual ~XdmfHDF5Controller();
private:
XdmfHDF5Controller(const XdmfHDF5Controller & hdf5Controller); // Not implemented.
void operator=(const XdmfHDF5Controller & hdf5Controller); // Not implemented.
std::string mDataSetPath;
int mPrecision;
int mSize;
std::string mType;
};
#endif /* XDMFHDF5CONTROLLER_HPP_ */
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
#include <hdf5.h> #include <hdf5.h>
#include <sstream> #include <sstream>
#include "XdmfArray.hpp" #include "XdmfArray.hpp"
#include "XdmfItem.hpp" #include "XdmfHDF5Controller.hpp"
#include "XdmfHDF5Writer.hpp" #include "XdmfHDF5Writer.hpp"
/** /**
...@@ -14,7 +14,7 @@ class XdmfHDF5Writer::XdmfHDF5WriterImpl { ...@@ -14,7 +14,7 @@ class XdmfHDF5Writer::XdmfHDF5WriterImpl {
public: public:
XdmfHDF5WriterImpl(std::string & hdf5FilePath) : XdmfHDF5WriterImpl(const std::string & hdf5FilePath) :
mHDF5Handle(H5Fcreate(hdf5FilePath.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)), mHDF5Handle(H5Fcreate(hdf5FilePath.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)),
mHeavyFileName(hdf5FilePath), mHeavyFileName(hdf5FilePath),
mLastWrittenDataSet("") mLastWrittenDataSet("")
...@@ -97,7 +97,7 @@ public: ...@@ -97,7 +97,7 @@ public:
} }
}; };
XdmfHDF5Writer::XdmfHDF5Writer(std::string & hdf5FilePath) : XdmfHDF5Writer::XdmfHDF5Writer(const std::string & hdf5FilePath) :
mImpl(new XdmfHDF5WriterImpl(hdf5FilePath)) mImpl(new XdmfHDF5WriterImpl(hdf5FilePath))
{ {
std::cout << "Created XdmfHDF5Writer " << this << std::endl; std::cout << "Created XdmfHDF5Writer " << this << std::endl;
...@@ -117,6 +117,8 @@ std::string XdmfHDF5Writer::getLastWrittenDataSet() const ...@@ -117,6 +117,8 @@ std::string XdmfHDF5Writer::getLastWrittenDataSet() const
void XdmfHDF5Writer::visit(XdmfArray & array, boost::shared_ptr<Loki::BaseVisitor> visitor) void XdmfHDF5Writer::visit(XdmfArray & array, boost::shared_ptr<Loki::BaseVisitor> visitor)
{ {
hid_t datatype = -1; hid_t datatype = -1;
mImpl->mLastWrittenDataSet = "";
if(array.mHaveArray) if(array.mHaveArray)
{ {
datatype = boost::apply_visitor(GetHDF5Type(), array.mArray); datatype = boost::apply_visitor(GetHDF5Type(), array.mArray);
...@@ -125,6 +127,10 @@ void XdmfHDF5Writer::visit(XdmfArray & array, boost::shared_ptr<Loki::BaseVisito ...@@ -125,6 +127,10 @@ void XdmfHDF5Writer::visit(XdmfArray & array, boost::shared_ptr<Loki::BaseVisito
{ {
datatype = boost::apply_visitor(GetHDF5Type(), array.mArrayPointer); datatype = boost::apply_visitor(GetHDF5Type(), array.mArrayPointer);
} }
else if(array.mHDF5Controller)
{
mImpl->mLastWrittenDataSet = array.mHDF5Controller->getDataSetPath();
}
if(datatype != -1) if(datatype != -1)
{ {
...@@ -140,13 +146,12 @@ void XdmfHDF5Writer::visit(XdmfArray & array, boost::shared_ptr<Loki::BaseVisito ...@@ -140,13 +146,12 @@ void XdmfHDF5Writer::visit(XdmfArray & array, boost::shared_ptr<Loki::BaseVisito
status = H5Dclose(dataset); status = H5Dclose(dataset);
status = H5Sclose(dataspace); status = H5Sclose(dataspace);
std::stringstream writtenDataSetName; std::stringstream writtenDataSetPath;
writtenDataSetName << mImpl->mHeavyFileName << ":" << dataSetName.str(); writtenDataSetPath << mImpl->mHeavyFileName << ":" << dataSetName.str();
mImpl->mLastWrittenDataSet = writtenDataSetName.str(); mImpl->mLastWrittenDataSet = writtenDataSetPath.str();
mImpl->mDataSetId++; mImpl->mDataSetId++;
}
else boost::shared_ptr<XdmfHDF5Controller> newDataSetController = XdmfHDF5Controller::New(writtenDataSetPath.str(), array.getPrecision(), array.getSize(), array.getType());
{ array.setHDF5Controller(newDataSetController);
mImpl->mLastWrittenDataSet = "";
} }
} }
...@@ -20,7 +20,13 @@ class XdmfHDF5Writer : public XdmfVisitor, ...@@ -20,7 +20,13 @@ class XdmfHDF5Writer : public XdmfVisitor,
public: public:
template <typename T> friend void boost::checked_delete(T * x); template <typename T> friend void boost::checked_delete(T * x);
static boost::shared_ptr<XdmfHDF5Writer> New(std::string hdf5FilePath)
/**
* Construct XdmfHDF5Writer
*
* @param hdf5FilePath the location of the hdf5 file to output to on disk.
*/
static boost::shared_ptr<XdmfHDF5Writer> New(const std::string & hdf5FilePath)
{ {
boost::shared_ptr<XdmfHDF5Writer> p(new XdmfHDF5Writer(hdf5FilePath)); boost::shared_ptr<XdmfHDF5Writer> p(new XdmfHDF5Writer(hdf5FilePath));
return p; return p;
...@@ -43,12 +49,7 @@ public: ...@@ -43,12 +49,7 @@ public:
protected: protected:
/** XdmfHDF5Writer(const std::string & hdf5FilePath);
* Construct XdmfHDF5Writer
*
* @param hdf5FilePath the location of the hdf5 file to output to on disk.
*/
XdmfHDF5Writer(std::string & hdf5FilePath);
virtual ~XdmfHDF5Writer(); virtual ~XdmfHDF5Writer();
private: private:
......
...@@ -15,11 +15,12 @@ class XdmfWriter::XdmfWriterImpl { ...@@ -15,11 +15,12 @@ class XdmfWriter::XdmfWriterImpl {
public: public:
XdmfWriterImpl() : XdmfWriterImpl(const std::string & xmlFilePath, boost::shared_ptr<XdmfHDF5Writer> hdf5Writer) :
mHDF5Writer(XdmfHDF5Writer::New("output.h5")), mHDF5Writer(hdf5Writer),
mLightDataLimit(100), mLightDataLimit(100),
mXMLDocument(xmlNewDoc((xmlChar*)"1.0")), mXMLDocument(xmlNewDoc((xmlChar*)"1.0")),
mXMLCurrentNode(xmlNewNode(NULL, (xmlChar*)"Xdmf")) mXMLCurrentNode(xmlNewNode(NULL, (xmlChar*)"Xdmf")),
mXMLFilePath(xmlFilePath)
{ {
xmlDocSetRootElement(mXMLDocument, mXMLCurrentNode); xmlDocSetRootElement(mXMLDocument, mXMLCurrentNode);
}; };
...@@ -30,15 +31,31 @@ public: ...@@ -30,15 +31,31 @@ public:
xmlCleanupParser(); xmlCleanupParser();
}; };
boost::shared_ptr<XdmfHDF5Writer> mHDF5Writer; boost::shared_ptr<XdmfHDF5Writer> mHDF5Writer;
std::string mHeavyFileName;
unsigned int mLightDataLimit; unsigned int mLightDataLimit;
xmlDocPtr mXMLDocument; xmlDocPtr mXMLDocument;
xmlNodePtr mXMLCurrentNode; xmlNodePtr mXMLCurrentNode;
std::string mXMLFilePath;
}; };
XdmfWriter::XdmfWriter() : XdmfWriter::XdmfWriter(const std::string & xmlFilePath)
mImpl(new XdmfWriterImpl()) {
std::stringstream heavyFileName;
size_t extension = xmlFilePath.rfind(".");
if(extension != std::string::npos)
{
heavyFileName << xmlFilePath.substr(0, extension) << ".h5";
}
else
{
heavyFileName << xmlFilePath << ".h5";
}
boost::shared_ptr<XdmfHDF5Writer> hdf5Writer = XdmfHDF5Writer::New(heavyFileName.str());
mImpl = new XdmfWriterImpl(xmlFilePath, hdf5Writer);
std::cout << "Created XdmfWriter " << this << std::endl;
}
XdmfWriter::XdmfWriter(const std::string & xmlFilePath, boost::shared_ptr<XdmfHDF5Writer> hdf5Writer) :
mImpl(new XdmfWriterImpl(xmlFilePath, hdf5Writer))
{ {
std::cout << "Created XdmfWriter " << this << std::endl; std::cout << "Created XdmfWriter " << this << std::endl;
} }
...@@ -67,7 +84,7 @@ void XdmfWriter::visit(XdmfArray & array, boost::shared_ptr<Loki::BaseVisitor> v ...@@ -67,7 +84,7 @@ void XdmfWriter::visit(XdmfArray & array, boost::shared_ptr<Loki::BaseVisitor> v
mImpl->mXMLCurrentNode = mImpl->mXMLCurrentNode->children; mImpl->mXMLCurrentNode = mImpl->mXMLCurrentNode->children;
std::stringstream xmlTextValues; std::stringstream xmlTextValues;
if(array.getSize() > mImpl->mLightDataLimit) if(array.getHDF5Controller() || array.getSize() > mImpl->mLightDataLimit)
{ {
mImpl->mHDF5Writer->visit(array, mImpl->mHDF5Writer); mImpl->mHDF5Writer->visit(array, mImpl->mHDF5Writer);
xmlTextValues << mImpl->mHDF5Writer->getLastWrittenDataSet(); xmlTextValues << mImpl->mHDF5Writer->getLastWrittenDataSet();
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@