diff --git a/src/runner.c b/src/runner.c index 6edb34414df705a49b528d9d731bcba35ff9c359..d12605aef2ec90edae1a6c06e175b598d54a1eb1 100644 --- a/src/runner.c +++ b/src/runner.c @@ -158,8 +158,8 @@ void runner_do_stars_ghost(struct runner *r, struct cell *c, int timer) { runner_do_stars_ghost(r, c->progeny[k], 0); /* update h_max */ - if (c->progeny[k]->stars.h_max > c->stars.h_max) - c->stars.h_max = c->progeny[k]->stars.h_max; + if (c->progeny[k]->stars.h_max > h_max) + h_max = c->progeny[k]->stars.h_max; } } else { @@ -428,6 +428,16 @@ void runner_do_stars_ghost(struct runner *r, struct cell *c, int timer) { if (h_max > c->stars.h_max) c->stars.h_max = h_max; + /* The ghost may not always be at the top level. + * Therefore we need to update h_max above the ghost */ + if (c->stars.ghost) { + for(struct cell *tmp = c->parent; tmp != NULL; tmp = tmp->parent) { + if (h_max > tmp->stars.h_max) + tmp->stars.h_max = h_max; + } + } + + if (timer) TIMER_TOC(timer_dostars_ghost); } @@ -1376,8 +1386,9 @@ void runner_do_ghost(struct runner *r, struct cell *c, int timer) { if (c->progeny[k] != NULL) { runner_do_ghost(r, c->progeny[k], 0); /* update h_max */ - if (c->progeny[k]->hydro.h_max > c->hydro.h_max) - c->hydro.h_max = c->progeny[k]->hydro.h_max; + if (c->progeny[k]->hydro.h_max > h_max) { + h_max = c->progeny[k]->hydro.h_max; + } } } else { @@ -1740,8 +1751,18 @@ void runner_do_ghost(struct runner *r, struct cell *c, int timer) { } /* Update h_max */ - if (h_max > c->hydro.h_max) + if (h_max > c->hydro.h_max) { c->hydro.h_max = h_max; + } + + /* The ghost may not always be at the top level. + * Therefore we need to update h_max above the ghost */ + if (c->hydro.ghost) { + for(struct cell *tmp = c->parent; tmp != NULL; tmp = tmp->parent) { + if (h_max > tmp->hydro.h_max) + tmp->hydro.h_max = h_max; + } + } if (timer) TIMER_TOC(timer_do_ghost); }