/******************************************************************************* * This file is part of SWIFT. * Copyright (c) 2012 Matthieu Schaller (schaller@strw.leidenuniv.nl). * * 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 . * ******************************************************************************/ #ifndef SWIFT_CSDS_IO_H #define SWIFT_CSDS_IO_H /* Config parameters. */ #include #ifdef WITH_CSDS /* Includes. */ #include "engine.h" #include "io_properties.h" #include "part.h" #include "units.h" /* This enum defines the type of particle to use with a given mask. The values should be the same than in part_type.h. */ enum mask_for_type { mask_for_gas = 0, mask_for_dark_matter = 1, /* Only need a single type of dm. */ mask_for_stars = 4, mask_for_black_hole = 5, mask_for_timestep = -1, } __attribute__((packed)); struct csds_field { /* Name of the field */ char name[CSDS_STRING_SIZE]; /* Mask value. */ unsigned int mask; /* Type of particle (follow part_type.h and -1 for timestamp). */ enum mask_for_type type; /* The offset of the field within the particle */ size_t offset; /* The size of the field */ size_t size; /* Do we use the xpart or the normal one? */ int use_xpart; /* Conversion functions (NULL if none) */ void *(*conversion_hydro)(const struct part *, const struct xpart *xp, const struct engine *e, void *buffer); void *(*conversion_grav)(const struct gpart *, const struct engine *e, void *buffer); void *(*conversion_stars)(const struct spart *, const struct engine *e, void *buffer); }; /** * @brief Define a field common to all the simulations * (e.g. timestamp or special flag). * * @param csds_field A pointer to the #csds_field to initialize. * @param field_name A string containing the name of the field. * @param size_field The size of the field in bytes (sizeof) */ #define csds_define_common_field(csds_field, field_name, size_field) \ { \ csds_field.offset = 0; \ csds_field.size = size_field; \ if (strlen(field_name) >= CSDS_STRING_SIZE) \ error("Name %s too long", field_name); \ strcpy(csds_field.name, field_name); \ csds_field.mask = 0; \ csds_field.use_xpart = -1; \ csds_field.conversion_hydro = NULL; \ csds_field.conversion_grav = NULL; \ csds_field.conversion_stars = NULL; \ } /** * @brief Define a field that simply requires a memcpy (e.g. the IDs). * * @param csds_field A pointer to the #csds_field to initialize. * @param field_name A string containing the name of the field. * @param part The type of particles (e.g. struct part) * @param field The field to write (e.g. id) */ #define csds_define_standard_field(csds_field, field_name, part, field) \ { \ csds_field.offset = offsetof(part, field); \ part *tmp; \ csds_field.size = sizeof(tmp->field); \ if (strlen(field_name) >= CSDS_STRING_SIZE) \ error("Name %s too long", field_name); \ strcpy(csds_field.name, field_name); \ csds_field.mask = 0; \ csds_field.use_xpart = -1; \ csds_field.conversion_hydro = NULL; \ csds_field.conversion_grav = NULL; \ csds_field.conversion_stars = NULL; \ } /** * @brief Same than the previous function but for the hydro. * This function specifies the particle (part vs xpart) * * @param csds_field A pointer to the #csds_field to initialize. * @param field_name A string containing the name of the field. * @param part The type of particles (e.g. struct part) * @param field The field to write (e.g. id) * @param saving_xpart Does the field belongs to the xpart? */ #define csds_define_hydro_standard_field(csds_field, field_name, part, field, \ saving_xpart) \ { \ csds_define_standard_field(csds_field, field_name, part, field); \ csds_field.use_xpart = saving_xpart; \ } /** * @brief Define a field from a function. * This function should never be called by the user. * * @param csds_field A pointer to the #csds_field to initialize. * @param field_name A string containing the name of the field. * @param conversion_func The conversion function. * @param field_size The size of the field to write. * @param part_type The type of particles. */ #define csds_define_field_from_function_general( \ csds_field, field_name, conversion_func, field_size, part_type) \ { \ if (strlen(field_name) >= CSDS_STRING_SIZE) \ error("Name %s too long", field_name); \ strcpy(csds_field.name, field_name); \ csds_field.size = field_size; \ csds_field.mask = 0; \ csds_field.use_xpart = -1; \ csds_field.conversion_hydro = NULL; \ csds_field.conversion_grav = NULL; \ csds_field.conversion_stars = NULL; \ csds_field.conversion_##part_type = conversion_func; \ } /** * @brief Define a field from a function for hydro. * * @param csds_field A pointer to the #csds_field to initialize. * @param field_name A string containing the name of the field. * @param conversion_func The conversion function. * @param field_size The size of the field to write. */ #define csds_define_field_from_function_hydro(csds_field, field_name, \ conversion_func, size) \ {csds_define_field_from_function_general(csds_field, field_name, \ conversion_func, size, hydro)} /** * @brief Define a field from a function for stars. * * @param csds_field A pointer to the #csds_field to initialize. * @param field_name A string containing the name of the field. * @param conversion_func The conversion function. * @param field_size The size of the field to write. */ #define csds_define_field_from_function_stars(csds_field, field_name, \ conversion_func, size) \ {csds_define_field_from_function_general(csds_field, field_name, \ conversion_func, size, stars)} /** * @brief Define a field from a function for gravity. * * @param csds_field A pointer to the #csds_field to initialize. * @param field_name A string containing the name of the field. * @param conversion_func The conversion function. * @param field_size The size of the field to write. */ #define csds_define_field_from_function_gravity(csds_field, field_name, \ conversion_func, size) \ {csds_define_field_from_function_general(csds_field, field_name, \ conversion_func, size, grav)} void csds_write_description(struct csds_writer *log, struct engine *e); #endif #endif /* SWIFT_CSDS_IO_H */