diff --git a/logger/logger_header.c b/logger/logger_header.c index aaebc0fa4547a26d3c49b5444802dd444020c20e..f16673ffcbdaa665c6873a19ada31eed1f5b3d1f 100644 --- a/logger/logger_header.c +++ b/logger/logger_header.c @@ -89,7 +89,7 @@ int header_get_field_index(const struct header *h, const char *field) { */ void header_change_offset_direction(struct header *h, enum logger_offset_direction new_value) { h->offset_direction = new_value; - /* Skip file format and version numbers */ + /* Skip file format and version numbers. */ size_t offset = LOGGER_VERSION_SIZE + 2 * sizeof(int); logger_loader_io_write_data(h->log->log.map + offset, sizeof(unsigned int), &new_value); @@ -104,19 +104,19 @@ void header_change_offset_direction(struct header *h, enum logger_offset_directi void header_read(struct header *h, struct logger_logfile *log) { void *map = log->log.map; - /* Set pointer to log */ + /* Set pointer to log. */ h->log = log; - /* read file format */ + /* read the file format. */ char file_format[STRING_SIZE]; map = logger_loader_io_read_data(map, LOGGER_VERSION_SIZE, &file_format); if (strcmp(file_format, "SWIFT_LOGGER")) error("Wrong file format (%s)", file_format); - /* Read major version number */ + /* Read the major version number. */ map = logger_loader_io_read_data(map, sizeof(int), &h->major_version); - /* Read minor version number */ + /* Read the minor version number. */ map = logger_loader_io_read_data(map, sizeof(int), &h->minor_version); struct logger_reader *reader = log->reader; @@ -126,43 +126,43 @@ void header_read(struct header *h, struct logger_logfile *log) { if (reader->verbose > 0) message("File version %i.%i", h->major_version, h->minor_version); - /* read the offset directions */ + /* Read the offset directions. */ map = logger_loader_io_read_data(map, sizeof(int), &h->offset_direction); if (!header_is_forward(h) && !header_is_backward(h) && !header_is_corrupted(h)) error("Wrong offset value in the header (%i)", h->offset_direction); - /* read offset to first record */ + /* Read offset to first record. */ map = logger_loader_io_read_data(map, LOGGER_OFFSET_SIZE, &h->offset_first_record); - /* read the size of the strings */ + /* Read the size of the strings. */ map = logger_loader_io_read_data(map, sizeof(unsigned int), &h->string_length); - /* check if value defined in this file is large enough. */ + /* Check if value defined in this file is large enough. */ if (STRING_SIZE < h->string_length) { error("Name too large in log file %i", h->string_length); } - /* read the number of masks. */ + /* Read the number of masks. */ map = logger_loader_io_read_data(map, sizeof(unsigned int), &h->number_mask); - /* allocate the masks memory. */ + /* Allocate the masks memory. */ h->masks = malloc(sizeof(struct mask_data) * h->number_mask); - /* loop over all masks. */ + /* Loop over all masks. */ for (size_t i = 0; i < h->number_mask; i++) { - /* read the mask name. */ + /* Read the mask name. */ map = logger_loader_io_read_data(map, h->string_length, h->masks[i].name); - /* set the mask value. */ + /* Set the mask value. */ h->masks[i].mask = 1 << i; - /* read the mask data size. */ + /* Read the mask data size. */ map = logger_loader_io_read_data(map, sizeof(unsigned int), &h->masks[i].size); } - /* Check the logfile header's size */ + /* Check the logfile header's size. */ if (map != log->log.map + h->offset_first_record) { header_print(h); size_t offset = map - log->log.map; @@ -181,7 +181,7 @@ void header_read(struct header *h, struct logger_logfile *log) { */ size_t header_get_record_size_from_mask(const struct header *h, const size_t mask) { size_t count = 0; - /* Loop over each masks */ + /* Loop over each masks. */ for (size_t i = 0; i < h->number_mask; i++) { if (mask & h->masks[i].mask) { count += h->masks[i].size; diff --git a/logger/logger_header.h b/logger/logger_header.h index 606e8d74e21c559ac562be225978a004e49721e5..c8cee8634e2e2071d4b8352305efedf90e774474 100644 --- a/logger/logger_header.h +++ b/logger/logger_header.h @@ -32,7 +32,7 @@ enum logger_offset_direction { logger_offset_backward = 0, logger_offset_forward, logger_offset_corrupted, - /* Number of offset type */ + /* Number of offset type. */ logger_offset_count, }; @@ -56,10 +56,10 @@ struct logger_logfile; * The only function that modify the file is #header_change_offset_direction. */ struct header { - /* Dump's major version */ + /* Dump's major version. */ int major_version; - /* Dump's minor version */ + /* Dump's minor version. */ int minor_version; /* Offset of the first record. */ @@ -77,7 +77,7 @@ struct header { /* Direction of the offset in the records. */ enum logger_offset_direction offset_direction; - /* The corresponding log */ + /* The corresponding log. */ struct logger_logfile *log; }; diff --git a/logger/logger_index.c b/logger/logger_index.c index 25e81403e46e40ced3f060c446f4f5b5f984c3a1..4d8ccfd8b0883c0da650c632ca67d434073eda2f 100644 --- a/logger/logger_index.c +++ b/logger/logger_index.c @@ -70,7 +70,7 @@ void logger_index_init(struct logger_index *index, struct logger_reader *reader, */ void logger_index_free(struct logger_index *index) { - /* unmap file */ + /* unmap file. */ logger_loader_io_munmap_file(index->data, index->file_size); /* Set variables to default value. */ diff --git a/logger/logger_index.h b/logger/logger_index.h index f19c852a79f27f794062626ecb5b4cadf6fe70aa..57cf7207858c108225a60dc0a13abf547ca27970 100644 --- a/logger/logger_index.h +++ b/logger/logger_index.h @@ -30,10 +30,10 @@ struct logger_reader; struct logger_index_data { - /* The particle's id */ + /* The particle's id. */ uint64_t id; - /* The particle's offset */ + /* The particle's offset. */ uint64_t offset; }; @@ -45,25 +45,25 @@ struct logger_index_data { * #logger_index_free. */ struct logger_index { - /* The reader */ + /* The reader. */ struct logger_reader *reader; - /* memory map of the index file */ + /* memory map of the index file. */ void *data; - /* Index file size */ + /* Index file size. */ size_t file_size; - /* Number of particles */ + /* Number of particles. */ size_t total_number_particles; - /* Number of particles per type */ + /* Number of particles per type. */ long long number_particles[swift_type_count]; - /* Time of the index file */ + /* Time of the index file. */ double time; - /* Integer time of the index file */ + /* Integer time of the index file. */ integertime_t int_time; }; diff --git a/logger/logger_loader_io.c b/logger/logger_loader_io.c index bcbe41c0fb5377b4325bd71b2bf78efe46258eb2..6d6593008719a42013c5083babf5e4666ed5906c 100644 --- a/logger/logger_loader_io.c +++ b/logger/logger_loader_io.c @@ -88,7 +88,7 @@ void *logger_loader_io_mmap_file(char *filename, size_t *file_size, int read_onl * */ void logger_loader_io_munmap_file(void *map, size_t file_size) { - /* unmap */ + /* unmap the file. */ if (munmap(map, file_size) != 0) { error("Unable to unmap the file (%s)", strerror(errno)); } diff --git a/logger/logger_logfile.c b/logger/logger_logfile.c index 89d66084ed0e7a8f13058bbab04d1ef0131ef396..ea791bc955ca2ab87bc59ba7f61133b09b9abfea 100644 --- a/logger/logger_logfile.c +++ b/logger/logger_logfile.c @@ -38,7 +38,7 @@ void logger_logfile_init_from_file( if (&reader->log != log) error("Wrong link to the reader."); - /* Set pointers to zero */ + /* Set pointers to zero. */ time_array_init(&log->times); /* Open file, map it and get its size. */ @@ -58,26 +58,26 @@ void logger_logfile_init_from_file( } /* No need to continue if only the - header is required */ + header is required. */ if (only_header) return; - /* Check if the offset are corrupted */ + /* Check if the offset are corrupted. */ if (header_is_corrupted(&log->header)) { error("The offsets have been corrupted"); } - /* Reverse the offsets direction */ + /* Reverse the offsets direction. */ if (header_is_backward(&log->header)) { logger_logfile_reverse_offset(log, filename); } - /* Initialize the time array */ + /* Initialize the time array. */ if (reader->verbose > 1) message("Reading the time stamps."); time_array_populate(&log->times, log); - /* Print the time array */ + /* Print the time array. */ if (reader->verbose > 0) { time_array_print(&log->times); } @@ -104,7 +104,7 @@ void logger_logfile_free(struct logger_logfile *log) { */ void logger_logfile_reverse_offset(struct logger_logfile *log, char *filename) { - /* Close and reopen the file in write mode */ + /* Close and reopen the file in write mode. */ logger_loader_io_munmap_file(log->log.map, log->log.file_size); log->log.map = logger_loader_io_mmap_file( filename, &log->log.file_size, /* read_only */ 0); @@ -115,7 +115,7 @@ void logger_logfile_reverse_offset(struct logger_logfile *log, char *filename) { if (&reader->log != log) error("Wrong link to the reader."); - /* Check if the offsets need to be reversed */ + /* Check if the offsets need to be reversed. */ if (!header_is_backward(header)) { error("The offsets are already reversed."); } @@ -175,7 +175,7 @@ void logger_logfile_reverse_offset(struct logger_logfile *log, char *filename) { } #endif - /* Close and reopen the file in read mode */ + /* Close and reopen the file in read mode. */ logger_loader_io_munmap_file(log->log.map, log->log.file_size); log->log.map = logger_loader_io_mmap_file( filename, &log->log.file_size, /* read_only */ 1); diff --git a/logger/logger_logfile.h b/logger/logger_logfile.h index 4f7d1124932750636675dbead2cd87aa0f4a4a6d..7dc964431f1a2b274c149bee085bb3c285883ab9 100644 --- a/logger/logger_logfile.h +++ b/logger/logger_logfile.h @@ -46,15 +46,15 @@ struct logger_logfile { /* The reader that is using this log file. */ struct logger_reader *reader; - /* Information about the time records */ + /* Information about the time records. */ struct time_array times; /* The log's variables. */ struct { - /* Mapped data */ + /* Mapped data. */ void *map; - /* File size */ + /* File size. */ size_t file_size; } log; diff --git a/logger/logger_particle.c b/logger/logger_particle.c index 30777834b16c370a2c06b0c41cf30a8bfffcbd3a..daaa0027572e8d26835f9654c8b288ee74feb538 100644 --- a/logger/logger_particle.c +++ b/logger/logger_particle.c @@ -77,7 +77,7 @@ void* logger_particle_read_field(struct logger_particle *part, void *map, const char *field, const size_t size) { void *p = NULL; - /* Get the correct pointer */ + /* Get the correct pointer. */ if (strcmp("positions", field) == 0) { p = &part->pos; } else if (strcmp("velocities", field) == 0) { @@ -96,10 +96,10 @@ void* logger_particle_read_field(struct logger_particle *part, void *map, error("Type %s not defined", field); } - /* read the data */ + /* read the data. */ map = logger_loader_io_read_data(map, size, p); - /* Split the required fields */ + /* Split the required fields. */ if (strcmp("consts", field) == 0) { part->mass = 0; part->id = 0; @@ -128,7 +128,7 @@ size_t logger_particle_read(struct logger_particle *part, const struct logger_re size_t offset, const double time, const enum logger_reader_type reader_type) { - /* Get a few pointers */ + /* Get a few pointers. */ const struct header *h = &reader->log.header; void *map = reader->log.log.map; @@ -139,13 +139,13 @@ size_t logger_particle_read(struct logger_particle *part, const struct logger_re logger_particle_init(part); - /* Read the record mask */ + /* Read the record's mask. */ map = logger_loader_io_read_mask(h, map + offset, &mask, &h_offset); - /* Check if it is not a time record */ - if (mask != 127) error("Unexpected mask: %lu", mask); + /* Check if it is not a time record. */ + if (mask == 128) error("Unexpected mask: %lu", mask); - /* Read all the fields */ + /* Read all the fields. */ for (size_t i = 0; i < h->number_mask; i++) { if (mask & h->masks[i].mask) { map = logger_particle_read_field(part, map, h->masks[i].name, @@ -160,7 +160,7 @@ size_t logger_particle_read(struct logger_particle *part, const struct logger_re else part->time = -1; - /* update the offset */ + /* update the offset. */ offset = (size_t) (map - reader->log.log.map); /* Check if an interpolation is required. */ @@ -183,7 +183,7 @@ size_t logger_particle_read(struct logger_particle *part, const struct logger_re h_offset += offset - header_get_record_size_from_mask(h, mask) - LOGGER_MASK_SIZE - LOGGER_OFFSET_SIZE; - /* Get time of next record */ + /* Get time of next record. */ part_next.time = time_array_get_time(times, h_offset); /* Read next record. */ @@ -232,7 +232,7 @@ void logger_particle_interpolate( double tmp; float ftmp; - /* interpolate vectors */ + /* interpolate vectors. */ for (size_t i = 0; i < DIM; i++) { tmp = (part_next->pos[i] - part_curr->pos[i]); part_curr->pos[i] += tmp * scaling; @@ -244,10 +244,10 @@ void logger_particle_interpolate( part_curr->acc[i] += ftmp * scaling; } - /* interpolate scalars */ + /* interpolate scalars. */ ftmp = (part_next->entropy - part_curr->entropy); part_curr->entropy += ftmp * scaling; - /* set time */ + /* set time. */ part_curr->time = time; } diff --git a/logger/logger_particle.h b/logger/logger_particle.h index 66683266c4f1513e3a6a8f29a555b2270b583424..7b612948c0fd1c3bca916f1f4db4b8412374763e 100644 --- a/logger/logger_particle.h +++ b/logger/logger_particle.h @@ -52,31 +52,31 @@ struct logger_reader; * interpolation is required. */ struct logger_particle { - /* position */ + /* position. */ double pos[DIM]; - /* velocity */ + /* velocity. */ float vel[DIM]; - /* acceleration */ + /* acceleration. */ float acc[DIM]; - /* entropy */ + /* entropy. */ float entropy; - /* smoothing length */ + /* smoothing length. */ float h; - /* density */ + /* density. */ float density; - /* mass */ + /* mass. */ float mass; - /* id */ + /* unique id. */ size_t id; - /* time */ + /* time of the record. */ double time; }; @@ -84,8 +84,8 @@ struct logger_particle { * @brief Defines the type of interpolation */ enum logger_reader_type { - logger_reader_const, /* Constant interpolation */ - logger_reader_lin, /* Linear interpolation */ + logger_reader_const, /* Constant interpolation. */ + logger_reader_lin, /* Linear interpolation. */ }; void logger_particle_print(const struct logger_particle *p); diff --git a/logger/logger_python_wrapper.c b/logger/logger_python_wrapper.c index a447d3813e2b1353056c5ae7f2ab25afcc40831a..e50b59ff7b88f4f6db37bc2786de2496887e509c 100644 --- a/logger/logger_python_wrapper.c +++ b/logger/logger_python_wrapper.c @@ -44,11 +44,11 @@ static PyObject *loadFromIndex(__attribute__((unused)) PyObject *self, PyObject *args) { - /* input */ + /* input variables. */ PyArrayObject *offset = NULL; char *filename = NULL; - /* output */ + /* output variables. */ PyArrayObject *pos = NULL; PyArrayObject *vel = NULL; PyArrayObject *acc = NULL; @@ -61,8 +61,7 @@ static PyObject *loadFromIndex(__attribute__((unused)) PyObject *self, size_t time_offset; int verbose = 2; - /* parse arguments */ - + /* parse arguments. */ if (!PyArg_ParseTuple(args, "OsL|i", &offset, &filename, &time_offset, &verbose)) return NULL; @@ -77,12 +76,12 @@ static PyObject *loadFromIndex(__attribute__((unused)) PyObject *self, error("Offset does not contain unsigned int"); } - /* initialize the reader */ + /* initialize the reader. */ struct logger_reader reader; logger_reader_init(&reader, filename, verbose); struct header *h = &reader.log.header; - /* init array */ + /* init array. */ npy_intp dim[2]; dim[0] = PyArray_DIMS(offset)[0]; dim[1] = DIM; @@ -90,7 +89,7 @@ static PyObject *loadFromIndex(__attribute__((unused)) PyObject *self, /* Get required time. */ double time = time_array_get_time(&reader.log.times, time_offset); - /* init output */ + /* init output. */ if (header_get_field_index(h, "positions") != -1) { pos = (PyArrayObject *)PyArray_SimpleNew(2, dim, NPY_DOUBLE); } @@ -127,19 +126,21 @@ static PyObject *loadFromIndex(__attribute__((unused)) PyObject *self, if (verbose > 1) message("Reading particles."); - /* loop over all particles */ + /* loop over all particles. */ for (npy_intp i = 0; i < PyArray_DIMS(offset)[0]; i++) { struct logger_particle part; + /* Get the offset. */ size_t offset_particle = *(size_t *)PyArray_GETPTR1(offset, i); + /* Read the particle. */ logger_particle_read(&part, &reader, offset_particle, time, logger_reader_lin); double *dtmp; float *ftmp; size_t *stmp; - /* copy data */ + /* copy the data. */ for (size_t k = 0; k < DIM; k++) { if (pos) { dtmp = PyArray_GETPTR2(pos, i, k); @@ -183,10 +184,10 @@ static PyObject *loadFromIndex(__attribute__((unused)) PyObject *self, } } - /* Free the memory */ + /* Free the memory. */ logger_reader_free(&reader); - /* construct return value */ + /* construct return value. */ PyObject *dict = PyDict_New(); PyObject *key = PyUnicode_FromString("positions"); PyDict_SetItem(dict, key, PyArray_Return(pos)); @@ -237,26 +238,25 @@ static PyObject *loadFromIndex(__attribute__((unused)) PyObject *self, */ static PyObject *pyReverseOffset(__attribute__((unused)) PyObject *self, PyObject *args) { - /* input */ + /* input variables. */ char *filename = NULL; int verbose = 0; - /* parse arguments */ - + /* parse the arguments. */ if (!PyArg_ParseTuple(args, "s|i", &filename, &verbose)) return NULL; - /* initialize the reader (and reverse the offset if necessary) */ + /* initialize the reader which reverse the offset if necessary. */ struct logger_reader reader; logger_reader_init(&reader, filename, verbose); - /* Free the reader */ + /* Free the reader. */ logger_reader_free(&reader); return Py_BuildValue(""); } -/* definition of the method table */ +/* definition of the method table. */ static PyMethodDef libloggerMethods[] = { {"loadFromIndex", loadFromIndex, METH_VARARGS, diff --git a/logger/logger_reader.c b/logger/logger_reader.c index 7020b5de196bc5b6fb624d4c52ecc4ae7152469c..d1e5eaab42bb3bbd752e816cf90c163c5a3f3bc7 100644 --- a/logger/logger_reader.c +++ b/logger/logger_reader.c @@ -30,10 +30,10 @@ void logger_reader_init(struct logger_reader *reader, char *filename, int verbos if (verbose > 1) message("Initializing the reader"); - /* Initialize the reader variables */ + /* Initialize the reader variables. */ reader->verbose = verbose; - /* Initialize the log file */ + /* Initialize the log file. */ logger_logfile_init_from_file(&reader->log, filename, reader, /* only_header */ 0); @@ -47,6 +47,44 @@ void logger_reader_init(struct logger_reader *reader, char *filename, int verbos * @param reader The #logger_reader. */ void logger_reader_free(struct logger_reader *reader) { - /* Free the log */ + /* Free the log. */ logger_logfile_free(&reader->log); } + +/** + * @brief Read a record (timestamp or particle) + * + * @param reader The #reader. + * @param lp (out) The #logger_particle (if the record is a particle). + * @param time (out) The time read (if the record is a timestamp). + * @param is_particle Is the record a particle (or a timestamp)? + * @param offset The offset in the file. + * + * @return The offset after this record. + */ +size_t reader_read_record(struct logger_reader *reader, struct logger_particle *lp, + double *time, int *is_particle, size_t offset) { + + struct logger_logfile *log = &reader->log; + + /* Read mask to find out if timestamp or particle. */ + size_t mask = 0; + logger_loader_io_read_mask(&log->header, log->log.map + offset, &mask, NULL); + + /* Check if timestamp or not. */ + int ind = header_get_field_index(&log->header, "timestamp"); + if (ind == -1) { + error("File header does not contain a mask for time"); + } + if (log->header.masks[ind].mask == mask) { + *is_particle = 0; + integertime_t int_time = 0; + offset = time_read(&int_time, time, reader, offset); + } + else { + *is_particle = 1; + offset = logger_particle_read(lp, reader, offset, *time, logger_reader_const); + } + + return offset; +} diff --git a/logger/logger_reader.h b/logger/logger_reader.h index ab20f5008af2192c89341efc1a878d67bf301ff0..863327bc6d6b4c5ebe4ba31de31596680825935e 100644 --- a/logger/logger_reader.h +++ b/logger/logger_reader.h @@ -41,8 +41,10 @@ #ifndef __LOGGER_LOGGER_READER_H__ #define __LOGGER_LOGGER_READER_H__ +#include "logger_loader_io.h" #include "logger_logfile.h" #include "logger_index.h" +#include "logger_particle.h" /** * @brief Main structure of the logger. @@ -55,20 +57,21 @@ */ struct logger_reader { - /* Time of each index file #TODO */ + /* Time of each index file. #TODO */ double *times; - /* Information contained in the index file */ + /* Information contained in the index file. */ struct logger_index index; - /* Informations contained in the file header */ + /* Informations contained in the file header. */ struct logger_logfile log; - /* Level of verbosity */ + /* Level of verbosity. */ int verbose; }; void logger_reader_init(struct logger_reader *reader, char *filename, int verbose); void logger_reader_free(struct logger_reader *reader); - +size_t reader_read_record(struct logger_reader *reader, struct logger_particle *lp, + double *time, int *is_particle, size_t offset); #endif // __LOGGER_LOGGER_READER_H__ diff --git a/logger/logger_time.c b/logger/logger_time.c index 96bdc6267e60d9948a7f76e0074045b956cc8264..0717c2459c8adae992ef7f2c8a259563ff48fa43 100644 --- a/logger/logger_time.c +++ b/logger/logger_time.c @@ -42,7 +42,7 @@ size_t time_read(integertime_t *int_time, double *time, const struct logger_read *int_time = 0; *time = 0; - /* read record header */ + /* read record header. */ map = logger_loader_io_read_mask(h, map + offset, &mask, &prev_offset); #ifdef SWIFT_DEBUG_CHECKS @@ -55,7 +55,7 @@ size_t time_read(integertime_t *int_time, double *time, const struct logger_read if (h->masks[ind].mask != mask) error("Not a time record"); #endif - /* read the record */ + /* read the record. */ map = logger_loader_io_read_data(map, sizeof(unsigned long long int), int_time); map = logger_loader_io_read_data(map, sizeof(double), time); @@ -72,7 +72,7 @@ size_t time_read(integertime_t *int_time, double *time, const struct logger_read */ size_t time_offset_first_record(const struct header *h) { - /* Initialize a few variables */ + /* Initialize a few variables. */ size_t offset = h->offset_first_record; void *map = h->log->log.map; @@ -114,10 +114,10 @@ void time_array_populate(struct time_array *t, struct logger_logfile *log) { integertime_t int_time = 0; double time = 0; - /* get file size */ + /* get file size. */ size_t file_size = log->log.file_size; - /* get first time stamp */ + /* get first time stamp. */ size_t offset = time_offset_first_record(&log->header); while (offset < file_size) { /* read current time record and store it. */ @@ -127,7 +127,7 @@ void time_array_populate(struct time_array *t, struct logger_logfile *log) { t->int_time = int_time; t->time = time; - /* get next record */ + /* get next record. */ int test = tools_get_next_record(&log->header, log->log.map, &offset, log->log.file_size); if (test == -1) break; @@ -140,7 +140,7 @@ void time_array_populate(struct time_array *t, struct logger_logfile *log) { t = tmp; } - /* free unused time_array */ + /* free unused time_array. */ struct time_array *tmp = t->prev; tmp->next = NULL; free(t); @@ -188,7 +188,7 @@ struct time_array *time_array_get_time_array(const struct time_array *t, if (!t) error("NULL pointer"); #endif const struct time_array *tmp; - /* Find the time_array with the correct offset */ + /* Find the time_array with the correct offset. */ for(tmp = t; tmp->next && tmp->offset <= offset; tmp = tmp->next) {} diff --git a/logger/logger_time.h b/logger/logger_time.h index 351d4936856de573d3276a7beb1365ff6efcaa4c..4e35ad025782de3ca617a191e0677e8b3af454ee 100644 --- a/logger/logger_time.h +++ b/logger/logger_time.h @@ -45,19 +45,19 @@ struct logger_reader; * #time_array_count. */ struct time_array { - /* Pointer to next element */ + /* Pointer to next element. */ void *next; - /* Pointer to prev element */ + /* Pointer to prev element. */ void *prev; - /* Integertime of this time record */ + /* Integertime of this time record. */ integertime_t int_time; - /* Double time of this time record */ + /* Double time of this time record. */ double time; - /* Offset in the file of this time record */ + /* Offset in the file of this time record. */ size_t offset; }; diff --git a/logger/logger_tools.c b/logger/logger_tools.c index 34c1e9ad724829779609bcaa0909b131b6ec3523..81e2b36a5f5ba60dc2fe3df15a20bed58dd06006 100644 --- a/logger/logger_tools.c +++ b/logger/logger_tools.c @@ -58,12 +58,12 @@ int _tools_get_next_record_forward(const struct header *h, void *map, size_t *offset) { size_t diff_offset = 0; - /* read offset */ + /* Read the offset. */ map = logger_loader_io_read_mask(h, map + *offset, NULL, &diff_offset); if (diff_offset == 0) return -1; - /* set absolute offset */ + /* Set the absolute offset. */ *offset += diff_offset; return 0; } @@ -120,19 +120,19 @@ size_t tools_reverse_offset(const struct header *h, void *file_map, size_t offse const size_t cur_offset = offset; void *map = file_map; - /* read mask + offset */ + /* read mask + offset. */ map = logger_loader_io_read_mask(h, map + offset, &mask, &prev_offset); - /* write offset of zero (in case it is the last record) */ + /* write offset of zero (in case it is the last record). */ const size_t zero = 0; map -= LOGGER_OFFSET_SIZE; map = logger_loader_io_write_data(map, LOGGER_OFFSET_SIZE, &zero); - /* set offset after current record */ + /* set offset after current record. */ map += header_get_record_size_from_mask(h, mask); size_t after_current_record = (size_t) (map - file_map); - /* first records do not have a previous partner */ + /* first records do not have a previous partner. */ if (prev_offset == cur_offset) return after_current_record; @@ -140,7 +140,7 @@ size_t tools_reverse_offset(const struct header *h, void *file_map, size_t offse error("Unexpected offset, header %lu, current %lu", prev_offset, cur_offset); - /* modify previous offset */ + /* modify previous offset. */ map = file_map + cur_offset - prev_offset + LOGGER_MASK_SIZE; map = logger_loader_io_write_data(map, LOGGER_OFFSET_SIZE, &prev_offset); @@ -149,7 +149,9 @@ size_t tools_reverse_offset(const struct header *h, void *file_map, size_t offse map -= LOGGER_MASK_SIZE + LOGGER_OFFSET_SIZE; logger_loader_io_read_mask(h, map, &prev_mask, NULL); - if (prev_mask != mask) + /* Check if we are not mixing time stamp and particles */ + if ((prev_mask != 128 && mask == 128) || + (prev_mask == 128 && mask != 128)) error("Unexpected mask: %lu, got %lu", mask, prev_mask); #endif // SWIFT_DEBUG_CHECKS @@ -180,10 +182,10 @@ size_t tools_check_record_consistency(const struct logger_reader *reader, size_t size_t mask; size_t pointed_offset; - /* read mask + offset */ + /* read mask + offset. */ map = logger_loader_io_read_mask(h, map, &mask, &pointed_offset); - /* get absolute offset */ + /* get absolute offset. */ if (header_is_forward(h)) pointed_offset += offset; else if (header_is_backward(h)) { @@ -196,18 +198,19 @@ size_t tools_check_record_consistency(const struct logger_reader *reader, size_t error("Offset are corrupted"); } - /* set offset after current record */ + /* set offset after current record. */ map += header_get_record_size_from_mask(h, mask); if (pointed_offset == offset || pointed_offset == 0) return (size_t) (map - file_init); - /* read mask of the pointed record */ + /* read mask of the pointed record. */ size_t pointed_mask = 0; logger_loader_io_read_mask(h, file_init + pointed_offset, &pointed_mask, NULL); - /* check masks */ - if (pointed_mask != mask) + /* check if not mixing time stamp and particles. */ + if ((pointed_mask != 128 && mask == 128) || + (pointed_mask == 128 && mask != 128)) error("Error in the offset (mask %lu at %lu != %lu at %lu)", mask, offset, pointed_mask, pointed_offset); diff --git a/logger/tests/testLogfileHeader.c b/logger/tests/testLogfileHeader.c index 069a83122bd133ffa6c63ff389429c3c4b5e1304..a97eee0ade578b4c60a81626f931c3d6d9662217 100644 --- a/logger/tests/testLogfileHeader.c +++ b/logger/tests/testLogfileHeader.c @@ -30,7 +30,7 @@ int main(int argc, char *argv[]) { message("Generating the dump."); /* Create required structures. */ - struct logger log; + struct logger_writer log; struct swift_params params; char filename[200] = "testLogfileHeader.yml"; @@ -40,7 +40,7 @@ int main(int argc, char *argv[]) { /* Initialize the logger. */ logger_init(&log, ¶ms); - /* get dump filename */ + /* get dump filename. */ char dump_filename[PARSER_MAX_LINE_SIZE]; strcpy(dump_filename, log.base_name); strcat(dump_filename, ".dump"); @@ -48,7 +48,7 @@ int main(int argc, char *argv[]) { /* Write file header. */ logger_write_file_header(&log); - /* clean memory */ + /* clean memory. */ logger_free(&log); /* Then read the file. @@ -60,14 +60,14 @@ int main(int argc, char *argv[]) { struct logger_logfile *logfile = &reader.log; logfile->reader = &reader; - /* Set verbose level */ + /* Set verbose level. */ reader.verbose = 1; /* Read the header */ logger_logfile_init_from_file(logfile, dump_filename, &reader, /* only_header */ 1); /* - Finally check everything + Finally check everything. */ struct header *h = &logfile->header; diff --git a/logger/tests/testLogfileReader.c b/logger/tests/testLogfileReader.c index f6ad0e44d37c65113f2ef724b023b68afe8260cb..3f9686e8c45a6a1dea329263b6ea91a3af099e3d 100644 --- a/logger/tests/testLogfileReader.c +++ b/logger/tests/testLogfileReader.c @@ -24,6 +24,11 @@ #include "logger_reader.h" #define number_parts 100 +/* Not all the fields are written at every step. + * Here we define how often a few fields are written. + */ +#define period_rho 2 +#define period_h 4 /** * @brief Initialize the particles. @@ -52,6 +57,9 @@ void init_particles(struct part *p, struct xpart *xp) { p[i].id = i; hydro_set_mass(&p[i], 1.5); xp[i].logger_data.last_offset = 0; + + /* Add time bin in order to skip particles. */ + p[i].time_bin = (i % 10) + 1; } } @@ -66,33 +74,19 @@ double get_double_time(int step) { return step * time_base; } + /** * @brief Write a few particles during multiple time steps. * * As only the logger is tested, there is no need to really * evolve the particles. */ -void write_particles(struct logger *log) { +void write_particles(struct logger_writer *log, struct part *parts, struct xpart *xparts) { const int number_steps = 100; - /* Create particles and initialize them. */ - struct part *parts; - if ((parts = (struct part *)malloc(sizeof(struct part) * number_parts)) == NULL) - error("Failed to allocate particles array."); - - struct xpart *xparts; - if ((xparts = (struct xpart *)malloc(sizeof(struct xpart) * number_parts)) == NULL) - error("Failed to allocate xparticles array."); - - init_particles(parts, xparts); - - /* - Init logger - */ - - /* Do step */ + /* Loop over all the steps. */ for(int i = 0; i < number_steps; i++) { integertime_t ti_int = get_integer_time(i); double ti_double = get_double_time(i); @@ -104,23 +98,35 @@ void write_particles(struct logger *log) { * to store the particles in current time step. */ logger_ensure_size(log, number_parts, /* number gpart */0, 0); - /* Run step */ + /* Loop over all the particles. */ for(int j = 0; j < number_parts; j++) { - /* Write particle */ - /* TODO Currently writing everything, should adapt it through time */ - logger_log_part(log, &parts[j], - 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, + /* Skip some particles. */ + if (i % parts[j].time_bin != 0) + continue; + + /* Write a time information to check that the correct particle is read. */ + parts[j].x[0] = i; + + /* Write this particle. */ + 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_consts].mask; + + int number_particle_step = i / parts[j].time_bin; + + if (number_particle_step % period_h == 0) + mask |= logger_mask_data[logger_h].mask; + if (number_particle_step % period_rho == 0) + mask |= logger_mask_data[logger_rho].mask; + + logger_log_part(log, &parts[j], mask, &xparts[j].logger_data.last_offset); } - // TODO write index files + // TODO write index files. } /* Mark the current time step in the particle logger file. */ @@ -130,107 +136,112 @@ void write_particles(struct logger *log) { &log->timestamp_offset); - /* Cleanup */ - free(parts); - free(xparts); } -/** - * @brief Read a record (timestamp or particle) - * - * @param reader The #reader. - * @param lp (out) The #logger_particle (if the record is a particle). - * @param time (out) The time read (if the record is a timestamp). - * @param is_particle Is the record a particle (or a timestamp)? - * @param offset The offset in the file. - * - * @return The offset after this record. - */ -size_t read_record(struct logger_reader *reader, struct logger_particle *lp, - double *time, int *is_particle, size_t offset) { - - struct logger_logfile *log = &reader->log; - - /* Read mask to find out if timestamp or particle */ - size_t mask = 0; - logger_loader_io_read_mask(&log->header, log->log.map + offset, &mask, NULL); - - /* Check if timestamp or not */ - int ind = header_get_field_index(&log->header, "timestamp"); - if (ind == -1) { - error("File header does not contain a mask for time"); - } - if (log->header.masks[ind].mask == mask) { - *is_particle = 0; - integertime_t int_time = 0; - offset = time_read(&int_time, time, reader, offset); - } - else { - *is_particle = 1; - offset = logger_particle_read(lp, reader, offset, *time, logger_reader_const); +/** Count the number of active particles. */ +int get_number_active_particles(int step, struct part *p) { + int count = 0; + for(int i = 0; i < number_parts; i++) { + if (step % p[i].time_bin == 0) + count += 1; } - - return offset; + return count; } - /** * @brief Check that the reader contains the correct data * * @param reader The #logger_reader. */ -void check_data(struct logger_reader *reader) { +void check_data(struct logger_reader *reader, struct part *parts, struct xpart *xparts) { /* No need to check the header, this is already done in testHeader.c */ - /* Get required structures */ + /* Get required structures. */ struct logger_logfile *logfile = &reader->log; struct logger_particle lp; logger_particle_init(&lp); - /* Generate the particles again */ - struct part *parts; - if ((parts = (struct part *)malloc(sizeof(struct part) * number_parts)) == NULL) - error("Failed to allocate particles array."); - - struct xpart *xparts; - if ((xparts = (struct xpart *)malloc(sizeof(struct xpart) * number_parts)) == NULL) - error("Failed to allocate xparticles array."); - - init_particles(parts, xparts); - + /* Define a few variables */ double time = get_double_time(0); int is_particle = 0; - int step = 0; + int step = -1; + + /* Number of particle found during this time step. */ + int count = 0; + /* Set it to an impossible value in order to flag it. */ + const size_t id_flag = 5 * number_parts; + size_t previous_id = id_flag; - /* Loop over each record */ - for(size_t offset = read_record(reader, &lp, &time, &is_particle, logfile->header.offset_first_record); + /* Loop over each record. */ + for(size_t offset = reader_read_record(reader, &lp, &time, &is_particle, logfile->header.offset_first_record); offset < logfile->log.file_size; - offset = read_record(reader, &lp, &time, &is_particle, offset)) { + offset = reader_read_record(reader, &lp, &time, &is_particle, offset)) { + /* Do the particle case */ if (is_particle) { - /* Check data if it is a particle */ + count += 1; + + /* + Check that we are really increasing the id in the logfile. + See the writing part to see that we are always increasing the id. + */ + if (previous_id != id_flag && previous_id >= lp.id) { + error("Wrong particle found"); + previous_id = lp.id; + } + + /* Get the corresponding particle */ if (lp.id >= number_parts) error("Wrong id %zi", lp.id); struct part *p = &parts[lp.id]; + /* Check the record's data. */ for(int i = 0; i < 3; i++) { - assert(p->x[i] == lp.pos[i]); + /* in the first index, we are storing the step information. */ + if (i == 0) + assert(step == lp.pos[i]); + else + assert(p->x[i] == lp.pos[i]); assert(p->v[i] == lp.vel[i]); assert(p->a_hydro[i] == lp.acc[i]); } assert(p->entropy == lp.entropy); - assert(p->h == lp.h); - assert(p->rho == lp.density); assert(p->mass == lp.mass); + + /* Check optional fields. */ + int number_steps = step / p->time_bin; + if (number_steps % period_h == 0) { + assert(p->h == lp.h); + } + else { + assert(-1 == lp.h); + } + if (number_steps % period_rho == 0) { + assert(p->rho == lp.density); + } + else { + assert(-1 == lp.density); + } } + /* Time stamp case. */ else { - /* Check data if it is a timestamp */ - assert(time == get_double_time(step)); + + /* Check if we have the current amount of particles in previous step. */ + if (step != -1 && count != get_number_active_particles(step, parts)) + error("The reader did not find the correct number of particles during step %i", step); step += 1; + + /* Reset some variables. */ + previous_id = id_flag; + count = 0; + + /* Check the record's data. */ + assert(time == get_double_time(step)); + } } @@ -246,17 +257,28 @@ int main(int argc, char *argv[]) { message("Generating the dump."); /* Create required structures. */ - struct logger log; + struct logger_writer log; struct swift_params params; char filename[200] = "testLogfileReader.yml"; /* Read parameters. */ parser_read_file(filename, ¶ms); + /* Initialize the particles. */ + struct part *parts; + if ((parts = (struct part *)malloc(sizeof(struct part) * number_parts)) == NULL) + error("Failed to allocate particles array."); + + struct xpart *xparts; + if ((xparts = (struct xpart *)malloc(sizeof(struct xpart) * number_parts)) == NULL) + error("Failed to allocate xparticles array."); + + init_particles(parts, xparts); + /* Initialize the logger. */ logger_init(&log, ¶ms); - /* get dump filename */ + /* get dump filename. */ char dump_filename[PARSER_MAX_LINE_SIZE]; message("%s", log.base_name); strcpy(dump_filename, log.base_name); @@ -266,7 +288,7 @@ int main(int argc, char *argv[]) { logger_write_file_header(&log); /* Write particles. */ - write_particles(&log); + write_particles(&log, parts, xparts); /* clean memory */ logger_free(&log); @@ -279,17 +301,21 @@ int main(int argc, char *argv[]) { /* Generate required structure for reading. */ struct logger_reader reader; - /* Set verbose level */ + /* Set verbose level. */ reader.verbose = 1; - /* Read the header */ + /* Read the header. */ logger_reader_init(&reader, dump_filename, /* verbose */ 1); /* - Finally check everything + Finally check everything. */ - check_data(&reader); + check_data(&reader, parts, xparts); + + /* Do some cleanup. */ + free(parts); + free(xparts); return 0; } diff --git a/src/engine.c b/src/engine.c index 00cd294c4ad764341b010e0fa4e2041e7a285d37..2b9cbd3895c21246c3f89fe1b69436e4a84185cb 100644 --- a/src/engine.c +++ b/src/engine.c @@ -5009,7 +5009,7 @@ void engine_init(struct engine *e, struct space *s, struct swift_params *params, e->total_nr_tasks = 0; #if defined(WITH_LOGGER) - e->logger = (struct logger *)malloc(sizeof(struct logger)); + e->logger = (struct logger_writer *)malloc(sizeof(struct logger_writer)); logger_init(e->logger, params); #endif diff --git a/src/engine.h b/src/engine.h index 3c74f89dfcade93bb67d21eb6607cdd4cb80155d..3484336039c64baa43469b1152f1856f70ee2823 100644 --- a/src/engine.h +++ b/src/engine.h @@ -379,7 +379,7 @@ struct engine { struct repartition *reparttype; #ifdef WITH_LOGGER - struct logger *logger; + struct logger_writer *logger; #endif /* How many steps have we done with the same set of tasks? */ diff --git a/src/logger.c b/src/logger.c index 078f0a6e38b830c919ec6f28861f71120cef6e08..f46cdcf9e89b3d80f096f5429fbd9fad4a280193 100644 --- a/src/logger.c +++ b/src/logger.c @@ -44,41 +44,41 @@ /* * Thoses are definitions from the format and therefore should not be changed! */ -/* number of bytes for a mask */ +/* Number of bytes for a mask. */ // TODO change this to number of bits #define logger_mask_size 1 -/* number of bits for chunk header */ +/* Number of bits for chunk header. */ #define logger_header_bytes 8 -/* number bytes for an offset */ +/* Number bytes for an offset. */ #define logger_offset_size logger_header_bytes - logger_mask_size -/* number of bytes for the file format information */ +/* Number of bytes for the file format information. */ #define logger_format_size 20 -/* number of bytes for the labels in the header */ +/* Number of bytes for the labels in the header. */ #define logger_label_size 20 char logger_file_format[logger_format_size] = "SWIFT_LOGGER"; const struct mask_data logger_mask_data[logger_count_mask] = { - /* Particle's position */ + /* Particle's position. */ {3 * sizeof(double), 1 << logger_x, "positions"}, - /* Particle's velocity */ + /* Particle's velocity. */ {3 * sizeof(float), 1 << logger_v, "velocities"}, - /* Particle's acceleration */ + /* Particle's acceleration. */ {3 * sizeof(float), 1 << logger_a, "accelerations"}, - /* Particle's entropy */ + /* Particle's entropy. */ {sizeof(float), 1 << logger_u, "entropy"}, - /* Particle's smoothing length */ + /* Particle's smoothing length. */ {sizeof(float), 1 << logger_h, "smoothing length"}, - /* Particle's density */ + /* Particle's density. */ {sizeof(float), 1 << logger_rho, "density"}, - /* Particle's constants: mass (float) and ID (long long) */ + /* 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) */ + factor or time). */ {sizeof(integertime_t) + sizeof(double), 1 << logger_timestamp, "timestamp"}}; @@ -96,11 +96,11 @@ const struct mask_data logger_mask_data[logger_count_mask] = { */ char *logger_write_chunk_header(char *buff, const unsigned int *mask, const size_t *offset, const size_t offset_new) { - /* write mask */ + /* write mask. */ memcpy(buff, mask, logger_mask_size); buff += logger_mask_size; - /* write offset */ + /* write offset. */ size_t diff_offset = offset_new - *offset; memcpy(buff, &diff_offset, logger_offset_size); buff += logger_offset_size; @@ -109,7 +109,7 @@ char *logger_write_chunk_header(char *buff, const unsigned int *mask, } /** - * @brief Write to the dump + * @brief Write to the dump. * * @param d #dump file * @param offset (return) offset of the data @@ -118,13 +118,13 @@ char *logger_write_chunk_header(char *buff, const unsigned int *mask, */ void logger_write_data(struct dump *d, size_t *offset, size_t size, const void *p) { - /* get buffer */ + /* get buffer. */ char *buff = dump_get(d, size, offset); - /* write data to the buffer */ + /* write data to the buffer. */ memcpy(buff, p, size); - /* Update offset to end of chunk */ + /* Update offset to end of chunk. */ *offset += size; } @@ -168,15 +168,15 @@ int logger_compute_chunk_size(unsigned int mask) { * @param log The #logger * @param e The #engine */ -void logger_log_all(struct logger *log, const struct engine *e) { +void logger_log_all(struct logger_writer *log, const struct engine *e) { - /* Ensure that enough space is available */ + /* Ensure that enough space is available. */ logger_ensure_size(log, e->total_nr_parts, e->total_nr_gparts, 0); #ifdef SWIFT_DEBUG_CHECKS message("Need to implement stars"); #endif - /* some constants */ + /* some constants. */ const struct space *s = e->s; const unsigned int mask = logger_mask_data[logger_x].mask | logger_mask_data[logger_v].mask | @@ -184,17 +184,17 @@ void logger_log_all(struct logger *log, const struct engine *e) { logger_mask_data[logger_h].mask | logger_mask_data[logger_rho].mask | logger_mask_data[logger_consts].mask; - /* loop over all parts */ + /* 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); s->xparts[i].logger_data.steps_since_last_output = 0; } - /* loop over all gparts */ + /* loop over all gparts. */ if (e->total_nr_gparts > 0) error("Not implemented"); - /* loop over all sparts */ + /* loop over all sparts. */ // TODO } @@ -207,7 +207,7 @@ void logger_log_all(struct logger *log, const struct engine *e) { * @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, +void logger_log_part(struct logger_writer *log, const struct part *p, unsigned int mask, size_t *offset) { /* Make sure we're not writing a timestamp. */ @@ -286,7 +286,7 @@ void logger_log_part(struct logger *log, const struct part *p, * @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, +void logger_log_gpart(struct logger_writer *log, const struct gpart *p, unsigned int mask, size_t *offset) { /* Make sure we're not writing a timestamp. */ @@ -328,7 +328,7 @@ void logger_log_gpart(struct logger *log, const struct gpart *p, /* Particle constants, which is a bit more complicated. */ if (mask & logger_mask_data[logger_consts].mask) { - // TODO make it dependent of logger_mask_data + // 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)); @@ -348,7 +348,7 @@ void logger_log_gpart(struct logger *log, const struct gpart *p, * @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, +void logger_log_timestamp(struct logger_writer *log, integertime_t timestamp, double time, size_t *offset) { struct dump *dump = &log->dump; @@ -365,11 +365,11 @@ 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 + // TODO make it dependent of logger_mask_data. memcpy(buff, ×tamp, sizeof(integertime_t)); buff += sizeof(integertime_t); - /* Store the time */ + /* Store the time. */ memcpy(buff, &time, sizeof(double)); /* Update the log message offset. */ @@ -387,21 +387,21 @@ void logger_log_timestamp(struct logger *log, integertime_t timestamp, * @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, +void logger_ensure_size(struct logger_writer *log, size_t total_nr_parts, size_t total_nr_gparts, size_t total_nr_sparts) { - /* count part memory */ + /* count part memory. */ size_t limit = log->max_chunk_size; limit *= total_nr_parts; - /* count gpart memory */ + /* count gpart memory. */ if (total_nr_gparts > 0) error("Not implemented"); - /* count spart memory */ + /* count spart memory. */ if (total_nr_sparts > 0) error("Not implemented"); - /* ensure enough space in dump */ + /* ensure enough space in dump. */ dump_ensure(&log->dump, limit, log->buffer_scale * limit); } @@ -411,8 +411,8 @@ void logger_ensure_size(struct logger *log, size_t total_nr_parts, * @param log The #logger * @param params The #swift_params */ -void logger_init(struct logger *log, struct swift_params *params) { - /* read parameters */ +void logger_init(struct logger_writer *log, struct swift_params *params) { + /* read parameters. */ log->delta_step = parser_get_param_int(params, "Logger:delta_step"); size_t buffer_size = parser_get_opt_param_float(params, "Logger:initial_buffer_size", 0.5) * @@ -421,24 +421,24 @@ void logger_init(struct logger *log, struct swift_params *params) { parser_get_opt_param_float(params, "Logger:buffer_scale", 10); parser_get_param_string(params, "Logger:basename", log->base_name); - /* set initial value of parameters */ + /* set initial value of parameters. */ log->timestamp_offset = 0; - /* generate dump filename */ + /* generate dump filename. */ char logger_name_file[PARSER_MAX_LINE_SIZE]; strcpy(logger_name_file, log->base_name); strcat(logger_name_file, ".dump"); - /* Compute max size for a particle chunk */ + /* Compute max size for a particle chunk. */ int max_size = logger_offset_size + logger_mask_size; - /* Loop over all fields except timestamp */ + /* Loop over all fields except timestamp. */ for (int i = 0; i < logger_count_mask - 1; i++) { max_size += logger_mask_data[i].size; } log->max_chunk_size = max_size; - /* init dump */ + /* init dump. */ dump_init(&log->dump, logger_name_file, buffer_size); } @@ -447,7 +447,7 @@ void logger_init(struct logger *log, struct swift_params *params) { * * @param log The #logger */ -void logger_free(struct logger *log) { dump_close(&log->dump); } +void logger_free(struct logger_writer *log) { dump_close(&log->dump); } /** * @brief Write a file header to a logger file @@ -455,9 +455,9 @@ void logger_free(struct logger *log) { dump_close(&log->dump); } * @param log The #logger * */ -void logger_write_file_header(struct logger *log) { +void logger_write_file_header(struct logger_writer *log) { - /* get required variables */ + /* get required variables. */ struct dump *dump = &log->dump; size_t file_offset = dump->file_offset; @@ -467,45 +467,45 @@ void logger_write_file_header(struct logger *log) { "The logger is not empty." "This function should be called before writing anything in the logger"); - /* Write format information */ + /* Write format information. */ logger_write_data(dump, &file_offset, logger_format_size, &logger_file_format); - /* Write the major version number */ + /* Write the major version number. */ int major = logger_major_version; logger_write_data(dump, &file_offset, sizeof(int), &major); - /* Write the minor version number */ + /* Write the minor version number. */ int minor = logger_minor_version; logger_write_data(dump, &file_offset, sizeof(int), &minor); - /* write offset direction */ + /* write offset direction. */ const int reversed = 0; logger_write_data(dump, &file_offset, sizeof(int), &reversed); - /* placeholder to write the offset of the first log here */ + /* 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 */ + /* write number of bytes used for names. */ const unsigned int label_size = logger_label_size; logger_write_data(dump, &file_offset, sizeof(unsigned int), &label_size); - /* write number of masks */ + /* write number of masks. */ const unsigned int count_mask = logger_count_mask; logger_write_data(dump, &file_offset, sizeof(unsigned int), &count_mask); - /* write masks */ - // loop over all mask type + /* write masks. */ + // loop over all mask type. for (int i = 0; i < logger_count_mask; i++) { - // mask name + // mask name. logger_write_data(dump, &file_offset, logger_label_size, &logger_mask_data[i].name); - // mask size + // mask size. logger_write_data(dump, &file_offset, sizeof(unsigned int), &logger_mask_data[i].size); } - /* last step: write first offset */ + /* last step: write first offset. */ memcpy(skip_header, &file_offset, logger_offset_size); } @@ -595,7 +595,7 @@ int logger_read_part(struct part *p, size_t *offset, const char *buff) { /* Particle constants, which is a bit more complicated. */ if (mask & logger_mask_data[logger_rho].mask) { - // TODO make it dependent of logger_mask_data + // TODO make it dependent of logger_mask_data. memcpy(&p->mass, buff, sizeof(float)); buff += sizeof(float); memcpy(&p->id, buff, sizeof(long long)); @@ -698,7 +698,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 + // 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 1df13296bb339b9648caf3a5877d6cebd6095808..0ba3408e99a31c0cb34cb7553f90f113696a8de2 100644 --- a/src/logger.h +++ b/src/logger.h @@ -28,11 +28,10 @@ #include "timeline.h" #include "units.h" -/* Forward declaration */ +/* Forward declaration. */ struct dump; struct gpart; struct part; -/* TODO remove dependency */ struct engine; #define logger_major_version 0 @@ -85,18 +84,18 @@ enum logger_masks_number { logger_h = 4, logger_rho = 5, logger_consts = 6, - logger_timestamp = 7, /* expect it to be before count */ - logger_count_mask = 8, /* Need to be the last */ + logger_timestamp = 7, /* expect it to be before count. */ + logger_count_mask = 8, /* Need to be the last. */ } __attribute__((packed)); struct mask_data { - /* Number of bytes for a mask */ + /* Number of bytes for a mask. */ int size; - /* Mask value */ + /* Mask value. */ unsigned int mask; - /* name of the mask */ + /* Name of the mask. */ char name[100]; }; @@ -105,51 +104,51 @@ extern const struct mask_data logger_mask_data[logger_count_mask]; /* Size of the strings. */ #define logger_string_length 200 -/* structure containing global data */ -struct logger { - /* Number of particle steps between dumping a chunk of data */ +/* structure containing global data. */ +struct logger_writer { + /* Number of particle steps between dumping a chunk of data. */ short int delta_step; - /* Logger basename */ + /* Logger basename. */ char base_name[logger_string_length]; - /* Dump file */ + /* Dump file (In the reader, the dump is cleaned, therefore it is renamed logfile). */ struct dump dump; - /* timestamp offset for logger*/ + /* timestamp offset for logger. */ size_t timestamp_offset; - /* scaling factor when buffer is too small */ + /* scaling factor when buffer is too small. */ float buffer_scale; - /* Size of a chunk if every mask are activated */ + /* Size of a chunk if every mask are activated. */ int max_chunk_size; } SWIFT_STRUCT_ALIGN; -/* required structure for each particle type */ +/* required structure for each particle type. */ struct logger_part_data { - /* Number of particle updates since last output */ + /* Number of particle updates since last output. */ int steps_since_last_output; - /* offset of last particle log entry */ + /* offset of last particle log entry. */ size_t last_offset; }; /* 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, +void logger_log_all(struct logger_writer *log, const struct engine *e); +void logger_log_part(struct logger_writer *log, const struct part *p, unsigned int mask, size_t *offset); -void logger_log_gpart(struct logger *log, const struct gpart *p, +void logger_log_gpart(struct logger_writer *log, const struct gpart *p, unsigned int mask, size_t *offset); -void logger_init(struct logger *log, struct swift_params *params); -void logger_free(struct logger *log); -void logger_log_timestamp(struct logger *log, integertime_t t, double time, +void logger_init(struct logger_writer *log, struct swift_params *params); +void logger_free(struct logger_writer *log); +void logger_log_timestamp(struct logger_writer *log, integertime_t t, double time, size_t *offset); -void logger_ensure_size(struct logger *log, size_t total_nr_parts, +void logger_ensure_size(struct logger_writer *log, size_t total_nr_parts, size_t total_nr_gparts, size_t total_nr_sparts); -void logger_write_file_header(struct logger *log); +void logger_write_file_header(struct logger_writer *log); 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); @@ -169,12 +168,13 @@ INLINE static void logger_part_data_init(struct logger_part_data *logger) { /** * @brief Should this particle write its data now ? * - * @param xp The #xpart. - * @param e The #engine containing information about the current time. - * @return 1 if the #part should write, 0 otherwise. + * @param logger_data The #logger_part_data of a particle. + * @param log The #logger. + * + * @return 1 if the particule should be writen, 0 otherwise. */ __attribute__((always_inline)) INLINE static int logger_should_write( - const struct logger_part_data *logger_data, const struct logger *log) { + const struct logger_part_data *logger_data, const struct logger_writer *log) { return (logger_data->steps_since_last_output > log->delta_step); } diff --git a/src/logger_io.c b/src/logger_io.c index 3cef3497b2912411cea6763f5418bc76a7f5ece0..9a4f10ea2e256e738f29d92057c824e7d948d735 100644 --- a/src/logger_io.c +++ b/src/logger_io.c @@ -87,7 +87,7 @@ void write_index_single(struct engine* e, const char* baseName, // struct spart* sparts = e->s->sparts; static int outputCount = 0; - struct logger* log = e->logger; + struct logger_writer* log = e->logger; /* Number of unassociated gparts */ const size_t Ndm = Ntot > 0 ? Ntot - (Ngas + Nstars) : 0;