diff --git a/src/engine.c b/src/engine.c index a974b29362c059cf22a69288d6db66a2f0a4b84c..b8e679ba4e1a8602ddef9ca9e32cd93159a10c5b 100644 --- a/src/engine.c +++ b/src/engine.c @@ -3111,6 +3111,13 @@ void engine_step(struct engine *e) { #endif } +enum output_type { + output_none, + output_snapshot, + output_statistics, + output_stf +}; + /** * @brief Check whether any kind of i/o has to be performed during this * step. @@ -3122,55 +3129,64 @@ void engine_step(struct engine *e) { */ void engine_check_for_dumps(struct engine *e) { + const int with_cosmology = (e->policy & engine_policy_cosmology); const int with_stf = (e->policy & engine_policy_structure_finding); - const int stf_time_output = (e->stf_output_freq_format == io_stf_time); + + /* What kind of output do we want? And at which time ? */ + enum output_type type = output_none; + integertime_t ti_output = max_nr_timesteps; /* Save some statistics ? */ - int save_stats = 0; - if (e->ti_end_min > e->ti_next_stats && e->ti_next_stats > 0) save_stats = 1; + if (e->ti_end_min > e->ti_next_stats && e->ti_next_stats > 0) { + if (e->ti_next_stats < ti_output) { + ti_output = e->ti_next_stats; + type = output_statistics; + } + } /* Do we want a snapshot? */ - int dump_snapshot = 0; - if (e->ti_end_min > e->ti_next_snapshot && e->ti_next_snapshot > 0) - dump_snapshot = 1; + if (e->ti_end_min > e->ti_next_snapshot && e->ti_next_snapshot > 0) { + if (e->ti_next_snapshot < ti_output) { + ti_output = e->ti_next_snapshot; + type = output_snapshot; + } + } /* Do we want to perform structure finding? */ - int run_stf = 0; - if (with_stf && stf_time_output) { - if (e->ti_end_min > e->ti_next_stf && e->ti_next_stf > 0) run_stf = 1; - } - if (with_stf && !stf_time_output) { - if (e->step % e->delta_step_stf == 0) run_stf = 1; + if (with_stf) { + if (e->ti_end_min > e->ti_next_stf && e->ti_next_stf > 0) { + if (e->ti_next_stf < ti_output) { + ti_output = e->ti_next_stf; + type = output_stf; + } + } } /* Store information before attempting extra dump-related drifts */ - integertime_t ti_current = e->ti_current; - timebin_t max_active_bin = e->max_active_bin; - double time = e->time; + const integertime_t ti_current = e->ti_current; + const timebin_t max_active_bin = e->max_active_bin; + const double time = e->time; + + while (type != output_none) { + + /* Let's fake that we are at the dump time */ + e->ti_current = ti_output; + e->max_active_bin = 0; + if (with_cosmology) { + cosmology_update(e->cosmology, e->physical_constants, e->ti_current); + e->time = e->cosmology->time; + } else { + e->time = ti_output * e->time_base + e->time_begin; + } - while (save_stats || dump_snapshot || run_stf) { + /* Drift everyone */ + engine_drift_all(e, /*drift_mpole=*/0); /* Write some form of output */ - if (dump_snapshot && save_stats) { - - /* If both, need to figure out which one occurs first */ - if (e->ti_next_stats == e->ti_next_snapshot) { - - /* 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)) { - cosmology_update(e->cosmology, e->physical_constants, e->ti_current); - e->time = e->cosmology->time; - } else { - e->time = e->ti_next_stats * e->time_base + e->time_begin; - } - - /* Drift everyone */ - engine_drift_all(e, /*drift_mpole=*/0); + switch (type) { + case output_snapshot: - /* Dump everything */ - engine_print_stats(e); + /* Dump... */ #ifdef WITH_LOGGER /* Write a file containing the offsets in the particle logger. */ engine_dump_index(e); @@ -3178,177 +3194,72 @@ void engine_check_for_dumps(struct engine *e) { engine_dump_snapshot(e); #endif - } else if (e->ti_next_stats < e->ti_next_snapshot) { + /* ... and find the next output time */ + engine_compute_next_snapshot_time(e); + break; - /* 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)) { - cosmology_update(e->cosmology, e->physical_constants, e->ti_current); - e->time = e->cosmology->time; - } else { - e->time = e->ti_next_stats * e->time_base + e->time_begin; - } + case output_statistics: - /* Drift everyone */ - engine_drift_all(e, /*drift_mpole=*/0); - - /* Dump stats */ + /* Dump */ engine_print_stats(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; - - /* Drift everyone */ - engine_drift_all(e, /*drift_mpole=*/0); + /* and move on */ + engine_compute_next_statistics_time(e); - /* Dump snapshot */ -#ifdef WITH_LOGGER - /* Write a file containing the offsets in the particle logger. */ - engine_dump_index(e); -#else - engine_dump_snapshot(e); -#endif - - } 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)) { - cosmology_update(e->cosmology, e->physical_constants, e->ti_current); - e->time = e->cosmology->time; - } else { - e->time = e->ti_next_stats * e->time_base + e->time_begin; - } - - /* Drift everyone */ - engine_drift_all(e, /*drift_mpole=*/0); - - /* Dump snapshot */ -#ifdef WITH_LOGGER - /* Write a file containing the offsets in the particle logger. */ - engine_dump_index(e); -#else - engine_dump_snapshot(e); -#endif - - /* 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, /*drift_mpole=*/0); - - /* Dump stats */ - engine_print_stats(e); - } + break; - /* 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)) { - cosmology_update(e->cosmology, e->physical_constants, e->ti_current); - e->time = e->cosmology->time; - } else { - e->time = e->ti_next_stats * e->time_base + e->time_begin; - } - - /* Drift everyone */ - engine_drift_all(e, /*drift_mpole=*/0); - - /* Dump... */ -#ifdef WITH_LOGGER - /* Write a file containing the offsets in the particle logger. */ - engine_dump_index(e); -#else - engine_dump_snapshot(e); -#endif - - /* ... 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)) { - cosmology_update(e->cosmology, e->physical_constants, e->ti_current); - e->time = e->cosmology->time; - } else { - e->time = e->ti_next_stats * e->time_base + e->time_begin; - } - - /* Drift everyone */ - engine_drift_all(e, /*drift_mpole=*/0); - - /* Dump */ - engine_print_stats(e); - - /* and move on */ - engine_compute_next_statistics_time(e); - } - - /* Perform structure finding? */ - if (run_stf) { + case output_stf: #ifdef HAVE_VELOCIRAPTOR - // MATTHIEU: Check the order with the other i/o options. - if (!dump_snapshot && !save_stats) { + /* Unleash the raptor! */ + velociraptor_init(e); + velociraptor_invoke(e); - /* Let's fake that we are at the stats dump time */ - e->ti_current = e->ti_next_stf; - e->max_active_bin = 0; - if ((e->policy & engine_policy_cosmology)) { - cosmology_update(e->cosmology, e->physical_constants, e->ti_current); - e->time = e->cosmology->time; - } else { - e->time = e->ti_next_stats * e->time_base + e->time_begin; - } - - /* Drift everyone */ - engine_drift_all(e, /*drift_mpole=*/0); - } - - velociraptor_init(e); - velociraptor_invoke(e); - - /* ... and find the next output time */ - if (e->stf_output_freq_format == io_stf_time) + /* ... and find the next output time */ engine_compute_next_stf_time(e); +#else + error( + "Asking for a VELOCIraptor output but SWIFT was compiled without " + "the " + "interface!"); #endif + break; + + default: + error("Invalid dump type"); } /* We need to see whether whether we are in the pathological case * where there can be another dump before the next step. */ + type = output_none; + ti_output = e->ti_current; + /* Save some statistics ? */ - save_stats = 0; - if (e->ti_end_min > e->ti_next_stats && e->ti_next_stats > 0) - save_stats = 1; + if (e->ti_end_min > e->ti_next_stats && e->ti_next_stats > 0) { + if (e->ti_next_stats < ti_output) { + ti_output = e->ti_next_stats; + type = output_statistics; + } + } /* 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; + if (e->ti_end_min > e->ti_next_snapshot && e->ti_next_snapshot > 0) { + if (e->ti_next_snapshot < ti_output) { + ti_output = e->ti_next_snapshot; + type = output_snapshot; + } + } /* Do we want to perform structure finding? */ - run_stf = 0; - if (with_stf && stf_time_output) { - if (e->ti_end_min > e->ti_next_stf && e->ti_next_stf > 0) run_stf = 1; + if (with_stf) { + if (e->ti_end_min > e->ti_next_stf && e->ti_next_stf > 0) { + if (e->ti_next_stf < ti_output) { + ti_output = e->ti_next_stf; + type = output_stf; + } + } } } @@ -4183,23 +4094,8 @@ void engine_init(struct engine *e, struct space *s, struct swift_params *params, parser_get_opt_param_double(params, "StructureFinding:time_first", 0.); e->a_first_stf_output = parser_get_opt_param_double( params, "StructureFinding:scale_factor_first", 0.1); - e->stf_output_freq_format = (enum io_stf_output_format)parser_get_param_int( - params, "StructureFinding:output_time_format"); - - if (e->stf_output_freq_format == io_stf_steps) { - e->delta_step_stf = - parser_get_param_int(params, "StructureFinding:delta_step"); - } else if (e->stf_output_freq_format == io_stf_time) { - e->delta_time_stf = - parser_get_param_double(params, "StructureFinding:delta_time"); - } else { - error( - "Invalid flag (%d) set for output time format of structure finding.", - e->stf_output_freq_format); - } - - /* overwrite input if outputlist */ - if (e->output_list_stf) e->stf_output_freq_format = io_stf_time; + e->delta_time_stf = + parser_get_param_double(params, "StructureFinding:delta_time"); } engine_init_output_lists(e, params); @@ -4539,8 +4435,7 @@ void engine_config(int restart, struct engine *e, struct swift_params *params, "simulation start a=%e.", e->a_first_statistics, e->cosmology->a_begin); - if ((e->policy & engine_policy_structure_finding) && - (e->stf_output_freq_format == io_stf_time)) { + if (e->policy & engine_policy_structure_finding) { if (e->delta_time_stf <= 1.) error("Time between STF (%e) must be > 1.", e->delta_time_stf); @@ -4575,8 +4470,7 @@ void engine_config(int restart, struct engine *e, struct swift_params *params, "t=%e.", e->time_first_statistics, e->time_begin); - if ((e->policy & engine_policy_structure_finding) && - (e->stf_output_freq_format == io_stf_time)) { + if (e->policy & engine_policy_structure_finding) { if (e->delta_time_stf <= 0.) error("Time between STF (%e) must be positive.", e->delta_time_stf); @@ -4587,12 +4481,6 @@ void engine_config(int restart, struct engine *e, struct swift_params *params, } } - if (e->policy & engine_policy_structure_finding) { - /* Find the time of the first stf output */ - if (e->stf_output_freq_format == io_stf_time) - engine_compute_next_stf_time(e); - } - /* Get the total mass */ e->total_mass = 0.; for (size_t i = 0; i < e->s->nr_gparts; ++i) @@ -4617,6 +4505,11 @@ void engine_config(int restart, struct engine *e, struct swift_params *params, /* Find the time of the first statistics output */ engine_compute_next_statistics_time(e); + /* Find the time of the first stf output */ + if (e->policy & engine_policy_structure_finding) { + engine_compute_next_stf_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); diff --git a/src/engine.h b/src/engine.h index ed73ff6b0bb4e8ac0eb2a8a5ad63f5e3427e4eeb..ad8aa7ce33fd01cc18678884067bc8224d71e347 100644 --- a/src/engine.h +++ b/src/engine.h @@ -244,7 +244,6 @@ struct engine { int snapshot_output_count; /* Structure finding information */ - enum io_stf_output_format stf_output_freq_format; int delta_step_stf; double a_first_stf_output; double time_first_stf_output;