diff --git a/src/Makefile.am b/src/Makefile.am index 32741b0ebb489c64759fb76eba40163d76772e9b..53fc189f38d20616bdc75a8ef8a2abcf49e8c87e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -32,7 +32,7 @@ AM_LDFLAGS = $(LAPACK_LIBS) $(BLAS_LIBS) $(HDF5_LDFLAGS) -version-info 0:0:0 # Build the libswiftsim library lib_LTLIBRARIES = libswiftsim.la libswiftsim_la_SOURCES = space.c runner.c queue.c task.c cell.c engine.c \ - input.c output.c timers.c debug.c + io.c timers.c debug.c # List required headers include_HEADERS = space.h runner.h queue.h task.h lock.h cell.h part.h const.h \ diff --git a/src/input.c b/src/input.c deleted file mode 100644 index 06bb88dec9a0bec4811adf3af9ee57314bffa3b6..0000000000000000000000000000000000000000 --- a/src/input.c +++ /dev/null @@ -1,291 +0,0 @@ -/******************************************************************************* - * This file is part of SWIFT. - * Coypright (c) 2012 Pedro Gonnet (pedro.gonnet@durham.ac.uk), - * 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/>. - * - ******************************************************************************/ - -/* Config parameters. */ -#include "../config.h" - -#ifdef HAVE_HDF5 - - -/* Some standard headers. */ -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <stddef.h> -#include <hdf5.h> - - -#include "lock.h" -#include "task.h" -#include "part.h" -#include "space.h" -#include "io_types.h" - - -/** - * @brief Reads an attribute from a given HDF5 group. - * - * @param grp The group from which to read. - * @param name The name of the attribute to read. - * @param type The #DATA_TYPE of the attribute. - * @param data (output) The attribute read from the HDF5 group. - * - * Calls #error() if an error occurs. - */ -void readAttribute(hid_t grp, char* name, enum DATA_TYPE type, void* data) -{ - hid_t h_attr=0, h_err=0; - - h_attr = H5Aopen(grp, name, H5P_DEFAULT); - if(h_attr < 0) - { - char buf[100]; - sprintf(buf, "Error while opening attribute '%s'\n", name); - error(buf); - } - - h_err = H5Aread(h_attr, hdf5Type(type), data); - if(h_err < 0) - { - char buf[100]; - sprintf(buf, "Error while reading attribute '%s'\n", name); - error(buf); - } - - H5Aclose(h_attr); -} - - -/** - * @brief Reads a data array from a given HDF5 group. - * - * @param grp The group from which to read. - * @param name The name of the array to read. - * @param type The #DATA_TYPE of the attribute. - * @param N The number of particles. - * @param dim The dimension of the data (1 for scalar, 3 for vector) - * @param part_c A (char*) pointer on the first occurence of the field of interest in the parts array - * @param importance If COMPULSORY, the data must be present in the IC file. If OPTIONAL, the array will be zeroed when the data is not present. - * - * @todo A better version using HDF5 hyperslabs to read the file directly into the part array - * will be written once the strucutres have been stabilized. - * - * Calls #error() if an error occurs. - */ -void readArrayBackEnd(hid_t grp, char* name, enum DATA_TYPE type, int N, int dim, char* part_c, enum DATA_IMPORTANCE importance) -{ - hid_t h_data=0, h_err=0, h_type=0; - htri_t exist=0; - void* temp; - int i=0; - const size_t typeSize = sizeOfType(type); - const size_t copySize = typeSize * dim; - const size_t partSize = sizeof(struct part); - char* temp_c = 0; - - /* Check whether the dataspace exists or not */ - exist = H5Lexists(grp, name, 0); - if(exist < 0) - { - char buf[100]; - sprintf(buf, "Error while checking the existence of data set '%s'\n", name); - error(buf); - } - else if(exist == 0) - { - if(importance == COMPULSORY) - { - char buf[100]; - sprintf(buf, "Compulsory data set '%s' not present in the file.\n", name); - error(buf); - } - else - { - /* printf("readArray: Optional data set '%s' not present. Zeroing this particle field...\n", name); */ - - for(i=0; i<N; ++i) - memset(part_c+i*partSize, 0, copySize); - - return; - } - } - - /* printf("readArray: Reading %s '%s' array...\n", importance == COMPULSORY ? "compulsory": "optional ", name); */ - - /* Open data space */ - h_data = H5Dopen1(grp, name); - if(h_data < 0) - { - char buf[100]; - sprintf(buf, "Error while opening data space '%s'\n", name); - error(buf); - } - - /* 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"); - - /* Allocate temporary buffer */ - temp = malloc(N * dim * sizeOfType(type)); - if(temp == NULL) - error("Unable to allocate memory for temporary buffer"); - - /* Read HDF5 dataspace in temporary buffer */ - /* Dirty version that happens to work for vectors but should be improved */ - /* Using HDF5 dataspaces would be better */ - h_err = H5Dread(h_data, hdf5Type(type), H5S_ALL, H5S_ALL, H5P_DEFAULT, temp); - if(h_err < 0) - { - char buf[100]; - sprintf(buf, "Error while reading data array '%s'\n", name); - error(buf); - } - - /* Copy temporary buffer to particle data */ - temp_c = temp; - for(i=0; i<N; ++i) - memcpy(part_c+i*partSize, &temp_c[i*copySize], copySize); - - /* Free and close everything */ - free(temp); - H5Tclose(h_type); - H5Dclose(h_data); -} - -/** - * @brief A helper macro to call the readArrayBackEnd function more easily. - * - * @param grp The group from which to read. - * @param name The name of the array to read. - * @param type The #DATA_TYPE of the attribute. - * @param N The number of particles. - * @param dim The dimension of the data (1 for scalar, 3 for vector) - * @param part The array of particles to fill - * @param field The name of the field (C code name as defined in part.h) to fill - * @param importance Is the data compulsory or not - * - */ -#define readArray(grp, name, type, N, dim, part, field, importance) readArrayBackEnd(grp, name, type, N, dim, (char*)(&(part[0]).field), importance) - -/** - * @brief Reads an HDF5 initial condition file (GADGET-3 type) - * - * @param fileName The file to read. - * @param dim (output) The dimension of the volume read from the file. - * @param parts (output) The array of #part read from the file. - * @param N (output) The number of particles read from the file. - * @param periodic (output) 1 if the volume is periodic, 0 if not. - * - * Opens the HDF5 file fileName and reads the particles contained - * in the parts array. N is the returned number of particles found - * in the file. - * - * @warning Can not read snapshot distributed over more than 1 file !!! - * @todo Read snaphsots distributed in more than one file. - * - * Calls #error() if an error occurs. - * - */ -void read_ic ( char* fileName, double dim[3], struct part **parts, int* N, int* periodic) -{ - hid_t h_file=0, h_grp=0; - double boxSize=0.; /* GADGET has only cubic boxes (in cosmological mode) */ - int numParticles[6]={0}; /* GADGET has 6 particle types. We only keep the type 0*/ - - /* Open file */ - /* printf("read_ic: Opening file '%s' as IC.\n", fileName); */ - h_file = H5Fopen(fileName, H5F_ACC_RDONLY, H5P_DEFAULT); - if(h_file < 0) - { - char buf[200]; - sprintf(buf, "Error while opening file '%s'", fileName); - error(buf); - } - - /* Open header to read simulation properties */ - /* printf("read_ic: Reading runtime parameters...\n"); */ - h_grp = H5Gopen1(h_file, "/RuntimePars"); - if(h_grp < 0) - error("Error while opening runtime parameters\n"); - - /* Read the relevant information */ - readAttribute(h_grp, "PeriodicBoundariesOn", INT, periodic); - - /* Close runtime parameters */ - H5Gclose(h_grp); - - /* Open header to read simulation properties */ - /* printf("read_ic: Reading file header...\n"); */ - h_grp = H5Gopen1(h_file, "/Header"); - if(h_grp < 0) - error("Error while opening file header\n"); - - /* Read the relevant information and print status */ - readAttribute(h_grp, "BoxSize", DOUBLE, &boxSize); - readAttribute(h_grp, "NumPart_Total", UINT, numParticles); - - *N = numParticles[0]; - dim[0] = dim[1] = dim[2] = boxSize; - - /* printf("read_ic: Found %d particles in a %speriodic box of size [%f %f %f]\n", */ - /* *N, (periodic ? "": "non-"), dim[0], dim[1], dim[2]); */ - - /* Close header */ - H5Gclose(h_grp); - - /* Allocate memory to store particles */ - if(posix_memalign( (void*)parts , 32 , *N * sizeof(struct part)) != 0) - error("Error while allocating memory for particles"); - bzero( *parts , *N * sizeof(struct part) ); - - /* printf("read_ic: Allocated %8.2f MB for particles.\n", *N * sizeof(struct part) / (1024.*1024.)); */ - - /* Open SPH particles group */ - /* printf("read_ic: Reading particle arrays...\n"); */ - h_grp = H5Gopen1(h_file, "/PartType0"); - if(h_grp < 0) - error( "Error while opening particle group.\n"); - - /* Read arrays */ - readArray(h_grp, "Coordinates", DOUBLE, *N, 3, *parts, x, COMPULSORY); - readArray(h_grp, "Velocity", FLOAT, *N, 3, *parts, v, COMPULSORY); - readArray(h_grp, "Mass", FLOAT, *N, 1, *parts, mass, COMPULSORY); - readArray(h_grp, "SmoothingLength", FLOAT, *N, 1, *parts, h, COMPULSORY); - readArray(h_grp, "InternalEnergy", FLOAT, *N, 1, *parts, u, COMPULSORY); - readArray(h_grp, "ParticleIDs", ULONGLONG, *N, 1, *parts, id, COMPULSORY); - readArray(h_grp, "TimeStep", FLOAT, *N, 1, *parts, dt, OPTIONAL); - readArray(h_grp, "Acceleration", FLOAT, *N, 3, *parts, a, OPTIONAL); - readArray(h_grp, "Density", FLOAT, *N, 1, *parts, rho, OPTIONAL ); - - /* Close particle group */ - H5Gclose(h_grp); - - /* printf("read_ic: Done Reading particles...\n"); */ - - /* Close file */ - H5Fclose(h_file); -} - -#endif /* HAVE_HDF5 */ - - diff --git a/src/output.c b/src/io.c similarity index 55% rename from src/output.c rename to src/io.c index 4c80175f9b2f9c8f6f1865694c6b9fe5b4c02aae..62639b5a06fcfac0d64d1d1828c01f06827ce38d 100644 --- a/src/output.c +++ b/src/io.c @@ -36,7 +36,323 @@ #include "task.h" #include "part.h" #include "space.h" -#include "io_types.h" + +/** + * @brief Error macro + * + */ +#define error(s) { fprintf( stderr , "%s:%s():%i: %s\n" , __FILE__ , __FUNCTION__ , __LINE__ , s ); abort(); } + +/** + * @brief The different types of data used in the GADGET IC files. + * + * (This is admittedly a poor substitute to C++ templates...) + */ +enum DATA_TYPE{INT, LONG, LONGLONG, UINT, ULONG, ULONGLONG, FLOAT, DOUBLE}; + +/** + * @brief The two sorts of data present in the GADGET IC files: compulsory to start a run or optional. + * + */ +enum DATA_IMPORTANCE{COMPULSORY=1, OPTIONAL=0}; + +/** + * @brief Converts a C data type to the HDF5 equivalent. + * + * This function is a trivial wrapper around the HDF5 types but allows + * to change the exact storage types matching the code types in a transparent way. + */ +static hid_t hdf5Type(enum DATA_TYPE type) +{ + switch(type) + { + case INT: return H5T_NATIVE_INT; + case UINT: return H5T_NATIVE_UINT; + case LONG: return H5T_NATIVE_LONG; + case ULONG: return H5T_NATIVE_ULONG; + case LONGLONG: return H5T_NATIVE_LLONG; + case ULONGLONG: return H5T_NATIVE_ULLONG; + case FLOAT: return H5T_NATIVE_FLOAT; + case DOUBLE: return H5T_NATIVE_DOUBLE; + default: error("Unknown type"); + } +} + +/** + * @brief Returns the memory size of the data type + */ +static size_t sizeOfType(enum DATA_TYPE type) +{ + switch(type) + { + case INT: return sizeof(int); + case UINT: return sizeof(unsigned int); + case LONG: return sizeof(long); + case ULONG: return sizeof(unsigned long); + case LONGLONG: return sizeof(long long); + case ULONGLONG: return sizeof(unsigned long long); + case FLOAT: return sizeof(float); + case DOUBLE: return sizeof(double); + default: error("Unknown type"); + } +} + +/*----------------------------------------------------------------------------- + * Routines reading an IC file + *-----------------------------------------------------------------------------*/ + + +/** + * @brief Reads an attribute from a given HDF5 group. + * + * @param grp The group from which to read. + * @param name The name of the attribute to read. + * @param type The #DATA_TYPE of the attribute. + * @param data (output) The attribute read from the HDF5 group. + * + * Calls #error() if an error occurs. + */ +void readAttribute(hid_t grp, char* name, enum DATA_TYPE type, void* data) +{ + hid_t h_attr=0, h_err=0; + + h_attr = H5Aopen(grp, name, H5P_DEFAULT); + if(h_attr < 0) + { + char buf[100]; + sprintf(buf, "Error while opening attribute '%s'\n", name); + error(buf); + } + + h_err = H5Aread(h_attr, hdf5Type(type), data); + if(h_err < 0) + { + char buf[100]; + sprintf(buf, "Error while reading attribute '%s'\n", name); + error(buf); + } + + H5Aclose(h_attr); +} + + +/** + * @brief Reads a data array from a given HDF5 group. + * + * @param grp The group from which to read. + * @param name The name of the array to read. + * @param type The #DATA_TYPE of the attribute. + * @param N The number of particles. + * @param dim The dimension of the data (1 for scalar, 3 for vector) + * @param part_c A (char*) pointer on the first occurence of the field of interest in the parts array + * @param importance If COMPULSORY, the data must be present in the IC file. If OPTIONAL, the array will be zeroed when the data is not present. + * + * @todo A better version using HDF5 hyperslabs to read the file directly into the part array + * will be written once the strucutres have been stabilized. + * + * Calls #error() if an error occurs. + */ +void readArrayBackEnd(hid_t grp, char* name, enum DATA_TYPE type, int N, int dim, char* part_c, enum DATA_IMPORTANCE importance) +{ + hid_t h_data=0, h_err=0, h_type=0; + htri_t exist=0; + void* temp; + int i=0; + const size_t typeSize = sizeOfType(type); + const size_t copySize = typeSize * dim; + const size_t partSize = sizeof(struct part); + char* temp_c = 0; + + /* Check whether the dataspace exists or not */ + exist = H5Lexists(grp, name, 0); + if(exist < 0) + { + char buf[100]; + sprintf(buf, "Error while checking the existence of data set '%s'\n", name); + error(buf); + } + else if(exist == 0) + { + if(importance == COMPULSORY) + { + char buf[100]; + sprintf(buf, "Compulsory data set '%s' not present in the file.\n", name); + error(buf); + } + else + { + /* printf("readArray: Optional data set '%s' not present. Zeroing this particle field...\n", name); */ + + for(i=0; i<N; ++i) + memset(part_c+i*partSize, 0, copySize); + + return; + } + } + + /* printf("readArray: Reading %s '%s' array...\n", importance == COMPULSORY ? "compulsory": "optional ", name); */ + + /* Open data space */ + h_data = H5Dopen1(grp, name); + if(h_data < 0) + { + char buf[100]; + sprintf(buf, "Error while opening data space '%s'\n", name); + error(buf); + } + + /* 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"); + + /* Allocate temporary buffer */ + temp = malloc(N * dim * sizeOfType(type)); + if(temp == NULL) + error("Unable to allocate memory for temporary buffer"); + + /* Read HDF5 dataspace in temporary buffer */ + /* Dirty version that happens to work for vectors but should be improved */ + /* Using HDF5 dataspaces would be better */ + h_err = H5Dread(h_data, hdf5Type(type), H5S_ALL, H5S_ALL, H5P_DEFAULT, temp); + if(h_err < 0) + { + char buf[100]; + sprintf(buf, "Error while reading data array '%s'\n", name); + error(buf); + } + + /* Copy temporary buffer to particle data */ + temp_c = temp; + for(i=0; i<N; ++i) + memcpy(part_c+i*partSize, &temp_c[i*copySize], copySize); + + /* Free and close everything */ + free(temp); + H5Tclose(h_type); + H5Dclose(h_data); +} + +/** + * @brief A helper macro to call the readArrayBackEnd function more easily. + * + * @param grp The group from which to read. + * @param name The name of the array to read. + * @param type The #DATA_TYPE of the attribute. + * @param N The number of particles. + * @param dim The dimension of the data (1 for scalar, 3 for vector) + * @param part The array of particles to fill + * @param field The name of the field (C code name as defined in part.h) to fill + * @param importance Is the data compulsory or not + * + */ +#define readArray(grp, name, type, N, dim, part, field, importance) readArrayBackEnd(grp, name, type, N, dim, (char*)(&(part[0]).field), importance) + +/** + * @brief Reads an HDF5 initial condition file (GADGET-3 type) + * + * @param fileName The file to read. + * @param dim (output) The dimension of the volume read from the file. + * @param parts (output) The array of #part read from the file. + * @param N (output) The number of particles read from the file. + * @param periodic (output) 1 if the volume is periodic, 0 if not. + * + * Opens the HDF5 file fileName and reads the particles contained + * in the parts array. N is the returned number of particles found + * in the file. + * + * @warning Can not read snapshot distributed over more than 1 file !!! + * @todo Read snaphsots distributed in more than one file. + * + * Calls #error() if an error occurs. + * + */ +void read_ic ( char* fileName, double dim[3], struct part **parts, int* N, int* periodic) +{ + hid_t h_file=0, h_grp=0; + double boxSize=0.; /* GADGET has only cubic boxes (in cosmological mode) */ + int numParticles[6]={0}; /* GADGET has 6 particle types. We only keep the type 0*/ + + /* Open file */ + /* printf("read_ic: Opening file '%s' as IC.\n", fileName); */ + h_file = H5Fopen(fileName, H5F_ACC_RDONLY, H5P_DEFAULT); + if(h_file < 0) + { + char buf[200]; + sprintf(buf, "Error while opening file '%s'", fileName); + error(buf); + } + + /* Open header to read simulation properties */ + /* printf("read_ic: Reading runtime parameters...\n"); */ + h_grp = H5Gopen1(h_file, "/RuntimePars"); + if(h_grp < 0) + error("Error while opening runtime parameters\n"); + + /* Read the relevant information */ + readAttribute(h_grp, "PeriodicBoundariesOn", INT, periodic); + + /* Close runtime parameters */ + H5Gclose(h_grp); + + /* Open header to read simulation properties */ + /* printf("read_ic: Reading file header...\n"); */ + h_grp = H5Gopen1(h_file, "/Header"); + if(h_grp < 0) + error("Error while opening file header\n"); + + /* Read the relevant information and print status */ + readAttribute(h_grp, "BoxSize", DOUBLE, &boxSize); + readAttribute(h_grp, "NumPart_Total", UINT, numParticles); + + *N = numParticles[0]; + dim[0] = dim[1] = dim[2] = boxSize; + + /* printf("read_ic: Found %d particles in a %speriodic box of size [%f %f %f]\n", */ + /* *N, (periodic ? "": "non-"), dim[0], dim[1], dim[2]); */ + + /* Close header */ + H5Gclose(h_grp); + + /* Allocate memory to store particles */ + if(posix_memalign( (void*)parts , 32 , *N * sizeof(struct part)) != 0) + error("Error while allocating memory for particles"); + bzero( *parts , *N * sizeof(struct part) ); + + /* printf("read_ic: Allocated %8.2f MB for particles.\n", *N * sizeof(struct part) / (1024.*1024.)); */ + + /* Open SPH particles group */ + /* printf("read_ic: Reading particle arrays...\n"); */ + h_grp = H5Gopen1(h_file, "/PartType0"); + if(h_grp < 0) + error( "Error while opening particle group.\n"); + + /* Read arrays */ + readArray(h_grp, "Coordinates", DOUBLE, *N, 3, *parts, x, COMPULSORY); + readArray(h_grp, "Velocity", FLOAT, *N, 3, *parts, v, COMPULSORY); + readArray(h_grp, "Mass", FLOAT, *N, 1, *parts, mass, COMPULSORY); + readArray(h_grp, "SmoothingLength", FLOAT, *N, 1, *parts, h, COMPULSORY); + readArray(h_grp, "InternalEnergy", FLOAT, *N, 1, *parts, u, COMPULSORY); + readArray(h_grp, "ParticleIDs", ULONGLONG, *N, 1, *parts, id, COMPULSORY); + readArray(h_grp, "TimeStep", FLOAT, *N, 1, *parts, dt, OPTIONAL); + readArray(h_grp, "Acceleration", FLOAT, *N, 3, *parts, a, OPTIONAL); + readArray(h_grp, "Density", FLOAT, *N, 1, *parts, rho, OPTIONAL ); + + /* Close particle group */ + H5Gclose(h_grp); + + /* printf("read_ic: Done Reading particles...\n"); */ + + /* Close file */ + H5Fclose(h_file); +} + + +/*----------------------------------------------------------------------------- + * Routines writing an output file + *-----------------------------------------------------------------------------*/ /* File descriptor output routine */ @@ -379,7 +695,6 @@ void writeXMFfooter(FILE* xmfFile) fclose(xmfFile); } - #endif /* HAVE_HDF5 */ diff --git a/src/io_types.h b/src/io_types.h deleted file mode 100644 index 34b8e8e6a657faec142c24b048be9267c7ccfb6e..0000000000000000000000000000000000000000 --- a/src/io_types.h +++ /dev/null @@ -1,82 +0,0 @@ -/******************************************************************************* - * This file is part of SWIFT. - * Coypright (c) 2012 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 <hdf5.h> - -/** - * @brief Error macro - * - */ -#define error(s) { fprintf( stderr , "%s:%s():%i: %s\n" , __FILE__ , __FUNCTION__ , __LINE__ , s ); abort(); } - -/** - * @brief The different types of data used in the GADGET IC files. - * - * (This is admittedly a poor substitute to C++ templates...) - */ -enum DATA_TYPE{INT, LONG, LONGLONG, UINT, ULONG, ULONGLONG, FLOAT, DOUBLE}; - -/** - * @brief The two sorts of data present in the GADGET IC files: compulsory to start a run or optional. - * - */ -enum DATA_IMPORTANCE{COMPULSORY=1, OPTIONAL=0}; - -/** - * @brief Converts a C data type to the HDF5 equivalent. - * - * This function is a trivial wrapper around the HDF5 types but allows - * to change the exact storage types matching the code types in a transparent way. - */ -static hid_t hdf5Type(enum DATA_TYPE type) -{ - switch(type) - { - case INT: return H5T_NATIVE_INT; - case UINT: return H5T_NATIVE_UINT; - case LONG: return H5T_NATIVE_LONG; - case ULONG: return H5T_NATIVE_ULONG; - case LONGLONG: return H5T_NATIVE_LLONG; - case ULONGLONG: return H5T_NATIVE_ULLONG; - case FLOAT: return H5T_NATIVE_FLOAT; - case DOUBLE: return H5T_NATIVE_DOUBLE; - default: error("Unknown type"); - } -} - -/** - * @brief Returns the memory size of the data type - */ -static size_t sizeOfType(enum DATA_TYPE type) -{ - switch(type) - { - case INT: return sizeof(int); - case UINT: return sizeof(unsigned int); - case LONG: return sizeof(long); - case ULONG: return sizeof(unsigned long); - case LONGLONG: return sizeof(long long); - case ULONGLONG: return sizeof(unsigned long long); - case FLOAT: return sizeof(float); - case DOUBLE: return sizeof(double); - default: error("Unknown type"); - } -} - -