diff --git a/utils/XdmfPartitioner.cpp b/utils/XdmfPartitioner.cpp index 6e794af297483f0128928be98b297a7ff41c4e64..227fa8c083987c388add01ab8e8b5ae8db580110 100644 --- a/utils/XdmfPartitioner.cpp +++ b/utils/XdmfPartitioner.cpp @@ -1031,6 +1031,13 @@ XdmfPartitioner::unpartition(const shared_ptr gridToUnPartit for(unsigned int k=0; kgetNumberAttributes(); ++k) { const shared_ptr attribute = set->getAttribute(k); + + bool releaseAttribute = false; + if(!attribute->isInitialized()) { + attribute->read(); + releaseAttribute = true; + } + const shared_ptr attributeCenter = attribute->getCenter(); const shared_ptr attributeType = @@ -1054,6 +1061,10 @@ XdmfPartitioner::unpartition(const shared_ptr gridToUnPartit attribute->getSize()); } + if(releaseAttribute) { + attribute->release(); + } + } } @@ -1078,9 +1089,11 @@ XdmfPartitioner::unpartition(const shared_ptr gridToUnPartit #include "XdmfDomain.hpp" #include "XdmfGraph.hpp" #include "XdmfGridCollection.hpp" +#include "XdmfGridCollectionType.hpp" #include "XdmfHDF5Writer.hpp" #include "XdmfPartitioner.hpp" #include "XdmfReader.hpp" +#include "XdmfUnstructuredGrid.hpp" #include "XdmfWriter.hpp" namespace { @@ -1270,15 +1283,46 @@ XdmfPartitioner::unpartition(const shared_ptr gridToUnPartit heavyFileName << meshName << ".h5"; shared_ptr heavyDataWriter = XdmfHDF5Writer::New(heavyFileName.str()); + heavyDataWriter->setReleaseData(true); shared_ptr newDomain = XdmfDomain::New(); shared_ptr partitioner = XdmfPartitioner::New(); if(unpartition) { - shared_ptr toWrite = - partitioner->unpartition(domain->getGridCollection(0)); - newDomain->insert(toWrite); + shared_ptr gridCollection = + domain->getGridCollection(0); + const shared_ptr collectionType = + gridCollection->getType(); + if(collectionType == XdmfGridCollectionType::Spatial()) { + shared_ptr toWrite = + partitioner->unpartition(gridCollection); + newDomain->insert(toWrite); + } + else if(collectionType == XdmfGridCollectionType::Temporal()) { + const unsigned int numberTimesteps = + gridCollection->getNumberGridCollections(); + if(numberTimesteps == 0) { + std::cout << "No grid collections to unpartition" << std::endl; + return 1; + } + shared_ptr newCollection = + XdmfGridCollection::New(); + newCollection->setType(XdmfGridCollectionType::Temporal()); + for(unsigned int i=0; i spatialCollection = + gridCollection->getGridCollection(i); + const shared_ptr time = spatialCollection->getTime(); + assert(spatialCollection->getType() == + XdmfGridCollectionType::Spatial()); + const shared_ptr toWrite = + partitioner->unpartition(spatialCollection); + toWrite->accept(heavyDataWriter); + toWrite->setTime(time); + newCollection->insert(toWrite); + } + newDomain->insert(newCollection); + } } else { if(domain->getNumberGraphs() == 0) {