diff --git a/src/cell.c b/src/cell.c index a8281a292e2b77034998d8f8192e92eb12ff2779..50d3a441568acf8f20da905c0734965ed0a38993 100644 --- a/src/cell.c +++ b/src/cell.c @@ -686,9 +686,10 @@ void cell_sanitize(struct cell *c) { void cell_convert_hydro(struct cell *c, void *data) { struct part *p = c->parts; + struct xpart *xp = c->xparts; for (int i = 0; i < c->count; ++i) { - hydro_convert_quantities(&p[i]); + hydro_convert_quantities(&p[i], &xp[i]); } } diff --git a/src/hydro/Gadget2/hydro.h b/src/hydro/Gadget2/hydro.h index eba1a03663b007ca31ca16cac1b7f649cf3bb04b..581cb63d829dfec18b2371a128a29cd4f793b53b 100644 --- a/src/hydro/Gadget2/hydro.h +++ b/src/hydro/Gadget2/hydro.h @@ -48,7 +48,7 @@ __attribute__((always_inline)) INLINE static float hydro_get_internal_energy( const struct part *restrict p, float dt) { - const float entropy = p->entropy + p->entropy_dt * dt; + const float entropy = p->entropy + dt * p->entropy_dt; return gas_internal_energy_from_entropy(p->rho, entropy); } @@ -62,7 +62,7 @@ __attribute__((always_inline)) INLINE static float hydro_get_internal_energy( __attribute__((always_inline)) INLINE static float hydro_get_pressure( const struct part *restrict p, float dt) { - const float entropy = p->entropy + p->entropy_dt * dt; + const float entropy = p->entropy + dt * p->entropy_dt; return gas_pressure_from_entropy(p->rho, entropy); } @@ -76,7 +76,7 @@ __attribute__((always_inline)) INLINE static float hydro_get_pressure( __attribute__((always_inline)) INLINE static float hydro_get_entropy( const struct part *restrict p, float dt) { - return p->entropy + p->entropy_dt * dt; + return p->entropy + dt * p->entropy_dt; } /** @@ -216,6 +216,7 @@ __attribute__((always_inline)) INLINE static void hydro_first_init_part( xp->v_full[0] = p->v[0]; xp->v_full[1] = p->v[1]; xp->v_full[2] = p->v[2]; + xp->entropy_full = p->entropy; } /** @@ -228,9 +229,10 @@ __attribute__((always_inline)) INLINE static void hydro_first_init_part( */ __attribute__((always_inline)) INLINE static void hydro_init_part( struct part *restrict p) { + + p->rho = 0.f; p->density.wcount = 0.f; p->density.wcount_dh = 0.f; - p->rho = 0.f; p->density.rho_dh = 0.f; p->density.div_v = 0.f; p->density.rot_v[0] = 0.f; @@ -302,11 +304,7 @@ __attribute__((always_inline)) INLINE static void hydro_prepare_force( const float abs_div_v = fabsf(p->density.div_v); /* Compute the pressure */ - const integertime_t ti_begin = - get_integer_time_begin(ti_current, p->time_bin); - const integertime_t ti_end = get_integer_time_end(ti_current, p->time_bin); - const float half_dt = (ti_current - (ti_begin + ti_end) / 2) * timeBase; - const float pressure = hydro_get_pressure(p, half_dt); + const float pressure = gas_pressure_from_entropy(p->rho, p->entropy); /* Compute the sound speed */ const float soundspeed = gas_soundspeed_from_pressure(p->rho, pressure); @@ -368,6 +366,9 @@ __attribute__((always_inline)) INLINE static void hydro_reset_predicted_values( p->v[0] = xp->v_full[0]; p->v[1] = xp->v_full[1]; p->v[2] = xp->v_full[2]; + + /* Re-set the entropy */ + p->entropy = xp->entropy_full; } /** @@ -400,11 +401,11 @@ __attribute__((always_inline)) INLINE static void hydro_predict_extra( else p->rho *= expf(w2); - /* Drift the pressure */ - const integertime_t ti_begin = get_integer_time_begin(t0, p->time_bin); - const integertime_t ti_end = get_integer_time_end(t0, p->time_bin); - const float dt_entr = (t1 - (ti_begin + ti_end) / 2) * timeBase; - const float pressure = hydro_get_pressure(p, dt_entr); + /* Predict the entropy */ + p->entropy += p->entropy_dt * dt; + + /* Re-compute the pressure */ + const float pressure = gas_pressure_from_entropy(p->rho, p->entropy); /* Compute the new sound speed */ const float soundspeed = gas_soundspeed_from_pressure(p->rho, pressure); @@ -446,13 +447,13 @@ __attribute__((always_inline)) INLINE static void hydro_kick_extra( /* Do not decrease the entropy (temperature) by more than a factor of 2*/ const float entropy_change = p->entropy_dt * dt; - if (entropy_change > -0.5f * p->entropy) - p->entropy += entropy_change; + if (entropy_change > -0.5f * xp->entropy_full) + xp->entropy_full += entropy_change; else - p->entropy *= 0.5f; + xp->entropy_full *= 0.5f; /* Compute the pressure */ - const float pressure = gas_pressure_from_entropy(p->rho, p->entropy); + const float pressure = gas_pressure_from_entropy(p->rho, xp->entropy_full); /* Compute the new sound speed */ const float soundspeed = gas_soundspeed_from_pressure(p->rho, pressure); @@ -473,10 +474,11 @@ __attribute__((always_inline)) INLINE static void hydro_kick_extra( * @param p The particle to act upon */ __attribute__((always_inline)) INLINE static void hydro_convert_quantities( - struct part *restrict p) { + struct part *restrict p, struct xpart *restrict xp) { /* We read u in the entropy field. We now get S from u */ - p->entropy = gas_entropy_from_internal_energy(p->rho, p->entropy); + xp->entropy_full = gas_entropy_from_internal_energy(p->rho, p->entropy); + p->entropy = xp->entropy_full; /* Compute the pressure */ const float pressure = gas_pressure_from_entropy(p->rho, p->entropy); diff --git a/src/hydro/Gadget2/hydro_part.h b/src/hydro/Gadget2/hydro_part.h index 56162055f4f200aff376306d121e7cd24a5cd79b..8fb4b1d7b7e60ee5fe80b41b150ff872ae433c60 100644 --- a/src/hydro/Gadget2/hydro_part.h +++ b/src/hydro/Gadget2/hydro_part.h @@ -42,6 +42,9 @@ struct xpart { /* Velocity at the last full step. */ float v_full[3]; + /* Entropy at the last full step. */ + float entropy_full; + /* Additional data used to record cooling information */ struct cooling_xpart_data cooling_data; diff --git a/src/statistics.c b/src/statistics.c index 55b76eba974df19cdcd1e8ef24e5b6f8d0679c31..10ec276f567c62dda78f6fbd1b8b2f43360446a8 100644 --- a/src/statistics.c +++ b/src/statistics.c @@ -104,8 +104,8 @@ void stats_collect_part_mapper(void *map_data, int nr_parts, void *extra_data) { const struct part *restrict parts = (struct part *)map_data; const struct xpart *restrict xparts = s->xparts + (ptrdiff_t)(parts - s->parts); - // const integertime_t ti_current = s->e->ti_current; - // const double timeBase = s->e->timeBase; + const integertime_t ti_current = s->e->ti_current; + const double timeBase = s->e->timeBase; const double time = s->e->time; struct statistics *const global_stats = data->stats; @@ -125,32 +125,27 @@ void stats_collect_part_mapper(void *map_data, int nr_parts, void *extra_data) { const struct xpart *xp = &xparts[k]; const struct gpart *gp = (p->gpart != NULL) ? gp = p->gpart : NULL; - /* Get useful variables */ - // const integertime_t ti_begin = - // get_integer_time_begin(ti_current, p->time_bin); - // const integertime_t ti_end = get_integer_time_end(ti_current, - // p->time_bin); - // const integertime_t dti = get_integer_timestep(p->time_bin); - const float dt = - 0.f; //(ti_current - (ti_begin + ti_end) / 2) * timeBase; //MATTHIEU - const double x[3] = {p->x[0], p->x[1], p->x[2]}; + /* Get useful time variables */ + const integertime_t ti_begin = + get_integer_time_begin(ti_current, p->time_bin); + const integertime_t ti_step = get_integer_timestep(p->time_bin); + const float dt = (ti_current - (ti_begin + ti_step / 2)) * timeBase; + + /* Get the total acceleration */ float a_tot[3] = {p->a_hydro[0], p->a_hydro[1], p->a_hydro[2]}; if (gp != NULL) { a_tot[0] += gp->a_grav[0]; a_tot[1] += gp->a_grav[1]; a_tot[2] += gp->a_grav[2]; } + + /* Extrapolate velocities to current time */ const float v[3] = {xp->v_full[0] + a_tot[0] * dt, xp->v_full[1] + a_tot[1] * dt, xp->v_full[2] + a_tot[2] * dt}; const float m = hydro_get_mass(p); - - /* if (p->id == ICHECK) */ - /* message("bin=%d dti=%lld ti_begin=%lld ti_end=%lld dt=%e v=[%e %e %e]", - */ - /* p->time_bin, dti, ti_begin, ti_end, */ - /* dt, v[0], v[1], v[2]); */ + const double x[3] = {p->x[0], p->x[1], p->x[2]}; /* Collect mass */ stats.mass += m; @@ -167,13 +162,12 @@ void stats_collect_part_mapper(void *map_data, int nr_parts, void *extra_data) { /* Collect energies. */ stats.E_kin += 0.5f * m * (v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); + stats.E_int += m * hydro_get_internal_energy(p, dt); + stats.E_rad += cooling_get_radiated_energy(xp); stats.E_pot_self += 0.f; if (gp != NULL) stats.E_pot_ext += m * external_gravity_get_potential_energy( time, potential, phys_const, gp); - stats.E_int += m * hydro_get_internal_energy(p, dt); - stats.E_rad += cooling_get_radiated_energy(xp); - /* Collect entropy */ stats.entropy += m * hydro_get_entropy(p, dt); }