diff --git a/src/logger.c b/src/logger.c index 40827bc188d6666015a35477a9d3a3522a88cfd3..caccd8c61d09f97e02a0d5f6cc12227fb8a6799f 100644 --- a/src/logger.c +++ b/src/logger.c @@ -65,25 +65,27 @@ char logger_version[logger_version_size] = "0.1"; - -const struct mask_data logger_mask_data[logger_count_mask] = { - /* Particle's position */ - {3 * sizeof(double), 1 << logger_x, "positions"}, - /* Particle's velocity */ - {3 * sizeof(float), 1 << logger_v, "velocities"}, - /* Particle's acceleration */ - {3 * sizeof(float), 1 << logger_a, "accelerations"}, - /* Particle's entropy */ - {sizeof(float), 1 << logger_u, "entropy"}, - /* Particle's smoothing length */ - {sizeof(float), 1 << logger_h, "smoothing length"}, - /* Particle's density */ - {sizeof(float), 1 << logger_rho, "density"}, - /* Particle's constants: mass (float) and ID (long long) */ - {sizeof(float) + sizeof(long long), 1 << logger_consts, "consts"}, - /* Simulation time stamp: integertime and double time (e.g. scale factor or time) */ - {sizeof(integertime_t) + sizeof(double), 1 << logger_timestamp, "timestamp"} -}; +const struct mask_data + logger_mask_data[logger_count_mask] = + { + /* Particle's position */ + {3 * sizeof(double), 1 << logger_x, "positions"}, + /* Particle's velocity */ + {3 * sizeof(float), 1 << logger_v, "velocities"}, + /* Particle's acceleration */ + {3 * sizeof(float), 1 << logger_a, "accelerations"}, + /* Particle's entropy */ + {sizeof(float), 1 << logger_u, "entropy"}, + /* Particle's smoothing length */ + {sizeof(float), 1 << logger_h, "smoothing length"}, + /* Particle's density */ + {sizeof(float), 1 << logger_rho, "density"}, + /* Particle's constants: mass (float) and ID (long long) */ + {sizeof(float) + sizeof(long long), 1 << logger_consts, "consts"}, + /* Simulation time stamp: integertime and double time (e.g. scale + factor or time) */ + {sizeof(integertime_t) + sizeof(double), 1 << logger_timestamp, + "timestamp"}}; /** * @brief Write the header of a chunk (offset + mask). @@ -151,45 +153,43 @@ int logger_compute_chunk_size(unsigned int mask) { error("Timestamps should not include any other data."); /* A timestamp consists of an unsigned long long int. */ - size += sizeof(unsigned long long int); - size += sizeof(double); + size += logger_mask_data[logger_timestamp].size; } else { /* Particle position as three doubles. */ if (mask & logger_mask_data[logger_x].mask) { - size += 3 * sizeof(double); + size += logger_mask_data[logger_x].size; } /* Particle velocity as three floats. */ if (mask & logger_mask_data[logger_v].mask) { - size += 3 * sizeof(float); + size += logger_mask_data[logger_v].size; } /* Particle accelleration as three floats. */ if (mask & logger_mask_data[logger_a].mask) { - size += 3 * sizeof(float); + size += logger_mask_data[logger_a].size; } /* Particle internal energy as a single float. */ if (mask & logger_mask_data[logger_u].mask) { - size += sizeof(float); + size += logger_mask_data[logger_u].size; } /* Particle smoothing length as a single float. */ if (mask & logger_mask_data[logger_h].mask) { - size += sizeof(float); + size += logger_mask_data[logger_h].size; } /* Particle density as a single float. */ if (mask & logger_mask_data[logger_rho].mask) { - size += sizeof(float); + size += logger_mask_data[logger_rho].size; } /* Particle constants, which is a bit more complicated. */ - if (mask & logger_mask_data[logger_rho].mask) { - size += sizeof(float) + // mass - sizeof(long long); // id + if (mask & logger_mask_data[logger_consts].mask) { + size += logger_mask_data[logger_consts].size; } } @@ -212,13 +212,11 @@ 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_data[logger_x].mask | - logger_mask_data[logger_v].mask | - logger_mask_data[logger_a].mask | - logger_mask_data[logger_u].mask | - logger_mask_data[logger_h].mask | - logger_mask_data[logger_rho].mask | - logger_mask_data[logger_consts].mask; + const unsigned int mask = + logger_mask_data[logger_x].mask | logger_mask_data[logger_v].mask | + logger_mask_data[logger_a].mask | logger_mask_data[logger_u].mask | + logger_mask_data[logger_h].mask | logger_mask_data[logger_rho].mask | + logger_mask_data[logger_consts].mask; /* loop over all parts */ for (long long i = 0; i < e->total_nr_parts; i++) { @@ -262,44 +260,45 @@ void logger_log_part(struct logger *log, const struct part *p, /* Particle position as three doubles. */ if (mask & logger_mask_data[logger_x].mask) { - memcpy(buff, p->x, 3 * sizeof(double)); - buff += 3 * sizeof(double); + memcpy(buff, p->x, logger_mask_data[logger_x].size); + buff += logger_mask_data[logger_x].size; } /* Particle velocity as three floats. */ if (mask & logger_mask_data[logger_v].mask) { - memcpy(buff, p->v, 3 * sizeof(float)); - buff += 3 * sizeof(float); + memcpy(buff, p->v, logger_mask_data[logger_v].size); + buff += logger_mask_data[logger_v].size; } /* Particle accelleration as three floats. */ if (mask & logger_mask_data[logger_a].mask) { - memcpy(buff, p->a_hydro, 3 * sizeof(float)); - buff += 3 * sizeof(float); + memcpy(buff, p->a_hydro, logger_mask_data[logger_a].size); + buff += logger_mask_data[logger_a].size; } #if defined(GADGET2_SPH) /* Particle internal energy as a single float. */ if (mask & logger_mask_data[logger_u].mask) { - memcpy(buff, &p->entropy, sizeof(float)); - buff += sizeof(float); + memcpy(buff, &p->entropy, logger_mask_data[logger_u].size); + buff += logger_mask_data[logger_u].size; } /* Particle smoothing length as a single float. */ if (mask & logger_mask_data[logger_h].mask) { - memcpy(buff, &p->h, sizeof(float)); - buff += sizeof(float); + memcpy(buff, &p->h, logger_mask_data[logger_h].size); + buff += logger_mask_data[logger_h].size; } /* Particle density as a single float. */ if (mask & logger_mask_data[logger_rho].mask) { - memcpy(buff, &p->rho, sizeof(float)); - buff += sizeof(float); + memcpy(buff, &p->rho, logger_mask_data[logger_rho].size); + buff += logger_mask_data[logger_rho].size; } /* Particle constants, which is a bit more complicated. */ if (mask & logger_mask_data[logger_consts].mask) { + // TODO make it dependent of logger_mask_data memcpy(buff, &p->mass, sizeof(float)); buff += sizeof(float); memcpy(buff, &p->id, sizeof(long long)); @@ -329,8 +328,8 @@ void logger_log_gpart(struct logger *log, const struct gpart *p, error("You should not log particles as timestamps."); /* Make sure we're not looging fields not supported by gparts. */ - if (mask & (logger_mask_data[logger_u].mask | - logger_mask_data[logger_rho].mask)) + if (mask & + (logger_mask_data[logger_u].mask | logger_mask_data[logger_rho].mask)) error("Can't log SPH quantities for gparts."); /* Start by computing the size of the message. */ @@ -345,24 +344,25 @@ void logger_log_gpart(struct logger *log, const struct gpart *p, /* Particle position as three doubles. */ if (mask & logger_mask_data[logger_x].mask) { - memcpy(buff, p->x, 3 * sizeof(double)); - buff += 3 * sizeof(double); + memcpy(buff, p->x, logger_mask_data[logger_x].size); + buff += logger_mask_data[logger_x].size; } /* Particle velocity as three floats. */ if (mask & logger_mask_data[logger_v].mask) { - memcpy(buff, p->v_full, 3 * sizeof(float)); - buff += 3 * sizeof(float); + memcpy(buff, p->v_full, logger_mask_data[logger_v].size); + buff += logger_mask_data[logger_v].size; } /* Particle accelleration as three floats. */ if (mask & logger_mask_data[logger_a].mask) { - memcpy(buff, p->a_grav, 3 * sizeof(float)); - buff += 3 * sizeof(float); + memcpy(buff, p->a_grav, logger_mask_data[logger_a].size); + buff += logger_mask_data[logger_a].size; } /* Particle constants, which is a bit more complicated. */ if (mask & logger_mask_data[logger_consts].mask) { + // TODO make it dependent of logger_mask_data memcpy(buff, &p->mass, sizeof(float)); buff += sizeof(float); memcpy(buff, &p->id_or_neg_offset, sizeof(long long)); @@ -387,7 +387,8 @@ void logger_log_timestamp(struct logger *log, integertime_t timestamp, struct dump *dump = &log->dump; /* Start by computing the size of the message. */ - const int size = logger_compute_chunk_size(logger_mask_data[logger_timestamp].mask); + const int size = + logger_compute_chunk_size(logger_mask_data[logger_timestamp].mask); /* Allocate a chunk of memory in the dump of the right size. */ size_t offset_new; @@ -398,6 +399,7 @@ void logger_log_timestamp(struct logger *log, integertime_t timestamp, buff = logger_write_chunk_header(buff, &mask, offset, offset_new); /* Store the timestamp. */ + // TODO make it dependent of logger_mask_data memcpy(buff, ×tamp, sizeof(integertime_t)); buff += sizeof(integertime_t); @@ -445,8 +447,7 @@ void logger_ensure_size(struct logger *log, size_t total_nr_parts, int logger_compute_max_chunk_size(const struct logger *log) { int *output = malloc(sizeof(int) * logger_count_mask); - if (output == NULL) - error("Unable to allocate memory"); + if (output == NULL) error("Unable to allocate memory"); int max_size = logger_offset_size + logger_mask_size; /* Loop over all fields except timestamp */ @@ -484,7 +485,7 @@ void logger_init(struct logger *log, struct swift_params *params) { /* Define some constants */ log->max_chunk_size = logger_compute_max_chunk_size(log); - + /* init dump */ dump_init(&log->dump, logger_name_file, buffer_size); } @@ -494,9 +495,7 @@ void logger_init(struct logger *log, struct swift_params *params) { * * @param log The #logger */ -void logger_clean(struct logger *log) { - dump_close(&log->dump); -} +void logger_clean(struct logger *log) { dump_close(&log->dump); } /** * @brief Write a file header to a logger file @@ -522,21 +521,18 @@ void logger_write_file_header(struct logger *log, const struct engine *e) { /* write offset direction */ const int reversed = 0; - logger_write_data(dump, &file_offset, logger_number_size, - &reversed); + logger_write_data(dump, &file_offset, logger_number_size, &reversed); /* placeholder to write the offset of the first log here */ char *skip_header = dump_get(dump, logger_offset_size, &file_offset); /* write number of bytes used for names */ const int label_size = logger_label_size; - logger_write_data(dump, &file_offset, logger_number_size, - &label_size); + logger_write_data(dump, &file_offset, logger_number_size, &label_size); /* write number of masks */ int count_mask = logger_count_mask; - logger_write_data(dump, &file_offset, logger_number_size, - &count_mask); + logger_write_data(dump, &file_offset, logger_number_size, &count_mask); /* write masks */ // loop over all mask type @@ -549,7 +545,7 @@ void logger_write_file_header(struct logger *log, const struct engine *e) { logger_write_data(dump, &file_offset, logger_number_size, &logger_mask_data[i].size); } - + /* last step: write first offset */ memcpy(skip_header, &file_offset, logger_offset_size); } @@ -602,44 +598,45 @@ int logger_read_part(struct part *p, size_t *offset, const char *buff) { /* Particle position as three doubles. */ if (mask & logger_mask_data[logger_x].mask) { - memcpy(p->x, buff, 3 * sizeof(double)); - buff += 3 * sizeof(double); + memcpy(p->x, buff, logger_mask_data[logger_x].size); + buff += logger_mask_data[logger_x].size; } /* Particle velocity as three floats. */ if (mask & logger_mask_data[logger_v].mask) { - memcpy(p->v, buff, 3 * sizeof(float)); - buff += 3 * sizeof(float); + memcpy(p->v, buff, logger_mask_data[logger_v].size); + buff += logger_mask_data[logger_v].size; } /* Particle accelleration as three floats. */ if (mask & logger_mask_data[logger_a].mask) { - memcpy(p->a_hydro, buff, 3 * sizeof(float)); - buff += 3 * sizeof(float); + memcpy(p->a_hydro, buff, logger_mask_data[logger_a].size); + buff += logger_mask_data[logger_a].size; } #if defined(GADGET2_SPH) /* Particle internal energy as a single float. */ if (mask & logger_mask_data[logger_u].mask) { - memcpy(&p->entropy, buff, sizeof(float)); - buff += sizeof(float); + memcpy(&p->entropy, buff, logger_mask_data[logger_u].size); + buff += logger_mask_data[logger_u].size; } /* Particle smoothing length as a single float. */ if (mask & logger_mask_data[logger_h].mask) { - memcpy(&p->h, buff, sizeof(float)); - buff += sizeof(float); + memcpy(&p->h, buff, logger_mask_data[logger_h].size); + buff += logger_mask_data[logger_h].size; } /* Particle density as a single float. */ if (mask & logger_mask_data[logger_rho].mask) { - memcpy(&p->rho, buff, sizeof(float)); - buff += sizeof(float); + memcpy(&p->rho, buff, logger_mask_data[logger_rho].size); + buff += logger_mask_data[logger_rho].size; } /* Particle constants, which is a bit more complicated. */ if (mask & logger_mask_data[logger_rho].mask) { + // TODO make it dependent of logger_mask_data memcpy(&p->mass, buff, sizeof(float)); buff += sizeof(float); memcpy(&p->id, buff, sizeof(long long)); @@ -677,30 +674,31 @@ int logger_read_gpart(struct gpart *p, size_t *offset, const char *buff) { error("Trying to read timestamp as particle."); /* We can't store all part fields in a gpart. */ - if (mask & (logger_mask_data[logger_u].mask | - logger_mask_data[logger_rho].mask)) + if (mask & + (logger_mask_data[logger_u].mask | logger_mask_data[logger_rho].mask)) error("Trying to read SPH quantities into a gpart."); /* Particle position as three doubles. */ if (mask & logger_mask_data[logger_x].mask) { - memcpy(p->x, buff, 3 * sizeof(double)); - buff += 3 * sizeof(double); + memcpy(p->x, buff, logger_mask_data[logger_x].size); + buff += logger_mask_data[logger_x].size; } /* Particle velocity as three floats. */ if (mask & logger_mask_data[logger_v].mask) { - memcpy(p->v_full, buff, 3 * sizeof(float)); - buff += 3 * sizeof(float); + memcpy(p->v_full, buff, logger_mask_data[logger_v].size); + buff += logger_mask_data[logger_v].size; } /* Particle accelleration as three floats. */ if (mask & logger_mask_data[logger_a].mask) { - memcpy(p->a_grav, buff, 3 * sizeof(float)); - buff += 3 * sizeof(float); + memcpy(p->a_grav, buff, logger_mask_data[logger_a].size); + buff += logger_mask_data[logger_a].size; } /* Particle constants, which is a bit more complicated. */ if (mask & logger_mask_data[logger_rho].mask) { + // TODO make it dependent of logger_mask_data memcpy(&p->mass, buff, sizeof(float)); buff += sizeof(float); memcpy(&p->id_or_neg_offset, buff, sizeof(long long)); @@ -741,6 +739,7 @@ int logger_read_timestamp(unsigned long long int *t, double *time, error("Timestamp message contains extra fields."); /* Copy the timestamp value from the buffer. */ + // TODO make it dependent of logger_mask_data memcpy(t, buff, sizeof(unsigned long long int)); buff += sizeof(unsigned long long int); diff --git a/src/logger.h b/src/logger.h index eaf8bb8c4f81a7afbf893632c03afb4629ec0d0b..56e2c8ab94c66b24df1800877bb9cfb129c3e645 100644 --- a/src/logger.h +++ b/src/logger.h @@ -82,7 +82,7 @@ enum logger_masks_number { logger_h = 4, logger_rho = 5, logger_consts = 6, - logger_timestamp = 7, /* expect it to be before count */ + logger_timestamp = 7, /* expect it to be before count */ logger_count_mask = 8, /* Need to be the last */ } __attribute__((packed)); @@ -158,7 +158,7 @@ int logger_read_timestamp(unsigned long long int *t, double *time, */ INLINE static void logger_part_data_init(struct logger_part_data *logger) { logger->last_offset = 0; - logger->steps_since_last_output = SHRT_MAX; + logger->steps_since_last_output = INT_MAX; } /** diff --git a/src/runner.c b/src/runner.c index b368f2a069fa5c2c52d527fb8b00fcb015652d1e..54cfb64cb46230c097ab1d51576b7d5760a0fbf8 100644 --- a/src/runner.c +++ b/src/runner.c @@ -2736,12 +2736,12 @@ void runner_do_logger(struct runner *r, struct cell *c, int timer) { /* Currently writing everything, should adapt it through time */ logger_log_part(e->logger, p, logger_mask_data[logger_x].mask | - logger_mask_data[logger_v].mask | - logger_mask_data[logger_a].mask | - logger_mask_data[logger_u].mask | - logger_mask_data[logger_h].mask | - logger_mask_data[logger_rho].mask | - logger_mask_data[logger_consts].mask, + logger_mask_data[logger_v].mask | + logger_mask_data[logger_a].mask | + logger_mask_data[logger_u].mask | + logger_mask_data[logger_h].mask | + logger_mask_data[logger_rho].mask | + logger_mask_data[logger_consts].mask, &xp->logger_data.last_offset); /* Set counter back to zero */