/*******************************************************************************
* 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_H
#define SWIFT_LIGHTCONE_H
/* Config parameters. */
#include
/* Local headers */
#include "lightcone/lightcone_map_types.h"
#include "lightcone/lightcone_particle_io.h"
#include "lightcone/lightcone_replications.h"
#include "lightcone/lightcone_shell.h"
#include "lightcone/pixel_index.h"
#include "lightcone/projected_kernel.h"
#include "parser.h"
#include "part_type.h"
#include "particle_buffer.h"
#include "threadpool.h"
#include "timeline.h"
#include "units.h"
/* Avoid cyclic inclusions */
struct cosmology;
struct engine;
struct space;
/**
* @brief Lightcone data
*/
struct lightcone_props {
/*! Index of this lightcone */
int index;
/*! Whether to write extra log messages */
int verbose;
/*! Which particle types we're doing */
int use_type[swift_type_count];
/*! Minimum redshift for particle output for each type */
double z_min_for_type[swift_type_count];
/*! Maximum redshift for particle output for each type */
double z_max_for_type[swift_type_count];
/*! Minimum a to search for lightcone crossing for each type */
double a_min_search_for_type[swift_type_count];
/*! Maximum a to search for lightcone crossing for each type */
double a_max_search_for_type[swift_type_count];
/*! Whether we need to do lightcone crossing checks for each type at this step
*/
int check_type_for_crossing[swift_type_count];
/*! Enable selective output of high redshift gas */
int gas_filtering_enabled;
/*! Will output all gas below this redshift */
double min_z_for_gas_filtering;
/*! Will output all gas after this scale factor */
double max_a_for_gas_filtering;
/*! At z>min_z_for_gas_filtering require gas T>min_temp_for_high_z_gas */
double min_temp_for_filtered_gas;
/*! At z>min_z_for_gas_filtering require gas
* nh>min_nh_for_filtered_gas*(1+z)^4 */
double min_nh_for_filtered_gas;
/*! Exclude recently heated gas from xray and sz maps */
double xray_maps_recent_AGN_injection_exclusion_time;
/*! Don't exclude gas with temperature less than this factor times AGN_delta_T
*/
double xray_maps_recent_AGN_min_temp_factor;
/*! Don't exclude gas with temperature more than this factor times AGN_delta_T
*/
double xray_maps_recent_AGN_max_temp_factor;
/*! Output base name */
char basename[PARSER_MAX_LINE_SIZE];
/*! Output directory */
char subdir[PARSER_MAX_LINE_SIZE];
/*! Position of the observer in the simulation box */
double observer_position[3];
/*! Range in distance squared in which we output particles of each type */
double r2_min_for_type[swift_type_count], r2_max_for_type[swift_type_count];
/*! Range in expansion factor covered by particle outputs and healpix maps */
double a_min, a_max;
/*! Corresponding range in distance squared for a_max and a_min */
double r2_min, r2_max;
/*! Size of chunks in particle buffer */
int buffer_chunk_size;
/*! Size of chunks in HDF5 output files */
int hdf5_chunk_size;
/* Maximum amount of data (in megabytes) to send from any one rank when
* updating healpix maps */
double max_map_update_send_size_mb;
/*! Whether to apply lossy compression */
int particles_lossy_compression;
/*! Lossless compression level for particles (0 to disable) */
int particles_gzip_level;
/*! Lossless compression level for healpix maps (0 to disable) */
int maps_gzip_level;
/*! Simulation box size (volume must be a cube) */
double boxsize;
/*! Top level cell width */
double cell_width;
/*! Whether list of replications exists */
int have_replication_list;
/*! List of periodic replications to check on this timestep */
struct replication_list replication_list;
/*! Number of particles written to the current file by this MPI rank */
long long num_particles_written_to_file[swift_type_count];
/*! Number of particles of each type which have been output on this rank */
long long num_particles_written_this_rank[swift_type_count];
/*! Index of the current output file for this MPI rank */
int current_file;
/*! Range of times used to generate the replication list */
integertime_t ti_old, ti_current;
/*! Expansion factors corresponding to z_min, z_max */
double a_at_z_min, a_at_z_max;
/*! Buffers to store particles on the lightcone */
struct particle_buffer buffer[swift_type_count];
/*! Will write particles to disk if buffer exceeds this size */
int max_particles_buffered;
/*! Whether we should make a new file on the next flush */
int start_new_file;
/*! Whether we have started a particle file and not finalized it yet */
int file_needs_finalizing;
/*! Number of pending map updates to trigger communication */
int max_updates_buffered;
/*! Whether to write distributed maps in MPI mode */
int distributed_maps;
/*! Name of the file with radii of spherical shells */
char radius_file[PARSER_MAX_LINE_SIZE];
/*! Healpix nside parameter */
int nside;
/*! Healpix pixel area */
double pixel_area_steradians;
/*! Number of shells */
int nr_shells;
/*! Array of lightcone shells */
struct lightcone_shell *shell;
/*! Number of healpix maps we're making for each shell */
int nr_maps;
/*! Types of healpix map we're making for each shell */
struct lightcone_map_type *map_type;
/*! Range of shells that might be updated this step */
int shell_nr_min, shell_nr_max;
/*! Information about each particle type contributing to the maps */
struct lightcone_particle_type part_type[swift_type_count];
/*! Output fields */
struct lightcone_io_field_list particle_fields[swift_type_count];
/*! Tabulation of projected SPH smoothing kernel */
struct projected_kernel_table kernel_table;
};
void lightcone_init(struct lightcone_props *props, const int index,
const struct space *s, const struct cosmology *cosmo,
struct swift_params *params,
const struct unit_system *internal_units,
const struct phys_const *physical_constants,
const int verbose);
void lightcone_clean(struct lightcone_props *props);
void lightcone_struct_dump(const struct lightcone_props *props, FILE *stream);
void lightcone_struct_restore(struct lightcone_props *props, FILE *stream);
void lightcone_prepare_for_step(struct lightcone_props *props,
const struct cosmology *cosmo,
const integertime_t ti_earliest_undrifted,
const integertime_t ti_current);
void lightcone_buffer_particle(struct lightcone_props *props,
const struct engine *e, const struct gpart *gp,
const double a_cross, const double x_cross[3]);
void lightcone_flush_particle_buffers(struct lightcone_props *props, double a,
const struct unit_system *internal_units,
const struct unit_system *snapshot_units,
int flush_all, int end_file);
void lightcone_buffer_map_update(struct lightcone_props *props,
const struct engine *e, const struct gpart *gp,
const double a_cross, const double x_cross[3]);
void lightcone_flush_map_updates(struct lightcone_props *props,
struct threadpool *tp);
void lightcone_dump_completed_shells(struct lightcone_props *props,
struct threadpool *tp,
const struct cosmology *c,
const struct unit_system *internal_units,
const struct unit_system *snapshot_units,
const int dump_all, const int need_flush);
int lightcone_trigger_map_update(struct lightcone_props *props);
void lightcone_memory_use(struct lightcone_props *props,
size_t *particle_buffer_bytes,
size_t *map_buffer_bytes, size_t *pixel_data_bytes);
void lightcone_write_index(struct lightcone_props *props,
const struct unit_system *internal_units,
const struct unit_system *snapshot_units);
void lightcone_map_set_baseline(const struct cosmology *c,
struct lightcone_props *props,
struct lightcone_map *map);
#endif /* SWIFT_LIGHTCONE_H */