/******************************************************************************* * This file is part of SWIFT. * Copyright (c) 2021 John Helly (j.c.helly@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 . * ******************************************************************************/ #ifndef SWIFT_LIGHTCONE_PARTICLE_IO_H #define SWIFT_LIGHTCONE_PARTICLE_IO_H /* Config parameters. */ #include /* Some standard headers. */ #include #include /* Local headers. */ #include "chemistry.h" #include "common_io.h" #include "error.h" #include "io_compression.h" #include "part_type.h" #include "stars.h" #include "units.h" /* Forward declarations */ struct gpart; struct part; struct xpart; struct spart; struct bpart; struct lightcone_props; struct engine; /* * Struct to describe an output field in the lightcone */ struct lightcone_io_field { /* Name */ char name[FIELD_BUFFER_SIZE]; /* Type of the field */ enum IO_DATA_TYPE type; /* Dimension (1D, 3D, ...) */ int dimension; /* Offset to this field in the data struct */ size_t offset; /* Units of this quantity */ enum unit_conversion_factor units; /* Scale-factor exponent to apply for unit conversion to physical */ float scale_factor_exponent; /* Lossy compression to use for this field */ enum lossy_compression_schemes compression; /* Pointer to the next field */ struct lightcone_io_field *next; }; /* * Struct to store a linked list of lightcone_io_props */ struct lightcone_io_field_list { /* Pointer to the first field */ struct lightcone_io_field *first; /* Pointer to the last field */ struct lightcone_io_field *last; /* Number of fields */ int num_fields; }; /** * @brief Gas particle data for lightcone output */ struct lightcone_gas_data { long long id; double x[3]; float vel[3]; float mass; float a; float h; float rho; float temperature; #ifdef CHEMISTRY_EAGLE float smoothed_metal_mass_fraction[chemistry_element_count]; float metal_mass_fraction_total; float smoothed_metal_mass_fraction_total; #endif #ifdef COOLING_PS2020 double electron_density; double ycompton; #endif #ifdef WITH_FOF long long group_id; #endif #if defined(TRACERS_EAGLE) || defined(TRACERS_FLAMINGO) float last_AGN_injection_scale_factor; #endif #ifdef STAR_FORMATION_EAGLE float sfr; #endif }; int lightcone_store_gas(const struct engine *e, struct lightcone_props *props, const struct gpart *gp, const struct part *p, const struct xpart *xp, const double a_cross, const double x_cross[3], struct lightcone_gas_data *data); /** * @brief Dark matter particle data for lightcone output */ struct lightcone_dark_matter_data { long long id; double x[3]; float vel[3]; float mass; float a; }; int lightcone_store_dark_matter(const struct engine *e, struct lightcone_props *props, const struct gpart *gp, const double a_cross, const double x_cross[3], struct lightcone_dark_matter_data *data); /** * @brief Star particle data for lightcone output */ struct lightcone_stars_data { long long id; double x[3]; float vel[3]; float mass; float a; #ifdef WITH_FOF long long group_id; #endif #ifdef STARS_EAGLE float mass_init; float birth_scale_factor; float birth_density; float luminosities[luminosity_bands_count]; #endif #ifdef CHEMISTRY_EAGLE float smoothed_metal_mass_fraction[chemistry_element_count]; float metal_mass_fraction_total; float smoothed_metal_mass_fraction_total; #endif #if defined(TRACERS_EAGLE) || defined(TRACERS_FLAMINGO) float last_AGN_injection_scale_factor; #endif }; int lightcone_store_stars(const struct engine *e, struct lightcone_props *props, const struct gpart *gp, const struct spart *sp, const double a_cross, const double x_cross[3], struct lightcone_stars_data *data); /** * @brief Black hole particle data for lightcone output */ struct lightcone_black_hole_data { long long id; double x[3]; float vel[3]; float mass; float a; #ifdef BLACK_HOLES_EAGLE float subgrid_mass; float formation_scale_factor; float accretion_rate; float total_accreted_mass; float last_minor_merger_scale_factor; float last_major_merger_scale_factor; int number_of_mergers; float last_AGN_event_scale_factor; int AGN_number_of_AGN_events; int AGN_number_of_energy_injections; float last_high_Eddington_fraction_scale_factor; int cumulative_number_seeds; #ifdef WITH_FOF long long group_id; #endif #endif }; int lightcone_store_black_hole(const struct engine *e, struct lightcone_props *props, const struct gpart *gp, const struct bpart *bp, const double a_cross, const double x_cross[3], struct lightcone_black_hole_data *data); /** * @brief Neutrino particle data for lightcone output */ struct lightcone_neutrino_data { long long id; double x[3]; float vel[3]; float mass; float weight; float a; }; int lightcone_store_neutrino(const struct engine *e, struct lightcone_props *props, const struct gpart *gp, const double a_cross, const double x_cross[3], struct lightcone_neutrino_data *data); void lightcone_write_particles(struct lightcone_props *props, const struct unit_system *internal_units, const struct unit_system *snapshot_units, int ptype, hid_t file_id); inline static size_t lightcone_io_struct_size(int ptype) { switch (ptype) { case swift_type_dark_matter: case swift_type_dark_matter_background: return sizeof(struct lightcone_dark_matter_data); case swift_type_gas: return sizeof(struct lightcone_gas_data); case swift_type_stars: return sizeof(struct lightcone_stars_data); case swift_type_black_hole: return sizeof(struct lightcone_black_hole_data); case swift_type_neutrino: return sizeof(struct lightcone_neutrino_data); default: error("Unhandled particle type"); return 0; } } void lightcone_io_field_list_init(struct lightcone_io_field_list *list); void lightcone_io_field_list_clean(struct lightcone_io_field_list *list); void lightcone_io_field_list_append(struct lightcone_io_field_list *list, char *name, enum IO_DATA_TYPE type, int dimension, size_t offset, enum unit_conversion_factor units, float scale_factor_exponent, char *compression); void lightcone_io_append_gas_output_fields( struct lightcone_io_field_list *list); void lightcone_io_append_dark_matter_output_fields( struct lightcone_io_field_list *list); void lightcone_io_append_dark_matter_background_output_fields( struct lightcone_io_field_list *list); void lightcone_io_append_stars_output_fields( struct lightcone_io_field_list *list); void lightcone_io_append_black_hole_output_fields( struct lightcone_io_field_list *list); void lightcone_io_append_neutrino_output_fields( struct lightcone_io_field_list *list); #endif