Commit 7f5d7003 authored by Andrew J. Burns's avatar Andrew J. Burns Committed by Andrew J. Burns (Cont
Browse files

Rework of HeavyDataController and HDF5Controller to remove extra code and move...

Rework of HeavyDataController and HDF5Controller to remove extra code and move HeavyDataController away from being too dependent on hdf5 style
XdmfFunction now supports negative numbers in addition to the - operator
Reworked the interaction between array references and reading
Cleaned up some warnings that showed up in pedantic
Adjusted mpi tests to test against the MPIEXEC variable as opposed to hard calling mpirun
Still needs to be changed to work better with Cray mpi style execution
Updates to XdmfArrayType to allow for signed and floating point checking
General test and Documentation updates
parent 975536e3
......@@ -139,7 +139,12 @@ XdmfSubset::getItemTag() const
shared_ptr<XdmfArray>
XdmfSubset::getReferenceArray()
{
if (mParent) {
return mParent;
}
else {
return shared_ptr<XdmfArray>();
}
}
unsigned int
......@@ -202,7 +207,7 @@ XdmfSubset::populateItem(const std::map<std::string, std::string> & itemProperti
}
shared_ptr<XdmfArray>
XdmfSubset::read()
XdmfSubset::read() const
{
if (mStart.size() < 1 ||
mStride.size() < 1 ||
......@@ -246,6 +251,12 @@ XdmfSubset::setDimensions(std::vector<unsigned int> newDimensions)
}
}
void
XdmfSubset::setReferenceArray(shared_ptr<XdmfArray> newReference)
{
mParent = newReference;
}
void
XdmfSubset::setStart(std::vector<unsigned int> newStarts)
{
......@@ -279,5 +290,9 @@ XdmfSubset::traverse(const shared_ptr<XdmfBaseVisitor> visitor)
{
XdmfItem::traverse(visitor);
shared_ptr<XdmfArray> spacerarray = XdmfArray::New();
spacerarray->pushBack((int)0);
spacerarray->accept(visitor);
mParent->accept(visitor);
}
......@@ -77,7 +77,7 @@ public:
virtual ~XdmfSubset();
LOKI_DEFINE_VISITABLE(XdmfSubset, XdmfItem);
LOKI_DEFINE_VISITABLE(XdmfSubset, XdmfItem)
static const std::string ItemTag;
/**
......@@ -235,7 +235,7 @@ public:
*
* @return An array filled with data based on the subset's parameters.
*/
virtual shared_ptr<XdmfArray> read();
virtual shared_ptr<XdmfArray> read() const;
/**
* Set the dimensions of the set referenced by this subset.
......@@ -267,6 +267,36 @@ public:
*/
void setDimensions(std::vector<unsigned int> newDimensions);
/**
* Set the Array that the subset is generated from.
*
* Example of use:
*
* C++
*
* @dontinclude ExampleXdmfSubset.cpp
* @skipline //#initialization
* @until //#initialization
* @skipline //#getReferenceArray
* @until //#getReferenceArray
* @skipline //#setReferenceArray
* @until //#setReferenceArray
*
* Python
*
* @dontinclude XdmfExampleSubset.py
* @skipline #//initialization
* @until #//initialization
* @skipline #//getReferenceArray
* @until #//getReferenceArray
* @skipline #//setReferenceArray
* @until #//setReferenceArray
*
* @param newReference A shared pointer to the array that the subset
* will be generated from
*/
void setReferenceArray(shared_ptr<XdmfArray> newReference);
/**
* Set the start index of the set referenced by this subset.
*
......
......@@ -35,6 +35,7 @@
#include "XdmfWriter.hpp"
#include "XdmfVersion.hpp"
#include "XdmfError.hpp"
#include "string.h"
/**
* PIMPL
......@@ -184,6 +185,13 @@ XdmfWriter::XdmfWriter(const std::string & xmlFilePath,
{
}
XdmfWriter::XdmfWriter(const XdmfWriter & writerRef)
{
char * transferPath = strdup(writerRef.getFilePath().c_str());
char * heavyTransferPath = strdup(writerRef.getHeavyDataWriter()->getFilePath().c_str());
mImpl = new XdmfWriterImpl(transferPath, XdmfHDF5Writer::New(heavyTransferPath), NULL);
}
XdmfWriter::~XdmfWriter()
{
delete mImpl;
......@@ -199,78 +207,116 @@ XdmfWriter::getHeavyDataWriter()
shared_ptr<const XdmfHeavyDataWriter>
XdmfWriter::getHeavyDataWriter() const
{
if (mImpl == NULL) {
XdmfError::message(XdmfError::FATAL, "Error: Writer Internal Object is Null");
}
return mImpl->mHeavyDataWriter;
}
std::string
XdmfWriter::getFilePath() const
{
if (mImpl == NULL) {
XdmfError::message(XdmfError::FATAL, "Error: Writer Internal Object is Null");
}
return mImpl->mXMLFilePath;
}
unsigned int
XdmfWriter::getLightDataLimit() const
{
if (mImpl == NULL) {
XdmfError::message(XdmfError::FATAL, "Error: Writer Internal Object is Null");
}
return mImpl->mLightDataLimit;
}
XdmfWriter::Mode
XdmfWriter::getMode() const
{
if (mImpl == NULL) {
XdmfError::message(XdmfError::FATAL, "Error: Writer Internal Object is Null");
}
return mImpl->mMode;
}
bool
XdmfWriter::getWriteXPaths() const
{
if (mImpl == NULL) {
XdmfError::message(XdmfError::FATAL, "Error: Writer Internal Object is Null");
}
return mImpl->mWriteXPaths;
}
bool
XdmfWriter::getXPathParse() const
{
if (mImpl == NULL) {
XdmfError::message(XdmfError::FATAL, "Error: Writer Internal Object is Null");
}
return mImpl->mXPathParse;
}
void
XdmfWriter::setDocumentTitle(std::string title)
{
{ if (mImpl == NULL) {
XdmfError::message(XdmfError::FATAL, "Error: Writer Internal Object is Null");
}
mImpl->mDocumentTitle = title;
}
void
XdmfWriter::setHeavyDataWriter(shared_ptr<XdmfHeavyDataWriter> heavyDataWriter)
{
if (mImpl == NULL) {
XdmfError::message(XdmfError::FATAL, "Error: Writer Internal Object is Null");
}
mImpl->mHeavyDataWriter = heavyDataWriter;
}
void
XdmfWriter::setLightDataLimit(const unsigned int numValues)
{
if (mImpl == NULL) {
XdmfError::message(XdmfError::FATAL, "Error: Writer Internal Object is Null");
}
mImpl->mLightDataLimit = numValues;
}
void
XdmfWriter::setMode(const Mode mode)
{
if (mImpl == NULL) {
XdmfError::message(XdmfError::FATAL, "Error: Writer Internal Object is Null");
}
mImpl->mMode = mode;
}
void
XdmfWriter::setVersionString(std::string version)
{
if (mImpl == NULL) {
XdmfError::message(XdmfError::FATAL, "Error: Writer Internal Object is Null");
}
mImpl->mVersionString = version;
}
void
XdmfWriter::setWriteXPaths(const bool writeXPaths)
{
if (mImpl == NULL) {
XdmfError::message(XdmfError::FATAL, "Error: Writer Internal Object is Null");
}
mImpl->mWriteXPaths = writeXPaths;
}
void
XdmfWriter::setXPathParse(const bool xPathParse)
{
if (mImpl == NULL) {
XdmfError::message(XdmfError::FATAL, "Error: Writer Internal Object is Null");
}
mImpl->mXPathParse = xPathParse;
}
......@@ -278,6 +324,9 @@ void
XdmfWriter::visit(XdmfArray & array,
const shared_ptr<XdmfBaseVisitor> visitor)
{
if (mImpl == NULL) {
XdmfError::message(XdmfError::FATAL, "Error: Writer Internal Object is Null");
}
if (mImpl->mDepth == 0) {
mImpl->openFile();
}
......@@ -320,18 +369,19 @@ XdmfWriter::visit(XdmfArray & array,
array.getSize() > mImpl->mLightDataLimit) {
// Write values to heavy data
// This takes about half the time needed
mImpl->mHeavyDataWriter->visit(array, mImpl->mHeavyDataWriter);
std::stringstream valuesStream;
for(unsigned int i = 0; i < array.getNumberHeavyDataControllers(); ++i) {
std::string heavyDataPath =
array.getHeavyDataController(i)->getFilePath();
size_t index = heavyDataPath.find_last_of("/\\");
if(index != std::string::npos) {
// If path is not a folder
// put the directory path into this variable
const std::string heavyDataDir =
heavyDataPath.substr(0, index + 1);
const std::string heavyDataDir = heavyDataPath.substr(0, index + 1);
// If the directory is in the XML File Path
if(mImpl->mXMLFilePath.find(heavyDataDir) == 0) {
heavyDataPath =
......@@ -341,6 +391,7 @@ XdmfWriter::visit(XdmfArray & array,
}
// Otherwise the full path is required
}
std::stringstream dimensionStream;
for (unsigned int j = 0; j < array.getHeavyDataController(i)->getDimensions().size(); ++j) {
dimensionStream << array.getHeavyDataController(i)->getDimensions()[j];
......@@ -348,26 +399,15 @@ XdmfWriter::visit(XdmfArray & array,
dimensionStream << " ";
}
}
const std::string dataSetPath =
array.getHeavyDataController(i)->getDataSetPath();
// Clear the stream
valuesStream.str(std::string());
valuesStream << heavyDataPath << array.getHeavyDataController(i)->getDescriptor();
if (array.getNumberHeavyDataControllers() > 1) {
valuesStream << heavyDataPath << ":"
<< dataSetPath
<< "|" << dimensionStream.str();
if (i + 1 < array.getNumberHeavyDataControllers()){
valuesStream << "|" << dimensionStream.str();
if (i + 1 < array.getNumberHeavyDataControllers()) {
valuesStream << "|";
}
}
else {
valuesStream << heavyDataPath;
if(!dataSetPath.empty()) {
valuesStream << ":" << dataSetPath;
}
}
xmlTextValues.push_back(valuesStream.str());
}
}
......@@ -427,7 +467,9 @@ void
XdmfWriter::visit(XdmfItem & item,
const shared_ptr<XdmfBaseVisitor> visitor)
{
if (mImpl == NULL) {
XdmfError::message(XdmfError::FATAL, "Error: Writer Internal Object is Null");
}
if (mImpl->mDepth == 0) {
mImpl->openFile();
}
......
......@@ -5,6 +5,7 @@ if (POLICY CMP0015)
endif (POLICY CMP0015)
set(XdmfDSMLinkLibraries XdmfCore)
set(XdmfDSMLinkLibraryDir )
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
......@@ -14,10 +15,10 @@ mark_as_advanced(Boost_INCLUDE_DIR)
include_directories(${Boost_INCLUDE_DIRS})
mark_as_advanced(FORCE Boost_INCLUDE_DIR)
mark_as_advanced(CLEAR HDF5_C_INCLUDE_DIR)
mark_as_advanced(CLEAR HDF5_hdf5_LIBRARY_DEBUG)
mark_as_advanced(CLEAR HDF5_hdf5_LIBRARY_RELEASE)
find_package(HDF5 REQUIRED)
#mark_as_advanced(CLEAR HDF5_C_INCLUDE_DIR)
#mark_as_advanced(CLEAR HDF5_hdf5_LIBRARY_DEBUG)
#mark_as_advanced(CLEAR HDF5_hdf5_LIBRARY_RELEASE)
#find_package(HDF5 REQUIRED)
if(HDF5_FOUND)
mark_as_advanced(FORCE HDF5_C_INCLUDE_DIR)
mark_as_advanced(FORCE HDF5_hdf5_LIBRARY_DEBUG)
......@@ -25,6 +26,8 @@ if(HDF5_FOUND)
include_directories(${HDF5_INCLUDE_DIRS})
include_directories(${HDF5_C_INCLUDE_DIR})
set(HDF5_LIBRARIES ${HDF5_hdf5_LIBRARY_RELEASE})
get_filename_component(HDF5_LIBRARY_DIR "${HDF5_hdf5_LIBRARY_RELEASE}" PATH)
set(XdmfDSMLinkLibraryDir ${XdmfDSMLinkLibraryDir} ${HDF5_LIBRARY_DIR})
# FIXME: Would like to get this info from HDF5 so we don't have conflicting
# MPI versions
if(HDF5_IS_PARALLEL)
......@@ -74,7 +77,7 @@ if (XDMF_BUILD_DSM_THREADS)
endif (XDMF_BUILD_DSM_THREADS)
add_library(XdmfDSM ${XdmfDSMSources})
link_directories(${XDMF_LIBRARY_DIRS})
link_directories(${XDMF_LIBRARY_DIRS} ${XdmfDSMLinkLibraryDir})
target_link_libraries(XdmfDSM ${XdmfDSMLinkLibraries})
if(WIN32)
......
......@@ -74,6 +74,25 @@ swig -v -c++ -python -o XdmfDSMPython.cpp XdmfDSM.i
%include <typemaps.i>
%apply int & INOUT {int & data };
%extend XdmfHeavyDataController {
static shared_ptr<XdmfHDF5ControllerDSM> XdmfHDF5ControllerDSMCast(PyObject * obj)
{
void * resultPointer = 0;
swig_type_info * returnType = SWIG_TypeQuery("_p_boost__shared_ptrT_XdmfHeavyDataController_t");
SWIG_ConvertPtr(obj, &resultPointer, returnType, 0);
shared_ptr<XdmfHeavyDataController> * returnControllerPointer =
reinterpret_cast<shared_ptr<XdmfHeavyDataController> *>(resultPointer);
shared_ptr<XdmfHeavyDataController> returnController = returnControllerPointer[0];
if (shared_ptr<XdmfHDF5ControllerDSM> returnHDF5Controller = shared_dynamic_cast<XdmfHDF5ControllerDSM>(returnController)) {
return returnHDF5Controller;
}
else {
XdmfError::message(XdmfError::FATAL, "Error: Attempting to cast a non HDF5 Controller to HDF5");
return shared_ptr<XdmfHDF5ControllerDSM>();
}
}
};
#endif /* SWIGPYTHON */
......
......@@ -183,6 +183,13 @@ static const H5FD_class_mpi_t XDMF_dsm_g = {
#define H5_INTERFACE_INIT_FUNC XDMF_dsm_init_interface
void
XdmfUnused(void)
{
//To remove warning about XDMF_dsm_init_interface being unused
XDMF_dsm_init_interface();
}
static herr_t
XDMF_dsm_init_interface(void)
{
......
......@@ -405,7 +405,7 @@ XdmfDSMManager * XdmfHDF5ControllerDSM::getServerManager()
return mDSMServerManager;
}
bool XdmfHDF5ControllerDSM::getServerMode()
bool XdmfHDF5ControllerDSM::getServerMode() const
{
return mServerMode;
}
......@@ -413,7 +413,9 @@ bool XdmfHDF5ControllerDSM::getServerMode()
MPI_Comm XdmfHDF5ControllerDSM::getWorkerComm()
{
MPI_Comm returnComm = MPI_COMM_NULL;
int status = MPI_Comm_dup(mWorkerComm, &returnComm);
if (mWorkerComm != MPI_COMM_NULL) {
MPI_Comm_dup(mWorkerComm, &returnComm);
}
return returnComm;
}
......
......@@ -548,7 +548,7 @@ public:
*
* @return If the DSM is in server mode or not
*/
bool getServerMode();
bool getServerMode() const;
std::string getName() const;
......
......@@ -359,8 +359,10 @@ bool XdmfHDF5WriterDSM::getServerMode()
MPI_Comm XdmfHDF5WriterDSM::getWorkerComm()
{
MPI_Comm returnComm;
int status = MPI_Comm_dup(mWorkerComm, &returnComm);
MPI_Comm returnComm = MPI_COMM_NULL;
if (mWorkerComm != MPI_COMM_NULL) {
MPI_Comm_dup(mWorkerComm, &returnComm);
}
return returnComm;
}
......
add_subdirectory(C)
add_subdirectory(Cxx)
if(XDMF_WRAP_PYTHON)
......
......@@ -26,11 +26,11 @@ IF (MPIEXEC_MAX_NUMPROCS STRGREATER 5)
ADD_MPI_TEST_CXX(DSMLoopTest.sh DSMLoopTest)
get_filename_component(MPI_BIN_DIRECTORY ${MPI_CXX_COMPILER} PATH)
EXECUTE_PROCESS(
COMMAND ${MPI_BIN_DIRECTORY}/mpirun --version
COMMAND ${MPIEXEC} --version
OUTPUT_VARIABLE MPI_TYPE_OUTPUT
ERROR_VARIABLE MPI_TYPE_ERROR
)
STRING(REGEX MATCH "Open MPI" IS_OPENMPI "${MPI_TYPE_ERROR}")
STRING(REGEX MATCH "Open" IS_OPENMPI "${MPI_TYPE_ERROR}")
IF ("${IS_OPENMPI}" STREQUAL "")
ADD_MPI_TEST_CXX(ConnectTest.sh XdmfAcceptTest,XdmfConnectTest2,XdmfConnectTest)
ENDIF ("${IS_OPENMPI}" STREQUAL "")
......
# Intel MPI requires a minimum of 2 cores per process
mpirun -n 2 ./XdmfAcceptTest &
$MPIEXEC -n 2 ./XdmfAcceptTest &
mpirun -n 2 ./XdmfConnectTest &
$MPIEXEC -n 2 ./XdmfConnectTest &
mpirun -n 2 ./XdmfConnectTest2
$MPIEXEC -n 2 ./XdmfConnectTest2
mpirun -n 4 ./DSMLoopTest
$MPIEXEC -n 4 ./DSMLoopTest
......@@ -27,11 +27,11 @@ if (MPIEXEC_MAX_NUMPROCS STRGREATER 5)
ADD_MPI_TEST_PYTHON(PythonDSM.sh XdmfExampleDsmTest)
get_filename_component(MPI_BIN_DIRECTORY ${MPI_CXX_COMPILER} PATH)
EXECUTE_PROCESS(
COMMAND ${MPI_BIN_DIRECTORY}/mpirun --version
COMMAND ${MPIEXEC} --version
OUTPUT_VARIABLE MPI_TYPE_OUTPUT
ERROR_VARIABLE MPI_TYPE_ERROR
)
STRING(REGEX MATCH "Open MPI" IS_OPENMPI "${MPI_TYPE_ERROR}")
STRING(REGEX MATCH "Open" IS_OPENMPI "${MPI_TYPE_ERROR}")
IF ("${IS_OPENMPI}" STREQUAL "") # This test will freeze if OpenMPI is used
ADD_MPI_TEST_PYTHON(PythonConnect.sh XdmfExampleAcceptTest,XdmfExampleConnectTest2,XdmfExampleConnectTest)
ENDIF ("${IS_OPENMPI}" STREQUAL "")
......
# Intel MPI requires a minimum of 2 cores per process
mpirun -n 2 $PYTHON_EXECUTABLE ./XdmfExampleAcceptTest.py &
$MPIEXEC -n 2 $PYTHON_EXECUTABLE ./XdmfExampleAcceptTest.py &
mpirun -n 2 $PYTHON_EXECUTABLE ./XdmfExampleConnectTest.py &
$MPIEXEC -n 2 $PYTHON_EXECUTABLE ./XdmfExampleConnectTest.py &
mpirun -n 2 $PYTHON_EXECUTABLE ./XdmfExampleConnectTest2.py
$MPIEXEC -n 2 $PYTHON_EXECUTABLE ./XdmfExampleConnectTest2.py
# Intel MPI requires a minimum of 2 cores per process
mpirun -n 4 $PYTHON_EXECUTABLE ./XdmfExampleDsmTest.py
$MPIEXEC -n 4 $PYTHON_EXECUTABLE ./XdmfExampleDsmTest.py
......@@ -616,9 +616,9 @@ if __name__ == "__main__":
if (i == id):
print "Core # " + str(id)
print "Controller stats"
print "datasetpath = " + testArray.getHeavyDataController(0).getDataSetPath()
print "datasetpath = " + XdmfHeavyDataController.XdmfHDF5ControllerCast(testArray.getHeavyDataController(0)).getDataSetPath()
print "filepath = " + testArray.getHeavyDataController(0).getFilePath()
outputVector = testArray.getHeavyDataController(0).getDataspaceDimensions()
outputVector = XdmfHeavyDataController.XdmfHDF5ControllerCast(testArray.getHeavyDataController(0)).getDataspaceDimensions()
print "Data space dimensions"
for j in range(0, outputVector.size()):
print "[" + str(j) + "] =" + str(outputVector[j])
......@@ -628,11 +628,11 @@ if __name__ == "__main__":
print "[" + str(j) + "] =" + str(outputVector[j])
print "Controller size" + str(testArray.getHeavyDataController(0).getSize())
print "Controller starts"
outputVector = testArray.getHeavyDataController(0).getStart()
outputVector = XdmfHeavyDataController.XdmfHDF5ControllerCast(testArray.getHeavyDataController(0)).getStart()
for j in range(0, outputVector.size()):
print "[" + str(j) + "] =" + str(outputVector[j])
print "Controller strides"
outputVector = testArray.getHeavyDataController(0).getStride()
outputVector = XdmfHeavyDataController.XdmfHDF5ControllerCast(testArray.getHeavyDataController(0)).getStride()
for j in range(0, outputVector.size()):
print "[" + str(j) + "] =" + str(outputVector[j])
for j in range(0, testArray.getSize()):
......@@ -677,9 +677,9 @@ if __name__ == "__main__":
if (i == id):
print "Core # " + str(id)
print "Controller stats"
print "datasetpath = " + readArray.getHeavyDataController(0).getDataSetPath()
print "datasetpath = " + XdmfHeavyDataController.XdmfHDF5ControllerCast(readArray.getHeavyDataController(0)).getDataSetPath()
print "filepath = " + readArray.getHeavyDataController(0).getFilePath()
outputVector = readArray.getHeavyDataController(0).getDataspaceDimensions()
outputVector = XdmfHeavyDataController.XdmfHDF5ControllerCast(readArray.getHeavyDataController(0)).getDataspaceDimensions()
print "Data space dimensions"
for j in range(0, outputVector.size()):
print "[" + str(j) + "] =" + str(outputVector[j])
......@@ -689,11 +689,11 @@ if __name__ == "__main__":
print "[" + str(j) + "] =" + str(outputVector[j])
print "Controller size" + str(readArray.getHeavyDataController(0).getSize())
print "Controller starts"
outputVector = readArray.getHeavyDataController(0).getStart()
outputVector = XdmfHeavyDataController.XdmfHDF5ControllerCast(readArray.getHeavyDataController(0)).getStart()
for j in range(0, outputVector.size()):
print "[" + str(j) + "] =" + str(outputVector[j])
print "Controller strides"
outputVector = readArray.getHeavyDataController(0).getStride()
outputVector = XdmfHeavyDataController.XdmfHDF5ControllerCast(readArray.getHeavyDataController(0)).getStride()
for j in range(0, outputVector.size()):
print "[" + str(j) + "] =" + str(outputVector[j])
for j in range (0, readArray.getSize()):
......
......@@ -15,12 +15,12 @@ int main(int, char **)
assert(array->getHeavyDataController() == NULL);
shared_ptr<XdmfHDF5Writer> writer = XdmfHDF5Writer::New("hdf5WriterTest.h5");
array->accept(writer);
shared_ptr<XdmfHeavyDataController> firstController =
array->getHeavyDataController();
shared_ptr<XdmfHDF5Controller> firstController =
shared_dynamic_cast<XdmfHDF5Controller>(array->getHeavyDataController());
std::string firstPath = firstController->getDataSetPath();
array->accept(writer);
shared_ptr<XdmfHeavyDataController> secondController =
array->getHeavyDataController();
shared_ptr<XdmfHDF5Controller> secondController =
shared_dynamic_cast<XdmfHDF5Controller>(array->getHeavyDataController());
std::string secondPath = secondController->getDataSetPath();
assert(firstPath.compare(secondPath) != 0);
......@@ -29,23 +29,23 @@ int main(int, char **)
//
writer->setMode(XdmfHDF5Writer::Overwrite);
array->accept(writer);
shared_ptr<XdmfHeavyDataController> thirdController =
array->getHeavyDataController();
shared_ptr<XdmfHDF5Controller> thirdController =
shared_dynamic_cast<XdmfHDF5Controller>(array->getHeavyDataController());
std::string thirdPath = thirdController->getDataSetPath();
assert(secondPath.compare(thirdPath) == 0);
array->pushBack(3);
array->accept(writer);
shared_ptr<XdmfHeavyDataController> fourthController =
array->getHeavyDataController();
shared_ptr<XdmfHDF5Controller> fourthController =
shared_dynamic_cast<XdmfHDF5Controller>(array->getHeavyDataController());
std::string fourthPath = fourthController->getDataSetPath();
assert(thirdPath.compare(fourthPath) == 0);
array->erase(0);
array->erase(0);
array->accept(writer);
shared_ptr<XdmfHeavyDataController> fifthController =
array->getHeavyDataController();
shared_ptr<XdmfHDF5Controller> fifthController =
shared_dynamic_cast<XdmfHDF5Controller>(array->getHeavyDataController());
std::string fifthPath = fifthController->getDataSetPath();
assert(fourthPath.compare(fifthPath) == 0);
......
......@@ -10,7 +10,7 @@ int main(int, char **)