Commit 02a35f7b authored by Matthieu Schaller's avatar Matthieu Schaller
Browse files

Simpler interface to the multipole-acceptance-criterion test function.

parent 52edb269
......@@ -1733,7 +1733,8 @@ void cell_activate_subcell_grav_tasks(struct cell *ci, struct cell *cj,
const double r2 = dx * dx + dy * dy + dz * dz;
/* Can we use multipoles ? */
if (gravity_multipole_accept(multi_i, multi_j, theta_crit2, r2)) {
if (gravity_multipole_accept(multi_i->r_max, multi_j->r_max, theta_crit2,
r2)) {
/* Ok, no need to drift anything */
return;
......
......@@ -1798,8 +1798,9 @@ void engine_make_self_gravity_tasks_mapper(void *map_data, int num_elements,
const double r2 = dx * dx + dy * dy + dz * dz;
/* Are the cells too close for a MM interaction ? */
if (!gravity_multipole_accept_rebuild(multi_i, multi_j, theta_crit2,
r2)) {
if (!gravity_multipole_accept(multi_i->r_max_rebuild,
multi_j->r_max_rebuild, theta_crit2,
r2)) {
/* Ok, we need to add a direct pair calculation */
scheduler_addtask(sched, task_type_pair, task_subtype_grav, 0, 0,
......
......@@ -2390,52 +2390,20 @@ INLINE static void gravity_M2P(const struct multipole *ma,
/**
* @brief Checks whether a cell-cell interaction can be appromixated by a M-M
* interaction using the CoM and cell radius at rebuild.
* interaction using the distance and cell radius.
*
* We use the multipole acceptance criterion of Dehnen, 2002, JCoPh, Volume 179,
* Issue 1, pp.27-42, equation 10.
*
* @param ma The #multipole of the first #cell.
* @param mb The #multipole of the second #cell.
* @param theta_crit2 The square of the critical opening angle.
* @param r2 Square of the distance (periodically wrapped) between the
* multipoles.
*/
__attribute__((always_inline)) INLINE static int
gravity_multipole_accept_rebuild(const struct gravity_tensors *const ma,
const struct gravity_tensors *const mb,
double theta_crit2, double r2) {
const double r_crit_a = ma->r_max_rebuild;
const double r_crit_b = mb->r_max_rebuild;
const double size = r_crit_a + r_crit_b;
const double size2 = size * size;
// MATTHIEU: Make this mass-dependent ?
/* Multipole acceptance criterion (Dehnen 2002, eq.10) */
return (r2 * theta_crit2 > size2);
}
/**
* @brief Checks whether a cell-cell interaction can be appromixated by a M-M
* interaction using the CoM and cell radius at the current time.
*
* We use the multipole acceptance criterion of Dehnen, 2002, JCoPh, Volume 179,
* Issue 1, pp.27-42, equation 10.
*
* @param ma The #multipole of the first #cell.
* @param mb The #multipole of the second #cell.
* @param r_crit_a The size of the multipole A.
* @param r_crit_b The size of the multipole B.
* @param theta_crit2 The square of the critical opening angle.
* @param r2 Square of the distance (periodically wrapped) between the
* multipoles.
*/
__attribute__((always_inline)) INLINE static int gravity_multipole_accept(
const struct gravity_tensors *const ma,
const struct gravity_tensors *const mb, double theta_crit2, double r2) {
double r_crit_a, double r_crit_b, double theta_crit2, double r2) {
const double r_crit_a = ma->r_max;
const double r_crit_b = mb->r_max;
const double size = r_crit_a + r_crit_b;
const double size2 = size * size;
......
......@@ -224,6 +224,9 @@ void runner_dopair_grav_pp_full(struct runner *r, struct cell *ci,
const float h_inv_i = 1.f / h_i;
const float h_inv3_i = h_inv_i * h_inv_i * h_inv_i;
///* Can we use the multipole in cj ? */
// if
/* Local accumulators for the acceleration */
float a_x = 0.f, a_y = 0.f, a_z = 0.f;
......@@ -1117,7 +1120,8 @@ void runner_dopair_grav(struct runner *r, struct cell *ci, struct cell *cj,
* option... */
/* Can we use M-M interactions ? */
if (gravity_multipole_accept(multi_i, multi_j, theta_crit2, r2)) {
if (gravity_multipole_accept(multi_i->r_max, multi_j->r_max, theta_crit2,
r2)) {
/* MATTHIEU: make a symmetric M-M interaction function ! */
runner_dopair_grav_mm(r, ci, cj);
......@@ -1341,7 +1345,8 @@ void runner_do_grav_long_range(struct runner *r, struct cell *ci, int timer) {
}
/* Check the multipole acceptance criterion */
if (gravity_multipole_accept(multi_i, multi_j, theta_crit2, r2)) {
if (gravity_multipole_accept(multi_i->r_max, multi_j->r_max, theta_crit2,
r2)) {
/* Go for a (non-symmetric) M-M calculation */
runner_dopair_grav_mm(r, ci, cj);
......@@ -1364,8 +1369,9 @@ void runner_do_grav_long_range(struct runner *r, struct cell *ci, int timer) {
const double r2_rebuild = dx * dx + dy * dy + dz * dz;
/* Is the criterion violated now but was OK at the last rebuild ? */
if (gravity_multipole_accept_rebuild(multi_i, multi_j, theta_crit2,
r2_rebuild)) {
if (gravity_multipole_accept(multi_i->r_max_rebuild,
multi_j->r_max_rebuild, theta_crit2,
r2_rebuild)) {
/* Alright, we have to take charge of that pair in a different way. */
// MATTHIEU: We should actually open the tree-node here and recurse.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment