From 2edb0d02d57001c523c61d2d02d803ee607a47f4 Mon Sep 17 00:00:00 2001 From: Matthieu Schaller <matthieu.schaller@durham.ac.uk> Date: Mon, 7 May 2018 23:11:19 +0200 Subject: [PATCH] Improve the way we define the time of the first snapshot and statistics in cosmology and non-cosmology modes. --- examples/EAGLE_100/eagle_100.yml | 10 +- examples/EAGLE_12/eagle_12.yml | 9 +- examples/EAGLE_25/eagle_25.yml | 9 +- examples/EAGLE_50/eagle_50.yml | 10 +- examples/EAGLE_6/eagle_6.yml | 11 +- examples/parameter_example.yml | 7 +- src/engine.c | 241 +++++++++++++++++++++++++------ src/engine.h | 23 ++- 8 files changed, 252 insertions(+), 68 deletions(-) diff --git a/examples/EAGLE_100/eagle_100.yml b/examples/EAGLE_100/eagle_100.yml index b3cbbccc7a..a570d81f40 100644 --- a/examples/EAGLE_100/eagle_100.yml +++ b/examples/EAGLE_100/eagle_100.yml @@ -28,12 +28,16 @@ Scheduler: # Parameters governing the snapshots Snapshots: basename: eagle # Common part of the name of output files - time_first: 1. # Time of the first output (in internal units) - delta_time: 1e-3 # Time difference between consecutive outputs (in internal units) + scale_factor_first: 0.92 # Scale-factor of the first snaphot (cosmological run) + time_first: 0.01 # Time of the first output (non-cosmological run) (in internal units) + delta_time: 1.10 # Time difference between consecutive outputs (in internal units) + compression: 4 # Parameters governing the conserved quantities statistics Statistics: - delta_time: 1e-2 # Time between statistics output + scale_factor_first: 0.92 # Scale-factor of the first stat dump (cosmological run) + time_first: 0.01 # Time of the first stat dump (non-cosmological run) (in internal units) + delta_time: 1.05 # Time between statistics output # Parameters for the self-gravity scheme Gravity: diff --git a/examples/EAGLE_12/eagle_12.yml b/examples/EAGLE_12/eagle_12.yml index 933f085ccd..e400610d96 100644 --- a/examples/EAGLE_12/eagle_12.yml +++ b/examples/EAGLE_12/eagle_12.yml @@ -28,13 +28,16 @@ Scheduler: # Parameters governing the snapshots Snapshots: basename: eagle # Common part of the name of output files - time_first: 1. # Time of the first output (in internal units) - delta_time: 1e-3 # Time difference between consecutive outputs (in internal units) + scale_factor_first: 0.92 # Scale-factor of the first snaphot (cosmological run) + time_first: 0.01 # Time of the first output (non-cosmological run) (in internal units) + delta_time: 1.10 # Time difference between consecutive outputs (in internal units) compression: 4 # Parameters governing the conserved quantities statistics Statistics: - delta_time: 1e-2 # Time between statistics output + scale_factor_first: 0.92 # Scale-factor of the first stat dump (cosmological run) + time_first: 0.01 # Time of the first stat dump (non-cosmological run) (in internal units) + delta_time: 1.05 # Time between statistics output # Parameters for the self-gravity scheme Gravity: diff --git a/examples/EAGLE_25/eagle_25.yml b/examples/EAGLE_25/eagle_25.yml index 37ad91a294..2a478d822c 100644 --- a/examples/EAGLE_25/eagle_25.yml +++ b/examples/EAGLE_25/eagle_25.yml @@ -28,13 +28,16 @@ Scheduler: # Parameters governing the snapshots Snapshots: basename: eagle # Common part of the name of output files - time_first: 1. # Time of the first output (in internal units) - delta_time: 1e-3 # Time difference between consecutive outputs (in internal units) + scale_factor_first: 0.92 # Scale-factor of the first snaphot (cosmological run) + time_first: 0.01 # Time of the first output (non-cosmological run) (in internal units) + delta_time: 1.10 # Time difference between consecutive outputs (in internal units) compression: 4 # Parameters governing the conserved quantities statistics Statistics: - delta_time: 1e-2 # Time between statistics output + scale_factor_first: 0.92 # Scale-factor of the first stat dump (cosmological run) + time_first: 0.01 # Time of the first stat dump (non-cosmological run) (in internal units) + delta_time: 1.05 # Time between statistics output # Parameters for the self-gravity scheme Gravity: diff --git a/examples/EAGLE_50/eagle_50.yml b/examples/EAGLE_50/eagle_50.yml index 021e6b8ab3..5e4193e5c1 100644 --- a/examples/EAGLE_50/eagle_50.yml +++ b/examples/EAGLE_50/eagle_50.yml @@ -28,12 +28,16 @@ Scheduler: # Parameters governing the snapshots Snapshots: basename: eagle # Common part of the name of output files - time_first: 1. # Time of the first output (in internal units) - delta_time: 1e-3 # Time difference between consecutive outputs (in internal units) + scale_factor_first: 0.92 # Scale-factor of the first snaphot (cosmological run) + time_first: 0.01 # Time of the first output (non-cosmological run) (in internal units) + delta_time: 1.10 # Time difference between consecutive outputs (in internal units) + compression: 4 # Parameters governing the conserved quantities statistics Statistics: - delta_time: 1e-2 # Time between statistics output + scale_factor_first: 0.92 # Scale-factor of the first stat dump (cosmological run) + time_first: 0.01 # Time of the first stat dump (non-cosmological run) (in internal units) + delta_time: 1.05 # Time between statistics output # Parameters for the self-gravity scheme Gravity: diff --git a/examples/EAGLE_6/eagle_6.yml b/examples/EAGLE_6/eagle_6.yml index 839ccf7e42..de1028ca66 100644 --- a/examples/EAGLE_6/eagle_6.yml +++ b/examples/EAGLE_6/eagle_6.yml @@ -24,17 +24,20 @@ TimeIntegration: time_end: 1e-2 # The end time of the simulation (in internal units). dt_min: 1e-10 # The minimal time-step size of the simulation (in internal units). dt_max: 1e-4 # The maximal time-step size of the simulation (in internal units). - + # Parameters governing the snapshots Snapshots: basename: eagle # Common part of the name of output files - time_first: 1. # Time of the first output (in internal units) - delta_time: 1e-3 # Time difference between consecutive outputs (in internal units) + scale_factor_first: 0.92 # Scale-factor of the first snaphot (cosmological run) + time_first: 0.01 # Time of the first output (non-cosmological run) (in internal units) + delta_time: 1.10 # Time difference between consecutive outputs (in internal units) compression: 4 # Parameters governing the conserved quantities statistics Statistics: - delta_time: 1e-2 # Time between statistics output + scale_factor_first: 0.92 # Scale-factor of the first stat dump (cosmological run) + time_first: 0.01 # Time of the first stat dump (non-cosmological run) (in internal units) + delta_time: 1.05 # Time between statistics output # Parameters for the self-gravity scheme Gravity: diff --git a/examples/parameter_example.yml b/examples/parameter_example.yml index edf1afe51a..c7dd4846ad 100644 --- a/examples/parameter_example.yml +++ b/examples/parameter_example.yml @@ -67,7 +67,8 @@ TimeIntegration: # Parameters governing the snapshots Snapshots: basename: output # Common part of the name of output files - time_first: 0. # Time of the first output (in internal units) + scale_factor_first: 0.1 # (Optional) Scale-factor of the first snapshot if cosmological time-integration. + time_first: 0. # (Optional) Time of the first output if non-cosmological time-integration (in internal units) delta_time: 0.01 # Time difference between consecutive outputs (in internal units) compression: 0 # (Optional) Set the level of compression of the HDF5 datasets [0-9]. 0 does no compression. UnitMass_in_cgs: 1 # (Optional) Unit system for the outputs (Grams) @@ -78,7 +79,9 @@ Snapshots: # Parameters governing the conserved quantities statistics Statistics: - delta_time: 1e-2 # Time between statistics output + delta_time: 1e-2 # Time between statistics output + scale_factor_first: 0.1 # (Optional) Scale-factor of the first statistics dump if cosmological time-integration. + time_first: 0. # (Optional) Time of the first stats output if non-cosmological time-integration (in internal units) energy_file_name: energy # (Optional) File name for energy output timestep_file_name: timesteps # (Optional) File name for timing information output. Note: No underscores "_" allowed in file name diff --git a/src/engine.c b/src/engine.c index d3e05cddc9..d88b0f9f23 100644 --- a/src/engine.c +++ b/src/engine.c @@ -4145,9 +4145,23 @@ void engine_print_stats(struct engine *e) { e->policy & engine_policy_self_gravity); /* Be verbose about this */ - if (e->nodeID == 0) message("Saving statistics at t=%e.", e->time); + if (e->nodeID == 0) { + if (e->policy & engine_policy_cosmology) + message("Saving statistics at a=%e", + exp(e->ti_current * e->time_base) * e->cosmology->a_begin); + else + message("Saving statistics at t=%e", + e->ti_current * e->time_base + e->time_begin); + } #else - if (e->verbose) message("Saving statistics at t=%e.", e->time); + if (e->verbose) { + if (e->policy & engine_policy_cosmology) + message("Saving statistics at a=%e", + exp(e->ti_current * e->time_base) * e->cosmology->a_begin); + else + message("Saving statistics at t=%e", + e->ti_current * e->time_base + e->time_begin); + } #endif e->save_stats = 0; @@ -4177,6 +4191,9 @@ void engine_print_stats(struct engine *e) { if (e->nodeID == 0) stats_print_to_file(e->file_stats, &global_stats, e->time); + /* Flag that we dumped some statistics */ + e->step_props |= engine_step_prop_statistics; + if (e->verbose) message("took %.3f %s.", clocks_from_ticks(getticks() - tic), clocks_getunit()); @@ -4609,11 +4626,11 @@ void engine_step(struct engine *e) { e->forcerebuild = e->collect_group1.forcerebuild; /* Save some statistics ? */ - if (e->time - e->timeLastStatistics >= e->deltaTimeStatistics) + if (e->ti_end_min >= e->ti_next_stats && e->ti_next_stats > 0) e->save_stats = 1; /* Do we want a snapshot? */ - if (e->ti_end_min >= e->ti_nextSnapshot && e->ti_nextSnapshot > 0) + if (e->ti_end_min >= e->ti_next_snapshot && e->ti_next_snapshot > 0) e->dump_snapshot = 1; /* Drift everybody (i.e. what has not yet been drifted) */ @@ -4630,9 +4647,6 @@ void engine_step(struct engine *e) { /* ... and find the next output time */ engine_compute_next_snapshot_time(e); - - /* Flag that we dumped a snapshot */ - e->step_props |= engine_step_prop_snapshot; } /* Save some statistics */ @@ -4642,10 +4656,7 @@ void engine_step(struct engine *e) { engine_print_stats(e); /* and move on */ - e->timeLastStatistics += e->deltaTimeStatistics; - - /* Flag that we dumped some statistics */ - e->step_props |= engine_step_prop_statistics; + engine_compute_next_statistics_time(e); } /* Now apply all the collected time step updates and particle counts. */ @@ -4782,7 +4793,14 @@ void engine_drift_all(struct engine *e) { const ticks tic = getticks(); #ifdef SWIFT_DEBUG_CHECKS - if (e->nodeID == 0) message("Drifting all"); + if (e->nodeID == 0) { + if (e->policy & engine_policy_cosmology) + message("Drifting all to a=%e", + exp(e->ti_current * e->time_base) * e->cosmology->a_begin); + else + message("Drifting all to t=%e", + e->ti_current * e->time_base + e->time_begin); + } #endif threadpool_map(&e->threadpool, engine_do_drift_all_mapper, e->s->cells_top, @@ -4875,6 +4893,17 @@ void engine_reconstruct_multipoles(struct engine *e) { const ticks tic = getticks(); +#ifdef SWIFT_DEBUG_CHECKS + if (e->nodeID == 0) { + if (e->policy & engine_policy_cosmology) + message("Reconstructing multipoles at a=%e", + exp(e->ti_current * e->time_base) * e->cosmology->a_begin); + else + message("Reconstructing multipoles at t=%e", + e->ti_current * e->time_base + e->time_begin); + } +#endif + threadpool_map(&e->threadpool, engine_do_reconstruct_multipoles_mapper, e->s->cells_top, e->s->nr_cells, sizeof(struct cell), 0, e); @@ -5214,9 +5243,23 @@ void engine_dump_snapshot(struct engine *e) { e->policy & engine_policy_self_gravity); /* Be verbose about this */ - if (e->nodeID == 0) message("writing snapshot at t=%e.", e->time); + if (e->nodeID == 0) { + if (e->policy & engine_policy_cosmology) + message("Dumping snapshot at a=%e", + exp(e->ti_current * e->time_base) * e->cosmology->a_begin); + else + message("Dumping snapshot at t=%e", + e->ti_current * e->time_base + e->time_begin); + } #else - if (e->verbose) message("writing snapshot at t=%e.", e->time); + if (e->verbose) { + if (e->policy & engine_policy_cosmology) + message("Dumping snapshot at a=%e", + exp(e->ti_current * e->time_base) * e->cosmology->a_begin); + else + message("Dumping snapshot at t=%e", + e->ti_current * e->time_base + e->time_begin); + } #endif /* Dump... */ @@ -5239,6 +5282,9 @@ void engine_dump_snapshot(struct engine *e) { e->dump_snapshot = 0; + /* Flag that we dumped a snapshot */ + e->step_props |= engine_step_prop_snapshot; + clocks_gettime(&time2); if (e->verbose) message("writing particle properties took %.3f %s.", @@ -5360,11 +5406,13 @@ void engine_init(struct engine *e, struct space *s, e->max_active_bin = num_time_bins; e->min_active_bin = 1; e->internal_units = internal_units; - e->timeFirstSnapshot = - parser_get_param_double(params, "Snapshots:time_first"); - e->deltaTimeSnapshot = + e->a_first_snapshot = + parser_get_opt_param_double(params, "Snapshots:scale_factor_first", 0.1); + e->time_first_snapshot = + parser_get_opt_param_double(params, "Snapshots:time_first", 0.); + e->delta_time_snapshot = parser_get_param_double(params, "Snapshots:delta_time"); - e->ti_nextSnapshot = 0; + e->ti_next_snapshot = 0; parser_get_param_string(params, "Snapshots:basename", e->snapshotBaseName); e->snapshotCompression = parser_get_opt_param_int(params, "Snapshots:compression", 0); @@ -5373,9 +5421,13 @@ void engine_init(struct engine *e, struct space *s, e->snapshotOutputCount = 0; e->dt_min = parser_get_param_double(params, "TimeIntegration:dt_min"); e->dt_max = parser_get_param_double(params, "TimeIntegration:dt_max"); - e->deltaTimeStatistics = + e->a_first_statistics = + parser_get_opt_param_double(params, "Statistics:scale_factor_first", 0.1); + e->time_first_statistics = + parser_get_opt_param_double(params, "Statistics:time_first", 0.); + e->delta_time_statistics = parser_get_param_double(params, "Statistics:delta_time"); - e->timeLastStatistics = 0; + e->ti_next_stats = 0; e->verbose = verbose; e->count_step = 0; e->wallclock_time = 0.f; @@ -5728,18 +5780,55 @@ void engine_config(int restart, struct engine *e, e->time_end - e->time_begin); /* Deal with outputs */ - if (e->deltaTimeSnapshot < 0.) - error("Time between snapshots (%e) must be positive.", - e->deltaTimeSnapshot); + if (e->policy & engine_policy_cosmology) { - if (e->timeFirstSnapshot < e->time_begin) - error( - "Time of first snapshot (%e) must be after the simulation start t=%e.", - e->timeFirstSnapshot, e->time_begin); + if (e->delta_time_snapshot <= 1.) + error("Time between snapshots (%e) must be > 1.", e->delta_time_snapshot); + + if (e->delta_time_statistics <= 1.) + error("Time between statistics (%e) must be > 1.", + e->delta_time_statistics); + + if (e->a_first_snapshot < e->cosmology->a_begin) + error( + "Scale-factor of first snapshot (%e) must be after the simulation " + "start a=%e.", + e->a_first_snapshot, e->cosmology->a_begin); + + if (e->a_first_statistics < e->cosmology->a_begin) + error( + "Scale-factor of first stats output (%e) must be after the " + "simulation start a=%e.", + e->a_first_statistics, e->cosmology->a_begin); + } else { + + if (e->delta_time_snapshot <= 0.) + error("Time between snapshots (%e) must be positive.", + e->delta_time_snapshot); + + if (e->delta_time_statistics <= 0.) + error("Time between statistics (%e) must be positive.", + e->delta_time_statistics); + + if (e->time_first_snapshot < e->time_begin) + error( + "Time of first snapshot (%e) must be after the simulation start " + "t=%e.", + e->time_first_snapshot, e->time_begin); - /* Find the time of the first output */ + if (e->time_first_statistics < e->time_begin) + error( + "Time of first stats output (%e) must be after the simulation start " + "t=%e.", + e->time_first_statistics, e->time_begin); + } + + /* Find the time of the first snapshot output */ engine_compute_next_snapshot_time(e); + /* Find the time of the first statistics output */ + engine_compute_next_statistics_time(e); + /* Whether restarts are enabled. Yes by default. Can be changed on restart. */ e->restart_dump = parser_get_opt_param_int(params, "Restarts:enable", 1); @@ -5924,46 +6013,110 @@ void engine_compute_next_snapshot_time(struct engine *e) { /* Find upper-bound on last output */ double time_end; if (e->policy & engine_policy_cosmology) - time_end = e->cosmology->a_end * e->deltaTimeSnapshot; + time_end = e->cosmology->a_end * e->delta_time_snapshot; else - time_end = e->time_end + e->deltaTimeSnapshot; + time_end = e->time_end + e->delta_time_snapshot; /* Find next snasphot above current time */ - double time = e->timeFirstSnapshot; + double time; + if (e->policy & engine_policy_cosmology) + time = e->a_first_snapshot; + else + time = e->time_first_snapshot; while (time < time_end) { /* Output time on the integer timeline */ if (e->policy & engine_policy_cosmology) - e->ti_nextSnapshot = log(time / e->cosmology->a_begin) / e->time_base; + e->ti_next_snapshot = log(time / e->cosmology->a_begin) / e->time_base; else - e->ti_nextSnapshot = (time - e->time_begin) / e->time_base; + e->ti_next_snapshot = (time - e->time_begin) / e->time_base; /* Found it? */ - if (e->ti_nextSnapshot > e->ti_current) break; + if (e->ti_next_snapshot > e->ti_current) break; if (e->policy & engine_policy_cosmology) - time *= e->deltaTimeSnapshot; + time *= e->delta_time_snapshot; else - time += e->deltaTimeSnapshot; + time += e->delta_time_snapshot; } /* Deal with last snapshot */ - if (e->ti_nextSnapshot >= max_nr_timesteps) { - e->ti_nextSnapshot = -1; + if (e->ti_next_snapshot >= max_nr_timesteps) { + e->ti_next_snapshot = -1; + if (e->verbose) message("No further output time."); + } else { + + /* Be nice, talk... */ + if (e->policy & engine_policy_cosmology) { + const double next_snapshot_time = + exp(e->ti_next_snapshot * e->time_base) * e->cosmology->a_begin; + if (e->verbose) + message("Next snapshot time set to a=%e.", next_snapshot_time); + } else { + const double next_snapshot_time = + e->ti_next_snapshot * e->time_base + e->time_begin; + if (e->verbose) + message("Next snapshot time set to t=%e.", next_snapshot_time); + } + } +} + +/** + * @brief Computes the next time (on the time line) for a statistics dump + * + * @param e The #engine. + */ +void engine_compute_next_statistics_time(struct engine *e) { + + /* Find upper-bound on last output */ + double time_end; + if (e->policy & engine_policy_cosmology) + time_end = e->cosmology->a_end * e->delta_time_statistics; + else + time_end = e->time_end + e->delta_time_statistics; + + /* Find next snasphot above current time */ + double time; + if (e->policy & engine_policy_cosmology) + time = e->a_first_statistics; + else + time = e->time_first_statistics; + while (time < time_end) { + + /* Output time on the integer timeline */ + if (e->policy & engine_policy_cosmology) + e->ti_next_stats = log(time / e->cosmology->a_begin) / e->time_base; + else + e->ti_next_stats = (time - e->time_begin) / e->time_base; + + /* Found it? */ + if (e->ti_next_stats > e->ti_current) break; + + if (e->policy & engine_policy_cosmology) + time *= e->delta_time_statistics; + else + time += e->delta_time_statistics; + } + + /* Deal with last statistics */ + if (e->ti_next_stats >= max_nr_timesteps) { + e->ti_next_stats = -1; if (e->verbose) message("No further output time."); } else { /* Be nice, talk... */ if (e->policy & engine_policy_cosmology) { - const float next_snapshot_time = - exp(e->ti_nextSnapshot * e->time_base) * e->cosmology->a_begin; + const double next_statistics_time = + exp(e->ti_next_stats * e->time_base) * e->cosmology->a_begin; if (e->verbose) - message("Next output time set to a=%e.", next_snapshot_time); + message("Next output time for stats set to a=%e.", + next_statistics_time); } else { - const float next_snapshot_time = - e->ti_nextSnapshot * e->time_base + e->time_begin; + const double next_statistics_time = + e->ti_next_stats * e->time_base + e->time_begin; if (e->verbose) - message("Next output time set to t=%e.", next_snapshot_time); + message("Next output time for stats set to t=%e.", + next_statistics_time); } } } diff --git a/src/engine.h b/src/engine.h index 29a0648763..951786e522 100644 --- a/src/engine.h +++ b/src/engine.h @@ -192,20 +192,30 @@ struct engine { const struct unit_system *internal_units; /* Snapshot information */ - double timeFirstSnapshot; - double deltaTimeSnapshot; - integertime_t ti_nextSnapshot; + double a_first_snapshot; + double time_first_snapshot; + double delta_time_snapshot; + + /* Integer time of the next snapshot */ + integertime_t ti_next_snapshot; + char snapshotBaseName[PARSER_MAX_LINE_SIZE]; int snapshotCompression; struct unit_system *snapshotUnits; int snapshotOutputCount; /* Statistics information */ + double a_first_statistics; + double time_first_statistics; + double delta_time_statistics; + + /* Integer time of the next statistics dump */ + integertime_t ti_next_stats; + + /* File handle for the statistics */ FILE *file_stats; - double timeLastStatistics; - double deltaTimeStatistics; - /* Timesteps information */ + /* File handle for the timesteps information */ FILE *file_timesteps; /* The current step number. */ @@ -324,6 +334,7 @@ struct engine { /* Function prototypes. */ void engine_barrier(struct engine *e); void engine_compute_next_snapshot_time(struct engine *e); +void engine_compute_next_statistics_time(struct engine *e); void engine_unskip(struct engine *e); void engine_drift_all(struct engine *e); void engine_drift_top_multipoles(struct engine *e); -- GitLab