Skip to content
Snippets Groups Projects
Commit be507607 authored by Matthieu Schaller's avatar Matthieu Schaller
Browse files

Writing arrays also uses the new scheme

parent 222bf7c8
Branches
Tags
1 merge request!194Io unit conversion
......@@ -543,8 +543,9 @@ void writeXMFgroupfooter(FILE* xmfFile, enum PARTICLE_TYPE ptype) {
*
* @todo Treat the types in a better way.
*/
void writeXMFline(FILE* xmfFile, char* fileName, char* partTypeGroupName,
char* name, size_t N, int dim, enum DATA_TYPE type) {
void writeXMFline(FILE* xmfFile, const char* fileName,
const char* partTypeGroupName, const char* name, size_t N,
int dim, enum DATA_TYPE type) {
fprintf(xmfFile,
"<Attribute Name=\"%s\" AttributeType=\"%s\" Center=\"Node\">\n",
name, dim == 1 ? "Scalar" : "Vector");
......
......@@ -94,8 +94,9 @@ void writeXMFoutputfooter(FILE* xmfFile, int outputCount, float time);
void writeXMFgroupheader(FILE* xmfFile, char* hdfFileName, size_t N,
enum PARTICLE_TYPE ptype);
void writeXMFgroupfooter(FILE* xmfFile, enum PARTICLE_TYPE ptype);
void writeXMFline(FILE* xmfFile, char* fileName, char* partTypeGroupName,
char* name, size_t N, int dim, enum DATA_TYPE type);
void writeXMFline(FILE* xmfFile, const char* fileName,
const char* partTypeGroupName, const char* name, size_t N,
int dim, enum DATA_TYPE type);
void writeCodeDescription(hid_t h_file);
......
......@@ -17,6 +17,8 @@
*
******************************************************************************/
#include "io_properties.h"
/**
* @brief Read dark matter particles from HDF5.
*
......@@ -45,24 +47,6 @@ void darkmatter_read_particles(struct gpart* gparts, struct io_props* list,
gparts, mass);
list[3] = io_make_input_field("ParticleIDs", ULONGLONG, 1, COMPULSORY,
UNIT_CONV_NO_UNITS, gparts, id_or_neg_offset);
/* Read arrays */
/* readArray(h_grp, "Coordinates", DOUBLE, N, 3, gparts, N_total, offset, x,
*/
/* COMPULSORY, internal_units, ic_units, UNIT_CONV_LENGTH); */
/* readArray(h_grp, "Masses", FLOAT, N, 1, gparts, N_total, offset, mass, */
/* COMPULSORY, internal_units, ic_units, UNIT_CONV_MASS); */
/* readArray(h_grp, "Velocities", FLOAT, N, 3, gparts, N_total, offset,
* v_full, */
/* COMPULSORY, internal_units, ic_units, UNIT_CONV_SPEED); */
/* readArray(h_grp, "ParticleIDs", ULONGLONG, N, 1, gparts, N_total, offset,
* id, */
/* COMPULSORY, internal_units, ic_units, UNIT_CONV_NO_UNITS); */
/* And read everything */
/* for (int i = 0; i < num_fields; ++i) */
/* readArray(h_grp, list[i], N, N_total, offset, internal_units, ic_units);
*/
}
/**
......@@ -90,17 +74,21 @@ __attribute__((always_inline)) INLINE static void darkmatter_write_particles(
const struct UnitSystem* snapshot_units) {
/* Write arrays */
writeArray(h_grp, fileName, xmfFile, partTypeGroupName, "Coordinates", DOUBLE,
Ndm, 3, gparts, Ndm_total, mpi_rank, offset, x, internal_units,
snapshot_units, UNIT_CONV_LENGTH);
writeArray(h_grp, fileName, xmfFile, partTypeGroupName, "Masses", FLOAT, Ndm,
1, gparts, Ndm_total, mpi_rank, offset, mass, internal_units,
snapshot_units, UNIT_CONV_MASS);
writeArray(h_grp, fileName, xmfFile, partTypeGroupName, "Velocities", FLOAT,
Ndm, 3, gparts, Ndm_total, mpi_rank, offset, v_full,
internal_units, snapshot_units, UNIT_CONV_SPEED);
writeArray(h_grp, fileName, xmfFile, partTypeGroupName, "ParticleIDs",
ULONGLONG, Ndm, 1, gparts, Ndm_total, mpi_rank, offset,
id_or_neg_offset, internal_units, snapshot_units,
UNIT_CONV_NO_UNITS);
/* writeArray(h_grp, fileName, xmfFile, partTypeGroupName, "Coordinates",
* DOUBLE, */
/* Ndm, 3, gparts, Ndm_total, mpi_rank, offset, x, internal_units,
*/
/* snapshot_units, UNIT_CONV_LENGTH); */
/* writeArray(h_grp, fileName, xmfFile, partTypeGroupName, "Masses", FLOAT,
* Ndm, */
/* 1, gparts, Ndm_total, mpi_rank, offset, mass, internal_units, */
/* snapshot_units, UNIT_CONV_MASS); */
/* writeArray(h_grp, fileName, xmfFile, partTypeGroupName, "Velocities",
* FLOAT, */
/* Ndm, 3, gparts, Ndm_total, mpi_rank, offset, v_full, */
/* internal_units, snapshot_units, UNIT_CONV_SPEED); */
/* writeArray(h_grp, fileName, xmfFile, partTypeGroupName, "ParticleIDs", */
/* ULONGLONG, Ndm, 1, gparts, Ndm_total, mpi_rank, offset, */
/* id_or_neg_offset, internal_units, snapshot_units, */
/* UNIT_CONV_NO_UNITS); */
}
......@@ -17,18 +17,15 @@
*
******************************************************************************/
#include "io_properties.h"
#include "kernel_hydro.h"
/**
* @brief Reads the different particles to the HDF5 file
*
* @param h_grp The HDF5 group in which to read the arrays.
* @param N The number of particles on that MPI rank.
* @param N_total The total number of particles (only used in MPI mode)
* @param offset The offset of the particles for this MPI rank (only used in MPI
* mode)
* @param parts The particle array
* @param internal_units The #UnitSystem used internally
* @param ic_units The #UnitSystem used in the snapshots
* @brief Specifies which particle fields to read from a dataset
*
* @param parts The particle array.
* @param list The list of i/o properties to read.
* @param num_fields The number of i/o fields to read.
*/
void hydro_read_particles(struct part* parts, struct io_props* list,
int* num_fields) {
......@@ -72,11 +69,14 @@ void hydro_read_particles(struct part* parts, struct io_props* list,
* @param snapshot_units The #UnitSystem used in the snapshots
*
*/
__attribute__((always_inline)) INLINE static void hydro_write_particles(
hid_t h_grp, char* fileName, char* partTypeGroupName, FILE* xmfFile, int N,
long long N_total, int mpi_rank, long long offset, struct part* parts,
const struct UnitSystem* internal_units,
const struct UnitSystem* snapshot_units) {
void hydro_write_particles(struct part* parts, struct io_props* list,
int* num_fields) {
*num_fields = 1;
/* List what we want to read */
list[0] = io_make_output_field("Coordinates", DOUBLE, 3, UNIT_CONV_LENGTH,
parts, x);
/* Write arrays */
/* writeArray(h_grp, fileName, xmfFile, partTypeGroupName, "Coordinates",
......
......@@ -63,7 +63,6 @@ struct io_props {
io_make_input_field_(name, type, dim, importance, units, \
(char*)(&(part[0]).field), sizeof(part[0]))
/**
* @brief Construct an #io_props from its parameters
*
......@@ -94,14 +93,12 @@ struct io_props io_make_input_field_(char name[FIELD_BUFFER_SIZE],
return r;
}
/**
* @brief Constructs an #io_props from its parameters
*/
#define io_make_output_field(name, type, dim, units, part, field) \
io_make_output_field_(name, type, dim, units, \
(char*)(&(part[0]).field), sizeof(part[0]))
#define io_make_output_field(name, type, dim, units, part, field) \
io_make_output_field_(name, type, dim, units, (char*)(&(part[0]).field), \
sizeof(part[0]))
/**
* @brief Construct an #io_props from its parameters
......@@ -116,9 +113,9 @@ struct io_props io_make_input_field_(char name[FIELD_BUFFER_SIZE],
* Do not call this function directly. Use the macro defined above.
*/
struct io_props io_make_output_field_(char name[FIELD_BUFFER_SIZE],
enum DATA_TYPE type, int dimension,
enum UnitConversionFactor units,
char* field, size_t partSize) {
enum DATA_TYPE type, int dimension,
enum UnitConversionFactor units,
char* field, size_t partSize) {
struct io_props r;
strcpy(r.name, name);
r.type = type;
......@@ -131,6 +128,4 @@ struct io_props io_make_output_field_(char name[FIELD_BUFFER_SIZE],
return r;
}
#endif /* SWIFT_IO_PROPERTIES_H */
......@@ -38,6 +38,8 @@
#include "common_io.h"
#include "engine.h"
#include "error.h"
#include "gravity_io.h"
#include "hydro_io.h"
#include "io_properties.h"
#include "kernel_hydro.h"
#include "part.h"
......@@ -170,36 +172,34 @@ void readArray(hid_t h_grp, const struct io_props prop, size_t N,
*the part array
* will be written once the structures have been stabilized.
*/
void writeArrayBackEnd(hid_t grp, char* fileName, FILE* xmfFile,
char* partTypeGroupName, char* name, enum DATA_TYPE type,
int N, int dim, char* part_c, size_t partSize,
const struct UnitSystem* internal_units,
const struct UnitSystem* snapshot_units,
enum UnitConversionFactor convFactor) {
void writeArray(hid_t grp, char* fileName, FILE* xmfFile,
char* partTypeGroupName, const struct io_props props, size_t N,
const struct UnitSystem* internal_units,
const struct UnitSystem* snapshot_units) {
const size_t typeSize = sizeOfType(type);
const size_t copySize = typeSize * dim;
const size_t num_elements = N * dim;
const size_t typeSize = sizeOfType(props.type);
const size_t copySize = typeSize * props.dimension;
const size_t num_elements = N * props.dimension;
/* message("Writing '%s' array...", name); */
/* message("Writing '%s' array...", props.name); */
/* Allocate temporary buffer */
void* temp = malloc(N * dim * sizeOfType(type));
void* temp = malloc(num_elements * sizeOfType(props.type));
if (temp == NULL) error("Unable to allocate memory for temporary buffer");
/* Copy particle data to temporary buffer */
char* temp_c = temp;
for (int i = 0; i < N; ++i)
memcpy(&temp_c[i * copySize], part_c + i * partSize, copySize);
memcpy(&temp_c[i * copySize], props.field + i * props.partSize, copySize);
/* Unit conversion if necessary */
const double factor =
units_conversion_factor(internal_units, snapshot_units, convFactor);
units_conversion_factor(internal_units, snapshot_units, props.units);
if (factor != 1.) {
message("aaa");
if (isDoublePrecision(type)) {
if (isDoublePrecision(props.type)) {
double* temp_d = temp;
for (int i = 0; i < num_elements; ++i) temp_d[i] *= factor;
} else {
......@@ -214,15 +214,15 @@ void writeArrayBackEnd(hid_t grp, char* fileName, FILE* xmfFile,
hsize_t shape[2];
hsize_t chunk_shape[2];
if (h_space < 0) {
error("Error while creating data space for field '%s'.", name);
error("Error while creating data space for field '%s'.", props.name);
}
if (dim > 1) {
if (props.dimension > 1) {
rank = 2;
shape[0] = N;
shape[1] = dim;
shape[1] = props.dimension;
chunk_shape[0] = 1 << 16; /* Just a guess...*/
chunk_shape[1] = dim;
chunk_shape[1] = props.dimension;
} else {
rank = 1;
shape[0] = N;
......@@ -237,7 +237,7 @@ void writeArrayBackEnd(hid_t grp, char* fileName, FILE* xmfFile,
/* Change shape of data space */
hid_t h_err = H5Sset_extent_simple(h_space, rank, shape, NULL);
if (h_err < 0) {
error("Error while changing data space shape for field '%s'.", name);
error("Error while changing data space shape for field '%s'.", props.name);
}
/* Dataset properties */
......@@ -247,40 +247,43 @@ void writeArrayBackEnd(hid_t grp, char* fileName, FILE* xmfFile,
h_err = H5Pset_chunk(h_prop, rank, chunk_shape);
if (h_err < 0) {
error("Error while setting chunk size (%lld, %lld) for field '%s'.",
chunk_shape[0], chunk_shape[1], name);
chunk_shape[0], chunk_shape[1], props.name);
}
/* Impose data compression */
h_err = H5Pset_deflate(h_prop, 4);
if (h_err < 0) {
error("Error while setting compression options for field '%s'.", name);
error("Error while setting compression options for field '%s'.",
props.name);
}
/* Create dataset */
const hid_t h_data = H5Dcreate(grp, name, hdf5Type(type), h_space,
const hid_t h_data = H5Dcreate(grp, props.name, hdf5Type(props.type), h_space,
H5P_DEFAULT, h_prop, H5P_DEFAULT);
if (h_data < 0) {
error("Error while creating dataspace '%s'.", name);
error("Error while creating dataspace '%s'.", props.name);
}
/* Write temporary buffer to HDF5 dataspace */
h_err = H5Dwrite(h_data, hdf5Type(type), h_space, H5S_ALL, H5P_DEFAULT, temp);
h_err = H5Dwrite(h_data, hdf5Type(props.type), h_space, H5S_ALL, H5P_DEFAULT,
temp);
if (h_err < 0) {
error("Error while writing data array '%s'.", name);
error("Error while writing data array '%s'.", props.name);
}
/* Write XMF description for this data set */
writeXMFline(xmfFile, fileName, partTypeGroupName, name, N, dim, type);
writeXMFline(xmfFile, fileName, partTypeGroupName, props.name, N,
props.dimension, props.type);
/* Write unit conversion factors for this data set */
char buffer[FIELD_BUFFER_SIZE];
units_cgs_conversion_string(buffer, snapshot_units, convFactor);
units_cgs_conversion_string(buffer, snapshot_units, props.units);
writeAttribute_d(h_data, "CGS conversion factor",
units_cgs_conversion_factor(snapshot_units, convFactor));
units_cgs_conversion_factor(snapshot_units, props.units));
writeAttribute_f(h_data, "h-scale exponent",
units_h_factor(snapshot_units, convFactor));
units_h_factor(snapshot_units, props.units));
writeAttribute_f(h_data, "a-scale exponent",
units_a_factor(snapshot_units, convFactor));
units_a_factor(snapshot_units, props.units));
writeAttribute_s(h_data, "Conversion factor", buffer);
/* Free and close everything */
......@@ -290,41 +293,6 @@ void writeArrayBackEnd(hid_t grp, char* fileName, FILE* xmfFile,
H5Sclose(h_space);
}
/**
* @brief A helper macro to call the readArrayBackEnd function more easily.
*
* @param grp The group in which to write.
* @param fileName The name of the file in which the data is written
* @param xmfFile The FILE used to write the XMF description
* @param name The name of the array to write.
* @param partTypeGroupName The name of the group containing the particles in
*the HDF5 file.
* @param type The #DATA_TYPE of the array.
* @param N The number of particles to write.
* @param dim The dimension of the data (1 for scalar, 3 for vector)
* @param part A (char*) pointer on the first occurrence of the field of
* interest in the parts array
* @param N_total Unused parameter in non-MPI mode
* @param mpi_rank Unused parameter in non-MPI mode
* @param offset Unused parameter in non-MPI mode
* @param field The name (code name) of the field to read from.
* @param internal_units The #UnitSystem used internally
* @param snapshot_units The #UnitSystem used in the snapshots
* @param convFactor The UnitConversionFactor for this array
*
*/
#define writeArray(grp, fileName, xmfFile, partTypeGroupName, name, type, N, \
dim, part, N_total, mpi_rank, offset, field, \
internal_units, snapshot_units, convFactor) \
writeArrayBackEnd(grp, fileName, xmfFile, partTypeGroupName, name, type, N, \
dim, (char*)(&(part[0]).field), sizeof(part[0]), \
internal_units, snapshot_units, convFactor)
/* Import the right hydro definition */
#include "hydro_io.h"
/* Import the right gravity definition */
#include "gravity_io.h"
/**
* @brief Reads an HDF5 initial condition file (GADGET-3 type)
*
......@@ -663,15 +631,16 @@ void write_output_single(struct engine* e, const char* baseName,
error("Error while creating particle group.\n");
}
/* message("Writing particle arrays..."); */
int num_fields = 0;
struct io_props list[100];
size_t N;
/* Write particle fields from the particle structure */
switch (ptype) {
case GAS:
hydro_write_particles(h_grp, fileName, partTypeGroupName, xmfFile, Ngas,
Ngas, 0, 0, parts, internal_units,
snapshot_units);
N = Ngas;
hydro_write_particles(parts, list, &num_fields);
break;
case DM:
......@@ -684,19 +653,24 @@ void write_output_single(struct engine* e, const char* baseName,
/* Collect the DM particles from gpart */
collect_dm_gparts(gparts, Ntot, dmparts, Ndm);
/* Write DM particles */
darkmatter_write_particles(h_grp, fileName, partTypeGroupName, xmfFile,
Ndm, Ndm, 0, 0, dmparts, internal_units,
snapshot_units);
/* Free temporary array */
free(dmparts);
break;
/* /\* Write DM particles *\/ */
/* darkmatter_write_particles(h_grp, fileName, partTypeGroupName, xmfFile,
*/
/* Ndm, Ndm, 0, 0, dmparts, internal_units, */
/* snapshot_units); */
default:
error("Particle Type %d not yet supported. Aborting", ptype);
}
/* Write everything */
for (int i = 0; i < num_fields; ++i)
writeArray(h_grp, fileName, xmfFile, partTypeGroupName, list[i], N,
internal_units, snapshot_units);
/* Free temporary array */
free(dmparts);
/* Close particle group */
H5Gclose(h_grp);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment