diff --git a/src/hydro/Gizmo/hydro.h b/src/hydro/Gizmo/hydro.h index 9da1f63d8bc8d3f71087e77b3b36f0d2e3ecc0af..643489912a6c6b1db921e73b508910cc670d49ae 100644 --- a/src/hydro/Gizmo/hydro.h +++ b/src/hydro/Gizmo/hydro.h @@ -111,27 +111,32 @@ __attribute__((always_inline)) INLINE static void hydro_first_init_part( p->conserved.momentum[2] = mass * p->primitives.v[2]; /* and the thermal energy */ +/* remember that we store the total thermal energy, not the specific thermal + energy (as in Gadget) */ #if defined(EOS_ISOTHERMAL_GAS) + /* this overwrites the internal energy from the initial condition file */ p->conserved.energy = mass * const_isothermal_internal_energy; #else p->conserved.energy *= mass; #endif #ifdef GIZMO_TOTAL_ENERGY + /* add the total kinetic energy */ p->conserved.energy += 0.5f * (p->conserved.momentum[0] * p->primitives.v[0] + p->conserved.momentum[1] * p->primitives.v[1] + p->conserved.momentum[2] * p->primitives.v[2]); #endif #if defined(GIZMO_FIX_PARTICLES) + /* make sure the particles are initially at rest */ p->v[0] = 0.; p->v[1] = 0.; p->v[2] = 0.; -#else +#endif + xp->v_full[0] = p->v[0]; xp->v_full[1] = p->v[1]; xp->v_full[2] = p->v[2]; -#endif } /** @@ -240,6 +245,8 @@ __attribute__((always_inline)) INLINE static void hydro_end_density( p->primitives.v[2] = momentum[2] / m; #ifdef EOS_ISOTHERMAL_GAS + /* although the pressure is not formally used anywhere if an isothermal eos + has been selected, we still make sure it is set to the correct value */ p->primitives.P = const_isothermal_soundspeed * const_isothermal_soundspeed * p->primitives.rho; #else @@ -247,15 +254,20 @@ __attribute__((always_inline)) INLINE static void hydro_end_density( float energy = p->conserved.energy; #ifdef GIZMO_TOTAL_ENERGY + /* subtract the kinetic energy; we want the thermal energy */ energy -= 0.5f * (momentum[0] * p->primitives.v[0] + momentum[1] * p->primitives.v[1] + momentum[2] * p->primitives.v[2]); #endif + /* energy contains the total thermal energy, we want the specific energy. + this is why we divide by the volume, and not by the density */ p->primitives.P = hydro_gamma_minus_one * energy / volume; #endif /* sanity checks */ + /* it would probably be safer to throw a warning if netive densities or + pressures occur */ if (p->primitives.rho < 0.0f || p->primitives.P < 0.0f) { p->primitives.rho = 0.0f; p->primitives.P = 0.0f; @@ -285,6 +297,7 @@ __attribute__((always_inline)) INLINE static void hydro_prepare_force( p->timestepvars.vmax = 0.0f; /* Set the actual velocity of the particle */ + /* if GIZMO_FIX_PARTICLES has been selected, v_full will always be zero */ p->force.v_full[0] = xp->v_full[0]; p->force.v_full[1] = xp->v_full[1]; p->force.v_full[2] = xp->v_full[2]; @@ -375,6 +388,9 @@ __attribute__((always_inline)) INLINE static void hydro_predict_extra( else p->h *= expf(w1); +/* we temporarily disabled the primitive variable drift. + This should be reenabled once gravity works, and we have time to check that + drifting works properly. */ // const float w2 = -hydro_dimension * w1; // if (fabsf(w2) < 0.2f) { // p->primitives.rho *= approx_expf(w2); @@ -416,56 +432,18 @@ __attribute__((always_inline)) INLINE static void hydro_predict_extra( __attribute__((always_inline)) INLINE static void hydro_end_force( struct part* p) { + /* set the variables that are used to drift the primitive variables */ + /* Add normalization to h_dt. */ p->force.h_dt *= p->h * hydro_dimension_inv; - /* Set the hydro acceleration, based on the new momentum and mass */ - /* NOTE: the momentum and mass are only correct for active particles, since - only active particles have received flux contributions from all their - neighbours. Since this method is only called for active particles, - this is indeed the case. */ if (p->force.dt) { - // float mnew; - // float vnew[3]; - - // mnew = p->conserved.mass + p->conserved.flux.mass; - // if (mnew > 0.) { - // vnew[0] = - // (p->conserved.momentum[0] + p->conserved.flux.momentum[0]) / - // mnew; - // vnew[1] = - // (p->conserved.momentum[1] + p->conserved.flux.momentum[1]) / - // mnew; - // vnew[2] = - // (p->conserved.momentum[2] + p->conserved.flux.momentum[2]) / - // mnew; - // } else { - // vnew[0] = 0.; - // vnew[1] = 0.; - // vnew[2] = 0.; - // } - - // p->a_hydro[0] = (vnew[0] - p->force.v_full[0]) / p->force.dt; - // p->a_hydro[1] = (vnew[1] - p->force.v_full[1]) / p->force.dt; - // p->a_hydro[2] = (vnew[2] - p->force.v_full[2]) / p->force.dt; - p->a_hydro[0] = 0.; - p->a_hydro[1] = 0.; - p->a_hydro[2] = 0.; - p->du_dt = p->conserved.flux.energy / p->force.dt; } else { - p->a_hydro[0] = 0.0f; - p->a_hydro[1] = 0.0f; - p->a_hydro[2] = 0.0f; - p->du_dt = 0.0f; } #if defined(GIZMO_FIX_PARTICLES) - p->a_hydro[0] = 0.0f; - p->a_hydro[1] = 0.0f; - p->a_hydro[2] = 0.0f; - p->du_dt = 0.0f; /* disable the smoothing length update, since the smoothing lengths should @@ -510,6 +488,7 @@ __attribute__((always_inline)) INLINE static void hydro_kick_extra( a_grav[2] = p->gpart->a_grav[2]; /* Store the gravitational acceleration for later use. */ + /* This is currently only used for output purposes. */ p->gravity.old_a[0] = a_grav[0]; p->gravity.old_a[1] = a_grav[1]; p->gravity.old_a[2] = a_grav[2]; @@ -518,11 +497,14 @@ __attribute__((always_inline)) INLINE static void hydro_kick_extra( p->gpart->mass = p->conserved.mass; /* Kick the momentum for half a time step */ + /* Note that this also affects the particle movement, as the velocity for + the particles is set after this. */ p->conserved.momentum[0] += dt * p->conserved.mass * a_grav[0]; p->conserved.momentum[1] += dt * p->conserved.mass * a_grav[1]; p->conserved.momentum[2] += dt * p->conserved.mass * a_grav[2]; #if !defined(EOS_ISOTHERMAL_GAS) && defined(GIZMO_TOTAL_ENERGY) + /* This part still needs to be tested! */ p->conserved.energy += dt * (p->conserved.momentum[0] * a_grav[0] + p->conserved.momentum[1] * a_grav[1] + p->conserved.momentum[2] * a_grav[2]); @@ -563,6 +545,7 @@ __attribute__((always_inline)) INLINE static void hydro_kick_extra( xp->v_full[1] = p->conserved.momentum[1] / p->conserved.mass; xp->v_full[2] = p->conserved.momentum[2] / p->conserved.mass; } else { + /* vacuum particles don't move */ xp->v_full[0] = 0.; xp->v_full[1] = 0.; xp->v_full[2] = 0.; @@ -572,6 +555,9 @@ __attribute__((always_inline)) INLINE static void hydro_kick_extra( p->v[2] = xp->v_full[2]; /* Update gpart! */ + /* This is essential, as the gpart drift is done independently from the part + drift, and we don't want the gpart and the part to have different + positions! */ if (p->gpart) { p->gpart->v_full[0] = xp->v_full[0]; p->gpart->v_full[1] = xp->v_full[1]; @@ -684,6 +670,7 @@ __attribute__((always_inline)) INLINE static void hydro_set_internal_energy( energy (u*m) */ p->conserved.energy = u * p->conserved.mass; #ifdef GIZMO_TOTAL_ENERGY + /* add the kinetic energy */ p->conserved.energy += 0.5f * p->conserved.mass * (p->conserved.momentum[0] * p->primitives.v[0] + p->conserved.momentum[1] * p->primitives.v[1] + @@ -707,6 +694,7 @@ __attribute__((always_inline)) INLINE static void hydro_set_entropy( p->conserved.energy = S * pow_gamma_minus_one(p->primitives.rho) * hydro_one_over_gamma_minus_one * p->conserved.mass; #ifdef GIZMO_TOTAL_ENERGY + /* add the kinetic energy */ p->conserved.energy += 0.5f * p->conserved.mass * (p->conserved.momentum[0] * p->primitives.v[0] + p->conserved.momentum[1] * p->primitives.v[1] +