Commit 273a77c3 authored by Matthieu Schaller's avatar Matthieu Schaller
Browse files

Merge branch 'master' into update_cooling_grackle

parents 114cd0ae 460d2cf7
...@@ -27,7 +27,7 @@ Statistics: ...@@ -27,7 +27,7 @@ Statistics:
Gravity: Gravity:
eta: 0.025 # Constant dimensionless multiplier for time integration. eta: 0.025 # Constant dimensionless multiplier for time integration.
epsilon: 0.001 # Softening length (in internal units). epsilon: 0.001 # Softening length (in internal units).
theta: 0.7 # Opening angle (Multipole acceptance criterion) theta: 0.85 # Opening angle (Multipole acceptance criterion)
# Parameters for the hydrodynamics scheme # Parameters for the hydrodynamics scheme
SPH: SPH:
......
...@@ -13,6 +13,9 @@ TimeIntegration: ...@@ -13,6 +13,9 @@ TimeIntegration:
dt_min: 1e-10 # The minimal time-step size 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). dt_max: 1e-4 # The maximal time-step size of the simulation (in internal units).
Scheduler:
max_top_level_cells: 20
# Parameters governing the snapshots # Parameters governing the snapshots
Snapshots: Snapshots:
basename: eagle # Common part of the name of output files basename: eagle # Common part of the name of output files
...@@ -26,8 +29,8 @@ Statistics: ...@@ -26,8 +29,8 @@ Statistics:
# Parameters for the self-gravity scheme # Parameters for the self-gravity scheme
Gravity: Gravity:
eta: 0.025 # Constant dimensionless multiplier for time integration. eta: 0.025 # Constant dimensionless multiplier for time integration.
epsilon: 0.0001 # Softening length (in internal units). epsilon: 0.001 # Softening length (in internal units).
theta: 0.7 # Opening angle (Multipole acceptance criterion) theta: 0.85 # Opening angle (Multipole acceptance criterion)
# Parameters for the hydrodynamics scheme # Parameters for the hydrodynamics scheme
SPH: SPH:
......
...@@ -26,8 +26,8 @@ Statistics: ...@@ -26,8 +26,8 @@ Statistics:
# Parameters for the self-gravity scheme # Parameters for the self-gravity scheme
Gravity: Gravity:
eta: 0.025 # Constant dimensionless multiplier for time integration. eta: 0.025 # Constant dimensionless multiplier for time integration.
epsilon: 0.0001 # Softening length (in internal units). epsilon: 0.001 # Softening length (in internal units).
theta: 0.7 # Opening angle (Multipole acceptance criterion) theta: 0.85 # Opening angle (Multipole acceptance criterion)
# Parameters for the hydrodynamics scheme # Parameters for the hydrodynamics scheme
SPH: SPH:
......
...@@ -6,6 +6,10 @@ InternalUnitSystem: ...@@ -6,6 +6,10 @@ InternalUnitSystem:
UnitCurrent_in_cgs: 1 # Amperes UnitCurrent_in_cgs: 1 # Amperes
UnitTemp_in_cgs: 1 # Kelvin UnitTemp_in_cgs: 1 # Kelvin
Scheduler:
max_top_level_cells: 8
tasks_per_cell: 50
# Parameters governing the time integration # Parameters governing the time integration
TimeIntegration: TimeIntegration:
time_begin: 0. # The starting time of the simulation (in internal units). time_begin: 0. # The starting time of the simulation (in internal units).
...@@ -26,8 +30,8 @@ Statistics: ...@@ -26,8 +30,8 @@ Statistics:
# Parameters for the self-gravity scheme # Parameters for the self-gravity scheme
Gravity: Gravity:
eta: 0.025 # Constant dimensionless multiplier for time integration. eta: 0.025 # Constant dimensionless multiplier for time integration.
theta: 0.85 # Opening angle (Multipole acceptance criterion)
epsilon: 0.001 # Softening length (in internal units). epsilon: 0.001 # Softening length (in internal units).
theta: 0.85 # Opening angle (Multipole acceptance criterion)
# Parameters for the hydrodynamics scheme # Parameters for the hydrodynamics scheme
SPH: SPH:
......
...@@ -9,9 +9,9 @@ InternalUnitSystem: ...@@ -9,9 +9,9 @@ InternalUnitSystem:
# Parameters governing the time integration # Parameters governing the time integration
TimeIntegration: TimeIntegration:
time_begin: 0. # The starting time of the simulation (in internal units). time_begin: 0. # The starting time of the simulation (in internal units).
time_end: 1. # The end time of the simulation (in internal units). time_end: 100. # The end time of the simulation (in internal units).
dt_min: 1e-6 # The minimal time-step size of the simulation (in internal units). dt_min: 1e-6 # The minimal time-step size of the simulation (in internal units).
dt_max: 1e-3 # The maximal time-step size of the simulation (in internal units). dt_max: 1. # The maximal time-step size of the simulation (in internal units).
Scheduler: Scheduler:
max_top_level_cells: 8 max_top_level_cells: 8
...@@ -21,18 +21,18 @@ Scheduler: ...@@ -21,18 +21,18 @@ Scheduler:
Snapshots: Snapshots:
basename: uniformDMBox # Common part of the name of output files basename: uniformDMBox # Common part of the name of output files
time_first: 0. # Time of the first output (in internal units) time_first: 0. # Time of the first output (in internal units)
delta_time: 0.01 # Time difference between consecutive outputs (in internal units) delta_time: 10. # Time difference between consecutive outputs (in internal units)
# Parameters for the self-gravity scheme # Parameters for the self-gravity scheme
Gravity: Gravity:
eta: 0.025 # Constant dimensionless multiplier for time integration. eta: 0.025 # Constant dimensionless multiplier for time integration.
theta: 0.7 # Opening angle (Multipole acceptance criterion) theta: 0.8 # Opening angle (Multipole acceptance criterion)
epsilon: 0.00001 # Softening length (in internal units). epsilon: 0.01 # Softening length (in internal units).
# Parameters governing the conserved quantities statistics # Parameters governing the conserved quantities statistics
Statistics: Statistics:
delta_time: 1e-2 # Time between statistics output delta_time: 5. # Time between statistics output
# Parameters related to the initial conditions # Parameters related to the initial conditions
InitialConditions: InitialConditions:
file_name: ./uniformDMBox_50.hdf5 # The file to read file_name: ./uniformDMBox_16.hdf5 # The file to read
...@@ -52,11 +52,10 @@ infile = args.input ...@@ -52,11 +52,10 @@ infile = args.input
# Tasks and subtypes. Indexed as in tasks.h. # Tasks and subtypes. Indexed as in tasks.h.
TASKTYPES = ["none", "sort", "self", "pair", "sub_self", "sub_pair", TASKTYPES = ["none", "sort", "self", "pair", "sub_self", "sub_pair",
"init_grav", "ghost", "extra_ghost", "drift_part", "init_grav", "ghost_in", "ghost", "ghost_out", "extra_ghost", "drift_part", "drift_gpart",
"drift_gpart", "kick1", "kick2", "timestep", "send", "recv", "kick1", "kick2", "timestep", "send", "recv", "grav_top_level",
"grav_top_level", "grav_long_range", "grav_mm", "grav_down", "grav_long_range", "grav_ghost_in", "grav_ghost_out", "grav_mm", "grav_down", "cooling",
"cooling", "sourceterms", "count"] "sourceterms", "count"]
SUBTYPES = ["none", "density", "gradient", "force", "grav", "external_grav", SUBTYPES = ["none", "density", "gradient", "force", "grav", "external_grav",
"tend", "xv", "rho", "gpart", "multipole", "spart", "count"] "tend", "xv", "rho", "gpart", "multipole", "spart", "count"]
......
...@@ -18,8 +18,6 @@ inputFile2 = "" ...@@ -18,8 +18,6 @@ inputFile2 = ""
# Check list of density neighbours and check that they are correct. # Check list of density neighbours and check that they are correct.
def check_density_neighbours(pids, ngb_ids_naive, ngb_ids_sort, mask, pos, h, num_invalid, acc): def check_density_neighbours(pids, ngb_ids_naive, ngb_ids_sort, mask, pos, h, num_invalid, acc):
error_val = False
for k in range(0,num_invalid): for k in range(0,num_invalid):
# Filter neighbour lists for valid particle ids # Filter neighbour lists for valid particle ids
...@@ -28,7 +26,21 @@ def check_density_neighbours(pids, ngb_ids_naive, ngb_ids_sort, mask, pos, h, nu ...@@ -28,7 +26,21 @@ def check_density_neighbours(pids, ngb_ids_naive, ngb_ids_sort, mask, pos, h, nu
# Check neighbour lists for differences # Check neighbour lists for differences
id_list = set(filter_neigh_naive).symmetric_difference(set(filter_neigh_sort)) id_list = set(filter_neigh_naive).symmetric_difference(set(filter_neigh_sort))
# Check for duplicate IDs
duplicate_check_naive = len(filter_neigh_naive) != len(set(filter_neigh_naive))
duplicate_check_sort = len(filter_neigh_sort) != len(set(filter_neigh_sort))
if duplicate_check_naive:
print "Duplicate neighbour ID found in: ", inputFile1
print filter_neigh_naive
return True
if duplicate_check_sort:
print "Duplicate neighbour ID found in: ", inputFile2
print filter_neigh_sort
return True
pid = pids[mask][k] pid = pids[mask][k]
# Loop over discrepancies and check if they are actually neighbours # Loop over discrepancies and check if they are actually neighbours
...@@ -53,9 +65,9 @@ def check_density_neighbours(pids, ngb_ids_naive, ngb_ids_sort, mask, pos, h, nu ...@@ -53,9 +65,9 @@ def check_density_neighbours(pids, ngb_ids_naive, ngb_ids_sort, mask, pos, h, nu
if diff < acc * hig2: if diff < acc * hig2:
print "Missing interaction due to precision issue will be ignored." print "Missing interaction due to precision issue will be ignored."
else: else:
error_val = True return True
return error_val return False
# Check list of force neighbours and check that they are correct. # Check list of force neighbours and check that they are correct.
def check_force_neighbours(pids, ngb_ids_naive, ngb_ids_sort, mask, pos, h, num_invalid, acc): def check_force_neighbours(pids, ngb_ids_naive, ngb_ids_sort, mask, pos, h, num_invalid, acc):
......
...@@ -110,9 +110,9 @@ pl.rcParams.update(PLOT_PARAMS) ...@@ -110,9 +110,9 @@ pl.rcParams.update(PLOT_PARAMS)
# Tasks and subtypes. Indexed as in tasks.h. # Tasks and subtypes. Indexed as in tasks.h.
TASKTYPES = ["none", "sort", "self", "pair", "sub_self", "sub_pair", TASKTYPES = ["none", "sort", "self", "pair", "sub_self", "sub_pair",
"init_grav", "ghost", "extra_ghost", "drift_part", "drift_gpart", "init_grav", "ghost_in", "ghost", "ghost_out", "extra_ghost", "drift_part", "drift_gpart",
"kick1", "kick2", "timestep", "send", "recv", "grav_top_level", "kick1", "kick2", "timestep", "send", "recv", "grav_top_level",
"grav_long_range", "grav_mm", "grav_down", "cooling", "grav_long_range", "grav_ghost_in", "grav_ghost_out", "grav_mm", "grav_down", "cooling",
"sourceterms", "count"] "sourceterms", "count"]
SUBTYPES = ["none", "density", "gradient", "force", "grav", "external_grav", SUBTYPES = ["none", "density", "gradient", "force", "grav", "external_grav",
...@@ -123,7 +123,7 @@ FULLTYPES = ["self/force", "self/density", "self/grav", "sub_self/force", ...@@ -123,7 +123,7 @@ FULLTYPES = ["self/force", "self/density", "self/grav", "sub_self/force",
"sub_self/density", "pair/force", "pair/density", "pair/grav", "sub_self/density", "pair/force", "pair/density", "pair/grav",
"sub_pair/force", "sub_pair/force",
"sub_pair/density", "recv/xv", "send/xv", "recv/rho", "send/rho", "sub_pair/density", "recv/xv", "send/xv", "recv/rho", "send/rho",
"recv/tend", "send/tend"] "recv/tend", "send/tend", "recv/gpart", "send/gpart"]
# A number of colours for the various types. Recycled when there are # A number of colours for the various types. Recycled when there are
# more task types than colours... # more task types than colours...
......
...@@ -82,19 +82,19 @@ __attribute__((always_inline)) INLINE static int cell_are_gpart_drifted( ...@@ -82,19 +82,19 @@ __attribute__((always_inline)) INLINE static int cell_are_gpart_drifted(
* @param e The #engine containing information about the current time. * @param e The #engine containing information about the current time.
* @return 1 if the #cell contains at least an active particle, 0 otherwise. * @return 1 if the #cell contains at least an active particle, 0 otherwise.
*/ */
__attribute__((always_inline)) INLINE static int cell_is_active( __attribute__((always_inline)) INLINE static int cell_is_active_hydro(
const struct cell *c, const struct engine *e) { const struct cell *c, const struct engine *e) {
#ifdef SWIFT_DEBUG_CHECKS #ifdef SWIFT_DEBUG_CHECKS
if (c->ti_end_min < e->ti_current) if (c->ti_hydro_end_min < e->ti_current)
error( error(
"cell in an impossible time-zone! c->ti_end_min=%lld (t=%e) and " "cell in an impossible time-zone! c->ti_end_min=%lld (t=%e) and "
"e->ti_current=%lld (t=%e)", "e->ti_current=%lld (t=%e)",
c->ti_end_min, c->ti_end_min * e->timeBase, e->ti_current, c->ti_hydro_end_min, c->ti_hydro_end_min * e->timeBase, e->ti_current,
e->ti_current * e->timeBase); e->ti_current * e->timeBase);
#endif #endif
return (c->ti_end_min == e->ti_current); return (c->ti_hydro_end_min == e->ti_current);
} }
/** /**
...@@ -104,18 +104,61 @@ __attribute__((always_inline)) INLINE static int cell_is_active( ...@@ -104,18 +104,61 @@ __attribute__((always_inline)) INLINE static int cell_is_active(
* @param e The #engine containing information about the current time. * @param e The #engine containing information about the current time.
* @return 1 if all particles in a #cell are active, 0 otherwise. * @return 1 if all particles in a #cell are active, 0 otherwise.
*/ */
__attribute__((always_inline)) INLINE static int cell_is_all_active( __attribute__((always_inline)) INLINE static int cell_is_all_active_hydro(
const struct cell *c, const struct engine *e) { const struct cell *c, const struct engine *e) {
#ifdef SWIFT_DEBUG_CHECKS #ifdef SWIFT_DEBUG_CHECKS
if (c->ti_end_max < e->ti_current) if (c->ti_hydro_end_max < e->ti_current)
error( error(
"cell in an impossible time-zone! c->ti_end_max=%lld " "cell in an impossible time-zone! c->ti_end_max=%lld "
"e->ti_current=%lld", "e->ti_current=%lld",
c->ti_end_max, e->ti_current); c->ti_hydro_end_max, e->ti_current);
#endif #endif
return (c->ti_end_max == e->ti_current); return (c->ti_hydro_end_max == e->ti_current);
}
/**
* @brief Does a cell contain any g-particle finishing their time-step now ?
*
* @param c The #cell.
* @param e The #engine containing information about the current time.
* @return 1 if the #cell contains at least an active particle, 0 otherwise.
*/
__attribute__((always_inline)) INLINE static int cell_is_active_gravity(
const struct cell *c, const struct engine *e) {
#ifdef SWIFT_DEBUG_CHECKS
if (c->ti_gravity_end_min < e->ti_current)
error(
"cell in an impossible time-zone! c->ti_end_min=%lld (t=%e) and "
"e->ti_current=%lld (t=%e)",
c->ti_gravity_end_min, c->ti_gravity_end_min * e->timeBase,
e->ti_current, e->ti_current * e->timeBase);
#endif
return (c->ti_gravity_end_min == e->ti_current);
}
/**
* @brief Are *all* g-particles in a cell finishing their time-step now ?
*
* @param c The #cell.
* @param e The #engine containing information about the current time.
* @return 1 if all particles in a #cell are active, 0 otherwise.
*/
__attribute__((always_inline)) INLINE static int cell_is_all_active_gravity(
const struct cell *c, const struct engine *e) {
#ifdef SWIFT_DEBUG_CHECKS
if (c->ti_gravity_end_max < e->ti_current)
error(
"cell in an impossible time-zone! c->ti_end_max=%lld "
"e->ti_current=%lld",
c->ti_gravity_end_max, e->ti_current);
#endif
return (c->ti_gravity_end_max == e->ti_current);
} }
/** /**
...@@ -215,19 +258,41 @@ __attribute__((always_inline)) INLINE static int spart_is_active( ...@@ -215,19 +258,41 @@ __attribute__((always_inline)) INLINE static int spart_is_active(
* @param e The #engine containing information about the current time. * @param e The #engine containing information about the current time.
* @return 1 if the #cell contains at least an active particle, 0 otherwise. * @return 1 if the #cell contains at least an active particle, 0 otherwise.
*/ */
__attribute__((always_inline)) INLINE static int cell_is_starting( __attribute__((always_inline)) INLINE static int cell_is_starting_hydro(
const struct cell *c, const struct engine *e) { const struct cell *c, const struct engine *e) {
#ifdef SWIFT_DEBUG_CHECKS #ifdef SWIFT_DEBUG_CHECKS
if (c->ti_beg_max > e->ti_current) if (c->ti_hydro_beg_max > e->ti_current)
error( error(
"cell in an impossible time-zone! c->ti_beg_max=%lld (t=%e) and " "cell in an impossible time-zone! c->ti_beg_max=%lld (t=%e) and "
"e->ti_current=%lld (t=%e)", "e->ti_current=%lld (t=%e)",
c->ti_beg_max, c->ti_beg_max * e->timeBase, e->ti_current, c->ti_hydro_beg_max, c->ti_hydro_beg_max * e->timeBase, e->ti_current,
e->ti_current * e->timeBase); e->ti_current * e->timeBase);
#endif #endif
return (c->ti_beg_max == e->ti_current); return (c->ti_hydro_beg_max == e->ti_current);
}
/**
* @brief Does a cell contain any g-particle starting their time-step now ?
*
* @param c The #cell.
* @param e The #engine containing information about the current time.
* @return 1 if the #cell contains at least an active particle, 0 otherwise.
*/
__attribute__((always_inline)) INLINE static int cell_is_starting_gravity(
const struct cell *c, const struct engine *e) {
#ifdef SWIFT_DEBUG_CHECKS
if (c->ti_gravity_beg_max > e->ti_current)
error(
"cell in an impossible time-zone! c->ti_beg_max=%lld (t=%e) and "
"e->ti_current=%lld (t=%e)",
c->ti_gravity_beg_max, c->ti_gravity_beg_max * e->timeBase,
e->ti_current, e->ti_current * e->timeBase);
#endif
return (c->ti_gravity_beg_max == e->ti_current);
} }
/** /**
......
This diff is collapsed.
...@@ -80,14 +80,23 @@ struct pcell { ...@@ -80,14 +80,23 @@ struct pcell {
/*! Maximal smoothing length. */ /*! Maximal smoothing length. */
double h_max; double h_max;
/*! Minimal integer end-of-timestep in this cell */ /*! Minimal integer end-of-timestep in this cell for hydro tasks */
integertime_t ti_end_min; integertime_t ti_hydro_end_min;
/*! Maximal integer end-of-timestep in this cell */ /*! Maximal integer end-of-timestep in this cell for hydro tasks */
integertime_t ti_end_max; integertime_t ti_hydro_end_max;
/*! Maximal integer beginning-of-timestep in this cell */ /*! Maximal integer beginning-of-timestep in this cell for hydro tasks */
integertime_t ti_beg_max; integertime_t ti_hydro_beg_max;
/*! Minimal integer end-of-timestep in this cell for gravity tasks */
integertime_t ti_gravity_end_min;
/*! Maximal integer end-of-timestep in this cell for gravity tasks */
integertime_t ti_gravity_end_max;
/*! Maximal integer beginning-of-timestep in this cell for gravity tasks */
integertime_t ti_gravity_beg_max;
/*! Integer time of the last drift of the #part in this cell */ /*! Integer time of the last drift of the #part in this cell */
integertime_t ti_old_part; integertime_t ti_old_part;
...@@ -95,6 +104,9 @@ struct pcell { ...@@ -95,6 +104,9 @@ struct pcell {
/*! Integer time of the last drift of the #gpart in this cell */ /*! Integer time of the last drift of the #gpart in this cell */
integertime_t ti_old_gpart; integertime_t ti_old_gpart;
/*! Integer time of the last drift of the #multipole in this cell */
integertime_t ti_old_multipole;
/*! Number of #part in this cell. */ /*! Number of #part in this cell. */
int count; int count;
...@@ -110,6 +122,11 @@ struct pcell { ...@@ -110,6 +122,11 @@ struct pcell {
/*! Relative indices of the cell's progeny. */ /*! Relative indices of the cell's progeny. */
int progeny[8]; int progeny[8];
#ifdef SWIFT_DEBUG_CHECKS
/* Cell ID (for debugging) */
int cellID;
#endif
} SWIFT_STRUCT_ALIGN; } SWIFT_STRUCT_ALIGN;
/** /**
...@@ -117,8 +134,17 @@ struct pcell { ...@@ -117,8 +134,17 @@ struct pcell {
*/ */
struct pcell_step { struct pcell_step {
/*! Minimal integer end-of-timestep in this cell */ /*! Minimal integer end-of-timestep in this cell (hydro) */
integertime_t ti_end_min; integertime_t ti_hydro_end_min;
/*! Minimal integer end-of-timestep in this cell (hydro) */
integertime_t ti_hydro_end_max;
/*! Minimal integer end-of-timestep in this cell (gravity) */
integertime_t ti_gravity_end_min;
/*! Minimal integer end-of-timestep in this cell (gravity) */
integertime_t ti_gravity_end_max;
/*! Maximal distance any #part has travelled since last rebuild */ /*! Maximal distance any #part has travelled since last rebuild */
float dx_max_part; float dx_max_part;
...@@ -170,11 +196,16 @@ struct cell { ...@@ -170,11 +196,16 @@ struct cell {
/*! Parent cell. */ /*! Parent cell. */
struct cell *parent; struct cell *parent;
/*! Super cell, i.e. the highest-level parent cell that has pair/self tasks */ /*! Super cell, i.e. the highest-level parent cell with *any* task */
struct cell *super; struct cell *super;
/*! The task computing this cell's sorts. */ /*! Super cell, i.e. the highest-level parent cell that has a hydro pair/self
struct task *sorts; * tasks */
struct cell *super_hydro;
/*! Super cell, i.e. the highest-level parent cell that has a grav pair/self
* tasks */
struct cell *super_gravity;
/*! Linked list of the tasks computing this cell's hydro density. */ /*! Linked list of the tasks computing this cell's hydro density. */
struct link *density; struct link *density;
...@@ -188,6 +219,9 @@ struct cell { ...@@ -188,6 +219,9 @@ struct cell {
/*! Linked list of the tasks computing this cell's gravity forces. */ /*! Linked list of the tasks computing this cell's gravity forces. */
struct link *grav; struct link *grav;
/*! The task computing this cell's sorts. */
struct task *sorts;
/*! The multipole initialistation task */ /*! The multipole initialistation task */
struct task *init_grav; struct task *init_grav;
...@@ -219,7 +253,7 @@ struct cell { ...@@ -219,7 +253,7 @@ struct cell {
struct task *timestep; struct task *timestep;
/*! Task linking the FFT mesh to the rest of gravity tasks */ /*! Task linking the FFT mesh to the rest of gravity tasks */
struct task *grav_ghost[2]; struct task *grav_ghost_in, *grav_ghost_out;
/*! Task computing long range non-periodic gravity interactions */ /*! Task computing long range non-periodic gravity interactions */
struct task *grav_long_range; struct task *grav_long_range;
...@@ -235,27 +269,33 @@ struct cell { ...@@ -235,27 +269,33 @@ struct cell {
#ifdef WITH_MPI #ifdef WITH_MPI
/* Task receiving data (positions). */ /* Task receiving hydro data (positions). */
struct task *recv_xv; struct task *recv_xv;
/* Task receiving data (density). */ /* Task receiving hydro data (density). */
struct task *recv_rho; struct task *recv_rho;
/* Task receiving data (gradient). */ /* Task receiving hydro data (gradient). */
struct task *recv_gradient; struct task *recv_gradient;
/* Task receiving gpart data. */
struct task *recv_grav;
/* Task receiving data (time-step). */ /* Task receiving data (time-step). */
struct task *recv_ti; struct task *recv_ti;
/* Linked list for sending data (positions). */ /* Linked list for sending hydro data (positions). */
struct link *send_xv; struct link *send_xv;
/* Linked list for sending data (density). */ /* Linked list for sending hydro data (density). */
struct link *send_rho; struct link *send_rho;
/* Linked list for sending data (gradient). */ /* Linked list for sending hydro data (gradient). */
struct link *send_gradient; struct link *send_gradient;
/* Linked list for sending gpart data. */
struct link *send_grav;
/* Linked list for sending data (time-step). */ /* Linked list for sending data (time-step). */
struct link *send_ti; struct link *send_ti;
...@@ -273,14 +313,24 @@ struct cell { ...@@ -273,14 +313,24 @@ struct cell {
#endif #endif
/*! Minimum end of (integer) time step in this cell. */