diff --git a/src/hydro/Default/hydro.h b/src/hydro/Default/hydro.h index bfb5cd1ce39a9908573c66406f41b56561a870d6..a614d08c30b21f9e7d422bf6b6a09d10d2e89799 100644 --- a/src/hydro/Default/hydro.h +++ b/src/hydro/Default/hydro.h @@ -148,6 +148,16 @@ __attribute__((always_inline)) INLINE static float hydro_compute_timestep( return min(dt_cfl, dt_u_change); } +/** + * @brief Does some extra hydro operations once the actual physical time step + * for the particle is known. + * + * @param p The particle to act upon. + * @param dt Physical time step of the particle during the next step. + */ +__attribute__((always_inline)) INLINE static void hydro_timestep_extra( + struct part *p, float dt) {} + /** * @brief Prepares a particle for the density calculation. * diff --git a/src/hydro/Gadget2/hydro.h b/src/hydro/Gadget2/hydro.h index 160a2d8b5d25a97cefb2afd5e22d8e6bcea0006e..cc7b422ccbe7c678969df5779a4d4a054c65528e 100644 --- a/src/hydro/Gadget2/hydro.h +++ b/src/hydro/Gadget2/hydro.h @@ -152,6 +152,16 @@ __attribute__((always_inline)) INLINE static float hydro_compute_timestep( return dt_cfl; } +/** + * @brief Does some extra hydro operations once the actual physical time step + * for the particle is known. + * + * @param p The particle to act upon. + * @param dt Physical time step of the particle during the next step. + */ +__attribute__((always_inline)) INLINE static void hydro_timestep_extra( + struct part *p, float dt) {} + /** * @brief Prepares a particle for the density calculation. * diff --git a/src/hydro/Gizmo/hydro.h b/src/hydro/Gizmo/hydro.h index 8da949feb2fb59ccf34b091bea4ecc65ea98614e..c29c76bed01c37a6dfb01e07c8bb48c540667cff 100644 --- a/src/hydro/Gizmo/hydro.h +++ b/src/hydro/Gizmo/hydro.h @@ -40,6 +40,27 @@ __attribute__((always_inline)) INLINE static float hydro_compute_timestep( return CFL_condition * p->h / fabsf(p->timestepvars.vmax); } +/** + * @brief Does some extra hydro operations once the actual physical time step + * for the particle is known. + * + * We use this to store the physical time step, since it is used for the flux + * exchange during the force loop. + * + * We also set the active flag of the particle to inactive. It will be set to + * active in hydro_init_part, which is called the next time the particle becomes + * active. + * + * @param p The particle to act upon. + * @param dt Physical time step of the particle during the next step. + */ +__attribute__((always_inline)) INLINE static void hydro_timestep_extra( + struct part* p, float dt) { + + p->force.dt = dt; + p->force.active = 0; +} + /** * @brief Initialises the particles for the first time * @@ -89,6 +110,9 @@ __attribute__((always_inline)) INLINE static void hydro_init_part( p->geometry.matrix_E[2][0] = 0.0f; p->geometry.matrix_E[2][1] = 0.0f; p->geometry.matrix_E[2][2] = 0.0f; + + /* Set the active flag to active. */ + p->force.active = 1; } /** @@ -178,10 +202,7 @@ __attribute__((always_inline)) INLINE static void hydro_end_density( * @param timeBase Conversion factor between integer time and physical time. */ __attribute__((always_inline)) INLINE static void hydro_prepare_force( - struct part* restrict p, struct xpart* restrict xp, double timeBase) { - - /* Set the physical time step */ - p->force.dt = get_timestep(p->time_bin, timeBase); // MATTHIEU 0 + struct part* restrict p, struct xpart* restrict xp) { /* Initialize time step criterion variables */ p->timestepvars.vmax = 0.0f; @@ -375,7 +396,7 @@ __attribute__((always_inline)) INLINE static void hydro_end_force( * @param half_dt Half the physical time step. */ __attribute__((always_inline)) INLINE static void hydro_kick_extra( - struct part* p, struct xpart* xp, float dt, integertime_t ti_current) { + struct part* p, struct xpart* xp, float dt) { float oldm, oldp[3], anew[3]; const float half_dt = 0.5f * dt; // MATTHIEU @@ -429,9 +450,9 @@ __attribute__((always_inline)) INLINE static void hydro_kick_extra( /* Store gravitational acceleration and mass flux for next step */ p->gravity.old_a[0] = anew[0]; + p->gravity.old_a[1] = anew[1]; p->gravity.old_a[2] = anew[2]; p->gravity.old_mflux[0] = p->gravity.mflux[0]; - p->gravity.old_a[1] = anew[1]; p->gravity.old_mflux[1] = p->gravity.mflux[1]; p->gravity.old_mflux[2] = p->gravity.mflux[2]; } @@ -444,8 +465,6 @@ __attribute__((always_inline)) INLINE static void hydro_kick_extra( p->conserved.flux.momentum[1] = 0.0f; p->conserved.flux.momentum[2] = 0.0f; p->conserved.flux.energy = 0.0f; - - p->force.ti_end = get_integer_time_end(ti_current, p->time_bin); } /** diff --git a/src/hydro/Gizmo/hydro_iact.h b/src/hydro/Gizmo/hydro_iact.h index a0d8ee4c0b4c7155efed3842a7d79f93e8f5fabe..611f0449a5951f9d5ed2667b65be043dcedcf8f3 100644 --- a/src/hydro/Gizmo/hydro_iact.h +++ b/src/hydro/Gizmo/hydro_iact.h @@ -412,13 +412,7 @@ __attribute__((always_inline)) INLINE static void runner_iact_fluxes_common( ==> we update particle j if (MODE IS 1) OR (j IS INACTIVE) */ - // MATTHIEU - // const integertime_t pj_ti_end = 0; // get_integer_time_end(pj->time_bin); - // const integertime_t pi_ti_end = 0; // get_integer_time_end(pi->time_bin); - integertime_t pi_ti_end = pi->force.ti_end; - integertime_t pj_ti_end = pj->force.ti_end; - - if (mode == 1 || pj_ti_end > pi_ti_end) { + if (mode == 1 || pj->force.active == 0) { /* Store mass flux */ mflux = dtj * Anorm * totflux[0]; pj->gravity.mflux[0] -= mflux * dx[0]; diff --git a/src/hydro/Gizmo/hydro_part.h b/src/hydro/Gizmo/hydro_part.h index 88b4daef6ffb049b562668c0fc3fd881e958d0f0..928011d8201f3f355b00d5fe064267d379278e64 100644 --- a/src/hydro/Gizmo/hydro_part.h +++ b/src/hydro/Gizmo/hydro_part.h @@ -178,8 +178,8 @@ struct part { /* Physical time step of the particle. */ float dt; - /* Integer end time of the particle's time step. */ - integertime_t ti_end; + /* Flag keeping track of whether this is an active or inactive particle. */ + char active; /* Actual velocity of the particle. */ float v_full[3]; diff --git a/src/hydro/Minimal/hydro.h b/src/hydro/Minimal/hydro.h index 20856b7e038855e22aa3776a74ba9f495ff6c93f..56078a82569fb0bc30347d5c01831e9eecfd48f4 100644 --- a/src/hydro/Minimal/hydro.h +++ b/src/hydro/Minimal/hydro.h @@ -165,6 +165,16 @@ __attribute__((always_inline)) INLINE static float hydro_compute_timestep( return dt_cfl; } +/** + * @brief Does some extra hydro operations once the actual physical time step + * for the particle is known. + * + * @param p The particle to act upon. + * @param dt Physical time step of the particle during the next step. + */ +__attribute__((always_inline)) INLINE static void hydro_timestep_extra( + struct part *p, float dt) {} + /** * @brief Prepares a particle for the density calculation. * diff --git a/src/hydro/PressureEntropy/hydro.h b/src/hydro/PressureEntropy/hydro.h index f22bb8a13a8ba4d896a77bd4c4f5e86bed5a5960..20238896f1458d0abebacca4865968a3a671c886 100644 --- a/src/hydro/PressureEntropy/hydro.h +++ b/src/hydro/PressureEntropy/hydro.h @@ -152,6 +152,16 @@ __attribute__((always_inline)) INLINE static float hydro_compute_timestep( return dt_cfl; } +/** + * @brief Does some extra hydro operations once the actual physical time step + * for the particle is known. + * + * @param p The particle to act upon. + * @param dt Physical time step of the particle during the next step. + */ +__attribute__((always_inline)) INLINE static void hydro_timestep_extra( + struct part *p, float dt) {} + /** * @brief Prepares a particle for the density calculation. * diff --git a/src/kick.h b/src/kick.h index 1c6f5fb68eebbf12b2b1e68518e5b0e1b2e21b40..7ccea7d26974297cfebc605808c4443633140ec1 100644 --- a/src/kick.h +++ b/src/kick.h @@ -107,7 +107,7 @@ __attribute__((always_inline)) INLINE static void kick_part( } /* Extra kick work */ - hydro_kick_extra(p, xp, dt, ti_end); + hydro_kick_extra(p, xp, dt); if (p->gpart != NULL) gravity_kick_extra(p->gpart, dt); } diff --git a/src/runner.c b/src/runner.c index ad078f204eaaa00b3c81ac12dda1fbbe3d77cd8d..f0970ae701ad0bd888cefc20b26d73441e21d298 100644 --- a/src/runner.c +++ b/src/runner.c @@ -599,8 +599,6 @@ void runner_do_ghost(struct runner *r, struct cell *c, int timer) { target_wcount - e->hydro_properties->delta_neighbours; const int max_smoothing_iter = e->hydro_properties->max_smoothing_iterations; int redo = 0, count = 0; - const double timeBase = e->timeBase; - integertime_t ti_current = e->ti_current; TIMER_TIC; @@ -681,7 +679,7 @@ void runner_do_ghost(struct runner *r, struct cell *c, int timer) { /* As of here, particle force variables will be set. */ /* Compute variables required for the force loop */ - hydro_prepare_force(p, xp, ti_current, timeBase); + hydro_prepare_force(p, xp); /* The particle force values are now set. Do _NOT_ try to read any particle density variables! */ @@ -1098,6 +1096,7 @@ void runner_do_timestep(struct runner *r, struct cell *c, int timer) { struct xpart *restrict xparts = c->xparts; struct gpart *restrict gparts = c->gparts; struct spart *restrict sparts = c->sparts; + const double timeBase = e->timeBase; TIMER_TIC; @@ -1133,6 +1132,10 @@ void runner_do_timestep(struct runner *r, struct cell *c, int timer) { p->time_bin = get_time_bin(ti_new_step); if (p->gpart != NULL) p->gpart->time_bin = get_time_bin(ti_new_step); + /* Tell the particle what the new physical time step is */ + float dt = get_timestep(p->time_bin, timeBase); + hydro_timestep_extra(p, dt); + /* Number of updated particles */ updated++; if (p->gpart != NULL) g_updated++;