/*******************************************************************************
* This file is part of SWIFT.
* Copyright (c) 2012 Pedro Gonnet (pedro.gonnet@durham.ac.uk)
* Matthieu Schaller (schaller@strw.leidenuniv.nl)
* 2015 Peter W. Draper (p.w.draper@durham.ac.uk)
* 2016 John A. Regan (john.a.regan@durham.ac.uk)
* Tom Theuns (tom.theuns@durham.ac.uk)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*
******************************************************************************/
#ifndef SWIFT_TASK_H
#define SWIFT_TASK_H
#include
/* Includes. */
#include "align.h"
#include "cycle.h"
#include "timeline.h"
/* Forward declarations to avoid circular inclusion dependencies. */
struct cell;
struct engine;
#define task_align 128
/**
* @brief The different task types.
*
* Be sure to update the taskID_names array in tasks.c if you modify this list!
* Also update the python3 task plotting scripts!
*/
enum task_types {
task_type_none = 0,
task_type_sort,
task_type_self,
task_type_pair,
task_type_sub_self,
task_type_sub_pair,
task_type_init_grav,
task_type_init_grav_out, /* Implicit */
task_type_ghost_in, /* Implicit */
task_type_ghost,
task_type_ghost_out, /* Implicit */
task_type_extra_ghost,
task_type_drift_part,
task_type_drift_spart,
task_type_drift_sink,
task_type_drift_bpart,
task_type_drift_gpart,
task_type_drift_gpart_out, /* Implicit */
task_type_end_hydro_force,
task_type_kick1,
task_type_kick2,
task_type_timestep,
task_type_timestep_limiter,
task_type_timestep_sync,
task_type_collect,
task_type_send,
task_type_recv,
task_type_pack,
task_type_unpack,
task_type_grav_long_range,
task_type_grav_mm,
task_type_grav_down_in, /* Implicit */
task_type_grav_down,
task_type_end_grav_force,
task_type_cooling,
task_type_cooling_in, /* Implicit */
task_type_cooling_out, /* Implicit */
task_type_star_formation,
task_type_star_formation_in, /* Implicit */
task_type_star_formation_out, /* Implicit */
task_type_star_formation_sink,
task_type_csds,
task_type_stars_in, /* Implicit */
task_type_stars_out, /* Implicit */
task_type_stars_ghost_in, /* Implicit */
task_type_stars_ghost,
task_type_stars_ghost_out, /* Implicit */
task_type_stars_prep_ghost1, /* Implicit */
task_type_hydro_prep_ghost1, /* Implicit */
task_type_stars_prep_ghost2, /* Implicit */
task_type_stars_sort,
task_type_stars_resort,
task_type_bh_in, /* Implicit */
task_type_bh_out, /* Implicit */
task_type_bh_density_ghost,
task_type_bh_swallow_ghost1, /* Implicit */
task_type_bh_swallow_ghost2,
task_type_bh_swallow_ghost3, /* Implicit */
task_type_fof_self,
task_type_fof_pair,
task_type_fof_attach_self,
task_type_fof_attach_pair,
task_type_neutrino_weight,
task_type_sink_in, /* Implicit */
task_type_sink_density_ghost,
task_type_sink_ghost1, /* Implicit */
task_type_sink_ghost2, /* Implicit */
task_type_sink_out, /* Implicit */
task_type_rt_in, /* Implicit */
task_type_rt_out, /* Implicit */
task_type_sink_formation,
task_type_rt_ghost1,
task_type_rt_ghost2,
task_type_rt_transport_out, /* Implicit */
task_type_rt_tchem,
task_type_rt_advance_cell_time,
task_type_rt_sort,
task_type_rt_collect_times,
task_type_count
} __attribute__((packed));
/**
* @brief The different task sub-types (for pairs, selfs and sub-tasks).
*/
enum task_subtypes {
task_subtype_none = 0,
task_subtype_density,
task_subtype_gradient,
task_subtype_force,
task_subtype_limiter,
task_subtype_grav,
task_subtype_external_grav,
task_subtype_tend,
task_subtype_xv,
task_subtype_rho,
task_subtype_part_swallow,
task_subtype_bpart_merger,
task_subtype_gpart,
task_subtype_spart_density,
task_subtype_part_prep1,
task_subtype_spart_prep2,
task_subtype_stars_density,
task_subtype_stars_prep1,
task_subtype_stars_prep2,
task_subtype_stars_feedback,
task_subtype_sf_counts,
task_subtype_grav_counts,
task_subtype_bpart_rho,
task_subtype_bpart_feedback,
task_subtype_bh_density,
task_subtype_bh_swallow,
task_subtype_do_gas_swallow,
task_subtype_do_bh_swallow,
task_subtype_bh_feedback,
task_subtype_sink_density,
task_subtype_sink_do_sink_swallow,
task_subtype_sink_swallow,
task_subtype_sink_do_gas_swallow,
task_subtype_rt_gradient,
task_subtype_rt_transport,
task_subtype_count
} __attribute__((packed));
/**
* @brief The type of particles/objects this task acts upon in a given cell.
*/
enum task_actions {
task_action_none,
task_action_part,
task_action_gpart,
task_action_spart,
task_action_sink,
task_action_bpart,
task_action_all,
task_action_multipole,
task_action_count
};
/**
* @brief The broad categories of the tasks.
*/
enum task_categories {
task_category_drift,
task_category_sort,
task_category_resort,
task_category_hydro,
task_category_gravity,
task_category_feedback,
task_category_black_holes,
task_category_cooling,
task_category_star_formation,
task_category_limiter,
task_category_sync,
task_category_time_integration,
task_category_mpi,
task_category_pack,
task_category_fof,
task_category_others,
task_category_neutrino,
task_category_sink,
task_category_rt,
task_category_csds,
task_category_count
};
/**
* @brief Names of the task types.
*/
extern const char *taskID_names[];
/**
* @brief Names of the task sub-types.
*/
extern const char *subtaskID_names[];
/**
* @brief Names of the task categories.
*/
extern const char *task_category_names[];
/**
* @brief The MPI communicators for the different subtypes.
*/
#ifdef WITH_MPI
extern MPI_Comm subtaskMPI_comms[task_subtype_count];
#endif
/**
* @brief A task to be run by the #scheduler.
*/
struct task {
/*! Pointers to the cells this task acts upon */
struct cell *ci, *cj;
/*! List of tasks unlocked by this one */
struct task **unlock_tasks;
/*! Flags used to carry additional information (e.g. sort directions) */
long long flags;
#ifdef WITH_MPI
/*! Buffer for this task's communications */
void *buff;
/*! MPI request corresponding to this task */
MPI_Request req;
#endif
/*! Rank of a task in the order */
int rank;
/*! Weight of the task */
float weight;
/*! Number of tasks unlocked by this one */
int nr_unlock_tasks;
/*! Number of unsatisfied dependencies */
int wait;
/*! Type of the task */
enum task_types type;
/*! Sub-type of the task (for the tasks that have one */
enum task_subtypes subtype;
/*! Should the scheduler skip this task ? */
char skip;
/*! Is this task implicit (i.e. does not do anything) ? */
char implicit;
#ifdef SWIFT_DEBUG_TASKS
/*! ID of the queue or runner owning this task */
short int rid;
/*! Information about the direction of the pair task */
short int sid;
#endif
/*! Start and end time of this task */
ticks tic, toc;
/* Total time spent running this task */
ticks total_ticks;
#ifdef SWIFT_DEBUG_CHECKS
/* When was this task last run? */
integertime_t ti_run;
#endif /* SWIFT_DEBUG_CHECKS */
} SWIFT_STRUCT_ALIGN;
/* Function prototypes. */
void task_unlock(struct task *t);
float task_overlap(const struct task *ta, const struct task *tb);
int task_lock(struct task *t);
struct task *task_get_unique_dependent(const struct task *t);
void task_print(const struct task *t);
void task_dump_all(struct engine *e, int step);
void task_dump_stats(const char *dumpfile, struct engine *e,
float dump_tasks_threshold, int header, int allranks);
void task_dump_active(struct engine *e);
void task_get_full_name(int type, int subtype, char *name);
void task_create_name_files(const char *file_prefix);
void task_get_group_name(int type, int subtype, char *cluster);
enum task_categories task_get_category(const struct task *t);
#ifdef WITH_MPI
void task_create_mpi_comms(void);
void task_free_mpi_comms(void);
#endif
#endif /* SWIFT_TASK_H */