diff --git a/examples/SedovBlast_3D/sedov.yml b/examples/SedovBlast_3D/sedov.yml index e91601f3e1b880306a8a14c24ca75d97cbfe94a1..656c26f95ecb6d0bd2e0c22639d653be57abcdc9 100644 --- a/examples/SedovBlast_3D/sedov.yml +++ b/examples/SedovBlast_3D/sedov.yml @@ -34,4 +34,9 @@ InitialConditions: file_name: ./sedov.hdf5 periodic: 1 smoothing_length_scaling: 3.33 - + +# Parameters governing the logger snapshot system +Logger: + delta_step: 10 # (Optional) Update the particle log every this many updates + mmaped_buffer_size: .05 # buffer size in GB + basename: indice # Common part of the filenames diff --git a/src/engine.c b/src/engine.c index c1b5e6df46cb63df77c3ffc6eb60cd1b408357d8..5d8d41d363e46dbfc59163b9c4814a2ff8a1dfa9 100644 --- a/src/engine.c +++ b/src/engine.c @@ -5215,7 +5215,8 @@ 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->total_nr_parts, e->log->buffer_size); + logger_ensure_size(e->log, e->total_nr_parts, e->total_nr_gparts, + 0); #endif /* Now, launch the calculation */ @@ -5468,9 +5469,9 @@ void engine_step(struct engine *e) { e->forcerebuild = 1; #ifdef WITH_LOGGER - logger_log_timestamp(e->ti_current, &e->logger_time_offset, - e->logger_dump); - logger_ensure_size(e->total_nr_parts, e->logger_buffer_size); + 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); #endif /* Are we drifting everything (a la Gadget/GIZMO) ? */ @@ -6700,7 +6701,7 @@ void engine_init(struct engine *e, struct space *s, struct swift_params *params, #if defined(WITH_LOGGER) e->log = (struct logger *) malloc(sizeof(struct logger)); - logger_init(e->log, params); + logger_init(e->log, params, e); #endif /* Make the space link back to the engine. */ @@ -7310,7 +7311,7 @@ void engine_config(int restart, struct engine *e, struct swift_params *params, } #ifdef WITH_LOGGER - logger_write_file_header(e->log->dump, e); + logger_write_file_header(e->log, e); #endif /* Free the affinity stuff */ diff --git a/src/logger.c b/src/logger.c index 7860468a2266e323cfd1f4656a03d3be22567618..c520a2b505565084dcef2a04d77a4f3e028dd099 100644 --- a/src/logger.c +++ b/src/logger.c @@ -100,7 +100,7 @@ void logger_write_data(struct dump *d, size_t *offset, const size_t size, void * * @param data_type #logger_datatype to write */ void logger_write_general_data(struct dump *d, struct logger_const *log, size_t *offset, - void *p, char* name, size_t data_type) + const void *p, char* name, size_t data_type) { char *buff; /* write name */ @@ -366,10 +366,12 @@ void logger_log_timestamp(struct logger *log, integertime_t timestamp, size_t *o * Check if logger parameters are large enough to write all particles * and ensure that enough space is available in the buffer * + * @param log The #logger * @param total_nr_nparts total number of particle - * @param logger_buffer_size requested file size upate */ -void logger_ensure_size(struct logger *log, size_t total_nr_parts) { +void logger_ensure_size( + struct logger *log, size_t total_nr_parts, + size_t total_nr_gparts, size_t total_nr_sparts) { size_t limit, i; struct logger_const log_const; logger_const_init(&log_const); @@ -384,19 +386,27 @@ void logger_ensure_size(struct logger *log, size_t total_nr_parts) { limit *= total_nr_parts; - if (logger_buffer_size < limit) error("Need a larger logger size"); + if (log->buffer_size < limit) error("Need a larger logger size"); + + if (total_nr_gparts > 0) + error("Not implemented"); + + if (total_nr_sparts > 0) + error("Not implemented"); logger_const_free(&log_const); - dump_ensure(e->logger_dump, e->logger_buffer_size); + dump_ensure(log->dump, log->buffer_size); } /** * @brief intialize the logger structure * * @param log The #logger + * @param params The #swift_params + * @param e The #engine */ -void logger_init(struct logger *log, struct swift_params *params) { +void logger_init(struct logger *log, const struct swift_params *params, const struct engine *e) { /* 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; @@ -412,7 +422,7 @@ void logger_init(struct logger *log, struct swift_params *params) { struct dump *dump_file = log->dump; dump_init(dump_file, logger_name_file, log->buffer_size); - logger_write_file_header(log, dump_file); + logger_write_file_header(log, e); dump_ensure(dump_file, log->buffer_size); log->timestamp_offset = 0; } @@ -429,11 +439,11 @@ void logger_clean(struct logger *log) { /** * @brief Write a file header to a logger file * - * @param offset Pointer to the offset of the previous log of this particle. + * @param log The #logger * @param dump The #dump in which to log the particle data. * */ -void logger_write_file_header(struct dump *dump, struct engine *e) { +void logger_write_file_header(struct logger *log, const struct engine *e) { #ifdef SWIFT_DEBUG_CHECKS message("writing header"); @@ -444,6 +454,7 @@ void logger_write_file_header(struct dump *dump, struct engine *e) { size_t file_offset; struct logger_const log_const; + struct dump *dump = log->dump; logger_const_init(&log_const); file_offset = dump->file_offset; @@ -508,8 +519,8 @@ void logger_write_file_header(struct dump *dump, struct engine *e) { logger_const_free(&log_const); free(name); - dump_ensure(e->logger_dump, e->logger_buffer_size); - e->logger_time_offset = 0; + dump_ensure(log->dump, log->buffer_size); + log->timestamp_offset = 0; } /** diff --git a/src/logger.h b/src/logger.h index eb9be96a3a1c326866e7a7b8d2c7b52972406085..26a247458810e41aa5993ef8b5d5d35485079964 100644 --- a/src/logger.h +++ b/src/logger.h @@ -122,23 +122,23 @@ extern const unsigned int logger_data_size[]; /* Function prototypes. */ int logger_compute_chunk_size(unsigned int mask); -void logger_log_all(struct part *p, - const long long Np, struct dump *dump); +void logger_log_all(struct logger *log, struct engine *e); void logger_log_part(const struct part *p, const unsigned int mask, size_t *offset, struct dump *dump); void logger_log_gpart(const struct gpart *p, const unsigned int mask, size_t *offset, struct dump *dump); -void logger_init(struct logger *log, const struct swift_params *params); +void logger_init(struct logger *log, const struct swift_params *params, const struct engine *e); void logger_clean(struct logger *log); void logger_log_timestamp(struct logger *log, integertime_t t, size_t *offset); 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_write_file_header(struct dump *dump, struct engine* e); +void logger_write_file_header(struct logger *log, const struct engine* e); void logger_const_init(struct logger_const* log_const); void logger_const_free(struct logger_const* log_const); -void logger_ensure_size(size_t total_nr_parts, size_t logger_buffer_size); +void logger_ensure_size(struct logger *log, size_t total_nr_parts, + size_t total_nr_gparts, size_t total_nr_sparts); #endif /* WITH_LOGGER */ diff --git a/src/logger_io.c b/src/logger_io.c index d90577b2c95c0408aa15e4fc78c97dacf4177a21..d421b0f3e82bba44037748c2204f457fee433536 100644 --- a/src/logger_io.c +++ b/src/logger_io.c @@ -81,11 +81,14 @@ 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 gpart* dmparts = NULL; //struct spart* sparts = e->s->sparts; static int outputCount = 0; + struct logger *log = e->log; + /* Number of unassociated gparts */ const size_t Ndm = Ntot > 0 ? Ntot - (Ngas + Nstars) : 0; @@ -126,7 +129,7 @@ void write_index_single(struct engine* e, const char* baseName, io_write_attribute(h_grp, "BoxSize", DOUBLE, e->s->dim, 3); double dblTime = e->time; io_write_attribute(h_grp, "Time", DOUBLE, &dblTime, 1); - io_write_attribute(h_grp, "Time Offset", UINT, &e->logger_time_offset, 1); + io_write_attribute(h_grp, "Time Offset", UINT, &log->timestamp_offset, 1); int dimension = (int)hydro_dimension; io_write_attribute(h_grp, "Dimension", INT, &dimension, 1);