diff --git a/examples/ConstantCosmoVolume/constant_volume.yml b/examples/ConstantCosmoVolume/constant_volume.yml index ad31fd1972565b0d7683711a20db78e854c3dc5f..b8985cd2121dad6e51228a71de28db0d1907369f 100644 --- a/examples/ConstantCosmoVolume/constant_volume.yml +++ b/examples/ConstantCosmoVolume/constant_volume.yml @@ -23,7 +23,7 @@ TimeIntegration: Snapshots: basename: box # Common part of the name of output files time_first: 0. # Time of the first output (in internal units) - delta_time: 1.04 # Time difference between consecutive outputs (in internal units) + delta_time: 1.001 # Time difference between consecutive outputs (in internal units) scale_factor_first: 0.00991 compression: 4 diff --git a/src/engine.c b/src/engine.c index 65fcc2751c71f7e48016e786567ba956dbe06a06..de032b1c939743f36e679844cf2e238bf30becd8 100644 --- a/src/engine.c +++ b/src/engine.c @@ -4856,6 +4856,15 @@ void engine_step(struct engine *e) { #endif } +/** + * @brief Check whether any kind of i/o has to be performed during this + * step. + * + * This includes snapshots, stats and halo finder. We also handle the case + * of multiple outputs between two steps. + * + * @param e The #engine. + */ void engine_check_for_dumps(struct engine *e) { /* Save some statistics ? */ @@ -4882,52 +4891,85 @@ void engine_check_for_dumps(struct engine *e) { timebin_t max_active_bin = e->max_active_bin; double time = e->time; - /* Write some form of output */ - if (dump_snapshot && save_stats) { + while (save_stats || dump_snapshot || run_stf) { - /* If both, need to figure out which one occurs first */ - if (e->ti_next_stats == e->ti_next_snapshot) { + /* Write some form of output */ + if (dump_snapshot && save_stats) { - /* Let's fake that we are at the common dump time */ - e->ti_current = e->ti_next_snapshot; - e->max_active_bin = 0; - if (!(e->policy & engine_policy_cosmology)) - e->time = e->ti_next_snapshot * e->time_base + e->time_begin; + /* If both, need to figure out which one occurs first */ + if (e->ti_next_stats == e->ti_next_snapshot) { - /* Drift everyone */ - engine_drift_all(e); + /* Let's fake that we are at the common dump time */ + e->ti_current = e->ti_next_snapshot; + e->max_active_bin = 0; + if (!(e->policy & engine_policy_cosmology)) + e->time = e->ti_next_snapshot * e->time_base + e->time_begin; - /* Dump everything */ - engine_print_stats(e); - engine_dump_snapshot(e); + /* Drift everyone */ + engine_drift_all(e); - } else if (e->ti_next_stats < e->ti_next_snapshot) { + /* Dump everything */ + engine_print_stats(e); + engine_dump_snapshot(e); - /* Let's fake that we are at the stats dump time */ - e->ti_current = e->ti_next_stats; - e->max_active_bin = 0; - if (!(e->policy & engine_policy_cosmology)) - e->time = e->ti_next_stats * e->time_base + e->time_begin; + } else if (e->ti_next_stats < e->ti_next_snapshot) { - /* Drift everyone */ - engine_drift_all(e); + /* Let's fake that we are at the stats dump time */ + e->ti_current = e->ti_next_stats; + e->max_active_bin = 0; + if (!(e->policy & engine_policy_cosmology)) + e->time = e->ti_next_stats * e->time_base + e->time_begin; - /* Dump stats */ - engine_print_stats(e); + /* Drift everyone */ + engine_drift_all(e); - /* Let's fake that we are at the snapshot dump time */ - e->ti_current = e->ti_next_snapshot; - e->max_active_bin = 0; - if (!(e->policy & engine_policy_cosmology)) - e->time = e->ti_next_snapshot * e->time_base + e->time_begin; + /* Dump stats */ + engine_print_stats(e); - /* Drift everyone */ - engine_drift_all(e); + /* Let's fake that we are at the snapshot dump time */ + e->ti_current = e->ti_next_snapshot; + e->max_active_bin = 0; + if (!(e->policy & engine_policy_cosmology)) + e->time = e->ti_next_snapshot * e->time_base + e->time_begin; - /* Dump snapshot */ - engine_dump_snapshot(e); + /* Drift everyone */ + engine_drift_all(e); - } else if (e->ti_next_stats > e->ti_next_snapshot) { + /* Dump snapshot */ + engine_dump_snapshot(e); + + } else if (e->ti_next_stats > e->ti_next_snapshot) { + + /* Let's fake that we are at the snapshot dump time */ + e->ti_current = e->ti_next_snapshot; + e->max_active_bin = 0; + if (!(e->policy & engine_policy_cosmology)) + e->time = e->ti_next_snapshot * e->time_base + e->time_begin; + + /* Drift everyone */ + engine_drift_all(e); + + /* Dump snapshot */ + engine_dump_snapshot(e); + + /* Let's fake that we are at the stats dump time */ + e->ti_current = e->ti_next_stats; + e->max_active_bin = 0; + if (!(e->policy & engine_policy_cosmology)) + e->time = e->ti_next_stats * e->time_base + e->time_begin; + + /* Drift everyone */ + engine_drift_all(e); + + /* Dump stats */ + engine_print_stats(e); + } + + /* Let's compute the time of the next outputs */ + engine_compute_next_snapshot_time(e); + engine_compute_next_statistics_time(e); + + } else if (dump_snapshot) { /* Let's fake that we are at the snapshot dump time */ e->ti_current = e->ti_next_snapshot; @@ -4938,9 +4980,14 @@ void engine_check_for_dumps(struct engine *e) { /* Drift everyone */ engine_drift_all(e); - /* Dump snapshot */ + /* Dump... */ engine_dump_snapshot(e); + /* ... and find the next output time */ + engine_compute_next_snapshot_time(e); + + } else if (save_stats) { + /* Let's fake that we are at the stats dump time */ e->ti_current = e->ti_next_stats; e->max_active_bin = 0; @@ -4950,61 +4997,50 @@ void engine_check_for_dumps(struct engine *e) { /* Drift everyone */ engine_drift_all(e); - /* Dump stats */ + /* Dump */ engine_print_stats(e); - } - - /* Let's compute the time of the next outputs */ - engine_compute_next_snapshot_time(e); - engine_compute_next_statistics_time(e); - - } else if (dump_snapshot) { - /* Let's fake that we are at the snapshot dump time */ - e->ti_current = e->ti_next_snapshot; - e->max_active_bin = 0; - if (!(e->policy & engine_policy_cosmology)) - e->time = e->ti_next_snapshot * e->time_base + e->time_begin; - - /* Drift everyone */ - engine_drift_all(e); - - /* Dump... */ - engine_dump_snapshot(e); - - /* ... and find the next output time */ - engine_compute_next_snapshot_time(e); - } else if (save_stats) { - - /* Let's fake that we are at the stats dump time */ - e->ti_current = e->ti_next_stats; - e->max_active_bin = 0; - if (!(e->policy & engine_policy_cosmology)) - e->time = e->ti_next_stats * e->time_base + e->time_begin; - - /* Drift everyone */ - engine_drift_all(e); - - /* Dump */ - engine_print_stats(e); - - /* and move on */ - engine_compute_next_statistics_time(e); - } + /* and move on */ + engine_compute_next_statistics_time(e); + } - /* Perform structure finding? */ - if (run_stf) { + /* Perform structure finding? */ + if (run_stf) { - // MATTHIEU: Add a drift_all here. And check the order with the order i/o - // options. + // MATTHIEU: Add a drift_all here. And check the order with the order i/o + // options. #ifdef HAVE_VELOCIRAPTOR - velociraptor_init(e); - velociraptor_invoke(e); + velociraptor_init(e); + velociraptor_invoke(e); - /* ... and find the next output time */ - if (e->stf_output_freq_format == TIME) engine_compute_next_stf_time(e); + /* ... and find the next output time */ + if (e->stf_output_freq_format == TIME) engine_compute_next_stf_time(e); #endif + } + + /* We need to see whether whether we are in the pathological case + * where there can be another dump before the next step. */ + + /* Save some statistics ? */ + save_stats = 0; + if (e->ti_end_min > e->ti_next_stats && e->ti_next_stats > 0) + save_stats = 1; + + /* Do we want a snapshot? */ + dump_snapshot = 0; + if (e->ti_end_min > e->ti_next_snapshot && e->ti_next_snapshot > 0) + dump_snapshot = 1; + + /* Do we want to perform structure finding? */ + run_stf = 0; + if ((e->policy & engine_policy_structure_finding)) { + if (e->stf_output_freq_format == STEPS && e->step % e->deltaStepSTF == 0) + run_stf = 1; + else if (e->stf_output_freq_format == TIME && + e->ti_end_min > e->ti_nextSTF && e->ti_nextSTF > 0) + run_stf = 1; + } } /* Restore the information we stored */