Commit 1a8b0e63 authored by Peter W. Draper's avatar Peter W. Draper
Browse files

Merge branch 'blueGene' into 'master'

Blue gene HDF5 i/o fixes

This fixes the i/o bug #53 on the blueGene and adds a unitary test reading in a fresh hdf5 input.

See merge request !46
parents bf19a904 29f749af
......@@ -198,7 +198,7 @@ void writeStringAttribute(hid_t grp, char* name, const char* str, int length) {
h_err = H5Tset_size(h_type, length);
if (h_err < 0) {
error("Error while resizing attribute tyep to '%i'.", length);
error("Error while resizing attribute type to '%i'.", length);
}
h_attr = H5Acreate1(grp, name, h_type, h_space, H5P_DEFAULT);
......
......@@ -61,4 +61,33 @@ extern int engine_rank;
#define message(s, ...) printf("%s: " s "\n", __FUNCTION__, ##__VA_ARGS__)
#endif
/**
* @brief Assertion macro compatible with MPI
*
*/
#ifdef WITH_MPI
extern int engine_rank;
#define assert(expr) \
{ \
if (!(expr)) { \
fprintf(stderr, "[%03i] %s:%s():%i: FAILED ASSERTION: " #expr " \n", \
engine_rank, __FILE__, __FUNCTION__, __LINE__); \
fflush(stderr); \
MPI_Abort(MPI_COMM_WORLD, -1); \
} \
}
#else
#define assert(expr) \
{ \
if (!(expr)) { \
fprintf(stderr, "%s:%s():%i: FAILED ASSERTION: " #expr " \n", __FILE__, \
__FUNCTION__, __LINE__); \
fflush(stderr); \
abort(); \
} \
}
#endif
#endif /* SWIFT_ERROR_H */
......@@ -95,11 +95,11 @@ void readArrayBackEnd(hid_t grp, char* name, enum DATA_TYPE type, int N,
/* Check data type */
h_type = H5Dget_type(h_data);
if (h_type < 0) error("Unable to retrieve data type from the file");
if (!H5Tequal(h_type, hdf5Type(type)))
error("Non-matching types between the code and the file");
/* if (!H5Tequal(h_type, hdf5Type(type))) */
/* error("Non-matching types between the code and the file"); */
/* Allocate temporary buffer */
temp = malloc(N * dim * sizeOfType(type));
temp = malloc(N * dim * typeSize);
if (temp == NULL) error("Unable to allocate memory for temporary buffer");
/* Prepare information for hyperslab */
......
......@@ -102,11 +102,11 @@ void readArrayBackEnd(hid_t grp, char* name, enum DATA_TYPE type, int N,
/* Check data type */
h_type = H5Dget_type(h_data);
if (h_type < 0) error("Unable to retrieve data type from the file");
if (!H5Tequal(h_type, hdf5Type(type)))
error("Non-matching types between the code and the file");
/* if (!H5Tequal(h_type, hdf5Type(type))) */
/* error("Non-matching types between the code and the file"); */
/* Allocate temporary buffer */
temp = malloc(N * dim * sizeOfType(type));
temp = malloc(N * dim * typeSize);
if (temp == NULL) error("Unable to allocate memory for temporary buffer");
/* Prepare information for hyperslab */
......
......@@ -101,11 +101,11 @@ void readArrayBackEnd(hid_t grp, char* name, enum DATA_TYPE type, int N,
/* Check data type */
h_type = H5Dget_type(h_data);
if (h_type < 0) error("Unable to retrieve data type from the file");
if (!H5Tequal(h_type, hdf5Type(type)))
error("Non-matching types between the code and the file");
// if (!H5Tequal(h_type, hdf5Type(type)))
// error("Non-matching types between the code and the file");
/* Allocate temporary buffer */
temp = malloc(N * dim * sizeOfType(type));
temp = malloc(N * dim * typeSize);
if (temp == NULL) error("Unable to allocate memory for temporary buffer");
/* Read HDF5 dataspace in temporary buffer */
......
......@@ -20,11 +20,13 @@ AM_CFLAGS = -I../src -DCPU_TPS=2.67e9 $(HDF5_CPPFLAGS)
AM_LDFLAGS = ../src/.libs/libswiftsim.a $(HDF5_LDFLAGS) $(HDF5_LIBS)
# List of programs and scripts to run in the test suite
TESTS = testGreetings
TESTS = testGreetings testReading.sh
# List of test programs to compile
check_PROGRAMS = testGreetings
# List of test programs to compile
check_PROGRAMS = testGreetings testReading
# Sources for the individual programs
testGreetings_SOURCES = testGreetings.c
testReading_SOURCES = testReading.c
###############################################################################
# This file is part of SWIFT.
# Coypright (c) 2015 Matthieu Schaller (matthieu.schaller@durham.ac.uk)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import h5py
from numpy import *
# Generates a swift IC file containing a cartesian distribution of particles
# at a constant density and pressure in a cubic box
# Parameters
periodic= 1 # 1 For periodic box
boxSize = 1.
L = 4 # Number of particles along one axis
rho = 2. # Density
P = 1. # Pressure
gamma = 5./3. # Gas adiabatic index
fileName = "input.hdf5"
#---------------------------------------------------
numPart = L**3
mass = boxSize**3 * rho / numPart
internalEnergy = P / ((gamma - 1.)*rho)
#Generate particles
coords = zeros((numPart, 3))
v = zeros((numPart, 3))
m = zeros((numPart, 1))
h = zeros((numPart, 1))
u = zeros((numPart, 1))
ids = zeros((numPart, 1), dtype='L')
for i in range(L):
for j in range(L):
for k in range(L):
index = i*L*L + j*L + k
x = i * boxSize / L + boxSize / (2*L)
y = j * boxSize / L + boxSize / (2*L)
z = k * boxSize / L + boxSize / (2*L)
coords[index,0] = x
coords[index,1] = y
coords[index,2] = z
v[index,0] = 0.
v[index,1] = 0.
v[index,2] = 0.
m[index] = mass
h[index] = 2.251 * boxSize / L
u[index] = internalEnergy
ids[index] = index
#--------------------------------------------------
#File
file = h5py.File(fileName, 'w')
# Header
grp = file.create_group("/Header")
grp.attrs["BoxSize"] = boxSize
grp.attrs["NumPart_Total"] = [numPart, 0, 0, 0, 0, 0]
grp.attrs["NumPart_Total_HighWord"] = [0, 0, 0, 0, 0, 0]
grp.attrs["NumPart_ThisFile"] = [numPart, 0, 0, 0, 0, 0]
grp.attrs["Time"] = 0.0
grp.attrs["NumFilesPerSnapshot"] = 1
grp.attrs["MassTable"] = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
grp.attrs["Flag_Entropy_ICs"] = [0, 0, 0, 0, 0, 0]
#Runtime parameters
grp = file.create_group("/RuntimePars")
grp.attrs["PeriodicBoundariesOn"] = periodic
#Particle group
grp = file.create_group("/PartType0")
ds = grp.create_dataset('Coordinates', (numPart, 3), 'd')
ds[()] = coords
ds = grp.create_dataset('Velocities', (numPart, 3), 'f')
ds[()] = v
ds = grp.create_dataset('Masses', (numPart,1), 'f')
ds[()] = m
ds = grp.create_dataset('SmoothingLength', (numPart,1), 'f')
ds[()] = h
ds = grp.create_dataset('InternalEnergy', (numPart,1), 'f')
ds[()] = u
ds = grp.create_dataset('ParticleIDs', (numPart, 1), 'L')
ds[()] = ids
file.close()
/*******************************************************************************
* This file is part of SWIFT.
* Copyright (C) 2015 Matthieu Schaller (matthieu.schaller@durham.ac.uk).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
******************************************************************************/
#include "swift.h"
#include <stdlib.h>
int main() {
int N = -1, periodic = -1;
int i, j, k, n;
double dim[3];
struct part *parts = NULL;
/* Properties of the ICs */
const double boxSize = 1.;
const int L = 4;
const double rho = 2.;
const double P = 1.;
const double gamma = 5. / 3.;
/* Read data */
read_ic_single("input.hdf5", dim, &parts, &N, &periodic);
/* Check global properties read are correct */
assert(dim[0] == boxSize);
assert(dim[1] == boxSize);
assert(dim[2] == boxSize);
assert(N == L * L * L);
assert(periodic == 1);
/* Check particles */
for (n = 0; n < N; ++n) {
/* Check that indices are in a reasonable range */
unsigned long long index = parts[n].id;
assert(index < N);
/* Check masses */
float mass = parts[n].mass;
float correct_mass = boxSize * boxSize * boxSize * rho / N;
assert(mass == correct_mass);
/* Check smoothing length */
float h = parts[n].h;
float correct_h = 2.251 * boxSize / L;
assert(h == correct_h);
/* Check internal energy */
float u = parts[n].u;
float correct_u = P / ((gamma - 1.) * rho);
assert(u == correct_u);
/* Check velocity */
assert(parts[n].v[0] == 0.);
assert(parts[n].v[1] == 0.);
assert(parts[n].v[2] == 0.);
/* Check positions */
k = index % 4;
j = ((index - k) / 4) % 4;
i = (index - k - 4 * j) / 16;
double correct_x = i * boxSize / L + boxSize / (2 * L);
double correct_y = j * boxSize / L + boxSize / (2 * L);
double correct_z = k * boxSize / L + boxSize / (2 * L);
assert(parts[n].x[0] == correct_x);
assert(parts[n].x[1] == correct_y);
assert(parts[n].x[2] == correct_z);
/* Check accelerations */
assert(parts[n].a[0] == 0.);
assert(parts[n].a[1] == 0.);
assert(parts[n].a[2] == 0.);
}
/* Clean-up */
free(parts);
return 0;
}
#!/bin/bash
python makeInput.py
./testReading
Supports Markdown
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