Commit 42276c74 authored by Matthieu Schaller's avatar Matthieu Schaller
Browse files

Merge branch 'Velociraptor_output_strategy' into 'master'

Velociraptor outputs

See merge request !721
parents a26d2766 63d4273a
......@@ -414,12 +414,13 @@ parameter is the base name that will be used for all the outputs in the run:
* The base name of the HDF5 snapshots: ``basename``.
This name will then be appended by an under-score and 6 digits followed by
``.hdf5`` (e.g. ``base_name_001234.hdf5``). The 6 digits are used to label the
different outputs, starting at ``000000``. In the default setup the digits
simply increase by one for each snapshot. However, if the optional parameter
``int_time_label_on`` is switched on, then the 6-digits will the physical time
of the simulation rounded to the nearest integer [#f3]_.
This name will then be appended by an under-score and 4 digits followed by
``.hdf5`` (e.g. ``base_name_1234.hdf5``). The 4 digits are used to label the
different outputs, starting at ``0000``. In the default setup the digits simply
increase by one for each snapshot. However, if the optional parameter
``int_time_label_on`` is switched on, then we use 6 digits and these will the
physical time of the simulation rounded to the nearest integer
(e.g. ``base_name_001234.hdf5``) [#f3]_.
The time of the first snapshot is controlled by the two following options:
......@@ -434,11 +435,28 @@ in the internal units of time. Users also have to provide the difference in time
* Time difference between consecutive outputs: ``delta_time``.
In non-cosmological runs this is also expressed in internal units. For
cosmological runs, this value is *multiplied* to obtain the scale-factor of the
next snapshot. This implies that the outputs are equally space in
:math:`\log(a)` (See :ref:`Output_list_label` to have snapshots not regularly spaced in time).
Users can optionally specify the level of compression used by the HDF5 libary
cosmological runs, this value is *multiplied* to obtain the
scale-factor of the next snapshot. This implies that the outputs are
equally space in :math:`\log(a)` (See :ref:`Output_list_label` to have
snapshots not regularly spaced in time).
When running the code with structure finding activated, it is often
useful to have a structure catalog written at the same simulation time
as the snapshots. To activate this, the following parameter can be
switched on:
* Run VELOCIraptor every time a snapshot is dumped: ``invoke_stf``
(default: ``0``).
This produces catalogs using the options specified for the stand-alone
VELOCIraptor outputs (see the section :ref:`Parameters_structure_finding`) but
with a base name and output number that matches the snapshot name
(e.g. ``stf_base_name_1234.hdf5``) irrespective of the name specified in the
section dedicated to VELOCIraptor. Note that the invocation of VELOCIraptor at
every dump is done additionally to the stand-alone dumps that can be specified
in the corresponding section of the YAML parameter file.
Users can optionally specify the level of compression used by the HDF5 library
using the parameter:
* GZIP compression level of the HDF5 arrays: ``compression`` (default: ``0``).
......@@ -464,14 +482,16 @@ When un-specified, these all take the same value as assumed by the internal
system of units. These are rarely used but can offer a practical alternative to
converting data in the post-processing of the simulations.
For a standard cosmological run, the full section would be:
For a standard cosmological run with structure finding activated, the
full section would be:
.. code:: YAML
Snapshots:
basename: output
scale_factor_first: 0.02 # z = 49
delta_time: 1.02
delta_time: 1.02
invoke_stf: 1
Showing all the parameters for a basic hydro test-case, one would have:
......@@ -481,6 +501,7 @@ Showing all the parameters for a basic hydro test-case, one would have:
basename: sedov
time_first: 0.01
delta_time: 0.005
invoke_stf: 0
int_time_label_on: 0
compression: 3
UnitLength_in_cgs: 1. # Use cm in outputs
......@@ -598,6 +619,12 @@ Scheduler
Domain Decomposition
--------------------
.. _Parameters_structure_finding:
Structure finding (VELOCIraptor)
--------------------------------
.. [#f1] The thorough reader (or overly keen SWIFT tester) would find that the speed of light is :math:`c=1.8026\times10^{12}\,\rm{fur}\,\rm{ftn}^{-1}`, Newton's constant becomes :math:`G_N=4.896735\times10^{-4}~\rm{fur}^3\,\rm{fir}^{-1}\,\rm{ftn}^{-2}` and Planck's constant turns into :math:`h=4.851453\times 10^{-34}~\rm{fur}^2\,\rm{fir}\,\rm{ftn}^{-1}`.
......
......@@ -50,8 +50,10 @@ HDF5 library, not a parallel build.
Compiling SWIFT
---------------
The next part is compiling SWIFT with VELOCIraptor and assumes you already
downloaded SWIFT from the GitLab_, this can be done by running::
downloaded SWIFT from the GitLab_, this can be done by running
.. code:: bash
./autogen.sh
./configure --with-velociraptor=/path/to/VELOCIraptor-STF/src
make
......@@ -60,16 +62,16 @@ In which ``./autogen.sh`` only needs to be run once after the code is cloned
from the GitLab_, and ``/path/to/`` is the path to the ``VELOCIraptor-STF``
directory on your machine. In general ``./configure`` can be run with other
options as desired. After this we can run SWIFT with VELOCIraptor, but for this
we first need to add several lines to the yaml file of our simulation::
we first need to add several lines to the yaml file of our simulation
#structure finding options
StructureFinding:
config_file_name: stf_input_6dfof_dmonly_sub.cfg
basename: ./stf
output_time_format: 1
scale_factor_first: 0.02
delta_time: 1.02
.. code:: YAML
StructureFinding:
config_file_name: stf_input_6dfof_dmonly_sub.cfg
basename: ./stf
scale_factor_first: 0.02
delta_time: 1.02
In which we specify the ``.cfg`` file that is used by VELOCIraptor and the
other parameters which SWIFT needs to use. In the case of
......
......@@ -10,10 +10,8 @@ InternalUnitSystem:
StructureFinding:
config_file_name: stf_input.cfg # Name of the STF config file.
basename: ./stf # Common part of the name of output files.
output_time_format: 0 # Specifies the frequency format of structure finding. 0 for simulation steps (delta_step) and 1 for simulation time intervals (delta_time).
scale_factor_first: 0.92 # Scale-factor of the first snaphot (cosmological run)
time_first: 0.01 # Time of the first structure finding output (in internal units).
delta_step: 1000 # Time difference between consecutive structure finding outputs (in internal units) in simulation steps.
delta_time: 1.10 # Time difference between consecutive structure finding outputs (in internal units) in simulation time intervals.
# Cosmological parameters
......
......@@ -10,10 +10,8 @@ InternalUnitSystem:
StructureFinding:
config_file_name: stf_input.cfg # Name of the STF config file.
basename: ./stf # Common part of the name of output files.
output_time_format: 0 # Specifies the frequency format of structure finding. 0 for simulation steps (delta_step) and 1 for simulation time intervals (delta_time).
scale_factor_first: 0.92 # Scale-factor of the first snaphot (cosmological run)
time_first: 0.01 # Time of the first structure finding output (in internal units).
delta_step: 1000 # Time difference between consecutive structure finding outputs (in internal units) in simulation steps.
delta_time: 1.10 # Time difference between consecutive structure finding outputs (in internal units) in simulation time intervals.
# Cosmological parameters
......
......@@ -10,10 +10,8 @@ InternalUnitSystem:
StructureFinding:
config_file_name: stf_input.cfg # Name of the STF config file.
basename: ./stf # Common part of the name of output files.
output_time_format: 0 # Specifies the frequency format of structure finding. 0 for simulation steps (delta_step) and 1 for simulation time intervals (delta_time).
scale_factor_first: 0.92 # Scale-factor of the first snaphot (cosmological run)
time_first: 0.01 # Time of the first structure finding output (in internal units).
delta_step: 1000 # Time difference between consecutive structure finding outputs (in internal units) in simulation steps.
delta_time: 1.10 # Time difference between consecutive structure finding outputs (in internal units) in simulation time intervals.
# Cosmological parameters
......
......@@ -10,7 +10,6 @@ InternalUnitSystem:
StructureFinding:
config_file_name: stf_input_6dfof_dmonly_sub.cfg
basename: ./stf
output_time_format: 1
scale_factor_first: 0.02
delta_time: 1.02
......
......@@ -37,8 +37,9 @@ SPH:
# Parameters governing the snapshots
Snapshots:
basename: snap
delta_time: 1.02
delta_time: 1.05
scale_factor_first: 0.02
invoke_stf: 1
# Parameters governing the conserved quantities statistics
Statistics:
......@@ -52,16 +53,16 @@ Scheduler:
# Parameters related to the initial conditions
InitialConditions:
file_name: small_cosmo_volume.hdf5
periodic: 1
cleanup_h_factors: 1
cleanup_velocity_factors: 1
generate_gas_in_ics: 1 # Generate gas particles from the DM-only ICs
cleanup_smoothing_lengths: 1 # Since we generate gas, make use of the (expensive) cleaning-up procedure.
generate_gas_in_ics: 1 # Generate gas particles from the DM-only ICs
cleanup_smoothing_lengths: 1 # Since we generate gas, make use of the (expensive) cleaning-up procedure.
# Structure finding options (requires velociraptor)
StructureFinding:
config_file_name: stfconfig_input.cfg
basename: ./stf
output_time_format: 1
scale_factor_first: 0.02
delta_time: 1.02
......@@ -919,6 +919,10 @@ int main(int argc, char *argv[]) {
fflush(stdout);
}
#ifdef HAVE_VELOCIRAPTOR
if (with_structure_finding) velociraptor_init(&e);
#endif
/* Get some info to the user. */
if (myrank == 0) {
long long N_DM = N_total[1] - N_total[2] - N_total[0];
......@@ -1201,14 +1205,6 @@ int main(int argc, char *argv[]) {
#endif
// write a final snapshot with logger, in order to facilitate a restart
engine_dump_snapshot(&e);
#ifdef HAVE_VELOCIRAPTOR
/* Call VELOCIraptor at the end of the run to find groups. */
if (e.policy & engine_policy_structure_finding) {
velociraptor_init(&e);
velociraptor_invoke(&e);
}
#endif
}
#ifdef WITH_MPI
......
......@@ -85,6 +85,7 @@ Snapshots:
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)
invoke_stf: 0 # (Optional) Call VELOCIraptor every time a snapshot is written irrespective of the VELOCIraptor output strategy.
compression: 0 # (Optional) Set the level of compression of the HDF5 datasets [0-9]. 0 does no compression.
int_time_label_on: 0 # (Optional) Enable to label the snapshots using the time rounded to an integer (in internal units)
UnitMass_in_cgs: 1 # (Optional) Unit system for the outputs (Grams)
......@@ -157,6 +158,16 @@ DomainDecomposition:
itr: 100 # When adaptive defines the ratio of inter node communication time to data redistribution time, in the range 0.00001 to 10000000.0.
# Lower values give less data movement during redistributions, at the cost of global balance which may require more communication.
# Structure finding options (requires velociraptor)
StructureFinding:
config_file_name: stf_input.cfg # Name of the STF config file.
basename: ./stf # Common part of the name of output files.
scale_factor_first: 0.92 # (Optional) Scale-factor of the first snaphot (cosmological run)
time_first: 0.01 # (Optional) Time of the first structure finding output (in internal units).
delta_time: 1.10 # (Optional) Time difference between consecutive structure finding outputs (in internal units) in simulation time intervals.
output_list_on: 0 # (Optional) Enable the output list
output_list: stflist.txt # (Optional) File containing the output times (see documentation in "Parameter File" section)
# Parameters related to the equation of state ------------------------------------------
EoS:
......@@ -287,15 +298,3 @@ EAGLEChemistry:
init_abundance_Magnesium: 0.000 # Inital fraction of particle mass in Magnesium
init_abundance_Silicon: 0.000 # Inital fraction of particle mass in Silicon
init_abundance_Iron: 0.000 # Inital fraction of particle mass in Iron
# Structure finding options (requires velociraptor)
StructureFinding:
config_file_name: stf_input.cfg # Name of the STF config file.
basename: ./stf # Common part of the name of output files.
output_time_format: 0 # Specifies the frequency format of structure finding. 0 for simulation steps (delta_step) and 1 for simulation time intervals (delta_time).
scale_factor_first: 0.92 # Scale-factor of the first snaphot (cosmological run)
time_first: 0.01 # Time of the first structure finding output (in internal units).
delta_step: 1000 # Time difference between consecutive structure finding outputs (in internal units) in simulation steps.
delta_time: 1.10 # Time difference between consecutive structure finding outputs (in internal units) in simulation time intervals.
output_list_on: 0 # (Optional) Enable the output list
output_list: stflist.txt # (Optional) File containing the output times (see documentation in "Parameter File" section)
......@@ -49,7 +49,7 @@ include_HEADERS = space.h runner.h queue.h task.h lock.h cell.h part.h const.h \
gravity_softened_derivatives.h vector_power.h collectgroup.h hydro_space.h sort_part.h \
chemistry.h chemistry_io.h chemistry_struct.h cosmology.h restart.h space_getsid.h utilities.h \
mesh_gravity.h cbrt.h exp10.h velociraptor_interface.h swift_velociraptor_part.h outputlist.h \
logger_io.h tracers_io.h tracers.h tracers_struct.h
logger_io.h tracers_io.h tracers.h tracers_struct.h velociraptor_struct.h velociraptor_io.h
# source files for EAGLE cooling
EAGLE_COOLING_SOURCES =
......
......@@ -808,6 +808,28 @@ void io_convert_part_d_mapper(void* restrict temp, int N,
&temp_d[i * dim]);
}
/**
* @brief Mapper function to copy #part into a buffer of doubles using a
* conversion function.
*/
void io_convert_part_l_mapper(void* restrict temp, int N,
void* restrict extra_data) {
const struct io_props props = *((const struct io_props*)extra_data);
const struct part* restrict parts = props.parts;
const struct xpart* restrict xparts = props.xparts;
const struct engine* e = props.e;
const size_t dim = props.dimension;
/* How far are we with this chunk? */
long long* restrict temp_l = (long long*)temp;
const ptrdiff_t delta = (temp_l - props.start_temp_l) / dim;
for (int i = 0; i < N; i++)
props.convert_part_l(e, parts + delta + i, xparts + delta + i,
&temp_l[i * dim]);
}
/**
* @brief Mapper function to copy #gpart into a buffer of floats using a
* conversion function.
......@@ -848,6 +870,26 @@ void io_convert_gpart_d_mapper(void* restrict temp, int N,
props.convert_gpart_d(e, gparts + delta + i, &temp_d[i * dim]);
}
/**
* @brief Mapper function to copy #gpart into a buffer of doubles using a
* conversion function.
*/
void io_convert_gpart_l_mapper(void* restrict temp, int N,
void* restrict extra_data) {
const struct io_props props = *((const struct io_props*)extra_data);
const struct gpart* restrict gparts = props.gparts;
const struct engine* e = props.e;
const size_t dim = props.dimension;
/* How far are we with this chunk? */
long long* restrict temp_l = (long long*)temp;
const ptrdiff_t delta = (temp_l - props.start_temp_l) / dim;
for (int i = 0; i < N; i++)
props.convert_gpart_l(e, gparts + delta + i, &temp_l[i * dim]);
}
/**
* @brief Mapper function to copy #spart into a buffer of floats using a
* conversion function.
......@@ -888,6 +930,26 @@ void io_convert_spart_d_mapper(void* restrict temp, int N,
props.convert_spart_d(e, sparts + delta + i, &temp_d[i * dim]);
}
/**
* @brief Mapper function to copy #spart into a buffer of doubles using a
* conversion function.
*/
void io_convert_spart_l_mapper(void* restrict temp, int N,
void* restrict extra_data) {
const struct io_props props = *((const struct io_props*)extra_data);
const struct spart* restrict sparts = props.sparts;
const struct engine* e = props.e;
const size_t dim = props.dimension;
/* How far are we with this chunk? */
long long* restrict temp_l = (long long*)temp;
const ptrdiff_t delta = (temp_l - props.start_temp_l) / dim;
for (int i = 0; i < N; i++)
props.convert_spart_l(e, sparts + delta + i, &temp_l[i * dim]);
}
/**
* @brief Copy the particle data into a temporary buffer ready for i/o.
*
......@@ -945,6 +1007,18 @@ void io_copy_temp_buffer(void* temp, const struct engine* e,
io_convert_part_d_mapper, temp_d, N, copySize, 0,
(void*)&props);
} else if (props.convert_part_l != NULL) {
/* Prepare some parameters */
long long* temp_l = (long long*)temp;
props.start_temp_l = (long long*)temp;
props.e = e;
/* Copy the whole thing into a buffer */
threadpool_map((struct threadpool*)&e->threadpool,
io_convert_part_l_mapper, temp_l, N, copySize, 0,
(void*)&props);
} else if (props.convert_gpart_f != NULL) {
/* Prepare some parameters */
......@@ -969,6 +1043,18 @@ void io_copy_temp_buffer(void* temp, const struct engine* e,
io_convert_gpart_d_mapper, temp_d, N, copySize, 0,
(void*)&props);
} else if (props.convert_gpart_l != NULL) {
/* Prepare some parameters */
long long* temp_l = (long long*)temp;
props.start_temp_l = (long long*)temp;
props.e = e;
/* Copy the whole thing into a buffer */
threadpool_map((struct threadpool*)&e->threadpool,
io_convert_gpart_l_mapper, temp_l, N, copySize, 0,
(void*)&props);
} else if (props.convert_spart_f != NULL) {
/* Prepare some parameters */
......@@ -993,6 +1079,18 @@ void io_copy_temp_buffer(void* temp, const struct engine* e,
io_convert_spart_d_mapper, temp_d, N, copySize, 0,
(void*)&props);
} else if (props.convert_spart_l != NULL) {
/* Prepare some parameters */
long long* temp_l = (long long*)temp;
props.start_temp_l = (long long*)temp;
props.e = e;
/* Copy the whole thing into a buffer */
threadpool_map((struct threadpool*)&e->threadpool,
io_convert_spart_l_mapper, temp_l, N, copySize, 0,
(void*)&props);
} else {
error("Missing conversion function");
}
......@@ -1254,15 +1352,21 @@ void io_collect_sparts_to_write(const struct spart* restrict sparts,
* @brief Copy every non-inhibited DM #gpart into the gparts_written array.
*
* @param gparts The array of #gpart containing all particles.
* @param vr_data The array of gpart-related VELOCIraptor output.
* @param gparts_written The array of #gpart to fill with particles we want to
* write.
* @param vr_data_written The array of gpart-related VELOCIraptor with particles
* we want to write.
* @param Ngparts The total number of #part.
* @param Ngparts_written The total number of #part to write.
* @param with_stf Are we running with STF? i.e. do we want to collect vr data?
*/
void io_collect_gparts_to_write(const struct gpart* restrict gparts,
struct gpart* restrict gparts_written,
const size_t Ngparts,
const size_t Ngparts_written) {
void io_collect_gparts_to_write(
const struct gpart* restrict gparts,
const struct velociraptor_gpart_data* restrict vr_data,
struct gpart* restrict gparts_written,
struct velociraptor_gpart_data* restrict vr_data_written,
const size_t Ngparts, const size_t Ngparts_written, const int with_stf) {
size_t count = 0;
......@@ -1274,6 +1378,8 @@ void io_collect_gparts_to_write(const struct gpart* restrict gparts,
(gparts[i].time_bin != time_bin_not_created) &&
(gparts[i].type == swift_type_dark_matter)) {
if (with_stf) vr_data_written[count] = vr_data[i];
gparts_written[count] = gparts[i];
count++;
}
......@@ -1281,7 +1387,7 @@ void io_collect_gparts_to_write(const struct gpart* restrict gparts,
/* Check that everything is fine */
if (count != Ngparts_written)
error("Collected the wrong number of s-particles (%zu vs. %zu expected)",
error("Collected the wrong number of g-particles (%zu vs. %zu expected)",
count, Ngparts_written);
}
......
......@@ -36,6 +36,7 @@
struct cell;
struct part;
struct gpart;
struct velociraptor_gpart_data;
struct spart;
struct xpart;
struct io_props;
......@@ -113,9 +114,11 @@ void io_collect_sparts_to_write(const struct spart* restrict sparts,
const size_t Nsparts,
const size_t Nsparts_written);
void io_collect_gparts_to_write(const struct gpart* restrict gparts,
const struct velociraptor_gpart_data* vr_data,
struct gpart* restrict gparts_written,
struct velociraptor_gpart_data* vr_data_written,
const size_t Ngparts,
const size_t Ngparts_written);
const size_t Ngparts_written, int with_stf);
void io_prepare_dm_gparts(struct threadpool* tp, struct gpart* const gparts,
size_t Ndm);
void io_duplicate_hydro_gparts(struct threadpool* tp, struct part* const parts,
......
......@@ -3169,90 +3169,87 @@ 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 are we getting? */
enum output_type {
output_none,
output_snapshot,
output_statistics,
output_stf
};
/* What kind of output do we want? And at which time ?
* Find the earliest output (amongst all kinds) that takes place
* before the next time-step */
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) {
switch (type) {
case output_snapshot:
/* If both, need to figure out which one occurs first */
if (e->ti_next_stats == e->ti_next_snapshot) {
/* Do we want a corresponding VELOCIraptor output? */
if (with_stf && e->snapshot_invoke_stf) {
/* 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);
/* Dump everything */
engine_print_stats(e);
#ifdef WITH_LOGGER
/* Write a file containing the offsets in the particle logger. */
engine_dump_index(e);
#ifdef HAVE_VELOCIRAPTOR
velociraptor_invoke(e, /*linked_with_snap=*/1);
e->step_props |= engine_step_prop_stf;
#else
engine_dump_snapshot(e);
error(
"Asking for a VELOCIraptor output but SWIFT was compiled without "
"the interface!");
#endif
} else if (e->ti_next_stats < e->ti_next_snapshot) {
/* 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;
}