diff --git a/examples/main.c b/examples/main.c index d99dec04b59f9d096d154620036a6da4a73f5931..fe93bc4d7d6f69ec7d505f109292661ddcbfd4dc 100644 --- a/examples/main.c +++ b/examples/main.c @@ -1006,7 +1006,7 @@ int main(int argc, char *argv[]) { /* Initialise the particles */ engine_init_particles(&e, flag_entropy_ICs, clean_smoothing_length_values); - /* Write the state of the system before starting time integration. */ + /* Write the state of the system before starting time integration. */ #ifdef WITH_LOGGER logger_ensure_size(e.log, e.total_nr_parts, e.total_nr_gparts, 0); logger_log_all(e.log, &e); diff --git a/src/cell.h b/src/cell.h index a95e0f2226f8fd54ae5fab536208990cccd73189..6aae833250958707cd7933478929ad54d17246db 100644 --- a/src/cell.h +++ b/src/cell.h @@ -279,9 +279,6 @@ struct cell { /*! Values of h_max before the drifts, used for sub-cell tasks. */ float h_max_old; - /*! The logger task */ - struct task *logger; - /*! The task to compute time-steps */ struct task *timestep; @@ -556,6 +553,9 @@ struct cell { /*! Task for source terms */ struct task *sourceterms; + /*! The logger task */ + struct task *logger; + /*! Minimum dimension, i.e. smallest edge of this cell (min(width)). */ float dmin; diff --git a/src/dump.c b/src/dump.c index bc57e7783287d792e32ade6d667df0568bae5d6c..5824b7081f6f7958e68bd526996eb6adffdad8b7 100644 --- a/src/dump.c +++ b/src/dump.c @@ -49,14 +49,12 @@ void *dump_get(struct dump *d, size_t count, size_t *offset) { size_t local_offset = atomic_add(&d->count, count); #ifdef SWIFT_DEBUG_CHECKS - if (d->count > d->size) - error("A new dump file should have been created."); + if (d->count > d->size) error("A new dump file should have been created."); #endif *offset = local_offset + d->file_offset; return (char *)d->data + local_offset; } - /** * @brief Ensure that at least size bytes are available in the #dump. */ @@ -86,7 +84,7 @@ void dump_ensure(struct dump *d, size_t size) { if ((d->data = mmap(NULL, d->size, PROT_WRITE, MAP_SHARED, d->fd, d->file_offset)) == MAP_FAILED) { error("Failed to allocate map of size %zi bytes (%s).", d->size, - strerror(errno)); + strerror(errno)); } } diff --git a/src/engine.c b/src/engine.c index 03c0af95dd2726be559710bab8f1f9a1e836c966..45d4836345fec07fc91986e1ce5669424f3ad842 100644 --- a/src/engine.c +++ b/src/engine.c @@ -115,8 +115,7 @@ const char *engine_policy_names[] = {"none", "structure finding", "star formation", "feedback", - "logger" -}; + "logger"}; /** The rank of the engine as a global variable (for messages). */ int engine_rank; @@ -233,10 +232,9 @@ void engine_make_hierarchical_tasks_common(struct engine *e, struct cell *c) { c, NULL); #if defined(WITH_LOGGER) - c->logger = scheduler_addtask(s, task_type_logger, task_subtype_none, 0, 0, - c, NULL); + c->logger = scheduler_addtask(s, task_type_logger, task_subtype_none, 0, + 0, c, NULL); #endif - c->kick2 = scheduler_addtask(s, task_type_kick2, task_subtype_none, 0, 0, c, NULL); @@ -277,7 +275,7 @@ void engine_make_hierarchical_tasks_common(struct engine *e, struct cell *c) { #if defined(WITH_LOGGER) scheduler_addunlock(s, c->kick1, c->logger); #endif -} + } } else { /* We are above the super-cell so need to go deeper */ @@ -4260,7 +4258,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements, /* logger tasks ? */ else if (t->type == task_type_logger) { if (cell_is_active_hydro(t->ci, e) || cell_is_active_gravity(t->ci, e)) - scheduler_activate(s, t); + scheduler_activate(s, t); } /* Gravity stuff ? */ @@ -5215,10 +5213,9 @@ void engine_init_particles(struct engine *e, int flag_entropy_ICs, #ifdef WITH_LOGGER logger_log_timestamp(e->log, e->ti_current, &e->log->timestamp_offset); - logger_ensure_size(e->log, e->total_nr_parts, e->total_nr_gparts, - 0); + logger_ensure_size(e->log, e->total_nr_parts, e->total_nr_gparts, 0); #endif - + /* Now, launch the calculation */ TIMER_TIC; engine_launch(e); @@ -5470,8 +5467,7 @@ void engine_step(struct engine *e) { #ifdef WITH_LOGGER logger_log_timestamp(e->log, e->ti_current, &e->log->timestamp_offset); - logger_ensure_size(e->log, e->total_nr_parts, e->total_nr_gparts, - 0); + logger_ensure_size(e->log, e->total_nr_parts, e->total_nr_gparts, 0); #endif /* Are we drifting everything (a la Gadget/GIZMO) ? */ @@ -5625,9 +5621,9 @@ void engine_check_for_dumps(struct engine *e) { /* Dump everything */ engine_print_stats(e); #ifdef WITH_LOGGER - engine_dump_index(e); + engine_dump_index(e); #else - engine_dump_snapshot(e); + engine_dump_snapshot(e); #endif } else if (e->ti_next_stats < e->ti_next_snapshot) { @@ -5659,9 +5655,9 @@ void engine_check_for_dumps(struct engine *e) { /* Dump snapshot */ #ifdef WITH_LOGGER - engine_dump_index(e); + engine_dump_index(e); #else - engine_dump_snapshot(e); + engine_dump_snapshot(e); #endif } else if (e->ti_next_stats > e->ti_next_snapshot) { @@ -5681,9 +5677,9 @@ void engine_check_for_dumps(struct engine *e) { /* Dump snapshot */ #ifdef WITH_LOGGER - engine_dump_index(e); + engine_dump_index(e); #else - engine_dump_snapshot(e); + engine_dump_snapshot(e); #endif /* Let's fake that we are at the stats dump time */ @@ -6484,8 +6480,8 @@ void engine_dump_snapshot(struct engine *e) { MPI_INFO_NULL); #endif #else - write_output_single(e, e->snapshot_base_name, e->internal_units, - e->snapshot_units); + write_output_single(e, e->snapshot_base_name, e->internal_units, + e->snapshot_units); #endif #endif @@ -6524,7 +6520,7 @@ void engine_dump_index(struct engine *e) { /* Dump... */ write_index_single(e, e->log->base_name, e->internal_units, - e->snapshot_units); + e->snapshot_units); e->dump_snapshot = 0; @@ -6702,9 +6698,8 @@ void engine_init(struct engine *e, struct space *s, struct swift_params *params, e->last_repartition = 0; #endif - #if defined(WITH_LOGGER) - e->log = (struct logger *) malloc(sizeof(struct logger)); + e->log = (struct logger *)malloc(sizeof(struct logger)); logger_init(e->log, params); #endif @@ -7166,8 +7161,9 @@ void engine_config(int restart, struct engine *e, struct swift_params *params, #if defined(WITH_LOGGER) if (e->nodeID == 0) - message("WARNING: There is currently no way of predicting the output " - "size, please use it carefully"); + message( + "WARNING: There is currently no way of predicting the output " + "size, please use it carefully"); #endif /* Find the time of the first snapshot output */ diff --git a/src/gravity/Default/gravity.h b/src/gravity/Default/gravity.h index 167d2be8618dd7250018915f18a36db656482c00..d446844e8ffc862fd3be0688302ebb3a2efab8fa 100644 --- a/src/gravity/Default/gravity.h +++ b/src/gravity/Default/gravity.h @@ -28,7 +28,6 @@ #include "kernel_gravity.h" #include "minmax.h" - /** * @brief Returns the mass of a particle * @@ -147,7 +146,6 @@ __attribute__((always_inline)) INLINE static void gravity_init_gpart( gp->a_grav[0] = 0.f; gp->a_grav[1] = 0.f; gp->a_grav[2] = 0.f; - gp->last_output = SHRT_MAX; #ifdef SWIFT_GRAVITY_FORCE_CHECKS gp->potential_PM = 0.f; diff --git a/src/hydro/Gadget2/hydro.h b/src/hydro/Gadget2/hydro.h index 892fb4dd9bff6549925ce6172a94053eea62a963..98dcad4f39a5621bde8e085bc3bc06f060832958 100644 --- a/src/hydro/Gadget2/hydro.h +++ b/src/hydro/Gadget2/hydro.h @@ -788,7 +788,7 @@ hydro_set_init_internal_energy(struct part *p, float u_init) { __attribute__((always_inline)) INLINE static int xpart_should_write( const struct xpart *xp, const struct engine *e) { - return (xp->logger_data.last_output > e->log->delta_step); + return (xp->logger_data.last_output > e->log->delta_step); } #endif diff --git a/src/hydro/Gadget2/hydro_io.h b/src/hydro/Gadget2/hydro_io.h index a3828b0b4185e2c7745813ecad5071901fa204aa..dfce1c2c2209f36bacb5263d4fbcb179dadc6303 100644 --- a/src/hydro/Gadget2/hydro_io.h +++ b/src/hydro/Gadget2/hydro_io.h @@ -188,19 +188,17 @@ INLINE static void hydro_write_particles(const struct part* parts, #endif } - /** * @brief Specifies which particle fields to write to a dataset * * @param parts The particle array. * @param list The list of i/o properties to write. * @param num_fields The number of i/o fields to write. - * + * * In this version, we only want the ids and the offset. */ __attribute__((always_inline)) INLINE static void hydro_write_index( - const struct part* parts, const struct xpart* xparts, - struct io_props* list, + const struct part* parts, const struct xpart* xparts, struct io_props* list, int* num_fields) { #ifdef WITH_LOGGER @@ -210,15 +208,13 @@ __attribute__((always_inline)) INLINE static void hydro_write_index( list[0] = io_make_output_field("ParticleIDs", ULONGLONG, 1, UNIT_CONV_NO_UNITS, parts, id); - list[1] = io_make_output_field("Offset", ULONGLONG, 1, - UNIT_CONV_NO_UNITS, xparts, logger_data.last_offset); + list[1] = io_make_output_field("Offset", ULONGLONG, 1, UNIT_CONV_NO_UNITS, + xparts, logger_data.last_offset); #else error("Cannot write index without logger"); #endif - } - /** * @brief Writes the current model of SPH to the file * @param h_grpsph The HDF5 group in which to write diff --git a/src/logger.c b/src/logger.c index 828a5a0849e2ff7c91b30cee177fac2355f0fc2e..a104f86061d5282df2449a07fc13cde2379d708d 100644 --- a/src/logger.c +++ b/src/logger.c @@ -24,10 +24,10 @@ #ifdef WITH_LOGGER /* Some standard headers. */ +#include <hdf5.h> #include <stdint.h> #include <stdlib.h> #include <string.h> -#include <hdf5.h> /* This object's header. */ #include "logger.h" @@ -35,21 +35,16 @@ /* Local headers. */ #include "atomic.h" #include "dump.h" +#include "engine.h" #include "error.h" #include "part.h" #include "units.h" -#include "engine.h" char logger_version[logger_version_size] = "0.1"; - const unsigned int logger_datatype_size[logger_data_count] = { - sizeof(int), - sizeof(float), - sizeof(double), - sizeof(char), - sizeof(long long), - 1, + sizeof(int), sizeof(float), sizeof(double), + sizeof(char), sizeof(long long), 1, }; /** @@ -62,7 +57,8 @@ const unsigned int logger_datatype_size[logger_data_count] = { * * @return updated buff */ -char *logger_write_chunk_header(char *buff, const unsigned int *mask, const size_t *offset, const size_t offset_new) { +char *logger_write_chunk_header(char *buff, const unsigned int *mask, + const size_t *offset, const size_t offset_new) { /* write mask */ memcpy(buff, mask, logger_mask_size); buff += logger_mask_size; @@ -83,8 +79,8 @@ char *logger_write_chunk_header(char *buff, const unsigned int *mask, const size * @param size number of bytes to write * @param p pointer to the data */ -void logger_write_data(struct dump *d, size_t *offset, size_t size, const void * p) -{ +void logger_write_data(struct dump *d, size_t *offset, size_t size, + const void *p) { /* get buffer */ char *buff = dump_get(d, size, offset); @@ -105,9 +101,10 @@ void logger_write_data(struct dump *d, size_t *offset, size_t size, const void * * @param name Label of the parameter (should be smaller than log->name) * @param data_type #logger_datatype to write */ -void logger_write_general_data(struct dump *d, const struct logger_parameters *params, size_t *offset, - const void *p, char* name, size_t data_type) -{ +void logger_write_general_data(struct dump *d, + const struct logger_parameters *params, + size_t *offset, const void *p, char *name, + size_t data_type) { /* write name */ logger_write_data(d, offset, params->label_size, name); @@ -115,8 +112,7 @@ void logger_write_general_data(struct dump *d, const struct logger_parameters *p logger_write_data(d, offset, params->data_type_size, &data_type); /* write value */ - if (data_type >= logger_data_count) - error("Not implemented"); + if (data_type >= logger_data_count) error("Not implemented"); size_t size = logger_datatype_size[data_type]; logger_write_data(d, offset, size, p); @@ -186,22 +182,21 @@ void logger_log_all(struct logger *log, const struct engine *e) { /* some constants */ const struct space *s = e->s; const unsigned int mask = logger_mask_x | logger_mask_v | logger_mask_a | - logger_mask_u | logger_mask_h | logger_mask_rho | - logger_mask_consts; + logger_mask_u | logger_mask_h | logger_mask_rho | + logger_mask_consts; /* loop over all parts */ - for(long long i=0; i < e->total_nr_parts; i++) { - logger_log_part(log, &s->parts[i], mask, &s->xparts[i].logger_data.last_offset); + for (long long i = 0; i < e->total_nr_parts; i++) { + logger_log_part(log, &s->parts[i], mask, + &s->xparts[i].logger_data.last_offset); s->xparts[i].logger_data.last_output = 0; } /* loop over all gparts */ - if (e->total_nr_gparts > 0) - error("Not implemented"); + if (e->total_nr_gparts > 0) error("Not implemented"); /* loop over all sparts */ // TODO - } /** @@ -210,9 +205,11 @@ void logger_log_all(struct logger *log, const struct engine *e) { * @param log The #logger * @param p The #part to dump. * @param mask The mask of the data to dump. - * @param offset Pointer to the offset of the previous log of this particle; (return) offset of this log. + * @param offset Pointer to the offset of the previous log of this particle; + * (return) offset of this log. */ -void logger_log_part(struct logger *log, const struct part *p, unsigned int mask, size_t *offset) { +void logger_log_part(struct logger *log, const struct part *p, + unsigned int mask, size_t *offset) { /* Make sure we're not writing a timestamp. */ if (mask & logger_mask_timestamp) @@ -286,9 +283,11 @@ void logger_log_part(struct logger *log, const struct part *p, unsigned int mask * @param log The #logger * @param p The #gpart to dump. * @param mask The mask of the data to dump. - * @param offset Pointer to the offset of the previous log of this particle; (return) offset of this log. + * @param offset Pointer to the offset of the previous log of this particle; + * (return) offset of this log. */ -void logger_log_gpart(struct logger *log, const struct gpart *p, unsigned int mask, size_t *offset) { +void logger_log_gpart(struct logger *log, const struct gpart *p, + unsigned int mask, size_t *offset) { /* Make sure we're not writing a timestamp. */ if (mask & logger_mask_timestamp) @@ -343,11 +342,13 @@ void logger_log_gpart(struct logger *log, const struct gpart *p, unsigned int ma * * @param log The #logger * @param timestamp time to write - * @param offset Pointer to the offset of the previous log of this particle; (return) offset of this log. + * @param offset Pointer to the offset of the previous log of this particle; + * (return) offset of this log. */ -void logger_log_timestamp(struct logger *log, integertime_t timestamp, size_t *offset) { +void logger_log_timestamp(struct logger *log, integertime_t timestamp, + size_t *offset) { struct dump *dump = log->dump; - + /* Start by computing the size of the message. */ const int size = logger_compute_chunk_size(logger_mask_timestamp); @@ -366,7 +367,6 @@ void logger_log_timestamp(struct logger *log, integertime_t timestamp, size_t *o *offset = offset_new; } - /** * @brief Ensure that the buffer is large enough for a step. * @@ -378,16 +378,15 @@ void logger_log_timestamp(struct logger *log, integertime_t timestamp, size_t *o * @param total_nr_gparts total number of gpart * @param total_nr_sparts total number of spart */ -void logger_ensure_size( - struct logger *log, size_t total_nr_parts, - size_t total_nr_gparts, size_t total_nr_sparts) { +void logger_ensure_size(struct logger *log, size_t total_nr_parts, + size_t total_nr_gparts, size_t total_nr_sparts) { struct logger_parameters *log_params = log->params; /* count part memory */ size_t limit = log_params->offset_size + log_params->mask_size; - for(size_t i=0; i < log_params->nber_mask; i++) { + for (size_t i = 0; i < log_params->nber_mask; i++) { if (log_params->masks[i] != logger_mask_timestamp) limit += log_params->masks_data_size[i]; } @@ -401,12 +400,10 @@ void logger_ensure_size( } /* count gpart memory */ - if (total_nr_gparts > 0) - error("Not implemented"); + if (total_nr_gparts > 0) error("Not implemented"); /* count spart memory */ - if (total_nr_sparts > 0) - error("Not implemented"); + if (total_nr_sparts > 0) error("Not implemented"); /* ensure enough space in dump */ dump_ensure(log->dump, log->buffer_size); @@ -418,11 +415,13 @@ void logger_ensure_size( * @param log The #logger * @param params The #swift_params */ -void logger_init(struct logger *log, const struct swift_params *params) { +void logger_init(struct logger *log, struct swift_params *params) { /* read parameters */ log->delta_step = parser_get_param_int(params, "Logger:delta_step"); - log->buffer_size = parser_get_param_float(params, "Logger:mmaped_buffer_size") * 1e9; - log->buffer_scale = parser_get_opt_param_float(params, "Logger:buffer_scale", 1.2); + log->buffer_size = + parser_get_param_float(params, "Logger:mmaped_buffer_size") * 1e9; + log->buffer_scale = + parser_get_opt_param_float(params, "Logger:buffer_scale", 1.2); parser_get_param_string(params, "Logger:basename", log->base_name); /* set initial value of parameters */ @@ -434,7 +433,8 @@ void logger_init(struct logger *log, const struct swift_params *params) { strcat(logger_name_file, ".dump"); /* init parameters */ - log->params = (struct logger_parameters*) malloc(sizeof(struct logger_parameters)); + log->params = + (struct logger_parameters *)malloc(sizeof(struct logger_parameters)); logger_parameters_init(log->params); /* init dump */ @@ -445,7 +445,6 @@ void logger_init(struct logger *log, const struct swift_params *params) { /* ensure enough place in dump */ dump_ensure(dump_file, log->buffer_size); - } /** @@ -471,50 +470,60 @@ void logger_write_file_header(struct logger *log, const struct engine *e) { /* get required variables */ const struct logger_parameters log_params = *log->params; struct dump *dump = log->dump; - + size_t file_offset = dump->file_offset; - + if (file_offset != 0) - error("The logger is not empty." - "This function should be called before writing anything in the logger"); + error( + "The logger is not empty." + "This function should be called before writing anything in the logger"); /* Write version information */ logger_write_data(dump, &file_offset, logger_version_size, &logger_version); - + /* write number of bytes used for the offsets */ - logger_write_data(dump, &file_offset, logger_header_number_size, &log_params.offset_size); + logger_write_data(dump, &file_offset, logger_header_number_size, + &log_params.offset_size); /* write offset direction */ int reversed = 0; - logger_write_data(dump, &file_offset, logger_datatype_size[logger_data_bool], &reversed); + logger_write_data(dump, &file_offset, logger_datatype_size[logger_data_bool], + &reversed); /* will write the offset of the first particle here */ char *skip_header = dump_get(dump, log_params.offset_size, &file_offset); /* write number of bytes used for names */ - logger_write_data(dump, &file_offset, logger_header_number_size, &log_params.label_size); + logger_write_data(dump, &file_offset, logger_header_number_size, + &log_params.label_size); /* write number of bytes used for numbers */ - logger_write_data(dump, &file_offset, logger_header_number_size, &log_params.number_size); + logger_write_data(dump, &file_offset, logger_header_number_size, + &log_params.number_size); /* write number of bytes used for masks */ - logger_write_data(dump, &file_offset, logger_header_number_size, &log_params.mask_size); + logger_write_data(dump, &file_offset, logger_header_number_size, + &log_params.mask_size); /* write number of masks */ - logger_write_data(dump, &file_offset, log_params.number_size, &log_params.nber_mask); - + logger_write_data(dump, &file_offset, log_params.number_size, + &log_params.nber_mask); + /* write masks */ // loop over all mask type - for(size_t i=0; i<log_params.nber_mask; i++) { + for (size_t i = 0; i < log_params.nber_mask; i++) { // mask name size_t j = i * log_params.label_size; - logger_write_data(dump, &file_offset, log_params.label_size, &log_params.masks_name[j]); - + logger_write_data(dump, &file_offset, log_params.label_size, + &log_params.masks_name[j]); + // mask - logger_write_data(dump, &file_offset, log_params.mask_size, &log_params.masks[i]); + logger_write_data(dump, &file_offset, log_params.mask_size, + &log_params.masks[i]); // mask size - logger_write_data(dump, &file_offset, log_params.number_size, &log_params.masks_data_size[i]); + logger_write_data(dump, &file_offset, log_params.number_size, + &log_params.masks_data_size[i]); } /* write mask data */ @@ -523,12 +532,12 @@ void logger_write_file_header(struct logger *log, const struct engine *e) { /* write number of bytes for each field */ /* write data type (float, double, ...) */ /* write data name (mass, id, ...) */ - + /* Write data */ char *name = malloc(sizeof(char) * log_params.label_size); strcpy(name, "time_base"); logger_write_general_data(dump, &log_params, &file_offset, &e->time_base, - name, logger_data_double); + name, logger_data_double); /* last step: write first offset */ memcpy(skip_header, &file_offset, log_params.offset_size); @@ -544,7 +553,7 @@ void logger_write_file_header(struct logger *log, const struct engine *e) { * * @param log_params #logger_parameters to initialize */ -void logger_parameters_init(struct logger_parameters* log_params) { +void logger_parameters_init(struct logger_parameters *log_params) { /* set parameters */ log_params->label_size = 20; log_params->offset_size = 7; @@ -553,9 +562,9 @@ void logger_parameters_init(struct logger_parameters* log_params) { log_params->data_type_size = 1; log_params->nber_mask = 8; - + /* set masks array */ - log_params->masks = malloc(sizeof(size_t)*log_params->nber_mask); + log_params->masks = malloc(sizeof(size_t) * log_params->nber_mask); log_params->masks[0] = logger_mask_x; log_params->masks[1] = logger_mask_v; log_params->masks[2] = logger_mask_a; @@ -615,7 +624,6 @@ void logger_parameters_init(struct logger_parameters* log_params) { log_params->masks_data_size[7] = sizeof(integertime_t); // todo masks_type - } /** @@ -623,13 +631,12 @@ void logger_parameters_init(struct logger_parameters* log_params) { * * @param log_params The #logger_parameters */ -void logger_parameters_clean(struct logger_parameters* log_params) { +void logger_parameters_clean(struct logger_parameters *log_params) { free(log_params->masks); free(log_params->masks_name); free(log_params->masks_data_size); } - /** * @brief read chunk header * @@ -640,14 +647,15 @@ void logger_parameters_clean(struct logger_parameters* log_params) { * * @return Number of bytes read */ -__attribute__((always_inline)) INLINE static int logger_read_chunk_header(const char *buff, unsigned int *mask, size_t *offset, size_t cur_offset) { +__attribute__((always_inline)) INLINE static int logger_read_chunk_header( + const char *buff, unsigned int *mask, size_t *offset, size_t cur_offset) { memcpy(mask, buff, logger_mask_size); buff += logger_mask_size; *offset = 0; memcpy(offset, buff, logger_offset_size); *offset = cur_offset - *offset; - + return logger_mask_size + logger_offset_size; } @@ -824,4 +832,3 @@ int logger_read_timestamp(unsigned long long int *t, size_t *offset, #endif /* WITH_LOGGER */ #endif /* HAVE_POSIX_FALLOCATE */ - diff --git a/src/logger.h b/src/logger.h index 82482cfa9c8a472f932a2e37bbacdd58c7621e07..12bbadf31c63783044597bf9c17ea3a0a4ce9db6 100644 --- a/src/logger.h +++ b/src/logger.h @@ -118,7 +118,7 @@ struct logger_parameters { /* size of a data type in bytes */ size_t data_type_size; - + /* number of different mask */ size_t nber_mask; @@ -127,20 +127,18 @@ struct logger_parameters { /* data size of each mask */ size_t *masks_data_size; - + /* label of each mask */ char *masks_name; - }; - /* structure containing global data */ struct logger { /* Number of particle steps between dumping a chunk of data */ short int delta_step; /* Logger basename */ - char base_name[LOGGER_STRING_LENGTH]; + char base_name[LOGGER_STRING_LENGTH]; /* File name of the dump file */ struct dump *dump; @@ -168,8 +166,7 @@ struct logger_part_data { size_t last_offset; }; -INLINE static void logger_part_data_init( - struct logger_part_data *logger ) { +INLINE static void logger_part_data_init(struct logger_part_data *logger) { logger->last_offset = 0; logger->last_output = SHRT_MAX; } @@ -189,22 +186,24 @@ extern const unsigned int logger_datatype_size[]; /* Function prototypes. */ int logger_compute_chunk_size(unsigned int mask); void logger_log_all(struct logger *log, const struct engine *e); -void logger_log_part(struct logger *log, const struct part *p, unsigned int mask, size_t *offset); -void logger_log_gpart(struct logger *log, const struct gpart *p, unsigned int mask, size_t *offset); -void logger_init(struct logger *log, const struct swift_params *params); +void logger_log_part(struct logger *log, const struct part *p, + unsigned int mask, size_t *offset); +void logger_log_gpart(struct logger *log, const struct gpart *p, + unsigned int mask, size_t *offset); +void logger_init(struct logger *log, struct swift_params *params); void logger_clean(struct logger *log); void logger_log_timestamp(struct logger *log, integertime_t t, size_t *offset); void logger_ensure_size(struct logger *log, size_t total_nr_parts, - size_t total_nr_gparts, size_t total_nr_sparts); -void logger_write_file_header(struct logger *log, const struct engine* e); + size_t total_nr_gparts, size_t total_nr_sparts); +void logger_write_file_header(struct logger *log, const struct engine *e); int logger_read_part(struct part *p, size_t *offset, const char *buff); int logger_read_gpart(struct gpart *p, size_t *offset, const char *buff); int logger_read_timestamp(unsigned long long int *t, size_t *offset, const char *buff); -void logger_parameters_init(struct logger_parameters* log_params); -void logger_parameters_clean(struct logger_parameters* log_params); +void logger_parameters_init(struct logger_parameters *log_params); +void logger_parameters_clean(struct logger_parameters *log_params); #endif /* WITH_LOGGER */ diff --git a/src/logger_io.c b/src/logger_io.c index dc3ca9b4909c844c6067738931b88c044e604313..f80baaee4d9a4d66492d3c303d22ab425674f829 100644 --- a/src/logger_io.c +++ b/src/logger_io.c @@ -63,16 +63,16 @@ * @param internal_units The #unit_system used internally * @param snapshot_units The #unit_system used in the snapshots * - * Creates an HDF5 output file and writes the offset and id of particles contained - * in the engine. If such a file already exists, it is erased and replaced - * by the new one. + * Creates an HDF5 output file and writes the offset and id of particles + * contained in the engine. If such a file already exists, it is erased and + * replaced by the new one. * * Calls #error() if an error occurs. * */ void write_index_single(struct engine* e, const char* baseName, - const struct unit_system* internal_units, - const struct unit_system* snapshot_units) { + const struct unit_system* internal_units, + const struct unit_system* snapshot_units) { hid_t h_file = 0, h_grp = 0; const size_t Ngas = e->s->nr_parts; @@ -81,13 +81,13 @@ void write_index_single(struct engine* e, const char* baseName, int periodic = e->s->periodic; int numFiles = 1; struct part* parts = e->s->parts; - struct xpart *xparts = e->s->xparts; - //struct gpart* gparts = e->s->gparts; + struct xpart* xparts = e->s->xparts; + // struct gpart* gparts = e->s->gparts; struct gpart* dmparts = NULL; - //struct spart* sparts = e->s->sparts; + // struct spart* sparts = e->s->sparts; static int outputCount = 0; - struct logger *log = e->log; + struct logger* log = e->log; /* Number of unassociated gparts */ const size_t Ndm = Ntot > 0 ? Ntot - (Ngas + Nstars) : 0; @@ -182,7 +182,14 @@ void write_index_single(struct engine* e, const char* baseName, h_grp = H5Gcreate(h_file, "/Parameters", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if (h_grp < 0) error("Error while creating parameters group"); - parser_write_params_to_hdf5(e->parameter_file, h_grp); + parser_write_params_to_hdf5(e->parameter_file, h_grp, 1); + H5Gclose(h_grp); + + /* Print the runtime unused parameters */ + h_grp = H5Gcreate(h_file, "/UnusedParameters", H5P_DEFAULT, H5P_DEFAULT, + H5P_DEFAULT); + if (h_grp < 0) error("Error while creating parameters group"); + parser_write_params_to_hdf5(e->parameter_file, h_grp, 0); H5Gclose(h_grp); /* Print the system of Units used in the spashot */ @@ -249,17 +256,17 @@ void write_index_single(struct engine* e, const char* baseName, case swift_type_gas: N = Ngas; - hydro_write_index(parts, xparts, list, &num_fields); + hydro_write_index(parts, xparts, list, &num_fields); break; case swift_type_dark_matter: - error("TODO"); - break; - - case swift_type_star: + error("TODO"); + break; + + case swift_type_stars: N = Nstars; - error("TODO"); - //star_write_index(sparts, list, &num_fields); + error("TODO"); + // star_write_index(sparts, list, &num_fields); break; default: @@ -279,7 +286,6 @@ void write_index_single(struct engine* e, const char* baseName, /* Close particle group */ H5Gclose(h_grp); - } /* message("Done writing particles..."); */ diff --git a/src/logger_io.h b/src/logger_io.h index 5732cf5b66c3964b9c8c1c3a6c002313afdc4e0d..76b7150043dc25f222ef927c3508b84e423aff4a 100644 --- a/src/logger_io.h +++ b/src/logger_io.h @@ -30,8 +30,8 @@ #include "units.h" void write_index_single(struct engine* e, const char* baseName, - const struct unit_system* internal_units, - const struct unit_system* snapshot_units); + const struct unit_system* internal_units, + const struct unit_system* snapshot_units); #endif #endif /* SWIFT_LOGGER_IO_H */ diff --git a/src/parallel_io.h b/src/parallel_io.h index 35d0a1e18b54d85b8f8532bab5117a511568ea7f..9cd775347f0d5fbb3bc1b17664e0d5dba734d795 100644 --- a/src/parallel_io.h +++ b/src/parallel_io.h @@ -29,6 +29,7 @@ /* Includes. */ #include "engine.h" +#include "io_properties.h" #include "part.h" #include "units.h" diff --git a/src/runner.c b/src/runner.c index a4cee98014b3f1b507762d5052fe1dbb9f40dc92..be628cbfd6888cb7cb6c987b02aa6b5e7186969c 100644 --- a/src/runner.c +++ b/src/runner.c @@ -899,7 +899,7 @@ void runner_do_init_grav(struct runner *r, struct cell *c, int timer) { * @param timer Are we timing this ? */ void runner_do_extra_ghost(struct runner *r, struct cell *c, int timer) { - + #ifdef EXTRA_HYDRO_LOOP struct part *restrict parts = c->hydro.parts; @@ -2506,7 +2506,6 @@ void *runner_main(void *data) { t->ti_run = e->ti_current; #endif - /* Different types of tasks... */ switch (t->type) { case task_type_self: @@ -2613,8 +2612,8 @@ void *runner_main(void *data) { runner_do_end_force(r, ci, 1); break; case task_type_logger: - runner_do_logger(r, ci, 1); - break; + runner_do_logger(r, ci, 1); + break; case task_type_timestep: runner_do_timestep(r, ci, 1); break; @@ -2694,7 +2693,6 @@ void *runner_main(void *data) { return NULL; } - /** * @brief Write the required particles through the logger. * @@ -2708,13 +2706,12 @@ void runner_do_logger(struct runner *r, struct cell *c, int timer) { TIMER_TIC; const struct engine *e = r->e; - struct part *restrict parts = c->parts; - struct xpart *restrict xparts = c->xparts; - const int count = c->count; + struct part *restrict parts = c->hydro.parts; + struct xpart *restrict xparts = c->hydro.xparts; + const int count = c->hydro.count; /* Anything to do here? */ - if (!cell_is_starting_hydro(c, e) && !cell_is_starting_gravity(c, e)) - return; + if (!cell_is_starting_hydro(c, e) && !cell_is_starting_gravity(c, e)) return; /* Recurse? */ if (c->split) { @@ -2732,35 +2729,30 @@ void runner_do_logger(struct runner *r, struct cell *c, int timer) { /* If particle needs to be kicked */ if (part_is_starting(p, e)) { - if (xpart_should_write(xp, e)) - { - /* Write particle */ - logger_log_part(e->log, p, logger_mask_x | logger_mask_v | logger_mask_a | - logger_mask_u | logger_mask_h | logger_mask_rho | - logger_mask_consts, - &xp->logger_data.last_offset); - //message("Offset: %lu", p->last_offset); - /* Set counter back to zero */ - xp->logger_data.last_output = 0; - } - else - /* Update counter */ - xp->logger_data.last_output += 1; + if (xpart_should_write(xp, e)) { + /* Write particle */ + logger_log_part(e->log, p, + logger_mask_x | logger_mask_v | logger_mask_a | + logger_mask_u | logger_mask_h | logger_mask_rho | + logger_mask_consts, + &xp->logger_data.last_offset); + // message("Offset: %lu", p->last_offset); + /* Set counter back to zero */ + xp->logger_data.last_output = 0; + } else + /* Update counter */ + xp->logger_data.last_output += 1; } } - } - if (c->gcount > 0) - error("gparts not implemented"); + if (c->grav.count > 0) error("gparts not implemented"); + + if (c->stars.count > 0) error("sparts not implemented"); - if (c->scount > 0) - error("sparts not implemented"); - if (timer) TIMER_TOC(timer_logger); #else error("Logger disabled, please enable it during configuration"); #endif - } diff --git a/src/single_io.c b/src/single_io.c index e8cd02ff8114f7b9de086ed44bdd124b6a01a338..99f016809d11abc4f9f31695306850d82fd56c84 100644 --- a/src/single_io.c +++ b/src/single_io.c @@ -314,7 +314,7 @@ void writeArray(const struct engine* e, hid_t grp, char* fileName, /* Write XMF description for this data set */ if (xmfFile != NULL) xmf_write_line(xmfFile, fileName, partTypeGroupName, props.name, N, - props.dimension, props.type); + props.dimension, props.type); /* Write unit conversion factors for this data set */ char buffer[FIELD_BUFFER_SIZE]; @@ -995,5 +995,4 @@ void write_output_single(struct engine* e, const char* baseName, e->snapshot_output_count++; } - #endif /* HAVE_HDF5 */ diff --git a/src/task.c b/src/task.c index 9aeca8cd7eec7680bcb0148a9bf172a5efd4aa4f..834ae319399fbefcf7379a4ccd1a59f104a9fa28 100644 --- a/src/task.c +++ b/src/task.c @@ -47,19 +47,38 @@ #include "lock.h" /* Task type names. */ -const char *taskID_names[task_type_count] = { - "none", "sort", "self", - "pair", "sub_self", "sub_pair", - "init_grav", "init_grav_out", "ghost_in", - "ghost", "ghost_out", "extra_ghost", - "drift_part", "drift_gpart", "end_force", - "kick1", "kick2", "timestep", - "send", "recv", "grav_long_range", - "grav_mm", "grav_down_in", "grav_down", - "grav_mesh", "cooling", "star_formation", - "sourceterms", "stars_ghost_in", "stars_ghost", - "stars_ghost_out","logger" -}; +const char *taskID_names[task_type_count] = {"none", + "sort", + "self", + "pair", + "sub_self", + "sub_pair", + "init_grav", + "init_grav_out", + "ghost_in", + "ghost", + "ghost_out", + "extra_ghost", + "drift_part", + "drift_gpart", + "end_force", + "kick1", + "kick2", + "timestep", + "send", + "recv", + "grav_long_range", + "grav_mm", + "grav_down_in", + "grav_down", + "grav_mesh", + "cooling", + "star_formation", + "sourceterms", + "stars_ghost_in", + "stars_ghost", + "stars_ghost_out", + "logger"}; /* Sub-task type names. */ const char *subtaskID_names[task_subtype_count] = { diff --git a/src/timers.c b/src/timers.c index dae35f30295e067263610ba74ea192f1012c0fbf..5cd75cced7433427904e013629dd37c9bf28d009 100644 --- a/src/timers.c +++ b/src/timers.c @@ -35,67 +35,65 @@ ticks timers[timer_count]; /* Timer names. */ -const char* timers_names[timer_count] = { - "none", - "prepare", - "init", - "init_grav", - "drift_part", - "drift_gpart", - "kick1", - "kick2", - "timestep", - "endforce", - "dosort", - "doself_density", - "doself_gradient", - "doself_force", - "doself_grav_pp", - "dopair_density", - "dopair_gradient", - "dopair_force", - "dopair_grav_mm", - "dopair_grav_pp", - "dograv_external", - "dograv_down", - "dograv_mesh", - "dograv_top_level", - "dograv_long_range", - "dosource", - "dosub_self_density", - "dosub_self_gradient", - "dosub_self_force", - "dosub_self_grav", - "dosub_pair_density", - "dosub_pair_gradient", - "dosub_pair_force", - "dosub_pair_grav", - "doself_subset", - "dopair_subset", - "dopair_subset_naive", - "dosub_subset", - "do_ghost", - "do_extra_ghost", - "dorecv_part", - "dorecv_gpart", - "dorecv_spart", - "do_cooling", - "do_star_formation", - "gettask", - "qget", - "qsteal", - "locktree", - "runners", - "step", - "doself_stars_density", - "dopair_stars_density", - "do_stars_ghost", - "doself_subset_stars_density", - "dopair_subset_stars_density", - "dosubpair_stars_density", - "dosub_self_stars_density", - "logger" -}; +const char* timers_names[timer_count] = {"none", + "prepare", + "init", + "init_grav", + "drift_part", + "drift_gpart", + "kick1", + "kick2", + "timestep", + "endforce", + "dosort", + "doself_density", + "doself_gradient", + "doself_force", + "doself_grav_pp", + "dopair_density", + "dopair_gradient", + "dopair_force", + "dopair_grav_mm", + "dopair_grav_pp", + "dograv_external", + "dograv_down", + "dograv_mesh", + "dograv_top_level", + "dograv_long_range", + "dosource", + "dosub_self_density", + "dosub_self_gradient", + "dosub_self_force", + "dosub_self_grav", + "dosub_pair_density", + "dosub_pair_gradient", + "dosub_pair_force", + "dosub_pair_grav", + "doself_subset", + "dopair_subset", + "dopair_subset_naive", + "dosub_subset", + "do_ghost", + "do_extra_ghost", + "dorecv_part", + "dorecv_gpart", + "dorecv_spart", + "do_cooling", + "do_star_formation", + "gettask", + "qget", + "qsteal", + "locktree", + "runners", + "step", + "doself_stars_density", + "dopair_stars_density", + "do_stars_ghost", + "doself_subset_stars_density", + "dopair_subset_stars_density", + "dosubpair_stars_density", + "dosub_self_stars_density", + "logger"}; /* File to store the timers */ static FILE* timers_file; diff --git a/tests/testLogger.c b/tests/testLogger.c index 14e49cdfd3b112949243f7cd6b3c4126c68d696d..2c7339c63560860700d967ac5f9f367803a9746f 100644 --- a/tests/testLogger.c +++ b/tests/testLogger.c @@ -20,7 +20,8 @@ /* Config parameters. */ #include "../config.h" -#if defined(HAVE_POSIX_FALLOCATE) && defined(WITH_LOGGER) /* Are we on a sensible platform? */ +#if defined(HAVE_POSIX_FALLOCATE) && \ + defined(WITH_LOGGER) /* Are we on a sensible platform? */ /* Some standard headers. */ #include <stdio.h> @@ -44,9 +45,11 @@ void test_log_parts(struct logger *log) { size_t offset = d->count; /* Write the full part. */ - logger_log_part(log, &p, logger_mask_x | logger_mask_v | logger_mask_a | - logger_mask_u | logger_mask_h | logger_mask_rho | - logger_mask_consts, &offset); + logger_log_part(log, &p, + logger_mask_x | logger_mask_v | logger_mask_a | + logger_mask_u | logger_mask_h | logger_mask_rho | + logger_mask_consts, + &offset); printf("Wrote part at offset %#016zx.\n", offset); /* Write only the position. */ @@ -113,8 +116,10 @@ void test_log_gparts(struct logger *log) { size_t offset = d->count; /* Write the full part. */ - logger_log_gpart(log, &p, logger_mask_x | logger_mask_v | logger_mask_a | - logger_mask_h | logger_mask_consts, &offset); + logger_log_gpart(log, &p, + logger_mask_x | logger_mask_v | logger_mask_a | + logger_mask_h | logger_mask_consts, + &offset); printf("Wrote gpart at offset %#016zx.\n", offset); /* Write only the position. */