Commit 9cf33fdc authored by Kenneth Leiter's avatar Kenneth Leiter

ENH: Begin implementing XdmfTopologyConverter. Fix typo in XdmfArray that...

ENH: Begin implementing XdmfTopologyConverter.  Fix typo in XdmfArray that incorrectly initialized UInt32() type.
parent 305ffbca
......@@ -496,7 +496,7 @@ void XdmfArray::initialize(const boost::shared_ptr<const XdmfArrayType> arrayTyp
{
this->initialize<unsigned short>();
}
else if(arrayType == XdmfArrayType::Int32())
else if(arrayType == XdmfArrayType::UInt32())
{
this->initialize<unsigned int>();
}
......
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
option(XDMF_BUILD_PARTITIONER OFF)
set(XdmfUtilsExecutables)
......@@ -24,3 +26,7 @@ foreach(executable ${XdmfUtilsExecutables})
set_target_properties(${executable} PROPERTIES COMPILE_FLAGS -DBUILD_EXE)
target_link_libraries(${executable} XdmfUtils)
endforeach(executable ${XdmfUtilsExecutables})
if(XDMF_BUILD_TESTING)
add_subdirectory(tests)
endif(XDMF_BUILD_TESTING)
......@@ -23,8 +23,6 @@
/* */
/*******************************************************************/
#include "XdmfPartitioner.hpp"
#ifndef BUILD_EXE
extern "C"
......@@ -43,6 +41,7 @@ extern "C"
#include "XdmfGridCollection.hpp"
#include "XdmfGridCollectionType.hpp"
#include "XdmfHDF5Writer.hpp"
#include "XdmfPartitioner.hpp"
#include "XdmfSet.hpp"
#include "XdmfSetType.hpp"
#include "XdmfTopology.hpp"
......@@ -57,7 +56,7 @@ XdmfPartitioner::~XdmfPartitioner()
}
boost::shared_ptr<XdmfGridCollection> XdmfPartitioner::partition(const boost::shared_ptr<XdmfGrid> gridToPartition, const unsigned int numberOfPartitions,
boost::shared_ptr<XdmfHDF5Writer> heavyDataWriter)
boost::shared_ptr<XdmfHDF5Writer> heavyDataWriter) const
{
int metisElementType;
int numNodesPerElement;
......@@ -303,7 +302,8 @@ boost::shared_ptr<XdmfGridCollection> XdmfPartitioner::partition(const boost::sh
createdAttribute->setAttributeType(currAttribute->getAttributeType());
unsigned int index = 0;
unsigned int numValsPerComponent = currAttribute->getArray()->getSize() / gridToPartition->getTopology()->getNumberElements();
createdAttribute->getArray()->reserve(currElemIds.size() * numValsPerComponent);
createdAttribute->getArray()->initialize(currAttribute->getArray()->getType());
createdAttribute->getArray()->resize<unsigned int>(currElemIds.size() * numValsPerComponent);
for(std::vector<unsigned int>::const_iterator iter = currElemIds.begin(); iter != currElemIds.end(); ++iter)
{
createdAttribute->getArray()->copyValues(index, currAttribute->getArray(), *iter * numValsPerComponent, numValsPerComponent);
......@@ -316,7 +316,8 @@ boost::shared_ptr<XdmfGridCollection> XdmfPartitioner::partition(const boost::sh
createdAttribute->setName(currAttribute->getName());
createdAttribute->setAttributeCenter(currAttribute->getAttributeCenter());
createdAttribute->setAttributeType(currAttribute->getAttributeType());
createdAttribute->getArray()->reserve(currNodeMap.size());
createdAttribute->getArray()->initialize(currAttribute->getArray()->getType());
createdAttribute->getArray()->resize<unsigned int>(currNodeMap.size());
for(std::map<unsigned int, unsigned int>::const_iterator iter = currNodeMap.begin(); iter != currNodeMap.end(); ++iter)
{
createdAttribute->getArray()->copyValues(iter->second, currAttribute->getArray(), iter->first, 1);
......@@ -403,6 +404,7 @@ boost::shared_ptr<XdmfGridCollection> XdmfPartitioner::partition(const boost::sh
#include "XdmfDomain.hpp"
#include "XdmfGridCollection.hpp"
#include "XdmfHDF5Writer.hpp"
#include "XdmfPartitioner.hpp"
#include "XdmfReader.hpp"
#include "XdmfWriter.hpp"
......@@ -417,7 +419,6 @@ boost::shared_ptr<XdmfGridCollection> XdmfPartitioner::partition(const boost::sh
*/
int main(int argc, char* argv[])
{
std::string usage = "Partitions an Xdmf grid using the metis library: \n \n Usage: \n \n XdmfPartitioner <path-of-file-to-partition> <num-partitions> (Optional: <path-to-output-file>)";
std::string meshName = "";
......
......@@ -38,7 +38,7 @@ public:
*
* The partitioner splits the XdmfGrid and all attached XdmfAttributes and XdmfSets into their proper partition.
* An XdmfAttribute named "GlobalNodeId" is added to each partitioned grid to map partitioned node ids to their
* original unpartitioned id. This could allow grids to be recombined.
* original unpartitioned id. All arrays attached to the passed gridToPartition are read from disk if not initialized.
*
* @param gridToPartition an XdmfGrid to partition.
* @param numberOfPartitions the number of pieces to partition the grid into.
......@@ -47,7 +47,7 @@ public:
* @return a spatial collection containing partitioned grids.
*/
boost::shared_ptr<XdmfGridCollection> partition(const boost::shared_ptr<XdmfGrid> gridToPartition, const unsigned int numberOfPartitions,
boost::shared_ptr<XdmfHDF5Writer> heavyDataWriter);
boost::shared_ptr<XdmfHDF5Writer> heavyDataWriter) const;
protected:
......
This diff is collapsed.
......@@ -33,7 +33,7 @@ public:
*
* @return the converted XdmfGrid.
*/
boost::shared_ptr<XdmfGrid> convert(const boost::shared_ptr<const XdmfGrid> gridToConvert, const boost::shared_ptr<const XdmfTopologyType> topologyType) const;
boost::shared_ptr<XdmfGrid> convert(const boost::shared_ptr<XdmfGrid> gridToConvert, const boost::shared_ptr<const XdmfTopologyType> topologyType) const;
protected:
......@@ -43,6 +43,12 @@ private:
XdmfTopologyConverter(const XdmfTopologyConverter & converter); // Not implemented.
void operator=(const XdmfTopologyConverter & converter); // Not implemented.
// Specific Topology Converters
class HexahedronToHexahedron64;
// Point comparator
class PointComparison;
};
#endif /* XDMFPARTITIONER_HPP_ */
add_subdirectory(Cxx)
set(XdmfUtilsCxxTests
TestXdmfTopologyConverter
)
foreach(test ${XdmfUtilsCxxTests})
add_executable(${test} ${test})
target_link_libraries(${test} XdmfUtils)
add_test(${test} ${test})
endforeach(test ${XdmfUtilsCxxTests})
#include <math.h>
#include "XdmfArray.hpp"
#include "XdmfGeometry.hpp"
#include "XdmfGeometryType.hpp"
#include "XdmfGrid.hpp"
#include "XdmfTopology.hpp"
#include "XdmfTopologyConverter.hpp"
#include "XdmfTopologyType.hpp"
#include "XdmfArrayType.hpp"
#include "XdmfWriter.hpp"
int main(int argc, char* argv[])
{
const double epsilon = 1e-6;
boost::shared_ptr<XdmfTopologyConverter> converter = XdmfTopologyConverter::New();
// Create Hexahedron Grid
boost::shared_ptr<XdmfGrid> hexGrid = XdmfGrid::New();
double hexPoints[24] = {0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1};
hexGrid->getGeometry()->setGeometryType(XdmfGeometryType::XYZ());
hexGrid->getGeometry()->getArray()->resize<double>(24, 0);
hexGrid->getGeometry()->getArray()->copyValues(0, hexPoints, 24);
unsigned int hexConn[8] = {0, 1, 2, 3, 4, 5, 6, 7};
hexGrid->getTopology()->setTopologyType(XdmfTopologyType::Hexahedron());
hexGrid->getTopology()->getArray()->resize<unsigned int>(8, 0);
hexGrid->getTopology()->getArray()->copyValues(0, hexConn, 8);
/*
* Hexahedron to Hexahedron_64
*/
boost::shared_ptr<XdmfGrid> hex64Grid = converter->convert(hexGrid, XdmfTopologyType::Hexahedron_64());
boost::shared_ptr<XdmfWriter> writer = XdmfWriter::New("hex64.xmf");
hex64Grid->accept(writer);
assert(hex64Grid->getGeometry()->getGeometryType() == XdmfGeometryType::XYZ());
assert(hex64Grid->getGeometry()->getNumberPoints() == 64);
double expectedPoints[192] = {0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0.333333333333333, 0, 0, 0.666666666666667, 0, 0, 1, 0.333333333333333,
0, 1, 0.666666666666667, 0, 0.666666666666667, 1, 0, 0.333333333333333, 1, 0, 0, 0.666666666666667, 0, 0, 0.333333333333333, 0,
0.333333333333333, 0, 1, 0.666666666666667, 0, 1, 1, 0.333333333333333, 1, 1, 0.666666666666667, 1, 0.666666666666667, 1, 1, 0.333333333333333,
1, 1, 0, 0.666666666666667, 1, 0, 0.333333333333333, 1, 0, 0, 0.333333333333333, 1, 0, 0.333333333333333, 1, 1, 0.333333333333333, 0, 1,
0.333333333333333, 0, 0, 0.666666666666667, 1, 0, 0.666666666666667, 1, 1, 0.666666666666667, 0, 1, 0.666666666666667, 0, 0.666666666666667,
0.333333333333333, 0, 0.333333333333333, 0.333333333333333, 1, 0.333333333333333, 0.333333333333333, 1, 0.666666666666667, 0.333333333333333,
0.333333333333333, 0, 0.333333333333333, 0.666666666666667, 0, 0.333333333333333, 0.666666666666667, 1, 0.333333333333333, 0.333333333333333,
1, 0.333333333333333, 0, 0.666666666666667, 0.666666666666667, 0, 0.333333333333333, 0.666666666666667, 1, 0.333333333333333,
0.666666666666667, 1, 0.666666666666667, 0.666666666666667, 0.333333333333333, 0, 0.666666666666667, 0.666666666666667, 0, 0.666666666666667,
0.666666666666667, 1, 0.666666666666667, 0.333333333333333, 1, 0.666666666666667, 0.333333333333333, 0.333333333333333, 0, 0.666666666666667,
0.333333333333333, 0, 0.666666666666667, 0.666666666666667, 0, 0.333333333333333, 0.666666666666667, 0, 0.333333333333333, 0.333333333333333,
1, 0.666666666666667, 0.333333333333333, 1, 0.666666666666667, 0.666666666666667, 1, 0.333333333333333, 0.666666666666667, 1,
0.333333333333333, 0.333333333333333, 0.333333333333333, 0.666666666666667, 0.333333333333333, 0.333333333333333, 0.666666666666667,
0.666666666666667, 0.333333333333333, 0.333333333333333, 0.666666666666667, 0.333333333333333, 0.333333333333333, 0.333333333333333,
0.666666666666667, 0.666666666666667, 0.333333333333333, 0.666666666666667, 0.666666666666667, 0.666666666666667, 0.666666666666667,
0.333333333333333, 0.666666666666667, 0.666666666666667};
for(unsigned int i=0; i<192; ++i)
{
assert(fabs(expectedPoints[i] - hex64Grid->getGeometry()->getArray()->getValueCopy<double>(i)) < epsilon);
}
assert(hex64Grid->getTopology()->getTopologyType() == XdmfTopologyType::Hexahedron_64());
for(unsigned int i=0; i<64; ++i)
{
assert(i == hex64Grid->getTopology()->getArray()->getValueCopy<unsigned int>(i));
}
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment