diff --git a/src/engine.c b/src/engine.c index bf334f8b5762d468a861ba0141b08e5cdffa1109..1be8b196b802b54345e34a634e70e303a64eb599 100644 --- a/src/engine.c +++ b/src/engine.c @@ -2335,8 +2335,23 @@ void engine_step(struct engine *e) { #endif #ifdef SWIFT_GRAVITY_FORCE_CHECKS + /* Check how many gparts are active this timestep. */ + size_t nr_gparts = e->s->nr_gparts; + long long gpart_active_count = 0; + + /* Count active gparts */ + for (long long i=0; i < nr_gparts; ++i) { + struct gpart *gp = &e->s->gparts[i]; + if (gpart_is_active(gp, e)) gpart_active_count += 1; + } + + /* Are all gparts active? */ + const int all_gparts_active = gpart_active_count == nr_gparts; + /* Run the brute-force gravity calculation for some gparts */ - if (e->policy & engine_policy_self_gravity) + if (e->policy & engine_policy_self_gravity && + ((all_gparts_active && e->force_checks_only_all_active) || + !e->force_checks_only_all_active)) gravity_exact_force_compute(e->s, e); #endif @@ -2357,7 +2372,9 @@ void engine_step(struct engine *e) { #ifdef SWIFT_GRAVITY_FORCE_CHECKS /* Check the accuracy of the gravity calculation */ - if (e->policy & engine_policy_self_gravity) + if (e->policy & engine_policy_self_gravity && + ((all_gparts_active && e->force_checks_only_all_active) || + !e->force_checks_only_all_active)) gravity_exact_force_check(e->s, e, 1e-1); #endif @@ -3584,6 +3601,11 @@ void engine_init(struct engine *e, struct space *s, struct swift_params *params, logger_init(e->logger, params); #endif +#ifdef SWIFT_GRAVITY_FORCE_CHECKS + e->force_checks_only_all_active = + parser_get_opt_param_int(params, "ForceChecks:only_when_all_active", 1); +#endif + /* Make the space link back to the engine. */ s->e = e; diff --git a/src/engine.h b/src/engine.h index 7bf3ae264120e0481b8e71087b22cf9753f756d1..9ecd420850823ac6bc1f9bec429f972d198744a4 100644 --- a/src/engine.h +++ b/src/engine.h @@ -484,6 +484,11 @@ struct engine { /* Has there been an stf this timestep? */ char stf_this_timestep; + +#ifdef SWIFT_GRAVITY_FORCE_CHECKS + /* Run brute force checks only on steps when all gparts active? */ + int force_checks_only_all_active; +#endif }; /* Function prototypes, engine.c. */