diff --git a/src/const.h b/src/const.h index 50d72e3339d7b8f04e3028f09794aff45f03dc65..270474d05e9e3059de21c078832205fc730a43ae 100644 --- a/src/const.h +++ b/src/const.h @@ -56,8 +56,8 @@ /* SPH variant to use */ //#define MINIMAL_SPH -#define GADGET2_SPH -//#define DEFAULT_SPH +//#define GADGET2_SPH +#define DEFAULT_SPH /* External potential properties */ #define EXTERNAL_POTENTIAL_POINTMASS diff --git a/src/hydro/Default/hydro.h b/src/hydro/Default/hydro.h index 6e6e4f18d2e10ed4a6bf78e5e4ef0bf7b4eff183..f1b414be2beabc5230fd6c932fbc31c690968a2f 100644 --- a/src/hydro/Default/hydro.h +++ b/src/hydro/Default/hydro.h @@ -20,6 +20,8 @@ #include "adiabatic_index.h" #include "approx_math.h" +#include <float.h> + /** * @brief Computes the hydro time-step of a given particle * @@ -145,7 +147,7 @@ __attribute__((always_inline)) INLINE static void hydro_prepare_force( /* Compute this particle's sound speed. */ const float u = p->u; - const float fc = p->force.c = sqrtf(hydro_gamma * hydro_gamma_minus_one * u); + const float fc = p->force.soundspeed = sqrtf(hydro_gamma * hydro_gamma_minus_one * u); /* Compute the P/Omega/rho2. */ xp->omega = 1.0f + 0.3333333333f * h * p->rho_dh / p->rho; @@ -155,7 +157,7 @@ __attribute__((always_inline)) INLINE static void hydro_prepare_force( p->force.balsara = normDiv_v / (normDiv_v + normRot_v + 0.0001f * fc * ih); /* Viscosity parameter decay time */ - const float tau = h / (2.f * const_viscosity_length * p->force.c); + const float tau = h / (2.f * const_viscosity_length * p->force.soundspeed); /* Viscosity source term */ const float S = fmaxf(-normDiv_v, 0.f); @@ -262,3 +264,39 @@ __attribute__((always_inline)) INLINE static float hydro_get_internal_energy( return p->u; } + +/** + * @brief Returns the pressure of a particle + * + * @param p The particle of interest + * @param dt Time since the last kick + */ +__attribute__((always_inline)) INLINE static float hydro_get_pressure( + const struct part *restrict p, float dt) { + + return p->force.POrho2 * p->rho * p->rho / p->rho_dh; +} + +/** + * @brief Returns the entropy of a particle + * + * @param p The particle of interest + * @param dt Time since the last kick + */ +__attribute__((always_inline)) INLINE static float hydro_get_entropy( + const struct part *restrict p, float dt) { + + return hydro_gamma_minus_one * p->u * pow_minus_gamma_minus_one(p->rho); +} + +/** + * @brief Returns the sound speed of a particle + * + * @param p The particle of interest + * @param dt Time since the last kick + */ +__attribute__((always_inline)) INLINE static float hydro_get_soundspeed( + const struct part *restrict p, float dt) { + + return p->force.soundspeed; +} diff --git a/src/hydro/Default/hydro_iact.h b/src/hydro/Default/hydro_iact.h index 41bf3d6fbc6a8a9feeef9a03bf945887d301981a..0e1616f8892b5b856bba3b1c6b15ee2c700929af 100644 --- a/src/hydro/Default/hydro_iact.h +++ b/src/hydro/Default/hydro_iact.h @@ -398,7 +398,7 @@ __attribute__((always_inline)) INLINE static void runner_iact_force( omega_ij = fminf(dvdr, 0.f); /* Compute signal velocity */ - v_sig = pi->force.c + pj->force.c - 2.0f * omega_ij; + v_sig = pi->force.soundspeed + pj->force.soundspeed - 2.0f * omega_ij; /* Compute viscosity parameter */ alpha_ij = -0.5f * (pi->alpha + pj->alpha); @@ -496,11 +496,11 @@ __attribute__((always_inline)) INLINE static void runner_iact_vec_force( pju.v = vec_set(pj[0]->u, pj[1]->u, pj[2]->u, pj[3]->u, pj[4]->u, pj[5]->u, pj[6]->u, pj[7]->u); ci.v = - vec_set(pi[0]->force.c, pi[1]->force.c, pi[2]->force.c, pi[3]->force.c, - pi[4]->force.c, pi[5]->force.c, pi[6]->force.c, pi[7]->force.c); + vec_set(pi[0]->force.soundspeed, pi[1]->force.soundspeed, pi[2]->force.soundspeed, pi[3]->force.soundspeed, + pi[4]->force.soundspeed, pi[5]->force.soundspeed, pi[6]->force.soundspeed, pi[7]->force.soundspeed); cj.v = - vec_set(pj[0]->force.c, pj[1]->force.c, pj[2]->force.c, pj[3]->force.c, - pj[4]->force.c, pj[5]->force.c, pj[6]->force.c, pj[7]->force.c); + vec_set(pj[0]->force.soundspeed, pj[1]->force.soundspeed, pj[2]->force.soundspeed, pj[3]->force.soundspeed, + pj[4]->force.soundspeed, pj[5]->force.soundspeed, pj[6]->force.soundspeed, pj[7]->force.soundspeed); vi_sig.v = vec_set(pi[0]->force.v_sig, pi[1]->force.v_sig, pi[2]->force.v_sig, pi[3]->force.v_sig, pi[4]->force.v_sig, pi[5]->force.v_sig, pi[6]->force.v_sig, pi[7]->force.v_sig); @@ -539,9 +539,9 @@ __attribute__((always_inline)) INLINE static void runner_iact_vec_force( piu.v = vec_set(pi[0]->u, pi[1]->u, pi[2]->u, pi[3]->u); pju.v = vec_set(pj[0]->u, pj[1]->u, pj[2]->u, pj[3]->u); ci.v = - vec_set(pi[0]->force.c, pi[1]->force.c, pi[2]->force.c, pi[3]->force.c); + vec_set(pi[0]->force.soundspeed, pi[1]->force.soundspeed, pi[2]->force.soundspeed, pi[3]->force.soundspeed); cj.v = - vec_set(pj[0]->force.c, pj[1]->force.c, pj[2]->force.c, pj[3]->force.c); + vec_set(pj[0]->force.soundspeed, pj[1]->force.soundspeed, pj[2]->force.soundspeed, pj[3]->force.soundspeed); vi_sig.v = vec_set(pi[0]->force.v_sig, pi[1]->force.v_sig, pi[2]->force.v_sig, pi[3]->force.v_sig); vj_sig.v = vec_set(pj[0]->force.v_sig, pj[1]->force.v_sig, pj[2]->force.v_sig, @@ -711,7 +711,7 @@ __attribute__((always_inline)) INLINE static void runner_iact_nonsym_force( omega_ij = fminf(dvdr, 0.f); /* Compute signal velocity */ - v_sig = pi->force.c + pj->force.c - 2.0f * omega_ij; + v_sig = pi->force.soundspeed + pj->force.soundspeed - 2.0f * omega_ij; /* Compute viscosity parameter */ alpha_ij = -0.5f * (pi->alpha + pj->alpha); @@ -801,11 +801,11 @@ __attribute__((always_inline)) INLINE static void runner_iact_nonsym_vec_force( pju.v = vec_set(pj[0]->u, pj[1]->u, pj[2]->u, pj[3]->u, pj[4]->u, pj[5]->u, pj[6]->u, pj[7]->u); ci.v = - vec_set(pi[0]->force.c, pi[1]->force.c, pi[2]->force.c, pi[3]->force.c, - pi[4]->force.c, pi[5]->force.c, pi[6]->force.c, pi[7]->force.c); + vec_set(pi[0]->force.soundspeed, pi[1]->force.soundspeed, pi[2]->force.soundspeed, pi[3]->force.soundspeed, + pi[4]->force.soundspeed, pi[5]->force.soundspeed, pi[6]->force.soundspeed, pi[7]->force.soundspeed); cj.v = - vec_set(pj[0]->force.c, pj[1]->force.c, pj[2]->force.c, pj[3]->force.c, - pj[4]->force.c, pj[5]->force.c, pj[6]->force.c, pj[7]->force.c); + vec_set(pj[0]->force.soundspeed, pj[1]->force.soundspeed, pj[2]->force.soundspeed, pj[3]->force.soundspeed, + pj[4]->force.soundspeed, pj[5]->force.soundspeed, pj[6]->force.soundspeed, pj[7]->force.soundspeed); vi_sig.v = vec_set(pi[0]->force.v_sig, pi[1]->force.v_sig, pi[2]->force.v_sig, pi[3]->force.v_sig, pi[4]->force.v_sig, pi[5]->force.v_sig, pi[6]->force.v_sig, pi[7]->force.v_sig); @@ -843,9 +843,9 @@ __attribute__((always_inline)) INLINE static void runner_iact_nonsym_vec_force( piu.v = vec_set(pi[0]->u, pi[1]->u, pi[2]->u, pi[3]->u); pju.v = vec_set(pj[0]->u, pj[1]->u, pj[2]->u, pj[3]->u); ci.v = - vec_set(pi[0]->force.c, pi[1]->force.c, pi[2]->force.c, pi[3]->force.c); + vec_set(pi[0]->force.soundspeed, pi[1]->force.soundspeed, pi[2]->force.soundspeed, pi[3]->force.soundspeed); cj.v = - vec_set(pj[0]->force.c, pj[1]->force.c, pj[2]->force.c, pj[3]->force.c); + vec_set(pj[0]->force.soundspeed, pj[1]->force.soundspeed, pj[2]->force.soundspeed, pj[3]->force.soundspeed); vi_sig.v = vec_set(pi[0]->force.v_sig, pi[1]->force.v_sig, pi[2]->force.v_sig, pi[3]->force.v_sig); vj_sig.v = vec_set(pj[0]->force.v_sig, pj[1]->force.v_sig, pj[2]->force.v_sig, diff --git a/src/hydro/Default/hydro_part.h b/src/hydro/Default/hydro_part.h index 7730133fa4488cf51dbd8424b7dce3232f038909..25ffb18053a03fef51930fdc4f66d80b67c809ad 100644 --- a/src/hydro/Default/hydro_part.h +++ b/src/hydro/Default/hydro_part.h @@ -99,7 +99,7 @@ struct part { float v_sig; /* Sound speed */ - float c; + float soundspeed; /* Change in smoothing length over time. */ float h_dt; diff --git a/tests/test125cells.c b/tests/test125cells.c index 5bc3d85ca011d81e2a8a0309af11eeddd3ac49f0..a5fca13becb2dbac3feb4e7bf367f8219c4b14f4 100644 --- a/tests/test125cells.c +++ b/tests/test125cells.c @@ -95,6 +95,8 @@ void set_energy_state(struct part *part, enum pressure_field press, float size, #if defined(GADGET2_SPH) part->entropy = pressure / pow_gamma(density); +#elif defined(DEFAULT_SPH) + part->u = pressure / (hydro_gamma_minus_one * density); #else error("Need to define pressure here !"); #endif @@ -188,6 +190,8 @@ void get_solution(const struct cell *main_cell, struct solution_part *solution, * separation. * @param density The density of the fluid. * @param partId The running counter of IDs. + * @param vel The type of velocity field. + * @param press The type of pressure field. */ struct cell *make_cell(size_t n, const double offset[3], double size, double h, double density, long long *partId, @@ -302,7 +306,14 @@ void dump_particle_fields(char *fileName, struct cell *main_cell, main_cell->parts[pid].a_hydro[0], main_cell->parts[pid].a_hydro[1], main_cell->parts[pid].a_hydro[2], main_cell->parts[pid].force.h_dt, main_cell->parts[pid].force.v_sig, - main_cell->parts[pid].entropy_dt, 0.f); +#if defined(GADGET2_SPH) + main_cell->parts[pid].entropy_dt, 0.f +#elif defined(DEFAULT_SPH) + 0.f, main_cell->parts[pid].force.u_dt +#else + 0.f, 0.f +#endif + ); } if (with_solution) { diff --git a/tests/testNonSymInt.c b/tests/testNonSymInt.c index da98c9efcedd595e133754e49d7396fbba574110..53f8510644921bc5a707c6ea3247684caa89cc90 100644 --- a/tests/testNonSymInt.c +++ b/tests/testNonSymInt.c @@ -79,16 +79,8 @@ void dump_indv_particle_fields(char *fileName, struct part *p) { "%13e %13e %13e\n", p->id, p->x[0], p->x[1], p->x[2], p->v[0], p->v[1], p->v[2], p->rho, p->rho_dh, p->density.wcount, p->density.wcount_dh, -#if defined(GADGET2_SPH) p->density.div_v, p->density.rot_v[0], p->density.rot_v[1], - p->density.rot_v[2] -#elif defined(DEFAULT_SPH) - p->density.div_v, p->density.curl_v[0], p->density.curl_v[1], - p->density.curl_v[2] -#else - 0., 0., 0., 0. -#endif - ); + p->density.rot_v[2]); fclose(file); } diff --git a/tests/testSPHStep.c b/tests/testSPHStep.c index dade82f1b4f358f5a80091007868650a0115dbfd..ebc517f478f0a9777ad384608e31ca934bcf509f 100644 --- a/tests/testSPHStep.c +++ b/tests/testSPHStep.c @@ -61,9 +61,9 @@ struct cell *make_cell(size_t N, float cellSize, int offset[3], int id_offset) { offset[2] * cellSize + z * cellSize / N + cellSize / (2 * N); part->h = h; part->id = x * N * N + y * N + z + id_offset; - ++part; part->ti_begin = 0; part->ti_end = 1; + ++part; } } } @@ -193,16 +193,20 @@ int main() { runner_do_ghost(&r, ci); message("h=%f rho=%f N_ngb=%f", p->h, p->rho, p->density.wcount); - message("c=%f", p->force.c); + message("c=%f", p->force.soundspeed); runner_doself2_force(&r, ci); runner_do_kick(&r, ci, 1); message("ti_end=%d", p->ti_end); - free(ci->parts); - free(ci->xparts); - + for (int j = 0; j < 27; ++j) { + free(cells[j]->parts); + free(cells[j]->xparts); + free(cells[j]->sort); + free(cells[j]); + } + return 0; #endif } diff --git a/tests/testSingle.c b/tests/testSingle.c index 6f6a8c8ad6cffbc8594d774c4a230220b8039890..79e1630b35e4d5f2867f13ef0f61a8067e1bb3ba 100644 --- a/tests/testSingle.c +++ b/tests/testSingle.c @@ -81,9 +81,9 @@ int main(int argc, char *argv[]) { p2.rho = 1.0f; p2.mass = 9.7059e-4; p2.h = 0.222871287 / 2; - p1.force.c = 0.0040824829f; + p1.force.soundspeed = 0.0040824829f; p1.force.balsara = 0.0f; - p2.force.c = 58.8972740361f; + p2.force.soundspeed = 58.8972740361f; p2.force.balsara = 0.0f; p1.u = 1.e-5 / (hydro_gamma_minus_one * p1.rho); p2.u = 1.e-5 / (hydro_gamma_minus_one * p2.rho) + 100.0f / (33 * p2.mass); diff --git a/tests/testSymInt.c b/tests/testSymInt.c index 73fa8ed9b9c2c347bad2ff8fd2eadf9a6cae1336..15d497515ba6c594466c2587fa18a779723f6cdf 100644 --- a/tests/testSymInt.c +++ b/tests/testSymInt.c @@ -76,16 +76,8 @@ void dump_indv_particle_fields(char *fileName, struct part *p) { "%13e %13e %13e\n", p->id, p->x[0], p->x[1], p->x[2], p->v[0], p->v[1], p->v[2], p->rho, p->rho_dh, p->density.wcount, p->density.wcount_dh, -#if defined(GADGET2_SPH) p->density.div_v, p->density.rot_v[0], p->density.rot_v[1], - p->density.rot_v[2] -#elif defined(DEFAULT_SPH) - p->density.div_v, p->density.curl_v[0], p->density.curl_v[1], - p->density.curl_v[2] -#else - 0., 0., 0., 0. -#endif - ); + p->density.rot_v[2]); fclose(file); }