diff --git a/src/gravity/Default/gravity_iact.h b/src/gravity/Default/gravity_iact.h index e73e1b55fec95855e9b40a4eece18465a5c88b0d..b1073e55e735f8425736148f1e00435d7248761c 100644 --- a/src/gravity/Default/gravity_iact.h +++ b/src/gravity/Default/gravity_iact.h @@ -152,7 +152,7 @@ __attribute__((always_inline)) INLINE static void runner_iact_grav_pm_full( /* In the case where the order is < 3, then there is only a monopole term left. * We can default to the normal P-P interaction with the mass of the multipole * and its CoM as the "particle" property */ -#if 1 // SELF_GRAVITY_MULTIPOLE_ORDER < 3 +#if SELF_GRAVITY_MULTIPOLE_ORDER < 3 float f_ij, pot_ij; runner_iact_grav_pp_full(r2, h * h, h_inv, h_inv * h_inv * h_inv, m->M_000, @@ -176,18 +176,18 @@ __attribute__((always_inline)) INLINE static void runner_iact_grav_pm_full( *f_x = m->M_000 * d.D_100; *f_y = m->M_000 * d.D_010; *f_z = m->M_000 * d.D_001; - *pot = -m->M_000 * d.D_000; + *pot = m->M_000 * d.D_000; /* 3rd order terms (quadrupole) */ *f_x += m->M_200 * d.D_300 + m->M_020 * d.D_120 + m->M_002 * d.D_102; *f_y += m->M_200 * d.D_210 + m->M_020 * d.D_030 + m->M_002 * d.D_012; *f_z += m->M_200 * d.D_201 + m->M_020 * d.D_021 + m->M_002 * d.D_003; - *pot -= m->M_200 * d.D_100 + m->M_020 * d.D_020 + m->M_002 * d.D_002; + *pot += m->M_200 * d.D_100 + m->M_020 * d.D_020 + m->M_002 * d.D_002; *f_x += m->M_110 * d.D_210 + m->M_101 * d.D_201 + m->M_011 * d.D_111; *f_y += m->M_110 * d.D_120 + m->M_101 * d.D_111 + m->M_011 * d.D_021; *f_z += m->M_110 * d.D_111 + m->M_101 * d.D_102 + m->M_011 * d.D_012; - *pot -= m->M_110 * d.D_110 + m->M_101 * d.D_101 + m->M_011 * d.D_011; + *pot += m->M_110 * d.D_110 + m->M_101 * d.D_101 + m->M_011 * d.D_011; #if SELF_GRAVITY_MULTIPOLE_ORDER > 3 @@ -195,7 +195,7 @@ __attribute__((always_inline)) INLINE static void runner_iact_grav_pm_full( *f_x += m->M_300 * d.D_400 + m->M_030 * d.D_130 + m->M_003 * d.D_103; *f_y += m->M_300 * d.D_310 + m->M_030 * d.D_040 + m->M_003 * d.D_013; *f_z += m->M_300 * d.D_301 + m->M_030 * d.D_031 + m->M_003 * d.D_004; - *pot -= m->M_300 * d.D_100 + m->M_030 * d.D_030 + m->M_003 * d.D_003; + *pot += m->M_300 * d.D_100 + m->M_030 * d.D_030 + m->M_003 * d.D_003; #endif /* Take care of the the sign convention */ @@ -235,7 +235,7 @@ __attribute__((always_inline)) INLINE static void runner_iact_grav_pm_truncated( /* In the case where the order is < 3, then there is only a monopole term left. * We can default to the normal P-P interaction with the mass of the multipole * and its CoM as the "particle" property */ -#if 1 // SELF_GRAVITY_MULTIPOLE_ORDER < 3 +#if SELF_GRAVITY_MULTIPOLE_ORDER < 3 float f_ij, pot_ij; runner_iact_grav_pp_truncated(r2, h * h, h_inv, h_inv * h_inv * h_inv, @@ -265,12 +265,12 @@ __attribute__((always_inline)) INLINE static void runner_iact_grav_pm_truncated( *f_x += m->M_200 * d.D_300 + m->M_020 * d.D_120 + m->M_002 * d.D_102; *f_y += m->M_200 * d.D_210 + m->M_020 * d.D_030 + m->M_002 * d.D_012; *f_z += m->M_200 * d.D_201 + m->M_020 * d.D_021 + m->M_002 * d.D_003; - *pot -= m->M_200 * d.D_100 + m->M_020 * d.D_020 + m->M_002 * d.D_002; + *pot += m->M_200 * d.D_100 + m->M_020 * d.D_020 + m->M_002 * d.D_002; *f_x += m->M_110 * d.D_210 + m->M_101 * d.D_201 + m->M_011 * d.D_111; *f_y += m->M_110 * d.D_120 + m->M_101 * d.D_111 + m->M_011 * d.D_021; *f_z += m->M_110 * d.D_111 + m->M_101 * d.D_102 + m->M_011 * d.D_012; - *pot -= m->M_110 * d.D_110 + m->M_101 * d.D_101 + m->M_011 * d.D_011; + *pot += m->M_110 * d.D_110 + m->M_101 * d.D_101 + m->M_011 * d.D_011; #if SELF_GRAVITY_MULTIPOLE_ORDER > 3 @@ -278,7 +278,7 @@ __attribute__((always_inline)) INLINE static void runner_iact_grav_pm_truncated( *f_x += m->M_300 * d.D_400 + m->M_030 * d.D_130 + m->M_003 * d.D_103; *f_y += m->M_300 * d.D_310 + m->M_030 * d.D_040 + m->M_003 * d.D_013; *f_z += m->M_300 * d.D_301 + m->M_030 * d.D_031 + m->M_003 * d.D_004; - *pot -= m->M_300 * d.D_100 + m->M_030 * d.D_030 + m->M_003 * d.D_003; + *pot += m->M_300 * d.D_100 + m->M_030 * d.D_030 + m->M_003 * d.D_003; #endif /* Take care of the the sign convention */ diff --git a/tests/testPotentialPair.c b/tests/testPotentialPair.c index b180efe159aec516e2c11948bc4738d266d17d61..57d68264990bf6d3da2ea385126ef5daa341b787 100644 --- a/tests/testPotentialPair.c +++ b/tests/testPotentialPair.c @@ -39,12 +39,19 @@ const double eps = 0.1; * @param a First value * @param b Second value * @param s String used to identify this check in messages + * @param rel_tol Maximal relative error + * @param limit Minimal value to consider in the tests */ -void check_value(double a, double b, const char *s) { - if (fabs(a - b) / fabs(a + b) > 2e-6 && fabs(a - b) > 1.e-6) +void check_value_backend(double a, double b, const char *s, double rel_tol, + double limit) { + if (fabs(a - b) / fabs(a + b) > rel_tol && fabs(a - b) > limit) error("Values are inconsistent: SWIFT:%12.15e true:%12.15e (%s)!", a, b, s); } +void check_value(double a, double b, const char *s) { + check_value_backend(a, b, s, 2e-6, 1e-6); +} + /* Definitions of the potential and force that match exactly the theory document */ double S(double x) { return exp(x) / (1. + exp(x)); } @@ -319,14 +326,14 @@ int main(int argc, char *argv[]) { message("\n\t\t truncated P-M interactions all good\n"); - /***************************************/ - /* Test the high-order PM interactions */ - /***************************************/ + /************************************************/ + /* Test the high-order periodic PM interactions */ + /************************************************/ /* Reset the accelerations */ for (int n = 0; n < num_tests; ++n) gravity_init_gpart(&cj.gparts[n]); -#if 0 // SELF_GRAVITY_MULTIPOLE_ORDER >= 3 +#if SELF_GRAVITY_MULTIPOLE_ORDER >= 3 /* Let's make ci more interesting */ free(ci.gparts); @@ -367,8 +374,6 @@ int main(int argc, char *argv[]) { gravity_reset(ci.multipole); gravity_P2M(ci.multipole, ci.gparts, ci.gcount); - // message("CoM=[%e %e %e]", ci.multipole->CoM[0], ci.multipole->CoM[1], - // ci.multipole->CoM[2]); gravity_multipole_print(&ci.multipole->m_pole); /* Compute the forces */ @@ -377,7 +382,6 @@ int main(int argc, char *argv[]) { /* Verify everything */ for (int n = 0; n < num_tests; ++n) { const struct gpart *gp = &cj.gparts[n]; - const struct gravity_tensors *mpole = ci.multipole; double pot_true = 0, acc_true[3] = {0., 0., 0.}; @@ -395,12 +399,14 @@ int main(int argc, char *argv[]) { acc_true[2] -= acceleration(gp2->mass, d, epsilon, rlr) * dx[2] / d; } - message("x=%e f=%e f_true=%e pot=%e pot_true=%e %e %e", - gp->x[0] - mpole->CoM[0], gp->a_grav[0], acc_true[0], gp->potential, - pot_true, acc_true[1], acc_true[2]); + /* const struct gravity_tensors *mpole = ci.multipole; */ + /* message("x=%e f=%e f_true=%e pot=%e pot_true=%e %e %e", */ + /* gp->x[0] - mpole->CoM[0], gp->a_grav[0], acc_true[0], + * gp->potential, */ + /* pot_true, acc_true[1], acc_true[2]); */ - // check_value(gp->potential, pot_true, "potential"); - // check_value(gp->a_grav[0], acc_true[0], "acceleration"); + check_value_backend(gp->potential, pot_true, "potential", 1e-2, 1e-6); + check_value_backend(gp->a_grav[0], acc_true[0], "acceleration", 1e-2, 1e-6); } message("\n\t\t high-order P-M interactions all good\n");