Skip to content

Commit 2cc93e1

Browse files
author
f-schmitt-zih
committed
Merge pull request #225 from ax3l/fix-readDataSetMeta
Fix #224 `readMeta` ColType Detection
2 parents 18ff55e + b196dde commit 2cc93e1

6 files changed

Lines changed: 87 additions & 25 deletions

File tree

src/ParallelDataCollector.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -998,11 +998,28 @@ namespace splash
998998

999999
getEntriesForID(id, &(*entries.begin()), NULL);
10001000

1001+
// find entry by name
1002+
int32_t entry_id = -1;
1003+
for(size_t i = 0; i < entrySize; ++i)
1004+
if(std::string(name) == entries[i].name)
1005+
{
1006+
entry_id = int32_t(i);
1007+
break;
1008+
}
1009+
1010+
if(entry_id < 0)
1011+
throw DCException(getExceptionString("readDataSetMeta", "Entry not found by name"));
1012+
10011013
Dimensions src_size(dataset.getSize() - srcOffset);
10021014
dataset.read(dstBuffer, dstOffset, src_size, srcOffset, sizeRead, srcDims, NULL);
10031015
dataset.close();
10041016

1005-
return entries[0].colType;
1017+
log_msg(3, "Entry '%s' (%d) is of type: %s",
1018+
entries[entry_id].name.c_str(),
1019+
entry_id,
1020+
entries[entry_id].colType->toString().c_str());
1021+
1022+
return entries[entry_id].colType;
10061023
}
10071024

10081025
void ParallelDataCollector::writeDataSet(H5Handle group,

src/SerialDataCollector.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1004,11 +1004,28 @@ namespace splash
10041004

10051005
getEntriesForID(id, &(*entries.begin()), NULL);
10061006

1007+
// find entry by name
1008+
int32_t entry_id = -1;
1009+
for(size_t i = 0; i < entrySize; ++i)
1010+
if(std::string(name) == entries[i].name)
1011+
{
1012+
entry_id = int32_t(i);
1013+
break;
1014+
}
1015+
1016+
if(entry_id < 0)
1017+
throw DCException(getExceptionString("readDataSetMeta", "Entry not found by name"));
1018+
10071019
Dimensions src_size(dataset.getSize() - srcOffset);
10081020
dataset.read(dstBuffer, dstOffset, src_size, srcOffset, sizeRead, srcDims, NULL);
10091021
dataset.close();
10101022

1011-
return entries[0].colType;
1023+
log_msg(3, "Entry '%s' (%d) is of type: %s",
1024+
entries[entry_id].name.c_str(),
1025+
entry_id,
1026+
entries[entry_id].colType->toString().c_str());
1027+
1028+
return entries[entry_id].colType;
10121029
}
10131030

10141031
void SerialDataCollector::readSizeInternal(H5Handle h5File,

src/include/splash/basetypes/ColTypeBool.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class ColTypeBool : public CollectionType
6969
{
7070
char* m0 = H5Tget_member_name(datatype_id,0);
7171
char* m1 = H5Tget_member_name(datatype_id,1);
72-
if(strcmp("true" , m0) == 0 && strcmp("false", m1) == 0)
72+
if(strcmp("TRUE" , m0) == 0 && strcmp("FALSE", m1) == 0)
7373
found = true;
7474
free(m1);
7575
free(m0);

tests/Parallel_SimpleDataTest.cpp

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* Copyright 2013 Felix Schmitt
2+
* Copyright 2013-2016 Felix Schmitt, Axel Huebl
33
*
44
* This file is part of libSplash.
55
*
@@ -26,6 +26,7 @@
2626
#include <string.h>
2727
#include <set>
2828
#include <string>
29+
#include <typeinfo>
2930

3031
#include "Parallel_SimpleDataTest.h"
3132

@@ -45,7 +46,7 @@ CPPUNIT_TEST_SUITE_REGISTRATION(Parallel_SimpleDataTest);
4546
using namespace splash;
4647

4748
Parallel_SimpleDataTest::Parallel_SimpleDataTest() :
48-
ctInt(),
49+
ctInt32(),
4950
parallelDataCollector(NULL)
5051
{
5152
srand(10);
@@ -68,7 +69,7 @@ Parallel_SimpleDataTest::~Parallel_SimpleDataTest()
6869
}
6970

7071
bool Parallel_SimpleDataTest::testData(const Dimensions mpiSize,
71-
const Dimensions gridSize, int *data)
72+
const Dimensions gridSize, int32_t *data)
7273
{
7374
for (size_t z = 0; z < mpiSize[2]; ++z)
7475
for (size_t y = 0; y < mpiSize[1]; ++y)
@@ -124,18 +125,18 @@ bool Parallel_SimpleDataTest::subtestWriteRead(int32_t iteration,
124125
fileCAttr.enableCompression = false;
125126
parallelDataCollector->open(HDF5_FILE, fileCAttr);
126127

127-
int *dataWrite = new int[bufferSize];
128+
int32_t *dataWrite = new int32_t[bufferSize];
128129

129130
for (uint32_t i = 0; i < bufferSize; i++)
130131
dataWrite[i] = currentMpiRank + 1;
131132

132-
parallelDataCollector->write(iteration, ctInt, dimensions, gridSize,
133+
parallelDataCollector->write(iteration, ctInt32, dimensions, gridSize,
133134
"deep/folder/data", dataWrite);
134135
datasetNames.insert("deep/folder/data");
135-
parallelDataCollector->write(iteration, ctInt, dimensions, gridSize,
136+
parallelDataCollector->write(iteration, ctInt32, dimensions, gridSize,
136137
"deep/folder/data2", dataWrite);
137138
datasetNames.insert("deep/folder/data2");
138-
parallelDataCollector->write(iteration, ctInt, dimensions, gridSize,
139+
parallelDataCollector->write(iteration, ctInt32, dimensions, gridSize,
139140
"another_dataset", dataWrite);
140141
datasetNames.insert("another_dataset");
141142
parallelDataCollector->close();
@@ -153,8 +154,8 @@ bool Parallel_SimpleDataTest::subtestWriteRead(int32_t iteration,
153154

154155
Dimensions size_read;
155156
Dimensions full_grid_size = gridSize * mpiSize;
156-
int *data_read = new int[full_grid_size.getScalarSize()];
157-
memset(data_read, 0, sizeof (int) * full_grid_size.getScalarSize());
157+
int32_t *data_read = new int32_t[full_grid_size.getScalarSize()];
158+
memset(data_read, 0, sizeof (int32_t) * full_grid_size.getScalarSize());
158159

159160
// test using SerialDataCollector
160161
if (currentMpiRank == 0)
@@ -173,7 +174,7 @@ bool Parallel_SimpleDataTest::subtestWriteRead(int32_t iteration,
173174
MPI_CHECK(MPI_Barrier(mpiComm));
174175

175176
// test using full read per process
176-
memset(data_read, 0, sizeof (int) * full_grid_size.getScalarSize());
177+
memset(data_read, 0, sizeof (int32_t) * full_grid_size.getScalarSize());
177178
ParallelDataCollector *readCollector = new ParallelDataCollector(mpiComm,
178179
MPI_INFO_NULL, mpiSize, 1);
179180

@@ -202,13 +203,26 @@ bool Parallel_SimpleDataTest::subtestWriteRead(int32_t iteration,
202203
{
203204
/* test that listed datasets match expected dataset names*/
204205
CPPUNIT_ASSERT(datasetNames.find(entries[i].name) != datasetNames.end());
206+
CPPUNIT_ASSERT(typeid(*entries[i].colType) == typeid(ColTypeInt32));
205207
}
206208

207209
delete[] entries;
208210
delete[] ids;
209211
}
210212

211213
readCollector->read(iteration, "deep/folder/data", size_read, data_read);
214+
215+
Dimensions dstBuffer(size_read);
216+
Dimensions dstOffset(0, 0, 0);
217+
Dimensions sizeRead(0, 0, 0);
218+
CollectionType* colType = readCollector->readMeta(iteration,
219+
"deep/folder/data", dstBuffer, dstOffset, sizeRead);
220+
221+
CPPUNIT_ASSERT(typeid(*colType) == typeid(ColTypeInt32));
222+
CPPUNIT_ASSERT(typeid(*colType) != typeid(ColTypeUInt32));
223+
CPPUNIT_ASSERT(typeid(*colType) != typeid(ColTypeUInt64));
224+
CPPUNIT_ASSERT(typeid(*colType) != typeid(ColTypeDouble));
225+
212226
readCollector->close();
213227

214228
CPPUNIT_ASSERT(size_read == full_grid_size);
@@ -218,8 +232,8 @@ bool Parallel_SimpleDataTest::subtestWriteRead(int32_t iteration,
218232
MPI_CHECK(MPI_Barrier(mpiComm));
219233

220234
// test using parallel read
221-
data_read = new int[gridSize.getScalarSize()];
222-
memset(data_read, 0, sizeof (int) * gridSize.getScalarSize());
235+
data_read = new int32_t[gridSize.getScalarSize()];
236+
memset(data_read, 0, sizeof (int32_t) * gridSize.getScalarSize());
223237

224238
const Dimensions globalOffset = gridSize * mpiPos;
225239
readCollector->open(HDF5_FILE, fileCAttr);
@@ -379,7 +393,7 @@ bool Parallel_SimpleDataTest::subtestFill(int32_t iteration,
379393
fileCAttr.enableCompression = false;
380394
parallelDataCollector->open(HDF5_FILE, fileCAttr);
381395

382-
int dataWrite = currentMpiRank + 1;
396+
int32_t dataWrite = currentMpiRank + 1;
383397
uint32_t num_elements = (currentMpiRank + 1) * elements;
384398
Dimensions grid_size(num_elements, 1, 1);
385399

@@ -389,10 +403,10 @@ bool Parallel_SimpleDataTest::subtestFill(int32_t iteration,
389403

390404
Dimensions globalOffset, globalSize;
391405
parallelDataCollector->reserve(iteration, grid_size,
392-
&globalSize, &globalOffset, 1, ctInt, "reserved/reserved_data");
406+
&globalSize, &globalOffset, 1, ctInt32, "reserved/reserved_data");
393407

394-
int attrVal = currentMpiRank;
395-
parallelDataCollector->writeAttribute(iteration, ctInt, "reserved/reserved_data",
408+
int32_t attrVal = currentMpiRank;
409+
parallelDataCollector->writeAttribute(iteration, ctInt32, "reserved/reserved_data",
396410
"reserved_attr", &attrVal);
397411

398412
uint32_t elements_written = 0;
@@ -437,8 +451,8 @@ bool Parallel_SimpleDataTest::subtestFill(int32_t iteration,
437451
// test using SerialDataCollector
438452
if (currentMpiRank == 0)
439453
{
440-
int *data_read = new int[full_grid_size.getScalarSize()];
441-
memset(data_read, 0, sizeof (int) * full_grid_size.getScalarSize());
454+
int32_t *data_read = new int32_t[full_grid_size.getScalarSize()];
455+
memset(data_read, 0, sizeof (int32_t) * full_grid_size.getScalarSize());
442456

443457
DataCollector *dataCollector = new SerialDataCollector(1);
444458
dataCollector->open(filename_stream.str().c_str(), fileCAttr);

tests/SimpleDataTest.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* Copyright 2013-2014 Felix Schmitt
2+
* Copyright 2013-2016 Felix Schmitt, Axel Huebl
33
*
44
* This file is part of libSplash.
55
*
@@ -29,6 +29,7 @@
2929
#include <set>
3030
#include <string>
3131
#include <cstring>
32+
#include <typeinfo>
3233

3334
#include "SimpleDataTest.h"
3435

@@ -178,8 +179,21 @@ bool SimpleDataTest::subtestWriteRead(Dimensions gridSize, Dimensions borderSize
178179
}
179180

180181
Dimensions resultSize;
182+
181183
dataCollector->read(10, "deep/folders/data", resultSize, dataRead);
182184

185+
Dimensions dstBuffer(resultSize);
186+
Dimensions dstOffset(0, 0, 0);
187+
Dimensions sizeRead(0, 0, 0);
188+
CollectionType* colType = dataCollector->readMeta(10, "deep/folders/data_bool", dstBuffer, dstOffset, sizeRead);
189+
190+
std::cout << colType->toString() << std::endl;
191+
192+
CPPUNIT_ASSERT(typeid(*colType) == typeid(ColTypeBool));
193+
CPPUNIT_ASSERT(typeid(*colType) != typeid(ColTypeUInt64));
194+
CPPUNIT_ASSERT(typeid(*colType) != typeid(ColTypeInt64));
195+
CPPUNIT_ASSERT(typeid(*colType) != typeid(ColTypeDouble));
196+
183197
for (uint32_t i = 0; i < 3; i++)
184198
CPPUNIT_ASSERT(resultSize[i] == gridSize[i]);
185199

tests/include/Parallel_SimpleDataTest.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* Copyright 2013 Felix Schmitt
2+
* Copyright 2013-2016 Felix Schmitt, Axel Huebl
33
*
44
* This file is part of libSplash.
55
*
@@ -53,7 +53,7 @@ class Parallel_SimpleDataTest : public CPPUNIT_NS::TestFixture
5353
void testFill();
5454

5555
bool testData(const Dimensions mpiSize, const Dimensions gridSize,
56-
int *data);
56+
int32_t *data);
5757

5858
/**
5959
* sub function for testWriteRead to allow several data sizes to be tested.
@@ -68,7 +68,7 @@ class Parallel_SimpleDataTest : public CPPUNIT_NS::TestFixture
6868
bool subtestFill(int32_t iteration, int currentMpiRank, const Dimensions mpiSize,
6969
const Dimensions mpiPos, uint32_t elements, MPI_Comm mpiComm);
7070

71-
ColTypeInt ctInt;
71+
ColTypeInt32 ctInt32;
7272
IParallelDataCollector *parallelDataCollector;
7373

7474
int totalMpiSize;

0 commit comments

Comments
 (0)